{"version":3,"sources":["webpack:///./public/app/features/admin/UserProfile.tsx","webpack:///./public/app/features/dashboard/utils/panel.ts","webpack:///./public/app/core/components/Select/UserPicker.tsx","webpack:///./packages/grafana-data/src/field/scale.ts","webpack:///./packages/grafana-data/src/field/displayProcessor.ts","webpack:///./packages/grafana-data/src/field/fieldDisplay.ts","webpack:///./packages/grafana-data/src/field/FieldConfigOptionsRegistry.tsx","webpack:///./packages/grafana-data/src/field/standardFieldConfigEditorRegistry.ts","webpack:///./packages/grafana-data/src/field/overrides/processors.ts","webpack:///./packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts","webpack:///./packages/grafana-data/src/field/fieldOverrides.ts","webpack:///./packages/grafana-data/src/field/index.ts","webpack:///./public/app/features/variables/adhoc/reducer.ts","webpack:///./packages/grafana-data/src/valueFormats/index.ts","webpack:///./packages/grafana-data/src/utils/binaryOperators.ts","webpack:///./public/app/features/datasources/partials/tls_auth_settings.html","webpack:///./public/app/plugins/datasource/grafana/partials/annotations.editor.html","webpack:///./public/app/plugins/panel/text/module.html","webpack:///./packages/grafana-data/src/types/orgs.ts","webpack:///./packages/grafana-data/src/types/panelEvents.ts","webpack:///./public/app/plugins/datasource/influxdb/partials/query.editor.html","webpack:///./public/app/plugins/panel/graph/tab_legend.html","webpack:///./public/app/partials/modal.html","webpack:///./packages/grafana-data/src/types/app.ts","webpack:///./public/app/features/plugins/partials/plugin_page.html","webpack:///./packages/grafana-data/src/types/fieldOverrides.ts","webpack:///./public/app/features/search/reducers/actionTypes.ts","webpack:///./public/app/features/alerting/partials/alert_tab.html","webpack:///./public/vendor/flot/jquery.flot.gauge.js","webpack:///./public/app/plugins/panel/alertlist/module.html","webpack:///./public/app/partials/valueSelectDropdown.html","webpack:///./public/app/features/admin/UserAdminPage.tsx","webpack:///./public/app/features/admin/ldap/LdapUserMappingInfo.tsx","webpack:///./public/app/features/admin/ldap/LdapUserPermissions.tsx","webpack:///./public/app/features/admin/ldap/LdapUserGroups.tsx","webpack:///./public/app/features/admin/ldap/LdapUserTeams.tsx","webpack:///./public/app/features/admin/ldap/LdapUserInfo.tsx","webpack:///./packages/grafana-data/src/vector/ArrayVector.ts","webpack:///./packages/grafana-data/src/dataframe/processDataFrame.ts","webpack:///./public/vendor/flot/jquery.flot.stack.js","webpack:///./public/app/features/datasources/partials/http_settings.html","webpack:///./public/app/core/reducers/location.ts","webpack:///./public/app/core/utils/emitter.ts","webpack:///./packages/grafana-data/src/types/data.ts","webpack:///./packages/grafana-ui/src/components/Legend/LegendList.tsx","webpack:///./public/app/core/time_series2.ts","webpack:///./packages/grafana-ui/src/components/Switch/Switch.tsx","webpack:///./public/app/features/admin/partials/admin_home.html","webpack:///./public/app/plugins/datasource/mssql/partials/config.html","webpack:///./public/app/features/admin/partials/edit_org.html","webpack:///./public/app/core/utils/promiseToDigest.ts","webpack:///./public/app/types/dashboard.ts","webpack:///./public/app/core/utils/outline.ts","webpack:///./packages/grafana-ui/src/components/Select/SingleValue.tsx","webpack:///./packages/grafana-ui/src/utils/useDelayedSwitch.ts","webpack:///./public/app/plugins/panel/singlestat/mappings.html","webpack:///./public/app/features/admin/UserLdapSyncInfo.tsx","webpack:///./packages/grafana-data/src/utils/Registry.ts","webpack:///./public/app/features/alerting/getAlertingValidationMessage.ts","webpack:///./packages/grafana-ui/src/types/completion.ts","webpack:///./public/app/plugins/datasource/graphite/partials/annotations.editor.html","webpack:///./public/app/features/dashboard/components/DashboardSettings/SettingsCtrl.ts","webpack:///./public/app/features/dashboard/components/DashboardSettings/DashboardSettings.tsx","webpack:///./public/app/features/dashboard/components/DashboardSettings/index.ts","webpack:///./packages/grafana-data/src/transformations/transformers/append.ts","webpack:///./packages/grafana-data/src/transformations/transformers/noop.ts","webpack:///./packages/grafana-data/src/transformations/transformers/filter.ts","webpack:///./packages/grafana-data/src/transformations/transformers/reduce.ts","webpack:///./packages/grafana-data/src/transformations/transformers/filterByName.ts","webpack:///./packages/grafana-data/src/transformations/transformers/filterByRefId.ts","webpack:///./packages/grafana-data/src/transformations/transformers/rename.ts","webpack:///./packages/grafana-data/src/transformations/transformers/organize.ts","webpack:///./packages/grafana-data/src/transformations/transformers/labelsToFields.ts","webpack:///./packages/grafana-data/src/transformations/transformers.ts","webpack:///./packages/grafana-data/src/transformations/standardTransformersRegistry.ts","webpack:///./packages/grafana-data/src/transformations/transformDataFrame.ts","webpack:///./packages/grafana-data/src/transformations/index.ts","webpack:///./public/app/features/profile/SignupPage.tsx","webpack:///./packages/grafana-ui/src/components/ValueMappingsEditor/MappingRow.tsx","webpack:///./packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/mappings.tsx","webpack:///./packages/grafana-ui/src/components/ThresholdsEditorNew/ThresholdsEditor.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/thresholds.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/units.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/links.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/color.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/stats.tsx","webpack:///./packages/grafana-ui/src/utils/standardEditors.tsx","webpack:///./public/app/plugins/datasource/loki/partials/annotations.editor.html","webpack:///./packages/grafana-ui/src/types/icon.ts","webpack:///./public/app/core/components/BackButton/BackButton.tsx","webpack:///./public/app/core/actions/index.ts","webpack:///./public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx","webpack:///./public/app/core/components/TimePicker/TimePickerWithHistory.tsx","webpack:///./public/vendor/flot/jquery.flot.selection.js","webpack:///./public/app/core/components/PermissionList/PermissionListItem.tsx","webpack:///./public/app/core/components/PermissionList/DisabledPermissionListItem.tsx","webpack:///./public/app/core/components/PermissionList/PermissionList.tsx","webpack:///./public/app/features/alerting/state/alertDef.ts","webpack:///./packages/grafana-runtime/src/services/backendSrv.ts","webpack:///./packages/grafana-runtime/src/services/AngularLoader.ts","webpack:///./packages/grafana-runtime/src/services/dataSourceSrv.ts","webpack:///./packages/grafana-runtime/src/services/LocationSrv.ts","webpack:///./packages/grafana-runtime/src/services/templateSrv.ts","webpack:///./packages/grafana-runtime/src/services/legacyAngularInjector.ts","webpack:///./packages/grafana-runtime/src/services/index.ts","webpack:///./public/app/core/components/PageHeader/PageHeader.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/MetricQueryEditor.tsx","webpack:///./packages/grafana-ui/src/components/Forms/commonStyles.ts","webpack:///./public/app/plugins/datasource/dashboard/runSharedRequest.ts","webpack:///./public/app/plugins/datasource/dashboard/types.ts","webpack:///./public/app/plugins/datasource/dashboard/DashboardQueryEditor.tsx","webpack:///./public/app/plugins/datasource/dashboard/index.ts","webpack:///./public/vendor/flot/jquery.flot.time.js","webpack:///./public/app/features/playlist/partials/playlist_search.html","webpack:///./packages/grafana-ui/src/components/Tooltip/Tooltip.tsx","webpack:///./public/app/features/variables/state/actions.ts","webpack:///./packages/grafana-ui/src/components/ColorPicker/NamedColorsGroup.tsx","webpack:///./packages/grafana-ui/src/components/ColorPicker/NamedColorsPalette.tsx","webpack:///./packages/grafana-ui/src/components/ColorPicker/ColorInput.tsx","webpack:///./packages/grafana-ui/src/components/ColorPicker/SpectrumPalettePointer.tsx","webpack:///./packages/grafana-ui/src/components/ColorPicker/SpectrumPalette.tsx","webpack:///./packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.tsx","webpack:///./packages/grafana-ui/src/components/ColorPicker/warnAboutColorPickerPropsDeprecation.ts","webpack:///./public/app/core/components/Footer/Footer.tsx","webpack:///./packages/grafana-ui/src/slate-plugins/slate-prism/TOKEN_MARK.ts","webpack:///./packages/grafana-data/src/types/time.ts","webpack:///./public/app/features/templating/template_srv.ts","webpack:///./packages/grafana-data/src/types/utils.ts","webpack:///./public/app/plugins/panel/graph2/getGraphSeriesModel.ts","webpack:///./public/app/features/templating/partials/editor.html","webpack:///./packages/grafana-data/src/types/valueMapping.ts","webpack:///./public/app/features/admin/partials/styleguide.html","webpack:///./public/app/plugins/datasource/stackdriver/constants.ts","webpack:///./public/app/plugins/datasource/cloudwatch/utils/query/ScrollQLParserListener.js","webpack:///./public/app/partials/signup_invited.html","webpack:///./public/app/features/search/components/SearchResultsFilter.tsx","webpack:///./public/app/plugins/datasource/mysql/partials/config.html","webpack:///./packages/grafana-data/src/dataframe/FieldCache.ts","webpack:///./packages/grafana-data/src/dataframe/CircularDataFrame.ts","webpack:///./packages/grafana-data/src/dataframe/dimensions.ts","webpack:///./packages/grafana-data/src/dataframe/ArrowDataFrame.ts","webpack:///./packages/grafana-data/src/dataframe/index.ts","webpack:///./public/vendor/flot/jquery.flot.js","webpack:///./public/app/plugins/panel/graph/tab_series_overrides.html","webpack:///./packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx","webpack:///./public/app/plugins/panel/singlestat/module.html","webpack:///./packages/grafana-ui/src/components/Modal/ModalHeader.tsx","webpack:///./public/app/core/components/Select/SortPicker.tsx","webpack:///./public/app/features/search/components/ActionRow.tsx","webpack:///./public/app/plugins/panel/text/editor.html","webpack:///./public/app/plugins/datasource/mysql/partials/annotations.editor.html","webpack:///./public/app/core/components/Select/OrgPicker.tsx","webpack:///./public/app/features/admin/UserOrgs.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/utils/query/ScrollQLLexer.js","webpack:///./public/app/types/acl.ts","webpack:///./public/app/plugins/datasource/grafana-azure-monitor-datasource/partials/query.editor.html","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx","webpack:///./packages/grafana-ui/src/components/DataLinks/SelectionReference.ts","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinkInput.tsx","webpack:///./public/app/core/utils/connectWithReduxStore.tsx","webpack:///./public/app/features/panel/panel_ctrl.ts","webpack:///./packages/grafana-ui/src/components/Spinner/Spinner.tsx","webpack:///./packages/grafana-ui/src/utils/measureText.ts","webpack:///./public/app/features/admin/ldap/LdapConnectionStatus.tsx","webpack:///./packages/grafana-ui/src/components/transitions/SlideOutTransition.tsx","webpack:///./public/app/features/variables/query/reducer.ts","webpack:///./public/app/features/variables/pickers/shared/VariableLink.tsx","webpack:///./public/app/features/variables/pickers/types.ts","webpack:///./public/app/features/variables/pickers/shared/VariableInput.tsx","webpack:///./public/app/features/variables/pickers/OptionsPicker/actions.ts","webpack:///./public/app/features/variables/pickers/shared/VariableOptions.tsx","webpack:///./public/app/features/variables/pickers/OptionsPicker/OptionsPicker.tsx","webpack:///./public/app/features/variables/editor/SelectionOptionsEditor.tsx","webpack:///./public/app/features/variables/query/actions.ts","webpack:///./public/app/features/variables/query/QueryVariableEditor.tsx","webpack:///./public/app/features/variables/query/adapter.ts","webpack:///./public/app/features/variables/custom/reducer.ts","webpack:///./public/app/features/variables/custom/CustomVariableEditor.tsx","webpack:///./public/app/features/variables/custom/actions.ts","webpack:///./public/app/features/variables/custom/adapter.ts","webpack:///./public/app/features/variables/textbox/reducer.ts","webpack:///./public/app/features/variables/textbox/TextBoxVariablePicker.tsx","webpack:///./public/app/features/variables/textbox/TextBoxVariableEditor.tsx","webpack:///./public/app/features/variables/textbox/actions.ts","webpack:///./public/app/features/variables/textbox/adapter.ts","webpack:///./public/app/features/variables/constant/reducer.ts","webpack:///./public/app/features/variables/constant/ConstantVariableEditor.tsx","webpack:///./public/app/features/variables/constant/actions.ts","webpack:///./public/app/features/variables/constant/adapter.ts","webpack:///./public/app/features/variables/datasource/reducer.ts","webpack:///./public/app/features/variables/datasource/actions.ts","webpack:///./public/app/features/variables/datasource/DataSourceVariableEditor.tsx","webpack:///./public/app/features/variables/datasource/adapter.ts","webpack:///./public/app/features/variables/interval/reducer.ts","webpack:///./public/app/features/variables/interval/IntervalVariableEditor.tsx","webpack:///./public/app/features/variables/interval/actions.ts","webpack:///./public/app/features/variables/interval/adapter.ts","webpack:///./public/app/features/variables/adhoc/picker/OperatorSegment.tsx","webpack:///./public/app/features/variables/adhoc/picker/AdHocFilterBuilder.tsx","webpack:///./public/app/features/variables/adhoc/picker/ConditionSegment.tsx","webpack:///./public/app/features/variables/adhoc/picker/AdHocPicker.tsx","webpack:///./public/app/features/variables/adhoc/AdHocVariableEditor.tsx","webpack:///./public/app/features/variables/adhoc/urlParser.ts","webpack:///./public/app/features/variables/adhoc/adapter.ts","webpack:///./public/app/features/variables/adapters.ts","webpack:///./public/app/features/folders/state/reducers.ts","webpack:///./packages/grafana-ui/src/components/Portal/Portal.tsx","webpack:///./public/vendor/flot/jquery.flot.crosshair.js","webpack:///./public/app/features/teams/state/reducers.ts","webpack:///./public/app/core/components/Animations/SlideDown.tsx","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksListItem.tsx","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinkEditor.tsx","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinkEditorModalContent.tsx","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksInlineEditor.tsx","webpack:///./public/app/features/dashboard/components/DashNav/DashNavButton.tsx","webpack:///./packages/grafana-data/src/types/panel.ts","webpack:///./packages/grafana-ui/src/slate-plugins/slate-prism/options.tsx","webpack:///./packages/grafana-ui/src/slate-plugins/slate-prism/index.ts","webpack:///./packages/grafana-data/src/text/markdown.ts","webpack:///./packages/grafana-data/src/text/text.ts","webpack:///./packages/grafana-data/src/text/index.ts","webpack:///./packages/grafana-data/src/types/plugin.ts","webpack:///./packages/grafana-ui/src/slate-plugins/braces.ts","webpack:///./packages/grafana-ui/src/slate-plugins/clear.ts","webpack:///./packages/grafana-ui/src/slate-plugins/clipboard.ts","webpack:///./packages/grafana-ui/src/slate-plugins/indentation.ts","webpack:///./packages/grafana-ui/src/slate-plugins/newline.ts","webpack:///./packages/grafana-ui/src/slate-plugins/runner.ts","webpack:///./packages/grafana-ui/src/slate-plugins/selection_shortcuts.ts","webpack:///./packages/grafana-ui/src/components/Typeahead/TypeaheadInfo.tsx","webpack:///./packages/grafana-ui/src/components/Typeahead/TypeaheadItem.tsx","webpack:///./packages/grafana-ui/src/utils/typeahead.ts","webpack:///./packages/grafana-ui/src/components/Typeahead/Typeahead.tsx","webpack:///./packages/grafana-ui/src/slate-plugins/suggestions.tsx","webpack:///./packages/grafana-ui/src/slate-plugins/index.ts","webpack:///./packages/grafana-e2e-selectors/src/index.ts","webpack:///./packages/grafana-ui/src/components/Select/resetSelectStyles.ts","webpack:///./packages/grafana-ui/src/components/Forms/Field.tsx","webpack:///./packages/grafana-data/src/transformations/transformers/ids.ts","webpack:///./public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html","webpack:///./packages/grafana-ui/src/components/Select/Select.tsx","webpack:///./public/app/core/components/FilterInput/FilterInput.tsx","webpack:///./packages/grafana-data/src/transformations/matchers/ids.ts","webpack:///./packages/grafana-data/src/transformations/transformers/order.ts","webpack:///./public/app/features/search/types.ts","webpack:///./packages/grafana-data/src/vector/vectorToArray.ts","webpack:///./public/app/features/datasources/state/reducers.ts","webpack:///./packages/grafana-ui/src/themes/ThemeContext.tsx","webpack:///./packages/grafana-data/src/valueFormats/dateTimeFormatters.ts","webpack:///./packages/grafana-data/src/valueFormats/arithmeticFormatters.ts","webpack:///./packages/grafana-data/src/valueFormats/valueFormats.ts","webpack:///./packages/grafana-data/src/valueFormats/categories.ts","webpack:///./public/app/types/index.ts","webpack:///./packages/grafana-ui/src/types/index.ts","webpack:///./public/app/features/panel/panellinks/link_srv.ts","webpack:///./packages/grafana-ui/src/themes/mixins.ts","webpack:///./public/app/features/templating/DefaultVariableQueryEditor.tsx","webpack:///./public/app/features/api-keys/state/reducers.ts","webpack:///./public/app/plugins/panel/graph/tab_thresholds.html","webpack:///./public/app/core/directives/dropdown_typeahead.ts","webpack:///./public/app/core/directives/autofill_event_fix.ts","webpack:///./public/app/core/directives/metric_segment.ts","webpack:///./public/app/core/directives/misc.ts","webpack:///./public/app/core/directives/ng_model_on_blur.ts","webpack:///./public/app/core/directives/tags.ts","webpack:///./public/app/core/directives/value_select_dropdown.ts","webpack:///./public/app/core/directives/rebuild_on_change.ts","webpack:///./public/app/core/directives/give_focus.ts","webpack:///./public/app/core/directives/diff-view.ts","webpack:///./public/app/core/jquery_extended.ts","webpack:///./public/app/core/components/jsontree/jsontree.ts","webpack:///./public/app/core/components/code_editor/code_editor.ts","webpack:///./public/app/core/components/colorpicker/spectrum_picker.ts","webpack:///./public/app/core/services/ng_react.ts","webpack:///./public/app/core/components/info_popover.ts","webpack:///./public/app/core/directives/array_join.ts","webpack:///./public/app/core/live/live_srv.ts","webpack:///./public/app/core/components/switch.ts","webpack:///./public/app/core/components/dashboard_selector.ts","webpack:///./public/app/core/components/query_part/query_part_editor.ts","webpack:///./public/app/core/components/sql_part/sql_part_editor.ts","webpack:///./public/app/core/components/form_dropdown/form_dropdown.ts","webpack:///./public/app/core/controllers/invited_ctrl.ts","webpack:///./public/app/core/controllers/signup_ctrl.ts","webpack:///./public/app/core/controllers/reset_password_ctrl.ts","webpack:///./public/app/core/controllers/error_ctrl.ts","webpack:///./public/app/core/controllers/json_editor_ctrl.ts","webpack:///./public/app/core/services/alert_srv.ts","webpack:///./public/app/core/components/modals/AngularModalProxy.tsx","webpack:///./public/app/core/services/util_srv.ts","webpack:///./public/app/core/services/timer.ts","webpack:///./public/app/core/services/analytics.ts","webpack:///./public/app/core/services/popover_srv.ts","webpack:///./public/app/core/services/segment_srv.ts","webpack:///./public/app/core/services/dynamic_directive_srv.ts","webpack:///./public/app/core/services/bridge_srv.ts","webpack:///./public/app/core/filters/filters.ts","webpack:///./public/app/core/components/scroll/scroll.ts","webpack:///./public/app/plugins/datasource/stackdriver/components/AnnotationQueryEditor.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor.tsx","webpack:///./public/app/core/components/sidemenu/DropDownChild.tsx","webpack:///./public/app/core/components/sidemenu/SideMenuDropDown.tsx","webpack:///./public/app/core/components/sidemenu/TopSectionItem.tsx","webpack:///./public/app/core/components/sidemenu/TopSection.tsx","webpack:///./public/app/core/components/sidemenu/SignIn.tsx","webpack:///./public/app/core/components/OrgSwitcher.tsx","webpack:///./public/app/core/components/sidemenu/BottomNavLinks.tsx","webpack:///./public/app/core/components/sidemenu/BottomSection.tsx","webpack:///./public/app/core/components/sidemenu/SideMenu.tsx","webpack:///./public/app/core/components/Select/MetricSelect.tsx","webpack:///./public/app/core/components/AppNotifications/AppNotificationItem.tsx","webpack:///./public/app/core/components/AppNotifications/AppNotificationList.tsx","webpack:///./public/app/plugins/datasource/graphite/FunctionEditorControls.tsx","webpack:///./public/app/plugins/datasource/graphite/FunctionEditor.tsx","webpack:///./public/app/features/profile/UserProfileEditForm.tsx","webpack:///./public/app/features/profile/UserTeams.tsx","webpack:///./public/app/features/profile/UserOrganizations.tsx","webpack:///./public/app/features/profile/ReactProfileWrapper.tsx","webpack:///./public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx","webpack:///./public/app/core/components/help/HelpModal.tsx","webpack:///./public/app/features/variables/editor/VariableEditorList.tsx","webpack:///./public/app/features/variables/editor/VariableValuesPreview.tsx","webpack:///./public/app/features/variables/editor/actions.ts","webpack:///./public/app/features/variables/editor/VariableEditorEditor.tsx","webpack:///./public/app/features/variables/editor/VariableEditorContainer.tsx","webpack:///./public/app/features/search/components/SearchField.tsx","webpack:///./public/app/features/search/components/DashboardSearch.tsx","webpack:///./public/app/features/search/hooks/useDashboardSearch.ts","webpack:///./public/app/features/search/components/SearchWrapper.tsx","webpack:///./public/app/core/angular_wrappers.ts","webpack:///./public/app/core/core.ts","webpack:///./packages/grafana-data/src/types/dataFrame.ts","webpack:///./public/app/features/dashboard/components/DashLinks/editor.html","webpack:///./public/app/plugins/datasource/postgres/partials/query.editor.html","webpack:///./packages/grafana-e2e-selectors/src/selectors/pages.ts","webpack:///./packages/grafana-e2e-selectors/src/selectors/components.ts","webpack:///./packages/grafana-e2e-selectors/src/selectors/index.ts","webpack:///./public/app/plugins/datasource/postgres/partials/annotations.editor.html","webpack:///./packages/grafana-ui/src/components/Select/SelectOptionGroup.tsx","webpack:///./packages/grafana-data/src/datetime/datemath.ts","webpack:///./packages/grafana-data/src/datetime/common.ts","webpack:///./packages/grafana-data/src/datetime/formatter.ts","webpack:///./packages/grafana-data/src/datetime/formats.ts","webpack:///./packages/grafana-data/src/datetime/parser.ts","webpack:///./packages/grafana-data/src/datetime/rangeutil.ts","webpack:///./packages/grafana-data/src/datetime/timezones.ts","webpack:///./packages/grafana-data/src/datetime/index.ts","webpack:///./public/app/features/search/hooks/useSearch.ts","webpack:///./packages/grafana-ui/src/themes/default.ts","webpack:///./packages/grafana-ui/src/themes/dark.ts","webpack:///./packages/grafana-ui/src/themes/light.ts","webpack:///./packages/grafana-ui/src/themes/getTheme.ts","webpack:///./public/app/features/dashboard/state/actions.ts","webpack:///./packages/grafana-data/src/dataframe/ArrayDataFrame.ts","webpack:///./public/app/features/dashboard/state/PanelQueryRunner.ts","webpack:///./public/app/features/dashboard/state/PanelModel.ts","webpack:///./public/app/features/dashboard/components/SaveDashboard/forms/SaveProvisionedDashboardForm.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/SaveProvisionedDashboard.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/SaveDashboardModalProxy.tsx","webpack:///./public/app/plugins/panel/table-old/editor.html","webpack:///./packages/grafana-ui/src/utils/ansicolor.ts","webpack:///./packages/grafana-ui/src/components/Legend/LegendTable.tsx","webpack:///./packages/grafana-data/src/types/index.ts","webpack:///./packages/grafana-e2e-selectors/src/types/index.ts","webpack:///./public/app/plugins/datasource/loki/components/LokiQueryFieldForm.tsx","webpack:///./public/app/features/dashboard/state/reducers.ts","webpack:///./public/app/core/utils/timePicker.ts","webpack:///./public/app/core/components/Login/LoginCtrl.tsx","webpack:///./public/app/features/variables/guard.ts","webpack:///./public/app/plugins/panel/graph/tab_display.html","webpack:///./packages/grafana-ui/src/components/List/List.tsx","webpack:///./public/app/features/panel/metrics_panel_ctrl.ts","webpack:///./public/app/plugins/sdk.ts","webpack:///./public/app/plugins/datasource/elasticsearch/partials/annotations.editor.html","webpack:///./public/app/features/playlist/partials/playlists.html","webpack:///./public/app/features/panel/panellinks/linkSuppliers.ts","webpack:///./packages/grafana-ui/src/themes/index.ts","webpack:///./packages/grafana-ui/src/components/Cascader/Cascader.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/SaveDashboardButton.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/MetricsQueryEditor.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/PanelQueryEditor.tsx","webpack:///./public/app/features/dashboard/services/TimeSrv.ts","webpack:///./public/app/core/services/backend_srv.ts","webpack:///./public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html","webpack:///./packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButton.tsx","webpack:///./packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.tsx","webpack:///./public/app/plugins/panel/heatmap/module.html","webpack:///./public/app sync extensions\\/index.ts","webpack:///./public/app/features/dashboard/panel_editor/QueryEditorRowTitle.tsx","webpack:///./public/app/features/dashboard/panel_editor/QueryEditorRow.tsx","webpack:///./packages/grafana-ui/src/components/List/InlineList.tsx","webpack:///./public/app/plugins/datasource/stackdriver/partials/config.html","webpack:///./packages/grafana-ui/src/components/ColorPicker/ColorPickerTrigger.tsx","webpack:///./public/app/features/explore/state/actionTypes.ts","webpack:///./packages/grafana-data/src/index.ts","webpack:///./public/app/plugins/datasource/stackdriver/components/Project.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/Metrics.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/Help.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/GroupBys.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/LabelFilter.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/AnnotationsHelp.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/Alignments.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/AlignmentPeriods.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/AliasBy.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/Aggregations.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/SimpleSelect.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/QueryType.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/Fields.tsx","webpack:///./public/app/plugins/datasource/stackdriver/components/index.ts","webpack:///./packages/grafana-ui/src/components/Cascader/optionMappings.ts","webpack:///./packages/grafana-ui/src/components/Button/index.ts","webpack:///./public/app/plugins/datasource/mssql/partials/annotations.editor.html","webpack:///./public/app/plugins/datasource/stackdriver/functions.ts","webpack:///./public/app/core/utils/model_utils.ts","webpack:///./public/app/features/search/components/ConfirmDeleteModal.tsx","webpack:///./public/app/core/utils/kbn.ts","webpack:///./packages/grafana-data/src/transformations/transformers/ensureColumns.ts","webpack:///./public/app/plugins/datasource/elasticsearch/partials/metric_agg.html","webpack:///./public/app/core/utils/react2angular.ts","webpack:///./public/app/features/org/partials/select_org.html","webpack:///./packages/grafana-data/src/types/fieldColor.ts","webpack:///./public/app/features/admin/partials/edit_user.html","webpack:///./public/app/core/logs_model.ts","webpack:///./public/app/core/utils/colors.ts","webpack:///./public/app/core/components/query_part/query_part.ts","webpack:///./public/app/features/dashboard/components/ShareModal/utils.ts","webpack:///./public/app/features/dashboard/components/ShareModal/ShareLink.tsx","webpack:///./public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx","webpack:///./public/app/features/dashboard/components/ShareModal/ShareExport.tsx","webpack:///./public/app/features/dashboard/components/ShareModal/ShareEmbed.tsx","webpack:///./public/app/features/dashboard/components/ShareModal/ShareModal.tsx","webpack:///./public/app/core/components/EmptyListCTA/EmptyListCTA.tsx","webpack:///./public/vendor/angular-other/angular-strap.js","webpack:///./public/app/plugins/datasource/grafana-azure-monitor-datasource/partials/annotations.editor.html","webpack:///./public/app/plugins/panel/dashlist/editor.html","webpack:///./public/app/core/components/PermissionList/PermissionsInfo.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/aws_url.ts","webpack:///./public/app/core/reducers/navModel.ts","webpack:///./packages/grafana-data/src/types/logs.ts","webpack:///./packages/grafana-ui/src/components/StatsPicker/StatsPicker.tsx","webpack:///./packages/grafana-data/src/vector/CircularVector.ts","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./public/app/features/annotations/partials/editor.html","webpack:///./public/app/features/admin/UserSessions.tsx","webpack:///./packages/grafana-data/src/panel/PanelPlugin.ts","webpack:///./public/app/core/store.ts","webpack:///./public/app/core/partials.ts","webpack:///./public/app/plugins/datasource/influxdb/partials/annotations.editor.html","webpack:///./public/app/core/profiler.ts","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Select/IndicatorsContainer.tsx","webpack:///./public/app/types/appNotifications.ts","webpack:///./public/app/plugins/panel/graph/tab_time_regions.html","webpack:///./public/app/plugins/datasource/mssql/partials/query.editor.html","webpack:///./packages/grafana-data/src/utils/flotPairs.ts","webpack:///./public/app/plugins/panel/pluginlist/module.html","webpack:///./packages/grafana-data/src/vector/FunctionalVector.ts","webpack:///./packages/grafana-data/src/types/theme.ts","webpack:///./public/app/partials/error.html","webpack:///./public/app/partials/edit_json.html","webpack:///./public/app/features/dashboard/components/DashLinks/DashLinksEditorCtrl.ts","webpack:///./public/app/core/copy/appNotification.ts","webpack:///./public/app/features/profile/partials/profile.html","webpack:///./public/app/core/utils/UserProvider.tsx","webpack:///./packages/grafana-ui/src/components/Forms/FieldValidationMessage.tsx","webpack:///./public/app/plugins/datasource/elasticsearch/partials/pipeline_variables.html","webpack:///./public/app/features/search/reducers/searchQueryReducer.ts","webpack:///./public/app/features/search/hooks/useSearchQuery.ts","webpack:///./packages/grafana-data/src/vector/RowVector.ts","webpack:///./packages/grafana-data/src/transformations/transformers/calculateField.ts","webpack:///./packages/grafana-ui/src/components/Icon/assets/Apps.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Cog.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Shield.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Favorite.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Grafana.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Bell.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/PlusSquare.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/FolderPlus.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Folder.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Import.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/PanelAdd.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/Circle.tsx","webpack:///./packages/grafana-ui/src/components/Icon/assets/SquareShape.tsx","webpack:///./packages/grafana-ui/src/components/Icon/Icon.tsx","webpack:///./packages/grafana-ui/src/components/transitions/FadeTransition.tsx","webpack:///./public/app/plugins/panel/text/module.ts","webpack:///./public/app/plugins/panel/text2/TextPanel.tsx","webpack:///./public/app/plugins/panel/text2/module.tsx","webpack:///./public/app/plugins/panel/graph2/GraphPanelController.tsx","webpack:///./public/app/plugins/panel/graph2/GraphPanel.tsx","webpack:///./public/app/plugins/panel/graph2/module.tsx","webpack:///./public/app/plugins/panel/graph/jquery.flot.events.ts","webpack:///./public/app/plugins/panel/graph/graph_tooltip.ts","webpack:///./public/app/plugins/panel/graph/threshold_manager.ts","webpack:///./public/app/plugins/panel/graph/time_region_manager.ts","webpack:///./public/app/plugins/panel/graph/histogram.ts","webpack:///./public/app/plugins/panel/graph/align_yaxes.ts","webpack:///./public/app/plugins/panel/graph/Legend/LegendSeriesItem.tsx","webpack:///./public/app/plugins/panel/graph/Legend/Legend.tsx","webpack:///./public/app/plugins/panel/graph/graph.ts","webpack:///./public/app/plugins/panel/graph/series_overrides_ctrl.ts","webpack:///./public/app/plugins/panel/graph/thresholds_form.ts","webpack:///./public/app/plugins/panel/graph/time_regions_form.ts","webpack:///./public/app/plugins/panel/graph/data_processor.ts","webpack:///./public/app/plugins/panel/graph/axes_editor.ts","webpack:///./public/app/plugins/panel/graph/GraphContextMenuCtrl.ts","webpack:///./public/app/plugins/panel/graph/module.ts","webpack:///./public/app/plugins/panel/graph/utils.ts","webpack:///./public/app/plugins/panel/graph/template.ts","webpack:///./public/app/plugins/panel/dashlist/module.ts","webpack:///./public/app/plugins/panel/pluginlist/module.ts","webpack:///./public/app/plugins/panel/alertlist/module.ts","webpack:///./public/app/plugins/panel/annolist/AnnoListPanel.tsx","webpack:///./public/app/plugins/panel/annolist/module.tsx","webpack:///./public/app/plugins/panel/heatmap/color_scale.ts","webpack:///./public/app/plugins/panel/heatmap/color_legend.ts","webpack:///./public/app/plugins/panel/heatmap/axes_editor.ts","webpack:///./public/app/plugins/panel/heatmap/display_editor.ts","webpack:///./public/app/plugins/panel/heatmap/heatmap_data_converter.ts","webpack:///./public/app/plugins/panel/heatmap/heatmap_tooltip.ts","webpack:///./public/app/plugins/panel/heatmap/rendering.ts","webpack:///./public/app/plugins/panel/heatmap/heatmap_ctrl.ts","webpack:///./public/app/plugins/panel/table/TablePanel.tsx","webpack:///./public/app/plugins/panel/table/module.tsx","webpack:///./public/app/plugins/panel/table/migrations.ts","webpack:///./public/app/plugins/panel/table-old/transformers.ts","webpack:///./public/app/plugins/panel/table-old/editor.ts","webpack:///./public/app/plugins/panel/table-old/column_options.ts","webpack:///./public/app/plugins/panel/table-old/renderer.ts","webpack:///./public/app/plugins/panel/table-old/module.ts","webpack:///./public/app/plugins/panel/singlestat/module.ts","webpack:///./public/app/plugins/panel/stat/types.ts","webpack:///./public/app/plugins/panel/stat/StatPanel.tsx","webpack:///./public/app/plugins/panel/stat/module.tsx","webpack:///./public/app/plugins/panel/stat/StatMigrations.ts","webpack:///./public/app/plugins/panel/gettingstarted/components/sharedStyles.ts","webpack:///./public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx","webpack:///./public/app/plugins/panel/gettingstarted/components/DocsCard.tsx","webpack:///./public/app/plugins/panel/gettingstarted/components/Step.tsx","webpack:///./public/app/plugins/panel/gettingstarted/img/Onboarding_Panel_dark.svg","webpack:///./public/app/plugins/panel/gettingstarted/img/Onboarding_Panel_light.svg","webpack:///./public/app/plugins/panel/gettingstarted/steps.ts","webpack:///./public/app/plugins/panel/gettingstarted/GettingStarted.tsx","webpack:///./public/app/plugins/panel/gettingstarted/module.ts","webpack:///./public/app/plugins/panel/gauge/GaugePanel.tsx","webpack:///./public/app/plugins/panel/gauge/module.tsx","webpack:///./public/app/plugins/panel/gauge/GaugeMigrations.ts","webpack:///./public/app/plugins/panel/piechart/PieChartPanel.tsx","webpack:///./public/app/plugins/panel/piechart/module.tsx","webpack:///./public/app/plugins/panel/bargauge/BarGaugePanel.tsx","webpack:///./public/app/plugins/panel/bargauge/types.ts","webpack:///./public/app/plugins/panel/bargauge/module.tsx","webpack:///./public/app/plugins/panel/bargauge/BarGaugeMigrations.ts","webpack:///./public/app/plugins/panel/logs/module.tsx","webpack:///./public/app/plugins/panel/logs/LogsPanel.tsx","webpack:///./public/app/plugins/panel/news/utils.ts","webpack:///./public/app/plugins/panel/news/rss.ts","webpack:///./public/app/plugins/panel/news/NewsPanel.tsx","webpack:///./public/app/plugins/panel/news/constants.ts","webpack:///./public/app/plugins/panel/news/module.tsx","webpack:///./public/app/plugins/panel/homelinks/module.tsx","webpack:///./public/app/plugins/panel/welcome/img/background_light.svg","webpack:///./public/app/plugins/panel/welcome/Welcome.tsx","webpack:///./public/app/plugins/panel/welcome/module.ts","webpack:///./public/app/features/plugins/built_in_plugins.ts","webpack:///./public/app/features/dashboard/dashgrid/PanelPluginError.tsx","webpack:///./public/app/features/plugins/plugin_loader.ts","webpack:///./public/app/features/variables/state/types.ts","webpack:///./public/app/features/alerting/partials/notification_edit.html","webpack:///./public/app/core/services/keybindingSrv.ts","webpack:///./public/app/features/plugins/datasource_srv.ts","webpack:///./public/app/features/datasources/partials/http_settings_next.html","webpack:///./public/app/core/components/LayoutSelector/LayoutSelector.tsx","webpack:///./public/app/features/search/components/SearchItem.tsx","webpack:///./public/app/core/selectors/location.ts","webpack:///./public/app/features/plugins/partials/update_instructions.html","webpack:///./public/app/core/app_events.ts","webpack:///./public/app/features/panel/partials/general_tab.html","webpack:///./public/app/features/admin/OrgRolePicker.tsx","webpack:///./public/app/features/dashboard/components/ShareModal/index.ts","webpack:///./public/app/core/utils/dag.ts","webpack:///./public/app/partials/reset_password.html","webpack:///./public/app/features/variables/state/variablesReducer.ts","webpack:///./public/app/features/profile/SignupForm.tsx","webpack:///./public/app/features/variables/editor/reducer.ts","webpack:///./public/app/features/admin/state/reducers.ts","webpack:///./public/app/plugins/datasource/loki/components/useLokiLabels.ts","webpack:///./public/app/plugins/datasource/loki/components/useLokiSyntaxAndLabels.ts","webpack:///./packages/grafana-data/src/vector/SortedVector.ts","webpack:///./packages/grafana-data/src/types/datasource.ts","webpack:///./public/app/core/components/TagFilter/TagOption.tsx","webpack:///./public/app/core/components/TagFilter/TagFilter.tsx","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Input/Input.tsx","webpack:///./public/app/core/config.ts","webpack:///./public/app/plugins/panel/graph/axes_editor.html","webpack:///./public/app/core/components/PageLoader/PageLoader.tsx","webpack:///./public/app/core/components/Page/PageContents.tsx","webpack:///./public/app/core/components/Page/Page.tsx","webpack:///./public/app/core/utils/acl.ts","webpack:///./packages/grafana-data/src/transformations/fieldReducer.ts","webpack:///./public/app/features/search/constants.ts","webpack:///./public/app/features/dashboard/components/DashboardSettings/TimePickerSettings.tsx","webpack:///./public/app/core/utils/deferred.ts","webpack:///./public/app/features/variables/state/sharedReducer.ts","webpack:///./packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.tsx","webpack:///./packages/grafana-ui/src/components/ConfirmButton/DeleteButton.tsx","webpack:///./packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.tsx","webpack:///./packages/grafana-ui/src/components/ButtonCascader/ButtonCascader.tsx","webpack:///./packages/grafana-ui/src/components/LoadingPlaceholder/LoadingPlaceholder.tsx","webpack:///./packages/grafana-ui/src/components/PieChart/PieChart.tsx","webpack:///./packages/grafana-ui/src/components/PanelOptionsGroup/PanelOptionsGroup.tsx","webpack:///./packages/grafana-ui/src/components/PanelOptionsGrid/PanelOptionsGrid.tsx","webpack:///./packages/grafana-ui/src/components/EmptySearchResult/EmptySearchResult.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimeOfDayPicker.tsx","webpack:///./packages/grafana-ui/src/components/TagsInput/TagItem.tsx","webpack:///./packages/grafana-ui/src/components/TagsInput/TagsInput.tsx","webpack:///./packages/grafana-ui/src/components/Pagination/Pagination.tsx","webpack:///./packages/grafana-ui/src/components/Tags/Tag.tsx","webpack:///./packages/grafana-ui/src/components/Tags/TagList.tsx","webpack:///./packages/grafana-ui/src/components/FilterPill/FilterPill.tsx","webpack:///./packages/grafana-ui/src/components/ConfirmModal/ConfirmModal.tsx","webpack:///./packages/grafana-ui/src/components/QueryField/QueryField.tsx","webpack:///./packages/grafana-ui/src/components/Tabs/TabsBar.tsx","webpack:///./packages/grafana-ui/src/components/Tabs/Counter.tsx","webpack:///./packages/grafana-ui/src/components/Tabs/Tab.tsx","webpack:///./packages/grafana-ui/src/components/Modal/ModalTabsHeader.tsx","webpack:///./packages/grafana-ui/src/components/Modal/ModalTabContent.tsx","webpack:///./packages/grafana-ui/src/components/Modal/ModalsContext.tsx","webpack:///./packages/grafana-ui/src/components/SetInterval/SetInterval.tsx","webpack:///./packages/grafana-ui/src/components/Table/DefaultCell.tsx","webpack:///./packages/grafana-ui/src/components/FormattedValueDisplay/FormattedValueDisplay.tsx","webpack:///./packages/grafana-ui/src/components/BarGauge/BarGauge.tsx","webpack:///./packages/grafana-ui/src/components/Table/types.ts","webpack:///./packages/grafana-ui/src/components/Table/BarGaugeCell.tsx","webpack:///./packages/grafana-ui/src/components/Table/withTableStyles.tsx","webpack:///./packages/grafana-ui/src/components/JSONFormatter/json_explorer/helpers.ts","webpack:///./packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts","webpack:///./packages/grafana-ui/src/components/JSONFormatter/JSONFormatter.tsx","webpack:///./packages/grafana-ui/src/components/Table/JSONViewCell.tsx","webpack:///./packages/grafana-ui/src/components/Table/utils.ts","webpack:///./packages/grafana-ui/src/components/Table/styles.ts","webpack:///./packages/grafana-ui/src/components/Table/TableCell.tsx","webpack:///./packages/grafana-ui/src/components/Table/Table.tsx","webpack:///./packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx","webpack:///./packages/grafana-ui/src/components/Tabs/TabContent.tsx","webpack:///./packages/grafana-ui/src/components/BigValue/BigValueLayout.tsx","webpack:///./packages/grafana-ui/src/components/BigValue/BigValue.tsx","webpack:///./packages/grafana-ui/src/components/Gauge/Gauge.tsx","webpack:///./packages/grafana-ui/src/components/Chart/TooltipContainer.tsx","webpack:///./packages/grafana-ui/src/components/Chart/Tooltip.tsx","webpack:///./packages/grafana-ui/src/components/Legend/SeriesIcon.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphTooltip/SeriesTable.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphTooltip/SingleModeGraphTooltip.tsx","webpack:///./packages/grafana-ui/src/components/Graph/utils.ts","webpack:///./packages/grafana-ui/src/components/Graph/GraphTooltip/MultiModeGraphTooltip.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphTooltip/GraphTooltip.tsx","webpack:///./packages/grafana-ui/src/components/ContextMenu/ContextMenu.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphContextMenu.tsx","webpack:///./packages/grafana-ui/src/components/Graph/Graph.tsx","webpack:///./packages/grafana-ui/src/components/Legend/LegendSeriesIcon.tsx","webpack:///./packages/grafana-ui/src/components/Legend/LegendStatsList.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphLegendItem.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphLegend.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphWithLegend.tsx","webpack:///./packages/grafana-ui/src/utils/squares.ts","webpack:///./packages/grafana-ui/src/components/VizRepeater/VizRepeater.tsx","webpack:///./packages/grafana-ui/src/components/Alert/Alert.tsx","webpack:///./packages/grafana-ui/src/components/Graph/GraphSeriesToggler.tsx","webpack:///./packages/grafana-ui/src/components/Collapse/Collapse.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogLabels.tsx","webpack:///./packages/grafana-ui/src/components/Logs/getLogRowStyles.ts","webpack:///./packages/grafana-ui/src/components/Logs/LogRowContextProvider.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogLabelStatsRow.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogLabelStats.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogDetails.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogRowContext.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogMessageAnsi.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogRowMessage.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogRow.tsx","webpack:///./packages/grafana-ui/src/components/Logs/LogRows.tsx","webpack:///./packages/grafana-ui/src/components/ToggleButtonGroup/ToggleButtonGroup.tsx","webpack:///./packages/grafana-ui/src/components/SingleStatShared/SingleStatBaseOptions.ts","webpack:///./packages/grafana-ui/src/components/CallToActionCard/CallToActionCard.tsx","webpack:///./packages/grafana-ui/src/components/ContextMenu/WithContextMenu.tsx","webpack:///./packages/grafana-ui/src/components/DataLinks/DataLinksContextMenu.tsx","webpack:///./packages/grafana-ui/src/components/InfoBox/panelArt_dark.svg","webpack:///./packages/grafana-ui/src/components/InfoBox/panelArt_light.svg","webpack:///./packages/grafana-ui/src/components/InfoBox/InfoBox.tsx","webpack:///./packages/grafana-ui/src/components/Badge/Badge.tsx","webpack:///./packages/grafana-ui/src/components/InfoBox/FeatureInfoBox.tsx","webpack:///./packages/grafana-ui/src/components/ErrorBoundary/ErrorWithStack.tsx","webpack:///./packages/grafana-ui/src/components/ErrorBoundary/ErrorBoundary.tsx","webpack:///./packages/grafana-ui/src/components/AlphaNotice/AlphaNotice.tsx","webpack:///./packages/grafana-ui/src/components/FormField/FormField.tsx","webpack:///./packages/grafana-ui/src/components/SecretFormField/SecretFormField.tsx","webpack:///./packages/grafana-ui/src/components/DataSourceSettings/BasicAuthSettings.tsx","webpack:///./packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx","webpack:///./packages/grafana-ui/src/components/DataSourceSettings/CertificationKey.tsx","webpack:///./packages/grafana-ui/src/components/DataSourceSettings/TLSAuthSettings.tsx","webpack:///./packages/grafana-ui/src/components/DataSourceSettings/CustomHeadersSettings.tsx","webpack:///./packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx","webpack:///./packages/grafana-ui/src/components/Segment/Segment.tsx","webpack:///./packages/grafana-ui/src/components/Segment/SegmentSelect.tsx","webpack:///./packages/grafana-ui/src/components/Segment/SegmentAsync.tsx","webpack:///./packages/grafana-ui/src/components/Segment/SegmentInput.tsx","webpack:///./packages/grafana-ui/src/components/Segment/useExpandableLabel.tsx","webpack:///./packages/grafana-ui/src/components/Chart/index.tsx","webpack:///./packages/grafana-ui/src/components/Drawer/Drawer.tsx","webpack:///./packages/grafana-ui/src/components/Slider/Slider.tsx","webpack:///./packages/grafana-ui/src/components/TextArea/TextArea.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/string.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/number.tsx","webpack:///./packages/grafana-ui/src/components/OptionsUI/select.tsx","webpack:///./packages/grafana-ui/src/components/FieldConfigs/FieldConfigItemHeaderTitle.tsx","webpack:///./packages/grafana-ui/src/components/Forms/Form.tsx","webpack:///./packages/grafana-ui/src/components/ValuePicker/ValuePicker.tsx","webpack:///./packages/grafana-ui/src/components/MatchersUI/FieldNameMatcherEditor.tsx","webpack:///./packages/grafana-ui/src/components/MatchersUI/fieldMatchersUI.ts","webpack:///./packages/grafana-ui/src/components/Forms/Legend.tsx","webpack:///./packages/grafana-ui/src/components/Forms/Checkbox.tsx","webpack:///./packages/grafana-ui/src/components/Forms/getFormStyles.ts","webpack:///./packages/grafana-ui/src/components/Select/ButtonSelect.tsx","webpack:///./packages/grafana-ui/src/components/index.ts","webpack:///./packages/grafana-ui/src/utils/colors.ts","webpack:///./packages/grafana-ui/src/utils/validate.ts","webpack:///./packages/grafana-ui/src/utils/tags.ts","webpack:///./packages/grafana-ui/src/utils/scrollbar.ts","webpack:///./packages/grafana-ui/src/utils/dom.ts","webpack:///./packages/grafana-ui/src/utils/renderOrCallToRender.ts","webpack:///./packages/grafana-ui/src/utils/index.ts","webpack:///./packages/grafana-data/src/text/sanitize.ts","webpack:///./public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx","webpack:///./packages/grafana-data/src/utils/valueMappings.ts","webpack:///./packages/grafana-ui/src/components/Select/getSelectStyles.ts","webpack:///./packages/grafana-ui/src/components/Select/SelectMenu.tsx","webpack:///./packages/grafana-ui/src/components/Select/IndicatorsContainer.tsx","webpack:///./packages/grafana-ui/src/components/Select/ValueContainer.tsx","webpack:///./packages/grafana-ui/src/components/Select/InputControl.tsx","webpack:///./packages/grafana-ui/src/components/Select/DropdownIndicator.tsx","webpack:///./packages/grafana-ui/src/components/Select/MultiValue.tsx","webpack:///./packages/grafana-ui/src/components/Select/utils.ts","webpack:///./packages/grafana-ui/src/components/Select/SelectBase.tsx","webpack:///./public/app/features/panel/panellinks/module.html","webpack:///./public/app/core/utils/query.ts","webpack:///./public/app/plugins/datasource/elasticsearch/partials/query.editor.html","webpack:///./packages/grafana-ui/src/components/ClickOutsideWrapper/ClickOutsideWrapper.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/Stats.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/Dimensions.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/Forms.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/Alias.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/MetricsQueryFieldsEditor.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/index.ts","webpack:///./public/app/features/templating/types.ts","webpack:///./packages/grafana-ui/src/components/Layout/Layout.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/syntax.ts","webpack:///./public/app/plugins/panel/graph/tab_drilldown_links.html","webpack:///./public/app/features/dashboard/components/SubMenu/template.html","webpack:///./public/app/plugins/panel/table-old/column_options.html","webpack:///./public/app/plugins/datasource/stackdriver/partials/annotations.editor.html","webpack:///./public/app/features/manage-dashboards/services/ValidationSrv.ts","webpack:///./public/app/plugins/datasource/grafana/partials/query.editor.html","webpack:///./packages/grafana-ui/src/utils/useClientRect.ts","webpack:///./packages/grafana-ui/src/components/Input/Input.tsx","webpack:///./packages/grafana-data/src/valueFormats/symbolFormatters.ts","webpack:///./public/app/plugins/datasource/postgres/partials/config.html","webpack:///./packages/grafana-ui/src/components/Forms/Label.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardAsForm.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx","webpack:///./packages/grafana-ui/src/themes/selectThemeVariant.ts","webpack:///./public/app/features/alerting/state/ThresholdMapper.ts","webpack:///./public/app/features/alerting/AlertTabCtrl.ts","webpack:///./public/app/features/dashboard/components/PanelEditor/types.ts","webpack:///./public/app/plugins/panel/dashlist/module.html","webpack:///./public/app/features/search/components/MoveToFolderModal.tsx","webpack:///./public/app/plugins/datasource/graphite/partials/query.editor.html","webpack:///./public/vendor/tagsinput/bootstrap-tagsinput.js","webpack:///./public/app/core/constants.ts","webpack:///./packages/grafana-ui/src/components/ColorPicker/SeriesColorPickerPopover.tsx","webpack:///./packages/grafana-data/src/types/dataLink.ts","webpack:///./public/app/features/expressions/types.ts","webpack:///./public/app/features/expressions/ExpressionQueryEditor.tsx","webpack:///./public/app/features/expressions/ExpressionDatasource.ts","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.tsx","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx","webpack:///./public/app/core/components/Select/FolderPicker.tsx","webpack:///./packages/grafana-ui/src/components/Modal/Modal.tsx","webpack:///./public/app/features/panel/query_ctrl.ts","webpack:///./public/app/features/search/components/SearchCheckbox.tsx","webpack:///./public/app/features/org/state/reducers.ts","webpack:///./packages/grafana-ui/src/components/Modal/getModalStyles.ts","webpack:///./public/app/plugins/datasource/cloudwatch/utils/query/getStatsGroups.ts","webpack:///./public/app/plugins/datasource/cloudwatch/components/LogsQueryField.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/useCloudwatchSyntax.ts","webpack:///./public/app/plugins/datasource/cloudwatch/components/CloudWatchLink.tsx","webpack:///./public/app/plugins/datasource/cloudwatch/components/LogsQueryEditor.tsx","webpack:///./public/app/features/search/components/SectionHeader.tsx","webpack:///./public/app/features/search/components/SearchResults.tsx","webpack:///./packages/grafana-data/src/utils/labels.ts","webpack:///./public/app/features/variables/shared/multiOptions.ts","webpack:///./public/app/plugins/datasource/mysql/partials/query.editor.html","webpack:///./public/app/core/services/impression_srv.ts","webpack:///./public/app/plugins/panel/singlestat/editor.html","webpack:///./public/app/plugins/datasource/cloudwatch/partials/query.parameter.html","webpack:///./public/app/features/dashboard/components/DashNav/DashNav.tsx","webpack:///./public/app/features/dashboard/components/DashNav/index.ts","webpack:///./public/app/features/admin/ldap/LdapSyncInfo.tsx","webpack:///./public/app/partials/confirm_modal.html","webpack:///./public/app/store/store.ts","webpack:///./public/app/features/admin/partials/stats.html","webpack:///./public/app/plugins/datasource/stackdriver/components/QueryEditor.tsx","webpack:///./public/app/core/table_model.ts","webpack:///./public/app/core/components/Branding/Branding.tsx","webpack:///./packages/grafana-data/src/dataframe/DataFrameView.ts","webpack:///./packages/grafana-data/src/utils/fieldParser.ts","webpack:///./packages/grafana-data/src/dataframe/MutableDataFrame.ts","webpack:///./public/app/features/dashboard/components/RowOptions/template.html","webpack:///./public/app/features/search/reducers/dashboardSearch.ts","webpack:///./public/app/features/plugins/state/actions.ts","webpack:///./public/app/features/dashboard/state/analyticsProcessor.ts","webpack:///./public/app/plugins/datasource/prometheus/partials/annotations.editor.html","webpack:///./public/app/features/search/reducers/manageDashboards.ts","webpack:///./public/app/features/search/hooks/useManageDashboards.ts","webpack:///./public/app/features/search/components/DashboardActions.tsx","webpack:///./public/app/features/search/components/ManageDashboards.tsx","webpack:///./public/app/features/dashboard/components/DashboardSettings/template.html","webpack:///./packages/grafana-ui/src/index.ts","webpack:///./public/app/features/dashboard/state/runRequest.ts","webpack:///./public/vendor/bootstrap/bootstrap.js","webpack:///./public/vendor/flot/jquery.flot.fillbelow.js","webpack:///./public/app/core/utils/applyStateChanges.ts","webpack:///./public/app/features/variables/pickers/OptionsPicker/reducer.ts","webpack:///./public/app/features/playlist/partials/playlist.html","webpack:///./public/app/plugins/panel/table-old/module.html","webpack:///./public/app/core/nav_model_srv.ts","webpack:///./public/app/features/search/utils.ts","webpack:///./public/app/core/components/QueryOperationRow/QueryOperationRow.tsx","webpack:///./packages/grafana-ui/src/components/List/AbstractList.tsx","webpack:///./public/app/core/selectors/navModel.ts","webpack:///./packages/grafana-data/src/utils/namedColorsPalette.ts","webpack:///./public/app/core/utils/explore.ts","webpack:///./public/app/features/variables/adhoc/actions.ts","webpack:///./public/app/plugins/panel/heatmap/partials/display_editor.html","webpack:///./packages/grafana-ui/src/components/FormLabel/FormLabel.tsx","webpack:///./public/app/core/components/SharedPreferences/SharedPreferences.tsx","webpack:///./public/app/core/services/search_srv.ts","webpack:///./public/app/features/dashboard/components/DashNav/DashNavTimeControls.tsx","webpack:///./packages/grafana-data/src/types/thresholds.ts","webpack:///./public/app/features/users/state/reducers.ts","webpack:///./public/app/features/manage-dashboards/state/reducers.ts","webpack:///./packages/grafana-ui/src/utils/dataLinks.ts","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Switch/Switch.tsx","webpack:///./public/app/features/admin/UserPermissions.tsx","webpack:///./public/app/core/utils/ticks.ts","webpack:///./public/app/features/panel/partials/query_editor_row.html","webpack:///./packages/grafana-data/src/text/string.ts","webpack:///./public/app/features/panel/partials/panelTime.html","webpack:///./packages/grafana-ui/src/components/Button/ButtonContent.tsx","webpack:///./packages/grafana-ui/src/components/Button/Button.tsx","webpack:///./public/app/features/plugins/PluginSettingsCache.ts","webpack:///./public/app/features/dashboard/services/DashboardSrv.ts","webpack:///./public/app/features/variables/state/selectors.ts","webpack:///./public/app/plugins/datasource/testdata/partials/query.editor.html","webpack:///./public/app/plugins/panel/graph/time_regions_form.html","webpack:///./packages/grafana-data/src/vector/AppendedVectors.ts","webpack:///./packages/grafana-data/src/vector/ConstantVector.ts","webpack:///./packages/grafana-data/src/vector/BinaryOperationVector.ts","webpack:///./packages/grafana-data/src/vector/FormattedVector.ts","webpack:///./packages/grafana-data/src/vector/index.ts","webpack:///./packages/grafana-data/src/transformations/matchers/nameMatcher.ts","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Select/ButtonSelect.tsx","webpack:///./public/app/plugins/panel/alertlist/editor.html","webpack:///./packages/grafana-data/src/field/fieldState.ts","webpack:///./packages/grafana-ui/src/components/Button/FullWidthButtonContainer.tsx","webpack:///./packages/grafana-data/src/transformations/transformers/seriesToColumns.ts","webpack:///./public/app/features/alerting/state/reducers.ts","webpack:///./packages/grafana-ui/src/themes/stylesFactory.ts","webpack:///./packages/grafana-ui/src/components/IconButton/IconButton.tsx","webpack:///./packages/grafana-data/src/transformations/matchers/predicates.ts","webpack:///./public/app/core/components/TagFilter/TagBadge.tsx","webpack:///./packages/grafana-ui/src/components/Tooltip/PopoverController.tsx","webpack:///./packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx","webpack:///./public/app/core/utils/sort_by_keys.ts","webpack:///./public/app/features/dashboard/state/DashboardMigrator.ts","webpack:///./public/app/core/utils/factors.ts","webpack:///./public/app/features/dashboard/state/DashboardModel.ts","webpack:///./public/app/plugins/datasource/cloudwatch/utils/query/ScrollQLParser.js","webpack:///./public/app/plugins/datasource/opentsdb/partials/annotations.editor.html","webpack:///./public/app/core/components/QueryOperationRow/QueryOperationAction.tsx","webpack:///./public/app/features/admin/state/actions.ts","webpack:///./public/app/types/explore.ts","webpack:///./packages/grafana-data/src/utils/datasource.ts","webpack:///./packages/grafana-data/src/utils/csv.ts","webpack:///./packages/grafana-data/src/utils/deprecationWarning.ts","webpack:///./packages/grafana-data/src/utils/logs.ts","webpack:///./packages/grafana-data/src/utils/object.ts","webpack:///./packages/grafana-data/src/utils/series.ts","webpack:///./packages/grafana-data/src/utils/url.ts","webpack:///./packages/grafana-data/src/utils/location.ts","webpack:///./packages/grafana-data/src/utils/docs.ts","webpack:///./packages/grafana-data/src/utils/dataLinks.ts","webpack:///./packages/grafana-data/src/utils/index.ts","webpack:///./public/app/core/utils/ConfigProvider.tsx","webpack:///./packages/grafana-runtime/src/config.ts","webpack:///./packages/grafana-runtime/src/types/analytics.ts","webpack:///./packages/grafana-runtime/src/utils/plugin.ts","webpack:///./packages/grafana-runtime/src/utils/analytics.ts","webpack:///./packages/grafana-runtime/src/utils/queryResponse.ts","webpack:///./packages/grafana-runtime/src/utils/DataSourceWithBackend.ts","webpack:///./packages/grafana-runtime/src/index.ts","webpack:///./packages/grafana-data/src/datetime/moment_wrapper.ts","webpack:///./public/app/features/dashboard/components/PanelEditor/state/reducers.ts","webpack:///./public/app/plugins/datasource/stackdriver/components/SLOQueryEditor.tsx","webpack:///./public/app/core/components/CopyToClipboard/CopyToClipboard.tsx","webpack:///./public/app/core/core_module.ts","webpack:///./public/app/plugins/datasource/stackdriver/types.ts","webpack:///./public/app/core/services/context_srv.ts","webpack:///./packages/grafana-ui/src/components/Tooltip/Popover.tsx","webpack:///./public/app/core/utils/errors.ts","webpack:///./public/app sync \\.html$","webpack:///./public/app/plugins/panel/heatmap/partials/axes_editor.html","webpack:///./public/vendor/flot/jquery.flot.dashes.js","webpack:///./public/app/core/reducers/appNotification.ts","webpack:///./public/app/plugins/datasource/opentsdb/partials/query.editor.html","webpack:///./packages/grafana-data/src/types/appEvents.ts","webpack:///./public/app/features/annotations/partials/event_editor.html","webpack:///./packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx","webpack:///./packages/grafana-ui/src/types/forms.ts","webpack:///./public/app/core/utils/flatten.ts","webpack:///./packages/grafana-ui/src/components/UnitPicker/UnitPicker.tsx","webpack:///./public/app/core/components/Select/TeamPicker.tsx","webpack:///./public/app/core/components/PermissionList/AddPermission.tsx","webpack:///./public/app/features/alerting/partials/alert_howto.html","webpack:///./public/app/features/dashboard/components/VersionHistory/template.html","webpack:///./public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx","webpack:///./public/app/types/events.ts","webpack:///./packages/grafana-data/src/transformations/matchers/fieldTypeMatcher.ts","webpack:///./packages/grafana-data/src/transformations/matchers/refIdMatcher.ts","webpack:///./packages/grafana-data/src/transformations/matchers.ts","webpack:///./public/vendor/flot/jquery.flot.stackpercent.js","webpack:///./packages/grafana-data/src/types/OptionsUIRegistryBuilder.ts","webpack:///./packages/grafana-data/src/utils/OptionsUIBuilders.ts","webpack:///./public/app/features/annotations/editor_ctrl.ts","webpack:///./public/app/features/annotations/events_processing.ts","webpack:///./public/app/features/annotations/annotations_srv.ts","webpack:///./public/app/features/annotations/event_editor.ts","webpack:///./public/app/features/annotations/event_manager.ts","webpack:///./public/app/features/annotations/annotation_tooltip.ts","webpack:///./public/app/features/annotations/all.ts","webpack:///./public/app/routes/ReactContainer.tsx","webpack:///./public/app/features/templating/utils.ts","webpack:///./public/app/features/plugins/state/reducers.ts","webpack:///./packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/colors.ts","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/TimePickerTitle.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/TimePickerCalendar.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/TimeRangeForm.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/TimeRangeOption.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/TimeRangeList.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/mapper.ts","webpack:///./packages/grafana-ui/src/components/TimePicker/TimePickerContent/TimePickerContent.tsx","webpack:///./packages/grafana-ui/src/components/TimePicker/TimeRangePicker.tsx","webpack:///./packages/grafana-ui/src/components/Legend/Legend.tsx","webpack:///./public/app/core/hooks/useRefMounted.ts","webpack:///./public/app/features/admin/ldap/LdapPage.tsx","webpack:///./public/app/plugins/panel/graph/thresholds_form.html","webpack:///./public/app/core/actions/cleanUp.ts","webpack:///./public/app/routes/dashboard_loaders.ts","webpack:///./public/app/routes/registry.ts","webpack:///./public/app/core/components/Login/UserSignup.tsx","webpack:///./public/app/core/components/Login/LoginServiceButtons.tsx","webpack:///./public/app/core/components/Login/LoginForm.tsx","webpack:///./public/app/core/components/Login/ChangePassword.tsx","webpack:///./public/app/core/components/Login/LoginPage.tsx","webpack:///./public/app/core/components/DynamicImports/LoadingChunkPlaceHolder.tsx","webpack:///./public/app/core/components/DynamicImports/ErrorLoadingChunk.tsx","webpack:///./public/app/core/components/DynamicImports/SafeDynamicImport.tsx","webpack:///./public/app/routes/routes.ts","webpack:///./public/app/core/services/echo/Echo.ts","webpack:///./public/app/core/services/echo/EchoSrv.ts","webpack:///./public/app/core/services/echo/backends/PerformanceBackend.ts","webpack:///./public/app/core/services/AngularLoader.ts","webpack:///./public/app/core/reducers/application.ts","webpack:///./public/app/core/reducers/index.ts","webpack:///./public/app/features/explore/utils/ResultProcessor.ts","webpack:///./public/app/features/explore/state/reducers.ts","webpack:///./public/app/features/profile/state/reducers.ts","webpack:///./public/app/features/variables/state/reducers.ts","webpack:///./public/app/core/reducers/root.ts","webpack:///./public/app/routes/GrafanaCtrl.ts","webpack:///./public/app/store/configureStore.ts","webpack:///./public/app/features/templating/editor_ctrl.ts","webpack:///./public/app/features/templating/variable_srv.ts","webpack:///./public/app/features/templating/interval_variable.ts","webpack:///./public/app/features/templating/query_variable.ts","webpack:///./public/app/features/templating/datasource_variable.ts","webpack:///./public/app/features/templating/custom_variable.ts","webpack:///./public/app/features/templating/constant_variable.ts","webpack:///./public/app/features/templating/adhoc_variable.ts","webpack:///./public/app/features/templating/TextBoxVariable.ts","webpack:///./public/app/features/templating/all.ts","webpack:///./public/app/features/plugins/plugin_page_ctrl.ts","webpack:///./public/app/features/plugins/plugin_component.ts","webpack:///./public/app/features/plugins/variableQueryEditorLoader.tsx","webpack:///./public/app/features/dashboard/components/SaveDashboard/UnsavedChangesModal.tsx","webpack:///./public/app/features/dashboard/services/ChangeTracker.ts","webpack:///./public/app/features/dashboard/services/UnsavedChangesSrv.ts","webpack:///./public/app/features/dashboard/services/DashboardLoaderSrv.ts","webpack:///./public/app/features/dashboard/components/VersionHistory/HistoryListCtrl.ts","webpack:///./public/app/features/dashboard/components/VersionHistory/HistorySrv.ts","webpack:///./public/app/features/dashboard/components/AdHocFilters/AdHocFiltersCtrl.ts","webpack:///./public/app/features/dashboard/components/RowOptions/RowOptionsCtrl.ts","webpack:///./public/app/features/dashboard/components/DashboardPermissions/DashboardPermissions.tsx","webpack:///./public/app/features/dashboard/index.ts","webpack:///./public/app/features/playlist/playlists_ctrl.ts","webpack:///./public/app/features/playlist/playlist_search.ts","webpack:///./public/app/features/playlist/playlist_srv.ts","webpack:///./public/app/features/playlist/playlist_edit_ctrl.ts","webpack:///./public/app/features/playlist/playlist_routes.ts","webpack:///./public/app/features/panel/panel_directive.ts","webpack:///./public/app/features/panel/panel_editor_tab.ts","webpack:///./public/app/features/panel/query_editor_row.ts","webpack:///./public/app/features/panel/repeat_option.ts","webpack:///./public/app/features/panel/panellinks/module.ts","webpack:///./public/app/features/org/SelectOrgCtrl.ts","webpack:///./public/app/features/admin/AdminEditUserCtrl.ts","webpack:///./public/app/features/admin/AdminEditOrgCtrl.ts","webpack:///./public/app/features/admin/index.ts","webpack:///./public/app/features/alerting/NotificationsEditCtrl.ts","webpack:///./public/app/features/manage-dashboards/components/UploadDashboard/uploadDashboardDirective.ts","webpack:///./public/app/features/profile/ProfileCtrl.ts","webpack:///./public/app/features/datasources/settings/HttpSettingsCtrl.ts","webpack:///./public/app/features/datasources/settings/TlsAuthSettingsCtrl.ts","webpack:///./public/app/core/components/TransformersUI/ReduceTransformerEditor.tsx","webpack:///./public/app/core/components/TransformersUI/FilterByNameTransformerEditor.tsx","webpack:///./public/app/core/components/TransformersUI/FilterByRefIdTransformerEditor.tsx","webpack:///./public/app/core/components/TransformersUI/OrganizeFieldsTransformerEditor.tsx","webpack:///./public/app/core/components/TransformersUI/SeriesToFieldsTransformerEditor.tsx","webpack:///./public/app/core/components/TransformersUI/CalculateFieldTransformerEditor.tsx","webpack:///./public/app/core/components/TransformersUI/LabelsToFieldsTransformerEditor.tsx","webpack:///./public/app/core/utils/standardTransformers.ts","webpack:///./public/app/app.ts","webpack:///./public/app/core/utils/browser.ts","webpack:///./public/app/index.ts","webpack:///./packages/grafana-runtime/src/services/EchoSrv.ts","webpack:///./public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts","webpack:///./public/app/features/dashboard/components/DashExportModal/index.ts","webpack:///./packages/grafana-ui/src/utils/slate.ts","webpack:///./public/app/core/utils/fetch.ts"],"names":["UserProfile","state","isLoading","showDeleteModal","showDisableModal","showDeleteUserModal","show","setState","showDisableUserModal","onUserDelete","props","user","id","onUserDisable","onUserEnable","onUserNameChange","newValue","onUserUpdate","name","onUserEmailChange","email","onUserLoginChange","login","onPasswordChange","this","authSource","authLabels","length","lockMessage","styles","getStyles","config","theme","className","UserProfileRow","label","value","locked","isExternal","onChange","inputType","buttonRow","variant","onClick","isOpen","title","body","confirmText","onConfirm","onDismiss","isDisabled","PureComponent","stylesFactory","css","editing","setInputElem","elem","inputElem","onEditClick","focusInput","onCancelClick","onInputChange","event","status","LegacyInputStatus","Invalid","target","onInputBlur","focus","onSave","labelClass","cx","editButtonContainerClass","LockedRow","colSpan","type","defaultValue","onBlur","ref","width","onCancel","defaultProps","lockMessageClass","removePanel","dashboard","panel","ask","text2","alert","appEvents","emit","CoreEvents","showConfirmModal","text","icon","yesText","duplicatePanel","copyPanel","store","set","LS_PANEL_COPY_KEY","JSON","stringify","getSaveModel","AppEvents","alertSuccess","sharePanel","showModalReact","component","ShareModal","applyPanelTimeOverrides","timeRange","newTimeData","timeInfo","timeFrom","timeFromInterpolated","templateSrv","replace","scopedVars","timeFromInfo","rangeUtil","describeTextRange","invalid","_isString","raw","from","timeFromDate","dateMath","parse","display","to","timeShift","timeShiftInterpolated","parseDateMath","hideTimeOverride","AsyncSelect","LegacyForms","UserPicker","search","bind","debouncedSearch","debounce","leading","trailing","query","_","isNil","getBackendSrv","get","then","result","map","userId","imgUrl","avatarUrl","finally","onSelected","defaultOptions","loadOptions","placeholder","noOptionsMessage","Component","getScaleCalculator","field","themeType","GrafanaThemeType","Dark","thresholds","color","fixedColor","mode","FieldColorMode","Fixed","getColorFromHexRgbOrName","undefined","percentThresholds","ThresholdsMode","Percentage","useColorScheme","Scheme","min","max","isNumber","values","stats","reduceField","reducers","ReducerID","interpolator","delta","d3","schemeName","percent","threshold","getActiveThreshold","steps","active","sortThresholds","sort","t1","t2","timeFormats","dateTimeAsIso","dateTimeAsUS","dateTimeFromNow","getDisplayProcessor","options","isEmpty","toStringProcessor","FieldType","time","unit","startsWith","DEFAULT_DATE_TIME_FORMAT","formatFunc","getValueFormat","scaleFunc","mappings","toString","numeric","toNumber","prefix","suffix","shouldFormat","mappedValue","getMappedValue","v","isNaN","isBoolean","getDecimalsForValue","decimals","scaledDecimals","timeZone","noValue","Infinity","Array","isArray","NaN","decimalOverride","size","dec","Math","floor","log","LN10","magn","pow","norm","getFieldDisplayValues","parts","replaceVariables","reduceOptions","fieldConfig","calcs","last","fieldMatcher","getFieldMatcher","fields","FieldMatcherID","byRegexp","data","hitLimit","limit","defaultDisplayName","push","join","s","series","timeField","getTimeField","view","DataFrameView","i","fieldLinksSupplier","getLinks","displayName","usesCellValues","indexOf","j","k","displayValue","colIndex","rowIndex","valueRowIndex","hasLinks","results","sparkline","getFlotPairs","xField","yField","calc","calculatedValue","defaults","other","displayProcessor","fallback","getDisplayText","createNoValuesFieldDisplay","links","getDisplayValueAlignmentFactors","info","prefixLength","suffixLength","FieldConfigOptionsRegistry","Registry","standardFieldConfigEditorRegistry","standardEditorsRegistry","identityOverrideProcessor","_context","_settings","numberOverrideProcessor","context","settings","parseFloat","dataLinksOverrideProcessor","valueMappingsOverrideProcessor","selectOverrideProcessor","stringOverrideProcessor","expandTemplateVars","thresholdsOverrideProcessor","unitOverrideProcessor","booleanOverrideProcessor","getFieldDisplayValuesProxy","frame","Proxy","obj","key","find","f","disp","formattedValueToString","applyFieldOverrides","source","fieldConfigRegistry","range","override","overrides","rule","fieldMatchers","matcher","match","properties","index","__series","getFrameDisplayName","fieldScopedVars","getFieldDisplayName","labels","formatLabels","dataFrameIndex","list","fieldConfigProperty","isCustom","custom","processFieldConfigValue","validateFieldConfig","setFieldConfigDefaults","setDynamicConfigValue","t","guessFieldTypeForField","autoMinMax","number","Number","MAX_VALUE","MIN_VALUE","findNumericFieldMinMax","getLinksSupplier","item","getIfExists","shouldApply","val","process","unset","path","destination","currentConfig","Absolute","ColorScheme","BrBG","Thresholds","hasOwnProperty","tmp","timeRangeUrl","locationUtil","getTimeRangeUrlParams","link","href","url","dataFrameVars","valueVars","assureBaseUrl","targetBlank","origin","variablesQuery","getVariablesUrlParams","fieldsProxy","__data","refId","variables","__value","DataLinkBuiltInVars","keepTime","includeVars","processUrl","initialAdHocVariableModelState","NEW_VARIABLE_ID","global","hide","VariableHide","dontHide","skipUrlSync","initLock","datasource","filters","adHocVariableSlice","createSlice","initialState","initialVariablesState","filterAdded","action","getInstanceState","payload","filterRemoved","instanceState","splice","filterUpdated","filter","filtersRestored","actions","adHocVariableReducer","reducer","BinaryOperationID","binaryOperators","Add","operation","a","b","Subtract","Multiply","Divide","window","angular","module","run","c","put","exports","OrgRole","refresh","eventFactory","componentDidMount","dataError","dataReceived","dataFramesReceived","dataSnapshotLoad","editModeInitialized","initPanelActions","panelChangeView","panelInitialized","panelSizeChanged","panelTeardown","render","viewModeChanged","CoreApp","FeatureState","AppPlugin","meta","root","rootNav","pluginExports","ConfigCtrl","angularConfigCtrl","includes","include","PluginIncludeType","page","exp","console","warn","angularPages","GrafanaPlugin","FieldConfigProperty","FETCH_RESULTS","TOGGLE_SECTION","FETCH_ITEMS","FETCH_ITEMS_START","MOVE_SELECTION_UP","MOVE_SELECTION_DOWN","SEARCH_START","TOGGLE_ALL_CHECKED","TOGGLE_CHECKED","MOVE_ITEMS","DELETE_ITEMS","TOGGLE_STARRED","REMOVE_STARRED","QUERY_CHANGE","REMOVE_TAG","CLEAR_FILTERS","SET_TAGS","ADD_TAG","TOGGLE_SORT","LAYOUT_CHANGE","$","Gauge","gaugeOptions","plot","ctx","getPlaceholder","getOptions","gauges","getData","getLogger","debug","calculateAutoValues","gaugeOptionsi","cellWidth","gauge","margin","font","calculateAngle","layout","startAngle","endAngle","drawArcWithShadow","cy","r","w","rd1","rd2","lc","lw","fc","blur","save","drawArc","clip","shadowOffsetX","shadowOffsetY","shadowBlur","shadowColor","restore","drawThresholdValue","cellLayout","drawText","thresholdLabelMargin","thresholdLabelFontSize","radius","cos","toRad","sin","formatter","x","y","textOptions","span","exists","attr","append","family","background","opacity","parseInt","height","prototype","calculateLayout","canvasWidth","canvasHeight","columns","rows","ceil","hMargin","vMargin","cellHeight","square","cell","cellMargin","labelMargin","labelFontSize","valueMargin","valueFontSize","thresholdWidth","maxRadiusH","dAngle","heightRatioV","outerRadiusV","maxRadiusV","outerRadius","gaugeOuterHeight","calculateCellLayout","col","row","blank","offsetY","vAlign","drawBackground","strokeStyle","grid","borderColor","lineWidth","borderWidth","strokeRect","backgroundColor","fillStyle","fillRect","drawCellBackground","border","drawGauge","shadow","c1","getColor","a2","drawThreshold","a1","drawLable","drawValue","drawThresholdValues","debugOptions","Logger","PI","beginPath","arc","lineTo","closePath","stroke","fill","plugins","init","hooks","processOptions","legend","draw","extend","version","jQuery","UserAdminPage","updateUser","password","setUserPassword","deleteUser","disableUser","enableUser","onGrafanaAdminChange","isGrafanaAdmin","updateUserPermissions","onOrgRemove","orgId","deleteOrgUser","onOrgRoleChange","newRole","updateOrgUserRole","onOrgAdd","role","addOrgUser","onSessionRevoke","tokenId","revokeSession","onAllSessionsRevoke","revokeAllSessions","onUserSync","syncLdapUser","loadAdminUserPage","navModel","orgs","sessions","ldapSyncInfo","isLDAPUser","Contents","licenseInfo","hasLicense","mapDispatchToProps","hot","connect","getRouteParamsId","location","getNavModel","navIndex","userAdmin","ldap","syncInfo","error","LdapUserMappingInfo","showAttributeMapping","ldapValue","cfgAttrValue","surname","LdapUserPermissions","permissions","LdapUserGroups","groups","items","orgRole","placement","content","group","groupDN","orgName","LdapUserTeams","teams","teamName","team","LdapUserInfo","ldapUser","roles","ArrayVector","buffer","reverse","FunctionalVector","NUMBER","guessFieldTypeFromNameAndValue","toLowerCase","guessFieldTypeFromValue","Date","isDateTime","isString","test","boolean","string","guessFieldTypes","guessDefined","isTableData","isDataFrame","toDataFrame","MutableDataFrame","timeSeries","tags","filterable","datapoints","point","json","convertJSONDocumentDataToDataFrame","times","TIME_SERIES_TIME_FIELD_NAME","TIME_SERIES_VALUE_FIELD_NAME","convertTimeSeriesToDataFrame","graphSeries","convertGraphSeriesToDataFrame","table","Object","Error","convertTableToDataFrame","ArrayDataFrame","toLegacyResponseData","rowCount","timeIndex","valueField","alias","toArray","column","sortDataFrame","sortIndex","compare","vA","vB","localeCompare","SortedVector","reverseDataFrame","copy","getDataFrameRow","toDataFrameDTO","processDatapoints","stack","allseries","res","findMatchingSeries","px","py","intery","qx","qy","bottom","l","m","ps","pointsize","points","otherps","otherpoints","newpoints","withlines","lines","horizontal","bars","withbottom","format","withsteps","keyOffset","accumulateOffset","fromgap","routeParams","lastUpdated","updateLocation","createAction","locationReducer","partial","omitBy","isNull","urlUtil","renderUrl","getTime","Emitter","emitter","EventEmitter","handler","scope","on","unbind","$on","off","evt","removeAllListeners","_eventsCount","LoadingState","NullValueMode","typography","sm","wrapper","section","sectionRight","LegendList","itemRenderer","useContext","ThemeContext","renderItem","getItemKey","yAxis","matchSeriesOverride","aliasOrRegex","seriesAlias","regex","stringToJsRegex","updateLegendValues","axis","yaxes","yaxis","getDataMinMax","datamin","datamax","getFlotTickDecimals","tickDecimals","tickDecimalsPlusOne","TimeSeries","opts","aliasEscaped","escape","fillColor","valueFormater","fieldIndex","hasMsResolution","isMsResolutionNeeded","dashes","dashLength","zindex","nullPointMode","fillGradient","amount","colors","linewidth","spaceLength","pointradius","steppedLine","fillBelowTo","setColor","transform","hideTooltip","hiddenSeries","total","logmin","avg","current","first","diff","timeStep","allIsNull","allIsZero","currentTime","currentValue","previousTime","ignoreNulls","nullAsZero","nonNulls","previousValue","previousDeltaUp","count","formater","isFinite","timestamp","hideEmpty","hideZero","getSwitchStyles","switch","formSwitchBgDisabled","formSwitchBgActive","formSwitchBgActiveHover","focusCss","formSwitchBg","formSwitchBgHover","formSwitchDot","Switch","React","forwardRef","checked","disabled","inputProps","useTheme","switchId","uniqueId","htmlFor","promiseToDigest","$scope","promise","$evalAsync","DashboardRouteInfo","DashboardInitPhase","KIOSK_MODE_TV","d","styleElement","domEvents","addEventListener","setCss","document","createElement","callback","attachEvent","cssText","styleSheet","innerHTML","getElementsByTagName","appendChild","singleValue","formInputText","container","SingleValue","children","loading","duration","delay","useState","delayedValue","setDelayedValue","onStartTime","useRef","useEffect","timeout","setTimeout","timeSpent","now","valueOf","turnOff","clearTimeout","useDelayedSwitch","SlideOutTransition","visible","Spinner","inline","hideText","FadeWithImage","FadeTransition","src","UserLdapSyncInfo","prevSyncSuccessful","prevSync","nextSyncTime","nextSync","dateTimeFormat","prevSyncTime","started","debugLDAPMappingURL","enabled","ordered","byId","Map","initialized","setInit","initialize","ext","register","select","currentOptions","excludeFromPicker","option","description","ids","found","has","aliasIds","getDefaultCondition","params","evaluator","operator","getAlertingValidationMessage","transformations","targets","datasourceSrv","datasourceName","alertingNotSupported","templateVariablesNotSupported","dsName","ds","alerting","targetContainsTemplate","CompletionItemKind","SettingsCtrl","$route","$location","$rootScope","dashboardSrv","onFolderChange","folder","folderId","folderTitle","hasUnsavedFolderChange","getDashboard","onRefreshIntervalChange","intervals","timepicker","refresh_intervals","onNowDelayChange","nowDelay","onHideTimePickerChange","hidden","onTimeZoneChange","timezone","updateSubmenuVisibility","appEvent","dashScroll","startRefresh","canSaveAs","contextSrv","hasEditPermissionInFolders","canSave","canDelete","buildSectionList","onRouteUpdated","onAppEvent","routeUpdated","animate","pos","dashboardSaved","onPostSave","selectors","pages","Dashboard","Settings","General","useAngularTemplating","getConfig","featureToggles","newVariables","sections","canEdit","canAdmin","canMakeEditable","sectionParams","editview","appSubUrl","param","viewId","toJson","getSaveModelClone","unshift","saveJSONDashboard","reload","urlParams","$apply","editable","currentSection","stripBaseFromUrl","provisioned","provisionedExternalId","text2htmlBind","noText","alerts","sumBy","panels","deleteDashboardConfirmed","backendSrv","deleteDashboard","uid","folderUrl","coreModule","directive","restrict","templateUrl","controller","bindToController","controllerAs","transclude","DashboardSettings","onClose","loader","getAngularLoader","scopeProps","angularCmp","load","element","destroy","haveFolder","BackButton","surface","appendTransformer","DataTransformerID","transformer","processed","addField","startLength","vals","add","validate","noopTransformer","noop","filterFieldsTransformer","filterFields","exclude","filterFramesTransformer","filterFrames","getFrameMatchers","reduceTransformer","reduce","alwaysFieldMatcher","calculators","fieldReducers","seriesIndex","fieldName","withoutTime","mergeResults","baseFrame","baseField","baseValues","concat","filterFieldsByNameTransformer","filterFieldsByName","filterOptions","getMatcherConfig","names","pattern","byRegexpOrNames","byNames","filterFramesByRefIdTransformer","filterByRefId","FrameMatcherID","byRefId","renameFieldsTransformer","rename","renameByName","renamer","createRenamer","keys","renameTo","organizeFieldsTransformer","organize","excludeByName","indexByName","order","orderFieldsTransformer","mapToExcludeArray","labelsToFieldsTransformer","labelsToFields","framesWithTimeField","framesWithoutTimeField","getFramesWithOnlyValueFields","columnsMap","frameIndex","timeFrame","otherFrame","addOrAppendMapItem","valueIndex","timeFieldValue","otherFieldValue","isValue","createColumnsMap","valueColumns","columnItem","createFields","timeColumnItem","seriesIndexString","seriesItem","timeValueString","valueItem","args","seriesMapItem","standardTransformers","calculateFieldTransformer","seriesToColumnsTransformer","ensureColumnsTransformer","standardTransformersRegistry","transformDataFrame","transformation","after","main","subTitle","breadcrumbs","node","verifyEmailEnabled","autoAssignOrg","MAPPING_OPTIONS","MappingType","ValueToText","RangeToText","MappingRow","valueMapping","updateValueMapping","removeValueMapping","onMappingValueChange","onMappingFromChange","onMappingToChange","onMappingTextChange","onKeyDown","e","currentTarget","justify","align","aria-label","Field","Input","ValueMappingsEditor","valueMappings","update","onMappingChange","onRemove","Button","defaultMapping","ValueMappingsValueEditor","modes","ThresholdsEditor","onAddThreshold","nextValue","some","counter","newThresholds","onRemoveThreshold","onChangeThresholdValue","cleanValue","parsedValue","onChangeThresholdColor","onModeChanged","toThresholdsWithKey","isPercent","step","inputPrefix","colorPicker","ColorPicker","enableNamedColors","percentIcon","Icon","trashIcon","Consumer","FullWidthButtonContainer","addButton","slice","renderInput","Label","RadioButtonGroup","spacing","formSpacingBase","textWeak","ThresholdsValueEditor","UnitValueEditor","UnitPicker","DataLinksValueEditor","DataLinksInlineEditor","suggestions","getSuggestions","VariableSuggestionsScope","Values","ColorValueEditor","getTheme","panelBg","disableNamedColors","showColorPicker","hideColorPicker","spot","ColorPickerTrigger","onMouseLeave","colorText","textWhenUndefined","allowUndefined","formInputBg","formInputBorder","formInputBorderHover","StatsPickerEditor","StatsPicker","allowMultiple","defaultStat","mean","getStandardFieldConfigs","category","editor","integer","getItemsCount","getStandardOptionEditors","NumberValueEditor","StringValueEditor","SelectValueEditor","getAvailableIcons","tooltip","tooltipPlacement","components","backArrow","LocalStorageValueProvider","onSaveToStore","storageKey","setObject","getObject","TimePickerWithHistory","TimeRangePicker","history","toUtc","toAppend","isAbsolute","toStore","onAppendToHistory","selection","second","savedhandlers","mouseUpHandler","onMouseMove","updateSelection","trigger","getSelection","onMouseDown","which","onselectstart","ondrag","setSelectionPos","selectionIsSane","triggerSelectedEvent","isSelecting","onMouseUp","one","c2","axes","getAxes","each","used","anyUsed","p1","c2p","direction","p2","ctrlKey","metaKey","xaxis","x1","y1","x2","y2","clamp","o","offset","plotOffset","getPlotOffset","pageX","left","pageY","top","triggerRedrawOverlay","clearSelection","preventEvent","extractRange","ranges","coord","n","getXAxes","getYAxes","minSize","abs","setSelection","p2c","bindEvents","eventHolder","mousemove","mousedown","drawOverlay","translate","scale","lineJoin","shape","h","shutdown","Select","ItemAvatar","userAvatarUrl","teamAvatarUrl","ItemDescription","teamId","PermissionsListItem","onPermissionChanged","onRemoveItem","inherited","folderInfo","inheritedFromRoot","dashboardId","currentPermissionLevel","dashboardPermissionLevels","dp","permission","Boolean","style","isSearchable","marginBottom","DisabledPermissionListItem","PermissionList","isFetching","idx","alertQueryDef","QueryPartDef","dynamicLookup","defaultParams","joinEvalMatches","matches","separator","ev","metric","Metric","Value","getStateDisplayModel","iconClass","stateClass","message","conditionTypes","evalFunctions","evalOperators","noDataModes","executionErrorModes","reducerTypes","createReducerPart","model","def","QueryPart","getAlertAnnotationInfo","ah","evalMatches","alertStateSortScore","no_data","pending","ok","paused","singletonInstance","instance","setBackendSrv","setAngularLoader","setDataSourceSrv","getDataSourceSrv","setLocationSrv","getLocationSrv","singleton","setTemplateSrv","getTemplateSrv","setLegacyAngularInjector","getLegacyAngularInjector","SelectNav","customCss","defaultSelectedItem","navItem","selectedIndex","locationChange","hideFromTabs","Navigation","hideBorder","child","onChangeTab","forEach","goToUrl","PageHeader","breadcrumbsResult","bc","iconClassName","img","renderTitle","renderHeaderTitle","defaultState","defaultQuery","projectName","metricType","metricKind","valueType","crossSeriesReducer","alignmentPeriod","perSeriesAligner","groupBys","aliasBy","MetricQueryEditor","memo","usedAlignmentPeriod","variableOptionGroup","getLabels","onMetricTypeChange","getAlignmentPickerData","alignOptions","templateVariableOptions","metricDescriptor","displayAdvancedOptions","getFocusStyle","sharedInputStyle","palette","redBase","lineHeight","md","bodyBg","formFocusOutline","formInputBgDisabled","formInputDisabledText","formInputPlaceholderText","inputSizes","inputSizesPixels","lg","auto","getPropertiesForButtonSize","hasText","hasIcon","padding","fontSize","isSharedDashboardQuery","runSharedRequest","Observable","subscriber","getDashboardSrv","getCurrent","listenToPanelId","queries","panelId","getPanelIdFromQuery","next","getQueryError","currentPanel","getPanelById","listenToPanel","listenToRunner","getQueryRunner","subscription","withTransforms","withFieldConfig","subscribe","isViewing","isEditing","modified","unsubscribe","msg","DefaultTimeRange","getQueryDisplayText","DashboardQueryEditor","onPanelChanged","getQuery","getPanelDescription","defaultDatasource","dsname","componentDidUpdate","prevProps","panelData","getDatasourceSrv","defaultDS","mainDS","fmt","qData","filterPanelDataToQuery","queryData","logos","small","editURL","marginRight","selected","plugin","renderQueryData","floorInBase","base","formatDate","monthNames","dayNames","strftime","hours12","leftPad","pad","hours","getHours","isAM","charAt","getDay","getMonth","getDate","getMinutes","getSeconds","getFullYear","makeUtcWrapper","addProxyMethod","sourceObj","sourceMethod","targetObj","targetMethod","apply","arguments","utc","date","p","dateGenerator","ts","timezoneJS","setTimezone","setTime","timeUnitSize","baseSpec","specMonths","specQuarters","axisName","tickGenerator","ticks","spec","tickSize","minTickSize","year","setSeconds","setMinutes","setHours","setMonth","setFullYear","setMilliseconds","minute","hour","day","setDate","month","quarter","prev","carry","start","end","tickFormatter","timeformat","useQuarters","hourCode","twelveHourClock","Tooltip","controllerProps","tooltipTriggerRef","createRef","popperBackgroundClassName","showPopper","hidePopper","popperProps","payloadProps","onMouseEnter","referenceElement","wrapperClassName","renderArrow","arrowProps","data-placement","cloneElement","initDashboardTemplating","dispatch","getState","orderIndex","variableAdapters","addVariable","toVariablePayload","updateTimeRange","getTimeSrv","getVariables","addInitLock","completeDashboardTemplating","setGlobalVariable","changeVariableMultiValue","identifier","multi","variable","getVariable","alignCurrentWithMulti","changeVariableProp","propName","propValue","processVariableDependencies","dependencies","otherVariable","dependsOn","Promise","all","processVariable","queryParams","urlValue","setValueFromUrl","resolveInitLock","refreshableVariable","VariableRefresh","onDashboardLoad","onTimeRangeChanged","updateOptions","processVariables","promises","toVariableIdentifier","removeInitLock","setOptionFromUrl","never","variableFromState","op","defaultText","acc","foundOption","isMulti","castArray","setValue","validateVariableSelectionState","variableInState","selectOptionsForCurrentValue","resolve","setOptionAsCurrent","emitChanges","setCurrentVariableValue","variableUpdated","emitChangeEvents","g","Graph","createNode","v1","v2","createGraph","getNode","getOptimizedInputEdges","inputNode","getModel","processRepeats","getQueryWithVariables","onTimeRangeUpdated","variablesThatNeedRefresh","previousOptions","updatedVariable","templateVariableValueUpdated","alertError","queryParamsNew","adapter","getValueForUrl","ColorSwatchVariant","ColorSwatch","Small","isSelected","otherProps","isSmall","swatchSize","selectedSwatchBorder","selectThemeVariant","light","white","dark","black","swatchStyles","borderRadius","boxShadow","alignItems","cursor","Large","NamedColorsGroup","selectedColor","onColorSelect","primaryColor","isPrimary","flexDirection","getColorForTheme","upperFirst","hue","marginTop","NamedColorsPalette","swatches","getNamedColorPalette","gridTemplateColumns","gridRowGap","gridColumnGap","ColorInput","updateColor","newColor","tinycolor","isValid","previousColor","flexGrow","SpectrumPalettePointer","picker","pointerColor","dark3","gray2","pointerStyles","position","borderStyle","topArrowStyles","bottomArrowStyles","right","renderPointer","SpectrumPicker","CustomPicker","rgb","hsl","hsv","toHsv","pointer","marginLeft","SpectrumPalette","toRgb","ColorPickerPopover","getTabClassName","tabName","activePicker","handleChange","onColorChange","changeHandler","onTabChange","tab","renderPicker","getColorName","renderCustomPicker","tabKey","customPickers","tabComponent","renderCustomPickerTabs","componentName","deprecationWarning","warnAboutColorPickerPropsDeprecation","colorPickerTheme","getFooterLinks","getVersionLinks","buildInfo","stateInfo","edition","licenseUrl","commit","hasUpdate","Footer","rel","TOKEN_MARK","DefaultTimeZone","TIME_FORMAT","luceneEscape","runtimeDependencies","getFilteredVariables","getVariableWithName","TemplateSrv","variableRegex","grafanaVariables","builtIns","fieldAccessorCache","fillVariableValuesForUrl","getVariableAtIndex","getAdHocVariables","isAdHoc","_variables","updateIndex","__interval","isNone","str","encodeURIComponent","charCodeAt","toUpperCase","formatValue","kbn","regexEscape","escapedValues","luceneFormat","distributeVariable","textUtil","escapeHtml","encodeURIComponentStrict","regExp","RegExp","expression","lastIndex","exec","getVariableName","var1","var2","fmt2","var3","allValue","fieldPath","accessor","property","variableName","scopedVar","getFieldAccessor","fmt3","getVariableValue","systemValue","isAllValue","getAllValue","fieldValue","srv","typeList","Set","getGraphSeriesModel","dataFrames","seriesOptions","graphOptions","legendOptions","fieldOptions","graphs","fieldColumnIndex","nullValueMode","Null","seriesStats","statsDisplayValues","stat","getSeriesTimeStep","useMsDateFormat","MS_DATE_TIME_FORMAT","isVisible","MetricKind","ValueTypes","valueTypes","INT64","DOUBLE","MONEY","DISTRIBUTION","metricKinds","CUMULATIVE","DELTA","GAUGE","STRING","VALUE_TYPE_UNSPECIFIED","BOOL","aggOptions","METRIC_KIND_UNSPECIFIED","alignmentPeriods","stackdriverUnitMappings","bit","By","us","ms","ns","MiBy","GBy","systemLabels","antlr4","ScrollQLParserListener","tree","ParseTreeListener","call","create","constructor","enterQuery","exitQuery","enterLogQuery","exitLogQuery","enterLogAesthetic","exitLogAesthetic","enterLogSourceStage","exitLogSourceStage","enterLogStatsStage","exitLogStatsStage","enterLogOp","exitLogOp","enterLogAestheticOp","exitLogAestheticOp","enterLogSource","exitLogSource","enterTimeExpr","exitTimeExpr","enterNowTimeExpr","exitNowTimeExpr","enterNegRelativeTimeExpr","exitNegRelativeTimeExpr","enterPosRelativeTimeExpr","exitPosRelativeTimeExpr","enterIso8601TimeExpr","exitIso8601TimeExpr","enterEpochTimeExpr","exitEpochTimeExpr","enterBareSpaceDelimited","exitBareSpaceDelimited","enterLogStats","exitLogStats","enterStatsExpr","exitStatsExpr","enterStatsGroupFieldId","exitStatsGroupFieldId","enterStatsGroupFieldProjection","exitStatsGroupFieldProjection","enterLogOpFieldsFields","exitLogOpFieldsFields","enterLogOpFieldsDisplay","exitLogOpFieldsDisplay","enterFieldSpec","exitFieldSpec","enterLogOpParse","exitLogOpParse","enterLogOpSearch","exitLogOpSearch","enterImplicitLogOpSearch","exitImplicitLogOpSearch","enterSearchExprTerm","exitSearchExprTerm","enterSearchExprNot","exitSearchExprNot","enterSearchExprAnd","exitSearchExprAnd","enterSearchExprNested","exitSearchExprNested","enterSearchExprOr","exitSearchExprOr","enterSearchTerm","exitSearchTerm","enterLogOpFilter","exitLogOpFilter","enterLogOpSort","exitLogOpSort","enterSortExprDesc","exitSortExprDesc","enterSortExprAsc","exitSortExprAsc","enterLogOpLimitHead","exitLogOpLimitHead","enterLogOpLimitTail","exitLogOpLimitTail","enterExpressionRoot","exitExpressionRoot","enterExpressionAddSub","exitExpressionAddSub","enterExpressionEq","exitExpressionEq","enterExpressionComp","exitExpressionComp","enterExpressionExpo","exitExpressionExpo","enterExpressionLike","exitExpressionLike","enterExpressionTerm","exitExpressionTerm","enterExpressionNeg","exitExpressionNeg","enterExpressionNot","exitExpressionNot","enterExpressionPos","exitExpressionPos","enterExpressionMulDivMod","exitExpressionMulDivMod","enterExpressionAnd","exitExpressionAnd","enterExpressionNested","exitExpressionNested","enterExpressionOr","exitExpressionOr","enterExpressionIn","exitExpressionIn","enterTermId","exitTermId","enterTermNum","exitTermNum","enterTermStr","exitTermStr","enterTermFn","exitTermFn","enterLikeTerm","exitLikeTerm","enterFunctionWithArgs","exitFunctionWithArgs","enterFunctionWithNoArgs","exitFunctionWithNoArgs","enterFunctionArgTimePeriod","exitFunctionArgTimePeriod","enterFunctionArgFieldClause","exitFunctionArgFieldClause","enterArray","exitArray","enterArrayElem","exitArrayElem","enterNumber","exitNumber","enterString","exitString","enterStringOrBareString","exitStringOrBareString","enterRegex","exitRegex","enterRegexString","exitRegexString","enterLogId","exitLogId","enterFieldId","exitFieldId","enterAliasId","exitAliasId","enterUserId","exitUserId","enterUnquotedUserId","exitUnquotedUserId","enterUnquotedUserAtId","exitUnquotedUserAtId","enterUnquotedUserBareId","exitUnquotedUserBareId","enterQuotedUserId","exitQuotedUserId","enterSystemId","exitSystemId","enterUnquotedSystemId","exitUnquotedSystemId","enterQuotedSystemId","exitQuotedSystemId","enterResultId","exitResultId","enterFunctionId","exitFunctionId","enterRawId","exitRawId","enterKeywords","exitKeywords","enterTimeUnitMilliSeconds","exitTimeUnitMilliSeconds","enterTimeUnitSeconds","exitTimeUnitSeconds","enterTimeUnitMinutes","exitTimeUnitMinutes","enterTimeUnitHours","exitTimeUnitHours","enterTimeUnitDays","exitTimeUnitDays","enterTimeUnitWeeks","exitTimeUnitWeeks","enterTimeUnitMonths","exitTimeUnitMonths","enterTimeUnitQuarters","exitTimeUnitQuarters","enterTimeUnitYears","exitTimeUnitYears","SearchResultsFilter","allChecked","canMove","deleteItem","hideLayout","moveTo","onLayoutChange","onSortChange","onStarredFilterChange","onTagFilterChange","onToggleAllChecked","showActions","showStarredFilter","FieldCache","fieldByName","fieldByType","types","includeHidden","firstField","CircularDataFrame","CircularVector","createDimension","getColumnsFromDimension","dimension","getColumnFromDimension","getValueFromDimension","getAllValuesFromDimension","getDimensionByName","dimensions","base64StringToArrowTable","b64","atob","arr","Uint8Array","Table","valueOrUndefined","parseOptionalMeta","err","arrowTableToDataFrame","numCols","getColumnAt","schema","typeId","ArrowType","Decimal","Int","FloatingPoint","Bool","Timestamp","Utf8","stripFieldNamePrefix","metadata","substring","grafanaDataFrameToArrowTable","new","Column","Float64","TimestampMillisecond","builder","Builder","nullValues","finish","toVector","toArrowVector","make","normalize","clone","extract","parent","nodeName","trim","lookupColors","aqua","azure","beige","blue","brown","cyan","darkblue","darkcyan","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkviolet","fuchsia","gold","green","indigo","khaki","lightblue","lightcyan","lightgreen","lightgrey","lightpink","lightyellow","lime","magenta","maroon","navy","olive","orange","pink","purple","violet","red","silver","yellow","Canvas","cls","appendTo","getContext","G_vmlCanvasManager","initElement","devicePixelRatio","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","resize","textContainer","_textCache","_textSizeCache","flotTextSizeCache","Plot","data_","options_","noColumns","labelFormatter","labelBoxBorderColor","backgroundOpacity","sorted","tickColor","inverseTransform","autoscaleMargin","labelWidth","labelHeight","reserveSpace","tickLength","alignTicksWithAxis","xaxes","symbol","barWidth","zero","shadowSize","highlightColor","aboveData","eventSectionHeight","axisMargin","minBorderMargin","markings","markingsColor","markingsLineWidth","clickable","hoverable","autoHighlight","mouseActiveRadius","interaction","redrawOverlayInterval","overlay","octx","plotWidth","plotHeight","processRawData","processOffset","processRange","drawSeries","executeHooks","hook","setData","parseData","neededColors","maxIndex","sc","colorPool","colorPoolSize","variation","colori","getOrCreateAxis","axisNumber","fillInSeriesOptions","topSentry","POSITIVE_INFINITY","bottomSentry","NEGATIVE_INFINITY","fakeInfinity","updateAxis","allAxes","required","autoscale","insertSteps","nullify","xmin","ymin","xmax","ymax","processData","grep","canvasToAxisCoords","redrawTimeout","onTouch","measureTickLabels","maxWidth","legacyStyles","layer","getTextInfo","allocateAxisBoxFirstPhase","lh","isXAxis","eventSectionPadding","innermost","outermost","box","setupGrid","showGrid","axisOpts","widen","setRange","allocatedAxes","snaped","setupTickGeneration","setTicks","snapRangeToTicks","minMargin","margins","adjustLayoutForThingsStickingOut","allocateAxisBoxSecondPhase","identity","it","setTransformationHelpers","tick","halign","valign","removeText","addText","html","remove","fragments","entries","rowStarted","lf","isFunction","ascending","entry","div","prependTo","insertLegend","noTicks","sqrt","maxDec","factor","formatted","round","decimal","precision","substr","otherAxis","niceTicks","extraDec","toFixed","oticks","changed","clear","getColorOrGradient","drawGrid","bw","xrange","yrange","xequal","yequal","subPixel","xoff","yoff","plotLine","xoffset","yoffset","axisx","axisy","prevx","prevy","sw","angle","getFillStyle","areaOpen","ypos","segmentStart","segmentEnd","x1old","x2old","plotLineArea","drawSeriesLines","abandonedPoints","beforeX","afterX","emptyPoints","olddatapoints","drawSeriesPoints","drawOrphanedPoints","barLeft","fillStyleCallback","barRight","drawBar","plotBars","drawSeriesBars","plotPoints","drawLeft","drawRight","drawTop","drawBottom","filloptions","seriesColor","getCanvas","highlight","unhighlight","pointOffset","removeData","empty","highlights","classes","initPlugins","axisOptions","axisCount","fontSizeDefault","fontDefaults","weight","x2axis","y2axis","coloredAreas","coloredAreasColor","parseOptions","existing","setupCanvases","click","triggerClickHoverEvent","cancelable","is","originalEvent","original","changedTouches","touch","mapFromTouchEvent","preventDefault","eventname","seriesFilter","canvasX","canvasY","mouseX","mouseY","maxDistance","smallestDistance","mx","my","maxx","maxy","dx","dy","dist","datapoint","dataIndex","findNearbyItem","hi","drawBarHighlight","drawPointHighlight","indexOfHighlight","pointRadius","defaultColor","gradient","createLinearGradient","co","brightness","addColorStop","fn","detach","parentNode","removeChild","clearRect","cache","layerKey","getTextLayer","layerCache","styleKey","styleCache","positions","rendered","insertAfter","addClass","textStyle","outerWidth","outerHeight","defaultIntervals","memoizeOne","selectButton","RefreshPickerBase","intervalsToOptions","interval","hasLiveOption","RefreshPicker","liveOption","offOption","onChangeSelect","onIntervalChanged","onRefresh","refreshButton","buttonSelectClassName","selectedValue","cssClasses","classNames","maxMenuHeight","isLive","refreshInterval","withTheme","ModalHeader","getModalStyles","modalHeaderTitle","modalHeaderIcon","searchSrv","SearchSrv","getSortOptions","sortOptions","opt","SortPicker","DEFAULT_SORT","layoutOptions","SearchLayout","Folders","List","ActionRow","actionRow","rowContainer","checkboxWrapper","TagFilter","isClearable","tag","tagOptions","getDashboardTags","breakpoints","OrgPicker","getOrgOptions","loadOrgs","org","UserOrgs","showAddOrgModal","showOrgAddModal","addToOrgContainerClass","OrgRow","getOrgRowStyles","removeButton","blue95","UnThemedOrgRow","currentRole","isChangingRole","onChangeRoleClick","onOrgRoleSave","OrgRolePicker","confirmVariant","getAddToOrgModalStyles","modal","AddToOrgModal","selectedOrg","Admin","onOrgSelect","onAddUserToOrg","serializedATN","atn","ATNDeserializer","deserialize","decisionsToDFA","decisionToState","dfa","DFA","ScrollQLLexer","input","Lexer","_interp","LexerATNSimulator","PredictionContextCache","isFirstPipe","defineProperty","EOF","Token","WS","COMMENT","K_SOURCE","K_START","K_END","K_NOW","K_LIVE","K_PARSE","K_SEARCH","K_FIELDS","K_DISPLAY","K_FILTER","K_STATS","K_SORT","K_ORDER","K_ASC","K_DESC","K_HEAD","K_LIMIT","K_TAIL","K_REGEX","K_IN","K_GROUP","K_BY","K_AS","K_AND","K_OR","K_NOT","K_LIKE","K_MATCHES","K_TU_MS","K_TU_MSEC","K_TU_MSECOND","K_TU_S","K_TU_SEC","K_TU_SECOND","K_TU_M","K_TU_MIN","K_TU_MINUTE","K_TU_H","K_TU_HR","K_TU_HOUR","K_TU_D","K_TU_DAY","K_TU_W","K_TU_WEEK","K_TU_MO","K_TU_MON","K_TU_MONTH","K_TU_Q","K_TU_QTR","K_TU_QUARTER","K_TU_Y","K_TU_YR","K_TU_YEAR","RAW_ID","LIT_INTEGER","LIT_NUMBER","SDQUOTED_STRING","SSQUOTED_STRING","CDQUOTED_STRING","CSQUOTED_STRING","QUOTED_IDENT","SYM_EQTILDE","SYM_TILDEEQ","SYM_AT","SYM_COMMA","SYM_LPAREN","SYM_RPAREN","SYM_PIPE","SYM_WRITE","SYM_COLON","SYM_CARET","SYM_NOT","SYM_MUL","SYM_DIV","SYM_MOD","SYM_PLUS","SYM_MINUS","SYM_TILDE","SYM_LT","SYM_GT","SYM_LTEQ","SYM_GTEQ","SYM_EQ","SYM_NEQ","SYM_LBRACKET","SYM_RBRACKET","REGEX_WS","REGEX_COMMENT","REGEX","RE_SDQUOTED_STRING","RE_SSQUOTED_STRING","RE_CDQUOTED_STRING","RE_CSQUOTED_STRING","RE_RAW_ID","RE_SYM_AT","RE_QUOTED_IDENT","SE_WS","SE_COMMENT","SE_K_SEARCH","SE_SYM_LPAREN","SE_SYM_RPAREN","SE_K_AND","SE_K_OR","SE_K_NOT","SE_SDQUOTED_STRING","SE_SSQUOTED_STRING","SE_CDQUOTED_STRING","SE_CSQUOTED_STRING","SE_UNQUOTED_STRING","SE_PIPE","WHITESPACE","COMMENTS","REGEX_VALUE","SEARCH_VALUE","channelNames","modeNames","literalNames","symbolicNames","ruleNames","grammarFileName","localctx","ruleIndex","actionIndex","SYM_PIPE_action","SE_K_SOURCE_action","pushMode","sempred","predIndex","SYM_PIPE_sempred","PermissionLevel","DataSourcePermissionLevel","AclTarget","Query","TeamPermissionLevel","dashboardAclTargets","Team","User","Viewer","Editor","View","Edit","teamsPermissionLevels","Member","wrapperBg","dark2","wrapperShadow","gray5","itemColor","itemDocsColor","itemBgHover","dark7","itemBgActive","gray6","dark9","separatorColor","darken","lighten","activeItem","itemValue","fontFamily","monospace","itemDocs","xs","DataLinkSuggestions","useClickAway","groupedSuggestions","useMemo","groupBy","indexOffset","DataLinkSuggestionsList","capitalize","activeIndex","activeIndexOffset","onSuggestionSelect","documentation","SelectionReference","anchorNode","parentElement","getBoundingClientRect","SlatePrism","onlyIn","getSyntax","getFormStyles","queryGreen","textBlue","wrapperOverrides","DataLinkInput","Prism","languages","builtInVariable","editorRef","showingSuggestions","setShowingSuggestions","suggestionsIndex","setSuggestionsIndex","makeValue","linkUrl","setLinkUrl","prevLinkUrl","usePrevious","stateRef","selectionRef","useCallback","keyCode","onVariableSelect","isFocused","Plain","serialize","onUrlChange","includeDollarSign","VariableOrigin","Template","insertText","modifiers","preventOverflow","boundariesElement","arrow","SCHEMA","_editor","connectWithStore","WrappedComponent","ConnectedWrappedComponent","connectWithProvider","PanelCtrl","$injector","onPluginTypeChange","$timeout","editorTabs","events","timing","pluginId","pluginName","PanelEvents","panelDidMount","profiler","renderingCompleted","$root","editModeInitiated","directiveFn","editorTab","menu","otherPanelInFullscreen","canvas","measureText","fontStyle","cacheKey","fromCache","metrics","calculateFontSize","maxSize","fontSizeBasedOnWidth","fontSizeBasedOnHeight","optimialSize","LdapConnectionStatus","ldapConnectionInfo","serverInfo","host","port","available","LdapErrorBox","connectionErrors","errorElements","fontWeight","severity","AppNotificationSeverity","measurement","enter","enterActive","exit","exitActive","in","mountOnEnter","unmountOnExit","initialQueryVariableModelState","VariableSort","includeAll","useTags","tagsQuery","tagValuesQuery","definition","metricNamesToVariableValues","variableRegEx","metricNames","sortOrder","sortType","reverseSort","sortBy","toLower","sortVariableValues","uniqBy","queryVariableSlice","updateVariableOptions","templatedRegex","ALL_VARIABLE_TEXT","ALL_VARIABLE_VALUE","NONE_VARIABLE_TEXT","NONE_VARIABLE_VALUE","updateVariableTags","queryVariableReducer","NavigationKey","VariableLink","stopPropagation","SubMenu","submenuItemValueDropDownValueLinkTexts","getTagColorsFromName","bs-tooltip","VariableInput","clearOthers","shiftKey","onNavigate","setAttribute","commitChangesToVariable","templating","optionsPicker","currentPayload","mapToCurrent","searchQueryPayload","queryValue","updated","hideOptions","toggleOptionByHighlight","forceSelect","highlightIndex","toggleOption","fetchTagValues","tagText","getTimeRange","metricFindQuery","searchForOptions","searchQuery","updateOptionsFromSearch","searchForOptionsWithDebounce","selectedValues","texts","VariableOptions","onToggle","handleEvent","onToggleAll","onToggleTag","submenuItemValueDropDownDropDown","renderMultiToggle","renderOption","renderTags","renderTag","selectClass","highlightClass","submenuItemValueDropDownOptionTexts","OptionsPickerUnconnected","onShowOptions","showOptions","onHideOptions","onToggleOption","onToggleMultiValueVariable","onToggleSingleValueVariable","renderLink","renderOptions","linkText","getLinkText","getSelectedTags","filterOrSearchOptions","navigateOptions","toggleAllOptions","toggleAndFetchTag","isQuery","newLinkText","foundIndex","findIndex","updateSearchQuery","containsSearchFilter","updateOptionsAndFilter","toggleTag","cancel","selectAndClose","moveDown","moveOptionsHighlight","moveUp","OptionsPicker","SelectionOptionsEditor","onMultiChanged","onIncludeAllChanged","onPropChange","onAllValueChanged","Variables","selectionOptionsMultiSwitch","selectionOptionsIncludeAllSwitch","selectionOptionsCustomAllInput","updateQueryVariableOptions","searchFilter","removeVariableEditorError","errorProp","dataSource","queryOptions","getTemplatedRegex","tagResults","addVariableEditorError","errorText","changeQueryVariableDataSource","importDataSourcePlugin","dsPlugin","VariableQueryEditor","DefaultVariableQueryEditor","changeVariableEditorExtended","QueryVariableEditorUnConnected","getSelectedDataSourceValue","extended","dataSources","foundItem","onDataSourceChange","onQueryChange","changeQueryVariableQuery","onRegExChange","onRegExBlur","onTagsQueryChange","onTagsQueryBlur","onTagValuesQueryChange","onTagValuesQueryBlur","onRefreshChange","onSelectionOptionsChange","onUseTagsChange","initQueryVariableEditor","QueryVariable","queryOptionsDataSourceSelect","queryOptionsRefreshSelect","queryOptionsRegExInput","queryOptionsSortSelect","alphabeticalAsc","alphabeticalDesc","numericalAsc","numericalDesc","alphabeticalCaseInsensitiveAsc","alphabeticalCaseInsensitiveDesc","valueGroupsTagsEnabledSwitch","label-class","valueGroupsTagsTagsQueryInput","valueGroupsTagsTagsValuesQueryInput","getMetricSources","mixed","allDataSources","QueryVariableEditor","ownProps","createQueryVariableAdapter","variableToTest","containsVariable","cloneDeep","rest","initialCustomVariableModelState","customVariableSlice","createCustomOptionsFromQuery","customVariableReducer","CustomVariableEditorUnconnected","CustomVariableEditor","updateCustomVariableOptions","initialTextBoxVariableModelState","textBoxVariableSlice","createTextBoxOptions","textBoxVariableReducer","TextBoxVariablePicker","onQueryBlur","onQueryKeyDown","TextBoxVariableEditor","updateTextBoxVariableOptions","setTextBoxVariableOptionsFromUrl","createTextBoxVariableAdapter","initialConstantVariableModelState","hideVariable","constantVariableSlice","createConstantOptionsFromQuery","constantVariableReducer","ConstantVariableEditor","ConstantVariable","constantOptionsQueryInput","updateConstantVariableOptions","createConstantVariableAdapter","initialDataSourceVariableModelState","dataSourceVariableSlice","createDataSourceOptions","sources","dataSourceVariableReducer","updateDataSourceVariableOptions","skipVariables","DataSourceVariableEditorUnConnected","getSelectedDataSourceTypeValue","dataSourceTypes","onDataSourceTypeChanged","initDataSourceVariableEditor","filtered","DataSourceVariableEditor","createDataSourceVariableAdapter","initialIntervalVariableModelState","auto_count","auto_min","intervalVariableSlice","createIntervalOptions","intervalVariableReducer","IntervalVariableEditor","onAutoChange","onQueryChanged","onAutoCountChanged","onAutoMinChanged","updateIntervalVariableOptions","updateAutoValue","calculateInterval","setGrafanaVariable","createIntervalVariableAdapter","OperatorSegment","AdHocFilterBuilder","appendBefore","onCompleted","onLoadKeys","onLoadValues","setKey","setOperator","filterAddButton","Fragment","condition","ConditionSegment","REMOVE_VALUE","AdHocPickerUnconnected","prop","removeFilter","changeFilter","appendFilterToVariable","addFilter","fetchFilterKeys","getTagKeys","fetchFilterKeysWithRemove","fetchFilterValues","getTagValues","renderFilters","segments","renderFilterSegments","AdHocPicker","AdHocVariableEditorUnConnected","onDatasourceChanged","changeVariableDatasource","initAdHocVariableEditor","infoText","AdHocVariableEditor","toFilters","toFilter","isFilter","escapeDelimiter","unescapeDelimiter","split","createAdHocVariableAdapter","urlParser","setFiltersFromUrl","getDefaultVariableAdapters","folderSlice","hasChanged","loadFolder","setFolderTitle","loadFolderPermissions","processAclItems","folderReducer","Portal","classList","portalRoot","ReactDOM","createPortal","zIndex","forwardedRef","crosshair","onMouseOut","setCrosshair","clearCrosshair","lockCrosshair","unlockCrosshair","mouseout","adj","drawX","drawY","teamsSlice","hasFetched","teamsLoaded","setSearchQuery","teamsReducer","teamSlice","members","searchMemberQuery","teamLoaded","teamMembersLoaded","setSearchMemberQuery","teamGroupsLoaded","teamReducer","defaultStyle","transition","overflow","SlideDown","inProp","maxHeight","transitionStyles","exited","entering","entered","exiting","DataLinksListItem","onEdit","getDataLinkListItemStyles","hasTitle","hasUrl","notConfigured","IconButton","formLabel","semibold","listItem","DataLinkEditor","isLast","DataLinkEditorModalContent","dirtyLink","setDirtyLink","editIndex","setEditIndex","isNew","setIsNew","getDataLinksInlineEditorStyles","linksSafe","onDataLinkChange","onDataLinkCancel","Modal","noBorderContainer","DashNavButton","iconType","iconSize","classSuffix","noBorder","Toolbar","toolbarItems","VizOrientation","Options","Record","object","renderDecoration","decoration","optsParam","decorateNode","block","Block","grammarName","grammar","blockText","getTexts","getText","tokens","tokenize","flattened","flattenTokens","newData","decorations","textStart","textEnd","processToken","token","accu","createDecoration","anchor","flattenToken","aliases","flatMap","firstToken","offsets","lastToken","defaultMarkedOptions","renderer","marked","Renderer","pedantic","gfm","tables","sanitize","smartLists","smartypants","xhtml","setMarkdownOptions","optionsOverride","setOptions","renderMarkdown","findHighlightChunksInText","searchWords","textToHighlight","term","findMatchesInText","haystack","needle","regexp","parseFlags","cleanNeedle","cleaned","flags","FLAGS_REGEXP","clearAll","flag","delete","hasAnsiCodes","sanitizeUrl","PluginState","PluginType","PluginSignatureStatus","configPages","BRACES","BracesPlugin","keyEvent","startOffset","startKey","endOffset","endKey","focusOffset","focusText","isExpanded","insertTextByKey","moveEndBackward","complement","matchAnnotation","addAnnotation","moveBackward","nextChar","anchorText","annotationType","annotation","annotations","moveFocusForward","removeAnnotation","moveAnchorForward","previousChar","deleteBackward","deleteForward","ClearPlugin","forward","ClipboardPlugin","clipboardPlugin","onCopy","clipEvent","copiedText","textBlocks","excludingLastLineLength","getCopiedText","getLeafBlocksAtRange","clipboardData","onPaste","line","splitBlock","onCut","deleteAtRange","isIndentLeftHotkey","isKeyHotkey","isShiftTabHotkey","isIndentRightHotkey","handleIndent","indentDirection","curSelection","selectedBlocks","blockWhitespace","trimLeft","textKey","getFirstText","rangeProperties","deleteBackwardAtRange","SlateRange","textBeforeCaret","startText","isWhiteSpace","moveStartBackward","IndentationPlugin","startBlock","endBlock","equals","handleTabKey","NewlinePlugin","indent","getIndent","RunnerPlugin","isSelectLineHotkey","SelectionShortcutsPlugin","focusBlock","moveAnchorToStartOfBlock","getNextBlock","moveFocusToStartOfNextBlock","moveFocusToEndOfText","TypeaheadInfo","typeaheadItem","dark1","dark4","xxs","TypeaheadItem","typeaheadItemSelected","typeaheadItemMatch","typeaheadItemGroupTitle","onClickItem","highlightClassName","itemGroupTitleClassName","kind","GroupTitle","flattenGroupItems","groupedItems","titleItem","calculateLongestLabel","allItems","longest","calculateListSizes","longestLabel","calculateSize","listWidth","calculateListWidth","itemHeight","calculateItemHeight","listHeight","calculateListHeight","longestLabelHeight","longestLabelWidth","verticalPadding","totalHeight","modulo","Typeahead","listRef","hoveredItem","typeaheadIndex","menuRef","handleSelectionChange","componentWillUnmount","removeEventListener","forceUpdate","prevState","scrollToItem","isEqual","moveMenuIndex","moveAmount","itemCount","newTypeaheadIndex","insertSuggestion","onSelectSuggestion","showDocumentation","documentationItem","menuPosition","itemSize","itemKey","rect","scrollX","scrollY","contextType","SuggestionsPlugin","typeaheadRef","onTypeahead","cleanText","onWillApplySuggestion","portalOrigin","typeaheadPrefix","typeaheadContext","typeaheadText","handleTypeaheadDebounced","handleTypeahead","hasSuggestions","commands","selectSuggestion","suggestion","ed","applyTypeahead","suggestionText","preserveSuffix","move","backward","deleteBackwards","fragment","makeFragment","insertFragment","moveForward","renderEditor","onStateChange","parentBlock","getClosestBlock","selectionStartOffset","getDecorations","filteredDecorations","labelKeyDec","labelKey","wrapperClasses","labelValueMatch","filteredSuggestions","newGroup","skipFilter","filterText","prefixMatch","skipSort","sortText","gr","resetSelectStyles","clearIndicator","control","dropdownIndicator","groupHeading","indicatorsContainer","indicatorSeparator","loadingIndicator","loadingMessage","menuList","multiValue","multiValueLabel","multiValueRemove","valueContainer","getFieldStyles","fieldHorizontal","fieldValidationWrapper","fieldValidationWrapperHorizontal","inputId","Children","labelElement","MultiSelect","AsyncMultiSelect","FilterInput","autoFocus","unEscapeStringFromRegex","escapeStringForRegex","MatcherID","orderer","createFieldsOrderer","createOrderFieldsComparer","indexOfField","comparer","isInteger","MAX_SAFE_INTEGER","DashboardSearchItemType","vectorToArray","categories","layoutMode","LayoutModes","dataSourcesCount","dataSourceTypeSearchQuery","isLoadingDataSources","dataSourceMeta","dataSourceLoaded","dataSourcesLoaded","dataSourceMetaLoaded","dataSourcePluginsLoad","dataSourcePluginsLoaded","setDataSourcesSearchQuery","setDataSourcesLayoutMode","setDataSourceTypeSearchQuery","setDataSourceName","setIsDefault","initialDataSourceSettingsState","testingStatus","loadError","initDataSourceSettingsSucceeded","initDataSourceSettingsFailed","testDataSourceStarting","testDataSourceSucceeded","testDataSourceFailed","isDefault","dataSourceSettings","ThemeContextMock","createContext","WithTheme","ContextComponent","hoistNonReactStatics","useStyles","currentTheme","stylesTheme","mockThemeContext","Interval","INTERVALS_IN_SECONDS","Year","Month","Week","Day","Hour","Minute","Second","Millisecond","toNanoSeconds","toFixedScaled","toMicroSeconds","toMilliSeconds","trySubstract","value1","value2","toSeconds","toMinutes","toHours","toDays","toDuration","timeScale","units","long","strings","decrementDecimals","decimalsCount","toClock","asHours","toDurationInMilliseconds","toDurationInSeconds","toDurationInHoursMinutesSeconds","numHours","numMinutes","numSeconds","toTimeTicks","toClockMilliseconds","toClockSeconds","toDateTimeValueFormatter","todayPattern","dateTime","isSame","dateTimeFormatTimeAgo","toPercent","toPercentUnit","toHex0x","asHex","toHex","sci","toExponential","hasBuiltIndex","toLocaleString","String","decimalPos","additionalDecimals","toFixedUnit","asPrefix","scaledUnits","extArray","locale","maximumFractionDigits","simpleCountUnit","scaler","buildFormats","formats","decimalSIPrefix","currency","binarySIPrefix","cat","sub","getOffsetFromSIPrefix","getValueFormatterIndex","getValueFormats","submenu","timeRangeVars","BuiltIn","timeRangeFrom","timeRangeTo","seriesVars","seriesName","Series","valueNumeric","valueText","valueRaw","buildLabelPath","getPanelLinksVariableSuggestions","getFieldVars","df","chain","flatten","uniq","getDataFrameVars","Fields","getDataLinksVariableSuggestions","valueTimeVar","valueTime","LinkSrv","timeSrv","getDataLinkUIModel","toUrlParams","timeRangeForUrl","onBuildUrl","disableSanitizeHtml","appendQueryToUrl","getLinkUrl","setLinkSrv","getLinkSrv","service","cardChrome","bg2","hoverColor","shadows","isDark","brighten","listItemSelected","textStrong","getLineCount","queryOptionsQueryInput","apiKeysSlice","includeExpired","apiKeysLoaded","apiKeysReducer","apiKeys","dropdownTypeahead","$compile","menuItems","dropdownTypeaheadOnSelect","attrs","$input","$button","ngModel","$watch","subItem","typeaheadValues","subIndex","menuItemSelected","menuItem","$item","$subItem","removeClass","typeahead","minLength","updater","submenuItem","keyup","toggleClass","contents","dropdownTypeahead2","buttonTemplateClass","timeoutId","closeDropdownMenu","autofillEventFix","dispatchChangeEvent","Event","dispatchEvent","onAnimationStart","animationName","metricSegment","$sce","segment","selectMode","cancelBlur","linkMode","debounceLookup","updateVariableValue","altSegments","trustAsHtml","highlightVariablesAsHtml","fake","expandable","switchToLink","fromClick","inputBlur","$query","alt","unescape","lookup","$element","proxy","keydown","metricSegmentModel","uiSegmentSrv","template","pre","cachedOptions","valueToSegment","cssClass","newSegment","getOptionsInternal","onSegmentChange","$$postDigest","tip","_t","addslashes","replaceWith","compile","$eval","editorOptBool","ngchange","change","showIf","editorCheckbox","$interpolate","$id","gfDropdown","$parse","iElement","iAttrs","getter","buildTemplate","ul","divider","li","method","clipboard","Clipboard","onchange","inputValue","priority","require","elm","ngModelCtrl","$setViewValue","ctrl","$parsers","viewValue","$validators","modelValue","$isEmpty","tagColorFromName","getItemProperty","$parent","onTagsUpdated","tagsinput","typeaheadSource","widthClass","itemvalue","itemText","itemtext","tagClass","tagclass","tagElement","ValueSelectDropdownCtrl","queryHasSearchFilter","debouncedQueryChanged","queryChanged","oldVariableText","tagObj","dropdownVisible","selectedAndNotInTag","currentTexts","selectionsChanged","getValuesForTag","valuesText","moveHighlight","commitChanges","selectValue","commitChange","setAllExceptCurrentTo","selectedTags","updateLinkText","updateLazyLoadedOptions","onUpdated","updateUIBoundOptions","lazyLoadOptions","valueSelectDropdown","$window","bodyEl","linkEl","inputEl","bodyOnClick","vm","rebuildOnChange","$animate","multiElement","terminal","childScope","previousElements","cleanUp","$destroy","nodes","blockNodes","endNode","nextSibling","getBlockNodes","leave","oldValue","showNull","newScope","createComment","giveFocus","domEl","setSelectionRange","DeltaCtrl","observer","MutationObserver","mutations","jsonDiffReady","observe","attributes","attributeFilter","characterData","childList","subtree","disconnect","LinkJSONCtrl","$anchorScroll","scroll","switchView","$win","place_tt","$tooltip","injector","invoke","tmpScope","$new","scopeData","$digest","startExpanded","rootName","expansionLevel","jsonObject","JsonExplorer","animateOpen","setLangMode","setThemeMode","setEditorContent","codeEditor","bootData","lightTheme","setTheme","lang","ace","acequire","enableBasicAutocompletion","enableLiveAutocompletion","enableSnippets","snippetsEnabled","getCompleter","anyEditor","completers","aceModeName","editorSession","setMode","langMode","maxLines","showGutter","tabSize","behavioursEnabled","aceElem","default","edit","getSession","editorOptions","highlightActiveLine","showPrintMargin","autoScrollEditorIntoView","$blockScrolling","setScrollMargin","setPadding","textarea","codeEditorFocus","getValue","editorValue","addCommand","bindKey","win","mac","getReactComponent","reactComponent","namePart","applyFunctions","propsConfig","wrapApply","wrappedInApply","wrapped","phase","$$phase","applied","watchProps","watchDepth","watchExpressions","listener","supportsWatchCollection","$watchCollection","supportsWatchGroup","$watchGroup","watchGroupExpressions","expr","actualExpr","exprWatchDepth","getPropWatchDepth","renderComponent","getPropConfig","findAttribute","kebabCase","defaultWatch","isObject","ngModule","renderMyComponent","onScopeDestroy","unmountComponent","unmountComponentAtNode","factory","reactComponentName","conf","injectableProps","getPropName","propExpressions","propTypes","wide","dropOptions","openOn","hoverOpenDelay","tetherOptions","constraints","attachment","pin","$applyAsync","drop","Drop","$formatters","observers","protocol","initPromise","conn","readyState","reject","WebSocket","getWebSocketUrl","onclose","reconnect","onmessage","handleMessage","onerror","onopen","stream","removeObserver","getConnection","send","streamName","addObserver","SwitchCtrl","switchClass","DashboardSelectorCtrl","starred","dash","queryPartEditorDirective","part","partDef","$paramsContainer","clickFuncParam","paramIndex","$link","optional","updateParam","$event","inputKeyPress","inputKeyDown","addElementsAndCompile","paramValue","$paramLink","keypress","dynamicOptions","addTypeahead","partActions","showActionsMenu","triggerPartAction","sqlPartEditorDirective","typeaheadMatcher","FormDropdownCtrl","inputElement","linkElement","modelChanged","labelMode","typeaheadUpdater","startOpen","open","updateDisplay","lookupText","optionCache","optionTexts","allowCustom","updateValue","$option","InvitedCtrl","$routeParams","sidemenu","formModel","code","invite","username","inviteCode","greeting","invitedBy","submit","inviteForm","$valid","post","SignUpCtrl","signUpForm","rsp","ResetPasswordCtrl","ldapEnabled","authProxyEnabled","disableLoginForm","sendResetEmail","sendResetForm","submitReset","resetForm","newPassword","confirmPassword","alertWarning","ErrorCtrl","navModelSrv","getNotFoundNav","isSignedIn","toggleSidemenuHidden","JsonEditorCtrl","canUpdate","updateHandler","canCopy","enableCopy","newObject","fromJson","getContentForClipboard","AlertSrv","AngularModalProxy","UtilSrv","$modal","reactModalRoot","reactModalNode","onReactModalDismiss","showModal","hideModal","modalProps","provideTheme","modalScope","dismiss","modalClass","templateHtml","persist","keyboard","backdrop","modalEl","updateConfirmText","confirmTextValid","onAltAction","altActionText","ConfirmModal","Timer","timers","without","Analytics","ajax","dataType","ga","q","googleAnalyticsId","track","gaInit","startAnalytics","googleAnalyticsSrv","popoverSrv","openDrop","close","contentElement","hoverCloseDelay","tether","self","MetricSegment","getSegmentForValue","fallbackText","newSelectMeasurement","newFake","newKey","newKeyValue","newCondition","newOperator","newOperators","ops","transformToSegments","addTemplateVars","variableTypeFilter","newSelectMetric","newPlusButton","DynamicDirectiveSrv","directiveInfo","registered","$normalize","addDirective","watchPath","BridgeSrv","variableSrv","lastQuery","lastPath","fullPageReloadRoutes","angularUrl","changes","old","findTemplateVarChanges","templateVarsChangedInUrl","urlWithoutBase","interpolateTemplateVars","filterFunc","replaceWithText","$stateful","isUndefined","fromNow","scrollRoot","scroller","grafanaScrollbar","scrollParams","bar","barOnCls","scrollingCls","scrollbar","baron","dispose","DefaultTarget","projects","variableOptions","AnnotationQueryEditor","getDefaultProject","toOption","getProjects","editorQuery","onRunQuery","prefixMatching","actionPrefix","alarmNamePrefix","DropDownChild","listItemClassName","SideMenuDropDown","onHeaderClick","childrenLinks","hideFromMenu","TopSectionItem","TopSection","navTree","mainLinks","loginUrl","OrgSwitcher","getUserOrgs","setCurrentOrg","setWindowLocation","endsWith","currentOrgId","BottomNavLinks","showSwitcherModal","onOpenShortcuts","toggleSwitcherModal","subMenuIconClassName","showOrgSwitcher","BottomSection","bottomNav","orgCount","profileNode","homeUrl","SideMenu","toggleSideMenuSmallBreakpoint","toggleSidemenuMobile","Branding","MenuLogo","MetricSelect","buildOptions","nextProps","nextOptions","getVariablesGroup","every","selectedOption","getSelectedOption","backspaceRemovesValue","AppNotificationItem","appNotification","onClearNotification","AppNotificationList","onClearAppNotification","clearAppNotification","notifyApp","createWarningNotification","createSuccessNotification","createErrorNotification","appNotifications","FunctionHelpButton","onDescriptionShow","FunctionEditorControls","func","onMoveLeft","onMoveRight","justifyContent","FunctionDescription","lazy","rst2html","dangerouslySetInnerHTML","__html","FunctionEditor","triggerRef","renderContent","updatePopperPosition","showingDescription","textAlign","hideAfter","UserProfileEditForm","onNameChange","onEmailChange","onLoginChange","onSubmitProfileUpdate","updateProfile","isSavingUser","UserTeams","loadTeams","memberCount","UserOrganizations","setUserOrg","ReactProfileWrapper","UserProvider","api","states","loadUser","updateUserProfile","SharedPreferences","resourceUri","LokiAnnotationsQueryEditor","absolute","useLokiSyntaxAndLabels","languageProvider","isSyntaxReady","setActiveOption","refreshLabels","syntax","logLabelOptions","LokiQueryFieldForm","onLoadOptions","onLabelsRefresh","absoluteRange","syntaxLoaded","HelpModal","shortcuts","shortcut","tabIndex","Global","MoveType","VariableEditorList","onChangeVariableOrder","moveType","onDuplicateVariable","onRemoveVariable","EmptyListCTA","buttonIcon","buttonTitle","infoBox","infoBoxTitle","onAddClick","tableRowNameFields","tableRowDefinitionFields","up","tableRowArrowUpButtons","down","tableRowArrowDownButtons","tableRowDuplicateButtons","tableRowRemoveButtons","VariableValuesPreview","previewLimit","setPreviewLimit","previewOptions","setPreviewOptions","showMoreOptions","previewOfValuesOption","ng-if","completeChangeNewVariableName","newName","changeVariableNameSucceeded","completeChangeVariableName","originalVariable","renamedIdentifier","switchToEditMode","removeVariable","reIndex","setIdInEditor","switchToListMode","clearIdInEditor","VariableEditorEditorUnConnected","changeVariableName","onTypeChange","changeVariableType","newType","onLabelChange","onHideChange","onPropChanged","onHandleSubmit","onEditorUpdate","onEditorAdd","variableEditorMount","snapshot","errors","variableEditorUnMount","EditorToRender","newVariable","onSubmit","generalNameInput","generalTypeSelect","generalLabelInput","generalHideSelect","hideLabel","updateButton","variableEditorMounted","variableEditorUnMounted","changeVariableNameFailed","newVariableInState","storeNewVariable","VariableEditorEditor","VariableEditorContainerUnconnected","onChangeToListMode","onEditVariable","onNewVariable","switchToNewMode","fromIndex","toIndex","changeVariableOrder","duplicateVariable","newId","variableToEdit","idInEditor","headerLink","modeLabelNew","modeLabelEdit","newButton","getNewVariabelIndex","VariableEditorContainer","SearchField","clearable","border1","spacer","clearButton","getSearchFieldStyles","spellCheck","DashboardSearch","onCloseSearch","useSearchQuery","onTagAdd","useReducer","searchReducer","dashboardsSearchState","useSearch","queryParsing","onToggleSection","selectedItem","findSelected","DashFolder","useDashboardSearch","searchField","closeBtn","SearchResults","onTagSelected","dashboardBg","navbarFixed","SearchWrapper","getLocationQuery","SecretFormField","registerAngularDirectives","react2AngularDirective","SeriesColorPickerPopoverWithTheme","StackdriverQueryEditor","StackdriverAnnotationQueryEditor","CloudWatchAnnotationQueryEditor","GraphContextMenu","DataSourceHttpSettings","FolderPicker","SaveDashboardButtonConnected","SaveDashboardAsButtonConnected","TimePickerSettings","Pages","Login","skip","DataSource","saveAndTest","alertMessage","DataSources","dataSourceName","AddDataSource","dataSourcePlugins","AddDashboard","addNewPanel","button","navBar","submenuItemLabels","deleteDashBoard","sectionItems","saveDashBoard","saveAsDashBoard","addVariableCTA","Dashboards","dashboards","SaveDashboardAsModal","SaveDashboardModal","saveVariables","saveTimerange","SharePanelModal","linkToRenderedImage","Explore","runButton","Components","TestData","QueryTab","scenarioSelect","noise","seriesCount","spread","startValue","Panels","Panel","headerItems","containerByTitle","Visualization","VisualizationTab","legendSection","Legend","legendItemAlias","showLegendSwitch","xAxis","Drawer","expand","contract","rcContentWrapper","PanelEditor","OptionsPane","DataPane","PanelInspector","Data","Stats","Json","jsonObjectKeys","Tab","queryInspectorButton","addQuery","QueryEditorRows","QueryEditorRow","actionButton","AlertTab","TransformTab","newTransform","Transforms","Reduce","calculationsLabel","QueryEditorToolbarItem","OptionsGroup","toggle","PluginVisualization","FieldConfigEditor","OverridesConfigEditor","DataSourcePicker","TimeZonePicker","QueryField","getSelectOptionGroupStyles","optionBorder","gray4","header","UnthemedSelectOptionGroup","expanded","onToggleChildren","selectProps","SelectOptionGroup","isMathString","roundUp","isDate","parseString","mathString","dateTimeForTimeZone","ISO_8601","strippedMathString","len","num","numFrom","endOf","startOf","subtract","defaultTimeZoneResolver","setTimeZoneResolver","resolver","getTimeZone","dateInUtc","toTz","getFormat","dateTimeFormatISO","dateTimeFormatWithAbbrevation","timeZoneAbbrevation","defaultWithMS","zone","moment","tz","local","dateTimeParse","parseOthers","lowerCase","spans","M","rangeOptions","rangeIndex","getRelativeTimesList","timepickerSettings","currentDisplay","describeTimeRange","parsed","isValidTimeSpan","describeTimeRangeAbbrevation","convertRawToRange","timeZoneFormatUserFriendly","getTimeZoneGroups","parsedQuery","getParsedQuery","useDebounce","hasId","folderIds","commonColorsPalette","gray98","gray97","gray95","gray90","gray85","gray70","gray60","gray33","gray25","gray15","gray10","gray05","blue85","blue80","blue77","red88","sansSerif","heading","h1","h2","h3","h4","h5","h6","regular","bold","hoverDecoration","xl","xxl","insetSquishMd","gutter","formMargin","SPACING_BASE","formFieldsetMargin","formInputHeight","formButtonHeight","formInputPaddingHorizontal","formInputAffixPaddingHorizontal","formInputMargin","formLabelPadding","formLabelMargin","formValidationMessagePadding","formValidationMessageMargin","inlineFormMargin","panelPadding","panelHeaderHeight","dropdown","modalBackdrop","basicColors","dark5","dark6","dark8","dark10","gray1","gray3","gray7","redShade","greenBase","greenShade","orangeDark","backgrounds","bg1","bg3","bgBlue1","bgBlue2","borders","border2","border3","textColors","textHeading","textSemiWeak","textFaint","form","formDescription","formInputBorderActive","formInputBorderInvalid","formValidationMessageText","formValidationMessageBg","formCheckboxBgChecked","formCheckboxBgCheckedHover","formCheckboxCheckmark","darkTheme","defaultTheme","isLight","brandPrimary","brandSuccess","brandWarning","brandDanger","queryRed","queryPurple","queryOrange","online","critical","pageHeaderBg","pageHeaderBorder","panelBorder","dropdownBg","dropdownShadow","dropdownOptionHoverBg","linkDisabled","linkHover","linkExternal","themeMock","formLegend","Light","mockTheme","mock","getDashboardPermissions","loadDashboardPermissions","toUpdateItem","updateDashboardPermission","itemToUpdate","level","getStore","itemsToUpdate","removeDashboardPermission","itemToDelete","addDashboardPermission","newItem","importDashboard","dashboardTitle","loadPluginDashboards","removeDashboard","uri","initDashboardPanel","loadPanelPlugin","pluginLoaded","panelModelAndPluginReady","changePanelPlugin","angularComponent","setPanelAngularComponent","changePlugin","NOOP","ArrayPropertyVector","converter","setFieldsFromObject","PanelQueryRunner","dataConfigSource","resendLastResult","lastResult","subject","ReplaySubject","pipe","processedData","getTransformations","getFieldOverrideOptions","cacheTimeout","maxDataPoints","minInterval","pipeToSubject","request","app","requestId","intervalMs","startTime","rangeRaw","getDataSource","lowerIntervalLimit","assign","__interval_ms","runRequest","observable","preProcessPanelData","complete","runner","getLastResult","panelAdded","panelRemoved","notPersistedProperties","isInView","hasRefreshed","cachedPluginOptions","queryRunner","editSourceId","mustKeepProps","gridPos","repeat","repeatIteration","repeatPanelId","repeatDirection","repeatedByRow","minSpan","collapsed","fullscreen","transparent","pluginVersion","PanelModel","restoreModel","defaultsDeep","ensureQueryIds","getNextRefIdChar","newPos","sizeChanged","prevOptions","mergeWith","objValue","srcValue","fieldConfigDefaults","onPanelMigration","getPluginVersion","applyPluginOptionDefaults","newPlugin","oldOptions","getOptionsToRemember","oldPluginId","wasAngular","angularPanelCtrl","restorePanelOptions","onPanelTypeChanged","itemIndex","sourceModel","EDIT_PANEL_ID","sourceQueryRunner","useLastResultFrom","extraVars","vars","SaveProvisionedDashboardForm","dashboardJSON","setDashboardJson","saveToFile","blob","Blob","saveAs","onCopyToClipboardSuccess","CopyToClipboard","elType","onSuccess","SaveProvisionedDashboard","SaveDashboardForm","hasTimeChanged","hasVariableChanged","hasVariableValuesChanged","resetOriginalVariables","resetOriginalTime","onSaveSuccess","useDashboardSave","onDashboardSave","dashboardSaveModelClone","setDashboardSaveModelClone","SaveDashboardErrorProxy","dashboardSaveModel","SaveDashboardModalProxy","isProvisioned","isChanged","O","colorCodes","colorCodesLight","styleCodes","asBright","lightGray","0","2","3","9","4","10","subtypes","colorLight","bgColor","bgColorLight","unstyle","clean","Color","inverted","inverse","rgbName","Code","bright","Colors","alpha","dim","noBrightness","reset","noItalic","noUnderline","noInverse","noColor","noBgColor","wrap","openCode","closeCode","denormalizeBrightness","camel","stringWrappingMethods","Symbol","iterator","codes","rawParse","underline","italic","foreColor","defaultBrightness","styledSpan","isBrightness","subtype","asChromeConsoleLogArguments","darkGray","lightRed","lightGreen","lightYellow","lightBlue","lightMagenta","lightCyan","assignStringWrappingAPI","wrapBefore","LegendTable","sortDesc","onToggleSort","columnHeader","willApplySuggestion","DOMUtil","getNextCharacter","selectedOptions","onChangeLogLabels","onChangeQuery","lokiLanguageProvider","provideCompletionItems","ExtraFieldElement","hasLogLabels","chooserText","hasSyntax","getChooserText","buttonDisabled","loadData","onPopupVisibleChange","additionalPlugins","initPhase","NotStarted","isInitSlow","modifiedQueries","initError","dashbardSlice","dashboardInitFetching","Fetching","dashboardInitServices","Services","dashboardInitSlow","dashboardInitCompleted","Completed","dashboardInitFailed","Failed","DashboardModel","cleanUpDashboard","setDashboardQueriesToUpdateOnLoad","clearDashboardQueriesToUpdateOnLoad","updatePanelState","cleanUpEditPanel","addPanel","dashboardReducer","panelEditor","panelEditorReducer","getShiftedTimeRange","origRange","timespan","getZoomedTimeRange","center","LoginCtrl","changePassword","pw","confirmNew","oldPassword","toGrafana","catch","isLoggingIn","changeView","isChangingPassword","redirect","redirectUrl","loginError","loginHint","passwordHint","disableUserSignUp","isOauthEnabled","oauth","skipPasswordChange","withMulti","MetricsPanelCtrl","useDataFrames","panelDataObserver","processDataError","Loading","angularDirtyCheck","handleDataFrames","legacy","handleQueryResult","onMetricsPanelRefresh","onPanelTearDown","onMetricsPanelMounted","querySubscription","otherPanelInFullscreenMode","snapshotData","issueQueries","cancelled","getTimezone","getFieldLinksSupplier","_scopedVars","dataFrame","getPanelLinksSupplier","getLinksFromLogsField","linkModel","disableDivFocus","Cascader","flattenOptions","optionPath","selectOptions","cpy","singleLabel","rcValue","focusCascade","activeLabel","onSelect","valueArray","isSearching","onCreateOption","onBlurCascade","onInputKeyDown","searchableOptions","setInitialValue","initialValue","initValue","allowCustomValue","formatCreateLabel","onChangeCascader","changeOnSelect","fieldNames","expandIcon","popupClassName","SaveDashboardButton","SaveDashboardAsButton","provideModalsContext","idValidationEvents","EventsWithValidation","errorMessage","normalizeQuery","namespace","metricName","region","statistics","period","normalizedQuery","matchExact","MetricsQueryEditor","showMeta","metricsQuery","metaDataExist","validationEvents","gmdMeta","ID","Expression","Period","apiModes","Metrics","Logs","PanelQueryEditor","apiMode","queryMode","ExploreMode","LogsQueryEditor","TimeSrv","timer","zoomOut","shiftTime","autoRefreshBlocked","visibilityState","refreshDashboard","cancelAll","initTimeFromUrl","parseTime","timeAtLoad","setAutoRefresh","minRefreshInterval","validIntervals","isAllowedInterval","utcValue","epoch","timeWindow","timeWindowMs","interval_to_ms","getTimeWindow","parseUrlParam","urlRange","timeHasChangedSinceLoad","cancelNextRefresh","validInterval","getValidInterval","refreshTimer","startNextRefreshTimer","timeRangeUpdated","afterMs","isGrafanaVisible","fromRouteUpdate","oldRefresh","setTimeSrv","CancellationType","BackendSrv","deps","inFlightRequests","Subject","HTTP_REQUEST_CANCELED","fromFetch","logout","requestErrorHandler","isHandled","parseRequestOptions","retry","headers","parseDataSourceRequestOptions","noBackendCache","Authorization","getFromFetchStream","parseUrlFromOptions","parseInitFromOptions","mergeMap","response","statusText","redirected","textData","fetchResponse","share","toFailureStream","inputStream","fetchErrorResponse","throwError","retryWhen","attempts","firstAttempt","loginPing","catchError","toDataSourceRequestFailureStream","requestIsLocal","handleStreamCancellation","resultType","takeUntil","cancelRequest","throwIfEmpty","dataSourceRequest","of","fromFetchStream","failureStream","successStream","tap","showSuccessAlert","merge","toPromise","silent","dsRequestResponse","dsRequestError","slug","overwrite","folderUids","dashboardUids","tasks","folderUid","createTask","deleteFolder","dashboardUid","executeInOrder","toFolder","moveDashboard","totalCount","successCount","succeeded","alreadyInFolderCount","alreadyInFolder","getDashboardByUid","fullDash","saveDashboard","ignoreRejections","task","getRadioButtonStyles","fullWidth","textColor","textColorHover","textColorActive","borderColorHover","borderColorActive","bg","bgDisabled","bgActive","borderActive","borderHover","radio","radioLabel","RadioButton","disabledOptions","handleOnChange","groupName","radioGroup","isItemDisabled","webpackEmptyContext","req","QueryEditorRowTitle","inMixedMode","collapsedText","getQueryEditorRowTitleStyles","contextInfo","angularQueryEditor","loadedDataSourceValue","hasTextEditMode","renderAngularQueryEditor","getAngularQueryComponentScope","angularScope","onOpen","renderPluginEditor","QueryCtrl","QueryEditor","onToggleEditMode","openRow","toggleEditorMode","digest","onRemoveQuery","onCopyQuery","onAddQuery","onDisableQuery","renderActions","QueryOperationAction","onMoveQuery","renderCollapsedText","loadDatasource","dataSourceSrv","dataSourceValue","globalLastPanelDataCache","Done","notifyAngularQueryEditorsOfData","getCollapsedText","rowClasses","QueryOperationRow","InlineList","float","backgroundImage","addQueryRowAction","changeModeAction","changeQueryAction","changeSizeAction","changeRefreshIntervalAction","clearQueriesAction","cancelQueriesAction","highlightLogsExpressionAction","initializeExploreAction","loadDatasourceMissingAction","loadDatasourcePendingAction","loadDatasourceReadyAction","modifyQueriesAction","queryStreamUpdatedAction","queryStoreSubscriptionAction","removeQueryRowAction","scanStartAction","scanStopAction","setQueriesAction","splitCloseAction","splitOpenAction","syncTimesAction","richHistoryUpdatedAction","updateUIStateAction","toggleTableAction","toggleGraphAction","updateDatasourceInstanceAction","toggleLogLevelAction","resetExploreAction","queriesImportedAction","historyUpdatedAction","setUrlReplacedAction","changeRangeAction","changeLoadingStateAction","setPausedStateAction","Project","metricDescriptors","services","loadMetricDescriptors","getMetricTypes","getServicesList","getMetricsList","getSelectedMetricDescriptor","selectedMetricDescriptor","extra","startCase","serviceShortName","Help","displayHelp","displaRawQuery","onHelpClicked","onRawQueryClicked","rawQuery","lastQueryError","ng-show","removeOption","GroupBys","labelsToGroupedOptions","operators","LabelFilter","filterArray","stringArrayToFilters","filtersToStringArray","AnnotationsHelp","Alignments","AlignmentPeriods","alignment","ap","formatAlignmentText","secondsToHms","AliasBy","setAlias","propagateOnChange","Aggregations","onToggleDisplayAdvanced","setAggOptions","getAggregationOptionsByMetric","SimpleSelect","onValueChange","QueryTypeSelector","queryTypes","qt","QueryInlineField","onChanged","fromRCOptions","onLoadDataCascader","onLoadData","fromRCOption","extractServicesFromMetricDescriptors","getMetricTypesByService","interpolatedMetricType","selectedService","metricTypes","metricTypeExistInArray","selectedMetricType","getAlignmentOptionsByMetric","metricValueType","getLabelKeys","curr","initial","strArr","chunk","formatStackdriverError","assignModelProperties","removeDefaults","ConfirmDeleteModal","subtitle","onDeleteItems","uids","getCheckedUids","folders","folderCount","dashCount","dashEnding","folderEnding","deleteFoldersAndDashboards","seconds","numyears","numdays","numhours","numminutes","numseconds","nummilliseconds","nr","outof","resolution","lowLimitInterval","lowLimitMs","round_interval","sec","intervals_in_seconds","interval_regex","describe_interval","diameter","valueFormats","receiver","isUtc","Reflect","ensureColumns","timeFieldName","findConsistentTimeFieldName","byField","reactDirective","LogLevelColor","LogLevel","warning","trace","unknown","isoDateRegexp","dedupLogRows","strategy","LogsDedupStrategy","none","rowCopy","previous","exact","numbers","signature","isDuplicateRow","duplicates","filterLogLevels","logRows","hiddenLogLevels","logLevel","dataFrameToLogsModel","metricSeries","logSeries","separateLogsAndMetrics","logsModel","allLabels","allSeries","fieldCache","stringField","hasFieldNamed","getFieldByName","getFirstFieldOfType","timeNanosecondField","hasFieldWithNameAndType","logLevelField","idField","getIdField","commonLabels","findCommonLabels","hasUniqueLabels","uniqueLabels","findUniqueLabels","seriesLogLevel","getLogLevelFromKey","tsNs","timeEpochNs","messageValue","hasAnsi","getLogLevel","entryFieldIndex","timeFromNow","timeEpochMs","timeLocal","timeUtc","ansicolor","strip","deduplicatedLogRows","deduplicateLogRowsById","LogsMetaKind","LabelsMap","limits","limitValue","totalBytes","queriesVisited","totalBytesKey","lokiQueryStatKey","byteStat","logSeriesToLogsModel","seriesByLevel","bucketSize","seriesList","sortedRows","sortInAscendingOrder","lastTs","makeSeriesForLogs","showBars","showLines","showPoints","asTable","addStrategy","updateText","innerExpr","strValue","hasMultipleParamsInString","partVal","functionRenderer","parameters","paramType","quote","suffixRenderer","buildParams","useCurrentTimeRange","includeTemplateVars","selectedTheme","getUrlSearchParams","editPanel","viewPanel","buildBaseUrl","baseUrl","queryStart","buildSoloUrl","soloUrl","buildImageUrl","imageUrl","utcOffset","Intl","dateFormat","DateTimeFormat","resolvedOptions","getLocalTimeZone","themeOptions","ShareLink","buildUrl","shareUrl","buildShareUrl","onUseCurrentTimeRangeChange","onIncludeTemplateVarsChange","onThemeChange","onShareUrlCopy","getShareUrl","e2eSelectors","onClipboardCopy","rendererAvailable","expireOptions","ShareSnapshot","createSnapshot","external","timeoutSeconds","originalUrl","saveSnapshot","snapshotExpires","scrubDashboard","cmdData","expires","deleteUrl","snapshotUrl","snapshotName","enable","iconColor","builtIn","singlePanel","forEachPanel","deleteSnapshot","getSnapshotUrl","onSnapshotNameChange","onTimeoutChange","onExpireChange","selectedExpireOption","onSnapshotUrlCopy","externalEnabled","sharingButtonText","getSnaphotShareOptions","shareOptions","renderStep1","renderStep2","renderStep3","ShareExport","onShareExternallyChange","shareExternally","onSaveAsFile","exporter","makeExportable","dashboardJson","openSaveAsDialog","onViewJson","openJsonModal","dashboardJsonPretty","DashboardExporter","ShareEmbed","buildIframeHtml","iframeHtml","data-share-panel-url","shareCommonTabs","shareDashboardTabs","sharePanelTabs","customDashboardTabs","customPanelTabs","getInitialState","tabs","getTabs","activeTab","onSelectTab","activeTabModel","getActiveTab","ActiveTab","ctaStyle","infoBoxStyles","buttonLink","proTip","proTipLink","proTipLinkTitle","proTipTarget","footer","ctaElementClassName","ctaElement","callToActionElement","$http","$q","$templateCache","$strapConfig","when","$emit","bsTooltip","$this","Constructor","_tooltip","bsTypeahead","shown","matchAll","JSURL","encodeUrl","buildInitialState","buildNavIndex","parentItem","updateNavIndex","navIndexReducer","newPages","LogsDedupDescription","checkInput","notFound","difference","onSelectionChange","menuPlacement","capacity","tail","getAddFunction","setCapacity","webpackContext","webpackContextResolve","__webpack_require__","UserSessions","showLogoutModal","showLogoutConfirmationModal","logoutFromAllDevicesClass","session","isActive","seenAt","createdAt","clientIp","browser","os","osVersion","PanelPlugin","_fieldConfigDefaults","_initConfigRegistry","_defaults","noPadding","registerOptionEditors","registry","useCustomConfig","FieldConfigEditorBuilder","getRegistry","customProp","standardOptions","standardOption","standardEditor","standardOptionsDefaults","fieldConfigProp","editors","optionEditors","configDefaults","_fieldConfigRegistry","_optionEditors","PanelOptionsEditorBuilder","localStorage","ret","removeItem","templates","panelsRendered","IndicatorsContainer","menuIsOpen","AppNotificationTimeout","vX","vY","Ignore","AsZero","pairs","getFlotPairsConstant","seriesData","vectorator","predicate","vector","iconMap","question","bolt","doc","cloud","DashLinksEditorCtrl","emptyListCta","setupNew","dashLinksUpdated","backToList","dir","defaultSuccessNotification","Success","defaultWarningNotification","Warning","defaultErrorNotification","getMessageFromError","loadingStates","updateUserOrg","getFieldValidationMessageStyles","fieldValidationMessage","fieldValidationMessageIcon","FieldValidationMessage","skipRecent","skipStarred","queryReducer","hasFilters","onClearFilters","CalculateFieldMode","RowVector","defaultReduceOptions","sum","defaultBinaryOptions","calculateField","ReduceRow","creator","allFrames","doStandardCalcs","iter","getReduceRowCreator","BinaryOperation","findFieldValuesWithNameOrConstant","BinaryOperationVector","getBinaryCreator","binary","getNameFromOptions","replaceFields","ConstantVector","Apps","xmlns","viewBox","rx","Cog","Shield","Favorite","Grafana","gradientUnits","stopColor","Bell","enableBackground","PlusSquare","FolderPlus","Folder","Import","enable-background","PanelAdd","xmlSpace","Circle","SquareShape","alwaysMonoIcons","getIconStyles","divElementProps","svgSize","getSvgSize","iconName","toPascalCase","DefaultIcon","MonoIcon","TextPanelCtrl","panelDefaults","onInitEditMode","onRender","throttle","addEditorTab","updateContent","safeContent","scrollable","TextPanel","updateHTML","processContent","prepareHTML","prepareMarkdown","prepareText","setPanelOptions","addRadio","addTextInput","useTextarea","setPanelChangeHandler","prevPluginId","GraphPanelController","onSeriesColorChange","onSeriesAxisToggle","onHorizontalRegionSelected","graphSeriesModel","graph","optionsUpdate","onOptionsChange","updatedSeriesOptions","seriesOptionsUpdate","onSeriesOptionsUpdate","onChangeTimeRange","onSeriesToggle","toggledSeries","tooltipOptions","graphProps","legendProps","controllerApi","displayMode","LegendDisplayMode","isLegendVisible","sortLegendBy","sortLegendDesc","useFieldConfig","Unit","Decimals","addBooleanSwitch","createAnnotationToolip","eventManager","manager","editEvent","markerElementToAttachTo","createEditPopover","editorOpen","editorOpened","panelCtrl","editorClosed","DrawableEvent","drawFunc","clearFunc","moveFunc","_object","_drawFunc","_clearFunc","_moveFunc","_position","_width","_height","VisualEvent","drawableEvent","_options","_drawableEvent","_hidden","_parent","EventMarkers","_events","_types","_plot","eventsEnabled","partition","regions","ve","_buildDiv","vre","_buildRegDiv","ao","bo","_insidePlot","isHidden","visual","markerSize","markerShow","lineStyle","markerTooltip","that","eventTypeId","eventType","topOffset","marker","editModel","hover","regionWidth","timeEnd","timeTo","xc","eventMarkers","getEvents","hideEvents","showEvents","drawEvents","setEvents","setupEvents","setTypes","updateEvents","GraphTooltip","getSeriesFn","findHoverIndexFromDataPoints","posX","findHoverIndexFromData","middle","lower","upper","renderAndShow","absoluteTime","innerHtml","xMode","getMultiSeriesPlotHoverInfo","hoverIndex","hoverDistance","pointTime","minDistance","minTime","lastValue","value_type","distance","mouseleave","shared","graphHoverClear","panelRelY","graphHover","graphClicked","hoverInfo","seriesHtml","tooltipFormat","plotData","allSeriesMode","scrollTop","innerHeight","sharedCrosshairModeOnly","seriesHoverInfo","ThresholdManager","handleIndex","valueStr","colorMode","posTop","handleElem","parents","lastY","dragging","clientY","stopped","graphValue","thresholdChanged","needsCleanup","defaultHandleTopPos","handleTopPos","valueCanvasPos","getHandleHtml","hasSecondYAxis","editingThresholds","shouldDrawHandles","thresholdMargin","renderHandle","initDragging","gtLimit","ltLimit","lineColor","colorModes","gray","themeDependent","darkColor","lightColor","timeRegion","TimeRegionManager","timeRegions","hRange","fromStart","fromEnd","timeRegionColor","tRange","timeRegionsCopy","fromDayOfWeek","toDayOfWeek","parseTimeRange","dayOfWeek","unix","isoWeekday","convertToHistogramData","dataList","getSeriesValues","histogram","minBound","getBucketBound","maxBound","bound","histogamSeries","convertValuesToHistogram","alignYLevel","yAxes","checkCorrectAxes","yLeft","yRight","moveLevelToZero","expandStuckValues","oneSide","checkOneSide","checkOppositeSides","rate","checkTwoCross","rateLeft","rateRight","absLeftMin","absLeftMax","absRightMin","absRightMax","upLeft","downLeft","upRight","downRight","getRate","restoreLevelFromZero","LEGEND_STATS","LegendItem","onLabelClick","onToggleAxis","legendValueItems","valueName","valueFormatted","LegendValue","seriesOptionClasses","valueItems","renderLegendValues","seriesLabel","LegendSeriesLabel","SeriesIcon","LegendSeriesIcon","GraphLegend","onToggleSeries","toggleSeriesExclusiveMode","alignAsTable","optionalClass","rightSide","sideWidth","seriesValuesProps","seriesHideProps","sortProps","sortLegend","hideFromLegend","legendClass","legendStyle","minWidth","LegendSeriesList","statName","LegendTableHeaderItem","hideHorizontalTrack","LegendWithThemeProvider","GraphElement","getContextMenuItemsSupplier","flotPosition","linksSupplier","updateTime","dataLinks","contextMenu","contextMenuCtrl","panelWidth","EventManager","thresholdManager","timeRegionManager","sortedSeries","onPanelTeardown","onGraphHover","onGraphHoverClear","onPlotSelected","onPlotClick","legendElem","renderData","buildFlotPairs","graphHeight","hasChildNodes","renderPanel","valueOptions","legendReactElem","sharedTooltipModeEnabled","scrollContextElement","closest","contextMenuSourceItem","yAxisConfig","getDataIndexWithNullValuesCorrection","hasLinksValue","fieldDisplay","getCurrentTheme","setScrollContextElement","setSource","setMenuItemsSupplier","toggleMenu","correctIndex","dataWarning","actionText","gridMargin","panelOptions","alignLevel","shouldAbortRender","prepare","buildFlotOptions","prepareXAxis","configureYAxisOptions","addFlotOptions","addFlotEvents","sortSeries","callPlot","addXSeriesAxis","histMin","histMax","buckets","tickStep","addXHistogramAxis","addXTableAxis","getMinTimeStepOfSeries","addTimeAxis","incrementRenderCounter","renderError","gridColor","drawHook","processOffsetHook","processRangeHook","stackpercent","percentage","translateFillOption","getFillGradient","labelMarginX","haveSortBy","haveSortOrder","shouldSortBy","graphTimeFormat","graphTickFormatter","defaultTicks","tickValues","ticksNum","configureAxisMode","pointIndex","logBase","parseNumber","secondY","applyLogScale","minSetToZero","generateTicksForLogScaleYAxis","nextTick","maxNumTicks","numTicks","graphDirective","SeriesOverridesCtrl","overrideMenu","currentOverrides","colorPickerModel","addOverrideOption","propertyName","setOverride","addSeriesOverride","updateCurrentOverrides","openColorSelector","colorSelected","autoClose","removeOverride","getSeriesNames","ThresholdFormCtrl","unbindDestroy","setAlpha","toRgbString","TimeRegionFormCtrl","editingTimeRegions","DataProcessor","toTimeSeries","colorIndex","aliasColors","isOutsideRange","validOptions","getXAxisValueOptions","propertyParts","AxesEditorCtrl","logScales","linear","xAxisModes","Time","Histogram","xAxisStatOptions","processor","setPanelDefaultsForNewXAxisMode","onDataFramesReceived","axesEditorComponent","GraphContextMenuCtrl","el","getSource","menuItemsSupplier","GraphCtrl","annotationsSrv","hiddenSeriesTainted","linkVariableSuggestions","seriesOverrides","onContextMenuClose","getDataFrameByRefId","onDataSnapshotLoad","onInitPanelActions","onDataLinksChange","annotationsPromise","subTabIndex","getAnnotations","datasourcePromises","publishAppEvent","frames","getProcessedDataFrames","getSeriesList","getDataWarning","alertState","MIN_SAFE_INTEGER","getDataTimeRange","applySeriesOverrides","DashListCtrl","recent","headings","getRecentDashboards","getStarred","getSearch","starDashboard","isStarred","newState","dashIds","take","impressionSrv","getDashboardOpened","dashboardIds","orderId","PluginListCtrl","isAdmin","hasRole","pluginList","viewModel","embedded","core","AlertListPanel","sortOrderOptions","stateFilter","currentAlerts","alertHistory","onlyAlertsOnDashboard","dashboardFilter","nameFilter","alertDef","getAlertsPromise","getCurrentAlertState","getStateChanges","al","stateModel","noAlertsMessage","dashboardQuery","dashboardTags","dashboardTag","sortResult","newStateDateAgo","newStateDate","AnnoListPanel","onAnnoClick","anno","_timeOffset","navigateBefore","navigateAfter","navigateToPanel","onTagClick","queryTags","onUserClick","queryUser","onClearUser","TagBadge","removeIcon","showUser","showTags","showTime","loaded","doSearch","onlyFromThisDashboard","onlyInTimeRange","incr","hasFilter","AbstractList","addCustomEditor","addNumberInput","getColorScale","colorScheme","maxValue","minValue","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","domain","getOpacityScale","legendOpacityScale","colorScale","exponent","drawLegendValues","rangeFrom","rangeTo","legendWidth","valuesRange","childNodes","legendValueScale","tickStepSize","firstTick","getFirstCloseTick","isValueCloseTo","buildLegendTicks","colorRect","posY","svgElem","baseVal","getSvgElemHeight","getSvgElemX","clearLegend","valueTo","colorSchemes","legendHeight","valuesNumber","rangeStep","selectAll","drawSimpleColorLegend","colorOptions","cardColor","drawSimpleOpacityLegend","cards","cardStats","widthFactor","drawColorLegend","opacityScale","drawOpacityLegend","unitFormats","getUnitFormats","dataFormats","yBucketBoundModes","Auto","Upper","Lower","Middle","axesEditor","HeatmapDisplayEditorCtrl","heatmapDisplayEditor","sortSeriesByLabel","s1","s2","label1","label2","parseHistogramLabel","convertToCards","xBucket","yBucket","card","yBounds","bounds","pushToXBuckets","bucketNum","pointExt","pushToYBuckets","getValueBucketBound","yBucketSize","yBucketSplitFactor","getLogScaleBucketBounds","getLogScaleBucketBound","getBucketBounds","convertToValueBuckets","powTop","valueLog","logp","additionalBucketSize","additionalLog","convertToLogScaleValueBuckets","getDistance","ratio","HeatmapTooltip","heatmapPanel","mouseOverBucket","originalFillColor","getBucketIndexes","xBucketIndex","yBucketIndex","boundBottom","boundTop","countValueFormatter","bucketBoundFormatter","xData","yData","bucket","bucketIndex","tooltipDecimals","tickValueFormatter","tooltipHtml","tsBuckets","valIndex","tsBucketsFormatted","yBucketBound","boundStr","showHistogram","addHistogram","getXBucketIndex","getYBucketIndex","xBucketSize","xScale","chartHeight","histogramData","histXScale","yScale","barNumberFactor","histogramDomain","histYScale","tooltipWidth","clientWidth","tooltipHeight","clientHeight","innerWidth","pageYOffset","HeatmapRenderer","$heatmap","dataRangeWidingFactor","drawSharedCrosshair","axisText","getBBox","axisLinePosition","chartWidth","ticksUtils","tickFormat","tickPadding","yAxisWidth","heatmap","tickInterval","heatmapStats","wideYAxisRange","yMin","yMax","decimalsAuto","flotTickSize","tickSizeInner","tickSizeOuter","getYAxisWidth","yWiding","adjustLogRange","minLog","adjustLogMin","adjustLogMax","logScaleTickValues","tickShift","domainMin","domainMax","tickValue","chartTop","chartBottom","dataFormat","addYAxisFromBuckets","addYAxis","addLogYAxis","fixYAxisTickSize","addXAxis","xAxisHeight","getXAxisHeight","heatmapElem","cardPadding","cardRound","addHeatmapCanvas","addAxes","yBuckets","emptyBucket","nullBucket","minBucket","newBucket","mergeZeroBuckets","cardsData","maxValueAuto","minValueAuto","setCardSize","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","highlightCard","resetCardHighLight","darker","strokeColor","brighter","currentCard","xGridSize","yGridSize","splitFactor","cardWidth","cardHeight","elemOffset","clientX","getEventOffset","selectionRange","limitSelection","drawSelection","getEventPos","drawCrosshair","emitGraphHoverEvent","posX1","posX2","selectionX","selectionWidth","graphTooltip","setElementHeight","addHeatmap","reverseYBuckets","xBucketNumber","yBucketNumber","highlightCards","hideZeroBuckets","opacityScales","dsSupportHistogramSort","HeatmapCtrl","selectionActivated","onSnapshotLoad","onCardColorChange","convertHistogramToHeatmapData","convertTimeSeriesToHeatmapData","bucketsData","xBucketSizeByNumber","parseSeries","bucketBound","convertToHeatMap","panelDatasource","getPanelDataSourceType","histogramToHeatmap","calculateBucketSize","flotpairs","rendering","TablePanel","onColumnResize","fieldDisplayName","matcherId","byName","propId","onFieldConfigChange","onSortByChange","onChangeTableSelection","noHeader","showHeader","resizable","initialSortBy","inputHeight","currentIndex","getCurrentFrameIndex","tableStyles","renderTable","selectWrapper","setMigrationHandler","setNoPadding","addSelect","TableCellDisplayMode","ColorText","ColorBackground","GradientGauge","LcdGauge","JSONView","transformers","timeSeriesFormatFilterer","tableDataFormatFilterer","getColumns","filteredData","timeKey","cells","columnNames","noTableIndex","fromCharCode","mergeTablesIntoModel","maxDocs","z","tableCol","TablePanelEditorCtrl","fontSizes","addColumnSegment","updateTransformHints","canSetColumns","columnsHelpMessage","dataRaw","plusButton","tablePanelEditor","ColumnOptionsCtrl","activeStyleIndex","columnTypes","dateFormats","mappingTypes","alignTypes","alignTypesEnum","getColumnNames","stylesCount","indexToInsert","mappingType","valueMaps","rangeMaps","columnOptionsTab","TableRenderer","initColumns","formatters","colorState","escapedPattern","stringStartsAsRegEx","createColumnFormatter","defaultCellFormatter","setColorState","valueFormatter","numericValue","getColorForValue","columnIndex","addWidthHack","formatColumnValue","cellStyles","cellStyle","cellClasses","cellClass","columnHtml","preserveFormat","renderRowVariables","cellLink","sanitizedCellLink","cellLinkTooltip","linkTooltip","cellTarget","linkTargetBlank","pageSize","startPos","endPos","cellHtml","rowStyle","rowClass","renderCell","visibleColumns","newRow","TablePanelCtrl","$sanitize","desc","pageIndex","onDataReceived","TableModel","transformDataToTable","pageCount","panelHeight","panelElem","rootElem","tbodyElem","footerElem","setTable","appendTableRows","startPage","endPage","paginationList","activeClass","pageLinkElem","appendPaginationControls","selector","filterData","applyFilterFromTable","setAdhocFilter","SingleStatCtrl","linkSrv","valueNameOptions","postfix","nullText","prefixFontSize","postfixFontSize","colorBackground","colorValue","full","thresholdMarkers","thresholdLabels","tableColumn","onFramesReceived","onSparklineColorChange","onSparklineFillChange","distinct","firstTimeField","getDistinctNames","fieldInfo","processField","convertOldAngularValueMapping","calcField","lastNotNull","panelColorIndex","rangeMap","drilldownTooltip","linkInfo","getPanelContainer","getSpan","fontSizePercent","applyColoring","valueString","getBigValueHtml","colorPrefix","colorPostfix","addGauge","invalidGaugeRange","plotCanvas","plotCss","colorMap","fontScale","gaugeWidthReduceRatio","gaugeWidth","thresholdMarkersWidth","getValueText","plotSeries","addSparkline","dynamicHeightMargin","strVale","BigValueColorMode","Background","BigValueGraphMode","None","Area","BigValueJustifyMode","Center","addStandardDataReduceOptions","includeOrientation","includeFieldMatcher","StatPanel","valueProps","menuProps","alignmentFactors","openMenu","targetClassName","xMin","xMax","graphMode","justifyMode","renderValue","getValues","renderCounter","getAlignmentFactors","itemSpacing","autoGrid","orientation","sharedSingleStatPanelChangedHandler","sharedSingleStatMigrationHandler","cardStyle","completeGradient","darkThemeGradients","lightThemeGradients","borderGradient","iconStyle","cardContent","TutorialCard","done","handleTutorialClick","DocsCard","learnHref","Step","setup","step1Key","step2Key","getSteps","subheading","check","GettingStarted","checksDone","currentStep","onForwardClick","onPreviousClick","helpFlags1","checkedStepsPromises","checkedCardsPromises","passed","checkedCards","checkedSteps","backForwardButtons","loadingText","imageDark","imageLight","headerLogo","GaugePanel","showThresholdLabels","showThresholdMarkers","PieChartPanel","pieType","strokeWidth","PieChartType","PIE","DONUT","BarGaugePanel","getFieldDisplayProcessor","getItemSpacing","showUnfilled","displayModes","BarGaugeDisplayMode","Gradient","Lcd","Basic","showLabels","wrapLogMessage","newResults","sortedNewResults","sortLogsResult","autoHide","dedupStrategy","highlighterExpressions","allowDetails","disableCustomHorizontalScroll","SortOrder","Descending","Ascending","feedToDataFrame","feed","pubDate","loadRSSFeed","fetch","txt","domParser","DOMParser","parseFromString","getProperty","propNode","querySelector","textContent","querySelectorAll","NewsPanel","loadFeed","feedUrl","useProxy","news","isError","autoHeightMin","autoHeightMax","GrafanaLinksPanel","HomeLink","VersionFooter","styleMixins","helpOptions","lightBackground","help","helpText","helpLinks","helpLink","graphitePlugin","cloudwatchPlugin","dashboardDSPlugin","elasticsearchPlugin","opentsdbPlugin","grafanaPlugin","influxdbPlugin","lokiPlugin","jaegerPlugin","zipkinPlugin","mixedPlugin","mysqlPlugin","postgresPlugin","prometheusPlugin","builtInPlugins","textPanel","text2Panel","graph2Panel","graphPanel","dashListPanel","pluginsListPanel","alertListPanel","annoListPanel","tablePanel","oldTablePanel","newsPanel","singlestatPanel","singlestatPanel2","gettingStartedPanel","gaugePanel","pieChartPanel","barGaugePanel","logsPanel","homeLinksPanel","welcomeBanner","PanelPluginError","grafanaUI","grafanaUIraw","grafanaData","DataSourcePlugin","DataSourceApi","bust","exposeToPlugin","grafanaRuntime","registerDynamic","newModule","locate","address","baseURL","defaultExtension","packages","esModule","authorization","jquery","rxjs","rxjsOperators","prismjs","slate","slateReact","slatePlain","react","reactDom","reactRedux","redux","emotion","impressions","__esModule","sdk","fakeDep","importPluginModule","import","Datasource","setComponentsFromLegacyExports","importAppPlugin","panelCache","importPanelPlugin","LoadError","getPanelPluginLoadError","NotFound","author","large","screenshots","getPanelPluginNotFound","KeybindingSrv","modalOpen","timepickerOpen","Mousetrap","setupGlobal","timepickerClosed","showHelpModal","goToHome","openAlerting","goToProfile","openSearch","bindGlobal","globalEsc","anyDoc","activeElement","hasAttribute","closeTimepicker","inspect","inspectTab","kiosk","toggleKioskMode","closeSearch","keyArg","returnValue","keyType","canEditPanelById","focusPanelId","hasAccessToExplore","getExploreUrl","panelTargets","panelIndex","getPanelInfoById","panelInfo","panelRef","toggleLegendsForAll","collapseRows","expandRows","showDashEditView","toggleViewMode","newUrlParam","autofitpanels","setKeybindingSrv","getKeybindingSrv","DatasourceSrv","datasources","expressionDatasource","dsConfig","useAngular","DataSourceClass","instantiate","instanceSettings","getAll","addDataSourceVariables","metricSources","metricSource","getDataSourceService","Grid","SearchItem","onToggleChecked","getResultsItemStyles","tagSelected","toggleItem","SEARCH_ITEM_HEIGHT","SEARCH_ITEM_MARGIN","getRouteParamsPage","getRouteParams","getUrl","restProps","Edge","inputEdges","outputEdges","edges","outputNode","unlink","_linkTo","inode","onode","Node","toBeRemoved","edgeToRemove","getEdgeTo","output","inputArr","outputArr","inputNodes","outputNodes","createEdge","variablesReducer","globalVariables","allVariables","sharedReducer","buttonSpacing","SignupForm","formData","defaultValues","initialVariableEditorState","variableEditorReducerSlice","variableEditorReducer","ldapSlice","connectionInfo","connectionError","userError","ldapConnectionInfoLoadedAction","ldapError","ldapFailedAction","ldapSyncStatusLoadedAction","userMappingInfoLoadedAction","userMappingInfoFailedAction","clearUserMappingInfoAction","clearUserErrorAction","ldapReducer","userAdminSlice","userProfileLoadedAction","userOrgsLoadedAction","userSessionsLoadedAction","userAdminPageLoadedAction","userAdminPageFailedAction","userAdminReducer","userListAdminSlice","users","perPage","totalPages","showPaging","usersFetched","pageChanged","userListAdminReducer","userListAdmin","useLokiLabels","languageProviderInitialised","mounted","useRefMounted","setLogLabelOptions","shouldTryRefreshLabels","setRefreshLabels","activeOption","fetchOptionValues","fetchLabelValues","tryLabelsRefresh","refreshLogLabels","targetOption","useInitLanguageProvider","languageProviderInitialized","setLanguageProviderInitialized","initializeLanguageProvider","initialRange","setSyntax","useLokiSyntax","DataSourceStatus","ConfigEditor","AnnotationsQueryCtrl","ExploreQueryField","ExploreMetricsQueryField","ExploreLogsQueryField","ExploreStartPage","MetadataInspector","LanguageProvider","TagOption","innerProps","optionFocused","filterOption","hideValues","onTagChange","newTags","getOptionLabel","getOptionValue","Option","MultiValueLabel","MultiValueRemove","MultiValueContainer","tagFilter","validatorAsync","validationRules","populateEventPropsWithStatus","inputElementProps","eventName","hasValidationEvent","hideErrorMessage","inputRef","inputClassName","isInvalid","Valid","grafanaConfig","PageLoader","pageName","PageContents","Page","updateTitle","getPageTitle","AppTitle","getTitleFromNavModel","Header","processAclItem","sortRank","dto","userLogin","missing","queue","emptyInputResult","standard","calculateLastNotNull","calculateLast","calculateFirst","firstNotNull","calculateFirstNotNull","changeCount","calculateChangeCount","distinctCount","calculateDistinctCount","nonNullCount","isFirst","NO_ID_SECTIONS","SECTION_STORAGE_KEY","timeZones","tzs","isNowDelayValid","getRefreshIntervals","Deferred","freeze","sharedReducerSlice","lodashDefaults","variableStates","fromVariable","toVariable","emptyVariable","hasTags","extraReducers","addCase","buttonContainer","buttonShow","buttonHide","confirmButtonContainer","confirmButton","confirmButtonShow","confirmButtonHide","UnThemedConfirmButton","showConfirm","onClickButton","onClickCancel","closeOnConfirm","confirmButtonVariant","buttonClass","confirmButtonClass","ConfirmButton","DeleteButton","ClipboardButton","setRef","onClipboardError","buttonProps","popup","ButtonCascader","LoadingPlaceholder","PanelOptionsGroup","onAdd","PanelOptionsGrid","EmptySearchResult","PieChart","grafana_colors","percents","containerElement","offsetWidth","offsetHeight","innerRadius","svg","svgElement","pieChart","pie","customArc","padAngle","tooltipElement","tooltipValueElement","menuShadowColor","optionBgHover","caretWrapper","TimeOfDayPicker","minuteStep","showHour","dateTimeAsMoment","allowEmpty","showSecond","inputIcon","wrapperStyle","Caret","itemStyle","nameStyle","TagItem","TagsInput","newTag","tagToRemove","setNewTags","onKeyboardAdd","tagsCloudStyle","addButtonStyle","onKeyUp","Pagination","currentPage","numberOfPages","Tag","getTagStyles","getTagColor","TagList","FilterPill","getFilterPillStyles","labelColor","dismissText","modalContent","modalText","lastExecutedValue","runQuery","documentChanged","prevValue","onRichValueChange","textChanged","runOnChangeAndRunQuery","runOnChangeDebounced","runOnChange","runOnRunQuery","handleBlur","classnames","autoCorrect","readOnly","getTabsBarStyles","tabsWrapper","TabsBar","tabsStyles","Counter","getTabStyles","tabItem","activeStyle","ModalTabsHeader","ModalTabContent","ModalsContext","ModalsProvider","Provider","ModalRoot","ModalsController","SetInterval","propsSubject","switchMap","NEVER","stringToMs","DefaultCell","tableCell","tableCellLink","FormattedValueDisplay","reductionFactor","fontSizeReductionFactor","hasPrefix","hasSuffix","BarGauge","wrapperStyles","titleDim","titleStyles","calculateTitleDimensions","whiteSpace","textOverflow","alignSelf","isVertical","paddingRight","renderBarAndValue","renderRetroBars","renderBasicAndGradientBars","calculateBarAndValueDimensions","valueWidth","valueHeight","maxBarHeight","maxBarWidth","valuePercent","getValuePercent","valueColor","getValueColor","valueStyles","getValueStyles","isBasic","barStyles","emptyBar","barHeight","borderTop","getBarGradient","borderRight","getBasicAndGradientStyles","positionValue","isLit","backgroundShade","lcdCellWidth","wrapperWidth","wrapperHeight","isVert","valueRange","cellSpacing","cellCount","cellSize","containerStyles","cellColor","getCellColor","Vertical","titleHeight","titleFontSize","cssDirection","lastpos","schemeSet","scheme","textWidth","formattedValueString","VALUE_LEFT_PADDING","paddingLeft","Horizontal","defaultScale","BarGaugeCell","barGaugeMode","cellPadding","cellHeightInner","withTableStyles","CellComponent","getExtendedStyles","WithTableStyles","getObjectName","getType","getValuePreview","createTextNode","DATE_STRING_REGEX","PARTIAL_DATE_REGEX","JSON_DATE_REGEX","requestAnimationFrame","cb","_defaultConfig","animateClose","_isOpen","skipChildren","appendChildren","removeChildren","depth","arrayWrapperSpan","isNumberArray","skipRoot","togglerLink","togglerIcon","hasKey","objectWrapperSpan","constructorName","renderArray","isUrl","valuePreview","toggleOpen","animated","addAChild","childrenElement","childrenRemoved","removeAChild","isEmptyObject","JSONFormatter","wrapperRef","renderJson","onDidRender","wrapperEl","replaceChild","lastChild","JSONViewCell","JSONTooltip","clazz","getTextAlign","availableWidth","columnMinWidth","fieldCountWithoutWidth","fieldTableOptions","Cell","getTextColorStyle","getBackgroundColorStyle","getCellComponent","sharedWidth","extendedStyle","themeFactor","bgColor2","spin","getTableStyles","headerBg","resizerColor","rowHoverBg","scollbarWidth","getScrollbarWidth","rowHeight","thead","headerCell","headerCellLabel","tableCellWrapper","resizeHandle","TableCell","onCellClick","cellProps","getCellProps","memoizedData","memoizedColumns","stateReducer","columnIdString","columnResizing","headerIdWidths","columnWidths","sortByFields","sortItem","useTableStateReducer","disableResizing","useTable","useSortBy","useAbsoluteLayout","useResizeColumns","getTableProps","headerGroups","prepareRow","totalColumnsWidth","RenderRow","getRowProps","headerHeight","CustomScrollbar","hideVerticalTrack","headerGroup","getHeaderGroupProps","headerProps","getHeaderProps","canResize","userSelect","isResizing","canSort","getSortByToggleProps","isSorted","isSortedDesc","getResizerProps","renderHeaderCell","TableInputCSV","readCSV","onTextChange","onSeriesParsed","getTabContentStyle","tabContent","TabContent","BigValueLayout","justifyCenter","shouldJustifyCenter","titleToAlignTo","valueToAlignTo","maxTextWidth","maxTextHeight","panelStyles","bgColor3","scales","timeDelta","lastDataPointTime","getChartStyles","renderGeom","fillOpacity","WideNoChartLayout","WideWithChartLayout","StackedWithChartLayout","StackedWithNoChartLayout","BigValue","getPanelStyles","valueAndTitleContainerStyles","getValueAndTitleContainerStyles","getTitleStyles","renderChart","renderVisualization","autoProps","calculateGaugeAutoProps","gaugeHeight","canvasElement","showLabel","getFontScale","getFormattedThresholds","availableHeight","getTooltipContainerStyles","TooltipContainer","tooltipRef","useWindowSize","setPlacement","useLayoutEffect","xO","yO","xOverflow","yOverflow","getSeriesTableRowStyles","seriesTable","seriesTableRow","seriesTableCell","activeSeries","SeriesTableRow","SeriesTable","SingleModeGraphTooltip","activeDimensions","processedTime","xAxisDimension","xPos","xPosition","secPerTick","MultiModeGraphTooltip","activeSeriesIndex","yAxisDimensions","xAxisDimensions","xAxisPosition","datapointIndex","getMultiSeriesGraphHoverInfo","getContextMenuStyles","linkColor","linkColorHover","groupLabelColor","headerSeparator","groupLabel","ContextMenu","renderHeader","positionStyles","setPositionStyles","menuElement","collisions","ContextMenuItem","ContextMenuGroup","getContextMenuSource","contextDimensions","itemsToRender","valueFromDimensions","formattedValue","isTooltipVisible","isContextVisible","onPlotHover","contextPos","contextItem","renderTooltip","tooltipElementProps","tooltipMode","tooltipContentRenderer","tooltipComponent","tooltipContentProps","tooltipContent","renderContextMenu","contextContentProps","getBarWidth","isStacked","flotOptions","noDataToBeDisplayed","iconProps","LegendItemStat","LegendStatsList","GraphLegendListItem","displayValues","itemWrapper","yAxisLabel","GraphLegendTableRow","sortKey","graphLegendItemProps","union","sortedItems","legendTableEvenRowBackground","getGraphWithLegendStyles","graphContainer","legendContainer","GraphWithLegend","legendItems","isZeroOnlySeries","isNullOnlySeries","shouldHideLegendItem","calculateSizeOfChild","parentWidth","parentHeight","numberOfChildren","VizRepeater","vertical","xCount","yCount","itemsOnLastRow","widthOnLastRow","calculateGridDimensions","xGrid","yGrid","itemWidth","itemStyles","renderGrid","repeaterStyle","vizHeight","vizWidth","resolvedOrientation","getOrientation","getItemStylesForIndex","getIconFromSeverity","Alert","buttonText","onButtonClick","alertClass","GraphSeriesToggler","onHiddenSeriesChanged","newHiddenSeries","allSeriesLabels","collapse","collapseBody","loaderActive","headerCollapsed","headerButtons","headerButtonsCollapsed","headerLabel","ControlledCollapse","setOpen","Collapse","collapsible","panelClass","loaderClass","headerClass","headerButtonsClass","HIDDEN_LABELS","logsLabels","logsLabel","logsLabelValue","LogLabels","displayLabels","getLogRowStyles","logColor","crit","logsRowMatchHighLight","logsRowMatchHighLightPreview","logsRowsTable","logsRowsHorizontalScroll","logsRow","logsRowDuplicates","logsRowLevel","logsRowToggleDetails","logsRowLocalTime","logsRowLabels","logsRowMessage","logDetailsContainer","logDetailsTable","logsDetailsIcon","logDetailsLabel","logDetailsHeading","logDetailsValue","getRowContexts","getRowContext","dataResult","timestampField","errorResult","LogRowContextProvider","setLimit","setResult","before","hasMoreContextRows","setHasMoreContextRows","useAsync","currentResult","hasMoreLogsBefore","hasMoreLogsAfter","currentResultBefore","currentResultAfter","valueBefore","valueAfter","updateLimit","LogLabelStatsRow","proportion","logsStatsRow","logsStatsRowActive","logsStatsRowLabel","logsStatsRowValue","logsStatsRowCount","logsStatsRowPercent","logsStatsRowBar","logsStatsRowInnerBar","barStyle","logsStats","logsStatsHeader","logsStatsTitle","logsStatsClose","logsStatsBody","UnThemedLogLabelStats","isLabel","topRows","activeRow","otherRows","insertActiveRow","otherCount","otherProportion","LogLabelStats","noHoverBackground","hoverCursor","wordBreakAll","UnThemedLogDetailsRow","showFieldsStats","fieldCount","fieldStats","filterLabel","onClickFilterLabel","parsedKey","filterOutLabel","onClickFilterOutLabel","showStats","getStats","toggleFieldsStats","FieldLink","getLinkStyles","LogDetailsRow","hoverBackground","logsRowLevelDetails","logDetailsDefaultCursor","UnThemedLogDetails","getParser","parseMessage","rowEntry","parser","getFields","getLabelFromField","getValueFromField","getDerivedFields","getFieldLinks","getAllFields","derivedFields","fieldsMap","fieldHash","allFields","sortFieldsLinkFirst","getStatsForParsedField","buildMatcher","calculateFieldStats","getRows","showDuplicates","labelsAvailable","parsedFieldsAvailable","calculateLogsLabelStats","calculateStats","fieldA","fieldB","LogDetails","getLogRowContextStyles","gradientTop","gradientBottom","boxShadowColor","commonStyles","logs","LogRowContextGroupHeader","onLoadMoreContext","canLoadMoreRows","LogRowContextGroup","shouldScrollToBottom","setScrollTop","listContainerRef","LogRowContext","onOutsideClick","ClickOutsideWrapper","LogMessageAnsi","chunks","accumulated","character","outlineColor","positionRelative","rowWithContext","horizontalScroll","UnThemedLogRowMessage","onContextToggle","onToggleContext","contextIsOpen","showContextToggle","previewHighlights","needsHighlighter","findChunks","LogRowMessage","topVerticalAlign","UnThemedLogRow","showContext","showDetails","hasHoverBackground","toggleContext","addHoverBackground","clearHoverBackground","toggleDetails","renderLogRow","LogRow","UnThemedLogRows","renderAllTimer","renderAll","makeGetRows","processedRows","deduplicatedRows","rowLimit","dedupedRows","hasData","dedupCount","horizontalScrollWindow","firstRows","lastRows","LogRows","ToggleButtonGroup","labelClasses","buttonGroupClasses","ToggleButton","btnClassName","optionsToKeep","prevPanel","levels","migrateFromAngularSinglestat","previousVersion","fieldDefaults","newOptions","omit","migrateFromValueOptions","migrateOldThresholds","moveThresholdsAndMappingsToField","oldTitle","getCallToActionCardStyles","CallToActionCard","WithContextMenu","getContextMenuItems","isMenuOpen","setIsMenuOpen","setMenuPositon","DataLinksContextMenu","linkModelToContextMenuItems","InfoBox","branded","urlTitle","getInfoBoxStyles","wrapperBranded","docsLink","panelArtLight","panelArtDark","Badge","badge","sourceColor","FeatureInfoBox","featureState","getFeatureInfoBoxStyles","titleEl","FeatureBadge","getPanelStateBadgeDisplayModel","ErrorWithStack","errorInfo","componentStack","ErrorBoundary","ErrorBoundaryAlert","AlphaNotice","FormField","inputWidth","FormLabel","onReset","isConfigured","noRadiusInput","noRadiusButton","BasicAuthSettings","dataSourceConfig","secureJsonData","basicAuthPassword","basicAuthUser","secureJsonFields","HttpProxySettings","jsonData","tlsAuth","tlsAuthWithCACert","tlsSkipVerify","oauthPassThru","CertificationKey","hasCert","TLSAuthSettings","hasTLSCACert","tlsCACert","hasTLSClientCert","tlsClientCert","hasTLSClientKey","tlsClientKey","onResetClickFactory","newSecureJsonFields","onCertificateChangeFactory","newSecureJsonData","getCustomHeaderRowStyles","CustomHeaderRow","configured","_e","CustomHeadersSettings","updateSettings","onHeaderAdd","onHeaderChange","headerIndex","onHeaderReset","headerId","onHeaderRemove","ACCESS_OPTIONS","DEFAULT_ACCESS_OPTION","HttpAccessHelp","urlTooltip","defaultUrl","showAccessOptions","isAccessHelpVisible","setIsAccessHelpVisible","onSettingsChange","access","accessSelect","isValidUrl","notValidStyle","inputStyle","urlInput","keepCookies","cookies","basicAuth","withCredentials","Segment","useExpandableLabel","setExpanded","SegmentSelect","onClickOutside","SegmentAsync","selectPlaceholder","setSelectPlaceholder","loadedOptions","setLoadedOptions","SegmentInput","autofocus","setInputWidth","inputWidthStyle","initialExpanded","setWidth","Chart","scollableContent","drawer","titleWrapper","titleSpacing","closeOnMaskClick","scrollableContent","drawerStyles","setIsExpanded","currentWidth","maskClosable","getContainer","isHorizontal","trackColor","slider","cssCore","Slider","onAfterChange","formatTooltipResult","tooltipAlwaysVisible","RangeWithTooltip","createSliderWithTooltip","Range","tipProps","tipFormatter","TextArea","getTextAreaStyle","toIntegerOrUndefined","toFloatOrUndefined","oldProps","FieldConfigItemHeaderTitle","getFieldConfigItemHeaderTitleStyles","headerWrapper","Form","validateOnMount","validateFieldsOnMount","validateOn","useForm","handleSubmit","triggerValidation","formState","ValuePicker","isFullWidth","isPicking","setIsPicking","buttonEl","onCloseMenu","FieldNameMatcherEditor","useFieldDisplayNames","useSelectOptions","fieldNameMatcherItem","displayNames","fieldMatchersUI","getLegendStyles","getCheckboxStyles","labelStyles","getLabelStyles","checkmark","Checkbox","getButtonStyles","getInputStyles","checkbox","SelectButton","iconWrap","caretWrap","ButtonSelect","SelectBase","renderControl","NoOptionsMessage","hexToHsl","toHsl","hslToHex","toHexString","hexColors","hslColors","sortedHSLColors","chunkedHSLColors","sortedChunkedHSLColors","flattenedZippedSortedChunkedHSLColors","sortedColors","flattenDeep","zip","currRule","regexValidation","valueToValidate","TAG_COLORS","TAG_BORDER_COLORS","hash","djb2","scrollbarWidth","newStyles","MsOverflowStyle","getPreviousCousin","sibling","previousSibling","getRangeAt","Element","ownerDocument","renderOrCallToRender","itemToRender","isValidElement","XSSWL","xss","whiteList","sanitizeXSS","FilterXSS","unsanitizedString","braintreeSanitizeUrl","saveModel","useSelector","useDispatch","useAsyncFn","newUrl","getAllFormattedValueMappings","allFormattedValueMappings","allValueMappings","valueToTextMapping","isNullValueMap","valueAsNumber","valueToTextMappingAsNumber","addValueToTextMappingText","rangeToTextMapping","fromAsNumber","toAsNumber","addRangeToTextMappingText","mapping","getSelectStyles","multiValueContainerBg","multiValueColor","optionImage","optionDescription","optionBody","valueContainerMulti","multiValueContainer","SelectMenu","innerRef","SelectMenuOptions","renderOptionLabel","UnthemedValueContainer","maxVisibleValues","showAllSelectedWhenOpen","valueChildren","otherChildren","truncatedValues","renderContainer","ValueContainer","getInputControlStyles","focused","withPrefix","inputDisabled","InputControl","DropdownIndicator","findSelectedValue","CustomControl","onMenuClose","onMenuOpen","cacheOptions","closeMenuOnSelect","isOptionDisabled","onOpenMenu","openMenuOnFocus","tabSelectsValue","onChangeWithEmpty","ReactSelectComponent","ReactSelect","creatableProps","asyncSelectProps","hasValue","commonSelectProps","captureMenuScroll","menuShouldScrollIntoView","Creatable","AsyncCreatable","ReactAsyncSelect","MenuList","Group","Placeholder","selectedValuesCount","indicatorChildren","renderExtraValuesIndicator","IndicatorSeparator","Control","ClearIndicator","clearValue","LoadingIndicator","LoadingMessage","menuPortal","provided","hasEventListener","domNode","findDOMNode","contains","includeButtonPress","Dimensions","loadValues","loadKeys","completeDimensions","excludeUsedKeys","newDimensions","Alias","MetricsQueryFieldsEditor","namespaces","loadMetricNames","appendTemplateVariables","standardStatistics","getDimensionKeys","getDimensionValues","variableTypes","Orientation","Layout","childWrapper","HorizontalGroup","VerticalGroup","Container","grow","shrink","getContainerStyles","finalSpacing","marginCompensation","paddingSize","marginSize","QUERY_COMMANDS","NUMERIC_OPERATORS","detail","STRING_FUNCTIONS","DATETIME_FUNCTIONS","IP_FUNCTIONS","BOOLEAN_FUNCTIONS","AGGREGATION_FUNCTIONS_STATS","STATS_FUNCS","FIELD_AND_FILTER_FUNCTIONS","FUNCTIONS","tokenizer","comment","greedy","backticks","command","function","keyword","lookbehind","punctuation","whitespace","hitTypes","ValidationSrv","existingErrorMessage","nameLowerCased","hits","hit","validationSrv","useClientRect","setRect","prefixSuffix","inputWrapper","addon","addonAfter","addonBefore","prefixRect","prefixRef","suffixRect","suffixRef","asSuffix","scaled","prefixes","labelContent","chevron","labelProps","getSaveAsDashboardClone","hideControls","autoUpdate","SaveDashboardAsForm","$folder","copyTags","getFormValues","dashboardName","validateNewDashboardName","as","initialFolderId","initialTitle","enableCreateNew","useNewForms","variants","ThresholdMapper","conditions","AlertTabCtrl","initModel","for","_enableAlert","alertingMinIntervalSecs","alertingMinInterval","addNotificationSegment","thresholdChangedEventHandler","graphThresholdChanged","notifications","alertNotifications","validateModel","getNotificationIcon","an","newAlertRuleTag","alertRuleTags","tagName","checkFrequency","noDataState","alertingNoDataOrNullValues","executionErrorState","alertingErrorOrTimeout","frequency","defaultName","conditionModels","buildConditionModel","alertToGraphThresholds","addedNotification","notification","frequencyWarning","interval_to_seconds","evaluatorParamsChanged","firstTarget","foundTarget","cm","queryPart","reducerPart","conditionModel","alertTab","PanelEditorTabId","DisplayMode","Fill","Fit","Exact","MoveToFolderModal","onMoveItems","setFolder","selectedDashboards","getCheckedDashboards","moveDashboards","ending","freeInput","maxTags","confirmKeys","onTagExists","$tag","fadeIn","itemsArray","isSelect","multiple","objectItems","placeholderText","$container","build","makeOptionItemFunction","dontPushVal","pushVal","$existingTag","htmlEncode","findInputWrapper","inArray","removeAll","pop","isEnabled","nodeType","nodeValue","makeOptionFunction","processItems","success","sorter","highlighter","$inputWrapper","doGetCaretPosition","$prevTag","$nextTag","inputSize","elt","arg1","arg2","retVal","htmlEncodeContainer","oField","iCaretPos","oSel","createRange","moveStart","selectionStart","GRID_CELL_HEIGHT","GRID_CELL_VMARGIN","GRID_COLUMN_COUNT","REPEAT_DIR_VERTICAL","DEFAULT_PANEL_SPAN","DEFAULT_ROW_HEIGHT","MIN_PANEL_HEIGHT","PANEL_BORDER","SeriesColorPickerPopover","colorPickerProps","GELQueryType","gelTypes","math","resample","downsamplingTypes","upsamplingTypes","ExpressionQueryEditor","onSelectGELType","downsampler","upsampler","onSelectReducer","onSelectUpsampler","onSelectDownsampler","onRuleReducer","onExpressionChange","onRuleChange","ExpressionDatasourceApi","ExpressionDatasourceID","DataSourceWithBackend","SelectOption","aria-hidden","SelectComponent","creatableOptions","selectClassNames","selectComponents","onOpenMenuInternal","onCloseMenuInternal","classNamePrefix","WrapInTooltip","isOpenInternal","showTooltip","loadInitialValue","enableReset","searchHits","isEditor","newFolder","createNewFolder","folderName","createFolder","resetFolder","rootFolder","UnthemedModal","onClickBackdrop","modalHeader","renderDefaultHeader","modalHeaderClose","isLastQuery","SearchCheckbox","organizationSlice","organization","organizationLoaded","setOrganizationName","organizationReducer","backdropBackground","ScrollQLParser","GroupListener","groupNames","proj","fieldSpec","getStatsGroups","queryText","chars","InputStream","lexer","CommonTokenStream","buildParseTrees","groupListener","ParseTreeWalker","DEFAULT","walk","containerClass","rowGap","CloudWatchLogsQueryField","selectedLogGroups","logGroupNames","logGroup","availableLogGroups","invalidLogGroups","selectedRegion","loadingLogGroups","hint","fetchLogGroupOptions","logGroupNamePrefix","describeLogGroups","logGroups","onLogGroupSearch","searchTerm","actionMeta","matchingLogGroups","unionBy","onLogGroupSearchDebounced","componentWillMount","intersectionBy","nextQuery","getRegions","logGroupName","statsGroups","setSelectedLogGroups","setSelectedRegion","cloudwatchLanguageProvider","switchToMetrics","exploreId","onQueryFieldClick","_event","onOpenLogGroupMenu","checkForStatsQuery","exploreMode","isStatsQuery","fix","showError","useCloudWatchSyntax","useCloudwatchSyntax","CloudWatchLink","getExternalLink","toISOString","urlProps","timeType","editorString","isLiveTail","getActualRegion","CloudWatchLogsQueryEditor","SectionHeader","onSectionClick","getSectionHeaderStyles","setSectionExpanded","useLocalStorage","getSectionStorageKey","onSectionChecked","getSectionIcon","itemsFetching","getSectionStyles","itemProps","spinner","resultsContainer","listModeWrapper","disableWidth","innerElementType","noResults","labelRegexp","parseLabels","labelsByKey","labelsSets","uncommonLabels","labelKeys","cleanSelector","convertToMulti","convertToSingle","impressionsKey","impressionKey","imp","customLeftActions","customRightActions","DashNav","onFolderNameClick","onToggleTVMode","onOpenSettings","onStarDashboard","onPlaylistPrev","playlistSrv","onPlaylistNext","onPlaylistStop","stop","onDashboardNameClick","buttons","canStar","canShare","addCustomContent","isFullscreen","folderSymbol","mainIconClassName","renderLeftActionsButton","onAddPanel","showSettings","renderBackButton","renderDashboardTitleSearchButton","isPlaying","renderRightActionsButton","DashNavTimeControls","LdapSyncInfo","isSyncing","handleSyncClick","schedule","setStore","newStore","queryType","metricQuery","QueryType","METRICS","ensureGCEDefaultProject","onDataError","onDataResponse","sloQuery","defaultSLOQuery","SLO","decodeURIComponent","columnMap","addColumn","addRow","areRowsMatching","otherRow","foundFieldToMatch","dst","tableDataTables","columnsUnion","columnIndexMapper","flattenedRows","mapper","alteredRow","mergedRows","compactedRows","matchedRow","LoginLogo","LoginBackground","LoginBoxBackground","LoginTitle","GetLoginSubTitle","slogans","random","enumerable","makeFieldParser","MISSING_VALUE","addMissingFields","addMissingFieldsFor","initialLoading","lookupField","getLookupField","flatIds","getFlattenedSections","newIndex","selectedId","markSelected","loadPlugins","pluginsLoaded","pluginDashboardsLoad","dataSourceType","pluginDashboardsLoaded","panelPluginLoaded","emitDataRequestEvent","eventData","MetaAnalyticsEventName","DataRequest","datasourceId","dataSize","endTime","reportMetaAnalytics","emitDashboardViewEvent","DashboardView","manageDashboardsState","manageDashboardsReducer","mergeReducers","newAllChecked","db","DashboardActions","actionUrl","ManageDashboards","isDeleteModalOpen","setIsDeleteModalOpen","isMoveModalOpen","setIsMoveModalOpen","noFolders","useManageDashboards","labelClassName","packets","dataObservable","returnVal","callQueryMethod","packet","loadingState","combinedData","lodashMap","processResponsePacket","toDataQueryError","finalize","resolveCancelerIfExists","mapTo","STARTTIME","performance","timings","dataProcessingTime","transitionEnd","support","transEndEventNames","Dropdown","$el","clearMenus","getParent","hasClass","documentElement","insertBefore","$items","eq","noConflict","delegate","remote","isShown","isDefaultPrevented","enforceFocus","hideWithTransition","removeBackdrop","$backdrop","doAnimate","$target","eventIn","eventOut","triggers","fixTitle","hoverState","$tip","actualWidth","actualHeight","tp","hasContent","setContent","animation","getPosition","applyPlacement","replaceArrow","getTitle","$e","$arrow","disable","toggleEnabled","$ul","relatedTarget","activate","$active","$menu","listen","beginswith","caseSensitive","caseInsensitive","shift","$1","eventSupported","mouseenter","isSupported","suppressKeyPressRepeat","mousedover","Affix","affix","checkPosition","scrollHeight","offsetBottom","offsetTop","unpin","affixed","$spy","otherseries","openPolygon","findNextStart","start_i","end_i","assert","intersect","equal","intersectionPoint","topTraversal","right_i","top_left_x","top_left_y","top_right_x","top_right_y","bottom_left_x","bottom_left_y","bottom_right_x","bottom_right_y","top_delta_x","top_delta_y","bottom_delta_x","bottom_delta_y","bottomTraversal","findBelowSeries","validateInput","applyStateChanges","cur","optionsToRecord","applyLimit","updateDefaultSelection","updateAllSelection","optionsPickerSlice","availableOptions","optionsFromTag","nextIndex","filteredOptions","optionsPickerReducer","NavModelSrv","navItems","nav","getWarningNav","sectionId","itemId","parseQuery","keywords","nextState","getCheckedDashboardsUids","emptyResults","headerElement","isContentVisible","setIsContentVisible","getQueryOperationRowStyles","useUpdateEffect","titleElement","actionsElement","closeRow","collapseIcon","inlineList","getNotFoundModel","onlyChild","colorsPaletteInstance","buildColorDefinition","getColorDefinitionByName","getColorDefinition","hex","isHex","getColorByName","colorName","colorDefinition","greens","yellows","reds","blues","oranges","purples","DEFAULT_RANGE","DEFAULT_UI_STATE","showingTable","showingGraph","showingLogs","lastUsedDatasourceKeyForOrgId","exploreDatasource","exploreTargets","interpolateVariablesInQueries","exploreState","originPanelId","getSavedId","buildQueryTransaction","scanning","configuredQueries","combinedKey","lowLimit","getIntervals","generateKey","latency","ParseUrlStateIndex","ParseUiStateIndex","clearQueryKeys","isSegment","safeStringifyValue","space","parseUrlState","decodeURI","safeParseJson","ui","SegmentsStart","RangeFrom","RangeTo","parsedSegments","metricProperties","modeObj","uiState","Strategy","serializeStateToUrlParam","urlState","compact","generateEmptyQuery","generateNewKeyAndAddRefIdIfMissing","ensureQueries","allQueries","validKeys","hasNonEmptyQuery","updateHistory","updatedHistory","historyKey","getQueryKeys","datasourceInstance","newQueryKeys","primaryKey","rawRange","parseRawTime","getTimeRangeFromUrl","sortInDescendingOrder","refreshIntervalToSortOrder","logsResult","convertToWebSocketUrl","backend","stopQueryState","getFirstNonQueryRowSpecificError","queryErrors","getValueWithRefId","getFirstQueryErrorWithoutRefId","getVariableByOptions","createAdHocVariable","selectable","themes","onSubmitForm","homeDashboardId","onThemeChanged","onTimeZoneChanged","onHomeDashboardChanged","getFullDashName","prefs","defaultDashboardHit","queryForRecentDashboards","score","getBool","DashDB","handleSearchResult","UnthemedDashNavTimeControls","triggerForceUpdate","onChangeRefreshInterval","onMoveBack","onMoveForward","onChangeTimePicker","hasDelay","adjustedFrom","adjustedTo","nextRange","onZoom","getValidIntervals","timePickerValue","onMoveBackward","invitees","canInvite","externalUserMngLinkName","externalUserMngInfo","externalUserMngLinkUrl","usersSlice","usersLoaded","inviteesLoaded","setUsersSearchQuery","usersReducer","DashboardSource","InputType","initialImportDashboardState","updatedAt","inputs","isLoaded","importDashboardSlice","setGcomDashboard","Gcom","setJsonDashboard","clearDashboard","setInputs","constants","Constant","importDashboardReducer","internalOnChange","labelId","switchClassName","adminOptions","UserPermissions","currentAdminOption","onChangeClick","newIsGrafanaAdmin","onAdminOptionSelect","changeButtonContainerClass","e10","e5","e2","step0","step1","getScaledDecimals","getFlotTickSize","getFlotRange","panelMin","panelMax","grafanaTimeFormat","getPrecision","getStringPrecision","dotIndex","specialChars","escaped","currentChar","toNumberString","camelCase","ButtonContent","iconElement","buttonVariantStyles","variantStyles","getPropertiesForVariant","iconButton","LinkButton","pluginInfoCache","getPluginSettings","DashboardSrv","onRemovePanel","parsedJson","setDashboardSrv","throwWhenMissing","includeNewVariable","AppendedVectors","startAt","FormattedVector","fieldNameMatcher","getOptionsDisplayText","multipleFieldNamesMatcher","uniqueNames","regexpFieldNameMatcher","patternToRegex","regexpOrMultipleNamesMatcher","regexpMatcher","namesMatcher","frameNameMatcher","getFieldNameMatchers","getFrameNameMatchers","combinedComponents","valuesWithLabels","existingTitle","hasConfigTitle","frameNamesDiffer","frameNameAdded","labelsAdded","singleLabelName","singleName","getSingleLabelName","calculateFieldDisplayName","seriesToColumns","keyFieldMatch","keyField","findKeyField","sourceField","newField","resultFrame","keyFieldTitle","byKeyField","newFieldTitle","keyValue","keyValueStrings","keyValueAsString","otherColumnName","matchTitle","alertRulesSlice","loadAlertRules","loadedAlertRules","alertRulesViewModel","stateText","stateIcon","stateAge","executionError","evalData","noData","convertToAlertRule","alertRulesReducer","alertRules","stylesCreator","getHoverColor","pixelSize","anyFieldMatcher","anyMatch","anyFrameMatcher","frameMatchers","allFieldsMatcher","allMatch","allFramesMatcher","notFieldMatcher","invertMatch","notFrameMatcher","alwaysFrameMatcher","neverFieldMatcher","neverFrameMatcher","alwaysFieldMatcherInfo","alwaysMatch","alwaysFrameMatcherInfo","neverFieldMatcherInfo","neverMatch","neverFrameMatcherInfo","getFieldPredicateMatchers","getFramePredicateMatchers","tagStyle","countLabel","PopoverController","hideTimeout","sortByKeys","isPlainObject","sortedObject","DashboardMigrator","dashboardModel","oldVersion","schemaVersion","panelUpgrades","leftMin","leftMax","y_format","y_formats","y2_format","maxId","getNextPanelId","aliasYAxis","pulldowns","allFormat","getNextQueryLetter","mathExpr","asExpr","templateVariable","leftLogBase","leftYAxisLabel","rightMin","rightMax","rightLogBase","rightYAxisLabel","threshold1","thresholdLine","threshold1Color","threshold2","threshold2Color","sharedCrosshair","upgradeToGridLayout","factors","maxPerRow","upgradePanelLink","updateLinks","updateVariablesSyntax","wasAngularTable","wasReactTable","currents","yPos","nextRowId","showRows","showTitle","rowGridHeight","getGridHeight","rowPanel","rowPanelModel","rowArea","RowArea","panelPos","getPanelPosition","rowYPos","area","startPlace","endPlace","callOnce","slugifyForUrl","dashUri","seriesName1","fieldName1","getVariablesFromState","revision","ensureListExist","gnetId","initMeta","updateSchema","addBuiltInAnnotationQuery","sortPanelsByGridPos","DEFAULT_ANNOTATION_COLOR","nonPersistedProperties","updateTemplatingSaveModelClone","originalTime","panelInEdit","updateTemplatingSaveModel","updateAngularTemplatingSaveModel","originalTemplating","originalVariables","currentVariables","panelInView","sourcePanel","getEditClone","setIsViewing","canEditPanel","panelA","panelB","isSnapshotTruthy","hasVariables","iteration","panelsToRemove","pull","repeatsProcessed","cleanUpRepeats","repeatPanel","rowPanels","rowPanelIndex","getRowPanels","cleanUpRowRepeats","sourcePanelIndex","sourceRowPanel","insertPos","updateRepeatedPanelIds","getPanelRepeatVariable","getSelectedVariableOptions","getPanelRepeatClone","yOffset","repeatRow","setScopedVars","variableOption","optionIndex","getRowRepeatClone","getRowHeight","panelBelowIndex","cloneRowPanel","maxPos","maxBy","removePanels","toggleRow","submenuEnabled","submenuVisibilityChanged","newPanel","hasRepeat","yDiff","pushDownAmount","processRowRepeats","rowExpanded","rowCollapsed","cloneVariablesFrom","hasVariablesChanged","viewHeight","kioskMode","currentGridHeight","visibleHeight","scaleFactor","panelsWithLegends","onCount","panelLegendsOn","sharedContextCache","Parser","ParserATNSimulator","QueryContext","invokingState","ParserRuleContext","RULE_query","LogQueryContext","RULE_logQuery","LogAestheticContext","RULE_logAesthetic","_logAestheticOp","aes","LogSourceStageContext","RULE_logSourceStage","_logSource","LogStatsStageContext","RULE_logStatsStage","LogOpContext","RULE_logOp","LogAestheticOpContext","RULE_logAestheticOp","aesFun","_rawId","_fieldId","LogSourceContext","RULE_logSource","TimeExprContext","RULE_timeExpr","NowTimeExprContext","RULE_nowTimeExpr","RelativeTimeExprContext","RULE_relativeTimeExpr","PosRelativeTimeExprContext","copyFrom","NegRelativeTimeExprContext","Iso8601TimeExprContext","RULE_iso8601TimeExpr","datetime","uqdatetime","EpochTimeExprContext","RULE_epochTimeExpr","BareSpaceDelimitedContext","RULE_bareSpaceDelimited","LogStatsContext","RULE_logStats","_statsExpr","_statsGroupField","StatsExprContext","RULE_statsExpr","StatsGroupFieldContext","RULE_statsGroupField","StatsGroupFieldIdContext","StatsGroupFieldProjectionContext","LogOpFieldsContext","RULE_logOpFields","LogOpFieldsDisplayContext","_fieldSpec","LogOpFieldsFieldsContext","FieldSpecContext","RULE_fieldSpec","LogOpParseContext","RULE_logOpParse","_aliasId","re","LogOpSearchContext","RULE_logOpSearch","ImplicitLogOpSearchContext","RULE_implicitLogOpSearch","SearchExprContext","RULE_searchExpr","SearchExprTermContext","SearchExprNotContext","SearchExprAndContext","SearchExprNestedContext","SearchExprOrContext","SearchTermContext","RULE_searchTerm","bstr","sdqstr","ssqstr","cdqstr","csqstr","LogOpFilterContext","RULE_logOpFilter","LogOpSortContext","RULE_logOpSort","SortExprContext","RULE_sortExpr","SortExprDescContext","did","SortExprAscContext","aid","LogOpLimitContext","RULE_logOpLimit","LogOpLimitHeadContext","LogOpLimitTailContext","ExpressionRootContext","RULE_expressionRoot","ExpressionContext","RULE_expression","ExpressionAddSubContext","bop","ExpressionEqContext","ExpressionCompContext","ExpressionExpoContext","ExpressionLikeContext","not","rhs","ExpressionTermContext","ExpressionNegContext","ExpressionNotContext","ExpressionPosContext","ExpressionMulDivModContext","ExpressionAndContext","lhs","ExpressionNestedContext","ExpressionOrContext","ExpressionInContext","TermContext","RULE_term","TermStrContext","TermIdContext","fid","TermFnContext","TermNumContext","LikeTermContext","RULE_likeTerm","FuncContext","RULE_func","FunctionWithArgsContext","fun","_functionArg","Args","FunctionWithNoArgsContext","FunctionArgContext","RULE_functionArg","FunctionArgFieldClauseContext","FunctionArgTimePeriodContext","ArrayContext","RULE_array","ArrayElemContext","RULE_arrayElem","arrayElement","NumberContext","RULE_number","numF","numI","StringContext","RULE_string","StringOrBareStringContext","RULE_stringOrBareString","RegexContext","RULE_regex","RegexStringContext","RULE_regexString","LogIdContext","RULE_logId","keyw","keywt","FieldIdContext","RULE_fieldId","sid","AliasIdContext","RULE_aliasId","UserIdContext","RULE_userId","usid","qsid","UnquotedUserIdContext","RULE_unquotedUserId","uubid","uuaid","UnquotedUserAtIdContext","RULE_unquotedUserAtId","UnquotedUserBareIdContext","RULE_unquotedUserBareId","QuotedUserIdContext","RULE_quotedUserId","qid","SystemIdContext","RULE_systemId","UnquotedSystemIdContext","RULE_unquotedSystemId","udid","QuotedSystemIdContext","RULE_quotedSystemId","ResultIdContext","RULE_resultId","FunctionIdContext","RULE_functionId","RawIdContext","RULE_rawId","KeywordsContext","RULE_keywords","TimeUnitKeywordsContext","RULE_timeUnitKeywords","TimeUnitYearsContext","TimeUnitMinutesContext","TimeUnitHoursContext","TimeUnitWeeksContext","TimeUnitDaysContext","TimeUnitMonthsContext","TimeUnitQuartersContext","TimeUnitMilliSecondsContext","TimeUnitSecondsContext","logQuery","getTypedRuleContext","getToken","enterRule","exitRule","_ctx","enterOuterAlt","RecognitionException","exception","_errHandler","reportError","recover","logSourceStage","logStatsStage","resultId","sync","_input","LA","getTokens","logAestheticOp","getTypedRuleContexts","logAesthetic","_la","logSource","implicitLogOpSearch","logOp","_alt","adaptivePredict","ATN","INVALID_ALT_NUMBER","logStats","logOpFields","logOpParse","logOpFilter","logOpSearch","logOpSort","logOpLimit","NoViableAltException","functionId","rawId","fieldId","logId","timeExpr","nowTimeExpr","relativeTimeExpr","epochTimeExpr","iso8601TimeExpr","timeUnitKeywords","LT","recoverInline","reportMatch","consume","stringOrBareString","bareSpaceDelimited","statsExpr","statsGroupField","expressionRoot","aliasId","searchExpr","_p","_parentctx","_parentState","enterRecursionRule","_parseListeners","triggerExitRuleEvent","pushNewRecursionContext","precpred","FailedPredicateException","unrollRecursionContexts","sortExpr","likeTerm","array","_prevctx","regexString","functionArg","arrayElem","systemId","unquotedUserId","quotedUserId","unquotedUserBareId","unquotedUserAtId","unquotedSystemId","quotedSystemId","searchExpr_sempred","expression_sempred","loadUserProfile","loadUserOrgs","loadUserSessions","loadLdapSyncStatus","loginOrEmail","patch","browserVersion","device","authTokenId","syncStatus","loadLdapState","loadUserMapping","userInfo","clearUserError","clearUserMappingInfo","fetchUsers","fetchUsersWithDebounce","changeQuery","changePage","ExploreId","onUpdateDatasourceOption","updateDatasourcePluginOption","onUpdateDatasourceJsonDataOption","updateDatasourcePluginJsonDataOption","onUpdateDatasourceSecureJsonDataOption","updateDatasourcePluginSecureJsonDataOption","onUpdateDatasourceJsonDataOptionSelect","onUpdateDatasourceJsonDataOptionChecked","onUpdateDatasourceSecureJsonDataOptionSelect","onUpdateDatasourceResetOption","updateDatasourcePluginResetOption","CSVHeaderStyle","ParseState","file","oldName","csv","CSVReader","isName","ReadingRows","addFieldFor","InHeader","Starting","onHeader","appendRow","onRow","papacfg","dynamicTyping","skipEmptyLines","comments","Papa","writeValue","quoteChar","delimiter","makeFieldWriter","getHeaderLine","isType","newline","toCSV","encoding","headerStyle","writers","LOGFMT_REGEXP","addLogLevelToSeries","lineIndex","LogsParsers","logfmt","escapeRegExp","extractor","rowsWithField","countsByValue","countBy","getSortedCounts","rowsWithLabel","nonEmptyValues","objRemoveUndefined","returnTimeStep","encodeURIComponentAsAngularJS","pctEncodeSpaces","rbracket","DocsId","stringToAppend","searchParamsSegments","keyValuePair","stripExtraChars","buildParamsFromVariables","getTimeRangeForUrl","valueCalc","ConfigContext","ConfigConsumer","ThemeProvider","provideConfig","GrafanaBootConfig","windowTitlePrefix","newPanelTitle","allowOrgCreate","alertingEnabled","exploreEnabled","samlEnabled","viewersCanEdit","editorsCanAdmin","pluginsToPreload","expressions","newEdit","playlist_timespan","unsaved_changes_warning","env","isEnterprise","grafanaBootData","SystemJS","System","loadPluginCss","getEchoSrv","addEvent","EchoEventType","MetaAnalytics","toDataQueryResponse","dr","dataframes","HealthStatus","applyTemplateVariables","datasourceRequest","callHealthCheck","OK","setLocale","language","getLocaleData","localeData","isMoment","formatInput","PANEL_EDITOR_UI_STATE_STORAGE_KEY","DEFAULT_PANEL_EDITOR_UI_STATE","isPanelOptionsVisible","rightPaneSize","topPaneSize","pluginsSlice","getPanel","getSourcePanel","initDone","shouldDiscardChanges","updateEditorInitState","setEditorPanelData","setDiscardChanges","setPanelEditorUIState","closeCompleted","selectorName","serviceId","sloId","SLOQueryEditor","getSLOServices","getServiceLevelObjectives","sloIds","slos","slo","goal","initClipboardJS","onError","clipboardjs","ClipboardJS","myRef","getElementType","angularModules","AuthType","MetricFindQueryTypes","authTypes","JWT","GCE","sidemenuSmallBreakpoint","defaultTransitionStyles","transitionDelay","Popover","transitionState","scheduleUpdate","plotDashes","dashOnLength","dashOffLength","dashRemainder","dashOn","dashOffset","ax1","ay1","ax2","ay2","lineSegmentOffset","deltaX","deltaY","remainder","segmentLength","ysign","appNotificationsSlice","appNotificationsReducer","renderTrack","hideTrack","passedProps","renderThumb","thumb","renderTrackHorizontal","renderTrackVertical","renderThumbHorizontal","renderThumbVertical","renderView","updateScroll","updateAfterMountMs","updateAfterMount","autoHideTimeout","hideTracksWhenNotNeeded","onScroll","autoHeight","autoHideDuration","maxDepth","currentDepth","isarray","safe","isobject","groupOptions","sel","TeamPicker","AddPermissions","onTypeChanged","onUserSelected","onTeamSelected","onAddPermission","getCleanState","data-save-permission","showPermissionLevels","isHandledError","ConfirmPluginDashboardSaveModal","getConfirmPluginDashboardSaveModalStyles","errorStatus","modalButtonRow","showDashSearch","hideDashSearch","hideDashEditor","dashboardFetchStart","playlistStarted","playlistStopped","elasticQueryUpdated","layoutModeChanged","fieldTypeMatcher","byType","numericMatcher","timeMatcher","refIdMacher","stackBases","stackSums","getStackSums","_data","data_len","sums","key_idx","value_idx","newPoints","OptionsUIRegistryBuilder","AnnotationsEditorCtrl","annotationDefaults","showIn","getAnnotationSources","currentAnnotation","newDatasource","currentDatasource","currentIsNew","datasourceChanged","isPanelAlert","AnnotationsSrv","clearPromiseCaches","globalAnnotationsPromise","alertStatesPromise","getGlobalAnnotations","getAlertStates","panelFilterId","dedup","eventsById","eventGroup","head","dedupAnnotations","dsPromises","translateQueryResult","datasourcePromise","annotationQuery","isRegion","EventEditorCtrl","tryEpochToMoment","timeFormated","updateAnnotationEvent","saveAnnotationEvent","deleteAnnotationEvent","$__alerting","ALERTING_COLOR","$__ok","OK_COLOR","$__no_data","NO_DATA_COLOR","$__pending","PENDING_COLOR","$__editing","colorString","REGION_FILL_ALPHA","addRegionMarking","annotationTooltipDirective","sanitizeString","titleStateClass","alertId","reactContainer","locals","$contextSrv","routeInfo","$$route","WrapInProvider","variableRegexExec","variableString","getSearchFilterScopedVar","wildcardChar","__searchFilter","isMatchingVariable","varMatch","isLoadingPluginDashboards","setPluginsSearchQuery","pluginsReducer","colorPickerFactory","popover","pickerTriggerRef","popoverElement","SeriesColorPicker","getThemeColors","formBackground","getStyle","TimePickerTitle","getFooterStyles","getBodyStyles","getHeaderStyles","TimePickerCalendar","Body","onCalendarChange","dateInfo","useOnCalendarChange","fromAsDate","toDate","toAsDate","inputToValue","selectRange","next2Label","prev2Label","tileClassName","nextLabel","prevLabel","onApply","TimeRangeForm","roundup","valueToState","setFrom","setTo","onFocus","eventToState","valueAsString","TimeRangeOption","getOptionsStyles","TimeRangeList","placeholderEmpty","keyForOption","mapOptionToTimeRange","leftSide","getNarrowScreenStyles","getFullScreenStyles","getEmptyListStyles","TimePickerContentWithScreenSize","historyOptions","mapRangeToTimeOption","mapToHistoryOptions","quickOptions","otherOptions","TimePickerContent","useMedia","NarrowScreenForm","setCollapsed","FullScreenForm","EmptyRecentList","caretIcon","clockIcon","noRightBorderStyle","UnthemedTimeRangePicker","timeSyncButton","isSynced","hasAbsolute","syncedTimePicker","timePickerIconClass","timePickerButtonClass","TimePickerButtonLabel","ZoomOutTooltip","TimePickerTooltip","formattedRange","adjustedTimeRange","refMounted","LdapPage","elements","fetchUserMapping","onClearUserError","fetchLDAPStatus","cleanUpAction","LoadDashboardCtrl","dashboardLoaderSrv","$browser","loadDashboard","initDashboard","getDashboardBySlug","homeDash","redirectUri","NewDashboardCtrl","handlers","UserSignup","loginServices","oauthEnabled","saml","google","azuread","github","gitlab","grafanacom","grafana_com","hrefName","okta","generic_oauth","getServiceStyles","LoginServiceButtons","serviceElementsEnabled","serviceElements","LoginDivider","forgottenPasswordStyles","submitButton","LoginForm","displayForgotPassword","ChangePassword","onSkip","passwords","LoginPage","loginStyles","getLoginStyles","loginContent","loginLogoWrapper","loginLogo","mainTitle","loginOuterBox","loginInnerBox","enterAnimation","flyInAnimation","keyframes","LoadingChunkPlaceHolder","ErrorLoadingChunk","loadComponentHandler","pastDelay","SafeDynamicImport","importStatement","LoadableComponent","Loadable","setupAngularRoutes","$routeProvider","$locationProvider","html5Mode","importDashboardPage","pageClass","Home","reloadOnSearch","Normal","New","SignupPage","redirectTo","otherwise","applyRouteRegistrationHandlers","Echo","flushInterval","backends","logDebug","flush","addBackend","_meta","getMeta","supportedEvents","sessionId","userSignedIn","screenSize","windowSize","screen","userAgent","navigator","timeSinceNavigationStart","setInterval","reportPerformance","Performance","PerformanceBackend","AngularLoader","compiledElem","getScope","applicationSlice","logActions","toggleLogActions","applicationReducer","application","ResultProcessor","timeSeriesToShowInGraph","isTimeSeriesCloudWatch","isTimeSeries","shouldShowInVisualisationType","onlyTables","frameA","frameB","frameARefId","frameBRefId","mergedTable","visualisation","preferredVisualisationType","makeExploreItemState","containerWidth","requestedDatasourceName","datasourceLoading","datasourceMissing","scanRange","queryKeys","supportedModes","isPaused","urlReplaced","queryResponse","createEmptyQueryResponse","initialExploreItemState","initialExploreState","syncedTimes","richHistory","itemReducer","nextQueries","logsHighlighterExpressions","graphResult","tableResult","live","Streaming","eventBridge","newMetadata","lokiVersionMetadata","v0","updatedDatasourceInstance","getModesForDatasource","newMode","modification","modifier","nextQueryKeys","processQueryResponse","getGraphResult","getTableResult","getLogsResult","updateChildRefreshState","queryState","currentMode","supportsGraph","supportsLogs","supportsTracing","tracing","Tracing","explore","targetSplit","itemState","leftState","rightState","force","exploreItemState","combineReducers","rootReducers","sharedReducers","alertingReducers","teamsReducers","apiKeysReducers","foldersReducers","dashboardReducers","exploreReducers","pluginReducers","dataSourcesReducers","usersReducers","userReducers","organizationReducers","ldapReducers","templatingReducers","importDashboardReducers","addedReducers","recursiveCleanState","stateSlice","stateKey","GrafanaCtrl","utilSrv","bridgeSrv","keybindingSrv","angularLoader","setAngularLoaderInterface","createLogger","appReducer","middleware","reduxDefaultMiddleware","getDefaultMiddleware","thunk","serializableCheck","immutableCheck","reduxConfigureStore","stateSelector","devTools","preloadedState","configureStore","localScope","callerScope","setViewModeBodyClass","grafanaAppDirective","drops","lastActivity","activeUser","checkForInActiveUser","userActivityDetected","capture","passive","clickAutoHide","clickAutoHideParent","VariableEditorCtrl","namePattern","optionsLimit","refreshOptions","setNewMode","sameName","duplicate","createVariableFromModel","datasourceTypes","typeChanged","oldIndex","VariableSrv","updateUrlParamsWithCurrentVariables","defer","variableInitialized","ctor","isVariableUrlValueDifferentFromCurrent","IntervalVariable","updateOptionsFromMetricFindQuery","updateTags","tagKey","addAllOption","supportsMulti","DatasourceVariable","CustomVariable","AdhocVariable","TextBoxVariable","AppPageCtrl","initPage","appModel","pluginNav","getNav","pluginDirectiveLoader","relativeTemplateUrlToAbs","loadPanelComponentInfo","componentInfo","bindings","class","panelPlugin","templatePromise","cached","getTemplate","registerPluginComponent","directiveName","$broadcast","appendAndCompile","dsMeta","datasourceMeta","onModelChanged","appPlugin","appEditCtrl","getModule","loadComponent","variableQueryEditorLoader","UnsavedChangesModal","onDiscard","ChangeTracker","originalCopyDelay","discardChanges","gotoNext","open_modal","baseLen","absUrl","nextUrl","originalPath","onbeforeunload","ignoreChanges","hasChanges","fromExplore","fromScript","fromFile","dashData","cleanDashboardFromIgnoredChanges","currentTimepicker","originalTimepicker","unsavedChangesSrv","tracker","DashboardLoaderSrv","isSnapshot","dashboardNotFound","_loadScriptedDashboard","_dashboardLoadFailed","isFolder","addDashboardImpression","_executeScript","scriptResult","Function","scriptFunc","HistoryListCtrl","historySrv","appending","canCompare","onDashboardSaved","resetFromSource","getLog","revisions","getRelativeTime","newInfo","baseInfo","isNewLatest","diffType","calculateDiff","getHistoryList","rev","createdDateString","created","ageString","formatBasicDate","basic","restoreConfirm","restoreDashboard","HistorySrv","AdHocFiltersCtrl","removeTagFilterSegment","buildSegmentModel","updateVariableModel","filterIndex","hasFakes","setFilters","RowOptionsCtrl","DashboardPermissions","onOpenAddPermissions","isAdding","onCancelAddPermission","PermissionsInfo","AddPermission","PlaylistsCtrl","playlists","startUrl","playlist","removePlaylistConfirmed","PlaylistSearchCtrl","searchDashboards","tagsMode","prom","dashboardResult","tagResult","searchStarted","queryParamsToPreserve","PlaylistSrv","numberOfLoops","cancelPromise","filteredParams","pickBy","nextDashboardUrl","validPlaylistUrl","playlistId","storeUnsub","storeUpdated","PlaylistEditCtrl","filteredDashboards","filteredTags","playlistItems","dashboardresult","tagresult","playlistItem","listPlaylistItem","filterFoundPlaylistItems","listedPlaylistItem","currentPosition","newPosition","movePlaylistItem","grafanaRoutes","$document","panelScrollbar","__proto__","directiveModule","directiveCache","panelEditorTab","dynamicDirectiveSrv","QueryRowCtrl","queryCtrl","canCollapse","dashRepeatOptionDirective","optionChanged","PanelLinksEditorCtrl","addLink","queryStr","dashboardChanged","deleteLink","SelectOrgCtrl","setUsingOrg","AdminEditUserCtrl","newOrg","getUser","getUserSessions","user_id","revokeUserSession","revokeAllUserSessions","setPassword","passwordForm","updatePermissions","userForm","updateOrgUser","orgUser","removeOrgUser","orgsSearchCache","searchOrgs","addOrgForm","orgInfo","actionEndpoint","AdminEditOrgCtrl","getOrg","getOrgUsers","orgUsers","orgDetailsForm","AdminHomeCtrl","AlertNotificationEditCtrl","testSeverity","sendReminder","disableResolveMessage","httpMethod","autoResolve","uploadImage","getFrequencySuggestion","notifiers","notifier","getNotifierTemplateId","optionsTemplate","notifierTemplateId","theForm","deleteNotificationConfirmed","uploadDashboardDirective","onUpload","btnText","isDefined","wnd","File","FileReader","FileList","files","reader","onload","readAsText","ProfileCtrl","suggestUrl","noDirectAccess","showAccessOption","datasourceSetting","reduceTransformRegistryItem","FilterByNameTransformerEditor","onFieldToggle","isRegexValid","initOptions","configuredOptions","allNames","filterFieldsByNameTransformRegistryItem","FilterByRefIdTransformerEditor","filterFramesByRefIdTransformRegistryItem","OrganizeFieldsTransformerEditor","getAllFieldNamesFromDataFrames","orderedFieldNames","orderFieldNamesByIndex","onToggleVisibility","shouldExclude","onDragEnd","startIndex","endIndex","reorderToIndex","onRenameField","droppableId","droppableProps","renamedFieldName","DraggableFieldName","getFieldNameStyles","draggableId","draggableProps","dragHandleProps","draggable","removed","nameByIndex","organizeFieldsTransformRegistryItem","seriesToFieldsTransformerRegistryItem","fieldNameOptions","onSelectField","calculationModes","CalculateFieldTransformerEditor","onToggleReplaceFields","onAliasChanged","updateReduceOptions","onStatsChange","updateBinaryOptions","onBinaryLeftChanged","onBinaryRightChanged","onBinaryOperationChanged","foundLeft","foundRight","leftNames","rightNames","renderBinaryOperation","renderReduceRow","calculateFieldTransformRegistryItem","labelsToFieldsTransformerRegistryItem","getStandardTransformers","extensionsIndex","preBootModules","registerFunctions","ngModuleDependencies","$controllerProvider","$compileProvider","$filterProvider","$httpProvider","$provide","preAssignBindingsEnabled","debugInfoEnabled","useApplyAsync","decorator","$delegate","useModule","bootstrap","isIE","isEdge","isFirefox","isChrome","isEdgeVersion","vendor","modulePath","setEchoSrv","ttiPolyfill","getFirstConsistentlyInteractive","tti","paintMetrics","getEntriesByType","registerEchoBackend","initEchoSrv","requires","variableLookup","templateizeDatasourceUsage","datasourceVariable","refName","processPanel","panelDef","annotationDef","newObj","inlines","Text","Document","parseHeaders","isAppJson","isContentTypeApplicationJson","parseBody","credentials","parseHeaderByMethodFactory","methodPredicate","canParse","headerParsers","Headers","contentType","URLSearchParams","serializeParams","arrayValue","serializedParams"],"mappings":"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AO,UAAEpM,EAAMqW,KAAKvD,gBAAb,aAAE,EAAqB1G,aAX7B,CAC/ClM,GAAI,SACJM,KAAM,SACNk8B,YAAa,0BACbkT,OAAQM,MAUwC,CAChDhwC,GAAI,OACJM,KAAM,OACNk8B,YAAa,oBACbkT,OAAQ9B,IAUoD,CAC5D5tC,GAAI,WACJM,KAAM,WACNk8B,YAAa,iCACbkT,OAAQjE,GAXwD,CAChEzrC,GAAI,aACJM,KAAM,aACNk8B,YAAa,6BACbkT,OAAQ/B,IAiB6C,CACrD3tC,GAAI,QACJM,KAAM,QACNk8B,YAAa,6BACbkT,OAAQ5B,IAXyC,CACjD9tC,GAAI,QACJM,KAAM,QACNk8B,YAAa,yBACbkT,OAAQtB,IAUiD,CACzDpuC,GAAI,eACJM,KAAM,eACNovC,OAAQP,GACR3S,YAAa,O,qBCjSjB,IAAI/lB,EAAO,sEAEXmE,OAAOC,QAAQC,OAAO,MAAMC,IAAI,CAAC,iBAAkB,SAASC,GAAKA,EAAEC,IAAIxE,EAD5D,4HAEXqE,EAAOI,QAAUzE,G,oCCmHjB,kCAAO,IAAMw5B,EAAoB,iBAAkB,CACjD,gBACA,UACA,kBACA,WACA,UACA,aACA,SACA,aACA,cACA,MACA,WACA,aACA,SACA,QACA,YACA,QACA,eACA,iBACA,cACA,cACA,cACA,SACA,gBACA,WACA,eACA,SACA,uBACA,QACA,SACA,eACA,gBACA,eACA,YACA,UACA,UACA,QACA,eACA,OACA,OACA,SACA,YACA,eACA,aACA,WACA,cACA,cACA,cACA,SACA,WACA,mBACA,WACA,SACA,aACA,eACA,aACA,OACA,cACA,iBACA,MACA,OACA,OACA,OACA,OACA,SACA,UACA,WACA,cACA,eACA,OACA,QACA,iBACA,UACA,gBACA,OACA,WACA,OACA,SACA,OACA,SACA,mBACA,YACA,YACA,OACA,OACA,eACA,gBACA,cACA,MACA,OACA,OACA,UACA,OACA,MACA,YACA,UACA,cACA,aACA,SACA,oBACA,QACA,SACA,cACA,eACA,QACA,OACA,QACA,cACA,aACA,WACA,mBACA,W,oCCrOF,mFAQapM,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KAAK+mB,mBAE7C,kBAAC,YAAD,CAAW+1B,QAAQ,MACjB,kBAAC,kBAAD,CAAiBlQ,QAAQ,KAAK3C,QAAQ,UACpC,kBAAC,SAAD,CAAQ/oC,QAAQ,UAAUC,QAASnB,KAAKggF,gBAAxC,uBAGA,kBAAC,SAAD,CAAQ9+E,QAAQ,YAAYC,QAASnB,KAAKwD,UAA1C,iBA3CZ,GAAmC7B,kB,uBChMnC,IAAIi1D,EAAS,EAAQ,QAEjBqpB,EAAgB,CAClB,YACA,sBACA,qBACA,gCACA,+BACA,oBACA,qBACA,oBACA,qBACA,yBACA,sCACA,sCACA,sCACA,sCACA,sCACA,sCACA,sCACA,sCACA,wCACA,sCACA,sCACA,sCACA,sCACA,0BACA,oBACA,qBACA,oBACA,qBACA,oBACA,qBACA,oBACA,qBACA,oBACA,qBACA,oBACA,eACA,mBACA,eACA,eACA,eACA,kBACA,8BACA,8BACA,uBACA,wBACA,8BACA,oBACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,oBACA,uBACA,sBACA,wBACA,yBACA,uBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,yBACA,0BACA,yBACA,8BACA,wBACA,0BACA,0BACA,uBACA,0BACA,uBACA,0BACA,uBACA,0BACA,uBACA,uBACA,yBACA,uBACA,uBACA,yBACA,sBACA,uBACA,uBACA,uBACA,uBACA,uBACA,yBACA,0BACA,0BACA,mBACA,mBACA,eACA,kBACA,gBACA,eACA,gBACA,iBACA,eACA,eACA,kBACA,gBACA,eACA,kBACA,gBACA,kBACA,gBACA,gBACA,gBACA,mBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,mBACA,eACA,mBACA,eACA,eACA,mBACA,eACA,eACA,kBACA,gBACA,eACA,kBACA,eACA,mBACA,wBACA,qBACA,kCACA,qDACA,kBACA,qBACA,uBACA,oBACA,eACA,eACA,eACA,eACA,oBACA,mBACA,kBACA,eACA,oBACA,iBACA,uBACA,mCACA,4BACA,8BACA,6BACA,4BACA,8BACA,8BACA,oBACA,gBACA,iBACA,eACA,eACA,eACA,eACA,eACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,iBACA,gBACA,eACA,eACA,eACA,eACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,gBACA,iBACA,eACA,eACA,eACA,kBACA,gBACA,gBACA,kBACA,eACA,iBACA,iBACA,gBACA,eACA,gBACA,eACA,gBACA,gBACA,gBACA,gBACA,eACA,kBACA,gBACA,gBACA,gBACA,kBACA,gBACA,gBACA,gBACA,eACA,eACA,gBACA,iBACA,eACA,gBACA,gBACA,gBACA,eACA,gBACA,gBACA,eACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,iBACA,eACA,iBACA,gBACA,gBACA,iBACA,eACA,iBACA,gBACA,gBACA,iBACA,eACA,iBACA,gBACA,iBACA,eACA,gBACA,iBACA,gBACA,gBACA,iBACA,eACA,iBACA,gBACA,gBACA,iBACA,eACA,gBACA,iBACA,gBACA,iBACA,eACA,gBACA,gBACA,eACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,eACA,gBACA,gBACA,gBACA,eACA,eACA,gBACA,gBACA,gBACA,eACA,gBACA,gBACA,gBACA,eACA,eACA,gBACA,gBACA,gBACA,eACA,gBACA,gBACA,eACA,eACA,gBACA,gBACA,eACA,eACA,gBACA,iBACA,eACA,gBACA,gBACA,gBACA,gBACA,eACA,eACA,gBACA,eACA,eACA,iBACA,eACA,eACA,gBACA,gBACA,gBACA,eACA,gBACA,eACA,iBACA,eACA,gBACA,gBACA,gBACA,gBACA,eACA,eACA,iBACA,gBACA,eACA,gBACA,gBACA,gBACA,eACA,kBACA,eACA,eACA,eACA,iBACA,mBACA,eACA,eACA,eACA,eACA,eACA,eACA,iBACA,eACA,eACA,iBACA,kBACA,eACA,iBACA,iBACA,eACA,eACA,eACA,eACA,gBACA,eACA,gBACA,gBACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,iBACA,eACA,eACA,iBACA,eACA,eACA,eACA,eACA,mBACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,gBACA,eACA,eACA,kBACA,kBACA,iBACA,kBACA,gBACA,kBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,gBACA,iBACA,iBACA,kBACA,mBACA,gBACA,eACA,eACA,mBACA,iBACA,eACA,eACA,iBACA,eACA,gBACA,eACA,eACA,eACA,eACA,mBACA,eACA,gBACA,eACA,eACA,eACA,eACA,kBACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,kBACA,gBACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,gBACA,iBACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,kBACA,eACA,eACA,eACA,kBACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,gBACA,eACA,eACA,kBACA,iBACA,eACA,eACA,gBACA,eACA,gBACA,oBACA,gBACA,gBACA,kBACA,iBACA,oBACA,gBACA,gBACA,eACA,uBACA,eACA,gBACA,gBACA,eACA,gBACA,gBACA,gBACA,eACA,oBACA,eACA,gBACA,gBACA,gBACA,kBACA,gBACA,iBACA,gBACA,eACA,oBACA,eACA,gBACA,gBACA,eACA,oBACA,eACA,gBACA,eACA,oBACA,eACA,iBACA,eACA,oBACA,eACA,eACA,eACA,gBACA,eACA,eACA,gBACA,gBACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,iBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,kBACA,yBACA,0BACAhxE,KAAK,IAEHixE,GAAM,IAAItpB,EAAOspB,IAAIC,iBAAkBC,YAAYH,GAEnDI,EAAiBH,EAAII,gBAAgBv4E,KAAI,SAAS80B,EAAI/oB,GACxD,OAAO,IAAI8iD,EAAO2pB,IAAIC,IAAI3jD,EAAI/oB,MAGhC,SAAS2sE,EAAcC,GAMrB,OALA9pB,EAAO+pB,MAAM3pB,KAAKh3D,KAAM0gF,GACxB1gF,KAAK4gF,QAAU,IAAIhqB,EAAOspB,IAAIW,kBAAkB7gF,KAAMkgF,EAAKG,EAAgB,IAAIzpB,EAAOkqB,wBAEtF9gF,KAAK+gF,aAAc,EAEZ/gF,KAGTygF,EAAc9+D,UAAY8K,OAAOwqC,OAAOL,EAAO+pB,MAAMh/D,WACrD8+D,EAAc9+D,UAAUu1C,YAAcupB,EAEtCh0D,OAAOu0D,eAAeP,EAAc9+D,UAAW,MAAO,CACpD/Z,IAAK,WACH,OAAOs4E,KAIXO,EAAcQ,IAAMrqB,EAAOsqB,MAAMD,IACjCR,EAAcU,GAAK,EACnBV,EAAcW,QAAU,EACxBX,EAAcY,SAAW,EACzBZ,EAAca,QAAU,EACxBb,EAAcc,MAAQ,EACtBd,EAAce,MAAQ,EACtBf,EAAcgB,OAAS,EACvBhB,EAAciB,QAAU,EACxBjB,EAAckB,SAAW,EACzBlB,EAAcmB,SAAW,GACzBnB,EAAcoB,UAAY,GAC1BpB,EAAcqB,SAAW,GACzBrB,EAAcsB,QAAU,GACxBtB,EAAcuB,OAAS,GACvBvB,EAAcwB,QAAU,GACxBxB,EAAcyB,MAAQ,GACtBzB,EAAc0B,OAAS,GACvB1B,EAAc2B,OAAS,GACvB3B,EAAc4B,QAAU,GACxB5B,EAAc6B,OAAS,GACvB7B,EAAc8B,QAAU,GACxB9B,EAAc+B,KAAO,GACrB/B,EAAcgC,QAAU,GACxBhC,EAAciC,KAAO,GACrBjC,EAAckC,KAAO,GACrBlC,EAAcmC,MAAQ,GACtBnC,EAAcoC,KAAO,GACrBpC,EAAcqC,MAAQ,GACtBrC,EAAcsC,OAAS,GACvBtC,EAAcuC,UAAY,GAC1BvC,EAAcwC,QAAU,GACxBxC,EAAcyC,UAAY,GAC1BzC,EAAc0C,aAAe,GAC7B1C,EAAc2C,OAAS,GACvB3C,EAAc4C,SAAW,GACzB5C,EAAc6C,YAAc,GAC5B7C,EAAc8C,OAAS,GACvB9C,EAAc+C,SAAW,GACzB/C,EAAcgD,YAAc,GAC5BhD,EAAciD,OAAS,GACvBjD,EAAckD,QAAU,GACxBlD,EAAcmD,UAAY,GAC1BnD,EAAcoD,OAAS,GACvBpD,EAAcqD,SAAW,GACzBrD,EAAcsD,OAAS,GACvBtD,EAAcuD,UAAY,GAC1BvD,EAAcwD,QAAU,GACxBxD,EAAcyD,SAAW,GACzBzD,EAAc0D,WAAa,GAC3B1D,EAAc2D,OAAS,GACvB3D,EAAc4D,SAAW,GACzB5D,EAAc6D,aAAe,GAC7B7D,EAAc8D,OAAS,GACvB9D,EAAc+D,QAAU,GACxB/D,EAAcgE,UAAY,GAC1BhE,EAAciE,OAAS,GACvBjE,EAAckE,YAAc,GAC5BlE,EAAcmE,WAAa,GAC3BnE,EAAcoE,gBAAkB,GAChCpE,EAAcqE,gBAAkB,GAChCrE,EAAcsE,gBAAkB,GAChCtE,EAAcuE,gBAAkB,GAChCvE,EAAcwE,aAAe,GAC7BxE,EAAcyE,YAAc,GAC5BzE,EAAc0E,YAAc,GAC5B1E,EAAc2E,OAAS,GACvB3E,EAAc4E,UAAY,GAC1B5E,EAAc6E,WAAa,GAC3B7E,EAAc8E,WAAa,GAC3B9E,EAAc+E,SAAW,GACzB/E,EAAcgF,UAAY,GAC1BhF,EAAciF,UAAY,GAC1BjF,EAAckF,UAAY,GAC1BlF,EAAcmF,QAAU,GACxBnF,EAAcoF,QAAU,GACxBpF,EAAcqF,QAAU,GACxBrF,EAAcsF,QAAU,GACxBtF,EAAcuF,SAAW,GACzBvF,EAAcwF,UAAY,GAC1BxF,EAAcyF,UAAY,GAC1BzF,EAAc0F,OAAS,GACvB1F,EAAc2F,OAAS,GACvB3F,EAAc4F,SAAW,GACzB5F,EAAc6F,SAAW,GACzB7F,EAAc8F,OAAS,GACvB9F,EAAc+F,QAAU,GACxB/F,EAAcgG,aAAe,GAC7BhG,EAAciG,aAAe,GAC7BjG,EAAckG,SAAW,GACzBlG,EAAcmG,cAAgB,GAC9BnG,EAAcoG,MAAQ,GACtBpG,EAAcqG,mBAAqB,GACnCrG,EAAcsG,mBAAqB,GACnCtG,EAAcuG,mBAAqB,GACnCvG,EAAcwG,mBAAqB,GACnCxG,EAAcyG,UAAY,GAC1BzG,EAAc0G,UAAY,GAC1B1G,EAAc2G,gBAAkB,GAChC3G,EAAc4G,MAAQ,GACtB5G,EAAc6G,WAAa,IAC3B7G,EAAc8G,YAAc,IAC5B9G,EAAc+G,cAAgB,IAC9B/G,EAAcgH,cAAgB,IAC9BhH,EAAciH,SAAW,IACzBjH,EAAckH,QAAU,IACxBlH,EAAcmH,SAAW,IACzBnH,EAAcoH,mBAAqB,IACnCpH,EAAcqH,mBAAqB,IACnCrH,EAAcsH,mBAAqB,IACnCtH,EAAcuH,mBAAqB,IACnCvH,EAAcwH,mBAAqB,IACnCxH,EAAcyH,QAAU,IAExBzH,EAAc0H,WAAa,EAC3B1H,EAAc2H,SAAW,EAEzB3H,EAAc4H,YAAc,EAC5B5H,EAAc6H,aAAe,EAE7B7H,EAAc9+D,UAAU4mE,aAAe,CAAC,wBAAyB,SAAU,aAAc,YAEzF9H,EAAc9+D,UAAU6mE,UAAY,CAAC,eAAgB,cAAe,gBAEpE/H,EAAc9+D,UAAU8mE,aAAe,CACrC,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,KACA,KACA,KACA,KACA,KACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,MACA,OACA,MACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGFhI,EAAc9+D,UAAU+mE,cAAgB,CACtC,KACA,KACA,UACA,WACA,UACA,QACA,QACA,SACA,UACA,WACA,WACA,YACA,WACA,UACA,SACA,UACA,QACA,SACA,SACA,UACA,SACA,UACA,OACA,UACA,OACA,OACA,QACA,OACA,QACA,SACA,YACA,UACA,YACA,eACA,SACA,WACA,cACA,SACA,WACA,cACA,SACA,UACA,YACA,SACA,WACA,SACA,YACA,UACA,WACA,aACA,SACA,WACA,eACA,SACA,UACA,YACA,SACA,cACA,aACA,kBACA,kBACA,kBACA,kBACA,eACA,cACA,cACA,SACA,YACA,aACA,aACA,WACA,YACA,YACA,YACA,UACA,UACA,UACA,UACA,WACA,YACA,YACA,SACA,SACA,WACA,WACA,SACA,UACA,eACA,eACA,WACA,gBACA,QACA,qBACA,qBACA,qBACA,qBACA,YACA,YACA,kBACA,QACA,aACA,cACA,gBACA,gBACA,WACA,UACA,WACA,qBACA,qBACA,qBACA,qBACA,qBACA,WAGFjI,EAAc9+D,UAAUgnE,UAAY,CAClC,KACA,UACA,WACA,UACA,QACA,QACA,SACA,UACA,WACA,WACA,YACA,WACA,UACA,SACA,UACA,QACA,SACA,SACA,UACA,SACA,UACA,OACA,UACA,OACA,OACA,QACA,OACA,QACA,SACA,YACA,UACA,YACA,eACA,SACA,WACA,cACA,SACA,WACA,cACA,SACA,UACA,YACA,SACA,WACA,SACA,YACA,UACA,WACA,aACA,SACA,WACA,eACA,SACA,UACA,YACA,SACA,cACA,aACA,MACA,MACA,kBACA,iBACA,kBACA,iBACA,kBACA,iBACA,kBACA,iBACA,eACA,YACA,cACA,cACA,SACA,YACA,aACA,aACA,WACA,YACA,YACA,YACA,UACA,UACA,UACA,UACA,WACA,YACA,YACA,SACA,SACA,WACA,WACA,SACA,UACA,eACA,eACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,kBACA,WACA,gBACA,QACA,qBACA,oBACA,qBACA,oBACA,qBACA,oBACA,qBACA,oBACA,YACA,YACA,kBACA,eACA,eACA,QACA,aACA,UACA,cACA,aACA,cACA,cACA,eACA,cACA,aACA,YACA,aACA,gBACA,gBACA,WACA,UACA,WACA,qBACA,oBACA,qBACA,oBACA,qBACA,oBACA,qBACA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KAAIN,IAAK,CAAEC,OAAMK,QC1NrBw1I,EAA6B,SAAClvI,GACzC,OAAQutI,EAAY,CAAEvtI,cACpB,IAAK,UACH,MAAO,qBACT,IAAK,MACH,MAAO,MACT,QACE,OAAOA,IAKAmvI,EAAoB,WAwX/B,MAAO,CACL,CAAEx7I,MAAO,SAAU2K,QAvUD,CAClB,iBACA,eACA,iBACA,gBACA,eACA,oBACA,eACA,kBACA,sBACA,cACA,kBACA,eACA,gBACA,kBACA,iBACA,kBACA,kBACA,iBACA,eACA,oBAoTA,CAAE3K,MAAO,UAAW2K,QApND,CACnB,eACA,oBACA,oBACA,iCACA,8BACA,4BACA,0BACA,6BACA,4BACA,iCACA,0BACA,6BACA,6BACA,4BACA,4BACA,mBACA,mBACA,gBACA,yBACA,mBACA,gBACA,iBACA,uBACA,oBACA,iBACA,gBACA,wBACA,uBACA,iBACA,kBACA,kBACA,kBACA,oBACA,qBACA,kBACA,iBACA,kBACA,uBACA,iBACA,uBACA,iBACA,kBACA,mBACA,mBACA,sBACA,sBACA,oBACA,oBACA,kBACA,oBACA,qBACA,oBACA,oBACA,iBACA,kBACA,iBACA,qBACA,+BACA,uBACA,0BACA,6BACA,4BACA,wBACA,4BACA,0BACA,iBACA,kBACA,kBACA,iBACA,8BACA,8BACA,iBACA,eACA,sBACA,iBACA,kBACA,iBACA,qBACA,oBACA,mBACA,oBACA,iBACA,qBACA,sBACA,mBACA,kBACA,oBACA,qBACA,iBACA,mBACA,kBACA,eACA,kBACA,8BACA,8BACA,iCACA,kBACA,iBACA,sBACA,qBACA,kBACA,yBACA,wBACA,sBACA,sBACA,uBACA,sBACA,uBACA,iBACA,iBACA,mBACA,qBACA,mBACA,mBACA,wBACA,oBACA,uBACA,gBACA,mBACA,wBACA,sBACA,gBACA,sBACA,kBACA,kBACA,oBACA,qBACA,mBACA,kBACA,wBAmFA,CAAE3K,MAAO,aAAc2K,QAlOD,CACtB,mBACA,mBACA,4BACA,uBACA,oBACA,oBACA,qBACA,mBACA,mBACA,sBAyNA,CAAE3K,MAAO,OAAQ2K,QAnTD,CAChB,cACA,aACA,cACA,aACA,cACA,gBACA,cACA,eACA,YACA,eACA,eACA,cACA,eACA,cACA,aACA,kBACA,eACA,gBACA,aACA,YACA,aACA,gBACA,iBACA,YACA,cACA,mBACA,iBACA,YACA,eACA,eACA,gBACA,iBACA,aACA,iBACA,eACA,iBACA,gBACA,eACA,mBACA,oBACA,eACA,aACA,eACA,gBACA,cACA,eACA,oBACA,mBACA,YACA,YACA,iBACA,iBACA,aACA,gBACA,iBACA,cACA,gBACA,iBACA,aACA,gBACA,iBACA,qBACA,cACA,gBACA,eACA,cACA,eACA,aACA,aACA,mBACA,cACA,gBACA,mBACA,eACA,cACA,qBACA,iBAuOA,CAAE3K,MAAO,WAAY2K,QA5BD,CACpB,kBACA,mBACA,kBACA,sBACA,iBACA,mBACA,qBACA,yBACA,qBAoBA,CAAE3K,MAAO,YAAa2K,QA5CD,CACrB,qBACA,qBACA,wBACA,mBACA,mBACA,kBACA,mBACA,qBACA,sBACA,sBACA,kBACA,qBAiCA,CAAE3K,MAAO,SAAU2K,QA9XD,CAClB,mBACA,iBACA,mBACA,gBACA,kBACA,gBACA,kBACA,mBACA,kBACA,kBACA,oBACA,gBACA,mBACA,kBACA,kBACA,qBACA,cACA,eACA,gBACA,gBACA,oBACA,gBACA,eACA,eACA,gBACA,gBACA,cACA,eACA,gBACA,cACA,cACA,gBACA,iBACA,oBACA,eACA,mBACA,iBACA,gBACA,mBACA,kBACA,gBACA,iBACA,mBACA,gBACA,oBACA,kBAiVA,CAAE3K,MAAO,SAAU2K,QAnBD,CAClB,gBACA,mBACA,eACA,mBACA,cACA,kBACA,mBACA,mBAYA,CAAE3K,MAAO,UAAW2K,QAtFD,CACnB,eACA,mBACA,uBACA,kBACA,gBACA,iBACA,gBACA,oBACA,kBACA,eACA,mBACA,oBACA,kBACA,sBACA,eACA,mBACA,qBACA,iBACA,oBACA,iBACA,oBACA,gBACA,eACA,kBACA,iBA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AAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,gBAAiB,OACjB,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,UAAW,OACX,aAAc,OACd,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,aAAc,OACd,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,OAAQ,OACR,UAAW,OAC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CA,mBACA,gBACA,iBACA,gBACA,mBACA,gBACA,kBACA,kBACA,gBACA,mBACA,gBACA,kBACA,eACA,mBACA,kBACA,gBACA,eACA,eACA,kBACA,kBACA,gBACA,gBACA,gBACA,kBACA,gBACA,kBACA,gBACA,eACA,eACA,gBACA,eACA,eACA,gBACA,eACA,gBACA,gBACA,kBACA,sBACA,uBACA,wBACA,uBACA,yBACA,0BACA,yBACA,uBACA,yBACA,yBACA,2BACA,yBACA,yBACA,yBACA,uBACA,yBACA,0BACA,wBACA,4CACA,oBACA,qBACA,0BACA,4BACA,sBACA,uBACA,gBACA,kBACA,gBACA,eACA,eACA,eACA,eACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,iBACA,gBACA,gBACA,gBACA,gBACA,kBACA,gBACA,gBACA,gBACA,gBACA,mBACA,oBACA,oBACA,oBACA,oBACA,eACA,kBACA,eACA,eACA,eACA,iBACA,gBACA,eACA,eACA,eACA,eACA,eACA,iBACA,eACA,gBACA,eACA,eACA,gBACA,eACA,gBACA,eACA,gBACA,iBACA,eACA,eACA,eACA,kBACA,iBACA,iBACA,eACA,eACA,eACA,eACA,gBACA,eACA,gBACA,iBACA,gBACA,gBACA,gBACA,eACA,eACA,gBACA,iBACA,eACA,gBACA,eACA,gBACA,eACA,eACA,gBACA,eACA,eACA,eACA,gBACA,gBACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,gBACA,eACA,iBACA,eACA,gBACA,iBACA,eACA,eACA,eACA,iBACA,gBACA,eACA,eACA,eACA,eACA,gBACA,gBACA,eACA,gBACA,gBACA,eACA,iBACA,iBACA,eACA,eACA,eACA,kBACA,eACA,gBACA,eACA,gBACA,gBACA,eACA,eACA,iBACA,gBACA,gBACA,eACA,eACA,eACA,gBACA,eACA,eACA,kBACA,eACA,eACA,eACA,eACA,gBACA,gBACA,eACA,eACA,eACA,eACA,gBACA,gBACA,eACA,eACA,gBACA,eACA,eACA,eACA,gBACA,gBACA,eACA,eACA,eACA,iBACA,eACA,eACA,gBACA,iBACA,gBACA,iBACA,gBACA,kBACA,mBACA,eACA,eACA,gBACA,gBACA,mBACA,oBACA,uBACA,oBACA,mBACA,iBACA,eACA,eACA,mBACA,eACA,gBACA,iBACA,eACA,eACA,qBACA,eACA,eACA,gBACA,eACA,eACA,eACA,eACA,eACA,eACA,eACA,kBACA,kBACA,eACA,eACA,kBACA,eACA,iBACA,iBACA,gBACA,eACA,eACA,eACA,gBACA,gBACA,eACA,eACA,eACA,eACA,iBACA,eACA,iBACA,iBACA,eACA,eACA,eACA,eACA,gBACA,eACA,kBACA,eACA,gBACA,eACA,eACA,wBACA,gBACA,eACA,eACA,qBACA,oBACA,eACA,eACA,eACA,gBACA,gBACA,gBACA,eACA,eACA,gBACA,qBACA,qBACA,gBACA,eACA,eACA,eACA,iBACA,gBACA,iBACA,gBACA,eACA,mBACA,eACA,kBACA,eACA,iBACA,gBACA,eACA,eACA,mBACA,iBACA,iBACA,gBACA,iBACA,iBACA,mBACA,iBACA,iBACA,kBACA,gBACA,eACA,iBACA,kBACA,kBACA,kBACA,oBACA,eACA,eACA,eACA,eACA,eACA,iBACA,eACA,eACA,eACA,eACA,eACAhxE,KAAK,IAEHixE,GAAM,IAAItpB,EAAOspB,IAAIC,iBAAkBC,YAAYH,GAEnDI,EAAiBH,EAAII,gBAAgBv4E,KAAI,SAAS80B,EAAI/oB,GACxD,OAAO,IAAI8iD,EAAO2pB,IAAIC,IAAI3jD,EAAI/oB,MAG5BsgR,EAAqB,IAAIx9N,EAAOkqB,uBAEhC2H,EAAe,CACjB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,KACA,KACA,KACA,KACA,KACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,MACA,OACA,MACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGEC,EAAgB,CAClB,KACA,KACA,UACA,WACA,UACA,QACA,QACA,SACA,UACA,WACA,WACA,YACA,WACA,UACA,SACA,UACA,QACA,SACA,SACA,UACA,SACA,UACA,OACA,UACA,OACA,OACA,QACA,OACA,QACA,SACA,YACA,UACA,YACA,eACA,SACA,WACA,cACA,SACA,WACA,cACA,SACA,UACA,YACA,SACA,WACA,SACA,YACA,UACA,WACA,aACA,SACA,WACA,eACA,SACA,UACA,YACA,SACA,cACA,aACA,kBACA,kBACA,kBACA,kBACA,eACA,cACA,cACA,SACA,YACA,aACA,aACA,WACA,YACA,YACA,YACA,UACA,UACA,UACA,UACA,WACA,YACA,YACA,SACA,SACA,WACA,WACA,SACA,UACA,eACA,eACA,WACA,gBACA,QACA,qBACA,qBACA,qBACA,qBACA,YACA,YACA,kBACA,QACA,aACA,cACA,gBACA,gBACA,WACA,UACA,WACA,qBACA,qBACA,qBACA,qBACA,qBACA,WAGEC,EAAY,CACd,QACA,WACA,eACA,iBACA,gBACA,QACA,iBACA,YACA,WACA,cACA,mBACA,kBACA,gBACA,qBACA,WACA,YACA,kBACA,cACA,YACA,aACA,cACA,sBACA,aACA,aACA,cACA,YACA,WACA,aACA,iBACA,aACA,OACA,WACA,OACA,c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","file":"app.d3489276abe5fda2bd26.js","sourcesContent":["import React, { PureComponent, FC } from 'react';\nimport { UserDTO } from 'app/types';\nimport { cx, css } from 'emotion';\nimport { config } from 'app/core/config';\nimport { GrafanaTheme } from '@grafana/data';\nimport { ConfirmButton, ConfirmModal, LegacyInputStatus, Button, stylesFactory, Input } from '@grafana/ui';\n\ninterface Props {\n  user: UserDTO;\n\n  onUserUpdate: (user: UserDTO) => void;\n  onUserDelete: (userId: number) => void;\n  onUserDisable: (userId: number) => void;\n  onUserEnable: (userId: number) => void;\n  onPasswordChange(password: string): void;\n}\n\ninterface State {\n  isLoading: boolean;\n  showDeleteModal: boolean;\n  showDisableModal: boolean;\n}\n\nexport class UserProfile extends PureComponent<Props, State> {\n  state = {\n    isLoading: false,\n    showDeleteModal: false,\n    showDisableModal: false,\n  };\n\n  showDeleteUserModal = (show: boolean) => () => {\n    this.setState({ showDeleteModal: show });\n  };\n\n  showDisableUserModal = (show: boolean) => () => {\n    this.setState({ showDisableModal: show });\n  };\n\n  onUserDelete = () => {\n    const { user, onUserDelete } = this.props;\n    onUserDelete(user.id);\n  };\n\n  onUserDisable = () => {\n    const { user, onUserDisable } = this.props;\n    onUserDisable(user.id);\n  };\n\n  onUserEnable = () => {\n    const { user, onUserEnable } = this.props;\n    onUserEnable(user.id);\n  };\n\n  onUserNameChange = (newValue: string) => {\n    const { user, onUserUpdate } = this.props;\n    onUserUpdate({\n      ...user,\n      name: newValue,\n    });\n  };\n\n  onUserEmailChange = (newValue: string) => {\n    const { user, onUserUpdate } = this.props;\n    onUserUpdate({\n      ...user,\n      email: newValue,\n    });\n  };\n\n  onUserLoginChange = (newValue: string) => {\n    const { user, onUserUpdate } = this.props;\n    onUserUpdate({\n      ...user,\n      login: newValue,\n    });\n  };\n\n  onPasswordChange = (newValue: string) => {\n    this.props.onPasswordChange(newValue);\n  };\n\n  render() {\n    const { user } = this.props;\n    const { showDeleteModal, showDisableModal } = this.state;\n    const authSource = user.authLabels?.length && user.authLabels[0];\n    const lockMessage = authSource ? `Synced via ${authSource}` : '';\n    const styles = getStyles(config.theme);\n\n    return (\n      <>\n        <h3 className=\"page-heading\">User information</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <tbody>\n                <UserProfileRow\n                  label=\"Name\"\n                  value={user.name}\n                  locked={user.isExternal}\n                  lockMessage={lockMessage}\n                  onChange={this.onUserNameChange}\n                />\n                <UserProfileRow\n                  label=\"Email\"\n                  value={user.email}\n                  locked={user.isExternal}\n                  lockMessage={lockMessage}\n                  onChange={this.onUserEmailChange}\n                />\n                <UserProfileRow\n                  label=\"Username\"\n                  value={user.login}\n                  locked={user.isExternal}\n                  lockMessage={lockMessage}\n                  onChange={this.onUserLoginChange}\n                />\n                <UserProfileRow\n                  label=\"Password\"\n                  value=\"********\"\n                  inputType=\"password\"\n                  locked={user.isExternal}\n                  lockMessage={lockMessage}\n                  onChange={this.onPasswordChange}\n                />\n              </tbody>\n            </table>\n          </div>\n          <div className={styles.buttonRow}>\n            <Button variant=\"destructive\" onClick={this.showDeleteUserModal(true)}>\n              Delete User\n            </Button>\n            <ConfirmModal\n              isOpen={showDeleteModal}\n              title=\"Delete user\"\n              body=\"Are you sure you want to delete this user?\"\n              confirmText=\"Delete user\"\n              onConfirm={this.onUserDelete}\n              onDismiss={this.showDeleteUserModal(false)}\n            />\n            {user.isDisabled ? (\n              <Button variant=\"secondary\" onClick={this.onUserEnable}>\n                Enable User\n              </Button>\n            ) : (\n              <Button variant=\"secondary\" onClick={this.showDisableUserModal(true)}>\n                Disable User\n              </Button>\n            )}\n            <ConfirmModal\n              isOpen={showDisableModal}\n              title=\"Disable user\"\n              body=\"Are you sure you want to disable this user?\"\n              confirmText=\"Disable user\"\n              onConfirm={this.onUserDisable}\n              onDismiss={this.showDisableUserModal(false)}\n            />\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    buttonRow: css`\n      margin-top: 0.8rem;\n      > * {\n        margin-right: 16px;\n      }\n    `,\n  };\n});\n\ninterface UserProfileRowProps {\n  label: string;\n  value?: string;\n  locked?: boolean;\n  lockMessage?: string;\n  inputType?: string;\n  onChange?: (value: string) => void;\n}\n\ninterface UserProfileRowState {\n  value: string;\n  editing: boolean;\n}\n\nexport class UserProfileRow extends PureComponent<UserProfileRowProps, UserProfileRowState> {\n  inputElem: HTMLInputElement;\n\n  static defaultProps: Partial<UserProfileRowProps> = {\n    value: '',\n    locked: false,\n    lockMessage: '',\n    inputType: 'text',\n  };\n\n  state = {\n    editing: false,\n    value: this.props.value || '',\n  };\n\n  setInputElem = (elem: any) => {\n    this.inputElem = elem;\n  };\n\n  onEditClick = () => {\n    if (this.props.inputType === 'password') {\n      // Reset value for password field\n      this.setState({ editing: true, value: '' }, this.focusInput);\n    } else {\n      this.setState({ editing: true }, this.focusInput);\n    }\n  };\n\n  onCancelClick = () => {\n    this.setState({ editing: false, value: this.props.value || '' });\n  };\n\n  onInputChange = (event: React.ChangeEvent<HTMLInputElement>, status?: LegacyInputStatus) => {\n    if (status === LegacyInputStatus.Invalid) {\n      return;\n    }\n\n    this.setState({ value: event.target.value });\n  };\n\n  onInputBlur = (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => {\n    if (status === LegacyInputStatus.Invalid) {\n      return;\n    }\n\n    this.setState({ value: event.target.value });\n  };\n\n  focusInput = () => {\n    if (this.inputElem && this.inputElem.focus) {\n      this.inputElem.focus();\n    }\n  };\n\n  onSave = () => {\n    if (this.props.onChange) {\n      this.props.onChange(this.state.value);\n    }\n  };\n\n  render() {\n    const { label, locked, lockMessage, inputType } = this.props;\n    const { value } = this.state;\n    const labelClass = cx(\n      'width-16',\n      css`\n        font-weight: 500;\n      `\n    );\n    const editButtonContainerClass = cx('pull-right');\n\n    if (locked) {\n      return <LockedRow label={label} value={value} lockMessage={lockMessage} />;\n    }\n\n    return (\n      <tr>\n        <td className={labelClass}>{label}</td>\n        <td className=\"width-25\" colSpan={2}>\n          {this.state.editing ? (\n            <Input\n              type={inputType}\n              defaultValue={value}\n              onBlur={this.onInputBlur}\n              onChange={this.onInputChange}\n              ref={this.setInputElem}\n              width={30}\n            />\n          ) : (\n            <span>{this.props.value}</span>\n          )}\n        </td>\n        <td>\n          <div className={editButtonContainerClass}>\n            <ConfirmButton\n              confirmText=\"Save\"\n              onClick={this.onEditClick}\n              onConfirm={this.onSave}\n              onCancel={this.onCancelClick}\n            >\n              Edit\n            </ConfirmButton>\n          </div>\n        </td>\n      </tr>\n    );\n  }\n}\n\ninterface LockedRowProps {\n  label: string;\n  value?: any;\n  lockMessage?: string;\n}\n\nexport const LockedRow: FC<LockedRowProps> = ({ label, value, lockMessage }) => {\n  const lockMessageClass = cx(\n    'pull-right',\n    css`\n      font-style: italic;\n      margin-right: 0.6rem;\n    `\n  );\n  const labelClass = cx(\n    'width-16',\n    css`\n      font-weight: 500;\n    `\n  );\n\n  return (\n    <tr>\n      <td className={labelClass}>{label}</td>\n      <td className=\"width-25\" colSpan={2}>\n        {value}\n      </td>\n      <td>\n        <span className={lockMessageClass}>{lockMessage}</span>\n      </td>\n    </tr>\n  );\n};\n","// Store\nimport store from 'app/core/store';\n\n// Models\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { TimeRange, AppEvents } from '@grafana/data';\n\n// Utils\nimport { isString as _isString } from 'lodash';\nimport { rangeUtil } from '@grafana/data';\nimport { dateMath } from '@grafana/data';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\n\n// Services\nimport templateSrv from 'app/features/templating/template_srv';\n\n// Constants\nimport { LS_PANEL_COPY_KEY, PANEL_BORDER } from 'app/core/constants';\nimport { CoreEvents } from 'app/types';\n\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\n\nexport const removePanel = (dashboard: DashboardModel, panel: PanelModel, ask: boolean) => {\n  // confirm deletion\n  if (ask !== false) {\n    const text2 = panel.alert ? 'Panel includes an alert rule, removing panel will also remove alert rule' : null;\n    const confirmText = panel.alert ? 'YES' : null;\n\n    appEvents.emit(CoreEvents.showConfirmModal, {\n      title: 'Remove Panel',\n      text: 'Are you sure you want to remove this panel?',\n      text2: text2,\n      icon: 'trash-alt',\n      confirmText: confirmText,\n      yesText: 'Remove',\n      onConfirm: () => removePanel(dashboard, panel, false),\n    });\n    return;\n  }\n  dashboard.removePanel(panel);\n};\n\nexport const duplicatePanel = (dashboard: DashboardModel, panel: PanelModel) => {\n  dashboard.duplicatePanel(panel);\n};\n\nexport const copyPanel = (panel: PanelModel) => {\n  store.set(LS_PANEL_COPY_KEY, JSON.stringify(panel.getSaveModel()));\n  appEvents.emit(AppEvents.alertSuccess, ['Panel copied. Open Add Panel to paste']);\n};\n\nexport const sharePanel = (dashboard: DashboardModel, panel: PanelModel) => {\n  appEvents.emit(CoreEvents.showModalReact, {\n    component: ShareModal,\n    props: {\n      dashboard: dashboard,\n      panel: panel,\n    },\n  });\n};\n\nexport const refreshPanel = (panel: PanelModel) => {\n  panel.refresh();\n};\n\nexport const toggleLegend = (panel: PanelModel) => {\n  console.log('Toggle legend is not implemented yet');\n  // We need to set panel.legend defaults first\n  // panel.legend.show = !panel.legend.show;\n  refreshPanel(panel);\n};\n\nexport interface TimeOverrideResult {\n  timeRange: TimeRange;\n  timeInfo: string;\n}\n\nexport function applyPanelTimeOverrides(panel: PanelModel, timeRange: TimeRange): TimeOverrideResult {\n  const newTimeData = {\n    timeInfo: '',\n    timeRange: timeRange,\n  };\n\n  if (panel.timeFrom) {\n    const timeFromInterpolated = templateSrv.replace(panel.timeFrom, panel.scopedVars);\n    const timeFromInfo = rangeUtil.describeTextRange(timeFromInterpolated);\n    if (timeFromInfo.invalid) {\n      newTimeData.timeInfo = 'invalid time override';\n      return newTimeData;\n    }\n\n    if (_isString(timeRange.raw.from)) {\n      const timeFromDate = dateMath.parse(timeFromInfo.from);\n      newTimeData.timeInfo = timeFromInfo.display;\n      newTimeData.timeRange = {\n        from: timeFromDate,\n        to: dateMath.parse(timeFromInfo.to),\n        raw: {\n          from: timeFromInfo.from,\n          to: timeFromInfo.to,\n        },\n      };\n    }\n  }\n\n  if (panel.timeShift) {\n    const timeShiftInterpolated = templateSrv.replace(panel.timeShift, panel.scopedVars);\n    const timeShiftInfo = rangeUtil.describeTextRange(timeShiftInterpolated);\n    if (timeShiftInfo.invalid) {\n      newTimeData.timeInfo = 'invalid timeshift';\n      return newTimeData;\n    }\n\n    const timeShift = '-' + timeShiftInterpolated;\n    newTimeData.timeInfo += ' timeshift ' + timeShift;\n    const from = dateMath.parseDateMath(timeShift, newTimeData.timeRange.from, false);\n    const to = dateMath.parseDateMath(timeShift, newTimeData.timeRange.to, true);\n\n    newTimeData.timeRange = {\n      from,\n      to,\n      raw: {\n        from,\n        to,\n      },\n    };\n  }\n\n  if (panel.hideTimeOverride) {\n    newTimeData.timeInfo = '';\n  }\n\n  return newTimeData;\n}\n\nexport function getResolution(panel: PanelModel): number {\n  const htmlEl = document.getElementsByTagName('html')[0];\n  const width = htmlEl.getBoundingClientRect().width; // https://stackoverflow.com/a/21454625\n\n  return panel.maxDataPoints ? panel.maxDataPoints : Math.ceil(width * (panel.gridPos.w / 24));\n}\n\nexport function calculateInnerPanelHeight(panel: PanelModel, containerHeight: number): number {\n  const chromePadding = panel.plugin && panel.plugin.noPadding ? 0 : config.theme.panelPadding * 2;\n  const headerHeight = panel.hasTitle() ? config.theme.panelHeaderHeight : 0;\n  return containerHeight - headerHeight - chromePadding - PANEL_BORDER;\n}\n","// Libraries\nimport React, { Component } from 'react';\nimport _ from 'lodash';\n\n// Components\nimport { LegacyForms } from '@grafana/ui';\nconst { AsyncSelect } = LegacyForms;\n\n// Utils & Services\nimport { debounce } from 'lodash';\nimport { getBackendSrv } from '@grafana/runtime';\n\n// Types\nimport { User } from 'app/types';\n\nexport interface Props {\n  onSelected: (user: User) => void;\n  className?: string;\n}\n\nexport interface State {\n  isLoading: boolean;\n}\n\nexport class UserPicker extends Component<Props, State> {\n  debouncedSearch: any;\n\n  constructor(props: Props) {\n    super(props);\n    this.state = { isLoading: false };\n    this.search = this.search.bind(this);\n\n    this.debouncedSearch = debounce(this.search, 300, {\n      leading: true,\n      trailing: true,\n    });\n  }\n\n  search(query?: string) {\n    this.setState({ isLoading: true });\n\n    if (_.isNil(query)) {\n      query = '';\n    }\n\n    return getBackendSrv()\n      .get(`/api/org/users/lookup?query=${query}&limit=10`)\n      .then((result: any) => {\n        return result.map((user: any) => ({\n          id: user.userId,\n          value: user.userId,\n          label: user.login,\n          imgUrl: user.avatarUrl,\n          login: user.login,\n        }));\n      })\n      .finally(() => {\n        this.setState({ isLoading: false });\n      });\n  }\n\n  render() {\n    const { className, onSelected } = this.props;\n    const { isLoading } = this.state;\n\n    return (\n      <div className=\"user-picker\">\n        <AsyncSelect\n          className={className}\n          isLoading={isLoading}\n          defaultOptions={true}\n          loadOptions={this.debouncedSearch}\n          onChange={onSelected}\n          placeholder=\"Select user\"\n          noOptionsMessage={() => 'No users found'}\n        />\n      </div>\n    );\n  }\n}\n","import { Field, Threshold, GrafanaTheme, GrafanaThemeType, ThresholdsMode, FieldColorMode } from '../types';\nimport { reduceField, ReducerID } from '../transformations';\nimport { getColorFromHexRgbOrName } from '../utils/namedColorsPalette';\nimport * as d3 from 'd3-scale-chromatic';\nimport isNumber from 'lodash/isNumber';\n\nexport interface ScaledValue {\n  percent?: number; // 0-1\n  threshold?: Threshold; // the selected step\n  color?: string; // Selected color (may be range based on threshold)\n}\n\nexport type ScaleCalculator = (value: number) => ScaledValue;\n\n/**\n * @param t Number in the range [0, 1].\n */\ntype colorInterpolator = (t: number) => string;\n\nexport function getScaleCalculator(field: Field, theme?: GrafanaTheme): ScaleCalculator {\n  const themeType = theme ? theme.type : GrafanaThemeType.Dark;\n  const config = field.config || {};\n  const { thresholds, color } = config;\n\n  const fixedColor =\n    color && color.mode === FieldColorMode.Fixed && color.fixedColor\n      ? getColorFromHexRgbOrName(color.fixedColor, themeType)\n      : undefined;\n\n  // Should we calculate the percentage\n  const percentThresholds = thresholds && thresholds.mode === ThresholdsMode.Percentage;\n  const useColorScheme = color && color.mode === FieldColorMode.Scheme;\n\n  if (percentThresholds || useColorScheme) {\n    // Calculate min/max if required\n    let min = config.min;\n    let max = config.max;\n\n    if (!isNumber(min) || !isNumber(max)) {\n      if (field.values && field.values.length) {\n        const stats = reduceField({ field, reducers: [ReducerID.min, ReducerID.max] });\n        if (!isNumber(min)) {\n          min = stats[ReducerID.min];\n        }\n        if (!isNumber(max)) {\n          max = stats[ReducerID.max];\n        }\n      } else {\n        min = 0;\n        max = 100;\n      }\n    }\n\n    const delta = max! - min!;\n\n    // Use a d3 color scale\n    let interpolator: colorInterpolator | undefined;\n\n    if (useColorScheme) {\n      interpolator = (d3 as any)[`interpolate${color!.schemeName}`] as colorInterpolator;\n    }\n\n    return (value: number) => {\n      const percent = (value - min!) / delta;\n      const threshold = thresholds\n        ? getActiveThreshold(percentThresholds ? percent * 100 : value, thresholds.steps)\n        : undefined; // 0-100\n      let color = fixedColor;\n\n      if (interpolator) {\n        color = interpolator(percent);\n      } else if (threshold) {\n        color = getColorFromHexRgbOrName(threshold!.color, themeType);\n      }\n\n      return {\n        percent,\n        threshold,\n        color,\n      };\n    };\n  }\n\n  if (thresholds) {\n    return (value: number) => {\n      const threshold = getActiveThreshold(value, thresholds.steps);\n      const color = fixedColor ?? (threshold ? getColorFromHexRgbOrName(threshold.color, themeType) : undefined);\n      return {\n        threshold,\n        color,\n      };\n    };\n  }\n\n  // Constant color\n  if (fixedColor) {\n    return (value: number) => {\n      return { color: fixedColor };\n    };\n  }\n\n  // NO-OP\n  return (value: number) => {\n    return {};\n  };\n}\n\nexport function getActiveThreshold(value: number, thresholds: Threshold[]): Threshold {\n  let active = thresholds[0];\n  for (const threshold of thresholds) {\n    if (value >= threshold.value) {\n      active = threshold;\n    } else {\n      break;\n    }\n  }\n  return active;\n}\n\n/**\n * Sorts the thresholds\n */\nexport function sortThresholds(thresholds: Threshold[]) {\n  return thresholds.sort((t1, t2) => {\n    return t1.value - t2.value;\n  });\n}\n","// Libraries\nimport _ from 'lodash';\n\n// Types\nimport { Field, FieldType } from '../types/dataFrame';\nimport { GrafanaTheme } from '../types/theme';\nimport { DisplayProcessor, DisplayValue, DecimalCount, DecimalInfo } from '../types/displayValue';\nimport { getValueFormat } from '../valueFormats/valueFormats';\nimport { getMappedValue } from '../utils/valueMappings';\nimport { DEFAULT_DATE_TIME_FORMAT } from '../datetime';\nimport { KeyValue, TimeZone } from '../types';\nimport { getScaleCalculator } from './scale';\n\ninterface DisplayProcessorOptions {\n  field: Partial<Field>;\n\n  // Context\n  timeZone?: TimeZone;\n  theme?: GrafanaTheme; // Will pick 'dark' if not defined\n}\n\n// Reasonable units for time\nconst timeFormats: KeyValue<boolean> = {\n  dateTimeAsIso: true,\n  dateTimeAsUS: true,\n  dateTimeFromNow: true,\n};\n\nexport function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayProcessor {\n  if (!options || _.isEmpty(options) || !options.field) {\n    return toStringProcessor;\n  }\n  const { field } = options;\n  const config = field.config ?? {};\n\n  if (field.type === FieldType.time) {\n    if (config.unit && timeFormats[config.unit]) {\n      // Currently selected unit is valid for time fields\n    } else if (config.unit && config.unit.startsWith('time:')) {\n      // Also OK\n    } else {\n      config.unit = `time:${DEFAULT_DATE_TIME_FORMAT}`;\n    }\n  }\n\n  const formatFunc = getValueFormat(config.unit || 'none');\n  const scaleFunc = getScaleCalculator(field as Field, options.theme);\n\n  return (value: any) => {\n    const { mappings } = config;\n\n    let text = _.toString(value);\n    let numeric = toNumber(value);\n    let prefix: string | undefined = undefined;\n    let suffix: string | undefined = undefined;\n    let shouldFormat = true;\n\n    if (mappings && mappings.length > 0) {\n      const mappedValue = getMappedValue(mappings, value);\n\n      if (mappedValue) {\n        text = mappedValue.text;\n        const v = toNumber(text);\n\n        if (!isNaN(v)) {\n          numeric = v;\n        }\n\n        shouldFormat = false;\n      }\n    }\n\n    if (!isNaN(numeric)) {\n      if (shouldFormat && !_.isBoolean(value)) {\n        const { decimals, scaledDecimals } = getDecimalsForValue(value, config.decimals);\n        const v = formatFunc(numeric, decimals, scaledDecimals, options.timeZone);\n        text = v.text;\n        suffix = v.suffix;\n        prefix = v.prefix;\n\n        // Check if the formatted text mapped to a different value\n        if (mappings && mappings.length > 0) {\n          const mappedValue = getMappedValue(mappings, text);\n          if (mappedValue) {\n            text = mappedValue.text;\n          }\n        }\n      }\n\n      // Return the value along with scale info\n      if (text) {\n        return { text, numeric, prefix, suffix, ...scaleFunc(numeric) };\n      }\n    }\n\n    if (!text) {\n      if (config.noValue) {\n        text = config.noValue;\n      } else {\n        text = ''; // No data?\n      }\n    }\n\n    return { text, numeric, prefix, suffix, ...scaleFunc(-Infinity) };\n  };\n}\n\n/** Will return any value as a number or NaN */\nfunction toNumber(value: any): number {\n  if (typeof value === 'number') {\n    return value;\n  }\n  if (value === '' || value === null || value === undefined || Array.isArray(value)) {\n    return NaN; // lodash calls them 0\n  }\n  if (typeof value === 'boolean') {\n    return value ? 1 : 0;\n  }\n  return _.toNumber(value);\n}\n\nfunction toStringProcessor(value: any): DisplayValue {\n  return { text: _.toString(value), numeric: toNumber(value) };\n}\n\nexport function getDecimalsForValue(value: number, decimalOverride?: DecimalCount): DecimalInfo {\n  if (_.isNumber(decimalOverride)) {\n    // It's important that scaledDecimals is null here\n    return { decimals: decimalOverride, scaledDecimals: null };\n  }\n\n  let dec = -Math.floor(Math.log(value) / Math.LN10) + 1;\n  const magn = Math.pow(10, -dec);\n  const norm = value / magn; // norm is between 1.0 and 10.0\n  let size;\n\n  if (norm < 1.5) {\n    size = 1;\n  } else if (norm < 3) {\n    size = 2;\n    // special case for 2.5, requires an extra decimal\n    if (norm > 2.25) {\n      size = 2.5;\n      ++dec;\n    }\n  } else if (norm < 7.5) {\n    size = 5;\n  } else {\n    size = 10;\n  }\n\n  size *= magn;\n\n  // reduce starting decimals if not needed\n  if (value % 1 === 0) {\n    dec = 0;\n  }\n\n  const decimals = Math.max(0, dec);\n  const scaledDecimals = decimals - Math.floor(Math.log(size) / Math.LN10) + 2;\n\n  return { decimals, scaledDecimals };\n}\n","import toString from 'lodash/toString';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { getDisplayProcessor } from './displayProcessor';\nimport { getFlotPairs } from '../utils/flotPairs';\nimport {\n  DataFrame,\n  DisplayValue,\n  DisplayValueAlignmentFactors,\n  Field,\n  FieldConfig,\n  FieldConfigSource,\n  FieldType,\n  InterpolateFunction,\n  LinkModel,\n  TimeZone,\n} from '../types';\nimport { DataFrameView } from '../dataframe/DataFrameView';\nimport { GraphSeriesValue } from '../types/graph';\nimport { GrafanaTheme } from '../types/theme';\nimport { reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { ScopedVars } from '../types/ScopedVars';\nimport { getTimeField } from '../dataframe/processDataFrame';\nimport { getFieldMatcher } from '../transformations';\nimport { FieldMatcherID } from '../transformations/matchers/ids';\n\n/**\n * Options for how to turn DataFrames into an array of display values\n */\nexport interface ReduceDataOptions {\n  /* If true show each row value */\n  values?: boolean;\n  /** if showing all values limit */\n  limit?: number;\n  /** When !values, pick one value for the whole field */\n  calcs: string[];\n  /** Which fields to show.  By default this is only numeric fields */\n  fields?: string;\n}\n\n// TODO: use built in variables, same as for data links?\nexport const VAR_SERIES_NAME = '__series.name';\nexport const VAR_FIELD_NAME = '__field.name';\nexport const VAR_FIELD_LABELS = '__field.labels';\nexport const VAR_CALC = '__calc';\nexport const VAR_CELL_PREFIX = '__cell_'; // consistent with existing table templates\n\nfunction getTitleTemplate(stats: string[]): string {\n  const parts: string[] = [];\n  if (stats.length > 1) {\n    parts.push('${' + VAR_CALC + '}');\n  }\n\n  parts.push('${' + VAR_FIELD_NAME + '}');\n\n  return parts.join(' ');\n}\n\nexport interface FieldDisplay {\n  name: string; // The field name (title is in display)\n  field: FieldConfig;\n  display: DisplayValue;\n  sparkline?: GraphSeriesValue[][];\n\n  // Expose to the original values for delayed inspection (DataLinks etc)\n  view?: DataFrameView;\n  colIndex?: number; // The field column index\n  rowIndex?: number; // only filled in when the value is from a row (ie, not a reduction)\n  getLinks?: () => LinkModel[];\n  hasLinks: boolean;\n}\n\nexport interface GetFieldDisplayValuesOptions {\n  data?: DataFrame[];\n  reduceOptions: ReduceDataOptions;\n  fieldConfig: FieldConfigSource;\n  replaceVariables: InterpolateFunction;\n  sparkline?: boolean; // Calculate the sparkline\n  theme: GrafanaTheme;\n  autoMinMax?: boolean;\n  timeZone?: TimeZone;\n}\n\nexport const DEFAULT_FIELD_DISPLAY_VALUES_LIMIT = 25;\n\nexport const getFieldDisplayValues = (options: GetFieldDisplayValuesOptions): FieldDisplay[] => {\n  const { replaceVariables, reduceOptions, fieldConfig, timeZone } = options;\n  const calcs = reduceOptions.calcs.length ? reduceOptions.calcs : [ReducerID.last];\n\n  const values: FieldDisplay[] = [];\n  const fieldMatcher = getFieldMatcher(\n    reduceOptions.fields\n      ? {\n          id: FieldMatcherID.byRegexp,\n          options: reduceOptions.fields,\n        }\n      : {\n          id: FieldMatcherID.numeric,\n        }\n  );\n\n  if (options.data) {\n    // Field overrides are applied already\n    const data = options.data;\n    let hitLimit = false;\n    const limit = reduceOptions.limit ? reduceOptions.limit : DEFAULT_FIELD_DISPLAY_VALUES_LIMIT;\n    const scopedVars: ScopedVars = {};\n    const defaultDisplayName = getTitleTemplate(calcs);\n\n    for (let s = 0; s < data.length && !hitLimit; s++) {\n      const series = data[s]; // Name is already set\n\n      const { timeField } = getTimeField(series);\n      const view = new DataFrameView(series);\n\n      for (let i = 0; i < series.fields.length && !hitLimit; i++) {\n        const field = series.fields[i];\n        const fieldLinksSupplier = field.getLinks;\n\n        // To filter out time field, need an option for this\n        if (!fieldMatcher(field, series, data)) {\n          continue;\n        }\n\n        const config = field.config; // already set by the prepare task\n        const displayName = field.config.displayName ?? defaultDisplayName;\n\n        const display =\n          field.display ??\n          getDisplayProcessor({\n            field,\n            theme: options.theme,\n            timeZone,\n          });\n\n        // Show all rows\n        if (reduceOptions.values) {\n          const usesCellValues = displayName.indexOf(VAR_CELL_PREFIX) >= 0;\n\n          for (let j = 0; j < field.values.length; j++) {\n            // Add all the row variables\n            if (usesCellValues) {\n              for (let k = 0; k < series.fields.length; k++) {\n                const f = series.fields[k];\n                const v = f.values.get(j);\n                scopedVars[VAR_CELL_PREFIX + k] = {\n                  value: v,\n                  text: toString(v),\n                };\n              }\n            }\n\n            const displayValue = display(field.values.get(j));\n            displayValue.title = replaceVariables(displayName, {\n              ...field.state?.scopedVars, // series and field scoped vars\n              ...scopedVars,\n            });\n\n            values.push({\n              name,\n              field: config,\n              display: displayValue,\n              view,\n              colIndex: i,\n              rowIndex: j,\n              getLinks: fieldLinksSupplier\n                ? () =>\n                    fieldLinksSupplier({\n                      valueRowIndex: j,\n                    })\n                : () => [],\n              hasLinks: hasLinks(field),\n            });\n\n            if (values.length >= limit) {\n              hitLimit = true;\n              break;\n            }\n          }\n        } else {\n          const results = reduceField({\n            field,\n            reducers: calcs, // The stats to calculate\n          });\n          let sparkline: GraphSeriesValue[][] | undefined = undefined;\n\n          // Single sparkline for every reducer\n          if (options.sparkline && timeField) {\n            sparkline = getFlotPairs({\n              xField: timeField,\n              yField: series.fields[i],\n            });\n          }\n\n          for (const calc of calcs) {\n            scopedVars[VAR_CALC] = { value: calc, text: calc };\n            const displayValue = display(results[calc]);\n            displayValue.title = replaceVariables(displayName, {\n              ...field.state?.scopedVars, // series and field scoped vars\n              ...scopedVars,\n            });\n\n            values.push({\n              name: calc,\n              field: config,\n              display: displayValue,\n              sparkline,\n              view,\n              colIndex: i,\n              getLinks: fieldLinksSupplier\n                ? () =>\n                    fieldLinksSupplier({\n                      calculatedValue: displayValue,\n                    })\n                : () => [],\n              hasLinks: hasLinks(field),\n            });\n          }\n        }\n      }\n    }\n  }\n\n  if (values.length === 0) {\n    values.push(createNoValuesFieldDisplay(options));\n  } else if (values.length === 1 && !fieldConfig.defaults.displayName) {\n    // Don't show title for single item\n    values[0].display.title = undefined;\n  }\n\n  return values;\n};\n\nexport function hasLinks(field: Field): boolean {\n  return field.config?.links?.length ? field.config.links.length > 0 : false;\n}\n\nexport function getDisplayValueAlignmentFactors(values: FieldDisplay[]): DisplayValueAlignmentFactors {\n  const info: DisplayValueAlignmentFactors = {\n    title: '',\n    text: '',\n  };\n\n  let prefixLength = 0;\n  let suffixLength = 0;\n\n  for (let i = 0; i < values.length; i++) {\n    const v = values[i].display;\n\n    if (v.text && v.text.length > info.text.length) {\n      info.text = v.text;\n    }\n\n    if (v.title && v.title.length > info.title.length) {\n      info.title = v.title;\n    }\n\n    if (v.prefix && v.prefix.length > prefixLength) {\n      info.prefix = v.prefix;\n      prefixLength = v.prefix.length;\n    }\n\n    if (v.suffix && v.suffix.length > suffixLength) {\n      info.suffix = v.suffix;\n      suffixLength = v.suffix.length;\n    }\n  }\n  return info;\n}\n\nfunction createNoValuesFieldDisplay(options: GetFieldDisplayValuesOptions): FieldDisplay {\n  const displayName = 'No data';\n  const { fieldConfig, timeZone } = options;\n  const { defaults } = fieldConfig;\n\n  const displayProcessor = getDisplayProcessor({\n    field: {\n      type: FieldType.other,\n      config: defaults,\n    },\n    theme: options.theme,\n    timeZone,\n  });\n\n  const display = displayProcessor(null);\n  const text = getDisplayText(display, displayName);\n\n  return {\n    name: displayName,\n    field: {\n      ...defaults,\n      max: defaults.max ?? 0,\n      min: defaults.min ?? 0,\n    },\n    display: {\n      text,\n      numeric: 0,\n      color: display.color,\n    },\n    hasLinks: false,\n  };\n}\n\nfunction getDisplayText(display: DisplayValue, fallback: string): string {\n  if (!display || isEmpty(display.text)) {\n    return fallback;\n  }\n  return display.text;\n}\n","import { Registry } from '../utils/Registry';\nimport { FieldConfigPropertyItem } from '../types/fieldOverrides';\n\nexport class FieldConfigOptionsRegistry extends Registry<FieldConfigPropertyItem> {}\n","import { Registry, RegistryItem } from '../utils/Registry';\nimport { ComponentType } from 'react';\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\nimport { DataFrame, InterpolateFunction, VariableSuggestionsScope, VariableSuggestion } from '../types';\n\nexport interface StandardEditorContext {\n  data?: DataFrame[]; // All results\n  replaceVariables?: InterpolateFunction;\n  getSuggestions?: (scope?: VariableSuggestionsScope) => VariableSuggestion[];\n}\n\nexport interface StandardEditorProps<TValue = any, TSettings = any> {\n  value: TValue;\n  onChange: (value?: TValue) => void;\n  item: StandardEditorsRegistryItem<TValue, TSettings>;\n  context: StandardEditorContext;\n}\nexport interface StandardEditorsRegistryItem<TValue = any, TSettings = any> extends RegistryItem {\n  editor: ComponentType<StandardEditorProps<TValue, TSettings>>;\n  settings?: TSettings;\n}\nexport const standardFieldConfigEditorRegistry = new FieldConfigOptionsRegistry();\n\nexport const standardEditorsRegistry = new Registry<StandardEditorsRegistryItem<any>>();\n","import { DataLink, FieldOverrideContext, SelectableValue, ThresholdsConfig, ValueMapping } from '../../types';\n\nexport const identityOverrideProcessor = <T>(value: T, _context: FieldOverrideContext, _settings: any) => {\n  return value;\n};\n\nexport interface NumberFieldConfigSettings {\n  placeholder?: string;\n  integer?: boolean;\n  min?: number;\n  max?: number;\n  step?: number;\n}\n\nexport const numberOverrideProcessor = (\n  value: any,\n  context: FieldOverrideContext,\n  settings?: NumberFieldConfigSettings\n) => {\n  if (value === undefined || value === null) {\n    return undefined;\n  }\n\n  return parseFloat(value);\n};\n\nexport interface DataLinksFieldConfigSettings {}\n\nexport const dataLinksOverrideProcessor = (\n  value: any,\n  _context: FieldOverrideContext,\n  _settings?: DataLinksFieldConfigSettings\n) => {\n  return value as DataLink[];\n};\n\nexport interface ValueMappingFieldConfigSettings {}\n\nexport const valueMappingsOverrideProcessor = (\n  value: any,\n  _context: FieldOverrideContext,\n  _settings?: ValueMappingFieldConfigSettings\n) => {\n  return value as ValueMapping[]; // !!!! likely not !!!!\n};\n\nexport interface SelectFieldConfigSettings<T> {\n  allowCustomValue?: boolean;\n\n  /** The default options */\n  options: Array<SelectableValue<T>>;\n\n  /** Optionally use the context to define the options */\n  getOptions?: (context: FieldOverrideContext) => Promise<Array<SelectableValue<T>>>;\n}\n\nexport const selectOverrideProcessor = (\n  value: any,\n  _context: FieldOverrideContext,\n  _settings?: SelectFieldConfigSettings<any>\n) => {\n  return value;\n};\n\nexport interface StringFieldConfigSettings {\n  placeholder?: string;\n  maxLength?: number;\n  expandTemplateVars?: boolean;\n  useTextarea?: boolean;\n  rows?: number;\n}\n\nexport const stringOverrideProcessor = (\n  value: any,\n  context: FieldOverrideContext,\n  settings?: StringFieldConfigSettings\n) => {\n  if (value === null || value === undefined) {\n    return value;\n  }\n  if (settings && settings.expandTemplateVars && context.replaceVariables) {\n    return context.replaceVariables(value, context.field!.state!.scopedVars);\n  }\n  return `${value}`;\n};\n\nexport interface ThresholdsFieldConfigSettings {\n  // Anything?\n}\n\nexport const thresholdsOverrideProcessor = (\n  value: any,\n  _context: FieldOverrideContext,\n  _settings?: ThresholdsFieldConfigSettings\n) => {\n  return value as ThresholdsConfig; // !!!! likely not !!!!\n};\n\nexport interface UnitFieldConfigSettings {}\n\nexport const unitOverrideProcessor = (\n  value: boolean,\n  _context: FieldOverrideContext,\n  _settings?: UnitFieldConfigSettings\n) => {\n  return value;\n};\n\nexport const booleanOverrideProcessor = (\n  value: boolean,\n  _context: FieldOverrideContext,\n  _settings?: ThresholdsFieldConfigSettings\n) => {\n  return value; // !!!! likely not !!!!\n};\n\nexport interface ColorFieldConfigSettings {\n  allowUndefined?: boolean;\n  textWhenUndefined?: string; // Pick Color\n  disableNamedColors?: boolean;\n}\n","import toNumber from 'lodash/toNumber';\nimport { DataFrame, DisplayValue, GrafanaTheme, TimeZone } from '../types';\nimport { getDisplayProcessor } from './displayProcessor';\nimport { formattedValueToString } from '../valueFormats';\n\n/**\n *\n * @param frame\n * @param rowIndex\n * @param options\n * @internal\n */\nexport function getFieldDisplayValuesProxy(\n  frame: DataFrame,\n  rowIndex: number,\n  options: {\n    theme: GrafanaTheme;\n    timeZone?: TimeZone;\n  }\n): Record<string, DisplayValue> {\n  return new Proxy({} as Record<string, DisplayValue>, {\n    get: (obj: any, key: string) => {\n      // 1. Match the name\n      let field = frame.fields.find(f => key === f.name);\n      if (!field) {\n        // 2. Match the array index\n        const k = toNumber(key);\n        field = frame.fields[k];\n      }\n      if (!field) {\n        // 3. Match the title\n        field = frame.fields.find(f => key === f.config.displayName);\n      }\n      if (!field) {\n        return undefined;\n      }\n      if (!field.display) {\n        // Lazy load the display processor\n        field.display = getDisplayProcessor({\n          field,\n          theme: options.theme,\n          timeZone: options.timeZone,\n        });\n      }\n      const raw = field.values.get(rowIndex);\n      const disp = field.display(raw);\n      disp.toString = () => formattedValueToString(disp);\n      return disp;\n    },\n  });\n}\n","import {\n  DynamicConfigValue,\n  FieldConfig,\n  DataFrame,\n  Field,\n  FieldType,\n  ThresholdsMode,\n  FieldColorMode,\n  ColorScheme,\n  FieldOverrideContext,\n  ScopedVars,\n  ApplyFieldOverrideOptions,\n  FieldConfigPropertyItem,\n  LinkModel,\n  InterpolateFunction,\n  ValueLinkConfig,\n  GrafanaTheme,\n  TimeZone,\n} from '../types';\nimport { fieldMatchers, ReducerID, reduceField } from '../transformations';\nimport { FieldMatcher } from '../types/transformations';\nimport isNumber from 'lodash/isNumber';\nimport set from 'lodash/set';\nimport unset from 'lodash/unset';\nimport get from 'lodash/get';\nimport { getDisplayProcessor } from './displayProcessor';\nimport { guessFieldTypeForField } from '../dataframe';\nimport { standardFieldConfigEditorRegistry } from './standardFieldConfigEditorRegistry';\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\nimport { DataLinkBuiltInVars, locationUtil } from '../utils';\nimport { formattedValueToString } from '../valueFormats';\nimport { getFieldDisplayValuesProxy } from './getFieldDisplayValuesProxy';\nimport { formatLabels } from '../utils/labels';\nimport { getFrameDisplayName, getFieldDisplayName } from './fieldState';\nimport { getTimeField } from '../dataframe/processDataFrame';\n\ninterface OverrideProps {\n  match: FieldMatcher;\n  properties: DynamicConfigValue[];\n}\n\ninterface GlobalMinMax {\n  min: number;\n  max: number;\n}\n\nexport function findNumericFieldMinMax(data: DataFrame[]): GlobalMinMax {\n  let min = Number.MAX_VALUE;\n  let max = Number.MIN_VALUE;\n\n  const reducers = [ReducerID.min, ReducerID.max];\n\n  for (const frame of data) {\n    for (const field of frame.fields) {\n      if (field.type === FieldType.number) {\n        const stats = reduceField({ field, reducers });\n        if (stats[ReducerID.min] < min) {\n          min = stats[ReducerID.min];\n        }\n        if (stats[ReducerID.max] > max) {\n          max = stats[ReducerID.max];\n        }\n      }\n    }\n  }\n\n  return { min, max };\n}\n\n/**\n * Return a copy of the DataFrame with all rules applied\n */\nexport function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFrame[] {\n  if (!options.data) {\n    return [];\n  }\n\n  const source = options.fieldConfig;\n  if (!source) {\n    return options.data;\n  }\n\n  const fieldConfigRegistry = options.fieldConfigRegistry ?? standardFieldConfigEditorRegistry;\n\n  let range: GlobalMinMax | undefined = undefined;\n\n  // Prepare the Matchers\n  const override: OverrideProps[] = [];\n  if (source.overrides) {\n    for (const rule of source.overrides) {\n      const info = fieldMatchers.get(rule.matcher.id);\n      if (info) {\n        override.push({\n          match: info.get(rule.matcher.options),\n          properties: rule.properties,\n        });\n      }\n    }\n  }\n\n  return options.data.map((frame, index) => {\n    const scopedVars: ScopedVars = {\n      __series: { text: 'Series', value: { name: getFrameDisplayName(frame, index) } }, // might be missing\n    };\n\n    const fields: Field[] = frame.fields.map(field => {\n      // Config is mutable within this scope\n      const fieldScopedVars = { ...scopedVars };\n      const displayName = getFieldDisplayName(field, frame, options.data);\n\n      fieldScopedVars['__field'] = {\n        text: 'Field',\n        value: {\n          name: displayName, // Generally appropriate (may include the series name if useful)\n          labels: formatLabels(field.labels!),\n          label: field.labels,\n        },\n      };\n\n      field.state = {\n        ...field.state,\n        scopedVars: fieldScopedVars,\n        displayName,\n      };\n\n      const config: FieldConfig = { ...field.config };\n      const context = {\n        field,\n        data: options.data!,\n        dataFrameIndex: index,\n        replaceVariables: options.replaceVariables,\n        fieldConfigRegistry: fieldConfigRegistry,\n      };\n\n      // Anything in the field config that's not set by the datasource\n      // will be filled in by panel's field configuration\n      setFieldConfigDefaults(config, source.defaults, context);\n\n      // Find any matching rules and then override\n      for (const rule of override) {\n        if (rule.match(field, frame, options.data!)) {\n          for (const prop of rule.properties) {\n            // config.scopedVars is set already here\n            setDynamicConfigValue(config, prop, context);\n          }\n        }\n      }\n\n      // Try harder to set a real value that is not 'other'\n      let type = field.type;\n      if (!type || type === FieldType.other) {\n        const t = guessFieldTypeForField(field);\n        if (t) {\n          type = t;\n        }\n      }\n\n      // Some units have an implied range\n      if (config.unit === 'percent') {\n        if (!isNumber(config.min)) {\n          config.min = 0;\n        }\n        if (!isNumber(config.max)) {\n          config.max = 100;\n        }\n      } else if (config.unit === 'percentunit') {\n        if (!isNumber(config.min)) {\n          config.min = 0;\n        }\n        if (!isNumber(config.max)) {\n          config.max = 1;\n        }\n      }\n\n      // Set the Min/Max value automatically\n      if (options.autoMinMax && field.type === FieldType.number) {\n        if (!isNumber(config.min) || !isNumber(config.max)) {\n          if (!range) {\n            range = findNumericFieldMinMax(options.data!); // Global value\n          }\n          if (!isNumber(config.min)) {\n            config.min = range.min;\n          }\n          if (!isNumber(config.max)) {\n            config.max = range.max;\n          }\n        }\n      }\n\n      // Overwrite the configs\n      const f: Field = {\n        ...field,\n        config,\n        type,\n        state: {\n          ...field.state,\n          displayName: null,\n        },\n      };\n\n      // and set the display processor using it\n      f.display = getDisplayProcessor({\n        field: f,\n        theme: options.theme,\n        timeZone: options.timeZone,\n      });\n\n      // Attach data links supplier\n      f.getLinks = getLinksSupplier(frame, f, fieldScopedVars, context.replaceVariables, {\n        theme: options.theme,\n        timeZone: options.timeZone,\n      });\n\n      return f;\n    });\n\n    return {\n      ...frame,\n      fields,\n    };\n  });\n}\n\nexport interface FieldOverrideEnv extends FieldOverrideContext {\n  fieldConfigRegistry: FieldConfigOptionsRegistry;\n}\n\nexport function setDynamicConfigValue(config: FieldConfig, value: DynamicConfigValue, context: FieldOverrideEnv) {\n  const reg = context.fieldConfigRegistry;\n  const item = reg.getIfExists(value.id);\n  if (!item || !item.shouldApply(context.field!)) {\n    return;\n  }\n\n  const val = item.process(value.value, context, item.settings);\n\n  const remove = val === undefined || val === null;\n\n  if (remove) {\n    if (item.isCustom && config.custom) {\n      unset(config.custom, item.path);\n    } else {\n      unset(config, item.path);\n    }\n  } else {\n    if (item.isCustom) {\n      if (!config.custom) {\n        config.custom = {};\n      }\n      set(config.custom, item.path, val);\n    } else {\n      set(config, item.path, val);\n    }\n  }\n}\n\n// config -> from DS\n// defaults -> from Panel config\nexport function setFieldConfigDefaults(config: FieldConfig, defaults: FieldConfig, context: FieldOverrideEnv) {\n  for (const fieldConfigProperty of context.fieldConfigRegistry.list()) {\n    if (fieldConfigProperty.isCustom && !config.custom) {\n      config.custom = {};\n    }\n    processFieldConfigValue(\n      fieldConfigProperty.isCustom ? config.custom : config,\n      fieldConfigProperty.isCustom ? defaults.custom : defaults,\n      fieldConfigProperty,\n      context\n    );\n  }\n\n  validateFieldConfig(config);\n}\n\nconst processFieldConfigValue = (\n  destination: Record<string, any>, // it's mutable\n  source: Record<string, any>,\n  fieldConfigProperty: FieldConfigPropertyItem,\n  context: FieldOverrideEnv\n) => {\n  const currentConfig = get(destination, fieldConfigProperty.path);\n\n  if (currentConfig === null || currentConfig === undefined) {\n    const item = context.fieldConfigRegistry.getIfExists(fieldConfigProperty.id);\n    if (!item) {\n      return;\n    }\n\n    if (item && item.shouldApply(context.field!)) {\n      const val = item.process(get(source, item.path), context, item.settings);\n      if (val !== undefined && val !== null) {\n        set(destination, item.path, val);\n      }\n    }\n  }\n};\n\n/**\n * This checks that all options on FieldConfig make sense.  It mutates any value that needs\n * fixed.  In particular this makes sure that the first threshold value is -Infinity (not valid in JSON)\n */\nexport function validateFieldConfig(config: FieldConfig) {\n  const { thresholds } = config;\n  if (thresholds) {\n    if (!thresholds.mode) {\n      thresholds.mode = ThresholdsMode.Absolute;\n    }\n    if (!thresholds.steps) {\n      thresholds.steps = [];\n    } else if (thresholds.steps.length) {\n      // First value is always -Infinity\n      // JSON saves it as null\n      thresholds.steps[0].value = -Infinity;\n    }\n  }\n\n  if (!config.color) {\n    if (thresholds) {\n      config.color = {\n        mode: FieldColorMode.Thresholds,\n      };\n    }\n    // No Color settings\n  } else if (!config.color.mode) {\n    // Without a mode, skip color altogether\n    delete config.color;\n  } else {\n    const { color } = config;\n    if (color.mode === FieldColorMode.Scheme) {\n      if (!color.schemeName) {\n        color.schemeName = ColorScheme.BrBG;\n      }\n    } else {\n      delete color.schemeName;\n    }\n  }\n\n  // Verify that max > min (swap if necessary)\n  if (config.hasOwnProperty('min') && config.hasOwnProperty('max') && config.min! > config.max!) {\n    const tmp = config.max;\n    config.max = config.min;\n    config.min = tmp;\n  }\n}\n\nexport const getLinksSupplier = (\n  frame: DataFrame,\n  field: Field,\n  fieldScopedVars: ScopedVars,\n  replaceVariables: InterpolateFunction,\n  options: {\n    theme: GrafanaTheme;\n    timeZone?: TimeZone;\n  }\n) => (config: ValueLinkConfig): Array<LinkModel<Field>> => {\n  if (!field.config.links || field.config.links.length === 0) {\n    return [];\n  }\n  const timeRangeUrl = locationUtil.getTimeRangeUrlParams();\n  const { timeField } = getTimeField(frame);\n\n  return field.config.links.map(link => {\n    let href = link.url;\n    let dataFrameVars = {};\n    let valueVars = {};\n\n    const info: LinkModel<Field> = {\n      href: locationUtil.assureBaseUrl(href.replace(/\\n/g, '')),\n      title: link.title || '',\n      target: link.targetBlank ? '_blank' : '_self',\n      origin: field,\n    };\n\n    const variablesQuery = locationUtil.getVariablesUrlParams();\n\n    // We are not displaying reduction result\n    if (config.valueRowIndex !== undefined && !isNaN(config.valueRowIndex)) {\n      const fieldsProxy = getFieldDisplayValuesProxy(frame, config.valueRowIndex, options);\n      valueVars = {\n        raw: field.values.get(config.valueRowIndex),\n        numeric: fieldsProxy[field.name].numeric,\n        text: fieldsProxy[field.name].text,\n        time: timeField ? timeField.values.get(config.valueRowIndex) : undefined,\n      };\n      dataFrameVars = {\n        __data: {\n          value: {\n            name: frame.name,\n            refId: frame.refId,\n            fields: fieldsProxy,\n          },\n          text: 'Data',\n        },\n      };\n    } else {\n      if (config.calculatedValue) {\n        valueVars = {\n          raw: config.calculatedValue.numeric,\n          numeric: config.calculatedValue.numeric,\n          text: formattedValueToString(config.calculatedValue),\n        };\n      }\n    }\n\n    const variables = {\n      ...fieldScopedVars,\n      __value: {\n        text: 'Value',\n        value: valueVars,\n      },\n      ...dataFrameVars,\n      [DataLinkBuiltInVars.keepTime]: {\n        text: timeRangeUrl,\n        value: timeRangeUrl,\n      },\n      [DataLinkBuiltInVars.includeVars]: {\n        text: variablesQuery,\n        value: variablesQuery,\n      },\n    };\n\n    info.href = replaceVariables(info.href, variables);\n    info.title = replaceVariables(info.title, variables);\n    info.href = locationUtil.processUrl(info.href);\n\n    return info;\n  });\n};\n","export * from './fieldDisplay';\nexport * from './displayProcessor';\nexport * from './scale';\nexport * from './standardFieldConfigEditorRegistry';\nexport * from './overrides/processors';\nexport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\n\nexport { applyFieldOverrides, validateFieldConfig } from './fieldOverrides';\nexport { getFieldDisplayValuesProxy } from './getFieldDisplayValuesProxy';\nexport { getFieldDisplayName, getFrameDisplayName } from './fieldState';\n","import { AdHocVariableFilter, AdHocVariableModel, VariableHide } from 'app/features/templating/types';\nimport { getInstanceState, NEW_VARIABLE_ID, VariablePayload } from '../state/types';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\n\nexport interface AdHocVariabelFilterUpdate {\n  index: number;\n  filter: AdHocVariableFilter;\n}\nexport interface AdHocVariableEditorState {\n  infoText: string;\n  dataSources: Array<{ text: string; value: string }>;\n}\n\nexport const initialAdHocVariableModelState: AdHocVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  type: 'adhoc',\n  name: '',\n  hide: VariableHide.dontHide,\n  label: '',\n  skipUrlSync: false,\n  index: -1,\n  initLock: null,\n  datasource: null,\n  filters: [],\n};\n\nexport const adHocVariableSlice = createSlice({\n  name: 'templating/adhoc',\n  initialState: initialVariablesState,\n  reducers: {\n    filterAdded: (state: VariablesState, action: PayloadAction<VariablePayload<AdHocVariableFilter>>) => {\n      const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n      instanceState.filters.push(action.payload.data);\n    },\n    filterRemoved: (state: VariablesState, action: PayloadAction<VariablePayload<number>>) => {\n      const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n      const index = action.payload.data;\n\n      instanceState.filters.splice(index, 1);\n    },\n    filterUpdated: (state: VariablesState, action: PayloadAction<VariablePayload<AdHocVariabelFilterUpdate>>) => {\n      const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n      const { filter, index } = action.payload.data;\n\n      instanceState.filters[index] = filter;\n    },\n    filtersRestored: (state: VariablesState, action: PayloadAction<VariablePayload<AdHocVariableFilter[]>>) => {\n      const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n      instanceState.filters = action.payload.data;\n    },\n  },\n});\n\nexport const { filterAdded, filterRemoved, filterUpdated, filtersRestored } = adHocVariableSlice.actions;\nexport const adHocVariableReducer = adHocVariableSlice.reducer;\n","export * from './valueFormats';\n","import { RegistryItem, Registry } from './Registry';\n\nexport enum BinaryOperationID {\n  Add = '+',\n  Subtract = '-',\n  Divide = '/',\n  Multiply = '*',\n}\n\nexport type BinaryOperation = (left: number, right: number) => number;\n\ninterface BinaryOperatorInfo extends RegistryItem {\n  operation: BinaryOperation;\n}\n\nexport const binaryOperators = new Registry<BinaryOperatorInfo>(() => {\n  return [\n    {\n      id: BinaryOperationID.Add,\n      name: 'Add',\n      operation: (a: number, b: number) => a + b,\n    },\n    {\n      id: BinaryOperationID.Subtract,\n      name: 'Subtract',\n      operation: (a: number, b: number) => a - b,\n    },\n    {\n      id: BinaryOperationID.Multiply,\n      name: 'Multiply',\n      operation: (a: number, b: number) => a * b,\n    },\n    {\n      id: BinaryOperationID.Divide,\n      name: 'Divide',\n      operation: (a: number, b: number) => a / b,\n    },\n  ];\n});\n","var path = 'public/app/features/datasources/partials/tls_auth_settings.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form>\\n    <h6>TLS Auth Details</h6>\\n    <info-popover mode=header>TLS Certs are encrypted and stored in the Grafana database.</info-popover>\\n  </div>\\n  <div ng-if=current.jsonData.tlsAuthWithCACert>\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form gf-form--v-stretch\\\"><label class=\\\"gf-form-label width-7\\\">CA Cert</label></div>\\n      <div class=\\\"gf-form gf-form--grow\\\" ng-if=!current.secureJsonFields.tlsCACert>\\n         <textarea rows=7 class=\\\"gf-form-input gf-form-textarea\\\" ng-model=current.secureJsonData.tlsCACert placeholder=\\\"Begins with -----BEGIN CERTIFICATE-----\\\"></textarea>\\n      </div>\\n\\n      <div class=gf-form ng-if=current.secureJsonFields.tlsCACert>\\n        <input type=text class=\\\"gf-form-input max-width-12\\\" disabled=disabled value=configured />\\n        <a class=\\\"btn btn-secondary gf-form-btn\\\" href=# ng-click=\\\"current.secureJsonFields.tlsCACert = false\\\">reset</a>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=current.jsonData.tlsAuth>\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form gf-form--v-stretch\\\"><label class=\\\"gf-form-label width-7\\\">Client Cert</label></div>\\n      <div class=\\\"gf-form gf-form--grow\\\" ng-if=!current.secureJsonFields.tlsClientCert>\\n         <textarea rows=7 class=\\\"gf-form-input gf-form-textarea\\\" ng-model=current.secureJsonData.tlsClientCert placeholder=\\\"Begins with -----BEGIN CERTIFICATE-----\\\" required></textarea>\\n      </div>\\n      <div class=gf-form ng-if=current.secureJsonFields.tlsClientCert>\\n        <input type=text class=\\\"gf-form-input max-width-12\\\" disabled=disabled value=configured />\\n        <a class=\\\"btn btn-secondary gf-form-btn\\\" href=# ng-click=\\\"current.secureJsonFields.tlsClientCert = false\\\">reset</a>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form gf-form--v-stretch\\\"><label class=\\\"gf-form-label width-7\\\">Client Key</label></div>\\n      <div class=\\\"gf-form gf-form--grow\\\" ng-if=!current.secureJsonFields.tlsClientKey>\\n         <textarea rows=7 class=\\\"gf-form-input gf-form-textarea\\\" ng-model=current.secureJsonData.tlsClientKey placeholder=\\\"Begins with -----BEGIN RSA PRIVATE KEY-----\\\" required></textarea>\\n      </div>\\n      <div class=gf-form ng-if=current.secureJsonFields.tlsClientKey>\\n        <input type=text class=\\\"gf-form-input max-width-12\\\" disabled=disabled value=configured />\\n        <a class=\\\"btn btn-secondary gf-form-btn\\\" href=# ng-click=\\\"current.secureJsonFields.tlsClientKey = false\\\">reset</a>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/grafana/partials/annotations.editor.html';\nvar html = \"\\n<div class=gf-form-group>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-9\\\">\\n\\t\\t\\t\\tFilter by\\n\\t\\t\\t\\t<info-popover mode=right-normal>\\n\\t\\t\\t\\t\\t<ul>\\n\\t\\t\\t\\t\\t\\t<li>Dashboard: This will fetch annotation and alert state changes for whole dashboard and show them only on the event's originating panel.</li>\\n\\t\\t\\t\\t\\t\\t<li>Tags: This will fetch any annotation events that match the tags filter.</li>\\n\\t\\t\\t\\t\\t</ul>\\n\\t\\t\\t\\t</info-popover>\\n\\t\\t\\t</span>\\n\\t\\t\\t<div class=\\\"gf-form-select-wrapper width-8\\\">\\n\\t\\t\\t\\t<select class=gf-form-input ng-model=ctrl.annotation.type ng-options=\\\"f.value as f.text for f in ctrl.types\\\">\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=gf-form-label>Max limit</span>\\n\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t<select class=gf-form-input ng-model=ctrl.annotation.limit ng-options=\\\"f for f in [10,50,100,200,300,500,1000,2000]\\\">\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.annotation.type === 'tags'\\\">\\n\\t\\t\\t<gf-form-switch class=gf-form label=\\\"Match any\\\" label-class=width-9 checked=ctrl.annotation.matchAny on-change=ctrl.refresh() tooltip=\\\"By default Grafana only shows annotations that match all tags in the query. Enabling this returns annotations that match any of the tags in the query.\\\"></gf-form-switch>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.annotation.type === 'tags'\\\">\\n\\t\\t\\t<span class=gf-form-label>\\n\\t\\t\\t\\tTags\\n\\t\\t\\t\\t<info-popover mode=right-normal>\\n\\t\\t\\t\\t\\tA tag entered here as 'foo' will match\\n\\t\\t\\t\\t\\t<ul>\\n\\t\\t\\t\\t\\t\\t<li>annotation tags 'foo'</li>\\n\\t\\t\\t\\t\\t\\t<li>annotation key-value tags formatted as 'foo:bar'</li>\\n\\t\\t\\t\\t\\t</ul>\\n\\t\\t\\t\\t</info-popover>\\n\\t\\t\\t</span>\\n\\t\\t\\t<bootstrap-tagsinput ng-model=ctrl.annotation.tags tagclass=\\\"label label-tag\\\" placeholder=\\\"add tags\\\">\\n\\t\\t\\t</bootstrap-tagsinput>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/panel/text/module.html';\nvar html = \"<p class=\\\"markdown-html panel-text-content\\\" ng-bind-html=ctrl.content ng-show=ctrl.content>\\n</p>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","export interface UserOrgDTO {\n  orgId: number;\n  name: string;\n  role: OrgRole;\n}\n\nexport enum OrgRole {\n  Admin = 'Admin',\n  Editor = 'Editor',\n  Viewer = 'Viewer',\n}\n","import { eventFactory } from './utils';\nimport { DataQueryError, DataQueryResponseData } from './datasource';\nimport { AngularPanelMenuItem } from './panel';\nimport { DataFrame } from './dataFrame';\n\n/** Payloads */\nexport interface PanelChangeViewPayload {\n  fullscreen?: boolean;\n  edit?: boolean;\n  panelId?: number;\n  toggle?: boolean;\n}\n\n/** Events */\nexport const refresh = eventFactory('refresh');\nexport const componentDidMount = eventFactory('component-did-mount');\nexport const dataError = eventFactory<DataQueryError>('data-error');\nexport const dataReceived = eventFactory<DataQueryResponseData[]>('data-received');\nexport const dataFramesReceived = eventFactory<DataFrame[]>('data-frames-received');\nexport const dataSnapshotLoad = eventFactory<DataQueryResponseData[]>('data-snapshot-load');\nexport const editModeInitialized = eventFactory('init-edit-mode');\nexport const initPanelActions = eventFactory<AngularPanelMenuItem[]>('init-panel-actions');\nexport const panelChangeView = eventFactory<PanelChangeViewPayload>('panel-change-view');\nexport const panelInitialized = eventFactory('panel-initialized');\nexport const panelSizeChanged = eventFactory('panel-size-changed');\nexport const panelTeardown = eventFactory('panel-teardown');\nexport const render = eventFactory<any>('render');\nexport const viewModeChanged = eventFactory('view-mode-changed');\n","var path = 'public/app/plugins/datasource/influxdb/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl can-collapse=true has-text-edit-mode=true>\\n  <div ng-if=ctrl.target.rawQuery>\\n    <div class=gf-form>\\n      <textarea rows=3 class=gf-form-input ng-model=ctrl.target.query spellcheck=false placeholder=\\\"InfluxDB Query\\\" ng-model-onblur ng-change=ctrl.refresh()></textarea>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword\\\">FORMAT AS</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.target.resultFormat ng-options=\\\"f.value as f.text for f in ctrl.resultFormats\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=\\\"gf-form max-width-25\\\" ng-hide=\\\"ctrl.target.resultFormat === 'table'\\\">\\n        <label class=\\\"gf-form-label query-keyword\\\">ALIAS BY</label>\\n        <input type=text class=gf-form-input ng-model=ctrl.target.alias spellcheck=false placeholder=\\\"Naming pattern\\\" ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=!ctrl.target.rawQuery>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">FROM</label>\\n\\n        <metric-segment segment=ctrl.policySegment get-options=ctrl.getPolicySegments() on-change=ctrl.policyChanged()></metric-segment>\\n        <metric-segment segment=ctrl.measurementSegment get-options=ctrl.getMeasurements($query) on-change=ctrl.measurementChanged()></metric-segment>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword\\\">WHERE</label>\\n      </div>\\n\\n      <div class=gf-form ng-repeat=\\\"segment in ctrl.tagSegments\\\">\\n        <metric-segment segment=segment get-options=\\\"ctrl.getTagsOrValues(segment, $index)\\\" on-change=\\\"ctrl.tagSegmentUpdated(segment, $index)\\\"></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline ng-repeat=\\\"selectParts in ctrl.queryModel.selectModels\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\"> <span ng-show=\\\"$index === 0\\\">SELECT</span>&nbsp; </label>\\n      </div>\\n\\n      <div class=gf-form ng-repeat=\\\"part in selectParts\\\">\\n        <query-part-editor class=\\\"gf-form-label query-part\\\" part=part handle-event=\\\"ctrl.handleSelectPartEvent(selectParts, part, $event)\\\">\\n        </query-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=dropdown dropdown-typeahead2=ctrl.selectMenu dropdown-typeahead-on-select=\\\"ctrl.addSelectPart(selectParts, $item, $subItem)\\\" button-template-class=\\\"gf-form-label query-part\\\">\\n        </label>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">\\n          <span>GROUP BY</span>\\n        </label>\\n\\n        <query-part-editor ng-repeat=\\\"part in ctrl.queryModel.groupByParts\\\" part=part class=\\\"gf-form-label query-part\\\" handle-event=\\\"ctrl.handleGroupByPartEvent(part, $index, $event)\\\">\\n        </query-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <metric-segment segment=ctrl.groupBySegment get-options=ctrl.getGroupByOptions() on-change=\\\"ctrl.groupByAction(part, $index)\\\"></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline ng-if=\\\"ctrl.target.orderByTime === 'DESC'\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">ORDER BY</label>\\n        <label class=\\\"gf-form-label pointer\\\" ng-click=ctrl.removeOrderByTime()>time <span class=query-keyword>DESC</span> <icon name=\\\"'times'\\\" style=margin-bottom:0></icon></label>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline ng-if=ctrl.target.limit>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">LIMIT</label>\\n        <input type=text class=\\\"gf-form-input width-9\\\" ng-model=ctrl.target.limit spellcheck=false placeholder=\\\"No Limit\\\" ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline ng-if=ctrl.target.slimit>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">SLIMIT</label>\\n        <input type=text class=\\\"gf-form-input width-9\\\" ng-model=ctrl.target.slimit spellcheck=false placeholder=\\\"No Limit\\\" ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline ng-if=ctrl.target.tz>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">tz</label>\\n        <input type=text class=\\\"gf-form-input width-9\\\" ng-model=ctrl.target.tz spellcheck=false placeholder=\\\"No Timezone\\\" ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">FORMAT AS</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.target.resultFormat ng-options=\\\"f.value as f.text for f in ctrl.resultFormats\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline ng-hide=\\\"ctrl.target.resultFormat === 'table'\\\">\\n      <div class=\\\"gf-form max-width-30\\\">\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">ALIAS BY</label>\\n        <input type=text class=gf-form-input ng-model=ctrl.target.alias spellcheck=false placeholder=\\\"Naming pattern\\\" ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n  </div>\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/panel/graph/tab_legend.html';\nvar html = \"<div class=editor-row>\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Options</h5>\\n    <gf-form-switch class=gf-form label=Show label-class=width-7 checked=ctrl.panel.legend.show on-change=ctrl.render() aria-label=\\\"gpl show legend\\\">\\n    </gf-form-switch>\\n    <gf-form-switch class=gf-form label=\\\"As Table\\\" label-class=width-7 checked=ctrl.panel.legend.alignAsTable on-change=ctrl.render()>\\n    </gf-form-switch>\\n    <gf-form-switch class=gf-form label=\\\"To the right\\\" label-class=width-7 checked=ctrl.panel.legend.rightSide on-change=ctrl.render()>\\n    </gf-form-switch>\\n    <div ng-if=ctrl.panel.legend.rightSide class=gf-form>\\n      <label class=\\\"gf-form-label width-7\\\">Width</label>\\n      <input type=number class=\\\"gf-form-input max-width-5\\\" placeholder=250 bs-tooltip=\\\"'Set a min-width for the legend side table/block'\\\" data-placement=right ng-model=ctrl.panel.legend.sideWidth ng-change=ctrl.render() ng-model-onblur/>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Values</h5>\\n\\n    <div class=gf-form-inline>\\n      <gf-form-switch class=gf-form label=Min label-class=width-7 checked=ctrl.panel.legend.min on-change=ctrl.legendValuesOptionChanged()>\\n      </gf-form-switch>\\n\\n      <gf-form-switch class=\\\"gf-form max-width-12\\\" label=Max label-class=width-7 switch-class=max-width-5 checked=ctrl.panel.legend.max on-change=ctrl.legendValuesOptionChanged()>\\n      </gf-form-switch>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <gf-form-switch class=gf-form label=Avg label-class=width-7 checked=ctrl.panel.legend.avg on-change=ctrl.legendValuesOptionChanged()>\\n      </gf-form-switch>\\n\\n      <gf-form-switch class=\\\"gf-form max-width-12\\\" label=Current label-class=width-7 switch-class=max-width-5 checked=ctrl.panel.legend.current on-change=ctrl.legendValuesOptionChanged()>\\n      </gf-form-switch>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <gf-form-switch class=gf-form label=Total label-class=width-7 checked=ctrl.panel.legend.total on-change=ctrl.legendValuesOptionChanged()>\\n      </gf-form-switch>\\n\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-7\\\">Decimals</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto bs-tooltip=\\\"'Override automatic decimal precision for legend and tooltips'\\\" data-placement=right ng-model=ctrl.panel.decimals ng-change=ctrl.render() ng-model-onblur/>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Hide series</h5>\\n    <gf-form-switch class=gf-form label=\\\"With only nulls\\\" label-class=width-7 checked=ctrl.panel.legend.hideEmpty on-change=ctrl.render()>\\n    </gf-form-switch>\\n    <gf-form-switch class=gf-form label=\\\"With only zeros\\\" label-class=width-7 checked=ctrl.panel.legend.hideZero on-change=ctrl.render()>\\n    </gf-form-switch>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/partials/modal.html';\nvar html = \"<div class=modal-header>\\n  <button type=button class=close data-dismiss=modal aria-hidden=true>×</button>\\n  <h3>{{modal.title}}</h3>\\n</div>\\n<div class=modal-body>\\n\\n  <div ng-bind-html=modal.body></div>\\n\\n</div>\\n<div class=modal-footer>\\n  <button type=button class=\\\"btn btn-danger\\\" ng-click=dismiss()>Close</button>\\n</div>\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { ComponentClass } from 'react';\nimport { KeyValue } from './data';\nimport { NavModel } from './navModel';\nimport { PluginMeta, GrafanaPlugin, PluginIncludeType } from './plugin';\n\nexport enum CoreApp {\n  Dashboard = 'dashboard',\n  Explore = 'explore',\n}\n\nexport interface AppRootProps<T = KeyValue> {\n  meta: AppPluginMeta<T>;\n\n  path: string; // The URL path to this page\n  query: KeyValue; // The URL query parameters\n\n  /**\n   * Pass the nav model to the container... is there a better way?\n   */\n  onNavChanged: (nav: NavModel) => void;\n}\n\nexport interface AppPluginMeta<T = KeyValue> extends PluginMeta<T> {\n  // TODO anything specific to apps?\n}\n\nexport class AppPlugin<T = KeyValue> extends GrafanaPlugin<AppPluginMeta<T>> {\n  // Content under: /a/${plugin-id}/*\n  root?: ComponentClass<AppRootProps<T>>;\n  rootNav?: NavModel; // Initial navigation model\n\n  // Old style pages\n  angularPages?: { [component: string]: any };\n\n  /**\n   * Called after the module has loaded, and before the app is used.\n   * This function may be called multiple times on the same instance.\n   * The first time, `this.meta` will be undefined\n   */\n  init(meta: AppPluginMeta) {}\n\n  /**\n   * Set the component displayed under:\n   *   /a/${plugin-id}/*\n   */\n  setRootPage(root: ComponentClass<AppRootProps<T>>, rootNav?: NavModel) {\n    this.root = root;\n    this.rootNav = rootNav;\n    return this;\n  }\n\n  setComponentsFromLegacyExports(pluginExports: any) {\n    if (pluginExports.ConfigCtrl) {\n      this.angularConfigCtrl = pluginExports.ConfigCtrl;\n    }\n\n    if (this.meta && this.meta.includes) {\n      for (const include of this.meta.includes) {\n        if (include.type === PluginIncludeType.page && include.component) {\n          const exp = pluginExports[include.component];\n\n          if (!exp) {\n            console.warn('App Page uses unknown component: ', include.component, this.meta);\n            continue;\n          }\n\n          if (!this.angularPages) {\n            this.angularPages = {};\n          }\n\n          this.angularPages[include.component] = exp;\n        }\n      }\n    }\n  }\n}\n\n/**\n * Defines life cycle of a feature\n * @internal\n */\nexport enum FeatureState {\n  alpha = 'alpha',\n  beta = 'beta',\n}\n","var path = 'public/app/features/plugins/partials/plugin_page.html';\nvar html = \"<div ng-if=ctrl.navModel>\\n  <page-header model=ctrl.navModel></page-header>\\n\\n  <div class=page-container>\\n    <div ng-if=ctrl.page>\\n      <plugin-component type=app-page>\\n      </plugin-component>\\n    </div>\\n  </div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { ComponentType } from 'react';\nimport { MatcherConfig, FieldConfig, Field, DataFrame, GrafanaTheme, TimeZone } from '../types';\nimport { InterpolateFunction } from './panel';\nimport { StandardEditorProps, FieldConfigOptionsRegistry, StandardEditorContext } from '../field';\nimport { OptionsEditorItem } from './OptionsUIRegistryBuilder';\n\nexport interface DynamicConfigValue {\n  id: string;\n  value?: any;\n}\n\nexport interface ConfigOverrideRule {\n  matcher: MatcherConfig;\n  properties: DynamicConfigValue[];\n}\n\nexport interface FieldConfigSource<TOptions extends object = any> {\n  // Defatuls applied to all numeric fields\n  defaults: FieldConfig<TOptions>;\n\n  // Rules to override individual values\n  overrides: ConfigOverrideRule[];\n}\n\nexport interface FieldOverrideContext extends StandardEditorContext {\n  field?: Field;\n  dataFrameIndex?: number; // The index for the selected field frame\n  data: DataFrame[]; // All results\n}\nexport interface FieldConfigEditorProps<TValue, TSettings>\n  extends Omit<StandardEditorProps<TValue, TSettings>, 'item'> {\n  item: FieldConfigPropertyItem<TValue, TSettings>; // The property info\n  value: TValue;\n  context: FieldOverrideContext;\n  onChange: (value?: TValue) => void;\n}\n\nexport interface FieldOverrideEditorProps<TValue, TSettings> extends Omit<StandardEditorProps<TValue>, 'item'> {\n  item: FieldConfigPropertyItem<TValue, TSettings>;\n  context: FieldOverrideContext;\n}\n\nexport interface FieldConfigEditorConfig<TOptions, TSettings = any, TValue = any> {\n  /**\n   * Path of the field config property to control.\n   *\n   * @example\n   * Given field config object of a type:\n   * ```ts\n   * interface CustomFieldConfig {\n   *   a: {\n   *     b: string;\n   *   }\n   * }\n   * ```\n   *\n   * path can be either 'a' or 'a.b'.\n   */\n  path: (keyof TOptions & string) | string;\n  /**\n   * Name of the field config property. Will be displayed in the UI as form element label.\n   */\n  name: string;\n  /**\n   * Description of the field config property. Will be displayed in the UI as form element description.\n   */\n  description?: string;\n  /**\n   * Array of strings representing category of the field config property. First element in the array will make option render as collapsible section.\n   */\n  category?: string[];\n  /**\n   * Custom settings of the editor.\n   */\n  settings?: TSettings;\n  /**\n   * Function that allows specifying whether or not this field config should apply to a given field.\n   * @param field\n   */\n  shouldApply?: (field: Field) => boolean;\n  defaultValue?: TValue;\n  /**\n   * Function that enables configuration of when field config property editor should be shown based on current panel field config.\n   *\n   * @param currentConfig Current field config values\n   */\n  showIf?: (currentConfig: TOptions) => boolean;\n}\n\nexport interface FieldConfigPropertyItem<TOptions = any, TValue = any, TSettings extends {} = any>\n  extends OptionsEditorItem<TOptions, TSettings, FieldConfigEditorProps<TValue, TSettings>, TValue> {\n  // An editor that can be filled in with context info (template variables etc)\n  override: ComponentType<FieldOverrideEditorProps<TValue, TSettings>>;\n\n  /** true for plugin field config properties */\n  isCustom?: boolean;\n\n  // Convert the override value to a well typed value\n  process: (value: any, context: FieldOverrideContext, settings?: TSettings) => TValue | undefined | null;\n\n  // Checks if field should be processed\n  shouldApply: (field: Field) => boolean;\n}\n\nexport interface ApplyFieldOverrideOptions {\n  data?: DataFrame[];\n  fieldConfig: FieldConfigSource;\n  replaceVariables: InterpolateFunction;\n  theme: GrafanaTheme;\n  timeZone?: TimeZone;\n  autoMinMax?: boolean;\n  fieldConfigRegistry?: FieldConfigOptionsRegistry;\n}\n\nexport enum FieldConfigProperty {\n  Unit = 'unit',\n  Min = 'min',\n  Max = 'max',\n  Decimals = 'decimals',\n  Title = 'title',\n  NoValue = 'noValue',\n  Thresholds = 'thresholds',\n  Mappings = 'mappings',\n  Links = 'links',\n  Color = 'color',\n}\n","export const FETCH_RESULTS = 'FETCH_RESULTS';\nexport const TOGGLE_SECTION = 'TOGGLE_SECTION';\nexport const FETCH_ITEMS = 'FETCH_ITEMS';\nexport const FETCH_ITEMS_START = 'FETCH_ITEMS_START';\nexport const MOVE_SELECTION_UP = 'MOVE_SELECTION_UP';\nexport const MOVE_SELECTION_DOWN = 'MOVE_SELECTION_DOWN';\nexport const SEARCH_START = 'SEARCH_START';\n\n// Manage dashboards\nexport const TOGGLE_ALL_CHECKED = 'TOGGLE_ALL_CHECKED';\nexport const TOGGLE_CHECKED = 'TOGGLE_SECTION_CHECKED';\nexport const MOVE_ITEMS = 'MOVE_ITEMS';\nexport const DELETE_ITEMS = 'DELETE_ITEMS';\n\n// Search Query\nexport const TOGGLE_STARRED = 'TOGGLE_STARRED';\nexport const REMOVE_STARRED = 'REMOVE_STARRED';\nexport const QUERY_CHANGE = 'QUERY_CHANGE';\nexport const REMOVE_TAG = 'REMOVE_TAG';\nexport const CLEAR_FILTERS = 'CLEAR_FILTERS';\nexport const SET_TAGS = 'SET_TAGS';\nexport const ADD_TAG = 'ADD_TAG';\nexport const TOGGLE_SORT = 'TOGGLE_SORT';\nexport const LAYOUT_CHANGE = 'LAYOUT_CHANGE';\n","var path = 'public/app/features/alerting/partials/alert_tab.html';\nvar html = \"<div ng-if=ctrl.panel.alert>\\n  <div class=\\\"alert alert-error m-b-2\\\" ng-show=ctrl.error>\\n    <icon name=\\\"'exclamation-triangle'\\\"></icon> {{ctrl.error}}\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h4 class=section-heading>Rule</h4>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-6\\\">Name</span>\\n        <input type=text class=\\\"gf-form-input width-20\\\" ng-model=ctrl.alert.name />\\n      </div>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-9\\\">Evaluate every</span>\\n        <input class=\\\"gf-form-input max-width-6\\\" type=text ng-model=ctrl.alert.frequency ng-blur=ctrl.checkFrequency() />\\n      </div>\\n      <div class=\\\"gf-form max-width-11\\\">\\n        <label class=\\\"gf-form-label width-5\\\">For</label>\\n        <input type=text class=\\\"gf-form-input max-width-6 gf-form-input--has-help-icon\\\" ng-model=ctrl.alert.for spellcheck=false placeholder=5m />\\n        <info-popover mode=right-absolute>\\n          If an alert rule has a configured For and the query violates the configured threshold it will first go from OK\\n          to Pending. Going from OK to Pending Grafana will not send any notifications. Once the alert rule has been\\n          firing for more than For duration, it will change to Alerting and send alert notifications.\\n        </info-popover>\\n      </div>\\n    </div>\\n    <div class=gf-form ng-if=ctrl.frequencyWarning>\\n      <label class=\\\"gf-form-label text-warning\\\">\\n        <icon name=\\\"'exclamation-triangle'\\\"></icon> {{ctrl.frequencyWarning}}\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h4 class=section-heading>Conditions</h4>\\n    <div class=gf-form-inline ng-repeat=\\\"conditionModel in ctrl.conditionModels\\\">\\n      <div class=gf-form>\\n        <metric-segment-model css-class=\\\"query-keyword width-5\\\" ng-if=$index property=conditionModel.operator.type options=ctrl.evalOperators custom=false></metric-segment-model>\\n        <span class=\\\"gf-form-label query-keyword width-5\\\" ng-if=\\\"$index===0\\\">WHEN</span>\\n      </div>\\n      <div class=gf-form>\\n        <query-part-editor class=\\\"gf-form-label query-part width-9\\\" part=conditionModel.reducerPart handle-event=\\\"ctrl.handleReducerPartEvent(conditionModel, $event)\\\">\\n        </query-part-editor>\\n        <span class=\\\"gf-form-label query-keyword\\\">OF</span>\\n      </div>\\n      <div class=gf-form>\\n        <query-part-editor class=\\\"gf-form-label query-part\\\" part=conditionModel.queryPart handle-event=\\\"ctrl.handleQueryPartEvent(conditionModel, $event)\\\">\\n        </query-part-editor>\\n      </div>\\n      <div class=gf-form>\\n        <metric-segment-model property=conditionModel.evaluator.type options=ctrl.evalFunctions custom=false css-class=query-keyword on-change=ctrl.evaluatorTypeChanged(conditionModel.evaluator)></metric-segment-model>\\n        <input class=\\\"gf-form-input max-width-9\\\" type=number step=any ng-hide=\\\"conditionModel.evaluator.params.length === 0\\\" ng-model=conditionModel.evaluator.params[0] ng-change=ctrl.evaluatorParamsChanged() />\\n        <label class=\\\"gf-form-label query-keyword\\\" ng-show=\\\"conditionModel.evaluator.params.length === 2\\\">TO</label>\\n        <input class=\\\"gf-form-input max-width-9\\\" type=number step=any ng-if=\\\"conditionModel.evaluator.params.length === 2\\\" ng-model=conditionModel.evaluator.params[1] ng-change=ctrl.evaluatorParamsChanged() />\\n      </div>\\n      <div class=gf-form>\\n        <label class=gf-form-label>\\n          <a class=pointer tabindex=1 ng-click=ctrl.removeCondition($index)>\\n            <icon name=\\\"'trash-alt'\\\"></icon>\\n          </a>\\n        </label>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label dropdown\\\">\\n        <a class=\\\"pointer dropdown-toggle\\\" data-toggle=dropdown>\\n          <icon name=\\\"'plus-circle'\\\"></icon>\\n        </a>\\n        <ul class=dropdown-menu role=menu>\\n          <li ng-repeat=\\\"ct in ctrl.conditionTypes\\\" role=menuitem>\\n            <a ng-click=ctrl.addCondition(ct.value);>{{ct.text}}</a>\\n          </li>\\n        </ul>\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h4 class=section-heading>No Data & Error Handling</h4>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-15\\\">If no data or all values are null</span>\\n      </div>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label query-keyword\\\">SET STATE TO</span>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=ctrl.alert.noDataState ng-options=\\\"f.value as f.text for f in ctrl.noDataModes\\\">\\n          </select>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-15\\\">If execution error or timeout</span>\\n      </div>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label query-keyword\\\">SET STATE TO</span>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=ctrl.alert.executionErrorState ng-options=\\\"f.value as f.text for f in ctrl.executionErrorModes\\\">\\n          </select>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <h4 class=section-heading>Notifications</h4>\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-8\\\">Send to</span>\\n    </div>\\n    <div class=gf-form ng-repeat=\\\"nc in ctrl.alertNotifications\\\">\\n      <span class=gf-form-label>\\n        <icon name=\\\"'{{nc.iconClass}}'\\\"></icon>\\n        &nbsp;{{nc.name}}&nbsp;<span ng-if=nc.isDefault>(default)</span>\\n        <icon name=\\\"'times'\\\" class=\\\"pointer muted\\\" ng-click=ctrl.removeNotification(nc) ng-if=\\\"nc.isDefault === false\\\"></icon>\\n      </span>\\n    </div>\\n    <div class=gf-form>\\n      <metric-segment segment=ctrl.addNotificationSegment get-options=ctrl.getNotifications() on-change=ctrl.notificationAdded()></metric-segment>\\n    </div>\\n  </div>\\n  <div class=\\\"gf-form gf-form--v-stretch\\\">\\n    <span class=\\\"gf-form-label width-8\\\">Message</span>\\n    <textarea class=gf-form-input rows=10 ng-model=ctrl.alert.message placeholder=\\\"Notification message details...\\\"></textarea>\\n  </div>\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-8\\\">Tags</span>\\n    <div class=gf-form-group>\\n      <div class=gf-form-inline ng-repeat=\\\"(name, value) in ctrl.alert.alertRuleTags\\\">\\n        <label class=\\\"gf-form-label width-15\\\">{{ name }}</label>\\n        <input class=\\\"gf-form-input width-15\\\" placeholder=\\\"Tag value...\\\" ng-model=ctrl.alert.alertRuleTags[name] type=text />\\n        <label class=gf-form-label>\\n          <a class=pointer tabindex=1 ng-click=ctrl.removeAlertRuleTag(name)>\\n            <icon name=\\\"'trash-alt'\\\"></icon>\\n          </a>\\n        </label>\\n      </div>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <input class=\\\"gf-form-input width-15\\\" placeholder=\\\"New tag name...\\\" ng-model=ctrl.newAlertRuleTag.name type=text />\\n          <input class=\\\"gf-form-input width-15\\\" placeholder=\\\"New tag value...\\\" ng-model=ctrl.newAlertRuleTag.value type=text />\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n        <label class=gf-form-label>\\n          <a class=pointer tabindex=1 ng-click=ctrl.addAlertRuleTag()>\\n            <icon name=\\\"'plus-circle'\\\"></icon>&nbsp;Add Tag\\n          </a>\\n        </label>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","/*!\n * jquery.flot.gauge v1.1.0 *\n *\n * Flot plugin for rendering gauge charts.\n *\n * Copyright (c) 2015 @toyoty99.\n * Licensed under the MIT license.\n */\n\n/**\n * @module flot.gauge\n */\n(function($) {\n\n\n    /**\n     * Gauge class\n     *\n     * @class Gauge\n     */\n    var Gauge = (function() {\n        /**\n         * context of canvas\n         *\n         * @property context\n         * @type Object\n         */\n        var context;\n        /**\n         * placeholder of canvas\n         *\n         * @property placeholder\n         * @type Object\n         */\n        var placeholder;\n        /**\n         * options of plot\n         *\n         * @property options\n         * @type Object\n         */\n        var options;\n        /**\n         * options of gauge\n         *\n         * @property gaugeOptions\n         * @type Object\n         */\n        var gaugeOptions;\n        /**\n         * data series\n         *\n         * @property series\n         * @type Array\n         */\n        var series;\n        /**\n         * logger\n         *\n         * @property logger\n         * @type Object\n         */\n        var logger;\n\n        /**\n         * constructor\n         *\n         * @class Gauge\n         * @constructor\n         * @param  {Object} gaugeOptions gauge options\n         */\n        var Gauge = function(plot, ctx) {\n            context = ctx;\n            placeholder = plot.getPlaceholder();\n            options = plot.getOptions();\n            gaugeOptions = options.series.gauges;\n            series = plot.getData();\n            logger = getLogger(gaugeOptions.debug);\n        }\n\n        /**\n         * calculate layout\n         *\n         * @method calculateLayout\n         * @return the calculated layout properties\n         */\n        Gauge.prototype.calculateLayout = function() {\n\n            var canvasWidth = placeholder.width();\n            var canvasHeight = placeholder.height();\n\n\n\n            // calculate cell size\n            var columns = Math.min(series.length, gaugeOptions.layout.columns);\n            var rows = Math.ceil(series.length / columns);\n\n\n\n            var margin = gaugeOptions.layout.margin;\n            var hMargin = gaugeOptions.layout.hMargin;\n            var vMargin = gaugeOptions.layout.vMargin;\n            var cellWidth = (canvasWidth - (margin * 2) - (hMargin * (columns - 1))) / columns;\n            var cellHeight = (canvasHeight - (margin * 2) - (vMargin * (rows - 1))) / rows;\n            if (gaugeOptions.layout.square) {\n                var cell = Math.min(cellWidth, cellHeight);\n                cellWidth = cell;\n                cellHeight = cell;\n            }\n\n\n\n            // calculate 'auto' values\n            calculateAutoValues(gaugeOptions, cellWidth);\n\n            // calculate maximum radius\n            var cellMargin = gaugeOptions.cell.margin;\n            var labelMargin = 0;\n            var labelFontSize = 0;\n            if (gaugeOptions.label.show) {\n                labelMargin = gaugeOptions.label.margin;\n                labelFontSize = gaugeOptions.label.font.size;\n            }\n            var valueMargin = 0;\n            var valueFontSize = 0;\n            if (gaugeOptions.value.show) {\n                valueMargin = gaugeOptions.value.margin;\n                valueFontSize = gaugeOptions.value.font.size;\n            }\n            var thresholdWidth = 0;\n            if (gaugeOptions.threshold.show) {\n                thresholdWidth = gaugeOptions.threshold.width;\n            }\n            var thresholdLabelMargin = 0;\n            var thresholdLabelFontSize = 0;\n            if (gaugeOptions.threshold.label.show) {\n                thresholdLabelMargin = gaugeOptions.threshold.label.margin;\n                thresholdLabelFontSize = gaugeOptions.threshold.label.font.size;\n            }\n\n            var maxRadiusH = (cellWidth / 2) - cellMargin - thresholdWidth - (thresholdLabelMargin * 2) - thresholdLabelFontSize;\n\n            var startAngle = gaugeOptions.gauge.startAngle;\n            var endAngle = gaugeOptions.gauge.endAngle;\n            var dAngle = (endAngle - startAngle) / 100;\n            var heightRatioV = -1;\n            for (var a = startAngle; a < endAngle; a += dAngle) {\n                heightRatioV = Math.max(heightRatioV, Math.sin(toRad(a)));\n            }\n            heightRatioV = Math.max(heightRatioV, Math.sin(toRad(endAngle)));\n            var outerRadiusV = (cellHeight - (cellMargin * 2) - (labelMargin * 2) - labelFontSize) / (1 + heightRatioV);\n            if (outerRadiusV * heightRatioV < valueMargin + (valueFontSize / 2)) {\n                outerRadiusV = cellHeight - (cellMargin * 2) - (labelMargin * 2) - labelFontSize - valueMargin - (valueFontSize / 2);\n            }\n            var maxRadiusV = outerRadiusV - (thresholdLabelMargin * 2) - thresholdLabelFontSize - thresholdWidth;\n\n            var radius = Math.min(maxRadiusH, maxRadiusV);\n\n\n            var width = gaugeOptions.gauge.width;\n            if (width >= radius) {\n                width = Math.max(3, radius / 3);\n            }\n\n\n            var outerRadius = (thresholdLabelMargin * 2) + thresholdLabelFontSize + thresholdWidth + radius;\n            var gaugeOuterHeight = Math.max(outerRadius * (1 + heightRatioV), outerRadius + valueMargin + (valueFontSize / 2));\n\n            return {\n                canvasWidth: canvasWidth,\n                canvasHeight: canvasHeight,\n                margin: margin,\n                hMargin: hMargin,\n                vMargin: vMargin,\n                columns: columns,\n                rows: rows,\n                cellWidth: cellWidth,\n                cellHeight: cellHeight,\n                cellMargin: cellMargin,\n                labelMargin: labelMargin,\n                labelFontSize: labelFontSize,\n                valueMargin: valueMargin,\n                valueFontSize: valueFontSize,\n                width: width,\n                radius: radius,\n                thresholdWidth: thresholdWidth,\n                thresholdLabelMargin: thresholdLabelMargin,\n                thresholdLabelFontSize: thresholdLabelFontSize,\n                gaugeOuterHeight: gaugeOuterHeight\n            };\n        }\n\n        /**\n         * calculate the values which are set as 'auto'\n         *\n         * @method calculateAutoValues\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Number} cellWidth the width of cell\n         */\n        function calculateAutoValues(gaugeOptionsi, cellWidth) {\n\n            if (gaugeOptionsi.gauge.width === \"auto\") {\n                gaugeOptionsi.gauge.width = Math.max(5, cellWidth / 8);\n            }\n            if (gaugeOptionsi.label.margin === \"auto\") {\n                gaugeOptionsi.label.margin = Math.max(1, cellWidth / 20);\n            }\n            if (gaugeOptionsi.label.font.size === \"auto\") {\n                gaugeOptionsi.label.font.size = Math.max(5, cellWidth / 8);\n            }\n            if (gaugeOptionsi.value.margin === \"auto\") {\n                gaugeOptionsi.value.margin = Math.max(1, cellWidth / 30);\n            }\n            if (gaugeOptionsi.value.font.size === \"auto\") {\n                gaugeOptionsi.value.font.size = Math.max(5, cellWidth / 9);\n            }\n            if (gaugeOptionsi.threshold.width === \"auto\") {\n                gaugeOptionsi.threshold.width = Math.max(3, cellWidth / 100);\n            }\n            if (gaugeOptionsi.threshold.label.margin === \"auto\") {\n                gaugeOptionsi.threshold.label.margin = Math.max(3, cellWidth / 40);\n            }\n            if (gaugeOptionsi.threshold.label.font.size === \"auto\") {\n                gaugeOptionsi.threshold.label.font.size = Math.max(5, cellWidth / 15);\n            }\n\n        }\n        Gauge.prototype.calculateAutoValues = calculateAutoValues;\n\n        /**\n         * calculate the layout of the cell inside\n         *\n         * @method calculateCellLayout\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Number} cellWidth the width of cell\n         * @param  {Number} i the index of the series\n         * @return the calculated cell layout properties\n         */\n        Gauge.prototype.calculateCellLayout = function(gaugeOptionsi, layout, i) {\n\n            // calculate top, left and center\n            var c = col(layout.columns, i);\n            var r = row(layout.columns, i);\n            var x = layout.margin + (layout.cellWidth + layout.hMargin) * c;\n            var y = layout.margin + (layout.cellHeight + layout.vMargin) * r;\n            var cx = x + (layout.cellWidth / 2);\n            var cy = y + layout.cellMargin + (layout.labelMargin * 2) + layout.labelFontSize + layout.thresholdWidth\n                        + layout.thresholdLabelFontSize + (layout.thresholdLabelMargin * 2) + layout.radius;\n            var blank = layout.cellHeight - (layout.cellMargin * 2) - (layout.labelMargin * 2) - layout.labelFontSize - layout.gaugeOuterHeight;\n            var offsetY = 0;\n            if (gaugeOptionsi.cell.vAlign === \"middle\") {\n                offsetY = (blank / 2);\n            } else if (gaugeOptionsi.cell.vAlign === \"bottom\") {\n                offsetY = blank;\n            }\n            cy += offsetY;\n\n            return {\n                col: c,\n                row: r,\n                x: x,\n                y: y,\n                offsetY: offsetY,\n                cellWidth: layout.cellWidth,\n                cellHeight: layout.cellHeight,\n                cellMargin: layout.cellMargin,\n                cx: cx,\n                cy: cy\n            }\n        }\n\n        /**\n         * draw the background of chart\n         *\n         * @method drawBackground\n         * @param  {Object} layout the layout properties\n         */\n        Gauge.prototype.drawBackground = function(layout) {\n\n            if (!gaugeOptions.frame.show) {\n                return;\n            }\n            context.save();\n            context.strokeStyle = options.grid.borderColor;\n            context.lineWidth = options.grid.borderWidth;\n            context.strokeRect(0, 0, layout.canvasWidth, layout.canvasHeight);\n            if (options.grid.backgroundColor) {\n                context.fillStyle = options.grid.backgroundColor;\n                context.fillRect(0, 0, layout.canvasWidth, layout.canvasHeight);\n            }\n            context.restore();\n        }\n\n        /**\n         * draw the background of cell\n         *\n         * @method drawCellBackground\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} cellLayout the cell layout properties\n         */\n        Gauge.prototype.drawCellBackground = function(gaugeOptionsi, cellLayout) {\n\n            context.save();\n            if (gaugeOptionsi.cell.border && gaugeOptionsi.cell.border.show && gaugeOptionsi.cell.border.color && gaugeOptionsi.cell.border.width) {\n                context.strokeStyle = gaugeOptionsi.cell.border.color;\n                context.lineWidth = gaugeOptionsi.cell.border.width;\n                context.strokeRect(cellLayout.x, cellLayout.y, cellLayout.cellWidth, cellLayout.cellHeight);\n            }\n            if (gaugeOptionsi.cell.background && gaugeOptionsi.cell.background.color) {\n                context.fillStyle = gaugeOptionsi.cell.background.color;\n                context.fillRect(cellLayout.x, cellLayout.y, cellLayout.cellWidth, cellLayout.cellHeight);\n            }\n            context.restore();\n        }\n\n        /**\n         * draw the gauge\n         *\n         * @method drawGauge\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Object} cellLayout the cell layout properties\n         * @param  {String} label the label of data\n         * @param  {Number} data the value of the gauge\n         */\n        Gauge.prototype.drawGauge = function(gaugeOptionsi, layout, cellLayout, label, data) {\n\n\n            var blur = gaugeOptionsi.gauge.shadow.show ? gaugeOptionsi.gauge.shadow.blur : 0;\n\n\n            // draw gauge frame\n            drawArcWithShadow(\n                cellLayout.cx, // center x\n                cellLayout.cy, // center y\n                layout.radius,\n                layout.width,\n                toRad(gaugeOptionsi.gauge.startAngle),\n                toRad(gaugeOptionsi.gauge.endAngle),\n                gaugeOptionsi.gauge.border.color,      // line color\n                gaugeOptionsi.gauge.border.width,      // line width\n                gaugeOptionsi.gauge.background.color,  // fill color\n                blur);\n\n            // draw gauge\n            var c1 = getColor(gaugeOptionsi, data);\n            var a2 = calculateAngle(gaugeOptionsi, layout, data);\n            drawArcWithShadow(\n                cellLayout.cx, // center x\n                cellLayout.cy, // center y\n                layout.radius - 1,\n                layout.width - 2,\n                toRad(gaugeOptionsi.gauge.startAngle),\n                toRad(a2),\n                c1,           // line color\n                1,            // line width\n                c1,           // fill color\n                blur);\n        }\n\n        /**\n         * decide the color of the data from the threshold options\n         *\n         * @method getColor\n         * @private\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Number} data the value of the gauge\n         */\n        function getColor(gaugeOptionsi, data) {\n            var color;\n            for (var i = 0; i < gaugeOptionsi.threshold.values.length; i++) {\n                var threshold = gaugeOptionsi.threshold.values[i];\n                color = threshold.color;\n                if (data < threshold.value) {\n                    break;\n                }\n            }\n            return color;\n        }\n\n        /**\n         * calculate the angle of the data\n         *\n         * @method calculateAngle\n         * @private\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Number} data the value of the gauge\n         */\n        function calculateAngle(gaugeOptionsi, layout, data) {\n            var a =\n                gaugeOptionsi.gauge.startAngle\n                    + (gaugeOptionsi.gauge.endAngle - gaugeOptionsi.gauge.startAngle)\n                        * ((data - gaugeOptionsi.gauge.min) / (gaugeOptionsi.gauge.max - gaugeOptionsi.gauge.min));\n\n            if (a < gaugeOptionsi.gauge.startAngle) {\n                a = gaugeOptionsi.gauge.startAngle;\n            } else if (a > gaugeOptionsi.gauge.endAngle) {\n                a = gaugeOptionsi.gauge.endAngle;\n            }\n            return a;\n        }\n\n        /**\n         * draw the arc of the threshold\n         *\n         * @method drawThreshold\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Object} cellLayout the cell layout properties\n         */\n        Gauge.prototype.drawThreshold = function(gaugeOptionsi, layout, cellLayout) {\n\n            var a1 = gaugeOptionsi.gauge.startAngle;\n            for (var i = 0; i < gaugeOptionsi.threshold.values.length; i++) {\n                var threshold = gaugeOptionsi.threshold.values[i];\n                c1 = threshold.color;\n                a2 = calculateAngle(gaugeOptionsi, layout, threshold.value);\n                drawArc(\n                    context,\n                    cellLayout.cx, // center x\n                    cellLayout.cy, // center y\n                    layout.radius + layout.thresholdWidth,\n                    layout.thresholdWidth - 2,\n                    toRad(a1),\n                    toRad(a2),\n                    c1,           // line color\n                    1,            // line width\n                    c1);          // fill color\n                a1 = a2;\n            }\n        }\n\n        /**\n         * draw an arc with a shadow\n         *\n         * @method drawArcWithShadow\n         * @private\n         * @param  {Number} cx the x position of the center\n         * @param  {Number} cy the y position of the center\n         * @param  {Number} r the radius of an arc\n         * @param  {Number} w the width of an arc\n         * @param  {Number} rd1 the start angle of an arc in radians\n         * @param  {Number} rd2 the end angle of an arc in radians\n         * @param  {String} lc the color of a line\n         * @param  {Number} lw the widht of a line\n         * @param  {String} fc the fill color  of an arc\n         * @param  {Number} blur the shdow blur\n         */\n        function drawArcWithShadow(cx, cy, r, w, rd1, rd2, lc, lw, fc, blur) {\n            if (rd1 === rd2) {\n                return;\n            }\n            context.save();\n\n            drawArc(context, cx, cy, r, w, rd1, rd2, lc, lw, fc);\n\n            if (blur) {\n                drawArc(context, cx, cy, r, w, rd1, rd2);\n                context.clip();\n                context.shadowOffsetX = 0;\n                context.shadowOffsetY = 0;\n                context.shadowBlur = 10;\n                context.shadowColor = \"gray\";\n                drawArc(context, cx, cy, r + 1, w + 2, rd1, rd2, lc, 1);\n            }\n            context.restore();\n        }\n\n        /**\n         * draw the label of the gauge\n         *\n         * @method drawLable\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Object} cellLayout the cell layout properties\n         * @param  {Number} i the index of the series\n         * @param  {Object} item the item of the series\n         */\n        Gauge.prototype.drawLable = function(gaugeOptionsi, layout, cellLayout, i, item) {\n\n            drawText(\n                cellLayout.cx,\n                cellLayout.y + cellLayout.cellMargin + layout.labelMargin + cellLayout.offsetY,\n                \"flotGagueLabel\" + i,\n                gaugeOptionsi.label.formatter ? gaugeOptionsi.label.formatter(item.label, item.data[0][1]) : text,\n                gaugeOptionsi.label);\n        }\n\n        /**\n         * draw the value of the gauge\n         *\n         * @method drawValue\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Object} cellLayout the cell layout properties\n         * @param  {Number} i the index of the series\n         * @param  {Object} item the item of the series\n         */\n        Gauge.prototype.drawValue = function(gaugeOptionsi, layout, cellLayout, i, item) {\n\n            drawText(\n                cellLayout.cx,\n                cellLayout.cy - (gaugeOptionsi.value.font.size / 2),\n                \"flotGagueValue\" + i,\n                gaugeOptionsi.value.formatter ? gaugeOptionsi.value.formatter(item.label, item.data[0][1]) : text,\n                gaugeOptionsi.value);\n        }\n\n        /**\n         * draw the values of the threshold\n         *\n         * @method drawThresholdValues\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Object} cellLayout the cell layout properties\n         * @param  {Number} i the index of the series\n         */\n        Gauge.prototype.drawThresholdValues = function(gaugeOptionsi, layout, cellLayout, i) {\n\n            // min, max\n            drawThresholdValue(gaugeOptionsi, layout, cellLayout, \"Min\" + i, gaugeOptionsi.gauge.min, gaugeOptionsi.gauge.startAngle);\n            drawThresholdValue(gaugeOptionsi, layout, cellLayout, \"Max\" + i, gaugeOptionsi.gauge.max, gaugeOptionsi.gauge.endAngle);\n            // threshold values\n            for (var j = 0; j < gaugeOptionsi.threshold.values.length; j++) {\n                var threshold = gaugeOptionsi.threshold.values[j];\n                if (threshold.value > gaugeOptionsi.gauge.min && threshold.value < gaugeOptionsi.gauge.max) {\n                    var a = calculateAngle(gaugeOptionsi, layout, threshold.value);\n                    drawThresholdValue(gaugeOptionsi, layout, cellLayout, i + \"_\" + j, threshold.value, a);\n                }\n            }\n        }\n\n        /**\n         * draw the value of the threshold\n         *\n         * @method drawThresholdValue\n         * @param  {Object} gaugeOptionsi the options of the gauge\n         * @param  {Object} layout the layout properties\n         * @param  {Object} cellLayout the cell layout properties\n         * @param  {Number} i the index of the series\n         * @param  {Number} value the value of the threshold\n         * @param  {Number} a the angle of the value drawn\n         */\n        function drawThresholdValue(gaugeOptionsi, layout, cellLayout, i, value, a) {\n            drawText(\n                cellLayout.cx\n                    + ((layout.thresholdLabelMargin + (layout.thresholdLabelFontSize / 2) + layout.radius)\n                        * Math.cos(toRad(a))),\n                cellLayout.cy\n                    + ((layout.thresholdLabelMargin + (layout.thresholdLabelFontSize / 2) + layout.radius)\n                        * Math.sin(toRad(a))),\n                \"flotGagueThresholdValue\" + i,\n                gaugeOptionsi.threshold.label.formatter ? gaugeOptionsi.threshold.label.formatter(value) : value,\n                gaugeOptionsi.threshold.label,\n                a);\n        }\n\n        /**\n         * draw a text\n         *\n         * the textOptions is assumed as follows:\n         *\n         *   textOptions: {\n         *       background: {\n         *           color: null,\n         *           opacity: 0\n         *       },\n         *       font: {\n         *           size: \"auto\"\n         *           family: \"\\\"MS ゴシック\\\",sans-serif\"\n         *       },\n         *       color: null\n         *   }\n         *\n         * @method drawText\n         * @private\n         * @param  {Number} x the x position of the text drawn (left top)\n         * @param  {Number} y the y position of the text drawn (left top)\n         * @param  {String} id the id of the dom element\n         * @param  {String} text the text drawn\n         * @param  {Object} textOptions the option of the text\n         * @param  {Number} [a] the angle of the value drawn\n         */\n        function drawText(x, y, id, text, textOptions, a) {\n            var span = $(placeholder).find(\"#\" + id);\n            var exists = span.length;\n            if (!exists) {\n                span = $(\"<span></span>\")\n                span.attr(\"id\", id);\n                span.attr(\"class\", \"flot-temp-elem\");\n                placeholder.append(span);\n            }\n\n            span.css(\"position\", \"absolute\");\n            span.css(\"top\", y + \"px\");\n            span.css(\"white-space\", \"nowrap\");\n\n            if (textOptions.font.size) {\n              span.css(\"font-size\", textOptions.font.size + \"px\");\n            }\n            if (textOptions.font.family) {\n              span.css(\"font-family\", textOptions.font.family);\n            }\n            if (textOptions.color) {\n              span.css(\"color\", textOptions.color);\n            }\n            if (textOptions.background.color) {\n              span.css(\"background-color\", textOptions.background.color);\n            }\n            if (textOptions.background.opacity) {\n              span.css(\"opacity\", textOptions.background.opacity);\n            }\n            span.text(text);\n            // after append, readjust the left position\n            span.css(\"left\", x + \"px\"); // for redraw, resetting the left position is needed here\n            span.css(\"left\", (parseInt(span.css(\"left\")) - (span.width()/ 2)) + \"px\");\n\n            // at last, set angle\n            if (!exists && a) {\n                span.css(\"top\", (parseInt(span.css(\"top\")) - (span.height()/ 2)) + \"px\");\n                span.css(\"transform\", \"rotate(\" + ((180 * a) + 90) + \"deg)\"); // not supported for ie8\n            }\n        }\n\n        return Gauge;\n    })();\n    /**\n     * get a instance of Logger\n     *\n     * @method  getLogger\n     * @for flot.gauge\n     * @private\n     * @param  {Object} debugOptions the options of debug\n     */\n    function getLogger(debugOptions) {\n        return typeof Logger !== \"undefined\" ? new Logger(debugOptions) : null;\n    }\n\n    /**\n     * calculate the index of columns for the specified data\n     *\n     * @method col\n     * @for flot.gauge\n     * @param  {Number} columns the number of columns\n     * @param  {Number} i       the index of the series\n     * @return the index of columns\n     */\n    function col(columns, i) {\n        return i % columns;\n    }\n\n    /**\n     * calculate the index of rows for the specified data\n     *\n     * @method row\n     * @for flot.gauge\n     * @param  {Number} columns the number of rows\n     * @param  {Number} i       the index of the series\n     * @return the index of rows\n     */\n    function row(columns, i) {\n        return Math.floor(i / columns);\n    }\n\n    /**\n     * calculate the angle in radians\n     *\n     * internally, use a number without PI (0 - 2).\n     * so, in this function, multiply PI\n     *\n     * @method toRad\n     * @for flot.gauge\n     * @param  {Number} a the number of angle without PI\n     * @return the angle in radians\n     */\n    function toRad(a) {\n        return a * Math.PI;\n    }\n\n    /**\n     * draw an arc\n     *\n     * @method drawArc\n     * @for flot.gauge\n     * @param  {Object} context the context of canvas\n     * @param  {Number} cx the x position of the center\n     * @param  {Number} cy the y position of the center\n     * @param  {Number} r the radius of an arc\n     * @param  {Number} w the width of an arc\n     * @param  {Number} rd1 the start angle of an arc in radians\n     * @param  {Number} rd2 the end angle of an arc in radians\n     * @param  {String} lc the color of a line\n     * @param  {Number} lw the widht of a line\n     * @param  {String} fc the fill color  of an arc\n     */\n    function drawArc(context, cx, cy, r, w, rd1, rd2, lc, lw, fc) {\n        if (rd1 === rd2) {\n            return;\n        }\n        var counterClockwise = false;\n        context.save();\n        context.beginPath();\n        context.arc(cx, cy, r, rd1, rd2, counterClockwise);\n        context.lineTo(cx + (r - w) * Math.cos(rd2),\n                       cy + (r - w) * Math.sin(rd2));\n        context.arc(cx, cy, r - w, rd2, rd1, !counterClockwise);\n        context.closePath();\n        if (lw) {\n            context.lineWidth = lw;\n        }\n        if (lc) {\n            context.strokeStyle = lc;\n            context.stroke();\n        }\n        if (fc) {\n            context.fillStyle = fc;\n            context.fill();\n        }\n        context.restore();\n    }\n\n    /**\n     * initialize plugin\n     *\n     * @method init\n     * @for flot.gauge\n     * @private\n     * @param  {Object} plot a instance of plot\n     */\n    function init (plot) {\n        // add processOptions hook\n        plot.hooks.processOptions.push(function(plot, options) {\n            var logger = getLogger(options.series.gauges.debug);\n\n\n\n\n            // turn 'grid' and 'legend' off\n            if (options.series.gauges.show) {\n                options.grid.show = false;\n                options.legend.show = false;\n            }\n\n            // sort threshold\n            var thresholds = options.series.gauges.threshold.values;\n\n            thresholds.sort(function(a, b) {\n                if (a.value < b.value) {\n                    return -1;\n                } else if (a.value > b.value) {\n                    return 1;\n                } else {\n                    return 0;\n                }\n            });\n\n\n\n        });\n\n        // add draw hook\n        plot.hooks.draw.push(function(plot, context) {\n            var options = plot.getOptions();\n            var gaugeOptions = options.series.gauges;\n\n            var logger = getLogger(gaugeOptions.debug);\n\n\n            if (!gaugeOptions.show) {\n                return;\n            }\n\n            var series = plot.getData();\n\n            if (!series || !series.length) {\n                return; // if no series were passed\n            }\n\n            var gauge = new Gauge(plot, context);\n\n            // calculate layout\n            var layout = gauge.calculateLayout();\n\n            // debug layout\n            if (gaugeOptions.debug.layout) {\n\n            }\n\n            // draw background\n            gauge.drawBackground(layout)\n\n            // draw cells (label, gauge, value, threshold)\n            for (var i = 0; i < series.length; i++) {\n                var item = series[i];\n\n                var gaugeOptionsi = $.extend({}, gaugeOptions, item.gauges);\n                if (item.gauges) {\n                    // re-calculate 'auto' values\n                    gauge.calculateAutoValues(gaugeOptionsi, layout.cellWidth);\n                }\n\n                // calculate cell layout\n                var cellLayout = gauge.calculateCellLayout(gaugeOptionsi, layout, i);\n\n                // draw cell background\n                gauge.drawCellBackground(gaugeOptionsi, cellLayout)\n                // debug layout\n                if (gaugeOptionsi.debug.layout) {\n\n                }\n                // draw label\n                if (gaugeOptionsi.label.show) {\n                    gauge.drawLable(gaugeOptionsi, layout, cellLayout, i, item);\n                }\n                // draw gauge\n                gauge.drawGauge(gaugeOptionsi, layout, cellLayout, item.label, item.data[0][1]);\n                // draw threshold\n                if (gaugeOptionsi.threshold.show) {\n                    gauge.drawThreshold(gaugeOptionsi, layout, cellLayout);\n                }\n                if (gaugeOptionsi.threshold.label.show) {\n                    gauge.drawThresholdValues(gaugeOptionsi, layout, cellLayout, i)\n                }\n                // draw value\n                if (gaugeOptionsi.value.show) {\n                    gauge.drawValue(gaugeOptionsi, layout, cellLayout, i, item);\n                }\n            }\n        });\n    }\n\n    /**\n     * [defaults description]\n     *\n     * @property defaults\n     * @type {Object}\n     */\n    var defaults = {\n        series: {\n            gauges: {\n                debug: {\n                    log: false,\n                    layout: false,\n                    alert: false\n                },\n                show: false,\n                layout: {\n                    margin: 5,\n                    columns: 3,\n                    hMargin: 5,\n                    vMargin: 5,\n                    square: false\n                },\n                frame: {\n                    show: true\n                },\n                cell: {\n                    background: {\n                        color: null\n                    },\n                    border: {\n                        show: true,\n                        color: \"black\",\n                        width: 1\n                    },\n                    margin: 5,\n                    vAlign: \"middle\" // 'top' or 'middle' or 'bottom'\n                },\n                gauge: {\n                    width: \"auto\", // a specified number, or 'auto'\n                    startAngle: 0.9, // 0 - 2 factor of the radians\n                    endAngle: 2.1, // 0 - 2 factor of the radians\n                    min: 0,\n                    max: 100,\n                    background: {\n                        color: \"white\"\n                    },\n                    border: {\n                        color: \"lightgray\",\n                        width: 2\n                    },\n                    shadow: {\n                        show: true,\n                        blur: 5\n                    }\n                },\n                label: {\n                    show: true,\n                    margin: \"auto\", // a specified number, or 'auto'\n                    background: {\n                        color: null,\n                        opacity: 0\n                    },\n                    font: {\n                        size: \"auto\", // a specified number, or 'auto'\n                        family: \"sans-serif\"\n                    },\n                    color: null,\n                    formatter: function(label, value) {\n                        return label;\n                    }\n                },\n                value: {\n                    show: true,\n                    margin: \"auto\", // a specified number, or 'auto'\n                    background: {\n                        color: null,\n                        opacity: 0\n                    },\n                    font: {\n                        size: \"auto\", // a specified number, or 'auto'\n                        family: \"sans-serif\"\n                    },\n                    color: null,\n                    formatter: function(label, value) {\n                        return parseInt(value);\n                    }\n                },\n                threshold: {\n                    show: true,\n                    width: \"auto\", // a specified number, or 'auto'\n                    label: {\n                        show: true,\n                        margin: \"auto\", // a specified number, or 'auto'\n                        background: {\n                            color: null,\n                            opacity: 0\n                        },\n                        font: {\n                            size: \"auto\", // a specified number, or 'auto'\n                            family: \",sans-serif\"\n                        },\n                        color: null,\n                        formatter: function(value) {\n                            return value;\n                        }\n                    },\n                    values: [\n\n                    ]\n                }\n            }\n        }\n    };\n\n    // register the gauge plugin\n    $.plot.plugins.push({\n        init: init,\n        options: defaults,\n        name: \"gauge\",\n        version: \"1.1.0\"\n    });\n\n})(jQuery);\n\n","var path = 'public/app/plugins/panel/alertlist/module.html';\nvar html = \"<div class=panel-alert-list>\\n  <div class=panel-alert-list__no-alerts ng-show=ctrl.noAlertsMessage>\\n    {{ctrl.noAlertsMessage}}\\n  </div>\\n\\n  <section ng-if=\\\"ctrl.panel.show === 'current'\\\">\\n    <ol class=alert-rule-list>\\n      <li class=alert-rule-item ng-repeat=\\\"alert in ctrl.currentAlerts\\\">\\n        <div class=\\\"alert-rule-item__icon {{alert.stateModel.stateClass}}\\\">\\n          <icon name=\\\"'{{alert.stateModel.iconClass}}'\\\" size=\\\"'xl'\\\" style=margin-right:4px></icon>\\n        </div>\\n        <div class=alert-rule-item__body>\\n          <div class=alert-rule-item__header>\\n            <p class=alert-rule-item__name>\\n              <a href=\\\"{{alert.url}}?editPanel={{alert.panelId}}&tab=alert\\\">\\n                {{alert.name}}\\n              </a>\\n            </p>\\n            <div class=alert-rule-item__text>\\n              <span class={{alert.stateModel.stateClass}}>{{alert.stateModel.text}}</span>\\n              <span class=alert-rule-item__time>for {{alert.newStateDateAgo}}</span>\\n            </div>\\n          </div>\\n        </div>\\n      </li>\\n    </ol>\\n  </section>\\n\\n  <section ng-if=\\\"ctrl.panel.show === 'changes'\\\">\\n    <ol class=alert-rule-list>\\n      <li class=alert-rule-item ng-repeat=\\\"al in ctrl.alertHistory\\\">\\n        <div class=\\\"alert-rule-item__icon {{al.stateModel.stateClass}}\\\">\\n          <icon name=\\\"'{{al.stateModel.iconClass}}'\\\" size=\\\"'xl'\\\"></icon>\\n        </div>\\n        <div class=alert-rule-item__body>\\n          <div class=alert-rule-item__header>\\n            <p class=alert-rule-item__name>{{al.alertName}}</p>\\n            <div class=alert-rule-item__text>\\n              <span class={{al.stateModel.stateClass}}>{{al.stateModel.text}}</span>\\n            </div>\\n          </div>\\n          <span class=alert-rule-item__info>{{al.info}}</span>\\n        </div>\\n        <div class=alert-rule-item__time>\\n          <span>{{al.time}}</span>\\n        </div>\\n      </li>\\n    </ol>\\n  </section>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/partials/valueSelectDropdown.html';\nvar html = \"<div class=variable-link-wrapper>\\n  <a ng-click=vm.show() class=variable-value-link aria-label={{vm.selectors.submenuItemValueDropDownValueLinkTexts(vm.linkText)}}>\\n    {{vm.linkText}}\\n    <span ng-repeat=\\\"tag in vm.selectedTags\\\" bs-tooltip=tag.valuesText data-placement=bottom>\\n      <span class=label-tag tag-color-from-name=tag.text>\\n        &nbsp;&nbsp;<icon name=\\\"'tag-alt'\\\"></icon>&nbsp; {{tag.text}}\\n      </span>\\n    </span>\\n    <icon name=\\\"'angle-down'\\\" style=margin-left:4px;margin-bottom:-2px></icon>\\n  </a>\\n\\n  <input type=text class=gf-form-input style=display:none ng-keydown=vm.keyDown($event) ng-model=vm.search.query ng-change=vm.debouncedQueryChanged() />\\n\\n  <div class=variable-value-dropdown ng-if=vm.dropdownVisible ng-class=\\\"{'multi': vm.variable.multi, 'single': !vm.variable.multi}\\\" aria-label={{::vm.selectors.submenuItemValueDropDownDropDown}}>\\n    <div class=variable-options-wrapper>\\n      <div class=variable-options-column>\\n        <a class=variable-options-column-header ng-if=vm.variable.multi ng-class=\\\"{'many-selected': vm.selectedValues.length > 1}\\\" bs-tooltip=\\\"'Clear selections'\\\" data-placement=top ng-click=vm.clearSelections()>\\n          <span class=variable-option-icon></span>\\n          Selected ({{vm.selectedValues.length}})\\n        </a>\\n        <a class=\\\"variable-option pointer\\\" ng-repeat=\\\"option in vm.search.options\\\" ng-class=\\\"{'selected': option.selected, 'highlighted': $index === vm.highlightIndex}\\\" ng-click=\\\"vm.selectValue(option, $event)\\\">\\n          <span class=variable-option-icon></span>\\n          <span aria-label={{vm.selectors.submenuItemValueDropDownOptionTexts(option.text)}}>{{option.text}}</span>\\n        </a>\\n      </div>\\n      <div class=variable-options-column ng-if=vm.tags.length>\\n        <div class=\\\"variable-options-column-header text-center\\\">\\n          Tags\\n        </div>\\n        <a class=\\\"variable-option-tag pointer\\\" ng-repeat=\\\"tag in vm.tags\\\" ng-click=\\\"vm.selectTag(tag, $event)\\\" ng-class=\\\"{'selected': tag.selected}\\\">\\n          <span class=\\\"fa fa-fw variable-option-icon\\\"></span>\\n          <span class=label-tag tag-color-from-name=tag.text>{{tag.text}}&nbsp;&nbsp;<icon name=\\\"'tag-alt'\\\"></icon>&nbsp;</span>\\n        </a>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport { hot } from 'react-hot-loader';\nimport { connect } from 'react-redux';\nimport { NavModel } from '@grafana/data';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { getRouteParamsId } from 'app/core/selectors/location';\nimport config from 'app/core/config';\nimport Page from 'app/core/components/Page/Page';\nimport { UserProfile } from './UserProfile';\nimport { UserPermissions } from './UserPermissions';\nimport { UserSessions } from './UserSessions';\nimport { UserLdapSyncInfo } from './UserLdapSyncInfo';\nimport { StoreState, UserDTO, UserOrg, UserSession, SyncInfo, UserAdminError } from 'app/types';\nimport {\n  loadAdminUserPage,\n  revokeSession,\n  revokeAllSessions,\n  updateUser,\n  setUserPassword,\n  disableUser,\n  enableUser,\n  deleteUser,\n  updateUserPermissions,\n  addOrgUser,\n  updateOrgUserRole,\n  deleteOrgUser,\n  syncLdapUser,\n} from './state/actions';\nimport { UserOrgs } from './UserOrgs';\n\ninterface Props {\n  navModel: NavModel;\n  userId: number;\n  user: UserDTO;\n  orgs: UserOrg[];\n  sessions: UserSession[];\n  ldapSyncInfo: SyncInfo;\n  isLoading: boolean;\n  error: UserAdminError;\n\n  loadAdminUserPage: typeof loadAdminUserPage;\n  revokeSession: typeof revokeSession;\n  revokeAllSessions: typeof revokeAllSessions;\n  updateUser: typeof updateUser;\n  setUserPassword: typeof setUserPassword;\n  disableUser: typeof disableUser;\n  enableUser: typeof enableUser;\n  deleteUser: typeof deleteUser;\n  updateUserPermissions: typeof updateUserPermissions;\n  addOrgUser: typeof addOrgUser;\n  updateOrgUserRole: typeof updateOrgUserRole;\n  deleteOrgUser: typeof deleteOrgUser;\n  syncLdapUser: typeof syncLdapUser;\n}\n\ninterface State {\n  // isLoading: boolean;\n}\n\nexport class UserAdminPage extends PureComponent<Props, State> {\n  state = {\n    // isLoading: true,\n  };\n\n  async componentDidMount() {\n    const { userId, loadAdminUserPage } = this.props;\n    loadAdminUserPage(userId);\n  }\n\n  onUserUpdate = (user: UserDTO) => {\n    this.props.updateUser(user);\n  };\n\n  onPasswordChange = (password: string) => {\n    const { userId, setUserPassword } = this.props;\n    setUserPassword(userId, password);\n  };\n\n  onUserDelete = (userId: number) => {\n    this.props.deleteUser(userId);\n  };\n\n  onUserDisable = (userId: number) => {\n    this.props.disableUser(userId);\n  };\n\n  onUserEnable = (userId: number) => {\n    this.props.enableUser(userId);\n  };\n\n  onGrafanaAdminChange = (isGrafanaAdmin: boolean) => {\n    const { userId, updateUserPermissions } = this.props;\n    updateUserPermissions(userId, isGrafanaAdmin);\n  };\n\n  onOrgRemove = (orgId: number) => {\n    const { userId, deleteOrgUser } = this.props;\n    deleteOrgUser(userId, orgId);\n  };\n\n  onOrgRoleChange = (orgId: number, newRole: string) => {\n    const { userId, updateOrgUserRole } = this.props;\n    updateOrgUserRole(userId, orgId, newRole);\n  };\n\n  onOrgAdd = (orgId: number, role: string) => {\n    const { user, addOrgUser } = this.props;\n    addOrgUser(user, orgId, role);\n  };\n\n  onSessionRevoke = (tokenId: number) => {\n    const { userId, revokeSession } = this.props;\n    revokeSession(tokenId, userId);\n  };\n\n  onAllSessionsRevoke = () => {\n    const { userId, revokeAllSessions } = this.props;\n    revokeAllSessions(userId);\n  };\n\n  onUserSync = () => {\n    const { userId, syncLdapUser } = this.props;\n    syncLdapUser(userId);\n  };\n\n  render() {\n    const { navModel, user, orgs, sessions, ldapSyncInfo, isLoading } = this.props;\n    // const { isLoading } = this.state;\n    const isLDAPUser = user && user.isExternal && user.authLabels && user.authLabels.includes('LDAP');\n\n    return (\n      <Page navModel={navModel}>\n        <Page.Contents isLoading={isLoading}>\n          {user && (\n            <>\n              <UserProfile\n                user={user}\n                onUserUpdate={this.onUserUpdate}\n                onUserDelete={this.onUserDelete}\n                onUserDisable={this.onUserDisable}\n                onUserEnable={this.onUserEnable}\n                onPasswordChange={this.onPasswordChange}\n              />\n              {isLDAPUser && config.licenseInfo.hasLicense && ldapSyncInfo && (\n                <UserLdapSyncInfo ldapSyncInfo={ldapSyncInfo} user={user} onUserSync={this.onUserSync} />\n              )}\n              <UserPermissions isGrafanaAdmin={user.isGrafanaAdmin} onGrafanaAdminChange={this.onGrafanaAdminChange} />\n            </>\n          )}\n\n          {orgs && (\n            <UserOrgs\n              orgs={orgs}\n              onOrgRemove={this.onOrgRemove}\n              onOrgRoleChange={this.onOrgRoleChange}\n              onOrgAdd={this.onOrgAdd}\n            />\n          )}\n\n          {sessions && (\n            <UserSessions\n              sessions={sessions}\n              onSessionRevoke={this.onSessionRevoke}\n              onAllSessionsRevoke={this.onAllSessionsRevoke}\n            />\n          )}\n        </Page.Contents>\n      </Page>\n    );\n  }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n  userId: getRouteParamsId(state.location),\n  navModel: getNavModel(state.navIndex, 'global-users'),\n  user: state.userAdmin.user,\n  sessions: state.userAdmin.sessions,\n  orgs: state.userAdmin.orgs,\n  ldapSyncInfo: state.ldap.syncInfo,\n  isLoading: state.userAdmin.isLoading,\n  error: state.userAdmin.error,\n});\n\nconst mapDispatchToProps = {\n  loadAdminUserPage,\n  updateUser,\n  setUserPassword,\n  disableUser,\n  enableUser,\n  deleteUser,\n  updateUserPermissions,\n  addOrgUser,\n  updateOrgUserRole,\n  deleteOrgUser,\n  revokeSession,\n  revokeAllSessions,\n  syncLdapUser,\n};\n\nexport default hot(module)(connect(mapStateToProps, mapDispatchToProps)(UserAdminPage));\n","import React, { FC } from 'react';\nimport { LdapUserInfo } from 'app/types';\n\ninterface Props {\n  info: LdapUserInfo;\n  showAttributeMapping?: boolean;\n}\n\nexport const LdapUserMappingInfo: FC<Props> = ({ info, showAttributeMapping }) => {\n  return (\n    <div className=\"gf-form-group\">\n      <div className=\"gf-form\">\n        <table className=\"filter-table form-inline\">\n          <thead>\n            <tr>\n              <th colSpan={2}>User information</th>\n              {showAttributeMapping && <th>LDAP attribute</th>}\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td className=\"width-16\">First name</td>\n              <td>{info.name.ldapValue}</td>\n              {showAttributeMapping && <td>{info.name.cfgAttrValue}</td>}\n            </tr>\n            <tr>\n              <td className=\"width-16\">Surname</td>\n              <td>{info.surname.ldapValue}</td>\n              {showAttributeMapping && <td>{info.surname.cfgAttrValue}</td>}\n            </tr>\n            <tr>\n              <td className=\"width-16\">Username</td>\n              <td>{info.login.ldapValue}</td>\n              {showAttributeMapping && <td>{info.login.cfgAttrValue}</td>}\n            </tr>\n            <tr>\n              <td className=\"width-16\">Email</td>\n              <td>{info.email.ldapValue}</td>\n              {showAttributeMapping && <td>{info.email.cfgAttrValue}</td>}\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { LdapPermissions } from 'app/types';\nimport { Icon } from '@grafana/ui';\n\ninterface Props {\n  permissions: LdapPermissions;\n}\n\nexport const LdapUserPermissions: FC<Props> = ({ permissions }) => {\n  return (\n    <div className=\"gf-form-group\">\n      <div className=\"gf-form\">\n        <table className=\"filter-table form-inline\">\n          <thead>\n            <tr>\n              <th colSpan={1}>Permissions</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td className=\"width-16\"> Grafana admin</td>\n              <td>\n                {permissions.isGrafanaAdmin ? (\n                  <>\n                    <Icon name=\"shield\" /> Yes\n                  </>\n                ) : (\n                  'No'\n                )}\n              </td>\n            </tr>\n            <tr>\n              <td className=\"width-16\">Status</td>\n              <td>\n                {permissions.isDisabled ? (\n                  <>\n                    <Icon name=\"times\" /> Inactive\n                  </>\n                ) : (\n                  <>\n                    <Icon name=\"check\" /> Active\n                  </>\n                )}\n              </td>\n            </tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { Tooltip, Icon } from '@grafana/ui';\nimport { LdapRole } from 'app/types';\n\ninterface Props {\n  groups: LdapRole[];\n  showAttributeMapping?: boolean;\n}\n\nexport const LdapUserGroups: FC<Props> = ({ groups, showAttributeMapping }) => {\n  const items = showAttributeMapping ? groups : groups.filter(item => item.orgRole);\n\n  return (\n    <div className=\"gf-form-group\">\n      <div className=\"gf-form\">\n        <table className=\"filter-table form-inline\">\n          <thead>\n            <tr>\n              {showAttributeMapping && <th>LDAP Group</th>}\n              <th>\n                Organization\n                <Tooltip placement=\"top\" content=\"Only the first match for an Organization will be used\" theme={'info'}>\n                  <span className=\"gf-form-help-icon\">\n                    <Icon name=\"info-circle\" />\n                  </span>\n                </Tooltip>\n              </th>\n              <th>Role</th>\n            </tr>\n          </thead>\n          <tbody>\n            {items.map((group, index) => {\n              return (\n                <tr key={`${group.orgId}-${index}`}>\n                  {showAttributeMapping && (\n                    <>\n                      <td>{group.groupDN}</td>\n                      {!group.orgRole && (\n                        <>\n                          <td />\n                          <td>\n                            <span className=\"text-warning\">\n                              No match\n                              <Tooltip placement=\"top\" content=\"No matching groups found\" theme={'info'}>\n                                <span className=\"gf-form-help-icon\">\n                                  <Icon name=\"info-circle\" />\n                                </span>\n                              </Tooltip>\n                            </span>\n                          </td>\n                        </>\n                      )}\n                    </>\n                  )}\n                  {group.orgName && (\n                    <>\n                      <td>{group.orgName}</td>\n                      <td>{group.orgRole}</td>\n                    </>\n                  )}\n                </tr>\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { Tooltip, Icon } from '@grafana/ui';\nimport { LdapTeam } from 'app/types';\n\ninterface Props {\n  teams: LdapTeam[];\n  showAttributeMapping?: boolean;\n}\n\nexport const LdapUserTeams: FC<Props> = ({ teams, showAttributeMapping }) => {\n  const items = showAttributeMapping ? teams : teams.filter(item => item.teamName);\n\n  return (\n    <div className=\"gf-form-group\">\n      <div className=\"gf-form\">\n        <table className=\"filter-table form-inline\">\n          <thead>\n            <tr>\n              {showAttributeMapping && <th>LDAP Group</th>}\n              <th>Organisation</th>\n              <th>Team</th>\n            </tr>\n          </thead>\n          <tbody>\n            {items.map((team, index) => {\n              return (\n                <tr key={`${team.teamName}-${index}`}>\n                  {showAttributeMapping && (\n                    <>\n                      <td>{team.groupDN}</td>\n                      {!team.orgName && (\n                        <>\n                          <td />\n                          <td>\n                            <div className=\"text-warning\">\n                              No match\n                              <Tooltip placement=\"top\" content=\"No matching teams found\" theme={'info'}>\n                                <span className=\"gf-form-help-icon\">\n                                  <Icon name=\"info-circle\" />\n                                </span>\n                              </Tooltip>\n                            </div>\n                          </td>\n                        </>\n                      )}\n                    </>\n                  )}\n                  {team.orgName && (\n                    <>\n                      <td>{team.orgName}</td>\n                      <td>{team.teamName}</td>\n                    </>\n                  )}\n                </tr>\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { LdapUserMappingInfo } from './LdapUserMappingInfo';\nimport { LdapUserPermissions } from './LdapUserPermissions';\nimport { LdapUserGroups } from './LdapUserGroups';\nimport { LdapUserTeams } from './LdapUserTeams';\nimport { LdapUser } from 'app/types';\n\ninterface Props {\n  ldapUser: LdapUser;\n  showAttributeMapping?: boolean;\n}\n\nexport const LdapUserInfo: FC<Props> = ({ ldapUser, showAttributeMapping }) => {\n  return (\n    <>\n      <LdapUserMappingInfo info={ldapUser.info} showAttributeMapping={showAttributeMapping} />\n      <LdapUserPermissions permissions={ldapUser.permissions} />\n      {ldapUser.roles && ldapUser.roles.length > 0 && (\n        <LdapUserGroups groups={ldapUser.roles} showAttributeMapping={showAttributeMapping} />\n      )}\n\n      {ldapUser.teams && ldapUser.teams.length > 0 ? (\n        <LdapUserTeams teams={ldapUser.teams} showAttributeMapping={showAttributeMapping} />\n      ) : (\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <tbody>\n                <tr>\n                  <td>No teams found via LDAP</td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n      )}\n    </>\n  );\n};\n","import { MutableVector } from '../types/vector';\nimport { FunctionalVector } from './FunctionalVector';\n\nexport class ArrayVector<T = any> extends FunctionalVector<T> implements MutableVector<T> {\n  buffer: T[];\n\n  constructor(buffer?: T[]) {\n    super();\n    this.buffer = buffer ? buffer : [];\n  }\n\n  get length() {\n    return this.buffer.length;\n  }\n\n  add(value: T) {\n    this.buffer.push(value);\n  }\n\n  get(index: number): T {\n    return this.buffer[index];\n  }\n\n  set(index: number, value: T) {\n    this.buffer[index] = value;\n  }\n\n  reverse() {\n    this.buffer.reverse();\n  }\n\n  toArray(): T[] {\n    return this.buffer;\n  }\n\n  toJSON(): T[] {\n    return this.buffer;\n  }\n}\n","// Libraries\nimport { isArray, isBoolean, isNumber, isString } from 'lodash';\n\n// Types\nimport {\n  DataFrame,\n  Field,\n  FieldConfig,\n  TimeSeries,\n  FieldType,\n  TableData,\n  Column,\n  GraphSeriesXY,\n  TimeSeriesValue,\n  FieldDTO,\n  DataFrameDTO,\n  TIME_SERIES_VALUE_FIELD_NAME,\n  TIME_SERIES_TIME_FIELD_NAME,\n} from '../types/index';\nimport { isDateTime } from '../datetime/moment_wrapper';\nimport { ArrayVector } from '../vector/ArrayVector';\nimport { MutableDataFrame } from './MutableDataFrame';\nimport { SortedVector } from '../vector/SortedVector';\nimport { ArrayDataFrame } from './ArrayDataFrame';\nimport { getFieldDisplayName } from '../field/fieldState';\n\nfunction convertTableToDataFrame(table: TableData): DataFrame {\n  const fields = table.columns.map(c => {\n    const { text, type, ...disp } = c as any;\n    return {\n      name: text, // rename 'text' to the 'name' field\n      config: (disp || {}) as FieldConfig,\n      values: new ArrayVector(),\n      type: type && Object.values(FieldType).includes(type as FieldType) ? (type as FieldType) : FieldType.other,\n    };\n  });\n\n  if (!isArray(table.rows)) {\n    throw new Error(`Expected table rows to be array, got ${typeof table.rows}.`);\n  }\n\n  for (const row of table.rows) {\n    for (let i = 0; i < fields.length; i++) {\n      fields[i].values.buffer.push(row[i]);\n    }\n  }\n\n  for (const f of fields) {\n    if (f.type === FieldType.other) {\n      const t = guessFieldTypeForField(f);\n      if (t) {\n        f.type = t;\n      }\n    }\n  }\n\n  return {\n    fields,\n    refId: table.refId,\n    meta: table.meta,\n    name: table.name,\n    length: table.rows.length,\n  };\n}\n\nfunction convertTimeSeriesToDataFrame(timeSeries: TimeSeries): DataFrame {\n  const times: number[] = [];\n  const values: TimeSeriesValue[] = [];\n\n  for (const point of timeSeries.datapoints) {\n    values.push(point[0]);\n    times.push(point[1] as number);\n  }\n\n  const fields = [\n    {\n      name: TIME_SERIES_TIME_FIELD_NAME,\n      type: FieldType.time,\n      config: {},\n      values: new ArrayVector<number>(times),\n    },\n    {\n      name: TIME_SERIES_VALUE_FIELD_NAME,\n      type: FieldType.number,\n      config: {\n        unit: timeSeries.unit,\n      },\n      values: new ArrayVector<TimeSeriesValue>(values),\n      labels: timeSeries.tags,\n    },\n  ];\n\n  if (timeSeries.title) {\n    (fields[1].config as FieldConfig).displayName = timeSeries.title;\n  }\n\n  return {\n    name: timeSeries.target,\n    refId: timeSeries.refId,\n    meta: timeSeries.meta,\n    fields,\n    length: values.length,\n  };\n}\n\n/**\n * This is added temporarily while we convert the LogsModel\n * to DataFrame.  See: https://github.com/grafana/grafana/issues/18528\n */\nfunction convertGraphSeriesToDataFrame(graphSeries: GraphSeriesXY): DataFrame {\n  const x = new ArrayVector();\n  const y = new ArrayVector();\n\n  for (let i = 0; i < graphSeries.data.length; i++) {\n    const row = graphSeries.data[i];\n    x.buffer.push(row[1]);\n    y.buffer.push(row[0]);\n  }\n\n  return {\n    name: graphSeries.label,\n    fields: [\n      {\n        name: graphSeries.label || TIME_SERIES_VALUE_FIELD_NAME,\n        type: FieldType.number,\n        config: {},\n        values: x,\n      },\n      {\n        name: TIME_SERIES_TIME_FIELD_NAME,\n        type: FieldType.time,\n        config: {\n          unit: 'dateTimeAsIso',\n        },\n        values: y,\n      },\n    ],\n    length: x.buffer.length,\n  };\n}\n\nfunction convertJSONDocumentDataToDataFrame(timeSeries: TimeSeries): DataFrame {\n  const fields = [\n    {\n      name: timeSeries.target,\n      type: FieldType.other,\n      labels: timeSeries.tags,\n      config: {\n        unit: timeSeries.unit,\n        filterable: (timeSeries as any).filterable,\n      },\n      values: new ArrayVector(),\n    },\n  ];\n\n  for (const point of timeSeries.datapoints) {\n    fields[0].values.buffer.push(point);\n  }\n\n  return {\n    name: timeSeries.target,\n    refId: timeSeries.target,\n    meta: { json: true },\n    fields,\n    length: timeSeries.datapoints.length,\n  };\n}\n\n// PapaParse Dynamic Typing regex:\n// https://github.com/mholt/PapaParse/blob/master/papaparse.js#L998\nconst NUMBER = /^\\s*(-?(\\d*\\.?\\d+|\\d+\\.?\\d*)(e[-+]?\\d+)?|NAN)\\s*$/i;\n\n/**\n * Given a name and value, this will pick a reasonable field type\n */\nexport function guessFieldTypeFromNameAndValue(name: string, v: any): FieldType {\n  if (name) {\n    name = name.toLowerCase();\n    if (name === 'date' || name === 'time') {\n      return FieldType.time;\n    }\n  }\n  return guessFieldTypeFromValue(v);\n}\n\n/**\n * Given a value this will guess the best column type\n *\n * TODO: better Date/Time support!  Look for standard date strings?\n */\nexport function guessFieldTypeFromValue(v: any): FieldType {\n  if (v instanceof Date || isDateTime(v)) {\n    return FieldType.time;\n  }\n\n  if (isNumber(v)) {\n    return FieldType.number;\n  }\n\n  if (isString(v)) {\n    if (NUMBER.test(v)) {\n      return FieldType.number;\n    }\n\n    if (v === 'true' || v === 'TRUE' || v === 'True' || v === 'false' || v === 'FALSE' || v === 'False') {\n      return FieldType.boolean;\n    }\n\n    return FieldType.string;\n  }\n\n  if (isBoolean(v)) {\n    return FieldType.boolean;\n  }\n\n  return FieldType.other;\n}\n\n/**\n * Looks at the data to guess the column type.  This ignores any existing setting\n */\nexport function guessFieldTypeForField(field: Field): FieldType | undefined {\n  // 1. Use the column name to guess\n  if (field.name) {\n    const name = field.name.toLowerCase();\n    if (name === 'date' || name === 'time') {\n      return FieldType.time;\n    }\n  }\n\n  // 2. Check the first non-null value\n  for (let i = 0; i < field.values.length; i++) {\n    const v = field.values.get(i);\n    if (v !== null) {\n      return guessFieldTypeFromValue(v);\n    }\n  }\n\n  // Could not find anything\n  return undefined;\n}\n\n/**\n * @returns A copy of the series with the best guess for each field type.\n * If the series already has field types defined, they will be used, unless `guessDefined` is true.\n * @param series The DataFrame whose field's types should be guessed\n * @param guessDefined Whether to guess types of fields with already defined types\n */\nexport const guessFieldTypes = (series: DataFrame, guessDefined = false): DataFrame => {\n  for (const field of series.fields) {\n    if (!field.type || field.type === FieldType.other || guessDefined) {\n      // Something is missing a type, return a modified copy\n      return {\n        ...series,\n        fields: series.fields.map(field => {\n          if (field.type && field.type !== FieldType.other && !guessDefined) {\n            return field;\n          }\n          // Calculate a reasonable schema value\n          return {\n            ...field,\n            type: guessFieldTypeForField(field) || FieldType.other,\n          };\n        }),\n      };\n    }\n  }\n  // No changes necessary\n  return series;\n};\n\nexport const isTableData = (data: any): data is DataFrame => data && data.hasOwnProperty('columns');\n\nexport const isDataFrame = (data: any): data is DataFrame => data && data.hasOwnProperty('fields');\n\n/**\n * Inspect any object and return the results as a DataFrame\n */\nexport function toDataFrame(data: any): DataFrame {\n  if ('fields' in data) {\n    // DataFrameDTO does not have length\n    if ('length' in data) {\n      return data as DataFrame;\n    }\n\n    // This will convert the array values into Vectors\n    return new MutableDataFrame(data as DataFrameDTO);\n  }\n\n  // Handle legacy docs/json type\n  if (data.hasOwnProperty('type') && data.type === 'docs') {\n    return convertJSONDocumentDataToDataFrame(data);\n  }\n\n  if (data.hasOwnProperty('datapoints')) {\n    return convertTimeSeriesToDataFrame(data);\n  }\n\n  if (data.hasOwnProperty('data')) {\n    return convertGraphSeriesToDataFrame(data);\n  }\n\n  if (data.hasOwnProperty('columns')) {\n    return convertTableToDataFrame(data);\n  }\n\n  if (Array.isArray(data)) {\n    return new ArrayDataFrame(data);\n  }\n\n  console.warn('Can not convert', data);\n  throw new Error('Unsupported data format');\n}\n\nexport const toLegacyResponseData = (frame: DataFrame): TimeSeries | TableData => {\n  const { fields } = frame;\n\n  const rowCount = frame.length;\n  const rows: any[][] = [];\n\n  if (fields.length === 2) {\n    const { timeField, timeIndex } = getTimeField(frame);\n    if (timeField) {\n      const valueIndex = timeIndex === 0 ? 1 : 0;\n      const valueField = fields[valueIndex];\n      const timeField = fields[timeIndex!];\n\n      // Make sure it is [value,time]\n      for (let i = 0; i < rowCount; i++) {\n        rows.push([\n          valueField.values.get(i), // value\n          timeField.values.get(i), // time\n        ]);\n      }\n\n      return {\n        alias: frame.name,\n        target: getFieldDisplayName(valueField, frame),\n        datapoints: rows,\n        unit: fields[0].config ? fields[0].config.unit : undefined,\n        refId: frame.refId,\n        meta: frame.meta,\n      } as TimeSeries;\n    }\n  }\n\n  for (let i = 0; i < rowCount; i++) {\n    const row: any[] = [];\n    for (let j = 0; j < fields.length; j++) {\n      row.push(fields[j].values.get(i));\n    }\n    rows.push(row);\n  }\n\n  if (frame.meta && frame.meta.json) {\n    return {\n      alias: fields[0].name || frame.name,\n      target: fields[0].name || frame.name,\n      datapoints: fields[0].values.toArray(),\n      filterable: fields[0].config ? fields[0].config.filterable : undefined,\n      type: 'docs',\n    } as TimeSeries;\n  }\n\n  return {\n    columns: fields.map(f => {\n      const { name, config } = f;\n      if (config) {\n        // keep unit etc\n        const { ...column } = config;\n        (column as Column).text = name;\n        return column as Column;\n      }\n      return { text: name };\n    }),\n    type: 'table',\n    refId: frame.refId,\n    meta: frame.meta,\n    rows,\n  };\n};\n\nexport function sortDataFrame(data: DataFrame, sortIndex?: number, reverse = false): DataFrame {\n  const field = data.fields[sortIndex!];\n  if (!field) {\n    return data;\n  }\n\n  // Natural order\n  const index: number[] = [];\n  for (let i = 0; i < data.length; i++) {\n    index.push(i);\n  }\n  const values = field.values;\n\n  // Numeric Comparison\n  let compare = (a: number, b: number) => {\n    const vA = values.get(a);\n    const vB = values.get(b);\n    return vA - vB; // works for numbers!\n  };\n\n  // String Comparison\n  if (field.type === FieldType.string) {\n    compare = (a: number, b: number) => {\n      const vA: string = values.get(a);\n      const vB: string = values.get(b);\n      return vA.localeCompare(vB);\n    };\n  }\n\n  // Run the sort function\n  index.sort(compare);\n  if (reverse) {\n    index.reverse();\n  }\n\n  // Return a copy that maps sorted values\n  return {\n    ...data,\n    fields: data.fields.map(f => {\n      return {\n        ...f,\n        values: new SortedVector(f.values, index),\n      };\n    }),\n  };\n}\n\n/**\n * Returns a copy with all values reversed\n */\nexport function reverseDataFrame(data: DataFrame): DataFrame {\n  return {\n    ...data,\n    fields: data.fields.map(f => {\n      const copy = [...f.values.toArray()];\n      copy.reverse();\n      return {\n        ...f,\n        values: new ArrayVector(copy),\n      };\n    }),\n  };\n}\n\n/**\n * Wrapper to get an array from each field value\n */\nexport function getDataFrameRow(data: DataFrame, row: number): any[] {\n  const values: any[] = [];\n  for (const field of data.fields) {\n    values.push(field.values.get(row));\n  }\n  return values;\n}\n\n/**\n * Returns a copy that does not include functions\n */\nexport function toDataFrameDTO(data: DataFrame): DataFrameDTO {\n  const fields: FieldDTO[] = data.fields.map(f => {\n    let values = f.values.toArray();\n    if (!Array.isArray(values)) {\n      // Apache arrow will pack objects into typed arrays\n      // Float64Array, etc\n      // TODO: Float64Array could be used directly\n      values = [];\n      for (let i = 0; i < f.values.length; i++) {\n        values.push(f.values.get(i));\n      }\n    }\n\n    return {\n      name: f.name,\n      type: f.type,\n      config: f.config,\n      values,\n      labels: f.labels,\n    };\n  });\n\n  return {\n    fields,\n    refId: data.refId,\n    meta: data.meta,\n    name: data.name,\n  };\n}\n\nexport const getTimeField = (series: DataFrame): { timeField?: Field; timeIndex?: number } => {\n  for (let i = 0; i < series.fields.length; i++) {\n    if (series.fields[i].type === FieldType.time) {\n      return {\n        timeField: series.fields[i],\n        timeIndex: i,\n      };\n    }\n  }\n  return {};\n};\n","/* Flot plugin for stacking data sets rather than overlyaing them.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin assumes the data is sorted on x (or y if stacking horizontally).\nFor line charts, it is assumed that if a line has an undefined gap (from a\nnull point), then the line above it should have the same gap - insert zeros\ninstead of \"null\" if you want another behaviour. This also holds for the start\nand end of the chart. Note that stacking a mix of positive and negative values\nin most instances doesn't make sense (so it looks weird).\n\nTwo or more series are stacked when their \"stack\" attribute is set to the same\nkey (which can be any number or string or just \"true\"). To specify the default\nstack, you can set the stack option like this:\n\n    series: {\n        stack: null/false, true, or a key (number/string)\n    }\n\nYou can also specify it for a single series, like this:\n\n    $.plot( $(\"#placeholder\"), [{\n        data: [ ... ],\n        stack: true\n    }])\n\nThe stacking order is determined by the order of the data series in the array\n(later series end up on top of the previous).\n\nInternally, the plugin modifies the datapoints in each series, adding an\noffset to the y value. For line series, extra data points are inserted through\ninterpolation. If there's a second y value, it's also adjusted (e.g for bar\ncharts or filled areas).\n\n*/\n\n(function ($) {\n    var options = {\n        series: { stack: null } // or number/string\n    };\n\n    function init(plot) {\n        function findMatchingSeries(s, allseries) {\n            var res = null;\n            for (var i = 0; i < allseries.length; ++i) {\n                if (s == allseries[i])\n                    break;\n\n                if (allseries[i].stack == s.stack)\n                    res = allseries[i];\n            }\n\n            return res;\n        }\n\n        function stackData(plot, s, datapoints) {\n            if (s.stack == null || s.stack === false)\n                return;\n\n            var other = findMatchingSeries(s, plot.getData());\n            if (!other)\n                return;\n\n            var ps = datapoints.pointsize,\n                points = datapoints.points,\n                otherps = other.datapoints.pointsize,\n                otherpoints = other.datapoints.points,\n                newpoints = [],\n                px, py, intery, qx, qy, bottom,\n                withlines = s.lines.show,\n                horizontal = s.bars.horizontal,\n                withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y),\n                withsteps = withlines && s.lines.steps,\n                keyOffset = horizontal ? 1 : 0,\n                accumulateOffset = horizontal ? 0 : 1,\n                i = 0, j = 0, l, m;\n\n            while (true) {\n                if (i >= points.length && j >= otherpoints.length)\n                    break;\n\n                l = newpoints.length;\n\n                if (i < points.length && points[i] == null) {\n                    // copy gaps\n                    for (m = 0; m < ps; ++m)\n                        newpoints.push(points[i + m]);\n                    i += ps;\n                }\n                else if (i >= points.length) {\n                    // take the remaining points from the previous series\n                    for (m = 0; m < ps; ++m)\n                        newpoints.push(otherpoints[j + m]);\n                    if (withbottom)\n                        newpoints[l + 2] = otherpoints[j + accumulateOffset];\n                    j += otherps;\n                }\n                else if (j >= otherpoints.length) {\n                    // take the remaining points from the current series\n                    for (m = 0; m < ps; ++m)\n                        newpoints.push(points[i + m]);\n                    i += ps;\n                }\n                else if (j < otherpoints.length && otherpoints[j] == null) {\n                    // ignore point\n                    j += otherps;\n                }\n                else {\n                    // cases where we actually got two points\n                    px = points[i + keyOffset];\n                    py = points[i + accumulateOffset];\n                    qx = otherpoints[j + keyOffset];\n                    qy = otherpoints[j + accumulateOffset];\n                    bottom = 0;\n\n                    if (px == qx) {\n                        for (m = 0; m < ps; ++m)\n                            newpoints.push(points[i + m]);\n\n                        newpoints[l + accumulateOffset] += qy;\n                        bottom = qy;\n\n                        i += ps;\n                        j += otherps;\n                    }\n                    else if (px > qx) {\n                        // take the point from the previous series so that next series will correctly stack\n                        if (i == 0) {\n                            for (m = 0; m < ps; ++m)\n                                newpoints.push(otherpoints[j + m]);\n                            bottom = qy;\n                        }\n                        // we got past point below, might need to\n                        // insert interpolated extra point\n                        if (i > 0 && points[i - ps] != null) {\n                            intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px);\n                            newpoints.push(qx);\n                            newpoints.push(intery + qy);\n                            for (m = 2; m < ps; ++m)\n                                newpoints.push(points[i + m]);\n                            bottom = qy;\n                        }\n\n                        j += otherps;\n                    }\n                    else { // px < qx\n                        for (m = 0; m < ps; ++m)\n                            newpoints.push(points[i + m]);\n\n                        // we might be able to interpolate a point below,\n                        // this can give us a better y\n                        if (j > 0 && otherpoints[j - otherps] != null)\n                            bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx);\n\n                        newpoints[l + accumulateOffset] += bottom;\n\n                        i += ps;\n                    }\n\n                    fromgap = false;\n\n                    if (l != newpoints.length && withbottom)\n                        newpoints[l + 2] = bottom;\n                }\n\n                // maintain the line steps invariant\n                if (withsteps && l != newpoints.length && l > 0\n                    && newpoints[l] != null\n                    && newpoints[l] != newpoints[l - ps]\n                    && newpoints[l + 1] != newpoints[l - ps + 1]) {\n                    for (m = 0; m < ps; ++m)\n                        newpoints[l + ps + m] = newpoints[l + m];\n                    newpoints[l + 1] = newpoints[l - ps + 1];\n                }\n            }\n\n            datapoints.points = newpoints;\n        }\n\n        plot.hooks.processDatapoints.push(stackData);\n    }\n\n    $.plot.plugins.push({\n        init: init,\n        options: options,\n        name: 'stack',\n        version: '1.2'\n    });\n})(jQuery);\n","var path = 'public/app/features/datasources/partials/http_settings.html';\nvar html = \"\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash';\nimport { Action, createAction } from '@reduxjs/toolkit';\nimport { LocationUpdate } from '@grafana/runtime';\n\nimport { LocationState } from 'app/types';\nimport { urlUtil } from '@grafana/data';\n\nexport const initialState: LocationState = {\n  url: '',\n  path: '',\n  query: {},\n  routeParams: {},\n  replace: false,\n  lastUpdated: 0,\n};\n\nexport const updateLocation = createAction<LocationUpdate>('location/updateLocation');\n\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because Angular would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const locationReducer = (state: LocationState = initialState, action: Action<unknown>) => {\n  if (updateLocation.match(action)) {\n    const payload: LocationUpdate = action.payload;\n    const { path, routeParams, replace } = payload;\n    let query = payload.query || state.query;\n\n    if (payload.partial) {\n      query = _.defaults(query, state.query);\n      query = _.omitBy(query, _.isNull);\n    }\n\n    return {\n      url: urlUtil.renderUrl(path || state.path, query),\n      path: path || state.path,\n      query: { ...query },\n      routeParams: routeParams || state.routeParams,\n      replace: replace === true,\n      lastUpdated: new Date().getTime(),\n    };\n  }\n\n  return state;\n};\n","import EventEmitter3, { EventEmitter } from 'eventemitter3';\nimport { AppEvent } from '@grafana/data';\n\nexport class Emitter {\n  private emitter: EventEmitter3;\n\n  constructor() {\n    this.emitter = new EventEmitter();\n  }\n\n  /**\n   * DEPRECATED.\n   */\n  emit(name: string, data?: any): void;\n\n  /**\n   * Emits an `event` with `payload`.\n   */\n  emit<T extends undefined>(event: AppEvent<T>): void;\n  emit<T extends Partial<T> extends T ? Partial<T> : never>(event: AppEvent<T>): void;\n  emit<T>(event: AppEvent<T>, payload: T): void;\n  emit<T>(event: AppEvent<T> | string, payload?: T | any): void {\n    if (typeof event === 'string') {\n      console.log(`Using strings as events is deprecated and will be removed in a future version. (${event})`);\n      this.emitter.emit(event, payload);\n    } else {\n      this.emitter.emit(event.name, payload);\n    }\n  }\n\n  /**\n   * DEPRECATED.\n   */\n  on(name: string, handler: (payload?: any) => void, scope?: any): void;\n\n  /**\n   * Handles `event` with `handler()` when emitted.\n   */\n  on<T extends undefined>(event: AppEvent<T>, handler: () => void, scope?: any): void;\n  on<T extends Partial<T> extends T ? Partial<T> : never>(event: AppEvent<T>, handler: () => void, scope?: any): void;\n  on<T>(event: AppEvent<T>, handler: (payload: T) => void, scope?: any): void;\n  on<T>(event: AppEvent<T> | string, handler: (payload?: T | any) => void, scope?: any) {\n    if (typeof event === 'string') {\n      console.log(`Using strings as events is deprecated and will be removed in a future version. (${event})`);\n      this.emitter.on(event, handler);\n\n      if (scope) {\n        const unbind = scope.$on('$destroy', () => {\n          this.emitter.off(event, handler);\n          unbind();\n        });\n      }\n      return;\n    }\n\n    this.emitter.on(event.name, handler);\n\n    if (scope) {\n      const unbind = scope.$on('$destroy', () => {\n        this.emitter.off(event.name, handler);\n        unbind();\n      });\n    }\n  }\n\n  /**\n   * DEPRECATED.\n   */\n  off(name: string, handler: (payload?: any) => void): void;\n\n  off<T extends undefined>(event: AppEvent<T>, handler: () => void): void;\n  off<T extends Partial<T> extends T ? Partial<T> : never>(event: AppEvent<T>, handler: () => void, scope?: any): void;\n  off<T>(event: AppEvent<T>, handler: (payload: T) => void): void;\n  off<T>(event: AppEvent<T> | string, handler: (payload?: T | any) => void) {\n    if (typeof event === 'string') {\n      console.log(`Using strings as events is deprecated and will be removed in a future version. (${event})`);\n      this.emitter.off(event, handler);\n      return;\n    }\n\n    this.emitter.off(event.name, handler);\n  }\n\n  removeAllListeners(evt?: string) {\n    this.emitter.removeAllListeners(evt);\n  }\n\n  getEventCount(): number {\n    return (this.emitter as any)._eventsCount;\n  }\n}\n","import { FieldConfig } from './dataFrame';\nimport { DataTransformerConfig } from './transformations';\nimport { ApplyFieldOverrideOptions } from './fieldOverrides';\n\nexport type KeyValue<T = any> = { [s: string]: T };\n\n/**\n * Represent panel data loading state.\n */\nexport enum LoadingState {\n  NotStarted = 'NotStarted',\n  Loading = 'Loading',\n  Streaming = 'Streaming',\n  Done = 'Done',\n  Error = 'Error',\n}\n\nexport type PreferredVisualisationType = 'graph' | 'table';\n\nexport interface QueryResultMeta {\n  /** DatasSource Specific Values */\n  custom?: Record<string, any>;\n\n  /** Stats */\n  stats?: QueryResultMetaStat[];\n\n  /** Meta Notices */\n  notices?: QueryResultMetaNotice[];\n\n  /** Used to track transformation ids that where part of the processing */\n  transformations?: string[];\n\n  /** Currently used to show results in Explore only in preferred visualisation option */\n  preferredVisualisationType?: PreferredVisualisationType;\n\n  /**\n   * Legacy data source specific, should be moved to custom\n   * */\n  gmdMeta?: any[]; // used by cloudwatch\n  rawQuery?: string; // used by stackdriver\n  alignmentPeriod?: string; // used by stackdriver\n  query?: string; // used by azure log\n  searchWords?: string[]; // used by log models and loki\n  limit?: number; // used by log models and loki\n  json?: boolean; // used to keep track of old json doc values\n}\n\nexport interface QueryResultMetaStat extends FieldConfig {\n  displayName: string;\n  value: number;\n}\n\n/**\n * QueryResultMetaNotice is a structure that provides user notices for query result data\n */\nexport interface QueryResultMetaNotice {\n  /**\n   * Specify the notice severity\n   */\n  severity: 'info' | 'warning' | 'error';\n\n  /**\n   * Notice descriptive text\n   */\n  text: string;\n\n  /**\n   * An optional link that may be displayed in the UI.\n   * This value may be an absolute URL or relative to grafana root\n   */\n  link?: string;\n\n  /**\n   * Optionally suggest an appropriate tab for the panel inspector\n   */\n  inspect?: 'meta' | 'error' | 'data' | 'stats';\n}\n\nexport interface QueryResultBase {\n  /**\n   * Matches the query target refId\n   */\n  refId?: string;\n\n  /**\n   * Used by some backend data sources to communicate back info about the execution (generated sql, timing)\n   */\n  meta?: QueryResultMeta;\n}\n\nexport interface Labels {\n  [key: string]: string;\n}\n\nexport interface Column {\n  text: string; // For a Column, the 'text' is the field name\n  filterable?: boolean;\n  unit?: string;\n  custom?: Record<string, any>;\n}\n\nexport interface TableData extends QueryResultBase {\n  name?: string;\n  columns: Column[];\n  rows: any[][];\n  type?: string;\n}\n\nexport type TimeSeriesValue = number | null;\n\nexport type TimeSeriesPoints = TimeSeriesValue[][];\n\nexport interface TimeSeries extends QueryResultBase {\n  target: string;\n  /**\n   * If name is manually configured via an alias / legend pattern\n   */\n  title?: string;\n  datapoints: TimeSeriesPoints;\n  unit?: string;\n  tags?: Labels;\n}\n\nexport enum NullValueMode {\n  Null = 'null',\n  Ignore = 'connected',\n  AsZero = 'null as zero',\n}\n\nexport interface AnnotationEvent {\n  id?: string;\n  annotation?: any;\n  dashboardId?: number;\n  panelId?: number;\n  userId?: number;\n  login?: string;\n  email?: string;\n  avatarUrl?: string;\n  time?: number;\n  timeEnd?: number;\n  isRegion?: boolean;\n  title?: string;\n  text?: string;\n  type?: string;\n  tags?: string[];\n\n  // Currently used to merge annotations from alerts and dashboard\n  source?: any; // source.type === 'dashboard'\n}\n\n/**\n * Describes and API for exposing panel specific data configurations.\n */\nexport interface DataConfigSource {\n  getTransformations: () => DataTransformerConfig[] | undefined;\n  getFieldOverrideOptions: () => ApplyFieldOverrideOptions | undefined;\n}\n","import React, { useContext } from 'react';\nimport { LegendComponentProps, LegendItem } from './Legend';\nimport { InlineList } from '../List/InlineList';\nimport { List } from '../List/List';\nimport { css, cx } from 'emotion';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  item: css`\n    padding-left: 10px;\n    display: flex;\n    font-size: ${theme.typography.size.sm};\n    white-space: nowrap;\n  `,\n  wrapper: css`\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    width: 100%;\n  `,\n  section: css`\n    display: flex;\n  `,\n  sectionRight: css`\n    justify-content: flex-end;\n    flex-grow: 1;\n  `,\n}));\n\nexport const LegendList: React.FunctionComponent<LegendComponentProps> = ({\n  items,\n  itemRenderer,\n  placement,\n  className,\n}) => {\n  const theme = useContext(ThemeContext);\n  const styles = getStyles(theme);\n\n  const renderItem = (item: LegendItem, index: number) => {\n    return <span className={styles.item}>{itemRenderer ? itemRenderer(item, index) : item.label}</span>;\n  };\n\n  const getItemKey = (item: LegendItem) => `${item.label}`;\n\n  return placement === 'under' ? (\n    <div className={cx(styles.wrapper, className)}>\n      <div className={styles.section}>\n        <InlineList items={items.filter(item => item.yAxis === 1)} renderItem={renderItem} getItemKey={getItemKey} />\n      </div>\n      <div className={cx(styles.section, styles.sectionRight)}>\n        <InlineList items={items.filter(item => item.yAxis !== 1)} renderItem={renderItem} getItemKey={getItemKey} />\n      </div>\n    </div>\n  ) : (\n    <List items={items} renderItem={renderItem} getItemKey={getItemKey} className={className} />\n  );\n};\n\nLegendList.displayName = 'LegendList';\n","import { getFlotTickDecimals } from 'app/core/utils/ticks';\nimport _ from 'lodash';\nimport { getValueFormat, ValueFormatter, stringToJsRegex, DecimalCount, formattedValueToString } from '@grafana/data';\n\nfunction matchSeriesOverride(aliasOrRegex: string, seriesAlias: string) {\n  if (!aliasOrRegex) {\n    return false;\n  }\n\n  if (aliasOrRegex[0] === '/') {\n    const regex = stringToJsRegex(aliasOrRegex);\n    return seriesAlias.match(regex) != null;\n  }\n\n  return aliasOrRegex === seriesAlias;\n}\n\nfunction translateFillOption(fill: number) {\n  return fill === 0 ? 0.001 : fill / 10;\n}\n\nfunction getFillGradient(amount: number) {\n  if (!amount) {\n    return null;\n  }\n\n  return {\n    colors: [{ opacity: 0.0 }, { opacity: amount / 10 }],\n  };\n}\n\n/**\n * Calculate decimals for legend and update values for each series.\n * @param data series data\n * @param panel\n * @param height\n */\nexport function updateLegendValues(data: TimeSeries[], panel: any, height: number) {\n  for (let i = 0; i < data.length; i++) {\n    const series = data[i];\n    const yaxes = panel.yaxes;\n    const seriesYAxis = series.yaxis || 1;\n    const axis = yaxes[seriesYAxis - 1];\n    const formatter = getValueFormat(axis.format);\n\n    // decimal override\n    if (_.isNumber(panel.decimals)) {\n      series.updateLegendValues(formatter, panel.decimals, null);\n    } else if (_.isNumber(axis.decimals)) {\n      series.updateLegendValues(formatter, axis.decimals + 1, null);\n    } else {\n      // auto decimals\n      // legend and tooltip gets one more decimal precision\n      // than graph legend ticks\n      const { datamin, datamax } = getDataMinMax(data);\n      const { tickDecimals, scaledDecimals } = getFlotTickDecimals(datamin, datamax, axis, height);\n      const tickDecimalsPlusOne = (tickDecimals || -1) + 1;\n      series.updateLegendValues(formatter, tickDecimalsPlusOne, scaledDecimals + 2);\n    }\n  }\n}\n\nexport function getDataMinMax(data: TimeSeries[]) {\n  let datamin = null;\n  let datamax = null;\n\n  for (const series of data) {\n    if (datamax === null || datamax < series.stats.max) {\n      datamax = series.stats.max;\n    }\n    if (datamin === null || datamin > series.stats.min) {\n      datamin = series.stats.min;\n    }\n  }\n\n  return { datamin, datamax };\n}\n\n/**\n * @deprecated: This class should not be used in new panels\n *\n * Use DataFrame and helpers instead\n */\nexport default class TimeSeries {\n  datapoints: any;\n  id: string;\n  // Represents index of original data frame in the quey response\n  dataFrameIndex: number;\n  // Represents index of field in the data frame\n  fieldIndex: number;\n  label: string;\n  alias: string;\n  aliasEscaped: string;\n  color?: string;\n  valueFormater: any;\n  stats: any;\n  legend: boolean;\n  hideTooltip: boolean;\n  allIsNull: boolean;\n  allIsZero: boolean;\n  decimals: DecimalCount;\n  scaledDecimals: DecimalCount;\n  hasMsResolution: boolean;\n  isOutsideRange: boolean;\n\n  lines: any;\n  hiddenSeries: boolean;\n  dashes: any;\n  bars: any;\n  points: any;\n  yaxis: any;\n  zindex: any;\n  stack: any;\n  nullPointMode: any;\n  fillBelowTo: any;\n  transform: any;\n  flotpairs: any;\n  unit: any;\n\n  constructor(opts: any) {\n    this.datapoints = opts.datapoints;\n    this.label = opts.alias;\n    this.id = opts.alias;\n    this.alias = opts.alias;\n    this.aliasEscaped = _.escape(opts.alias);\n    this.color = opts.color;\n    this.bars = { fillColor: opts.color };\n    this.valueFormater = getValueFormat('none');\n    this.stats = {};\n    this.legend = true;\n    this.unit = opts.unit;\n    this.dataFrameIndex = opts.dataFrameIndex;\n    this.fieldIndex = opts.fieldIndex;\n    this.hasMsResolution = this.isMsResolutionNeeded();\n  }\n\n  applySeriesOverrides(overrides: any[]) {\n    this.lines = {};\n    this.dashes = {\n      dashLength: [],\n    };\n    this.points = {};\n    this.yaxis = 1;\n    this.zindex = 0;\n    this.nullPointMode = null;\n    delete this.stack;\n    delete this.bars.show;\n\n    for (let i = 0; i < overrides.length; i++) {\n      const override = overrides[i];\n      if (!matchSeriesOverride(override.alias, this.alias)) {\n        continue;\n      }\n      if (override.lines !== void 0) {\n        this.lines.show = override.lines;\n      }\n      if (override.dashes !== void 0) {\n        this.dashes.show = override.dashes;\n        this.lines.lineWidth = 0;\n      }\n      if (override.points !== void 0) {\n        this.points.show = override.points;\n      }\n      if (override.bars !== void 0) {\n        this.bars.show = override.bars;\n      }\n      if (override.fill !== void 0) {\n        this.lines.fill = translateFillOption(override.fill);\n      }\n      if (override.fillGradient !== void 0) {\n        this.lines.fillColor = getFillGradient(override.fillGradient);\n      }\n      if (override.stack !== void 0) {\n        this.stack = override.stack;\n      }\n      if (override.linewidth !== void 0) {\n        this.lines.lineWidth = this.dashes.show ? 0 : override.linewidth;\n        this.dashes.lineWidth = override.linewidth;\n      }\n      if (override.dashLength !== void 0) {\n        this.dashes.dashLength[0] = override.dashLength;\n      }\n      if (override.spaceLength !== void 0) {\n        this.dashes.dashLength[1] = override.spaceLength;\n      }\n      if (override.nullPointMode !== void 0) {\n        this.nullPointMode = override.nullPointMode;\n      }\n      if (override.pointradius !== void 0) {\n        this.points.radius = override.pointradius;\n      }\n      if (override.steppedLine !== void 0) {\n        this.lines.steps = override.steppedLine;\n      }\n      if (override.zindex !== void 0) {\n        this.zindex = override.zindex;\n      }\n      if (override.fillBelowTo !== void 0) {\n        this.fillBelowTo = override.fillBelowTo;\n      }\n      if (override.color !== void 0) {\n        this.setColor(override.color);\n      }\n      if (override.transform !== void 0) {\n        this.transform = override.transform;\n      }\n      if (override.legend !== void 0) {\n        this.legend = override.legend;\n      }\n      if (override.hideTooltip !== void 0) {\n        this.hideTooltip = override.hideTooltip;\n      }\n\n      if (override.yaxis !== void 0) {\n        this.yaxis = override.yaxis;\n      }\n      if (override.hiddenSeries !== void 0) {\n        this.hiddenSeries = override.hiddenSeries;\n      }\n    }\n  }\n\n  getFlotPairs(fillStyle: string) {\n    const result = [];\n\n    this.stats.total = 0;\n    this.stats.max = -Number.MAX_VALUE;\n    this.stats.min = Number.MAX_VALUE;\n    this.stats.logmin = Number.MAX_VALUE;\n    this.stats.avg = null;\n    this.stats.current = null;\n    this.stats.first = null;\n    this.stats.delta = 0;\n    this.stats.diff = null;\n    this.stats.range = null;\n    this.stats.timeStep = Number.MAX_VALUE;\n    this.allIsNull = true;\n    this.allIsZero = true;\n\n    const ignoreNulls = fillStyle === 'connected';\n    const nullAsZero = fillStyle === 'null as zero';\n    let currentTime;\n    let currentValue;\n    let nonNulls = 0;\n    let previousTime;\n    let previousValue = 0;\n    let previousDeltaUp = true;\n\n    for (let i = 0; i < this.datapoints.length; i++) {\n      currentValue = this.datapoints[i][0];\n      currentTime = this.datapoints[i][1];\n\n      // Due to missing values we could have different timeStep all along the series\n      // so we have to find the minimum one (could occur with aggregators such as ZimSum)\n      if (previousTime !== undefined) {\n        const timeStep = currentTime - previousTime;\n        if (timeStep < this.stats.timeStep) {\n          this.stats.timeStep = timeStep;\n        }\n      }\n      previousTime = currentTime;\n\n      if (currentValue === null) {\n        if (ignoreNulls) {\n          continue;\n        }\n        if (nullAsZero) {\n          currentValue = 0;\n        }\n      }\n\n      if (currentValue !== null) {\n        if (_.isNumber(currentValue)) {\n          this.stats.total += currentValue;\n          this.allIsNull = false;\n          nonNulls++;\n        }\n\n        if (currentValue > this.stats.max) {\n          this.stats.max = currentValue;\n        }\n\n        if (currentValue < this.stats.min) {\n          this.stats.min = currentValue;\n        }\n\n        if (this.stats.first === null) {\n          this.stats.first = currentValue;\n        } else {\n          if (previousValue > currentValue) {\n            // counter reset\n            previousDeltaUp = false;\n            if (i === this.datapoints.length - 1) {\n              // reset on last\n              this.stats.delta += currentValue;\n            }\n          } else {\n            if (previousDeltaUp) {\n              this.stats.delta += currentValue - previousValue; // normal increment\n            } else {\n              this.stats.delta += currentValue; // account for counter reset\n            }\n            previousDeltaUp = true;\n          }\n        }\n        previousValue = currentValue;\n\n        if (currentValue < this.stats.logmin && currentValue > 0) {\n          this.stats.logmin = currentValue;\n        }\n\n        if (currentValue !== 0) {\n          this.allIsZero = false;\n        }\n      }\n\n      result.push([currentTime, currentValue]);\n    }\n\n    if (this.stats.max === -Number.MAX_VALUE) {\n      this.stats.max = null;\n    }\n    if (this.stats.min === Number.MAX_VALUE) {\n      this.stats.min = null;\n    }\n\n    if (result.length && !this.allIsNull) {\n      this.stats.avg = this.stats.total / nonNulls;\n      this.stats.current = result[result.length - 1][1];\n      if (this.stats.current === null && result.length > 1) {\n        this.stats.current = result[result.length - 2][1];\n      }\n    }\n    if (this.stats.max !== null && this.stats.min !== null) {\n      this.stats.range = this.stats.max - this.stats.min;\n    }\n    if (this.stats.current !== null && this.stats.first !== null) {\n      this.stats.diff = this.stats.current - this.stats.first;\n    }\n\n    this.stats.count = result.length;\n    return result;\n  }\n\n  updateLegendValues(formater: ValueFormatter, decimals: DecimalCount, scaledDecimals: DecimalCount) {\n    this.valueFormater = formater;\n    this.decimals = decimals;\n    this.scaledDecimals = scaledDecimals;\n  }\n\n  formatValue(value: number) {\n    if (!_.isFinite(value)) {\n      value = null; // Prevent NaN formatting\n    }\n    return formattedValueToString(this.valueFormater(value, this.decimals, this.scaledDecimals));\n  }\n\n  isMsResolutionNeeded() {\n    for (let i = 0; i < this.datapoints.length; i++) {\n      if (this.datapoints[i][1] !== null && this.datapoints[i][1] !== undefined) {\n        const timestamp = this.datapoints[i][1].toString();\n        if (timestamp.length === 13 && timestamp % 1000 !== 0) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  hideFromLegend(options: any) {\n    if (options.hideEmpty && this.allIsNull) {\n      return true;\n    }\n    // ignore series excluded via override\n    if (!this.legend) {\n      return true;\n    }\n\n    // ignore zero series\n    if (options.hideZero && this.allIsZero) {\n      return true;\n    }\n\n    return false;\n  }\n\n  setColor(color: string) {\n    this.color = color;\n    this.bars.fillColor = color;\n  }\n}\n","import React, { HTMLProps } from 'react';\nimport { css, cx } from 'emotion';\nimport uniqueId from 'lodash/uniqueId';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { focusCss } from '../../themes/mixins';\n\nexport interface SwitchProps extends Omit<HTMLProps<HTMLInputElement>, 'value'> {\n  value?: boolean;\n}\n\nexport const getSwitchStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    switch: css`\n      width: 32px;\n      height: 16px;\n      position: relative;\n\n      input {\n        opacity: 0;\n        left: -100vw;\n        z-index: -1000;\n        position: absolute;\n\n        &:disabled + label {\n          background: ${theme.colors.formSwitchBgDisabled};\n          cursor: not-allowed;\n        }\n\n        &:checked + label {\n          background: ${theme.colors.formSwitchBgActive};\n\n          &:hover {\n            background: ${theme.colors.formSwitchBgActiveHover};\n          }\n\n          &::after {\n            transform: translate3d(18px, -50%, 0);\n          }\n        }\n\n        &:focus + label {\n          ${focusCss(theme)};\n        }\n      }\n\n      label {\n        width: 100%;\n        height: 100%;\n        cursor: pointer;\n        border: none;\n        border-radius: 50px;\n        background: ${theme.colors.formSwitchBg};\n        transition: all 0.3s ease;\n\n        &:hover {\n          background: ${theme.colors.formSwitchBgHover};\n        }\n\n        &::after {\n          position: absolute;\n          display: block;\n          content: '';\n          width: 12px;\n          height: 12px;\n          border-radius: 6px;\n          background: ${theme.colors.formSwitchDot};\n          top: 50%;\n          transform: translate3d(2px, -50%, 0);\n          transition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n        }\n      }\n    }\n    `,\n  };\n});\n\nexport const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n  ({ value, checked, disabled = false, onChange, ...inputProps }, ref) => {\n    const theme = useTheme();\n    const styles = getSwitchStyles(theme);\n    const switchId = uniqueId('switch-');\n\n    return (\n      <div className={cx(styles.switch)}>\n        <input\n          type=\"checkbox\"\n          disabled={disabled}\n          checked={value}\n          onChange={event => {\n            onChange?.(event);\n          }}\n          id={switchId}\n          {...inputProps}\n          ref={ref}\n        />\n        <label htmlFor={switchId} />\n      </div>\n    );\n  }\n);\n","var path = 'public/app/features/admin/partials/admin_home.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\n  <div class=\\\"grafana-info-box span8\\\">\\n    Grafana is a multi-tenant system where most can be configured per organization. These\\n    admin pages are for server admins where you can manage orgs, & all users across all orgs.\\n  </div>\\n\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/mssql/partials/config.html';\nvar html = \"\\n<h3 class=page-heading>MSSQL Connection</h3>\\n\\n<div class=gf-form-group>\\n\\t<div class=\\\"gf-form max-width-30\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Host</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.url placeholder=localhost:1433 bs-typeahead=\\\"{{['localhost', 'localhost:1433']}}\\\" required>\\n\\t</div>\\n\\n\\t<div class=\\\"gf-form max-width-30\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Database</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.database placeholder=\\\"database name\\\" required>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">User</span>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.user placeholder=user>\\n\\t\\t</div>\\n    <div class=gf-form>\\n      <secret-form-field isconfigured=ctrl.current.secureJsonFields.password value=ctrl.current.secureJsonData.password on-reset=ctrl.onPasswordReset on-change=ctrl.onPasswordChange inputwidth=9 />\\n    </div>\\n\\t</div>\\n\\n\\t<div class=gf-form>\\n\\t\\t<label class=\\\"gf-form-label width-7\\\">Encrypt</label>\\n\\t\\t<div class=\\\"gf-form-select-wrapper max-width-15 gf-form-select-wrapper--has-help-icon\\\">\\n\\t\\t\\t<select class=gf-form-input ng-model=ctrl.current.jsonData.encrypt ng-options=\\\"mode for mode in ['disable', 'false', 'true']\\\" ng-init=ctrl.current.jsonData.encrypt></select>\\n\\t\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\t\\tDetermines whether or to which extent a secure SSL TCP/IP connection will be negotiated with the server.\\n\\t\\t\\t\\t<ul>\\n\\t\\t\\t\\t\\t<li><i>disable</i> - Data sent between client and server is not encrypted.</li>\\n\\t\\t\\t\\t\\t<li><i>false</i> - Data sent between client and server is not encrypted beyond the login packet. (default)</li>\\n\\t\\t\\t\\t\\t<li><i>true</i> - Data sent between client and server is encrypted.</li>\\n\\t\\t\\t\\t</ul>\\n\\t\\t\\t\\tIf you're using an older version of Microsoft SQL Server like 2008 and 2008R2 you may need to disable encryption to be able to connect.\\n\\t\\t\\t</info-popover>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n<b>Connection limits</b>\\n\\n<div class=gf-form-group>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max open</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.maxOpenConns placeholder=unlimited>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum number of open connections to the database. If <i>Max idle connections</i> is greater than 0 and the\\n\\t\\t\\t<i>Max open connections</i> is less than <i>Max idle connections</i>, then <i>Max idle connections</i> will be\\n\\t\\t\\treduced to match the <i>Max open connections</i> limit. If set to 0, there is no limit on the number of open\\n\\t\\t\\tconnections.\\n\\t\\t</info-popover>\\n\\t</div>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max idle</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.maxIdleConns placeholder=2>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum number of connections in the idle connection pool. If <i>Max open connections</i> is greater than 0 but\\n\\t\\t\\tless than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced to match the\\n\\t\\t\\t<i>Max open connections</i> limit. If set to 0, no idle connections are retained.\\n\\t\\t</info-popover>\\n\\t</div>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max lifetime</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.connMaxLifetime placeholder=14400>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever.\\n\\t\\t</info-popover>\\n\\t</div>\\n</div>\\n\\n<h3 class=page-heading>MSSQL details</h3>\\n\\n<div class=gf-form-group>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-9\\\">Min time interval</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input width-6 gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.timeInterval spellcheck=false placeholder=1m ng-pattern=/^\\\\d+(ms|[Mwdhmsy])$/ >\\n\\t\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\t\\tA lower limit for the auto group by time interval. Recommended to be set to write frequency,\\n\\t\\t\\t\\tfor example <code>1m</code> if your data is written every minute.\\n\\t\\t\\t</info-popover>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n<div class=gf-form-group>\\n\\t<div class=grafana-info-box>\\n\\t\\t<h5>User Permission</h5>\\n\\t\\t<p>\\n\\t\\t\\tThe database user should only be granted SELECT permissions on the specified database &amp; tables you want to query.\\n\\t\\t\\tGrafana does not validate that queries are safe so queries can contain any SQL statement. For example, statements\\n\\t\\t\\tlike <code>USE otherdb;</code> and <code>DROP TABLE user;</code> would be executed. To protect against this we\\n\\t\\t\\t<strong>Highly</strong> recommmend you create a specific MSSQL user with restricted permissions.\\n\\t\\t</p>\\n\\t</div>\\n</div>\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/features/admin/partials/edit_org.html';\nvar html = \"<page-header model=navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n  <h3 class=page-sub-heading>Edit Organization</h3>\\n\\n  <form name=orgDetailsForm class=gf-form-group>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-10\\\">Name</span>\\n      <input type=text required ng-model=org.name class=\\\"gf-form-input max-width-14\\\"/>\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button type=submit class=\\\"btn btn-primary\\\" ng-click=update() ng-show=!createMode>Update</button>\\n    </div>\\n  </form>\\n\\n  <h3 class=page-heading>Organization Users</h3>\\n\\n  <table class=filter-table>\\n    <tr>\\n      <th>Username</th>\\n      <th>Email</th>\\n      <th>Role</th>\\n      <th></th>\\n    </tr>\\n    <tr ng-repeat=\\\"orgUser in orgUsers\\\">\\n      <td>{{orgUser.login}}</td>\\n      <td>{{orgUser.email}}</td>\\n      <td>\\n        <div class=gf-form>\\n          <span class=gf-form-select-wrapper>\\n            <select type=text ng-model=orgUser.role class=\\\"gf-form-input max-width-8\\\" ng-options=\\\"f for f in ['Viewer', 'Editor', 'Admin']\\\" ng-change=updateOrgUser(orgUser)>\\n            </select>\\n          </span>\\n        </div>\\n      </td>\\n      <td style=width:1%>\\n        <a ng-click=removeOrgUser(orgUser) class=\\\"btn btn-danger btn-small\\\">\\n          <icon name=\\\"'times'\\\" style=margin-bottom:0></icon>\\n        </a>\\n      </td>\\n    </tr>\\n  </table>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { IScope } from 'angular';\n\nexport const promiseToDigest = ($scope: IScope) => (promise: Promise<any>) => promise.finally($scope.$evalAsync);\n","import { DashboardAcl } from './acl';\nimport { DataQuery, PanelPlugin } from '@grafana/data';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { AngularComponent } from '@grafana/runtime';\n\nexport interface DashboardDTO {\n  redirectUri?: string;\n  dashboard: DashboardDataDTO;\n  meta: DashboardMeta;\n}\n\nexport interface DashboardMeta {\n  canSave?: boolean;\n  canEdit?: boolean;\n  canDelete?: boolean;\n  canShare?: boolean;\n  canStar?: boolean;\n  canAdmin?: boolean;\n  url?: string;\n  folderId?: number;\n  fromExplore?: boolean;\n  canMakeEditable?: boolean;\n  submenuEnabled?: boolean;\n  provisioned?: boolean;\n  provisionedExternalId?: string;\n  focusPanelId?: number;\n  isStarred?: boolean;\n  showSettings?: boolean;\n  expires?: string;\n  isSnapshot?: boolean;\n  folderTitle?: string;\n  folderUrl?: string;\n  created?: string;\n  createdBy?: string;\n  updated?: string;\n  updatedBy?: string;\n}\n\nexport interface DashboardDataDTO {\n  title: string;\n}\n\nexport enum DashboardRouteInfo {\n  Home = 'home-dashboard',\n  New = 'new-dashboard',\n  Normal = 'normal-dashboard',\n  Scripted = 'scripted-dashboard',\n}\n\nexport enum DashboardInitPhase {\n  NotStarted = 'Not started',\n  Fetching = 'Fetching',\n  Services = 'Services',\n  Failed = 'Failed',\n  Completed = 'Completed',\n}\n\nexport interface DashboardInitError {\n  message: string;\n  error: any;\n}\n\nexport const KIOSK_MODE_TV = 'tv';\nexport type KioskUrlValue = 'tv' | '1' | true;\nexport type GetMutableDashboardModelFn = () => DashboardModel | null;\n\nexport interface QueriesToUpdateOnDashboardLoad {\n  panelId: number;\n  queries: DataQuery[];\n}\n\nexport interface PanelState {\n  pluginId: string;\n  plugin?: PanelPlugin;\n  angularComponent?: AngularComponent | null;\n}\n\nexport interface DashboardState {\n  getModel: GetMutableDashboardModelFn;\n  initPhase: DashboardInitPhase;\n  isInitSlow: boolean;\n  initError: DashboardInitError | null;\n  permissions: DashboardAcl[] | null;\n  modifiedQueries: QueriesToUpdateOnDashboardLoad | null;\n  panels: { [id: string]: PanelState };\n}\n","// based on http://www.paciellogroup.com/blog/2012/04/how-to-remove-css-outlines-in-an-accessible-manner/\nfunction outlineFixer() {\n  const d: any = document;\n\n  const styleElement = d.createElement('STYLE');\n  const domEvents = 'addEventListener' in d;\n\n  const addEventListener = (type: string, callback: { (): void; (): void }) => {\n    // Basic cross-browser event handling\n    if (domEvents) {\n      d.addEventListener(type, callback);\n    } else {\n      d.attachEvent('on' + type, callback);\n    }\n  };\n\n  const setCss = (cssText: string) => {\n    // Handle setting of <style> element contents in IE8\n    !!styleElement.styleSheet ? (styleElement.styleSheet.cssText = cssText) : (styleElement.innerHTML = cssText);\n  };\n\n  d.getElementsByTagName('HEAD')[0].appendChild(styleElement);\n\n  // Using mousedown instead of mouseover, so that previously focused elements don't lose focus ring on mouse move\n  addEventListener('mousedown', () => {\n    setCss(':focus{outline:0 !important}::-moz-focus-inner{border:0;}');\n  });\n\n  addEventListener('keydown', () => {\n    setCss('');\n  });\n}\n\noutlineFixer();\n","import React from 'react';\nimport { css, cx } from 'emotion';\n\n// Ignoring because I couldn't get @types/react-select work wih Torkel's fork\n// @ts-ignore\nimport { components } from '@torkelo/react-select';\nimport { useDelayedSwitch } from '../../utils/useDelayedSwitch';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { SlideOutTransition } from '../transitions/SlideOutTransition';\nimport { FadeTransition } from '../transitions/FadeTransition';\nimport { Spinner } from '../Spinner/Spinner';\nimport { GrafanaTheme } from '@grafana/data';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const singleValue = css`\n    label: singleValue;\n    color: ${theme.colors.formInputText};\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    box-sizing: border-box;\n    max-width: 100%;\n    /* padding-right: 40px; */\n  `;\n  const container = css`\n    width: 16px;\n    height: 16px;\n    display: inline-block;\n    margin-right: 10px;\n    position: relative;\n    vertical-align: middle;\n    overflow: hidden;\n  `;\n\n  const item = css`\n    width: 100%;\n    height: 100%;\n    position: absolute;\n  `;\n\n  return { singleValue, container, item };\n});\n\ntype Props = {\n  children: React.ReactNode;\n  data: {\n    imgUrl?: string;\n    loading?: boolean;\n    hideText?: boolean;\n  };\n};\n\nexport const SingleValue = (props: Props) => {\n  const { children, data } = props;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  const loading = useDelayedSwitch(data.loading || false, { delay: 250, duration: 750 });\n\n  return (\n    <components.SingleValue {...props}>\n      <div\n        className={cx(\n          styles.singleValue,\n          css`\n            overflow: hidden;\n          `\n        )}\n      >\n        {data.imgUrl ? (\n          <FadeWithImage loading={loading} imgUrl={data.imgUrl} />\n        ) : (\n          <SlideOutTransition horizontal size={16} visible={loading} duration={150}>\n            <div className={styles.container}>\n              <Spinner className={styles.item} inline />\n            </div>\n          </SlideOutTransition>\n        )}\n        {!data.hideText && children}\n      </div>\n    </components.SingleValue>\n  );\n};\n\nconst FadeWithImage = (props: { loading: boolean; imgUrl: string }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.container}>\n      <FadeTransition duration={150} visible={props.loading}>\n        <Spinner className={styles.item} inline />\n      </FadeTransition>\n      <FadeTransition duration={150} visible={!props.loading}>\n        <img className={styles.item} src={props.imgUrl} />\n      </FadeTransition>\n    </div>\n  );\n};\n","import { useEffect, useRef, useState } from 'react';\n\ntype DelayOptions = {\n  // Minimal amount of time the switch will be on.\n  duration?: number;\n  // Delay after which switch will turn on.\n  delay?: number;\n};\n\n/**\n * Hook that delays changing of boolean switch to prevent too much time spent in \"on\" state. It is kind of a throttle\n * but you can specify different time for on and off throttling so this only allows a boolean values and also prefers\n * to stay \"off\" so turning \"on\" is always delayed while turning \"off\" is throttled.\n *\n * This is useful for showing loading elements to prevent it flashing too much in case of quick loading time or\n * prevent it flash if loaded state comes right after switch to loading.\n */\nexport function useDelayedSwitch(value: boolean, options: DelayOptions = {}): boolean {\n  const { duration = 250, delay = 250 } = options;\n\n  const [delayedValue, setDelayedValue] = useState(value);\n  const onStartTime = useRef<Date | undefined>();\n\n  useEffect(() => {\n    let timeout: number | undefined;\n    if (value) {\n      // If toggling to \"on\" state we always setTimout no matter how long we have been \"off\".\n      timeout = setTimeout(() => {\n        onStartTime.current = new Date();\n        setDelayedValue(value);\n      }, delay) as any;\n    } else {\n      // If toggling to \"off\" state we check how much time we were already \"on\".\n      const timeSpent = onStartTime.current ? Date.now() - onStartTime.current.valueOf() : 0;\n      const turnOff = () => {\n        onStartTime.current = undefined;\n        setDelayedValue(value);\n      };\n      if (timeSpent >= duration) {\n        // We already spent enough time \"on\" so change right away.\n        turnOff();\n      } else {\n        timeout = setTimeout(turnOff, duration - timeSpent) as any;\n      }\n    }\n    return () => {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = undefined;\n      }\n    };\n  }, [value, duration, delay]);\n\n  return delayedValue;\n}\n","var path = 'public/app/plugins/panel/singlestat/mappings.html';\nvar html = \"<div class=editor-row>\\n  <div class=gf-form-group>\\n    <div class=gf-form>\\n      <span class=gf-form-label>\\n        Type\\n      </span>\\n      <div class=gf-form-select-wrapper>\\n        <select class=gf-form-input ng-model=ctrl.panel.mappingType ng-options=\\\"f.value as f.name for f in ctrl.panel.mappingTypes\\\" ng-change=ctrl.refresh()></select>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n<div class=editor-row ng-if=\\\"ctrl.panel.mappingType==1\\\">\\n  <h5 class=section-heading>Set value mappings</h5>\\n  <div class=gf-form-group>\\n    <div class=gf-form ng-repeat=\\\"map in ctrl.panel.valueMaps\\\">\\n      <span class=gf-form-label>\\n        <icon name=\\\"'times'\\\" ng-click=ctrl.removeValueMap(map)></icon>\\n      </span>\\n      <input type=text ng-model=map.value placeholder=value class=\\\"gf-form-input max-width-6\\\" ng-blur=ctrl.refresh() />\\n      <span class=gf-form-label>\\n        <icon name=\\\"'arrow-right'\\\"></icon>\\n      </span>\\n      <input type=text placeholder=text ng-model=map.text class=\\\"gf-form-input max-width-8\\\" ng-blur=ctrl.refresh() />\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button class=\\\"btn btn-inverse\\\" ng-click=ctrl.addValueMap();>\\n        <icon name=\\\"'plus'\\\"></icon>\\n        Add a value mapping\\n      </button>\\n    </div>\\n  </div>\\n</div>\\n<div class=editor-row ng-if=\\\"ctrl.panel.mappingType==2\\\">\\n  <h5 class=section-heading>Set range mappings</h5>\\n  <div class=gf-form-group>\\n    <div class=gf-form ng-repeat=\\\"rangeMap in ctrl.panel.rangeMaps\\\">\\n      <span class=gf-form-label>\\n        <icon name=\\\"'times'\\\" ng-click=ctrl.removeRangeMap(rangeMap)></icon>\\n      </span>\\n      <span class=gf-form-label>From</span>\\n      <input type=text ng-model=rangeMap.from class=\\\"gf-form-input max-width-6\\\" ng-blur=ctrl.refresh() />\\n      <span class=gf-form-label>To</span>\\n      <input type=text ng-model=rangeMap.to class=\\\"gf-form-input max-width-6\\\" ng-blur=ctrl.refresh() />\\n      <span class=gf-form-label>Text</span>\\n      <input type=text ng-model=rangeMap.text class=\\\"gf-form-input max-width-8\\\" ng-blur=ctrl.refresh() />\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button class=\\\"btn btn-inverse\\\" ng-click=ctrl.addRangeMap()>\\n        <icon name=\\\"'plus'\\\"></icon>\\n        Add a range mapping\\n      </button>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport { dateTimeFormat } from '@grafana/data';\nimport { SyncInfo, UserDTO } from 'app/types';\nimport { Button, LinkButton } from '@grafana/ui';\n\ninterface Props {\n  ldapSyncInfo: SyncInfo;\n  user: UserDTO;\n  onUserSync: () => void;\n}\n\ninterface State {}\n\nconst format = 'dddd YYYY-MM-DD HH:mm zz';\nconst debugLDAPMappingBaseURL = '/admin/ldap';\n\nexport class UserLdapSyncInfo extends PureComponent<Props, State> {\n  onUserSync = () => {\n    this.props.onUserSync();\n  };\n\n  render() {\n    const { ldapSyncInfo, user } = this.props;\n    const prevSyncSuccessful = ldapSyncInfo && ldapSyncInfo.prevSync;\n    const nextSyncSuccessful = ldapSyncInfo && ldapSyncInfo.nextSync;\n    const nextSyncTime = nextSyncSuccessful ? dateTimeFormat(ldapSyncInfo.nextSync, { format }) : '';\n    const prevSyncTime = prevSyncSuccessful ? dateTimeFormat(ldapSyncInfo.prevSync.started, { format }) : '';\n    const debugLDAPMappingURL = `${debugLDAPMappingBaseURL}?user=${user && user.login}`;\n\n    return (\n      <>\n        <h3 className=\"page-heading\">LDAP Synchronisation</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <tbody>\n                <tr>\n                  <td>External sync</td>\n                  <td>User synced via LDAP – some changes must be done in LDAP or mappings.</td>\n                  <td>\n                    <span className=\"label label-tag\">LDAP</span>\n                  </td>\n                </tr>\n                <tr>\n                  {ldapSyncInfo.enabled ? (\n                    <>\n                      <td>Next scheduled synchronisation</td>\n                      <td colSpan={2}>{nextSyncTime}</td>\n                    </>\n                  ) : (\n                    <>\n                      <td>Next scheduled synchronisation</td>\n                      <td colSpan={2}>Not enabled</td>\n                    </>\n                  )}\n                </tr>\n                <tr>\n                  {prevSyncSuccessful ? (\n                    <>\n                      <td>Last synchronisation</td>\n                      <td>{prevSyncTime}</td>\n                      <td>Successful</td>\n                    </>\n                  ) : (\n                    <td colSpan={3}>Last synchronisation</td>\n                  )}\n                </tr>\n              </tbody>\n            </table>\n          </div>\n          <div className=\"gf-form-button-row\">\n            <Button variant=\"secondary\" onClick={this.onUserSync}>\n              Sync user\n            </Button>\n            <LinkButton variant=\"secondary\" href={debugLDAPMappingURL}>\n              Debug LDAP Mapping\n            </LinkButton>\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n","import { SelectableValue } from '../types/select';\n\nexport interface RegistryItem {\n  id: string; // Unique Key -- saved in configs\n  name: string; // Display Name, can change without breaking configs\n  description?: string;\n  aliasIds?: string[]; // when the ID changes, we may want backwards compatibility ('current' => 'last')\n\n  /**\n   * Some extensions should not be user selectable\n   *  like: 'all' and 'any' matchers;\n   */\n  excludeFromPicker?: boolean;\n}\n\nexport interface RegistryItemWithOptions<TOptions = any> extends RegistryItem {\n  /**\n   * Convert the options to a string\n   */\n  getOptionsDisplayText?: (options: TOptions) => string;\n\n  /**\n   * Default options used if nothing else is specified\n   */\n  defaultOptions?: TOptions;\n}\n\ninterface RegistrySelectInfo {\n  options: Array<SelectableValue<string>>;\n  current: Array<SelectableValue<string>>;\n}\n\nexport class Registry<T extends RegistryItem> {\n  private ordered: T[] = [];\n  private byId = new Map<string, T>();\n  private initialized = false;\n\n  constructor(private init?: () => T[]) {}\n\n  setInit = (init: () => T[]) => {\n    if (this.initialized) {\n      throw new Error('Registry already initialized');\n    }\n    this.init = init;\n  };\n\n  getIfExists(id: string | undefined): T | undefined {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    if (id) {\n      return this.byId.get(id);\n    }\n\n    return undefined;\n  }\n\n  private initialize() {\n    if (this.init) {\n      for (const ext of this.init()) {\n        this.register(ext);\n      }\n    }\n    this.sort();\n    this.initialized = true;\n  }\n\n  get(id: string): T {\n    const v = this.getIfExists(id);\n    if (!v) {\n      throw new Error('Undefined: ' + id);\n    }\n    return v;\n  }\n\n  selectOptions(current?: string[], filter?: (ext: T) => boolean): RegistrySelectInfo {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    const select = {\n      options: [],\n      current: [],\n    } as RegistrySelectInfo;\n\n    const currentOptions: Record<string, SelectableValue<string>> = {};\n    if (current) {\n      for (const id of current) {\n        currentOptions[id] = {};\n      }\n    }\n\n    for (const ext of this.ordered) {\n      if (ext.excludeFromPicker) {\n        continue;\n      }\n      if (filter && !filter(ext)) {\n        continue;\n      }\n\n      const option = {\n        value: ext.id,\n        label: ext.name,\n        description: ext.description,\n      };\n\n      select.options.push(option);\n      if (currentOptions[ext.id]) {\n        currentOptions[ext.id] = option;\n      }\n    }\n\n    if (current) {\n      // this makes sure we preserve the order of ids\n      select.current = Object.values(currentOptions);\n    }\n\n    return select;\n  }\n\n  /**\n   * Return a list of values by ID, or all values if not specified\n   */\n  list(ids?: any[]): T[] {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    if (ids) {\n      const found: T[] = [];\n      for (const id of ids) {\n        const v = this.getIfExists(id);\n        if (v) {\n          found.push(v);\n        }\n      }\n      return found;\n    }\n\n    return this.ordered;\n  }\n\n  isEmpty(): boolean {\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    return this.ordered.length === 0;\n  }\n\n  register(ext: T) {\n    if (this.byId.has(ext.id)) {\n      throw new Error('Duplicate Key:' + ext.id);\n    }\n\n    this.byId.set(ext.id, ext);\n    this.ordered.push(ext);\n\n    if (ext.aliasIds) {\n      for (const alias of ext.aliasIds) {\n        if (!this.byId.has(alias)) {\n          this.byId.set(alias, ext);\n        }\n      }\n    }\n\n    if (this.initialized) {\n      this.sort();\n    }\n  }\n\n  private sort() {\n    // TODO sort the list\n  }\n}\n","import { DataQuery } from '@grafana/data';\nimport { DataSourceSrv } from '@grafana/runtime';\nimport { DataTransformerConfig } from '@grafana/data';\n\nexport const getDefaultCondition = () => ({\n  type: 'query',\n  query: { params: ['A', '5m', 'now'] },\n  reducer: { type: 'avg', params: [] as any[] },\n  evaluator: { type: 'gt', params: [null] as any[] },\n  operator: { type: 'and' },\n});\n\nexport const getAlertingValidationMessage = async (\n  transformations: DataTransformerConfig[],\n  targets: DataQuery[],\n  datasourceSrv: DataSourceSrv,\n  datasourceName: string\n): Promise<string> => {\n  if (targets.length === 0) {\n    return 'Could not find any metric queries';\n  }\n\n  if (transformations && transformations.length) {\n    return 'Transformations are not supported in alert queries';\n  }\n\n  let alertingNotSupported = 0;\n  let templateVariablesNotSupported = 0;\n\n  for (const target of targets) {\n    const dsName = target.datasource || datasourceName;\n    const ds = await datasourceSrv.get(dsName);\n    if (!ds.meta.alerting) {\n      alertingNotSupported++;\n    } else if (ds.targetContainsTemplate && ds.targetContainsTemplate(target)) {\n      templateVariablesNotSupported++;\n    }\n  }\n\n  if (alertingNotSupported === targets.length) {\n    return 'The datasource does not support alerting queries';\n  }\n\n  if (templateVariablesNotSupported === targets.length) {\n    return 'Template variables are not supported in alert queries';\n  }\n\n  return '';\n};\n","import { Value, Editor as CoreEditor } from 'slate';\n\nexport interface CompletionItemGroup {\n  /**\n   * Label that will be displayed for all entries of this group.\n   */\n  label: string;\n\n  /**\n   * List of suggestions of this group.\n   */\n  items: CompletionItem[];\n\n  /**\n   * If true, match only by prefix (and not mid-word).\n   */\n  prefixMatch?: boolean;\n\n  /**\n   * If true, do not filter items in this group based on the search.\n   */\n  skipFilter?: boolean;\n\n  /**\n   * If true, do not sort items.\n   */\n  skipSort?: boolean;\n}\n\nexport enum CompletionItemKind {\n  GroupTitle = 'GroupTitle',\n}\n\nexport interface CompletionItem {\n  /**\n   * The label of this completion item. By default\n   * this is also the text that is inserted when selecting\n   * this completion.\n   */\n  label: string;\n\n  /**\n   * The kind of this completion item. An icon is chosen\n   * by the editor based on the kind.\n   */\n  kind?: CompletionItemKind | string;\n\n  /**\n   * A human-readable string with additional information\n   * about this item, like type or symbol information.\n   */\n  detail?: string;\n\n  /**\n   * A human-readable string, can be Markdown, that represents a doc-comment.\n   */\n  documentation?: string;\n\n  /**\n   * A string that should be used when comparing this item\n   * with other items. When `falsy` the `label` is used.\n   */\n  sortText?: string;\n\n  /**\n   * A string that should be used when filtering a set of\n   * completion items. When `falsy` the `label` is used.\n   */\n  filterText?: string;\n\n  /**\n   * A string or snippet that should be inserted in a document when selecting\n   * this completion. When `falsy` the `label` is used.\n   */\n  insertText?: string;\n\n  /**\n   * Delete number of characters before the caret position,\n   * by default the letters from the beginning of the word.\n   */\n  deleteBackwards?: number;\n\n  /**\n   * Number of steps to move after the insertion, can be negative.\n   */\n  move?: number;\n}\n\nexport interface TypeaheadOutput {\n  context?: string;\n  suggestions: CompletionItemGroup[];\n}\n\nexport interface TypeaheadInput {\n  text: string;\n  prefix: string;\n  wrapperClasses: string[];\n  labelKey?: string;\n  value?: Value;\n  editor?: CoreEditor;\n}\n\nexport interface SuggestionsState {\n  groupedItems: CompletionItemGroup[];\n  typeaheadPrefix: string;\n  typeaheadContext: string;\n  typeaheadText: string;\n}\n","var path = 'public/app/plugins/datasource/graphite/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-12\\\">Graphite query</span>\\n    <input type=text class=gf-form-input ng-model=ctrl.annotation.target placeholder=\\\"Example: statsd.application.counters.*.count\\\">\\n  </div>\\n\\n\\t<h5 class=section-heading>Or</h5>\\n\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-12\\\">Graphite events tags</span>\\n    <input type=text class=gf-form-input ng-model=ctrl.annotation.tags placeholder=\\\"Example: event_tag_name\\\">\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import $ from 'jquery';\nimport _ from 'lodash';\nimport angular, { ILocationService, IScope } from 'angular';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { appEvents, contextSrv, coreModule } from 'app/core/core';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { getConfig } from 'app/core/config';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSrv } from '../../services/DashboardSrv';\nimport { CoreEvents } from 'app/types';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { AppEvents, locationUtil, TimeZone } from '@grafana/data';\nimport { promiseToDigest } from '../../../../core/utils/promiseToDigest';\n\nexport class SettingsCtrl {\n  dashboard: DashboardModel;\n  isOpen: boolean;\n  viewId: string;\n  json: string;\n  alertCount: number;\n  canSaveAs: boolean;\n  canSave: boolean;\n  canDelete: boolean;\n  sections: any[];\n  hasUnsavedFolderChange: boolean;\n  selectors: typeof selectors.pages.Dashboard.Settings.General;\n  useAngularTemplating: boolean;\n\n  /** @ngInject */\n  constructor(\n    private $scope: IScope & Record<string, any>,\n    private $route: any,\n    private $location: ILocationService,\n    private $rootScope: GrafanaRootScope,\n    private dashboardSrv: DashboardSrv\n  ) {\n    // temp hack for annotations and variables editors\n    // that rely on inherited scope\n    $scope.dashboard = this.dashboard;\n\n    this.$scope.$on('$destroy', () => {\n      this.dashboard.updateSubmenuVisibility();\n      setTimeout(() => {\n        this.$rootScope.appEvent(CoreEvents.dashScroll, { restore: true });\n        this.dashboard.startRefresh();\n      });\n    });\n\n    this.canSaveAs = contextSrv.hasEditPermissionInFolders;\n    this.canSave = this.dashboard.meta.canSave;\n    this.canDelete = this.dashboard.meta.canSave;\n\n    this.buildSectionList();\n    this.onRouteUpdated();\n\n    this.$rootScope.onAppEvent(CoreEvents.routeUpdated, this.onRouteUpdated.bind(this), $scope);\n    this.$rootScope.appEvent(CoreEvents.dashScroll, { animate: false, pos: 0 });\n\n    appEvents.on(CoreEvents.dashboardSaved, this.onPostSave.bind(this), $scope);\n\n    this.selectors = selectors.pages.Dashboard.Settings.General;\n    this.useAngularTemplating = !getConfig().featureToggles.newVariables;\n  }\n\n  buildSectionList() {\n    this.sections = [];\n\n    if (this.dashboard.meta.canEdit) {\n      this.sections.push({\n        title: 'General',\n        id: 'settings',\n        icon: 'sliders-v-alt',\n      });\n      this.sections.push({\n        title: 'Annotations',\n        id: 'annotations',\n        icon: 'comment-alt',\n      });\n      this.sections.push({\n        title: 'Variables',\n        id: 'templating',\n        icon: 'calculator-alt',\n      });\n      this.sections.push({\n        title: 'Links',\n        id: 'links',\n        icon: 'link',\n      });\n    }\n\n    if (this.dashboard.id && this.dashboard.meta.canSave) {\n      this.sections.push({\n        title: 'Versions',\n        id: 'versions',\n        icon: 'history',\n      });\n    }\n\n    if (this.dashboard.id && this.dashboard.meta.canAdmin) {\n      this.sections.push({\n        title: 'Permissions',\n        id: 'permissions',\n        icon: 'lock',\n      });\n    }\n\n    if (this.dashboard.meta.canMakeEditable) {\n      this.sections.push({\n        title: 'General',\n        icon: 'sliders-v-alt',\n        id: 'make_editable',\n      });\n    }\n\n    this.sections.push({\n      title: 'JSON Model',\n      id: 'dashboard_json',\n      icon: 'arrow',\n    });\n\n    const params = this.$location.search();\n    const url = this.$location.path();\n\n    for (const section of this.sections) {\n      const sectionParams = _.defaults({ editview: section.id }, params);\n      section.url = getConfig().appSubUrl + url + '?' + $.param(sectionParams);\n    }\n  }\n\n  onRouteUpdated() {\n    this.viewId = this.$location.search().editview;\n\n    if (this.viewId) {\n      this.json = angular.toJson(this.dashboard.getSaveModelClone(), true);\n    }\n\n    if (this.viewId === 'settings' && this.dashboard.meta.canMakeEditable) {\n      this.viewId = 'make_editable';\n    }\n\n    const currentSection: any = _.find(this.sections, { id: this.viewId } as any);\n    if (!currentSection) {\n      this.sections.unshift({\n        title: 'Not found',\n        id: '404',\n        icon: 'exclamation-triangle',\n      });\n      this.viewId = '404';\n    }\n  }\n  saveDashboardJson() {\n    this.dashboardSrv.saveJSONDashboard(this.json).then(() => {\n      this.$route.reload();\n    });\n  }\n\n  onPostSave() {\n    this.hasUnsavedFolderChange = false;\n  }\n\n  hideSettings() {\n    const urlParams = this.$location.search();\n    delete urlParams.editview;\n    setTimeout(() => {\n      this.$rootScope.$apply(() => {\n        this.$location.search(urlParams);\n      });\n    });\n  }\n\n  makeEditable() {\n    this.dashboard.editable = true;\n    this.dashboard.meta.canMakeEditable = false;\n    this.dashboard.meta.canEdit = true;\n    this.dashboard.meta.canSave = true;\n    this.canDelete = true;\n    this.viewId = 'settings';\n    this.buildSectionList();\n\n    const currentSection: any = _.find(this.sections, { id: this.viewId } as any);\n    this.$location.url(locationUtil.stripBaseFromUrl(currentSection.url));\n  }\n\n  deleteDashboard() {\n    let confirmText = '';\n    let text2 = this.dashboard.title;\n\n    if (this.dashboard.meta.provisioned) {\n      appEvents.emit(CoreEvents.showConfirmModal, {\n        title: 'Cannot delete provisioned dashboard',\n        text: `\n          This dashboard is managed by Grafanas provisioning and cannot be deleted. Remove the dashboard from the\n          config file to delete it.\n        `,\n        text2: `\n          <i>See <a class=\"external-link\" href=\"http://docs.grafana.org/administration/provisioning/#dashboards\" target=\"_blank\">\n          documentation</a> for more information about provisioning.</i>\n          </br>\n          File path: ${this.dashboard.meta.provisionedExternalId}\n        `,\n        text2htmlBind: true,\n        icon: 'trash-alt',\n        noText: 'OK',\n      });\n      return;\n    }\n\n    const alerts = _.sumBy(this.dashboard.panels, panel => {\n      return panel.alert ? 1 : 0;\n    });\n\n    if (alerts > 0) {\n      confirmText = 'DELETE';\n      text2 = `This dashboard contains ${alerts} alerts. Deleting this dashboard will also delete those alerts`;\n    }\n\n    appEvents.emit(CoreEvents.showConfirmModal, {\n      title: 'Delete',\n      text: 'Do you want to delete this dashboard?',\n      text2: text2,\n      icon: 'trash-alt',\n      confirmText: confirmText,\n      yesText: 'Delete',\n      onConfirm: () => {\n        this.dashboard.meta.canSave = false;\n        this.deleteDashboardConfirmed();\n      },\n    });\n  }\n\n  deleteDashboardConfirmed() {\n    promiseToDigest(this.$scope)(\n      backendSrv.deleteDashboard(this.dashboard.uid, false).then(() => {\n        appEvents.emit(AppEvents.alertSuccess, ['Dashboard Deleted', this.dashboard.title + ' has been deleted']);\n        this.$location.url('/');\n      })\n    );\n  }\n\n  onFolderChange = (folder: { id: number; title: string }) => {\n    this.dashboard.meta.folderId = folder.id;\n    this.dashboard.meta.folderTitle = folder.title;\n    this.hasUnsavedFolderChange = true;\n  };\n\n  getFolder() {\n    return {\n      id: this.dashboard.meta.folderId,\n      title: this.dashboard.meta.folderTitle,\n      url: this.dashboard.meta.folderUrl,\n    };\n  }\n\n  getDashboard = () => {\n    return this.dashboard;\n  };\n\n  onRefreshIntervalChange = (intervals: string[]) => {\n    this.dashboard.timepicker.refresh_intervals = intervals;\n  };\n\n  onNowDelayChange = (nowDelay: string) => {\n    this.dashboard.timepicker.nowDelay = nowDelay;\n  };\n\n  onHideTimePickerChange = (hide: boolean) => {\n    this.dashboard.timepicker.hidden = hide;\n  };\n\n  onTimeZoneChange = (timeZone: TimeZone) => {\n    this.dashboard.timezone = timeZone;\n  };\n}\n\nexport function dashboardSettings() {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/features/dashboard/components/DashboardSettings/template.html',\n    controller: SettingsCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    transclude: true,\n    scope: { dashboard: '=' },\n  };\n}\n\ncoreModule.directive('dashboardSettings', dashboardSettings);\n","// Libaries\nimport React, { PureComponent } from 'react';\n\n// Utils & Services\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\n\n// Types\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { BackButton } from 'app/core/components/BackButton/BackButton';\nimport { updateLocation } from 'app/core/actions';\nimport { CustomScrollbar } from '@grafana/ui';\n\nexport interface Props {\n  dashboard: DashboardModel | null;\n  updateLocation: typeof updateLocation;\n}\n\nexport class DashboardSettings extends PureComponent<Props> {\n  element: HTMLElement;\n  angularCmp: AngularComponent;\n\n  componentDidMount() {\n    const loader = getAngularLoader();\n\n    const template = '<dashboard-settings dashboard=\"dashboard\" class=\"dashboard-settings__body2\" />';\n    const scopeProps = { dashboard: this.props.dashboard };\n\n    this.angularCmp = loader.load(this.element, scopeProps, template);\n  }\n\n  componentWillUnmount() {\n    if (this.angularCmp) {\n      this.angularCmp.destroy();\n    }\n  }\n\n  onClose = () => {\n    this.props.updateLocation({\n      query: { editview: null },\n      partial: true,\n    });\n  };\n\n  render() {\n    const { dashboard } = this.props;\n    const folderTitle = dashboard.meta.folderTitle;\n    const haveFolder = dashboard.meta.folderId > 0;\n\n    return (\n      <div className=\"dashboard-settings\">\n        <div className=\"navbar navbar--edit\">\n          <div className=\"navbar-edit\">\n            <BackButton surface=\"panel\" onClick={this.onClose} />\n          </div>\n          <div className=\"navbar-page-btn\">\n            {haveFolder && <div className=\"navbar-page-btn__folder\">{folderTitle} / </div>}\n            <span>{dashboard.title} / Settings</span>\n          </div>\n        </div>\n        <CustomScrollbar>\n          <div className=\"dashboard-settings__body1\" ref={element => (this.element = element)} />\n        </CustomScrollbar>\n      </div>\n    );\n  }\n}\n","export { SettingsCtrl } from './SettingsCtrl';\nexport { DashboardSettings } from './DashboardSettings';\nexport { TimePickerSettings } from './TimePickerSettings';\n","import { DataFrame } from '../../types/dataFrame';\nimport { DataTransformerID } from './ids';\nimport { MutableDataFrame } from '../../dataframe/MutableDataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\n\nexport interface AppendOptions {}\n\nexport const appendTransformer: DataTransformerInfo<AppendOptions> = {\n  id: DataTransformerID.append,\n  name: 'Append',\n  description: 'Append values into a single DataFrame.  This uses the name as the key',\n  defaultOptions: {},\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: AppendOptions) => {\n    return (data: DataFrame[]) => {\n      if (data.length < 2) {\n        return data;\n      }\n\n      // Add the first row\n      const processed = new MutableDataFrame();\n      for (const f of data[0].fields) {\n        processed.addField({\n          ...f,\n          values: [...f.values.toArray()],\n        });\n      }\n\n      for (let i = 1; i < data.length; i++) {\n        const frame = data[i];\n        const startLength = frame.length;\n        for (let j = 0; j < frame.fields.length; j++) {\n          const src = frame.fields[j];\n          let vals = processed.values[src.name];\n          if (!vals) {\n            vals = processed.addField(\n              {\n                ...src,\n                values: [],\n              },\n              startLength\n            ).values;\n          }\n\n          // Add each row\n          for (let k = 0; k < frame.length; k++) {\n            vals.add(src.values.get(k));\n          }\n        }\n        processed.validate();\n      }\n      return [processed];\n    };\n  },\n};\n","import { DataTransformerID } from './ids';\nimport { DataFrame } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\n\nexport interface NoopTransformerOptions {\n  include?: string;\n  exclude?: string;\n}\n\nexport const noopTransformer: DataTransformerInfo<NoopTransformerOptions> = {\n  id: DataTransformerID.noop,\n  name: 'noop',\n  description: 'No-operation transformer',\n  defaultOptions: {},\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: NoopTransformerOptions) => {\n    return (data: DataFrame[]) => data;\n  },\n};\n","import { noopTransformer } from './noop';\nimport { DataFrame, Field } from '../../types/dataFrame';\nimport { DataTransformerID } from './ids';\nimport { DataTransformerInfo, MatcherConfig } from '../../types/transformations';\nimport { getFieldMatcher, getFrameMatchers } from '../matchers';\n\nexport interface FilterOptions {\n  include?: MatcherConfig;\n  exclude?: MatcherConfig;\n}\n\nexport const filterFieldsTransformer: DataTransformerInfo<FilterOptions> = {\n  id: DataTransformerID.filterFields,\n  name: 'Filter Fields',\n  description: 'select a subset of fields',\n  defaultOptions: {},\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: FilterOptions) => {\n    if (!options.include && !options.exclude) {\n      return noopTransformer.transformer({});\n    }\n\n    const include = options.include ? getFieldMatcher(options.include) : null;\n    const exclude = options.exclude ? getFieldMatcher(options.exclude) : null;\n\n    return (data: DataFrame[]) => {\n      const processed: DataFrame[] = [];\n      for (const series of data) {\n        // Find the matching field indexes\n        const fields: Field[] = [];\n        for (let i = 0; i < series.fields.length; i++) {\n          const field = series.fields[i];\n\n          if (exclude) {\n            if (exclude(field, series, data)) {\n              continue;\n            }\n            if (!include) {\n              fields.push(field);\n            }\n          }\n          if (include && include(field, series, data)) {\n            fields.push(field);\n          }\n        }\n\n        if (!fields.length) {\n          continue;\n        }\n        const copy = {\n          ...series, // all the other properties\n          fields, // but a different set of fields\n        };\n        processed.push(copy);\n      }\n      return processed;\n    };\n  },\n};\n\nexport const filterFramesTransformer: DataTransformerInfo<FilterOptions> = {\n  id: DataTransformerID.filterFrames,\n  name: 'Filter Frames',\n  description: 'select a subset of frames',\n  defaultOptions: {},\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: FilterOptions) => {\n    if (!options.include && !options.exclude) {\n      return noopTransformer.transformer({});\n    }\n\n    const include = options.include ? getFrameMatchers(options.include) : null;\n    const exclude = options.exclude ? getFrameMatchers(options.exclude) : null;\n\n    return (data: DataFrame[]) => {\n      const processed: DataFrame[] = [];\n      for (const series of data) {\n        if (exclude) {\n          if (exclude(series)) {\n            continue;\n          }\n          if (!include) {\n            processed.push(series);\n          }\n        }\n        if (include && include(series)) {\n          processed.push(series);\n        }\n      }\n      return processed;\n    };\n  },\n};\n","import { DataTransformerID } from './ids';\nimport { DataTransformerInfo, MatcherConfig } from '../../types/transformations';\nimport { fieldReducers, reduceField, ReducerID } from '../fieldReducer';\nimport { alwaysFieldMatcher } from '../matchers/predicates';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { KeyValue } from '../../types/data';\nimport { guessFieldTypeForField } from '../../dataframe/processDataFrame';\nimport { getFieldMatcher } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\nimport { filterFieldsTransformer } from './filter';\nimport { getFieldDisplayName } from '../../field';\n\nexport interface ReduceTransformerOptions {\n  reducers: ReducerID[];\n  fields?: MatcherConfig; // Assume all fields\n}\n\nexport const reduceTransformer: DataTransformerInfo<ReduceTransformerOptions> = {\n  id: DataTransformerID.reduce,\n  name: 'Reduce',\n  description: 'Reduce all rows or data points to a single value using a function like max, min, mean or last',\n  defaultOptions: {\n    reducers: [ReducerID.max],\n  },\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: ReduceTransformerOptions) => {\n    const matcher = options.fields ? getFieldMatcher(options.fields) : alwaysFieldMatcher;\n    const calculators = options.reducers && options.reducers.length ? fieldReducers.list(options.reducers) : [];\n    const reducers = calculators.map(c => c.id);\n\n    return (data: DataFrame[]) => {\n      const processed: DataFrame[] = [];\n\n      for (let seriesIndex = 0; seriesIndex < data.length; seriesIndex++) {\n        const series = data[seriesIndex];\n        const values: ArrayVector[] = [];\n        const fields: Field[] = [];\n        const byId: KeyValue<ArrayVector> = {};\n\n        values.push(new ArrayVector()); // The name\n        fields.push({\n          name: 'Field',\n          type: FieldType.string,\n          values: values[0],\n          config: {},\n        });\n\n        for (const info of calculators) {\n          const vals = new ArrayVector();\n          byId[info.id] = vals;\n          values.push(vals);\n\n          fields.push({\n            name: info.id,\n            type: FieldType.other, // UNKNOWN until after we call the functions\n            values: values[values.length - 1],\n            config: {\n              displayName: info.name,\n              // UNIT from original field?\n            },\n          });\n        }\n\n        for (let i = 0; i < series.fields.length; i++) {\n          const field = series.fields[i];\n\n          if (field.type === FieldType.time) {\n            continue;\n          }\n\n          if (matcher(field, series, data)) {\n            const results = reduceField({\n              field,\n              reducers,\n            });\n\n            // Update the name list\n            const fieldName = getFieldDisplayName(field, series, data);\n\n            values[0].buffer.push(fieldName);\n\n            for (const info of calculators) {\n              const v = results[info.id];\n              byId[info.id].buffer.push(v);\n            }\n          }\n        }\n\n        for (const f of fields) {\n          const t = guessFieldTypeForField(f);\n\n          if (t) {\n            f.type = t;\n          }\n        }\n\n        processed.push({\n          ...series, // Same properties, different fields\n          fields,\n          length: values[0].length,\n        });\n      }\n\n      const withoutTime = filterFieldsTransformer.transformer({ exclude: { id: FieldMatcherID.time } })(processed);\n      return mergeResults(withoutTime);\n    };\n  },\n};\n\nconst mergeResults = (data: DataFrame[]) => {\n  if (data.length <= 1) {\n    return data;\n  }\n\n  const baseFrame = data[0];\n\n  for (let seriesIndex = 1; seriesIndex < data.length; seriesIndex++) {\n    const series = data[seriesIndex];\n\n    for (const baseField of baseFrame.fields) {\n      for (const field of series.fields) {\n        if (baseField.type !== field.type || baseField.name !== field.name) {\n          continue;\n        }\n\n        const baseValues: any[] = ((baseField.values as unknown) as ArrayVector).buffer;\n        const values: any[] = ((field.values as unknown) as ArrayVector).buffer;\n        ((baseField.values as unknown) as ArrayVector).buffer = baseValues.concat(values);\n      }\n    }\n  }\n\n  baseFrame.name = undefined;\n  baseFrame.length = baseFrame.fields[0].values.length;\n\n  return [baseFrame];\n};\n","import { DataTransformerID } from './ids';\nimport { DataTransformerInfo, MatcherConfig } from '../../types/transformations';\nimport { FieldMatcherID } from '../matchers/ids';\nimport { FilterOptions, filterFieldsTransformer } from './filter';\nimport { RegexpOrNamesMatcherOptions } from '../matchers/nameMatcher';\n\nexport interface FilterFieldsByNameTransformerOptions {\n  include?: RegexpOrNamesMatcherOptions;\n  exclude?: RegexpOrNamesMatcherOptions;\n}\n\nexport const filterFieldsByNameTransformer: DataTransformerInfo<FilterFieldsByNameTransformerOptions> = {\n  id: DataTransformerID.filterFieldsByName,\n  name: 'Filter fields by name',\n  description: 'select a subset of fields',\n  defaultOptions: {},\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: FilterFieldsByNameTransformerOptions) => {\n    const filterOptions: FilterOptions = {\n      include: getMatcherConfig(options.include),\n      exclude: getMatcherConfig(options.exclude),\n    };\n\n    return filterFieldsTransformer.transformer(filterOptions);\n  },\n};\n\nconst getMatcherConfig = (options?: RegexpOrNamesMatcherOptions): MatcherConfig | undefined => {\n  if (!options) {\n    return undefined;\n  }\n\n  const { names, pattern } = options;\n\n  if ((!Array.isArray(names) || names.length === 0) && !pattern) {\n    return undefined;\n  }\n\n  if (!pattern) {\n    return { id: FieldMatcherID.byNames, options: names };\n  }\n\n  if (!Array.isArray(names) || names.length === 0) {\n    return { id: FieldMatcherID.byRegexp, options: pattern };\n  }\n\n  return { id: FieldMatcherID.byRegexpOrNames, options };\n};\n","import { DataTransformerID } from './ids';\nimport { FilterOptions, filterFramesTransformer } from './filter';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { FrameMatcherID } from '../matchers/ids';\n\nexport interface FilterFramesByRefIdTransformerOptions {\n  include?: string;\n  exclude?: string;\n}\n\nexport const filterFramesByRefIdTransformer: DataTransformerInfo<FilterFramesByRefIdTransformerOptions> = {\n  id: DataTransformerID.filterByRefId,\n  name: 'Filter data by query refId',\n  description: 'select a subset of results',\n  defaultOptions: {},\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: FilterFramesByRefIdTransformerOptions) => {\n    const filterOptions: FilterOptions = {};\n    if (options.include) {\n      filterOptions.include = {\n        id: FrameMatcherID.byRefId,\n        options: options.include,\n      };\n    }\n    if (options.exclude) {\n      filterOptions.exclude = {\n        id: FrameMatcherID.byRefId,\n        options: options.exclude,\n      };\n    }\n\n    return filterFramesTransformer.transformer(filterOptions);\n  },\n};\n","import { DataTransformerID } from './ids';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { DataFrame, Field } from '../../types/dataFrame';\nimport { getFieldDisplayName } from '../../field/fieldState';\n\nexport interface RenameFieldsTransformerOptions {\n  renameByName: Record<string, string>;\n}\n\nexport const renameFieldsTransformer: DataTransformerInfo<RenameFieldsTransformerOptions> = {\n  id: DataTransformerID.rename,\n  name: 'Rename fields by name',\n  description: 'Rename fields based on configuration given by user',\n  defaultOptions: {\n    renameByName: {},\n  },\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: RenameFieldsTransformerOptions) => {\n    const renamer = createRenamer(options.renameByName);\n\n    return (data: DataFrame[]) => {\n      if (!Array.isArray(data) || data.length === 0) {\n        return data;\n      }\n\n      return data.map(frame => ({\n        ...frame,\n        fields: renamer(frame),\n      }));\n    };\n  },\n};\n\nconst createRenamer = (renameByName: Record<string, string>) => (frame: DataFrame): Field[] => {\n  if (!renameByName || Object.keys(renameByName).length === 0) {\n    return frame.fields;\n  }\n\n  return frame.fields.map(field => {\n    const displayName = getFieldDisplayName(field, frame);\n    const renameTo = renameByName[displayName];\n\n    if (typeof renameTo !== 'string' || renameTo.length === 0) {\n      return field;\n    }\n\n    return {\n      ...field,\n      config: {\n        ...field.config,\n        displayName: renameTo,\n      },\n      state: {\n        ...field.state,\n        displayName: renameTo,\n      },\n    };\n  });\n};\n","import { DataTransformerID } from './ids';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { OrderFieldsTransformerOptions, orderFieldsTransformer } from './order';\nimport { filterFieldsByNameTransformer } from './filterByName';\nimport { DataFrame } from '../..';\nimport { RenameFieldsTransformerOptions, renameFieldsTransformer } from './rename';\n\nexport interface OrganizeFieldsTransformerOptions\n  extends OrderFieldsTransformerOptions,\n    RenameFieldsTransformerOptions {\n  excludeByName: Record<string, boolean>;\n}\n\nexport const organizeFieldsTransformer: DataTransformerInfo<OrganizeFieldsTransformerOptions> = {\n  id: DataTransformerID.organize,\n  name: 'Organize fields by name',\n  description: 'Order, filter and rename fields based on configuration given by user',\n  defaultOptions: {\n    excludeByName: {},\n    indexByName: {},\n    renameByName: {},\n  },\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: OrganizeFieldsTransformerOptions) => {\n    const rename = renameFieldsTransformer.transformer(options);\n    const order = orderFieldsTransformer.transformer(options);\n    const filter = filterFieldsByNameTransformer.transformer({\n      exclude: { names: mapToExcludeArray(options.excludeByName) },\n    });\n\n    return (data: DataFrame[]) => rename(order(filter(data)));\n  },\n};\n\nconst mapToExcludeArray = (excludeByName: Record<string, boolean>): string[] => {\n  if (!excludeByName) {\n    return [];\n  }\n\n  return Object.keys(excludeByName).filter(name => excludeByName[name]);\n};\n","import { DataFrame, DataTransformerInfo, FieldType, Field } from '../../types';\nimport { DataTransformerID } from './ids';\nimport { ArrayVector } from '../../vector';\nimport { filterFieldsTransformer } from './filter';\nimport { FieldMatcherID } from '..';\nimport { MutableField } from '../../dataframe';\n\nexport interface LabelsToFieldsOptions {}\ntype MapItem = { type: FieldType; values: Record<string, any>; isValue: boolean };\ntype SeriesMapItem = Record<string, MapItem>;\ntype Map = Record<string, SeriesMapItem>;\n\nexport const labelsToFieldsTransformer: DataTransformerInfo<LabelsToFieldsOptions> = {\n  id: DataTransformerID.labelsToFields,\n  name: 'Labels to fields',\n  description: 'Groups series by time and return labels as columns',\n  defaultOptions: {},\n  transformer: options => (data: DataFrame[]) => {\n    const framesWithTimeField = filterFieldsTransformer.transformer({ include: { id: FieldMatcherID.time } })(data);\n    if (!framesWithTimeField.length || !framesWithTimeField[0].fields.length) {\n      return data;\n    }\n\n    // get frames with only value fields\n    const framesWithoutTimeField = getFramesWithOnlyValueFields(data);\n    if (!framesWithoutTimeField.length || !framesWithoutTimeField[0].fields.length) {\n      return data;\n    }\n\n    const columnsMap = createColumnsMap(framesWithTimeField, framesWithoutTimeField);\n    const fields = createFields(columnsMap);\n    const values: Record<string, any[]> = {};\n\n    const timeColumnItem = columnsMap[fields[0].name];\n    const seriesIndexStrings = Object.keys(timeColumnItem);\n    for (const seriesIndexString of seriesIndexStrings) {\n      const seriesItem = timeColumnItem[seriesIndexString];\n      const timeValueStrings = Object.keys(seriesItem.values);\n\n      for (const timeValueString of timeValueStrings) {\n        if (!values[timeValueString]) {\n          values[timeValueString] = [];\n        }\n        let row = new Array(fields.length);\n        for (let index = 0; index < fields.length; index++) {\n          const field = fields[index];\n          const valueItem = columnsMap[field.name][seriesIndexString];\n          const value = valueItem ? valueItem.values[timeValueString] ?? null : null;\n          row[index] = value;\n        }\n        values[timeValueString].push(row);\n      }\n    }\n\n    const timestamps = Object.values(values);\n    for (const timestamp of timestamps) {\n      for (const row of timestamp) {\n        for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {\n          fields[fieldIndex].values.add(row[fieldIndex]);\n        }\n      }\n    }\n\n    return [\n      {\n        fields,\n        length: fields[0].values.length,\n      },\n    ];\n  },\n};\n\nfunction getFramesWithOnlyValueFields(data: DataFrame[]): DataFrame[] {\n  const processed: DataFrame[] = [];\n\n  for (const series of data) {\n    const fields: Field[] = [];\n\n    for (let i = 0; i < series.fields.length; i++) {\n      const field = series.fields[i];\n\n      if (field.type !== FieldType.number) {\n        continue;\n      }\n\n      fields.push(field);\n    }\n\n    if (!fields.length) {\n      continue;\n    }\n\n    const copy = {\n      ...series, // all the other properties\n      fields, // but a different set of fields\n    };\n\n    processed.push(copy);\n  }\n\n  return processed;\n}\n\nfunction addOrAppendMapItem(args: { map: Map; series: number; column: string; type: FieldType; isValue?: boolean }) {\n  const { map, column, type, series, isValue = false } = args;\n  // we're using the fact that the series (number) will automatically become a string prop on the object\n  const seriesMapItem: SeriesMapItem = { [series]: { type, values: {}, isValue } };\n  if (!map[column]) {\n    map[column] = seriesMapItem;\n  }\n\n  if (!map[column][series]) {\n    map[column] = { ...map[column], ...seriesMapItem };\n  }\n}\n\n// this is a naive implementation that does the job, not optimized for performance or speed\nfunction createColumnsMap(framesWithTimeField: DataFrame[], framesWithoutTimeField: DataFrame[]) {\n  const map: Map = {};\n\n  for (let frameIndex = 0; frameIndex < framesWithTimeField.length; frameIndex++) {\n    const timeFrame = framesWithTimeField[frameIndex];\n    const otherFrame = framesWithoutTimeField[frameIndex];\n    const timeField = timeFrame.fields[0];\n\n    addOrAppendMapItem({ map, column: timeField.name, series: frameIndex, type: timeField.type });\n\n    for (let valueIndex = 0; valueIndex < timeFrame.length; valueIndex++) {\n      const timeFieldValue = timeField.values.get(valueIndex);\n      map[timeField.name][frameIndex].values[timeFieldValue] = timeFieldValue;\n\n      for (const field of otherFrame.fields) {\n        if (field.labels) {\n          const labels = Object.keys(field.labels);\n          for (const label of labels) {\n            addOrAppendMapItem({ map, column: label, series: frameIndex, type: FieldType.string });\n\n            map[label][frameIndex].values[timeFieldValue] = field.labels[label];\n          }\n        }\n\n        const otherFieldValue = field.values.get(valueIndex);\n        addOrAppendMapItem({ map, column: field.name, series: frameIndex, type: field.type, isValue: true });\n\n        map[field.name][frameIndex].values[timeFieldValue] = otherFieldValue;\n      }\n    }\n  }\n\n  return map;\n}\n\nfunction createFields(columnsMap: Map): MutableField[] {\n  const columns = Object.keys(columnsMap);\n  const fields: MutableField[] = [];\n  const valueColumns: string[] = [];\n\n  for (const column of columns) {\n    const columnItem = Object.values<MapItem>(columnsMap[column])[0];\n    if (columnItem.isValue) {\n      valueColumns.push(column);\n      continue;\n    }\n    fields.push({ type: columnItem.type, values: new ArrayVector(), name: column, config: {} });\n  }\n\n  for (const column of valueColumns) {\n    const columnItem = Object.values<MapItem>(columnsMap[column])[0];\n    fields.push({ type: columnItem.type, values: new ArrayVector(), name: column, config: {} });\n  }\n\n  return fields;\n}\n","import { appendTransformer } from './transformers/append';\nimport { reduceTransformer } from './transformers/reduce';\nimport { calculateFieldTransformer } from './transformers/calculateField';\nimport { filterFieldsTransformer, filterFramesTransformer } from './transformers/filter';\nimport { filterFieldsByNameTransformer } from './transformers/filterByName';\nimport { noopTransformer } from './transformers/noop';\nimport { filterFramesByRefIdTransformer } from './transformers/filterByRefId';\nimport { orderFieldsTransformer } from './transformers/order';\nimport { organizeFieldsTransformer } from './transformers/organize';\nimport { seriesToColumnsTransformer } from './transformers/seriesToColumns';\nimport { renameFieldsTransformer } from './transformers/rename';\nimport { labelsToFieldsTransformer } from './transformers/labelsToFields';\nimport { ensureColumnsTransformer } from './transformers/ensureColumns';\n\nexport const standardTransformers = {\n  noopTransformer,\n  filterFieldsTransformer,\n  filterFieldsByNameTransformer,\n  filterFramesTransformer,\n  filterFramesByRefIdTransformer,\n  orderFieldsTransformer,\n  organizeFieldsTransformer,\n  appendTransformer,\n  reduceTransformer,\n  calculateFieldTransformer,\n  seriesToColumnsTransformer,\n  renameFieldsTransformer,\n  labelsToFieldsTransformer,\n  ensureColumnsTransformer,\n};\n","import React from 'react';\nimport { DataFrame, DataTransformerInfo } from '../types';\nimport { Registry, RegistryItem } from '../utils/Registry';\n\nexport interface TransformerUIProps<T> {\n  /**\n   * Transformer configuration, persisted on panel's model\n   */\n  options: T;\n  /**\n   * Pre-transform data rames\n   */\n  input: DataFrame[];\n  onChange: (options: T) => void;\n}\n\nexport interface TransformerRegistyItem<TOptions> extends RegistryItem {\n  /**\n   * Object describing transformer configuration\n   */\n  transformation: DataTransformerInfo<TOptions>;\n  /**\n   * React component used as UI for the transformer\n   */\n  editor: React.ComponentType<TransformerUIProps<TOptions>>;\n}\n\n/**\n * Registry of transformation options that can be driven by\n * stored configuration files.\n */\nexport const standardTransformersRegistry = new Registry<TransformerRegistyItem<any>>();\n","import { DataFrame, DataTransformerConfig } from '../types';\nimport { standardTransformersRegistry } from './standardTransformersRegistry';\n\n/**\n * Apply configured transformations to the input data\n */\nexport function transformDataFrame(options: DataTransformerConfig[], data: DataFrame[]): DataFrame[] {\n  let processed = data;\n  for (const config of options) {\n    const info = standardTransformersRegistry.get(config.id);\n\n    if (!info) {\n      return data;\n    }\n\n    const defaultOptions = info.transformation.defaultOptions ?? {};\n    const options = { ...defaultOptions, ...config.options };\n    const transformer = info.transformation.transformer(options);\n    const after = transformer(processed);\n\n    // Add a key to the metadata if the data changed\n    if (after && after !== processed) {\n      for (const series of after) {\n        if (!series.meta) {\n          series.meta = {};\n        }\n        if (!series.meta.transformations) {\n          series.meta.transformations = [info.id];\n        } else {\n          series.meta.transformations = [...series.meta.transformations, info.id];\n        }\n      }\n      processed = after;\n    }\n  }\n  return processed;\n}\n","export * from './matchers/ids';\nexport * from './transformers/ids';\nexport * from './matchers';\nexport { standardTransformers } from './transformers';\nexport * from './fieldReducer';\nexport { transformDataFrame } from './transformDataFrame';\nexport {\n  TransformerRegistyItem,\n  TransformerUIProps,\n  standardTransformersRegistry,\n} from './standardTransformersRegistry';\nexport { RegexpOrNamesMatcherOptions } from './matchers/nameMatcher';\n","import React, { FC } from 'react';\nimport { SignupForm } from './SignupForm';\nimport Page from 'app/core/components/Page/Page';\nimport { getConfig } from 'app/core/config';\nimport { connect } from 'react-redux';\nimport { hot } from 'react-hot-loader';\nimport { StoreState } from 'app/types';\n\nconst navModel = {\n  main: {\n    icon: 'grafana',\n    text: 'Sign Up',\n    subTitle: 'Register your Grafana account',\n    breadcrumbs: [{ title: 'Login', url: 'login' }],\n  },\n  node: {\n    text: '',\n  },\n};\n\ninterface Props {\n  email?: string;\n  orgName?: string;\n  username?: string;\n  code?: string;\n  name?: string;\n}\nexport const SignupPage: FC<Props> = props => {\n  return (\n    <Page navModel={navModel}>\n      <Page.Contents>\n        <h3 className=\"p-b-1\">You're almost there.</h3>\n        <div className=\"p-b-1\">\n          We just need a couple of more bits of\n          <br /> information to finish creating your account.\n        </div>\n        <SignupForm\n          {...props}\n          verifyEmailEnabled={getConfig().verifyEmailEnabled}\n          autoAssignOrg={getConfig().autoAssignOrg}\n        />\n      </Page.Contents>\n    </Page>\n  );\n};\n\nconst mapStateToProps = (state: StoreState) => ({\n  ...state.location.routeParams,\n});\n\nexport default hot(module)(connect(mapStateToProps)(SignupPage));\n","import React from 'react';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { IconButton, Label, RadioButtonGroup } from '../index';\nimport { Field } from '../Forms/Field';\nimport { Input } from '../Input/Input';\nimport { MappingType, RangeMap, SelectableValue, ValueMap, ValueMapping } from '@grafana/data';\n\nexport interface Props {\n  valueMapping: ValueMapping;\n  updateValueMapping: (valueMapping: ValueMapping) => void;\n  removeValueMapping: () => void;\n}\n\nconst MAPPING_OPTIONS: Array<SelectableValue<MappingType>> = [\n  { value: MappingType.ValueToText, label: 'Value' },\n  { value: MappingType.RangeToText, label: 'Range' },\n];\n\nexport const MappingRow: React.FC<Props> = ({ valueMapping, updateValueMapping, removeValueMapping }) => {\n  const { type } = valueMapping;\n\n  const onMappingValueChange = (value: string) => {\n    updateValueMapping({ ...valueMapping, value: value });\n  };\n\n  const onMappingFromChange = (value: string) => {\n    updateValueMapping({ ...valueMapping, from: value });\n  };\n\n  const onMappingToChange = (value: string) => {\n    updateValueMapping({ ...valueMapping, to: value });\n  };\n\n  const onMappingTextChange = (value: string) => {\n    updateValueMapping({ ...valueMapping, text: value });\n  };\n\n  const onMappingTypeChange = (mappingType: MappingType) => {\n    updateValueMapping({ ...valueMapping, type: mappingType });\n  };\n\n  const onKeyDown = (handler: (value: string) => void) => (e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (e.key === 'Enter') {\n      handler(e.currentTarget.value);\n    }\n  };\n\n  const renderRow = () => {\n    if (type === MappingType.RangeToText) {\n      return (\n        <>\n          <HorizontalGroup>\n            <Field label=\"From\">\n              <Input\n                type=\"number\"\n                defaultValue={(valueMapping as RangeMap).from!}\n                onBlur={e => onMappingFromChange(e.currentTarget.value)}\n                onKeyDown={onKeyDown(onMappingFromChange)}\n              />\n            </Field>\n            <Field label=\"To\">\n              <Input\n                type=\"number\"\n                defaultValue={(valueMapping as RangeMap).to}\n                onBlur={e => onMappingToChange(e.currentTarget.value)}\n                onKeyDown={onKeyDown(onMappingToChange)}\n              />\n            </Field>\n          </HorizontalGroup>\n\n          <Field label=\"Text\">\n            <Input\n              defaultValue={valueMapping.text}\n              onBlur={e => onMappingTextChange(e.currentTarget.value)}\n              onKeyDown={onKeyDown(onMappingTextChange)}\n            />\n          </Field>\n        </>\n      );\n    }\n\n    return (\n      <>\n        <Field label=\"Value\">\n          <Input\n            type=\"number\"\n            defaultValue={(valueMapping as ValueMap).value}\n            onBlur={e => onMappingValueChange(e.currentTarget.value)}\n            onKeyDown={onKeyDown(onMappingValueChange)}\n          />\n        </Field>\n\n        <Field label=\"Text\">\n          <Input\n            defaultValue={valueMapping.text}\n            onBlur={e => onMappingTextChange(e.currentTarget.value)}\n            onKeyDown={onKeyDown(onMappingTextChange)}\n          />\n        </Field>\n      </>\n    );\n  };\n\n  const label = (\n    <HorizontalGroup justify=\"space-between\" align=\"center\">\n      <Label>Mapping type</Label>\n      <IconButton name=\"times\" onClick={removeValueMapping} aria-label=\"ValueMappingsEditor remove button\" />\n    </HorizontalGroup>\n  );\n  return (\n    <div>\n      <Field label={label}>\n        <RadioButtonGroup\n          options={MAPPING_OPTIONS}\n          value={type}\n          onChange={type => {\n            onMappingTypeChange(type!);\n          }}\n        />\n      </Field>\n      {renderRow()}\n    </div>\n  );\n};\n","import React from 'react';\nimport { MappingType, ValueMapping } from '@grafana/data';\nimport { Button } from '../Button/Button';\nimport { MappingRow } from './MappingRow';\n\nexport interface Props {\n  valueMappings?: ValueMapping[];\n  onChange: (valueMappings: ValueMapping[]) => void;\n}\n\nexport const ValueMappingsEditor: React.FC<Props> = ({ valueMappings, onChange, children }) => {\n  const onAdd = () => {\n    let update = valueMappings;\n    const defaultMapping = {\n      type: MappingType.ValueToText,\n      from: '',\n      to: '',\n      operator: '',\n      text: '',\n    };\n    const id = update && update.length > 0 ? Math.max(...update.map(v => v.id)) + 1 : 0;\n\n    if (update) {\n      update.push({\n        id,\n        ...defaultMapping,\n      });\n    } else {\n      update = [\n        {\n          id,\n          ...defaultMapping,\n        },\n      ];\n    }\n\n    onChange(update);\n  };\n\n  const onRemove = (index: number) => {\n    const update = valueMappings;\n    update!.splice(index, 1);\n    onChange(update!);\n  };\n\n  const onMappingChange = (index: number, value: ValueMapping) => {\n    const update = valueMappings;\n    update![index] = value;\n    onChange(update!);\n  };\n\n  return (\n    <>\n      {valueMappings && valueMappings.length > 0 && (\n        <>\n          {valueMappings.length > 0 &&\n            valueMappings.map((valueMapping, index) => (\n              <MappingRow\n                key={`${valueMapping.text}-${index}`}\n                valueMapping={valueMapping}\n                updateValueMapping={value => onMappingChange(index, value)}\n                removeValueMapping={() => onRemove(index)}\n              />\n            ))}\n        </>\n      )}\n      <Button\n        size=\"sm\"\n        icon=\"plus\"\n        onClick={onAdd}\n        aria-label=\"ValueMappingsEditor add mapping button\"\n        variant=\"secondary\"\n      >\n        Add value mapping\n      </Button>\n    </>\n  );\n};\n","import React from 'react';\n\nimport { FieldConfigEditorProps, ValueMapping, ValueMappingFieldConfigSettings } from '@grafana/data';\nimport { ValueMappingsEditor } from '../ValueMappingsEditor/ValueMappingsEditor';\n\nexport class ValueMappingsValueEditor extends React.PureComponent<\n  FieldConfigEditorProps<ValueMapping[], ValueMappingFieldConfigSettings>\n> {\n  constructor(props: FieldConfigEditorProps<ValueMapping[], ValueMappingFieldConfigSettings>) {\n    super(props);\n  }\n\n  render() {\n    const { onChange } = this.props;\n    let value = this.props.value;\n    if (!value) {\n      value = [];\n    }\n\n    return <ValueMappingsEditor valueMappings={value} onChange={onChange} />;\n  }\n}\n","import React, { PureComponent, ChangeEvent } from 'react';\nimport { css } from 'emotion';\nimport {\n  Threshold,\n  sortThresholds,\n  ThresholdsConfig,\n  ThresholdsMode,\n  SelectableValue,\n  GrafanaTheme,\n} from '@grafana/data';\nimport { colors } from '../../utils';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { Input } from '../Input/Input';\nimport { ColorPicker } from '../ColorPicker/ColorPicker';\nimport { stylesFactory } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { RadioButtonGroup } from '../Forms/RadioButtonGroup/RadioButtonGroup';\nimport { Button } from '../Button';\nimport { FullWidthButtonContainer } from '../Button/FullWidthButtonContainer';\nimport { Label } from '../Forms/Label';\n\nconst modes: Array<SelectableValue<ThresholdsMode>> = [\n  { value: ThresholdsMode.Absolute, label: 'Absolute', description: 'Pick thresholds based on the absolute values' },\n  {\n    value: ThresholdsMode.Percentage,\n    label: 'Percentage',\n    description: 'Pick threshold based on the percent between min/max',\n  },\n];\n\nexport interface Props {\n  thresholds: ThresholdsConfig;\n  onChange: (thresholds: ThresholdsConfig) => void;\n}\n\ninterface State {\n  steps: ThresholdWithKey[];\n}\n\nexport class ThresholdsEditor extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    const steps = toThresholdsWithKey(props.thresholds!.steps);\n    steps[0].value = -Infinity;\n\n    this.state = { steps };\n  }\n\n  onAddThreshold = () => {\n    const { steps } = this.state;\n\n    let nextValue = 0;\n\n    if (steps.length > 1) {\n      nextValue = steps[steps.length - 1].value + 10;\n    }\n\n    const color = colors.filter(c => !steps.some(t => t.color === c))[1];\n\n    const add = {\n      value: nextValue,\n      color: color,\n      key: counter++,\n    };\n\n    const newThresholds = [...steps, add];\n    sortThresholds(newThresholds);\n\n    this.setState({ steps: newThresholds }, this.onChange);\n  };\n\n  onRemoveThreshold = (threshold: ThresholdWithKey) => {\n    const { steps } = this.state;\n\n    if (!steps.length) {\n      return;\n    }\n\n    // Don't remove index 0\n    if (threshold.key === steps[0].key) {\n      return;\n    }\n\n    this.setState({ steps: steps.filter(t => t.key !== threshold.key) }, this.onChange);\n  };\n\n  onChangeThresholdValue = (event: ChangeEvent<HTMLInputElement>, threshold: ThresholdWithKey) => {\n    const cleanValue = event.target.value.replace(/,/g, '.');\n    const parsedValue = parseFloat(cleanValue);\n    const value = isNaN(parsedValue) ? '' : parsedValue;\n\n    const steps = this.state.steps.map(t => {\n      if (t.key === threshold.key) {\n        t = { ...t, value: value as number };\n      }\n      return t;\n    });\n\n    if (steps.length) {\n      steps[0].value = -Infinity;\n    }\n\n    sortThresholds(steps);\n    this.setState({ steps });\n  };\n\n  onChangeThresholdColor = (threshold: ThresholdWithKey, color: string) => {\n    const { steps } = this.state;\n\n    const newThresholds = steps.map(t => {\n      if (t.key === threshold.key) {\n        t = { ...t, color: color };\n      }\n\n      return t;\n    });\n\n    this.setState({ steps: newThresholds }, this.onChange);\n  };\n\n  onBlur = () => {\n    const steps = [...this.state.steps];\n    sortThresholds(steps);\n    this.setState({ steps }, this.onChange);\n  };\n\n  onChange = () => {\n    this.props.onChange(thresholdsWithoutKey(this.props.thresholds, this.state.steps));\n  };\n\n  onModeChanged = (value?: ThresholdsMode) => {\n    this.props.onChange({\n      ...this.props.thresholds,\n      mode: value!,\n    });\n  };\n\n  renderInput(threshold: ThresholdWithKey, styles: ThresholdStyles) {\n    const isPercent = this.props.thresholds.mode === ThresholdsMode.Percentage;\n\n    if (!isFinite(threshold.value)) {\n      return (\n        <Input\n          type=\"text\"\n          value={'Base'}\n          disabled\n          prefix={\n            threshold.color && (\n              <div className={styles.colorPicker}>\n                <ColorPicker\n                  color={threshold.color}\n                  onChange={color => this.onChangeThresholdColor(threshold, color)}\n                  enableNamedColors={true}\n                />\n              </div>\n            )\n          }\n        />\n      );\n    }\n\n    return (\n      <Input\n        type=\"number\"\n        step=\"0.0001\"\n        key={isPercent.toString()}\n        onChange={(event: ChangeEvent<HTMLInputElement>) => this.onChangeThresholdValue(event, threshold)}\n        value={threshold.value}\n        onBlur={this.onBlur}\n        prefix={\n          <div className={styles.inputPrefix}>\n            {threshold.color && (\n              <div className={styles.colorPicker}>\n                <ColorPicker\n                  color={threshold.color}\n                  onChange={color => this.onChangeThresholdColor(threshold, color)}\n                  enableNamedColors={true}\n                />\n              </div>\n            )}\n            {isPercent && <div className={styles.percentIcon}>%</div>}\n          </div>\n        }\n        suffix={\n          <Icon className={styles.trashIcon} name=\"trash-alt\" onClick={() => this.onRemoveThreshold(threshold)} />\n        }\n      />\n    );\n  }\n\n  render() {\n    const { thresholds } = this.props;\n    const { steps } = this.state;\n\n    return (\n      <ThemeContext.Consumer>\n        {theme => {\n          const styles = getStyles(theme);\n          return (\n            <div className={styles.wrapper}>\n              <FullWidthButtonContainer className={styles.addButton}>\n                <Button size=\"sm\" icon=\"plus\" onClick={() => this.onAddThreshold()} variant=\"secondary\">\n                  Add threshold\n                </Button>\n              </FullWidthButtonContainer>\n              <div className={styles.thresholds}>\n                {steps\n                  .slice(0)\n                  .reverse()\n                  .map(threshold => {\n                    return (\n                      <div className={styles.item} key={`${threshold.key}`}>\n                        {this.renderInput(threshold, styles)}\n                      </div>\n                    );\n                  })}\n              </div>\n\n              <div>\n                <Label description=\"Percentage means thresholds relative to min & max\">Thresholds mode</Label>\n                <FullWidthButtonContainer>\n                  <RadioButtonGroup size=\"sm\" options={modes} onChange={this.onModeChanged} value={thresholds.mode} />\n                </FullWidthButtonContainer>\n              </div>\n            </div>\n          );\n        }}\n      </ThemeContext.Consumer>\n    );\n  }\n}\n\ninterface ThresholdWithKey extends Threshold {\n  key: number;\n}\n\nlet counter = 100;\n\nfunction toThresholdsWithKey(steps?: Threshold[]): ThresholdWithKey[] {\n  if (!steps || steps.length === 0) {\n    steps = [{ value: -Infinity, color: 'green' }];\n  }\n\n  return steps.map(t => {\n    return {\n      color: t.color,\n      value: t.value === null ? -Infinity : t.value,\n      key: counter++,\n    };\n  });\n}\n\nexport function thresholdsWithoutKey(thresholds: ThresholdsConfig, steps: ThresholdWithKey[]): ThresholdsConfig {\n  const mode = thresholds.mode ?? ThresholdsMode.Absolute;\n  return {\n    mode,\n    steps: steps.map(t => {\n      const { key, ...rest } = t;\n      return rest; // everything except key\n    }),\n  };\n}\n\ninterface ThresholdStyles {\n  wrapper: string;\n  thresholds: string;\n  item: string;\n  colorPicker: string;\n  addButton: string;\n  percentIcon: string;\n  inputPrefix: string;\n  trashIcon: string;\n}\n\nconst getStyles = stylesFactory(\n  (theme: GrafanaTheme): ThresholdStyles => {\n    return {\n      wrapper: css`\n        display: flex;\n        flex-direction: column;\n        // margin-bottom: -${theme.spacing.formSpacingBase * 2}px;\n      `,\n      thresholds: css`\n        display: flex;\n        flex-direction: column;\n        margin-bottom: ${theme.spacing.formSpacingBase * 2}px;\n      `,\n      item: css`\n        margin-bottom: ${theme.spacing.sm};\n\n        &:last-child {\n          margin-bottom: 0;\n        }\n      `,\n      colorPicker: css`\n        padding: 0 ${theme.spacing.sm};\n      `,\n      addButton: css`\n        margin-bottom: ${theme.spacing.sm};\n      `,\n      percentIcon: css`\n        font-size: ${theme.typography.size.sm};\n        color: ${theme.colors.textWeak};\n      `,\n      inputPrefix: css`\n        display: flex;\n        align-items: center;\n      `,\n      trashIcon: css`\n        color: ${theme.colors.textWeak};\n        cursor: pointer;\n\n        &:hover {\n          color: ${theme.colors.text};\n        }\n      `,\n    };\n  }\n);\n","import React from 'react';\nimport { FieldConfigEditorProps, ThresholdsConfig, ThresholdsMode, ThresholdsFieldConfigSettings } from '@grafana/data';\nimport { ThresholdsEditor } from '../ThresholdsEditorNew/ThresholdsEditor';\n\nexport class ThresholdsValueEditor extends React.PureComponent<\n  FieldConfigEditorProps<ThresholdsConfig, ThresholdsFieldConfigSettings>\n> {\n  constructor(props: FieldConfigEditorProps<ThresholdsConfig, ThresholdsFieldConfigSettings>) {\n    super(props);\n  }\n\n  render() {\n    const { onChange } = this.props;\n    let value = this.props.value;\n    if (!value) {\n      value = {\n        mode: ThresholdsMode.Percentage,\n\n        // Must be sorted by 'value', first value is always -Infinity\n        steps: [\n          // anything?\n        ],\n      };\n    }\n\n    return <ThresholdsEditor thresholds={value} onChange={onChange} />;\n  }\n}\n","import React from 'react';\n\nimport { FieldConfigEditorProps, UnitFieldConfigSettings } from '@grafana/data';\nimport { UnitPicker } from '../UnitPicker/UnitPicker';\n\nexport const UnitValueEditor: React.FC<FieldConfigEditorProps<string, UnitFieldConfigSettings>> = ({\n  value,\n  onChange,\n}) => {\n  return <UnitPicker value={value} onChange={onChange} />;\n};\n","import React from 'react';\nimport {\n  DataLink,\n  DataLinksFieldConfigSettings,\n  FieldConfigEditorProps,\n  VariableSuggestionsScope,\n} from '@grafana/data';\nimport { DataLinksInlineEditor } from '../DataLinks/DataLinksInlineEditor/DataLinksInlineEditor';\n\nexport const DataLinksValueEditor: React.FC<FieldConfigEditorProps<DataLink[], DataLinksFieldConfigSettings>> = ({\n  value,\n  onChange,\n  context,\n}) => {\n  return (\n    <DataLinksInlineEditor\n      links={value}\n      onChange={onChange}\n      data={context.data}\n      suggestions={context.getSuggestions ? context.getSuggestions(VariableSuggestionsScope.Values) : []}\n    />\n  );\n};\n","import React from 'react';\nimport {\n  FieldConfigEditorProps,\n  ColorFieldConfigSettings,\n  GrafanaTheme,\n  getColorFromHexRgbOrName,\n} from '@grafana/data';\nimport { ColorPicker } from '../ColorPicker/ColorPicker';\nimport { getTheme, stylesFactory } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { css } from 'emotion';\nimport { ColorPickerTrigger } from '../ColorPicker/ColorPickerTrigger';\n\nexport const ColorValueEditor: React.FC<FieldConfigEditorProps<string, ColorFieldConfigSettings>> = ({\n  value,\n  onChange,\n  item,\n}) => {\n  const { settings } = item;\n  const theme = getTheme();\n  const styles = getStyles(theme);\n\n  const color = value || (item.defaultValue as string) || theme.colors.panelBg;\n\n  return (\n    <ColorPicker color={color} onChange={onChange} enableNamedColors={!settings.disableNamedColors}>\n      {({ ref, showColorPicker, hideColorPicker }) => {\n        return (\n          <div className={styles.spot} onBlur={hideColorPicker}>\n            <div className={styles.colorPicker}>\n              <ColorPickerTrigger\n                ref={ref}\n                onClick={showColorPicker}\n                onMouseLeave={hideColorPicker}\n                color={getColorFromHexRgbOrName(color, theme.type)}\n              />\n            </div>\n            <div className={styles.colorText} onClick={showColorPicker}>\n              {value ?? settings.textWhenUndefined ?? 'Pick Color'}\n            </div>\n            {value && settings.allowUndefined && (\n              <Icon className={styles.trashIcon} name=\"trash-alt\" onClick={() => onChange(undefined)} />\n            )}\n          </div>\n        );\n      }}\n    </ColorPicker>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    spot: css`\n      color: ${theme.colors.text};\n      background: ${theme.colors.formInputBg};\n      padding: 3px;\n      border: 1px solid ${theme.colors.formInputBorder};\n      display: flex;\n      flex-direction: row;\n      align-items: center;\n      &:hover {\n        border: 1px solid ${theme.colors.formInputBorderHover};\n      }\n    `,\n    colorPicker: css`\n      padding: 0 ${theme.spacing.sm};\n    `,\n    colorText: css`\n      cursor: pointer;\n      flex-grow: 1;\n    `,\n    trashIcon: css`\n      cursor: pointer;\n      color: ${theme.colors.textWeak};\n      &:hover {\n        color: ${theme.colors.text};\n      }\n    `,\n  };\n});\n","import React from 'react';\nimport { FieldConfigEditorProps, ReducerID } from '@grafana/data';\nimport { StatsPicker } from '../StatsPicker/StatsPicker';\n\nexport const StatsPickerEditor: React.FC<FieldConfigEditorProps<string[], any>> = ({ value, onChange }) => {\n  return <StatsPicker stats={value} onChange={onChange} allowMultiple={false} defaultStat={ReducerID.mean} />;\n};\n","import React from 'react';\nimport {\n  DataLink,\n  dataLinksOverrideProcessor,\n  FieldConfigPropertyItem,\n  FieldType,\n  NumberFieldConfigSettings,\n  numberOverrideProcessor,\n  standardEditorsRegistry,\n  StandardEditorsRegistryItem,\n  StringFieldConfigSettings,\n  stringOverrideProcessor,\n  ThresholdsConfig,\n  ThresholdsFieldConfigSettings,\n  thresholdsOverrideProcessor,\n  ValueMapping,\n  ValueMappingFieldConfigSettings,\n  valueMappingsOverrideProcessor,\n  ThresholdsMode,\n} from '@grafana/data';\n\nimport { Switch } from '../components/Switch/Switch';\nimport { NumberValueEditor, RadioButtonGroup, StringValueEditor, SelectValueEditor } from '../components';\nimport { ValueMappingsValueEditor } from '../components/OptionsUI/mappings';\nimport { ThresholdsValueEditor } from '../components/OptionsUI/thresholds';\nimport { UnitValueEditor } from '../components/OptionsUI/units';\nimport { DataLinksValueEditor } from '../components/OptionsUI/links';\nimport { ColorValueEditor } from '../components/OptionsUI/color';\nimport { StatsPickerEditor } from '../components/OptionsUI/stats';\n\n/**\n * Returns collection of common field config properties definitions\n */\nexport const getStandardFieldConfigs = () => {\n  const category = ['Standard options'];\n  const displayName: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n    id: 'displayName',\n    path: 'displayName',\n    name: 'Display name',\n    description: 'Change the field or series name',\n    editor: standardEditorsRegistry.get('text').editor as any,\n    override: standardEditorsRegistry.get('text').editor as any,\n    process: stringOverrideProcessor,\n    settings: {\n      placeholder: 'none',\n      expandTemplateVars: true,\n    },\n    shouldApply: () => true,\n    category,\n  };\n\n  const unit: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n    id: 'unit',\n    path: 'unit',\n    name: 'Unit',\n    description: '',\n\n    editor: standardEditorsRegistry.get('unit').editor as any,\n    override: standardEditorsRegistry.get('unit').editor as any,\n    process: stringOverrideProcessor,\n\n    settings: {\n      placeholder: 'none',\n    },\n\n    shouldApply: field => field.type === FieldType.number,\n    category,\n  };\n\n  const min: FieldConfigPropertyItem<any, number, NumberFieldConfigSettings> = {\n    id: 'min',\n    path: 'min',\n    name: 'Min',\n    description: 'Leave empty to calculate based on all values',\n\n    editor: standardEditorsRegistry.get('number').editor as any,\n    override: standardEditorsRegistry.get('number').editor as any,\n    process: numberOverrideProcessor,\n\n    settings: {\n      placeholder: 'auto',\n    },\n    shouldApply: field => field.type === FieldType.number,\n    category,\n  };\n\n  const max: FieldConfigPropertyItem<any, number, NumberFieldConfigSettings> = {\n    id: 'max',\n    path: 'max',\n    name: 'Max',\n    description: 'Leave empty to calculate based on all values',\n\n    editor: standardEditorsRegistry.get('number').editor as any,\n    override: standardEditorsRegistry.get('number').editor as any,\n    process: numberOverrideProcessor,\n\n    settings: {\n      placeholder: 'auto',\n    },\n\n    shouldApply: field => field.type === FieldType.number,\n    category,\n  };\n\n  const decimals: FieldConfigPropertyItem<any, number, NumberFieldConfigSettings> = {\n    id: 'decimals',\n    path: 'decimals',\n    name: 'Decimals',\n\n    editor: standardEditorsRegistry.get('number').editor as any,\n    override: standardEditorsRegistry.get('number').editor as any,\n    process: numberOverrideProcessor,\n\n    settings: {\n      placeholder: 'auto',\n      min: 0,\n      max: 15,\n      integer: true,\n    },\n\n    shouldApply: field => field.type === FieldType.number,\n    category,\n  };\n\n  const thresholds: FieldConfigPropertyItem<any, ThresholdsConfig, ThresholdsFieldConfigSettings> = {\n    id: 'thresholds',\n    path: 'thresholds',\n    name: 'Thresholds',\n\n    editor: standardEditorsRegistry.get('thresholds').editor as any,\n    override: standardEditorsRegistry.get('thresholds').editor as any,\n    process: thresholdsOverrideProcessor,\n    settings: {},\n    defaultValue: {\n      mode: ThresholdsMode.Absolute,\n      steps: [\n        { value: -Infinity, color: 'green' },\n        { value: 80, color: 'red' },\n      ],\n    },\n    shouldApply: field => field.type === FieldType.number,\n    category: ['Thresholds'],\n    getItemsCount: value => (value ? value.steps.length : 0),\n  };\n\n  const mappings: FieldConfigPropertyItem<any, ValueMapping[], ValueMappingFieldConfigSettings> = {\n    id: 'mappings',\n    path: 'mappings',\n    name: 'Value mappings',\n\n    editor: standardEditorsRegistry.get('mappings').editor as any,\n    override: standardEditorsRegistry.get('mappings').editor as any,\n    process: valueMappingsOverrideProcessor,\n    settings: {},\n    defaultValue: [],\n    shouldApply: field => field.type === FieldType.number,\n    category: ['Value mappings'],\n    getItemsCount: (value?) => (value ? value.length : 0),\n  };\n\n  const noValue: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n    id: 'noValue',\n    path: 'noValue',\n    name: 'No Value',\n    description: 'What to show when there is no value',\n\n    editor: standardEditorsRegistry.get('text').editor as any,\n    override: standardEditorsRegistry.get('text').editor as any,\n    process: stringOverrideProcessor,\n\n    settings: {\n      placeholder: '-',\n    },\n    // ??? any optionsUi with no value\n    shouldApply: () => true,\n    category,\n  };\n\n  const links: FieldConfigPropertyItem<any, DataLink[], StringFieldConfigSettings> = {\n    id: 'links',\n    path: 'links',\n    name: 'Data links',\n    editor: standardEditorsRegistry.get('links').editor as any,\n    override: standardEditorsRegistry.get('links').editor as any,\n    process: dataLinksOverrideProcessor,\n    settings: {\n      placeholder: '-',\n    },\n    shouldApply: () => true,\n    category: ['Data links'],\n    getItemsCount: value => (value ? value.length : 0),\n  };\n\n  // const color: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n  //   id: 'color',\n  //   path: 'color',\n  //   name: 'Color',\n  //   description: 'Customise color',\n  //   editor: standardEditorsRegistry.get('color').editor as any,\n  //   override: standardEditorsRegistry.get('color').editor as any,\n  //   process: identityOverrideProcessor,\n  //   settings: {\n  //     placeholder: '-',\n  //   },\n  //   shouldApply: () => true,\n  //   category: ['Color & thresholds'],\n  // };\n\n  return [unit, min, max, decimals, displayName, noValue, thresholds, mappings, links];\n};\n\n/**\n * Returns collection of standard option editors definitions\n */\nexport const getStandardOptionEditors = () => {\n  const number: StandardEditorsRegistryItem<number> = {\n    id: 'number',\n    name: 'Number',\n    description: 'Allows numeric values input',\n    editor: NumberValueEditor as any,\n  };\n\n  const text: StandardEditorsRegistryItem<string> = {\n    id: 'text',\n    name: 'Text',\n    description: 'Allows string values input',\n    editor: StringValueEditor as any,\n  };\n\n  const boolean: StandardEditorsRegistryItem<boolean> = {\n    id: 'boolean',\n    name: 'Boolean',\n    description: 'Allows boolean values input',\n    editor: props => <Switch {...props} onChange={e => props.onChange(e.currentTarget.checked)} />,\n  };\n\n  const select: StandardEditorsRegistryItem<any> = {\n    id: 'select',\n    name: 'Select',\n    description: 'Allows option selection',\n    editor: SelectValueEditor as any,\n  };\n\n  const radio: StandardEditorsRegistryItem<any> = {\n    id: 'radio',\n    name: 'Radio',\n    description: 'Allows option selection',\n    editor: props => <RadioButtonGroup {...props} options={props.item.settings?.options} />,\n  };\n\n  const unit: StandardEditorsRegistryItem<string> = {\n    id: 'unit',\n    name: 'Unit',\n    description: 'Allows unit input',\n    editor: UnitValueEditor as any,\n  };\n\n  const thresholds: StandardEditorsRegistryItem<ThresholdsConfig> = {\n    id: 'thresholds',\n    name: 'Thresholds',\n    description: 'Allows defining thresholds',\n    editor: ThresholdsValueEditor as any,\n  };\n\n  const mappings: StandardEditorsRegistryItem<ValueMapping[]> = {\n    id: 'mappings',\n    name: 'Mappings',\n    description: 'Allows defining value mappings',\n    editor: ValueMappingsValueEditor as any,\n  };\n\n  const color: StandardEditorsRegistryItem<string> = {\n    id: 'color',\n    name: 'Color',\n    description: 'Allows color selection',\n    editor: ColorValueEditor as any,\n  };\n\n  const links: StandardEditorsRegistryItem<DataLink[]> = {\n    id: 'links',\n    name: 'Links',\n    description: 'Allows defining data links',\n    editor: DataLinksValueEditor as any,\n  };\n\n  const statsPicker: StandardEditorsRegistryItem<string[]> = {\n    id: 'stats-picker',\n    name: 'Stats Picker',\n    editor: StatsPickerEditor as any,\n    description: '',\n  };\n\n  return [text, number, boolean, radio, select, unit, mappings, thresholds, links, color, statsPicker];\n};\n","var path = 'public/app/plugins/datasource/loki/partials/annotations.editor.html';\nvar html = \"<loki-annotations-query-editor expr=ctrl.annotation.expr on-change=ctrl.onQueryChange datasource=ctrl.datasource />\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { ComponentSize } from './size';\nexport type IconType = 'mono' | 'default';\nexport type IconSize = ComponentSize | 'xl' | 'xxl' | 'xxxl';\n\nexport type IconName =\n  | 'fa fa-spinner'\n  | 'grafana'\n  | 'question-circle'\n  | 'angle-up'\n  | 'history'\n  | 'angle-down'\n  | 'filter'\n  | 'angle-left'\n  | 'angle-right'\n  | 'pen'\n  | 'envelope'\n  | 'percentage'\n  | 'rocket'\n  | 'power'\n  | 'trash-alt'\n  | 'slack'\n  | 'download-alt'\n  | 'mobile-android'\n  | 'plus-square'\n  | 'folder-plus'\n  | 'folder-open'\n  | 'folder'\n  | 'file-copy-alt'\n  | 'file-alt'\n  | 'exchange-alt'\n  | 'import'\n  | 'exclamation-triangle'\n  | 'times'\n  | 'signin'\n  | 'cloud-upload'\n  | 'step-backward'\n  | 'square-shape'\n  | 'share-alt'\n  | 'tag-alt'\n  | 'forward'\n  | 'check'\n  | 'check-circle'\n  | 'copy'\n  | 'lock'\n  | 'unlock'\n  | 'panel-add'\n  | 'arrow-random'\n  | 'arrow-down'\n  | 'arrows-h'\n  | 'comment-alt'\n  | 'code-branch'\n  | 'arrow-right'\n  | 'circle'\n  | 'arrow-up'\n  | 'arrow-from-right'\n  | 'keyboard'\n  | 'search'\n  | 'chart-line'\n  | 'search-minus'\n  | 'clock-nine'\n  | 'sync'\n  | 'sign-in-alt'\n  | 'cloud-download'\n  | 'cog'\n  | 'bars'\n  | 'save'\n  | 'apps'\n  | 'link'\n  | 'upload'\n  | 'columns'\n  | 'home-alt'\n  | 'channel-add'\n  | 'calendar-alt'\n  | 'play'\n  | 'pause'\n  | 'calculator-alt'\n  | 'compass'\n  | 'sliders-v-alt'\n  | 'bell'\n  | 'database'\n  | 'user'\n  | 'camera'\n  | 'plug'\n  | 'shield'\n  | 'key-skeleton-alt'\n  | 'users-alt'\n  | 'graph-bar'\n  | 'book'\n  | 'bolt'\n  | 'comments-alt'\n  | 'document-info'\n  | 'info-circle'\n  | 'bug'\n  | 'cube'\n  | 'star'\n  | 'list-ul'\n  | 'edit'\n  | 'eye'\n  | 'eye-slash'\n  | 'monitor'\n  | 'plus-circle'\n  | 'arrow-left'\n  | 'repeat'\n  | 'external-link-alt'\n  | 'minus'\n  | 'signal'\n  | 'search-plus'\n  | 'minus-circle'\n  | 'table'\n  | 'plus'\n  | 'heart'\n  | 'heart-break'\n  | 'ellipsis-v'\n  | 'favorite'\n  | 'line-alt'\n  | 'sort-amount-down'\n  | 'cloud';\n\nexport const getAvailableIcons = (): IconName[] => [\n  'fa fa-spinner',\n  'grafana',\n  'question-circle',\n  'angle-up',\n  'history',\n  'angle-down',\n  'filter',\n  'angle-left',\n  'angle-right',\n  'pen',\n  'envelope',\n  'percentage',\n  'rocket',\n  'power',\n  'trash-alt',\n  'slack',\n  'download-alt',\n  'mobile-android',\n  'plus-square',\n  'folder-plus',\n  'folder-open',\n  'folder',\n  'file-copy-alt',\n  'file-alt',\n  'exchange-alt',\n  'import',\n  'exclamation-triangle',\n  'times',\n  'signin',\n  'cloud-upload',\n  'step-backward',\n  'square-shape',\n  'share-alt',\n  'tag-alt',\n  'forward',\n  'check',\n  'check-circle',\n  'copy',\n  'lock',\n  'unlock',\n  'panel-add',\n  'arrow-random',\n  'arrow-down',\n  'arrows-h',\n  'comment-alt',\n  'code-branch',\n  'arrow-right',\n  'circle',\n  'arrow-up',\n  'arrow-from-right',\n  'keyboard',\n  'search',\n  'chart-line',\n  'search-minus',\n  'clock-nine',\n  'sync',\n  'sign-in-alt',\n  'cloud-download',\n  'cog',\n  'bars',\n  'save',\n  'apps',\n  'link',\n  'upload',\n  'columns',\n  'home-alt',\n  'channel-add',\n  'calendar-alt',\n  'play',\n  'pause',\n  'calculator-alt',\n  'compass',\n  'sliders-v-alt',\n  'bell',\n  'database',\n  'user',\n  'camera',\n  'plug',\n  'shield',\n  'key-skeleton-alt',\n  'users-alt',\n  'graph-bar',\n  'book',\n  'bolt',\n  'comments-alt',\n  'document-info',\n  'info-circle',\n  'bug',\n  'cube',\n  'star',\n  'list-ul',\n  'edit',\n  'eye',\n  'eye-slash',\n  'monitor',\n  'plus-circle',\n  'arrow-left',\n  'repeat',\n  'external-link-alt',\n  'minus',\n  'signal',\n  'search-plus',\n  'minus-circle',\n  'table',\n  'plus',\n  'heart',\n  'heart-break',\n  'ellipsis-v',\n  'favorite',\n  'sort-amount-down',\n  'cloud',\n];\n","import React, { ButtonHTMLAttributes } from 'react';\nimport { IconButton } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface Props extends ButtonHTMLAttributes<HTMLButtonElement> {\n  surface: 'dashboard' | 'panel' | 'header';\n}\n\nexport const BackButton: React.FC<Props> = ({ surface, onClick }) => {\n  return (\n    <IconButton\n      name=\"arrow-left\"\n      tooltip=\"Go back (Esc)\"\n      tooltipPlacement=\"bottom\"\n      size=\"xxl\"\n      surface={surface}\n      aria-label={selectors.components.BackButton.backArrow}\n      onClick={onClick}\n    />\n  );\n};\n\nBackButton.displayName = 'BackButton';\n","import { clearAppNotification, notifyApp } from '../reducers/appNotification';\nimport { updateLocation } from '../reducers/location';\nimport { updateNavIndex } from '../reducers/navModel';\n\nexport { updateLocation, updateNavIndex, notifyApp, clearAppNotification };\n","import React, { PureComponent } from 'react';\nimport store from '../../store';\n\nexport interface Props<T> {\n  storageKey: string;\n  defaultValue?: T;\n  children: (value: T, onSaveToStore: (value: T) => void) => React.ReactNode;\n}\n\ninterface State<T> {\n  value: T;\n}\n\nexport class LocalStorageValueProvider<T> extends PureComponent<Props<T>, State<T>> {\n  constructor(props: Props<T>) {\n    super(props);\n\n    const { storageKey, defaultValue } = props;\n\n    this.state = {\n      value: store.getObject(storageKey, defaultValue),\n    };\n  }\n\n  onSaveToStore = (value: T) => {\n    const { storageKey } = this.props;\n    try {\n      store.setObject(storageKey, value);\n    } catch (error) {\n      console.error(error);\n    }\n    this.setState({ value });\n  };\n\n  render() {\n    const { children } = this.props;\n    const { value } = this.state;\n\n    return <>{children(value, this.onSaveToStore)}</>;\n  }\n}\n","import React from 'react';\nimport { LocalStorageValueProvider } from '../LocalStorageValueProvider';\nimport { TimeRange, isDateTime, toUtc } from '@grafana/data';\nimport { Props as TimePickerProps, TimeRangePicker } from '@grafana/ui/src/components/TimePicker/TimeRangePicker';\n\nconst LOCAL_STORAGE_KEY = 'grafana.dashboard.timepicker.history';\n\ninterface Props extends Omit<TimePickerProps, 'history' | 'theme'> {}\n\nexport const TimePickerWithHistory: React.FC<Props> = props => {\n  return (\n    <LocalStorageValueProvider<TimeRange[]> storageKey={LOCAL_STORAGE_KEY} defaultValue={[]}>\n      {(values, onSaveToStore) => {\n        return (\n          <TimeRangePicker\n            {...props}\n            history={convertIfJson(values)}\n            onChange={value => {\n              onAppendToHistory(value, values, onSaveToStore);\n              props.onChange(value);\n            }}\n          />\n        );\n      }}\n    </LocalStorageValueProvider>\n  );\n};\n\nfunction convertIfJson(history: TimeRange[]): TimeRange[] {\n  return history.map(time => {\n    if (isDateTime(time.from)) {\n      return time;\n    }\n\n    return {\n      from: toUtc(time.from),\n      to: toUtc(time.to),\n      raw: time.raw,\n    };\n  });\n}\n\nfunction onAppendToHistory(toAppend: TimeRange, values: TimeRange[], onSaveToStore: (values: TimeRange[]) => void) {\n  if (!isAbsolute(toAppend)) {\n    return;\n  }\n  const toStore = limit([toAppend, ...values]);\n  onSaveToStore(toStore);\n}\n\nfunction isAbsolute(value: TimeRange): boolean {\n  return isDateTime(value.raw.from) || isDateTime(value.raw.to);\n}\n\nfunction limit(value: TimeRange[]): TimeRange[] {\n  return value.slice(0, 4);\n}\n","/* Flot plugin for selecting regions of a plot.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\nselection: {\n\tmode: null or \"x\" or \"y\" or \"xy\",\n\tcolor: color,\n\tshape: \"round\" or \"miter\" or \"bevel\",\n\tminSize: number of pixels\n}\n\nSelection support is enabled by setting the mode to one of \"x\", \"y\" or \"xy\".\nIn \"x\" mode, the user will only be able to specify the x range, similarly for\n\"y\" mode. For \"xy\", the selection becomes a rectangle where both ranges can be\nspecified. \"color\" is color of the selection (if you need to change the color\nlater on, you can get to it with plot.getOptions().selection.color). \"shape\"\nis the shape of the corners of the selection.\n\n\"minSize\" is the minimum size a selection can be in pixels. This value can\nbe customized to determine the smallest size a selection can be and still\nhave the selection rectangle be displayed. When customizing this value, the\nfact that it refers to pixels, not axis units must be taken into account.\nThus, for example, if there is a bar graph in time mode with BarWidth set to 1\nminute, setting \"minSize\" to 1 will not make the minimum selection size 1\nminute, but rather 1 pixel. Note also that setting \"minSize\" to 0 will prevent\n\"plotunselected\" events from being fired when the user clicks the mouse without\ndragging.\n\nWhen selection support is enabled, a \"plotselected\" event will be emitted on\nthe DOM element you passed into the plot function. The event handler gets a\nparameter with the ranges selected on the axes, like this:\n\n\tplaceholder.bind( \"plotselected\", function( event, ranges ) {\n\t\talert(\"You selected \" + ranges.xaxis.from + \" to \" + ranges.xaxis.to)\n\t\t// similar for yaxis - with multiple axes, the extra ones are in\n\t\t// x2axis, x3axis, ...\n\t});\n\nThe \"plotselected\" event is only fired when the user has finished making the\nselection. A \"plotselecting\" event is fired during the process with the same\nparameters as the \"plotselected\" event, in case you want to know what's\nhappening while it's happening,\n\nA \"plotunselected\" event with no arguments is emitted when the user clicks the\nmouse to remove the selection. As stated above, setting \"minSize\" to 0 will\ndestroy this behavior.\n\nThe plugin allso adds the following methods to the plot object:\n\n- setSelection( ranges, preventEvent )\n\n  Set the selection rectangle. The passed in ranges is on the same form as\n  returned in the \"plotselected\" event. If the selection mode is \"x\", you\n  should put in either an xaxis range, if the mode is \"y\" you need to put in\n  an yaxis range and both xaxis and yaxis if the selection mode is \"xy\", like\n  this:\n\n\tsetSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });\n\n  setSelection will trigger the \"plotselected\" event when called. If you don't\n  want that to happen, e.g. if you're inside a \"plotselected\" handler, pass\n  true as the second parameter. If you are using multiple axes, you can\n  specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of\n  xaxis, the plugin picks the first one it sees.\n\n- clearSelection( preventEvent )\n\n  Clear the selection rectangle. Pass in true to avoid getting a\n  \"plotunselected\" event.\n\n- getSelection()\n\n  Returns the current selection in the same format as the \"plotselected\"\n  event. If there's currently no selection, the function returns null.\n\n*/\n\n(function ($) {\n    function init(plot) {\n        var selection = {\n                first: { x: -1, y: -1}, second: { x: -1, y: -1},\n                show: false,\n                active: false\n            };\n\n        // FIXME: The drag handling implemented here should be\n        // abstracted out, there's some similar code from a library in\n        // the navigation plugin, this should be massaged a bit to fit\n        // the Flot cases here better and reused. Doing this would\n        // make this plugin much slimmer.\n        var savedhandlers = {};\n\n        var mouseUpHandler = null;\n\n        function onMouseMove(e) {\n            if (selection.active) {\n                updateSelection(e);\n\n                plot.getPlaceholder().trigger(\"plotselecting\", [ getSelection() ]);\n            }\n        }\n\n        function onMouseDown(e) {\n            if (e.which != 1)  // only accept left-click\n                return;\n\n            // cancel out any text selections\n            document.body.focus();\n\n            // prevent text selection and drag in old-school browsers\n            if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) {\n                savedhandlers.onselectstart = document.onselectstart;\n                document.onselectstart = function () { return false; };\n            }\n            if (document.ondrag !== undefined && savedhandlers.ondrag == null) {\n                savedhandlers.ondrag = document.ondrag;\n                document.ondrag = function () { return false; };\n            }\n\n            setSelectionPos(selection.first, e);\n\n            selection.active = true;\n\n            // this is a bit silly, but we have to use a closure to be\n            // able to whack the same handler again\n            mouseUpHandler = function (e) { onMouseUp(e); };\n\n            $(document).one(\"mouseup\", mouseUpHandler);\n        }\n\n        function onMouseUp(e) {\n            mouseUpHandler = null;\n\n            // revert drag stuff for old-school browsers\n            if (document.onselectstart !== undefined)\n                document.onselectstart = savedhandlers.onselectstart;\n            if (document.ondrag !== undefined)\n                document.ondrag = savedhandlers.ondrag;\n\n            // no more dragging\n            selection.active = false;\n            updateSelection(e);\n\n            if (selectionIsSane())\n                triggerSelectedEvent(e);\n            else {\n                // this counts as a clear\n                plot.getPlaceholder().trigger(\"plotunselected\", [ ]);\n                plot.getPlaceholder().trigger(\"plotselecting\", [ null ]);\n            }\n\n            setTimeout(function() {\n              plot.isSelecting = false;\n            }, 10);\n\n            return false;\n        }\n\n        function getSelection() {\n            if (!selectionIsSane())\n                return null;\n\n            if (!selection.show) return null;\n\n            var r = {}, c1 = selection.first, c2 = selection.second;\n            var axes = plot.getAxes();\n            // look if no axis is used\n            var noAxisInUse = true;\n            $.each(axes, function (name, axis) {\n              if (axis.used) {\n                anyUsed = false;\n              }\n            })\n\n            $.each(axes, function (name, axis) {\n                if (axis.used || noAxisInUse) {\n                    var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]);\n                    r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) };\n                }\n            });\n            return r;\n        }\n\n        function triggerSelectedEvent(event) {\n            var r = getSelection();\n\n            // Add ctrlKey and metaKey to event\n            r.ctrlKey = event.ctrlKey;\n            r.metaKey = event.metaKey;\n\n            plot.getPlaceholder().trigger(\"plotselected\", [ r ]);\n\n            // backwards-compat stuff, to be removed in future\n            if (r.xaxis && r.yaxis)\n                plot.getPlaceholder().trigger(\"selected\", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]);\n        }\n\n        function clamp(min, value, max) {\n            return value < min ? min: (value > max ? max: value);\n        }\n\n        function setSelectionPos(pos, e) {\n            var o = plot.getOptions();\n            var offset = plot.getPlaceholder().offset();\n            var plotOffset = plot.getPlotOffset();\n            pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width());\n            pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height());\n\n            if (o.selection.mode == \"y\")\n                pos.x = pos == selection.first ? 0 : plot.width();\n\n            if (o.selection.mode == \"x\")\n                pos.y = pos == selection.first ? 0 : plot.height();\n        }\n\n        function updateSelection(pos) {\n            if (pos.pageX == null)\n                return;\n\n            setSelectionPos(selection.second, pos);\n            if (selectionIsSane()) {\n                plot.isSelecting = true;\n                selection.show = true;\n                plot.triggerRedrawOverlay();\n            }\n            else\n                clearSelection(true);\n        }\n\n        function clearSelection(preventEvent) {\n            if (selection.show) {\n                selection.show = false;\n                plot.triggerRedrawOverlay();\n                if (!preventEvent)\n                    plot.getPlaceholder().trigger(\"plotunselected\", [ ]);\n            }\n        }\n\n        // function taken from markings support in Flot\n        function extractRange(ranges, coord) {\n            var axis, from, to, key, axes = plot.getAxes();\n\n            for (var k in axes) {\n                axis = axes[k];\n                if (axis.direction == coord) {\n                    key = coord + axis.n + \"axis\";\n                    if (!ranges[key] && axis.n == 1)\n                        key = coord + \"axis\"; // support x1axis as xaxis\n                    if (ranges[key]) {\n                        from = ranges[key].from;\n                        to = ranges[key].to;\n                        break;\n                    }\n                }\n            }\n\n            // backwards-compat stuff - to be removed in future\n            if (!ranges[key]) {\n                axis = coord == \"x\" ? plot.getXAxes()[0] : plot.getYAxes()[0];\n                from = ranges[coord + \"1\"];\n                to = ranges[coord + \"2\"];\n            }\n\n            // auto-reverse as an added bonus\n            if (from != null && to != null && from > to) {\n                var tmp = from;\n                from = to;\n                to = tmp;\n            }\n\n            return { from: from, to: to, axis: axis };\n        }\n\n        function setSelection(ranges, preventEvent) {\n            var axis, range, o = plot.getOptions();\n\n            if (o.selection.mode == \"y\") {\n                selection.first.x = 0;\n                selection.second.x = plot.width();\n            }\n            else {\n                range = extractRange(ranges, \"x\");\n\n                selection.first.x = range.axis.p2c(range.from);\n                selection.second.x = range.axis.p2c(range.to);\n            }\n\n            if (o.selection.mode == \"x\") {\n                selection.first.y = 0;\n                selection.second.y = plot.height();\n            }\n            else {\n                range = extractRange(ranges, \"y\");\n\n                selection.first.y = range.axis.p2c(range.from);\n                selection.second.y = range.axis.p2c(range.to);\n            }\n\n            selection.show = true;\n            plot.triggerRedrawOverlay();\n            if (!preventEvent && selectionIsSane())\n                triggerSelectedEvent();\n        }\n\n        function selectionIsSane() {\n            var minSize = plot.getOptions().selection.minSize;\n            return Math.abs(selection.second.x - selection.first.x) >= minSize &&\n                Math.abs(selection.second.y - selection.first.y) >= minSize;\n        }\n\n        plot.clearSelection = clearSelection;\n        plot.setSelection = setSelection;\n        plot.getSelection = getSelection;\n\n        plot.hooks.bindEvents.push(function(plot, eventHolder) {\n            var o = plot.getOptions();\n            if (o.selection.mode != null) {\n                eventHolder.mousemove(onMouseMove);\n                eventHolder.mousedown(onMouseDown);\n            }\n        });\n\n        plot.hooks.drawOverlay.push(function (plot, ctx) {\n            // draw selection\n            if (selection.show && selectionIsSane()) {\n                var plotOffset = plot.getPlotOffset();\n                var o = plot.getOptions();\n\n                ctx.save();\n                ctx.translate(plotOffset.left, plotOffset.top);\n\n                var c = $.color.parse(o.selection.color);\n\n                ctx.strokeStyle = c.scale('a', 0.8).toString();\n                ctx.lineWidth = 1;\n                ctx.lineJoin = o.selection.shape;\n                ctx.fillStyle = c.scale('a', 0.4).toString();\n\n                var x = Math.min(selection.first.x, selection.second.x) + 0.5,\n                    y = Math.min(selection.first.y, selection.second.y) + 0.5,\n                    w = Math.abs(selection.second.x - selection.first.x) - 1,\n                    h = Math.abs(selection.second.y - selection.first.y) - 1;\n\n                ctx.fillRect(x, y, w, h);\n                ctx.strokeRect(x, y, w, h);\n\n                ctx.restore();\n            }\n        });\n\n        plot.hooks.shutdown.push(function (plot, eventHolder) {\n            eventHolder.unbind(\"mousemove\", onMouseMove);\n            eventHolder.unbind(\"mousedown\", onMouseDown);\n\n            if (mouseUpHandler) {\n                $(document).unbind(\"mouseup\", mouseUpHandler);\n                // grafana addition\n                // In L114 this plugin is overrinding document.onselectstart handler to prevent default or custom behaviour\n                // Then this patch is being restored during mouseup event. But, mouseup handler is unbound when this plugin is destroyed\n                // and the overriden onselectstart handler is not restored.  The problematic behaviour surfaces when flot is re-rendered\n                // as a consequence of panel's model update. When i.e. options are applied via onBlur\n                // event on some input which results in flot re-render. The mouseup handler should be called to resture the original handlers\n                //  but by the time the document mouseup event occurs, the event handler is no longer there, so onselectstart is permanently overriden.\n                // To fix that we are making sure that the overrides are reverted when this plugin is destroyed, the same way as they would\n                // via mouseup event handler (L138)\n\n                if (document.onselectstart !== undefined)\n                    document.onselectstart = savedhandlers.onselectstart;\n                if (document.ondrag !== undefined)\n                    document.ondrag = savedhandlers.ondrag;\n            }\n        });\n\n    }\n\n    $.plot.plugins.push({\n        init: init,\n        options: {\n            selection: {\n                mode: null, // one of null, \"x\", \"y\" or \"xy\"\n                color: \"#e8cfac\",\n                shape: \"round\", // one of \"round\", \"miter\", or \"bevel\"\n                minSize: 5 // minimum number of pixels\n            }\n        },\n        name: 'selection',\n        version: '1.1'\n    });\n})(jQuery);\n","import React, { PureComponent } from 'react';\nimport { LegacyForms, Icon } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { dashboardPermissionLevels, DashboardAcl, PermissionLevel } from 'app/types/acl';\nimport { FolderInfo } from 'app/types';\nconst { Select } = LegacyForms;\n\nconst setClassNameHelper = (inherited: boolean) => {\n  return inherited ? 'gf-form-disabled' : '';\n};\n\nfunction ItemAvatar({ item }: { item: DashboardAcl }) {\n  if (item.userAvatarUrl) {\n    return <img className=\"filter-table__avatar\" src={item.userAvatarUrl} />;\n  }\n  if (item.teamAvatarUrl) {\n    return <img className=\"filter-table__avatar\" src={item.teamAvatarUrl} />;\n  }\n  if (item.role === 'Editor') {\n    return <Icon size=\"lg\" name=\"edit\" />;\n  }\n\n  return <Icon size=\"lg\" name=\"eye\" />;\n}\n\nfunction ItemDescription({ item }: { item: DashboardAcl }) {\n  if (item.userId) {\n    return <span className=\"filter-table__weak-italic\">(User)</span>;\n  }\n  if (item.teamId) {\n    return <span className=\"filter-table__weak-italic\">(Team)</span>;\n  }\n  return <span className=\"filter-table__weak-italic\">(Role)</span>;\n}\n\ninterface Props {\n  item: DashboardAcl;\n  onRemoveItem: (item: DashboardAcl) => void;\n  onPermissionChanged: (item: DashboardAcl, level: PermissionLevel) => void;\n  folderInfo?: FolderInfo;\n}\n\nexport default class PermissionsListItem extends PureComponent<Props> {\n  onPermissionChanged = (option: SelectableValue<PermissionLevel>) => {\n    this.props.onPermissionChanged(this.props.item, option.value!);\n  };\n\n  onRemoveItem = () => {\n    this.props.onRemoveItem(this.props.item);\n  };\n\n  render() {\n    const { item, folderInfo } = this.props;\n    const inheritedFromRoot = item.dashboardId === -1 && !item.inherited;\n    const currentPermissionLevel = dashboardPermissionLevels.find(dp => dp.value === item.permission);\n\n    return (\n      <tr className={setClassNameHelper(Boolean(item?.inherited))}>\n        <td style={{ width: '1%' }}>\n          <ItemAvatar item={item} />\n        </td>\n        <td style={{ width: '90%' }}>\n          {item.name} <ItemDescription item={item} />\n        </td>\n        <td>\n          {item.inherited && folderInfo && (\n            <em className=\"muted no-wrap\">\n              Inherited from folder{' '}\n              <a className=\"text-link\" href={`${folderInfo.url}/permissions`}>\n                {folderInfo.title}\n              </a>{' '}\n            </em>\n          )}\n          {inheritedFromRoot && <em className=\"muted no-wrap\">Default Permission</em>}\n        </td>\n        <td className=\"query-keyword\">Can</td>\n        <td>\n          <div className=\"gf-form\">\n            <Select\n              isSearchable={false}\n              options={dashboardPermissionLevels}\n              onChange={this.onPermissionChanged}\n              isDisabled={item.inherited}\n              className=\"gf-form-select-box__control--menu-right\"\n              value={currentPermissionLevel}\n            />\n          </div>\n        </td>\n        <td>\n          {!item.inherited ? (\n            <a className=\"btn btn-danger btn-small\" onClick={this.onRemoveItem}>\n              <Icon name=\"times\" style={{ marginBottom: 0 }} />\n            </a>\n          ) : (\n            <button className=\"btn btn-inverse btn-small\">\n              <Icon name=\"lock\" style={{ marginBottom: '3px' }} />\n            </button>\n          )}\n        </td>\n      </tr>\n    );\n  }\n}\n","import React, { Component } from 'react';\nimport { LegacyForms, Icon } from '@grafana/ui';\nimport { dashboardPermissionLevels } from 'app/types/acl';\nconst { Select } = LegacyForms;\n\nexport interface Props {\n  item: any;\n}\n\nexport default class DisabledPermissionListItem extends Component<Props, any> {\n  render() {\n    const { item } = this.props;\n    const currentPermissionLevel = dashboardPermissionLevels.find(dp => dp.value === item.permission);\n\n    return (\n      <tr className=\"gf-form-disabled\">\n        <td style={{ width: '1%' }}>\n          <Icon size=\"lg\" name=\"shield\" />\n        </td>\n        <td style={{ width: '90%' }}>\n          {item.name}\n          <span className=\"filter-table__weak-italic\"> (Role)</span>\n        </td>\n        <td />\n        <td className=\"query-keyword\">Can</td>\n        <td>\n          <div className=\"gf-form\">\n            <Select\n              options={dashboardPermissionLevels}\n              onChange={() => {}}\n              isDisabled={true}\n              className=\"gf-form-select-box__control--menu-right\"\n              value={currentPermissionLevel}\n            />\n          </div>\n        </td>\n        <td>\n          <button className=\"btn btn-inverse btn-small\">\n            <Icon name=\"lock\" />\n          </button>\n        </td>\n      </tr>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport PermissionsListItem from './PermissionListItem';\nimport DisabledPermissionsListItem from './DisabledPermissionListItem';\nimport { FolderInfo } from 'app/types';\nimport { DashboardAcl } from 'app/types/acl';\n\nexport interface Props {\n  items: DashboardAcl[];\n  onRemoveItem: (item: DashboardAcl) => void;\n  onPermissionChanged: any;\n  isFetching: boolean;\n  folderInfo?: FolderInfo;\n}\n\nclass PermissionList extends PureComponent<Props> {\n  render() {\n    const { items, onRemoveItem, onPermissionChanged, isFetching, folderInfo } = this.props;\n\n    return (\n      <table className=\"filter-table gf-form-group\">\n        <tbody>\n          <DisabledPermissionsListItem\n            key={0}\n            item={{\n              name: 'Admin',\n              permission: 4,\n              icon: 'fa fa-fw fa-street-view',\n            }}\n          />\n          {items.map((item, idx) => {\n            return (\n              <PermissionsListItem\n                key={idx + 1}\n                item={item}\n                onRemoveItem={onRemoveItem}\n                onPermissionChanged={onPermissionChanged}\n                folderInfo={folderInfo}\n              />\n            );\n          })}\n          {isFetching === true && items.length < 1 ? (\n            <tr>\n              <td colSpan={4}>\n                <em>Loading permissions...</em>\n              </td>\n            </tr>\n          ) : null}\n\n          {isFetching === false && items.length < 1 ? (\n            <tr>\n              <td colSpan={4}>\n                <em>No permissions are set. Will only be accessible by admins.</em>\n              </td>\n            </tr>\n          ) : null}\n        </tbody>\n      </table>\n    );\n  }\n}\n\nexport default PermissionList;\n","import _ from 'lodash';\nimport { QueryPartDef, QueryPart } from 'app/core/components/query_part/query_part';\n\nconst alertQueryDef = new QueryPartDef({\n  type: 'query',\n  params: [\n    { name: 'queryRefId', type: 'string', dynamicLookup: true },\n    {\n      name: 'from',\n      type: 'string',\n      options: ['10s', '1m', '5m', '10m', '15m', '1h', '24h', '48h'],\n    },\n    { name: 'to', type: 'string', options: ['now', 'now-1m', 'now-5m', 'now-10m', 'now-1h'] },\n  ],\n  defaultParams: ['#A', '15m', 'now', 'avg'],\n});\n\nconst conditionTypes = [{ text: 'Query', value: 'query' }];\n\nconst alertStateSortScore = {\n  alerting: 1,\n  no_data: 2,\n  pending: 3,\n  ok: 4,\n  paused: 5,\n};\n\nconst evalFunctions = [\n  { text: 'IS ABOVE', value: 'gt' },\n  { text: 'IS BELOW', value: 'lt' },\n  { text: 'IS OUTSIDE RANGE', value: 'outside_range' },\n  { text: 'IS WITHIN RANGE', value: 'within_range' },\n  { text: 'HAS NO VALUE', value: 'no_value' },\n];\n\nconst evalOperators = [\n  { text: 'OR', value: 'or' },\n  { text: 'AND', value: 'and' },\n];\n\nconst reducerTypes = [\n  { text: 'avg()', value: 'avg' },\n  { text: 'min()', value: 'min' },\n  { text: 'max()', value: 'max' },\n  { text: 'sum()', value: 'sum' },\n  { text: 'count()', value: 'count' },\n  { text: 'last()', value: 'last' },\n  { text: 'median()', value: 'median' },\n  { text: 'diff()', value: 'diff' },\n  { text: 'diff_abs()', value: 'diff_abs' },\n  { text: 'percent_diff()', value: 'percent_diff' },\n  { text: 'percent_diff_abs()', value: 'percent_diff_abs' },\n  { text: 'count_non_null()', value: 'count_non_null' },\n];\n\nconst noDataModes = [\n  { text: 'Alerting', value: 'alerting' },\n  { text: 'No Data', value: 'no_data' },\n  { text: 'Keep Last State', value: 'keep_state' },\n  { text: 'Ok', value: 'ok' },\n];\n\nconst executionErrorModes = [\n  { text: 'Alerting', value: 'alerting' },\n  { text: 'Keep Last State', value: 'keep_state' },\n];\n\nfunction createReducerPart(model: any) {\n  const def = new QueryPartDef({ type: model.type, defaultParams: [] });\n  return new QueryPart(model, def);\n}\n\nfunction getStateDisplayModel(state: string) {\n  switch (state) {\n    case 'ok': {\n      return {\n        text: 'OK',\n        iconClass: 'heart',\n        stateClass: 'alert-state-ok',\n      };\n    }\n    case 'alerting': {\n      return {\n        text: 'ALERTING',\n        iconClass: 'heart-break',\n        stateClass: 'alert-state-critical',\n      };\n    }\n    case 'no_data': {\n      return {\n        text: 'NO DATA',\n        iconClass: 'question-circle',\n        stateClass: 'alert-state-warning',\n      };\n    }\n    case 'paused': {\n      return {\n        text: 'PAUSED',\n        iconClass: 'pause',\n        stateClass: 'alert-state-paused',\n      };\n    }\n    case 'pending': {\n      return {\n        text: 'PENDING',\n        iconClass: 'exclamation-triangle',\n        stateClass: 'alert-state-warning',\n      };\n    }\n    case 'unknown': {\n      return {\n        text: 'UNKNOWN',\n        iconClass: 'question-circle',\n        stateClass: 'alert-state-paused',\n      };\n    }\n  }\n\n  throw { message: 'Unknown alert state' };\n}\n\nfunction joinEvalMatches(matches: any, separator: string) {\n  return _.reduce(\n    matches,\n    (res, ev) => {\n      if (ev.metric !== undefined && ev.value !== undefined) {\n        res.push(ev.metric + '=' + ev.value);\n      }\n\n      // For backwards compatibility . Should be be able to remove this after ~2017-06-01\n      if (ev.Metric !== undefined && ev.Value !== undefined) {\n        res.push(ev.Metric + '=' + ev.Value);\n      }\n\n      return res;\n    },\n    []\n  ).join(separator);\n}\n\nfunction getAlertAnnotationInfo(ah: any) {\n  // backward compatibility, can be removed in grafana 5.x\n  // old way stored evalMatches in data property directly,\n  // new way stores it in evalMatches property on new data object\n\n  if (_.isArray(ah.data)) {\n    return joinEvalMatches(ah.data, ', ');\n  } else if (_.isArray(ah.data.evalMatches)) {\n    return joinEvalMatches(ah.data.evalMatches, ', ');\n  }\n\n  if (ah.data.error) {\n    return 'Error: ' + ah.data.error;\n  }\n\n  return '';\n}\n\nexport default {\n  alertQueryDef: alertQueryDef,\n  getStateDisplayModel: getStateDisplayModel,\n  conditionTypes: conditionTypes,\n  evalFunctions: evalFunctions,\n  evalOperators: evalOperators,\n  noDataModes: noDataModes,\n  executionErrorModes: executionErrorModes,\n  reducerTypes: reducerTypes,\n  createReducerPart: createReducerPart,\n  getAlertAnnotationInfo: getAlertAnnotationInfo,\n  alertStateSortScore: alertStateSortScore,\n};\n","/**\n * Used to initiate a remote call via the {@link BackendSrv}\n *\n * @public\n */\nexport type BackendSrvRequest = {\n  url: string;\n  /**\n   * Number of times to retry the remote call if it fails.\n   */\n  retry?: number;\n\n  /**\n   * HTTP headers that should be passed along with the remote call.\n   * Please have a look at {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API | Fetch API}\n   * for supported headers.\n   */\n  headers?: any;\n\n  /**\n   * HTTP verb to perform in the remote call GET, POST, PUT etc.\n   */\n  method?: string;\n\n  /**\n   * If set to true an alert with the response message will be displayed\n   * upon successful remote call\n   */\n  showSuccessAlert?: boolean;\n\n  /**\n   * Provided by the initiator to identify a particular remote call. An example\n   * of this is when a datasource plugin triggers a query. If the request id already\n   * exist the backendSrv will try to cancel and replace the previous call with the\n   * new one.\n   */\n  requestId?: string;\n  [key: string]: any;\n};\n\n/**\n * Used to communicate via http(s) to a remote backend such as the Grafana backend,\n * a datasource etc. The BackendSrv is using the {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API | Fetch API}\n * under the hood to handle all the communication.\n *\n * The request function can be used to perform a remote call by specifying a {@link BackendSrvRequest}.\n * To make the BackendSrv a bit easier to use we have added a couple of shorthand functions that will\n * use default values executing the request.\n *\n * @remarks\n * By default Grafana will display an error message alert if the remote call fails. If you want\n * to prevent this from happending you need to catch the error thrown by the BackendSrv and\n * set the `isHandled = true` on the incoming error.\n *\n * @public\n */\nexport interface BackendSrv {\n  get(url: string, params?: any, requestId?: string): Promise<any>;\n  delete(url: string): Promise<any>;\n  post(url: string, data?: any): Promise<any>;\n  patch(url: string, data?: any): Promise<any>;\n  put(url: string, data?: any): Promise<any>;\n  request(options: BackendSrvRequest): Promise<any>;\n\n  /**\n   * Special function used to communicate with datasources that will emit core\n   * events that the Grafana QueryInspector and QueryEditor is listening for to be able\n   * to display datasource query information. Can be skipped by adding `option.silent`\n   * when initializing the request.\n   */\n  datasourceRequest(options: BackendSrvRequest): Promise<any>;\n}\n\nlet singletonInstance: BackendSrv;\n\n/**\n * Used during startup by Grafana to set the BackendSrv so it is available\n * via the the {@link getBackendSrv} to the rest of the application.\n *\n * @internal\n */\nexport const setBackendSrv = (instance: BackendSrv) => {\n  singletonInstance = instance;\n};\n\n/**\n * Used to retrieve the {@link BackendSrv} that can be used to communicate\n * via http(s) to a remote backend such as the Grafana backend, a datasource etc.\n *\n * @public\n */\nexport const getBackendSrv = (): BackendSrv => singletonInstance;\n","/**\n * Used to enable rendering of Angular components within a\n * React component without losing proper typings.\n *\n * @example\n * ```typescript\n * class Component extends PureComponent<Props> {\n *   element: HTMLElement;\n *   angularComponent: AngularComponent;\n *\n *   componentDidMount() {\n *     const template = '<angular-component />' // angular template here;\n *     const scopeProps = { ctrl: angularController }; // angular scope properties here\n *     const loader = getAngularLoader();\n *     this.angularComponent = loader.load(this.element, scopeProps, template);\n *   }\n *\n *   componentWillUnmount() {\n *     if (this.angularComponent) {\n *       this.angularComponent.destroy();\n *     }\n *   }\n *\n *   render() {\n *     return (\n *       <div ref={element => (this.element = element)} />\n *     );\n *   }\n * }\n * ```\n *\n * @public\n */\nexport interface AngularComponent {\n  /**\n   * Should be called when the React component will unmount.\n   */\n  destroy(): void;\n  /**\n   * Can be used to trigger a re-render of the Angular component.\n   */\n  digest(): void;\n  /**\n   * Used to access the Angular scope from the React component.\n   */\n  getScope(): any;\n}\n\n/**\n * Used to load an Angular component from the context of a React component.\n * Please see the {@link AngularComponent} for a proper example.\n *\n * @public\n */\nexport interface AngularLoader {\n  /**\n   *\n   * @param elem - the element that the Angular component will be loaded into.\n   * @param scopeProps - values that will be accessed via the Angular scope.\n   * @param template  - template used by the Angular component.\n   */\n  load(elem: any, scopeProps: any, template: string): AngularComponent;\n}\n\nlet instance: AngularLoader;\n\n/**\n * Used during startup by Grafana to set the AngularLoader so it is available\n * via the the {@link getAngularLoader} to the rest of the application.\n *\n * @internal\n */\nexport function setAngularLoader(v: AngularLoader) {\n  instance = v;\n}\n\n/**\n * Used to retrieve the {@link AngularLoader} that enables the use of Angular\n * components within a React component.\n *\n * Please see the {@link AngularComponent} for a proper example.\n *\n * @public\n */\nexport function getAngularLoader(): AngularLoader {\n  return instance;\n}\n","import { ScopedVars, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data';\n\n/**\n * This is the entry point for communicating with a datasource that is added as\n * a plugin (both external and internal). Via this service you will get access\n * to the {@link @grafana/data#DataSourceApi | DataSourceApi} that have a rich API for\n * communicating with the datasource.\n *\n * @public\n */\nexport interface DataSourceSrv {\n  /**\n   * @param name - name of the datasource plugin you want to use.\n   * @param scopedVars - variables used to interpolate a templated passed as name.\n   */\n  get(name?: string, scopedVars?: ScopedVars): Promise<DataSourceApi>;\n\n  /**\n   * Returns metadata based on UID.\n   */\n  getDataSourceSettingsByUid(uid: string): DataSourceInstanceSettings | undefined;\n}\n\nlet singletonInstance: DataSourceSrv;\n\n/**\n * Used during startup by Grafana to set the DataSourceSrv so it is available\n * via the the {@link getDataSourceSrv} to the rest of the application.\n *\n * @internal\n */\nexport function setDataSourceSrv(instance: DataSourceSrv) {\n  singletonInstance = instance;\n}\n\n/**\n * Used to retrieve the {@link DataSourceSrv} that is the entry point for communicating with\n * a datasource that is added as a plugin (both external and internal).\n *\n * @public\n */\nexport function getDataSourceSrv(): DataSourceSrv {\n  return singletonInstance;\n}\n","/**\n * Passed as options to the {@link LocationSrv} to describe how the automatically navigation\n * should be performed.\n *\n * @public\n */\nimport { UrlQueryMap } from '@grafana/data';\n\nexport interface LocationUpdate {\n  /**\n   * Target path where you automatically wants to navigate the user.\n   */\n  path?: string;\n\n  /**\n   * Specify this value if you want to add values to the query string of the URL.\n   */\n  query?: UrlQueryMap;\n\n  /**\n   * If set to true, the query argument will be added to the existing URL.\n   */\n  partial?: boolean;\n\n  /**\n   * Used internally to sync the Redux state from Angular to make sure that the Redux location\n   * state is in sync when navigating using the Angular router.\n   *\n   * @remarks\n   * Do not change this unless you are the Angular router.\n   *\n   * @internal\n   */\n  routeParams?: UrlQueryMap;\n\n  /*\n   * If set to true, this will replace URL state (ie. cause no new browser history).\n   */\n  replace?: boolean;\n}\n\n/**\n * If you need to automatically navigate the user to a new place in the application this should\n * be done via the LocationSrv and it will make sure to update the application state accordingly.\n *\n * @public\n */\nexport interface LocationSrv {\n  update(options: LocationUpdate): void;\n}\n\nlet singletonInstance: LocationSrv;\n\n/**\n * Used during startup by Grafana to set the LocationSrv so it is available\n * via the the {@link getLocationSrv} to the rest of the application.\n *\n * @internal\n */\nexport function setLocationSrv(instance: LocationSrv) {\n  singletonInstance = instance;\n}\n\n/**\n * Used to retrieve the {@link LocationSrv} that can be used to automatically navigate\n * the user to a new place in Grafana.\n *\n * @public\n */\nexport function getLocationSrv(): LocationSrv {\n  return singletonInstance;\n}\n","import { VariableModel, ScopedVars } from '@grafana/data';\n\n/**\n * Via the TemplateSrv consumers get access to all the available template variables\n * that can be used within the current active dashboard.\n *\n * For a more in-depth description visit: https://grafana.com/docs/grafana/latest/reference/templating\n * @public\n */\nexport interface TemplateSrv {\n  /**\n   * List the dashboard variables\n   */\n  getVariables(): VariableModel[];\n\n  /**\n   * Replace the values within the target string.  See also {@link InterpolateFunction}\n   */\n  replace(target: string, scopedVars?: ScopedVars, format?: string | Function): string;\n}\n\nlet singletonInstance: TemplateSrv;\n\n/**\n * Used during startup by Grafana to set the TemplateSrv so it is available\n * via the the {@link getTemplateSrv} to the rest of the application.\n *\n * @internal\n */\nexport const setTemplateSrv = (instance: TemplateSrv) => {\n  singletonInstance = instance;\n};\n\n/**\n * Used to retrieve the {@link TemplateSrv} that can be used to fetch available\n * template variables.\n *\n * @public\n */\nexport const getTemplateSrv = (): TemplateSrv => singletonInstance;\n","import { auto } from 'angular';\n\nlet singleton: auto.IInjectorService;\n\n/**\n * Used during startup by Grafana to temporarily expose the angular injector to\n * pure javascript plugins using {@link getLegacyAngularInjector}.\n *\n * @internal\n */\nexport const setLegacyAngularInjector = (instance: auto.IInjectorService) => {\n  singleton = instance;\n};\n\n/**\n * WARNING: this function provides a temporary way for plugins to access anything in the\n * angular injector.  While the migration from angular to react continues, there are a few\n * options that do not yet have good alternatives.  Note that use of this function will\n * be removed in the future.\n *\n * @beta\n */\nexport const getLegacyAngularInjector = (): auto.IInjectorService => singleton;\n","export * from './backendSrv';\nexport * from './AngularLoader';\nexport * from './dataSourceSrv';\nexport * from './LocationSrv';\nexport * from './EchoSrv';\nexport * from './templateSrv';\nexport * from './legacyAngularInjector';\n","import React, { FormEvent } from 'react';\nimport { css } from 'emotion';\nimport { Tab, TabsBar, Icon, IconName } from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\nimport { NavModel, NavModelItem, NavModelBreadcrumb } from '@grafana/data';\nimport { CoreEvents } from 'app/types';\n\nexport interface Props {\n  model: NavModel;\n}\n\nconst SelectNav = ({ children, customCss }: { children: NavModelItem[]; customCss: string }) => {\n  if (!children || children.length === 0) {\n    return null;\n  }\n\n  const defaultSelectedItem = children.find(navItem => {\n    return navItem.active === true;\n  });\n\n  const gotoUrl = (evt: FormEvent) => {\n    const element = evt.target as HTMLSelectElement;\n    const url = element.options[element.selectedIndex].value;\n    appEvents.emit(CoreEvents.locationChange, { href: url });\n  };\n\n  return (\n    <div className={`gf-form-select-wrapper width-20 ${customCss}`}>\n      <label\n        className={`gf-form-select-icon ${defaultSelectedItem ? defaultSelectedItem?.icon : ''}`}\n        htmlFor=\"page-header-select-nav\"\n      />\n      {/* Label to make it clickable */}\n      <select\n        className=\"gf-select-nav gf-form-input\"\n        value={defaultSelectedItem?.url ?? ''}\n        onChange={gotoUrl}\n        id=\"page-header-select-nav\"\n      >\n        {children.map((navItem: NavModelItem) => {\n          if (navItem.hideFromTabs) {\n            // TODO: Rename hideFromTabs => hideFromNav\n            return null;\n          }\n          return (\n            <option key={navItem.url} value={navItem.url}>\n              {navItem.text}\n            </option>\n          );\n        })}\n      </select>\n    </div>\n  );\n};\n\nconst Navigation = ({ children }: { children: NavModelItem[] }) => {\n  if (!children || children.length === 0) {\n    return null;\n  }\n\n  const goToUrl = (index: number) => {\n    children.forEach((child, i) => {\n      if (i === index) {\n        appEvents.emit(CoreEvents.locationChange, { href: child.url });\n      }\n    });\n  };\n\n  return (\n    <nav>\n      <SelectNav customCss=\"page-header__select-nav\" children={children} />\n      <TabsBar className=\"page-header__tabs\" hideBorder={true}>\n        {children.map((child, index) => {\n          return (\n            !child.hideFromTabs && (\n              <Tab\n                label={child.text}\n                active={child.active}\n                key={`${child.url}-${index}`}\n                icon={child.icon as IconName}\n                onChangeTab={() => goToUrl(index)}\n              />\n            )\n          );\n        })}\n      </TabsBar>\n    </nav>\n  );\n};\n\nexport default class PageHeader extends React.Component<Props, any> {\n  constructor(props: Props) {\n    super(props);\n  }\n\n  shouldComponentUpdate() {\n    //Hack to re-render on changed props from angular with the @observer decorator\n    return true;\n  }\n\n  renderTitle(title: string, breadcrumbs: NavModelBreadcrumb[]) {\n    if (!title && (!breadcrumbs || breadcrumbs.length === 0)) {\n      return null;\n    }\n\n    if (!breadcrumbs || breadcrumbs.length === 0) {\n      return <h1 className=\"page-header__title\">{title}</h1>;\n    }\n\n    const breadcrumbsResult = [];\n    for (const bc of breadcrumbs) {\n      if (bc.url) {\n        breadcrumbsResult.push(\n          <a className=\"text-link\" key={breadcrumbsResult.length} href={bc.url}>\n            {bc.title}\n          </a>\n        );\n      } else {\n        breadcrumbsResult.push(<span key={breadcrumbsResult.length}> / {bc.title}</span>);\n      }\n    }\n    breadcrumbsResult.push(<span key={breadcrumbs.length + 1}> / {title}</span>);\n\n    return <h1 className=\"page-header__title\">{breadcrumbsResult}</h1>;\n  }\n\n  renderHeaderTitle(main: NavModelItem) {\n    const iconClassName =\n      main.icon === 'grafana'\n        ? css`\n            margin-top: 12px;\n          `\n        : css`\n            margin-top: 14px;\n          `;\n\n    return (\n      <div className=\"page-header__inner\">\n        <span className=\"page-header__logo\">\n          {main.icon && <Icon name={main.icon as IconName} size=\"xxxl\" className={iconClassName} />}\n          {main.img && <img className=\"page-header__img\" src={main.img} />}\n        </span>\n\n        <div className=\"page-header__info-block\">\n          {this.renderTitle(main.text, main.breadcrumbs ?? [])}\n          {main.subTitle && <div className=\"page-header__sub-title\">{main.subTitle}</div>}\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    const { model } = this.props;\n\n    if (!model) {\n      return null;\n    }\n\n    const main = model.main;\n    const children = main.children;\n\n    return (\n      <div className=\"page-header-canvas\">\n        <div className=\"page-container\">\n          <div className=\"page-header\">\n            {this.renderHeaderTitle(main)}\n            {children && children.length && <Navigation children={children} />}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { useState, useEffect } from 'react';\nimport { Project, Aggregations, Metrics, LabelFilter, GroupBys, Alignments, AlignmentPeriods, AliasBy } from '.';\nimport { MetricQuery, MetricDescriptor } from '../types';\nimport { getAlignmentPickerData } from '../functions';\nimport StackdriverDatasource from '../datasource';\nimport { SelectableValue } from '@grafana/data';\n\nexport interface Props {\n  refId: string;\n  usedAlignmentPeriod: string;\n  variableOptionGroup: SelectableValue<string>;\n  onChange: (query: MetricQuery) => void;\n  onRunQuery: () => void;\n  query: MetricQuery;\n  datasource: StackdriverDatasource;\n}\n\ninterface State {\n  labels: any;\n  [key: string]: any;\n}\n\nexport const defaultState: State = {\n  labels: {},\n};\n\nexport const defaultQuery: MetricQuery = {\n  projectName: '',\n  metricType: '',\n  metricKind: '',\n  valueType: '',\n  unit: '',\n  crossSeriesReducer: 'REDUCE_MEAN',\n  alignmentPeriod: 'stackdriver-auto',\n  perSeriesAligner: 'ALIGN_MEAN',\n  groupBys: [],\n  filters: [],\n  aliasBy: '',\n};\n\nfunction Editor({\n  refId,\n  query,\n  datasource,\n  onChange,\n  usedAlignmentPeriod,\n  variableOptionGroup,\n}: React.PropsWithChildren<Props>) {\n  const [state, setState] = useState<State>(defaultState);\n\n  useEffect(() => {\n    if (query && query.projectName && query.metricType) {\n      datasource\n        .getLabels(query.metricType, refId, query.projectName, query.groupBys)\n        .then(labels => setState({ ...state, labels }));\n    }\n  }, [query.projectName, query.groupBys, query.metricType]);\n\n  const onMetricTypeChange = async ({ valueType, metricKind, type, unit }: MetricDescriptor) => {\n    const { perSeriesAligner, alignOptions } = getAlignmentPickerData(\n      { valueType, metricKind, perSeriesAligner: state.perSeriesAligner },\n      datasource.templateSrv\n    );\n    setState({\n      ...state,\n      alignOptions,\n    });\n    onChange({ ...query, perSeriesAligner, metricType: type, unit, valueType, metricKind });\n  };\n\n  const { labels } = state;\n  const { perSeriesAligner, alignOptions } = getAlignmentPickerData(query, datasource.templateSrv);\n\n  return (\n    <>\n      <Project\n        templateVariableOptions={variableOptionGroup.options}\n        projectName={query.projectName}\n        datasource={datasource}\n        onChange={projectName => {\n          onChange({ ...query, projectName });\n        }}\n      />\n      <Metrics\n        templateSrv={datasource.templateSrv}\n        projectName={query.projectName}\n        metricType={query.metricType}\n        templateVariableOptions={variableOptionGroup.options}\n        datasource={datasource}\n        onChange={onMetricTypeChange}\n      >\n        {metric => (\n          <>\n            <LabelFilter\n              labels={labels}\n              filters={query.filters!}\n              onChange={filters => onChange({ ...query, filters })}\n              variableOptionGroup={variableOptionGroup}\n            />\n            <GroupBys\n              groupBys={Object.keys(labels)}\n              values={query.groupBys!}\n              onChange={groupBys => onChange({ ...query, groupBys })}\n              variableOptionGroup={variableOptionGroup}\n            />\n            <Aggregations\n              metricDescriptor={metric}\n              templateVariableOptions={variableOptionGroup.options}\n              crossSeriesReducer={query.crossSeriesReducer}\n              groupBys={query.groupBys!}\n              onChange={crossSeriesReducer => onChange({ ...query, crossSeriesReducer })}\n            >\n              {displayAdvancedOptions =>\n                displayAdvancedOptions && (\n                  <Alignments\n                    alignOptions={alignOptions}\n                    templateVariableOptions={variableOptionGroup.options}\n                    perSeriesAligner={perSeriesAligner || ''}\n                    onChange={perSeriesAligner => onChange({ ...query, perSeriesAligner })}\n                  />\n                )\n              }\n            </Aggregations>\n            <AlignmentPeriods\n              templateSrv={datasource.templateSrv}\n              templateVariableOptions={variableOptionGroup.options}\n              alignmentPeriod={query.alignmentPeriod || ''}\n              perSeriesAligner={query.perSeriesAligner || ''}\n              usedAlignmentPeriod={usedAlignmentPeriod}\n              onChange={alignmentPeriod => onChange({ ...query, alignmentPeriod })}\n            />\n            <AliasBy value={query.aliasBy || ''} onChange={aliasBy => onChange({ ...query, aliasBy })} />\n          </>\n        )}\n      </Metrics>\n    </>\n  );\n}\n\nexport const MetricQueryEditor = React.memo(Editor);\n","import { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { StyleProps } from '../Button';\nimport { focusCss } from '../../themes/mixins';\n\nexport const getFocusStyle = (theme: GrafanaTheme) => css`\n  &:focus {\n    ${focusCss(theme)}\n  }\n`;\n\nexport const sharedInputStyle = (theme: GrafanaTheme, invalid = false) => {\n  const colors = theme.colors;\n  const borderColor = invalid ? theme.palette.redBase : colors.formInputBorder;\n\n  return css`\n    background-color: ${colors.formInputBg};\n    line-height: ${theme.typography.lineHeight.md};\n    font-size: ${theme.typography.size.md};\n    color: ${colors.formInputText};\n    border: 1px solid ${borderColor};\n    padding: 0 ${theme.spacing.sm} 0 ${theme.spacing.sm};\n\n    &:-webkit-autofill,\n    &:-webkit-autofill:hover {\n      /* Welcome to 2005. This is a HACK to get rid od Chromes default autofill styling */\n      box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0), inset 0 0 0 100px ${colors.formInputBg}!important;\n      -webkit-text-fill-color: ${colors.formInputText} !important;\n    }\n\n    &:-webkit-autofill:focus {\n      /* Welcome to 2005. This is a HACK to get rid od Chromes default autofill styling */\n      box-shadow: 0 0 0 2px ${theme.colors.bodyBg}, 0 0 0px 4px ${theme.colors.formFocusOutline},\n        inset 0 0 0 1px rgba(255, 255, 255, 0), inset 0 0 0 100px ${colors.formInputBg}!important;\n      -webkit-text-fill-color: ${colors.formInputText} !important;\n    }\n\n    &:hover {\n      border-color: ${borderColor};\n    }\n\n    &:focus {\n      outline: none;\n    }\n\n    &:disabled {\n      background-color: ${colors.formInputBgDisabled};\n      color: ${colors.formInputDisabledText};\n    }\n\n    &::placeholder {\n      color: ${colors.formInputPlaceholderText};\n      opacity: 1;\n    }\n  `;\n};\n\nexport const inputSizes = () => {\n  return {\n    sm: css`\n      width: ${inputSizesPixels('sm')};\n    `,\n    md: css`\n      width: ${inputSizesPixels('md')};\n    `,\n    lg: css`\n      width: ${inputSizesPixels('lg')};\n    `,\n    auto: css`\n      width: ${inputSizesPixels('auto')};\n    `,\n  };\n};\n\nexport const inputSizesPixels = (size: string) => {\n  switch (size) {\n    case 'sm':\n      return '200px';\n    case 'md':\n      return '320px';\n    case 'lg':\n      return '580px';\n    case 'auto':\n    default:\n      return 'auto';\n  }\n};\n\nexport const getPropertiesForButtonSize = (props: StyleProps) => {\n  const { hasText, hasIcon, size } = props;\n  const { spacing, typography, height } = props.theme;\n\n  switch (size) {\n    case 'sm':\n      return {\n        padding: `0 ${spacing.sm}`,\n        fontSize: typography.size.sm,\n        height: height.sm,\n      };\n\n    case 'lg':\n      return {\n        padding: `0 ${hasText ? spacing.lg : spacing.md} 0 ${hasIcon ? spacing.md : spacing.lg}`,\n        fontSize: typography.size.lg,\n        height: height.lg,\n      };\n    case 'md':\n    default:\n      return {\n        padding: `0 ${hasText ? spacing.md : spacing.sm} 0 ${hasIcon ? spacing.sm : spacing.md}`,\n        fontSize: typography.size.md,\n        height: height.md,\n      };\n  }\n};\n","import { Observable } from 'rxjs';\nimport { QueryRunnerOptions } from 'app/features/dashboard/state/PanelQueryRunner';\nimport { DashboardQuery, SHARED_DASHBODARD_QUERY } from './types';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { LoadingState, DefaultTimeRange, DataQuery, PanelData, DataSourceApi } from '@grafana/data';\n\nexport function isSharedDashboardQuery(datasource: string | DataSourceApi) {\n  if (!datasource) {\n    // default datasource\n    return false;\n  }\n  if (datasource === SHARED_DASHBODARD_QUERY) {\n    return true;\n  }\n  const ds = datasource as DataSourceApi;\n  return ds.meta && ds.meta.name === SHARED_DASHBODARD_QUERY;\n}\n\nexport function runSharedRequest(options: QueryRunnerOptions): Observable<PanelData> {\n  return new Observable<PanelData>(subscriber => {\n    const dashboard = getDashboardSrv().getCurrent();\n    const listenToPanelId = getPanelIdFromQuery(options.queries);\n\n    if (!listenToPanelId) {\n      subscriber.next(getQueryError('Missing panel reference ID'));\n      return null;\n    }\n\n    const currentPanel = dashboard.getPanelById(options.panelId);\n    const listenToPanel = dashboard.getPanelById(listenToPanelId);\n\n    if (!listenToPanel) {\n      subscriber.next(getQueryError('Unknown Panel: ' + listenToPanelId));\n      return null;\n    }\n\n    const listenToRunner = listenToPanel.getQueryRunner();\n    const subscription = listenToRunner.getData({ withTransforms: false, withFieldConfig: false }).subscribe({\n      next: (data: PanelData) => {\n        subscriber.next(data);\n      },\n    });\n\n    // If we are in fullscreen the other panel will not execute any queries\n    // So we have to trigger it from here\n    if (currentPanel.isViewing || currentPanel.isEditing) {\n      const { datasource, targets } = listenToPanel;\n      const modified = {\n        ...options,\n        datasource,\n        panelId: listenToPanelId,\n        queries: targets,\n      };\n      listenToRunner.run(modified);\n    }\n\n    return () => {\n      console.log('runSharedRequest unsubscribe');\n      subscription.unsubscribe();\n    };\n  });\n}\n\nfunction getPanelIdFromQuery(queries: DataQuery[]): number | undefined {\n  if (!queries || !queries.length) {\n    return undefined;\n  }\n  return (queries[0] as DashboardQuery).panelId;\n}\n\nfunction getQueryError(msg: string): PanelData {\n  return {\n    state: LoadingState.Error,\n    series: [],\n    error: { message: msg },\n    timeRange: DefaultTimeRange,\n  };\n}\n","import { DataQuery } from '@grafana/data';\n\nexport const SHARED_DASHBODARD_QUERY = '-- Dashboard --';\n\nexport interface DashboardQuery extends DataQuery {\n  panelId?: number;\n}\n","// Libraries\nimport React, { PureComponent } from 'react';\n\n// Types\nimport { LegacyForms, Icon } from '@grafana/ui';\nimport { DataQuery, DataQueryError, PanelData, DataFrame, SelectableValue } from '@grafana/data';\nimport { DashboardQuery } from './types';\nimport config from 'app/core/config';\nimport { css } from 'emotion';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { SHARED_DASHBODARD_QUERY } from './types';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { filterPanelDataToQuery } from 'app/features/dashboard/panel_editor/QueryEditorRow';\nconst { Select } = LegacyForms;\n\ntype ResultInfo = {\n  img: string; // The Datasource\n  refId: string;\n  query: string; // As text\n  data: DataFrame[];\n  error?: DataQueryError;\n};\n\nfunction getQueryDisplayText(query: DataQuery): string {\n  return JSON.stringify(query);\n}\n\ninterface Props {\n  panel: PanelModel;\n  panelData: PanelData;\n  onChange: (query: DashboardQuery) => void;\n}\n\ntype State = {\n  defaultDatasource: string;\n  results: ResultInfo[];\n};\n\nexport class DashboardQueryEditor extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      defaultDatasource: '',\n      results: [],\n    };\n  }\n\n  getQuery(): DashboardQuery {\n    const { panel } = this.props;\n    return panel.targets[0] as DashboardQuery;\n  }\n\n  async componentDidMount() {\n    this.componentDidUpdate(null);\n  }\n\n  async componentDidUpdate(prevProps: Props) {\n    const { panelData } = this.props;\n\n    if (!prevProps || prevProps.panelData !== panelData) {\n      const query = this.props.panel.targets[0] as DashboardQuery;\n      const defaultDS = await getDatasourceSrv().get(null);\n      const dashboard = getDashboardSrv().getCurrent();\n      const panel = dashboard.getPanelById(query.panelId);\n\n      if (!panel) {\n        this.setState({ defaultDatasource: defaultDS.name });\n        return;\n      }\n\n      const mainDS = await getDatasourceSrv().get(panel.datasource);\n      const info: ResultInfo[] = [];\n\n      for (const query of panel.targets) {\n        const ds = query.datasource ? await getDatasourceSrv().get(query.datasource) : mainDS;\n        const fmt = ds.getQueryDisplayText ? ds.getQueryDisplayText : getQueryDisplayText;\n\n        const qData = filterPanelDataToQuery(panelData, query.refId);\n        const queryData = qData ? qData : panelData;\n\n        info.push({\n          refId: query.refId,\n          query: fmt(query),\n          img: ds.meta.info.logos.small,\n          data: queryData.series,\n          error: queryData.error,\n        });\n      }\n\n      this.setState({ defaultDatasource: defaultDS.name, results: info });\n    }\n  }\n\n  onPanelChanged = (id: number) => {\n    const { onChange } = this.props;\n    const query = this.getQuery();\n    query.panelId = id;\n    onChange(query);\n\n    // Update the\n    this.props.panel.refresh();\n  };\n\n  renderQueryData(editURL: string) {\n    const { results } = this.state;\n\n    return (\n      <div>\n        {results.map((target, index) => {\n          return (\n            <div className=\"query-editor-row__header\" key={index}>\n              <div className=\"query-editor-row__ref-id\">\n                <img src={target.img} width={16} className={css({ marginRight: '8px' })} />\n                {target.refId}:\n              </div>\n              <div className=\"query-editor-row__collapsed-text\">\n                <a href={editURL}>\n                  {target.query}\n                  &nbsp;\n                  <Icon name=\"external-link-alt\" />\n                </a>\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n\n  getPanelDescription = (panel: PanelModel): string => {\n    const { defaultDatasource } = this.state;\n    const dsname = panel.datasource ? panel.datasource : defaultDatasource;\n\n    if (panel.targets.length === 1) {\n      return '1 query to ' + dsname;\n    }\n\n    return panel.targets.length + ' queries to ' + dsname;\n  };\n\n  render() {\n    const dashboard = getDashboardSrv().getCurrent();\n    const query = this.getQuery();\n\n    let selected: SelectableValue<number>;\n    const panels: Array<SelectableValue<number>> = [];\n\n    for (const panel of dashboard.panels) {\n      const plugin = config.panels[panel.type];\n      if (!plugin) {\n        continue;\n      }\n\n      if (panel.targets && panel.datasource !== SHARED_DASHBODARD_QUERY) {\n        const item = {\n          value: panel.id,\n          label: panel.title ? panel.title : 'Panel ' + panel.id,\n          description: this.getPanelDescription(panel),\n          imgUrl: plugin.info.logos.small,\n        };\n\n        panels.push(item);\n\n        if (query.panelId === panel.id) {\n          selected = item;\n        }\n      }\n    }\n\n    if (panels.length < 1) {\n      return (\n        <div className={css({ padding: '10px' })}>\n          This dashboard does not have other panels. Add queries to other panels and try again\n        </div>\n      );\n    }\n\n    // Same as current URL, but different panelId\n    const editURL = `d/${dashboard.uid}/${dashboard.title}?&editPanel=${query.panelId}`;\n\n    return (\n      <div>\n        <div className=\"gf-form\">\n          <div className=\"gf-form-label\">Use results from panel</div>\n          <Select\n            placeholder=\"Choose Panel\"\n            isSearchable={true}\n            options={panels}\n            value={selected}\n            onChange={item => this.onPanelChanged(item.value)}\n          />\n        </div>\n        <div className={css({ padding: '16px' })}>{query.panelId && this.renderQueryData(editURL)}</div>\n      </div>\n    );\n  }\n}\n","export { isSharedDashboardQuery, runSharedRequest } from './runSharedRequest';\nexport { DashboardQueryEditor } from './DashboardQueryEditor';\nexport { SHARED_DASHBODARD_QUERY } from './types';\n","/* Pretty handling of time axes.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nSet axis.mode to \"time\" to enable. See the section \"Time series data\" in\nAPI.txt for details.\n\n*/\n\n(function($) {\n\n\tvar options = {\n\t\txaxis: {\n\t\t\ttimezone: null,\t\t// \"browser\" for local to the client or timezone for timezone-js\n\t\t\ttimeformat: null,\t// format string to use\n\t\t\ttwelveHourClock: false,\t// 12 or 24 time in time mode\n\t\t\tmonthNames: null\t// list of names of months\n\t\t}\n\t};\n\n\t// round to nearby lower multiple of base\n\n\tfunction floorInBase(n, base) {\n\t\treturn base * Math.floor(n / base);\n\t}\n\n\t// Returns a string with the date d formatted according to fmt.\n\t// A subset of the Open Group's strftime format is supported.\n\n\tfunction formatDate(d, fmt, monthNames, dayNames) {\n\n\t\tif (typeof d.strftime == \"function\") {\n\t\t\treturn d.strftime(fmt);\n\t\t}\n\n\t\tvar leftPad = function(n, pad) {\n\t\t\tn = \"\" + n;\n\t\t\tpad = \"\" + (pad == null ? \"0\" : pad);\n\t\t\treturn n.length == 1 ? pad + n : n;\n\t\t};\n\n\t\tvar r = [];\n\t\tvar escape = false;\n\t\tvar hours = d.getHours();\n\t\tvar isAM = hours < 12;\n\n\t\tif (monthNames == null) {\n\t\t\tmonthNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\t\t}\n\n\t\tif (dayNames == null) {\n\t\t\tdayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\t\t}\n\n\t\tvar hours12;\n\n\t\tif (hours > 12) {\n\t\t\thours12 = hours - 12;\n\t\t} else if (hours == 0) {\n\t\t\thours12 = 12;\n\t\t} else {\n\t\t\thours12 = hours;\n\t\t}\n\n\t\tfor (var i = 0; i < fmt.length; ++i) {\n\n\t\t\tvar c = fmt.charAt(i);\n\n\t\t\tif (escape) {\n\t\t\t\tswitch (c) {\n\t\t\t\t\tcase 'a': c = \"\" + dayNames[d.getDay()]; break;\n\t\t\t\t\tcase 'b': c = \"\" + monthNames[d.getMonth()]; break;\n\t\t\t\t\tcase 'd': c = leftPad(d.getDate(), \"\"); break;\n\t\t\t\t\tcase 'e': c = leftPad(d.getDate(), \" \"); break;\n\t\t\t\t\tcase 'h':\t// For back-compat with 0.7; remove in 1.0\n\t\t\t\t\tcase 'H': c = leftPad(hours); break;\n\t\t\t\t\tcase 'I': c = leftPad(hours12); break;\n\t\t\t\t\tcase 'l': c = leftPad(hours12, \" \"); break;\n\t\t\t\t\tcase 'm': c = leftPad(d.getMonth() + 1, \"\"); break;\n\t\t\t\t\tcase 'M': c = leftPad(d.getMinutes()); break;\n\t\t\t\t\t// quarters not in Open Group's strftime specification\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tc = \"\" + (Math.floor(d.getMonth() / 3) + 1); break;\n\t\t\t\t\tcase 'S': c = leftPad(d.getSeconds()); break;\n\t\t\t\t\tcase 'y': c = leftPad(d.getFullYear() % 100); break;\n\t\t\t\t\tcase 'Y': c = \"\" + d.getFullYear(); break;\n\t\t\t\t\tcase 'p': c = (isAM) ? (\"\" + \"am\") : (\"\" + \"pm\"); break;\n\t\t\t\t\tcase 'P': c = (isAM) ? (\"\" + \"AM\") : (\"\" + \"PM\"); break;\n\t\t\t\t\tcase 'w': c = \"\" + d.getDay(); break;\n\t\t\t\t}\n\t\t\t\tr.push(c);\n\t\t\t\tescape = false;\n\t\t\t} else {\n\t\t\t\tif (c == \"%\") {\n\t\t\t\t\tescape = true;\n\t\t\t\t} else {\n\t\t\t\t\tr.push(c);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn r.join(\"\");\n\t}\n\n\t// To have a consistent view of time-based data independent of which time\n\t// zone the client happens to be in we need a date-like object independent\n\t// of time zones.  This is done through a wrapper that only calls the UTC\n\t// versions of the accessor methods.\n\n\tfunction makeUtcWrapper(d) {\n\n\t\tfunction addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {\n\t\t\tsourceObj[sourceMethod] = function() {\n\t\t\t\treturn targetObj[targetMethod].apply(targetObj, arguments);\n\t\t\t};\n\t\t};\n\n\t\tvar utc = {\n\t\t\tdate: d\n\t\t};\n\n\t\t// support strftime, if found\n\n\t\tif (d.strftime != undefined) {\n\t\t\taddProxyMethod(utc, \"strftime\", d, \"strftime\");\n\t\t}\n\n\t\taddProxyMethod(utc, \"getTime\", d, \"getTime\");\n\t\taddProxyMethod(utc, \"setTime\", d, \"setTime\");\n\n\t\tvar props = [\"Date\", \"Day\", \"FullYear\", \"Hours\", \"Milliseconds\", \"Minutes\", \"Month\", \"Seconds\"];\n\n\t\tfor (var p = 0; p < props.length; p++) {\n\t\t\taddProxyMethod(utc, \"get\" + props[p], d, \"getUTC\" + props[p]);\n\t\t\taddProxyMethod(utc, \"set\" + props[p], d, \"setUTC\" + props[p]);\n\t\t}\n\n\t\treturn utc;\n\t};\n\n\t// select time zone strategy.  This returns a date-like object tied to the\n\t// desired timezone\n\n\tfunction dateGenerator(ts, opts) {\n\t\tif (opts.timezone == \"browser\") {\n\t\t\treturn new Date(ts);\n\t\t} else if (!opts.timezone || opts.timezone == \"utc\") {\n\t\t\treturn makeUtcWrapper(new Date(ts));\n\t\t} else if (typeof timezoneJS != \"undefined\" && typeof timezoneJS.Date != \"undefined\") {\n\t\t\tvar d = new timezoneJS.Date();\n\t\t\t// timezone-js is fickle, so be sure to set the time zone before\n\t\t\t// setting the time.\n\t\t\td.setTimezone(opts.timezone);\n\t\t\td.setTime(ts);\n\t\t\treturn d;\n\t\t} else {\n\t\t\treturn makeUtcWrapper(new Date(ts));\n\t\t}\n\t}\n\n\t// map of app. size of time units in milliseconds\n\n\tvar timeUnitSize = {\n\t\t\"second\": 1000,\n\t\t\"minute\": 60 * 1000,\n\t\t\"hour\": 60 * 60 * 1000,\n\t\t\"day\": 24 * 60 * 60 * 1000,\n\t\t\"month\": 30 * 24 * 60 * 60 * 1000,\n\t\t\"quarter\": 3 * 30 * 24 * 60 * 60 * 1000,\n\t\t\"year\": 365.2425 * 24 * 60 * 60 * 1000\n\t};\n\n\t// the allowed tick sizes, after 1 year we use\n\t// an integer algorithm\n\n\tvar baseSpec = [\n\t\t[1, \"second\"], [2, \"second\"], [5, \"second\"], [10, \"second\"],\n\t\t[30, \"second\"],\n\t\t[1, \"minute\"], [2, \"minute\"], [5, \"minute\"], [10, \"minute\"],\n\t\t[30, \"minute\"],\n\t\t[1, \"hour\"], [2, \"hour\"], [4, \"hour\"],\n\t\t[8, \"hour\"], [12, \"hour\"],\n\t\t[1, \"day\"], [2, \"day\"], [3, \"day\"],\n\t\t[0.25, \"month\"], [0.5, \"month\"], [1, \"month\"],\n\t\t[2, \"month\"]\n\t];\n\n\t// we don't know which variant(s) we'll need yet, but generating both is\n\t// cheap\n\n\tvar specMonths = baseSpec.concat([[3, \"month\"], [6, \"month\"],\n\t\t[1, \"year\"]]);\n\tvar specQuarters = baseSpec.concat([[1, \"quarter\"], [2, \"quarter\"],\n\t\t[1, \"year\"]]);\n\n\tfunction init(plot) {\n\t\tplot.hooks.processOptions.push(function (plot, options) {\n\t\t\t$.each(plot.getAxes(), function(axisName, axis) {\n\n\t\t\t\tvar opts = axis.options;\n\n\t\t\t\tif (opts.mode == \"time\") {\n\t\t\t\t\taxis.tickGenerator = function(axis) {\n\n\t\t\t\t\t\tvar ticks = [];\n\t\t\t\t\t\tvar d = dateGenerator(axis.min, opts);\n\t\t\t\t\t\tvar minSize = 0;\n\n\t\t\t\t\t\t// make quarter use a possibility if quarters are\n\t\t\t\t\t\t// mentioned in either of these options\n\n\t\t\t\t\t\tvar spec = (opts.tickSize && opts.tickSize[1] ===\n\t\t\t\t\t\t\t\"quarter\") ||\n\t\t\t\t\t\t\t(opts.minTickSize && opts.minTickSize[1] ===\n\t\t\t\t\t\t\t\"quarter\") ? specQuarters : specMonths;\n\n\t\t\t\t\t\tif (opts.minTickSize != null) {\n\t\t\t\t\t\t\tif (typeof opts.tickSize == \"number\") {\n\t\t\t\t\t\t\t\tminSize = opts.tickSize;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tminSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (var i = 0; i < spec.length - 1; ++i) {\n\t\t\t\t\t\t\tif (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]\n\t\t\t\t\t\t\t\t\t\t\t  + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2\n\t\t\t\t\t\t\t\t&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = spec[i][0];\n\t\t\t\t\t\tvar unit = spec[i][1];\n\n\t\t\t\t\t\t// special-case the possibility of several years\n\n\t\t\t\t\t\tif (unit == \"year\") {\n\n\t\t\t\t\t\t\t// if given a minTickSize in years, just use it,\n\t\t\t\t\t\t\t// ensuring that it's an integer\n\n\t\t\t\t\t\t\tif (opts.minTickSize != null && opts.minTickSize[1] == \"year\") {\n\t\t\t\t\t\t\t\tsize = Math.floor(opts.minTickSize[0]);\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tvar magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));\n\t\t\t\t\t\t\t\tvar norm = (axis.delta / timeUnitSize.year) / magn;\n\n\t\t\t\t\t\t\t\tif (norm < 1.5) {\n\t\t\t\t\t\t\t\t\tsize = 1;\n\t\t\t\t\t\t\t\t} else if (norm < 3) {\n\t\t\t\t\t\t\t\t\tsize = 2;\n\t\t\t\t\t\t\t\t} else if (norm < 7.5) {\n\t\t\t\t\t\t\t\t\tsize = 5;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsize = 10;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tsize *= magn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// minimum size for years is 1\n\n\t\t\t\t\t\t\tif (size < 1) {\n\t\t\t\t\t\t\t\tsize = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taxis.tickSize = opts.tickSize || [size, unit];\n\t\t\t\t\t\tvar tickSize = axis.tickSize[0];\n\t\t\t\t\t\tunit = axis.tickSize[1];\n\n\t\t\t\t\t\tvar step = tickSize * timeUnitSize[unit];\n\n\t\t\t\t\t\tif (unit == \"second\") {\n\t\t\t\t\t\t\td.setSeconds(floorInBase(d.getSeconds(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"minute\") {\n\t\t\t\t\t\t\td.setMinutes(floorInBase(d.getMinutes(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"hour\") {\n\t\t\t\t\t\t\td.setHours(floorInBase(d.getHours(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"month\") {\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"quarter\") {\n\t\t\t\t\t\t\td.setMonth(3 * floorInBase(d.getMonth() / 3,\n\t\t\t\t\t\t\t\ttickSize));\n\t\t\t\t\t\t} else if (unit == \"year\") {\n\t\t\t\t\t\t\td.setFullYear(floorInBase(d.getFullYear(), tickSize));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// reset smaller components\n\n\t\t\t\t\t\td.setMilliseconds(0);\n\n\t\t\t\t\t\tif (step >= timeUnitSize.minute) {\n\t\t\t\t\t\t\td.setSeconds(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.hour) {\n\t\t\t\t\t\t\td.setMinutes(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.day) {\n\t\t\t\t\t\t\td.setHours(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.day * 4) {\n\t\t\t\t\t\t\td.setDate(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.month * 2) {\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), 3));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.quarter * 2) {\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), 6));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.year) {\n\t\t\t\t\t\t\td.setMonth(0);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar carry = 0;\n\t\t\t\t\t\tvar v = Number.NaN;\n\t\t\t\t\t\tvar prev;\n\n\t\t\t\t\t\tdo {\n\n\t\t\t\t\t\t\tprev = v;\n\t\t\t\t\t\t\tv = d.getTime();\n\t\t\t\t\t\t\tticks.push(v);\n\n\t\t\t\t\t\t\tif (unit == \"month\" || unit == \"quarter\") {\n\t\t\t\t\t\t\t\tif (tickSize < 1) {\n\n\t\t\t\t\t\t\t\t\t// a bit complicated - we'll divide the\n\t\t\t\t\t\t\t\t\t// month/quarter up but we need to take\n\t\t\t\t\t\t\t\t\t// care of fractions so we don't end up in\n\t\t\t\t\t\t\t\t\t// the middle of a day\n\n\t\t\t\t\t\t\t\t\td.setDate(1);\n\t\t\t\t\t\t\t\t\tvar start = d.getTime();\n\t\t\t\t\t\t\t\t\td.setMonth(d.getMonth() +\n\t\t\t\t\t\t\t\t\t\t(unit == \"quarter\" ? 3 : 1));\n\t\t\t\t\t\t\t\t\tvar end = d.getTime();\n\t\t\t\t\t\t\t\t\td.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\n\t\t\t\t\t\t\t\t\tcarry = d.getHours();\n\t\t\t\t\t\t\t\t\td.setHours(0);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\td.setMonth(d.getMonth() +\n\t\t\t\t\t\t\t\t\t\ttickSize * (unit == \"quarter\" ? 3 : 1));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (unit == \"year\") {\n\t\t\t\t\t\t\t\td.setFullYear(d.getFullYear() + tickSize);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\td.setTime(v + step);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} while (v < axis.max && v != prev);\n\n\t\t\t\t\t\treturn ticks;\n\t\t\t\t\t};\n\n\t\t\t\t\taxis.tickFormatter = function (v, axis) {\n\n\t\t\t\t\t\tvar d = dateGenerator(v, axis.options);\n\n\t\t\t\t\t\t// first check global format\n\n\t\t\t\t\t\tif (opts.timeformat != null) {\n\t\t\t\t\t\t\treturn formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// possibly use quarters if quarters are mentioned in\n\t\t\t\t\t\t// any of these places\n\n\t\t\t\t\t\tvar useQuarters = (axis.options.tickSize &&\n\t\t\t\t\t\t\t\taxis.options.tickSize[1] == \"quarter\") ||\n\t\t\t\t\t\t\t(axis.options.minTickSize &&\n\t\t\t\t\t\t\t\taxis.options.minTickSize[1] == \"quarter\");\n\n\t\t\t\t\t\tvar t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\n\t\t\t\t\t\tvar span = axis.max - axis.min;\n\t\t\t\t\t\tvar suffix = (opts.twelveHourClock) ? \" %p\" : \"\";\n\t\t\t\t\t\tvar hourCode = (opts.twelveHourClock) ? \"%I\" : \"%H\";\n\t\t\t\t\t\tvar fmt;\n\n\t\t\t\t\t\tif (t < timeUnitSize.minute) {\n\t\t\t\t\t\t\tfmt = hourCode + \":%M:%S\" + suffix;\n\t\t\t\t\t\t} else if (t < timeUnitSize.day) {\n\t\t\t\t\t\t\tif (span < 2 * timeUnitSize.day) {\n\t\t\t\t\t\t\t\tfmt = hourCode + \":%M\" + suffix;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfmt = \"%b %d \" + hourCode + \":%M\" + suffix;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (t < timeUnitSize.month) {\n\t\t\t\t\t\t\tfmt = \"%b %d\";\n\t\t\t\t\t\t} else if ((useQuarters && t < timeUnitSize.quarter) ||\n\t\t\t\t\t\t\t(!useQuarters && t < timeUnitSize.year)) {\n\t\t\t\t\t\t\tif (span < timeUnitSize.year) {\n\t\t\t\t\t\t\t\tfmt = \"%b\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfmt = \"%b %Y\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (useQuarters && t < timeUnitSize.year) {\n\t\t\t\t\t\t\tif (span < timeUnitSize.year) {\n\t\t\t\t\t\t\t\tfmt = \"Q%q\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfmt = \"Q%q %Y\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfmt = \"%Y\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);\n\n\t\t\t\t\t\treturn rt;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t$.plot.plugins.push({\n\t\tinit: init,\n\t\toptions: options,\n\t\tname: 'time',\n\t\tversion: '1.0'\n\t});\n\n\t// Time-axis support used to be in Flot core, which exposed the\n\t// formatDate function on the plot object.  Various plugins depend\n\t// on the function, so we need to re-expose it here.\n\n\t$.plot.formatDate = formatDate;\n\n})(jQuery);\n","var path = 'public/app/features/playlist/partials/playlist_search.html';\nvar html = \"<div class=playlist-search-field-wrapper>\\n  <span style=position:relative>\\n    <input type=text placeholder=\\\"Search dashboards by name\\\" tabindex=1 ng-keydown=ctrl.keyDown($event) ng-model=ctrl.query.query ng-model-options=\\\"{ debounce: 500 }\\\" spellcheck=false ng-change=ctrl.searchDashboards() />\\n    <div class=playlist-search-switches>\\n      <icon name=\\\"'filter'\\\"></icon>\\n      <a class=pointer href=\\\"javascript:void 0;\\\" ng-click=ctrl.showStarred() tabindex=2>\\n        <icon name=\\\"'times'\\\" ng-show=ctrl.query.starred></icon>\\n        starred\\n      </a>\\n      |\\n      <a class=pointer href=\\\"javascript:void 0;\\\" ng-click=ctrl.getTags() tabindex=3>\\n        <icon name=\\\"'times'\\\" ng-show=ctrl.tagsMode></icon>\\n        tags\\n      </a>\\n      <span ng-if=ctrl.query.tag.length>\\n        |\\n        <span ng-repeat=\\\"tagName in ctrl.query.tag\\\">\\n          <a ng-click=\\\"ctrl.removeTag(tagName, $event)\\\" tag-color-from-name=ctrl.tagName class=\\\"label label-tag\\\">\\n            <icon name=\\\"'times'\\\"></icon>\\n            {{tagName}}\\n          </a>\\n        </span>\\n      </span>\\n    </div>\\n  </span>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { createRef } from 'react';\nimport * as PopperJS from 'popper.js';\nimport { Popover } from './Popover';\nimport { PopoverController, UsingPopperProps } from './PopoverController';\n\nexport interface TooltipProps extends UsingPopperProps {\n  theme?: 'info' | 'error';\n}\n\nexport interface PopoverContentProps {\n  updatePopperPosition?: () => void;\n}\n\nexport type PopoverContent = string | React.ReactElement<any> | ((props: PopoverContentProps) => JSX.Element);\n\nexport const Tooltip = ({ children, theme, ...controllerProps }: TooltipProps) => {\n  const tooltipTriggerRef = createRef<PopperJS.ReferenceObject>();\n  const popperBackgroundClassName = 'popper__background' + (theme ? ' popper__background--' + theme : '');\n\n  return (\n    <PopoverController {...controllerProps}>\n      {(showPopper, hidePopper, popperProps) => {\n        {\n          /* Override internal 'show' state if passed in as prop */\n        }\n        const payloadProps = {\n          ...popperProps,\n          show: controllerProps.show !== undefined ? controllerProps.show : popperProps.show,\n        };\n        return (\n          <>\n            {tooltipTriggerRef.current && (\n              <Popover\n                {...payloadProps}\n                onMouseEnter={showPopper}\n                onMouseLeave={hidePopper}\n                referenceElement={tooltipTriggerRef.current}\n                wrapperClassName=\"popper\"\n                className={popperBackgroundClassName}\n                renderArrow={({ arrowProps, placement }) => (\n                  <div className=\"popper__arrow\" data-placement={placement} {...arrowProps} />\n                )}\n              />\n            )}\n            {React.cloneElement(children, {\n              ref: tooltipTriggerRef,\n              onMouseEnter: showPopper,\n              onMouseLeave: hidePopper,\n            })}\n          </>\n        );\n      }}\n    </PopoverController>\n  );\n};\n","import castArray from 'lodash/castArray';\nimport { AppEvents, TimeRange, UrlQueryMap, UrlQueryValue } from '@grafana/data';\nimport angular from 'angular';\n\nimport {\n  QueryVariableModel,\n  VariableModel,\n  VariableOption,\n  VariableRefresh,\n  VariableWithMultiSupport,\n  VariableWithOptions,\n} from '../../templating/types';\nimport { StoreState, ThunkResult } from '../../../types';\nimport { getVariable, getVariables } from './selectors';\nimport { variableAdapters } from '../adapters';\nimport { Graph } from '../../../core/utils/dag';\nimport { updateLocation } from 'app/core/actions';\nimport {\n  addInitLock,\n  addVariable,\n  changeVariableProp,\n  removeInitLock,\n  resolveInitLock,\n  setCurrentVariableValue,\n} from './sharedReducer';\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from './types';\nimport { appEvents } from 'app/core/core';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport templateSrv from '../../templating/template_srv';\nimport { alignCurrentWithMulti } from '../shared/multiOptions';\nimport { isMulti } from '../guard';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DashboardModel } from 'app/features/dashboard/state';\n\n// process flow queryVariable\n// thunk => processVariables\n//    adapter => setValueFromUrl\n//      thunk => setOptionFromUrl\n//        adapter => updateOptions\n//          thunk => updateQueryVariableOptions\n//            action => updateVariableOptions\n//            action => updateVariableTags\n//            thunk => validateVariableSelectionState\n//              adapter => setValue\n//                thunk => setOptionAsCurrent\n//                  action => setCurrentVariableValue\n//                  thunk => variableUpdated\n//                    adapter => updateOptions for dependent nodes\n//        adapter => setValue\n//          thunk => setOptionAsCurrent\n//            action => setCurrentVariableValue\n//            thunk => variableUpdated\n//              adapter => updateOptions for dependent nodes\n//    adapter => updateOptions\n//      thunk => updateQueryVariableOptions\n//        action => updateVariableOptions\n//        action => updateVariableTags\n//        thunk => validateVariableSelectionState\n//          adapter => setValue\n//            thunk => setOptionAsCurrent\n//              action => setCurrentVariableValue\n//              thunk => variableUpdated\n//                adapter => updateOptions for dependent nodes\n\nexport const initDashboardTemplating = (list: VariableModel[]): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    let orderIndex = 0;\n    for (let index = 0; index < list.length; index++) {\n      const model = list[index];\n      if (!variableAdapters.getIfExists(model.type)) {\n        continue;\n      }\n\n      dispatch(addVariable(toVariablePayload(model, { global: false, index: orderIndex++, model })));\n    }\n\n    templateSrv.updateTimeRange(getTimeSrv().timeRange());\n\n    for (let index = 0; index < getVariables(getState()).length; index++) {\n      dispatch(addInitLock(toVariablePayload(getVariables(getState())[index])));\n    }\n  };\n};\n\nexport const completeDashboardTemplating = (dashboard: DashboardModel): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    templateSrv.setGlobalVariable('__dashboard', {\n      value: {\n        name: dashboard.title,\n        uid: dashboard.uid,\n        toString: function() {\n          return this.uid;\n        },\n      },\n    });\n    templateSrv.setGlobalVariable('__org', {\n      value: {\n        name: contextSrv.user.orgName,\n        id: contextSrv.user.orgId,\n        toString: function() {\n          return this.id;\n        },\n      },\n    });\n  };\n};\n\nexport const changeVariableMultiValue = (identifier: VariableIdentifier, multi: boolean): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const variable = getVariable<VariableWithMultiSupport>(identifier.id!, getState());\n    const current = alignCurrentWithMulti(variable.current, multi);\n\n    dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'multi', propValue: multi })));\n    dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'current', propValue: current })));\n  };\n};\n\nexport const processVariableDependencies = async (variable: VariableModel, state: StoreState) => {\n  let dependencies: Array<Promise<any>> = [];\n\n  for (const otherVariable of getVariables(state)) {\n    if (variable === otherVariable) {\n      continue;\n    }\n\n    if (variableAdapters.getIfExists(variable.type)) {\n      if (variableAdapters.get(variable.type).dependsOn(variable, otherVariable)) {\n        dependencies.push(otherVariable.initLock!.promise);\n      }\n    }\n  }\n\n  await Promise.all(dependencies);\n};\n\nexport const processVariable = (\n  identifier: VariableIdentifier,\n  queryParams: UrlQueryMap\n): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(identifier.id!, getState());\n    await processVariableDependencies(variable, getState());\n\n    const urlValue = queryParams['var-' + variable.name];\n    if (urlValue !== void 0) {\n      await variableAdapters.get(variable.type).setValueFromUrl(variable, urlValue ?? '');\n      dispatch(resolveInitLock(toVariablePayload(variable)));\n      return;\n    }\n\n    if (variable.hasOwnProperty('refresh')) {\n      const refreshableVariable = variable as QueryVariableModel;\n      if (\n        refreshableVariable.refresh === VariableRefresh.onDashboardLoad ||\n        refreshableVariable.refresh === VariableRefresh.onTimeRangeChanged\n      ) {\n        await variableAdapters.get(variable.type).updateOptions(refreshableVariable);\n        dispatch(resolveInitLock(toVariablePayload(variable)));\n        return;\n      }\n    }\n\n    dispatch(resolveInitLock(toVariablePayload(variable)));\n  };\n};\n\nexport const processVariables = (): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const queryParams = getState().location.query;\n    const promises = getVariables(getState()).map(\n      async (variable: VariableModel) => await dispatch(processVariable(toVariableIdentifier(variable), queryParams))\n    );\n\n    await Promise.all(promises);\n\n    for (let index = 0; index < getVariables(getState()).length; index++) {\n      dispatch(removeInitLock(toVariablePayload(getVariables(getState())[index])));\n    }\n  };\n};\n\nexport const setOptionFromUrl = (\n  identifier: VariableIdentifier,\n  urlValue: UrlQueryValue\n): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(identifier.id!, getState());\n    if (variable.hasOwnProperty('refresh') && (variable as QueryVariableModel).refresh !== VariableRefresh.never) {\n      // updates options\n      await variableAdapters.get(variable.type).updateOptions(variable);\n    }\n\n    // get variable from state\n    const variableFromState = getVariable<VariableWithOptions>(variable.id!, getState());\n    if (!variableFromState) {\n      throw new Error(`Couldn't find variable with name: ${variable.name}`);\n    }\n    // Simple case. Value in url matches existing options text or value.\n    let option = variableFromState.options.find(op => {\n      return op.text === urlValue || op.value === urlValue;\n    });\n\n    if (!option) {\n      let defaultText = urlValue as string | string[];\n      const defaultValue = urlValue as string | string[];\n\n      if (Array.isArray(urlValue)) {\n        // Multiple values in the url. We construct text as a list of texts from all matched options.\n        const urlValueArray = urlValue as string[];\n        defaultText = urlValueArray.reduce((acc: string[], item: string) => {\n          const foundOption = variableFromState.options.find(o => o.value === item);\n          if (!foundOption) {\n            // @ts-ignore according to strict null errors this can never happen\n            // TODO: investigate this further or refactor code\n            return [].concat(acc, [item]);\n          }\n\n          // @ts-ignore according to strict null errors this can never happen\n          // TODO: investigate this further or refactor code\n          return [].concat(acc, [foundOption.text]);\n        }, []);\n      }\n\n      // It is possible that we did not match the value to any existing option. In that case the url value will be\n      // used anyway for both text and value.\n      option = { text: defaultText, value: defaultValue, selected: false };\n    }\n\n    if (isMulti(variableFromState)) {\n      // In case variable is multiple choice, we cast to array to preserve the same behaviour as when selecting\n      // the option directly, which will return even single value in an array.\n      option = alignCurrentWithMulti(\n        { text: castArray(option.text), value: castArray(option.value), selected: false },\n        variableFromState.multi\n      );\n    }\n\n    await variableAdapters.get(variable.type).setValue(variableFromState, option);\n  };\n};\n\nexport const selectOptionsForCurrentValue = (variable: VariableWithOptions): VariableOption[] => {\n  let i, y, value, option;\n  const selected: VariableOption[] = [];\n\n  for (i = 0; i < variable.options.length; i++) {\n    option = { ...variable.options[i] };\n    option.selected = false;\n    if (Array.isArray(variable.current.value)) {\n      for (y = 0; y < variable.current.value.length; y++) {\n        value = variable.current.value[y];\n        if (option.value === value) {\n          option.selected = true;\n          selected.push(option);\n        }\n      }\n    } else if (option.value === variable.current.value) {\n      option.selected = true;\n      selected.push(option);\n    }\n  }\n\n  return selected;\n};\n\nexport const validateVariableSelectionState = (\n  identifier: VariableIdentifier,\n  defaultValue?: string\n): ThunkResult<Promise<void>> => {\n  return (dispatch, getState) => {\n    const variableInState = getVariable<VariableWithOptions>(identifier.id!, getState());\n    const current = variableInState.current || (({} as unknown) as VariableOption);\n    const setValue = variableAdapters.get(variableInState.type).setValue;\n\n    if (Array.isArray(current.value)) {\n      const selected = selectOptionsForCurrentValue(variableInState);\n\n      // if none pick first\n      if (selected.length === 0) {\n        const option = variableInState.options[0];\n        return setValue(variableInState, option);\n      }\n\n      const option: VariableOption = {\n        value: selected.map(v => v.value) as string[],\n        text: selected.map(v => v.text) as string[],\n        selected: true,\n      };\n      return setValue(variableInState, option);\n    }\n\n    let option: VariableOption | undefined | null = null;\n\n    // 1. find the current value\n    option = variableInState.options?.find(v => v.text === current.text);\n    if (option) {\n      return setValue(variableInState, option);\n    }\n\n    // 2. find the default value\n    if (defaultValue) {\n      option = variableInState.options?.find(v => v.text === defaultValue);\n      if (option) {\n        return setValue(variableInState, option);\n      }\n    }\n\n    // 3. use the first value\n    if (variableInState.options) {\n      const option = variableInState.options[0];\n      if (option) {\n        return setValue(variableInState, option);\n      }\n    }\n\n    // 4... give up\n    return Promise.resolve();\n  };\n};\n\nexport const setOptionAsCurrent = (\n  identifier: VariableIdentifier,\n  current: VariableOption,\n  emitChanges: boolean\n): ThunkResult<Promise<void>> => {\n  return dispatch => {\n    dispatch(setCurrentVariableValue(toVariablePayload(identifier, { option: current })));\n    return dispatch(variableUpdated(identifier, emitChanges));\n  };\n};\n\nconst createGraph = (variables: VariableModel[]) => {\n  const g = new Graph();\n\n  variables.forEach(v => {\n    g.createNode(v.name);\n  });\n\n  variables.forEach(v1 => {\n    variables.forEach(v2 => {\n      if (v1 === v2) {\n        return;\n      }\n\n      if (variableAdapters.get(v1.type).dependsOn(v1, v2)) {\n        g.link(v1.name, v2.name);\n      }\n    });\n  });\n\n  return g;\n};\n\nexport const variableUpdated = (\n  identifier: VariableIdentifier,\n  emitChangeEvents: boolean\n): ThunkResult<Promise<void>> => {\n  return (dispatch, getState) => {\n    // if there is a variable lock ignore cascading update because we are in a boot up scenario\n    const variable = getVariable(identifier.id!, getState());\n    if (variable.initLock) {\n      return Promise.resolve();\n    }\n\n    const variables = getVariables(getState());\n    const g = createGraph(variables);\n\n    const node = g.getNode(variable.name);\n    let promises: Array<Promise<any>> = [];\n    if (node) {\n      promises = node.getOptimizedInputEdges().map(e => {\n        const variable = variables.find(v => v.name === e.inputNode.name);\n        if (!variable) {\n          return Promise.resolve();\n        }\n        return variableAdapters.get(variable.type).updateOptions(variable);\n      });\n    }\n\n    return Promise.all(promises).then(() => {\n      if (emitChangeEvents) {\n        const dashboard = getState().dashboard.getModel();\n        dashboard?.processRepeats();\n        dispatch(updateLocation({ query: getQueryWithVariables(getState) }));\n        dashboard?.startRefresh();\n      }\n    });\n  };\n};\n\nexport interface OnTimeRangeUpdatedDependencies {\n  templateSrv: typeof templateSrv;\n  appEvents: typeof appEvents;\n}\n\nexport const onTimeRangeUpdated = (\n  timeRange: TimeRange,\n  dependencies: OnTimeRangeUpdatedDependencies = { templateSrv: templateSrv, appEvents: appEvents }\n): ThunkResult<Promise<void>> => async (dispatch, getState) => {\n  dependencies.templateSrv.updateTimeRange(timeRange);\n  const variablesThatNeedRefresh = getVariables(getState()).filter(variable => {\n    if (variable.hasOwnProperty('refresh') && variable.hasOwnProperty('options')) {\n      const variableWithRefresh = (variable as unknown) as QueryVariableModel;\n      return variableWithRefresh.refresh === VariableRefresh.onTimeRangeChanged;\n    }\n\n    return false;\n  });\n\n  const promises = variablesThatNeedRefresh.map(async (variable: VariableWithOptions) => {\n    const previousOptions = variable.options.slice();\n    await variableAdapters.get(variable.type).updateOptions(variable);\n    const updatedVariable = getVariable<VariableWithOptions>(variable.id!, getState());\n    if (angular.toJson(previousOptions) !== angular.toJson(updatedVariable.options)) {\n      const dashboard = getState().dashboard.getModel();\n      dashboard?.templateVariableValueUpdated();\n    }\n  });\n\n  try {\n    await Promise.all(promises);\n    const dashboard = getState().dashboard.getModel();\n    dashboard?.startRefresh();\n  } catch (error) {\n    console.error(error);\n    dependencies.appEvents.emit(AppEvents.alertError, ['Template variable service failed', error.message]);\n  }\n};\n\nconst getQueryWithVariables = (getState: () => StoreState): UrlQueryMap => {\n  const queryParams = getState().location.query;\n\n  const queryParamsNew = Object.keys(queryParams)\n    .filter(key => key.indexOf('var-') === -1)\n    .reduce((obj, key) => {\n      obj[key] = queryParams[key];\n      return obj;\n    }, {} as UrlQueryMap);\n\n  for (const variable of getVariables(getState())) {\n    if (variable.skipUrlSync) {\n      continue;\n    }\n\n    const adapter = variableAdapters.get(variable.type);\n    queryParamsNew['var-' + variable.name] = adapter.getValueForUrl(variable);\n  }\n\n  return queryParamsNew;\n};\n","import React, { FunctionComponent } from 'react';\nimport { Themeable } from '../../types';\nimport { ColorDefinition, getColorForTheme } from '@grafana/data';\nimport { Color } from 'csstype';\nimport upperFirst from 'lodash/upperFirst';\nimport find from 'lodash/find';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\n\ntype ColorChangeHandler = (color: ColorDefinition) => void;\n\nexport enum ColorSwatchVariant {\n  Small = 'small',\n  Large = 'large',\n}\n\ninterface ColorSwatchProps extends Themeable, React.DOMAttributes<HTMLDivElement> {\n  color: string;\n  label?: string;\n  variant?: ColorSwatchVariant;\n  isSelected?: boolean;\n}\n\nexport const ColorSwatch: FunctionComponent<ColorSwatchProps> = ({\n  color,\n  label,\n  variant = ColorSwatchVariant.Small,\n  isSelected,\n  theme,\n  ...otherProps\n}) => {\n  const isSmall = variant === ColorSwatchVariant.Small;\n  const swatchSize = isSmall ? '16px' : '32px';\n\n  const selectedSwatchBorder = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.black,\n    },\n    theme.type\n  );\n\n  const swatchStyles = {\n    width: swatchSize,\n    height: swatchSize,\n    borderRadius: '50%',\n    background: `${color}`,\n    marginRight: isSmall ? '0px' : '8px',\n    boxShadow: isSelected ? `inset 0 0 0 2px ${color}, inset 0 0 0 4px ${selectedSwatchBorder}` : 'none',\n  };\n\n  return (\n    <div\n      style={{\n        display: 'flex',\n        alignItems: 'center',\n        cursor: 'pointer',\n      }}\n      {...otherProps}\n    >\n      <div style={swatchStyles} />\n      {variant === ColorSwatchVariant.Large && <span>{label}</span>}\n    </div>\n  );\n};\n\ninterface NamedColorsGroupProps extends Themeable {\n  colors: ColorDefinition[];\n  selectedColor?: Color;\n  onColorSelect: ColorChangeHandler;\n  key?: string;\n}\n\nconst NamedColorsGroup: FunctionComponent<NamedColorsGroupProps> = ({\n  colors,\n  selectedColor,\n  onColorSelect,\n  theme,\n  ...otherProps\n}) => {\n  const primaryColor = find(colors, color => !!color.isPrimary);\n\n  return (\n    <div {...otherProps} style={{ display: 'flex', flexDirection: 'column' }}>\n      {primaryColor && (\n        <ColorSwatch\n          key={primaryColor.name}\n          isSelected={primaryColor.name === selectedColor}\n          variant={ColorSwatchVariant.Large}\n          color={getColorForTheme(primaryColor, theme.type)}\n          label={upperFirst(primaryColor.hue)}\n          onClick={() => onColorSelect(primaryColor)}\n          theme={theme}\n        />\n      )}\n      <div\n        style={{\n          display: 'flex',\n          marginTop: '8px',\n        }}\n      >\n        {colors.map(\n          color =>\n            !color.isPrimary && (\n              <div key={color.name} style={{ marginRight: '4px' }}>\n                <ColorSwatch\n                  key={color.name}\n                  isSelected={color.name === selectedColor}\n                  color={getColorForTheme(color, theme.type)}\n                  onClick={() => onColorSelect(color)}\n                  theme={theme}\n                />\n              </div>\n            )\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default NamedColorsGroup;\n","import React from 'react';\nimport { Color, getNamedColorPalette } from '@grafana/data';\nimport { Themeable } from '../../types/index';\nimport NamedColorsGroup from './NamedColorsGroup';\n\nexport interface NamedColorsPaletteProps extends Themeable {\n  color?: Color;\n  onChange: (colorName: string) => void;\n}\n\nexport const NamedColorsPalette = ({ color, onChange, theme }: NamedColorsPaletteProps) => {\n  const swatches: JSX.Element[] = [];\n  getNamedColorPalette().forEach((colors, hue) => {\n    swatches.push(\n      <NamedColorsGroup\n        key={hue}\n        theme={theme}\n        selectedColor={color}\n        colors={colors}\n        onColorSelect={color => {\n          onChange(color.name);\n        }}\n      />\n    );\n  });\n\n  return (\n    <div\n      style={{\n        display: 'grid',\n        gridTemplateColumns: 'repeat(3, 1fr)',\n        gridRowGap: '24px',\n        gridColumnGap: '24px',\n      }}\n    >\n      {swatches}\n    </div>\n  );\n};\n","import React from 'react';\nimport tinycolor from 'tinycolor2';\nimport debounce from 'lodash/debounce';\n\nimport { ColorPickerProps } from './ColorPickerPopover';\nimport { Input } from '../Forms/Legacy/Input/Input';\n\ninterface ColorInputState {\n  previousColor: string;\n  value: string;\n}\n\ninterface ColorInputProps extends ColorPickerProps {\n  style?: React.CSSProperties;\n}\n\nclass ColorInput extends React.PureComponent<ColorInputProps, ColorInputState> {\n  constructor(props: ColorInputProps) {\n    super(props);\n    this.state = {\n      previousColor: props.color,\n      value: props.color,\n    };\n\n    this.updateColor = debounce(this.updateColor, 100);\n  }\n\n  static getDerivedStateFromProps(props: ColorPickerProps, state: ColorInputState) {\n    const newColor = tinycolor(props.color);\n    if (newColor.isValid() && props.color !== state.previousColor) {\n      return {\n        ...state,\n        previousColor: props.color,\n        value: newColor.toString(),\n      };\n    }\n\n    return state;\n  }\n  updateColor = (color: string) => {\n    this.props.onChange(color);\n  };\n\n  onChange = (event: React.SyntheticEvent<HTMLInputElement>) => {\n    const newColor = tinycolor(event.currentTarget.value);\n\n    this.setState({\n      value: event.currentTarget.value,\n    });\n\n    if (newColor.isValid()) {\n      this.updateColor(newColor.toString());\n    }\n  };\n\n  onBlur = () => {\n    const newColor = tinycolor(this.state.value);\n\n    if (!newColor.isValid()) {\n      this.setState({\n        value: this.props.color,\n      });\n    }\n  };\n\n  render() {\n    const { value } = this.state;\n    return (\n      <div\n        style={{\n          display: 'flex',\n          ...this.props.style,\n        }}\n      >\n        <div\n          style={{\n            background: this.props.color,\n            width: '35px',\n            height: '35px',\n            flexGrow: 0,\n            borderRadius: '3px 0 0 3px',\n          }}\n        />\n        <div\n          style={{\n            flexGrow: 1,\n          }}\n        >\n          <Input className=\"gf-form-input\" value={value} onChange={this.onChange} onBlur={this.onBlur} />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default ColorInput;\n","import React from 'react';\nimport { Themeable } from '../../types';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\n\nexport interface SpectrumPalettePointerProps extends Themeable {\n  direction?: string;\n}\n\nconst SpectrumPalettePointer: React.FunctionComponent<SpectrumPalettePointerProps> = ({ theme, direction }) => {\n  const styles = {\n    picker: {\n      width: '16px',\n      height: '16px',\n      transform: direction === 'vertical' ? 'translate(0, -8px)' : 'translate(-8px, 0)',\n    },\n  };\n\n  const pointerColor = selectThemeVariant(\n    {\n      light: theme.palette.dark3,\n      dark: theme.palette.gray2,\n    },\n    theme.type\n  );\n\n  let pointerStyles: React.CSSProperties = {\n    position: 'absolute',\n    left: '6px',\n    width: '0',\n    height: '0',\n    borderStyle: 'solid',\n    background: 'none',\n  };\n\n  let topArrowStyles: React.CSSProperties = {\n    top: '-7px',\n    borderWidth: '6px 3px 0px 3px',\n    borderColor: `${pointerColor} transparent transparent transparent`,\n  };\n\n  let bottomArrowStyles: React.CSSProperties = {\n    bottom: '-7px',\n    borderWidth: '0px 3px 6px 3px',\n    borderColor: ` transparent transparent ${pointerColor} transparent`,\n  };\n\n  if (direction === 'vertical') {\n    pointerStyles = {\n      ...pointerStyles,\n      left: 'auto',\n    };\n    topArrowStyles = {\n      borderWidth: '3px 0px 3px 6px',\n      borderColor: `transparent transparent transparent ${pointerColor}`,\n      left: '-7px',\n      top: '7px',\n    };\n    bottomArrowStyles = {\n      borderWidth: '3px 6px 3px 0px',\n      borderColor: `transparent ${pointerColor} transparent transparent`,\n      right: '-7px',\n      top: '7px',\n    };\n  }\n\n  return (\n    <div style={styles.picker}>\n      <div\n        style={{\n          ...pointerStyles,\n          ...topArrowStyles,\n        }}\n      />\n      <div\n        style={{\n          ...pointerStyles,\n          ...bottomArrowStyles,\n        }}\n      />\n    </div>\n  );\n};\n\nexport default SpectrumPalettePointer;\n","import React from 'react';\nimport { CustomPicker, ColorResult } from 'react-color';\n\nimport { Saturation, Hue, Alpha } from 'react-color/lib/components/common';\nimport tinycolor from 'tinycolor2';\nimport ColorInput from './ColorInput';\nimport { Themeable } from '../../types';\nimport SpectrumPalettePointer, { SpectrumPalettePointerProps } from './SpectrumPalettePointer';\nimport { GrafanaTheme, getColorFromHexRgbOrName } from '@grafana/data';\n\nexport interface SpectrumPaletteProps extends Themeable {\n  color: string;\n  onChange: (color: string) => void;\n}\n\nconst renderPointer = (theme: GrafanaTheme) => (props: SpectrumPalettePointerProps) => (\n  <SpectrumPalettePointer {...props} theme={theme} />\n);\n\n// @ts-ignore\nconst SpectrumPicker = CustomPicker<Themeable>(({ rgb, hsl, onChange, theme }) => {\n  return (\n    <div\n      style={{\n        display: 'flex',\n        width: '100%',\n        flexDirection: 'column',\n      }}\n    >\n      <div\n        style={{\n          display: 'flex',\n        }}\n      >\n        <div\n          style={{\n            display: 'flex',\n            flexGrow: 1,\n            flexDirection: 'column',\n          }}\n        >\n          <div\n            style={{\n              position: 'relative',\n              height: '100px',\n              width: '100%',\n            }}\n          >\n            {/*\n      // @ts-ignore */}\n            <Saturation onChange={onChange} hsl={hsl} hsv={tinycolor(hsl).toHsv()} />\n          </div>\n          <div\n            style={{\n              width: '100%',\n              height: '16px',\n              marginTop: '16px',\n              position: 'relative',\n              background: 'white',\n            }}\n          >\n            {/*\n      // @ts-ignore */}\n            <Alpha rgb={rgb} hsl={hsl} a={rgb.a} onChange={onChange} pointer={renderPointer(theme)} />\n          </div>\n        </div>\n\n        <div\n          style={{\n            position: 'relative',\n            width: '16px',\n            height: '100px',\n            marginLeft: '16px',\n          }}\n        >\n          {/*\n        // @ts-ignore */}\n          <Hue onChange={onChange} hsl={hsl} direction=\"vertical\" pointer={renderPointer(theme)} />\n        </div>\n      </div>\n    </div>\n  );\n});\n\nconst SpectrumPalette: React.FunctionComponent<SpectrumPaletteProps> = ({ color, onChange, theme }) => {\n  return (\n    <div>\n      <SpectrumPicker\n        color={tinycolor(getColorFromHexRgbOrName(color)).toRgb()}\n        onChange={(a: ColorResult) => {\n          onChange(tinycolor(a.rgb).toString());\n        }}\n        theme={theme}\n      />\n      <ColorInput theme={theme} color={color} onChange={onChange} style={{ marginTop: '16px' }} />\n    </div>\n  );\n};\n\nexport default SpectrumPalette;\n","import React from 'react';\nimport { NamedColorsPalette } from './NamedColorsPalette';\nimport { PopoverContentProps } from '../Tooltip/Tooltip';\nimport SpectrumPalette from './SpectrumPalette';\nimport { Themeable } from '../../types/theme';\nimport { warnAboutColorPickerPropsDeprecation } from './warnAboutColorPickerPropsDeprecation';\nimport { GrafanaThemeType, getColorName, getColorFromHexRgbOrName } from '@grafana/data';\n\nexport type ColorPickerChangeHandler = (color: string) => void;\n\nexport interface ColorPickerProps extends Themeable {\n  color: string;\n  onChange: ColorPickerChangeHandler;\n\n  /**\n   * @deprecated Use onChange instead\n   */\n  onColorChange?: ColorPickerChangeHandler;\n  enableNamedColors?: boolean;\n}\n\nexport interface Props<T> extends ColorPickerProps, PopoverContentProps {\n  customPickers?: T;\n}\n\ntype PickerType = 'palette' | 'spectrum';\n\nexport interface CustomPickersDescriptor {\n  [key: string]: {\n    tabComponent: React.ComponentType<ColorPickerProps>;\n    name: string;\n  };\n}\n\ninterface State<T> {\n  activePicker: PickerType | keyof T;\n}\n\nexport class ColorPickerPopover<T extends CustomPickersDescriptor> extends React.Component<Props<T>, State<T>> {\n  constructor(props: Props<T>) {\n    super(props);\n    this.state = {\n      activePicker: 'palette',\n    };\n    warnAboutColorPickerPropsDeprecation('ColorPickerPopover', props);\n  }\n\n  getTabClassName = (tabName: PickerType | keyof T) => {\n    const { activePicker } = this.state;\n    return `ColorPickerPopover__tab ${activePicker === tabName && 'ColorPickerPopover__tab--active'}`;\n  };\n\n  handleChange = (color: any) => {\n    const { onColorChange, onChange, enableNamedColors, theme } = this.props;\n    const changeHandler = onColorChange || onChange;\n\n    if (enableNamedColors) {\n      return changeHandler(color);\n    }\n    changeHandler(getColorFromHexRgbOrName(color, theme.type));\n  };\n\n  onTabChange = (tab: PickerType | keyof T) => {\n    return () => this.setState({ activePicker: tab });\n  };\n\n  renderPicker = () => {\n    const { activePicker } = this.state;\n    const { color, theme } = this.props;\n\n    switch (activePicker) {\n      case 'spectrum':\n        return <SpectrumPalette color={color} onChange={this.handleChange} theme={theme} />;\n      case 'palette':\n        return (\n          <NamedColorsPalette color={getColorName(color, theme.type)} onChange={this.handleChange} theme={theme} />\n        );\n      default:\n        return this.renderCustomPicker(activePicker);\n    }\n  };\n\n  renderCustomPicker = (tabKey: keyof T) => {\n    const { customPickers, color, theme } = this.props;\n    if (!customPickers) {\n      return null;\n    }\n\n    return React.createElement(customPickers[tabKey].tabComponent, {\n      color,\n      theme,\n      onChange: this.handleChange,\n    });\n  };\n\n  renderCustomPickerTabs = () => {\n    const { customPickers } = this.props;\n\n    if (!customPickers) {\n      return null;\n    }\n\n    return (\n      <>\n        {Object.keys(customPickers).map(key => {\n          return (\n            <div className={this.getTabClassName(key)} onClick={this.onTabChange(key)} key={key}>\n              {customPickers[key].name}\n            </div>\n          );\n        })}\n      </>\n    );\n  };\n\n  render() {\n    const { theme } = this.props;\n    const colorPickerTheme = theme.type || GrafanaThemeType.Dark;\n    return (\n      <div className={`ColorPickerPopover ColorPickerPopover--${colorPickerTheme}`}>\n        <div className=\"ColorPickerPopover__tabs\">\n          <div className={this.getTabClassName('palette')} onClick={this.onTabChange('palette')}>\n            Colors\n          </div>\n          <div className={this.getTabClassName('spectrum')} onClick={this.onTabChange('spectrum')}>\n            Custom\n          </div>\n          {this.renderCustomPickerTabs()}\n        </div>\n\n        <div className=\"ColorPickerPopover__content\">{this.renderPicker()}</div>\n      </div>\n    );\n  }\n}\n","import { deprecationWarning } from '@grafana/data';\nimport { ColorPickerProps } from './ColorPickerPopover';\n\nexport const warnAboutColorPickerPropsDeprecation = (componentName: string, props: ColorPickerProps) => {\n  const { onColorChange } = props;\n  if (onColorChange) {\n    deprecationWarning(componentName, 'onColorChange', 'onChange');\n  }\n};\n","import React, { FC } from 'react';\nimport config from 'app/core/config';\nimport { Icon, IconName } from '@grafana/ui';\n\nexport interface FooterLink {\n  text: string;\n  icon?: string;\n  url?: string;\n  target?: string;\n}\n\nexport let getFooterLinks = (): FooterLink[] => {\n  return [\n    {\n      text: 'Documentation',\n      icon: 'document-info',\n      url: 'https://grafana.com/docs/grafana/latest/?utm_source=grafana_footer',\n      target: '_blank',\n    },\n    {\n      text: 'Support',\n      icon: 'question-circle',\n      url: 'https://grafana.com/products/enterprise/?utm_source=grafana_footer',\n      target: '_blank',\n    },\n    {\n      text: 'Community',\n      icon: 'comments-alt',\n      url: 'https://community.grafana.com/?utm_source=grafana_footer',\n      target: '_blank',\n    },\n  ];\n};\n\nexport let getVersionLinks = (): FooterLink[] => {\n  const { buildInfo, licenseInfo } = config;\n  const links: FooterLink[] = [];\n  const stateInfo = licenseInfo.stateInfo ? ` (${licenseInfo.stateInfo})` : '';\n\n  links.push({ text: `${buildInfo.edition}${stateInfo}`, url: licenseInfo.licenseUrl });\n  links.push({ text: `v${buildInfo.version} (${buildInfo.commit})` });\n\n  if (buildInfo.hasUpdate) {\n    links.push({\n      text: `New version available!`,\n      icon: 'download-alt',\n      url: 'https://grafana.com/grafana/download?utm_source=grafana_footer',\n      target: '_blank',\n    });\n  }\n\n  return links;\n};\n\nexport function setFooterLinksFn(fn: typeof getFooterLinks) {\n  getFooterLinks = fn;\n}\n\nexport function setVersionLinkFn(fn: typeof getFooterLinks) {\n  getVersionLinks = fn;\n}\n\nexport const Footer: FC = React.memo(() => {\n  const links = getFooterLinks().concat(getVersionLinks());\n\n  return (\n    <footer className=\"footer\">\n      <div className=\"text-center\">\n        <ul>\n          {links.map(link => (\n            <li key={link.text}>\n              <a href={link.url} target={link.target} rel=\"noopener\">\n                <Icon name={link.icon as IconName} /> {link.text}\n              </a>\n            </li>\n          ))}\n        </ul>\n      </div>\n    </footer>\n  );\n});\n","const TOKEN_MARK = 'prism-token';\n\nexport default TOKEN_MARK;\n","import { DateTime } from '../datetime/moment_wrapper';\n\nexport interface RawTimeRange {\n  from: DateTime | string;\n  to: DateTime | string;\n}\n\nexport interface TimeRange {\n  from: DateTime;\n  to: DateTime;\n  raw: RawTimeRange;\n}\n\nexport interface AbsoluteTimeRange {\n  from: number;\n  to: number;\n}\n\nexport interface IntervalValues {\n  interval: string; // 10s,5m\n  intervalMs: number;\n}\n\nexport type TimeZoneUtc = 'utc';\nexport type TimeZoneBrowser = 'browser';\nexport type TimeZone = TimeZoneBrowser | TimeZoneUtc | string;\n\nexport const DefaultTimeZone: TimeZone = 'browser';\n\nexport interface TimeOption {\n  from: string;\n  to: string;\n  display: string;\n  section: number;\n}\n\nexport interface TimeOptions {\n  [key: string]: TimeOption[];\n}\n\nexport type TimeFragment = string | DateTime;\n\nexport const TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nexport const DefaultTimeRange: TimeRange = {\n  from: {} as DateTime,\n  to: {} as DateTime,\n  raw: { from: '6h', to: 'now' },\n};\n","import kbn from 'app/core/utils/kbn';\nimport _ from 'lodash';\nimport { deprecationWarning, ScopedVars, textUtil, TimeRange } from '@grafana/data';\nimport { getFilteredVariables, getVariables, getVariableWithName } from '../variables/state/selectors';\nimport { getConfig } from 'app/core/config';\nimport { variableRegex } from './utils';\nimport { isAdHoc } from '../variables/guard';\nimport { VariableModel } from './types';\nimport { setTemplateSrv, TemplateSrv as BaseTemplateSrv } from '@grafana/runtime';\nimport { variableAdapters } from '../variables/adapters';\n\nfunction luceneEscape(value: string) {\n  return value.replace(/([\\!\\*\\+\\-\\=<>\\s\\&\\|\\(\\)\\[\\]\\{\\}\\^\\~\\?\\:\\\\/\"])/g, '\\\\$1');\n}\n\ninterface FieldAccessorCache {\n  [key: string]: (obj: any) => any;\n}\n\nexport interface TemplateSrvDependencies {\n  getFilteredVariables: typeof getFilteredVariables;\n  getVariables: typeof getVariables;\n  getVariableWithName: typeof getVariableWithName;\n}\n\nconst runtimeDependencies: TemplateSrvDependencies = {\n  getFilteredVariables,\n  getVariables,\n  getVariableWithName,\n};\n\nexport class TemplateSrv implements BaseTemplateSrv {\n  private _variables: any[];\n  private regex = variableRegex;\n  private index: any = {};\n  private grafanaVariables: any = {};\n  private builtIns: any = {};\n  private timeRange?: TimeRange | null = null;\n  private fieldAccessorCache: FieldAccessorCache = {};\n\n  constructor(private dependencies: TemplateSrvDependencies = runtimeDependencies) {\n    this.builtIns['__interval'] = { text: '1s', value: '1s' };\n    this.builtIns['__interval_ms'] = { text: '100', value: '100' };\n    this._variables = [];\n  }\n\n  init(variables: any, timeRange?: TimeRange) {\n    this._variables = variables;\n    this.timeRange = timeRange;\n    this.updateIndex();\n  }\n\n  getBuiltInIntervalValue() {\n    return this.builtIns.__interval.value;\n  }\n\n  /**\n   * @deprecated: this instance variable should not be used and will be removed in future releases\n   *\n   * Use getVariables function instead\n   */\n  get variables(): any[] {\n    deprecationWarning('template_srv.ts', 'variables', 'getVariables');\n    return this.getVariables();\n  }\n\n  getVariables(): VariableModel[] {\n    if (getConfig().featureToggles.newVariables) {\n      return this.dependencies.getVariables();\n    }\n\n    return this._variables;\n  }\n\n  updateIndex() {\n    const existsOrEmpty = (value: any) => value || value === '';\n\n    this.index = this._variables.reduce((acc, currentValue) => {\n      if (currentValue.current && (currentValue.current.isNone || existsOrEmpty(currentValue.current.value))) {\n        acc[currentValue.name] = currentValue;\n      }\n      return acc;\n    }, {});\n\n    if (this.timeRange) {\n      const from = this.timeRange.from.valueOf().toString();\n      const to = this.timeRange.to.valueOf().toString();\n\n      this.index = {\n        ...this.index,\n        ['__from']: {\n          current: { value: from, text: from },\n        },\n        ['__to']: {\n          current: { value: to, text: to },\n        },\n      };\n    }\n  }\n\n  updateTimeRange(timeRange: TimeRange) {\n    this.timeRange = timeRange;\n    this.updateIndex();\n  }\n\n  variableInitialized(variable: any) {\n    this.index[variable.name] = variable;\n  }\n\n  getAdhocFilters(datasourceName: string) {\n    let filters: any = [];\n\n    for (const variable of this.getAdHocVariables()) {\n      if (variable.datasource === null || variable.datasource === datasourceName) {\n        filters = filters.concat(variable.filters);\n      } else if (variable.datasource.indexOf('$') === 0) {\n        if (this.replace(variable.datasource) === datasourceName) {\n          filters = filters.concat(variable.filters);\n        }\n      }\n    }\n\n    return filters;\n  }\n\n  luceneFormat(value: any) {\n    if (typeof value === 'string') {\n      return luceneEscape(value);\n    }\n    if (value instanceof Array && value.length === 0) {\n      return '__empty__';\n    }\n    const quotedValues = _.map(value, val => {\n      return '\"' + luceneEscape(val) + '\"';\n    });\n    return '(' + quotedValues.join(' OR ') + ')';\n  }\n\n  // encode string according to RFC 3986; in contrast to encodeURIComponent()\n  // also the sub-delims \"!\", \"'\", \"(\", \")\" and \"*\" are encoded;\n  // unicode handling uses UTF-8 as in ECMA-262.\n  encodeURIComponentStrict(str: string) {\n    return encodeURIComponent(str).replace(/[!'()*]/g, c => {\n      return (\n        '%' +\n        c\n          .charCodeAt(0)\n          .toString(16)\n          .toUpperCase()\n      );\n    });\n  }\n\n  formatValue(value: any, format: any, variable: any) {\n    // for some scopedVars there is no variable\n    variable = variable || {};\n\n    if (typeof format === 'function') {\n      return format(value, variable, this.formatValue);\n    }\n\n    switch (format) {\n      case 'regex': {\n        if (typeof value === 'string') {\n          return kbn.regexEscape(value);\n        }\n\n        const escapedValues = _.map(value, kbn.regexEscape);\n        if (escapedValues.length === 1) {\n          return escapedValues[0];\n        }\n        return '(' + escapedValues.join('|') + ')';\n      }\n      case 'lucene': {\n        return this.luceneFormat(value);\n      }\n      case 'pipe': {\n        if (typeof value === 'string') {\n          return value;\n        }\n        return value.join('|');\n      }\n      case 'distributed': {\n        if (typeof value === 'string') {\n          return value;\n        }\n        return this.distributeVariable(value, variable.name);\n      }\n      case 'csv': {\n        if (_.isArray(value)) {\n          return value.join(',');\n        }\n        return value;\n      }\n      case 'html': {\n        if (_.isArray(value)) {\n          return textUtil.escapeHtml(value.join(', '));\n        }\n        return textUtil.escapeHtml(value);\n      }\n      case 'json': {\n        return JSON.stringify(value);\n      }\n      case 'percentencode': {\n        // like glob, but url escaped\n        if (_.isArray(value)) {\n          return this.encodeURIComponentStrict('{' + value.join(',') + '}');\n        }\n        return this.encodeURIComponentStrict(value);\n      }\n      case 'singlequote': {\n        // escape single quotes with backslash\n        const regExp = new RegExp(`'`, 'g');\n        if (_.isArray(value)) {\n          return _.map(value, v => `'${_.replace(v, regExp, `\\\\'`)}'`).join(',');\n        }\n        return `'${_.replace(value, regExp, `\\\\'`)}'`;\n      }\n      case 'doublequote': {\n        // escape double quotes with backslash\n        const regExp = new RegExp('\"', 'g');\n        if (_.isArray(value)) {\n          return _.map(value, v => `\"${_.replace(v, regExp, '\\\\\"')}\"`).join(',');\n        }\n        return `\"${_.replace(value, regExp, '\\\\\"')}\"`;\n      }\n      case 'sqlstring': {\n        // escape single quotes by pairing them\n        const regExp = new RegExp(`'`, 'g');\n        if (_.isArray(value)) {\n          return _.map(value, v => `'${_.replace(v, regExp, \"''\")}'`).join(',');\n        }\n        return `'${_.replace(value, regExp, \"''\")}'`;\n      }\n      default: {\n        if (_.isArray(value) && value.length > 1) {\n          return '{' + value.join(',') + '}';\n        }\n        return value;\n      }\n    }\n  }\n\n  setGrafanaVariable(name: string, value: any) {\n    this.grafanaVariables[name] = value;\n  }\n\n  setGlobalVariable(name: string, variable: any) {\n    this.index = {\n      ...this.index,\n      [name]: {\n        current: variable,\n      },\n    };\n  }\n\n  getVariableName(expression: string) {\n    this.regex.lastIndex = 0;\n    const match = this.regex.exec(expression);\n    if (!match) {\n      return null;\n    }\n    const variableName = match.slice(1).find(match => match !== undefined);\n    return variableName;\n  }\n\n  variableExists(expression: string) {\n    const name = this.getVariableName(expression);\n    return name && this.getVariableAtIndex(name) !== void 0;\n  }\n\n  highlightVariablesAsHtml(str: string) {\n    if (!str || !_.isString(str)) {\n      return str;\n    }\n\n    str = _.escape(str);\n    this.regex.lastIndex = 0;\n    return str.replace(this.regex, (match, var1, var2, fmt2, var3) => {\n      if (this.getVariableAtIndex(var1 || var2 || var3) || this.builtIns[var1 || var2 || var3]) {\n        return '<span class=\"template-variable\">' + match + '</span>';\n      }\n      return match;\n    });\n  }\n\n  getAllValue(variable: any) {\n    if (variable.allValue) {\n      return variable.allValue;\n    }\n    const values = [];\n    for (let i = 1; i < variable.options.length; i++) {\n      values.push(variable.options[i].value);\n    }\n    return values;\n  }\n\n  getFieldAccessor(fieldPath: string) {\n    const accessor = this.fieldAccessorCache[fieldPath];\n    if (accessor) {\n      return accessor;\n    }\n\n    return (this.fieldAccessorCache[fieldPath] = _.property(fieldPath));\n  }\n\n  getVariableValue(variableName: string, fieldPath: string | undefined, scopedVars: ScopedVars) {\n    const scopedVar = scopedVars[variableName];\n    if (!scopedVar) {\n      return null;\n    }\n\n    if (fieldPath) {\n      return this.getFieldAccessor(fieldPath)(scopedVar.value);\n    }\n\n    return scopedVar.value;\n  }\n\n  replace(target: string, scopedVars?: ScopedVars, format?: string | Function): string {\n    if (!target) {\n      return target;\n    }\n\n    this.regex.lastIndex = 0;\n\n    return target.replace(this.regex, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {\n      const variableName = var1 || var2 || var3;\n      const variable = this.getVariableAtIndex(variableName);\n      const fmt = fmt2 || fmt3 || format;\n\n      if (scopedVars) {\n        const value = this.getVariableValue(variableName, fieldPath, scopedVars);\n        if (value !== null && value !== undefined) {\n          return this.formatValue(value, fmt, variable);\n        }\n      }\n\n      if (!variable) {\n        return match;\n      }\n\n      const systemValue = this.grafanaVariables[variable.current.value];\n      if (systemValue) {\n        return this.formatValue(systemValue, fmt, variable);\n      }\n\n      let value = variable.current.value;\n      if (this.isAllValue(value)) {\n        value = this.getAllValue(variable);\n        // skip formatting of custom all values\n        if (variable.allValue) {\n          return this.replace(value);\n        }\n      }\n\n      if (fieldPath) {\n        const fieldValue = this.getVariableValue(variableName, fieldPath, {\n          [variableName]: { value: value, text: '' },\n        });\n        if (fieldValue !== null && fieldValue !== undefined) {\n          return this.formatValue(fieldValue, fmt, variable);\n        }\n      }\n\n      const res = this.formatValue(value, fmt, variable);\n      return res;\n    });\n  }\n\n  isAllValue(value: any) {\n    return value === '$__all' || (Array.isArray(value) && value[0] === '$__all');\n  }\n\n  replaceWithText(target: string, scopedVars?: ScopedVars) {\n    if (!target) {\n      return target;\n    }\n\n    let variable;\n    this.regex.lastIndex = 0;\n\n    return target.replace(this.regex, (match: any, var1: any, var2: any, fmt2: any, var3: any) => {\n      if (scopedVars) {\n        const option = scopedVars[var1 || var2 || var3];\n        if (option) {\n          return option.text;\n        }\n      }\n\n      variable = this.getVariableAtIndex(var1 || var2 || var3);\n      if (!variable) {\n        return match;\n      }\n\n      const value = this.grafanaVariables[variable.current.value];\n\n      return typeof value === 'string' ? value : variable.current.text;\n    });\n  }\n\n  fillVariableValuesForUrl = (params: any, scopedVars?: ScopedVars) => {\n    _.each(this.getVariables(), variable => {\n      if (scopedVars && scopedVars[variable.name] !== void 0) {\n        if (scopedVars[variable.name].skipUrlSync) {\n          return;\n        }\n        params['var-' + variable.name] = scopedVars[variable.name].value;\n      } else {\n        if (variable.skipUrlSync) {\n          return;\n        }\n        params['var-' + variable.name] = variableAdapters.get(variable.type).getValueForUrl(variable);\n      }\n    });\n  };\n\n  distributeVariable(value: any, variable: any) {\n    value = _.map(value, (val: any, index: number) => {\n      if (index !== 0) {\n        return variable + '=' + val;\n      } else {\n        return val;\n      }\n    });\n    return value.join(',');\n  }\n\n  private getVariableAtIndex = (name: string): any => {\n    if (!name) {\n      return;\n    }\n\n    if (getConfig().featureToggles.newVariables && !this.index[name]) {\n      return this.dependencies.getVariableWithName(name);\n    }\n\n    return this.index[name];\n  };\n\n  private getAdHocVariables = (): any[] => {\n    if (getConfig().featureToggles.newVariables) {\n      return this.dependencies.getFilteredVariables(isAdHoc);\n    }\n    if (Array.isArray(this._variables)) {\n      return this._variables.filter(isAdHoc);\n    }\n    return [];\n  };\n}\n\n// Expose the template srv\nconst srv = new TemplateSrv();\nsetTemplateSrv(srv);\nexport default srv;\n","import { AppEvent } from './appEvents';\n\nexport type Omit<T, K> = Pick<T, Exclude<keyof T, K>>;\nexport type Subtract<T, K> = Omit<T, keyof K>;\n\nconst typeList: Set<string> = new Set();\nexport function eventFactory<T = undefined>(name: string): AppEvent<T> {\n  if (typeList.has(name)) {\n    throw new Error(`There is already an event defined with type '${name}'`);\n  }\n\n  typeList.add(name);\n  return { name };\n}\n","import { colors } from '@grafana/ui';\nimport {\n  getFlotPairs,\n  getDisplayProcessor,\n  NullValueMode,\n  reduceField,\n  FieldType,\n  DisplayValue,\n  GraphSeriesXY,\n  getTimeField,\n  DataFrame,\n  getSeriesTimeStep,\n  TimeZone,\n  hasMsResolution,\n  MS_DATE_TIME_FORMAT,\n  DEFAULT_DATE_TIME_FORMAT,\n  FieldColor,\n  FieldColorMode,\n  FieldConfigSource,\n  getFieldDisplayName,\n} from '@grafana/data';\n\nimport { SeriesOptions, GraphOptions, GraphLegendEditorLegendOptions } from './types';\n\nexport const getGraphSeriesModel = (\n  dataFrames: DataFrame[],\n  timeZone: TimeZone,\n  seriesOptions: SeriesOptions,\n  graphOptions: GraphOptions,\n  legendOptions: GraphLegendEditorLegendOptions,\n  fieldOptions?: FieldConfigSource\n) => {\n  const graphs: GraphSeriesXY[] = [];\n\n  const displayProcessor = getDisplayProcessor({\n    field: {\n      config: {\n        unit: fieldOptions?.defaults?.unit,\n        decimals: legendOptions.decimals,\n      },\n    },\n    timeZone,\n  });\n\n  let fieldColumnIndex = -1;\n  for (const series of dataFrames) {\n    const { timeField } = getTimeField(series);\n\n    if (!timeField) {\n      continue;\n    }\n\n    for (const field of series.fields) {\n      if (field.type !== FieldType.number) {\n        continue;\n      }\n      // Storing index of series field for future inspection\n      fieldColumnIndex++;\n\n      // Use external calculator just to make sure it works :)\n      const points = getFlotPairs({\n        xField: timeField,\n        yField: field,\n        nullValueMode: NullValueMode.Null,\n      });\n\n      if (points.length > 0) {\n        const seriesStats = reduceField({ field, reducers: legendOptions.stats || [] });\n        let statsDisplayValues: DisplayValue[] = [];\n\n        if (legendOptions.stats) {\n          statsDisplayValues = legendOptions.stats.map<DisplayValue>(stat => {\n            const statDisplayValue = displayProcessor(seriesStats[stat]);\n\n            return {\n              ...statDisplayValue,\n              title: stat,\n            };\n          });\n        }\n\n        let color: FieldColor;\n        if (seriesOptions[field.name] && seriesOptions[field.name].color) {\n          // Case when panel has settings provided via SeriesOptions, i.e. graph panel\n          color = {\n            mode: FieldColorMode.Fixed,\n            fixedColor: seriesOptions[field.name].color,\n          };\n        } else if (field.config && field.config.color) {\n          // Case when color settings are set on field, i.e. Explore logs histogram (see makeSeriesForLogs)\n          color = field.config.color;\n        } else {\n          color = {\n            mode: FieldColorMode.Fixed,\n            fixedColor: colors[graphs.length % colors.length],\n          };\n        }\n\n        field.config = fieldOptions\n          ? {\n              ...field.config,\n              unit: fieldOptions.defaults.unit,\n              decimals: fieldOptions.defaults.decimals,\n              color,\n            }\n          : { ...field.config, color };\n\n        field.display = getDisplayProcessor({ field, timeZone });\n\n        // Time step is used to determine bars width when graph is rendered as bar chart\n        const timeStep = getSeriesTimeStep(timeField);\n        const useMsDateFormat = hasMsResolution(timeField);\n\n        timeField.display = getDisplayProcessor({\n          timeZone,\n          field: {\n            ...timeField,\n            type: timeField.type,\n            config: {\n              unit: `time:${useMsDateFormat ? MS_DATE_TIME_FORMAT : DEFAULT_DATE_TIME_FORMAT}`,\n            },\n          },\n        });\n\n        graphs.push({\n          label: getFieldDisplayName(field, series, dataFrames),\n          data: points,\n          color: field.config.color?.fixedColor,\n          info: statsDisplayValues,\n          isVisible: true,\n          yAxis: {\n            index: (seriesOptions[field.name] && seriesOptions[field.name].yAxis) || 1,\n          },\n          // This index is used later on to retrieve appropriate series/time for X and Y axes\n          seriesIndex: fieldColumnIndex,\n          timeField: { ...timeField },\n          valueField: { ...field },\n          timeStep,\n        });\n      }\n    }\n  }\n\n  return graphs;\n};\n","var path = 'public/app/features/templating/partials/editor.html';\nvar html = \"<div ng-controller=VariableEditorCtrl ng-init=init()>\\n  <div class=page-action-bar>\\n    <h3 class=dashboard-settings__header>\\n      <a ng-click=\\\"setMode('list')\\\" aria-label={{::selectors.headerLink}}>Variables</a>\\n      <span ng-show=\\\"mode === 'new'\\\"><icon name=\\\"'angle-right'\\\" aria-label={{::selectors.modeLabelNew}}></icon> New</span>\\n      <span ng-show=\\\"mode === 'edit'\\\"><icon name=\\\"'angle-right'\\\" aria-label={{::selectors.modeLabelEdit}}></icon> Edit</span>\\n    </h3>\\n\\n    <div class=page-action-bar__spacer></div>\\n    <a type=button class=\\\"btn btn-primary\\\" ng-click=\\\"setMode('new');\\\" ng-if=\\\"variables.length > 0\\\" ng-hide=\\\"mode === 'edit' || mode === 'new'\\\" aria-label={{::selectors.newButton}}>\\n      New\\n    </a>\\n  </div>\\n\\n  <div ng-if=\\\"mode === 'list'\\\">\\n    <div ng-if=\\\"variables.length === 0\\\">\\n      <empty-list-cta on-click=setNewMode title=emptyListCta.title infobox=emptyListCta.infoBox infoboxtitle=emptyListCta.infoBoxTitle buttontitle=emptyListCta.buttonTitle buttonicon=emptyListCta.buttonIcon />\\n    </div>\\n\\n    <div ng-if=variables.length>\\n      <table class=\\\"filter-table filter-table--hover\\\" aria-label={{::selectors.table}}>\\n        <thead>\\n          <tr>\\n            <th>Variable</th>\\n            <th>Definition</th>\\n            <th colspan=5></th>\\n          </tr>\\n        </thead>\\n        <tbody>\\n          <tr ng-repeat=\\\"variable in variables\\\">\\n            <td style=width:1%>\\n              <span ng-click=edit(variable) class=\\\"pointer template-variable\\\" aria-label={{::selectors.tableRowNameFields(variable.name)}}>\\n                ${{ variable.name }}\\n              </span>\\n            </td>\\n            <td style=max-width:200px ng-click=edit(variable) class=\\\"pointer max-width\\\" aria-label={{::selectors.tableRowDefinitionFields(variable.name)}}>\\n              {{ variable.definition ? variable.definition : variable.query }}\\n            </td>\\n            <td style=width:1%>\\n              <icon ng-click=_.move(variables,$index,$index-1) ng-hide=$first name=\\\"'arrow-up'\\\" aria-label={{::selectors.tableRowArrowUpButtons(variable.name)}}></icon>\\n            </td>\\n            <td style=width:1%>\\n              <icon ng-click=_.move(variables,$index,$index+1) ng-hide=$last name=\\\"'arrow-down'\\\" aria-label={{::selectors.tableRowArrowDownButtons(variable.name)}}></icon>\\n            </td>\\n            <td style=width:1%>\\n              <a ng-click=duplicate(variable) class=\\\"btn btn-inverse btn-small\\\" aria-label={{::selectors.tableRowDuplicateButtons(variable.name)}}>\\n                Duplicate\\n              </a>\\n            </td>\\n            <td style=width:1%>\\n              <a ng-click=removeVariable(variable) class=\\\"btn btn-danger btn-small\\\" aria-label={{::selectors.tableRowRemoveButtons(variable.name)}}>\\n                <icon name=\\\"'times'\\\" style=margin-bottom:0></icon>\\n              </a>\\n            </td>\\n          </tr>\\n        </tbody>\\n      </table>\\n    </div>\\n  </div>\\n\\n  <form ng-if=\\\"mode === 'edit' || mode === 'new'\\\" name=ctrl.form aria-label=\\\"Variable editor Form\\\">\\n    <h5 class=section-heading>General</h5>\\n    <div class=gf-form-group>\\n      <div class=gf-form-inline>\\n        <div class=\\\"gf-form max-width-19\\\">\\n          <span class=\\\"gf-form-label width-6\\\">Name</span>\\n          <input type=text class=gf-form-input name=name placeholder=name ng-model=current.name required ng-pattern=namePattern aria-label={{::selectors.generalNameInput}} />\\n        </div>\\n        <div class=\\\"gf-form max-width-19\\\">\\n          <span class=\\\"gf-form-label width-6\\\">\\n            Type\\n            <info-popover mode=right-normal>\\n              {{ variableTypes[current.type].description }}\\n            </info-popover>\\n          </span>\\n          <div class=\\\"gf-form-select-wrapper max-width-17\\\">\\n            <select class=gf-form-input ng-model=current.type ng-options=\\\"k as v.name for (k, v) in variableTypes\\\" ng-change=typeChanged() aria-label={{::selectors.generalTypeSelect}}></select>\\n          </div>\\n        </div>\\n      </div>\\n\\n      <div class=gf-form ng-show=ctrl.form.name.$error.pattern>\\n        <span class=\\\"gf-form-label gf-form-label--error\\\">Template names cannot begin with '__', that's reserved for Grafana's global variables</span>\\n      </div>\\n\\n      <div class=gf-form-inline>\\n        <div class=\\\"gf-form max-width-19\\\">\\n          <span class=\\\"gf-form-label width-6\\\">Label</span>\\n          <input type=text class=gf-form-input ng-model=current.label placeholder=\\\"optional display name\\\" aria-label={{::selectors.generalLabelInput}} />\\n        </div>\\n        <div class=\\\"gf-form max-width-19\\\">\\n          <span class=\\\"gf-form-label width-6\\\">Hide</span>\\n          <div class=\\\"gf-form-select-wrapper max-width-15\\\">\\n            <select class=gf-form-input ng-model=current.hide ng-options=\\\"f.value as f.text for f in hideOptions\\\" aria-label={{::selectors.generalHideSelect}}></select>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"current.type === 'interval'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Interval Options</h5>\\n\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-9\\\">Values</span>\\n        <input type=text class=gf-form-input ng-model=current.query placeholder=1m,10m,1h,6h,1d,7d ng-model-onblur ng-change=runQuery() required aria-label=\\\"Variable editor Form Interval Query field\\\"/>\\n      </div>\\n\\n      <div class=gf-form-inline>\\n        <gf-form-switch class=gf-form label=\\\"Auto Option\\\" label-class=width-9 checked=current.auto on-change=runQuery() aria-label=\\\"Variable editor Form Interval AutoOption switch\\\">\\n        </gf-form-switch>\\n\\n        <div class=gf-form>\\n          <span class=\\\"gf-form-label width-9\\\" ng-show=current.auto>\\n            Step count <tip>How many times should the current time range be divided to calculate the value</tip>\\n          </span>\\n          <div class=\\\"gf-form-select-wrapper max-width-10\\\" ng-show=current.auto>\\n            <select class=gf-form-input ng-model=current.auto_count ng-options=\\\"f for f in [1,2,3,4,5,10,20,30,40,50,100,200,300,400,500]\\\" ng-change=runQuery() aria-label=\\\"Variable editor Form Interval AutoCount select\\\"></select>\\n          </div>\\n        </div>\\n        <div class=gf-form>\\n          <span class=gf-form-label ng-show=current.auto>\\n            Min interval <tip>The calculated value will not go below this threshold</tip>\\n          </span>\\n          <input type=text class=\\\"gf-form-input max-width-10\\\" ng-show=current.auto ng-model=current.auto_min ng-change=runQuery() placeholder=10s aria-label=\\\"Variable editor Form Interval AutoMin field\\\"/>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"current.type === 'custom'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Custom Options</h5>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-14\\\">Values separated by comma</span>\\n        <input type=text class=gf-form-input ng-model=current.query ng-blur=runQuery() placeholder=\\\"1, 10, 20, myvalue, escaped\\\\,value\\\" required aria-label=\\\"Variable editor Form Custom Query field\\\"/>\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"current.type === 'constant'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Constant options</h5>\\n      <div class=gf-form>\\n        <span class=gf-form-label>Value</span>\\n        <input type=text class=gf-form-input ng-model=current.query ng-blur=runQuery() placeholder=\\\"your metric prefix\\\" aria-label={{::selectors.constantOptionsQueryInput}} />\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"current.type === 'textbox'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Text options</h5>\\n      <div class=gf-form>\\n        <span class=gf-form-label>Default value</span>\\n        <input type=text class=gf-form-input ng-model=current.query ng-blur=runQuery() placeholder=\\\"default value, if any\\\" aria-label=\\\"Variable editor Form TextBox Query field\\\"/>\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"current.type === 'query'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Query Options</h5>\\n\\n      <div class=gf-form-inline>\\n        <div class=\\\"gf-form max-width-21\\\">\\n          <span class=\\\"gf-form-label width-10\\\">Data source</span>\\n          <div class=\\\"gf-form-select-wrapper max-width-14\\\">\\n            <select class=gf-form-input ng-model=current.datasource ng-options=\\\"f.value as f.name for f in datasources\\\" ng-change=datasourceChanged() required aria-label={{::selectors.queryOptionsDataSourceSelect}}>\\n              <option value=\\\"\\\" ng-if=false></option>\\n            </select>\\n          </div>\\n        </div>\\n\\n        <div class=\\\"gf-form max-width-22\\\">\\n          <span class=\\\"gf-form-label width-10\\\">\\n            Refresh\\n            <info-popover mode=right-normal>\\n              When to update the values of this variable.\\n            </info-popover>\\n          </span>\\n          <div class=\\\"gf-form-select-wrapper width-15\\\">\\n            <select class=gf-form-input ng-model=current.refresh ng-options=\\\"f.value as f.text for f in refreshOptions\\\" aria-label={{::selectors.queryOptionsRefreshSelect}}></select>\\n          </div>\\n        </div>\\n      </div>\\n\\n      <rebuild-on-change property=currentDatasource>\\n        <variable-query-editor-loader> </variable-query-editor-loader>\\n      </rebuild-on-change>\\n\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-10\\\">\\n          Regex\\n          <info-popover mode=right-normal>\\n            Optional, if you want to extract part of a series name or metric node segment.\\n          </info-popover>\\n        </span>\\n        <input type=text class=gf-form-input ng-model=current.regex placeholder=/.*-(.*)-.*/ ng-model-onblur ng-change=runQuery() aria-label={{::selectors.queryOptionsRegExInput}} />\\n      </div>\\n      <div class=\\\"gf-form max-width-21\\\">\\n        <span class=\\\"gf-form-label width-10\\\">\\n          Sort\\n          <info-popover mode=right-normal>\\n            How to sort the values of this variable.\\n          </info-popover>\\n        </span>\\n        <div class=\\\"gf-form-select-wrapper max-width-14\\\">\\n          <select class=gf-form-input ng-model=current.sort ng-options=\\\"f.value as f.text for f in sortOptions\\\" ng-change=runQuery() aria-label={{::selectors.queryOptionsSortSelect}}></select>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div ng-show=\\\"current.type === 'datasource'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Data source options</h5>\\n\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-12\\\">Type</label>\\n        <div class=\\\"gf-form-select-wrapper max-width-18\\\">\\n          <select class=gf-form-input ng-model=current.query ng-options=\\\"f.value as f.text for f in datasourceTypes\\\" ng-change=runQuery() aria-label=\\\"Variable editor Form DataSource Query field\\\"></select>\\n        </div>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-12\\\">\\n          Instance name filter\\n          <info-popover mode=right-normal>\\n            Regex filter for which data source instances to choose from in the variable value dropdown. Leave empty for\\n            all.\\n            <br/><br/>\\n            Example: <code>/^prod/</code>\\n          </info-popover>\\n        </label>\\n        <input type=text class=\\\"gf-form-input max-width-18\\\" ng-model=current.regex placeholder=/.*-(.*)-.*/ ng-model-onblur ng-change=runQuery() aria-label=\\\"Variable editor Form DataSource RegEx field\\\"/>\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"current.type === 'adhoc'\\\" class=gf-form-group>\\n      <h5 class=section-heading>Options</h5>\\n      <div class=\\\"gf-form max-width-21\\\">\\n        <span class=\\\"gf-form-label width-8\\\">Data source</span>\\n        <div class=\\\"gf-form-select-wrapper max-width-14\\\">\\n          <select class=gf-form-input ng-model=current.datasource ng-options=\\\"f.value as f.name for f in datasources\\\" required ng-change=validate() aria-label=\\\"Variable editor Form AdHoc DataSource select\\\">\\n            <option value=\\\"\\\" ng-if=false></option>\\n          </select>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"section gf-form-group\\\" ng-show=variableTypes[current.type].supportsMulti>\\n      <h5 class=section-heading>Selection Options</h5>\\n      <div class=section>\\n        <gf-form-switch class=gf-form label=Multi-value label-class=width-10 tooltip=\\\"Enables multiple values to be selected at the same time\\\" checked=current.multi on-change=runQuery() aria-label={{::selectors.selectionOptionsMultiSwitch}}>\\n        </gf-form-switch>\\n        <gf-form-switch class=gf-form label=\\\"Include All option\\\" label-class=width-10 checked=current.includeAll on-change=runQuery() aria-label={{::selectors.selectionOptionsIncludeAllSwitch}}>\\n        </gf-form-switch>\\n      </div>\\n      <div class=gf-form ng-if=current.includeAll>\\n        <span class=\\\"gf-form-label width-10\\\">Custom all value</span>\\n        <input type=text class=\\\"gf-form-input max-width-15\\\" ng-model=current.allValue placeholder=\\\"blank = auto\\\" aria-label={{::selectors.selectionOptionsCustomAllInput}} />\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-group ng-if=\\\"current.type === 'query'\\\">\\n      <h5>Value groups/tags (Experimental feature)</h5>\\n      <gf-form-switch class=gf-form label=Enabled label-class=width-10 checked=current.useTags on-change=runQuery() aria-label={{::selectors.valueGroupsTagsEnabledSwitch}}>\\n      </gf-form-switch>\\n      <div class=\\\"gf-form last\\\" ng-if=current.useTags>\\n        <span class=\\\"gf-form-label width-10\\\">Tags query</span>\\n        <input type=text class=gf-form-input ng-model=current.tagsQuery placeholder=\\\"metric name or tags query\\\" ng-model-onblur aria-label={{::selectors.valueGroupsTagsTagsQueryInput}} />\\n      </div>\\n      <div class=gf-form ng-if=current.useTags>\\n        <li class=\\\"gf-form-label width-10\\\">Tag values query</li>\\n        <input type=text class=gf-form-input ng-model=current.tagValuesQuery placeholder=apps.$tag.* ng-model-onblur aria-label={{::selectors.valueGroupsTagsTagsValuesQueryInput}} />\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-group ng-show=current.options.length>\\n      <h5>Preview of values</h5>\\n      <div class=gf-form-inline>\\n        <div class=gf-form ng-repeat=\\\"option in current.options | limitTo: optionsLimit\\\">\\n          <span class=gf-form-label aria-label={{::selectors.previewOfValuesOption}}>{{ option.text }}</span>\\n        </div>\\n        <div class=gf-form ng-if=\\\"current.options.length > optionsLimit\\\">\\n          <a class=\\\"gf-form-label btn-secondary\\\" ng-click=showMoreOptions() aria-label=\\\"Variable editor Preview of Values Show More link\\\">\\n            Show more\\n          </a>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"alert alert-info gf-form-group\\\" ng-if=infoText aria-label=\\\"Variable editor Form Alert\\\">\\n      {{ infoText }}\\n    </div>\\n\\n    <div class=\\\"gf-form-button-row p-y-0\\\">\\n      <button type=submit class=\\\"btn btn-primary\\\" ng-show=\\\"mode === 'edit'\\\" ng-click=update(); aria-label={{::selectors.updateButton}}>\\n        Update\\n      </button>\\n      <button type=submit class=\\\"btn btn-primary\\\" ng-show=\\\"mode === 'new'\\\" ng-click=add(); aria-label={{::selectors.addButton}}>\\n        Add\\n      </button>\\n    </div>\\n  </form>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","export enum MappingType {\n  ValueToText = 1,\n  RangeToText = 2,\n}\n\ninterface BaseMap {\n  id: number;\n  operator: string;\n  text: string;\n  type: MappingType;\n}\n\nexport type ValueMapping = ValueMap | RangeMap;\n\nexport interface ValueMap extends BaseMap {\n  value: string;\n}\n\nexport interface RangeMap extends BaseMap {\n  from: string;\n  to: string;\n}\n","var path = 'public/app/features/admin/partials/styleguide.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\n\\t<h3 class=page-heading>Buttons</h3>\\n\\n\\t<div class=tab-pane>\\n\\t\\t<div ng-repeat=\\\"variant in ctrl.buttonVariants\\\" class=row>\\n\\t\\t\\t<div ng-repeat=\\\"btnSize in ctrl.buttonSizes\\\" class=\\\"style-guide-button-list p-a-2 col-md-4\\\">\\n\\t\\t\\t\\t<button ng-repeat=\\\"buttonName in ctrl.buttonNames\\\" class=\\\"btn btn{{variant}}{{buttonName}} {{btnSize}}\\\">\\n\\t\\t\\t\\t\\tbtn{{variant}}{{buttonName}}\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<h3 class=page-heading>Forms</h3>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=gf-form-label>Label</label>\\n\\t\\t\\t<input type=text class=gf-form-input />\\n\\t\\t</div>\\n\\t</div>\\n\\n</div>\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","export enum MetricKind {\n  METRIC_KIND_UNSPECIFIED = 'METRIC_KIND_UNSPECIFIED',\n  GAUGE = 'GAUGE',\n  DELTA = 'DELTA',\n  CUMULATIVE = 'CUMULATIVE',\n}\n\nexport enum ValueTypes {\n  VALUE_TYPE_UNSPECIFIED = 'VALUE_TYPE_UNSPECIFIED',\n  BOOL = 'BOOL',\n  INT64 = 'INT64',\n  DOUBLE = 'DOUBLE',\n  STRING = 'STRING',\n  DISTRIBUTION = 'DISTRIBUTION',\n  MONEY = 'MONEY',\n}\n\nexport const alignOptions = [\n  {\n    text: 'delta',\n    value: 'ALIGN_DELTA',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.CUMULATIVE, MetricKind.DELTA],\n  },\n  {\n    text: 'rate',\n    value: 'ALIGN_RATE',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.CUMULATIVE, MetricKind.DELTA],\n  },\n  {\n    text: 'interpolate',\n    value: 'ALIGN_INTERPOLATE',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'next older',\n    value: 'ALIGN_NEXT_OLDER',\n    valueTypes: [\n      ValueTypes.INT64,\n      ValueTypes.DOUBLE,\n      ValueTypes.MONEY,\n      ValueTypes.DISTRIBUTION,\n      ValueTypes.STRING,\n      ValueTypes.VALUE_TYPE_UNSPECIFIED,\n      ValueTypes.BOOL,\n    ],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'min',\n    value: 'ALIGN_MIN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'max',\n    value: 'ALIGN_MAX',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'mean',\n    value: 'ALIGN_MEAN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'count',\n    value: 'ALIGN_COUNT',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'sum',\n    value: 'ALIGN_SUM',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'stddev',\n    value: 'ALIGN_STDDEV',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'count true',\n    value: 'ALIGN_COUNT_TRUE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'count false',\n    value: 'ALIGN_COUNT_FALSE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'fraction true',\n    value: 'ALIGN_FRACTION_TRUE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'percentile 99',\n    value: 'ALIGN_PERCENTILE_99',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percentile 95',\n    value: 'ALIGN_PERCENTILE_95',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percentile 50',\n    value: 'ALIGN_PERCENTILE_50',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percentile 05',\n    value: 'ALIGN_PERCENTILE_05',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percent change',\n    value: 'ALIGN_PERCENT_CHANGE',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n];\n\nexport const aggOptions = [\n  {\n    text: 'none',\n    value: 'REDUCE_NONE',\n    valueTypes: [\n      ValueTypes.INT64,\n      ValueTypes.DOUBLE,\n      ValueTypes.MONEY,\n      ValueTypes.DISTRIBUTION,\n      ValueTypes.BOOL,\n      ValueTypes.STRING,\n    ],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'mean',\n    value: 'REDUCE_MEAN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'min',\n    value: 'REDUCE_MIN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'max',\n    value: 'REDUCE_MAX',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'sum',\n    value: 'REDUCE_SUM',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'std. dev.',\n    value: 'REDUCE_STDDEV',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'count',\n    value: 'REDUCE_COUNT',\n    valueTypes: [\n      ValueTypes.INT64,\n      ValueTypes.DOUBLE,\n      ValueTypes.MONEY,\n      ValueTypes.DISTRIBUTION,\n      ValueTypes.BOOL,\n      ValueTypes.STRING,\n    ],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: 'count true',\n    value: 'REDUCE_COUNT_TRUE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'count false',\n    value: 'REDUCE_COUNT_FALSE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: '99th percentile',\n    value: 'REDUCE_PERCENTILE_99',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: '95th percentile',\n    value: 'REDUCE_PERCENTILE_95',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: '50th percentile',\n    value: 'REDUCE_PERCENTILE_50',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: '5th percentile',\n    value: 'REDUCE_PERCENTILE_05',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n];\n\nexport const alignmentPeriods = [\n  { text: 'grafana auto', value: 'grafana-auto' },\n  { text: 'stackdriver auto', value: 'stackdriver-auto' },\n  { text: '1m', value: '+60s' },\n  { text: '2m', value: '+120s' },\n  { text: '5m', value: '+300s' },\n  { text: '10m', value: '+600s' },\n  { text: '30m', value: '+1800s' },\n  { text: '1h', value: '+3600s' },\n  { text: '3h', value: '+7200s' },\n  { text: '6h', value: '+21600s' },\n  { text: '1d', value: '+86400s' },\n  { text: '3d', value: '+259200s' },\n  { text: '1w', value: '+604800s' },\n];\n\nexport const stackdriverUnitMappings = {\n  bit: 'bits',\n  By: 'bytes',\n  s: 's',\n  min: 'm',\n  h: 'h',\n  d: 'd',\n  us: 'µs',\n  ms: 'ms',\n  ns: 'ns',\n  percent: 'percent',\n  MiBy: 'mbytes',\n  'By/s': 'Bps',\n  GBy: 'decgbytes',\n};\n\nexport const systemLabels = [\n  'metadata.system_labels.cloud_account',\n  'metadata.system_labels.name',\n  'metadata.system_labels.region',\n  'metadata.system_labels.state',\n  'metadata.system_labels.instance_group',\n  'metadata.system_labels.node_name',\n  'metadata.system_labels.service_name',\n  'metadata.system_labels.top_level_controller_type',\n  'metadata.system_labels.top_level_controller_name',\n  'metadata.system_labels.container_image',\n];\n\nexport const selectors = [\n  { label: 'SLI Value', value: 'select_slo_health' },\n  { label: 'SLO Compliance', value: 'select_slo_compliance' },\n  { label: 'SLO Error Budget Remaining', value: 'select_slo_budget_fraction' },\n];\n","// Generated from ScrollQLParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n// This class defines a complete listener for a parse tree produced by ScrollQLParser.\nfunction ScrollQLParserListener() {\n  antlr4.tree.ParseTreeListener.call(this);\n  return this;\n}\n\nScrollQLParserListener.prototype = Object.create(antlr4.tree.ParseTreeListener.prototype);\nScrollQLParserListener.prototype.constructor = ScrollQLParserListener;\n\n// Enter a parse tree produced by ScrollQLParser#query.\nScrollQLParserListener.prototype.enterQuery = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#query.\nScrollQLParserListener.prototype.exitQuery = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logQuery.\nScrollQLParserListener.prototype.enterLogQuery = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logQuery.\nScrollQLParserListener.prototype.exitLogQuery = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logAesthetic.\nScrollQLParserListener.prototype.enterLogAesthetic = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logAesthetic.\nScrollQLParserListener.prototype.exitLogAesthetic = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logSourceStage.\nScrollQLParserListener.prototype.enterLogSourceStage = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logSourceStage.\nScrollQLParserListener.prototype.exitLogSourceStage = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logStatsStage.\nScrollQLParserListener.prototype.enterLogStatsStage = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logStatsStage.\nScrollQLParserListener.prototype.exitLogStatsStage = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOp.\nScrollQLParserListener.prototype.enterLogOp = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOp.\nScrollQLParserListener.prototype.exitLogOp = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logAestheticOp.\nScrollQLParserListener.prototype.enterLogAestheticOp = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logAestheticOp.\nScrollQLParserListener.prototype.exitLogAestheticOp = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logSource.\nScrollQLParserListener.prototype.enterLogSource = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logSource.\nScrollQLParserListener.prototype.exitLogSource = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeExpr.\nScrollQLParserListener.prototype.enterTimeExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeExpr.\nScrollQLParserListener.prototype.exitTimeExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#nowTimeExpr.\nScrollQLParserListener.prototype.enterNowTimeExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#nowTimeExpr.\nScrollQLParserListener.prototype.exitNowTimeExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#negRelativeTimeExpr.\nScrollQLParserListener.prototype.enterNegRelativeTimeExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#negRelativeTimeExpr.\nScrollQLParserListener.prototype.exitNegRelativeTimeExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#posRelativeTimeExpr.\nScrollQLParserListener.prototype.enterPosRelativeTimeExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#posRelativeTimeExpr.\nScrollQLParserListener.prototype.exitPosRelativeTimeExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#iso8601TimeExpr.\nScrollQLParserListener.prototype.enterIso8601TimeExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#iso8601TimeExpr.\nScrollQLParserListener.prototype.exitIso8601TimeExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#epochTimeExpr.\nScrollQLParserListener.prototype.enterEpochTimeExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#epochTimeExpr.\nScrollQLParserListener.prototype.exitEpochTimeExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#bareSpaceDelimited.\nScrollQLParserListener.prototype.enterBareSpaceDelimited = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#bareSpaceDelimited.\nScrollQLParserListener.prototype.exitBareSpaceDelimited = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logStats.\nScrollQLParserListener.prototype.enterLogStats = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logStats.\nScrollQLParserListener.prototype.exitLogStats = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#statsExpr.\nScrollQLParserListener.prototype.enterStatsExpr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#statsExpr.\nScrollQLParserListener.prototype.exitStatsExpr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#statsGroupFieldId.\nScrollQLParserListener.prototype.enterStatsGroupFieldId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#statsGroupFieldId.\nScrollQLParserListener.prototype.exitStatsGroupFieldId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#statsGroupFieldProjection.\nScrollQLParserListener.prototype.enterStatsGroupFieldProjection = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#statsGroupFieldProjection.\nScrollQLParserListener.prototype.exitStatsGroupFieldProjection = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpFieldsFields.\nScrollQLParserListener.prototype.enterLogOpFieldsFields = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpFieldsFields.\nScrollQLParserListener.prototype.exitLogOpFieldsFields = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpFieldsDisplay.\nScrollQLParserListener.prototype.enterLogOpFieldsDisplay = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpFieldsDisplay.\nScrollQLParserListener.prototype.exitLogOpFieldsDisplay = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#fieldSpec.\nScrollQLParserListener.prototype.enterFieldSpec = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#fieldSpec.\nScrollQLParserListener.prototype.exitFieldSpec = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpParse.\nScrollQLParserListener.prototype.enterLogOpParse = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpParse.\nScrollQLParserListener.prototype.exitLogOpParse = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpSearch.\nScrollQLParserListener.prototype.enterLogOpSearch = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpSearch.\nScrollQLParserListener.prototype.exitLogOpSearch = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#implicitLogOpSearch.\nScrollQLParserListener.prototype.enterImplicitLogOpSearch = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#implicitLogOpSearch.\nScrollQLParserListener.prototype.exitImplicitLogOpSearch = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#searchExprTerm.\nScrollQLParserListener.prototype.enterSearchExprTerm = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#searchExprTerm.\nScrollQLParserListener.prototype.exitSearchExprTerm = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#searchExprNot.\nScrollQLParserListener.prototype.enterSearchExprNot = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#searchExprNot.\nScrollQLParserListener.prototype.exitSearchExprNot = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#searchExprAnd.\nScrollQLParserListener.prototype.enterSearchExprAnd = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#searchExprAnd.\nScrollQLParserListener.prototype.exitSearchExprAnd = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#searchExprNested.\nScrollQLParserListener.prototype.enterSearchExprNested = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#searchExprNested.\nScrollQLParserListener.prototype.exitSearchExprNested = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#searchExprOr.\nScrollQLParserListener.prototype.enterSearchExprOr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#searchExprOr.\nScrollQLParserListener.prototype.exitSearchExprOr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#searchTerm.\nScrollQLParserListener.prototype.enterSearchTerm = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#searchTerm.\nScrollQLParserListener.prototype.exitSearchTerm = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpFilter.\nScrollQLParserListener.prototype.enterLogOpFilter = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpFilter.\nScrollQLParserListener.prototype.exitLogOpFilter = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpSort.\nScrollQLParserListener.prototype.enterLogOpSort = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpSort.\nScrollQLParserListener.prototype.exitLogOpSort = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#sortExprDesc.\nScrollQLParserListener.prototype.enterSortExprDesc = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#sortExprDesc.\nScrollQLParserListener.prototype.exitSortExprDesc = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#sortExprAsc.\nScrollQLParserListener.prototype.enterSortExprAsc = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#sortExprAsc.\nScrollQLParserListener.prototype.exitSortExprAsc = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpLimitHead.\nScrollQLParserListener.prototype.enterLogOpLimitHead = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpLimitHead.\nScrollQLParserListener.prototype.exitLogOpLimitHead = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logOpLimitTail.\nScrollQLParserListener.prototype.enterLogOpLimitTail = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logOpLimitTail.\nScrollQLParserListener.prototype.exitLogOpLimitTail = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionRoot.\nScrollQLParserListener.prototype.enterExpressionRoot = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionRoot.\nScrollQLParserListener.prototype.exitExpressionRoot = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionAddSub.\nScrollQLParserListener.prototype.enterExpressionAddSub = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionAddSub.\nScrollQLParserListener.prototype.exitExpressionAddSub = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionEq.\nScrollQLParserListener.prototype.enterExpressionEq = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionEq.\nScrollQLParserListener.prototype.exitExpressionEq = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionComp.\nScrollQLParserListener.prototype.enterExpressionComp = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionComp.\nScrollQLParserListener.prototype.exitExpressionComp = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionExpo.\nScrollQLParserListener.prototype.enterExpressionExpo = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionExpo.\nScrollQLParserListener.prototype.exitExpressionExpo = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionLike.\nScrollQLParserListener.prototype.enterExpressionLike = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionLike.\nScrollQLParserListener.prototype.exitExpressionLike = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionTerm.\nScrollQLParserListener.prototype.enterExpressionTerm = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionTerm.\nScrollQLParserListener.prototype.exitExpressionTerm = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionNeg.\nScrollQLParserListener.prototype.enterExpressionNeg = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionNeg.\nScrollQLParserListener.prototype.exitExpressionNeg = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionNot.\nScrollQLParserListener.prototype.enterExpressionNot = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionNot.\nScrollQLParserListener.prototype.exitExpressionNot = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionPos.\nScrollQLParserListener.prototype.enterExpressionPos = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionPos.\nScrollQLParserListener.prototype.exitExpressionPos = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionMulDivMod.\nScrollQLParserListener.prototype.enterExpressionMulDivMod = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionMulDivMod.\nScrollQLParserListener.prototype.exitExpressionMulDivMod = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionAnd.\nScrollQLParserListener.prototype.enterExpressionAnd = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionAnd.\nScrollQLParserListener.prototype.exitExpressionAnd = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionNested.\nScrollQLParserListener.prototype.enterExpressionNested = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionNested.\nScrollQLParserListener.prototype.exitExpressionNested = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionOr.\nScrollQLParserListener.prototype.enterExpressionOr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionOr.\nScrollQLParserListener.prototype.exitExpressionOr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#expressionIn.\nScrollQLParserListener.prototype.enterExpressionIn = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#expressionIn.\nScrollQLParserListener.prototype.exitExpressionIn = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#termId.\nScrollQLParserListener.prototype.enterTermId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#termId.\nScrollQLParserListener.prototype.exitTermId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#termNum.\nScrollQLParserListener.prototype.enterTermNum = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#termNum.\nScrollQLParserListener.prototype.exitTermNum = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#termStr.\nScrollQLParserListener.prototype.enterTermStr = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#termStr.\nScrollQLParserListener.prototype.exitTermStr = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#termFn.\nScrollQLParserListener.prototype.enterTermFn = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#termFn.\nScrollQLParserListener.prototype.exitTermFn = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#likeTerm.\nScrollQLParserListener.prototype.enterLikeTerm = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#likeTerm.\nScrollQLParserListener.prototype.exitLikeTerm = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#functionWithArgs.\nScrollQLParserListener.prototype.enterFunctionWithArgs = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#functionWithArgs.\nScrollQLParserListener.prototype.exitFunctionWithArgs = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#functionWithNoArgs.\nScrollQLParserListener.prototype.enterFunctionWithNoArgs = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#functionWithNoArgs.\nScrollQLParserListener.prototype.exitFunctionWithNoArgs = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#functionArgTimePeriod.\nScrollQLParserListener.prototype.enterFunctionArgTimePeriod = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#functionArgTimePeriod.\nScrollQLParserListener.prototype.exitFunctionArgTimePeriod = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#functionArgFieldClause.\nScrollQLParserListener.prototype.enterFunctionArgFieldClause = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#functionArgFieldClause.\nScrollQLParserListener.prototype.exitFunctionArgFieldClause = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#array.\nScrollQLParserListener.prototype.enterArray = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#array.\nScrollQLParserListener.prototype.exitArray = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#arrayElem.\nScrollQLParserListener.prototype.enterArrayElem = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#arrayElem.\nScrollQLParserListener.prototype.exitArrayElem = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#number.\nScrollQLParserListener.prototype.enterNumber = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#number.\nScrollQLParserListener.prototype.exitNumber = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#string.\nScrollQLParserListener.prototype.enterString = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#string.\nScrollQLParserListener.prototype.exitString = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#stringOrBareString.\nScrollQLParserListener.prototype.enterStringOrBareString = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#stringOrBareString.\nScrollQLParserListener.prototype.exitStringOrBareString = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#regex.\nScrollQLParserListener.prototype.enterRegex = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#regex.\nScrollQLParserListener.prototype.exitRegex = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#regexString.\nScrollQLParserListener.prototype.enterRegexString = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#regexString.\nScrollQLParserListener.prototype.exitRegexString = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#logId.\nScrollQLParserListener.prototype.enterLogId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#logId.\nScrollQLParserListener.prototype.exitLogId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#fieldId.\nScrollQLParserListener.prototype.enterFieldId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#fieldId.\nScrollQLParserListener.prototype.exitFieldId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#aliasId.\nScrollQLParserListener.prototype.enterAliasId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#aliasId.\nScrollQLParserListener.prototype.exitAliasId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#userId.\nScrollQLParserListener.prototype.enterUserId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#userId.\nScrollQLParserListener.prototype.exitUserId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#unquotedUserId.\nScrollQLParserListener.prototype.enterUnquotedUserId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#unquotedUserId.\nScrollQLParserListener.prototype.exitUnquotedUserId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#unquotedUserAtId.\nScrollQLParserListener.prototype.enterUnquotedUserAtId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#unquotedUserAtId.\nScrollQLParserListener.prototype.exitUnquotedUserAtId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#unquotedUserBareId.\nScrollQLParserListener.prototype.enterUnquotedUserBareId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#unquotedUserBareId.\nScrollQLParserListener.prototype.exitUnquotedUserBareId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#quotedUserId.\nScrollQLParserListener.prototype.enterQuotedUserId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#quotedUserId.\nScrollQLParserListener.prototype.exitQuotedUserId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#systemId.\nScrollQLParserListener.prototype.enterSystemId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#systemId.\nScrollQLParserListener.prototype.exitSystemId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#unquotedSystemId.\nScrollQLParserListener.prototype.enterUnquotedSystemId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#unquotedSystemId.\nScrollQLParserListener.prototype.exitUnquotedSystemId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#quotedSystemId.\nScrollQLParserListener.prototype.enterQuotedSystemId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#quotedSystemId.\nScrollQLParserListener.prototype.exitQuotedSystemId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#resultId.\nScrollQLParserListener.prototype.enterResultId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#resultId.\nScrollQLParserListener.prototype.exitResultId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#functionId.\nScrollQLParserListener.prototype.enterFunctionId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#functionId.\nScrollQLParserListener.prototype.exitFunctionId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#rawId.\nScrollQLParserListener.prototype.enterRawId = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#rawId.\nScrollQLParserListener.prototype.exitRawId = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#keywords.\nScrollQLParserListener.prototype.enterKeywords = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#keywords.\nScrollQLParserListener.prototype.exitKeywords = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitMilliSeconds.\nScrollQLParserListener.prototype.enterTimeUnitMilliSeconds = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitMilliSeconds.\nScrollQLParserListener.prototype.exitTimeUnitMilliSeconds = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitSeconds.\nScrollQLParserListener.prototype.enterTimeUnitSeconds = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitSeconds.\nScrollQLParserListener.prototype.exitTimeUnitSeconds = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitMinutes.\nScrollQLParserListener.prototype.enterTimeUnitMinutes = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitMinutes.\nScrollQLParserListener.prototype.exitTimeUnitMinutes = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitHours.\nScrollQLParserListener.prototype.enterTimeUnitHours = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitHours.\nScrollQLParserListener.prototype.exitTimeUnitHours = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitDays.\nScrollQLParserListener.prototype.enterTimeUnitDays = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitDays.\nScrollQLParserListener.prototype.exitTimeUnitDays = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitWeeks.\nScrollQLParserListener.prototype.enterTimeUnitWeeks = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitWeeks.\nScrollQLParserListener.prototype.exitTimeUnitWeeks = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitMonths.\nScrollQLParserListener.prototype.enterTimeUnitMonths = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitMonths.\nScrollQLParserListener.prototype.exitTimeUnitMonths = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitQuarters.\nScrollQLParserListener.prototype.enterTimeUnitQuarters = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitQuarters.\nScrollQLParserListener.prototype.exitTimeUnitQuarters = function(ctx) {};\n\n// Enter a parse tree produced by ScrollQLParser#timeUnitYears.\nScrollQLParserListener.prototype.enterTimeUnitYears = function(ctx) {};\n\n// Exit a parse tree produced by ScrollQLParser#timeUnitYears.\nScrollQLParserListener.prototype.exitTimeUnitYears = function(ctx) {};\n\nexports.ScrollQLParserListener = ScrollQLParserListener;\n","var path = 'public/app/partials/signup_invited.html';\nvar html = \"<page-header model=navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\t<h3 class=page-sub-heading>Hello {{greeting}}.</h3>\\n\\n\\t<div class=\\\"modal-tagline p-b-2\\\">\\n\\t\\t<em>{{invitedBy}}</em> has invited you to join Grafana and the organization <span class=highlight-word>{{contextSrv.user.orgName}}</span><br>Please complete the following and choose a password to accept your invitation and continue:\\n\\t</div>\\n\\n\\t<form name=inviteForm class=\\\"login-form gf-form-group\\\">\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Email</span>\\n\\t\\t\\t<input type=email name=email class=\\\"gf-form-input max-width-21\\\" required ng-model=formModel.email placeholder=Email>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Name</span>\\n\\t\\t\\t<input type=text name=name class=\\\"gf-form-input max-width-21\\\" ng-model=formModel.name placeholder=\\\"Name (optional)\\\">\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Username</span>\\n\\t\\t\\t<input type=text name=username class=\\\"gf-form-input max-width-21\\\" required ng-model=formModel.username placeholder=Username>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Password</span>\\n\\t\\t\\t<input type=password name=password class=\\\"gf-form-input max-width-21\\\" required ng-model=formModel.password id=inputPassword placeholder=password>\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form-button-row>\\n\\t\\t\\t<button type=submit class=\\\"btn btn-primary\\\" ng-click=submit(); ng-disable=!inviteForm.$valid>\\n\\t\\t\\t\\tSign Up\\n\\t\\t\\t</button>\\n\\t\\t</div>\\n\\t</form>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { Dispatch, FC, SetStateAction } from 'react';\nimport { css } from 'emotion';\nimport { Button, Checkbox, stylesFactory, useTheme, HorizontalGroup } from '@grafana/ui';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { DashboardQuery } from '../types';\nimport { ActionRow } from './ActionRow';\n\ntype onSelectChange = (value: SelectableValue) => void;\n\nexport interface Props {\n  allChecked?: boolean;\n  canDelete?: boolean;\n  canMove?: boolean;\n  deleteItem: () => void;\n  hideLayout?: boolean;\n  moveTo: () => void;\n  onLayoutChange: Dispatch<SetStateAction<string>>;\n  onSortChange: onSelectChange;\n  onStarredFilterChange: onSelectChange;\n  onTagFilterChange: onSelectChange;\n  onToggleAllChecked: () => void;\n  query: DashboardQuery;\n  editable?: boolean;\n}\n\nexport const SearchResultsFilter: FC<Props> = ({\n  allChecked,\n  canDelete,\n  canMove,\n  deleteItem,\n  hideLayout,\n  moveTo,\n  onLayoutChange,\n  onSortChange,\n  onStarredFilterChange,\n  onTagFilterChange,\n  onToggleAllChecked,\n  query,\n  editable,\n}) => {\n  const showActions = canDelete || canMove;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.wrapper}>\n      {editable && <Checkbox value={allChecked} onChange={onToggleAllChecked} />}\n      {showActions ? (\n        <HorizontalGroup spacing=\"md\">\n          <Button disabled={!canMove} onClick={moveTo} icon=\"exchange-alt\" variant=\"secondary\">\n            Move\n          </Button>\n          <Button disabled={!canDelete} onClick={deleteItem} icon=\"trash-alt\" variant=\"destructive\">\n            Delete\n          </Button>\n        </HorizontalGroup>\n      ) : (\n        <ActionRow\n          {...{\n            hideLayout,\n            onLayoutChange,\n            onSortChange,\n            onStarredFilterChange,\n            onTagFilterChange,\n            query,\n          }}\n          showStarredFilter\n        />\n      )}\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const { sm, md } = theme.spacing;\n  return {\n    wrapper: css`\n      height: 35px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: ${sm};\n\n      > label {\n        height: 20px;\n        margin: 0 ${md} 0 ${sm};\n      }\n    `,\n  };\n});\n","var path = 'public/app/plugins/datasource/mysql/partials/config.html';\nvar html = \"<h3 class=page-heading>MySQL Connection</h3>\\n\\n<div class=gf-form-group>\\n\\t<div class=\\\"gf-form max-width-30\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Host</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.url placeholder=localhost:3306 bs-typeahead=\\\"{{['localhost:3306', 'localhost:3307']}}\\\" required>\\n\\t</div>\\n\\n\\t<div class=\\\"gf-form max-width-30\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Database</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.database placeholder=\\\"database name\\\" required>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">User</span>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.user placeholder=user>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n      <secret-form-field isconfigured=ctrl.current.secureJsonFields.password value=ctrl.current.secureJsonData.password on-reset=ctrl.onPasswordReset on-change=ctrl.onPasswordChange inputwidth=9 />\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-group>\\n\\t\\t<div class=gf-form-inline>\\n\\t\\t\\t<gf-form-checkbox class=gf-form label=\\\"TLS Client Auth\\\" label-class=width-10 checked=ctrl.current.jsonData.tlsAuth switch-class=max-width-6></gf-form-checkbox>\\n\\t\\t\\t<gf-form-checkbox class=gf-form label=\\\"With CA Cert\\\" tooltip=\\\"Needed for\\n\\t\\t\\t\\tverifing self-signed TLS Certs\\\" checked=ctrl.current.jsonData.tlsAuthWithCACert label-class=width-11 switch-class=max-width-6></gf-form-checkbox>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form-inline>\\n\\t\\t\\t<gf-form-checkbox class=gf-form label=\\\"Skip TLS Verify\\\" label-class=width-10 checked=ctrl.current.jsonData.tlsSkipVerify switch-class=max-width-6></gf-form-checkbox>\\n\\t\\t</div>\\n\\t</div>\\n\\n<datasource-tls-auth-settings current=ctrl.current ng-if=\\\"(ctrl.current.jsonData.tlsAuth || ctrl.current.jsonData.tlsAuthWithCACert)\\\">\\n</datasource-tls-auth-settings>\\n\\n<b>Connection limits</b>\\n\\n<div class=gf-form-group>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max open</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.maxOpenConns placeholder=unlimited>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum number of open connections to the database. If <i>Max idle connections</i> is greater than 0 and the\\n\\t\\t\\t<i>Max open connections</i> is less than <i>Max idle connections</i>, then <i>Max idle connections</i> will be\\n\\t\\t\\treduced to match the <i>Max open connections</i> limit. If set to 0, there is no limit on the number of open\\n\\t\\t\\tconnections.\\n\\t\\t</info-popover>\\n\\t</div>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max idle</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.maxIdleConns placeholder=2>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum number of connections in the idle connection pool. If <i>Max open connections</i> is greater than 0 but\\n\\t\\t\\tless than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced to match the\\n\\t\\t\\t<i>Max open connections</i> limit. If set to 0, no idle connections are retained.\\n\\t\\t</info-popover>\\n\\t</div>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max lifetime</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.connMaxLifetime placeholder=14400>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever.<br/><br/>\\n\\t\\t\\tThis should always be lower than configured <a href=https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_wait_timeout target=_blank>wait_timeout</a> in MySQL.\\n\\t\\t</info-popover>\\n\\t</div>\\n</div>\\n\\n<h3 class=page-heading>MySQL details</h3>\\n\\n<div class=gf-form-group>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-9\\\">Min time interval</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input width-6 gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.timeInterval spellcheck=false placeholder=1m ng-pattern=/^\\\\d+(ms|[Mwdhmsy])$/ >\\n\\t\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\t\\tA lower limit for the auto group by time interval. Recommended to be set to write frequency,\\n\\t\\t\\t\\tfor example <code>1m</code> if your data is written every minute.\\n\\t\\t\\t</info-popover>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n<div class=gf-form-group>\\n\\t<div class=grafana-info-box>\\n\\t\\t<h5>User Permission</h5>\\n\\t\\t<p>\\n\\t\\t\\tThe database user should only be granted SELECT permissions on the specified database &amp; tables you want to query.\\n\\t\\t\\tGrafana does not validate that queries are safe so queries can contain any SQL statement. For example, statements\\n\\t\\t\\tlike <code>USE otherdb;</code> and <code>DROP TABLE user;</code> would be executed. To protect against this we\\n\\t\\t\\t<strong>Highly</strong> recommmend you create a specific MySQL user with restricted permissions.\\n\\n\\t\\t\\tCheckout the <a class=external-link target=_blank href=http://docs.grafana.org/features/datasources/mysql/ >MySQL Data Source Docs</a> for more information.\\n\\t\\t</p>\\n\\t</div>\\n</div>\\n</div>\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { Field, DataFrame, FieldType, guessFieldTypeForField } from '../index';\n\nexport interface FieldWithIndex extends Field {\n  index: number;\n}\n\nexport class FieldCache {\n  fields: FieldWithIndex[] = [];\n\n  private fieldByName: { [key: string]: FieldWithIndex } = {};\n  private fieldByType: { [key: string]: FieldWithIndex[] } = {};\n\n  constructor(data: DataFrame) {\n    this.fields = data.fields.map((field, idx) => ({\n      ...field,\n      index: idx,\n    }));\n\n    for (let i = 0; i < data.fields.length; i++) {\n      const field = data.fields[i];\n      // Make sure it has a type\n      if (field.type === FieldType.other) {\n        const t = guessFieldTypeForField(field);\n        if (t) {\n          field.type = t;\n        }\n      }\n      if (!this.fieldByType[field.type]) {\n        this.fieldByType[field.type] = [];\n      }\n      this.fieldByType[field.type].push({\n        ...field,\n        index: i,\n      });\n\n      if (this.fieldByName[field.name]) {\n        console.warn('Duplicate field names in DataFrame: ', field.name);\n      } else {\n        this.fieldByName[field.name] = { ...field, index: i };\n      }\n    }\n  }\n\n  getFields(type?: FieldType): FieldWithIndex[] {\n    if (!type) {\n      return [...this.fields]; // All fields\n    }\n    const fields = this.fieldByType[type];\n    if (fields) {\n      return [...fields];\n    }\n    return [];\n  }\n\n  hasFieldOfType(type: FieldType): boolean {\n    const types = this.fieldByType[type];\n    return types && types.length > 0;\n  }\n\n  getFirstFieldOfType(type: FieldType, includeHidden = false): FieldWithIndex | undefined {\n    const fields = this.fieldByType[type];\n    const firstField = fields.find(field => includeHidden || !field.config.custom?.hidden);\n    return firstField;\n  }\n\n  hasFieldNamed(name: string): boolean {\n    return !!this.fieldByName[name];\n  }\n\n  hasFieldWithNameAndType(name: string, type: FieldType): boolean {\n    return !!this.fieldByName[name] && this.fieldByType[type].filter(field => field.name === name).length > 0;\n  }\n\n  /**\n   * Returns the first field with the given name.\n   */\n  getFieldByName(name: string): FieldWithIndex | undefined {\n    return this.fieldByName[name];\n  }\n}\n","import { MutableDataFrame } from './MutableDataFrame';\nimport { CircularVector } from '../vector/CircularVector';\n\ninterface CircularOptions {\n  append?: 'head' | 'tail';\n  capacity?: number;\n}\n\n/**\n * This dataframe can have values constantly added, and will never\n * exceed the given capacity\n */\nexport class CircularDataFrame<T = any> extends MutableDataFrame<T> {\n  constructor(options: CircularOptions) {\n    super(undefined, (buffer?: any[]) => {\n      return new CircularVector({\n        ...options,\n        buffer,\n      });\n    });\n  }\n}\n","import { Field } from '../types/dataFrame';\nimport { KeyValue } from '../types/data';\n\nexport interface Dimension<T = any> {\n  // Name of the dimension\n  name: string;\n  // Colection of fields representing dimension\n  // I.e. in 2d graph we have two dimension- X and Y axes. Both dimensions can represent\n  // multiple fields being drawn on the graph.\n  // For instance y-axis dimension is a collection of series value fields,\n  // and x-axis dimension is a collection of corresponding time fields\n  columns: Array<Field<T>>;\n}\n\nexport type Dimensions = KeyValue<Dimension>;\n\nexport const createDimension = (name: string, columns: Field[]): Dimension => {\n  return {\n    name,\n    columns,\n  };\n};\n\nexport const getColumnsFromDimension = (dimension: Dimension) => {\n  return dimension.columns;\n};\nexport const getColumnFromDimension = (dimension: Dimension, column: number) => {\n  return dimension.columns[column];\n};\n\nexport const getValueFromDimension = (dimension: Dimension, column: number, row: number) => {\n  return dimension.columns[column].values.get(row);\n};\n\nexport const getAllValuesFromDimension = (dimension: Dimension, column: number, row: number) => {\n  return dimension.columns.map(c => c.values.get(row));\n};\n\nexport const getDimensionByName = (dimensions: Dimensions, name: string) => dimensions[name];\n","import { DataFrame, FieldType, Field, Vector } from '../types';\n\nimport {\n  Table,\n  ArrowType,\n  Builder,\n  Vector as ArrowVector,\n  Float64,\n  DataType,\n  Utf8,\n  TimestampMillisecond,\n  Bool,\n  Column,\n} from 'apache-arrow';\n\nexport interface ArrowDataFrame extends DataFrame {\n  table: Table;\n}\n\nexport function base64StringToArrowTable(text: string): Table {\n  const b64 = atob(text);\n  const arr = Uint8Array.from(b64, c => {\n    return c.charCodeAt(0);\n  });\n  return Table.from(arr);\n}\n\nfunction valueOrUndefined(val?: string) {\n  return val ? val : undefined;\n}\n\nfunction parseOptionalMeta(str?: string): any {\n  if (str && str.length && str !== '{}') {\n    try {\n      return JSON.parse(str);\n    } catch (err) {\n      console.warn('Error reading JSON from arrow metadata: ', str);\n    }\n  }\n  return undefined;\n}\n\nexport function arrowTableToDataFrame(table: Table): ArrowDataFrame {\n  const fields: Field[] = [];\n\n  for (let i = 0; i < table.numCols; i++) {\n    const col = table.getColumnAt(i);\n    if (col) {\n      const schema = table.schema.fields[i];\n      let type = FieldType.other;\n      const values: Vector<any> = col;\n      switch ((schema.typeId as unknown) as ArrowType) {\n        case ArrowType.Decimal:\n        case ArrowType.Int:\n        case ArrowType.FloatingPoint: {\n          type = FieldType.number;\n          break;\n        }\n        case ArrowType.Bool: {\n          type = FieldType.boolean;\n          break;\n        }\n        case ArrowType.Timestamp: {\n          type = FieldType.time;\n          break;\n        }\n        case ArrowType.Utf8: {\n          type = FieldType.string;\n          break;\n        }\n        default:\n          console.log('UNKNOWN Type:', schema);\n      }\n\n      fields.push({\n        name: stripFieldNamePrefix(col.name),\n        type,\n        values,\n        config: parseOptionalMeta(col.metadata.get('config')) || {},\n        labels: parseOptionalMeta(col.metadata.get('labels')),\n      });\n    }\n  }\n  const meta = table.schema.metadata;\n  return {\n    fields,\n    length: table.length,\n    refId: valueOrUndefined(meta.get('refId')),\n    name: valueOrUndefined(meta.get('name')),\n    meta: parseOptionalMeta(meta.get('meta')),\n    table,\n  };\n}\n\n// fieldNamePrefixSep is the delimiter used with fieldNamePrefix.\nconst fieldNamePrefixSep = '🦥: ';\n\nfunction stripFieldNamePrefix(name: string): string {\n  const idx = name.indexOf(fieldNamePrefixSep);\n  if (idx > 0) {\n    return name.substring(idx + fieldNamePrefixSep.length);\n  }\n  return name;\n}\n\nfunction toArrowVector(field: Field): ArrowVector {\n  // OR: Float64Vector.from([1, 2, 3]));\n\n  let type: DataType;\n  if (field.type === FieldType.number) {\n    type = new Float64();\n  } else if (field.type === FieldType.time) {\n    type = new TimestampMillisecond();\n  } else if (field.type === FieldType.boolean) {\n    type = new Bool();\n  } else if (field.type === FieldType.string) {\n    type = new Utf8();\n  } else {\n    type = new Utf8();\n  }\n  const builder = Builder.new({ type, nullValues: [null] });\n  field.values.toArray().forEach(builder.append.bind(builder));\n  return builder.finish().toVector();\n}\n\nexport function grafanaDataFrameToArrowTable(data: DataFrame): Table {\n  // Return the original table\n  let table = (data as any).table;\n  if (table instanceof Table) {\n    return table as Table;\n  }\n  // Make sure the names are unique\n  const names = new Set<string>();\n\n  table = Table.new(\n    data.fields.map((field, index) => {\n      let name = field.name;\n      if (names.has(field.name)) {\n        name = `${index}${fieldNamePrefixSep}${field.name}`;\n      }\n      names.add(name);\n      const column = Column.new(name, toArrowVector(field));\n      if (field.labels) {\n        column.metadata.set('labels', JSON.stringify(field.labels));\n      }\n      if (field.config) {\n        column.metadata.set('config', JSON.stringify(field.config));\n      }\n      return column;\n    })\n  );\n  const metadata = table.schema.metadata;\n  if (data.name) {\n    metadata.set('name', data.name);\n  }\n  if (data.refId) {\n    metadata.set('refId', data.refId);\n  }\n  if (data.meta) {\n    metadata.set('meta', JSON.stringify(data.meta));\n  }\n  return table;\n}\n","export * from './DataFrameView';\nexport * from './FieldCache';\nexport * from './CircularDataFrame';\nexport * from './MutableDataFrame';\nexport * from './processDataFrame';\nexport * from './dimensions';\nexport * from './ArrowDataFrame';\nexport * from './ArrayDataFrame';\n","/* Javascript plotting library for jQuery, version 0.8.3.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\n*/\n\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\n// for convenience\n\n/* Plugin for jQuery for working with colors.\n *\n * Version 1.1.\n *\n * Inspiration from jQuery color animation plugin by John Resig.\n *\n * Released under the MIT license by Ole Laursen, October 2009.\n *\n * Examples:\n *\n *   $.color.parse(\"#fff\").scale('rgb', 0.25).add('a', -0.5).toString()\n *   var c = $.color.extract($(\"#mydiv\"), 'background-color');\n *   console.log(c.r, c.g, c.b, c.a);\n *   $.color.make(100, 50, 25, 0.4).toString() // returns \"rgba(100,50,25,0.4)\"\n *\n * Note that .scale() and .add() return the same modified object\n * instead of making a new one.\n *\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\n * produce a color rather than just crashing.\n */\n(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return\"rgb(\"+[o.r,o.g,o.b].join(\",\")+\")\"}else{return\"rgba(\"+[o.r,o.g,o.b,o.a].join(\",\")+\")\"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=\"\"&&c!=\"transparent\")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),\"body\"));if(c==\"rgba(0, 0, 0, 0)\")c=\"transparent\";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name==\"transparent\")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);\n\n// the actual Flot code\n(function($) {\n\n\t// Cache the prototype hasOwnProperty for faster access\n\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n    // A shim to provide 'detach' to jQuery versions prior to 1.4.  Using a DOM\n    // operation produces the same effect as detach, i.e. removing the element\n    // without touching its jQuery data.\n\n    // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.\n\n    if (!$.fn.detach) {\n        $.fn.detach = function() {\n            return this.each(function() {\n                if (this.parentNode) {\n                    this.parentNode.removeChild( this );\n                }\n            });\n        };\n    }\n\n\t///////////////////////////////////////////////////////////////////////////\n\t// The Canvas object is a wrapper around an HTML5 <canvas> tag.\n\t//\n\t// @constructor\n\t// @param {string} cls List of classes to apply to the canvas.\n\t// @param {element} container Element onto which to append the canvas.\n\t//\n\t// Requiring a container is a little iffy, but unfortunately canvas\n\t// operations don't work unless the canvas is attached to the DOM.\n\n\tfunction Canvas(cls, container) {\n\n\t\tvar element = container.children(\".\" + cls)[0];\n\n\t\tif (element == null) {\n\n\t\t\telement = document.createElement(\"canvas\");\n\t\t\telement.className = cls;\n\n\t\t\t$(element).css({ direction: \"ltr\", position: \"absolute\", left: 0, top: 0 })\n\t\t\t\t.appendTo(container);\n\n\t\t\t// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\n\n\t\t\tif (!element.getContext) {\n\t\t\t\tif (window.G_vmlCanvasManager) {\n\t\t\t\t\telement = window.G_vmlCanvasManager.initElement(element);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element = element;\n\n\t\tvar context = this.context = element.getContext(\"2d\");\n\n\t\t// Determine the screen's ratio of physical to device-independent\n\t\t// pixels.  This is the ratio between the canvas width that the browser\n\t\t// advertises and the number of pixels actually present in that space.\n\n\t\t// The iPhone 4, for example, has a device-independent width of 320px,\n\t\t// but its screen is actually 640px wide.  It therefore has a pixel\n\t\t// ratio of 2, while most normal devices have a ratio of 1.\n\n\t\tvar devicePixelRatio = window.devicePixelRatio || 1,\n\t\t\tbackingStoreRatio =\n\t\t\t\tcontext.webkitBackingStorePixelRatio ||\n\t\t\t\tcontext.mozBackingStorePixelRatio ||\n\t\t\t\tcontext.msBackingStorePixelRatio ||\n\t\t\t\tcontext.oBackingStorePixelRatio ||\n\t\t\t\tcontext.backingStorePixelRatio || 1;\n\n\t\tthis.pixelRatio = devicePixelRatio / backingStoreRatio;\n\n\t\t// Size the canvas to match the internal dimensions of its container\n\n\t\tthis.resize(container.width(), container.height());\n\n\t\t// Collection of HTML div layers for text overlaid onto the canvas\n\n\t\tthis.textContainer = null;\n\t\tthis.text = {};\n\n\t\t// Cache of text fragments and metrics, so we can avoid expensively\n\t\t// re-calculating them when the plot is re-rendered in a loop.\n\n\t\tthis._textCache = {};\n\t\tthis._textSizeCache = window.flotTextSizeCache = window.flotTextSizeCache || {};\n\t}\n\n\t// Resizes the canvas to the given dimensions.\n\t//\n\t// @param {number} width New width of the canvas, in pixels.\n\t// @param {number} width New height of the canvas, in pixels.\n\n\tCanvas.prototype.resize = function(width, height) {\n\n\t\tif (width <= 0 || height <= 0) {\n\t\t\tthrow new Error(\"Invalid dimensions for plot, width = \" + width + \", height = \" + height);\n\t\t}\n\n\t\tvar element = this.element,\n\t\t\tcontext = this.context,\n\t\t\tpixelRatio = this.pixelRatio;\n\n\t\t// Resize the canvas, increasing its density based on the display's\n\t\t// pixel ratio; basically giving it more pixels without increasing the\n\t\t// size of its element, to take advantage of the fact that retina\n\t\t// displays have that many more pixels in the same advertised space.\n\n\t\t// Resizing should reset the state (excanvas seems to be buggy though)\n\n\t\tif (this.width != width) {\n\t\t\telement.width = width * pixelRatio;\n\t\t\telement.style.width = width + \"px\";\n\t\t\tthis.width = width;\n\t\t}\n\n\t\tif (this.height != height) {\n\t\t\telement.height = height * pixelRatio;\n\t\t\telement.style.height = height + \"px\";\n\t\t\tthis.height = height;\n\t\t}\n\n\t\t// Save the context, so we can reset in case we get replotted.  The\n\t\t// restore ensure that we're really back at the initial state, and\n\t\t// should be safe even if we haven't saved the initial state yet.\n\n\t\tcontext.restore();\n\t\tcontext.save();\n\n\t\t// Scale the coordinate space to match the display density; so even though we\n\t\t// may have twice as many pixels, we still want lines and other drawing to\n\t\t// appear at the same size; the extra pixels will just make them crisper.\n\n\t\tcontext.scale(pixelRatio, pixelRatio);\n\t};\n\n\t// Clears the entire canvas area, not including any overlaid HTML text\n\n\tCanvas.prototype.clear = function() {\n\t\tthis.context.clearRect(0, 0, this.width, this.height);\n\t};\n\n\t// Finishes rendering the canvas, including managing the text overlay.\n\n\tCanvas.prototype.render = function() {\n\n\t\tvar cache = this._textCache;\n\n\t\t// For each text layer, add elements marked as active that haven't\n\t\t// already been rendered, and remove those that are no longer active.\n\n\t\tfor (var layerKey in cache) {\n\t\t\tif (hasOwnProperty.call(cache, layerKey)) {\n\n\t\t\t\tvar layer = this.getTextLayer(layerKey),\n\t\t\t\t\tlayerCache = cache[layerKey];\n\n\t\t\t\tlayer.hide();\n\n\t\t\t\tfor (var styleKey in layerCache) {\n\t\t\t\t\tif (hasOwnProperty.call(layerCache, styleKey)) {\n\t\t\t\t\t\tvar styleCache = layerCache[styleKey];\n\t\t\t\t\t\tfor (var key in styleCache) {\n\t\t\t\t\t\t\tif (hasOwnProperty.call(styleCache, key)) {\n\n\t\t\t\t\t\t\t\tvar positions = styleCache[key].positions;\n\n\t\t\t\t\t\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\t\t\t\t\t\t\tif (position.active) {\n\t\t\t\t\t\t\t\t\t\tif (!position.rendered) {\n\t\t\t\t\t\t\t\t\t\t\tlayer.append(position.element);\n\t\t\t\t\t\t\t\t\t\t\tposition.rendered = true;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tpositions.splice(i--, 1);\n\t\t\t\t\t\t\t\t\t\tif (position.rendered) {\n\t\t\t\t\t\t\t\t\t\t\tposition.element.detach();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (positions.length == 0) {\n\t\t\t\t\t\t\t\t\tdelete styleCache[key];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlayer.show();\n\t\t\t}\n\t\t}\n\t};\n\n\t// Creates (if necessary) and returns the text overlay container.\n\t//\n\t// @param {string} classes String of space-separated CSS classes used to\n\t//     uniquely identify the text layer.\n\t// @return {object} The jQuery-wrapped text-layer div.\n\n\tCanvas.prototype.getTextLayer = function(classes) {\n\n\t\tvar layer = this.text[classes];\n\n\t\t// Create the text layer if it doesn't exist\n\n\t\tif (layer == null) {\n\n\t\t\t// Create the text layer container, if it doesn't exist\n\n\t\t\tif (this.textContainer == null) {\n\t\t\t\tthis.textContainer = $(\"<div class='flot-text flot-temp-elem'></div>\")\n\t\t\t\t\t.css({\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t'font-size': \"smaller\",\n\t\t\t\t\t\tcolor: \"#545454\"\n\t\t\t\t\t})\n\t\t\t\t\t.insertAfter(this.element);\n\t\t\t}\n\n\t\t\tlayer = this.text[classes] = $(\"<div></div>\")\n\t\t\t\t.addClass(classes)\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tright: 0\n\t\t\t\t})\n\t\t\t\t.appendTo(this.textContainer);\n\t\t}\n\n\t\treturn layer;\n\t};\n\n\t// Creates (if necessary) and returns a text info object.\n\t//\n\t// The object looks like this:\n\t//\n\t// {\n\t//     width: Width of the text's wrapper div.\n\t//     height: Height of the text's wrapper div.\n\t//     element: The jQuery-wrapped HTML div containing the text.\n\t//     positions: Array of positions at which this text is drawn.\n\t// }\n\t//\n\t// The positions array contains objects that look like this:\n\t//\n\t// {\n\t//     active: Flag indicating whether the text should be visible.\n\t//     rendered: Flag indicating whether the text is currently visible.\n\t//     element: The jQuery-wrapped HTML div containing the text.\n\t//     x: X coordinate at which to draw the text.\n\t//     y: Y coordinate at which to draw the text.\n\t// }\n\t//\n\t// Each position after the first receives a clone of the original element.\n\t//\n\t// The idea is that that the width, height, and general 'identity' of the\n\t// text is constant no matter where it is placed; the placements are a\n\t// secondary property.\n\t//\n\t// Canvas maintains a cache of recently-used text info objects; getTextInfo\n\t// either returns the cached element or creates a new entry.\n\t//\n\t// @param {string} layer A string of space-separated CSS classes uniquely\n\t//     identifying the layer containing this text.\n\t// @param {string} text Text string to retrieve info for.\n\t// @param {(string|object)=} font Either a string of space-separated CSS\n\t//     classes or a font-spec object, defining the text's font and style.\n\t// @param {number=} angle Angle at which to rotate the text, in degrees.\n\t//     Angle is currently unused, it will be implemented in the future.\n\t// @param {number=} width Maximum width of the text before it wraps.\n\t// @return {object} a text info object.\n\n\tCanvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\n\n\t\tvar textStyle, layerCache, styleCache, info;\n\n\t\t// Cast the value to a string, in case we were given a number or such\n\n\t\ttext = \"\" + text;\n\n\t\t// If the font is a font-spec object, generate a CSS font definition\n\n\t\tif (typeof font === \"object\") {\n\t\t\ttextStyle = font.style + \" \" + font.variant + \" \" + font.weight + \" \" + font.size + \"px/\" + font.lineHeight + \"px \" + font.family;\n\t\t} else {\n\t\t\ttextStyle = font;\n\t\t}\n\n\t\t// Retrieve (or create) the cache for the text's layer and styles\n\n\t\tlayerCache = this._textCache[layer];\n\n\t\tif (layerCache == null) {\n\t\t\tlayerCache = this._textCache[layer] = {};\n\t\t}\n\n\t\tstyleCache = layerCache[textStyle];\n\n\t\tif (styleCache == null) {\n\t\t\tstyleCache = layerCache[textStyle] = {};\n\t\t}\n\n\t\tinfo = styleCache[text];\n\n\t\t// If we can't find a matching element in our cache, create a new one\n\n\t\tif (info == null) {\n\n\t\t\tvar element = $(\"<div></div>\").html(text)\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t'max-width': width,\n\t\t\t\t\ttop: -9999\n\t\t\t\t})\n\t\t\t\t.appendTo(this.getTextLayer(layer));\n\n\t\t\tif (typeof font === \"object\") {\n\t\t\t\telement.css({\n\t\t\t\t\tfont: textStyle,\n\t\t\t\t\tcolor: font.color\n\t\t\t\t});\n\t\t\t} else if (typeof font === \"string\") {\n\t\t\t\telement.addClass(font);\n\t\t\t}\n\n      info = styleCache[text] = { element: element, positions: [] };\n\n      var size = this._textSizeCache[text];\n\t\t\tif (size) {\n        info.width = size.width;\n        info.height = size.height;\n\t\t\t} else {\n        info.width = element.outerWidth(true);\n        info.height = element.outerHeight(true);\n        this._textSizeCache[text] = { width: info.width, height: info.height };\n\t\t\t}\n\t\t\telement.detach();\n\t\t}\n\n\t\treturn info;\n\t};\n\n\t// Adds a text string to the canvas text overlay.\n\t//\n\t// The text isn't drawn immediately; it is marked as rendering, which will\n\t// result in its addition to the canvas on the next render pass.\n\t//\n\t// @param {string} layer A string of space-separated CSS classes uniquely\n\t//     identifying the layer containing this text.\n\t// @param {number} x X coordinate at which to draw the text.\n\t// @param {number} y Y coordinate at which to draw the text.\n\t// @param {string} text Text string to draw.\n\t// @param {(string|object)=} font Either a string of space-separated CSS\n\t//     classes or a font-spec object, defining the text's font and style.\n\t// @param {number=} angle Angle at which to rotate the text, in degrees.\n\t//     Angle is currently unused, it will be implemented in the future.\n\t// @param {number=} width Maximum width of the text before it wraps.\n\t// @param {string=} halign Horizontal alignment of the text; either \"left\",\n\t//     \"center\" or \"right\".\n\t// @param {string=} valign Vertical alignment of the text; either \"top\",\n\t//     \"middle\" or \"bottom\".\n\n\tCanvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\n\n\t\tvar info = this.getTextInfo(layer, text, font, angle, width),\n\t\t\tpositions = info.positions;\n\n\t\t// Tweak the div's position to match the text's alignment\n\n\t\tif (halign == \"center\") {\n\t\t\tx -= info.width / 2;\n\t\t} else if (halign == \"right\") {\n\t\t\tx -= info.width;\n\t\t}\n\n\t\tif (valign == \"middle\") {\n\t\t\ty -= info.height / 2;\n\t\t} else if (valign == \"bottom\") {\n\t\t\ty -= info.height;\n\t\t}\n\n\t\t// Determine whether this text already exists at this position.\n\t\t// If so, mark it for inclusion in the next render pass.\n\n\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\tif (position.x == x && position.y == y) {\n\t\t\t\tposition.active = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If the text doesn't exist at this position, create a new entry\n\n\t\t// For the very first position we'll re-use the original element,\n\t\t// while for subsequent ones we'll clone it.\n\n\t\tposition = {\n\t\t\tactive: true,\n\t\t\trendered: false,\n\t\t\telement: positions.length ? info.element.clone() : info.element,\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\n\t\tpositions.push(position);\n\n\t\t// Move the element to its final position within the container\n\n\t\tposition.element.css({\n\t\t\ttop: Math.round(y),\n\t\t\tleft: Math.round(x),\n\t\t\t'text-align': halign\t// In case the text wraps\n\t\t});\n\t};\n\n\t// Removes one or more text strings from the canvas text overlay.\n\t//\n\t// If no parameters are given, all text within the layer is removed.\n\t//\n\t// Note that the text is not immediately removed; it is simply marked as\n\t// inactive, which will result in its removal on the next render pass.\n\t// This avoids the performance penalty for 'clear and redraw' behavior,\n\t// where we potentially get rid of all text on a layer, but will likely\n\t// add back most or all of it later, as when redrawing axes, for example.\n\t//\n\t// @param {string} layer A string of space-separated CSS classes uniquely\n\t//     identifying the layer containing this text.\n\t// @param {number=} x X coordinate of the text.\n\t// @param {number=} y Y coordinate of the text.\n\t// @param {string=} text Text string to remove.\n\t// @param {(string|object)=} font Either a string of space-separated CSS\n\t//     classes or a font-spec object, defining the text's font and style.\n\t// @param {number=} angle Angle at which the text is rotated, in degrees.\n\t//     Angle is currently unused, it will be implemented in the future.\n\n\tCanvas.prototype.removeText = function(layer, x, y, text, font, angle) {\n\t\tif (text == null) {\n\t\t\tvar layerCache = this._textCache[layer];\n\t\t\tif (layerCache != null) {\n\t\t\t\tfor (var styleKey in layerCache) {\n\t\t\t\t\tif (hasOwnProperty.call(layerCache, styleKey)) {\n\t\t\t\t\t\tvar styleCache = layerCache[styleKey];\n\t\t\t\t\t\tfor (var key in styleCache) {\n\t\t\t\t\t\t\tif (hasOwnProperty.call(styleCache, key)) {\n\t\t\t\t\t\t\t\tvar positions = styleCache[key].positions;\n\t\t\t\t\t\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\t\t\t\t\t\t\tposition.active = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar positions = this.getTextInfo(layer, text, font, angle).positions;\n\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\t\tif (position.x == x && position.y == y) {\n\t\t\t\t\tposition.active = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t///////////////////////////////////////////////////////////////////////////\n\t// The top-level container for the entire plot.\n\n    function Plot(placeholder, data_, options_, plugins) {\n        // data is on the form:\n        //   [ series1, series2 ... ]\n        // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\n        // or { data: [ [x1, y1], [x2, y2], ... ], label: \"some label\", ... }\n\n        var series = [],\n            options = {\n                // the color theme used for graphs\n                colors: [\"#edc240\", \"#afd8f8\", \"#cb4b4b\", \"#4da74d\", \"#9440ed\"],\n                legend: {\n                    show: true,\n                    noColumns: 1, // number of colums in legend table\n                    labelFormatter: null, // fn: string -> string\n                    labelBoxBorderColor: \"#ccc\", // border color for the little label boxes\n                    container: null, // container (as jQuery object) to put legend in, null means default on top of graph\n                    position: \"ne\", // position of default legend container within plot\n                    margin: 5, // distance from grid edge to default legend container within plot\n                    backgroundColor: null, // null means auto-detect\n                    backgroundOpacity: 0.85, // set to 0 to avoid background\n                    sorted: null    // default to no legend sorting\n                },\n                xaxis: {\n                    show: null, // null = auto-detect, true = always, false = never\n                    position: \"bottom\", // or \"top\"\n                    mode: null, // null or \"time\"\n                    font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \"italic\", weight: \"bold\", family: \"sans-serif\", variant: \"small-caps\" }\n                    color: null, // base color, labels, ticks\n                    tickColor: null, // possibly different color of ticks, e.g. \"rgba(0,0,0,0.15)\"\n                    transform: null, // null or f: number -> number to transform axis\n                    inverseTransform: null, // if transform is set, this should be the inverse function\n                    min: null, // min. value to show, null means set automatically\n                    max: null, // max. value to show, null means set automatically\n                    autoscaleMargin: null, // margin in % to add if auto-setting min/max\n                    ticks: null, // either [1, 3] or [[1, \"a\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\n                    tickFormatter: null, // fn: number -> string\n                    labelWidth: null, // size of tick labels in pixels\n                    labelHeight: null,\n                    reserveSpace: null, // whether to reserve space even if axis isn't shown\n                    tickLength: null, // size in pixels of ticks, or \"full\" for whole line\n                    alignTicksWithAxis: null, // axis number or null for no sync\n                    tickDecimals: null, // no. of decimals, null means auto\n                    tickSize: null, // number or [number, \"unit\"]\n                    minTickSize: null // number or [number, \"unit\"]\n                },\n                yaxis: {\n                    autoscaleMargin: 0.02,\n                    position: \"left\" // or \"right\"\n                },\n                xaxes: [],\n                yaxes: [],\n                series: {\n                    points: {\n                        show: false,\n                        radius: 3,\n                        lineWidth: 2, // in pixels\n                        fill: true,\n                        fillColor: \"#ffffff\",\n                        symbol: \"circle\" // or callback\n                    },\n                    lines: {\n                        // we don't put in show: false so we can see\n                        // whether lines were actively disabled\n                        lineWidth: 2, // in pixels\n                        fill: false,\n                        fillColor: null,\n                        steps: false\n                        // Omit 'zero', so we can later default its value to\n                        // match that of the 'fill' option.\n                    },\n                    bars: {\n                        show: false,\n                        lineWidth: 2, // in pixels\n                        barWidth: 1, // in units of the x axis\n                        fill: true,\n                        fillColor: null,\n                        align: \"left\", // \"left\", \"right\", or \"center\"\n                        horizontal: false,\n                        zero: true\n                    },\n                    shadowSize: 3,\n                    highlightColor: null\n                },\n                grid: {\n                    show: true,\n                    aboveData: false,\n                    color: \"#545454\", // primary color used for outline and labels\n                    backgroundColor: null, // null for transparent, else color\n                    borderColor: null, // set if different from the grid color\n                    tickColor: null, // color for the ticks, e.g. \"rgba(0,0,0,0.15)\"\n                    margin: 0, // distance from the canvas edge to the grid\n                    labelMargin: 5, // in pixels\n                    eventSectionHeight: 0, // space for event section\n                    axisMargin: 8, // in pixels\n                    borderWidth: 2, // in pixels\n                    minBorderMargin: null, // in pixels, null means taken from points radius\n                    markings: null, // array of ranges or fn: axes -> array of ranges\n                    markingsColor: \"#f4f4f4\",\n                    markingsLineWidth: 2,\n                    // interactive stuff\n                    clickable: false,\n                    hoverable: false,\n                    autoHighlight: true, // highlight in case mouse is near\n                    mouseActiveRadius: 10 // how far the mouse can be away to activate an item\n                },\n                interaction: {\n                    redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow\n                },\n                hooks: {}\n            },\n        surface = null,     // the canvas for the plot itself\n        overlay = null,     // canvas for interactive stuff on top of plot\n        eventHolder = null, // jQuery object that events should be bound to\n        ctx = null, octx = null,\n        xaxes = [], yaxes = [],\n        plotOffset = { left: 0, right: 0, top: 0, bottom: 0},\n        plotWidth = 0, plotHeight = 0,\n        hooks = {\n            processOptions: [],\n            processRawData: [],\n            processDatapoints: [],\n            processOffset: [],\n            processRange: [],\n            drawBackground: [],\n            drawSeries: [],\n            draw: [],\n            bindEvents: [],\n            drawOverlay: [],\n            shutdown: []\n        },\n        plot = this;\n\n        // public functions\n        plot.setData = setData;\n        plot.setupGrid = setupGrid;\n        plot.draw = draw;\n        plot.getPlaceholder = function() { return placeholder; };\n        plot.getCanvas = function() { return surface.element; };\n        plot.getPlotOffset = function() { return plotOffset; };\n        plot.width = function () { return plotWidth; };\n        plot.height = function () { return plotHeight; };\n        plot.offset = function () {\n            var o = eventHolder.offset();\n            o.left += plotOffset.left;\n            o.top += plotOffset.top;\n            return o;\n        };\n        plot.getData = function () { return series; };\n        plot.getAxes = function () {\n            var res = {}, i;\n            $.each(xaxes.concat(yaxes), function (_, axis) {\n                if (axis)\n                    res[axis.direction + (axis.n != 1 ? axis.n : \"\") + \"axis\"] = axis;\n            });\n            return res;\n        };\n        plot.getXAxes = function () { return xaxes; };\n        plot.getYAxes = function () { return yaxes; };\n        plot.c2p = canvasToAxisCoords;\n        plot.p2c = axisToCanvasCoords;\n        plot.getOptions = function () { return options; };\n        plot.highlight = highlight;\n        plot.unhighlight = unhighlight;\n        plot.triggerRedrawOverlay = triggerRedrawOverlay;\n        plot.pointOffset = function(point) {\n            return {\n                left: parseInt(xaxes[axisNumber(point, \"x\") - 1].p2c(+point.x) + plotOffset.left, 10),\n                top: parseInt(yaxes[axisNumber(point, \"y\") - 1].p2c(+point.y) + plotOffset.top, 10)\n            };\n        };\n        plot.shutdown = shutdown;\n        plot.destroy = function () {\n            shutdown();\n            placeholder.removeData(\"plot\").empty();\n\n            series = [];\n            options = null;\n            surface = null;\n            overlay = null;\n            eventHolder = null;\n            ctx = null;\n            octx = null;\n            xaxes = [];\n            yaxes = [];\n            hooks = null;\n            highlights = [];\n            plot = null;\n        };\n        plot.resize = function () {\n        \tvar width = placeholder.width(),\n        \t\theight = placeholder.height();\n            surface.resize(width, height);\n            overlay.resize(width, height);\n        };\n\n        // public attributes\n        plot.hooks = hooks;\n\n        // initialize\n        initPlugins(plot);\n        parseOptions(options_);\n        setupCanvases();\n        setData(data_);\n        setupGrid();\n        draw();\n        bindEvents();\n\n\n        function executeHooks(hook, args) {\n            args = [plot].concat(args);\n            for (var i = 0; i < hook.length; ++i)\n                hook[i].apply(this, args);\n        }\n\n        function initPlugins() {\n\n            // References to key classes, allowing plugins to modify them\n\n            var classes = {\n                Canvas: Canvas\n            };\n\n            for (var i = 0; i < plugins.length; ++i) {\n                var p = plugins[i];\n                p.init(plot, classes);\n                if (p.options)\n                    $.extend(true, options, p.options);\n            }\n        }\n\n        function parseOptions(opts) {\n\n            $.extend(true, options, opts);\n\n            // $.extend merges arrays, rather than replacing them.  When less\n            // colors are provided than the size of the default palette, we\n            // end up with those colors plus the remaining defaults, which is\n            // not expected behavior; avoid it by replacing them here.\n\n            if (opts && opts.colors) {\n            \toptions.colors = opts.colors;\n            }\n\n            if (options.xaxis.color == null)\n                options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n            if (options.yaxis.color == null)\n                options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n\n            if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility\n                options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\n            if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility\n                options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\n\n            if (options.grid.borderColor == null)\n                options.grid.borderColor = options.grid.color;\n            if (options.grid.tickColor == null)\n                options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n\n            // Fill in defaults for axis options, including any unspecified\n            // font-spec fields, if a font-spec was provided.\n\n            // If no x/y axis options were provided, create one of each anyway,\n            // since the rest of the code assumes that they exist.\n\n            var i, axisOptions, axisCount,\n                fontSize = placeholder.css(\"font-size\"),\n                fontSizeDefault = fontSize ? +fontSize.replace(\"px\", \"\") : 13,\n                fontDefaults = {\n                    style: placeholder.css(\"font-style\"),\n                    size: Math.round(0.8 * fontSizeDefault),\n                    variant: placeholder.css(\"font-variant\"),\n                    weight: placeholder.css(\"font-weight\"),\n                    family: placeholder.css(\"font-family\")\n                };\n\n            axisCount = options.xaxes.length || 1;\n            for (i = 0; i < axisCount; ++i) {\n\n                axisOptions = options.xaxes[i];\n                if (axisOptions && !axisOptions.tickColor) {\n                    axisOptions.tickColor = axisOptions.color;\n                }\n\n                axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\n                options.xaxes[i] = axisOptions;\n\n                if (axisOptions.font) {\n                    axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n                    if (!axisOptions.font.color) {\n                        axisOptions.font.color = axisOptions.color;\n                    }\n                    if (!axisOptions.font.lineHeight) {\n                        axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n                    }\n                }\n            }\n\n            axisCount = options.yaxes.length || 1;\n            for (i = 0; i < axisCount; ++i) {\n\n                axisOptions = options.yaxes[i];\n                if (axisOptions && !axisOptions.tickColor) {\n                    axisOptions.tickColor = axisOptions.color;\n                }\n\n                axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\n                options.yaxes[i] = axisOptions;\n\n                if (axisOptions.font) {\n                    axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n                    if (!axisOptions.font.color) {\n                        axisOptions.font.color = axisOptions.color;\n                    }\n                    if (!axisOptions.font.lineHeight) {\n                        axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n                    }\n                }\n            }\n\n            // backwards compatibility, to be removed in future\n            if (options.xaxis.noTicks && options.xaxis.ticks == null)\n                options.xaxis.ticks = options.xaxis.noTicks;\n            if (options.yaxis.noTicks && options.yaxis.ticks == null)\n                options.yaxis.ticks = options.yaxis.noTicks;\n            if (options.x2axis) {\n                options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\n                options.xaxes[1].position = \"top\";\n                // Override the inherit to allow the axis to auto-scale\n                if (options.x2axis.min == null) {\n                    options.xaxes[1].min = null;\n                }\n                if (options.x2axis.max == null) {\n                    options.xaxes[1].max = null;\n                }\n            }\n            if (options.y2axis) {\n                options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\n                options.yaxes[1].position = \"right\";\n                // Override the inherit to allow the axis to auto-scale\n                if (options.y2axis.min == null) {\n                    options.yaxes[1].min = null;\n                }\n                if (options.y2axis.max == null) {\n                    options.yaxes[1].max = null;\n                }\n            }\n            if (options.grid.coloredAreas)\n                options.grid.markings = options.grid.coloredAreas;\n            if (options.grid.coloredAreasColor)\n                options.grid.markingsColor = options.grid.coloredAreasColor;\n            if (options.lines)\n                $.extend(true, options.series.lines, options.lines);\n            if (options.points)\n                $.extend(true, options.series.points, options.points);\n            if (options.bars)\n                $.extend(true, options.series.bars, options.bars);\n            if (options.shadowSize != null)\n                options.series.shadowSize = options.shadowSize;\n            if (options.highlightColor != null)\n                options.series.highlightColor = options.highlightColor;\n\n            // save options on axes for future reference\n            for (i = 0; i < options.xaxes.length; ++i)\n                getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\n            for (i = 0; i < options.yaxes.length; ++i)\n                getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\n\n            // add hooks from options\n            for (var n in hooks)\n                if (options.hooks[n] && options.hooks[n].length)\n                    hooks[n] = hooks[n].concat(options.hooks[n]);\n\n            executeHooks(hooks.processOptions, [options]);\n        }\n\n        function setData(d) {\n            series = parseData(d);\n            fillInSeriesOptions();\n            processData();\n        }\n\n        function parseData(d) {\n            var res = [];\n            for (var i = 0; i < d.length; ++i) {\n                var s = $.extend(true, {}, options.series);\n\n                if (d[i].data != null) {\n                    s.data = d[i].data; // move the data instead of deep-copy\n                    delete d[i].data;\n\n                    $.extend(true, s, d[i]);\n\n                    d[i].data = s.data;\n                }\n                else\n                    s.data = d[i];\n                res.push(s);\n            }\n\n            return res;\n        }\n\n        function axisNumber(obj, coord) {\n            var a = obj[coord + \"axis\"];\n            if (typeof a == \"object\") // if we got a real axis, extract number\n                a = a.n;\n            if (typeof a != \"number\")\n                a = 1; // default to first axis\n            return a;\n        }\n\n        function allAxes() {\n            // return flat array without annoying null entries\n            return $.grep(xaxes.concat(yaxes), function (a) { return a; });\n        }\n\n        function canvasToAxisCoords(pos) {\n            // return an object with x/y corresponding to all used axes\n            var res = {}, i, axis;\n            for (i = 0; i < xaxes.length; ++i) {\n                axis = xaxes[i];\n                if (axis)\n                    res[\"x\" + axis.n] = axis.c2p(pos.left);\n            }\n\n            for (i = 0; i < yaxes.length; ++i) {\n                axis = yaxes[i];\n                if (axis)\n                    res[\"y\" + axis.n] = axis.c2p(pos.top);\n            }\n\n            if (res.x1 !== undefined)\n                res.x = res.x1;\n            if (res.y1 !== undefined)\n                res.y = res.y1;\n\n            return res;\n        }\n\n        function axisToCanvasCoords(pos) {\n            // get canvas coords from the first pair of x/y found in pos\n            var res = {}, i, axis, key;\n\n            for (i = 0; i < xaxes.length; ++i) {\n                axis = xaxes[i];\n                if (axis && axis.used) {\n                    key = \"x\" + axis.n;\n                    if (pos[key] == null && axis.n == 1)\n                        key = \"x\";\n\n                    if (pos[key] != null) {\n                        res.left = axis.p2c(pos[key]);\n                        break;\n                    }\n                }\n            }\n\n            for (i = 0; i < yaxes.length; ++i) {\n                axis = yaxes[i];\n                if (axis && axis.used) {\n                    key = \"y\" + axis.n;\n                    if (pos[key] == null && axis.n == 1)\n                        key = \"y\";\n\n                    if (pos[key] != null) {\n                        res.top = axis.p2c(pos[key]);\n                        break;\n                    }\n                }\n            }\n\n            return res;\n        }\n\n        function getOrCreateAxis(axes, number) {\n            if (!axes[number - 1])\n                axes[number - 1] = {\n                    n: number, // save the number for future reference\n                    direction: axes == xaxes ? \"x\" : \"y\",\n                    options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)\n                };\n\n            return axes[number - 1];\n        }\n\n        function fillInSeriesOptions() {\n\n            var neededColors = series.length, maxIndex = -1, i;\n\n            // Subtract the number of series that already have fixed colors or\n            // color indexes from the number that we still need to generate.\n\n            for (i = 0; i < series.length; ++i) {\n                var sc = series[i].color;\n                if (sc != null) {\n                    neededColors--;\n                    if (typeof sc == \"number\" && sc > maxIndex) {\n                        maxIndex = sc;\n                    }\n                }\n            }\n\n            // If any of the series have fixed color indexes, then we need to\n            // generate at least as many colors as the highest index.\n\n            if (neededColors <= maxIndex) {\n                neededColors = maxIndex + 1;\n            }\n\n            // Generate all the colors, using first the option colors and then\n            // variations on those colors once they're exhausted.\n\n            var c, colors = [], colorPool = options.colors,\n                colorPoolSize = colorPool.length, variation = 0;\n\n            for (i = 0; i < neededColors; i++) {\n\n                c = $.color.parse(colorPool[i % colorPoolSize] || \"#666\");\n\n                // Each time we exhaust the colors in the pool we adjust\n                // a scaling factor used to produce more variations on\n                // those colors. The factor alternates negative/positive\n                // to produce lighter/darker colors.\n\n                // Reset the variation after every few cycles, or else\n                // it will end up producing only white or black colors.\n\n                if (i % colorPoolSize == 0 && i) {\n                    if (variation >= 0) {\n                        if (variation < 0.5) {\n                            variation = -variation - 0.2;\n                        } else variation = 0;\n                    } else variation = -variation;\n                }\n\n                colors[i] = c.scale('rgb', 1 + variation);\n            }\n\n            // Finalize the series options, filling in their colors\n\n            var colori = 0, s;\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n\n                // assign colors\n                if (s.color == null) {\n                    s.color = colors[colori].toString();\n                    ++colori;\n                }\n                else if (typeof s.color == \"number\")\n                    s.color = colors[s.color].toString();\n\n                // turn on lines automatically in case nothing is set\n                if (s.lines.show == null) {\n                    var v, show = true;\n                    for (v in s)\n                        if (s[v] && s[v].show) {\n                            show = false;\n                            break;\n                        }\n                    if (show)\n                        s.lines.show = true;\n                }\n\n                // If nothing was provided for lines.zero, default it to match\n                // lines.fill, since areas by default should extend to zero.\n\n                if (s.lines.zero == null) {\n                    s.lines.zero = !!s.lines.fill;\n                }\n\n                // setup axes\n                s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \"x\"));\n                s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \"y\"));\n            }\n        }\n\n        function processData() {\n            var topSentry = Number.POSITIVE_INFINITY,\n                bottomSentry = Number.NEGATIVE_INFINITY,\n                fakeInfinity = Number.MAX_VALUE,\n                i, j, k, m, length,\n                s, points, ps, x, y, axis, val, f, p,\n                data, format;\n\n            function updateAxis(axis, min, max) {\n                if (min < axis.datamin && min != -fakeInfinity)\n                    axis.datamin = min;\n                if (max > axis.datamax && max != fakeInfinity)\n                    axis.datamax = max;\n            }\n\n            $.each(allAxes(), function (_, axis) {\n                // init axis\n                axis.datamin = topSentry;\n                axis.datamax = bottomSentry;\n                axis.used = false;\n            });\n\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n                s.datapoints = { points: [] };\n\n                executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);\n            }\n\n            // first pass: clean and copy data\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n\n                data = s.data;\n                format = s.datapoints.format;\n\n                if (!format) {\n                    format = [];\n                    // find out how to copy\n                    format.push({ x: true, number: true, required: true });\n                    format.push({ y: true, number: true, required: true });\n\n                    if (s.stack || s.bars.show || (s.lines.show && s.lines.fill)) {\n                        var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\n                        format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\n                        if (s.bars.horizontal) {\n                            delete format[format.length - 1].y;\n                            format[format.length - 1].x = true;\n                        }\n                    }\n\n                    s.datapoints.format = format;\n                }\n\n                if (s.datapoints.pointsize != null)\n                    continue; // already filled in\n\n                s.datapoints.pointsize = format.length;\n\n                ps = s.datapoints.pointsize;\n                points = s.datapoints.points;\n\n                var insertSteps = s.lines.show && s.lines.steps;\n                s.xaxis.used = s.yaxis.used = true;\n\n                for (j = k = 0; j < data.length; ++j, k += ps) {\n                    p = data[j];\n\n                    var nullify = p == null;\n                    if (!nullify) {\n                        for (m = 0; m < ps; ++m) {\n                            val = p[m];\n                            f = format[m];\n\n                            if (f) {\n                                if (f.number && val != null) {\n                                    val = +val; // convert to number\n                                    if (isNaN(val))\n                                        val = null;\n                                    else if (val == Infinity)\n                                        val = fakeInfinity;\n                                    else if (val == -Infinity)\n                                        val = -fakeInfinity;\n                                }\n\n                                if (val == null) {\n                                    if (f.required)\n                                        nullify = true;\n\n                                    if (f.defaultValue != null)\n                                        val = f.defaultValue;\n                                }\n                            }\n\n                            points[k + m] = val;\n                        }\n                    }\n\n                    if (nullify) {\n                        for (m = 0; m < ps; ++m) {\n                            val = points[k + m];\n                            if (val != null) {\n                                f = format[m];\n                                // extract min/max info\n                                if (f.autoscale !== false) {\n                                    if (f.x) {\n                                        updateAxis(s.xaxis, val, val);\n                                    }\n                                    if (f.y) {\n                                        updateAxis(s.yaxis, val, val);\n                                    }\n                                }\n                            }\n                            points[k + m] = null;\n                        }\n                    }\n\n                    if (insertSteps && k > 0 && (!nullify || points[k - ps] != null)) {\n                        // copy the point to make room for a middle point\n                        for (m = 0; m < ps; ++m)\n                            points[k + ps + m] = points[k + m];\n\n                        // middle point has same y\n                        points[k + 1] = points[k - ps + 1] || 0;\n\n                        // if series has null values, let's give the last !null value a nice step\n                        if(nullify)\n                        \tpoints[k] = p[0];\n\n                        // we've added a point, better reflect that\n                        k += ps;\n                    }\n                }\n            }\n\n            // give the hooks a chance to run\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n                points = s.datapoints.points;\n                ps = s.datapoints.pointsize;\n\n                // grafana\n                if (s.transform === 'negative-Y') {\n                  for (j = 0; j < points.length; j += ps) {\n                    if (points[j] == null)\n                        continue;\n\n                      val = points[j + 1];\n                      points[j + 1] = -val;\n                  }\n                }\n\n                executeHooks(hooks.processDatapoints, [ s, s.datapoints]);\n            }\n\n            // second pass: find datamax/datamin for auto-scaling\n            for (i = 0; i < series.length; ++i) {\n                s = series[i];\n                points = s.datapoints.points;\n                ps = s.datapoints.pointsize;\n                format = s.datapoints.format;\n\n                var xmin = topSentry, ymin = topSentry,\n                    xmax = bottomSentry, ymax = bottomSentry;\n\n                for (j = 0; j < points.length; j += ps) {\n                    if (points[j] == null)\n                        continue;\n\n                    for (m = 0; m < ps; ++m) {\n                        val = points[j + m];\n                        f = format[m];\n                        if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)\n                            continue;\n\n                        if (f.x) {\n                            if (val < xmin)\n                                xmin = val;\n                            if (val > xmax)\n                                xmax = val;\n                        }\n                        if (f.y) {\n                            if (val < ymin)\n                                ymin = val;\n                            if (val > ymax)\n                                ymax = val;\n                        }\n                    }\n                }\n\n                if (s.bars.show) {\n                    // make sure we got room for the bar on the dancing floor\n                    var delta;\n\n                    switch (s.bars.align) {\n                        case \"left\":\n                            delta = 0;\n                            break;\n                        case \"right\":\n                            delta = -s.bars.barWidth;\n                            break;\n                        default:\n                            delta = -s.bars.barWidth / 2;\n                    }\n\n                    if (s.bars.horizontal) {\n                        ymin += delta;\n                        ymax += delta + s.bars.barWidth;\n                    }\n                    else {\n                        xmin += delta;\n                        xmax += delta + s.bars.barWidth;\n                    }\n                }\n\n                updateAxis(s.xaxis, xmin, xmax);\n                updateAxis(s.yaxis, ymin, ymax);\n            }\n\n            $.each(allAxes(), function (_, axis) {\n                if (axis.datamin == topSentry)\n                    axis.datamin = null;\n                if (axis.datamax == bottomSentry)\n                    axis.datamax = null;\n            });\n        }\n\n        function setupCanvases() {\n            // Make sure the placeholder is clear of everything except canvases\n            // from a previous plot in this container that we'll try to re-use.\n\n            placeholder.find(\".flot-temp-elem\").remove();\n\n            if (placeholder.css(\"position\") == 'static')\n                placeholder.css(\"position\", \"relative\"); // for positioning labels and overlay\n\n            surface = new Canvas(\"flot-base\", placeholder);\n            overlay = new Canvas(\"flot-overlay\", placeholder); // overlay canvas for interactive features\n\n            ctx = surface.context;\n            octx = overlay.context;\n\n            // define which element we're listening for events on\n            eventHolder = $(overlay.element).unbind();\n\n            // If we're re-using a plot object, shut down the old one\n\n            var existing = placeholder.data(\"plot\");\n\n            if (existing) {\n                existing.shutdown();\n                overlay.clear();\n            }\n\n            // save in case we get replotted\n            placeholder.data(\"plot\", plot);\n        }\n\n        function bindEvents() {\n            // bind events\n            if (options.grid.hoverable) {\n                eventHolder.mousemove(onMouseMove);\n\n                // Use bind, rather than .mouseleave, because we officially\n                // still support jQuery 1.2.6, which doesn't define a shortcut\n                // for mouseenter or mouseleave.  This was a bug/oversight that\n                // was fixed somewhere around 1.3.x.  We can return to using\n                // .mouseleave when we drop support for 1.2.6.\n\n                eventHolder.bind(\"mouseleave\", onMouseLeave);\n                $(document).bind(\"touchend\", onTouch);\n            }\n\n            if (options.grid.clickable)\n                eventHolder.click(onClick);\n\n            executeHooks(hooks.bindEvents, [eventHolder]);\n        }\n\n        function shutdown() {\n            if (redrawTimeout)\n                clearTimeout(redrawTimeout);\n\n            eventHolder.unbind(\"mousemove\", onMouseMove);\n            eventHolder.unbind(\"mouseleave\", onMouseLeave);\n            eventHolder.unbind(\"click\", onClick);\n            $(document).unbind(\"touchend\", onTouch);\n\n            executeHooks(hooks.shutdown, [eventHolder]);\n        }\n\n        function setTransformationHelpers(axis) {\n            // set helper functions on the axis, assumes plot area\n            // has been computed already\n\n            function identity(x) { return x; }\n\n            var s, m, t = axis.options.transform || identity,\n                it = axis.options.inverseTransform;\n\n            // precompute how much the axis is scaling a point\n            // in canvas space\n            if (axis.direction == \"x\") {\n                s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\n                m = Math.min(t(axis.max), t(axis.min));\n            }\n            else {\n                s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\n                s = -s;\n                m = Math.max(t(axis.max), t(axis.min));\n            }\n\n            // data point to canvas coordinate\n            if (t == identity) // slight optimization\n                axis.p2c = function (p) { return (p - m) * s; };\n            else\n                axis.p2c = function (p) { return (t(p) - m) * s; };\n            // canvas coordinate to data point\n            if (!it)\n                axis.c2p = function (c) { return m + c / s; };\n            else\n                axis.c2p = function (c) { return it(m + c / s); };\n        }\n\n        function measureTickLabels(axis) {\n\n            var opts = axis.options,\n                ticks = axis.ticks || [],\n                labelWidth = opts.labelWidth || 0,\n                labelHeight = opts.labelHeight || 0,\n                maxWidth = labelWidth || (axis.direction == \"x\" ? Math.floor(surface.width / (ticks.length || 1)) : null),\n                legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\n                layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\n                font = opts.font || \"flot-tick-label tickLabel\";\n\n            for (var i = 0; i < ticks.length; ++i) {\n\n                var t = ticks[i];\n\n                if (!t.label)\n                    continue;\n\n                var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);\n\n                /// Grafana fix, add +1 to label width\n                labelWidth = Math.max(labelWidth, info.width + 1);\n                labelHeight = Math.max(labelHeight, info.height);\n            }\n\n            axis.labelWidth = opts.labelWidth || labelWidth;\n            axis.labelHeight = opts.labelHeight || labelHeight;\n        }\n\n        function allocateAxisBoxFirstPhase(axis) {\n            // find the bounding box of the axis by looking at label\n            // widths/heights and ticks, make room by diminishing the\n            // plotOffset; this first phase only looks at one\n            // dimension per axis, the other dimension depends on the\n            // other axes so will have to wait\n\n            var lw = axis.labelWidth,\n                lh = axis.labelHeight,\n                pos = axis.options.position,\n                isXAxis = axis.direction === \"x\",\n                tickLength = axis.options.tickLength,\n                axisMargin = options.grid.axisMargin,\n                padding = options.grid.labelMargin,\n                eventSectionPadding = options.grid.eventSectionHeight,\n                innermost = true,\n                outermost = true,\n                first = true,\n                found = false;\n\n            // Determine the axis's position in its direction and on its side\n\n            $.each(isXAxis ? xaxes : yaxes, function(i, a) {\n                if (a && (a.show || a.reserveSpace)) {\n                    if (a === axis) {\n                        found = true;\n                    } else if (a.options.position === pos) {\n                        if (found) {\n                            outermost = false;\n                        } else {\n                            innermost = false;\n                        }\n                    }\n                    if (!found) {\n                        first = false;\n                    }\n                }\n            });\n\n            // The outermost axis on each side has no margin\n\n            if (outermost) {\n                axisMargin = 0;\n            }\n\n            // The ticks for the first axis in each direction stretch across\n\n            if (tickLength == null) {\n                tickLength = first ? \"full\" : 5;\n            }\n\n            if (!isNaN(+tickLength))\n                padding += +tickLength;\n\n            if (isXAxis) {\n                // Add space for event section\n                lh += padding;\n                lh += eventSectionPadding;\n\n                if (pos == \"bottom\") {\n                    plotOffset.bottom += lh + axisMargin;\n                    axis.box = { top: surface.height - plotOffset.bottom, height: lh };\n                }\n                else {\n                    axis.box = { top: plotOffset.top + axisMargin, height: lh };\n                    plotOffset.top += lh + axisMargin;\n                }\n            }\n            else {\n                lw += padding;\n\n                if (pos == \"left\") {\n                    axis.box = { left: plotOffset.left + axisMargin, width: lw };\n                    plotOffset.left += lw + axisMargin;\n                }\n                else {\n                    plotOffset.right += lw + axisMargin;\n                    axis.box = { left: surface.width - plotOffset.right, width: lw };\n                }\n            }\n\n             // save for future reference\n            axis.position = pos;\n            axis.tickLength = tickLength;\n            axis.box.padding = padding;\n            axis.box.eventSectionPadding = eventSectionPadding;\n            axis.innermost = innermost;\n        }\n\n        function allocateAxisBoxSecondPhase(axis) {\n            // now that all axis boxes have been placed in one\n            // dimension, we can set the remaining dimension coordinates\n            if (axis.direction == \"x\") {\n                axis.box.left = plotOffset.left - axis.labelWidth / 2;\n                axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\n            }\n            else {\n                axis.box.top = plotOffset.top - axis.labelHeight / 2;\n                axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\n            }\n        }\n\n        function adjustLayoutForThingsStickingOut() {\n            // possibly adjust plot offset to ensure everything stays\n            // inside the canvas and isn't clipped off\n\n            var minMargin = options.grid.minBorderMargin,\n                axis, i;\n\n            // check stuff from the plot (FIXME: this should just read\n            // a value from the series, otherwise it's impossible to\n            // customize)\n            if (minMargin == null) {\n                minMargin = 0;\n                for (i = 0; i < series.length; ++i)\n                    minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));\n            }\n\n            var margins = {\n                left: minMargin,\n                right: minMargin,\n                top: minMargin,\n                bottom: minMargin\n            };\n\n            // check axis labels, note we don't check the actual\n            // labels but instead use the overall width/height to not\n            // jump as much around with replots\n            $.each(allAxes(), function (_, axis) {\n                if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\n                    if (axis.direction === \"x\") {\n                        margins.left = Math.max(margins.left, axis.labelWidth / 2);\n                        margins.right = Math.max(margins.right, axis.labelWidth / 2);\n                    } else {\n                        margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\n                        margins.top = Math.max(margins.top, axis.labelHeight / 2);\n                    }\n                }\n            });\n\n            plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\n            plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\n            plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\n            plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\n        }\n\n        function setupGrid() {\n            var i, axes = allAxes(), showGrid = options.grid.show;\n\n            // Initialize the plot's offset from the edge of the canvas\n\n            for (var a in plotOffset) {\n                var margin = options.grid.margin || 0;\n                plotOffset[a] = typeof margin == \"number\" ? margin : margin[a] || 0;\n            }\n\n            executeHooks(hooks.processOffset, [plotOffset]);\n\n            // If the grid is visible, add its border width to the offset\n\n            for (var a in plotOffset) {\n                if(typeof(options.grid.borderWidth) == \"object\") {\n                    plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\n                }\n                else {\n                    plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\n                }\n            }\n\n            $.each(axes, function (_, axis) {\n                var axisOpts = axis.options;\n                axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\n                axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\n                setRange(axis);\n            });\n\n            executeHooks(hooks.processRange, []);\n\n            if (showGrid) {\n\n                var allocatedAxes = $.grep(axes, function (axis) {\n                    return axis.show || axis.reserveSpace;\n                });\n\n                var snaped = false;\n                for (var i = 0; i < 2; i++) {\n                    $.each(allocatedAxes, function (_, axis) {\n                        // make the ticks\n                        setupTickGeneration(axis);\n                        setTicks(axis);\n                        snaped = snapRangeToTicks(axis, axis.ticks) || snaped;\n                        // find labelWidth/Height for axis\n                        measureTickLabels(axis);\n                    });\n\n                    if (snaped && hooks.processRange.length > 0) {\n                        executeHooks(hooks.processRange, []);\n                        snaped = false;\n                    } else {\n                        break;\n                    }\n                }\n\n                // with all dimensions calculated, we can compute the\n                // axis bounding boxes, start from the outside\n                // (reverse order)\n                for (i = allocatedAxes.length - 1; i >= 0; --i)\n                    allocateAxisBoxFirstPhase(allocatedAxes[i]);\n\n                // make sure we've got enough space for things that\n                // might stick out\n                adjustLayoutForThingsStickingOut();\n\n                $.each(allocatedAxes, function (_, axis) {\n                    allocateAxisBoxSecondPhase(axis);\n                });\n            }\n\n\n            plotWidth = surface.width - plotOffset.left - plotOffset.right;\n            plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\n\n            // now we got the proper plot dimensions, we can compute the scaling\n            $.each(axes, function (_, axis) {\n                setTransformationHelpers(axis);\n            });\n\n            if (showGrid) {\n                drawAxisLabels();\n            }\n\n            insertLegend();\n        }\n\n        function setRange(axis) {\n            var opts = axis.options,\n                min = +(opts.min != null ? opts.min : axis.datamin),\n                max = +(opts.max != null ? opts.max : axis.datamax),\n                delta = max - min;\n\n            if (delta == 0.0) {\n                // Grafana fix: wide Y min and max using increased wideFactor\n                // when all series values are the same\n                var wideFactor = 0.25;\n                var widen = Math.abs(max == 0 ? 1 : max * wideFactor);\n\n                if (opts.min == null) {\n                  min -= widen;\n                }\n                // always widen max if we couldn't widen min to ensure we\n                // don't fall into min == max which doesn't work\n                if (opts.max == null || opts.min != null) {\n                  max += widen;\n                }\n            }\n            else {\n                // consider autoscaling\n                var margin = opts.autoscaleMargin;\n                if (margin != null) {\n                    if (opts.min == null) {\n                        min -= delta * margin;\n                        // make sure we don't go below zero if all values\n                        // are positive\n                        if (min < 0 && axis.datamin != null && axis.datamin >= 0)\n                            min = 0;\n                    }\n                    if (opts.max == null) {\n                        max += delta * margin;\n                        if (max > 0 && axis.datamax != null && axis.datamax <= 0)\n                            max = 0;\n                    }\n                }\n            }\n            axis.min = min;\n            axis.max = max;\n        }\n\n        // grafana change\n        function getSignificantDigitCount(n) {\n          //remove decimal and make positive\n          n = Math.abs(String(n).replace(\".\", \"\"));\n          if (n == 0) {\n            return 0;\n          }\n\n          // kill the 0s at the end of n\n          while (n != 0 && n % 10 == 0) {\n            n /= 10;\n          }\n\n          // get number of digits\n          return Math.floor(Math.log(n) / Math.LN10) + 1;\n        }\n\n        function setupTickGeneration(axis) {\n            var opts = axis.options;\n\n            // estimate number of ticks\n            var noTicks;\n            if (typeof opts.ticks == \"number\" && opts.ticks > 0)\n                noTicks = opts.ticks;\n            else\n                // heuristic based on the model a*sqrt(x) fitted to\n                // some data points that seemed reasonable\n                noTicks = 0.3 * Math.sqrt(axis.direction == \"x\" ? surface.width : surface.height);\n\n            var delta = (axis.max - axis.min) / noTicks,\n                dec = -Math.floor(Math.log(delta) / Math.LN10),\n                maxDec = opts.tickDecimals;\n\n            if (maxDec != null && dec > maxDec) {\n                dec = maxDec;\n            }\n\n            var magn = Math.pow(10, -dec),\n                norm = delta / magn, // norm is between 1.0 and 10.0\n                size;\n\n            if (norm < 1.5) {\n                size = 1;\n            } else if (norm < 3) {\n                size = 2;\n                // special case for 2.5, requires an extra decimal\n                if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\n                    size = 2.5;\n                    ++dec;\n                }\n            } else if (norm < 7.5) {\n                size = 5;\n            } else {\n                size = 10;\n            }\n\n            size *= magn;\n\n            if (opts.minTickSize != null && size < opts.minTickSize) {\n                size = opts.minTickSize;\n            }\n\n            axis.delta = delta;\n            axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\n            axis.tickSize = opts.tickSize || size;\n\n            // grafana addition\n            if (opts.tickDecimals === null || opts.tickDecimals === undefined) {\n              axis.scaledDecimals = axis.tickDecimals + dec;\n            }\n\n            // Time mode was moved to a plug-in in 0.8, and since so many people use it\n            // we'll add an especially friendly reminder to make sure they included it.\n\n            if (opts.mode == \"time\" && !axis.tickGenerator) {\n                throw new Error(\"Time mode requires the flot.time plugin.\");\n            }\n\n            // Flot supports base-10 axes; any other mode else is handled by a plug-in,\n            // like flot.time.js.\n\n            if (!axis.tickGenerator) {\n\n                axis.tickGenerator = function (axis) {\n\n                    var ticks = [],\n                        start = floorInBase(axis.min, axis.tickSize),\n                        i = 0,\n                        v = Number.NaN,\n                        prev;\n\n                    do {\n                        prev = v;\n                        v = start + i * axis.tickSize;\n                        ticks.push(v);\n                        ++i;\n                    } while (v < axis.max && v != prev);\n                    return ticks;\n                };\n\n\t\t\t\taxis.tickFormatter = function (value, axis) {\n\n\t\t\t\t\tvar factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\n\t\t\t\t\tvar formatted = \"\" + Math.round(value * factor) / factor;\n\n\t\t\t\t\t// If tickDecimals was specified, ensure that we have exactly that\n\t\t\t\t\t// much precision; otherwise default to the value's own precision.\n\n\t\t\t\t\tif (axis.tickDecimals != null) {\n\t\t\t\t\t\tvar decimal = formatted.indexOf(\".\");\n\t\t\t\t\t\tvar precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\n\t\t\t\t\t\tif (precision < axis.tickDecimals) {\n\t\t\t\t\t\t\treturn (precision ? formatted : formatted + \".\") + (\"\" + factor).substr(1, axis.tickDecimals - precision);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n                    return formatted;\n                };\n            }\n\n            if ($.isFunction(opts.tickFormatter))\n                axis.tickFormatter = function (v, axis) { return \"\" + opts.tickFormatter(v, axis); };\n\n            if (opts.alignTicksWithAxis != null) {\n                var otherAxis = (axis.direction == \"x\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\n                if (otherAxis && otherAxis.used && otherAxis != axis) {\n                    // consider snapping min/max to outermost nice ticks\n                    var niceTicks = axis.tickGenerator(axis);\n                    if (niceTicks.length > 0) {\n                        if (opts.min == null)\n                            axis.min = Math.min(axis.min, niceTicks[0]);\n                        if (opts.max == null && niceTicks.length > 1)\n                            axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\n                    }\n\n                    axis.tickGenerator = function (axis) {\n                        // copy ticks, scaled to this axis\n                        var ticks = [], v, i;\n                        for (i = 0; i < otherAxis.ticks.length; ++i) {\n                            v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\n                            v = axis.min + v * (axis.max - axis.min);\n                            ticks.push(v);\n                        }\n                        return ticks;\n                    };\n\n                    // we might need an extra decimal since forced\n                    // ticks don't necessarily fit naturally\n                    if (!axis.mode && opts.tickDecimals == null) {\n                        var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\n                            ts = axis.tickGenerator(axis);\n\n                        // only proceed if the tick interval rounded\n                        // with an extra decimal doesn't give us a\n                        // zero at end\n                        if (!(ts.length > 1 && /\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))\n                            axis.tickDecimals = extraDec;\n                    }\n                }\n            }\n        }\n\n        function setTicks(axis) {\n            var oticks = axis.options.ticks, ticks = [];\n            if (oticks == null || (typeof oticks == \"number\" && oticks > 0))\n                ticks = axis.tickGenerator(axis);\n            else if (oticks) {\n                if ($.isFunction(oticks))\n                    // generate the ticks\n                    ticks = oticks(axis);\n                else\n                    ticks = oticks;\n            }\n\n            // clean up/labelify the supplied ticks, copy them over\n            var i, v;\n            axis.ticks = [];\n            for (i = 0; i < ticks.length; ++i) {\n                var label = null;\n                var t = ticks[i];\n                if (typeof t == \"object\") {\n                    v = +t[0];\n                    if (t.length > 1)\n                        label = t[1];\n                }\n                else\n                    v = +t;\n                if (label == null)\n                    label = axis.tickFormatter(v, axis);\n                if (!isNaN(v))\n                    axis.ticks.push({ v: v, label: label });\n            }\n        }\n\n        function snapRangeToTicks(axis, ticks) {\n            var changed = false;\n            if (axis.options.autoscaleMargin && ticks.length > 0) {\n                // snap to ticks\n                if (axis.options.min == null) {\n                    axis.min = Math.min(axis.min, ticks[0].v);\n                    changed = true;\n                }\n                if (axis.options.max == null && ticks.length > 1) {\n                    axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\n                    changed = true;\n                }\n            }\n            return changed;\n        }\n\n        function draw() {\n\n            surface.clear();\n\n            executeHooks(hooks.drawBackground, [ctx]);\n\n            var grid = options.grid;\n\n            // draw background, if any\n            if (grid.show && grid.backgroundColor)\n                drawBackground();\n\n            if (grid.show && !grid.aboveData) {\n                drawGrid();\n            }\n\n            for (var i = 0; i < series.length; ++i) {\n                executeHooks(hooks.drawSeries, [ctx, series[i]]);\n                drawSeries(series[i]);\n            }\n\n            executeHooks(hooks.draw, [ctx]);\n\n            if (grid.show && grid.aboveData) {\n                drawGrid();\n            }\n\n            surface.render();\n\n            // A draw implies that either the axes or data have changed, so we\n            // should probably update the overlay highlights as well.\n\n            triggerRedrawOverlay();\n        }\n\n        function extractRange(ranges, coord) {\n            var axis, from, to, key, axes = allAxes();\n\n            for (var i = 0; i < axes.length; ++i) {\n                axis = axes[i];\n                if (axis.direction == coord) {\n                    key = coord + axis.n + \"axis\";\n                    if (!ranges[key] && axis.n == 1)\n                        key = coord + \"axis\"; // support x1axis as xaxis\n                    if (ranges[key]) {\n                        from = ranges[key].from;\n                        to = ranges[key].to;\n                        break;\n                    }\n                }\n            }\n\n            // backwards-compat stuff - to be removed in future\n            if (!ranges[key]) {\n                axis = coord == \"x\" ? xaxes[0] : yaxes[0];\n                from = ranges[coord + \"1\"];\n                to = ranges[coord + \"2\"];\n            }\n\n            // auto-reverse as an added bonus\n            if (from != null && to != null && from > to) {\n                var tmp = from;\n                from = to;\n                to = tmp;\n            }\n\n            return { from: from, to: to, axis: axis };\n        }\n\n        function drawBackground() {\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \"rgba(255, 255, 255, 0)\");\n            ctx.fillRect(0, 0, plotWidth, plotHeight);\n            ctx.restore();\n        }\n\n        function drawGrid() {\n            var i, axes, bw, bc;\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            // draw markings\n            var markings = options.grid.markings;\n            if (markings) {\n                if ($.isFunction(markings)) {\n                    axes = plot.getAxes();\n                    // xmin etc. is backwards compatibility, to be\n                    // removed in the future\n                    axes.xmin = axes.xaxis.min;\n                    axes.xmax = axes.xaxis.max;\n                    axes.ymin = axes.yaxis.min;\n                    axes.ymax = axes.yaxis.max;\n\n                    markings = markings(axes);\n                }\n\n                for (i = 0; i < markings.length; ++i) {\n                    var m = markings[i],\n                        xrange = extractRange(m, \"x\"),\n                        yrange = extractRange(m, \"y\");\n\n                    // fill in missing\n                    if (xrange.from == null)\n                        xrange.from = xrange.axis.min;\n                    if (xrange.to == null)\n                        xrange.to = xrange.axis.max;\n                    if (yrange.from == null)\n                        yrange.from = yrange.axis.min;\n                    if (yrange.to == null)\n                        yrange.to = yrange.axis.max;\n\n                    // clip\n                    if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||\n                        yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)\n                        continue;\n\n                    xrange.from = Math.max(xrange.from, xrange.axis.min);\n                    xrange.to = Math.min(xrange.to, xrange.axis.max);\n                    yrange.from = Math.max(yrange.from, yrange.axis.min);\n                    yrange.to = Math.min(yrange.to, yrange.axis.max);\n\n                    var xequal = xrange.from === xrange.to,\n                        yequal = yrange.from === yrange.to;\n\n                    if (xequal && yequal) {\n                        continue;\n                    }\n\n                    // then draw\n                    xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\n                    xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\n                    yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\n                    yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\n\n                    if (xequal || yequal) {\n                        var lineWidth = m.lineWidth || options.grid.markingsLineWidth,\n                            subPixel = lineWidth % 2 ? 0.5 : 0;\n                        ctx.beginPath();\n                        ctx.strokeStyle = m.color || options.grid.markingsColor;\n                        ctx.lineWidth = lineWidth;\n                        if (xequal) {\n                            ctx.moveTo(xrange.to + subPixel, yrange.from);\n                            ctx.lineTo(xrange.to + subPixel, yrange.to);\n                        } else {\n                            ctx.moveTo(xrange.from, yrange.to + subPixel);\n                            ctx.lineTo(xrange.to, yrange.to + subPixel);\n                        }\n                        ctx.stroke();\n                    } else {\n                        ctx.fillStyle = m.color || options.grid.markingsColor;\n                        ctx.fillRect(xrange.from, yrange.to,\n                                     xrange.to - xrange.from,\n                                     yrange.from - yrange.to);\n                    }\n                }\n            }\n\n            // draw the ticks\n            axes = allAxes();\n            bw = options.grid.borderWidth;\n\n            for (var j = 0; j < axes.length; ++j) {\n                var axis = axes[j], box = axis.box,\n                    t = axis.tickLength, x, y, xoff, yoff;\n                if (!axis.show || axis.ticks.length == 0)\n                    continue;\n\n                ctx.lineWidth = 1;\n\n                // find the edges\n                if (axis.direction == \"x\") {\n                    x = 0;\n                    if (t == \"full\")\n                        y = (axis.position == \"top\" ? 0 : plotHeight);\n                    else\n                        y = box.top - plotOffset.top + (axis.position == \"top\" ? box.height : 0);\n                }\n                else {\n                    y = 0;\n                    if (t == \"full\")\n                        x = (axis.position == \"left\" ? 0 : plotWidth);\n                    else\n                        x = box.left - plotOffset.left + (axis.position == \"left\" ? box.width : 0);\n                }\n\n                // draw tick bar\n                if (!axis.innermost) {\n                    ctx.strokeStyle = axis.options.color;\n                    ctx.beginPath();\n                    xoff = yoff = 0;\n                    if (axis.direction == \"x\")\n                        xoff = plotWidth + 1;\n                    else\n                        yoff = plotHeight + 1;\n\n                    if (ctx.lineWidth == 1) {\n                        if (axis.direction == \"x\") {\n                            y = Math.floor(y) + 0.5;\n                        } else {\n                            x = Math.floor(x) + 0.5;\n                        }\n                    }\n\n                    ctx.moveTo(x, y);\n                    ctx.lineTo(x + xoff, y + yoff);\n                    ctx.stroke();\n                }\n\n                // draw ticks\n\n                ctx.strokeStyle = axis.options.tickColor;\n\n                ctx.beginPath();\n                for (i = 0; i < axis.ticks.length; ++i) {\n                    var v = axis.ticks[i].v;\n\n                    xoff = yoff = 0;\n\n                    if (isNaN(v) || v < axis.min || v > axis.max\n                        // skip those lying on the axes if we got a border\n                        || (t == \"full\"\n                            && ((typeof bw == \"object\" && bw[axis.position] > 0) || bw > 0)\n                            && (v == axis.min || v == axis.max)))\n                        continue;\n\n                    if (axis.direction == \"x\") {\n                        x = axis.p2c(v);\n                        yoff = t == \"full\" ? -plotHeight : t;\n\n                        if (axis.position == \"top\")\n                            yoff = -yoff;\n                    }\n                    else {\n                        y = axis.p2c(v);\n                        xoff = t == \"full\" ? -plotWidth : t;\n\n                        if (axis.position == \"left\")\n                            xoff = -xoff;\n                    }\n\n                    if (ctx.lineWidth == 1) {\n                        if (axis.direction == \"x\")\n                            x = Math.floor(x) + 0.5;\n                        else\n                            y = Math.floor(y) + 0.5;\n                    }\n\n                    ctx.moveTo(x, y);\n                    ctx.lineTo(x + xoff, y + yoff);\n                }\n\n                ctx.stroke();\n            }\n\n\n            // draw border\n            if (bw) {\n                // If either borderWidth or borderColor is an object, then draw the border\n                // line by line instead of as one rectangle\n                bc = options.grid.borderColor;\n                if(typeof bw == \"object\" || typeof bc == \"object\") {\n                    if (typeof bw !== \"object\") {\n                        bw = {top: bw, right: bw, bottom: bw, left: bw};\n                    }\n                    if (typeof bc !== \"object\") {\n                        bc = {top: bc, right: bc, bottom: bc, left: bc};\n                    }\n\n                    if (bw.top > 0) {\n                        ctx.strokeStyle = bc.top;\n                        ctx.lineWidth = bw.top;\n                        ctx.beginPath();\n                        ctx.moveTo(0 - bw.left, 0 - bw.top/2);\n                        ctx.lineTo(plotWidth, 0 - bw.top/2);\n                        ctx.stroke();\n                    }\n\n                    if (bw.right > 0) {\n                        ctx.strokeStyle = bc.right;\n                        ctx.lineWidth = bw.right;\n                        ctx.beginPath();\n                        ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\n                        ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\n                        ctx.stroke();\n                    }\n\n                    if (bw.bottom > 0) {\n                        ctx.strokeStyle = bc.bottom;\n                        ctx.lineWidth = bw.bottom;\n                        ctx.beginPath();\n                        ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\n                        ctx.lineTo(0, plotHeight + bw.bottom / 2);\n                        ctx.stroke();\n                    }\n\n                    if (bw.left > 0) {\n                        ctx.strokeStyle = bc.left;\n                        ctx.lineWidth = bw.left;\n                        ctx.beginPath();\n                        ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);\n                        ctx.lineTo(0- bw.left/2, 0);\n                        ctx.stroke();\n                    }\n                }\n                else {\n                    ctx.lineWidth = bw;\n                    ctx.strokeStyle = options.grid.borderColor;\n                    ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);\n                }\n            }\n\n            ctx.restore();\n        }\n\n        function drawAxisLabels() {\n\n            $.each(allAxes(), function (_, axis) {\n                var box = axis.box,\n                    legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\n                    layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\n                    font = axis.options.font || \"flot-tick-label tickLabel\",\n                    tick, x, y, halign, valign;\n\n                // Remove text before checking for axis.show and ticks.length;\n                // otherwise plugins, like flot-tickrotor, that draw their own\n                // tick labels will end up with both theirs and the defaults.\n\n                surface.removeText(layer);\n\n                if (!axis.show || axis.ticks.length == 0)\n                    return;\n\n                for (var i = 0; i < axis.ticks.length; ++i) {\n\n                    tick = axis.ticks[i];\n                    if (!tick.label || tick.v < axis.min || tick.v > axis.max)\n                        continue;\n\n                    if (axis.direction == \"x\") {\n                        halign = \"center\";\n                        x = plotOffset.left + axis.p2c(tick.v);\n                        if (axis.position == \"bottom\") {\n                            y = box.top + box.padding + box.eventSectionPadding;\n                        } else {\n                            y = box.top + box.height - box.padding;\n                            valign = \"bottom\";\n                        }\n                    } else {\n                        valign = \"middle\";\n                        y = plotOffset.top + axis.p2c(tick.v);\n                        if (axis.position == \"left\") {\n                            x = box.left + box.width - box.padding;\n                            halign = \"right\";\n                        } else {\n                            x = box.left + box.padding;\n                        }\n                    }\n\n                    surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\n                }\n            });\n        }\n\n        function drawOrphanedPoints(series) {\n            /* Filters series data for points with no neighbors before or after\n             * and plots single 0.5 radius points for them so that they are displayed.\n             */\n            var abandonedPoints = [];\n            var beforeX = null;\n            var afterX = null;\n            var datapoints = series.datapoints;\n            // find any points with no neighbors before or after\n            var emptyPoints = [];\n            for (var j = 0; j < datapoints.pointsize - 2; j++) {\n                emptyPoints.push(0);\n            }\n            for (var i = 0; i < datapoints.points.length; i += datapoints.pointsize) {\n                var x = datapoints.points[i], y = datapoints.points[i + 1];\n                if (i === datapoints.points.length - datapoints.pointsize) {\n                    afterX = null;\n                } else {\n                    afterX = datapoints.points[i + datapoints.pointsize];\n                }\n                if (x !== null && y !== null && beforeX === null && afterX === null) {\n                    abandonedPoints.push(x);\n                    abandonedPoints.push(y);\n                    abandonedPoints.push.apply(abandonedPoints, emptyPoints);\n                }\n                beforeX = x;\n\n            }\n            var olddatapoints = datapoints.points\n            datapoints.points = abandonedPoints;\n\n            series.points.radius = series.lines.lineWidth/2;\n            // plot the orphan points with a radius of lineWidth/2\n            drawSeriesPoints(series);\n            // reset old info\n            datapoints.points = olddatapoints;\n        }\n\n        function drawSeries(series) {\n            if (series.lines.show) {\n                drawSeriesLines(series);\n                if (!series.points.show && !series.bars.show) {\n                    // not necessary if user wants points displayed for everything\n                    drawOrphanedPoints(series);\n                }\n            }\n            if (series.bars.show)\n                drawSeriesBars(series);\n            if (series.points.show)\n                drawSeriesPoints(series);\n        }\n\n        function drawSeriesLines(series) {\n            function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\n                var points = datapoints.points,\n                    ps = datapoints.pointsize,\n                    prevx = null, prevy = null;\n\n                ctx.beginPath();\n                for (var i = ps; i < points.length; i += ps) {\n                    var x1 = points[i - ps], y1 = points[i - ps + 1],\n                        x2 = points[i], y2 = points[i + 1];\n\n                    if (x1 == null || x2 == null)\n                        continue;\n\n                    // clip with ymin\n                    if (y1 <= y2 && y1 < axisy.min) {\n                        if (y2 < axisy.min)\n                            continue;   // line segment is outside\n                        // compute new intersection point\n                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.min;\n                    }\n                    else if (y2 <= y1 && y2 < axisy.min) {\n                        if (y1 < axisy.min)\n                            continue;\n                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.min;\n                    }\n\n                    // clip with ymax\n                    if (y1 >= y2 && y1 > axisy.max) {\n                        if (y2 > axisy.max)\n                            continue;\n                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.max;\n                    }\n                    else if (y2 >= y1 && y2 > axisy.max) {\n                        if (y1 > axisy.max)\n                            continue;\n                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.max;\n                    }\n\n                    // clip with xmin\n                    if (x1 <= x2 && x1 < axisx.min) {\n                        if (x2 < axisx.min)\n                            continue;\n                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.min;\n                    }\n                    else if (x2 <= x1 && x2 < axisx.min) {\n                        if (x1 < axisx.min)\n                            continue;\n                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.min;\n                    }\n\n                    // clip with xmax\n                    if (x1 >= x2 && x1 > axisx.max) {\n                        if (x2 > axisx.max)\n                            continue;\n                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.max;\n                    }\n                    else if (x2 >= x1 && x2 > axisx.max) {\n                        if (x1 > axisx.max)\n                            continue;\n                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.max;\n                    }\n\n                    if (x1 != prevx || y1 != prevy)\n                        ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n\n                    prevx = x2;\n                    prevy = y2;\n                    ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\n                }\n                ctx.stroke();\n            }\n\n            function plotLineArea(datapoints, axisx, axisy) {\n                var points = datapoints.points,\n                    ps = datapoints.pointsize,\n                    bottom = Math.min(Math.max(0, axisy.min), axisy.max),\n                    i = 0, top, areaOpen = false,\n                    ypos = 1, segmentStart = 0, segmentEnd = 0;\n\n                // we process each segment in two turns, first forward\n                // direction to sketch out top, then once we hit the\n                // end we go backwards to sketch the bottom\n                while (true) {\n                    if (ps > 0 && i > points.length + ps)\n                        break;\n\n                    i += ps; // ps is negative if going backwards\n\n                    var x1 = points[i - ps],\n                        y1 = points[i - ps + ypos],\n                        x2 = points[i], y2 = points[i + ypos];\n\n                    if (areaOpen) {\n                        if (ps > 0 && x1 != null && x2 == null) {\n                            // at turning point\n                            segmentEnd = i;\n                            ps = -ps;\n                            ypos = 2;\n                            continue;\n                        }\n\n                        if (ps < 0 && i == segmentStart + ps) {\n                            // done with the reverse sweep\n                            ctx.fill();\n                            areaOpen = false;\n                            ps = -ps;\n                            ypos = 1;\n                            i = segmentStart = segmentEnd + ps;\n                            continue;\n                        }\n                    }\n\n                    if (x1 == null || x2 == null)\n                        continue;\n\n                    // clip x values\n\n                    // clip with xmin\n                    if (x1 <= x2 && x1 < axisx.min) {\n                        if (x2 < axisx.min)\n                            continue;\n                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.min;\n                    }\n                    else if (x2 <= x1 && x2 < axisx.min) {\n                        if (x1 < axisx.min)\n                            continue;\n                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.min;\n                    }\n\n                    // clip with xmax\n                    if (x1 >= x2 && x1 > axisx.max) {\n                        if (x2 > axisx.max)\n                            continue;\n                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x1 = axisx.max;\n                    }\n                    else if (x2 >= x1 && x2 > axisx.max) {\n                        if (x1 > axisx.max)\n                            continue;\n                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n                        x2 = axisx.max;\n                    }\n\n                    if (!areaOpen) {\n                        // open area\n                        ctx.beginPath();\n                        ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\n                        areaOpen = true;\n                    }\n\n                    // now first check the case where both is outside\n                    if (y1 >= axisy.max && y2 >= axisy.max) {\n                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\n                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\n                        continue;\n                    }\n                    else if (y1 <= axisy.min && y2 <= axisy.min) {\n                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\n                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\n                        continue;\n                    }\n\n                    // else it's a bit more complicated, there might\n                    // be a flat maxed out rectangle first, then a\n                    // triangular cutout or reverse; to find these\n                    // keep track of the current x values\n                    var x1old = x1, x2old = x2;\n\n                    // clip the y values, without shortcutting, we\n                    // go through all cases in turn\n\n                    // clip with ymin\n                    if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\n                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.min;\n                    }\n                    else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\n                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.min;\n                    }\n\n                    // clip with ymax\n                    if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\n                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y1 = axisy.max;\n                    }\n                    else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\n                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n                        y2 = axisy.max;\n                    }\n\n                    // if the x value was changed we got a rectangle\n                    // to fill\n                    if (x1 != x1old) {\n                        ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\n                        // it goes to (x1, y1), but we fill that below\n                    }\n\n                    // fill triangular section, this sometimes result\n                    // in redundant points if (x1, y1) hasn't changed\n                    // from previous line to, but we just ignore that\n                    ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\n                    ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n\n                    // fill the other rectangle if it's there\n                    if (x2 != x2old) {\n                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n                        ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\n                    }\n                }\n            }\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n            ctx.lineJoin = \"round\";\n\n            var lw = series.lines.lineWidth,\n                sw = series.shadowSize;\n            // FIXME: consider another form of shadow when filling is turned on\n            if (lw > 0 && sw > 0) {\n                // draw shadow as a thick and thin line with transparency\n                ctx.lineWidth = sw;\n                ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n                // position shadow at angle from the mid of line\n                var angle = Math.PI/18;\n                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);\n                ctx.lineWidth = sw/2;\n                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);\n            }\n\n            ctx.lineWidth = lw;\n            ctx.strokeStyle = series.color;\n            var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\n            if (fillStyle) {\n                ctx.fillStyle = fillStyle;\n                plotLineArea(series.datapoints, series.xaxis, series.yaxis);\n            }\n\n            if (lw > 0)\n                plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\n            ctx.restore();\n        }\n\n        function drawSeriesPoints(series) {\n            function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\n                var points = datapoints.points, ps = datapoints.pointsize;\n\n                for (var i = 0; i < points.length; i += ps) {\n                    var x = points[i], y = points[i + 1];\n                    if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\n                        continue;\n\n                    ctx.beginPath();\n                    x = axisx.p2c(x);\n                    y = axisy.p2c(y) + offset;\n                    if (symbol == \"circle\")\n                        ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\n                    else\n                        symbol(ctx, x, y, radius, shadow);\n                    ctx.closePath();\n\n                    if (fillStyle) {\n                        ctx.fillStyle = fillStyle;\n                        ctx.fill();\n                    }\n                    ctx.stroke();\n                }\n            }\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            var lw = series.points.lineWidth,\n                sw = series.shadowSize,\n                radius = series.points.radius,\n                symbol = series.points.symbol;\n\n            // If the user sets the line width to 0, we change it to a very\n            // small value. A line width of 0 seems to force the default of 1.\n            // Doing the conditional here allows the shadow setting to still be\n            // optional even with a lineWidth of 0.\n\n            if( lw == 0 )\n                lw = 0.0001;\n\n            if (lw > 0 && sw > 0) {\n                // draw shadow in two steps\n                var w = sw / 2;\n                ctx.lineWidth = w;\n                ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n                plotPoints(series.datapoints, radius, null, w + w/2, true,\n                           series.xaxis, series.yaxis, symbol);\n\n                ctx.strokeStyle = \"rgba(0,0,0,0.2)\";\n                plotPoints(series.datapoints, radius, null, w/2, true,\n                           series.xaxis, series.yaxis, symbol);\n            }\n\n            ctx.lineWidth = lw;\n            ctx.strokeStyle = series.color;\n            plotPoints(series.datapoints, radius,\n                       getFillStyle(series.points, series.color), 0, false,\n                       series.xaxis, series.yaxis, symbol);\n            ctx.restore();\n        }\n\n        function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\n            var left, right, bottom, top,\n                drawLeft, drawRight, drawTop, drawBottom,\n                tmp;\n\n            // in horizontal mode, we start the bar from the left\n            // instead of from the bottom so it appears to be\n            // horizontal rather than vertical\n            if (horizontal) {\n                drawBottom = drawRight = drawTop = true;\n                drawLeft = false;\n                left = b;\n                right = x;\n                top = y + barLeft;\n                bottom = y + barRight;\n\n                // account for negative bars\n                if (right < left) {\n                    tmp = right;\n                    right = left;\n                    left = tmp;\n                    drawLeft = true;\n                    drawRight = false;\n                }\n            }\n            else {\n                drawLeft = drawRight = drawTop = true;\n                drawBottom = false;\n                left = x + barLeft;\n                right = x + barRight;\n                bottom = b;\n                top = y;\n\n                // account for negative bars\n                if (top < bottom) {\n                    tmp = top;\n                    top = bottom;\n                    bottom = tmp;\n                    drawBottom = true;\n                    drawTop = false;\n                }\n            }\n\n            // clip\n            if (right < axisx.min || left > axisx.max ||\n                top < axisy.min || bottom > axisy.max)\n                return;\n\n            if (left < axisx.min) {\n                left = axisx.min;\n                drawLeft = false;\n            }\n\n            if (right > axisx.max) {\n                right = axisx.max;\n                drawRight = false;\n            }\n\n            if (bottom < axisy.min) {\n                bottom = axisy.min;\n                drawBottom = false;\n            }\n\n            if (top > axisy.max) {\n                top = axisy.max;\n                drawTop = false;\n            }\n\n            left = axisx.p2c(left);\n            bottom = axisy.p2c(bottom);\n            right = axisx.p2c(right);\n            top = axisy.p2c(top);\n\n            // fill the bar\n            if (fillStyleCallback) {\n                c.fillStyle = fillStyleCallback(bottom, top);\n                c.fillRect(left, top, right - left, bottom - top)\n            }\n\n            // draw outline\n            if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\n                c.beginPath();\n\n                // FIXME: inline moveTo is buggy with excanvas\n                c.moveTo(left, bottom);\n                if (drawLeft)\n                    c.lineTo(left, top);\n                else\n                    c.moveTo(left, top);\n                if (drawTop)\n                    c.lineTo(right, top);\n                else\n                    c.moveTo(right, top);\n                if (drawRight)\n                    c.lineTo(right, bottom);\n                else\n                    c.moveTo(right, bottom);\n                if (drawBottom)\n                    c.lineTo(left, bottom);\n                else\n                    c.moveTo(left, bottom);\n                c.stroke();\n            }\n        }\n\n        function drawSeriesBars(series) {\n            function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\n                var points = datapoints.points, ps = datapoints.pointsize;\n\n                for (var i = 0; i < points.length; i += ps) {\n                    if (points[i] == null)\n                        continue;\n                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\n                }\n            }\n\n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            // FIXME: figure out a way to add shadows (for instance along the right edge)\n            ctx.lineWidth = series.bars.lineWidth;\n            ctx.strokeStyle = series.color;\n\n            var barLeft;\n\n            switch (series.bars.align) {\n                case \"left\":\n                    barLeft = 0;\n                    break;\n                case \"right\":\n                    barLeft = -series.bars.barWidth;\n                    break;\n                default:\n                    barLeft = -series.bars.barWidth / 2;\n            }\n\n            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;\n            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);\n            ctx.restore();\n        }\n\n        function getFillStyle(filloptions, seriesColor, bottom, top) {\n            var fill = filloptions.fill;\n            if (!fill)\n                return null;\n\n            if (filloptions.fillColor)\n                return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\n\n            var c = $.color.parse(seriesColor);\n            c.a = typeof fill == \"number\" ? fill : 0.4;\n            c.normalize();\n            return c.toString();\n        }\n\n        function insertLegend() {\n\n            if (options.legend.container != null) {\n                $(options.legend.container).html(\"\");\n            } else {\n                placeholder.find(\".legend\").remove();\n            }\n\n            if (!options.legend.show) {\n                return;\n            }\n\n            var fragments = [], entries = [], rowStarted = false,\n                lf = options.legend.labelFormatter, s, label;\n\n            // Build a list of legend entries, with each having a label and a color\n\n            for (var i = 0; i < series.length; ++i) {\n                s = series[i];\n                if (s.label) {\n                    label = lf ? lf(s.label, s) : s.label;\n                    if (label) {\n                        entries.push({\n                            label: label,\n                            color: s.color\n                        });\n                    }\n                }\n            }\n\n            // Sort the legend using either the default or a custom comparator\n\n            if (options.legend.sorted) {\n                if ($.isFunction(options.legend.sorted)) {\n                    entries.sort(options.legend.sorted);\n                } else if (options.legend.sorted == \"reverse\") {\n                \tentries.reverse();\n                } else {\n                    var ascending = options.legend.sorted != \"descending\";\n                    entries.sort(function(a, b) {\n                        return a.label == b.label ? 0 : (\n                            (a.label < b.label) != ascending ? 1 : -1   // Logical XOR\n                        );\n                    });\n                }\n            }\n\n            // Generate markup for the list of entries, in their final order\n\n            for (var i = 0; i < entries.length; ++i) {\n\n                var entry = entries[i];\n\n                if (i % options.legend.noColumns == 0) {\n                    if (rowStarted)\n                        fragments.push('</tr>');\n                    fragments.push('<tr>');\n                    rowStarted = true;\n                }\n\n                fragments.push(\n                    '<td class=\"legendColorBox\"><div style=\"border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px\"><div style=\"width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden\"></div></div></td>' +\n                    '<td class=\"legendLabel\">' + entry.label + '</td>'\n                );\n            }\n\n            if (rowStarted)\n                fragments.push('</tr>');\n\n            if (fragments.length == 0)\n                return;\n\n            var table = '<table style=\"font-size:smaller;color:' + options.grid.color + '\">' + fragments.join(\"\") + '</table>';\n            if (options.legend.container != null)\n                $(options.legend.container).html(table);\n            else {\n                var pos = \"\",\n                    p = options.legend.position,\n                    m = options.legend.margin;\n                if (m[0] == null)\n                    m = [m, m];\n                if (p.charAt(0) == \"n\")\n                    pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\n                else if (p.charAt(0) == \"s\")\n                    pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\n                if (p.charAt(1) == \"e\")\n                    pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\n                else if (p.charAt(1) == \"w\")\n                    pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\n                var legend = $('<div class=\"legend\">' + table.replace('style=\"', 'style=\"position:absolute;' + pos +';') + '</div>').appendTo(placeholder);\n                if (options.legend.backgroundOpacity != 0.0) {\n                    // put in the transparent background\n                    // separately to avoid blended labels and\n                    // label boxes\n                    var c = options.legend.backgroundColor;\n                    if (c == null) {\n                        c = options.grid.backgroundColor;\n                        if (c && typeof c == \"string\")\n                            c = $.color.parse(c);\n                        else\n                            c = $.color.extract(legend, 'background-color');\n                        c.a = 1;\n                        c = c.toString();\n                    }\n                    var div = legend.children();\n                    $('<div style=\"position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';\"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);\n                }\n            }\n        }\n\n\n        // interactive features\n\n        var highlights = [],\n            redrawTimeout = null;\n\n        // returns the data item the mouse is over, or null if none is found\n        function findNearbyItem(mouseX, mouseY, seriesFilter) {\n            var maxDistance = options.grid.mouseActiveRadius,\n                smallestDistance = maxDistance * maxDistance + 1,\n                item = null, foundPoint = false, i, j, ps;\n\n            for (i = series.length - 1; i >= 0; --i) {\n                if (!seriesFilter(series[i]))\n                    continue;\n\n                var s = series[i],\n                    axisx = s.xaxis,\n                    axisy = s.yaxis,\n                    points = s.datapoints.points,\n                    mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\n                    my = axisy.c2p(mouseY),\n                    maxx = maxDistance / axisx.scale,\n                    maxy = maxDistance / axisy.scale;\n\n                ps = s.datapoints.pointsize;\n                // with inverse transforms, we can't use the maxx/maxy\n                // optimization, sadly\n                if (axisx.options.inverseTransform)\n                    maxx = Number.MAX_VALUE;\n                if (axisy.options.inverseTransform)\n                    maxy = Number.MAX_VALUE;\n\n                if (s.lines.show || s.points.show) {\n                    for (j = 0; j < points.length; j += ps) {\n                        var x = points[j], y = points[j + 1];\n                        if (x == null)\n                            continue;\n\n                        // For points and lines, the cursor must be within a\n                        // certain distance to the data point\n                        if (x - mx > maxx || x - mx < -maxx ||\n                            y - my > maxy || y - my < -maxy)\n                            continue;\n\n                        // We have to calculate distances in pixels, not in\n                        // data units, because the scales of the axes may be different\n                        var dx = Math.abs(axisx.p2c(x) - mouseX),\n                            dy = Math.abs(axisy.p2c(y) - mouseY),\n                            dist = dx * dx + dy * dy; // we save the sqrt\n\n                        // use <= to ensure last point takes precedence\n                        // (last generally means on top of)\n                        if (dist < smallestDistance) {\n                            smallestDistance = dist;\n                            item = [i, j / ps];\n                        }\n                    }\n                }\n\n                if (s.bars.show && !item) { // no other point can be nearby\n\n                    var barLeft, barRight;\n\n                    switch (s.bars.align) {\n                        case \"left\":\n                            barLeft = 0;\n                            break;\n                        case \"right\":\n                            barLeft = -s.bars.barWidth;\n                            break;\n                        default:\n                            barLeft = -s.bars.barWidth / 2;\n                    }\n\n                    barRight = barLeft + s.bars.barWidth;\n\n                    for (j = 0; j < points.length; j += ps) {\n                        var x = points[j], y = points[j + 1], b = points[j + 2];\n                        if (x == null)\n                            continue;\n\n                        // for a bar graph, the cursor must be inside the bar\n                        if (series[i].bars.horizontal ?\n                            (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&\n                             my >= y + barLeft && my <= y + barRight) :\n                            (mx >= x + barLeft && mx <= x + barRight &&\n                             my >= Math.min(b, y) && my <= Math.max(b, y)))\n                                item = [i, j / ps];\n                    }\n                }\n            }\n\n            if (item) {\n                i = item[0];\n                j = item[1];\n                ps = series[i].datapoints.pointsize;\n\n                return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\n                         dataIndex: j,\n                         series: series[i],\n                         seriesIndex: i };\n            }\n\n            return null;\n        }\n\n        function onMouseMove(e) {\n            if (options.grid.hoverable)\n                triggerClickHoverEvent(\"plothover\", e,\n                                       function (s) { return s[\"hoverable\"] != false; });\n        }\n\n        function onMouseLeave(e) {\n            if (options.grid.hoverable)\n                triggerClickHoverEvent(\"plothover\", e,\n                                       function (s) { return false; });\n        }\n\n        function onClick(e) {\n          if (plot.isSelecting) {\n            return;\n          }\n\n          triggerClickHoverEvent(\"plotclick\", e, function (s) { return s[\"clickable\"] != false; });\n        }\n\n        // grafana addon - added to support mobile devices click in plot\n        function onTouch(e) {\n            if (!e.cancelable) {\n                return;\n            }\n        \n            if (!eventHolder.is(e.target) && eventHolder.has(e.target).length === 0) {\n                triggerClickHoverEvent(\"plotleave\", e, function (s) { false; });\n                return;\n            }\n\n            onMouseMove(mapFromTouchEvent(e));\n            e.preventDefault();\n        }\n\n        // grafana addon - added to support mobile devices and mapping touch event to click event structure\n        function mapFromTouchEvent(e) {\n            if (!e || !e.originalEvent) {\n                return e;\n            }\n\n            if (e.pageX && e.pageY) {\n                return e;\n            }\n\n            var original = e.originalEvent;\n            \n            if (original.changedTouches.length === 0) {\n                return e;\n            }\n\n            var touch = original.changedTouches[0];\n            e.pageX = touch.pageX;\n            e.pageY = touch.pageY;\n\n            return e;\n        }\n\n        // trigger click or hover event (they send the same parameters\n        // so we share their code)\n        function triggerClickHoverEvent(eventname, event, seriesFilter) {\n            var offset = eventHolder.offset(),\n                canvasX = event.pageX - offset.left - plotOffset.left,\n                canvasY = event.pageY - offset.top - plotOffset.top,\n            pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\n\n            pos.pageX = event.pageX;\n            pos.pageY = event.pageY;\n\n            // Add ctrlKey and metaKey to event\n            pos.ctrlKey = event.ctrlKey;\n            pos.metaKey = event.metaKey;\n\n            var item = findNearbyItem(canvasX, canvasY, seriesFilter);\n\n            if (item) {\n                // fill in mouse pos for any listeners out there\n                item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);\n                item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);\n            }\n\n            if (options.grid.autoHighlight) {\n                // clear auto-highlights\n                for (var i = 0; i < highlights.length; ++i) {\n                    var h = highlights[i];\n                    if (h.auto == eventname &&\n                        !(item && h.series == item.series &&\n                          h.point[0] == item.datapoint[0] &&\n                          h.point[1] == item.datapoint[1]))\n                        unhighlight(h.series, h.point);\n                }\n\n                if (item)\n                    highlight(item.series, item.datapoint, eventname);\n            }\n\n            placeholder.trigger(eventname, [ pos, item ]);\n        }\n\n        function triggerRedrawOverlay() {\n            var t = options.interaction.redrawOverlayInterval;\n            if (t == -1) {      // skip event queue\n                drawOverlay();\n                return;\n            }\n\n            if (!redrawTimeout)\n                redrawTimeout = setTimeout(drawOverlay, t);\n        }\n\n        function drawOverlay() {\n            redrawTimeout = null;\n\n            // draw highlights\n            octx.save();\n            overlay.clear();\n            octx.translate(plotOffset.left, plotOffset.top);\n\n            var i, hi;\n            for (i = 0; i < highlights.length; ++i) {\n                hi = highlights[i];\n\n                if (hi.series.bars.show)\n                    drawBarHighlight(hi.series, hi.point);\n                else\n                    drawPointHighlight(hi.series, hi.point);\n            }\n            octx.restore();\n\n            executeHooks(hooks.drawOverlay, [octx]);\n        }\n\n        function highlight(s, point, auto) {\n            if (typeof s == \"number\")\n                s = series[s];\n\n            if (typeof point == \"number\") {\n                var ps = s.datapoints.pointsize;\n                point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n            }\n\n            var i = indexOfHighlight(s, point);\n            if (i == -1) {\n                highlights.push({ series: s, point: point, auto: auto });\n\n                triggerRedrawOverlay();\n            }\n            else if (!auto)\n                highlights[i].auto = false;\n        }\n\n        function unhighlight(s, point) {\n            if (s == null && point == null) {\n                highlights = [];\n                triggerRedrawOverlay();\n                return;\n            }\n\n            if (typeof s == \"number\")\n                s = series[s];\n\n            if (typeof point == \"number\") {\n                var ps = s.datapoints.pointsize;\n                point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n            }\n\n            var i = indexOfHighlight(s, point);\n            if (i != -1) {\n                highlights.splice(i, 1);\n\n                triggerRedrawOverlay();\n            }\n        }\n\n        function indexOfHighlight(s, p) {\n            for (var i = 0; i < highlights.length; ++i) {\n                var h = highlights[i];\n                if (h.series == s && h.point[0] == p[0]\n                    && h.point[1] == p[1])\n                    return i;\n            }\n            return -1;\n        }\n\n        function drawPointHighlight(series, point) {\n            var x = point[0], y = point[1],\n                axisx = series.xaxis, axisy = series.yaxis,\n                highlightColor = (typeof series.highlightColor === \"string\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();\n\n            if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\n                return;\n\n            var pointRadius = series.points.radius + series.points.lineWidth / 2;\n            octx.lineWidth = pointRadius;\n            octx.strokeStyle = highlightColor;\n            var radius = 1.5 * pointRadius;\n            x = axisx.p2c(x);\n            y = axisy.p2c(y);\n\n            octx.beginPath();\n            if (series.points.symbol == \"circle\")\n                octx.arc(x, y, radius, 0, 2 * Math.PI, false);\n            else\n                series.points.symbol(octx, x, y, radius, false);\n            octx.closePath();\n            octx.stroke();\n        }\n\n        function drawBarHighlight(series, point) {\n            var highlightColor = (typeof series.highlightColor === \"string\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),\n                fillStyle = highlightColor,\n                barLeft;\n\n            switch (series.bars.align) {\n                case \"left\":\n                    barLeft = 0;\n                    break;\n                case \"right\":\n                    barLeft = -series.bars.barWidth;\n                    break;\n                default:\n                    barLeft = -series.bars.barWidth / 2;\n            }\n\n            octx.lineWidth = series.bars.lineWidth;\n            octx.strokeStyle = highlightColor;\n\n            drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,\n                    function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\n        }\n\n        function getColorOrGradient(spec, bottom, top, defaultColor) {\n            if (typeof spec == \"string\")\n                return spec;\n            else {\n                // assume this is a gradient spec; IE currently only\n                // supports a simple vertical gradient properly, so that's\n                // what we support too\n                var gradient = ctx.createLinearGradient(0, top, 0, bottom);\n\n                for (var i = 0, l = spec.colors.length; i < l; ++i) {\n                    var c = spec.colors[i];\n                    if (typeof c != \"string\") {\n                        var co = $.color.parse(defaultColor);\n                        if (c.brightness != null)\n                            co = co.scale('rgb', c.brightness);\n                        if (c.opacity != null)\n                            co.a *= c.opacity;\n                        c = co.toString();\n                    }\n                    gradient.addColorStop(i / (l - 1), c);\n                }\n\n                return gradient;\n            }\n        }\n    }\n\n    // Add the plot function to the top level of the jQuery object\n\n    $.plot = function(placeholder, data, options) {\n        //var t0 = new Date();\n        var plot = new Plot($(placeholder), data, options, $.plot.plugins);\n        //(window.console ? console.log : alert)(\"time used (msecs): \" + ((new Date()).getTime() - t0.getTime()));\n        return plot;\n    };\n\n    $.plot.version = \"0.8.3\";\n\n    $.plot.plugins = [];\n\n    // Also add the plot function as a chainable property\n\n    $.fn.plot = function(data, options) {\n        return this.each(function() {\n            $.plot(this, data, options);\n        });\n    };\n\n    // round to nearby lower multiple of base\n    function floorInBase(n, base) {\n        return base * Math.floor(n / base);\n    }\n\n})(jQuery);\n","var path = 'public/app/plugins/panel/graph/tab_series_overrides.html';\nvar html = \"<div class=graph-series-override ng-repeat=\\\"override in ctrl.panel.seriesOverrides\\\" ng-controller=SeriesOverridesCtrl>\\n  <div class=gf-form>\\n    <label class=gf-form-label>Alias or regex</label>\\n    <input type=text ng-model=override.alias bs-typeahead=getSeriesNames ng-blur=ctrl.render() data-min-length=0 data-items=100 class=\\\"gf-form-input width-15\\\" placeholder=\\\"For regex use /pattern/\\\"/>\\n    <label class=\\\"gf-form-label pointer\\\" ng-click=ctrl.removeSeriesOverride(override)>\\n      <icon name=\\\"'trash-alt'\\\"></icon>\\n    </label>\\n  </div>\\n  <div class=graph-series-override__properties>\\n    <div class=gf-form ng-repeat=\\\"option in currentOverrides\\\">\\n      <label class=\\\"gf-form-label gf-form-label--grow\\\">\\n        <span ng-show=\\\"option.propertyName === 'color'\\\">\\n          Color: <icon name=\\\"'circle'\\\" type=\\\"'mono'\\\" ng-style={color:option.value}></icon>\\n        </span>\\n        <span ng-show=\\\"option.propertyName !== 'color'\\\"> {{ option.name }}: {{ option.value }} </span>\\n        <icon name=\\\"'times'\\\" size=\\\"'sm'\\\" ng-click=removeOverride(option) style=margin-right:4px;cursor:pointer></icon>\\n      </label>\\n    </div>\\n    <div class=gf-form>\\n      <span class=dropdown dropdown-typeahead2=overrideMenu dropdown-typeahead-on-select=\\\"setOverride($item, $subItem)\\\" button-template-class=gf-form-label></span>\\n    </div>\\n  </div>\\n</div>\\n<div class=gf-form-button-row>\\n  <button class=\\\"btn btn-inverse\\\" ng-click=ctrl.addSeriesOverride()>\\n    <icon name=\\\"'plus'\\\"></icon>&nbsp;Add series override\\n  </button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { SelectableValue } from '@grafana/data';\nimport { css } from 'emotion';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\nimport { ButtonSelect } from '../Forms/Legacy/Select/ButtonSelect';\nimport memoizeOne from 'memoize-one';\nimport { GrafanaTheme } from '@grafana/data';\nimport { withTheme } from '../../themes';\n\nexport const defaultIntervals = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nconst getStyles = memoizeOne((theme: GrafanaTheme) => {\n  return {\n    selectButton: css`\n      label: selectButton;\n      .select-button-value {\n        color: ${theme.palette.orange};\n      }\n    `,\n  };\n});\n\nexport interface Props {\n  intervals?: string[];\n  onRefresh?: () => any;\n  onIntervalChanged: (interval: string) => void;\n  value?: string;\n  tooltip?: string;\n  hasLiveOption?: boolean;\n  // You can supply your own refresh button element. In that case onRefresh and tooltip are ignored.\n  refreshButton?: React.ReactNode;\n  buttonSelectClassName?: string;\n  theme: GrafanaTheme;\n}\n\nexport class RefreshPickerBase extends PureComponent<Props> {\n  static offOption = { label: 'Off', value: '' };\n  static liveOption = { label: 'Live', value: 'LIVE' };\n  static isLive = (refreshInterval?: string): boolean => refreshInterval === RefreshPicker.liveOption.value;\n\n  constructor(props: Props) {\n    super(props);\n  }\n\n  intervalsToOptions = (intervals: string[] | undefined): Array<SelectableValue<string>> => {\n    const intervalsOrDefault = intervals || defaultIntervals;\n    const options = intervalsOrDefault.map(interval => ({ label: interval, value: interval }));\n\n    if (this.props.hasLiveOption) {\n      options.unshift(RefreshPicker.liveOption);\n    }\n\n    options.unshift(RefreshPicker.offOption);\n    return options;\n  };\n\n  onChangeSelect = (item: SelectableValue<string>) => {\n    const { onIntervalChanged } = this.props;\n    if (onIntervalChanged) {\n      // @ts-ignore\n      onIntervalChanged(item.value);\n    }\n  };\n\n  render() {\n    const { onRefresh, intervals, tooltip, value, refreshButton, buttonSelectClassName, theme } = this.props;\n    const options = this.intervalsToOptions(intervals);\n    const currentValue = value || '';\n    const selectedValue = options.find(item => item.value === currentValue) || RefreshPicker.offOption;\n    const styles = getStyles(theme);\n\n    const cssClasses = classNames({\n      'refresh-picker': true,\n      'refresh-picker--off': selectedValue.label === RefreshPicker.offOption.label,\n      'refresh-picker--live': selectedValue === RefreshPicker.liveOption,\n    });\n\n    return (\n      <div className={cssClasses}>\n        <div className=\"refresh-picker-buttons\">\n          {refreshButton ? (\n            refreshButton\n          ) : (\n            <Tooltip placement=\"top\" content={tooltip!}>\n              <button\n                className=\"btn btn--radius-right-0 navbar-button navbar-button--border-right-0\"\n                onClick={onRefresh!}\n              >\n                <Icon name=\"sync\" size=\"lg\" />\n              </button>\n            </Tooltip>\n          )}\n          <ButtonSelect\n            className={classNames('navbar-button--attached', styles.selectButton, buttonSelectClassName)}\n            value={selectedValue}\n            label={selectedValue.label}\n            options={options}\n            onChange={this.onChangeSelect}\n            maxMenuHeight={380}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport const RefreshPicker = withTheme<\n  Props,\n  {\n    offOption: typeof RefreshPickerBase.offOption;\n    liveOption: typeof RefreshPickerBase.liveOption;\n    isLive: typeof RefreshPickerBase.isLive;\n  }\n>(RefreshPickerBase);\n","var path = 'public/app/plugins/panel/singlestat/module.html';\nvar html = \"<div class=singlestat-panel>\\n\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { useContext } from 'react';\nimport { getModalStyles } from './getModalStyles';\nimport { IconName } from '../../types';\nimport { ThemeContext } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\ninterface Props {\n  title: string;\n  icon?: IconName;\n}\n\nexport const ModalHeader: React.FC<Props> = ({ icon, title, children }) => {\n  const theme = useContext(ThemeContext);\n  const styles = getModalStyles(theme);\n\n  return (\n    <>\n      <h2 className={styles.modalHeaderTitle}>\n        {icon && <Icon name={icon} size=\"lg\" className={styles.modalHeaderIcon} />}\n        {title}\n      </h2>\n      {children}\n    </>\n  );\n};\n","import React, { FC } from 'react';\nimport { AsyncSelect, Icon } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { DEFAULT_SORT } from 'app/features/search/constants';\nimport { SearchSrv } from '../../services/search_srv';\n\nconst searchSrv = new SearchSrv();\n\nexport interface Props {\n  onChange: (sortValue: SelectableValue) => void;\n  value?: SelectableValue | null;\n  placeholder?: string;\n}\n\nconst getSortOptions = () => {\n  return searchSrv.getSortOptions().then(({ sortOptions }) => {\n    return sortOptions.map((opt: any) => ({ label: opt.displayName, value: opt.name }));\n  });\n};\n\nexport const SortPicker: FC<Props> = ({ onChange, value, placeholder }) => {\n  return (\n    <AsyncSelect\n      width={25}\n      onChange={onChange}\n      value={[value]}\n      loadOptions={getSortOptions}\n      defaultOptions\n      placeholder={placeholder ?? `Sort (Default ${DEFAULT_SORT.label})`}\n      prefix={<Icon name=\"sort-amount-down\" />}\n    />\n  );\n};\n","import React, { Dispatch, FC, FormEvent, SetStateAction } from 'react';\nimport { css } from 'emotion';\nimport { HorizontalGroup, RadioButtonGroup, stylesFactory, useTheme, Checkbox } from '@grafana/ui';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { SortPicker } from 'app/core/components/Select/SortPicker';\nimport { TagFilter } from 'app/core/components/TagFilter/TagFilter';\nimport { SearchSrv } from 'app/core/services/search_srv';\nimport { DashboardQuery, SearchLayout } from '../types';\n\nexport const layoutOptions = [\n  { value: SearchLayout.Folders, icon: 'folder' },\n  { value: SearchLayout.List, icon: 'list-ul' },\n];\n\nconst searchSrv = new SearchSrv();\n\ntype onSelectChange = (value: SelectableValue) => void;\ninterface Props {\n  onLayoutChange: Dispatch<SetStateAction<string>>;\n  onSortChange: onSelectChange;\n  onStarredFilterChange?: (event: FormEvent<HTMLInputElement>) => void;\n  onTagFilterChange: onSelectChange;\n  query: DashboardQuery;\n  showStarredFilter?: boolean;\n  hideLayout?: boolean;\n}\n\nexport const ActionRow: FC<Props> = ({\n  onLayoutChange,\n  onSortChange,\n  onStarredFilterChange = () => {},\n  onTagFilterChange,\n  query,\n  showStarredFilter,\n  hideLayout,\n}) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.actionRow}>\n      <div className={styles.rowContainer}>\n        <HorizontalGroup spacing=\"md\" width=\"auto\">\n          {!hideLayout ? (\n            <RadioButtonGroup options={layoutOptions} onChange={onLayoutChange} value={query.layout} />\n          ) : null}\n          <SortPicker onChange={onSortChange} value={query.sort} />\n        </HorizontalGroup>\n      </div>\n      <HorizontalGroup spacing=\"md\" width=\"auto\">\n        {showStarredFilter && (\n          <div className={styles.checkboxWrapper}>\n            <Checkbox label=\"Filter by starred\" onChange={onStarredFilterChange} />\n          </div>\n        )}\n        <TagFilter isClearable tags={query.tag} tagOptions={searchSrv.getDashboardTags} onChange={onTagFilterChange} />\n      </HorizontalGroup>\n    </div>\n  );\n};\n\nActionRow.displayName = 'ActionRow';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    actionRow: css`\n      display: none;\n\n      @media only screen and (min-width: ${theme.breakpoints.md}) {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: ${theme.spacing.lg} 0;\n        width: 100%;\n      }\n    `,\n    rowContainer: css`\n      margin-right: ${theme.spacing.md};\n    `,\n    checkboxWrapper: css`\n      label {\n        line-height: 1.2;\n      }\n    `,\n  };\n});\n","var path = 'public/app/plugins/panel/text/editor.html';\nvar html = \"<div class=gf-form-inline>\\n\\t<div class=gf-form>\\n\\t\\t<span class=gf-form-label>Mode</span>\\n\\t\\t<span class=gf-form-select-wrapper>\\n\\t\\t\\t<select class=gf-form-input ng-model=ctrl.panel.mode ng-options=\\\"f for f in ['html','markdown']\\\"></select>\\n\\t\\t</span>\\n\\t</div>\\n</div>\\n\\n<div class=gf-form-inline>\\n\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t<code-editor content=ctrl.panel.content on-change=ctrl.render() data-mode=markdown data-max-lines=20>\\n\\t\\t</code-editor>\\n\\t</div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/mysql/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form-inline>\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <textarea rows=10 class=gf-form-input ng-model=ctrl.annotation.rawQuery spellcheck=false placeholder=\\\"query expression\\\" data-min-length=0 data-items=100 ng-model-onblur ng-change=ctrl.panelCtrl.refresh()></textarea>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showHelp>\\n    <pre class=\\\"gf-form-pre alert alert-info\\\"><h6>Annotation Query Format</h6>\\nAn annotation is an event that is overlaid on top of graphs. The query can have up to four columns per row, the <i>time</i> or <i>time_sec</i> column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\\n\\n- column with alias: <b>time</b> or <i>time_sec</i> for the annotation event time. Use epoch time or any native date data type.\\n- column with alias: <b>timeend</b> for the annotation event end time. Use epoch time or any native date data type.\\n- column with alias: <b>text</b> for the annotation text\\n- column with alias: <b>tags</b> for annotation tags. This is a comma separated string of tags e.g. 'tag1,tag2'\\n\\n\\nMacros:\\n- $__time(column) -&gt; UNIX_TIMESTAMP(column) as time (or as time_sec)\\n- $__timeEpoch(column) -&gt; UNIX_TIMESTAMP(column) as time (or as time_sec)\\n- $__timeFilter(column) -&gt; column BETWEEN FROM_UNIXTIME(1492750877) AND FROM_UNIXTIME(1492750877)\\n- $__unixEpochFilter(column) -&gt;  time_unix_epoch &gt; 1492750877 AND time_unix_epoch &lt; 1492750877\\n- $__unixEpochNanoFilter(column) -&gt;  column &gt;= 1494410783152415214 AND column &lt;= 1494497183142514872\\n\\nOr build your own conditionals using these macros which just return the values:\\n- $__timeFrom() -&gt; FROM_UNIXTIME(1492750877)\\n- $__timeTo() -&gt;  FROM_UNIXTIME(1492750877)\\n- $__unixEpochFrom() -&gt;  1492750877\\n- $__unixEpochTo() -&gt;  1492750877\\n- $__unixEpochNanoFrom() -&gt;  1494410783152415214\\n- $__unixEpochNanoTo() -&gt;  1494497183142514872\\n\\t\\t</pre>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport { AsyncSelect } from '@grafana/ui';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { Organization } from 'app/types';\nimport { SelectableValue } from '@grafana/data';\n\nexport interface OrgSelectItem {\n  id: number;\n  value: number;\n  label: string;\n  name: string;\n}\n\nexport interface Props {\n  onSelected: (org: OrgSelectItem) => void;\n  className?: string;\n}\n\nexport interface State {\n  isLoading: boolean;\n}\n\nexport class OrgPicker extends PureComponent<Props, State> {\n  orgs: Organization[];\n\n  state: State = {\n    isLoading: false,\n  };\n\n  async loadOrgs() {\n    this.setState({ isLoading: true });\n    const orgs = await getBackendSrv().get('/api/orgs');\n    this.orgs = orgs;\n    this.setState({ isLoading: false });\n    return orgs;\n  }\n\n  getOrgOptions = async (query: string): Promise<Array<SelectableValue<number>>> => {\n    if (!this.orgs) {\n      await this.loadOrgs();\n    }\n    return this.orgs.map(\n      (org: Organization): SelectableValue<number> => ({\n        id: org.id,\n        value: org.id,\n        label: org.name,\n        name: org.name,\n      })\n    );\n  };\n\n  render() {\n    const { className, onSelected } = this.props;\n    const { isLoading } = this.state;\n\n    return (\n      <AsyncSelect\n        className={className}\n        isLoading={isLoading}\n        defaultOptions={true}\n        isSearchable={false}\n        loadOptions={this.getOrgOptions}\n        onChange={onSelected}\n        placeholder=\"Select organization\"\n        noOptionsMessage=\"No organizations found\"\n      />\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { css, cx } from 'emotion';\nimport {\n  Modal,\n  Themeable,\n  stylesFactory,\n  withTheme,\n  ConfirmButton,\n  Button,\n  HorizontalGroup,\n  Container,\n  Field,\n} from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { UserOrg, Organization, OrgRole } from 'app/types';\nimport { OrgPicker, OrgSelectItem } from 'app/core/components/Select/OrgPicker';\nimport { OrgRolePicker } from './OrgRolePicker';\n\ninterface Props {\n  orgs: UserOrg[];\n\n  onOrgRemove: (orgId: number) => void;\n  onOrgRoleChange: (orgId: number, newRole: OrgRole) => void;\n  onOrgAdd: (orgId: number, role: OrgRole) => void;\n}\n\ninterface State {\n  showAddOrgModal: boolean;\n}\n\nexport class UserOrgs extends PureComponent<Props, State> {\n  state = {\n    showAddOrgModal: false,\n  };\n\n  showOrgAddModal = (show: boolean) => () => {\n    this.setState({ showAddOrgModal: show });\n  };\n\n  render() {\n    const { orgs, onOrgRoleChange, onOrgRemove, onOrgAdd } = this.props;\n    const { showAddOrgModal } = this.state;\n    const addToOrgContainerClass = css`\n      margin-top: 0.8rem;\n    `;\n\n    return (\n      <>\n        <h3 className=\"page-heading\">Organisations</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <tbody>\n                {orgs.map((org, index) => (\n                  <OrgRow\n                    key={`${org.orgId}-${index}`}\n                    org={org}\n                    onOrgRoleChange={onOrgRoleChange}\n                    onOrgRemove={onOrgRemove}\n                  />\n                ))}\n              </tbody>\n            </table>\n          </div>\n          <div className={addToOrgContainerClass}>\n            <Button variant=\"secondary\" onClick={this.showOrgAddModal(true)}>\n              Add user to organisation\n            </Button>\n          </div>\n          <AddToOrgModal isOpen={showAddOrgModal} onOrgAdd={onOrgAdd} onDismiss={this.showOrgAddModal(false)} />\n        </div>\n      </>\n    );\n  }\n}\n\nconst getOrgRowStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    removeButton: css`\n      margin-right: 0.6rem;\n      text-decoration: underline;\n      color: ${theme.palette.blue95};\n    `,\n    label: css`\n      font-weight: 500;\n    `,\n  };\n});\n\ninterface OrgRowProps extends Themeable {\n  org: UserOrg;\n  onOrgRemove: (orgId: number) => void;\n  onOrgRoleChange: (orgId: number, newRole: string) => void;\n}\n\ninterface OrgRowState {\n  currentRole: OrgRole;\n  isChangingRole: boolean;\n}\n\nclass UnThemedOrgRow extends PureComponent<OrgRowProps, OrgRowState> {\n  state = {\n    currentRole: this.props.org.role,\n    isChangingRole: false,\n  };\n\n  onOrgRemove = () => {\n    const { org } = this.props;\n    this.props.onOrgRemove(org.orgId);\n  };\n\n  onChangeRoleClick = () => {\n    const { org } = this.props;\n    this.setState({ isChangingRole: true, currentRole: org.role });\n  };\n\n  onOrgRoleChange = (newRole: OrgRole) => {\n    this.setState({ currentRole: newRole });\n  };\n\n  onOrgRoleSave = () => {\n    this.props.onOrgRoleChange(this.props.org.orgId, this.state.currentRole);\n  };\n\n  onCancelClick = () => {\n    this.setState({ isChangingRole: false });\n  };\n\n  render() {\n    const { org, theme } = this.props;\n    const { currentRole, isChangingRole } = this.state;\n    const styles = getOrgRowStyles(theme);\n    const labelClass = cx('width-16', styles.label);\n\n    return (\n      <tr>\n        <td className={labelClass}>{org.name}</td>\n        {isChangingRole ? (\n          <td>\n            <OrgRolePicker value={currentRole} onChange={this.onOrgRoleChange} />\n          </td>\n        ) : (\n          <td className=\"width-25\">{org.role}</td>\n        )}\n        <td colSpan={1}>\n          <div className=\"pull-right\">\n            <ConfirmButton\n              confirmText=\"Save\"\n              onClick={this.onChangeRoleClick}\n              onCancel={this.onCancelClick}\n              onConfirm={this.onOrgRoleSave}\n            >\n              Change role\n            </ConfirmButton>\n          </div>\n        </td>\n        <td colSpan={1}>\n          <div className=\"pull-right\">\n            <ConfirmButton\n              confirmText=\"Confirm removal\"\n              confirmVariant=\"destructive\"\n              onCancel={this.onCancelClick}\n              onConfirm={this.onOrgRemove}\n            >\n              Remove from organisation\n            </ConfirmButton>\n          </div>\n        </td>\n      </tr>\n    );\n  }\n}\n\nconst OrgRow = withTheme(UnThemedOrgRow);\n\nconst getAddToOrgModalStyles = stylesFactory(() => ({\n  modal: css`\n    width: 500px;\n  `,\n  buttonRow: css`\n    text-align: center;\n  `,\n}));\n\ninterface AddToOrgModalProps {\n  isOpen: boolean;\n  onOrgAdd(orgId: number, role: string): void;\n  onDismiss?(): void;\n}\n\ninterface AddToOrgModalState {\n  selectedOrg: Organization;\n  role: OrgRole;\n}\n\nexport class AddToOrgModal extends PureComponent<AddToOrgModalProps, AddToOrgModalState> {\n  state: AddToOrgModalState = {\n    selectedOrg: null,\n    role: OrgRole.Admin,\n  };\n\n  onOrgSelect = (org: OrgSelectItem) => {\n    this.setState({ selectedOrg: { ...org } });\n  };\n\n  onOrgRoleChange = (newRole: OrgRole) => {\n    this.setState({\n      role: newRole,\n    });\n  };\n\n  onAddUserToOrg = () => {\n    const { selectedOrg, role } = this.state;\n    this.props.onOrgAdd(selectedOrg.id, role);\n  };\n\n  onCancel = () => {\n    this.props.onDismiss();\n  };\n\n  render() {\n    const { isOpen } = this.props;\n    const { role } = this.state;\n    const styles = getAddToOrgModalStyles();\n\n    return (\n      <Modal className={styles.modal} title=\"Add to an organization\" isOpen={isOpen} onDismiss={this.onCancel}>\n        <Field label=\"Organisation\">\n          <OrgPicker onSelected={this.onOrgSelect} />\n        </Field>\n        <Field label=\"Role\">\n          <OrgRolePicker value={role} onChange={this.onOrgRoleChange} />\n        </Field>\n        <Container padding=\"md\">\n          <HorizontalGroup spacing=\"md\" justify=\"center\">\n            <Button variant=\"primary\" onClick={this.onAddUserToOrg}>\n              Add to organisation\n            </Button>\n            <Button variant=\"secondary\" onClick={this.onCancel}>\n              Cancel\n            </Button>\n          </HorizontalGroup>\n        </Container>\n      </Modal>\n    );\n  }\n}\n","// Generated from ScrollQLLexer.g4 by ANTLR 4.8\n// jshint ignore: start\n// @ts-nocheck\nvar antlr4 = require('antlr4/index');\n\nvar serializedATN = [\n  '\\u0003\\u608b\\ua72a\\u8133\\ub9ed\\u417c\\u3be7\\u7786\\u5964',\n  '\\u0002r\\u04b0\\b\\u0001\\b\\u0001\\b\\u0001\\u0004\\u0002\\t\\u0002\\u0004\\u0003',\n  '\\t\\u0003\\u0004\\u0004\\t\\u0004\\u0004\\u0005\\t\\u0005\\u0004\\u0006\\t\\u0006',\n  '\\u0004\\u0007\\t\\u0007\\u0004\\b\\t\\b\\u0004\\t\\t\\t\\u0004\\n\\t\\n\\u0004\\u000b',\n  '\\t\\u000b\\u0004\\f\\t\\f\\u0004\\r\\t\\r\\u0004\\u000e\\t\\u000e\\u0004\\u000f\\t\\u000f',\n  '\\u0004\\u0010\\t\\u0010\\u0004\\u0011\\t\\u0011\\u0004\\u0012\\t\\u0012\\u0004\\u0013',\n  '\\t\\u0013\\u0004\\u0014\\t\\u0014\\u0004\\u0015\\t\\u0015\\u0004\\u0016\\t\\u0016',\n  '\\u0004\\u0017\\t\\u0017\\u0004\\u0018\\t\\u0018\\u0004\\u0019\\t\\u0019\\u0004\\u001a',\n  '\\t\\u001a\\u0004\\u001b\\t\\u001b\\u0004\\u001c\\t\\u001c\\u0004\\u001d\\t\\u001d',\n  '\\u0004\\u001e\\t\\u001e\\u0004\\u001f\\t\\u001f\\u0004 \\t \\u0004!\\t!\\u0004\"',\n  \"\\t\\\"\\u0004#\\t#\\u0004$\\t$\\u0004%\\t%\\u0004&\\t&\\u0004'\\t'\\u0004(\\t(\\u0004\",\n  ')\\t)\\u0004*\\t*\\u0004+\\t+\\u0004,\\t,\\u0004-\\t-\\u0004.\\t.\\u0004/\\t/\\u0004',\n  '0\\t0\\u00041\\t1\\u00042\\t2\\u00043\\t3\\u00044\\t4\\u00045\\t5\\u00046\\t6\\u0004',\n  '7\\t7\\u00048\\t8\\u00049\\t9\\u0004:\\t:\\u0004;\\t;\\u0004<\\t<\\u0004=\\t=\\u0004',\n  '>\\t>\\u0004?\\t?\\u0004@\\t@\\u0004A\\tA\\u0004B\\tB\\u0004C\\tC\\u0004D\\tD\\u0004',\n  'E\\tE\\u0004F\\tF\\u0004G\\tG\\u0004H\\tH\\u0004I\\tI\\u0004J\\tJ\\u0004K\\tK\\u0004',\n  'L\\tL\\u0004M\\tM\\u0004N\\tN\\u0004O\\tO\\u0004P\\tP\\u0004Q\\tQ\\u0004R\\tR\\u0004',\n  'S\\tS\\u0004T\\tT\\u0004U\\tU\\u0004V\\tV\\u0004W\\tW\\u0004X\\tX\\u0004Y\\tY\\u0004',\n  'Z\\tZ\\u0004[\\t[\\u0004\\\\\\t\\\\\\u0004]\\t]\\u0004^\\t^\\u0004_\\t_\\u0004`\\t`\\u0004',\n  'a\\ta\\u0004b\\tb\\u0004c\\tc\\u0004d\\td\\u0004e\\te\\u0004f\\tf\\u0004g\\tg\\u0004',\n  'h\\th\\u0004i\\ti\\u0004j\\tj\\u0004k\\tk\\u0004l\\tl\\u0004m\\tm\\u0004n\\tn\\u0004',\n  'o\\to\\u0004p\\tp\\u0004q\\tq\\u0004r\\tr\\u0004s\\ts\\u0004t\\tt\\u0004u\\tu\\u0004',\n  'v\\tv\\u0004w\\tw\\u0004x\\tx\\u0004y\\ty\\u0004z\\tz\\u0004{\\t{\\u0004|\\t|\\u0004',\n  '}\\t}\\u0004~\\t~\\u0004\\u007f\\t\\u007f\\u0004\\u0080\\t\\u0080\\u0004\\u0081\\t',\n  '\\u0081\\u0004\\u0082\\t\\u0082\\u0004\\u0083\\t\\u0083\\u0004\\u0084\\t\\u0084\\u0004',\n  '\\u0085\\t\\u0085\\u0004\\u0086\\t\\u0086\\u0004\\u0087\\t\\u0087\\u0004\\u0088\\t',\n  '\\u0088\\u0004\\u0089\\t\\u0089\\u0004\\u008a\\t\\u008a\\u0004\\u008b\\t\\u008b\\u0004',\n  '\\u008c\\t\\u008c\\u0004\\u008d\\t\\u008d\\u0004\\u008e\\t\\u008e\\u0004\\u008f\\t',\n  '\\u008f\\u0004\\u0090\\t\\u0090\\u0004\\u0091\\t\\u0091\\u0004\\u0092\\t\\u0092\\u0004',\n  '\\u0093\\t\\u0093\\u0004\\u0094\\t\\u0094\\u0004\\u0095\\t\\u0095\\u0004\\u0096\\t',\n  '\\u0096\\u0004\\u0097\\t\\u0097\\u0004\\u0098\\t\\u0098\\u0004\\u0099\\t\\u0099\\u0004',\n  '\\u009a\\t\\u009a\\u0004\\u009b\\t\\u009b\\u0004\\u009c\\t\\u009c\\u0004\\u009d\\t',\n  '\\u009d\\u0004\\u009e\\t\\u009e\\u0004\\u009f\\t\\u009f\\u0004\\u00a0\\t\\u00a0\\u0004',\n  '\\u00a1\\t\\u00a1\\u0004\\u00a2\\t\\u00a2\\u0004\\u00a3\\t\\u00a3\\u0004\\u00a4\\t',\n  '\\u00a4\\u0004\\u00a5\\t\\u00a5\\u0003\\u0002\\u0006\\u0002\\u014f\\n\\u0002\\r\\u0002',\n  '\\u000e\\u0002\\u0150\\u0003\\u0002\\u0003\\u0002\\u0003\\u0003\\u0003\\u0003\\u0007',\n  '\\u0003\\u0157\\n\\u0003\\f\\u0003\\u000e\\u0003\\u015a\\u000b\\u0003\\u0003\\u0003',\n  '\\u0003\\u0003\\u0003\\u0004\\u0003\\u0004\\u0003\\u0004\\u0003\\u0004\\u0003\\u0004',\n  '\\u0003\\u0004\\u0003\\u0004\\u0003\\u0005\\u0003\\u0005\\u0003\\u0005\\u0003\\u0005',\n  '\\u0003\\u0005\\u0003\\u0005\\u0003\\u0006\\u0003\\u0006\\u0003\\u0006\\u0003\\u0006',\n  '\\u0003\\u0007\\u0003\\u0007\\u0003\\u0007\\u0003\\u0007\\u0003\\b\\u0003\\b\\u0003',\n  '\\b\\u0003\\b\\u0003\\b\\u0003\\t\\u0003\\t\\u0003\\t\\u0003\\t\\u0003\\t\\u0003\\t\\u0003',\n  '\\t\\u0003\\t\\u0003\\n\\u0003\\n\\u0003\\n\\u0003\\n\\u0003\\n\\u0003\\n\\u0003\\n\\u0003',\n  '\\n\\u0003\\n\\u0003\\u000b\\u0003\\u000b\\u0003\\u000b\\u0003\\u000b\\u0003\\u000b',\n  '\\u0003\\u000b\\u0005\\u000b\\u018f\\n\\u000b\\u0003\\f\\u0003\\f\\u0003\\f\\u0003',\n  '\\f\\u0003\\f\\u0003\\f\\u0003\\f\\u0003\\f\\u0003\\r\\u0003\\r\\u0003\\r\\u0003\\r\\u0003',\n  '\\r\\u0003\\r\\u0003\\r\\u0003\\u000e\\u0003\\u000e\\u0003\\u000e\\u0003\\u000e\\u0003',\n  '\\u000e\\u0005\\u000e\\u01a5\\n\\u000e\\u0003\\u000f\\u0003\\u000f\\u0003\\u000f',\n  '\\u0003\\u000f\\u0003\\u000f\\u0003\\u0010\\u0003\\u0010\\u0003\\u0010\\u0003\\u0010',\n  '\\u0003\\u0010\\u0003\\u0010\\u0003\\u0011\\u0003\\u0011\\u0003\\u0011\\u0003\\u0011',\n  '\\u0003\\u0012\\u0003\\u0012\\u0003\\u0012\\u0003\\u0012\\u0003\\u0012\\u0003\\u0013',\n  '\\u0003\\u0013\\u0003\\u0013\\u0003\\u0013\\u0003\\u0013\\u0003\\u0014\\u0003\\u0014',\n  '\\u0003\\u0014\\u0003\\u0014\\u0003\\u0014\\u0003\\u0014\\u0003\\u0015\\u0003\\u0015',\n  '\\u0003\\u0015\\u0003\\u0015\\u0003\\u0015\\u0003\\u0016\\u0003\\u0016\\u0003\\u0016',\n  '\\u0003\\u0016\\u0003\\u0016\\u0003\\u0016\\u0003\\u0017\\u0003\\u0017\\u0003\\u0017',\n  '\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018',\n  '\\u0003\\u0019\\u0003\\u0019\\u0003\\u0019\\u0003\\u001a\\u0003\\u001a\\u0003\\u001a',\n  '\\u0003\\u001b\\u0003\\u001b\\u0003\\u001b\\u0003\\u001b\\u0003\\u001c\\u0003\\u001c',\n  '\\u0003\\u001c\\u0003\\u001d\\u0003\\u001d\\u0003\\u001d\\u0003\\u001d\\u0003\\u001e',\n  '\\u0003\\u001e\\u0003\\u001e\\u0003\\u001e\\u0003\\u001e\\u0003\\u001e\\u0003\\u001e',\n  '\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f',\n  '\\u0003\\u001f\\u0003\\u001f\\u0003 \\u0003 \\u0003 \\u0003!\\u0003!\\u0003!\\u0003',\n  '!\\u0003!\\u0005!\\u0202\\n!\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0003',\n  '\"\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0005\"\\u0210\\n\"',\n  '\\u0003#\\u0003#\\u0003$\\u0003$\\u0003$\\u0003$\\u0005$\\u0218\\n$\\u0003%\\u0003',\n  '%\\u0003%\\u0003%\\u0003%\\u0003%\\u0003%\\u0005%\\u0221\\n%\\u0003&\\u0003&\\u0003',\n  \"'\\u0003'\\u0003'\\u0003'\\u0005'\\u0229\\n'\\u0003(\\u0003(\\u0003(\\u0003\",\n  '(\\u0003(\\u0003(\\u0003(\\u0005(\\u0232\\n(\\u0003)\\u0003)\\u0003*\\u0003*\\u0003',\n  '*\\u0005*\\u0239\\n*\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0005+\\u0240\\n',\n  '+\\u0003,\\u0003,\\u0003-\\u0003-\\u0003-\\u0003-\\u0005-\\u0248\\n-\\u0003.\\u0003',\n  '.\\u0003/\\u0003/\\u0003/\\u0003/\\u0003/\\u0005/\\u0251\\n/\\u00030\\u00030\\u0003',\n  '0\\u00050\\u0256\\n0\\u00031\\u00031\\u00031\\u00031\\u00051\\u025c\\n1\\u0003',\n  '2\\u00032\\u00032\\u00032\\u00032\\u00032\\u00052\\u0264\\n2\\u00033\\u00033\\u0003',\n  '4\\u00034\\u00034\\u00034\\u00054\\u026c\\n4\\u00035\\u00035\\u00035\\u00035\\u0003',\n  '5\\u00035\\u00035\\u00035\\u00055\\u0276\\n5\\u00036\\u00036\\u00037\\u00037\\u0003',\n  '7\\u00057\\u027d\\n7\\u00038\\u00038\\u00038\\u00038\\u00038\\u00058\\u0284\\n',\n  '8\\u00039\\u00039\\u00079\\u0288\\n9\\f9\\u000e9\\u028b\\u000b9\\u0003:\\u0003',\n  ':\\u0003;\\u0003;\\u0003;\\u0006;\\u0292\\n;\\r;\\u000e;\\u0293\\u0003;\\u0005',\n  ';\\u0297\\n;\\u0003;\\u0005;\\u029a\\n;\\u0003<\\u0006<\\u029d\\n<\\r<\\u000e<\\u029e',\n  '\\u0003=\\u0003=\\u0005=\\u02a3\\n=\\u0003=\\u0003=\\u0003>\\u0003>\\u0003>\\u0007',\n  '>\\u02aa\\n>\\f>\\u000e>\\u02ad\\u000b>\\u0003>\\u0003>\\u0003?\\u0003?\\u0003',\n  '?\\u0003@\\u0003@\\u0003@\\u0007@\\u02b7\\n@\\f@\\u000e@\\u02ba\\u000b@\\u0003',\n  '@\\u0003@\\u0003A\\u0003A\\u0003A\\u0003B\\u0003B\\u0003B\\u0003B\\u0003B\\u0003',\n  'B\\u0007B\\u02c7\\nB\\fB\\u000eB\\u02ca\\u000bB\\u0003B\\u0003B\\u0003B\\u0003',\n  'B\\u0003C\\u0003C\\u0003C\\u0003C\\u0003C\\u0003D\\u0003D\\u0003D\\u0003D\\u0003',\n  'D\\u0003D\\u0007D\\u02db\\nD\\fD\\u000eD\\u02de\\u000bD\\u0003D\\u0003D\\u0003',\n  'D\\u0003D\\u0003E\\u0003E\\u0003E\\u0003E\\u0003E\\u0003F\\u0003F\\u0003F\\u0007',\n  'F\\u02ec\\nF\\fF\\u000eF\\u02ef\\u000bF\\u0003F\\u0003F\\u0003G\\u0003G\\u0003',\n  'G\\u0003H\\u0003H\\u0003H\\u0003H\\u0003H\\u0003I\\u0003I\\u0003I\\u0003I\\u0003',\n  'I\\u0003J\\u0003J\\u0003K\\u0003K\\u0003L\\u0003L\\u0003M\\u0003M\\u0003N\\u0003',\n  'N\\u0003N\\u0003N\\u0003N\\u0005N\\u030d\\nN\\u0003O\\u0003O\\u0003O\\u0003P\\u0003',\n  'P\\u0003Q\\u0003Q\\u0003R\\u0003R\\u0003S\\u0003S\\u0003T\\u0003T\\u0003U\\u0003',\n  'U\\u0003V\\u0003V\\u0003W\\u0003W\\u0003X\\u0003X\\u0003Y\\u0003Y\\u0003Z\\u0003',\n  'Z\\u0003[\\u0003[\\u0003[\\u0003\\\\\\u0003\\\\\\u0003\\\\\\u0003]\\u0003]\\u0003^',\n  '\\u0003^\\u0003^\\u0003_\\u0003_\\u0003`\\u0003`\\u0003a\\u0003a\\u0003b\\u0003',\n  'b\\u0003c\\u0003c\\u0003d\\u0003d\\u0003e\\u0003e\\u0003f\\u0003f\\u0003g\\u0003',\n  'g\\u0003h\\u0003h\\u0003i\\u0003i\\u0003j\\u0003j\\u0003k\\u0003k\\u0003l\\u0003',\n  'l\\u0003m\\u0003m\\u0003n\\u0003n\\u0003o\\u0003o\\u0003p\\u0003p\\u0003q\\u0003',\n  'q\\u0003r\\u0003r\\u0003s\\u0003s\\u0003t\\u0003t\\u0003u\\u0003u\\u0003v\\u0003',\n  'v\\u0003w\\u0003w\\u0003x\\u0003x\\u0003y\\u0003y\\u0003z\\u0003z\\u0003{\\u0003',\n  '{\\u0003{\\u0003{\\u0003{\\u0003|\\u0006|\\u0371\\n|\\r|\\u000e|\\u0372\\u0003',\n  '|\\u0003|\\u0003}\\u0003}\\u0007}\\u0379\\n}\\f}\\u000e}\\u037c\\u000b}\\u0003',\n  '}\\u0003}\\u0003~\\u0003~\\u0003~\\u0007~\\u0383\\n~\\f~\\u000e~\\u0386\\u000b',\n  '~\\u0003~\\u0003~\\u0003~\\u0003~\\u0003\\u007f\\u0003\\u007f\\u0003\\u007f\\u0007',\n  '\\u007f\\u038f\\n\\u007f\\f\\u007f\\u000e\\u007f\\u0392\\u000b\\u007f\\u0003\\u007f',\n  '\\u0003\\u007f\\u0003\\u007f\\u0003\\u007f\\u0003\\u0080\\u0003\\u0080\\u0003\\u0080',\n  '\\u0003\\u0081\\u0003\\u0081\\u0003\\u0081\\u0007\\u0081\\u039e\\n\\u0081\\f\\u0081',\n  '\\u000e\\u0081\\u03a1\\u000b\\u0081\\u0003\\u0081\\u0003\\u0081\\u0003\\u0081\\u0003',\n  '\\u0081\\u0003\\u0082\\u0003\\u0082\\u0003\\u0082\\u0003\\u0083\\u0003\\u0083\\u0003',\n  '\\u0083\\u0003\\u0083\\u0003\\u0083\\u0003\\u0083\\u0007\\u0083\\u03b0\\n\\u0083',\n  '\\f\\u0083\\u000e\\u0083\\u03b3\\u000b\\u0083\\u0003\\u0083\\u0003\\u0083\\u0003',\n  '\\u0083\\u0003\\u0083\\u0003\\u0083\\u0003\\u0083\\u0003\\u0084\\u0003\\u0084\\u0003',\n  '\\u0084\\u0003\\u0084\\u0003\\u0084\\u0003\\u0085\\u0003\\u0085\\u0003\\u0085\\u0003',\n  '\\u0085\\u0003\\u0085\\u0003\\u0085\\u0007\\u0085\\u03c6\\n\\u0085\\f\\u0085\\u000e',\n  '\\u0085\\u03c9\\u000b\\u0085\\u0003\\u0085\\u0003\\u0085\\u0003\\u0085\\u0003\\u0085',\n  '\\u0003\\u0085\\u0003\\u0085\\u0003\\u0086\\u0003\\u0086\\u0003\\u0086\\u0003\\u0086',\n  '\\u0003\\u0086\\u0003\\u0087\\u0003\\u0087\\u0007\\u0087\\u03d8\\n\\u0087\\f\\u0087',\n  '\\u000e\\u0087\\u03db\\u000b\\u0087\\u0003\\u0088\\u0003\\u0088\\u0003\\u0089\\u0003',\n  '\\u0089\\u0003\\u0089\\u0007\\u0089\\u03e2\\n\\u0089\\f\\u0089\\u000e\\u0089\\u03e5',\n  '\\u000b\\u0089\\u0003\\u0089\\u0003\\u0089\\u0003\\u008a\\u0003\\u008a\\u0003\\u008a',\n  '\\u0003\\u008b\\u0003\\u008b\\u0003\\u008b\\u0003\\u008c\\u0006\\u008c\\u03f0\\n',\n  '\\u008c\\r\\u008c\\u000e\\u008c\\u03f1\\u0003\\u008c\\u0003\\u008c\\u0003\\u008d',\n  '\\u0003\\u008d\\u0007\\u008d\\u03f8\\n\\u008d\\f\\u008d\\u000e\\u008d\\u03fb\\u000b',\n  '\\u008d\\u0003\\u008d\\u0003\\u008d\\u0003\\u008e\\u0003\\u008e\\u0003\\u008e\\u0003',\n  '\\u008e\\u0003\\u008e\\u0003\\u008f\\u0003\\u008f\\u0003\\u008f\\u0003\\u008f\\u0003',\n  '\\u008f\\u0003\\u008f\\u0003\\u008f\\u0003\\u008f\\u0003\\u008f\\u0003\\u008f\\u0003',\n  '\\u008f\\u0003\\u0090\\u0003\\u0090\\u0003\\u0090\\u0003\\u0090\\u0003\\u0090\\u0003',\n  '\\u0090\\u0003\\u0090\\u0003\\u0090\\u0003\\u0090\\u0003\\u0090\\u0003\\u0091\\u0003',\n  '\\u0091\\u0003\\u0091\\u0003\\u0091\\u0003\\u0091\\u0003\\u0091\\u0003\\u0091\\u0003',\n  '\\u0092\\u0003\\u0092\\u0003\\u0092\\u0003\\u0092\\u0003\\u0092\\u0003\\u0092\\u0005',\n  '\\u0092\\u0426\\n\\u0092\\u0003\\u0092\\u0003\\u0092\\u0003\\u0092\\u0003\\u0093',\n  '\\u0003\\u0093\\u0003\\u0093\\u0003\\u0093\\u0003\\u0093\\u0003\\u0093\\u0003\\u0093',\n  '\\u0003\\u0093\\u0003\\u0093\\u0003\\u0093\\u0003\\u0093\\u0003\\u0094\\u0003\\u0094',\n  '\\u0003\\u0094\\u0003\\u0094\\u0003\\u0094\\u0003\\u0094\\u0003\\u0094\\u0003\\u0094',\n  '\\u0003\\u0094\\u0003\\u0094\\u0003\\u0095\\u0003\\u0095\\u0003\\u0095\\u0003\\u0095',\n  '\\u0003\\u0095\\u0005\\u0095\\u0445\\n\\u0095\\u0003\\u0095\\u0003\\u0095\\u0003',\n  '\\u0095\\u0003\\u0096\\u0003\\u0096\\u0003\\u0096\\u0003\\u0096\\u0003\\u0096\\u0003',\n  '\\u0096\\u0003\\u0096\\u0003\\u0096\\u0003\\u0097\\u0003\\u0097\\u0003\\u0097\\u0003',\n  '\\u0097\\u0003\\u0097\\u0003\\u0097\\u0003\\u0097\\u0003\\u0097\\u0003\\u0097\\u0003',\n  '\\u0098\\u0003\\u0098\\u0003\\u0099\\u0003\\u0099\\u0003\\u009a\\u0003\\u009a\\u0003',\n  '\\u009a\\u0003\\u009a\\u0003\\u009b\\u0003\\u009b\\u0003\\u009b\\u0003\\u009c\\u0003',\n  '\\u009c\\u0003\\u009c\\u0003\\u009c\\u0003\\u009d\\u0003\\u009d\\u0003\\u009d\\u0007',\n  '\\u009d\\u046d\\n\\u009d\\f\\u009d\\u000e\\u009d\\u0470\\u000b\\u009d\\u0003\\u009d',\n  '\\u0003\\u009d\\u0003\\u009e\\u0003\\u009e\\u0003\\u009e\\u0003\\u009f\\u0003\\u009f',\n  '\\u0003\\u009f\\u0007\\u009f\\u047a\\n\\u009f\\f\\u009f\\u000e\\u009f\\u047d\\u000b',\n  '\\u009f\\u0003\\u009f\\u0003\\u009f\\u0003\\u00a0\\u0003\\u00a0\\u0003\\u00a0\\u0003',\n  '\\u00a1\\u0003\\u00a1\\u0003\\u00a1\\u0003\\u00a1\\u0003\\u00a1\\u0003\\u00a1\\u0007',\n  '\\u00a1\\u048a\\n\\u00a1\\f\\u00a1\\u000e\\u00a1\\u048d\\u000b\\u00a1\\u0003\\u00a1',\n  '\\u0003\\u00a1\\u0003\\u00a1\\u0003\\u00a1\\u0003\\u00a2\\u0003\\u00a2\\u0003\\u00a2',\n  '\\u0003\\u00a2\\u0003\\u00a2\\u0003\\u00a3\\u0003\\u00a3\\u0003\\u00a3\\u0003\\u00a3',\n  '\\u0003\\u00a3\\u0003\\u00a3\\u0007\\u00a3\\u049e\\n\\u00a3\\f\\u00a3\\u000e\\u00a3',\n  '\\u04a1\\u000b\\u00a3\\u0003\\u00a3\\u0003\\u00a3\\u0003\\u00a3\\u0003\\u00a3\\u0003',\n  '\\u00a4\\u0003\\u00a4\\u0003\\u00a4\\u0003\\u00a4\\u0003\\u00a4\\u0003\\u00a5\\u0006',\n  '\\u00a5\\u04ad\\n\\u00a5\\r\\u00a5\\u000e\\u00a5\\u04ae\\u0011\\u02ab\\u02b8\\u02c8',\n  '\\u02dc\\u02ed\\u0384\\u0390\\u039f\\u03b1\\u03c7\\u03e3\\u046e\\u047b\\u048b\\u049f',\n  '\\u0002\\u00a6\\u0005\\u0003\\u0007\\u0004\\t\\u0005\\u000b\\u0006\\r\\u0007\\u000f',\n  '\\b\\u0011\\t\\u0013\\n\\u0015\\u000b\\u0017\\f\\u0019\\r\\u001b\\u000e\\u001d\\u000f',\n  \"\\u001f\\u0010!\\u0011#\\u0012%\\u0013'\\u0014)\\u0015+\\u0016-\\u0017/\\u0018\",\n  '1\\u00193\\u001a5\\u001b7\\u001c9\\u001d;\\u001e=\\u001f? A!C\"E#G$I%K&M\\'',\n  'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s:u;w<y\\u0002{\\u0002}=\\u007f\\u0002',\n  '\\u0081>\\u0083\\u0002\\u0085?\\u0087\\u0002\\u0089@\\u008b\\u0002\\u008dA\\u008f',\n  '\\u0002\\u0091B\\u0093C\\u0095D\\u0097E\\u0099F\\u009bG\\u009dH\\u009fI\\u00a1',\n  'J\\u00a3K\\u00a5L\\u00a7M\\u00a9N\\u00abO\\u00adP\\u00afQ\\u00b1R\\u00b3S\\u00b5',\n  'T\\u00b7U\\u00b9V\\u00bbW\\u00bdX\\u00bfY\\u00c1Z\\u00c3\\u0002\\u00c5\\u0002',\n  '\\u00c7\\u0002\\u00c9\\u0002\\u00cb\\u0002\\u00cd\\u0002\\u00cf\\u0002\\u00d1\\u0002',\n  '\\u00d3\\u0002\\u00d5\\u0002\\u00d7\\u0002\\u00d9\\u0002\\u00db\\u0002\\u00dd\\u0002',\n  '\\u00df\\u0002\\u00e1\\u0002\\u00e3\\u0002\\u00e5\\u0002\\u00e7\\u0002\\u00e9\\u0002',\n  '\\u00eb\\u0002\\u00ed\\u0002\\u00ef\\u0002\\u00f1\\u0002\\u00f3\\u0002\\u00f5\\u0002',\n  '\\u00f7\\u0002\\u00f9[\\u00fb\\\\\\u00fd]\\u00ff^\\u0101\\u0002\\u0103_\\u0105\\u0002',\n  '\\u0107`\\u0109\\u0002\\u010ba\\u010d\\u0002\\u010fb\\u0111c\\u0113d\\u0115\\u0002',\n  '\\u0117\\u0002\\u0119e\\u011bf\\u011dr\\u011f\\u0002\\u0121\\u0002\\u0123g\\u0125',\n  '\\u0002\\u0127\\u0002\\u0129\\u0002\\u012b\\u0002\\u012d\\u0002\\u012f\\u0002\\u0131',\n  'h\\u0133i\\u0135j\\u0137k\\u0139l\\u013bm\\u013d\\u0002\\u013fn\\u0141\\u0002',\n  '\\u0143o\\u0145\\u0002\\u0147p\\u0149\\u0002\\u014bq\\u0005\\u0002\\u0003\\u0004',\n  '#\\u0005\\u0002\\u000b\\f\\u000e\\u000f\"\"\\u0004\\u0002\\f\\f\\u000f\\u000f\\u0005',\n  '\\u0002C\\\\aac|\\u0007\\u0002002;C\\\\aac|\\u0003\\u00022;\\u0004\\u0002GGgg\\u0004',\n  '\\u0002--//\\u0004\\u0002CCcc\\u0004\\u0002DDdd\\u0004\\u0002EEee\\u0004\\u0002',\n  'FFff\\u0004\\u0002HHhh\\u0004\\u0002IIii\\u0004\\u0002JJjj\\u0004\\u0002KKk',\n  'k\\u0004\\u0002LLll\\u0004\\u0002MMmm\\u0004\\u0002NNnn\\u0004\\u0002OOoo\\u0004',\n  '\\u0002PPpp\\u0004\\u0002QQqq\\u0004\\u0002RRrr\\u0004\\u0002SSss\\u0004\\u0002',\n  'TTtt\\u0004\\u0002UUuu\\u0004\\u0002VVvv\\u0004\\u0002WWww\\u0004\\u0002XXx',\n  'x\\u0004\\u0002YYyy\\u0004\\u0002ZZzz\\u0004\\u0002[[{{\\u0004\\u0002\\\\\\\\||',\n  '\\u0006\\u0002\\u000b\\f\\u000e\\u000f\"\"*+\\u0002\\u04c4\\u0002\\u0005\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0007\\u0003\\u0002\\u0002\\u0002\\u0002\\t\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u000b\\u0003\\u0002\\u0002\\u0002\\u0002\\r\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u000f\\u0003\\u0002\\u0002\\u0002\\u0002\\u0011\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0013\\u0003\\u0002\\u0002\\u0002\\u0002\\u0015\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0017\\u0003\\u0002\\u0002\\u0002\\u0002\\u0019\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u001b\\u0003\\u0002\\u0002\\u0002\\u0002\\u001d\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u001f\\u0003\\u0002\\u0002\\u0002\\u0002!\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002#\\u0003\\u0002\\u0002\\u0002\\u0002%\\u0003\\u0002',\n  \"\\u0002\\u0002\\u0002'\\u0003\\u0002\\u0002\\u0002\\u0002)\\u0003\\u0002\\u0002\",\n  '\\u0002\\u0002+\\u0003\\u0002\\u0002\\u0002\\u0002-\\u0003\\u0002\\u0002\\u0002',\n  '\\u0002/\\u0003\\u0002\\u0002\\u0002\\u00021\\u0003\\u0002\\u0002\\u0002\\u0002',\n  '3\\u0003\\u0002\\u0002\\u0002\\u00025\\u0003\\u0002\\u0002\\u0002\\u00027\\u0003',\n  '\\u0002\\u0002\\u0002\\u00029\\u0003\\u0002\\u0002\\u0002\\u0002;\\u0003\\u0002',\n  '\\u0002\\u0002\\u0002=\\u0003\\u0002\\u0002\\u0002\\u0002?\\u0003\\u0002\\u0002',\n  '\\u0002\\u0002A\\u0003\\u0002\\u0002\\u0002\\u0002C\\u0003\\u0002\\u0002\\u0002',\n  '\\u0002E\\u0003\\u0002\\u0002\\u0002\\u0002G\\u0003\\u0002\\u0002\\u0002\\u0002',\n  'I\\u0003\\u0002\\u0002\\u0002\\u0002K\\u0003\\u0002\\u0002\\u0002\\u0002M\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002O\\u0003\\u0002\\u0002\\u0002\\u0002Q\\u0003\\u0002',\n  '\\u0002\\u0002\\u0002S\\u0003\\u0002\\u0002\\u0002\\u0002U\\u0003\\u0002\\u0002',\n  '\\u0002\\u0002W\\u0003\\u0002\\u0002\\u0002\\u0002Y\\u0003\\u0002\\u0002\\u0002',\n  '\\u0002[\\u0003\\u0002\\u0002\\u0002\\u0002]\\u0003\\u0002\\u0002\\u0002\\u0002',\n  '_\\u0003\\u0002\\u0002\\u0002\\u0002a\\u0003\\u0002\\u0002\\u0002\\u0002c\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002e\\u0003\\u0002\\u0002\\u0002\\u0002g\\u0003\\u0002',\n  '\\u0002\\u0002\\u0002i\\u0003\\u0002\\u0002\\u0002\\u0002k\\u0003\\u0002\\u0002',\n  '\\u0002\\u0002m\\u0003\\u0002\\u0002\\u0002\\u0002o\\u0003\\u0002\\u0002\\u0002',\n  '\\u0002q\\u0003\\u0002\\u0002\\u0002\\u0002s\\u0003\\u0002\\u0002\\u0002\\u0002',\n  'u\\u0003\\u0002\\u0002\\u0002\\u0002w\\u0003\\u0002\\u0002\\u0002\\u0002}\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0081\\u0003\\u0002\\u0002\\u0002\\u0002\\u0085\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0089\\u0003\\u0002\\u0002\\u0002\\u0002\\u008d\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0091\\u0003\\u0002\\u0002\\u0002\\u0002\\u0093\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0095\\u0003\\u0002\\u0002\\u0002\\u0002\\u0097\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u0099\\u0003\\u0002\\u0002\\u0002\\u0002\\u009b\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u009d\\u0003\\u0002\\u0002\\u0002\\u0002\\u009f\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00a1\\u0003\\u0002\\u0002\\u0002\\u0002\\u00a3\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00a5\\u0003\\u0002\\u0002\\u0002\\u0002\\u00a7\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00a9\\u0003\\u0002\\u0002\\u0002\\u0002\\u00ab\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00ad\\u0003\\u0002\\u0002\\u0002\\u0002\\u00af\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00b1\\u0003\\u0002\\u0002\\u0002\\u0002\\u00b3\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00b5\\u0003\\u0002\\u0002\\u0002\\u0002\\u00b7\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00b9\\u0003\\u0002\\u0002\\u0002\\u0002\\u00bb\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00bd\\u0003\\u0002\\u0002\\u0002\\u0002\\u00bf\\u0003',\n  '\\u0002\\u0002\\u0002\\u0002\\u00c1\\u0003\\u0002\\u0002\\u0002\\u0003\\u00f7\\u0003',\n  '\\u0002\\u0002\\u0002\\u0003\\u00f9\\u0003\\u0002\\u0002\\u0002\\u0003\\u00fb\\u0003',\n  '\\u0002\\u0002\\u0002\\u0003\\u00fd\\u0003\\u0002\\u0002\\u0002\\u0003\\u00ff\\u0003',\n  '\\u0002\\u0002\\u0002\\u0003\\u0103\\u0003\\u0002\\u0002\\u0002\\u0003\\u0107\\u0003',\n  '\\u0002\\u0002\\u0002\\u0003\\u010b\\u0003\\u0002\\u0002\\u0002\\u0003\\u010f\\u0003',\n  '\\u0002\\u0002\\u0002\\u0003\\u0111\\u0003\\u0002\\u0002\\u0002\\u0003\\u0113\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0119\\u0003\\u0002\\u0002\\u0002\\u0004\\u011b\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u011d\\u0003\\u0002\\u0002\\u0002\\u0004\\u011f\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0121\\u0003\\u0002\\u0002\\u0002\\u0004\\u0123\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0125\\u0003\\u0002\\u0002\\u0002\\u0004\\u0127\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0129\\u0003\\u0002\\u0002\\u0002\\u0004\\u012b\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u012d\\u0003\\u0002\\u0002\\u0002\\u0004\\u012f\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0131\\u0003\\u0002\\u0002\\u0002\\u0004\\u0133\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0135\\u0003\\u0002\\u0002\\u0002\\u0004\\u0137\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0139\\u0003\\u0002\\u0002\\u0002\\u0004\\u013b\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u013f\\u0003\\u0002\\u0002\\u0002\\u0004\\u0143\\u0003',\n  '\\u0002\\u0002\\u0002\\u0004\\u0147\\u0003\\u0002\\u0002\\u0002\\u0004\\u014b\\u0003',\n  '\\u0002\\u0002\\u0002\\u0005\\u014e\\u0003\\u0002\\u0002\\u0002\\u0007\\u0154\\u0003',\n  '\\u0002\\u0002\\u0002\\t\\u015d\\u0003\\u0002\\u0002\\u0002\\u000b\\u0164\\u0003',\n  '\\u0002\\u0002\\u0002\\r\\u016a\\u0003\\u0002\\u0002\\u0002\\u000f\\u016e\\u0003',\n  '\\u0002\\u0002\\u0002\\u0011\\u0172\\u0003\\u0002\\u0002\\u0002\\u0013\\u0177\\u0003',\n  '\\u0002\\u0002\\u0002\\u0015\\u017f\\u0003\\u0002\\u0002\\u0002\\u0017\\u0188\\u0003',\n  '\\u0002\\u0002\\u0002\\u0019\\u0190\\u0003\\u0002\\u0002\\u0002\\u001b\\u0198\\u0003',\n  '\\u0002\\u0002\\u0002\\u001d\\u019f\\u0003\\u0002\\u0002\\u0002\\u001f\\u01a6\\u0003',\n  '\\u0002\\u0002\\u0002!\\u01ab\\u0003\\u0002\\u0002\\u0002#\\u01b1\\u0003\\u0002',\n  \"\\u0002\\u0002%\\u01b5\\u0003\\u0002\\u0002\\u0002'\\u01ba\\u0003\\u0002\\u0002\",\n  '\\u0002)\\u01bf\\u0003\\u0002\\u0002\\u0002+\\u01c5\\u0003\\u0002\\u0002\\u0002',\n  '-\\u01ca\\u0003\\u0002\\u0002\\u0002/\\u01d0\\u0003\\u0002\\u0002\\u00021\\u01d3',\n  '\\u0003\\u0002\\u0002\\u00023\\u01d9\\u0003\\u0002\\u0002\\u00025\\u01dc\\u0003',\n  '\\u0002\\u0002\\u00027\\u01df\\u0003\\u0002\\u0002\\u00029\\u01e3\\u0003\\u0002',\n  '\\u0002\\u0002;\\u01e6\\u0003\\u0002\\u0002\\u0002=\\u01ea\\u0003\\u0002\\u0002',\n  '\\u0002?\\u01f1\\u0003\\u0002\\u0002\\u0002A\\u01f9\\u0003\\u0002\\u0002\\u0002',\n  'C\\u01fc\\u0003\\u0002\\u0002\\u0002E\\u0203\\u0003\\u0002\\u0002\\u0002G\\u0211',\n  '\\u0003\\u0002\\u0002\\u0002I\\u0213\\u0003\\u0002\\u0002\\u0002K\\u0219\\u0003',\n  '\\u0002\\u0002\\u0002M\\u0222\\u0003\\u0002\\u0002\\u0002O\\u0224\\u0003\\u0002',\n  '\\u0002\\u0002Q\\u022a\\u0003\\u0002\\u0002\\u0002S\\u0233\\u0003\\u0002\\u0002',\n  '\\u0002U\\u0235\\u0003\\u0002\\u0002\\u0002W\\u023a\\u0003\\u0002\\u0002\\u0002',\n  'Y\\u0241\\u0003\\u0002\\u0002\\u0002[\\u0243\\u0003\\u0002\\u0002\\u0002]\\u0249',\n  '\\u0003\\u0002\\u0002\\u0002_\\u024b\\u0003\\u0002\\u0002\\u0002a\\u0252\\u0003',\n  '\\u0002\\u0002\\u0002c\\u0257\\u0003\\u0002\\u0002\\u0002e\\u025d\\u0003\\u0002',\n  '\\u0002\\u0002g\\u0265\\u0003\\u0002\\u0002\\u0002i\\u0267\\u0003\\u0002\\u0002',\n  '\\u0002k\\u026d\\u0003\\u0002\\u0002\\u0002m\\u0277\\u0003\\u0002\\u0002\\u0002',\n  'o\\u0279\\u0003\\u0002\\u0002\\u0002q\\u027e\\u0003\\u0002\\u0002\\u0002s\\u0285',\n  '\\u0003\\u0002\\u0002\\u0002u\\u028c\\u0003\\u0002\\u0002\\u0002w\\u0299\\u0003',\n  '\\u0002\\u0002\\u0002y\\u029c\\u0003\\u0002\\u0002\\u0002{\\u02a0\\u0003\\u0002',\n  '\\u0002\\u0002}\\u02a6\\u0003\\u0002\\u0002\\u0002\\u007f\\u02b0\\u0003\\u0002',\n  '\\u0002\\u0002\\u0081\\u02b3\\u0003\\u0002\\u0002\\u0002\\u0083\\u02bd\\u0003\\u0002',\n  '\\u0002\\u0002\\u0085\\u02c0\\u0003\\u0002\\u0002\\u0002\\u0087\\u02cf\\u0003\\u0002',\n  '\\u0002\\u0002\\u0089\\u02d4\\u0003\\u0002\\u0002\\u0002\\u008b\\u02e3\\u0003\\u0002',\n  '\\u0002\\u0002\\u008d\\u02e8\\u0003\\u0002\\u0002\\u0002\\u008f\\u02f2\\u0003\\u0002',\n  '\\u0002\\u0002\\u0091\\u02f5\\u0003\\u0002\\u0002\\u0002\\u0093\\u02fa\\u0003\\u0002',\n  '\\u0002\\u0002\\u0095\\u02ff\\u0003\\u0002\\u0002\\u0002\\u0097\\u0301\\u0003\\u0002',\n  '\\u0002\\u0002\\u0099\\u0303\\u0003\\u0002\\u0002\\u0002\\u009b\\u0305\\u0003\\u0002',\n  '\\u0002\\u0002\\u009d\\u030c\\u0003\\u0002\\u0002\\u0002\\u009f\\u030e\\u0003\\u0002',\n  '\\u0002\\u0002\\u00a1\\u0311\\u0003\\u0002\\u0002\\u0002\\u00a3\\u0313\\u0003\\u0002',\n  '\\u0002\\u0002\\u00a5\\u0315\\u0003\\u0002\\u0002\\u0002\\u00a7\\u0317\\u0003\\u0002',\n  '\\u0002\\u0002\\u00a9\\u0319\\u0003\\u0002\\u0002\\u0002\\u00ab\\u031b\\u0003\\u0002',\n  '\\u0002\\u0002\\u00ad\\u031d\\u0003\\u0002\\u0002\\u0002\\u00af\\u031f\\u0003\\u0002',\n  '\\u0002\\u0002\\u00b1\\u0321\\u0003\\u0002\\u0002\\u0002\\u00b3\\u0323\\u0003\\u0002',\n  '\\u0002\\u0002\\u00b5\\u0325\\u0003\\u0002\\u0002\\u0002\\u00b7\\u0327\\u0003\\u0002',\n  '\\u0002\\u0002\\u00b9\\u032a\\u0003\\u0002\\u0002\\u0002\\u00bb\\u032d\\u0003\\u0002',\n  '\\u0002\\u0002\\u00bd\\u032f\\u0003\\u0002\\u0002\\u0002\\u00bf\\u0332\\u0003\\u0002',\n  '\\u0002\\u0002\\u00c1\\u0334\\u0003\\u0002\\u0002\\u0002\\u00c3\\u0336\\u0003\\u0002',\n  '\\u0002\\u0002\\u00c5\\u0338\\u0003\\u0002\\u0002\\u0002\\u00c7\\u033a\\u0003\\u0002',\n  '\\u0002\\u0002\\u00c9\\u033c\\u0003\\u0002\\u0002\\u0002\\u00cb\\u033e\\u0003\\u0002',\n  '\\u0002\\u0002\\u00cd\\u0340\\u0003\\u0002\\u0002\\u0002\\u00cf\\u0342\\u0003\\u0002',\n  '\\u0002\\u0002\\u00d1\\u0344\\u0003\\u0002\\u0002\\u0002\\u00d3\\u0346\\u0003\\u0002',\n  '\\u0002\\u0002\\u00d5\\u0348\\u0003\\u0002\\u0002\\u0002\\u00d7\\u034a\\u0003\\u0002',\n  '\\u0002\\u0002\\u00d9\\u034c\\u0003\\u0002\\u0002\\u0002\\u00db\\u034e\\u0003\\u0002',\n  '\\u0002\\u0002\\u00dd\\u0350\\u0003\\u0002\\u0002\\u0002\\u00df\\u0352\\u0003\\u0002',\n  '\\u0002\\u0002\\u00e1\\u0354\\u0003\\u0002\\u0002\\u0002\\u00e3\\u0356\\u0003\\u0002',\n  '\\u0002\\u0002\\u00e5\\u0358\\u0003\\u0002\\u0002\\u0002\\u00e7\\u035a\\u0003\\u0002',\n  '\\u0002\\u0002\\u00e9\\u035c\\u0003\\u0002\\u0002\\u0002\\u00eb\\u035e\\u0003\\u0002',\n  '\\u0002\\u0002\\u00ed\\u0360\\u0003\\u0002\\u0002\\u0002\\u00ef\\u0362\\u0003\\u0002',\n  '\\u0002\\u0002\\u00f1\\u0364\\u0003\\u0002\\u0002\\u0002\\u00f3\\u0366\\u0003\\u0002',\n  '\\u0002\\u0002\\u00f5\\u0368\\u0003\\u0002\\u0002\\u0002\\u00f7\\u036a\\u0003\\u0002',\n  '\\u0002\\u0002\\u00f9\\u0370\\u0003\\u0002\\u0002\\u0002\\u00fb\\u0376\\u0003\\u0002',\n  '\\u0002\\u0002\\u00fd\\u037f\\u0003\\u0002\\u0002\\u0002\\u00ff\\u038b\\u0003\\u0002',\n  '\\u0002\\u0002\\u0101\\u0397\\u0003\\u0002\\u0002\\u0002\\u0103\\u039a\\u0003\\u0002',\n  '\\u0002\\u0002\\u0105\\u03a6\\u0003\\u0002\\u0002\\u0002\\u0107\\u03a9\\u0003\\u0002',\n  '\\u0002\\u0002\\u0109\\u03ba\\u0003\\u0002\\u0002\\u0002\\u010b\\u03bf\\u0003\\u0002',\n  '\\u0002\\u0002\\u010d\\u03d0\\u0003\\u0002\\u0002\\u0002\\u010f\\u03d5\\u0003\\u0002',\n  '\\u0002\\u0002\\u0111\\u03dc\\u0003\\u0002\\u0002\\u0002\\u0113\\u03de\\u0003\\u0002',\n  '\\u0002\\u0002\\u0115\\u03e8\\u0003\\u0002\\u0002\\u0002\\u0117\\u03eb\\u0003\\u0002',\n  '\\u0002\\u0002\\u0119\\u03ef\\u0003\\u0002\\u0002\\u0002\\u011b\\u03f5\\u0003\\u0002',\n  '\\u0002\\u0002\\u011d\\u03fe\\u0003\\u0002\\u0002\\u0002\\u011f\\u0403\\u0003\\u0002',\n  '\\u0002\\u0002\\u0121\\u040e\\u0003\\u0002\\u0002\\u0002\\u0123\\u0418\\u0003\\u0002',\n  '\\u0002\\u0002\\u0125\\u041f\\u0003\\u0002\\u0002\\u0002\\u0127\\u042a\\u0003\\u0002',\n  '\\u0002\\u0002\\u0129\\u0435\\u0003\\u0002\\u0002\\u0002\\u012b\\u043f\\u0003\\u0002',\n  '\\u0002\\u0002\\u012d\\u0449\\u0003\\u0002\\u0002\\u0002\\u012f\\u0451\\u0003\\u0002',\n  '\\u0002\\u0002\\u0131\\u045a\\u0003\\u0002\\u0002\\u0002\\u0133\\u045c\\u0003\\u0002',\n  '\\u0002\\u0002\\u0135\\u045e\\u0003\\u0002\\u0002\\u0002\\u0137\\u0462\\u0003\\u0002',\n  '\\u0002\\u0002\\u0139\\u0465\\u0003\\u0002\\u0002\\u0002\\u013b\\u0469\\u0003\\u0002',\n  '\\u0002\\u0002\\u013d\\u0473\\u0003\\u0002\\u0002\\u0002\\u013f\\u0476\\u0003\\u0002',\n  '\\u0002\\u0002\\u0141\\u0480\\u0003\\u0002\\u0002\\u0002\\u0143\\u0483\\u0003\\u0002',\n  '\\u0002\\u0002\\u0145\\u0492\\u0003\\u0002\\u0002\\u0002\\u0147\\u0497\\u0003\\u0002',\n  '\\u0002\\u0002\\u0149\\u04a6\\u0003\\u0002\\u0002\\u0002\\u014b\\u04ac\\u0003\\u0002',\n  '\\u0002\\u0002\\u014d\\u014f\\t\\u0002\\u0002\\u0002\\u014e\\u014d\\u0003\\u0002',\n  '\\u0002\\u0002\\u014f\\u0150\\u0003\\u0002\\u0002\\u0002\\u0150\\u014e\\u0003\\u0002',\n  '\\u0002\\u0002\\u0150\\u0151\\u0003\\u0002\\u0002\\u0002\\u0151\\u0152\\u0003\\u0002',\n  '\\u0002\\u0002\\u0152\\u0153\\b\\u0002\\u0002\\u0002\\u0153\\u0006\\u0003\\u0002',\n  '\\u0002\\u0002\\u0154\\u0158\\u0007%\\u0002\\u0002\\u0155\\u0157\\n\\u0003\\u0002',\n  '\\u0002\\u0156\\u0155\\u0003\\u0002\\u0002\\u0002\\u0157\\u015a\\u0003\\u0002\\u0002',\n  '\\u0002\\u0158\\u0156\\u0003\\u0002\\u0002\\u0002\\u0158\\u0159\\u0003\\u0002\\u0002',\n  '\\u0002\\u0159\\u015b\\u0003\\u0002\\u0002\\u0002\\u015a\\u0158\\u0003\\u0002\\u0002',\n  '\\u0002\\u015b\\u015c\\b\\u0003\\u0003\\u0002\\u015c\\b\\u0003\\u0002\\u0002\\u0002',\n  '\\u015d\\u015e\\u0005\\u00e7s\\u0002\\u015e\\u015f\\u0005\\u00dfo\\u0002\\u015f',\n  '\\u0160\\u0005\\u00ebu\\u0002\\u0160\\u0161\\u0005\\u00e5r\\u0002\\u0161\\u0162',\n  '\\u0005\\u00c7c\\u0002\\u0162\\u0163\\u0005\\u00cbe\\u0002\\u0163\\n\\u0003\\u0002',\n  '\\u0002\\u0002\\u0164\\u0165\\u0005\\u00e7s\\u0002\\u0165\\u0166\\u0005\\u00e9',\n  't\\u0002\\u0166\\u0167\\u0005\\u00c3a\\u0002\\u0167\\u0168\\u0005\\u00e5r\\u0002',\n  '\\u0168\\u0169\\u0005\\u00e9t\\u0002\\u0169\\f\\u0003\\u0002\\u0002\\u0002\\u016a',\n  '\\u016b\\u0005\\u00cbe\\u0002\\u016b\\u016c\\u0005\\u00ddn\\u0002\\u016c\\u016d',\n  '\\u0005\\u00c9d\\u0002\\u016d\\u000e\\u0003\\u0002\\u0002\\u0002\\u016e\\u016f',\n  '\\u0005\\u00ddn\\u0002\\u016f\\u0170\\u0005\\u00dfo\\u0002\\u0170\\u0171\\u0005',\n  '\\u00efw\\u0002\\u0171\\u0010\\u0003\\u0002\\u0002\\u0002\\u0172\\u0173\\u0005',\n  '\\u00d9l\\u0002\\u0173\\u0174\\u0005\\u00d3i\\u0002\\u0174\\u0175\\u0005\\u00ed',\n  'v\\u0002\\u0175\\u0176\\u0005\\u00cbe\\u0002\\u0176\\u0012\\u0003\\u0002\\u0002',\n  '\\u0002\\u0177\\u0178\\u0005\\u00e1p\\u0002\\u0178\\u0179\\u0005\\u00c3a\\u0002',\n  '\\u0179\\u017a\\u0005\\u00e5r\\u0002\\u017a\\u017b\\u0005\\u00e7s\\u0002\\u017b',\n  '\\u017c\\u0005\\u00cbe\\u0002\\u017c\\u017d\\u0003\\u0002\\u0002\\u0002\\u017d',\n  '\\u017e\\b\\t\\u0004\\u0002\\u017e\\u0014\\u0003\\u0002\\u0002\\u0002\\u017f\\u0180',\n  '\\u0005\\u00e7s\\u0002\\u0180\\u0181\\u0005\\u00cbe\\u0002\\u0181\\u0182\\u0005',\n  '\\u00c3a\\u0002\\u0182\\u0183\\u0005\\u00e5r\\u0002\\u0183\\u0184\\u0005\\u00c7',\n  'c\\u0002\\u0184\\u0185\\u0005\\u00d1h\\u0002\\u0185\\u0186\\u0003\\u0002\\u0002',\n  '\\u0002\\u0186\\u0187\\b\\n\\u0005\\u0002\\u0187\\u0016\\u0003\\u0002\\u0002\\u0002',\n  '\\u0188\\u0189\\u0005\\u00cdf\\u0002\\u0189\\u018a\\u0005\\u00d3i\\u0002\\u018a',\n  '\\u018b\\u0005\\u00cbe\\u0002\\u018b\\u018c\\u0005\\u00d9l\\u0002\\u018c\\u018e',\n  '\\u0005\\u00c9d\\u0002\\u018d\\u018f\\u0005\\u00e7s\\u0002\\u018e\\u018d\\u0003',\n  '\\u0002\\u0002\\u0002\\u018e\\u018f\\u0003\\u0002\\u0002\\u0002\\u018f\\u0018\\u0003',\n  '\\u0002\\u0002\\u0002\\u0190\\u0191\\u0005\\u00c9d\\u0002\\u0191\\u0192\\u0005',\n  '\\u00d3i\\u0002\\u0192\\u0193\\u0005\\u00e7s\\u0002\\u0193\\u0194\\u0005\\u00e1',\n  'p\\u0002\\u0194\\u0195\\u0005\\u00d9l\\u0002\\u0195\\u0196\\u0005\\u00c3a\\u0002',\n  '\\u0196\\u0197\\u0005\\u00f3y\\u0002\\u0197\\u001a\\u0003\\u0002\\u0002\\u0002',\n  '\\u0198\\u0199\\u0005\\u00cdf\\u0002\\u0199\\u019a\\u0005\\u00d3i\\u0002\\u019a',\n  '\\u019b\\u0005\\u00d9l\\u0002\\u019b\\u019c\\u0005\\u00e9t\\u0002\\u019c\\u019d',\n  '\\u0005\\u00cbe\\u0002\\u019d\\u019e\\u0005\\u00e5r\\u0002\\u019e\\u001c\\u0003',\n  '\\u0002\\u0002\\u0002\\u019f\\u01a0\\u0005\\u00e7s\\u0002\\u01a0\\u01a1\\u0005',\n  '\\u00e9t\\u0002\\u01a1\\u01a2\\u0005\\u00c3a\\u0002\\u01a2\\u01a4\\u0005\\u00e9',\n  't\\u0002\\u01a3\\u01a5\\u0005\\u00e7s\\u0002\\u01a4\\u01a3\\u0003\\u0002\\u0002',\n  '\\u0002\\u01a4\\u01a5\\u0003\\u0002\\u0002\\u0002\\u01a5\\u001e\\u0003\\u0002\\u0002',\n  '\\u0002\\u01a6\\u01a7\\u0005\\u00e7s\\u0002\\u01a7\\u01a8\\u0005\\u00dfo\\u0002',\n  '\\u01a8\\u01a9\\u0005\\u00e5r\\u0002\\u01a9\\u01aa\\u0005\\u00e9t\\u0002\\u01aa',\n  ' \\u0003\\u0002\\u0002\\u0002\\u01ab\\u01ac\\u0005\\u00dfo\\u0002\\u01ac\\u01ad',\n  '\\u0005\\u00e5r\\u0002\\u01ad\\u01ae\\u0005\\u00c9d\\u0002\\u01ae\\u01af\\u0005',\n  '\\u00cbe\\u0002\\u01af\\u01b0\\u0005\\u00e5r\\u0002\\u01b0\"\\u0003\\u0002\\u0002',\n  '\\u0002\\u01b1\\u01b2\\u0005\\u00c3a\\u0002\\u01b2\\u01b3\\u0005\\u00e7s\\u0002',\n  '\\u01b3\\u01b4\\u0005\\u00c7c\\u0002\\u01b4$\\u0003\\u0002\\u0002\\u0002\\u01b5',\n  '\\u01b6\\u0005\\u00c9d\\u0002\\u01b6\\u01b7\\u0005\\u00cbe\\u0002\\u01b7\\u01b8',\n  '\\u0005\\u00e7s\\u0002\\u01b8\\u01b9\\u0005\\u00c7c\\u0002\\u01b9&\\u0003\\u0002',\n  '\\u0002\\u0002\\u01ba\\u01bb\\u0005\\u00d1h\\u0002\\u01bb\\u01bc\\u0005\\u00cb',\n  'e\\u0002\\u01bc\\u01bd\\u0005\\u00c3a\\u0002\\u01bd\\u01be\\u0005\\u00c9d\\u0002',\n  '\\u01be(\\u0003\\u0002\\u0002\\u0002\\u01bf\\u01c0\\u0005\\u00d9l\\u0002\\u01c0',\n  '\\u01c1\\u0005\\u00d3i\\u0002\\u01c1\\u01c2\\u0005\\u00dbm\\u0002\\u01c2\\u01c3',\n  '\\u0005\\u00d3i\\u0002\\u01c3\\u01c4\\u0005\\u00e9t\\u0002\\u01c4*\\u0003\\u0002',\n  '\\u0002\\u0002\\u01c5\\u01c6\\u0005\\u00e9t\\u0002\\u01c6\\u01c7\\u0005\\u00c3',\n  'a\\u0002\\u01c7\\u01c8\\u0005\\u00d3i\\u0002\\u01c8\\u01c9\\u0005\\u00d9l\\u0002',\n  '\\u01c9,\\u0003\\u0002\\u0002\\u0002\\u01ca\\u01cb\\u0005\\u00e5r\\u0002\\u01cb',\n  '\\u01cc\\u0005\\u00cbe\\u0002\\u01cc\\u01cd\\u0005\\u00cfg\\u0002\\u01cd\\u01ce',\n  '\\u0005\\u00cbe\\u0002\\u01ce\\u01cf\\u0005\\u00f1x\\u0002\\u01cf.\\u0003\\u0002',\n  '\\u0002\\u0002\\u01d0\\u01d1\\u0005\\u00d3i\\u0002\\u01d1\\u01d2\\u0005\\u00dd',\n  'n\\u0002\\u01d20\\u0003\\u0002\\u0002\\u0002\\u01d3\\u01d4\\u0005\\u00cfg\\u0002',\n  '\\u01d4\\u01d5\\u0005\\u00e5r\\u0002\\u01d5\\u01d6\\u0005\\u00dfo\\u0002\\u01d6',\n  '\\u01d7\\u0005\\u00ebu\\u0002\\u01d7\\u01d8\\u0005\\u00e1p\\u0002\\u01d82\\u0003',\n  '\\u0002\\u0002\\u0002\\u01d9\\u01da\\u0005\\u00c5b\\u0002\\u01da\\u01db\\u0005',\n  '\\u00f3y\\u0002\\u01db4\\u0003\\u0002\\u0002\\u0002\\u01dc\\u01dd\\u0005\\u00c3',\n  'a\\u0002\\u01dd\\u01de\\u0005\\u00e7s\\u0002\\u01de6\\u0003\\u0002\\u0002\\u0002',\n  '\\u01df\\u01e0\\u0005\\u00c3a\\u0002\\u01e0\\u01e1\\u0005\\u00ddn\\u0002\\u01e1',\n  '\\u01e2\\u0005\\u00c9d\\u0002\\u01e28\\u0003\\u0002\\u0002\\u0002\\u01e3\\u01e4',\n  '\\u0005\\u00dfo\\u0002\\u01e4\\u01e5\\u0005\\u00e5r\\u0002\\u01e5:\\u0003\\u0002',\n  '\\u0002\\u0002\\u01e6\\u01e7\\u0005\\u00ddn\\u0002\\u01e7\\u01e8\\u0005\\u00df',\n  'o\\u0002\\u01e8\\u01e9\\u0005\\u00e9t\\u0002\\u01e9<\\u0003\\u0002\\u0002\\u0002',\n  '\\u01ea\\u01eb\\u0005\\u00d9l\\u0002\\u01eb\\u01ec\\u0005\\u00d3i\\u0002\\u01ec',\n  '\\u01ed\\u0005\\u00d7k\\u0002\\u01ed\\u01ee\\u0005\\u00cbe\\u0002\\u01ee\\u01ef',\n  '\\u0003\\u0002\\u0002\\u0002\\u01ef\\u01f0\\b\\u001e\\u0004\\u0002\\u01f0>\\u0003',\n  '\\u0002\\u0002\\u0002\\u01f1\\u01f2\\u0005\\u00dbm\\u0002\\u01f2\\u01f3\\u0005',\n  '\\u00c3a\\u0002\\u01f3\\u01f4\\u0005\\u00e9t\\u0002\\u01f4\\u01f5\\u0005\\u00c7',\n  'c\\u0002\\u01f5\\u01f6\\u0005\\u00d1h\\u0002\\u01f6\\u01f7\\u0005\\u00cbe\\u0002',\n  '\\u01f7\\u01f8\\u0005\\u00e7s\\u0002\\u01f8@\\u0003\\u0002\\u0002\\u0002\\u01f9',\n  '\\u01fa\\u0005\\u00dbm\\u0002\\u01fa\\u01fb\\u0005\\u00e7s\\u0002\\u01fbB\\u0003',\n  '\\u0002\\u0002\\u0002\\u01fc\\u01fd\\u0005\\u00dbm\\u0002\\u01fd\\u01fe\\u0005',\n  '\\u00e7s\\u0002\\u01fe\\u01ff\\u0005\\u00cbe\\u0002\\u01ff\\u0201\\u0005\\u00c7',\n  'c\\u0002\\u0200\\u0202\\u0005\\u00e7s\\u0002\\u0201\\u0200\\u0003\\u0002\\u0002',\n  '\\u0002\\u0201\\u0202\\u0003\\u0002\\u0002\\u0002\\u0202D\\u0003\\u0002\\u0002',\n  '\\u0002\\u0203\\u0204\\u0005\\u00dbm\\u0002\\u0204\\u0205\\u0005\\u00d3i\\u0002',\n  '\\u0205\\u0206\\u0005\\u00d9l\\u0002\\u0206\\u0207\\u0005\\u00d9l\\u0002\\u0207',\n  '\\u0208\\u0005\\u00d3i\\u0002\\u0208\\u0209\\u0005\\u00e7s\\u0002\\u0209\\u020a',\n  '\\u0005\\u00cbe\\u0002\\u020a\\u020b\\u0005\\u00c7c\\u0002\\u020b\\u020c\\u0005',\n  '\\u00dfo\\u0002\\u020c\\u020d\\u0005\\u00ddn\\u0002\\u020d\\u020f\\u0005\\u00c9',\n  'd\\u0002\\u020e\\u0210\\u0005\\u00e7s\\u0002\\u020f\\u020e\\u0003\\u0002\\u0002',\n  '\\u0002\\u020f\\u0210\\u0003\\u0002\\u0002\\u0002\\u0210F\\u0003\\u0002\\u0002',\n  '\\u0002\\u0211\\u0212\\u0005\\u00e7s\\u0002\\u0212H\\u0003\\u0002\\u0002\\u0002',\n  '\\u0213\\u0214\\u0005\\u00e7s\\u0002\\u0214\\u0215\\u0005\\u00cbe\\u0002\\u0215',\n  '\\u0217\\u0005\\u00c7c\\u0002\\u0216\\u0218\\u0005\\u00e7s\\u0002\\u0217\\u0216',\n  '\\u0003\\u0002\\u0002\\u0002\\u0217\\u0218\\u0003\\u0002\\u0002\\u0002\\u0218J',\n  '\\u0003\\u0002\\u0002\\u0002\\u0219\\u021a\\u0005\\u00e7s\\u0002\\u021a\\u021b',\n  '\\u0005\\u00cbe\\u0002\\u021b\\u021c\\u0005\\u00c7c\\u0002\\u021c\\u021d\\u0005',\n  '\\u00dfo\\u0002\\u021d\\u021e\\u0005\\u00ddn\\u0002\\u021e\\u0220\\u0005\\u00c9',\n  'd\\u0002\\u021f\\u0221\\u0005\\u00e7s\\u0002\\u0220\\u021f\\u0003\\u0002\\u0002',\n  '\\u0002\\u0220\\u0221\\u0003\\u0002\\u0002\\u0002\\u0221L\\u0003\\u0002\\u0002',\n  '\\u0002\\u0222\\u0223\\u0005\\u00dbm\\u0002\\u0223N\\u0003\\u0002\\u0002\\u0002',\n  '\\u0224\\u0225\\u0005\\u00dbm\\u0002\\u0225\\u0226\\u0005\\u00d3i\\u0002\\u0226',\n  '\\u0228\\u0005\\u00ddn\\u0002\\u0227\\u0229\\u0005\\u00e7s\\u0002\\u0228\\u0227',\n  '\\u0003\\u0002\\u0002\\u0002\\u0228\\u0229\\u0003\\u0002\\u0002\\u0002\\u0229P',\n  '\\u0003\\u0002\\u0002\\u0002\\u022a\\u022b\\u0005\\u00dbm\\u0002\\u022b\\u022c',\n  '\\u0005\\u00d3i\\u0002\\u022c\\u022d\\u0005\\u00ddn\\u0002\\u022d\\u022e\\u0005',\n  '\\u00ebu\\u0002\\u022e\\u022f\\u0005\\u00e9t\\u0002\\u022f\\u0231\\u0005\\u00cb',\n  'e\\u0002\\u0230\\u0232\\u0005\\u00e7s\\u0002\\u0231\\u0230\\u0003\\u0002\\u0002',\n  '\\u0002\\u0231\\u0232\\u0003\\u0002\\u0002\\u0002\\u0232R\\u0003\\u0002\\u0002',\n  '\\u0002\\u0233\\u0234\\u0005\\u00d1h\\u0002\\u0234T\\u0003\\u0002\\u0002\\u0002',\n  '\\u0235\\u0236\\u0005\\u00d1h\\u0002\\u0236\\u0238\\u0005\\u00e5r\\u0002\\u0237',\n  '\\u0239\\u0005\\u00e7s\\u0002\\u0238\\u0237\\u0003\\u0002\\u0002\\u0002\\u0238',\n  '\\u0239\\u0003\\u0002\\u0002\\u0002\\u0239V\\u0003\\u0002\\u0002\\u0002\\u023a',\n  '\\u023b\\u0005\\u00d1h\\u0002\\u023b\\u023c\\u0005\\u00dfo\\u0002\\u023c\\u023d',\n  '\\u0005\\u00ebu\\u0002\\u023d\\u023f\\u0005\\u00e5r\\u0002\\u023e\\u0240\\u0005',\n  '\\u00e7s\\u0002\\u023f\\u023e\\u0003\\u0002\\u0002\\u0002\\u023f\\u0240\\u0003',\n  '\\u0002\\u0002\\u0002\\u0240X\\u0003\\u0002\\u0002\\u0002\\u0241\\u0242\\u0005',\n  '\\u00c9d\\u0002\\u0242Z\\u0003\\u0002\\u0002\\u0002\\u0243\\u0244\\u0005\\u00c9',\n  'd\\u0002\\u0244\\u0245\\u0005\\u00c3a\\u0002\\u0245\\u0247\\u0005\\u00f3y\\u0002',\n  '\\u0246\\u0248\\u0005\\u00e7s\\u0002\\u0247\\u0246\\u0003\\u0002\\u0002\\u0002',\n  '\\u0247\\u0248\\u0003\\u0002\\u0002\\u0002\\u0248\\\\\\u0003\\u0002\\u0002\\u0002',\n  '\\u0249\\u024a\\u0005\\u00efw\\u0002\\u024a^\\u0003\\u0002\\u0002\\u0002\\u024b',\n  '\\u024c\\u0005\\u00efw\\u0002\\u024c\\u024d\\u0005\\u00cbe\\u0002\\u024d\\u024e',\n  '\\u0005\\u00cbe\\u0002\\u024e\\u0250\\u0005\\u00d7k\\u0002\\u024f\\u0251\\u0005',\n  '\\u00e7s\\u0002\\u0250\\u024f\\u0003\\u0002\\u0002\\u0002\\u0250\\u0251\\u0003',\n  '\\u0002\\u0002\\u0002\\u0251`\\u0003\\u0002\\u0002\\u0002\\u0252\\u0253\\u0005',\n  '\\u00dbm\\u0002\\u0253\\u0255\\u0005\\u00dfo\\u0002\\u0254\\u0256\\u0005\\u00e7',\n  's\\u0002\\u0255\\u0254\\u0003\\u0002\\u0002\\u0002\\u0255\\u0256\\u0003\\u0002',\n  '\\u0002\\u0002\\u0256b\\u0003\\u0002\\u0002\\u0002\\u0257\\u0258\\u0005\\u00db',\n  'm\\u0002\\u0258\\u0259\\u0005\\u00dfo\\u0002\\u0259\\u025b\\u0005\\u00ddn\\u0002',\n  '\\u025a\\u025c\\u0005\\u00e7s\\u0002\\u025b\\u025a\\u0003\\u0002\\u0002\\u0002',\n  '\\u025b\\u025c\\u0003\\u0002\\u0002\\u0002\\u025cd\\u0003\\u0002\\u0002\\u0002',\n  '\\u025d\\u025e\\u0005\\u00dbm\\u0002\\u025e\\u025f\\u0005\\u00dfo\\u0002\\u025f',\n  '\\u0260\\u0005\\u00ddn\\u0002\\u0260\\u0261\\u0005\\u00e9t\\u0002\\u0261\\u0263',\n  '\\u0005\\u00d1h\\u0002\\u0262\\u0264\\u0005\\u00e7s\\u0002\\u0263\\u0262\\u0003',\n  '\\u0002\\u0002\\u0002\\u0263\\u0264\\u0003\\u0002\\u0002\\u0002\\u0264f\\u0003',\n  '\\u0002\\u0002\\u0002\\u0265\\u0266\\u0005\\u00e3q\\u0002\\u0266h\\u0003\\u0002',\n  '\\u0002\\u0002\\u0267\\u0268\\u0005\\u00e3q\\u0002\\u0268\\u0269\\u0005\\u00e9',\n  't\\u0002\\u0269\\u026b\\u0005\\u00e5r\\u0002\\u026a\\u026c\\u0005\\u00e7s\\u0002',\n  '\\u026b\\u026a\\u0003\\u0002\\u0002\\u0002\\u026b\\u026c\\u0003\\u0002\\u0002\\u0002',\n  '\\u026cj\\u0003\\u0002\\u0002\\u0002\\u026d\\u026e\\u0005\\u00e3q\\u0002\\u026e',\n  '\\u026f\\u0005\\u00ebu\\u0002\\u026f\\u0270\\u0005\\u00c3a\\u0002\\u0270\\u0271',\n  '\\u0005\\u00e5r\\u0002\\u0271\\u0272\\u0005\\u00e9t\\u0002\\u0272\\u0273\\u0005',\n  '\\u00cbe\\u0002\\u0273\\u0275\\u0005\\u00e5r\\u0002\\u0274\\u0276\\u0005\\u00e7',\n  's\\u0002\\u0275\\u0274\\u0003\\u0002\\u0002\\u0002\\u0275\\u0276\\u0003\\u0002',\n  '\\u0002\\u0002\\u0276l\\u0003\\u0002\\u0002\\u0002\\u0277\\u0278\\u0005\\u00f3',\n  'y\\u0002\\u0278n\\u0003\\u0002\\u0002\\u0002\\u0279\\u027a\\u0005\\u00f3y\\u0002',\n  '\\u027a\\u027c\\u0005\\u00e5r\\u0002\\u027b\\u027d\\u0005\\u00e7s\\u0002\\u027c',\n  '\\u027b\\u0003\\u0002\\u0002\\u0002\\u027c\\u027d\\u0003\\u0002\\u0002\\u0002\\u027d',\n  'p\\u0003\\u0002\\u0002\\u0002\\u027e\\u027f\\u0005\\u00f3y\\u0002\\u027f\\u0280',\n  '\\u0005\\u00cbe\\u0002\\u0280\\u0281\\u0005\\u00c3a\\u0002\\u0281\\u0283\\u0005',\n  '\\u00e5r\\u0002\\u0282\\u0284\\u0005\\u00e7s\\u0002\\u0283\\u0282\\u0003\\u0002',\n  '\\u0002\\u0002\\u0283\\u0284\\u0003\\u0002\\u0002\\u0002\\u0284r\\u0003\\u0002',\n  '\\u0002\\u0002\\u0285\\u0289\\t\\u0004\\u0002\\u0002\\u0286\\u0288\\t\\u0005\\u0002',\n  '\\u0002\\u0287\\u0286\\u0003\\u0002\\u0002\\u0002\\u0288\\u028b\\u0003\\u0002\\u0002',\n  '\\u0002\\u0289\\u0287\\u0003\\u0002\\u0002\\u0002\\u0289\\u028a\\u0003\\u0002\\u0002',\n  '\\u0002\\u028at\\u0003\\u0002\\u0002\\u0002\\u028b\\u0289\\u0003\\u0002\\u0002',\n  '\\u0002\\u028c\\u028d\\u0005y<\\u0002\\u028dv\\u0003\\u0002\\u0002\\u0002\\u028e',\n  '\\u028f\\u0005y<\\u0002\\u028f\\u0291\\u00070\\u0002\\u0002\\u0290\\u0292\\t\\u0006',\n  '\\u0002\\u0002\\u0291\\u0290\\u0003\\u0002\\u0002\\u0002\\u0292\\u0293\\u0003\\u0002',\n  '\\u0002\\u0002\\u0293\\u0291\\u0003\\u0002\\u0002\\u0002\\u0293\\u0294\\u0003\\u0002',\n  '\\u0002\\u0002\\u0294\\u0296\\u0003\\u0002\\u0002\\u0002\\u0295\\u0297\\u0005{',\n  '=\\u0002\\u0296\\u0295\\u0003\\u0002\\u0002\\u0002\\u0296\\u0297\\u0003\\u0002',\n  '\\u0002\\u0002\\u0297\\u029a\\u0003\\u0002\\u0002\\u0002\\u0298\\u029a\\u0005y',\n  '<\\u0002\\u0299\\u028e\\u0003\\u0002\\u0002\\u0002\\u0299\\u0298\\u0003\\u0002',\n  '\\u0002\\u0002\\u029ax\\u0003\\u0002\\u0002\\u0002\\u029b\\u029d\\t\\u0006\\u0002',\n  '\\u0002\\u029c\\u029b\\u0003\\u0002\\u0002\\u0002\\u029d\\u029e\\u0003\\u0002\\u0002',\n  '\\u0002\\u029e\\u029c\\u0003\\u0002\\u0002\\u0002\\u029e\\u029f\\u0003\\u0002\\u0002',\n  '\\u0002\\u029fz\\u0003\\u0002\\u0002\\u0002\\u02a0\\u02a2\\t\\u0007\\u0002\\u0002',\n  '\\u02a1\\u02a3\\t\\b\\u0002\\u0002\\u02a2\\u02a1\\u0003\\u0002\\u0002\\u0002\\u02a2',\n  '\\u02a3\\u0003\\u0002\\u0002\\u0002\\u02a3\\u02a4\\u0003\\u0002\\u0002\\u0002\\u02a4',\n  '\\u02a5\\u0005y<\\u0002\\u02a5|\\u0003\\u0002\\u0002\\u0002\\u02a6\\u02ab\\u0007',\n  '$\\u0002\\u0002\\u02a7\\u02aa\\u0005\\u007f?\\u0002\\u02a8\\u02aa\\u000b\\u0002',\n  '\\u0002\\u0002\\u02a9\\u02a7\\u0003\\u0002\\u0002\\u0002\\u02a9\\u02a8\\u0003\\u0002',\n  '\\u0002\\u0002\\u02aa\\u02ad\\u0003\\u0002\\u0002\\u0002\\u02ab\\u02ac\\u0003\\u0002',\n  '\\u0002\\u0002\\u02ab\\u02a9\\u0003\\u0002\\u0002\\u0002\\u02ac\\u02ae\\u0003\\u0002',\n  '\\u0002\\u0002\\u02ad\\u02ab\\u0003\\u0002\\u0002\\u0002\\u02ae\\u02af\\u0007$',\n  '\\u0002\\u0002\\u02af~\\u0003\\u0002\\u0002\\u0002\\u02b0\\u02b1\\u0007^\\u0002',\n  '\\u0002\\u02b1\\u02b2\\u0007$\\u0002\\u0002\\u02b2\\u0080\\u0003\\u0002\\u0002',\n  '\\u0002\\u02b3\\u02b8\\u0007)\\u0002\\u0002\\u02b4\\u02b7\\u0005\\u0083A\\u0002',\n  '\\u02b5\\u02b7\\u000b\\u0002\\u0002\\u0002\\u02b6\\u02b4\\u0003\\u0002\\u0002\\u0002',\n  '\\u02b6\\u02b5\\u0003\\u0002\\u0002\\u0002\\u02b7\\u02ba\\u0003\\u0002\\u0002\\u0002',\n  '\\u02b8\\u02b9\\u0003\\u0002\\u0002\\u0002\\u02b8\\u02b6\\u0003\\u0002\\u0002\\u0002',\n  '\\u02b9\\u02bb\\u0003\\u0002\\u0002\\u0002\\u02ba\\u02b8\\u0003\\u0002\\u0002\\u0002',\n  '\\u02bb\\u02bc\\u0007)\\u0002\\u0002\\u02bc\\u0082\\u0003\\u0002\\u0002\\u0002',\n  '\\u02bd\\u02be\\u0007^\\u0002\\u0002\\u02be\\u02bf\\u0007)\\u0002\\u0002\\u02bf',\n  '\\u0084\\u0003\\u0002\\u0002\\u0002\\u02c0\\u02c1\\u0007\\u00e4\\u0002\\u0002\\u02c1',\n  '\\u02c2\\u0007\\u20ae\\u0002\\u0002\\u02c2\\u02c3\\u0007\\u0155\\u0002\\u0002\\u02c3',\n  '\\u02c8\\u0003\\u0002\\u0002\\u0002\\u02c4\\u02c7\\u0005\\u0087C\\u0002\\u02c5',\n  '\\u02c7\\u000b\\u0002\\u0002\\u0002\\u02c6\\u02c4\\u0003\\u0002\\u0002\\u0002\\u02c6',\n  '\\u02c5\\u0003\\u0002\\u0002\\u0002\\u02c7\\u02ca\\u0003\\u0002\\u0002\\u0002\\u02c8',\n  '\\u02c9\\u0003\\u0002\\u0002\\u0002\\u02c8\\u02c6\\u0003\\u0002\\u0002\\u0002\\u02c9',\n  '\\u02cb\\u0003\\u0002\\u0002\\u0002\\u02ca\\u02c8\\u0003\\u0002\\u0002\\u0002\\u02cb',\n  '\\u02cc\\u0007\\u00e4\\u0002\\u0002\\u02cc\\u02cd\\u0007\\u20ae\\u0002\\u0002\\u02cd',\n  '\\u02ce\\u0007\\u009f\\u0002\\u0002\\u02ce\\u0086\\u0003\\u0002\\u0002\\u0002\\u02cf',\n  '\\u02d0\\u0007^\\u0002\\u0002\\u02d0\\u02d1\\u0007\\u00e4\\u0002\\u0002\\u02d1',\n  '\\u02d2\\u0007\\u20ae\\u0002\\u0002\\u02d2\\u02d3\\u0007\\u009f\\u0002\\u0002\\u02d3',\n  '\\u0088\\u0003\\u0002\\u0002\\u0002\\u02d4\\u02d5\\u0007\\u00e4\\u0002\\u0002\\u02d5',\n  '\\u02d6\\u0007\\u20ae\\u0002\\u0002\\u02d6\\u02d7\\u0007\\u02de\\u0002\\u0002\\u02d7',\n  '\\u02dc\\u0003\\u0002\\u0002\\u0002\\u02d8\\u02db\\u0005\\u008bE\\u0002\\u02d9',\n  '\\u02db\\u000b\\u0002\\u0002\\u0002\\u02da\\u02d8\\u0003\\u0002\\u0002\\u0002\\u02da',\n  '\\u02d9\\u0003\\u0002\\u0002\\u0002\\u02db\\u02de\\u0003\\u0002\\u0002\\u0002\\u02dc',\n  '\\u02dd\\u0003\\u0002\\u0002\\u0002\\u02dc\\u02da\\u0003\\u0002\\u0002\\u0002\\u02dd',\n  '\\u02df\\u0003\\u0002\\u0002\\u0002\\u02de\\u02dc\\u0003\\u0002\\u0002\\u0002\\u02df',\n  '\\u02e0\\u0007\\u00e4\\u0002\\u0002\\u02e0\\u02e1\\u0007\\u20ae\\u0002\\u0002\\u02e1',\n  '\\u02e2\\u0007\\u2124\\u0002\\u0002\\u02e2\\u008a\\u0003\\u0002\\u0002\\u0002\\u02e3',\n  '\\u02e4\\u0007^\\u0002\\u0002\\u02e4\\u02e5\\u0007\\u00e4\\u0002\\u0002\\u02e5',\n  '\\u02e6\\u0007\\u20ae\\u0002\\u0002\\u02e6\\u02e7\\u0007\\u2124\\u0002\\u0002\\u02e7',\n  '\\u008c\\u0003\\u0002\\u0002\\u0002\\u02e8\\u02ed\\u0007b\\u0002\\u0002\\u02e9',\n  '\\u02ec\\u0005\\u008fG\\u0002\\u02ea\\u02ec\\u000b\\u0002\\u0002\\u0002\\u02eb',\n  '\\u02e9\\u0003\\u0002\\u0002\\u0002\\u02eb\\u02ea\\u0003\\u0002\\u0002\\u0002\\u02ec',\n  '\\u02ef\\u0003\\u0002\\u0002\\u0002\\u02ed\\u02ee\\u0003\\u0002\\u0002\\u0002\\u02ed',\n  '\\u02eb\\u0003\\u0002\\u0002\\u0002\\u02ee\\u02f0\\u0003\\u0002\\u0002\\u0002\\u02ef',\n  '\\u02ed\\u0003\\u0002\\u0002\\u0002\\u02f0\\u02f1\\u0007b\\u0002\\u0002\\u02f1',\n  '\\u008e\\u0003\\u0002\\u0002\\u0002\\u02f2\\u02f3\\u0007^\\u0002\\u0002\\u02f3',\n  '\\u02f4\\u0007b\\u0002\\u0002\\u02f4\\u0090\\u0003\\u0002\\u0002\\u0002\\u02f5',\n  '\\u02f6\\u0007?\\u0002\\u0002\\u02f6\\u02f7\\u0007\\u0080\\u0002\\u0002\\u02f7',\n  '\\u02f8\\u0003\\u0002\\u0002\\u0002\\u02f8\\u02f9\\bH\\u0004\\u0002\\u02f9\\u0092',\n  '\\u0003\\u0002\\u0002\\u0002\\u02fa\\u02fb\\u0007\\u0080\\u0002\\u0002\\u02fb\\u02fc',\n  '\\u0007?\\u0002\\u0002\\u02fc\\u02fd\\u0003\\u0002\\u0002\\u0002\\u02fd\\u02fe',\n  '\\bI\\u0004\\u0002\\u02fe\\u0094\\u0003\\u0002\\u0002\\u0002\\u02ff\\u0300\\u0007',\n  'B\\u0002\\u0002\\u0300\\u0096\\u0003\\u0002\\u0002\\u0002\\u0301\\u0302\\u0007',\n  '.\\u0002\\u0002\\u0302\\u0098\\u0003\\u0002\\u0002\\u0002\\u0303\\u0304\\u0007',\n  '*\\u0002\\u0002\\u0304\\u009a\\u0003\\u0002\\u0002\\u0002\\u0305\\u0306\\u0007',\n  '+\\u0002\\u0002\\u0306\\u009c\\u0003\\u0002\\u0002\\u0002\\u0307\\u0308\\u0006',\n  'N\\u0002\\u0002\\u0308\\u0309\\u0007~\\u0002\\u0002\\u0309\\u030d\\bN\\u0006\\u0002',\n  '\\u030a\\u030b\\u0006N\\u0003\\u0002\\u030b\\u030d\\u0007~\\u0002\\u0002\\u030c',\n  '\\u0307\\u0003\\u0002\\u0002\\u0002\\u030c\\u030a\\u0003\\u0002\\u0002\\u0002\\u030d',\n  '\\u009e\\u0003\\u0002\\u0002\\u0002\\u030e\\u030f\\u0007~\\u0002\\u0002\\u030f',\n  '\\u0310\\u0007@\\u0002\\u0002\\u0310\\u00a0\\u0003\\u0002\\u0002\\u0002\\u0311',\n  '\\u0312\\u0007<\\u0002\\u0002\\u0312\\u00a2\\u0003\\u0002\\u0002\\u0002\\u0313',\n  '\\u0314\\u0007`\\u0002\\u0002\\u0314\\u00a4\\u0003\\u0002\\u0002\\u0002\\u0315',\n  '\\u0316\\u0007#\\u0002\\u0002\\u0316\\u00a6\\u0003\\u0002\\u0002\\u0002\\u0317',\n  '\\u0318\\u0007,\\u0002\\u0002\\u0318\\u00a8\\u0003\\u0002\\u0002\\u0002\\u0319',\n  '\\u031a\\u00071\\u0002\\u0002\\u031a\\u00aa\\u0003\\u0002\\u0002\\u0002\\u031b',\n  \"\\u031c\\u0007'\\u0002\\u0002\\u031c\\u00ac\\u0003\\u0002\\u0002\\u0002\\u031d\",\n  '\\u031e\\u0007-\\u0002\\u0002\\u031e\\u00ae\\u0003\\u0002\\u0002\\u0002\\u031f',\n  '\\u0320\\u0007/\\u0002\\u0002\\u0320\\u00b0\\u0003\\u0002\\u0002\\u0002\\u0321',\n  '\\u0322\\u0007\\u0080\\u0002\\u0002\\u0322\\u00b2\\u0003\\u0002\\u0002\\u0002\\u0323',\n  '\\u0324\\u0007>\\u0002\\u0002\\u0324\\u00b4\\u0003\\u0002\\u0002\\u0002\\u0325',\n  '\\u0326\\u0007@\\u0002\\u0002\\u0326\\u00b6\\u0003\\u0002\\u0002\\u0002\\u0327',\n  '\\u0328\\u0007>\\u0002\\u0002\\u0328\\u0329\\u0007?\\u0002\\u0002\\u0329\\u00b8',\n  '\\u0003\\u0002\\u0002\\u0002\\u032a\\u032b\\u0007@\\u0002\\u0002\\u032b\\u032c',\n  '\\u0007?\\u0002\\u0002\\u032c\\u00ba\\u0003\\u0002\\u0002\\u0002\\u032d\\u032e',\n  '\\u0007?\\u0002\\u0002\\u032e\\u00bc\\u0003\\u0002\\u0002\\u0002\\u032f\\u0330',\n  '\\u0007#\\u0002\\u0002\\u0330\\u0331\\u0007?\\u0002\\u0002\\u0331\\u00be\\u0003',\n  '\\u0002\\u0002\\u0002\\u0332\\u0333\\u0007]\\u0002\\u0002\\u0333\\u00c0\\u0003',\n  '\\u0002\\u0002\\u0002\\u0334\\u0335\\u0007_\\u0002\\u0002\\u0335\\u00c2\\u0003',\n  '\\u0002\\u0002\\u0002\\u0336\\u0337\\t\\t\\u0002\\u0002\\u0337\\u00c4\\u0003\\u0002',\n  '\\u0002\\u0002\\u0338\\u0339\\t\\n\\u0002\\u0002\\u0339\\u00c6\\u0003\\u0002\\u0002',\n  '\\u0002\\u033a\\u033b\\t\\u000b\\u0002\\u0002\\u033b\\u00c8\\u0003\\u0002\\u0002',\n  '\\u0002\\u033c\\u033d\\t\\f\\u0002\\u0002\\u033d\\u00ca\\u0003\\u0002\\u0002\\u0002',\n  '\\u033e\\u033f\\t\\u0007\\u0002\\u0002\\u033f\\u00cc\\u0003\\u0002\\u0002\\u0002',\n  '\\u0340\\u0341\\t\\r\\u0002\\u0002\\u0341\\u00ce\\u0003\\u0002\\u0002\\u0002\\u0342',\n  '\\u0343\\t\\u000e\\u0002\\u0002\\u0343\\u00d0\\u0003\\u0002\\u0002\\u0002\\u0344',\n  '\\u0345\\t\\u000f\\u0002\\u0002\\u0345\\u00d2\\u0003\\u0002\\u0002\\u0002\\u0346',\n  '\\u0347\\t\\u0010\\u0002\\u0002\\u0347\\u00d4\\u0003\\u0002\\u0002\\u0002\\u0348',\n  '\\u0349\\t\\u0011\\u0002\\u0002\\u0349\\u00d6\\u0003\\u0002\\u0002\\u0002\\u034a',\n  '\\u034b\\t\\u0012\\u0002\\u0002\\u034b\\u00d8\\u0003\\u0002\\u0002\\u0002\\u034c',\n  '\\u034d\\t\\u0013\\u0002\\u0002\\u034d\\u00da\\u0003\\u0002\\u0002\\u0002\\u034e',\n  '\\u034f\\t\\u0014\\u0002\\u0002\\u034f\\u00dc\\u0003\\u0002\\u0002\\u0002\\u0350',\n  '\\u0351\\t\\u0015\\u0002\\u0002\\u0351\\u00de\\u0003\\u0002\\u0002\\u0002\\u0352',\n  '\\u0353\\t\\u0016\\u0002\\u0002\\u0353\\u00e0\\u0003\\u0002\\u0002\\u0002\\u0354',\n  '\\u0355\\t\\u0017\\u0002\\u0002\\u0355\\u00e2\\u0003\\u0002\\u0002\\u0002\\u0356',\n  '\\u0357\\t\\u0018\\u0002\\u0002\\u0357\\u00e4\\u0003\\u0002\\u0002\\u0002\\u0358',\n  '\\u0359\\t\\u0019\\u0002\\u0002\\u0359\\u00e6\\u0003\\u0002\\u0002\\u0002\\u035a',\n  '\\u035b\\t\\u001a\\u0002\\u0002\\u035b\\u00e8\\u0003\\u0002\\u0002\\u0002\\u035c',\n  '\\u035d\\t\\u001b\\u0002\\u0002\\u035d\\u00ea\\u0003\\u0002\\u0002\\u0002\\u035e',\n  '\\u035f\\t\\u001c\\u0002\\u0002\\u035f\\u00ec\\u0003\\u0002\\u0002\\u0002\\u0360',\n  '\\u0361\\t\\u001d\\u0002\\u0002\\u0361\\u00ee\\u0003\\u0002\\u0002\\u0002\\u0362',\n  '\\u0363\\t\\u001e\\u0002\\u0002\\u0363\\u00f0\\u0003\\u0002\\u0002\\u0002\\u0364',\n  '\\u0365\\t\\u001f\\u0002\\u0002\\u0365\\u00f2\\u0003\\u0002\\u0002\\u0002\\u0366',\n  '\\u0367\\t \\u0002\\u0002\\u0367\\u00f4\\u0003\\u0002\\u0002\\u0002\\u0368\\u0369',\n  '\\t!\\u0002\\u0002\\u0369\\u00f6\\u0003\\u0002\\u0002\\u0002\\u036a\\u036b\\u0007',\n  '.\\u0002\\u0002\\u036b\\u036c\\u0003\\u0002\\u0002\\u0002\\u036c\\u036d\\b{\\u0007',\n  '\\u0002\\u036d\\u036e\\b{\\b\\u0002\\u036e\\u00f8\\u0003\\u0002\\u0002\\u0002\\u036f',\n  '\\u0371\\t\\u0002\\u0002\\u0002\\u0370\\u036f\\u0003\\u0002\\u0002\\u0002\\u0371',\n  '\\u0372\\u0003\\u0002\\u0002\\u0002\\u0372\\u0370\\u0003\\u0002\\u0002\\u0002\\u0372',\n  '\\u0373\\u0003\\u0002\\u0002\\u0002\\u0373\\u0374\\u0003\\u0002\\u0002\\u0002\\u0374',\n  '\\u0375\\b|\\t\\u0002\\u0375\\u00fa\\u0003\\u0002\\u0002\\u0002\\u0376\\u037a\\u0007',\n  '%\\u0002\\u0002\\u0377\\u0379\\n\\u0003\\u0002\\u0002\\u0378\\u0377\\u0003\\u0002',\n  '\\u0002\\u0002\\u0379\\u037c\\u0003\\u0002\\u0002\\u0002\\u037a\\u0378\\u0003\\u0002',\n  '\\u0002\\u0002\\u037a\\u037b\\u0003\\u0002\\u0002\\u0002\\u037b\\u037d\\u0003\\u0002',\n  '\\u0002\\u0002\\u037c\\u037a\\u0003\\u0002\\u0002\\u0002\\u037d\\u037e\\b}\\u0003',\n  '\\u0002\\u037e\\u00fc\\u0003\\u0002\\u0002\\u0002\\u037f\\u0384\\u00071\\u0002',\n  '\\u0002\\u0380\\u0383\\u0005\\u0117\\u008b\\u0002\\u0381\\u0383\\u000b\\u0002\\u0002',\n  '\\u0002\\u0382\\u0380\\u0003\\u0002\\u0002\\u0002\\u0382\\u0381\\u0003\\u0002\\u0002',\n  '\\u0002\\u0383\\u0386\\u0003\\u0002\\u0002\\u0002\\u0384\\u0385\\u0003\\u0002\\u0002',\n  '\\u0002\\u0384\\u0382\\u0003\\u0002\\u0002\\u0002\\u0385\\u0387\\u0003\\u0002\\u0002',\n  '\\u0002\\u0386\\u0384\\u0003\\u0002\\u0002\\u0002\\u0387\\u0388\\u00071\\u0002',\n  '\\u0002\\u0388\\u0389\\u0003\\u0002\\u0002\\u0002\\u0389\\u038a\\b~\\b\\u0002\\u038a',\n  '\\u00fe\\u0003\\u0002\\u0002\\u0002\\u038b\\u0390\\u0007$\\u0002\\u0002\\u038c',\n  '\\u038f\\u0005\\u0101\\u0080\\u0002\\u038d\\u038f\\u000b\\u0002\\u0002\\u0002\\u038e',\n  '\\u038c\\u0003\\u0002\\u0002\\u0002\\u038e\\u038d\\u0003\\u0002\\u0002\\u0002\\u038f',\n  '\\u0392\\u0003\\u0002\\u0002\\u0002\\u0390\\u0391\\u0003\\u0002\\u0002\\u0002\\u0390',\n  '\\u038e\\u0003\\u0002\\u0002\\u0002\\u0391\\u0393\\u0003\\u0002\\u0002\\u0002\\u0392',\n  '\\u0390\\u0003\\u0002\\u0002\\u0002\\u0393\\u0394\\u0007$\\u0002\\u0002\\u0394',\n  '\\u0395\\u0003\\u0002\\u0002\\u0002\\u0395\\u0396\\b\\u007f\\b\\u0002\\u0396\\u0100',\n  '\\u0003\\u0002\\u0002\\u0002\\u0397\\u0398\\u0007^\\u0002\\u0002\\u0398\\u0399',\n  '\\u0007$\\u0002\\u0002\\u0399\\u0102\\u0003\\u0002\\u0002\\u0002\\u039a\\u039f',\n  '\\u0007)\\u0002\\u0002\\u039b\\u039e\\u0005\\u0105\\u0082\\u0002\\u039c\\u039e',\n  '\\u000b\\u0002\\u0002\\u0002\\u039d\\u039b\\u0003\\u0002\\u0002\\u0002\\u039d\\u039c',\n  '\\u0003\\u0002\\u0002\\u0002\\u039e\\u03a1\\u0003\\u0002\\u0002\\u0002\\u039f\\u03a0',\n  '\\u0003\\u0002\\u0002\\u0002\\u039f\\u039d\\u0003\\u0002\\u0002\\u0002\\u03a0\\u03a2',\n  '\\u0003\\u0002\\u0002\\u0002\\u03a1\\u039f\\u0003\\u0002\\u0002\\u0002\\u03a2\\u03a3',\n  '\\u0007)\\u0002\\u0002\\u03a3\\u03a4\\u0003\\u0002\\u0002\\u0002\\u03a4\\u03a5',\n  '\\b\\u0081\\b\\u0002\\u03a5\\u0104\\u0003\\u0002\\u0002\\u0002\\u03a6\\u03a7\\u0007',\n  '^\\u0002\\u0002\\u03a7\\u03a8\\u0007)\\u0002\\u0002\\u03a8\\u0106\\u0003\\u0002',\n  '\\u0002\\u0002\\u03a9\\u03aa\\u0007\\u00e4\\u0002\\u0002\\u03aa\\u03ab\\u0007\\u20ae',\n  '\\u0002\\u0002\\u03ab\\u03ac\\u0007\\u0155\\u0002\\u0002\\u03ac\\u03b1\\u0003\\u0002',\n  '\\u0002\\u0002\\u03ad\\u03b0\\u0005\\u0109\\u0084\\u0002\\u03ae\\u03b0\\u000b\\u0002',\n  '\\u0002\\u0002\\u03af\\u03ad\\u0003\\u0002\\u0002\\u0002\\u03af\\u03ae\\u0003\\u0002',\n  '\\u0002\\u0002\\u03b0\\u03b3\\u0003\\u0002\\u0002\\u0002\\u03b1\\u03b2\\u0003\\u0002',\n  '\\u0002\\u0002\\u03b1\\u03af\\u0003\\u0002\\u0002\\u0002\\u03b2\\u03b4\\u0003\\u0002',\n  '\\u0002\\u0002\\u03b3\\u03b1\\u0003\\u0002\\u0002\\u0002\\u03b4\\u03b5\\u0007\\u00e4',\n  '\\u0002\\u0002\\u03b5\\u03b6\\u0007\\u20ae\\u0002\\u0002\\u03b6\\u03b7\\u0007\\u009f',\n  '\\u0002\\u0002\\u03b7\\u03b8\\u0003\\u0002\\u0002\\u0002\\u03b8\\u03b9\\b\\u0083',\n  '\\b\\u0002\\u03b9\\u0108\\u0003\\u0002\\u0002\\u0002\\u03ba\\u03bb\\u0007^\\u0002',\n  '\\u0002\\u03bb\\u03bc\\u0007\\u00e4\\u0002\\u0002\\u03bc\\u03bd\\u0007\\u20ae\\u0002',\n  '\\u0002\\u03bd\\u03be\\u0007\\u009f\\u0002\\u0002\\u03be\\u010a\\u0003\\u0002\\u0002',\n  '\\u0002\\u03bf\\u03c0\\u0007\\u00e4\\u0002\\u0002\\u03c0\\u03c1\\u0007\\u20ae\\u0002',\n  '\\u0002\\u03c1\\u03c2\\u0007\\u02de\\u0002\\u0002\\u03c2\\u03c7\\u0003\\u0002\\u0002',\n  '\\u0002\\u03c3\\u03c6\\u0005\\u010d\\u0086\\u0002\\u03c4\\u03c6\\u000b\\u0002\\u0002',\n  '\\u0002\\u03c5\\u03c3\\u0003\\u0002\\u0002\\u0002\\u03c5\\u03c4\\u0003\\u0002\\u0002',\n  '\\u0002\\u03c6\\u03c9\\u0003\\u0002\\u0002\\u0002\\u03c7\\u03c8\\u0003\\u0002\\u0002',\n  '\\u0002\\u03c7\\u03c5\\u0003\\u0002\\u0002\\u0002\\u03c8\\u03ca\\u0003\\u0002\\u0002',\n  '\\u0002\\u03c9\\u03c7\\u0003\\u0002\\u0002\\u0002\\u03ca\\u03cb\\u0007\\u00e4\\u0002',\n  '\\u0002\\u03cb\\u03cc\\u0007\\u20ae\\u0002\\u0002\\u03cc\\u03cd\\u0007\\u2124\\u0002',\n  '\\u0002\\u03cd\\u03ce\\u0003\\u0002\\u0002\\u0002\\u03ce\\u03cf\\b\\u0085\\b\\u0002',\n  '\\u03cf\\u010c\\u0003\\u0002\\u0002\\u0002\\u03d0\\u03d1\\u0007^\\u0002\\u0002',\n  '\\u03d1\\u03d2\\u0007\\u00e4\\u0002\\u0002\\u03d2\\u03d3\\u0007\\u20ae\\u0002\\u0002',\n  '\\u03d3\\u03d4\\u0007\\u2124\\u0002\\u0002\\u03d4\\u010e\\u0003\\u0002\\u0002\\u0002',\n  '\\u03d5\\u03d9\\t\\u0004\\u0002\\u0002\\u03d6\\u03d8\\t\\u0005\\u0002\\u0002\\u03d7',\n  '\\u03d6\\u0003\\u0002\\u0002\\u0002\\u03d8\\u03db\\u0003\\u0002\\u0002\\u0002\\u03d9',\n  '\\u03d7\\u0003\\u0002\\u0002\\u0002\\u03d9\\u03da\\u0003\\u0002\\u0002\\u0002\\u03da',\n  '\\u0110\\u0003\\u0002\\u0002\\u0002\\u03db\\u03d9\\u0003\\u0002\\u0002\\u0002\\u03dc',\n  '\\u03dd\\u0007B\\u0002\\u0002\\u03dd\\u0112\\u0003\\u0002\\u0002\\u0002\\u03de',\n  '\\u03e3\\u0007b\\u0002\\u0002\\u03df\\u03e2\\u0005\\u0115\\u008a\\u0002\\u03e0',\n  '\\u03e2\\u000b\\u0002\\u0002\\u0002\\u03e1\\u03df\\u0003\\u0002\\u0002\\u0002\\u03e1',\n  '\\u03e0\\u0003\\u0002\\u0002\\u0002\\u03e2\\u03e5\\u0003\\u0002\\u0002\\u0002\\u03e3',\n  '\\u03e4\\u0003\\u0002\\u0002\\u0002\\u03e3\\u03e1\\u0003\\u0002\\u0002\\u0002\\u03e4',\n  '\\u03e6\\u0003\\u0002\\u0002\\u0002\\u03e5\\u03e3\\u0003\\u0002\\u0002\\u0002\\u03e6',\n  '\\u03e7\\u0007b\\u0002\\u0002\\u03e7\\u0114\\u0003\\u0002\\u0002\\u0002\\u03e8',\n  '\\u03e9\\u0007^\\u0002\\u0002\\u03e9\\u03ea\\u0007b\\u0002\\u0002\\u03ea\\u0116',\n  '\\u0003\\u0002\\u0002\\u0002\\u03eb\\u03ec\\u0007^\\u0002\\u0002\\u03ec\\u03ed',\n  '\\u00071\\u0002\\u0002\\u03ed\\u0118\\u0003\\u0002\\u0002\\u0002\\u03ee\\u03f0',\n  '\\t\\u0002\\u0002\\u0002\\u03ef\\u03ee\\u0003\\u0002\\u0002\\u0002\\u03f0\\u03f1',\n  '\\u0003\\u0002\\u0002\\u0002\\u03f1\\u03ef\\u0003\\u0002\\u0002\\u0002\\u03f1\\u03f2',\n  '\\u0003\\u0002\\u0002\\u0002\\u03f2\\u03f3\\u0003\\u0002\\u0002\\u0002\\u03f3\\u03f4',\n  '\\b\\u008c\\t\\u0002\\u03f4\\u011a\\u0003\\u0002\\u0002\\u0002\\u03f5\\u03f9\\u0007',\n  '%\\u0002\\u0002\\u03f6\\u03f8\\n\\u0003\\u0002\\u0002\\u03f7\\u03f6\\u0003\\u0002',\n  '\\u0002\\u0002\\u03f8\\u03fb\\u0003\\u0002\\u0002\\u0002\\u03f9\\u03f7\\u0003\\u0002',\n  '\\u0002\\u0002\\u03f9\\u03fa\\u0003\\u0002\\u0002\\u0002\\u03fa\\u03fc\\u0003\\u0002',\n  '\\u0002\\u0002\\u03fb\\u03f9\\u0003\\u0002\\u0002\\u0002\\u03fc\\u03fd\\b\\u008d',\n  '\\u0003\\u0002\\u03fd\\u011c\\u0003\\u0002\\u0002\\u0002\\u03fe\\u03ff\\u0007~',\n  '\\u0002\\u0002\\u03ff\\u0400\\u0003\\u0002\\u0002\\u0002\\u0400\\u0401\\b\\u008e',\n  '\\n\\u0002\\u0401\\u0402\\b\\u008e\\b\\u0002\\u0402\\u011e\\u0003\\u0002\\u0002\\u0002',\n  '\\u0403\\u0404\\u0005\\u00e7s\\u0002\\u0404\\u0405\\u0005\\u00dfo\\u0002\\u0405',\n  '\\u0406\\u0005\\u00ebu\\u0002\\u0406\\u0407\\u0005\\u00e5r\\u0002\\u0407\\u0408',\n  '\\u0005\\u00c7c\\u0002\\u0408\\u0409\\u0005\\u00cbe\\u0002\\u0409\\u040a\\b\\u008f',\n  '\\u000b\\u0002\\u040a\\u040b\\u0003\\u0002\\u0002\\u0002\\u040b\\u040c\\b\\u008f',\n  '\\f\\u0002\\u040c\\u040d\\b\\u008f\\b\\u0002\\u040d\\u0120\\u0003\\u0002\\u0002\\u0002',\n  '\\u040e\\u040f\\u0005\\u00e1p\\u0002\\u040f\\u0410\\u0005\\u00c3a\\u0002\\u0410',\n  '\\u0411\\u0005\\u00e5r\\u0002\\u0411\\u0412\\u0005\\u00e7s\\u0002\\u0412\\u0413',\n  '\\u0005\\u00cbe\\u0002\\u0413\\u0414\\u0003\\u0002\\u0002\\u0002\\u0414\\u0415',\n  '\\b\\u0090\\r\\u0002\\u0415\\u0416\\b\\u0090\\b\\u0002\\u0416\\u0417\\b\\u0090\\u0004',\n  '\\u0002\\u0417\\u0122\\u0003\\u0002\\u0002\\u0002\\u0418\\u0419\\u0005\\u00e7s',\n  '\\u0002\\u0419\\u041a\\u0005\\u00cbe\\u0002\\u041a\\u041b\\u0005\\u00c3a\\u0002',\n  '\\u041b\\u041c\\u0005\\u00e5r\\u0002\\u041c\\u041d\\u0005\\u00c7c\\u0002\\u041d',\n  '\\u041e\\u0005\\u00d1h\\u0002\\u041e\\u0124\\u0003\\u0002\\u0002\\u0002\\u041f',\n  '\\u0420\\u0005\\u00cdf\\u0002\\u0420\\u0421\\u0005\\u00d3i\\u0002\\u0421\\u0422',\n  '\\u0005\\u00cbe\\u0002\\u0422\\u0423\\u0005\\u00d9l\\u0002\\u0423\\u0425\\u0005',\n  '\\u00c9d\\u0002\\u0424\\u0426\\u0005\\u00e7s\\u0002\\u0425\\u0424\\u0003\\u0002',\n  '\\u0002\\u0002\\u0425\\u0426\\u0003\\u0002\\u0002\\u0002\\u0426\\u0427\\u0003\\u0002',\n  '\\u0002\\u0002\\u0427\\u0428\\b\\u0092\\u000e\\u0002\\u0428\\u0429\\b\\u0092\\b\\u0002',\n  '\\u0429\\u0126\\u0003\\u0002\\u0002\\u0002\\u042a\\u042b\\u0005\\u00c9d\\u0002',\n  '\\u042b\\u042c\\u0005\\u00d3i\\u0002\\u042c\\u042d\\u0005\\u00e7s\\u0002\\u042d',\n  '\\u042e\\u0005\\u00e1p\\u0002\\u042e\\u042f\\u0005\\u00d9l\\u0002\\u042f\\u0430',\n  '\\u0005\\u00c3a\\u0002\\u0430\\u0431\\u0005\\u00f3y\\u0002\\u0431\\u0432\\u0003',\n  '\\u0002\\u0002\\u0002\\u0432\\u0433\\b\\u0093\\u000f\\u0002\\u0433\\u0434\\b\\u0093',\n  '\\b\\u0002\\u0434\\u0128\\u0003\\u0002\\u0002\\u0002\\u0435\\u0436\\u0005\\u00cd',\n  'f\\u0002\\u0436\\u0437\\u0005\\u00d3i\\u0002\\u0437\\u0438\\u0005\\u00d9l\\u0002',\n  '\\u0438\\u0439\\u0005\\u00e9t\\u0002\\u0439\\u043a\\u0005\\u00cbe\\u0002\\u043a',\n  '\\u043b\\u0005\\u00e5r\\u0002\\u043b\\u043c\\u0003\\u0002\\u0002\\u0002\\u043c',\n  '\\u043d\\b\\u0094\\u0010\\u0002\\u043d\\u043e\\b\\u0094\\b\\u0002\\u043e\\u012a\\u0003',\n  '\\u0002\\u0002\\u0002\\u043f\\u0440\\u0005\\u00e7s\\u0002\\u0440\\u0441\\u0005',\n  '\\u00e9t\\u0002\\u0441\\u0442\\u0005\\u00c3a\\u0002\\u0442\\u0444\\u0005\\u00e9',\n  't\\u0002\\u0443\\u0445\\u0005\\u00e7s\\u0002\\u0444\\u0443\\u0003\\u0002\\u0002',\n  '\\u0002\\u0444\\u0445\\u0003\\u0002\\u0002\\u0002\\u0445\\u0446\\u0003\\u0002\\u0002',\n  '\\u0002\\u0446\\u0447\\b\\u0095\\u0011\\u0002\\u0447\\u0448\\b\\u0095\\b\\u0002\\u0448',\n  '\\u012c\\u0003\\u0002\\u0002\\u0002\\u0449\\u044a\\u0005\\u00e7s\\u0002\\u044a',\n  '\\u044b\\u0005\\u00dfo\\u0002\\u044b\\u044c\\u0005\\u00e5r\\u0002\\u044c\\u044d',\n  '\\u0005\\u00e9t\\u0002\\u044d\\u044e\\u0003\\u0002\\u0002\\u0002\\u044e\\u044f',\n  '\\b\\u0096\\u0012\\u0002\\u044f\\u0450\\b\\u0096\\b\\u0002\\u0450\\u012e\\u0003\\u0002',\n  '\\u0002\\u0002\\u0451\\u0452\\u0005\\u00d9l\\u0002\\u0452\\u0453\\u0005\\u00d3',\n  'i\\u0002\\u0453\\u0454\\u0005\\u00dbm\\u0002\\u0454\\u0455\\u0005\\u00d3i\\u0002',\n  '\\u0455\\u0456\\u0005\\u00e9t\\u0002\\u0456\\u0457\\u0003\\u0002\\u0002\\u0002',\n  '\\u0457\\u0458\\b\\u0097\\u0013\\u0002\\u0458\\u0459\\b\\u0097\\b\\u0002\\u0459\\u0130',\n  '\\u0003\\u0002\\u0002\\u0002\\u045a\\u045b\\u0007*\\u0002\\u0002\\u045b\\u0132',\n  '\\u0003\\u0002\\u0002\\u0002\\u045c\\u045d\\u0007+\\u0002\\u0002\\u045d\\u0134',\n  '\\u0003\\u0002\\u0002\\u0002\\u045e\\u045f\\u0005\\u00c3a\\u0002\\u045f\\u0460',\n  '\\u0005\\u00ddn\\u0002\\u0460\\u0461\\u0005\\u00c9d\\u0002\\u0461\\u0136\\u0003',\n  '\\u0002\\u0002\\u0002\\u0462\\u0463\\u0005\\u00dfo\\u0002\\u0463\\u0464\\u0005',\n  '\\u00e5r\\u0002\\u0464\\u0138\\u0003\\u0002\\u0002\\u0002\\u0465\\u0466\\u0005',\n  '\\u00ddn\\u0002\\u0466\\u0467\\u0005\\u00dfo\\u0002\\u0467\\u0468\\u0005\\u00e9',\n  't\\u0002\\u0468\\u013a\\u0003\\u0002\\u0002\\u0002\\u0469\\u046e\\u0007$\\u0002',\n  '\\u0002\\u046a\\u046d\\u0005\\u013d\\u009e\\u0002\\u046b\\u046d\\u000b\\u0002\\u0002',\n  '\\u0002\\u046c\\u046a\\u0003\\u0002\\u0002\\u0002\\u046c\\u046b\\u0003\\u0002\\u0002',\n  '\\u0002\\u046d\\u0470\\u0003\\u0002\\u0002\\u0002\\u046e\\u046f\\u0003\\u0002\\u0002',\n  '\\u0002\\u046e\\u046c\\u0003\\u0002\\u0002\\u0002\\u046f\\u0471\\u0003\\u0002\\u0002',\n  '\\u0002\\u0470\\u046e\\u0003\\u0002\\u0002\\u0002\\u0471\\u0472\\u0007$\\u0002',\n  '\\u0002\\u0472\\u013c\\u0003\\u0002\\u0002\\u0002\\u0473\\u0474\\u0007^\\u0002',\n  '\\u0002\\u0474\\u0475\\u0007$\\u0002\\u0002\\u0475\\u013e\\u0003\\u0002\\u0002',\n  '\\u0002\\u0476\\u047b\\u0007)\\u0002\\u0002\\u0477\\u047a\\u0005\\u0141\\u00a0',\n  '\\u0002\\u0478\\u047a\\u000b\\u0002\\u0002\\u0002\\u0479\\u0477\\u0003\\u0002\\u0002',\n  '\\u0002\\u0479\\u0478\\u0003\\u0002\\u0002\\u0002\\u047a\\u047d\\u0003\\u0002\\u0002',\n  '\\u0002\\u047b\\u047c\\u0003\\u0002\\u0002\\u0002\\u047b\\u0479\\u0003\\u0002\\u0002',\n  '\\u0002\\u047c\\u047e\\u0003\\u0002\\u0002\\u0002\\u047d\\u047b\\u0003\\u0002\\u0002',\n  '\\u0002\\u047e\\u047f\\u0007)\\u0002\\u0002\\u047f\\u0140\\u0003\\u0002\\u0002',\n  '\\u0002\\u0480\\u0481\\u0007^\\u0002\\u0002\\u0481\\u0482\\u0007)\\u0002\\u0002',\n  '\\u0482\\u0142\\u0003\\u0002\\u0002\\u0002\\u0483\\u0484\\u0007\\u00e4\\u0002\\u0002',\n  '\\u0484\\u0485\\u0007\\u20ae\\u0002\\u0002\\u0485\\u0486\\u0007\\u0155\\u0002\\u0002',\n  '\\u0486\\u048b\\u0003\\u0002\\u0002\\u0002\\u0487\\u048a\\u0005\\u0145\\u00a2\\u0002',\n  '\\u0488\\u048a\\u000b\\u0002\\u0002\\u0002\\u0489\\u0487\\u0003\\u0002\\u0002\\u0002',\n  '\\u0489\\u0488\\u0003\\u0002\\u0002\\u0002\\u048a\\u048d\\u0003\\u0002\\u0002\\u0002',\n  '\\u048b\\u048c\\u0003\\u0002\\u0002\\u0002\\u048b\\u0489\\u0003\\u0002\\u0002\\u0002',\n  '\\u048c\\u048e\\u0003\\u0002\\u0002\\u0002\\u048d\\u048b\\u0003\\u0002\\u0002\\u0002',\n  '\\u048e\\u048f\\u0007\\u00e4\\u0002\\u0002\\u048f\\u0490\\u0007\\u20ae\\u0002\\u0002',\n  '\\u0490\\u0491\\u0007\\u009f\\u0002\\u0002\\u0491\\u0144\\u0003\\u0002\\u0002\\u0002',\n  '\\u0492\\u0493\\u0007^\\u0002\\u0002\\u0493\\u0494\\u0007\\u00e4\\u0002\\u0002',\n  '\\u0494\\u0495\\u0007\\u20ae\\u0002\\u0002\\u0495\\u0496\\u0007\\u009f\\u0002\\u0002',\n  '\\u0496\\u0146\\u0003\\u0002\\u0002\\u0002\\u0497\\u0498\\u0007\\u00e4\\u0002\\u0002',\n  '\\u0498\\u0499\\u0007\\u20ae\\u0002\\u0002\\u0499\\u049a\\u0007\\u02de\\u0002\\u0002',\n  '\\u049a\\u049f\\u0003\\u0002\\u0002\\u0002\\u049b\\u049e\\u0005\\u0149\\u00a4\\u0002',\n  '\\u049c\\u049e\\u000b\\u0002\\u0002\\u0002\\u049d\\u049b\\u0003\\u0002\\u0002\\u0002',\n  '\\u049d\\u049c\\u0003\\u0002\\u0002\\u0002\\u049e\\u04a1\\u0003\\u0002\\u0002\\u0002',\n  '\\u049f\\u04a0\\u0003\\u0002\\u0002\\u0002\\u049f\\u049d\\u0003\\u0002\\u0002\\u0002',\n  '\\u04a0\\u04a2\\u0003\\u0002\\u0002\\u0002\\u04a1\\u049f\\u0003\\u0002\\u0002\\u0002',\n  '\\u04a2\\u04a3\\u0007\\u00e4\\u0002\\u0002\\u04a3\\u04a4\\u0007\\u20ae\\u0002\\u0002',\n  '\\u04a4\\u04a5\\u0007\\u2124\\u0002\\u0002\\u04a5\\u0148\\u0003\\u0002\\u0002\\u0002',\n  '\\u04a6\\u04a7\\u0007^\\u0002\\u0002\\u04a7\\u04a8\\u0007\\u00e4\\u0002\\u0002',\n  '\\u04a8\\u04a9\\u0007\\u20ae\\u0002\\u0002\\u04a9\\u04aa\\u0007\\u2124\\u0002\\u0002',\n  '\\u04aa\\u014a\\u0003\\u0002\\u0002\\u0002\\u04ab\\u04ad\\n\"\\u0002\\u0002\\u04ac',\n  '\\u04ab\\u0003\\u0002\\u0002\\u0002\\u04ad\\u04ae\\u0003\\u0002\\u0002\\u0002\\u04ae',\n  '\\u04ac\\u0003\\u0002\\u0002\\u0002\\u04ae\\u04af\\u0003\\u0002\\u0002\\u0002\\u04af',\n  '\\u014c\\u0003\\u0002\\u0002\\u0002G\\u0002\\u0003\\u0004\\u0150\\u0158\\u018e',\n  '\\u01a4\\u0201\\u020f\\u0217\\u0220\\u0228\\u0231\\u0238\\u023f\\u0247\\u0250\\u0255',\n  '\\u025b\\u0263\\u026b\\u0275\\u027c\\u0283\\u0289\\u0293\\u0296\\u0299\\u029e\\u02a2',\n  '\\u02a9\\u02ab\\u02b6\\u02b8\\u02c6\\u02c8\\u02da\\u02dc\\u02eb\\u02ed\\u030c\\u0372',\n  '\\u037a\\u0382\\u0384\\u038e\\u0390\\u039d\\u039f\\u03af\\u03b1\\u03c5\\u03c7\\u03d9',\n  '\\u03e1\\u03e3\\u03f1\\u03f9\\u0425\\u0444\\u046c\\u046e\\u0479\\u047b\\u0489\\u048b',\n  '\\u049d\\u049f\\u04ae\\u0014\\u0002\\u0004\\u0002\\u0002\\u0005\\u0002\\u0007\\u0003',\n  '\\u0002\\u0007\\u0004\\u0002\\u0003N\\u0002\\tE\\u0002\\u0006\\u0002\\u0002\\u0002',\n  '\\u0003\\u0002\\tH\\u0002\\u0003\\u008f\\u0003\\t\\u0005\\u0002\\t\\n\\u0002\\t\\f',\n  '\\u0002\\t\\r\\u0002\\t\\u000e\\u0002\\t\\u000f\\u0002\\t\\u0010\\u0002\\t\\u0015\\u0002',\n].join('');\n\nvar atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);\n\nvar decisionsToDFA = atn.decisionToState.map(function(ds, index) {\n  return new antlr4.dfa.DFA(ds, index);\n});\n\nfunction ScrollQLLexer(input) {\n  antlr4.Lexer.call(this, input);\n  this._interp = new antlr4.atn.LexerATNSimulator(this, atn, decisionsToDFA, new antlr4.PredictionContextCache());\n\n  this.isFirstPipe = true;\n\n  return this;\n}\n\nScrollQLLexer.prototype = Object.create(antlr4.Lexer.prototype);\nScrollQLLexer.prototype.constructor = ScrollQLLexer;\n\nObject.defineProperty(ScrollQLLexer.prototype, 'atn', {\n  get: function() {\n    return atn;\n  },\n});\n\nScrollQLLexer.EOF = antlr4.Token.EOF;\nScrollQLLexer.WS = 1;\nScrollQLLexer.COMMENT = 2;\nScrollQLLexer.K_SOURCE = 3;\nScrollQLLexer.K_START = 4;\nScrollQLLexer.K_END = 5;\nScrollQLLexer.K_NOW = 6;\nScrollQLLexer.K_LIVE = 7;\nScrollQLLexer.K_PARSE = 8;\nScrollQLLexer.K_SEARCH = 9;\nScrollQLLexer.K_FIELDS = 10;\nScrollQLLexer.K_DISPLAY = 11;\nScrollQLLexer.K_FILTER = 12;\nScrollQLLexer.K_STATS = 13;\nScrollQLLexer.K_SORT = 14;\nScrollQLLexer.K_ORDER = 15;\nScrollQLLexer.K_ASC = 16;\nScrollQLLexer.K_DESC = 17;\nScrollQLLexer.K_HEAD = 18;\nScrollQLLexer.K_LIMIT = 19;\nScrollQLLexer.K_TAIL = 20;\nScrollQLLexer.K_REGEX = 21;\nScrollQLLexer.K_IN = 22;\nScrollQLLexer.K_GROUP = 23;\nScrollQLLexer.K_BY = 24;\nScrollQLLexer.K_AS = 25;\nScrollQLLexer.K_AND = 26;\nScrollQLLexer.K_OR = 27;\nScrollQLLexer.K_NOT = 28;\nScrollQLLexer.K_LIKE = 29;\nScrollQLLexer.K_MATCHES = 30;\nScrollQLLexer.K_TU_MS = 31;\nScrollQLLexer.K_TU_MSEC = 32;\nScrollQLLexer.K_TU_MSECOND = 33;\nScrollQLLexer.K_TU_S = 34;\nScrollQLLexer.K_TU_SEC = 35;\nScrollQLLexer.K_TU_SECOND = 36;\nScrollQLLexer.K_TU_M = 37;\nScrollQLLexer.K_TU_MIN = 38;\nScrollQLLexer.K_TU_MINUTE = 39;\nScrollQLLexer.K_TU_H = 40;\nScrollQLLexer.K_TU_HR = 41;\nScrollQLLexer.K_TU_HOUR = 42;\nScrollQLLexer.K_TU_D = 43;\nScrollQLLexer.K_TU_DAY = 44;\nScrollQLLexer.K_TU_W = 45;\nScrollQLLexer.K_TU_WEEK = 46;\nScrollQLLexer.K_TU_MO = 47;\nScrollQLLexer.K_TU_MON = 48;\nScrollQLLexer.K_TU_MONTH = 49;\nScrollQLLexer.K_TU_Q = 50;\nScrollQLLexer.K_TU_QTR = 51;\nScrollQLLexer.K_TU_QUARTER = 52;\nScrollQLLexer.K_TU_Y = 53;\nScrollQLLexer.K_TU_YR = 54;\nScrollQLLexer.K_TU_YEAR = 55;\nScrollQLLexer.RAW_ID = 56;\nScrollQLLexer.LIT_INTEGER = 57;\nScrollQLLexer.LIT_NUMBER = 58;\nScrollQLLexer.SDQUOTED_STRING = 59;\nScrollQLLexer.SSQUOTED_STRING = 60;\nScrollQLLexer.CDQUOTED_STRING = 61;\nScrollQLLexer.CSQUOTED_STRING = 62;\nScrollQLLexer.QUOTED_IDENT = 63;\nScrollQLLexer.SYM_EQTILDE = 64;\nScrollQLLexer.SYM_TILDEEQ = 65;\nScrollQLLexer.SYM_AT = 66;\nScrollQLLexer.SYM_COMMA = 67;\nScrollQLLexer.SYM_LPAREN = 68;\nScrollQLLexer.SYM_RPAREN = 69;\nScrollQLLexer.SYM_PIPE = 70;\nScrollQLLexer.SYM_WRITE = 71;\nScrollQLLexer.SYM_COLON = 72;\nScrollQLLexer.SYM_CARET = 73;\nScrollQLLexer.SYM_NOT = 74;\nScrollQLLexer.SYM_MUL = 75;\nScrollQLLexer.SYM_DIV = 76;\nScrollQLLexer.SYM_MOD = 77;\nScrollQLLexer.SYM_PLUS = 78;\nScrollQLLexer.SYM_MINUS = 79;\nScrollQLLexer.SYM_TILDE = 80;\nScrollQLLexer.SYM_LT = 81;\nScrollQLLexer.SYM_GT = 82;\nScrollQLLexer.SYM_LTEQ = 83;\nScrollQLLexer.SYM_GTEQ = 84;\nScrollQLLexer.SYM_EQ = 85;\nScrollQLLexer.SYM_NEQ = 86;\nScrollQLLexer.SYM_LBRACKET = 87;\nScrollQLLexer.SYM_RBRACKET = 88;\nScrollQLLexer.REGEX_WS = 89;\nScrollQLLexer.REGEX_COMMENT = 90;\nScrollQLLexer.REGEX = 91;\nScrollQLLexer.RE_SDQUOTED_STRING = 92;\nScrollQLLexer.RE_SSQUOTED_STRING = 93;\nScrollQLLexer.RE_CDQUOTED_STRING = 94;\nScrollQLLexer.RE_CSQUOTED_STRING = 95;\nScrollQLLexer.RE_RAW_ID = 96;\nScrollQLLexer.RE_SYM_AT = 97;\nScrollQLLexer.RE_QUOTED_IDENT = 98;\nScrollQLLexer.SE_WS = 99;\nScrollQLLexer.SE_COMMENT = 100;\nScrollQLLexer.SE_K_SEARCH = 101;\nScrollQLLexer.SE_SYM_LPAREN = 102;\nScrollQLLexer.SE_SYM_RPAREN = 103;\nScrollQLLexer.SE_K_AND = 104;\nScrollQLLexer.SE_K_OR = 105;\nScrollQLLexer.SE_K_NOT = 106;\nScrollQLLexer.SE_SDQUOTED_STRING = 107;\nScrollQLLexer.SE_SSQUOTED_STRING = 108;\nScrollQLLexer.SE_CDQUOTED_STRING = 109;\nScrollQLLexer.SE_CSQUOTED_STRING = 110;\nScrollQLLexer.SE_UNQUOTED_STRING = 111;\nScrollQLLexer.SE_PIPE = 112;\n\nScrollQLLexer.WHITESPACE = 2;\nScrollQLLexer.COMMENTS = 3;\n\nScrollQLLexer.REGEX_VALUE = 1;\nScrollQLLexer.SEARCH_VALUE = 2;\n\nScrollQLLexer.prototype.channelNames = ['DEFAULT_TOKEN_CHANNEL', 'HIDDEN', 'WHITESPACE', 'COMMENTS'];\n\nScrollQLLexer.prototype.modeNames = ['DEFAULT_MODE', 'REGEX_VALUE', 'SEARCH_VALUE'];\n\nScrollQLLexer.prototype.literalNames = [\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  \"'=~'\",\n  \"'~='\",\n  null,\n  null,\n  null,\n  null,\n  null,\n  \"'|>'\",\n  \"':'\",\n  \"'^'\",\n  \"'!'\",\n  \"'*'\",\n  \"'/'\",\n  \"'%'\",\n  \"'+'\",\n  \"'-'\",\n  \"'~'\",\n  \"'<'\",\n  \"'>'\",\n  \"'<='\",\n  \"'>='\",\n  \"'='\",\n  \"'!='\",\n  \"'['\",\n  \"']'\",\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  \"'|'\",\n];\n\nScrollQLLexer.prototype.symbolicNames = [\n  null,\n  'WS',\n  'COMMENT',\n  'K_SOURCE',\n  'K_START',\n  'K_END',\n  'K_NOW',\n  'K_LIVE',\n  'K_PARSE',\n  'K_SEARCH',\n  'K_FIELDS',\n  'K_DISPLAY',\n  'K_FILTER',\n  'K_STATS',\n  'K_SORT',\n  'K_ORDER',\n  'K_ASC',\n  'K_DESC',\n  'K_HEAD',\n  'K_LIMIT',\n  'K_TAIL',\n  'K_REGEX',\n  'K_IN',\n  'K_GROUP',\n  'K_BY',\n  'K_AS',\n  'K_AND',\n  'K_OR',\n  'K_NOT',\n  'K_LIKE',\n  'K_MATCHES',\n  'K_TU_MS',\n  'K_TU_MSEC',\n  'K_TU_MSECOND',\n  'K_TU_S',\n  'K_TU_SEC',\n  'K_TU_SECOND',\n  'K_TU_M',\n  'K_TU_MIN',\n  'K_TU_MINUTE',\n  'K_TU_H',\n  'K_TU_HR',\n  'K_TU_HOUR',\n  'K_TU_D',\n  'K_TU_DAY',\n  'K_TU_W',\n  'K_TU_WEEK',\n  'K_TU_MO',\n  'K_TU_MON',\n  'K_TU_MONTH',\n  'K_TU_Q',\n  'K_TU_QTR',\n  'K_TU_QUARTER',\n  'K_TU_Y',\n  'K_TU_YR',\n  'K_TU_YEAR',\n  'RAW_ID',\n  'LIT_INTEGER',\n  'LIT_NUMBER',\n  'SDQUOTED_STRING',\n  'SSQUOTED_STRING',\n  'CDQUOTED_STRING',\n  'CSQUOTED_STRING',\n  'QUOTED_IDENT',\n  'SYM_EQTILDE',\n  'SYM_TILDEEQ',\n  'SYM_AT',\n  'SYM_COMMA',\n  'SYM_LPAREN',\n  'SYM_RPAREN',\n  'SYM_PIPE',\n  'SYM_WRITE',\n  'SYM_COLON',\n  'SYM_CARET',\n  'SYM_NOT',\n  'SYM_MUL',\n  'SYM_DIV',\n  'SYM_MOD',\n  'SYM_PLUS',\n  'SYM_MINUS',\n  'SYM_TILDE',\n  'SYM_LT',\n  'SYM_GT',\n  'SYM_LTEQ',\n  'SYM_GTEQ',\n  'SYM_EQ',\n  'SYM_NEQ',\n  'SYM_LBRACKET',\n  'SYM_RBRACKET',\n  'REGEX_WS',\n  'REGEX_COMMENT',\n  'REGEX',\n  'RE_SDQUOTED_STRING',\n  'RE_SSQUOTED_STRING',\n  'RE_CDQUOTED_STRING',\n  'RE_CSQUOTED_STRING',\n  'RE_RAW_ID',\n  'RE_SYM_AT',\n  'RE_QUOTED_IDENT',\n  'SE_WS',\n  'SE_COMMENT',\n  'SE_K_SEARCH',\n  'SE_SYM_LPAREN',\n  'SE_SYM_RPAREN',\n  'SE_K_AND',\n  'SE_K_OR',\n  'SE_K_NOT',\n  'SE_SDQUOTED_STRING',\n  'SE_SSQUOTED_STRING',\n  'SE_CDQUOTED_STRING',\n  'SE_CSQUOTED_STRING',\n  'SE_UNQUOTED_STRING',\n  'SE_PIPE',\n];\n\nScrollQLLexer.prototype.ruleNames = [\n  'WS',\n  'COMMENT',\n  'K_SOURCE',\n  'K_START',\n  'K_END',\n  'K_NOW',\n  'K_LIVE',\n  'K_PARSE',\n  'K_SEARCH',\n  'K_FIELDS',\n  'K_DISPLAY',\n  'K_FILTER',\n  'K_STATS',\n  'K_SORT',\n  'K_ORDER',\n  'K_ASC',\n  'K_DESC',\n  'K_HEAD',\n  'K_LIMIT',\n  'K_TAIL',\n  'K_REGEX',\n  'K_IN',\n  'K_GROUP',\n  'K_BY',\n  'K_AS',\n  'K_AND',\n  'K_OR',\n  'K_NOT',\n  'K_LIKE',\n  'K_MATCHES',\n  'K_TU_MS',\n  'K_TU_MSEC',\n  'K_TU_MSECOND',\n  'K_TU_S',\n  'K_TU_SEC',\n  'K_TU_SECOND',\n  'K_TU_M',\n  'K_TU_MIN',\n  'K_TU_MINUTE',\n  'K_TU_H',\n  'K_TU_HR',\n  'K_TU_HOUR',\n  'K_TU_D',\n  'K_TU_DAY',\n  'K_TU_W',\n  'K_TU_WEEK',\n  'K_TU_MO',\n  'K_TU_MON',\n  'K_TU_MONTH',\n  'K_TU_Q',\n  'K_TU_QTR',\n  'K_TU_QUARTER',\n  'K_TU_Y',\n  'K_TU_YR',\n  'K_TU_YEAR',\n  'RAW_ID',\n  'LIT_INTEGER',\n  'LIT_NUMBER',\n  'INT',\n  'EXP',\n  'SDQUOTED_STRING',\n  'SDQ_ESC_STRING',\n  'SSQUOTED_STRING',\n  'SSQ_ESC_STRING',\n  'CDQUOTED_STRING',\n  'CDQ_ESC_STRING',\n  'CSQUOTED_STRING',\n  'CSQ_ESC_STRING',\n  'QUOTED_IDENT',\n  'ESC_IDENT',\n  'SYM_EQTILDE',\n  'SYM_TILDEEQ',\n  'SYM_AT',\n  'SYM_COMMA',\n  'SYM_LPAREN',\n  'SYM_RPAREN',\n  'SYM_PIPE',\n  'SYM_WRITE',\n  'SYM_COLON',\n  'SYM_CARET',\n  'SYM_NOT',\n  'SYM_MUL',\n  'SYM_DIV',\n  'SYM_MOD',\n  'SYM_PLUS',\n  'SYM_MINUS',\n  'SYM_TILDE',\n  'SYM_LT',\n  'SYM_GT',\n  'SYM_LTEQ',\n  'SYM_GTEQ',\n  'SYM_EQ',\n  'SYM_NEQ',\n  'SYM_LBRACKET',\n  'SYM_RBRACKET',\n  'A',\n  'B',\n  'C',\n  'D',\n  'E',\n  'F',\n  'G',\n  'H',\n  'I',\n  'J',\n  'K',\n  'L',\n  'M',\n  'N',\n  'O',\n  'P',\n  'Q',\n  'R',\n  'S',\n  'T',\n  'U',\n  'V',\n  'W',\n  'X',\n  'Y',\n  'Z',\n  'RE_UNRECOGNIZED',\n  'REGEX_WS',\n  'REGEX_COMMENT',\n  'REGEX',\n  'RE_SDQUOTED_STRING',\n  'RE_SDQ_ESC_STRING',\n  'RE_SSQUOTED_STRING',\n  'RE_SSQ_ESC_STRING',\n  'RE_CDQUOTED_STRING',\n  'RE_CDQ_ESC_STRING',\n  'RE_CSQUOTED_STRING',\n  'RE_CSQ_ESC_STRING',\n  'RE_RAW_ID',\n  'RE_SYM_AT',\n  'RE_QUOTED_IDENT',\n  'RE_ESC_IDENT',\n  'RE_ESC_REGEX',\n  'SE_WS',\n  'SE_COMMENT',\n  'SE_PIPE',\n  'SE_K_SOURCE',\n  'SE_K_PARSE',\n  'SE_K_SEARCH',\n  'SE_K_FIELDS',\n  'SE_K_DISPLAY',\n  'SE_K_FILTER',\n  'SE_K_STATS',\n  'SE_K_SORT',\n  'SE_K_LIMIT',\n  'SE_SYM_LPAREN',\n  'SE_SYM_RPAREN',\n  'SE_K_AND',\n  'SE_K_OR',\n  'SE_K_NOT',\n  'SE_SDQUOTED_STRING',\n  'SE_SDQ_ESC_STRING',\n  'SE_SSQUOTED_STRING',\n  'SE_SSQ_ESC_STRING',\n  'SE_CDQUOTED_STRING',\n  'SE_CDQ_ESC_STRING',\n  'SE_CSQUOTED_STRING',\n  'SE_CSQ_ESC_STRING',\n  'SE_UNQUOTED_STRING',\n];\n\nScrollQLLexer.prototype.grammarFileName = 'ScrollQLLexer.g4';\n\nScrollQLLexer.prototype.action = function(localctx, ruleIndex, actionIndex) {\n  switch (ruleIndex) {\n    case 76:\n      this.SYM_PIPE_action(localctx, actionIndex);\n      break;\n    case 141:\n      this.SE_K_SOURCE_action(localctx, actionIndex);\n      break;\n    default:\n      throw 'No registered action for:' + ruleIndex;\n  }\n};\n\nScrollQLLexer.prototype.SYM_PIPE_action = function(localctx, actionIndex) {\n  switch (actionIndex) {\n    case 0:\n      this.isFirstPipe = false;\n      this.pushMode(ScrollQLLexer.SEARCH_VALUE);\n      break;\n    default:\n      throw 'No registered action for:' + actionIndex;\n  }\n};\n\nScrollQLLexer.prototype.SE_K_SOURCE_action = function(localctx, actionIndex) {\n  switch (actionIndex) {\n    case 1:\n      this.isFirstPipe = true;\n      break;\n    default:\n      throw 'No registered action for:' + actionIndex;\n  }\n};\nScrollQLLexer.prototype.sempred = function(localctx, ruleIndex, predIndex) {\n  switch (ruleIndex) {\n    case 76:\n      return this.SYM_PIPE_sempred(localctx, predIndex);\n    default:\n      throw 'No registered predicate for:' + ruleIndex;\n  }\n};\n\nScrollQLLexer.prototype.SYM_PIPE_sempred = function(localctx, predIndex) {\n  switch (predIndex) {\n    case 0:\n      return this.isFirstPipe;\n    case 1:\n      return !this.isFirstPipe;\n    default:\n      throw 'No predicate with index:' + predIndex;\n  }\n};\n\nexports.ScrollQLLexer = ScrollQLLexer;\n","export enum OrgRole {\n  Viewer = 'Viewer',\n  Editor = 'Editor',\n  Admin = 'Admin',\n}\n\nexport interface DashboardAclDTO {\n  id?: number;\n  dashboardId?: number;\n  userId?: number;\n  userLogin?: string;\n  userEmail?: string;\n  teamId?: number;\n  team?: string;\n  permission?: PermissionLevel;\n  role?: OrgRole;\n  icon?: string;\n  inherited?: boolean;\n}\n\nexport interface DashboardAclUpdateDTO {\n  userId: number;\n  teamId: number;\n  role: OrgRole;\n  permission: PermissionLevel;\n}\n\nexport interface DashboardAcl {\n  id?: number;\n  dashboardId?: number;\n  userId?: number;\n  userLogin?: string;\n  userEmail?: string;\n  teamId?: number;\n  team?: string;\n  permission?: PermissionLevel;\n  role?: OrgRole;\n  icon?: string;\n  name?: string;\n  inherited?: boolean;\n  sortRank?: number;\n  userAvatarUrl?: string;\n  teamAvatarUrl?: string;\n}\n\nexport interface DashboardPermissionInfo {\n  value: PermissionLevel;\n  label: string;\n  description: string;\n}\n\nexport interface NewDashboardAclItem {\n  teamId: number;\n  userId: number;\n  role?: OrgRole;\n  permission: PermissionLevel;\n  type: AclTarget;\n}\n\nexport enum PermissionLevel {\n  View = 1,\n  Edit = 2,\n  Admin = 4,\n}\n\nexport enum DataSourcePermissionLevel {\n  Query = 1,\n  Admin = 2,\n}\n\nexport enum AclTarget {\n  Team = 'Team',\n  User = 'User',\n  Viewer = 'Viewer',\n  Editor = 'Editor',\n}\n\nexport interface AclTargetInfo {\n  value: AclTarget;\n  text: string;\n}\n\nexport const dataSourceAclLevels = [\n  { value: DataSourcePermissionLevel.Query, label: 'Query', description: 'Can query data source.' },\n];\n\nexport const dashboardAclTargets: AclTargetInfo[] = [\n  { value: AclTarget.Team, text: 'Team' },\n  { value: AclTarget.User, text: 'User' },\n  { value: AclTarget.Viewer, text: 'Everyone With Viewer Role' },\n  { value: AclTarget.Editor, text: 'Everyone With Editor Role' },\n];\n\nexport const dashboardPermissionLevels: DashboardPermissionInfo[] = [\n  { value: PermissionLevel.View, label: 'View', description: 'Can view dashboards.' },\n  { value: PermissionLevel.Edit, label: 'Edit', description: 'Can add, edit and delete dashboards.' },\n  {\n    value: PermissionLevel.Admin,\n    label: 'Admin',\n    description: 'Can add/remove permissions and can add, edit and delete dashboards.',\n  },\n];\n\nexport enum TeamPermissionLevel {\n  Member = 0,\n  Admin = 4,\n}\n\nexport interface TeamPermissionInfo {\n  value: TeamPermissionLevel;\n  label: string;\n  description: string;\n}\n\nexport const teamsPermissionLevels: TeamPermissionInfo[] = [\n  { value: TeamPermissionLevel.Member, label: 'Member', description: 'Is team member' },\n  {\n    value: TeamPermissionLevel.Admin,\n    label: 'Admin',\n    description: 'Can add/remove permissions, members and delete team.',\n  },\n];\n","var path = 'public/app/plugins/datasource/grafana-azure-monitor-datasource/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl can-collapse=false has-text-edit-mode=\\\"ctrl.target.queryType === 'Application Insights'\\\">\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword width-9\\\">Service</label>\\n      <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n        <select class=\\\"gf-form-input service-dropdown\\\" ng-model=ctrl.target.queryType ng-options=\\\"f as f for f in ['Application Insights', 'Azure Monitor', 'Azure Log Analytics']\\\" ng-change=ctrl.onQueryTypeChange()></select>\\n      </div>\\n    </div>\\n    <div class=gf-form ng-if=\\\"ctrl.target.queryType === 'Azure Monitor' || ctrl.target.queryType === 'Azure Log Analytics'\\\">\\n      <label class=\\\"gf-form-label query-keyword width-9\\\">Subscription</label>\\n      <gf-form-dropdown model=ctrl.target.subscription allow-custom=true lookup-text=true get-options=ctrl.getSubscriptions() on-change=ctrl.onSubscriptionChange() css-class=min-width-12>\\n      </gf-form-dropdown>\\n    </div>\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n    </div>\\n  </div>\\n  <div ng-if=\\\"ctrl.target.queryType === 'Azure Monitor'\\\">\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Resource Group</label>\\n        <gf-form-dropdown model=ctrl.target.azureMonitor.resourceGroup allow-custom=true lookup-text=true get-options=ctrl.getResourceGroups($query) on-change=ctrl.onResourceGroupChange() css-class=min-width-12>\\n        </gf-form-dropdown>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Namespace</label>\\n        <gf-form-dropdown model=ctrl.target.azureMonitor.metricDefinition allow-custom=true lookup-text=true get-options=ctrl.getMetricDefinitions($query) on-change=ctrl.onMetricDefinitionChange() css-class=min-width-20>\\n        </gf-form-dropdown>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Resource Name</label>\\n        <gf-form-dropdown model=ctrl.target.azureMonitor.resourceName allow-custom=true lookup-text=true get-options=ctrl.getResourceNames($query) on-change=ctrl.onResourceNameChange() css-class=min-width-12>\\n        </gf-form-dropdown>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Metric Namespace</label>\\n        <gf-form-dropdown model=ctrl.target.azureMonitor.metricNamespace allow-custom=true lookup-text=true get-options=ctrl.getMetricNamespaces($query) on-change=ctrl.onMetricNamespacesChange() css-class=min-width-12>\\n        </gf-form-dropdown>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Metric</label>\\n        <gf-form-dropdown model=ctrl.target.azureMonitor.metricName allow-custom=true lookup-text=true get-options=ctrl.getMetricNames($query) on-change=ctrl.onMetricNameChange() css-class=min-width-12>\\n        </gf-form-dropdown>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow aggregation-dropdown-wrapper\\\">\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Aggregation</label>\\n        <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n          <select class=\\\"gf-form-input width-11\\\" ng-model=ctrl.target.azureMonitor.aggregation ng-options=\\\"f as f for f in ctrl.target.azureMonitor.aggOptions\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Time Grain</label>\\n        <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent timegrainunit-dropdown-wrapper\\\">\\n          <select class=gf-form-input ng-model=ctrl.target.azureMonitor.timeGrain ng-options=\\\"f.value as f.text for f in ctrl.target.azureMonitor.timeGrains\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=gf-form ng-show=\\\"ctrl.target.azureMonitor.timeGrain.trim() === 'auto'\\\">\\n        <label class=gf-form-label>Auto Interval</label>\\n        <label class=gf-form-label>{{ctrl.getAzureMonitorAutoInterval()}}</label>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n    <div class=gf-form-inline ng-show=\\\"ctrl.target.azureMonitor.dimensions.length > 0\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Dimension</label>\\n        <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n          <select class=\\\"gf-form-input min-width-12\\\" ng-model=ctrl.target.azureMonitor.dimension ng-options=\\\"f.value as f.text for f in ctrl.target.azureMonitor.dimensions\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-3\\\">eq</label>\\n        <input type=text class=\\\"gf-form-input width-17\\\" ng-model=ctrl.target.azureMonitor.dimensionFilter spellcheck=false placeholder=auto ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Top</label>\\n        <input type=text class=\\\"gf-form-input width-3\\\" ng-model=ctrl.target.azureMonitor.top spellcheck=false placeholder=10 ng-blur=ctrl.refresh() />\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Legend Format</label>\\n        <input type=text class=\\\"gf-form-input width-30\\\" ng-model=ctrl.target.azureMonitor.alias spellcheck=false placeholder=\\\"alias patterns (see help for more info)\\\" ng-blur=ctrl.refresh() />\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"ctrl.target.queryType === 'Azure Log Analytics'\\\">\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Workspace</label>\\n        <gf-form-dropdown model=ctrl.target.azureLogAnalytics.workspace allow-custom=true lookup-text=true get-options=ctrl.getWorkspaces() on-change=ctrl.refresh() css-class=min-width-12>\\n        </gf-form-dropdown>\\n        <div class=gf-form>\\n          <div class=width-1></div>\\n        </div>\\n        <div class=gf-form>\\n          <button class=\\\"btn btn-primary width-10\\\" ng-click=ctrl.refresh()>Run</button>\\n        </div>\\n        <div class=gf-form>\\n          <label class=gf-form-label>(Run Query: Shift+Enter, Trigger Suggestion: Ctrl+Space)</label>\\n        </div>\\n        <div class=\\\"gf-form gf-form--grow\\\">\\n          <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <kusto-editor class=\\\"gf-form gf-form--grow\\\" query=ctrl.target.azureLogAnalytics.query change=ctrl.onLogAnalyticsQueryChange execute=ctrl.onLogAnalyticsQueryExecute variables=ctrl.templateVariables getschema=ctrl.getAzureLogAnalyticsSchema />\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">Format As</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.target.azureLogAnalytics.resultFormat ng-options=\\\"f.value as f.text for f in ctrl.resultFormats\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n          Show Help\\n          <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n          <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n        </label>\\n      </div>\\n      <div class=gf-form ng-show=ctrl.lastQuery>\\n        <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showLastQuery = !ctrl.showLastQuery\\\">\\n          Raw Query\\n          <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showLastQuery></icon>\\n          <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showLastQuery></icon>\\n        </label>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form ng-show=ctrl.showLastQuery>\\n      <pre class=gf-form-pre>{{ctrl.lastQuery}}</pre>\\n    </div>\\n    <div class=gf-form ng-show=ctrl.showHelp>\\n      <pre class=\\\"gf-form-pre alert alert-info\\\">\\n    Format as Table:\\n    - return any set of columns\\n\\n    Format as Time series:\\n    - Requires a column of type datetime\\n    - returns the first column with a numeric datatype as the value\\n    - (Optional: returns the first column with type string to represent the series name. If no column is found the column name of the value column is used as series name)\\n\\n    Example Time Series Query:\\n\\n    AzureActivity\\n    | where $__timeFilter()\\n    | summarize count() by Category, bin(TimeGenerated, 60min)\\n    | order by TimeGenerated asc\\n\\n    Macros:\\n    - $__timeFilter() -&gt; TimeGenerated &ge; datetime(2018-06-05T18:09:58.907Z) and TimeGenerated &le; datetime(2018-06-05T20:09:58.907Z)\\n    - $__timeFilter(datetimeColumn) -&gt;  datetimeColumn  &ge; datetime(2018-06-05T18:09:58.907Z) and datetimeColumn &le; datetime(2018-06-05T20:09:58.907Z)\\n    - $__escapeMulti($myTemplateVar) -&gt; $myTemplateVar should be a multi-value template variables that contains illegal characters\\n    - $__contains(aColumn, $myTemplateVar) -&gt; aColumn in ($myTemplateVar)\\n      If using the All option, then check the Include All Option checkbox and in the Custom all value field type in: all. If All is chosen -&gt; 1 == 1\\n\\n    Or build your own conditionals using these built-in variables which just return the values:\\n    - $__timeFrom -&gt;  datetime(2018-06-05T18:09:58.907Z)\\n    - $__timeTo -&gt; datetime(2018-06-05T20:09:58.907Z)\\n    - $__interval -&gt; 5m\\n\\n    Examples:\\n    - ¡ where $__timeFilter\\n    - | where TimeGenerated &ge; $__timeFrom and TimeGenerated &le; $__timeTo\\n    - | summarize count() by Category, bin(TimeGenerated, $__interval)\\n      </pre>\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"ctrl.target.queryType === 'Application Insights'\\\">\\n    <div ng-show=!ctrl.target.appInsights.rawQuery>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Metric</label>\\n          <gf-form-dropdown model=ctrl.target.appInsights.metricName allow-custom=true lookup-text=true get-options=ctrl.getAppInsightsMetricNames($query) on-change=ctrl.onAppInsightsMetricNameChange() css-class=min-width-20>\\n          </gf-form-dropdown>\\n        </div>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Aggregation</label>\\n          <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n            <select class=gf-form-input ng-model=ctrl.target.appInsights.aggregation ng-options=\\\"f as f for f in ctrl.target.appInsights.aggOptions\\\" ng-change=ctrl.refresh()></select>\\n          </div>\\n        </div>\\n        <div class=\\\"gf-form gf-form--grow\\\">\\n          <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n        </div>\\n      </div>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Group By</label>\\n          <gf-form-dropdown allow-custom=true ng-hide=\\\"ctrl.target.appInsights.dimension !== 'none'\\\" model=ctrl.target.appInsights.dimension lookup-text=true get-options=ctrl.getAppInsightsGroupBySegments($query) on-change=ctrl.refresh() css-class=min-width-20>\\n          </gf-form-dropdown>\\n          <label class=\\\"gf-form-label min-width-20 pointer\\\" ng-hide=\\\"ctrl.target.appInsights.dimension === 'none'\\\" ng-click=ctrl.resetAppInsightsGroupBy()>{{ctrl.target.appInsights.dimension}}\\n            <icon name=\\\"'times'\\\"></icon>\\n          </label>\\n        </div>\\n        <div class=gf-form-inline>\\n          <div class=gf-form>\\n            <label class=\\\"gf-form-label query-keyword width-9\\\">Filter</label>\\n            <input type=text class=\\\"gf-form-input width-17\\\" ng-model=ctrl.target.appInsights.dimensionFilter spellcheck=false placeholder=\\\"your/groupby eq 'a_value'\\\" ng-blur=ctrl.refresh() />\\n          </div>\\n        </div>\\n        <div class=\\\"gf-form gf-form--grow\\\">\\n          <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n        </div>\\n      </div>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Time Grain</label>\\n          <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n            <select class=gf-form-input ng-model=ctrl.target.appInsights.timeGrainType ng-options=\\\"f as f for f in ['auto', 'none', 'specific']\\\" ng-change=ctrl.updateTimeGrainType()></select>\\n          </div>\\n        </div>\\n        <div class=gf-form ng-hide=\\\"ctrl.target.appInsights.timeGrainType === 'auto' || ctrl.target.appInsights.timeGrainType === 'none'\\\">\\n          <input type=text class=\\\"gf-form-input width-3\\\" ng-model=ctrl.target.appInsights.timeGrainCount spellcheck=false placeholder=\\\"\\\" ng-blur=ctrl.updateAppInsightsTimeGrain() />\\n        </div>\\n        <div class=gf-form ng-hide=\\\"ctrl.target.appInsights.timeGrainType === 'auto' || ctrl.target.appInsights.timeGrainType === 'none'\\\">\\n          <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent timegrainunit-dropdown-wrapper\\\">\\n            <select class=gf-form-input ng-model=ctrl.target.appInsights.timeGrainUnit ng-options=\\\"f as f for f in ['minute', 'hour', 'day', 'month', 'year']\\\" ng-change=ctrl.updateAppInsightsTimeGrain()></select>\\n          </div>\\n        </div>\\n        <div class=gf-form ng-hide=\\\"ctrl.target.appInsights.timeGrainType !== 'auto'\\\">\\n          <label class=gf-form-label>Auto Interval</label>\\n          <label class=gf-form-label>{{ctrl.getAppInsightsAutoInterval()}}</label>\\n        </div>\\n        <div class=\\\"gf-form gf-form--grow\\\">\\n          <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n        </div>\\n      </div>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Legend Format</label>\\n          <input type=text class=\\\"gf-form-input width-30\\\" ng-model=ctrl.target.appInsights.alias spellcheck=false placeholder=\\\"alias patterns (see help for more info)\\\" ng-blur=ctrl.refresh() />\\n        </div>\\n      </div>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n    <div ng-show=ctrl.target.appInsights.rawQuery>\\n      <!-- <div class=\\\"gf-form\\\">\\n        <textarea rows=\\\"3\\\" class=\\\"gf-form-input\\\" ng-model=\\\"ctrl.target.appInsights.rawQueryString\\\" spellcheck=\\\"false\\\"\\n          placeholder=\\\"Application Insights Query\\\" ng-model-onblur ng-change=\\\"ctrl.refresh()\\\"></textarea>\\n      </div> -->\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <kusto-editor class=\\\"gf-form gf-form--grow\\\" query=ctrl.target.appInsights.rawQueryString placeholder=\\\"'Application Insights Query'\\\" change=ctrl.onAppInsightsQueryChange execute=ctrl.onAppInsightsQueryExecute variables=ctrl.templateVariables getschema=ctrl.getAppInsightsQuerySchema />\\n      </div>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">X-axis</label>\\n          <gf-form-dropdown model=ctrl.target.appInsights.timeColumn allow-custom=true placeholder=\\\"eg. 'timestamp'\\\" get-options=ctrl.getAppInsightsColumns($query) on-change=ctrl.onAppInsightsColumnChange() css-class=min-width-20>\\n          </gf-form-dropdown>\\n        </div>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Y-axis</label>\\n          <gf-form-dropdown model=ctrl.target.appInsights.valueColumn allow-custom=true get-options=ctrl.getAppInsightsColumns($query) on-change=ctrl.onAppInsightsColumnChange() css-class=min-width-20>\\n          </gf-form-dropdown>\\n        </div>\\n        <div class=\\\"gf-form gf-form--grow\\\">\\n          <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n        </div>\\n      </div>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label query-keyword width-9\\\">Split On</label>\\n          <gf-form-dropdown model=ctrl.target.appInsights.segmentColumn allow-custom=true get-options=ctrl.getAppInsightsColumns($query) on-change=ctrl.onAppInsightsColumnChange() css-class=min-width-20>\\n          </gf-form-dropdown>\\n        </div>\\n        <div class=\\\"gf-form gf-form--grow\\\">\\n          <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n  <div class=gf-form ng-show=ctrl.lastQueryError>\\n    <pre class=\\\"gf-form-pre alert alert-error\\\">{{ctrl.lastQueryError}}</pre>\\n  </div>\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { selectThemeVariant, ThemeContext } from '../../index';\nimport { GrafanaTheme, VariableSuggestion } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport _ from 'lodash';\nimport React, { useRef, useContext, useMemo } from 'react';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport { List } from '../index';\nimport tinycolor from 'tinycolor2';\nimport { stylesFactory } from '../../themes';\n\ninterface DataLinkSuggestionsProps {\n  suggestions: VariableSuggestion[];\n  activeIndex: number;\n  onSuggestionSelect: (suggestion: VariableSuggestion) => void;\n  onClose?: () => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const wrapperBg = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.dark2,\n    },\n    theme.type\n  );\n\n  const wrapperShadow = selectThemeVariant(\n    {\n      light: theme.palette.gray5,\n      dark: theme.palette.black,\n    },\n    theme.type\n  );\n\n  const itemColor = selectThemeVariant(\n    {\n      light: theme.palette.black,\n      dark: theme.palette.white,\n    },\n    theme.type\n  );\n\n  const itemDocsColor = selectThemeVariant(\n    {\n      light: theme.palette.dark3,\n      dark: theme.palette.gray2,\n    },\n    theme.type\n  );\n\n  const itemBgHover = selectThemeVariant(\n    {\n      light: theme.palette.gray5,\n      dark: theme.palette.dark7,\n    },\n    theme.type\n  );\n\n  const itemBgActive = selectThemeVariant(\n    {\n      light: theme.palette.gray6,\n      dark: theme.palette.dark9,\n    },\n    theme.type\n  );\n\n  const separatorColor = selectThemeVariant(\n    {\n      light: tinycolor(wrapperBg.toString())\n        .darken(10)\n        .toString(),\n      dark: tinycolor(wrapperBg.toString())\n        .lighten(10)\n        .toString(),\n    },\n    theme.type\n  );\n\n  return {\n    list: css`\n      border-bottom: 1px solid ${separatorColor};\n      &:last-child {\n        border: none;\n      }\n    `,\n    wrapper: css`\n      background: ${wrapperBg};\n      z-index: 1;\n      width: 250px;\n      box-shadow: 0 5px 10px 0 ${wrapperShadow};\n    `,\n    item: css`\n      background: none;\n      padding: 2px 8px;\n      color: ${itemColor};\n      cursor: pointer;\n      &:hover {\n        background: ${itemBgHover};\n      }\n    `,\n    label: css`\n      color: ${theme.colors.textWeak};\n    `,\n    activeItem: css`\n      background: ${itemBgActive};\n      &:hover {\n        background: ${itemBgActive};\n      }\n    `,\n    itemValue: css`\n      font-family: ${theme.typography.fontFamily.monospace};\n      font-size: ${theme.typography.size.sm};\n    `,\n    itemDocs: css`\n      margin-top: ${theme.spacing.xs};\n      color: ${itemDocsColor};\n    `,\n  };\n});\n\nexport const DataLinkSuggestions: React.FC<DataLinkSuggestionsProps> = ({ suggestions, ...otherProps }) => {\n  const ref = useRef(null);\n  const theme = useContext(ThemeContext);\n  useClickAway(ref, () => {\n    if (otherProps.onClose) {\n      otherProps.onClose();\n    }\n  });\n\n  const groupedSuggestions = useMemo(() => {\n    return _.groupBy(suggestions, s => s.origin);\n  }, [suggestions]);\n\n  const styles = getStyles(theme);\n  return (\n    <div ref={ref} className={styles.wrapper}>\n      {Object.keys(groupedSuggestions).map((key, i) => {\n        const indexOffset =\n          i === 0\n            ? 0\n            : Object.keys(groupedSuggestions).reduce((acc, current, index) => {\n                if (index >= i) {\n                  return acc;\n                }\n                return acc + groupedSuggestions[current].length;\n              }, 0);\n\n        return (\n          <DataLinkSuggestionsList\n            {...otherProps}\n            suggestions={groupedSuggestions[key]}\n            label={`${_.capitalize(key)}`}\n            activeIndex={otherProps.activeIndex}\n            activeIndexOffset={indexOffset}\n            key={key}\n          />\n        );\n      })}\n    </div>\n  );\n};\n\nDataLinkSuggestions.displayName = 'DataLinkSuggestions';\n\ninterface DataLinkSuggestionsListProps extends DataLinkSuggestionsProps {\n  label: string;\n  activeIndexOffset: number;\n}\n\nconst DataLinkSuggestionsList: React.FC<DataLinkSuggestionsListProps> = React.memo(\n  ({ activeIndex, activeIndexOffset, label, onClose, onSuggestionSelect, suggestions }) => {\n    const theme = useContext(ThemeContext);\n    const styles = getStyles(theme);\n\n    return (\n      <>\n        <List\n          className={styles.list}\n          items={suggestions}\n          renderItem={(item, index) => {\n            return (\n              <div\n                className={cx(styles.item, index + activeIndexOffset === activeIndex && styles.activeItem)}\n                onClick={() => {\n                  onSuggestionSelect(item);\n                }}\n                title={item.documentation}\n              >\n                <span className={styles.itemValue}>\n                  <span className={styles.label}>{label}</span> {item.label}\n                </span>\n              </div>\n            );\n          }}\n        />\n      </>\n    );\n  }\n);\n\nDataLinkSuggestionsList.displayName = 'DataLinkSuggestionsList';\n","export class SelectionReference {\n  getBoundingClientRect() {\n    const selection = window.getSelection();\n    const node = selection && selection.anchorNode;\n\n    if (node && node.parentElement) {\n      const rect = node.parentElement.getBoundingClientRect();\n      return rect;\n    }\n\n    return {\n      top: 0,\n      left: 0,\n      bottom: 0,\n      right: 0,\n      width: 0,\n      height: 0,\n    };\n  }\n\n  get clientWidth() {\n    return this.getBoundingClientRect().width;\n  }\n\n  get clientHeight() {\n    return this.getBoundingClientRect().height;\n  }\n}\n","import React, { useState, useMemo, useContext, useRef, RefObject, memo, useEffect } from 'react';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport { DataLinkSuggestions } from './DataLinkSuggestions';\nimport { ThemeContext, makeValue } from '../../index';\nimport { SelectionReference } from './SelectionReference';\nimport { Portal, getFormStyles } from '../index';\n\n// @ts-ignore\nimport Prism from 'prismjs';\nimport { Editor } from '@grafana/slate-react';\nimport { Value } from 'slate';\nimport Plain from 'slate-plain-serializer';\nimport { Popper as ReactPopper } from 'react-popper';\nimport { css, cx } from 'emotion';\n\nimport { SlatePrism } from '../../slate-plugins';\nimport { SCHEMA } from '../../utils/slate';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme, VariableSuggestion, VariableOrigin, DataLinkBuiltInVars } from '@grafana/data';\n\nconst modulo = (a: number, n: number) => a - n * Math.floor(a / n);\n\ninterface DataLinkInputProps {\n  value: string;\n  onChange: (url: string, callback?: () => void) => void;\n  suggestions: VariableSuggestion[];\n  placeholder?: string;\n}\n\nconst plugins = [\n  SlatePrism({\n    onlyIn: (node: any) => node.type === 'code_block',\n    getSyntax: () => 'links',\n  }),\n];\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  input: getFormStyles(theme, { variant: 'primary', size: 'md', invalid: false }).input.input,\n  editor: css`\n    .token.builtInVariable {\n      color: ${theme.palette.queryGreen};\n    }\n    .token.variable {\n      color: ${theme.colors.textBlue};\n    }\n  `,\n  // Wrapper with child selector needed.\n  // When classnames are appplied to the same element as the wrapper, it causes the suggestions to stop working\n  wrapperOverrides: css`\n    width: 100%;\n    > .slate-query-field__wrapper {\n      padding: 0;\n      background-color: transparent;\n      border: none;\n    }\n  `,\n}));\n\nexport const enableDatalinksPrismSyntax = () => {\n  Prism.languages['links'] = {\n    builtInVariable: {\n      pattern: /(\\${\\S+?})/,\n    },\n  };\n};\n\n// This memoised also because rerendering the slate editor grabs focus which created problem in some cases this\n// was used and changes to different state were propagated here.\nexport const DataLinkInput: React.FC<DataLinkInputProps> = memo(\n  ({ value, onChange, suggestions, placeholder = 'http://your-grafana.com/d/000000010/annotations' }) => {\n    enableDatalinksPrismSyntax();\n    const editorRef = useRef<Editor>() as RefObject<Editor>;\n    const theme = useContext(ThemeContext);\n    const styles = getStyles(theme);\n    const [showingSuggestions, setShowingSuggestions] = useState(false);\n    const [suggestionsIndex, setSuggestionsIndex] = useState(0);\n    const [linkUrl, setLinkUrl] = useState<Value>(makeValue(value));\n    const prevLinkUrl = usePrevious<Value>(linkUrl);\n\n    // Workaround for https://github.com/ianstormtaylor/slate/issues/2927\n    const stateRef = useRef({ showingSuggestions, suggestions, suggestionsIndex, linkUrl, onChange });\n    stateRef.current = { showingSuggestions, suggestions, suggestionsIndex, linkUrl, onChange };\n\n    // SelectionReference is used to position the variables suggestion relatively to current DOM selection\n    const selectionRef = useMemo(() => new SelectionReference(), [setShowingSuggestions, linkUrl]);\n\n    const onKeyDown = React.useCallback((event: KeyboardEvent, next: () => any) => {\n      if (!stateRef.current.showingSuggestions) {\n        if (event.key === '=' || event.key === '$' || (event.keyCode === 32 && event.ctrlKey)) {\n          return setShowingSuggestions(true);\n        }\n        return next();\n      }\n\n      switch (event.key) {\n        case 'Backspace':\n        case 'Escape':\n          setShowingSuggestions(false);\n          return setSuggestionsIndex(0);\n\n        case 'Enter':\n          event.preventDefault();\n          return onVariableSelect(stateRef.current.suggestions[stateRef.current.suggestionsIndex]);\n\n        case 'ArrowDown':\n        case 'ArrowUp':\n          event.preventDefault();\n          const direction = event.key === 'ArrowDown' ? 1 : -1;\n          return setSuggestionsIndex(index => modulo(index + direction, stateRef.current.suggestions.length));\n        default:\n          return next();\n      }\n    }, []);\n\n    useEffect(() => {\n      // Update the state of the link in the parent. This is basically done on blur but we need to do it after\n      // our state have been updated. The duplicity of state is done for perf reasons and also because local\n      // state also contains things like selection and formating.\n      if (prevLinkUrl && prevLinkUrl.selection.isFocused && !linkUrl.selection.isFocused) {\n        stateRef.current.onChange(Plain.serialize(linkUrl));\n      }\n    }, [linkUrl, prevLinkUrl]);\n\n    const onUrlChange = React.useCallback(({ value }: { value: Value }) => {\n      setLinkUrl(value);\n    }, []);\n\n    const onVariableSelect = (item: VariableSuggestion, editor = editorRef.current!) => {\n      const includeDollarSign = Plain.serialize(editor.value).slice(-1) !== '$';\n      if (item.origin !== VariableOrigin.Template || item.value === DataLinkBuiltInVars.includeVars) {\n        editor.insertText(`${includeDollarSign ? '$' : ''}\\{${item.value}}`);\n      } else {\n        editor.insertText(`var-${item.value}=$\\{${item.value}}`);\n      }\n\n      setLinkUrl(editor.value);\n      setShowingSuggestions(false);\n\n      setSuggestionsIndex(0);\n      stateRef.current.onChange(Plain.serialize(editor.value));\n    };\n\n    return (\n      <div className={styles.wrapperOverrides}>\n        <div className=\"slate-query-field__wrapper\">\n          <div className=\"slate-query-field\">\n            {showingSuggestions && (\n              <Portal>\n                <ReactPopper\n                  referenceElement={selectionRef}\n                  placement=\"top-end\"\n                  modifiers={{\n                    preventOverflow: { enabled: true, boundariesElement: 'window' },\n                    arrow: { enabled: false },\n                    offset: { offset: 250 }, // width of the suggestions menu\n                  }}\n                >\n                  {({ ref, style, placement }) => {\n                    return (\n                      <div ref={ref} style={style} data-placement={placement}>\n                        <DataLinkSuggestions\n                          suggestions={stateRef.current.suggestions}\n                          onSuggestionSelect={onVariableSelect}\n                          onClose={() => setShowingSuggestions(false)}\n                          activeIndex={suggestionsIndex}\n                        />\n                      </div>\n                    );\n                  }}\n                </ReactPopper>\n              </Portal>\n            )}\n            <Editor\n              schema={SCHEMA}\n              ref={editorRef}\n              placeholder={placeholder}\n              value={stateRef.current.linkUrl}\n              onChange={onUrlChange}\n              onKeyDown={(event, _editor, next) => onKeyDown(event as KeyboardEvent, next)}\n              plugins={plugins}\n              className={cx(\n                styles.editor,\n                styles.input,\n                css`\n                  padding: 3px 8px;\n                `\n              )}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n);\n\nDataLinkInput.displayName = 'DataLinkInput';\n","import React from 'react';\nimport { connect, Provider } from 'react-redux';\nimport { store } from '../../store/store';\n\nexport function connectWithStore(WrappedComponent: any, ...args: any[]) {\n  const ConnectedWrappedComponent = (connect as any)(...args)(WrappedComponent);\n\n  return (props: any) => {\n    return <ConnectedWrappedComponent {...props} store={store} />;\n  };\n}\n\nexport function connectWithProvider(WrappedComponent: any, ...args: any[]) {\n  const ConnectedWrappedComponent = (connect as any)(...args)(WrappedComponent);\n  return (props: any) => {\n    return (\n      <Provider store={store}>\n        <ConnectedWrappedComponent {...props} store={store} />\n      </Provider>\n    );\n  };\n}\n","import _ from 'lodash';\nimport config from 'app/core/config';\nimport { profiler } from 'app/core/core';\nimport { Emitter } from 'app/core/utils/emitter';\nimport { auto } from 'angular';\nimport { AppEvent, PanelEvents, PanelPluginMeta, AngularPanelMenuItem } from '@grafana/data';\nimport { DashboardModel } from '../dashboard/state';\n\nexport class PanelCtrl {\n  panel: any;\n  error: any;\n  dashboard: DashboardModel;\n  pluginName: string;\n  pluginId: string;\n  editorTabs: any;\n  $scope: any;\n  $injector: auto.IInjectorService;\n  $location: any;\n  $timeout: any;\n  editModeInitiated: boolean;\n  height: number;\n  width: number;\n  containerHeight: any;\n  events: Emitter;\n  loading: boolean;\n  timing: any;\n\n  constructor($scope: any, $injector: auto.IInjectorService) {\n    this.$injector = $injector;\n    this.$location = $injector.get('$location');\n    this.$scope = $scope;\n    this.$timeout = $injector.get('$timeout');\n    this.editorTabs = [];\n    this.events = this.panel.events;\n    this.timing = {}; // not used but here to not break plugins\n\n    const plugin = config.panels[this.panel.type];\n    if (plugin) {\n      this.pluginId = plugin.id;\n      this.pluginName = plugin.name;\n    }\n\n    $scope.$on(PanelEvents.componentDidMount.name, () => this.panelDidMount());\n  }\n\n  panelDidMount() {\n    this.events.emit(PanelEvents.componentDidMount);\n    this.dashboard.panelInitialized(this.panel);\n  }\n\n  renderingCompleted() {\n    profiler.renderingCompleted();\n  }\n\n  refresh() {\n    this.panel.refresh();\n  }\n\n  publishAppEvent<T>(event: AppEvent<T>, payload?: T) {\n    this.$scope.$root.appEvent(event, payload);\n  }\n\n  initEditMode() {\n    if (!this.editModeInitiated) {\n      this.editModeInitiated = true;\n      this.events.emit(PanelEvents.editModeInitialized);\n    }\n  }\n\n  addEditorTab(title: string, directiveFn: any, index?: number, icon?: any) {\n    const editorTab = { title, directiveFn, icon };\n\n    if (_.isString(directiveFn)) {\n      editorTab.directiveFn = () => {\n        return { templateUrl: directiveFn };\n      };\n    }\n\n    if (index) {\n      this.editorTabs.splice(index, 0, editorTab);\n    } else {\n      this.editorTabs.push(editorTab);\n    }\n  }\n\n  getExtendedMenu() {\n    const menu: AngularPanelMenuItem[] = [];\n    this.events.emit(PanelEvents.initPanelActions, menu);\n    return menu;\n  }\n\n  // Override in sub-class to add items before extended menu\n  async getAdditionalMenuItems(): Promise<any[]> {\n    return [];\n  }\n\n  otherPanelInFullscreenMode() {\n    return this.dashboard.otherPanelInFullscreen(this.panel);\n  }\n\n  render(payload?: any) {\n    this.events.emit(PanelEvents.render, payload);\n  }\n\n  // overriden from react\n  onPluginTypeChange = (plugin: PanelPluginMeta) => {};\n}\n","import React, { FC } from 'react';\nimport { cx, css } from 'emotion';\nimport { stylesFactory } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nconst getStyles = stylesFactory((size: number, inline: boolean) => {\n  return {\n    wrapper: css`\n      font-size: ${size}px;\n      ${inline\n        ? css`\n            display: inline-block;\n          `\n        : ''}\n    `,\n  };\n});\n\ntype Props = {\n  className?: string;\n  style?: React.CSSProperties;\n  iconClassName?: string;\n  inline?: boolean;\n  size?: number;\n};\nexport const Spinner: FC<Props> = (props: Props) => {\n  const { className, inline = false, iconClassName, style, size = 16 } = props;\n  const styles = getStyles(size, inline);\n  return (\n    <div style={style} className={cx(styles.wrapper, className)}>\n      <Icon className={cx('fa-spin', iconClassName)} name=\"fa fa-spinner\" />\n    </div>\n  );\n};\n","let canvas: HTMLCanvasElement | null = null;\nconst cache: Record<string, TextMetrics> = {};\n\nexport function measureText(text: string, fontSize: number): TextMetrics {\n  const fontStyle = `${fontSize}px 'Roboto'`;\n  const cacheKey = text + fontStyle;\n  const fromCache = cache[cacheKey];\n\n  if (fromCache) {\n    return fromCache;\n  }\n\n  if (canvas === null) {\n    canvas = document.createElement('canvas');\n  }\n\n  const context = canvas.getContext('2d');\n  if (!context) {\n    throw new Error('Could not create context');\n  }\n\n  context.font = fontStyle;\n  const metrics = context.measureText(text);\n\n  cache[cacheKey] = metrics;\n  return metrics;\n}\n\nexport function calculateFontSize(text: string, width: number, height: number, lineHeight: number, maxSize?: number) {\n  // calculate width in 14px\n  const textSize = measureText(text, 14);\n  // how much bigger than 14px can we make it while staying within our width constraints\n  const fontSizeBasedOnWidth = (width / (textSize.width + 2)) * 14;\n  const fontSizeBasedOnHeight = height / lineHeight;\n\n  // final fontSize\n  const optimialSize = Math.min(fontSizeBasedOnHeight, fontSizeBasedOnWidth);\n  return Math.min(optimialSize, maxSize ?? optimialSize);\n}\n","import React, { FC } from 'react';\nimport { Alert, Icon } from '@grafana/ui';\nimport { AppNotificationSeverity, LdapConnectionInfo, LdapServerInfo } from 'app/types';\n\ninterface Props {\n  ldapConnectionInfo: LdapConnectionInfo;\n}\n\nexport const LdapConnectionStatus: FC<Props> = ({ ldapConnectionInfo }) => {\n  return (\n    <>\n      <h3 className=\"page-heading\">LDAP Connection</h3>\n      <div className=\"gf-form-group\">\n        <div className=\"gf-form\">\n          <table className=\"filter-table form-inline\">\n            <thead>\n              <tr>\n                <th>Host</th>\n                <th colSpan={2}>Port</th>\n              </tr>\n            </thead>\n            <tbody>\n              {ldapConnectionInfo &&\n                ldapConnectionInfo.map((serverInfo, index) => (\n                  <tr key={index}>\n                    <td>{serverInfo.host}</td>\n                    <td>{serverInfo.port}</td>\n                    <td>\n                      {serverInfo.available ? (\n                        <Icon name=\"check\" className=\"pull-right\" />\n                      ) : (\n                        <Icon name=\"exclamation-triangle\" className=\"pull-right\" />\n                      )}\n                    </td>\n                  </tr>\n                ))}\n            </tbody>\n          </table>\n        </div>\n        <div className=\"gf-form-group\">\n          <LdapErrorBox ldapConnectionInfo={ldapConnectionInfo} />\n        </div>\n      </div>\n    </>\n  );\n};\n\ninterface LdapConnectionErrorProps {\n  ldapConnectionInfo: LdapConnectionInfo;\n}\n\nexport const LdapErrorBox: FC<LdapConnectionErrorProps> = ({ ldapConnectionInfo }) => {\n  const hasError = ldapConnectionInfo.some(info => info.error);\n  if (!hasError) {\n    return null;\n  }\n\n  const connectionErrors: LdapServerInfo[] = [];\n  ldapConnectionInfo.forEach(info => {\n    if (info.error) {\n      connectionErrors.push(info);\n    }\n  });\n\n  const errorElements = connectionErrors.map((info, index) => (\n    <div key={index}>\n      <span style={{ fontWeight: 500 }}>\n        {info.host}:{info.port}\n        <br />\n      </span>\n      <span>{info.error}</span>\n      {index !== connectionErrors.length - 1 && (\n        <>\n          <br />\n          <br />\n        </>\n      )}\n    </div>\n  ));\n\n  return <Alert title=\"Connection error\" severity={AppNotificationSeverity.Error} children={errorElements} />;\n};\n","import React from 'react';\nimport { css } from 'emotion';\nimport { CSSTransition } from 'react-transition-group';\nimport { stylesFactory } from '../../themes';\n\nconst getStyles = stylesFactory((duration: number, measurement: 'width' | 'height', size: number) => {\n  return {\n    enter: css`\n      label: enter;\n      ${measurement}: 0;\n      opacity: 0;\n    `,\n    enterActive: css`\n      label: enterActive;\n      ${measurement}: ${size}px;\n      opacity: 1;\n      transition: opacity ${duration}ms ease-out, ${measurement} ${duration}ms ease-out;\n    `,\n    exit: css`\n      label: exit;\n      ${measurement}: ${size}px;\n      opacity: 1;\n    `,\n    exitActive: css`\n      label: exitActive;\n      opacity: 0;\n      ${measurement}: 0;\n      transition: opacity ${duration}ms ease-out, ${measurement} ${duration}ms ease-out;\n    `,\n  };\n});\n\ntype Props = {\n  children: React.ReactNode;\n  visible: boolean;\n  size: number;\n\n  duration?: number;\n  horizontal?: boolean;\n};\n\nexport function SlideOutTransition(props: Props) {\n  const { visible, children, duration = 250, horizontal, size } = props;\n  const styles = getStyles(duration, horizontal ? 'width' : 'height', size);\n  return (\n    <CSSTransition in={visible} mountOnEnter={true} unmountOnExit={true} timeout={duration} classNames={styles}>\n      {children}\n    </CSSTransition>\n  );\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport _ from 'lodash';\nimport { DataSourceApi, DataSourceSelectItem, stringToJsRegex, MetricFindValue } from '@grafana/data';\n\nimport {\n  QueryVariableModel,\n  VariableHide,\n  VariableOption,\n  VariableRefresh,\n  VariableSort,\n  VariableTag,\n} from '../../templating/types';\n\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  getInstanceState,\n  NEW_VARIABLE_ID,\n  NONE_VARIABLE_TEXT,\n  NONE_VARIABLE_VALUE,\n  VariablePayload,\n} from '../state/types';\nimport { ComponentType } from 'react';\nimport { VariableQueryProps } from '../../../types';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\n\ninterface VariableOptionsUpdate {\n  templatedRegex: string;\n  results: MetricFindValue[];\n}\n\nexport interface QueryVariableEditorState {\n  VariableQueryEditor: ComponentType<VariableQueryProps> | null;\n  dataSources: DataSourceSelectItem[];\n  dataSource: DataSourceApi | null;\n}\n\nexport const initialQueryVariableModelState: QueryVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  index: -1,\n  type: 'query',\n  name: '',\n  label: null,\n  hide: VariableHide.dontHide,\n  skipUrlSync: false,\n  datasource: null,\n  query: '',\n  regex: '',\n  sort: VariableSort.disabled,\n  refresh: VariableRefresh.never,\n  multi: false,\n  includeAll: false,\n  allValue: null,\n  options: [],\n  current: {} as VariableOption,\n  tags: [],\n  useTags: false,\n  tagsQuery: '',\n  tagValuesQuery: '',\n  definition: '',\n  initLock: null,\n};\n\nconst sortVariableValues = (options: any[], sortOrder: VariableSort) => {\n  if (sortOrder === VariableSort.disabled) {\n    return options;\n  }\n\n  const sortType = Math.ceil(sortOrder / 2);\n  const reverseSort = sortOrder % 2 === 0;\n\n  if (sortType === 1) {\n    options = _.sortBy(options, 'text');\n  } else if (sortType === 2) {\n    options = _.sortBy(options, opt => {\n      const matches = opt.text.match(/.*?(\\d+).*/);\n      if (!matches || matches.length < 2) {\n        return -1;\n      } else {\n        return parseInt(matches[1], 10);\n      }\n    });\n  } else if (sortType === 3) {\n    options = _.sortBy(options, opt => {\n      return _.toLower(opt.text);\n    });\n  }\n\n  if (reverseSort) {\n    options = options.reverse();\n  }\n\n  return options;\n};\n\nconst metricNamesToVariableValues = (variableRegEx: string, sort: VariableSort, metricNames: any[]) => {\n  let regex, i, matches;\n  let options: VariableOption[] = [];\n\n  if (variableRegEx) {\n    regex = stringToJsRegex(variableRegEx);\n  }\n\n  for (i = 0; i < metricNames.length; i++) {\n    const item = metricNames[i];\n    let text = item.text === undefined || item.text === null ? item.value : item.text;\n\n    let value = item.value === undefined || item.value === null ? item.text : item.value;\n\n    if (_.isNumber(value)) {\n      value = value.toString();\n    }\n\n    if (_.isNumber(text)) {\n      text = text.toString();\n    }\n\n    if (regex) {\n      matches = regex.exec(value);\n      if (!matches) {\n        continue;\n      }\n      if (matches.length > 1) {\n        value = matches[1];\n        text = matches[1];\n      }\n    }\n\n    options.push({ text: text, value: value, selected: false });\n  }\n\n  options = _.uniqBy(options, 'value');\n  return sortVariableValues(options, sort);\n};\n\nexport const queryVariableSlice = createSlice({\n  name: 'templating/query',\n  initialState: initialVariablesState,\n  reducers: {\n    updateVariableOptions: (state: VariablesState, action: PayloadAction<VariablePayload<VariableOptionsUpdate>>) => {\n      const { results, templatedRegex } = action.payload.data;\n      const instanceState = getInstanceState<QueryVariableModel>(state, action.payload.id);\n      const { includeAll, sort } = instanceState;\n      const options = metricNamesToVariableValues(templatedRegex, sort, results);\n\n      if (includeAll) {\n        options.unshift({ text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false });\n      }\n\n      if (!options.length) {\n        options.push({ text: NONE_VARIABLE_TEXT, value: NONE_VARIABLE_VALUE, isNone: true, selected: false });\n      }\n\n      instanceState.options = options;\n    },\n    updateVariableTags: (state: VariablesState, action: PayloadAction<VariablePayload<any[]>>) => {\n      const instanceState = getInstanceState<QueryVariableModel>(state, action.payload.id);\n      const results = action.payload.data;\n      const tags: VariableTag[] = [];\n      for (let i = 0; i < results.length; i++) {\n        tags.push({ text: results[i].text, selected: false });\n      }\n\n      instanceState.tags = tags;\n    },\n  },\n});\n\nexport const queryVariableReducer = queryVariableSlice.reducer;\n\nexport const { updateVariableOptions, updateVariableTags } = queryVariableSlice.actions;\n","import React, { PureComponent } from 'react';\nimport { getTagColorsFromName, Icon } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableTag } from '../../../templating/types';\n\ninterface Props {\n  onClick: () => void;\n  text: string;\n  tags: VariableTag[];\n}\nexport class VariableLink extends PureComponent<Props> {\n  onClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n    event.stopPropagation();\n    event.preventDefault();\n    this.props.onClick();\n  };\n\n  render() {\n    const { tags = [], text } = this.props;\n\n    return (\n      <a\n        onClick={this.onClick}\n        className=\"variable-value-link\"\n        aria-label={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${text}`)}\n      >\n        {text}\n        {tags.map(tag => {\n          const { color, borderColor } = getTagColorsFromName(tag.text.toString());\n          return (\n            <span bs-tooltip=\"tag.valuesText\" data-placement=\"bottom\" key={`${tag.text}`}>\n              <span className=\"label-tag\" style={{ backgroundColor: color, borderColor }}>\n                &nbsp;&nbsp;\n                <Icon name=\"tag-alt\" />\n                &nbsp; {tag.text}\n              </span>\n            </span>\n          );\n        })}\n        <Icon name=\"angle-down\" size=\"sm\" />\n      </a>\n    );\n  }\n}\n","import { VariableModel } from '../../templating/types';\n\nexport interface VariablePickerProps<Model extends VariableModel = VariableModel> {\n  variable: Model;\n}\n\nexport enum NavigationKey {\n  moveUp = 38,\n  moveDown = 40,\n  select = 32,\n  cancel = 27,\n  selectAndClose = 13,\n}\n","import React, { PureComponent } from 'react';\nimport { NavigationKey } from '../types';\n\nexport interface Props {\n  onChange: (value: string) => void;\n  onNavigate: (key: NavigationKey, clearOthers: boolean) => void;\n  value: string | null;\n}\n\nexport class VariableInput extends PureComponent<Props> {\n  onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n    if (NavigationKey[event.keyCode]) {\n      const clearOthers = event.ctrlKey || event.metaKey || event.shiftKey;\n      this.props.onNavigate(event.keyCode as NavigationKey, clearOthers);\n    }\n  };\n\n  onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    this.props.onChange(event.target.value);\n  };\n\n  render() {\n    return (\n      <input\n        ref={instance => {\n          if (instance) {\n            instance.focus();\n            instance.setAttribute('style', `width:${Math.max(instance.width, 80)}px`);\n          }\n        }}\n        type=\"text\"\n        className=\"gf-form-input\"\n        value={this.props.value ?? ''}\n        onChange={this.onChange}\n        onKeyDown={this.onKeyDown}\n      />\n    );\n  }\n}\n","import { debounce, trim } from 'lodash';\nimport { StoreState, ThunkDispatch, ThunkResult } from 'app/types';\nimport {\n  QueryVariableModel,\n  VariableOption,\n  VariableRefresh,\n  VariableTag,\n  VariableWithMultiSupport,\n  VariableWithOptions,\n} from '../../../templating/types';\nimport { variableAdapters } from '../../adapters';\nimport { getVariable } from '../../state/selectors';\nimport { NavigationKey } from '../types';\nimport {\n  hideOptions,\n  moveOptionsHighlight,\n  OptionsPickerState,\n  toggleOption,\n  toggleTag,\n  updateOptionsAndFilter,\n  updateOptionsFromSearch,\n  updateSearchQuery,\n} from './reducer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { changeVariableProp, setCurrentVariableValue } from '../../state/sharedReducer';\nimport { toVariablePayload } from '../../state/types';\nimport { containsSearchFilter } from '../../../templating/utils';\n\nexport const navigateOptions = (key: NavigationKey, clearOthers: boolean): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    if (key === NavigationKey.cancel) {\n      return await dispatch(commitChangesToVariable());\n    }\n\n    if (key === NavigationKey.select) {\n      return dispatch(toggleOptionByHighlight(clearOthers));\n    }\n\n    if (key === NavigationKey.selectAndClose) {\n      dispatch(toggleOptionByHighlight(clearOthers, true));\n      return await dispatch(commitChangesToVariable());\n    }\n\n    if (key === NavigationKey.moveDown) {\n      return dispatch(moveOptionsHighlight(1));\n    }\n\n    if (key === NavigationKey.moveUp) {\n      return dispatch(moveOptionsHighlight(-1));\n    }\n\n    return undefined;\n  };\n};\n\nexport const filterOrSearchOptions = (searchQuery = ''): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const { id, queryValue } = getState().templating.optionsPicker;\n    const { query, options } = getVariable<VariableWithOptions>(id!, getState());\n    dispatch(updateSearchQuery(searchQuery));\n\n    if (trim(queryValue) === trim(searchQuery)) {\n      return;\n    }\n\n    if (containsSearchFilter(query)) {\n      return searchForOptionsWithDebounce(dispatch, getState, searchQuery);\n    }\n    return dispatch(updateOptionsAndFilter(options));\n  };\n};\n\nexport const commitChangesToVariable = (): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const picker = getState().templating.optionsPicker;\n    const existing = getVariable<VariableWithMultiSupport>(picker.id, getState());\n    const currentPayload = { option: mapToCurrent(picker) };\n    const searchQueryPayload = { propName: 'queryValue', propValue: picker.queryValue };\n\n    dispatch(setCurrentVariableValue(toVariablePayload(existing, currentPayload)));\n    dispatch(changeVariableProp(toVariablePayload(existing, searchQueryPayload)));\n    const updated = getVariable<VariableWithMultiSupport>(picker.id, getState());\n\n    if (existing.current.text === updated.current.text) {\n      return dispatch(hideOptions());\n    }\n\n    const adapter = variableAdapters.get(updated.type);\n    await adapter.setValue(updated, updated.current, true);\n    return dispatch(hideOptions());\n  };\n};\n\nexport const toggleOptionByHighlight = (clearOthers: boolean, forceSelect = false): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const { highlightIndex, options } = getState().templating.optionsPicker;\n    const option = options[highlightIndex];\n    dispatch(toggleOption({ option, forceSelect, clearOthers }));\n  };\n};\n\nexport const toggleAndFetchTag = (tag: VariableTag): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    if (Array.isArray(tag.values)) {\n      return dispatch(toggleTag(tag));\n    }\n\n    const values = await dispatch(fetchTagValues(tag.text.toString()));\n    return dispatch(toggleTag({ ...tag, values }));\n  };\n};\n\nconst fetchTagValues = (tagText: string): ThunkResult<Promise<string[]>> => {\n  return async (dispatch, getState) => {\n    const picker = getState().templating.optionsPicker;\n    const variable = getVariable<QueryVariableModel>(picker.id, getState());\n\n    const datasource = await getDataSourceSrv().get(variable.datasource ?? '');\n    const query = variable.tagValuesQuery.replace('$tag', tagText);\n    const options = { range: getTimeRange(variable), variable };\n\n    if (!datasource.metricFindQuery) {\n      return [];\n    }\n\n    const results = await datasource.metricFindQuery(query, options);\n\n    if (!Array.isArray(results)) {\n      return [];\n    }\n    return results.map(value => value.text);\n  };\n};\n\nconst getTimeRange = (variable: QueryVariableModel) => {\n  if (variable.refresh === VariableRefresh.onTimeRangeChanged) {\n    return getTimeSrv().timeRange();\n  }\n  return undefined;\n};\n\nconst searchForOptions = async (dispatch: ThunkDispatch, getState: () => StoreState, searchQuery: string) => {\n  try {\n    const { id } = getState().templating.optionsPicker;\n    const existing = getVariable<VariableWithOptions>(id, getState());\n\n    const adapter = variableAdapters.get(existing.type);\n    await adapter.updateOptions(existing, searchQuery);\n\n    const updated = getVariable<VariableWithOptions>(id, getState());\n    dispatch(updateOptionsFromSearch(updated.options));\n  } catch (error) {\n    console.error(error);\n  }\n};\n\nconst searchForOptionsWithDebounce = debounce(searchForOptions, 500);\n\nfunction mapToCurrent(picker: OptionsPickerState): VariableOption | undefined {\n  const { options, selectedValues, queryValue: searchQuery, multi } = picker;\n\n  if (options.length === 0 && searchQuery && searchQuery.length > 0) {\n    return { text: searchQuery, value: searchQuery, selected: false };\n  }\n\n  if (!multi) {\n    return selectedValues.find(o => o.selected);\n  }\n\n  const texts: string[] = [];\n  const values: string[] = [];\n\n  for (const option of selectedValues) {\n    if (!option.selected) {\n      continue;\n    }\n\n    texts.push(option.text.toString());\n    values.push(option.value.toString());\n  }\n\n  return {\n    value: values,\n    text: texts.join(' + '),\n    tags: picker.tags.filter(t => t.selected),\n    selected: true,\n  };\n}\n","import React, { PureComponent } from 'react';\nimport { getTagColorsFromName, Icon, Tooltip } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableOption, VariableTag } from '../../../templating/types';\n\nexport interface Props {\n  multi: boolean;\n  values: VariableOption[];\n  selectedValues: VariableOption[];\n  tags: VariableTag[];\n  highlightIndex: number;\n  onToggle: (option: VariableOption, clearOthers: boolean) => void;\n  onToggleAll: () => void;\n  onToggleTag: (tag: VariableTag) => void;\n}\n\nexport class VariableOptions extends PureComponent<Props> {\n  onToggle = (option: VariableOption) => (event: React.MouseEvent<HTMLAnchorElement>) => {\n    const clearOthers = event.shiftKey || event.ctrlKey || event.metaKey;\n    this.handleEvent(event);\n    this.props.onToggle(option, clearOthers);\n  };\n\n  onToggleAll = (event: React.MouseEvent<HTMLAnchorElement>) => {\n    this.handleEvent(event);\n    this.props.onToggleAll();\n  };\n\n  onToggleTag = (tag: VariableTag) => (event: React.MouseEvent<HTMLAnchorElement>) => {\n    this.handleEvent(event);\n    this.props.onToggleTag(tag);\n  };\n\n  handleEvent(event: React.MouseEvent<HTMLAnchorElement>) {\n    event.preventDefault();\n    event.stopPropagation();\n  }\n\n  render() {\n    const { multi, values, tags } = this.props;\n\n    return (\n      <div\n        className={`${multi ? 'variable-value-dropdown multi' : 'variable-value-dropdown single'}`}\n        aria-label={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown}\n      >\n        <div className=\"variable-options-wrapper\">\n          <div className=\"variable-options-column\">\n            {this.renderMultiToggle()}\n            {values.map((option, index) => this.renderOption(option, index))}\n          </div>\n          {this.renderTags(tags)}\n        </div>\n      </div>\n    );\n  }\n\n  renderTags(tags: VariableTag[]) {\n    if (tags.length === 0) {\n      return null;\n    }\n\n    return (\n      <div className=\"variable-options-column\">\n        <div className=\"variable-options-column-header text-center\">Tags</div>\n        {tags.map(tag => this.renderTag(tag))}\n      </div>\n    );\n  }\n\n  renderTag(tag: VariableTag) {\n    const { color, borderColor } = getTagColorsFromName(tag.text.toString());\n\n    return (\n      <a\n        key={`${tag.text}`}\n        className={`${tag.selected ? 'variable-option-tag pointer selected' : 'variable-option-tag pointer'}`}\n        onClick={this.onToggleTag(tag)}\n      >\n        <span className=\"fa fa-fw variable-option-icon\"></span>\n        <span className=\"label-tag\" style={{ backgroundColor: color, borderColor }}>\n          {tag.text}&nbsp;&nbsp;\n          <Icon name=\"tag-alt\" />\n          &nbsp;\n        </span>\n      </a>\n    );\n  }\n\n  renderOption(option: VariableOption, index: number) {\n    const { highlightIndex } = this.props;\n    const selectClass = option.selected ? 'variable-option pointer selected' : 'variable-option pointer';\n    const highlightClass = index === highlightIndex ? `${selectClass} highlighted` : selectClass;\n\n    return (\n      <a key={`${option.value}`} className={highlightClass} onClick={this.onToggle(option)}>\n        <span className=\"variable-option-icon\"></span>\n        <span aria-label={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(`${option.text}`)}>\n          {option.text}\n        </span>\n      </a>\n    );\n  }\n\n  renderMultiToggle() {\n    const { multi, selectedValues } = this.props;\n\n    if (!multi) {\n      return null;\n    }\n\n    return (\n      <Tooltip content={'Clear selections'} placement={'top'}>\n        <a\n          className={`${\n            selectedValues.length > 1\n              ? 'variable-options-column-header many-selected'\n              : 'variable-options-column-header'\n          }`}\n          onClick={this.onToggleAll}\n          data-placement=\"top\"\n        >\n          <span className=\"variable-option-icon\"></span>\n          Selected ({selectedValues.length})\n        </a>\n      </Tooltip>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from 'app/types';\nimport { ClickOutsideWrapper } from '@grafana/ui';\nimport { VariableLink } from '../shared/VariableLink';\nimport { VariableInput } from '../shared/VariableInput';\nimport { commitChangesToVariable, filterOrSearchOptions, navigateOptions, toggleAndFetchTag } from './actions';\nimport { OptionsPickerState, showOptions, toggleAllOptions, toggleOption } from './reducer';\nimport { VariableOption, VariableTag, VariableWithMultiSupport, VariableWithOptions } from '../../../templating/types';\nimport { VariableOptions } from '../shared/VariableOptions';\nimport { isQuery } from '../../guard';\nimport { VariablePickerProps } from '../types';\n\ninterface OwnProps extends VariablePickerProps<VariableWithMultiSupport> {}\n\ninterface ConnectedProps {\n  picker: OptionsPickerState;\n}\n\ninterface DispatchProps {\n  showOptions: typeof showOptions;\n  commitChangesToVariable: typeof commitChangesToVariable;\n  toggleAllOptions: typeof toggleAllOptions;\n  toggleOption: typeof toggleOption;\n  toggleAndFetchTag: typeof toggleAndFetchTag;\n  filterOrSearchOptions: typeof filterOrSearchOptions;\n  navigateOptions: typeof navigateOptions;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport class OptionsPickerUnconnected extends PureComponent<Props> {\n  onShowOptions = () => this.props.showOptions(this.props.variable);\n  onHideOptions = () => this.props.commitChangesToVariable();\n\n  onToggleOption = (option: VariableOption, clearOthers: boolean) => {\n    const toggleFunc = this.props.variable.multi ? this.onToggleMultiValueVariable : this.onToggleSingleValueVariable;\n    toggleFunc(option, clearOthers);\n  };\n\n  onToggleSingleValueVariable = (option: VariableOption, clearOthers: boolean) => {\n    this.props.toggleOption({ option, clearOthers, forceSelect: false });\n    this.onHideOptions();\n  };\n\n  onToggleMultiValueVariable = (option: VariableOption, clearOthers: boolean) => {\n    this.props.toggleOption({ option, clearOthers, forceSelect: false });\n  };\n\n  render() {\n    const { variable, picker } = this.props;\n    const showOptions = picker.id === variable.id;\n\n    return (\n      <div className=\"variable-link-wrapper\">\n        {this.renderLink(showOptions, variable)}\n        {this.renderOptions(showOptions, picker)}\n      </div>\n    );\n  }\n\n  renderLink(showOptions: boolean, variable: VariableWithMultiSupport) {\n    if (showOptions) {\n      return null;\n    }\n\n    const linkText = getLinkText(variable);\n    const tags = getSelectedTags(variable);\n\n    return <VariableLink text={linkText} tags={tags} onClick={this.onShowOptions} />;\n  }\n\n  renderOptions(showOptions: boolean, picker: OptionsPickerState) {\n    if (!showOptions) {\n      return null;\n    }\n\n    return (\n      <ClickOutsideWrapper onClick={this.onHideOptions}>\n        <VariableInput\n          value={picker.queryValue}\n          onChange={this.props.filterOrSearchOptions}\n          onNavigate={this.props.navigateOptions}\n        />\n        <VariableOptions\n          values={picker.options}\n          onToggle={this.onToggleOption}\n          onToggleAll={this.props.toggleAllOptions}\n          onToggleTag={this.props.toggleAndFetchTag}\n          highlightIndex={picker.highlightIndex}\n          multi={picker.multi}\n          tags={picker.tags}\n          selectedValues={picker.selectedValues}\n        />\n      </ClickOutsideWrapper>\n    );\n  }\n}\n\nconst getSelectedTags = (variable: VariableWithOptions): VariableTag[] => {\n  if (!isQuery(variable) || !Array.isArray(variable.tags)) {\n    return [];\n  }\n  return variable.tags.filter(t => t.selected);\n};\n\nconst getLinkText = (variable: VariableWithOptions) => {\n  const { current, options } = variable;\n\n  if (!current.tags || current.tags.length === 0) {\n    if (Array.isArray(current.text)) {\n      return current.text.join(' + ');\n    }\n    return current.text;\n  }\n\n  // filer out values that are in selected tags\n  const selectedAndNotInTag = options.filter(option => {\n    if (!option.selected) {\n      return false;\n    }\n\n    if (!current || !current.tags || !current.tags.length) {\n      return false;\n    }\n\n    for (let i = 0; i < current.tags.length; i++) {\n      const tag = current.tags[i];\n      const foundIndex = tag?.values?.findIndex(v => v === option.value);\n      if (foundIndex && foundIndex !== -1) {\n        return false;\n      }\n    }\n    return true;\n  });\n\n  // convert values to text\n  const currentTexts = selectedAndNotInTag.map(s => s.text);\n\n  // join texts\n  const newLinkText = currentTexts.join(' + ');\n  return newLinkText.length > 0 ? `${newLinkText} + ` : newLinkText;\n};\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  showOptions,\n  commitChangesToVariable,\n  filterOrSearchOptions,\n  toggleAllOptions,\n  toggleOption,\n  toggleAndFetchTag,\n  navigateOptions,\n};\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = state => ({\n  picker: state.templating.optionsPicker,\n});\n\nexport const OptionsPicker = connect(mapStateToProps, mapDispatchToProps)(OptionsPickerUnconnected);\nOptionsPicker.displayName = 'OptionsPicker';\n","import React, { FunctionComponent, useCallback } from 'react';\nimport { LegacyForms } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableWithMultiSupport } from '../../templating/types';\nimport { VariableEditorProps } from './types';\nimport { toVariableIdentifier, VariableIdentifier } from '../state/types';\n\nconst { Switch } = LegacyForms;\n\nexport interface SelectionOptionsEditorProps<Model extends VariableWithMultiSupport = VariableWithMultiSupport>\n  extends VariableEditorProps<Model> {\n  onMultiChanged: (identifier: VariableIdentifier, value: boolean) => void;\n}\n\nexport const SelectionOptionsEditor: FunctionComponent<SelectionOptionsEditorProps> = props => {\n  const onMultiChanged = useCallback(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      props.onMultiChanged(toVariableIdentifier(props.variable), event.target.checked);\n    },\n    [props.onMultiChanged]\n  );\n\n  const onIncludeAllChanged = useCallback(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      props.onPropChange({ propName: 'includeAll', propValue: event.target.checked });\n    },\n    [props.onPropChange]\n  );\n\n  const onAllValueChanged = useCallback(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      props.onPropChange({ propName: 'allValue', propValue: event.target.value });\n    },\n    [props.onPropChange]\n  );\n  return (\n    <div className=\"section gf-form-group\">\n      <h5 className=\"section-heading\">Selection Options</h5>\n      <div className=\"section\">\n        <div aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsMultiSwitch}>\n          <Switch\n            label=\"Multi-value\"\n            labelClass=\"width-10\"\n            checked={props.variable.multi}\n            onChange={onMultiChanged}\n            tooltip={'Enables multiple values to be selected at the same time'}\n          />\n        </div>\n        <div aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsIncludeAllSwitch}>\n          <Switch\n            label=\"Include All option\"\n            labelClass=\"width-10\"\n            checked={props.variable.includeAll}\n            onChange={onIncludeAllChanged}\n            tooltip={'Enables multiple values to be selected at the same time'}\n          />\n        </div>\n      </div>\n      {props.variable.includeAll && (\n        <div className=\"gf-form\">\n          <span className=\"gf-form-label width-10\">Custom all value</span>\n          <input\n            type=\"text\"\n            className=\"gf-form-input max-width-15\"\n            value={props.variable.allValue ?? ''}\n            onChange={onAllValueChanged}\n            placeholder=\"blank = auto\"\n            aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsCustomAllInput}\n          />\n        </div>\n      )}\n    </div>\n  );\n};\nSelectionOptionsEditor.displayName = 'SelectionOptionsEditor';\n","import { AppEvents, DataSourcePluginMeta, DataSourceSelectItem } from '@grafana/data';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { QueryVariableModel, VariableRefresh } from '../../templating/types';\nimport { ThunkResult } from '../../../types';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport templateSrv from '../../templating/template_srv';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport appEvents from '../../../core/app_events';\nimport { importDataSourcePlugin } from '../../plugins/plugin_loader';\nimport DefaultVariableQueryEditor from '../../templating/DefaultVariableQueryEditor';\nimport { getVariable } from '../state/selectors';\nimport { addVariableEditorError, changeVariableEditorExtended, removeVariableEditorError } from '../editor/reducer';\nimport { variableAdapters } from '../adapters';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { updateVariableOptions, updateVariableTags } from './reducer';\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\n\nexport const updateQueryVariableOptions = (\n  identifier: VariableIdentifier,\n  searchFilter?: string\n): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variableInState = getVariable<QueryVariableModel>(identifier.id!, getState());\n    try {\n      if (getState().templating.editor.id === variableInState.id) {\n        dispatch(removeVariableEditorError({ errorProp: 'update' }));\n      }\n      const dataSource = await getDatasourceSrv().get(variableInState.datasource ?? '');\n      const queryOptions: any = { range: undefined, variable: variableInState, searchFilter };\n      if (variableInState.refresh === VariableRefresh.onTimeRangeChanged) {\n        queryOptions.range = getTimeSrv().timeRange();\n      }\n\n      if (!dataSource.metricFindQuery) {\n        return;\n      }\n\n      const results = await dataSource.metricFindQuery(variableInState.query, queryOptions);\n      const templatedRegex = getTemplatedRegex(variableInState);\n      await dispatch(updateVariableOptions(toVariablePayload(variableInState, { results, templatedRegex })));\n\n      if (variableInState.useTags) {\n        const tagResults = await dataSource.metricFindQuery(variableInState.tagsQuery, queryOptions);\n        await dispatch(updateVariableTags(toVariablePayload(variableInState, tagResults)));\n      }\n\n      await dispatch(validateVariableSelectionState(toVariableIdentifier(variableInState)));\n    } catch (err) {\n      console.error(err);\n      if (err.data && err.data.message) {\n        err.message = err.data.message;\n      }\n      if (getState().templating.editor.id === variableInState.id) {\n        dispatch(addVariableEditorError({ errorProp: 'update', errorText: err.message }));\n      }\n      appEvents.emit(AppEvents.alertError, [\n        'Templating',\n        'Template variables could not be initialized: ' + err.message,\n      ]);\n    }\n  };\n};\n\nexport const initQueryVariableEditor = (identifier: VariableIdentifier): ThunkResult<void> => async (\n  dispatch,\n  getState\n) => {\n  const dataSources: DataSourceSelectItem[] = getDatasourceSrv()\n    .getMetricSources()\n    .filter(ds => !ds.meta.mixed && ds.value !== null);\n\n  const defaultDatasource: DataSourceSelectItem = { name: '', value: '', meta: {} as DataSourcePluginMeta, sort: '' };\n  const allDataSources = [defaultDatasource].concat(dataSources);\n  dispatch(changeVariableEditorExtended({ propName: 'dataSources', propValue: allDataSources }));\n\n  const variable = getVariable<QueryVariableModel>(identifier.id!, getState());\n  if (!variable.datasource) {\n    return;\n  }\n  dispatch(changeQueryVariableDataSource(toVariableIdentifier(variable), variable.datasource));\n};\n\nexport const changeQueryVariableDataSource = (\n  identifier: VariableIdentifier,\n  name: string | null\n): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    try {\n      const dataSource = await getDatasourceSrv().get(name ?? '');\n      const dsPlugin = await importDataSourcePlugin(dataSource.meta!);\n      const VariableQueryEditor = dsPlugin.components.VariableQueryEditor ?? DefaultVariableQueryEditor;\n      dispatch(changeVariableEditorExtended({ propName: 'dataSource', propValue: dataSource }));\n      dispatch(changeVariableEditorExtended({ propName: 'VariableQueryEditor', propValue: VariableQueryEditor }));\n    } catch (err) {\n      console.error(err);\n    }\n  };\n};\n\nexport const changeQueryVariableQuery = (\n  identifier: VariableIdentifier,\n  query: any,\n  definition: string\n): ThunkResult<void> => async (dispatch, getState) => {\n  const variableInState = getVariable<QueryVariableModel>(identifier.id!, getState());\n  if (typeof query === 'string' && query.match(new RegExp('\\\\$' + variableInState.name + '(/| |$)'))) {\n    const errorText = 'Query cannot contain a reference to itself. Variable: $' + variableInState.name;\n    dispatch(addVariableEditorError({ errorProp: 'query', errorText }));\n    return;\n  }\n\n  dispatch(removeVariableEditorError({ errorProp: 'query' }));\n  dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: query })));\n  dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'definition', propValue: definition })));\n  await variableAdapters.get(identifier.type).updateOptions(variableInState);\n};\n\nconst getTemplatedRegex = (variable: QueryVariableModel): string => {\n  if (!variable) {\n    return '';\n  }\n\n  if (!variable.regex) {\n    return '';\n  }\n\n  return templateSrv.replace(variable.regex, {}, 'regex');\n};\n","import React, { ChangeEvent, PureComponent } from 'react';\nimport { InlineFormLabel, LegacyForms } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport templateSrv from '../../templating/template_srv';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { QueryVariableModel, VariableRefresh, VariableSort, VariableWithMultiSupport } from '../../templating/types';\nimport { QueryVariableEditorState } from './reducer';\nimport { changeQueryVariableDataSource, changeQueryVariableQuery, initQueryVariableEditor } from './actions';\nimport { VariableEditorState } from '../editor/reducer';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from '../../../types';\nimport { connectWithStore } from '../../../core/utils/connectWithReduxStore';\nimport { toVariableIdentifier } from '../state/types';\nimport { changeVariableMultiValue } from '../state/actions';\n\nconst { Switch } = LegacyForms;\n\nexport interface OwnProps extends VariableEditorProps<QueryVariableModel> {}\n\ninterface ConnectedProps {\n  editor: VariableEditorState<QueryVariableEditorState>;\n}\n\ninterface DispatchProps {\n  initQueryVariableEditor: typeof initQueryVariableEditor;\n  changeQueryVariableDataSource: typeof changeQueryVariableDataSource;\n  changeQueryVariableQuery: typeof changeQueryVariableQuery;\n  changeVariableMultiValue: typeof changeVariableMultiValue;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport interface State {\n  regex: string | null;\n  tagsQuery: string | null;\n  tagValuesQuery: string | null;\n}\n\nexport class QueryVariableEditorUnConnected extends PureComponent<Props, State> {\n  state: State = {\n    regex: null,\n    tagsQuery: null,\n    tagValuesQuery: null,\n  };\n\n  async componentDidMount() {\n    await this.props.initQueryVariableEditor(toVariableIdentifier(this.props.variable));\n  }\n\n  componentDidUpdate(prevProps: Readonly<Props>): void {\n    if (prevProps.variable.datasource !== this.props.variable.datasource) {\n      this.props.changeQueryVariableDataSource(\n        toVariableIdentifier(this.props.variable),\n        this.props.variable.datasource\n      );\n    }\n  }\n\n  getSelectedDataSourceValue = (): string => {\n    if (!this.props.editor.extended?.dataSources.length) {\n      return '';\n    }\n    const foundItem = this.props.editor.extended?.dataSources.find(ds => ds.value === this.props.variable.datasource);\n    const value = foundItem ? foundItem.value : this.props.editor.extended?.dataSources[0].value;\n    return value ?? '';\n  };\n\n  onDataSourceChange = (event: ChangeEvent<HTMLSelectElement>) => {\n    this.props.onPropChange({ propName: 'query', propValue: '' });\n    this.props.onPropChange({ propName: 'datasource', propValue: event.target.value });\n  };\n\n  onQueryChange = async (query: any, definition: string) => {\n    this.props.changeQueryVariableQuery(toVariableIdentifier(this.props.variable), query, definition);\n  };\n\n  onRegExChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ regex: event.target.value });\n  };\n\n  onRegExBlur = async (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({ propName: 'regex', propValue: event.target.value, updateOptions: true });\n  };\n\n  onTagsQueryChange = async (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ tagsQuery: event.target.value });\n  };\n\n  onTagsQueryBlur = async (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({ propName: 'tagsQuery', propValue: event.target.value, updateOptions: true });\n  };\n\n  onTagValuesQueryChange = async (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ tagValuesQuery: event.target.value });\n  };\n\n  onTagValuesQueryBlur = async (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({ propName: 'tagValuesQuery', propValue: event.target.value, updateOptions: true });\n  };\n\n  onRefreshChange = (event: ChangeEvent<HTMLSelectElement>) => {\n    this.props.onPropChange({ propName: 'refresh', propValue: parseInt(event.target.value, 10) });\n  };\n\n  onSortChange = async (event: ChangeEvent<HTMLSelectElement>) => {\n    this.props.onPropChange({ propName: 'sort', propValue: parseInt(event.target.value, 10), updateOptions: true });\n  };\n\n  onSelectionOptionsChange = async ({ propValue, propName }: OnPropChangeArguments<VariableWithMultiSupport>) => {\n    this.props.onPropChange({ propName, propValue, updateOptions: true });\n  };\n\n  onUseTagsChange = async (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({ propName: 'useTags', propValue: event.target.checked, updateOptions: true });\n  };\n\n  render() {\n    const VariableQueryEditor = this.props.editor.extended?.VariableQueryEditor;\n    return (\n      <>\n        <div className=\"gf-form-group\">\n          <h5 className=\"section-heading\">Query Options</h5>\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form max-width-21\">\n              <span className=\"gf-form-label width-10\">Data source</span>\n              <div className=\"gf-form-select-wrapper max-width-14\">\n                <select\n                  className=\"gf-form-input\"\n                  value={this.getSelectedDataSourceValue()}\n                  onChange={this.onDataSourceChange}\n                  required\n                  aria-label={\n                    selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsDataSourceSelect\n                  }\n                >\n                  {this.props.editor.extended?.dataSources.length &&\n                    this.props.editor.extended?.dataSources.map(ds => (\n                      <option key={ds.value ?? ''} value={ds.value ?? ''} label={ds.name}>\n                        {ds.name}\n                      </option>\n                    ))}\n                </select>\n              </div>\n            </div>\n\n            <div className=\"gf-form max-width-22\">\n              <InlineFormLabel width={10} tooltip={'When to update the values of this variable.'}>\n                Refresh\n              </InlineFormLabel>\n              <div className=\"gf-form-select-wrapper width-15\">\n                <select\n                  className=\"gf-form-input\"\n                  value={this.props.variable.refresh}\n                  onChange={this.onRefreshChange}\n                  aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRefreshSelect}\n                >\n                  <option label=\"Never\" value={VariableRefresh.never}>\n                    Never\n                  </option>\n                  <option label=\"On Dashboard Load\" value={VariableRefresh.onDashboardLoad}>\n                    On Dashboard Load\n                  </option>\n                  <option label=\"On Time Range Change\" value={VariableRefresh.onTimeRangeChanged}>\n                    On Time Range Change\n                  </option>\n                </select>\n              </div>\n            </div>\n          </div>\n\n          {VariableQueryEditor && this.props.editor.extended?.dataSource && (\n            <VariableQueryEditor\n              datasource={this.props.editor.extended?.dataSource}\n              query={this.props.variable.query}\n              templateSrv={templateSrv}\n              onChange={this.onQueryChange}\n            />\n          )}\n\n          <div className=\"gf-form\">\n            <InlineFormLabel\n              width={10}\n              tooltip={'Optional, if you want to extract part of a series name or metric node segment.'}\n            >\n              Regex\n            </InlineFormLabel>\n            <input\n              type=\"text\"\n              className=\"gf-form-input\"\n              placeholder=\"/.*-(.*)-.*/\"\n              value={this.state.regex ?? this.props.variable.regex}\n              onChange={this.onRegExChange}\n              onBlur={this.onRegExBlur}\n              aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRegExInput}\n            />\n          </div>\n          <div className=\"gf-form max-width-21\">\n            <InlineFormLabel width={10} tooltip={'How to sort the values of this variable.'}>\n              Sort\n            </InlineFormLabel>\n            <div className=\"gf-form-select-wrapper max-width-14\">\n              <select\n                className=\"gf-form-input\"\n                value={this.props.variable.sort}\n                onChange={this.onSortChange}\n                aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsSortSelect}\n              >\n                <option label=\"Disabled\" value={VariableSort.disabled}>\n                  Disabled\n                </option>\n                <option label=\"Alphabetical (asc)\" value={VariableSort.alphabeticalAsc}>\n                  Alphabetical (asc)\n                </option>\n                <option label=\"Alphabetical (desc)\" value={VariableSort.alphabeticalDesc}>\n                  Alphabetical (desc)\n                </option>\n                <option label=\"Numerical (asc)\" value={VariableSort.numericalAsc}>\n                  Numerical (asc)\n                </option>\n                <option label=\"Numerical (desc)\" value={VariableSort.numericalDesc}>\n                  Numerical (desc)\n                </option>\n                <option\n                  label=\"Alphabetical (case-insensitive, asc)\"\n                  value={VariableSort.alphabeticalCaseInsensitiveAsc}\n                >\n                  Alphabetical (case-insensitive, asc)\n                </option>\n                <option\n                  label=\"Alphabetical (case-insensitive, desc)\"\n                  value={VariableSort.alphabeticalCaseInsensitiveDesc}\n                >\n                  Alphabetical (case-insensitive, desc)\n                </option>\n              </select>\n            </div>\n          </div>\n        </div>\n\n        <SelectionOptionsEditor\n          variable={this.props.variable}\n          onPropChange={this.onSelectionOptionsChange}\n          onMultiChanged={this.props.changeVariableMultiValue}\n        />\n\n        <div className=\"gf-form-group\">\n          <h5>Value groups/tags (Experimental feature)</h5>\n          <div\n            aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.valueGroupsTagsEnabledSwitch}\n          >\n            <Switch\n              label=\"Enabled\"\n              label-class=\"width-10\"\n              checked={this.props.variable.useTags}\n              onChange={this.onUseTagsChange}\n            />\n          </div>\n          {this.props.variable.useTags && (\n            <>\n              <div className=\"gf-form last\">\n                <span className=\"gf-form-label width-10\">Tags query</span>\n                <input\n                  type=\"text\"\n                  className=\"gf-form-input\"\n                  value={this.state.tagsQuery ?? this.props.variable.tagsQuery}\n                  placeholder=\"metric name or tags query\"\n                  onChange={this.onTagsQueryChange}\n                  onBlur={this.onTagsQueryBlur}\n                  aria-label={\n                    selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.valueGroupsTagsTagsQueryInput\n                  }\n                />\n              </div>\n              <div className=\"gf-form\">\n                <li className=\"gf-form-label width-10\">Tag values query</li>\n                <input\n                  type=\"text\"\n                  className=\"gf-form-input\"\n                  value={this.state.tagValuesQuery ?? this.props.variable.tagValuesQuery}\n                  placeholder=\"apps.$tag.*\"\n                  onChange={this.onTagValuesQueryChange}\n                  onBlur={this.onTagValuesQueryBlur}\n                  aria-label={\n                    selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.valueGroupsTagsTagsValuesQueryInput\n                  }\n                />\n              </div>\n            </>\n          )}\n        </div>\n      </>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({\n  editor: state.templating.editor as VariableEditorState<QueryVariableEditorState>,\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  initQueryVariableEditor,\n  changeQueryVariableDataSource,\n  changeQueryVariableQuery,\n  changeVariableMultiValue,\n};\n\nexport const QueryVariableEditor = connectWithStore(\n  QueryVariableEditorUnConnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import cloneDeep from 'lodash/cloneDeep';\n\nimport { QueryVariableModel, VariableRefresh } from '../../templating/types';\nimport { initialQueryVariableModelState, queryVariableReducer } from './reducer';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { OptionsPicker } from '../pickers';\nimport { QueryVariableEditor } from './QueryVariableEditor';\nimport { updateQueryVariableOptions } from './actions';\nimport { ALL_VARIABLE_TEXT, toVariableIdentifier } from '../state/types';\nimport { containsVariable } from '../../templating/utils';\n\nexport const createQueryVariableAdapter = (): VariableAdapter<QueryVariableModel> => {\n  return {\n    id: 'query',\n    description: 'Variable values are fetched from a datasource query',\n    name: 'Query',\n    initialState: initialQueryVariableModelState,\n    reducer: queryVariableReducer,\n    picker: OptionsPicker,\n    editor: QueryVariableEditor,\n    dependsOn: (variable, variableToTest) => {\n      return containsVariable(variable.query, variable.datasource, variable.regex, variableToTest.name);\n    },\n    setValue: async (variable, option, emitChanges = false) => {\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable, searchFilter) => {\n      await dispatch(updateQueryVariableOptions(toVariableIdentifier(variable), searchFilter));\n    },\n    getSaveModel: variable => {\n      const { index, id, initLock, global, queryValue, ...rest } = cloneDeep(variable);\n      // remove options\n      if (variable.refresh !== VariableRefresh.never) {\n        return { ...rest, options: [] };\n      }\n\n      return rest;\n    },\n    getValueForUrl: variable => {\n      if (variable.current.text === ALL_VARIABLE_TEXT) {\n        return ALL_VARIABLE_TEXT;\n      }\n      return variable.current.value;\n    },\n  };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { CustomVariableModel, VariableHide, VariableOption } from '../../templating/types';\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  getInstanceState,\n  NEW_VARIABLE_ID,\n  VariablePayload,\n} from '../state/types';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\n\nexport const initialCustomVariableModelState: CustomVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  multi: false,\n  includeAll: false,\n  allValue: null,\n  query: '',\n  options: [],\n  current: {} as VariableOption,\n  name: '',\n  type: 'custom',\n  label: null,\n  hide: VariableHide.dontHide,\n  skipUrlSync: false,\n  index: -1,\n  initLock: null,\n};\n\nexport const customVariableSlice = createSlice({\n  name: 'templating/custom',\n  initialState: initialVariablesState,\n  reducers: {\n    createCustomOptionsFromQuery: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState<CustomVariableModel>(state, action.payload.id);\n      const { includeAll, query } = instanceState;\n      const match = query.match(/(?:\\\\,|[^,])+/g) ?? [];\n\n      const options = match.map(text => {\n        text = text.replace(/\\\\,/g, ',');\n        return { text: text.trim(), value: text.trim(), selected: false };\n      });\n\n      if (includeAll) {\n        options.unshift({ text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false });\n      }\n\n      instanceState.options = options;\n    },\n  },\n});\n\nexport const customVariableReducer = customVariableSlice.reducer;\n\nexport const { createCustomOptionsFromQuery } = customVariableSlice.actions;\n","import React, { ChangeEvent, FocusEvent, PureComponent } from 'react';\nimport { CustomVariableModel, VariableWithMultiSupport } from '../../templating/types';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from 'app/types';\nimport { changeVariableMultiValue } from '../state/actions';\n\ninterface OwnProps extends VariableEditorProps<CustomVariableModel> {}\n\ninterface ConnectedProps {}\n\ninterface DispatchProps {\n  changeVariableMultiValue: typeof changeVariableMultiValue;\n}\n\nexport type Props = OwnProps & ConnectedProps & DispatchProps;\n\nclass CustomVariableEditorUnconnected extends PureComponent<Props> {\n  onChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'query',\n      propValue: event.target.value,\n    });\n  };\n\n  onSelectionOptionsChange = async ({ propName, propValue }: OnPropChangeArguments<VariableWithMultiSupport>) => {\n    this.props.onPropChange({ propName, propValue, updateOptions: true });\n  };\n\n  onBlur = (event: FocusEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'query',\n      propValue: event.target.value,\n      updateOptions: true,\n    });\n  };\n\n  render() {\n    return (\n      <>\n        <div className=\"gf-form-group\">\n          <h5 className=\"section-heading\">Custom Options</h5>\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label width-14\">Values separated by comma</span>\n            <input\n              type=\"text\"\n              className=\"gf-form-input\"\n              value={this.props.variable.query}\n              onChange={this.onChange}\n              onBlur={this.onBlur}\n              placeholder=\"1, 10, 20, myvalue, escaped\\,value\"\n              required\n              aria-label=\"Variable editor Form Custom Query field\"\n            />\n          </div>\n        </div>\n        <SelectionOptionsEditor\n          variable={this.props.variable}\n          onPropChange={this.onSelectionOptionsChange}\n          onMultiChanged={this.props.changeVariableMultiValue}\n        />\n      </>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  changeVariableMultiValue,\n};\n\nexport const CustomVariableEditor = connectWithStore(\n  CustomVariableEditorUnconnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import { validateVariableSelectionState } from '../state/actions';\nimport { ThunkResult } from 'app/types';\nimport { createCustomOptionsFromQuery } from './reducer';\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\n\nexport const updateCustomVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async dispatch => {\n    await dispatch(createCustomOptionsFromQuery(toVariablePayload(identifier)));\n    await dispatch(validateVariableSelectionState(identifier));\n  };\n};\n","import cloneDeep from 'lodash/cloneDeep';\nimport { CustomVariableModel } from '../../templating/types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { customVariableReducer, initialCustomVariableModelState } from './reducer';\nimport { OptionsPicker } from '../pickers';\nimport { CustomVariableEditor } from './CustomVariableEditor';\nimport { updateCustomVariableOptions } from './actions';\nimport { ALL_VARIABLE_TEXT, toVariableIdentifier } from '../state/types';\n\nexport const createCustomVariableAdapter = (): VariableAdapter<CustomVariableModel> => {\n  return {\n    id: 'custom',\n    description: 'Define variable values manually',\n    name: 'Custom',\n    initialState: initialCustomVariableModelState,\n    reducer: customVariableReducer,\n    picker: OptionsPicker,\n    editor: CustomVariableEditor,\n    dependsOn: () => {\n      return false;\n    },\n    setValue: async (variable, option, emitChanges = false) => {\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async variable => {\n      await dispatch(updateCustomVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: variable => {\n      const { index, id, initLock, global, ...rest } = cloneDeep(variable);\n      return rest;\n    },\n    getValueForUrl: variable => {\n      if (variable.current.text === ALL_VARIABLE_TEXT) {\n        return ALL_VARIABLE_TEXT;\n      }\n      return variable.current.value;\n    },\n  };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { TextBoxVariableModel, VariableHide, VariableOption } from '../../templating/types';\nimport { getInstanceState, NEW_VARIABLE_ID, VariablePayload } from '../state/types';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\n\nexport const initialTextBoxVariableModelState: TextBoxVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  index: -1,\n  type: 'textbox',\n  name: '',\n  label: '',\n  hide: VariableHide.dontHide,\n  query: '',\n  current: {} as VariableOption,\n  options: [],\n  skipUrlSync: false,\n  initLock: null,\n};\n\nexport const textBoxVariableSlice = createSlice({\n  name: 'templating/textbox',\n  initialState: initialVariablesState,\n  reducers: {\n    createTextBoxOptions: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState<TextBoxVariableModel>(state, action.payload.id!);\n      const option = { text: instanceState.query.trim(), value: instanceState.query.trim(), selected: false };\n      instanceState.options = [option];\n      instanceState.current = option;\n    },\n  },\n});\n\nexport const textBoxVariableReducer = textBoxVariableSlice.reducer;\n\nexport const { createTextBoxOptions } = textBoxVariableSlice.actions;\n","import React, { ChangeEvent, FocusEvent, KeyboardEvent, PureComponent } from 'react';\n\nimport { TextBoxVariableModel } from '../../templating/types';\nimport { toVariablePayload } from '../state/types';\nimport { dispatch } from '../../../store/store';\nimport { variableAdapters } from '../adapters';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { VariablePickerProps } from '../pickers/types';\n\nexport interface Props extends VariablePickerProps<TextBoxVariableModel> {}\n\nexport class TextBoxVariablePicker extends PureComponent<Props> {\n  onQueryChange = (event: ChangeEvent<HTMLInputElement>) => {\n    dispatch(\n      changeVariableProp(toVariablePayload(this.props.variable, { propName: 'query', propValue: event.target.value }))\n    );\n  };\n\n  onQueryBlur = (event: FocusEvent<HTMLInputElement>) => {\n    if (this.props.variable.current.value !== this.props.variable.query) {\n      variableAdapters.get(this.props.variable.type).updateOptions(this.props.variable);\n    }\n  };\n\n  onQueryKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n    if (event.keyCode === 13 && this.props.variable.current.value !== this.props.variable.query) {\n      variableAdapters.get(this.props.variable.type).updateOptions(this.props.variable);\n    }\n  };\n\n  render() {\n    return (\n      <input\n        type=\"text\"\n        value={this.props.variable.query}\n        className=\"gf-form-input width-12\"\n        onChange={this.onQueryChange}\n        onBlur={this.onQueryBlur}\n        onKeyDown={this.onQueryKeyDown}\n      />\n    );\n  }\n}\n","import React, { ChangeEvent, PureComponent } from 'react';\nimport { TextBoxVariableModel } from '../../templating/types';\nimport { VariableEditorProps } from '../editor/types';\n\nexport interface Props extends VariableEditorProps<TextBoxVariableModel> {}\nexport class TextBoxVariableEditor extends PureComponent<Props> {\n  onQueryChange = (event: ChangeEvent<HTMLInputElement>) => {\n    event.preventDefault();\n    this.props.onPropChange({ propName: 'query', propValue: event.target.value, updateOptions: false });\n  };\n  onQueryBlur = (event: ChangeEvent<HTMLInputElement>) => {\n    event.preventDefault();\n    this.props.onPropChange({ propName: 'query', propValue: event.target.value, updateOptions: true });\n  };\n  render() {\n    const { query } = this.props.variable;\n    return (\n      <div className=\"gf-form-group\">\n        <h5 className=\"section-heading\">Text options</h5>\n        <div className=\"gf-form\">\n          <span className=\"gf-form-label\">Default value</span>\n          <input\n            type=\"text\"\n            className=\"gf-form-input\"\n            value={query}\n            onChange={this.onQueryChange}\n            onBlur={this.onQueryBlur}\n            placeholder=\"default value, if any\"\n          />\n        </div>\n      </div>\n    );\n  }\n}\n","import { TextBoxVariableModel } from '../../templating/types';\nimport { ThunkResult } from '../../../types';\nimport { getVariable } from '../state/selectors';\nimport { variableAdapters } from '../adapters';\nimport { createTextBoxOptions } from './reducer';\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { setOptionFromUrl } from '../state/actions';\nimport { UrlQueryValue } from '@grafana/data';\nimport { changeVariableProp } from '../state/sharedReducer';\n\nexport const updateTextBoxVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    await dispatch(createTextBoxOptions(toVariablePayload(identifier)));\n\n    const variableInState = getVariable<TextBoxVariableModel>(identifier.id!, getState());\n    await variableAdapters.get(identifier.type).setValue(variableInState, variableInState.options[0], true);\n  };\n};\n\nexport const setTextBoxVariableOptionsFromUrl = (\n  identifier: VariableIdentifier,\n  urlValue: UrlQueryValue\n): ThunkResult<void> => async (dispatch, getState) => {\n  const variableInState = getVariable<TextBoxVariableModel>(identifier.id!, getState());\n\n  dispatch(changeVariableProp(toVariablePayload(variableInState, { propName: 'query', propValue: urlValue })));\n\n  await dispatch(setOptionFromUrl(toVariableIdentifier(variableInState), urlValue));\n};\n","import cloneDeep from 'lodash/cloneDeep';\n\nimport { TextBoxVariableModel } from '../../templating/types';\nimport { initialTextBoxVariableModelState, textBoxVariableReducer } from './reducer';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { TextBoxVariablePicker } from './TextBoxVariablePicker';\nimport { TextBoxVariableEditor } from './TextBoxVariableEditor';\nimport { setTextBoxVariableOptionsFromUrl, updateTextBoxVariableOptions } from './actions';\nimport { toVariableIdentifier } from '../state/types';\n\nexport const createTextBoxVariableAdapter = (): VariableAdapter<TextBoxVariableModel> => {\n  return {\n    id: 'textbox',\n    description: 'Define a textbox variable, where users can enter any arbitrary string',\n    name: 'Text box',\n    initialState: initialTextBoxVariableModelState,\n    reducer: textBoxVariableReducer,\n    picker: TextBoxVariablePicker,\n    editor: TextBoxVariableEditor,\n    dependsOn: (variable, variableToTest) => {\n      return false;\n    },\n    setValue: async (variable, option, emitChanges = false) => {\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setTextBoxVariableOptionsFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async variable => {\n      await dispatch(updateTextBoxVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: variable => {\n      const { index, id, initLock, global, ...rest } = cloneDeep(variable);\n      return rest;\n    },\n    getValueForUrl: variable => {\n      return variable.current.value;\n    },\n  };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { ConstantVariableModel, VariableHide, VariableOption } from '../../templating/types';\nimport { getInstanceState, NEW_VARIABLE_ID, VariablePayload } from '../state/types';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\n\nexport const initialConstantVariableModelState: ConstantVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  type: 'constant',\n  name: '',\n  hide: VariableHide.hideVariable,\n  label: '',\n  query: '',\n  current: {} as VariableOption,\n  options: [],\n  skipUrlSync: false,\n  index: -1,\n  initLock: null,\n};\n\nexport const constantVariableSlice = createSlice({\n  name: 'templating/constant',\n  initialState: initialVariablesState,\n  reducers: {\n    createConstantOptionsFromQuery: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState<ConstantVariableModel>(state, action.payload.id);\n      instanceState.options = [\n        { text: instanceState.query.trim(), value: instanceState.query.trim(), selected: false },\n      ];\n    },\n  },\n});\n\nexport const constantVariableReducer = constantVariableSlice.reducer;\n\nexport const { createConstantOptionsFromQuery } = constantVariableSlice.actions;\n","import React, { ChangeEvent, FocusEvent, PureComponent } from 'react';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { ConstantVariableModel } from '../../templating/types';\nimport { VariableEditorProps } from '../editor/types';\n\nexport interface Props extends VariableEditorProps<ConstantVariableModel> {}\n\nexport class ConstantVariableEditor extends PureComponent<Props> {\n  onChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'query',\n      propValue: event.target.value,\n    });\n  };\n\n  onBlur = (event: FocusEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'query',\n      propValue: event.target.value,\n      updateOptions: true,\n    });\n  };\n\n  render() {\n    return (\n      <>\n        <div className=\"gf-form-group\">\n          <h5 className=\"section-heading\">Constant options</h5>\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label\">Value</span>\n            <input\n              type=\"text\"\n              className=\"gf-form-input\"\n              value={this.props.variable.query}\n              onChange={this.onChange}\n              onBlur={this.onBlur}\n              placeholder=\"your metric prefix\"\n              aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.ConstantVariable.constantOptionsQueryInput}\n            />\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n","import { validateVariableSelectionState } from '../state/actions';\nimport { ThunkResult } from 'app/types';\nimport { createConstantOptionsFromQuery } from './reducer';\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\n\nexport const updateConstantVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async dispatch => {\n    await dispatch(createConstantOptionsFromQuery(toVariablePayload(identifier)));\n    await dispatch(validateVariableSelectionState(identifier));\n  };\n};\n","import cloneDeep from 'lodash/cloneDeep';\nimport { ConstantVariableModel } from '../../templating/types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { constantVariableReducer, initialConstantVariableModelState } from './reducer';\nimport { OptionsPicker } from '../pickers';\nimport { ConstantVariableEditor } from './ConstantVariableEditor';\nimport { updateConstantVariableOptions } from './actions';\nimport { toVariableIdentifier } from '../state/types';\n\nexport const createConstantVariableAdapter = (): VariableAdapter<ConstantVariableModel> => {\n  return {\n    id: 'constant',\n    description: 'Define a hidden constant variable, useful for metric prefixes in dashboards you want to share',\n    name: 'Constant',\n    initialState: initialConstantVariableModelState,\n    reducer: constantVariableReducer,\n    picker: OptionsPicker,\n    editor: ConstantVariableEditor,\n    dependsOn: () => {\n      return false;\n    },\n    setValue: async (variable, option, emitChanges = false) => {\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async variable => {\n      await dispatch(updateConstantVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: variable => {\n      const { index, id, initLock, global, ...rest } = cloneDeep(variable);\n      return rest;\n    },\n    getValueForUrl: variable => {\n      return variable.current.value;\n    },\n  };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { DataSourceVariableModel, VariableHide, VariableOption, VariableRefresh } from '../../templating/types';\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  getInstanceState,\n  NEW_VARIABLE_ID,\n  VariablePayload,\n} from '../state/types';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\nimport { DataSourceSelectItem } from '@grafana/data';\n\nexport interface DataSourceVariableEditorState {\n  dataSourceTypes: Array<{ text: string; value: string }>;\n}\n\nexport const initialDataSourceVariableModelState: DataSourceVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  type: 'datasource',\n  name: '',\n  hide: VariableHide.dontHide,\n  label: '',\n  current: {} as VariableOption,\n  regex: '',\n  options: [],\n  query: '',\n  multi: false,\n  includeAll: false,\n  refresh: VariableRefresh.onDashboardLoad,\n  skipUrlSync: false,\n  index: -1,\n  initLock: null,\n};\n\nexport const dataSourceVariableSlice = createSlice({\n  name: 'templating/datasource',\n  initialState: initialVariablesState,\n  reducers: {\n    createDataSourceOptions: (\n      state: VariablesState,\n      action: PayloadAction<VariablePayload<{ sources: DataSourceSelectItem[]; regex: RegExp | undefined }>>\n    ) => {\n      const { sources, regex } = action.payload.data;\n      const options: VariableOption[] = [];\n      const instanceState = getInstanceState<DataSourceVariableModel>(state, action.payload.id);\n      for (let i = 0; i < sources.length; i++) {\n        const source = sources[i];\n        // must match on type\n        if (source.meta.id !== instanceState.query) {\n          continue;\n        }\n\n        if (regex && !regex.exec(source.name)) {\n          continue;\n        }\n\n        options.push({ text: source.name, value: source.name, selected: false });\n      }\n\n      if (options.length === 0) {\n        options.push({ text: 'No data sources found', value: '', selected: false });\n      }\n\n      if (instanceState.includeAll) {\n        options.unshift({ text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false });\n      }\n\n      instanceState.options = options;\n    },\n  },\n});\n\nexport const dataSourceVariableReducer = dataSourceVariableSlice.reducer;\nexport const { createDataSourceOptions } = dataSourceVariableSlice.actions;\n","import { toVariablePayload, VariableIdentifier } from '../state/types';\nimport { ThunkResult } from '../../../types';\nimport { createDataSourceOptions } from './reducer';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { DataSourceSelectItem, stringToJsRegex } from '@grafana/data';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { getVariable } from '../state/selectors';\nimport { DataSourceVariableModel } from '../../templating/types';\nimport templateSrv from '../../templating/template_srv';\nimport _ from 'lodash';\nimport { changeVariableEditorExtended } from '../editor/reducer';\n\nexport interface DataSourceVariableActionDependencies {\n  getDatasourceSrv: typeof getDatasourceSrv;\n}\n\nexport const updateDataSourceVariableOptions = (\n  identifier: VariableIdentifier,\n  dependencies: DataSourceVariableActionDependencies = { getDatasourceSrv: getDatasourceSrv }\n): ThunkResult<void> => async (dispatch, getState) => {\n  const sources = await dependencies.getDatasourceSrv().getMetricSources({ skipVariables: true });\n  const variableInState = getVariable<DataSourceVariableModel>(identifier.id!, getState());\n  let regex;\n\n  if (variableInState.regex) {\n    regex = templateSrv.replace(variableInState.regex, undefined, 'regex');\n    regex = stringToJsRegex(regex);\n  }\n\n  await dispatch(createDataSourceOptions(toVariablePayload(identifier, { sources, regex })));\n  await dispatch(validateVariableSelectionState(identifier));\n};\n\nexport const initDataSourceVariableEditor = (\n  dependencies: DataSourceVariableActionDependencies = { getDatasourceSrv: getDatasourceSrv }\n): ThunkResult<void> => async dispatch => {\n  const dataSources: DataSourceSelectItem[] = await dependencies.getDatasourceSrv().getMetricSources();\n  const filtered = dataSources.filter(ds => !ds.meta.mixed && ds.value !== null);\n  const dataSourceTypes = _(filtered)\n    .uniqBy('meta.id')\n    .map((ds: any) => {\n      return { text: ds.meta.name, value: ds.meta.id };\n    })\n    .value();\n\n  dataSourceTypes.unshift({ text: '', value: '' });\n\n  dispatch(\n    changeVariableEditorExtended({\n      propName: 'dataSourceTypes',\n      propValue: dataSourceTypes,\n    })\n  );\n};\n","import React, { ChangeEvent, FocusEvent, PureComponent } from 'react';\n\nimport { DataSourceVariableModel, VariableWithMultiSupport } from '../../templating/types';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { InlineFormLabel } from '@grafana/ui';\nimport { VariableEditorState } from '../editor/reducer';\nimport { DataSourceVariableEditorState } from './reducer';\nimport { initDataSourceVariableEditor } from './actions';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from '../../../types';\nimport { connectWithStore } from '../../../core/utils/connectWithReduxStore';\nimport { changeVariableMultiValue } from '../state/actions';\n\nexport interface OwnProps extends VariableEditorProps<DataSourceVariableModel> {}\n\ninterface ConnectedProps {\n  editor: VariableEditorState<DataSourceVariableEditorState>;\n}\n\ninterface DispatchProps {\n  initDataSourceVariableEditor: typeof initDataSourceVariableEditor;\n  changeVariableMultiValue: typeof changeVariableMultiValue;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport class DataSourceVariableEditorUnConnected extends PureComponent<Props> {\n  async componentDidMount() {\n    await this.props.initDataSourceVariableEditor();\n  }\n\n  onRegExChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'regex',\n      propValue: event.target.value,\n    });\n  };\n\n  onRegExBlur = (event: FocusEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'regex',\n      propValue: event.target.value,\n      updateOptions: true,\n    });\n  };\n\n  onSelectionOptionsChange = async ({ propValue, propName }: OnPropChangeArguments<VariableWithMultiSupport>) => {\n    this.props.onPropChange({ propName, propValue, updateOptions: true });\n  };\n\n  getSelectedDataSourceTypeValue = (): string => {\n    if (!this.props.editor.extended?.dataSourceTypes?.length) {\n      return '';\n    }\n    const foundItem = this.props.editor.extended?.dataSourceTypes.find(ds => ds.value === this.props.variable.query);\n    const value = foundItem ? foundItem.value : this.props.editor.extended?.dataSourceTypes[0].value;\n    return value ?? '';\n  };\n\n  onDataSourceTypeChanged = (event: ChangeEvent<HTMLSelectElement>) => {\n    this.props.onPropChange({ propName: 'query', propValue: event.target.value, updateOptions: true });\n  };\n\n  render() {\n    return (\n      <>\n        <div className=\"gf-form-group\">\n          <h5 className=\"section-heading\">Data source options</h5>\n\n          <div className=\"gf-form\">\n            <label className=\"gf-form-label width-12\">Type</label>\n            <div className=\"gf-form-select-wrapper max-width-18\">\n              <select\n                className=\"gf-form-input\"\n                value={this.getSelectedDataSourceTypeValue()}\n                onChange={this.onDataSourceTypeChanged}\n              >\n                {this.props.editor.extended?.dataSourceTypes?.length &&\n                  this.props.editor.extended?.dataSourceTypes?.map(ds => (\n                    <option key={ds.value ?? ''} value={ds.value ?? ''} label={ds.text}>\n                      {ds.text}\n                    </option>\n                  ))}\n              </select>\n            </div>\n          </div>\n\n          <div className=\"gf-form\">\n            <InlineFormLabel\n              width={12}\n              tooltip={\n                <div>\n                  Regex filter for which data source instances to choose from in the variable value dropdown. Leave\n                  empty for all.\n                  <br />\n                  <br />\n                  Example: <code>/^prod/</code>\n                </div>\n              }\n            >\n              Instance name filter\n            </InlineFormLabel>\n            <input\n              type=\"text\"\n              className=\"gf-form-input max-width-18\"\n              placeholder=\"/.*-(.*)-.*/\"\n              value={this.props.variable.regex}\n              onChange={this.onRegExChange}\n              onBlur={this.onRegExBlur}\n            />\n          </div>\n        </div>\n\n        <SelectionOptionsEditor\n          variable={this.props.variable}\n          onPropChange={this.onSelectionOptionsChange}\n          onMultiChanged={this.props.changeVariableMultiValue}\n        />\n      </>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({\n  editor: state.templating.editor as VariableEditorState<DataSourceVariableEditorState>,\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  initDataSourceVariableEditor,\n  changeVariableMultiValue,\n};\n\nexport const DataSourceVariableEditor = connectWithStore(\n  DataSourceVariableEditorUnConnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import cloneDeep from 'lodash/cloneDeep';\nimport { DataSourceVariableModel } from '../../templating/types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { dataSourceVariableReducer, initialDataSourceVariableModelState } from './reducer';\nimport { OptionsPicker } from '../pickers';\nimport { ALL_VARIABLE_TEXT, toVariableIdentifier } from '../state/types';\nimport { DataSourceVariableEditor } from './DataSourceVariableEditor';\nimport { updateDataSourceVariableOptions } from './actions';\nimport { containsVariable } from '../../templating/utils';\n\nexport const createDataSourceVariableAdapter = (): VariableAdapter<DataSourceVariableModel> => {\n  return {\n    id: 'datasource',\n    description: 'Enabled you to dynamically switch the datasource for multiple panels',\n    name: 'Datasource',\n    initialState: initialDataSourceVariableModelState,\n    reducer: dataSourceVariableReducer,\n    picker: OptionsPicker,\n    editor: DataSourceVariableEditor,\n    dependsOn: (variable, variableToTest) => {\n      if (variable.regex) {\n        return containsVariable(variable.regex, variableToTest.name);\n      }\n      return false;\n    },\n    setValue: async (variable, option, emitChanges = false) => {\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async variable => {\n      await dispatch(updateDataSourceVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: variable => {\n      const { index, id, initLock, global, ...rest } = cloneDeep(variable);\n      return { ...rest, options: [] };\n    },\n    getValueForUrl: variable => {\n      if (variable.current.text === ALL_VARIABLE_TEXT) {\n        return ALL_VARIABLE_TEXT;\n      }\n      return variable.current.value;\n    },\n  };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { IntervalVariableModel, VariableHide, VariableOption, VariableRefresh } from '../../templating/types';\nimport { getInstanceState, NEW_VARIABLE_ID, VariablePayload } from '../state/types';\nimport { initialVariablesState, VariablesState } from '../state/variablesReducer';\nimport _ from 'lodash';\n\nexport const initialIntervalVariableModelState: IntervalVariableModel = {\n  id: NEW_VARIABLE_ID,\n  global: false,\n  type: 'interval',\n  name: '',\n  label: '',\n  hide: VariableHide.dontHide,\n  skipUrlSync: false,\n  auto_count: 30,\n  auto_min: '10s',\n  options: [],\n  auto: false,\n  query: '1m,10m,30m,1h,6h,12h,1d,7d,14d,30d',\n  refresh: VariableRefresh.onTimeRangeChanged,\n  current: {} as VariableOption,\n  index: -1,\n  initLock: null,\n};\n\nexport const intervalVariableSlice = createSlice({\n  name: 'templating/interval',\n  initialState: initialVariablesState,\n  reducers: {\n    createIntervalOptions: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState<IntervalVariableModel>(state, action.payload.id!);\n      const options: VariableOption[] = _.map(instanceState.query.match(/([\"'])(.*?)\\1|\\w+/g), text => {\n        text = text.replace(/[\"']+/g, '');\n        return { text: text.trim(), value: text.trim(), selected: false };\n      });\n\n      if (instanceState.auto) {\n        // add auto option if missing\n        if (options.length && options[0].text !== 'auto') {\n          options.unshift({\n            text: 'auto',\n            value: '$__auto_interval_' + instanceState.name,\n            selected: false,\n          });\n        }\n      }\n\n      instanceState.options = options;\n    },\n  },\n});\n\nexport const intervalVariableReducer = intervalVariableSlice.reducer;\n\nexport const { createIntervalOptions } = intervalVariableSlice.actions;\n","import React, { ChangeEvent, FocusEvent, PureComponent } from 'react';\n\nimport { IntervalVariableModel } from '../../templating/types';\nimport { VariableEditorProps } from '../editor/types';\nimport { InlineFormLabel, LegacyForms } from '@grafana/ui';\nconst { Switch } = LegacyForms;\n\nexport interface Props extends VariableEditorProps<IntervalVariableModel> {}\n\nexport class IntervalVariableEditor extends PureComponent<Props> {\n  onAutoChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'auto',\n      propValue: event.target.checked,\n      updateOptions: true,\n    });\n  };\n\n  onQueryChanged = (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'query',\n      propValue: event.target.value,\n    });\n  };\n\n  onQueryBlur = (event: FocusEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'query',\n      propValue: event.target.value,\n      updateOptions: true,\n    });\n  };\n\n  onAutoCountChanged = (event: ChangeEvent<HTMLSelectElement>) => {\n    this.props.onPropChange({\n      propName: 'auto_count',\n      propValue: event.target.value,\n      updateOptions: true,\n    });\n  };\n\n  onAutoMinChanged = (event: ChangeEvent<HTMLInputElement>) => {\n    this.props.onPropChange({\n      propName: 'auto_min',\n      propValue: event.target.value,\n      updateOptions: true,\n    });\n  };\n\n  render() {\n    return (\n      <>\n        <div className=\"gf-form-group\">\n          <h5 className=\"section-heading\">Interval Options</h5>\n\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label width-9\">Values</span>\n            <input\n              type=\"text\"\n              className=\"gf-form-input\"\n              value={this.props.variable.query}\n              placeholder=\"1m,10m,1h,6h,1d,7d\"\n              onChange={this.onQueryChanged}\n              onBlur={this.onQueryBlur}\n              required\n            />\n          </div>\n\n          <div className=\"gf-form-inline\">\n            <Switch\n              label=\"Auto Option\"\n              labelClass=\"width-9\"\n              checked={this.props.variable.auto}\n              onChange={this.onAutoChange}\n              tooltip={'Enables multiple values to be selected at the same time'}\n            />\n\n            {this.props.variable.auto && (\n              <>\n                <div className=\"gf-form\">\n                  <InlineFormLabel\n                    width={9}\n                    tooltip={'How many times should the current time range be divided to calculate the value'}\n                  >\n                    Step count\n                  </InlineFormLabel>\n                  <div className=\"gf-form-select-wrapper max-width-10\">\n                    <select\n                      className=\"gf-form-input\"\n                      value={this.props.variable.auto_count}\n                      onChange={this.onAutoCountChanged}\n                    >\n                      {[1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 100, 200, 300, 400, 500].map(count => (\n                        <option key={`auto_count_key-${count}`} label={`${count}`}>\n                          {count}\n                        </option>\n                      ))}\n                    </select>\n                  </div>\n                </div>\n                <div className=\"gf-form\">\n                  <InlineFormLabel width={9} tooltip={'The calculated value will not go below this threshold'}>\n                    Min interval\n                  </InlineFormLabel>\n                  <input\n                    type=\"text\"\n                    className=\"gf-form-input max-width-10\"\n                    value={this.props.variable.auto_min}\n                    onChange={this.onAutoMinChanged}\n                    placeholder=\"10s\"\n                  />\n                </div>\n              </>\n            )}\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n","import { AppEvents } from '@grafana/data';\n\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\nimport { ThunkResult } from '../../../types';\nimport { createIntervalOptions } from './reducer';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { getVariable } from '../state/selectors';\nimport { IntervalVariableModel } from '../../templating/types';\nimport kbn from '../../../core/utils/kbn';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport templateSrv from '../../templating/template_srv';\nimport appEvents from '../../../core/app_events';\n\nexport interface UpdateIntervalVariableOptionsDependencies {\n  appEvents: typeof appEvents;\n}\n\nexport const updateIntervalVariableOptions = (\n  identifier: VariableIdentifier,\n  dependencies: UpdateIntervalVariableOptionsDependencies = { appEvents: appEvents }\n): ThunkResult<void> => async dispatch => {\n  try {\n    await dispatch(createIntervalOptions(toVariablePayload(identifier)));\n    await dispatch(updateAutoValue(identifier));\n    await dispatch(validateVariableSelectionState(identifier));\n  } catch (error) {\n    dependencies.appEvents.emit(AppEvents.alertError, ['Templating', error.message]);\n  }\n};\n\nexport interface UpdateAutoValueDependencies {\n  kbn: typeof kbn;\n  getTimeSrv: typeof getTimeSrv;\n  templateSrv: typeof templateSrv;\n}\n\nexport const updateAutoValue = (\n  identifier: VariableIdentifier,\n  dependencies: UpdateAutoValueDependencies = {\n    kbn: kbn,\n    getTimeSrv: getTimeSrv,\n    templateSrv: templateSrv,\n  }\n): ThunkResult<void> => (dispatch, getState) => {\n  const variableInState = getVariable<IntervalVariableModel>(identifier.id, getState());\n  if (variableInState.auto) {\n    const res = dependencies.kbn.calculateInterval(\n      dependencies.getTimeSrv().timeRange(),\n      variableInState.auto_count,\n      variableInState.auto_min\n    );\n    dependencies.templateSrv.setGrafanaVariable('$__auto_interval_' + variableInState.name, res.interval);\n    // for backward compatibility, to be removed eventually\n    dependencies.templateSrv.setGrafanaVariable('$__auto_interval', res.interval);\n  }\n};\n","import cloneDeep from 'lodash/cloneDeep';\nimport { IntervalVariableModel } from '../../templating/types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { initialIntervalVariableModelState, intervalVariableReducer } from './reducer';\nimport { OptionsPicker } from '../pickers';\nimport { toVariableIdentifier } from '../state/types';\nimport { IntervalVariableEditor } from './IntervalVariableEditor';\nimport { updateAutoValue, updateIntervalVariableOptions } from './actions';\n\nexport const createIntervalVariableAdapter = (): VariableAdapter<IntervalVariableModel> => {\n  return {\n    id: 'interval',\n    description: 'Define a timespan interval (ex 1m, 1h, 1d)',\n    name: 'Interval',\n    initialState: initialIntervalVariableModelState,\n    reducer: intervalVariableReducer,\n    picker: OptionsPicker,\n    editor: IntervalVariableEditor,\n    dependsOn: () => {\n      return false;\n    },\n    setValue: async (variable, option, emitChanges = false) => {\n      await dispatch(updateAutoValue(toVariableIdentifier(variable)));\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(updateAutoValue(toVariableIdentifier(variable)));\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async variable => {\n      await dispatch(updateIntervalVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: variable => {\n      const { index, id, initLock, global, ...rest } = cloneDeep(variable);\n      return rest;\n    },\n    getValueForUrl: variable => {\n      return variable.current.value;\n    },\n  };\n};\n","import React, { FC } from 'react';\nimport { Segment } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\ninterface Props {\n  value: string;\n  onChange: (item: SelectableValue<string>) => void;\n}\n\nconst options = ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>(value => ({\n  label: value,\n  value,\n}));\n\nexport const OperatorSegment: FC<Props> = ({ value, onChange }) => {\n  return <Segment className=\"query-segment-operator\" value={value} options={options} onChange={onChange} />;\n};\n","import React, { FC, ReactElement, useState } from 'react';\nimport { SegmentAsync, Icon } from '@grafana/ui';\nimport { OperatorSegment } from './OperatorSegment';\nimport { AdHocVariableFilter } from 'app/features/templating/types';\nimport { SelectableValue } from '@grafana/data';\n\ninterface Props {\n  onLoadKeys: () => Promise<Array<SelectableValue<string>>>;\n  onLoadValues: (key: string) => Promise<Array<SelectableValue<string>>>;\n  onCompleted: (filter: AdHocVariableFilter) => void;\n  appendBefore?: React.ReactNode;\n}\n\nexport const AdHocFilterBuilder: FC<Props> = ({ appendBefore, onCompleted, onLoadKeys, onLoadValues }) => {\n  const [key, setKey] = useState<string | null>(null);\n  const [operator, setOperator] = useState<string>('=');\n\n  if (key === null) {\n    return (\n      <div className=\"gf-form\">\n        <SegmentAsync\n          className=\"query-segment-key\"\n          Component={filterAddButton(key)}\n          value={key}\n          onChange={({ value }) => setKey(value ?? '')}\n          loadOptions={onLoadKeys}\n        />\n      </div>\n    );\n  }\n\n  return (\n    <React.Fragment key=\"filter-builder\">\n      {appendBefore}\n      <div className=\"gf-form\">\n        <SegmentAsync\n          className=\"query-segment-key\"\n          value={key}\n          onChange={({ value }) => setKey(value ?? '')}\n          loadOptions={onLoadKeys}\n        />\n      </div>\n      <div className=\"gf-form\">\n        <OperatorSegment value={operator} onChange={({ value }) => setOperator(value ?? '')} />\n      </div>\n      <div className=\"gf-form\">\n        <SegmentAsync\n          className=\"query-segment-value\"\n          placeholder=\"select value\"\n          onChange={({ value }) => {\n            onCompleted({\n              value: value ?? '',\n              operator: operator,\n              condition: '',\n              key: key,\n            });\n            setKey(null);\n            setOperator('=');\n          }}\n          loadOptions={() => onLoadValues(key)}\n        />\n      </div>\n    </React.Fragment>\n  );\n};\n\nfunction filterAddButton(key: string | null): ReactElement | undefined {\n  if (key !== null) {\n    return undefined;\n  }\n\n  return (\n    <a className=\"gf-form-label query-part\">\n      <Icon name=\"plus\" />\n    </a>\n  );\n}\n","import React, { FC } from 'react';\n\ninterface Props {\n  label: string;\n}\n\nexport const ConditionSegment: FC<Props> = ({ label }) => {\n  return (\n    <div className=\"gf-form\">\n      <span className=\"gf-form-label query-keyword\">{label}</span>\n    </div>\n  );\n};\n","import React, { PureComponent, ReactNode } from 'react';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from 'app/types';\nimport { AdHocVariableFilter, AdHocVariableModel } from 'app/features/templating/types';\nimport { SegmentAsync } from '@grafana/ui';\nimport { VariablePickerProps } from '../../pickers/types';\nimport { OperatorSegment } from './OperatorSegment';\nimport { MetricFindValue, SelectableValue } from '@grafana/data';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { ConditionSegment } from './ConditionSegment';\nimport { addFilter, changeFilter, removeFilter } from '../actions';\n\ninterface OwnProps extends VariablePickerProps<AdHocVariableModel> {}\n\ninterface ConnectedProps {}\n\ninterface DispatchProps {\n  addFilter: typeof addFilter;\n  removeFilter: typeof removeFilter;\n  changeFilter: typeof changeFilter;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nconst REMOVE_FILTER_KEY = '-- remove filter --';\nconst REMOVE_VALUE = { label: REMOVE_FILTER_KEY, value: REMOVE_FILTER_KEY };\nexport class AdHocPickerUnconnected extends PureComponent<Props> {\n  onChange = (index: number, prop: string) => (key: SelectableValue<string>) => {\n    const { id, filters } = this.props.variable;\n    const { value } = key;\n\n    if (key.value === REMOVE_FILTER_KEY) {\n      return this.props.removeFilter(id!, index);\n    }\n\n    return this.props.changeFilter(id!, {\n      index,\n      filter: {\n        ...filters[index],\n        [prop]: value,\n      },\n    });\n  };\n\n  appendFilterToVariable = (filter: AdHocVariableFilter) => {\n    const { id } = this.props.variable;\n    this.props.addFilter(id!, filter);\n  };\n\n  fetchFilterKeys = async () => {\n    const { variable } = this.props;\n    const ds = await getDatasourceSrv().get(variable.datasource!);\n\n    if (!ds || !ds.getTagKeys) {\n      return [];\n    }\n\n    const metrics = await ds.getTagKeys();\n    return metrics.map(m => ({ label: m.text, value: m.text }));\n  };\n\n  fetchFilterKeysWithRemove = async () => {\n    const keys = await this.fetchFilterKeys();\n    return [REMOVE_VALUE, ...keys];\n  };\n\n  fetchFilterValues = async (key: string) => {\n    const { variable } = this.props;\n    const ds = await getDatasourceSrv().get(variable.datasource!);\n\n    if (!ds || !ds.getTagValues) {\n      return [];\n    }\n\n    const metrics = await ds.getTagValues({ key });\n    return metrics.map((m: MetricFindValue) => ({ label: m.text, value: m.text }));\n  };\n\n  render() {\n    const { filters } = this.props.variable;\n\n    return (\n      <div className=\"gf-form-inline\">\n        {this.renderFilters(filters)}\n        <AdHocFilterBuilder\n          appendBefore={filters.length > 0 ? <ConditionSegment label=\"AND\" /> : null}\n          onLoadKeys={this.fetchFilterKeys}\n          onLoadValues={this.fetchFilterValues}\n          onCompleted={this.appendFilterToVariable}\n        />\n      </div>\n    );\n  }\n\n  renderFilters(filters: AdHocVariableFilter[]) {\n    return filters.reduce((segments: ReactNode[], filter, index) => {\n      if (segments.length > 0) {\n        segments.push(<ConditionSegment label=\"AND\" />);\n      }\n      segments.push(this.renderFilterSegments(filter, index));\n      return segments;\n    }, []);\n  }\n\n  renderFilterSegments(filter: AdHocVariableFilter, index: number) {\n    return (\n      <React.Fragment key={`filter-${index}`}>\n        <div className=\"gf-form\">\n          <SegmentAsync\n            className=\"query-segment-key\"\n            value={filter.key}\n            onChange={this.onChange(index, 'key')}\n            loadOptions={this.fetchFilterKeysWithRemove}\n          />\n        </div>\n        <div className=\"gf-form\">\n          <OperatorSegment value={filter.operator} onChange={this.onChange(index, 'operator')} />\n        </div>\n        <div className=\"gf-form\">\n          <SegmentAsync\n            className=\"query-segment-value\"\n            value={filter.value}\n            onChange={this.onChange(index, 'value')}\n            loadOptions={() => this.fetchFilterValues(filter.key)}\n          />\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  addFilter,\n  removeFilter,\n  changeFilter,\n};\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = state => ({});\n\nexport const AdHocPicker = connect(mapStateToProps, mapDispatchToProps)(AdHocPickerUnconnected);\nAdHocPicker.displayName = 'AdHocPicker';\n","import React, { PureComponent } from 'react';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\n\nimport { AdHocVariableModel } from '../../templating/types';\nimport { VariableEditorProps } from '../editor/types';\nimport { VariableEditorState } from '../editor/reducer';\nimport { AdHocVariableEditorState } from './reducer';\nimport { changeVariableDatasource, initAdHocVariableEditor } from './actions';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { StoreState } from 'app/types';\n\nexport interface OwnProps extends VariableEditorProps<AdHocVariableModel> {}\n\ninterface ConnectedProps {\n  editor: VariableEditorState<AdHocVariableEditorState>;\n}\n\ninterface DispatchProps {\n  initAdHocVariableEditor: typeof initAdHocVariableEditor;\n  changeVariableDatasource: typeof changeVariableDatasource;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport class AdHocVariableEditorUnConnected extends PureComponent<Props> {\n  componentDidMount() {\n    this.props.initAdHocVariableEditor();\n  }\n\n  onDatasourceChanged = (event: React.ChangeEvent<HTMLSelectElement>) => {\n    this.props.changeVariableDatasource(event.target.value);\n  };\n\n  render() {\n    const { variable, editor } = this.props;\n    const dataSources = editor.extended?.dataSources ?? [];\n    const infoText = editor.extended?.infoText ?? null;\n\n    return (\n      <>\n        <div className=\"gf-form-group\">\n          <h5 className=\"section-heading\">Options</h5>\n          <div className=\"gf-form max-width-21\">\n            <span className=\"gf-form-label width-8\">Data source</span>\n            <div className=\"gf-form-select-wrapper max-width-14\">\n              <select\n                className=\"gf-form-input\"\n                required\n                onChange={this.onDatasourceChanged}\n                value={variable.datasource ?? ''}\n                aria-label=\"Variable editor Form AdHoc DataSource select\"\n              >\n                {dataSources.map(ds => (\n                  <option key={ds.value ?? ''} value={ds.value ?? ''} label={ds.text}>\n                    {ds.text}\n                  </option>\n                ))}\n              </select>\n            </div>\n          </div>\n        </div>\n\n        {infoText && (\n          <div className=\"alert alert-info gf-form-group\" aria-label=\"Variable editor Form Alert\">\n            {infoText}\n          </div>\n        )}\n      </>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({\n  editor: state.templating.editor as VariableEditorState<AdHocVariableEditorState>,\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  initAdHocVariableEditor,\n  changeVariableDatasource,\n};\n\nexport const AdHocVariableEditor = connectWithStore(\n  AdHocVariableEditorUnConnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import { AdHocVariableFilter } from 'app/features/templating/types';\nimport { UrlQueryValue } from '@grafana/data';\nimport { isArray, isString } from 'lodash';\n\nexport const toUrl = (filters: AdHocVariableFilter[]): string[] => {\n  return filters.map(filter =>\n    toArray(filter)\n      .map(escapeDelimiter)\n      .join('|')\n  );\n};\n\nexport const toFilters = (value: UrlQueryValue): AdHocVariableFilter[] => {\n  if (isArray(value)) {\n    const values = value as any[];\n    return values.map(toFilter).filter(isFilter);\n  }\n\n  const filter = toFilter(value);\n  return filter === null ? [] : [filter];\n};\n\nfunction escapeDelimiter(value: string) {\n  return value.replace(/\\|/g, '__gfp__');\n}\n\nfunction unescapeDelimiter(value: string) {\n  return value.replace(/__gfp__/g, '|');\n}\n\nfunction toArray(filter: AdHocVariableFilter): string[] {\n  return [filter.key, filter.operator, filter.value];\n}\n\nfunction toFilter(value: string | number | boolean | undefined | null): AdHocVariableFilter | null {\n  if (!isString(value) || value.length === 0) {\n    return null;\n  }\n\n  const parts = value.split('|').map(unescapeDelimiter);\n\n  return {\n    key: parts[0],\n    operator: parts[1],\n    value: parts[2],\n    condition: '',\n  };\n}\n\nfunction isFilter(filter: AdHocVariableFilter | null): filter is AdHocVariableFilter {\n  return filter !== null && isString(filter.value);\n}\n","import cloneDeep from 'lodash/cloneDeep';\n\nimport { AdHocVariableModel } from '../../templating/types';\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { AdHocPicker } from './picker/AdHocPicker';\nimport { adHocVariableReducer, initialAdHocVariableModelState } from './reducer';\nimport { AdHocVariableEditor } from './AdHocVariableEditor';\nimport { setFiltersFromUrl } from './actions';\nimport * as urlParser from './urlParser';\n\nconst noop = async () => {};\n\nexport const createAdHocVariableAdapter = (): VariableAdapter<AdHocVariableModel> => {\n  return {\n    id: 'adhoc',\n    description: 'Add key/value filters on the fly',\n    name: 'Ad hoc filters',\n    initialState: initialAdHocVariableModelState,\n    reducer: adHocVariableReducer,\n    picker: AdHocPicker,\n    editor: AdHocVariableEditor,\n    dependsOn: () => false,\n    setValue: noop,\n    setValueFromUrl: async (variable, urlValue) => {\n      const filters = urlParser.toFilters(urlValue);\n      await dispatch(setFiltersFromUrl(variable.id!, filters));\n    },\n    updateOptions: noop,\n    getSaveModel: variable => {\n      const { index, id, initLock, global, ...rest } = cloneDeep(variable);\n      return rest;\n    },\n    getValueForUrl: variable => {\n      const filters = variable?.filters ?? [];\n      return urlParser.toUrl(filters);\n    },\n  };\n};\n","import { ComponentType } from 'react';\nimport { Reducer } from 'redux';\nimport { Registry, UrlQueryValue, VariableType } from '@grafana/data';\n\nimport {\n  AdHocVariableModel,\n  ConstantVariableModel,\n  CustomVariableModel,\n  DataSourceVariableModel,\n  IntervalVariableModel,\n  QueryVariableModel,\n  TextBoxVariableModel,\n  VariableModel,\n  VariableOption,\n} from '../templating/types';\nimport { VariableEditorProps } from './editor/types';\nimport { VariablesState } from './state/variablesReducer';\nimport { VariablePickerProps } from './pickers/types';\nimport { createQueryVariableAdapter } from './query/adapter';\nimport { createCustomVariableAdapter } from './custom/adapter';\nimport { createTextBoxVariableAdapter } from './textbox/adapter';\nimport { createConstantVariableAdapter } from './constant/adapter';\nimport { createDataSourceVariableAdapter } from './datasource/adapter';\nimport { createIntervalVariableAdapter } from './interval/adapter';\nimport { createAdHocVariableAdapter } from './adhoc/adapter';\n\nexport interface VariableAdapter<Model extends VariableModel> {\n  id: VariableType;\n  description: string;\n  name: string;\n  initialState: Model;\n  dependsOn: (variable: Model, variableToTest: Model) => boolean;\n  setValue: (variable: Model, option: VariableOption, emitChanges?: boolean) => Promise<void>;\n  setValueFromUrl: (variable: Model, urlValue: UrlQueryValue) => Promise<void>;\n  updateOptions: (variable: Model, searchFilter?: string) => Promise<void>;\n  getSaveModel: (variable: Model) => Partial<Model>;\n  getValueForUrl: (variable: Model) => string | string[];\n  picker: ComponentType<VariablePickerProps>;\n  editor: ComponentType<VariableEditorProps>;\n  reducer: Reducer<VariablesState>;\n}\n\nexport type VariableModels =\n  | QueryVariableModel\n  | CustomVariableModel\n  | TextBoxVariableModel\n  | ConstantVariableModel\n  | DataSourceVariableModel\n  | IntervalVariableModel\n  | AdHocVariableModel;\nexport type VariableTypeRegistry<Model extends VariableModel = VariableModel> = Registry<VariableAdapter<Model>>;\n\nexport const getDefaultVariableAdapters = () => [\n  createQueryVariableAdapter(),\n  createCustomVariableAdapter(),\n  createTextBoxVariableAdapter(),\n  createConstantVariableAdapter(),\n  createDataSourceVariableAdapter(),\n  createIntervalVariableAdapter(),\n  createAdHocVariableAdapter(),\n];\n\nexport const variableAdapters: VariableTypeRegistry = new Registry<VariableAdapter<VariableModels>>();\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { DashboardAclDTO, FolderDTO, FolderState } from 'app/types';\nimport { processAclItems } from 'app/core/utils/acl';\n\nexport const initialState: FolderState = {\n  id: 0,\n  uid: 'loading',\n  title: 'loading',\n  url: '',\n  canSave: false,\n  hasChanged: false,\n  version: 1,\n  permissions: [],\n};\n\nconst folderSlice = createSlice({\n  name: 'folder',\n  initialState,\n  reducers: {\n    loadFolder: (state, action: PayloadAction<FolderDTO>): FolderState => {\n      return {\n        ...state,\n        ...action.payload,\n        hasChanged: false,\n      };\n    },\n    setFolderTitle: (state, action: PayloadAction<string>): FolderState => {\n      return {\n        ...state,\n        title: action.payload,\n        hasChanged: action.payload.trim().length > 0,\n      };\n    },\n    loadFolderPermissions: (state, action: PayloadAction<DashboardAclDTO[]>): FolderState => {\n      return {\n        ...state,\n        permissions: processAclItems(action.payload),\n      };\n    },\n  },\n});\n\nexport const { loadFolderPermissions, loadFolder, setFolderTitle } = folderSlice.actions;\n\nexport const folderReducer = folderSlice.reducer;\n\nexport default {\n  folder: folderReducer,\n};\n","import React, { PureComponent } from 'react';\nimport ReactDOM from 'react-dom';\n\ninterface Props {\n  className?: string;\n  root?: HTMLElement;\n  forwardedRef?: any;\n}\n\nexport class Portal extends PureComponent<Props> {\n  node: HTMLElement = document.createElement('div');\n  portalRoot: HTMLElement;\n\n  constructor(props: Props) {\n    super(props);\n    const { className, root = document.body } = this.props;\n\n    if (className) {\n      this.node.classList.add(className);\n    }\n\n    this.portalRoot = root;\n    this.portalRoot.appendChild(this.node);\n  }\n\n  componentWillUnmount() {\n    this.portalRoot.removeChild(this.node);\n  }\n\n  render() {\n    // Default z-index is high to make sure\n    return ReactDOM.createPortal(\n      <div style={{ zIndex: 1051, position: 'relative' }} ref={this.props.forwardedRef}>\n        {this.props.children}\n      </div>,\n      this.node\n    );\n  }\n}\n\nexport const RefForwardingPortal = React.forwardRef<HTMLDivElement, Props>((props, ref) => {\n  return <Portal {...props} forwardedRef={ref} />;\n});\n","/* Flot plugin for showing crosshairs when the mouse hovers over the plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\n\tcrosshair: {\n\t\tmode: null or \"x\" or \"y\" or \"xy\"\n\t\tcolor: color\n\t\tlineWidth: number\n\t}\n\nSet the mode to one of \"x\", \"y\" or \"xy\". The \"x\" mode enables a vertical\ncrosshair that lets you trace the values on the x axis, \"y\" enables a\nhorizontal crosshair and \"xy\" enables them both. \"color\" is the color of the\ncrosshair (default is \"rgba(170, 0, 0, 0.80)\"), \"lineWidth\" is the width of\nthe drawn lines (default is 1).\n\nThe plugin also adds four public methods:\n\n  - setCrosshair( pos )\n\n    Set the position of the crosshair. Note that this is cleared if the user\n    moves the mouse. \"pos\" is in coordinates of the plot and should be on the\n    form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple\n    axes), which is coincidentally the same format as what you get from a\n    \"plothover\" event. If \"pos\" is null, the crosshair is cleared.\n\n  - clearCrosshair()\n\n    Clear the crosshair.\n\n  - lockCrosshair(pos)\n\n    Cause the crosshair to lock to the current location, no longer updating if\n    the user moves the mouse. Optionally supply a position (passed on to\n    setCrosshair()) to move it to.\n\n    Example usage:\n\n\tvar myFlot = $.plot( $(\"#graph\"), ..., { crosshair: { mode: \"x\" } } };\n\t$(\"#graph\").bind( \"plothover\", function ( evt, position, item ) {\n\t\tif ( item ) {\n\t\t\t// Lock the crosshair to the data point being hovered\n\t\t\tmyFlot.lockCrosshair({\n\t\t\t\tx: item.datapoint[ 0 ],\n\t\t\t\ty: item.datapoint[ 1 ]\n\t\t\t});\n\t\t} else {\n\t\t\t// Return normal crosshair operation\n\t\t\tmyFlot.unlockCrosshair();\n\t\t}\n\t});\n\n  - unlockCrosshair()\n\n    Free the crosshair to move again after locking it.\n*/\n\n(function ($) {\n    var options = {\n        crosshair: {\n            mode: null, // one of null, \"x\", \"y\" or \"xy\",\n            color: \"rgba(170, 0, 0, 0.80)\",\n            lineWidth: 1\n        }\n    };\n    \n    function init(plot) {\n        // position of crosshair in pixels\n        var crosshair = { x: -1, y: -1, locked: false };\n\n        plot.setCrosshair = function setCrosshair(pos) {\n            if (!pos)\n                crosshair.x = -1;\n            else {\n                var o = plot.p2c(pos);\n                crosshair.x = Math.max(0, Math.min(o.left, plot.width()));\n                crosshair.y = Math.max(0, Math.min(o.top, plot.height()));\n            }\n            \n            plot.triggerRedrawOverlay();\n        };\n        \n        plot.clearCrosshair = plot.setCrosshair; // passes null for pos\n        \n        plot.lockCrosshair = function lockCrosshair(pos) {\n            if (pos)\n                plot.setCrosshair(pos);\n            crosshair.locked = true;\n        };\n\n        plot.unlockCrosshair = function unlockCrosshair() {\n            crosshair.locked = false;\n        };\n\n        function onMouseOut(e) {\n            if (crosshair.locked)\n                return;\n\n            if (crosshair.x != -1) {\n                crosshair.x = -1;\n                plot.triggerRedrawOverlay();\n            }\n        }\n\n        function onMouseMove(e) {\n            if (crosshair.locked)\n                return;\n                \n            if (plot.getSelection && plot.getSelection()) {\n                crosshair.x = -1; // hide the crosshair while selecting\n                return;\n            }\n                \n            var offset = plot.offset();\n            crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));\n            crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));\n            plot.triggerRedrawOverlay();\n        }\n        \n        plot.hooks.bindEvents.push(function (plot, eventHolder) {\n            if (!plot.getOptions().crosshair.mode)\n                return;\n\n            eventHolder.mouseout(onMouseOut);\n            eventHolder.mousemove(onMouseMove);\n        });\n\n        plot.hooks.drawOverlay.push(function (plot, ctx) {\n            var c = plot.getOptions().crosshair;\n            if (!c.mode)\n                return;\n\n            var plotOffset = plot.getPlotOffset();\n            \n            ctx.save();\n            ctx.translate(plotOffset.left, plotOffset.top);\n\n            if (crosshair.x != -1) {\n                var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0;\n\n                ctx.strokeStyle = c.color;\n                ctx.lineWidth = c.lineWidth;\n                ctx.lineJoin = \"round\";\n\n                ctx.beginPath();\n                if (c.mode.indexOf(\"x\") != -1) {\n                    var drawX = Math.floor(crosshair.x) + adj;\n                    ctx.moveTo(drawX, 0);\n                    ctx.lineTo(drawX, plot.height());\n                }\n                if (c.mode.indexOf(\"y\") != -1) {\n                    var drawY = Math.floor(crosshair.y) + adj;\n                    ctx.moveTo(0, drawY);\n                    ctx.lineTo(plot.width(), drawY);\n                }\n                ctx.stroke();\n            }\n            ctx.restore();\n        });\n\n        plot.hooks.shutdown.push(function (plot, eventHolder) {\n            eventHolder.unbind(\"mouseout\", onMouseOut);\n            eventHolder.unbind(\"mousemove\", onMouseMove);\n        });\n    }\n    \n    $.plot.plugins.push({\n        init: init,\n        options: options,\n        name: 'crosshair',\n        version: '1.0'\n    });\n})(jQuery);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Team, TeamGroup, TeamMember, TeamsState, TeamState } from 'app/types';\n\nexport const initialTeamsState: TeamsState = { teams: [], searchQuery: '', hasFetched: false };\n\nconst teamsSlice = createSlice({\n  name: 'teams',\n  initialState: initialTeamsState,\n  reducers: {\n    teamsLoaded: (state, action: PayloadAction<Team[]>): TeamsState => {\n      return { ...state, hasFetched: true, teams: action.payload };\n    },\n    setSearchQuery: (state, action: PayloadAction<string>): TeamsState => {\n      return { ...state, searchQuery: action.payload };\n    },\n  },\n});\n\nexport const { teamsLoaded, setSearchQuery } = teamsSlice.actions;\n\nexport const teamsReducer = teamsSlice.reducer;\n\nexport const initialTeamState: TeamState = {\n  team: {} as Team,\n  members: [] as TeamMember[],\n  groups: [] as TeamGroup[],\n  searchMemberQuery: '',\n};\n\nconst teamSlice = createSlice({\n  name: 'team',\n  initialState: initialTeamState,\n  reducers: {\n    teamLoaded: (state, action: PayloadAction<Team>): TeamState => {\n      return { ...state, team: action.payload };\n    },\n    teamMembersLoaded: (state, action: PayloadAction<TeamMember[]>): TeamState => {\n      return { ...state, members: action.payload };\n    },\n    setSearchMemberQuery: (state, action: PayloadAction<string>): TeamState => {\n      return { ...state, searchMemberQuery: action.payload };\n    },\n    teamGroupsLoaded: (state, action: PayloadAction<TeamGroup[]>): TeamState => {\n      return { ...state, groups: action.payload };\n    },\n  },\n});\n\nexport const { teamLoaded, teamGroupsLoaded, teamMembersLoaded, setSearchMemberQuery } = teamSlice.actions;\n\nexport const teamReducer = teamSlice.reducer;\n\nexport default {\n  teams: teamsReducer,\n  team: teamReducer,\n};\n","import React, { CSSProperties, FC } from 'react';\nimport Transition from 'react-transition-group/Transition';\n\ninterface Style {\n  transition?: string;\n  overflow?: string;\n}\n\n// When animating using max-height we need to use a static value.\n// If this is not enough, pass in <SlideDown maxHeight=\"....\nconst defaultMaxHeight = '200px';\nconst defaultDuration = 200;\n\nexport const defaultStyle: Style = {\n  transition: `max-height ${defaultDuration}ms ease-in-out`,\n  overflow: 'hidden',\n};\n\nexport interface Props {\n  children: React.ReactNode;\n  in: boolean;\n  maxHeight?: number;\n  style?: CSSProperties;\n}\n\nexport const SlideDown: FC<Props> = ({ children, in: inProp, maxHeight = defaultMaxHeight, style = defaultStyle }) => {\n  // There are 4 main states a Transition can be in:\n  // ENTERING, ENTERED, EXITING, EXITED\n  // https://reactcommunity.or[g/react-transition-group/\n  const transitionStyles: { [str: string]: CSSProperties } = {\n    exited: { maxHeight: 0 },\n    entering: { maxHeight: maxHeight },\n    entered: { maxHeight: 'unset', overflow: 'visible' },\n    exiting: { maxHeight: 0 },\n  };\n\n  return (\n    <Transition in={inProp} timeout={defaultDuration}>\n      {state => (\n        <div\n          style={{\n            ...style,\n            ...transitionStyles[state],\n          }}\n        >\n          {children}\n        </div>\n      )}\n    </Transition>\n  );\n};\n","import React, { FC } from 'react';\nimport { css, cx } from 'emotion';\nimport { DataFrame, DataLink, GrafanaTheme, VariableSuggestion } from '@grafana/data';\nimport { stylesFactory, useTheme } from '../../../themes';\nimport { HorizontalGroup, VerticalGroup } from '../../Layout/Layout';\nimport { IconButton } from '../../IconButton/IconButton';\n\ninterface DataLinksListItemProps {\n  index: number;\n  link: DataLink;\n  data: DataFrame[];\n  onChange: (index: number, link: DataLink) => void;\n  onEdit: () => void;\n  onRemove: () => void;\n  suggestions: VariableSuggestion[];\n  isEditing?: boolean;\n}\n\nexport const DataLinksListItem: FC<DataLinksListItemProps> = ({ link, onEdit, onRemove }) => {\n  const theme = useTheme();\n  const styles = getDataLinkListItemStyles(theme);\n\n  const hasTitle = link.title.trim() !== '';\n  const hasUrl = link.url.trim() !== '';\n\n  return (\n    <div className={styles.wrapper}>\n      <VerticalGroup spacing=\"xs\">\n        <HorizontalGroup justify=\"space-between\" align=\"flex-start\" width=\"100%\">\n          <div className={cx(styles.title, !hasTitle && styles.notConfigured)}>\n            {hasTitle ? link.title : 'Data link title not provided'}\n          </div>\n          <HorizontalGroup>\n            <IconButton name=\"pen\" onClick={onEdit} />\n            <IconButton name=\"times\" onClick={onRemove} />\n          </HorizontalGroup>\n        </HorizontalGroup>\n        <div className={cx(styles.url, !hasUrl && styles.notConfigured)} title={link.url}>\n          {hasUrl ? link.url : 'Data link url not provided'}\n        </div>\n      </VerticalGroup>\n    </div>\n  );\n};\n\nconst getDataLinkListItemStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    wrapper: css`\n      margin-bottom: ${theme.spacing.md};\n      width: 100%;\n      &:last-child {\n        margin-bottom: 0;\n      }\n    `,\n    notConfigured: css`\n      font-style: italic;\n    `,\n    title: css`\n      color: ${theme.colors.formLabel};\n      font-size: ${theme.typography.size.sm};\n      font-weight: ${theme.typography.weight.semibold};\n    `,\n    url: css`\n      color: ${theme.colors.textWeak};\n      font-size: ${theme.typography.size.sm};\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      max-width: 90%;\n    `,\n  };\n});\n","import React, { ChangeEvent, useContext } from 'react';\nimport { DataLink, VariableSuggestion, GrafanaTheme } from '@grafana/data';\nimport { Switch } from '../Switch/Switch';\nimport { css } from 'emotion';\nimport { ThemeContext, stylesFactory } from '../../themes/index';\nimport { DataLinkInput } from './DataLinkInput';\nimport { Field } from '../Forms/Field';\nimport { Input } from '../Input/Input';\n\ninterface DataLinkEditorProps {\n  index: number;\n  isLast: boolean;\n  value: DataLink;\n  suggestions: VariableSuggestion[];\n  onChange: (index: number, link: DataLink, callback?: () => void) => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  listItem: css`\n    margin-bottom: ${theme.spacing.sm};\n  `,\n  infoText: css`\n    padding-bottom: ${theme.spacing.md};\n    margin-left: 66px;\n    color: ${theme.colors.textWeak};\n  `,\n}));\n\nexport const DataLinkEditor: React.FC<DataLinkEditorProps> = React.memo(\n  ({ index, value, onChange, suggestions, isLast }) => {\n    const theme = useContext(ThemeContext);\n    const styles = getStyles(theme);\n\n    const onUrlChange = (url: string, callback?: () => void) => {\n      onChange(index, { ...value, url }, callback);\n    };\n    const onTitleChange = (event: ChangeEvent<HTMLInputElement>) => {\n      onChange(index, { ...value, title: event.target.value });\n    };\n\n    const onOpenInNewTabChanged = () => {\n      onChange(index, { ...value, targetBlank: !value.targetBlank });\n    };\n\n    return (\n      <div className={styles.listItem}>\n        <Field label=\"Title\">\n          <Input value={value.title} onChange={onTitleChange} placeholder=\"Show details\" />\n        </Field>\n\n        <Field label=\"URL\">\n          <DataLinkInput value={value.url} onChange={onUrlChange} suggestions={suggestions} />\n        </Field>\n\n        <Field label=\"Open in new tab\">\n          <Switch checked={value.targetBlank || false} onChange={onOpenInNewTabChanged} />\n        </Field>\n\n        {isLast && (\n          <div className={styles.infoText}>\n            With data links you can reference data variables like series name, labels and values. Type CMD+Space,\n            CTRL+Space, or $ to open variable suggestions.\n          </div>\n        )}\n      </div>\n    );\n  }\n);\n\nDataLinkEditor.displayName = 'DataLinkEditor';\n","import { DataFrame, DataLink, VariableSuggestion } from '@grafana/data';\nimport React, { FC, useState } from 'react';\nimport { DataLinkEditor } from '../DataLinkEditor';\nimport { HorizontalGroup } from '../../Layout/Layout';\nimport { Button } from '../../Button';\n\ninterface DataLinkEditorModalContentProps {\n  link: DataLink;\n  index: number;\n  data: DataFrame[];\n  suggestions: VariableSuggestion[];\n  onSave: (index: number, ink: DataLink) => void;\n  onCancel: (index: number) => void;\n}\n\nexport const DataLinkEditorModalContent: FC<DataLinkEditorModalContentProps> = ({\n  link,\n  index,\n  suggestions,\n  onSave,\n  onCancel,\n}) => {\n  const [dirtyLink, setDirtyLink] = useState(link);\n  return (\n    <>\n      <DataLinkEditor\n        value={dirtyLink}\n        index={index}\n        isLast={false}\n        suggestions={suggestions}\n        onChange={(index, link) => {\n          setDirtyLink(link);\n        }}\n      />\n      <HorizontalGroup>\n        <Button\n          onClick={() => {\n            onSave(index, dirtyLink);\n          }}\n        >\n          Save\n        </Button>\n        <Button variant=\"secondary\" onClick={() => onCancel(index)}>\n          Cancel\n        </Button>\n      </HorizontalGroup>\n    </>\n  );\n};\n","import { DataFrame, DataLink, GrafanaTheme, VariableSuggestion } from '@grafana/data';\nimport React, { useState } from 'react';\nimport { css } from 'emotion';\nimport { Button } from '../../Button/Button';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { Modal } from '../../Modal/Modal';\nimport { stylesFactory, useTheme } from '../../../themes';\nimport { DataLinksListItem } from './DataLinksListItem';\nimport { DataLinkEditorModalContent } from './DataLinkEditorModalContent';\n\ninterface DataLinksInlineEditorProps {\n  links?: DataLink[];\n  onChange: (links: DataLink[]) => void;\n  suggestions: VariableSuggestion[];\n  data: DataFrame[];\n}\n\nexport const DataLinksInlineEditor: React.FC<DataLinksInlineEditorProps> = ({ links, onChange, suggestions, data }) => {\n  const theme = useTheme();\n  const [editIndex, setEditIndex] = useState<number | null>(null);\n  const [isNew, setIsNew] = useState(false);\n\n  const styles = getDataLinksInlineEditorStyles(theme);\n  const linksSafe: DataLink[] = links ?? [];\n  const isEditing = editIndex !== null;\n\n  const onDataLinkChange = (index: number, link: DataLink) => {\n    if (isNew) {\n      if (link.title.trim() === '' && link.url.trim() === '') {\n        setIsNew(false);\n        setEditIndex(null);\n        return;\n      } else {\n        setEditIndex(null);\n        setIsNew(false);\n      }\n    }\n    const update = cloneDeep(linksSafe);\n    update[index] = link;\n    onChange(update);\n    setEditIndex(null);\n  };\n\n  const onDataLinkAdd = () => {\n    let update = cloneDeep(linksSafe);\n    setEditIndex(update.length);\n    setIsNew(true);\n  };\n\n  const onDataLinkCancel = (index: number) => {\n    if (isNew) {\n      setIsNew(false);\n    }\n    setEditIndex(null);\n  };\n\n  const onDataLinkRemove = (index: number) => {\n    const update = cloneDeep(linksSafe);\n    update.splice(index, 1);\n    onChange(update);\n  };\n\n  return (\n    <>\n      {linksSafe.length > 0 && (\n        <div className={styles.wrapper}>\n          {linksSafe.map((l, i) => {\n            return (\n              <DataLinksListItem\n                key={`${l.title}/${i}`}\n                index={i}\n                link={l}\n                onChange={onDataLinkChange}\n                onEdit={() => setEditIndex(i)}\n                onRemove={() => onDataLinkRemove(i)}\n                data={data}\n                suggestions={suggestions}\n              />\n            );\n          })}\n        </div>\n      )}\n\n      {isEditing && editIndex !== null && (\n        <Modal\n          title=\"Edit link\"\n          isOpen={true}\n          onDismiss={() => {\n            onDataLinkCancel(editIndex);\n          }}\n        >\n          <DataLinkEditorModalContent\n            index={editIndex}\n            link={isNew ? { title: '', url: '' } : linksSafe[editIndex]}\n            data={data}\n            onSave={onDataLinkChange}\n            onCancel={onDataLinkCancel}\n            suggestions={suggestions}\n          />\n        </Modal>\n      )}\n\n      <Button size=\"sm\" icon=\"plus\" onClick={onDataLinkAdd} variant=\"secondary\">\n        Add link\n      </Button>\n    </>\n  );\n};\n\nconst getDataLinksInlineEditorStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    wrapper: css`\n      margin-bottom: ${theme.spacing.md};\n    `,\n  };\n});\n","// Libraries\nimport React, { FunctionComponent } from 'react';\nimport { css } from 'emotion';\n// Components\nimport { Tooltip, Icon, IconName, IconType, IconSize, IconButton, useTheme, stylesFactory } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme } from '@grafana/data';\n\ninterface Props {\n  icon?: IconName;\n  tooltip: string;\n  classSuffix?: string;\n  onClick?: () => void;\n  href?: string;\n  children?: React.ReactNode;\n  iconType?: IconType;\n  iconSize?: IconSize;\n  noBorder?: boolean;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  noBorderContainer: css`\n    padding: 0 ${theme.spacing.xs};\n    display: flex;\n  `,\n}));\n\nexport const DashNavButton: FunctionComponent<Props> = ({\n  icon,\n  iconType,\n  iconSize,\n  tooltip,\n  classSuffix,\n  onClick,\n  href,\n  children,\n  noBorder,\n}) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  if (noBorder) {\n    return (\n      <div className={styles.noBorderContainer}>\n        {icon && (\n          <IconButton\n            name={icon}\n            size={iconSize}\n            iconType={iconType}\n            tooltip={tooltip}\n            tooltipPlacement=\"bottom\"\n            onClick={onClick}\n          />\n        )}\n        {children}\n      </div>\n    );\n  }\n  return (\n    <Tooltip content={tooltip} placement=\"bottom\">\n      {onClick ? (\n        <button\n          className={`btn navbar-button navbar-button--${classSuffix}`}\n          onClick={onClick}\n          aria-label={selectors.pages.Dashboard.Toolbar.toolbarItems(tooltip)}\n        >\n          {icon && <Icon name={icon} type={iconType} size={iconSize || 'lg'} />}\n          {children}\n        </button>\n      ) : (\n        <a className={`btn navbar-button navbar-button--${classSuffix}`} href={href}>\n          {icon && <Icon name={icon} type={iconType} size=\"lg\" />}\n          {children}\n        </a>\n      )}\n    </Tooltip>\n  );\n};\n","import { DataQueryError, DataQueryRequest, DataQueryTimings } from './datasource';\nimport { PluginMeta } from './plugin';\nimport { ScopedVars } from './ScopedVars';\nimport { LoadingState } from './data';\nimport { DataFrame } from './dataFrame';\nimport { AbsoluteTimeRange, TimeRange, TimeZone } from './time';\nimport { FieldConfigSource } from './fieldOverrides';\nimport { Registry } from '../utils';\nimport { StandardEditorProps } from '../field';\nimport { OptionsEditorItem } from './OptionsUIRegistryBuilder';\n\nexport type InterpolateFunction = (value: string, scopedVars?: ScopedVars, format?: string | Function) => string;\n\nexport interface PanelPluginMeta extends PluginMeta {\n  /** Indicates that panel does not issue queries */\n  skipDataQuery?: boolean;\n  /** Indicates that panel should not be available in visualisation picker */\n  hideFromList?: boolean;\n  /** Sort order */\n  sort: number;\n}\n\nexport interface PanelData {\n  /** State of the data (loading, done, error, streaming) */\n  state: LoadingState;\n\n  /** Contains data frames with field overrides applied */\n  series: DataFrame[];\n\n  /** Request contains the queries and properties sent to the datasource */\n  request?: DataQueryRequest;\n\n  /** Timing measurements */\n  timings?: DataQueryTimings;\n\n  /** Any query errors */\n  error?: DataQueryError;\n\n  /** Contains the range from the request or a shifted time range if a request uses relative time */\n  timeRange: TimeRange;\n}\n\nexport interface PanelProps<T = any> {\n  /** ID of the panel within the current dashboard */\n  id: number;\n  /** Result set of panel queries */\n  data: PanelData;\n  /** Time range of the current dashboard */\n  timeRange: TimeRange;\n  /** Time zone of the current dashboard */\n  timeZone: TimeZone;\n  /** Panel options */\n  options: T;\n  /** Panel options change handler */\n  onOptionsChange: (options: T) => void;\n  /** Field options configuration */\n  fieldConfig: FieldConfigSource;\n  /** Field config change handler */\n  onFieldConfigChange: (config: FieldConfigSource) => void;\n  /** Indicathes whether or not panel should be rendered transparent */\n  transparent: boolean;\n  /** Current width of the panel */\n  width: number;\n  /** Current height of the panel */\n  height: number;\n  /** Template variables interpolation function */\n  replaceVariables: InterpolateFunction;\n  /** Time range change handler */\n  onChangeTimeRange: (timeRange: AbsoluteTimeRange) => void;\n  /** @internal */\n  renderCounter: number;\n}\n\nexport interface PanelEditorProps<T = any> {\n  /** Panel options */\n  options: T;\n  /** Panel options change handler */\n  onOptionsChange: (\n    options: T,\n    // callback can be used to run something right after update.\n    callback?: () => void\n  ) => void;\n  /** Result set of panel queries */\n  data: PanelData;\n}\n\nexport interface PanelModel<TOptions = any> {\n  /** ID of the panel within the current dashboard */\n  id: number;\n  /** Panel options */\n  options: TOptions;\n  /** Field options configuration */\n  fieldConfig: FieldConfigSource;\n  /** Version of the panel plugin */\n  pluginVersion?: string;\n  scopedVars?: ScopedVars;\n}\n\n/**\n * Called when a panel is first loaded with current panel model\n */\nexport type PanelMigrationHandler<TOptions = any> = (panel: PanelModel<TOptions>) => Partial<TOptions>;\n\n/**\n * Called before a panel is initialized. Allows panel inspection for any updates before changing the panel type.\n */\nexport type PanelTypeChangedHandler<TOptions = any> = (\n  panel: PanelModel<TOptions>,\n  prevPluginId: string,\n  prevOptions: any\n) => Partial<TOptions>;\n\nexport type PanelOptionEditorsRegistry = Registry<PanelOptionsEditorItem>;\n\nexport interface PanelOptionsEditorProps<TValue> extends StandardEditorProps<TValue> {}\n\nexport interface PanelOptionsEditorItem<TOptions = any, TValue = any, TSettings = any>\n  extends OptionsEditorItem<TOptions, TSettings, PanelOptionsEditorProps<TValue>, TValue> {}\n\nexport interface PanelOptionsEditorConfig<TOptions, TSettings = any, TValue = any> {\n  /**\n   * Path of the option property to control.\n   *\n   * @example\n   * Given options object of a type:\n   * ```ts\n   * interface Options {\n   *   a: {\n   *     b: string;\n   *   }\n   * }\n   * ```\n   *\n   * path can be either 'a' or 'a.b'.\n   */\n  path: (keyof TOptions & string) | string;\n  /**\n   * Name of the option. Will be displayed in the UI as form element label.\n   */\n  name: string;\n  /**\n   * Description of the option. Will be displayed in the UI as form element description.\n   */\n  description?: string;\n  /**al\n   * Custom settings of the editor.\n   */\n  settings?: TSettings;\n  /**\n   * Array of strings representing category of the option. First element in the array will make option render as collapsible section.\n   */\n  category?: string[];\n  defaultValue?: TValue;\n  /**\n   * Function that enables configuration of when option editor should be shown based on current panel option properties.\n   *\n   * @param currentConfig Current panel options\n   */\n  showIf?: (currentConfig: TOptions) => boolean | undefined;\n}\n\n/**\n * @internal\n */\nexport interface PanelMenuItem {\n  type?: 'submenu' | 'divider';\n  text?: string;\n  iconClassName?: string;\n  onClick?: (event: React.MouseEvent<any>) => void;\n  shortcut?: string;\n  href?: string;\n  subMenu?: PanelMenuItem[];\n}\n\n/**\n * @internal\n */\nexport interface AngularPanelMenuItem {\n  click: Function;\n  icon: string;\n  href: string;\n  divider: boolean;\n  text: string;\n  shortcut: string;\n  submenu: any[];\n}\n\nexport enum VizOrientation {\n  Auto = 'auto',\n  Vertical = 'vertical',\n  Horizontal = 'horizontal',\n}\n","import React from 'react';\nimport { Mark, Node, Decoration } from 'slate';\nimport { Editor } from '@grafana/slate-react';\nimport { Record } from 'immutable';\n\nimport TOKEN_MARK from './TOKEN_MARK';\n\nexport interface OptionsFormat {\n  // Determine which node should be highlighted\n  onlyIn?: (node: Node) => boolean;\n  // Returns the syntax for a node that should be highlighted\n  getSyntax?: (node: Node) => string;\n  // Render a highlighting mark in a highlighted node\n  renderMark?: ({ mark, children }: { mark: Mark; children: React.ReactNode }) => void | React.ReactNode;\n}\n\n/**\n * Default filter for code blocks\n */\nfunction defaultOnlyIn(node: Node): boolean {\n  return node.object === 'block' && node.type === 'code_block';\n}\n\n/**\n * Default getter for syntax\n */\nfunction defaultGetSyntax(node: Node): string {\n  return 'javascript';\n}\n\n/**\n * Default rendering for decorations\n */\nfunction defaultRenderDecoration(\n  props: { children: React.ReactNode; decoration: Decoration },\n  editor: Editor,\n  next: () => any\n): void | React.ReactNode {\n  const { decoration } = props;\n  if (decoration.type !== TOKEN_MARK) {\n    return next();\n  }\n\n  const className = decoration.data.get('className');\n  return <span className={className}>{props.children}</span>;\n}\n\n/**\n * The plugin options\n */\nclass Options\n  extends Record({\n    onlyIn: defaultOnlyIn,\n    getSyntax: defaultGetSyntax,\n    renderDecoration: defaultRenderDecoration,\n  })\n  implements OptionsFormat {\n  readonly onlyIn!: (node: Node) => boolean;\n  readonly getSyntax!: (node: Node) => string;\n  readonly renderDecoration!: (\n    {\n      decoration,\n      children,\n    }: {\n      decoration: Decoration;\n      children: React.ReactNode;\n    },\n    editor: Editor,\n    next: () => any\n  ) => void | React.ReactNode;\n\n  constructor(props: OptionsFormat) {\n    super(props);\n  }\n}\n\nexport default Options;\n","import Prism from 'prismjs';\nimport { Block, Text, Decoration } from 'slate';\nimport { Plugin } from '@grafana/slate-react';\nimport Options, { OptionsFormat } from './options';\nimport TOKEN_MARK from './TOKEN_MARK';\n\nexport interface Token {\n  content: string;\n  offsets?: {\n    start: number;\n    end: number;\n  };\n  types: string[];\n  aliases: string[];\n  prev?: Token | null;\n  next?: Token | null;\n}\n\n/**\n * A Slate plugin to highlight code syntax.\n */\nexport function SlatePrism(optsParam: OptionsFormat = {}): Plugin {\n  const opts: Options = new Options(optsParam);\n\n  return {\n    decorateNode: (node, editor, next) => {\n      if (!opts.onlyIn(node)) {\n        return next();\n      }\n\n      const block = Block.create(node as Block);\n      const grammarName = opts.getSyntax(block);\n      const grammar = Prism.languages[grammarName];\n\n      if (!grammar) {\n        // Grammar not loaded\n        return [];\n      }\n\n      // Tokenize the whole block text\n      const texts = block.getTexts();\n      const blockText = texts.map(text => text && text.getText()).join('\\n');\n      const tokens = Prism.tokenize(blockText, grammar);\n      const flattened = flattenTokens(tokens);\n\n      const newData = editor.value.data.set('tokens', flattened);\n      editor.setData(newData);\n      return decorateNode(opts, tokens, block);\n    },\n\n    renderDecoration: (props, editor, next) =>\n      opts.renderDecoration(\n        {\n          children: props.children,\n          decoration: props.decoration,\n        },\n        editor as any,\n        next\n      ),\n  };\n}\n\n/**\n * Returns the decoration for a node\n */\nfunction decorateNode(opts: Options, tokens: Array<string | Prism.Token>, block: Block) {\n  const texts = block.getTexts();\n\n  // The list of decorations to return\n  const decorations: Decoration[] = [];\n  let textStart = 0;\n  let textEnd = 0;\n\n  texts.forEach(text => {\n    textEnd = textStart + text!.getText().length;\n\n    let offset = 0;\n    function processToken(token: string | Prism.Token, accu?: string | number) {\n      if (typeof token === 'string') {\n        if (accu) {\n          const decoration = createDecoration({\n            text: text!,\n            textStart,\n            textEnd,\n            start: offset,\n            end: offset + token.length,\n            className: `prism-token token ${accu}`,\n            block,\n          });\n\n          if (decoration) {\n            decorations.push(decoration);\n          }\n        }\n        offset += token.length;\n      } else {\n        accu = `${accu} ${token.type}`;\n        if (token.alias) {\n          accu += ' ' + token.alias;\n        }\n\n        if (typeof token.content === 'string') {\n          const decoration = createDecoration({\n            text: text!,\n            textStart,\n            textEnd,\n            start: offset,\n            end: offset + token.content.length,\n            className: `prism-token token ${accu}`,\n            block,\n          });\n\n          if (decoration) {\n            decorations.push(decoration);\n          }\n\n          offset += token.content.length;\n        } else {\n          // When using token.content instead of token.matchedStr, token can be deep\n          for (let i = 0; i < token.content.length; i += 1) {\n            // @ts-ignore\n            processToken(token.content[i], accu);\n          }\n        }\n      }\n    }\n\n    tokens.forEach(processToken);\n    textStart = textEnd + 1; // account for added `\\n`\n  });\n\n  return decorations;\n}\n\n/**\n * Return a decoration range for the given text.\n */\nfunction createDecoration({\n  text,\n  textStart,\n  textEnd,\n  start,\n  end,\n  className,\n  block,\n}: {\n  text: Text; // The text being decorated\n  textStart: number; // Its start position in the whole text\n  textEnd: number; // Its end position in the whole text\n  start: number; // The position in the whole text where the token starts\n  end: number; // The position in the whole text where the token ends\n  className: string; // The prism token classname\n  block: Block;\n}): Decoration | null {\n  if (start >= textEnd || end <= textStart) {\n    // Ignore, the token is not in the text\n    return null;\n  }\n\n  // Shrink to this text boundaries\n  start = Math.max(start, textStart);\n  end = Math.min(end, textEnd);\n\n  // Now shift offsets to be relative to this text\n  start -= textStart;\n  end -= textStart;\n\n  const myDec = block.createDecoration({\n    object: 'decoration',\n    anchor: {\n      key: text.key,\n      offset: start,\n      object: 'point',\n    },\n    focus: {\n      key: text.key,\n      offset: end,\n      object: 'point',\n    },\n    type: TOKEN_MARK,\n    data: { className },\n  });\n\n  return myDec;\n}\n\nfunction flattenToken(token: string | Prism.Token | Array<string | Prism.Token>): Token[] {\n  if (typeof token === 'string') {\n    return [\n      {\n        content: token,\n        types: [],\n        aliases: [],\n      },\n    ];\n  } else if (Array.isArray(token)) {\n    return token.flatMap(t => flattenToken(t));\n  } else if (token instanceof Prism.Token) {\n    return flattenToken(token.content).flatMap(t => {\n      let aliases: string[] = [];\n      if (typeof token.alias === 'string') {\n        aliases = [token.alias];\n      } else {\n        aliases = token.alias ?? [];\n      }\n\n      return {\n        content: t.content,\n        types: [token.type, ...t.types],\n        aliases: [...aliases, ...t.aliases],\n      };\n    });\n  }\n\n  return [];\n}\n\nexport function flattenTokens(token: string | Prism.Token | Array<string | Prism.Token>) {\n  const tokens = flattenToken(token);\n\n  if (!tokens.length) {\n    return [];\n  }\n\n  const firstToken = tokens[0];\n  firstToken.prev = null;\n  firstToken.next = tokens.length >= 2 ? tokens[1] : null;\n  firstToken.offsets = {\n    start: 0,\n    end: firstToken.content.length,\n  };\n\n  for (let i = 1; i < tokens.length - 1; i++) {\n    tokens[i].prev = tokens[i - 1];\n    tokens[i].next = tokens[i + 1];\n\n    tokens[i].offsets = {\n      start: tokens[i - 1].offsets!.end,\n      end: tokens[i - 1].offsets!.end + tokens[i].content.length,\n    };\n  }\n\n  const lastToken = tokens[tokens.length - 1];\n  lastToken.prev = tokens.length >= 2 ? tokens[tokens.length - 2] : null;\n  lastToken.next = null;\n  lastToken.offsets = {\n    start: tokens.length >= 2 ? tokens[tokens.length - 2].offsets!.end : 0,\n    end:\n      tokens.length >= 2 ? tokens[tokens.length - 2].offsets!.end + lastToken.content.length : lastToken.content.length,\n  };\n\n  return tokens;\n}\n","import marked, { MarkedOptions } from 'marked';\n\nconst defaultMarkedOptions: MarkedOptions = {\n  renderer: new marked.Renderer(),\n  pedantic: false,\n  gfm: true,\n  tables: true,\n  sanitize: true,\n  smartLists: true,\n  smartypants: false,\n  xhtml: false,\n};\n\nexport function setMarkdownOptions(optionsOverride?: MarkedOptions) {\n  marked.setOptions({ ...defaultMarkedOptions, ...optionsOverride });\n}\n\nexport function renderMarkdown(str?: string): string {\n  return marked(str || '');\n}\n","export interface TextMatch {\n  text: string;\n  start: number;\n  length: number;\n  end: number;\n}\n\n/**\n * Adapt findMatchesInText for react-highlight-words findChunks handler.\n * See https://github.com/bvaughn/react-highlight-words#props\n */\nexport function findHighlightChunksInText({\n  searchWords,\n  textToHighlight,\n}: {\n  searchWords: string[];\n  textToHighlight: string;\n}) {\n  return searchWords.reduce((acc: any, term: string) => [...acc, ...findMatchesInText(textToHighlight, term)], []);\n}\n\nconst cleanNeedle = (needle: string): string => {\n  return needle.replace(/[[{(][\\w,.-?:*+]+$/, '');\n};\n\n/**\n * Returns a list of substring regexp matches.\n */\nexport function findMatchesInText(haystack: string, needle: string): TextMatch[] {\n  // Empty search can send re.exec() into infinite loop, exit early\n  if (!haystack || !needle) {\n    return [];\n  }\n  const matches: TextMatch[] = [];\n  const { cleaned, flags } = parseFlags(cleanNeedle(needle));\n  let regexp: RegExp;\n  try {\n    regexp = new RegExp(`(?:${cleaned})`, flags);\n  } catch (error) {\n    return matches;\n  }\n  haystack.replace(regexp, (substring, ...rest) => {\n    if (substring) {\n      const offset = rest[rest.length - 2];\n      matches.push({\n        text: substring,\n        start: offset,\n        length: substring.length,\n        end: offset + substring.length,\n      });\n    }\n    return '';\n  });\n  return matches;\n}\n\nconst CLEAR_FLAG = '-';\nconst FLAGS_REGEXP = /\\(\\?([ims-]+)\\)/g;\n\n/**\n * Converts any mode modifiers in the text to the Javascript equivalent flag\n */\nexport function parseFlags(text: string): { cleaned: string; flags: string } {\n  const flags: Set<string> = new Set(['g']);\n\n  const cleaned = text.replace(FLAGS_REGEXP, (str, group) => {\n    const clearAll = group.startsWith(CLEAR_FLAG);\n\n    for (let i = 0; i < group.length; ++i) {\n      const flag = group.charAt(i);\n      if (clearAll || group.charAt(i - 1) === CLEAR_FLAG) {\n        flags.delete(flag);\n      } else if (flag !== CLEAR_FLAG) {\n        flags.add(flag);\n      }\n    }\n    return ''; // Remove flag from text\n  });\n\n  return {\n    cleaned: cleaned,\n    flags: Array.from(flags).join(''),\n  };\n}\n","export * from './string';\nexport * from './markdown';\nexport * from './text';\nimport { escapeHtml, hasAnsiCodes, sanitize, sanitizeUrl } from './sanitize';\n\nexport const textUtil = {\n  escapeHtml,\n  hasAnsiCodes,\n  sanitize,\n  sanitizeUrl,\n};\n","import { ComponentClass } from 'react';\nimport { KeyValue } from './data';\n\nexport enum PluginState {\n  alpha = 'alpha', // Only included it `enable_alpha` is true\n  beta = 'beta', // Will show a warning banner\n  deprecated = 'deprecated', // Will continue to work -- but not show up in the the options to add\n}\n\nexport enum PluginType {\n  panel = 'panel',\n  datasource = 'datasource',\n  app = 'app',\n  renderer = 'renderer',\n}\n\nexport enum PluginSignatureStatus {\n  internal = 'internal', // core plugin, no signature\n  valid = 'valid', // signed and accurate MANIFEST\n  invalid = 'invalid', // invalid signature\n  modified = 'modified', // valid signature, but content mismatch\n  unsigned = 'unsigned', // no MANIFEST file\n}\n\nexport interface PluginMeta<T extends KeyValue = {}> {\n  id: string;\n  name: string;\n  type: PluginType;\n  info: PluginMetaInfo;\n  includes?: PluginInclude[];\n  state?: PluginState;\n\n  // System.load & relative URLS\n  module: string;\n  baseUrl: string;\n\n  // Define plugin requirements\n  dependencies?: PluginDependencies;\n\n  // Filled in by the backend\n  jsonData?: T;\n  secureJsonData?: KeyValue;\n  enabled?: boolean;\n  defaultNavUrl?: string;\n  hasUpdate?: boolean;\n  enterprise?: boolean;\n  latestVersion?: string;\n  pinned?: boolean;\n  signature?: PluginSignatureStatus;\n}\n\ninterface PluginDependencyInfo {\n  id: string;\n  name: string;\n  version: string;\n  type: PluginType;\n}\n\nexport interface PluginDependencies {\n  grafanaVersion: string;\n  plugins: PluginDependencyInfo[];\n}\n\nexport enum PluginIncludeType {\n  dashboard = 'dashboard',\n  page = 'page',\n\n  // Only valid for apps\n  panel = 'panel',\n  datasource = 'datasource',\n}\n\nexport interface PluginInclude {\n  type: PluginIncludeType;\n  name: string;\n  path?: string;\n  icon?: string;\n\n  role?: string; // \"Viewer\", Admin, editor???\n  addToNav?: boolean; // Show in the sidebar... only if type=page?\n\n  // Angular app pages\n  component?: string;\n}\n\ninterface PluginMetaInfoLink {\n  name: string;\n  url: string;\n}\n\nexport interface PluginBuildInfo {\n  time?: number;\n  repo?: string;\n  branch?: string;\n  hash?: string;\n  number?: number;\n  pr?: number;\n}\n\nexport interface ScreenshotInfo {\n  name: string;\n  path: string;\n}\n\nexport interface PluginMetaInfo {\n  author: {\n    name: string;\n    url?: string;\n  };\n  description: string;\n  links: PluginMetaInfoLink[];\n  logos: {\n    large: string;\n    small: string;\n  };\n  build?: PluginBuildInfo;\n  screenshots: ScreenshotInfo[];\n  updated: string;\n  version: string;\n}\n\nexport interface PluginConfigPageProps<T extends PluginMeta> {\n  plugin: GrafanaPlugin<T>;\n  query: KeyValue; // The URL query parameters\n}\n\nexport interface PluginConfigPage<T extends PluginMeta> {\n  title: string; // Display\n  icon?: string;\n  id: string; // Unique, in URL\n\n  body: ComponentClass<PluginConfigPageProps<T>>;\n}\n\nexport class GrafanaPlugin<T extends PluginMeta = PluginMeta> {\n  // Meta is filled in by the plugin loading system\n  meta: T;\n\n  // This is set if the plugin system had errors loading the plugin\n  loadError?: boolean;\n\n  // Config control (app/datasource)\n  angularConfigCtrl?: any;\n\n  // Show configuration tabs on the plugin page\n  configPages?: Array<PluginConfigPage<T>>;\n\n  // Tabs on the plugin page\n  addConfigPage(tab: PluginConfigPage<T>) {\n    if (!this.configPages) {\n      this.configPages = [];\n    }\n    this.configPages.push(tab);\n    return this;\n  }\n\n  constructor() {\n    this.meta = {} as T;\n  }\n}\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor, Annotation } from 'slate';\n\nconst BRACES: any = {\n  '[': ']',\n  '{': '}',\n  '(': ')',\n};\n\nconst MATCH_MARK = 'brace_match';\n\nexport function BracesPlugin(): Plugin {\n  return {\n    onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n      const keyEvent = event as KeyboardEvent;\n      const { value } = editor;\n\n      switch (keyEvent.key) {\n        case '(':\n        case '{':\n        case '[': {\n          const {\n            start: { offset: startOffset, key: startKey },\n            end: { offset: endOffset, key: endKey },\n            focus: { offset: focusOffset },\n          } = value.selection;\n          const text = value.focusText.text;\n\n          // If text is selected, wrap selected text in parens\n          if (value.selection.isExpanded) {\n            keyEvent.preventDefault();\n            editor\n              .insertTextByKey(startKey, startOffset, keyEvent.key)\n              .insertTextByKey(endKey, endOffset + 1, BRACES[keyEvent.key])\n              .moveEndBackward(1);\n            return true;\n          } else if (\n            // Insert matching brace when there is no input after caret\n            focusOffset === text.length ||\n            text[focusOffset] === ' ' ||\n            Object.values(BRACES).includes(text[focusOffset])\n          ) {\n            keyEvent.preventDefault();\n            const complement = BRACES[keyEvent.key];\n            const matchAnnotation = {\n              key: `${MATCH_MARK}-${Date.now()}`,\n              type: `${MATCH_MARK}-${complement}`,\n              anchor: {\n                key: startKey,\n                offset: startOffset,\n                object: 'point',\n              },\n              focus: {\n                key: endKey,\n                offset: endOffset + 1,\n                object: 'point',\n              },\n              object: 'annotation',\n            } as Annotation;\n            editor\n              .insertText(keyEvent.key)\n              .insertText(complement)\n              .addAnnotation(matchAnnotation)\n              .moveBackward(1);\n\n            return true;\n          }\n          break;\n        }\n\n        case ')':\n        case '}':\n        case ']': {\n          const text = value.anchorText.text;\n          const offset = value.selection.anchor.offset;\n          const nextChar = text[offset];\n          // Handle closing brace when it's already the next character\n          const complement = keyEvent.key;\n          const annotationType = `${MATCH_MARK}-${complement}`;\n          const annotation = value.annotations.find(\n            a => a?.type === annotationType && a.anchor.key === value.anchorText.key\n          );\n          if (annotation && nextChar === complement && !value.selection.isExpanded) {\n            keyEvent.preventDefault();\n            editor\n              .moveFocusForward(1)\n              .removeAnnotation(annotation)\n              .moveAnchorForward(1);\n            return true;\n          }\n          break;\n        }\n\n        case 'Backspace': {\n          const text = value.anchorText.text;\n          const offset = value.selection.anchor.offset;\n          const previousChar = text[offset - 1];\n          const nextChar = text[offset];\n          if (BRACES[previousChar] && BRACES[previousChar] === nextChar) {\n            keyEvent.preventDefault();\n            // Remove closing brace if directly following\n            editor\n              .deleteBackward(1)\n              .deleteForward(1)\n              .focus();\n            return true;\n          }\n        }\n\n        default: {\n          break;\n        }\n      }\n\n      return next();\n    },\n  };\n}\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\n\n// Clears the rest of the line after the caret\nexport function ClearPlugin(): Plugin {\n  return {\n    onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n      const keyEvent = event as KeyboardEvent;\n      const value = editor.value;\n\n      if (value.selection.isExpanded) {\n        return next();\n      }\n\n      if (keyEvent.key === 'k' && keyEvent.ctrlKey) {\n        keyEvent.preventDefault();\n        const text = value.anchorText.text;\n        const offset = value.selection.anchor.offset;\n        const length = text.length;\n        const forward = length - offset;\n        editor.deleteForward(forward);\n        return true;\n      }\n\n      return next();\n    },\n  };\n}\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\n\nconst getCopiedText = (textBlocks: string[], startOffset: number, endOffset: number) => {\n  if (!textBlocks.length) {\n    return undefined;\n  }\n\n  const excludingLastLineLength = textBlocks.slice(0, -1).join('').length + textBlocks.length - 1;\n  return textBlocks.join('\\n').slice(startOffset, excludingLastLineLength + endOffset);\n};\n\nexport function ClipboardPlugin(): Plugin {\n  const clipboardPlugin: Plugin = {\n    onCopy(event: Event, editor: CoreEditor, next: () => any) {\n      const clipEvent = event as ClipboardEvent;\n      clipEvent.preventDefault();\n\n      const { document, selection } = editor.value;\n      const {\n        start: { offset: startOffset },\n        end: { offset: endOffset },\n      } = selection;\n      const selectedBlocks = document\n        .getLeafBlocksAtRange(selection)\n        .toArray()\n        .map(block => block.text);\n\n      const copiedText = getCopiedText(selectedBlocks, startOffset, endOffset);\n      if (copiedText && clipEvent.clipboardData) {\n        clipEvent.clipboardData.setData('Text', copiedText);\n      }\n\n      return true;\n    },\n\n    onPaste(event: Event, editor: CoreEditor, next: () => any) {\n      const clipEvent = event as ClipboardEvent;\n      clipEvent.preventDefault();\n      if (clipEvent.clipboardData) {\n        const pastedValue = clipEvent.clipboardData.getData('Text');\n        const lines = pastedValue.split('\\n');\n\n        if (lines.length) {\n          editor.insertText(lines[0]);\n          for (const line of lines.slice(1)) {\n            editor.splitBlock().insertText(line);\n          }\n        }\n      }\n\n      return true;\n    },\n  };\n\n  return {\n    ...clipboardPlugin,\n    onCut(event: Event, editor: CoreEditor, next: () => any) {\n      const clipEvent = event as ClipboardEvent;\n      clipboardPlugin.onCopy!(clipEvent, editor, next);\n      editor.deleteAtRange(editor.value.selection);\n\n      return true;\n    },\n  };\n}\n","import { RangeJSON, Range as SlateRange, Editor as CoreEditor } from 'slate';\nimport { Plugin } from '@grafana/slate-react';\nimport { isKeyHotkey } from 'is-hotkey';\n\nconst isIndentLeftHotkey = isKeyHotkey('mod+[');\nconst isShiftTabHotkey = isKeyHotkey('shift+tab');\nconst isIndentRightHotkey = isKeyHotkey('mod+]');\n\nconst SLATE_TAB = '  ';\n\nconst handleTabKey = (event: KeyboardEvent, editor: CoreEditor, next: Function): void => {\n  const {\n    startBlock,\n    endBlock,\n    selection: {\n      start: { offset: startOffset, key: startKey },\n      end: { offset: endOffset, key: endKey },\n    },\n  } = editor.value;\n\n  const first = startBlock.getFirstText();\n\n  const startBlockIsSelected =\n    first && startOffset === 0 && startKey === first.key && endOffset === first.text.length && endKey === first.key;\n\n  if (startBlockIsSelected || !startBlock.equals(endBlock)) {\n    handleIndent(editor, 'right');\n  } else {\n    editor.insertText(SLATE_TAB);\n  }\n};\n\nconst handleIndent = (editor: CoreEditor, indentDirection: 'left' | 'right') => {\n  const curSelection = editor.value.selection;\n  const selectedBlocks = editor.value.document.getLeafBlocksAtRange(curSelection).toArray();\n\n  if (indentDirection === 'left') {\n    for (const block of selectedBlocks) {\n      const blockWhitespace = block.text.length - block.text.trimLeft().length;\n\n      const textKey = block.getFirstText()!.key;\n\n      const rangeProperties: RangeJSON = {\n        anchor: {\n          key: textKey,\n          offset: blockWhitespace,\n          path: [],\n        },\n        focus: {\n          key: textKey,\n          offset: blockWhitespace,\n          path: [],\n        },\n      };\n\n      editor.deleteBackwardAtRange(SlateRange.create(rangeProperties), Math.min(SLATE_TAB.length, blockWhitespace));\n    }\n  } else {\n    const { startText } = editor.value;\n    const textBeforeCaret = startText.text.slice(0, curSelection.start.offset);\n    const isWhiteSpace = /^\\s*$/.test(textBeforeCaret);\n\n    for (const block of selectedBlocks) {\n      editor.insertTextByKey(block.getFirstText()!.key, 0, SLATE_TAB);\n    }\n\n    if (isWhiteSpace) {\n      editor.moveStartBackward(SLATE_TAB.length);\n    }\n  }\n};\n\n// Clears the rest of the line after the caret\nexport function IndentationPlugin(): Plugin {\n  return {\n    onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n      const keyEvent = event as KeyboardEvent;\n      if (isIndentLeftHotkey(keyEvent) || isShiftTabHotkey(keyEvent)) {\n        keyEvent.preventDefault();\n        handleIndent(editor, 'left');\n      } else if (isIndentRightHotkey(keyEvent)) {\n        keyEvent.preventDefault();\n        handleIndent(editor, 'right');\n      } else if (keyEvent.key === 'Tab') {\n        keyEvent.preventDefault();\n        handleTabKey(keyEvent, editor, next);\n      } else {\n        return next();\n      }\n\n      return true;\n    },\n  };\n}\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\n\nfunction getIndent(text: string) {\n  let offset = text.length - text.trimLeft().length;\n  if (offset) {\n    let indent = text[0];\n    while (--offset) {\n      indent += text[0];\n    }\n    return indent;\n  }\n  return '';\n}\n\nexport function NewlinePlugin(): Plugin {\n  return {\n    onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n      const keyEvent = event as KeyboardEvent;\n      const value = editor.value;\n\n      if (value.selection.isExpanded) {\n        return next();\n      }\n\n      if (keyEvent.key === 'Enter') {\n        keyEvent.preventDefault();\n\n        const { startBlock } = value;\n        const currentLineText = startBlock.text;\n        const indent = getIndent(currentLineText);\n\n        return editor\n          .splitBlock()\n          .insertText(indent)\n          .focus();\n      }\n\n      return next();\n    },\n  };\n}\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\n\nexport function RunnerPlugin({ handler }: any): Plugin {\n  return {\n    onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n      const keyEvent = event as KeyboardEvent;\n\n      // Handle enter\n      if (handler && keyEvent.key === 'Enter' && (keyEvent.shiftKey || keyEvent.ctrlKey)) {\n        // Submit on Enter\n        keyEvent.preventDefault();\n        handler(keyEvent);\n        return editor;\n      }\n\n      return next();\n    },\n  };\n}\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\n\nimport { isKeyHotkey } from 'is-hotkey';\n\nconst isSelectLineHotkey = isKeyHotkey('mod+l');\n\n// Clears the rest of the line after the caret\nexport function SelectionShortcutsPlugin(): Plugin {\n  return {\n    onKeyDown(event: Event, editor: CoreEditor, next: () => any) {\n      const keyEvent = event as KeyboardEvent;\n      if (isSelectLineHotkey(keyEvent)) {\n        keyEvent.preventDefault();\n        const { focusBlock, document } = editor.value;\n\n        editor.moveAnchorToStartOfBlock();\n\n        const nextBlock = document.getNextBlock(focusBlock.key);\n        if (nextBlock) {\n          editor.moveFocusToStartOfNextBlock();\n        } else {\n          editor.moveFocusToEndOfText();\n        }\n      } else {\n        return next();\n      }\n\n      return true;\n    },\n  };\n}\n","import React, { useContext } from 'react';\nimport { css, cx } from 'emotion';\n\nimport { CompletionItem, selectThemeVariant, ThemeContext } from '../..';\nimport { GrafanaTheme } from '@grafana/data';\n\nconst getStyles = (theme: GrafanaTheme, height: number, visible: boolean) => {\n  return {\n    typeaheadItem: css`\n      label: type-ahead-item;\n      z-index: 11;\n      padding: ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.md};\n      border-radius: ${theme.border.radius.md};\n      border: ${selectThemeVariant(\n        { light: `solid 1px ${theme.palette.gray5}`, dark: `solid 1px ${theme.palette.dark1}` },\n        theme.type\n      )};\n      overflow-y: scroll;\n      overflow-x: hidden;\n      outline: none;\n      background: ${selectThemeVariant({ light: theme.palette.white, dark: theme.palette.dark4 }, theme.type)};\n      color: ${theme.colors.text};\n      box-shadow: ${selectThemeVariant(\n        { light: `0 5px 10px 0 ${theme.palette.gray5}`, dark: `0 5px 10px 0 ${theme.palette.black}` },\n        theme.type\n      )};\n      visibility: ${visible === true ? 'visible' : 'hidden'};\n      width: 250px;\n      height: ${height + parseInt(theme.spacing.xxs, 10)}px;\n      position: relative;\n      word-break: break-word;\n    `,\n  };\n};\n\ninterface Props {\n  item: CompletionItem;\n  height: number;\n}\n\nexport const TypeaheadInfo: React.FC<Props> = ({ item, height }) => {\n  const visible = item && !!item.documentation;\n  const label = item ? item.label : '';\n  const documentation = item && item.documentation ? item.documentation : '';\n  const theme = useContext(ThemeContext);\n  const styles = getStyles(theme, height, visible);\n\n  return (\n    <div className={cx([styles.typeaheadItem])}>\n      <b>{label}</b>\n      <hr />\n      <span>{documentation}</span>\n    </div>\n  );\n};\n","import React, { useContext } from 'react';\n\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\nimport { CompletionItem, CompletionItemKind } from '../../types/completion';\nimport { ThemeContext } from '../../themes/ThemeContext';\n\ninterface Props {\n  isSelected: boolean;\n  item: CompletionItem;\n  style: any;\n  prefix?: string;\n\n  onClickItem?: (event: React.MouseEvent) => void;\n  onMouseEnter?: () => void;\n  onMouseLeave?: () => void;\n}\n\nconst getStyles = (theme: GrafanaTheme) => ({\n  typeaheadItem: css`\n    label: type-ahead-item;\n    height: auto;\n    font-family: ${theme.typography.fontFamily.monospace};\n    padding: ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.md};\n    font-size: ${theme.typography.size.sm};\n    text-overflow: ellipsis;\n    overflow: hidden;\n    z-index: 11;\n    display: block;\n    white-space: nowrap;\n    cursor: pointer;\n    transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),\n      background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);\n  `,\n\n  typeaheadItemSelected: css`\n    label: type-ahead-item-selected;\n    background-color: ${selectThemeVariant({ light: theme.palette.gray6, dark: theme.palette.dark9 }, theme.type)};\n  `,\n\n  typeaheadItemMatch: css`\n    label: type-ahead-item-match;\n    color: ${theme.palette.yellow};\n    border-bottom: 1px solid ${theme.palette.yellow};\n    padding: inherit;\n    background: inherit;\n  `,\n\n  typeaheadItemGroupTitle: css`\n    label: type-ahead-item-group-title;\n    color: ${theme.colors.textWeak};\n    font-size: ${theme.typography.size.sm};\n    line-height: ${theme.typography.lineHeight.md};\n    padding: ${theme.spacing.sm};\n  `,\n});\n\nexport const TypeaheadItem: React.FC<Props> = (props: Props) => {\n  const theme = useContext(ThemeContext);\n  const styles = getStyles(theme);\n\n  const { isSelected, item, prefix, style, onMouseEnter, onMouseLeave, onClickItem } = props;\n  const className = isSelected ? cx([styles.typeaheadItem, styles.typeaheadItemSelected]) : cx([styles.typeaheadItem]);\n  const highlightClassName = cx([styles.typeaheadItemMatch]);\n  const itemGroupTitleClassName = cx([styles.typeaheadItemGroupTitle]);\n  const label = item.label || '';\n\n  if (item.kind === CompletionItemKind.GroupTitle) {\n    return (\n      <li className={itemGroupTitleClassName} style={style}>\n        <span>{label}</span>\n      </li>\n    );\n  }\n\n  return (\n    <li\n      className={className}\n      style={style}\n      onMouseDown={onClickItem}\n      onMouseEnter={onMouseEnter}\n      onMouseLeave={onMouseLeave}\n    >\n      <Highlighter textToHighlight={label} searchWords={[prefix]} highlightClassName={highlightClassName} />\n    </li>\n  );\n};\n","import { default as calculateSize } from 'calculate-size';\nimport { CompletionItemGroup, CompletionItem, CompletionItemKind } from '../types/completion';\nimport { GrafanaTheme } from '@grafana/data';\n\nexport const flattenGroupItems = (groupedItems: CompletionItemGroup[]): CompletionItem[] => {\n  return groupedItems.reduce((all: CompletionItem[], { items, label }) => {\n    const titleItem: CompletionItem = {\n      label,\n      kind: CompletionItemKind.GroupTitle,\n    };\n    all.push(titleItem, ...items);\n    return all;\n  }, []);\n};\n\nexport const calculateLongestLabel = (allItems: CompletionItem[]): string => {\n  return allItems.reduce((longest, current) => {\n    return longest.length < current.label.length ? current.label : longest;\n  }, '');\n};\n\nexport const calculateListSizes = (theme: GrafanaTheme, allItems: CompletionItem[], longestLabel: string) => {\n  const size = calculateSize(longestLabel, {\n    font: theme.typography.fontFamily.monospace,\n    fontSize: theme.typography.size.sm,\n    fontWeight: 'normal',\n  });\n\n  const listWidth = calculateListWidth(size.width, theme);\n  const itemHeight = calculateItemHeight(size.height, theme);\n  const listHeight = calculateListHeight(itemHeight, allItems);\n\n  return {\n    listWidth,\n    listHeight,\n    itemHeight,\n  };\n};\n\nexport const calculateItemHeight = (longestLabelHeight: number, theme: GrafanaTheme) => {\n  const horizontalPadding = parseInt(theme.spacing.sm, 10) * 2;\n  const itemHeight = longestLabelHeight + horizontalPadding;\n\n  return itemHeight;\n};\n\nexport const calculateListWidth = (longestLabelWidth: number, theme: GrafanaTheme) => {\n  const verticalPadding = parseInt(theme.spacing.sm, 10) + parseInt(theme.spacing.md, 10);\n  const maxWidth = 800;\n  const listWidth = Math.min(Math.max(longestLabelWidth + verticalPadding, 200), maxWidth);\n\n  return listWidth;\n};\n\nexport const calculateListHeight = (itemHeight: number, allItems: CompletionItem[]) => {\n  const numberOfItemsToShow = Math.min(allItems.length, 10);\n  const minHeight = 100;\n  const totalHeight = numberOfItemsToShow * itemHeight;\n  const listHeight = Math.max(totalHeight, minHeight);\n\n  return listHeight;\n};\n","import React, { createRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport _ from 'lodash';\nimport { FixedSizeList } from 'react-window';\n\nimport { TypeaheadInfo } from './TypeaheadInfo';\nimport { TypeaheadItem } from './TypeaheadItem';\nimport { flattenGroupItems, calculateLongestLabel, calculateListSizes } from '../../utils/typeahead';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { CompletionItem, CompletionItemGroup, CompletionItemKind } from '../../types/completion';\n\nconst modulo = (a: number, n: number) => a - n * Math.floor(a / n);\n\ninterface Props {\n  origin: string;\n  groupedItems: CompletionItemGroup[];\n  prefix?: string;\n  menuRef?: (el: Typeahead) => void;\n  onSelectSuggestion?: (suggestion: CompletionItem) => void;\n  isOpen?: boolean;\n}\n\nexport interface State {\n  allItems: CompletionItem[];\n  listWidth: number;\n  listHeight: number;\n  itemHeight: number;\n  hoveredItem: number | null;\n  typeaheadIndex: number | null;\n}\n\nexport class Typeahead extends React.PureComponent<Props, State> {\n  static contextType = ThemeContext;\n  context!: React.ContextType<typeof ThemeContext>;\n  listRef = createRef<FixedSizeList>();\n\n  state: State = {\n    hoveredItem: null,\n    typeaheadIndex: null,\n    allItems: [],\n    listWidth: -1,\n    listHeight: -1,\n    itemHeight: -1,\n  };\n\n  componentDidMount = () => {\n    if (this.props.menuRef) {\n      this.props.menuRef(this);\n    }\n\n    document.addEventListener('selectionchange', this.handleSelectionChange);\n\n    const allItems = flattenGroupItems(this.props.groupedItems);\n    const longestLabel = calculateLongestLabel(allItems);\n    const { listWidth, listHeight, itemHeight } = calculateListSizes(this.context, allItems, longestLabel);\n    this.setState({\n      listWidth,\n      listHeight,\n      itemHeight,\n      allItems,\n    });\n  };\n\n  componentWillUnmount = () => {\n    document.removeEventListener('selectionchange', this.handleSelectionChange);\n  };\n\n  handleSelectionChange = () => {\n    this.forceUpdate();\n  };\n\n  componentDidUpdate = (prevProps: Readonly<Props>, prevState: Readonly<State>) => {\n    if (\n      this.state.typeaheadIndex !== null &&\n      prevState.typeaheadIndex !== this.state.typeaheadIndex &&\n      this.listRef &&\n      this.listRef.current\n    ) {\n      if (this.state.typeaheadIndex === 1) {\n        this.listRef.current.scrollToItem(0); // special case for handling the first group label\n        return;\n      }\n      this.listRef.current.scrollToItem(this.state.typeaheadIndex);\n    }\n\n    if (_.isEqual(prevProps.groupedItems, this.props.groupedItems) === false) {\n      const allItems = flattenGroupItems(this.props.groupedItems);\n      const longestLabel = calculateLongestLabel(allItems);\n      const { listWidth, listHeight, itemHeight } = calculateListSizes(this.context, allItems, longestLabel);\n      this.setState({ listWidth, listHeight, itemHeight, allItems, typeaheadIndex: null });\n    }\n  };\n\n  onMouseEnter = (index: number) => {\n    this.setState({\n      hoveredItem: index,\n    });\n  };\n\n  onMouseLeave = () => {\n    this.setState({\n      hoveredItem: null,\n    });\n  };\n\n  moveMenuIndex = (moveAmount: number) => {\n    const itemCount = this.state.allItems.length;\n    if (itemCount) {\n      // Select next suggestion\n      const typeaheadIndex = this.state.typeaheadIndex || 0;\n      let newTypeaheadIndex = modulo(typeaheadIndex + moveAmount, itemCount);\n\n      if (this.state.allItems[newTypeaheadIndex].kind === CompletionItemKind.GroupTitle) {\n        newTypeaheadIndex = modulo(newTypeaheadIndex + moveAmount, itemCount);\n      }\n\n      this.setState({\n        typeaheadIndex: newTypeaheadIndex,\n      });\n\n      return;\n    }\n  };\n\n  insertSuggestion = () => {\n    if (this.props.onSelectSuggestion && this.state.typeaheadIndex !== null) {\n      this.props.onSelectSuggestion(this.state.allItems[this.state.typeaheadIndex]);\n    }\n  };\n\n  get menuPosition(): string {\n    // Exit for unit tests\n    if (!window.getSelection) {\n      return '';\n    }\n\n    const selection = window.getSelection();\n    const node = selection && selection.anchorNode;\n\n    // Align menu overlay to editor node\n    if (node && node.parentElement) {\n      // Read from DOM\n      const rect = node.parentElement.getBoundingClientRect();\n      const scrollX = window.scrollX;\n      const scrollY = window.scrollY;\n\n      return `position: absolute; display: flex; top: ${rect.top + scrollY + rect.height + 6}px; left: ${rect.left +\n        scrollX -\n        2}px`;\n    }\n\n    return '';\n  }\n\n  render() {\n    const { prefix, isOpen = false, origin } = this.props;\n    const { allItems, listWidth, listHeight, itemHeight, hoveredItem, typeaheadIndex } = this.state;\n\n    const showDocumentation = hoveredItem || typeaheadIndex;\n    const documentationItem = allItems[hoveredItem ? hoveredItem : typeaheadIndex || 0];\n\n    return (\n      <Portal origin={origin} isOpen={isOpen} style={this.menuPosition}>\n        <ul className=\"typeahead\">\n          <FixedSizeList\n            ref={this.listRef}\n            itemCount={allItems.length}\n            itemSize={itemHeight}\n            itemKey={index => {\n              const item = allItems && allItems[index];\n              const key = item ? `${index}-${item.label}` : `${index}`;\n              return key;\n            }}\n            width={listWidth}\n            height={listHeight}\n          >\n            {({ index, style }) => {\n              const item = allItems && allItems[index];\n              if (!item) {\n                return null;\n              }\n\n              return (\n                <TypeaheadItem\n                  onClickItem={() => (this.props.onSelectSuggestion ? this.props.onSelectSuggestion(item) : {})}\n                  isSelected={typeaheadIndex === null ? false : allItems[typeaheadIndex] === item}\n                  item={item}\n                  prefix={prefix}\n                  style={style}\n                  onMouseEnter={() => this.onMouseEnter(index)}\n                  onMouseLeave={this.onMouseLeave}\n                />\n              );\n            }}\n          </FixedSizeList>\n        </ul>\n\n        {showDocumentation && <TypeaheadInfo height={listHeight} item={documentationItem} />}\n      </Portal>\n    );\n  }\n}\n\ninterface PortalProps {\n  index?: number;\n  isOpen: boolean;\n  origin: string;\n  style: string;\n}\n\nclass Portal extends React.PureComponent<PortalProps, {}> {\n  node: HTMLElement;\n\n  constructor(props: PortalProps) {\n    super(props);\n    const { index = 0, origin = 'query', style } = props;\n    this.node = document.createElement('div');\n    this.node.setAttribute('style', style);\n    this.node.classList.add(`slate-typeahead`, `slate-typeahead-${origin}-${index}`);\n    document.body.appendChild(this.node);\n  }\n\n  componentWillUnmount() {\n    document.body.removeChild(this.node);\n  }\n\n  render() {\n    if (this.props.isOpen) {\n      this.node.setAttribute('style', this.props.style);\n      this.node.classList.add(`slate-typeahead--open`);\n      return ReactDOM.createPortal(this.props.children, this.node);\n    } else {\n      this.node.classList.remove(`slate-typeahead--open`);\n    }\n\n    return null;\n  }\n}\n","import React from 'react';\nimport debounce from 'lodash/debounce';\nimport sortBy from 'lodash/sortBy';\n\nimport { Editor as CoreEditor } from 'slate';\nimport { Plugin as SlatePlugin } from '@grafana/slate-react';\n\nimport TOKEN_MARK from './slate-prism/TOKEN_MARK';\nimport { Typeahead } from '../components/Typeahead/Typeahead';\nimport { CompletionItem, TypeaheadOutput, TypeaheadInput, SuggestionsState } from '../types/completion';\nimport { makeFragment } from '../utils/slate';\n\nexport const TYPEAHEAD_DEBOUNCE = 250;\n\n// Commands added to the editor by this plugin.\ninterface SuggestionsPluginCommands {\n  selectSuggestion: (suggestion: CompletionItem) => CoreEditor;\n  applyTypeahead: (suggestion: CompletionItem) => CoreEditor;\n}\n\nexport function SuggestionsPlugin({\n  onTypeahead,\n  cleanText,\n  onWillApplySuggestion,\n  portalOrigin,\n}: {\n  onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>;\n  cleanText?: (text: string) => string;\n  onWillApplySuggestion?: (suggestion: string, state: SuggestionsState) => string;\n  portalOrigin: string;\n}): SlatePlugin {\n  let typeaheadRef: Typeahead;\n  let state: SuggestionsState = {\n    groupedItems: [],\n    typeaheadPrefix: '',\n    typeaheadContext: '',\n    typeaheadText: '',\n  };\n  const handleTypeaheadDebounced = debounce(handleTypeahead, TYPEAHEAD_DEBOUNCE);\n\n  const setState = (update: Partial<SuggestionsState>) => {\n    state = {\n      ...state,\n      ...update,\n    };\n  };\n\n  return {\n    onBlur: (event, editor, next) => {\n      state = {\n        ...state,\n        groupedItems: [],\n      };\n\n      return next();\n    },\n\n    onClick: (event, editor, next) => {\n      state = {\n        ...state,\n        groupedItems: [],\n      };\n\n      return next();\n    },\n\n    onKeyDown: (event: Event, editor, next) => {\n      const keyEvent = event as KeyboardEvent;\n      const currentSuggestions = state.groupedItems;\n\n      const hasSuggestions = currentSuggestions.length;\n\n      switch (keyEvent.key) {\n        case 'Escape': {\n          if (hasSuggestions) {\n            keyEvent.preventDefault();\n\n            state = {\n              ...state,\n              groupedItems: [],\n            };\n\n            // Bogus edit to re-render editor\n            return editor.insertText('');\n          }\n\n          break;\n        }\n\n        case 'ArrowDown':\n        case 'ArrowUp':\n          if (hasSuggestions) {\n            keyEvent.preventDefault();\n            typeaheadRef.moveMenuIndex(keyEvent.key === 'ArrowDown' ? 1 : -1);\n            return;\n          }\n\n          break;\n\n        case 'Enter': {\n          if (!(keyEvent.shiftKey || keyEvent.ctrlKey) && hasSuggestions) {\n            keyEvent.preventDefault();\n            return typeaheadRef.insertSuggestion();\n          }\n\n          break;\n        }\n\n        case 'Tab': {\n          if (hasSuggestions) {\n            keyEvent.preventDefault();\n            return typeaheadRef.insertSuggestion();\n          }\n\n          break;\n        }\n\n        default: {\n          // Don't react on meta keys\n          if (keyEvent.key.length === 1) {\n            handleTypeaheadDebounced(editor, setState, onTypeahead, cleanText);\n          }\n          break;\n        }\n      }\n\n      return next();\n    },\n\n    commands: {\n      selectSuggestion: (editor: CoreEditor, suggestion: CompletionItem): CoreEditor => {\n        const suggestions = state.groupedItems;\n        if (!suggestions || !suggestions.length) {\n          return editor;\n        }\n\n        // @ts-ignore\n        const ed = editor.applyTypeahead(suggestion);\n        handleTypeaheadDebounced(editor, setState, onTypeahead, cleanText);\n        return ed;\n      },\n\n      applyTypeahead: (editor: CoreEditor, suggestion: CompletionItem): CoreEditor => {\n        let suggestionText = suggestion.insertText || suggestion.label;\n\n        const preserveSuffix = suggestion.kind === 'function';\n        const move = suggestion.move || 0;\n\n        const { typeaheadPrefix, typeaheadText, typeaheadContext } = state;\n\n        if (onWillApplySuggestion) {\n          suggestionText = onWillApplySuggestion(suggestionText, {\n            groupedItems: state.groupedItems,\n            typeaheadContext,\n            typeaheadPrefix,\n            typeaheadText,\n          });\n        }\n\n        // Remove the current, incomplete text and replace it with the selected suggestion\n        const backward = suggestion.deleteBackwards || typeaheadPrefix.length;\n        const text = cleanText ? cleanText(typeaheadText) : typeaheadText;\n        const suffixLength = text.length - typeaheadPrefix.length;\n        const offset = typeaheadText.indexOf(typeaheadPrefix);\n        const midWord = typeaheadPrefix && ((suffixLength > 0 && offset > -1) || suggestionText === typeaheadText);\n        const forward = midWord && !preserveSuffix ? suffixLength + offset : 0;\n\n        // If new-lines, apply suggestion as block\n        if (suggestionText.match(/\\n/)) {\n          const fragment = makeFragment(suggestionText);\n          return editor\n            .deleteBackward(backward)\n            .deleteForward(forward)\n            .insertFragment(fragment)\n            .focus();\n        }\n\n        state = {\n          ...state,\n          groupedItems: [],\n        };\n\n        return editor\n          .deleteBackward(backward)\n          .deleteForward(forward)\n          .insertText(suggestionText)\n          .moveForward(move)\n          .focus();\n      },\n    },\n\n    renderEditor: (props, editor, next) => {\n      if (editor.value.selection.isExpanded) {\n        return next();\n      }\n\n      const children = next();\n\n      return (\n        <>\n          {children}\n          <Typeahead\n            menuRef={(menu: Typeahead) => (typeaheadRef = menu)}\n            origin={portalOrigin}\n            prefix={state.typeaheadPrefix}\n            isOpen={!!state.groupedItems.length}\n            groupedItems={state.groupedItems}\n            onSelectSuggestion={(editor as CoreEditor & SuggestionsPluginCommands).selectSuggestion}\n          />\n        </>\n      );\n    },\n  };\n}\n\nconst handleTypeahead = async (\n  editor: CoreEditor,\n  onStateChange: (state: Partial<SuggestionsState>) => void,\n  onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>,\n  cleanText?: (text: string) => string\n): Promise<void> => {\n  if (!onTypeahead) {\n    return;\n  }\n\n  const { value } = editor;\n  const { selection } = value;\n\n  // Get decorations associated with the current line\n  const parentBlock = value.document.getClosestBlock(value.focusBlock.key);\n  const selectionStartOffset = value.selection.start.offset - 1;\n  const decorations = parentBlock && parentBlock.getDecorations(editor as any);\n\n  const filteredDecorations = decorations\n    ? decorations\n        .filter(\n          decoration =>\n            decoration!.start.offset <= selectionStartOffset &&\n            decoration!.end.offset > selectionStartOffset &&\n            decoration!.type === TOKEN_MARK\n        )\n        .toArray()\n    : [];\n\n  // Find the first label key to the left of the cursor\n  const labelKeyDec =\n    decorations &&\n    decorations\n      .filter(\n        decoration =>\n          decoration!.end.offset <= selectionStartOffset &&\n          decoration!.type === TOKEN_MARK &&\n          decoration!.data.get('className').includes('label-key')\n      )\n      .last();\n\n  const labelKey = labelKeyDec && value.focusText.text.slice(labelKeyDec.start.offset, labelKeyDec.end.offset);\n\n  const wrapperClasses = filteredDecorations\n    .map(decoration => decoration.data.get('className'))\n    .join(' ')\n    .split(' ')\n    .filter(className => className.length);\n\n  let text = value.focusText.text;\n  let prefix = text.slice(0, selection.focus.offset);\n\n  if (filteredDecorations.length) {\n    text = value.focusText.text.slice(filteredDecorations[0].start.offset, filteredDecorations[0].end.offset);\n    prefix = value.focusText.text.slice(filteredDecorations[0].start.offset, selection.focus.offset);\n  }\n\n  // Label values could have valid characters erased if `cleanText()` is\n  // blindly applied, which would undesirably interfere with suggestions\n  const labelValueMatch = prefix.match(/(?:!?=~?\"?|\")(.*)/);\n  if (labelValueMatch) {\n    prefix = labelValueMatch[1];\n  } else if (cleanText) {\n    prefix = cleanText(prefix);\n  }\n\n  const { suggestions, context } = await onTypeahead({\n    prefix,\n    text,\n    value,\n    wrapperClasses,\n    labelKey: labelKey || undefined,\n    editor,\n  });\n\n  const filteredSuggestions = suggestions\n    .map(group => {\n      if (!group.items) {\n        return group;\n      }\n\n      let newGroup = { ...group };\n      if (prefix) {\n        // Filter groups based on prefix\n        if (!group.skipFilter) {\n          newGroup.items = newGroup.items.filter(c => (c.filterText || c.label).length >= prefix.length);\n          if (group.prefixMatch) {\n            newGroup.items = newGroup.items.filter(c => (c.filterText || c.label).startsWith(prefix));\n          } else {\n            newGroup.items = newGroup.items.filter(c => (c.filterText || c.label).includes(prefix));\n          }\n        }\n\n        // Filter out the already typed value (prefix) unless it inserts custom text not matching the prefix\n        newGroup.items = newGroup.items.filter(c => !(c.insertText === prefix || (c.filterText ?? c.label) === prefix));\n      }\n\n      if (!group.skipSort) {\n        newGroup.items = sortBy(newGroup.items, (item: CompletionItem) => item.sortText || item.label);\n      }\n\n      return newGroup;\n    })\n    .filter(gr => gr.items && gr.items.length); // Filter out empty groups\n\n  onStateChange({\n    groupedItems: filteredSuggestions,\n    typeaheadPrefix: prefix,\n    typeaheadContext: context,\n    typeaheadText: text,\n  });\n\n  // Bogus edit to force re-render\n  editor.blur().focus();\n};\n","export { BracesPlugin } from './braces';\nexport { ClearPlugin } from './clear';\nexport { ClipboardPlugin } from './clipboard';\nexport { IndentationPlugin } from './indentation';\nexport { NewlinePlugin } from './newline';\nexport { RunnerPlugin } from './runner';\nexport { SelectionShortcutsPlugin } from './selection_shortcuts';\nexport { SlatePrism, Token } from './slate-prism';\nexport { SuggestionsPlugin } from './suggestions';\n","/**\n * A library containing the different design components of the Grafana ecosystem.\n *\n * @packageDocumentation\n */\nexport * from './selectors';\nexport * from './types';\n","export default function resetSelectStyles() {\n  return {\n    clearIndicator: () => ({}),\n    container: () => ({}),\n    control: () => ({}),\n    dropdownIndicator: () => ({}),\n    group: () => ({}),\n    groupHeading: () => ({}),\n    indicatorsContainer: () => ({}),\n    indicatorSeparator: () => ({}),\n    input: () => ({}),\n    loadingIndicator: () => ({}),\n    loadingMessage: () => ({}),\n    menu: () => ({}),\n    menuList: ({ maxHeight }: { maxHeight: number }) => ({\n      maxHeight,\n    }),\n    multiValue: () => ({}),\n    multiValueLabel: () => ({}),\n    multiValueRemove: () => ({}),\n    noOptionsMessage: () => ({}),\n    option: () => ({}),\n    placeholder: () => ({}),\n    singleValue: () => ({}),\n    valueContainer: () => ({}),\n  };\n}\n","import React from 'react';\nimport { Label } from './Label';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { FieldValidationMessage } from './FieldValidationMessage';\n\nexport interface FieldProps {\n  /** Form input element, i.e Input or Switch */\n  children: React.ReactElement;\n  /** Label for the field */\n  label?: React.ReactNode;\n  /** Description of the field */\n  description?: string;\n  /** Indicates if field is in invalid state */\n  invalid?: boolean;\n  /** Indicates if field is in loading state */\n  loading?: boolean;\n  /** Indicates if field is disabled */\n  disabled?: boolean;\n  /** Indicates if field is required */\n  required?: boolean;\n  /** Error message to display */\n  error?: string;\n  /** Indicates horizontal layout of the field */\n  horizontal?: boolean;\n  className?: string;\n}\n\nexport const getFieldStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    field: css`\n      display: flex;\n      flex-direction: column;\n      margin-bottom: ${theme.spacing.formSpacingBase * 2}px;\n    `,\n    fieldHorizontal: css`\n      flex-direction: row;\n      justify-content: space-between;\n      flex-wrap: wrap;\n    `,\n    fieldValidationWrapper: css`\n      margin-top: ${theme.spacing.formSpacingBase / 2}px;\n    `,\n    fieldValidationWrapperHorizontal: css`\n      flex: 1 1 100%;\n    `,\n  };\n});\n\nexport const Field: React.FC<FieldProps> = ({\n  label,\n  description,\n  horizontal,\n  invalid,\n  loading,\n  disabled,\n  required,\n  error,\n  children,\n  className,\n}) => {\n  const theme = useTheme();\n  let inputId;\n  const styles = getFieldStyles(theme);\n\n  // Get the first, and only, child to retrieve form input's id\n  const child = React.Children.map(children, c => c)[0];\n\n  if (child) {\n    // Retrieve input's id to apply on the label for correct click interaction\n    inputId = (child as React.ReactElement<{ id?: string }>).props.id;\n  }\n  const labelElement =\n    typeof label === 'string' ? (\n      <Label htmlFor={inputId} description={description}>\n        {`${label}${required ? ' *' : ''}`}\n      </Label>\n    ) : (\n      label\n    );\n\n  return (\n    <div className={cx(styles.field, horizontal && styles.fieldHorizontal, className)}>\n      {labelElement}\n      <div>\n        {React.cloneElement(children, { invalid, disabled, loading })}\n        {invalid && error && !horizontal && (\n          <div className={styles.fieldValidationWrapper}>\n            <FieldValidationMessage>{error}</FieldValidationMessage>\n          </div>\n        )}\n      </div>\n\n      {invalid && error && horizontal && (\n        <div className={cx(styles.fieldValidationWrapper, styles.fieldValidationWrapperHorizontal)}>\n          <FieldValidationMessage>{error}</FieldValidationMessage>\n        </div>\n      )}\n    </div>\n  );\n};\n","export enum DataTransformerID {\n  // join = 'join', // Pick a field and merge all series based on that field\n  append = 'append',\n  //  rotate = 'rotate', // Columns to rows\n  reduce = 'reduce',\n  order = 'order',\n  organize = 'organize',\n  rename = 'rename',\n  calculateField = 'calculateField',\n  seriesToColumns = 'seriesToColumns',\n  labelsToFields = 'labelsToFields',\n  filterFields = 'filterFields',\n  filterFieldsByName = 'filterFieldsByName',\n  filterFrames = 'filterFrames',\n  filterByRefId = 'filterByRefId',\n  noop = 'noop',\n  ensureColumns = 'ensureColumns',\n}\n","var path = 'public/app/plugins/datasource/cloudwatch/partials/annotations.editor.html';\nvar html = \"<cloudwatch-annotation-query-editor datasource=ctrl.datasource on-change=ctrl.onChange query=ctrl.annotation></cloudwatch-annotation-query-editor>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { SelectCommonProps, MultiSelectCommonProps, SelectAsyncProps } from './types';\nimport { SelectBase } from './SelectBase';\n\nexport function Select<T>(props: SelectCommonProps<T>) {\n  return <SelectBase {...props} />;\n}\n\nexport function MultiSelect<T>(props: MultiSelectCommonProps<T>) {\n  // @ts-ignore\n  return <SelectBase {...props} isMulti />;\n}\n\ninterface AsyncSelectProps<T> extends Omit<SelectCommonProps<T>, 'options'>, SelectAsyncProps<T> {\n  // AsyncSelect has options stored internally. We cannot enable plain values as we don't have access to the fetched options\n  value?: SelectableValue<T>;\n  invalid?: boolean;\n}\n\nexport function AsyncSelect<T>(props: AsyncSelectProps<T>) {\n  return <SelectBase {...props} />;\n}\n\ninterface AsyncMultiSelectProps<T> extends Omit<MultiSelectCommonProps<T>, 'options'>, SelectAsyncProps<T> {\n  // AsyncSelect has options stored internally. We cannot enable plain values as we don't have access to the fetched options\n  value?: Array<SelectableValue<T>>;\n}\n\nexport function AsyncMultiSelect<T>(props: AsyncMultiSelectProps<T>) {\n  // @ts-ignore\n  return <SelectBase {...props} isMulti />;\n}\n","import React, { FC } from 'react';\nimport { escapeStringForRegex, unEscapeStringFromRegex } from '@grafana/data';\nimport { Input, Icon } from '@grafana/ui';\n\nexport interface Props {\n  value: string | undefined;\n  placeholder?: string;\n  labelClassName?: string;\n  inputClassName?: string;\n  onChange: (value: string) => void;\n}\n\nexport const FilterInput: FC<Props> = props => (\n  <Input\n    // Replaces the usage of ref\n    autoFocus\n    prefix={<Icon name=\"search\" />}\n    width={40}\n    type=\"text\"\n    value={props.value ? unEscapeStringFromRegex(props.value) : ''}\n    onChange={event => props.onChange(escapeStringForRegex(event.currentTarget.value))}\n    placeholder={props.placeholder ?? ''}\n  />\n);\n","// This needs to be in its own file to avoid circular references\n\n// Builtin Predicates\n// not using 'any' and 'never' since they are reservered keywords\nexport enum MatcherID {\n  anyMatch = 'anyMatch', // checks children\n  allMatch = 'allMatch', // checks children\n  invertMatch = 'invertMatch', // checks child\n  alwaysMatch = 'alwaysMatch',\n  neverMatch = 'neverMatch',\n}\n\nexport enum FieldMatcherID {\n  // Specific Types\n  numeric = 'numeric',\n  time = 'time',\n\n  // With arguments\n  byType = 'byType',\n  byName = 'byName',\n  byNames = 'byNames',\n  byRegexp = 'byRegexp',\n  byRegexpOrNames = 'byRegexpOrNames',\n  // byIndex = 'byIndex',\n  // byLabel = 'byLabel',\n}\n\n/**\n * Field name matchers\n */\nexport enum FrameMatcherID {\n  byName = 'byName',\n  byRefId = 'byRefId',\n  byIndex = 'byIndex',\n  byLabel = 'byLabel',\n}\n","import { DataTransformerID } from './ids';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { DataFrame, Field } from '../../types';\nimport { getFieldDisplayName } from '../../field/fieldState';\n\nexport interface OrderFieldsTransformerOptions {\n  indexByName: Record<string, number>;\n}\n\nexport const orderFieldsTransformer: DataTransformerInfo<OrderFieldsTransformerOptions> = {\n  id: DataTransformerID.order,\n  name: 'Order fields by name',\n  description: 'Order fields based on configuration given by user',\n  defaultOptions: {\n    indexByName: {},\n  },\n\n  /**\n   * Return a modified copy of the series.  If the transform is not or should not\n   * be applied, just return the input series\n   */\n  transformer: (options: OrderFieldsTransformerOptions) => {\n    const orderer = createFieldsOrderer(options.indexByName);\n\n    return (data: DataFrame[]) => {\n      if (!Array.isArray(data) || data.length === 0) {\n        return data;\n      }\n\n      return data.map(frame => ({\n        ...frame,\n        fields: orderer(frame.fields, data, frame),\n      }));\n    };\n  },\n};\n\nexport const createOrderFieldsComparer = (indexByName: Record<string, number>) => (a: string, b: string) => {\n  return indexOfField(a, indexByName) - indexOfField(b, indexByName);\n};\n\nconst createFieldsOrderer = (indexByName: Record<string, number>) => (\n  fields: Field[],\n  data: DataFrame[],\n  frame: DataFrame\n) => {\n  if (!Array.isArray(fields) || fields.length === 0) {\n    return fields;\n  }\n  if (!indexByName || Object.keys(indexByName).length === 0) {\n    return fields;\n  }\n  const comparer = createOrderFieldsComparer(indexByName);\n  return fields.sort((a, b) => comparer(getFieldDisplayName(a, frame, data), getFieldDisplayName(b, frame, data)));\n};\n\nconst indexOfField = (fieldName: string, indexByName: Record<string, number>) => {\n  if (Number.isInteger(indexByName[fieldName])) {\n    return indexByName[fieldName];\n  }\n  return Number.MAX_SAFE_INTEGER;\n};\n","import { Dispatch } from 'react';\nimport { Action } from 'redux';\nimport { SelectableValue } from '@grafana/data';\nimport { FolderInfo } from '../../types';\n\nexport enum DashboardSearchItemType {\n  DashDB = 'dash-db',\n  DashHome = 'dash-home',\n  DashFolder = 'dash-folder',\n}\n\nexport interface DashboardSection {\n  id: number;\n  uid?: string;\n  title: string;\n  expanded?: boolean;\n  url: string;\n  icon?: string;\n  score?: number;\n  checked?: boolean;\n  items: DashboardSectionItem[];\n  toggle?: (section: DashboardSection) => Promise<DashboardSection>;\n  selected?: boolean;\n  type: DashboardSearchItemType;\n  slug?: string;\n  itemsFetching?: boolean;\n}\n\nexport interface DashboardSectionItem {\n  checked?: boolean;\n  folderId?: number;\n  folderTitle?: string;\n  folderUid?: string;\n  folderUrl?: string;\n  id: number;\n  isStarred: boolean;\n  selected?: boolean;\n  tags: string[];\n  title: string;\n  type: DashboardSearchItemType;\n  uid?: string;\n  uri: string;\n  url: string;\n}\n\nexport interface DashboardSearchHit extends DashboardSectionItem, DashboardSection {}\n\nexport interface DashboardTag {\n  term: string;\n  count: number;\n}\n\nexport interface SearchAction extends Action {\n  payload?: any;\n}\n\nexport interface OpenSearchParams {\n  query?: string;\n}\n\nexport interface UidsToDelete {\n  folders: string[];\n  dashboards: string[];\n}\n\nexport interface DashboardQuery {\n  query: string;\n  tag: string[];\n  starred: boolean;\n  skipRecent: boolean;\n  skipStarred: boolean;\n  folderIds: number[];\n  sort: SelectableValue | null;\n  layout: SearchLayout;\n}\n\nexport type SearchReducer<S> = [S, Dispatch<SearchAction>];\ninterface UseSearchParams {\n  queryParsing?: boolean;\n  searchCallback?: (folderUid: string | undefined) => any;\n  folderUid?: string;\n}\n\nexport type UseSearch = <S>(\n  query: DashboardQuery,\n  reducer: SearchReducer<S>,\n  params: UseSearchParams\n) => { state: S; dispatch: Dispatch<SearchAction>; onToggleSection: (section: DashboardSection) => void };\n\nexport type OnToggleChecked = (item: DashboardSectionItem | DashboardSection) => void;\nexport type OnDeleteItems = (folders: string[], dashboards: string[]) => void;\nexport type OnMoveItems = (selectedDashboards: DashboardSectionItem[], folder: FolderInfo | null) => void;\n\nexport enum SearchLayout {\n  List = 'list',\n  Folders = 'folders',\n}\n","import { Vector } from '../types/vector';\n\nexport function vectorToArray<T>(v: Vector<T>): T[] {\n  const arr: T[] = [];\n  for (let i = 0; i < v.length; i++) {\n    arr[i] = v.get(i);\n  }\n  return arr;\n}\n","import { AnyAction, createAction } from '@reduxjs/toolkit';\nimport { DataSourcePluginMeta, DataSourceSettings } from '@grafana/data';\n\nimport { DataSourcesState, DataSourceSettingsState } from 'app/types';\nimport { LayoutMode, LayoutModes } from 'app/core/components/LayoutSelector/LayoutSelector';\nimport { DataSourceTypesLoadedPayload } from './actions';\nimport { GenericDataSourcePlugin } from '../settings/PluginSettings';\n\nexport const initialState: DataSourcesState = {\n  dataSources: [],\n  plugins: [],\n  categories: [],\n  dataSource: {} as DataSourceSettings,\n  layoutMode: LayoutModes.List,\n  searchQuery: '',\n  dataSourcesCount: 0,\n  dataSourceTypeSearchQuery: '',\n  hasFetched: false,\n  isLoadingDataSources: false,\n  dataSourceMeta: {} as DataSourcePluginMeta,\n};\n\nexport const dataSourceLoaded = createAction<DataSourceSettings>('dataSources/dataSourceLoaded');\nexport const dataSourcesLoaded = createAction<DataSourceSettings[]>('dataSources/dataSourcesLoaded');\nexport const dataSourceMetaLoaded = createAction<DataSourcePluginMeta>('dataSources/dataSourceMetaLoaded');\nexport const dataSourcePluginsLoad = createAction('dataSources/dataSourcePluginsLoad');\nexport const dataSourcePluginsLoaded = createAction<DataSourceTypesLoadedPayload>(\n  'dataSources/dataSourcePluginsLoaded'\n);\nexport const setDataSourcesSearchQuery = createAction<string>('dataSources/setDataSourcesSearchQuery');\nexport const setDataSourcesLayoutMode = createAction<LayoutMode>('dataSources/setDataSourcesLayoutMode');\nexport const setDataSourceTypeSearchQuery = createAction<string>('dataSources/setDataSourceTypeSearchQuery');\nexport const setDataSourceName = createAction<string>('dataSources/setDataSourceName');\nexport const setIsDefault = createAction<boolean>('dataSources/setIsDefault');\n\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because Angular would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const dataSourcesReducer = (state: DataSourcesState = initialState, action: AnyAction): DataSourcesState => {\n  if (dataSourcesLoaded.match(action)) {\n    return {\n      ...state,\n      hasFetched: true,\n      dataSources: action.payload,\n      dataSourcesCount: action.payload.length,\n    };\n  }\n\n  if (dataSourceLoaded.match(action)) {\n    return { ...state, dataSource: action.payload };\n  }\n\n  if (setDataSourcesSearchQuery.match(action)) {\n    return { ...state, searchQuery: action.payload };\n  }\n\n  if (setDataSourcesLayoutMode.match(action)) {\n    return { ...state, layoutMode: action.payload };\n  }\n\n  if (dataSourcePluginsLoad.match(action)) {\n    return { ...state, plugins: [], isLoadingDataSources: true };\n  }\n\n  if (dataSourcePluginsLoaded.match(action)) {\n    return {\n      ...state,\n      plugins: action.payload.plugins,\n      categories: action.payload.categories,\n      isLoadingDataSources: false,\n    };\n  }\n\n  if (setDataSourceTypeSearchQuery.match(action)) {\n    return { ...state, dataSourceTypeSearchQuery: action.payload };\n  }\n\n  if (dataSourceMetaLoaded.match(action)) {\n    return { ...state, dataSourceMeta: action.payload };\n  }\n\n  if (setDataSourceName.match(action)) {\n    return { ...state, dataSource: { ...state.dataSource, name: action.payload } };\n  }\n\n  if (setIsDefault.match(action)) {\n    return {\n      ...state,\n      dataSource: { ...state.dataSource, isDefault: action.payload },\n    };\n  }\n\n  return state;\n};\n\nexport const initialDataSourceSettingsState: DataSourceSettingsState = {\n  testingStatus: {\n    status: null,\n    message: null,\n  },\n  loadError: null,\n  plugin: null,\n};\n\nexport const initDataSourceSettingsSucceeded = createAction<GenericDataSourcePlugin>(\n  'dataSourceSettings/initDataSourceSettingsSucceeded'\n);\n\nexport const initDataSourceSettingsFailed = createAction<Error>('dataSourceSettings/initDataSourceSettingsFailed');\n\nexport const testDataSourceStarting = createAction<undefined>('dataSourceSettings/testDataSourceStarting');\n\nexport const testDataSourceSucceeded = createAction<{\n  status: string;\n  message: string;\n}>('dataSourceSettings/testDataSourceSucceeded');\n\nexport const testDataSourceFailed = createAction<{ message: string }>('dataSourceSettings/testDataSourceFailed');\n\nexport const dataSourceSettingsReducer = (\n  state: DataSourceSettingsState = initialDataSourceSettingsState,\n  action: AnyAction\n): DataSourceSettingsState => {\n  if (initDataSourceSettingsSucceeded.match(action)) {\n    return { ...state, plugin: action.payload, loadError: null };\n  }\n\n  if (initDataSourceSettingsFailed.match(action)) {\n    return { ...state, plugin: null, loadError: action.payload.message };\n  }\n\n  if (testDataSourceStarting.match(action)) {\n    return {\n      ...state,\n      testingStatus: {\n        message: 'Testing...',\n        status: 'info',\n      },\n    };\n  }\n\n  if (testDataSourceSucceeded.match(action)) {\n    return {\n      ...state,\n      testingStatus: {\n        status: action.payload.status,\n        message: action.payload.message,\n      },\n    };\n  }\n\n  if (testDataSourceFailed.match(action)) {\n    return {\n      ...state,\n      testingStatus: {\n        status: 'error',\n        message: action.payload.message,\n      },\n    };\n  }\n\n  return state;\n};\n\nexport default {\n  dataSources: dataSourcesReducer,\n  dataSourceSettings: dataSourceSettingsReducer,\n};\n","import React, { useContext } from 'react';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\n\nimport { getTheme } from './getTheme';\nimport { Themeable } from '../types/theme';\nimport { GrafanaTheme, GrafanaThemeType } from '@grafana/data';\nimport { stylesFactory } from './stylesFactory';\n\ntype Omit<T, K> = Pick<T, Exclude<keyof T, K>>;\ntype Subtract<T, K> = Omit<T, keyof K>;\n\n/**\n * Mock used in tests\n */\nlet ThemeContextMock: React.Context<GrafanaTheme> | null = null;\n\n// Use Grafana Dark theme by default\nexport const ThemeContext = React.createContext(getTheme(GrafanaThemeType.Dark));\nThemeContext.displayName = 'ThemeContext';\n\nexport const withTheme = <P extends Themeable, S extends {} = {}>(Component: React.ComponentType<P>) => {\n  const WithTheme: React.FunctionComponent<Subtract<P, Themeable>> = props => {\n    /**\n     * If theme context is mocked, let's use it instead of the original context\n     * This is used in tests when mocking theme using mockThemeContext function defined below\n     */\n    const ContextComponent = ThemeContextMock || ThemeContext;\n    // @ts-ignore\n    return <ContextComponent.Consumer>{theme => <Component {...props} theme={theme} />}</ContextComponent.Consumer>;\n  };\n\n  WithTheme.displayName = `WithTheme(${Component.displayName})`;\n  hoistNonReactStatics(WithTheme, Component);\n  type Hoisted = typeof WithTheme & S;\n  return WithTheme as Hoisted;\n};\n\nexport function useTheme(): GrafanaTheme {\n  return useContext(ThemeContextMock || ThemeContext);\n}\n/** Hook for using memoized styles with access to the theme. */\nexport const useStyles = (getStyles: (theme?: GrafanaTheme) => any) => {\n  const currentTheme = useTheme();\n  const callback = stylesFactory(stylesTheme => getStyles(stylesTheme));\n  return callback(currentTheme);\n};\n\n/**\n * Enables theme context  mocking\n */\nexport const mockThemeContext = (theme: Partial<GrafanaTheme>) => {\n  ThemeContextMock = React.createContext(theme as GrafanaTheme);\n  return () => {\n    ThemeContextMock = null;\n  };\n};\n","import { toDuration as duration, toUtc, dateTime } from '../datetime/moment_wrapper';\n\nimport { toFixed, toFixedScaled, FormattedValue, ValueFormatter } from './valueFormats';\nimport { DecimalCount } from '../types/displayValue';\nimport { TimeZone } from '../types';\nimport { dateTimeFormat, dateTimeFormatTimeAgo } from '../datetime';\n\ninterface IntervalsInSeconds {\n  [interval: string]: number;\n}\n\nexport enum Interval {\n  Year = 'year',\n  Month = 'month',\n  Week = 'week',\n  Day = 'day',\n  Hour = 'hour',\n  Minute = 'minute',\n  Second = 'second',\n  Millisecond = 'millisecond',\n}\n\nconst INTERVALS_IN_SECONDS: IntervalsInSeconds = {\n  [Interval.Year]: 31536000,\n  [Interval.Month]: 2592000,\n  [Interval.Week]: 604800,\n  [Interval.Day]: 86400,\n  [Interval.Hour]: 3600,\n  [Interval.Minute]: 60,\n  [Interval.Second]: 1,\n  [Interval.Millisecond]: 0.001,\n};\n\nexport function toNanoSeconds(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (Math.abs(size) < 1000) {\n    return { text: toFixed(size, decimals), suffix: ' ns' };\n  } else if (Math.abs(size) < 1000000) {\n    return toFixedScaled(size / 1000, decimals, scaledDecimals, 3, ' µs');\n  } else if (Math.abs(size) < 1000000000) {\n    return toFixedScaled(size / 1000000, decimals, scaledDecimals, 6, ' ms');\n  } else if (Math.abs(size) < 60000000000) {\n    return toFixedScaled(size / 1000000000, decimals, scaledDecimals, 9, ' s');\n  } else {\n    return toFixedScaled(size / 60000000000, decimals, scaledDecimals, 12, ' min');\n  }\n}\n\nexport function toMicroSeconds(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (Math.abs(size) < 1000) {\n    return { text: toFixed(size, decimals), suffix: ' µs' };\n  } else if (Math.abs(size) < 1000000) {\n    return toFixedScaled(size / 1000, decimals, scaledDecimals, 3, ' ms');\n  } else {\n    return toFixedScaled(size / 1000000, decimals, scaledDecimals, 6, ' s');\n  }\n}\n\nexport function toMilliSeconds(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (Math.abs(size) < 1000) {\n    return { text: toFixed(size, decimals), suffix: ' ms' };\n  } else if (Math.abs(size) < 60000) {\n    // Less than 1 min\n    return toFixedScaled(size / 1000, decimals, scaledDecimals, 3, ' s');\n  } else if (Math.abs(size) < 3600000) {\n    // Less than 1 hour, divide in minutes\n    return toFixedScaled(size / 60000, decimals, scaledDecimals, 5, ' min');\n  } else if (Math.abs(size) < 86400000) {\n    // Less than one day, divide in hours\n    return toFixedScaled(size / 3600000, decimals, scaledDecimals, 7, ' hour');\n  } else if (Math.abs(size) < 31536000000) {\n    // Less than one year, divide in days\n    return toFixedScaled(size / 86400000, decimals, scaledDecimals, 8, ' day');\n  }\n\n  return toFixedScaled(size / 31536000000, decimals, scaledDecimals, 10, ' year');\n}\n\nexport function trySubstract(value1: DecimalCount, value2: DecimalCount): DecimalCount {\n  if (value1 !== null && value1 !== undefined && value2 !== null && value2 !== undefined) {\n    return value1 - value2;\n  }\n  return undefined;\n}\n\nexport function toSeconds(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  // Less than 1 µs, divide in ns\n  if (Math.abs(size) < 0.000001) {\n    return toFixedScaled(size * 1e9, decimals, trySubstract(scaledDecimals, decimals), -9, ' ns');\n  }\n  // Less than 1 ms, divide in µs\n  if (Math.abs(size) < 0.001) {\n    return toFixedScaled(size * 1e6, decimals, trySubstract(scaledDecimals, decimals), -6, ' µs');\n  }\n  // Less than 1 second, divide in ms\n  if (Math.abs(size) < 1) {\n    return toFixedScaled(size * 1e3, decimals, trySubstract(scaledDecimals, decimals), -3, ' ms');\n  }\n\n  if (Math.abs(size) < 60) {\n    return { text: toFixed(size, decimals), suffix: ' s' };\n  } else if (Math.abs(size) < 3600) {\n    // Less than 1 hour, divide in minutes\n    return toFixedScaled(size / 60, decimals, scaledDecimals, 1, ' min');\n  } else if (Math.abs(size) < 86400) {\n    // Less than one day, divide in hours\n    return toFixedScaled(size / 3600, decimals, scaledDecimals, 4, ' hour');\n  } else if (Math.abs(size) < 604800) {\n    // Less than one week, divide in days\n    return toFixedScaled(size / 86400, decimals, scaledDecimals, 5, ' day');\n  } else if (Math.abs(size) < 31536000) {\n    // Less than one year, divide in week\n    return toFixedScaled(size / 604800, decimals, scaledDecimals, 6, ' week');\n  }\n\n  return toFixedScaled(size / 3.15569e7, decimals, scaledDecimals, 7, ' year');\n}\n\nexport function toMinutes(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (Math.abs(size) < 60) {\n    return { text: toFixed(size, decimals), suffix: ' min' };\n  } else if (Math.abs(size) < 1440) {\n    return toFixedScaled(size / 60, decimals, scaledDecimals, 2, ' hour');\n  } else if (Math.abs(size) < 10080) {\n    return toFixedScaled(size / 1440, decimals, scaledDecimals, 3, ' day');\n  } else if (Math.abs(size) < 604800) {\n    return toFixedScaled(size / 10080, decimals, scaledDecimals, 4, ' week');\n  } else {\n    return toFixedScaled(size / 5.25948e5, decimals, scaledDecimals, 5, ' year');\n  }\n}\n\nexport function toHours(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (Math.abs(size) < 24) {\n    return { text: toFixed(size, decimals), suffix: ' hour' };\n  } else if (Math.abs(size) < 168) {\n    return toFixedScaled(size / 24, decimals, scaledDecimals, 2, ' day');\n  } else if (Math.abs(size) < 8760) {\n    return toFixedScaled(size / 168, decimals, scaledDecimals, 3, ' week');\n  } else {\n    return toFixedScaled(size / 8760, decimals, scaledDecimals, 4, ' year');\n  }\n}\n\nexport function toDays(size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (Math.abs(size) < 7) {\n    return { text: toFixed(size, decimals), suffix: ' day' };\n  } else if (Math.abs(size) < 365) {\n    return toFixedScaled(size / 7, decimals, scaledDecimals, 2, ' week');\n  } else {\n    return toFixedScaled(size / 365, decimals, scaledDecimals, 3, ' year');\n  }\n}\n\nexport function toDuration(size: number, decimals: DecimalCount, timeScale: Interval): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  if (size === 0) {\n    return { text: '0', suffix: ' ' + timeScale + 's' };\n  }\n\n  if (size < 0) {\n    const v = toDuration(-size, decimals, timeScale);\n    if (!v.suffix) {\n      v.suffix = '';\n    }\n    v.suffix += ' ago';\n    return v;\n  }\n\n  const units = [\n    { long: Interval.Year },\n    { long: Interval.Month },\n    { long: Interval.Week },\n    { long: Interval.Day },\n    { long: Interval.Hour },\n    { long: Interval.Minute },\n    { long: Interval.Second },\n    { long: Interval.Millisecond },\n  ];\n\n  // convert $size to milliseconds\n  // intervals_in_seconds uses seconds (duh), convert them to milliseconds here to minimize floating point errors\n  size *= INTERVALS_IN_SECONDS[timeScale] * 1000;\n\n  const strings = [];\n\n  // after first value >= 1 print only $decimals more\n  let decrementDecimals = false;\n  let decimalsCount = 0;\n\n  if (decimals !== null || decimals !== undefined) {\n    decimalsCount = decimals as number;\n  }\n\n  for (let i = 0; i < units.length && decimalsCount >= 0; i++) {\n    const interval = INTERVALS_IN_SECONDS[units[i].long] * 1000;\n    const value = size / interval;\n    if (value >= 1 || decrementDecimals) {\n      decrementDecimals = true;\n      const floor = Math.floor(value);\n      const unit = units[i].long + (floor !== 1 ? 's' : '');\n      strings.push(floor + ' ' + unit);\n      size = size % interval;\n      decimalsCount--;\n    }\n  }\n\n  return { text: strings.join(', ') };\n}\n\nexport function toClock(size: number, decimals?: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n\n  // < 1 second\n  if (size < 1000) {\n    return {\n      text: toUtc(size).format('SSS\\\\m\\\\s'),\n    };\n  }\n\n  // < 1 minute\n  if (size < 60000) {\n    let format = 'ss\\\\s:SSS\\\\m\\\\s';\n    if (decimals === 0) {\n      format = 'ss\\\\s';\n    }\n    return { text: toUtc(size).format(format) };\n  }\n\n  // < 1 hour\n  if (size < 3600000) {\n    let format = 'mm\\\\m:ss\\\\s:SSS\\\\m\\\\s';\n    if (decimals === 0) {\n      format = 'mm\\\\m';\n    } else if (decimals === 1) {\n      format = 'mm\\\\m:ss\\\\s';\n    }\n    return { text: toUtc(size).format(format) };\n  }\n\n  let format = 'mm\\\\m:ss\\\\s:SSS\\\\m\\\\s';\n\n  const hours = `${('0' + Math.floor(duration(size, 'milliseconds').asHours())).slice(-2)}h`;\n\n  if (decimals === 0) {\n    format = '';\n  } else if (decimals === 1) {\n    format = 'mm\\\\m';\n  } else if (decimals === 2) {\n    format = 'mm\\\\m:ss\\\\s';\n  }\n\n  const text = format ? `${hours}:${toUtc(size).format(format)}` : hours;\n  return { text };\n}\n\nexport function toDurationInMilliseconds(size: number, decimals: DecimalCount): FormattedValue {\n  return toDuration(size, decimals, Interval.Millisecond);\n}\n\nexport function toDurationInSeconds(size: number, decimals: DecimalCount): FormattedValue {\n  return toDuration(size, decimals, Interval.Second);\n}\n\nexport function toDurationInHoursMinutesSeconds(size: number): FormattedValue {\n  if (size < 0) {\n    const v = toDurationInHoursMinutesSeconds(-size);\n    if (!v.suffix) {\n      v.suffix = '';\n    }\n    v.suffix += ' ago';\n    return v;\n  }\n  const strings = [];\n  const numHours = Math.floor(size / 3600);\n  const numMinutes = Math.floor((size % 3600) / 60);\n  const numSeconds = Math.floor((size % 3600) % 60);\n  numHours > 9 ? strings.push('' + numHours) : strings.push('0' + numHours);\n  numMinutes > 9 ? strings.push('' + numMinutes) : strings.push('0' + numMinutes);\n  numSeconds > 9 ? strings.push('' + numSeconds) : strings.push('0' + numSeconds);\n  return { text: strings.join(':') };\n}\n\nexport function toTimeTicks(size: number, decimals: DecimalCount, scaledDecimals: DecimalCount): FormattedValue {\n  return toSeconds(size / 100, decimals, scaledDecimals);\n}\n\nexport function toClockMilliseconds(size: number, decimals: DecimalCount): FormattedValue {\n  return toClock(size, decimals);\n}\n\nexport function toClockSeconds(size: number, decimals: DecimalCount): FormattedValue {\n  return toClock(size * 1000, decimals);\n}\n\nexport function toDateTimeValueFormatter(pattern: string, todayPattern?: string): ValueFormatter {\n  return (value: number, decimals: DecimalCount, scaledDecimals: DecimalCount, timeZone?: TimeZone): FormattedValue => {\n    if (todayPattern) {\n      if (dateTime().isSame(value, 'day')) {\n        return {\n          text: dateTimeFormat(value, { format: todayPattern, timeZone }),\n        };\n      }\n    }\n    return { text: dateTimeFormat(value, { format: pattern, timeZone }) };\n  };\n}\n\nexport const dateTimeAsIso = toDateTimeValueFormatter('YYYY-MM-DD HH:mm:ss', 'HH:mm:ss');\nexport const dateTimeAsUS = toDateTimeValueFormatter('MM/DD/YYYY h:mm:ss a', 'h:mm:ss a');\n\nexport function dateTimeFromNow(\n  value: number,\n  decimals: DecimalCount,\n  scaledDecimals: DecimalCount,\n  timeZone?: TimeZone\n): FormattedValue {\n  return { text: dateTimeFormatTimeAgo(value, { timeZone }) };\n}\n","import { toFixed, FormattedValue } from './valueFormats';\nimport { DecimalCount } from '../types/displayValue';\n\nexport function toPercent(size: number, decimals: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n  return { text: toFixed(size, decimals), suffix: '%' };\n}\n\nexport function toPercentUnit(size: number, decimals: DecimalCount): FormattedValue {\n  if (size === null) {\n    return { text: '' };\n  }\n  return { text: toFixed(100 * size, decimals), suffix: '%' };\n}\n\nexport function toHex0x(value: number, decimals: DecimalCount): FormattedValue {\n  if (value == null) {\n    return { text: '' };\n  }\n  const asHex = toHex(value, decimals);\n  if (asHex.text.substring(0, 1) === '-') {\n    asHex.text = '-0x' + asHex.text.substring(1);\n  } else {\n    asHex.text = '0x' + asHex.text;\n  }\n  return asHex;\n}\n\nexport function toHex(value: number, decimals: DecimalCount): FormattedValue {\n  if (value == null) {\n    return { text: '' };\n  }\n  return {\n    text: parseFloat(toFixed(value, decimals))\n      .toString(16)\n      .toUpperCase(),\n  };\n}\n\nexport function sci(value: number, decimals: DecimalCount): FormattedValue {\n  if (value == null) {\n    return { text: '' };\n  }\n  return { text: value.toExponential(decimals as number) };\n}\n","import { getCategories } from './categories';\nimport { DecimalCount } from '../types/displayValue';\nimport { toDateTimeValueFormatter } from './dateTimeFormatters';\nimport { getOffsetFromSIPrefix, decimalSIPrefix, currency } from './symbolFormatters';\nimport { TimeZone } from '../types';\n\nexport interface FormattedValue {\n  text: string;\n  prefix?: string;\n  suffix?: string;\n}\n\nexport function formattedValueToString(val: FormattedValue): string {\n  return `${val.prefix ?? ''}${val.text}${val.suffix ?? ''}`;\n}\n\nexport type ValueFormatter = (\n  value: number,\n  decimals?: DecimalCount,\n  scaledDecimals?: DecimalCount,\n  timeZone?: TimeZone\n) => FormattedValue;\n\nexport interface ValueFormat {\n  name: string;\n  id: string;\n  fn: ValueFormatter;\n}\n\nexport interface ValueFormatCategory {\n  name: string;\n  formats: ValueFormat[];\n}\n\ninterface ValueFormatterIndex {\n  [id: string]: ValueFormatter;\n}\n\n// Globals & formats cache\nlet categories: ValueFormatCategory[] = [];\nconst index: ValueFormatterIndex = {};\nlet hasBuiltIndex = false;\n\nexport function toFixed(value: number, decimals?: DecimalCount): string {\n  if (value === null) {\n    return '';\n  }\n  if (value === Number.NEGATIVE_INFINITY || value === Number.POSITIVE_INFINITY) {\n    return value.toLocaleString();\n  }\n\n  const factor = decimals ? Math.pow(10, Math.max(0, decimals)) : 1;\n  const formatted = String(Math.round(value * factor) / factor);\n\n  // if exponent return directly\n  if (formatted.indexOf('e') !== -1 || value === 0) {\n    return formatted;\n  }\n\n  // If tickDecimals was specified, ensure that we have exactly that\n  // much precision; otherwise default to the value's own precision.\n  if (decimals != null) {\n    const decimalPos = formatted.indexOf('.');\n    const precision = decimalPos === -1 ? 0 : formatted.length - decimalPos - 1;\n    if (precision < decimals) {\n      return (precision ? formatted : formatted + '.') + String(factor).substr(1, decimals - precision);\n    }\n  }\n\n  return formatted;\n}\n\nexport function toFixedScaled(\n  value: number,\n  decimals: DecimalCount,\n  scaledDecimals: DecimalCount,\n  additionalDecimals: number,\n  ext?: string\n): FormattedValue {\n  if (scaledDecimals === null || scaledDecimals === undefined) {\n    return { text: toFixed(value, decimals), suffix: ext };\n  }\n  return {\n    text: toFixed(value, scaledDecimals + additionalDecimals),\n    suffix: ext,\n  };\n}\n\nexport function toFixedUnit(unit: string, asPrefix?: boolean): ValueFormatter {\n  return (size: number, decimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    const text = toFixed(size, decimals);\n    if (unit) {\n      if (asPrefix) {\n        return { text, prefix: unit };\n      }\n      return { text, suffix: ' ' + unit };\n    }\n    return { text };\n  };\n}\n\n// Formatter which scales the unit string geometrically according to the given\n// numeric factor. Repeatedly scales the value down by the factor until it is\n// less than the factor in magnitude, or the end of the array is reached.\nexport function scaledUnits(factor: number, extArray: string[]): ValueFormatter {\n  return (size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    if (size === Number.NEGATIVE_INFINITY || size === Number.POSITIVE_INFINITY || isNaN(size)) {\n      return { text: size.toLocaleString() };\n    }\n\n    let steps = 0;\n    const limit = extArray.length;\n\n    while (Math.abs(size) >= factor) {\n      steps++;\n      size /= factor;\n\n      if (steps >= limit) {\n        return { text: 'NA' };\n      }\n    }\n\n    if (steps > 0 && scaledDecimals !== null && scaledDecimals !== undefined) {\n      decimals = scaledDecimals + 3 * steps;\n    }\n\n    return { text: toFixed(size, decimals), suffix: extArray[steps] };\n  };\n}\n\nexport function locale(value: number, decimals: DecimalCount): FormattedValue {\n  if (value == null) {\n    return { text: '' };\n  }\n  return {\n    text: value.toLocaleString(undefined, { maximumFractionDigits: decimals as number }),\n  };\n}\n\nexport function simpleCountUnit(symbol: string): ValueFormatter {\n  const units = ['', 'K', 'M', 'B', 'T'];\n  const scaler = scaledUnits(1000, units);\n  return (size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    const v = scaler(size, decimals, scaledDecimals);\n    v.suffix += ' ' + symbol;\n    return v;\n  };\n}\n\nfunction buildFormats() {\n  categories = getCategories();\n\n  for (const cat of categories) {\n    for (const format of cat.formats) {\n      index[format.id] = format.fn;\n    }\n  }\n\n  // Resolve units pointing to old IDs\n  [{ from: 'farenheit', to: 'fahrenheit' }].forEach(alias => {\n    const f = index[alias.to];\n    if (f) {\n      index[alias.from] = f;\n    }\n  });\n\n  hasBuiltIndex = true;\n}\n\nexport function getValueFormat(id?: string | null): ValueFormatter {\n  if (!id) {\n    return toFixedUnit('');\n  }\n\n  if (!hasBuiltIndex) {\n    buildFormats();\n  }\n\n  const fmt = index[id];\n\n  if (!fmt && id) {\n    const idx = id.indexOf(':');\n\n    if (idx > 0) {\n      const key = id.substring(0, idx);\n      const sub = id.substring(idx + 1);\n\n      if (key === 'prefix') {\n        return toFixedUnit(sub, true);\n      }\n\n      if (key === 'time') {\n        return toDateTimeValueFormatter(sub);\n      }\n\n      if (key === 'si') {\n        const offset = getOffsetFromSIPrefix(sub.charAt(0));\n        const unit = offset === 0 ? sub : sub.substring(1);\n        return decimalSIPrefix(unit, offset);\n      }\n\n      if (key === 'count') {\n        return simpleCountUnit(sub);\n      }\n\n      if (key === 'currency') {\n        return currency(sub);\n      }\n    }\n\n    return toFixedUnit(id);\n  }\n\n  return fmt;\n}\n\nexport function getValueFormatterIndex(): ValueFormatterIndex {\n  if (!hasBuiltIndex) {\n    buildFormats();\n  }\n\n  return index;\n}\n\nexport function getValueFormats() {\n  if (!hasBuiltIndex) {\n    buildFormats();\n  }\n\n  return categories.map(cat => {\n    return {\n      text: cat.name,\n      submenu: cat.formats.map(format => {\n        return {\n          text: format.name,\n          value: format.id,\n        };\n      }),\n    };\n  });\n}\n","import { locale, scaledUnits, simpleCountUnit, toFixedUnit, ValueFormatCategory } from './valueFormats';\nimport {\n  dateTimeAsIso,\n  dateTimeAsUS,\n  dateTimeFromNow,\n  toClockMilliseconds,\n  toClockSeconds,\n  toDays,\n  toDurationInHoursMinutesSeconds,\n  toDurationInMilliseconds,\n  toDurationInSeconds,\n  toHours,\n  toMicroSeconds,\n  toMilliSeconds,\n  toMinutes,\n  toNanoSeconds,\n  toSeconds,\n  toTimeTicks,\n} from './dateTimeFormatters';\nimport { toHex, sci, toHex0x, toPercent, toPercentUnit } from './arithmeticFormatters';\nimport { binarySIPrefix, currency, decimalSIPrefix } from './symbolFormatters';\n\nexport const getCategories = (): ValueFormatCategory[] => [\n  {\n    name: 'Misc',\n    formats: [\n      { name: 'none', id: 'none', fn: toFixedUnit('') },\n      {\n        name: 'short',\n        id: 'short',\n        fn: scaledUnits(1000, ['', ' K', ' Mil', ' Bil', ' Tri', ' Quadr', ' Quint', ' Sext', ' Sept']),\n      },\n      { name: 'percent (0-100)', id: 'percent', fn: toPercent },\n      { name: 'percent (0.0-1.0)', id: 'percentunit', fn: toPercentUnit },\n      { name: 'Humidity (%H)', id: 'humidity', fn: toFixedUnit('%H') },\n      { name: 'decibel', id: 'dB', fn: toFixedUnit('dB') },\n      { name: 'hexadecimal (0x)', id: 'hex0x', fn: toHex0x },\n      { name: 'hexadecimal', id: 'hex', fn: toHex },\n      { name: 'scientific notation', id: 'sci', fn: sci },\n      { name: 'locale format', id: 'locale', fn: locale },\n      { name: 'Pixels', id: 'pixel', fn: toFixedUnit('px') },\n    ],\n  },\n  {\n    name: 'Acceleration',\n    formats: [\n      { name: 'Meters/sec²', id: 'accMS2', fn: toFixedUnit('m/sec²') },\n      { name: 'Feet/sec²', id: 'accFS2', fn: toFixedUnit('f/sec²') },\n      { name: 'G unit', id: 'accG', fn: toFixedUnit('g') },\n    ],\n  },\n  {\n    name: 'Angle',\n    formats: [\n      { name: 'Degrees (°)', id: 'degree', fn: toFixedUnit('°') },\n      { name: 'Radians', id: 'radian', fn: toFixedUnit('rad') },\n      { name: 'Gradian', id: 'grad', fn: toFixedUnit('grad') },\n      { name: 'Arc Minutes', id: 'arcmin', fn: toFixedUnit('arcmin') },\n      { name: 'Arc Seconds', id: 'arcsec', fn: toFixedUnit('arcsec') },\n    ],\n  },\n  {\n    name: 'Area',\n    formats: [\n      { name: 'Square Meters (m²)', id: 'areaM2', fn: toFixedUnit('m²') },\n      { name: 'Square Feet (ft²)', id: 'areaF2', fn: toFixedUnit('ft²') },\n      { name: 'Square Miles (mi²)', id: 'areaMI2', fn: toFixedUnit('mi²') },\n    ],\n  },\n  {\n    name: 'Computation',\n    formats: [\n      { name: 'FLOP/s', id: 'flops', fn: decimalSIPrefix('FLOP/s') },\n      { name: 'MFLOP/s', id: 'mflops', fn: decimalSIPrefix('FLOP/s', 2) },\n      { name: 'GFLOP/s', id: 'gflops', fn: decimalSIPrefix('FLOP/s', 3) },\n      { name: 'TFLOP/s', id: 'tflops', fn: decimalSIPrefix('FLOP/s', 4) },\n      { name: 'PFLOP/s', id: 'pflops', fn: decimalSIPrefix('FLOP/s', 5) },\n      { name: 'EFLOP/s', id: 'eflops', fn: decimalSIPrefix('FLOP/s', 6) },\n      { name: 'ZFLOP/s', id: 'zflops', fn: decimalSIPrefix('FLOP/s', 7) },\n      { name: 'YFLOP/s', id: 'yflops', fn: decimalSIPrefix('FLOP/s', 8) },\n    ],\n  },\n  {\n    name: 'Concentration',\n    formats: [\n      { name: 'parts-per-million (ppm)', id: 'ppm', fn: toFixedUnit('ppm') },\n      { name: 'parts-per-billion (ppb)', id: 'conppb', fn: toFixedUnit('ppb') },\n      { name: 'nanogram per cubic meter (ng/m³)', id: 'conngm3', fn: toFixedUnit('ng/m³') },\n      { name: 'nanogram per normal cubic meter (ng/Nm³)', id: 'conngNm3', fn: toFixedUnit('ng/Nm³') },\n      { name: 'microgram per cubic meter (μg/m³)', id: 'conμgm3', fn: toFixedUnit('μg/m³') },\n      { name: 'microgram per normal cubic meter (μg/Nm³)', id: 'conμgNm3', fn: toFixedUnit('μg/Nm³') },\n      { name: 'milligram per cubic meter (mg/m³)', id: 'conmgm3', fn: toFixedUnit('mg/m³') },\n      { name: 'milligram per normal cubic meter (mg/Nm³)', id: 'conmgNm3', fn: toFixedUnit('mg/Nm³') },\n      { name: 'gram per cubic meter (g/m³)', id: 'congm3', fn: toFixedUnit('g/m³') },\n      { name: 'gram per normal cubic meter (g/Nm³)', id: 'congNm3', fn: toFixedUnit('g/Nm³') },\n      { name: 'milligrams per decilitre (mg/dL)', id: 'conmgdL', fn: toFixedUnit('mg/dL') },\n      { name: 'millimoles per litre (mmol/L)', id: 'conmmolL', fn: toFixedUnit('mmol/L') },\n    ],\n  },\n  {\n    name: 'Currency',\n    formats: [\n      { name: 'Dollars ($)', id: 'currencyUSD', fn: currency('$') },\n      { name: 'Pounds (£)', id: 'currencyGBP', fn: currency('£') },\n      { name: 'Euro (€)', id: 'currencyEUR', fn: currency('€') },\n      { name: 'Yen (¥)', id: 'currencyJPY', fn: currency('¥') },\n      { name: 'Rubles (₽)', id: 'currencyRUB', fn: currency('₽') },\n      { name: 'Hryvnias (₴)', id: 'currencyUAH', fn: currency('₴') },\n      { name: 'Real (R$)', id: 'currencyBRL', fn: currency('R$') },\n      { name: 'Danish Krone (kr)', id: 'currencyDKK', fn: currency('kr', true) },\n      { name: 'Icelandic Króna (kr)', id: 'currencyISK', fn: currency('kr', true) },\n      { name: 'Norwegian Krone (kr)', id: 'currencyNOK', fn: currency('kr', true) },\n      { name: 'Swedish Krona (kr)', id: 'currencySEK', fn: currency('kr', true) },\n      { name: 'Czech koruna (czk)', id: 'currencyCZK', fn: currency('czk') },\n      { name: 'Swiss franc (CHF)', id: 'currencyCHF', fn: currency('CHF') },\n      { name: 'Polish Złoty (PLN)', id: 'currencyPLN', fn: currency('PLN') },\n      { name: 'Bitcoin (฿)', id: 'currencyBTC', fn: currency('฿') },\n      { name: 'South African Rand (R)', id: 'currencyZAR', fn: currency('R') },\n      { name: 'Indian Rupee (₹)', id: 'currencyINR', fn: currency('₹') },\n      { name: 'South Korean Won (₩)', id: 'currencyKRW', fn: currency('₩') },\n    ],\n  },\n  {\n    name: 'Data (IEC)',\n    formats: [\n      { name: 'bits(IEC)', id: 'bits', fn: binarySIPrefix('b') },\n      { name: 'bytes(IEC)', id: 'bytes', fn: binarySIPrefix('B') },\n      { name: 'kibibytes', id: 'kbytes', fn: binarySIPrefix('B', 1) },\n      { name: 'mebibytes', id: 'mbytes', fn: binarySIPrefix('B', 2) },\n      { name: 'gibibytes', id: 'gbytes', fn: binarySIPrefix('B', 3) },\n      { name: 'tebibytes', id: 'tbytes', fn: binarySIPrefix('B', 4) },\n      { name: 'pebibytes', id: 'pbytes', fn: binarySIPrefix('B', 5) },\n    ],\n  },\n  {\n    name: 'Data (Metric)',\n    formats: [\n      { name: 'bits(Metric)', id: 'decbits', fn: decimalSIPrefix('b') },\n      { name: 'bytes(Metric)', id: 'decbytes', fn: decimalSIPrefix('B') },\n      { name: 'kilobytes', id: 'deckbytes', fn: decimalSIPrefix('B', 1) },\n      { name: 'megabytes', id: 'decmbytes', fn: decimalSIPrefix('B', 2) },\n      { name: 'gigabytes', id: 'decgbytes', fn: decimalSIPrefix('B', 3) },\n      { name: 'terabytes', id: 'dectbytes', fn: decimalSIPrefix('B', 4) },\n      { name: 'petabytes', id: 'decpbytes', fn: decimalSIPrefix('B', 5) },\n    ],\n  },\n  {\n    name: 'Data Rate',\n    formats: [\n      { name: 'packets/sec', id: 'pps', fn: decimalSIPrefix('pps') },\n      { name: 'bits/sec', id: 'bps', fn: decimalSIPrefix('bps') },\n      { name: 'bytes/sec', id: 'Bps', fn: decimalSIPrefix('Bs') },\n      { name: 'kilobytes/sec', id: 'KBs', fn: decimalSIPrefix('Bs', 1) },\n      { name: 'kilobits/sec', id: 'Kbits', fn: decimalSIPrefix('bps', 1) },\n      { name: 'megabytes/sec', id: 'MBs', fn: decimalSIPrefix('Bs', 2) },\n      { name: 'megabits/sec', id: 'Mbits', fn: decimalSIPrefix('bps', 2) },\n      { name: 'gigabytes/sec', id: 'GBs', fn: decimalSIPrefix('Bs', 3) },\n      { name: 'gigabits/sec', id: 'Gbits', fn: decimalSIPrefix('bps', 3) },\n      { name: 'terabytes/sec', id: 'TBs', fn: decimalSIPrefix('Bs', 4) },\n      { name: 'terabits/sec', id: 'Tbits', fn: decimalSIPrefix('bps', 4) },\n      { name: 'petabytes/sec', id: 'PBs', fn: decimalSIPrefix('Bs', 5) },\n      { name: 'petabits/sec', id: 'Pbits', fn: decimalSIPrefix('bps', 5) },\n    ],\n  },\n  {\n    name: 'Date & Time',\n    formats: [\n      { name: 'YYYY-MM-DD HH:mm:ss', id: 'dateTimeAsIso', fn: dateTimeAsIso },\n      { name: 'MM/DD/YYYY h:mm:ss a', id: 'dateTimeAsUS', fn: dateTimeAsUS },\n      { name: 'From Now', id: 'dateTimeFromNow', fn: dateTimeFromNow },\n    ],\n  },\n  {\n    name: 'Energy',\n    formats: [\n      { name: 'Watt (W)', id: 'watt', fn: decimalSIPrefix('W') },\n      { name: 'Kilowatt (kW)', id: 'kwatt', fn: decimalSIPrefix('W', 1) },\n      { name: 'Megawatt (MW)', id: 'megwatt', fn: decimalSIPrefix('W', 2) },\n      { name: 'Gigawatt (GW)', id: 'gwatt', fn: decimalSIPrefix('W', 3) },\n      { name: 'Milliwatt (mW)', id: 'mwatt', fn: decimalSIPrefix('W', -1) },\n      { name: 'Watt per square meter (W/m²)', id: 'Wm2', fn: toFixedUnit('W/m²') },\n      { name: 'Volt-ampere (VA)', id: 'voltamp', fn: decimalSIPrefix('VA') },\n      { name: 'Kilovolt-ampere (kVA)', id: 'kvoltamp', fn: decimalSIPrefix('VA', 1) },\n      { name: 'Volt-ampere reactive (var)', id: 'voltampreact', fn: decimalSIPrefix('var') },\n      { name: 'Kilovolt-ampere reactive (kvar)', id: 'kvoltampreact', fn: decimalSIPrefix('var', 1) },\n      { name: 'Watt-hour (Wh)', id: 'watth', fn: decimalSIPrefix('Wh') },\n      { name: 'Watt-hour per Kilogram (Wh/kg)', id: 'watthperkg', fn: decimalSIPrefix('Wh/kg') },\n      { name: 'Kilowatt-hour (kWh)', id: 'kwatth', fn: decimalSIPrefix('Wh', 1) },\n      { name: 'Kilowatt-min (kWm)', id: 'kwattm', fn: decimalSIPrefix('W-Min', 1) },\n      { name: 'Ampere-hour (Ah)', id: 'amph', fn: decimalSIPrefix('Ah') },\n      { name: 'Kiloampere-hour (kAh)', id: 'kamph', fn: decimalSIPrefix('Ah', 1) },\n      { name: 'Milliampere-hour (mAh)', id: 'mamph', fn: decimalSIPrefix('Ah', -1) },\n      { name: 'Joule (J)', id: 'joule', fn: decimalSIPrefix('J') },\n      { name: 'Electron volt (eV)', id: 'ev', fn: decimalSIPrefix('eV') },\n      { name: 'Ampere (A)', id: 'amp', fn: decimalSIPrefix('A') },\n      { name: 'Kiloampere (kA)', id: 'kamp', fn: decimalSIPrefix('A', 1) },\n      { name: 'Milliampere (mA)', id: 'mamp', fn: decimalSIPrefix('A', -1) },\n      { name: 'Volt (V)', id: 'volt', fn: decimalSIPrefix('V') },\n      { name: 'Kilovolt (kV)', id: 'kvolt', fn: decimalSIPrefix('V', 1) },\n      { name: 'Millivolt (mV)', id: 'mvolt', fn: decimalSIPrefix('V', -1) },\n      { name: 'Decibel-milliwatt (dBm)', id: 'dBm', fn: decimalSIPrefix('dBm') },\n      { name: 'Ohm (Ω)', id: 'ohm', fn: decimalSIPrefix('Ω') },\n      { name: 'Kiloohm (kΩ)', id: 'kohm', fn: decimalSIPrefix('Ω', 1) },\n      { name: 'Megaohm (MΩ)', id: 'Mohm', fn: decimalSIPrefix('Ω', 2) },\n      { name: 'Farad (F)', id: 'farad', fn: decimalSIPrefix('F') },\n      { name: 'Microfarad (µF)', id: 'µfarad', fn: decimalSIPrefix('F', -2) },\n      { name: 'Nanofarad (nF)', id: 'nfarad', fn: decimalSIPrefix('F', -3) },\n      { name: 'Picofarad (pF)', id: 'pfarad', fn: decimalSIPrefix('F', -4) },\n      { name: 'Femtofarad (fF)', id: 'ffarad', fn: decimalSIPrefix('F', -5) },\n      { name: 'Henry (H)', id: 'henry', fn: decimalSIPrefix('H') },\n      { name: 'Millihenry (mH)', id: 'mhenry', fn: decimalSIPrefix('H', -1) },\n      { name: 'Microhenry (µH)', id: 'µhenry', fn: decimalSIPrefix('H', -2) },\n      { name: 'Lumens (Lm)', id: 'lumens', fn: decimalSIPrefix('Lm') },\n    ],\n  },\n  {\n    name: 'Flow',\n    formats: [\n      { name: 'Gallons/min (gpm)', id: 'flowgpm', fn: toFixedUnit('gpm') },\n      { name: 'Cubic meters/sec (cms)', id: 'flowcms', fn: toFixedUnit('cms') },\n      { name: 'Cubic feet/sec (cfs)', id: 'flowcfs', fn: toFixedUnit('cfs') },\n      { name: 'Cubic feet/min (cfm)', id: 'flowcfm', fn: toFixedUnit('cfm') },\n      { name: 'Litre/hour', id: 'litreh', fn: toFixedUnit('L/h') },\n      { name: 'Litre/min (L/min)', id: 'flowlpm', fn: toFixedUnit('L/min') },\n      { name: 'milliLitre/min (mL/min)', id: 'flowmlpm', fn: toFixedUnit('mL/min') },\n      { name: 'Lux (lx)', id: 'lux', fn: toFixedUnit('lux') },\n    ],\n  },\n  {\n    name: 'Force',\n    formats: [\n      { name: 'Newton-meters (Nm)', id: 'forceNm', fn: decimalSIPrefix('Nm') },\n      { name: 'Kilonewton-meters (kNm)', id: 'forcekNm', fn: decimalSIPrefix('Nm', 1) },\n      { name: 'Newtons (N)', id: 'forceN', fn: decimalSIPrefix('N') },\n      { name: 'Kilonewtons (kN)', id: 'forcekN', fn: decimalSIPrefix('N', 1) },\n    ],\n  },\n  {\n    name: 'Hash Rate',\n    formats: [\n      { name: 'hashes/sec', id: 'Hs', fn: decimalSIPrefix('H/s') },\n      { name: 'kilohashes/sec', id: 'KHs', fn: decimalSIPrefix('H/s', 1) },\n      { name: 'megahashes/sec', id: 'MHs', fn: decimalSIPrefix('H/s', 2) },\n      { name: 'gigahashes/sec', id: 'GHs', fn: decimalSIPrefix('H/s', 3) },\n      { name: 'terahashes/sec', id: 'THs', fn: decimalSIPrefix('H/s', 4) },\n      { name: 'petahashes/sec', id: 'PHs', fn: decimalSIPrefix('H/s', 5) },\n      { name: 'exahashes/sec', id: 'EHs', fn: decimalSIPrefix('H/s', 6) },\n    ],\n  },\n  {\n    name: 'Mass',\n    formats: [\n      { name: 'milligram (mg)', id: 'massmg', fn: decimalSIPrefix('g', -1) },\n      { name: 'gram (g)', id: 'massg', fn: decimalSIPrefix('g') },\n      { name: 'kilogram (kg)', id: 'masskg', fn: decimalSIPrefix('g', 1) },\n      { name: 'metric ton (t)', id: 'masst', fn: toFixedUnit('t') },\n    ],\n  },\n  {\n    name: 'length',\n    formats: [\n      { name: 'millimeter (mm)', id: 'lengthmm', fn: decimalSIPrefix('m', -1) },\n      { name: 'feet (ft)', id: 'lengthft', fn: toFixedUnit('ft') },\n      { name: 'meter (m)', id: 'lengthm', fn: decimalSIPrefix('m') },\n      { name: 'kilometer (km)', id: 'lengthkm', fn: decimalSIPrefix('m', 1) },\n      { name: 'mile (mi)', id: 'lengthmi', fn: toFixedUnit('mi') },\n    ],\n  },\n  {\n    name: 'Pressure',\n    formats: [\n      { name: 'Millibars', id: 'pressurembar', fn: decimalSIPrefix('bar', -1) },\n      { name: 'Bars', id: 'pressurebar', fn: decimalSIPrefix('bar') },\n      { name: 'Kilobars', id: 'pressurekbar', fn: decimalSIPrefix('bar', 1) },\n      { name: 'Hectopascals', id: 'pressurehpa', fn: toFixedUnit('hPa') },\n      { name: 'Kilopascals', id: 'pressurekpa', fn: toFixedUnit('kPa') },\n      { name: 'Inches of mercury', id: 'pressurehg', fn: toFixedUnit('\"Hg') },\n      { name: 'PSI', id: 'pressurepsi', fn: scaledUnits(1000, ['psi', 'ksi', 'Mpsi']) },\n    ],\n  },\n  {\n    name: 'Radiation',\n    formats: [\n      { name: 'Becquerel (Bq)', id: 'radbq', fn: decimalSIPrefix('Bq') },\n      { name: 'curie (Ci)', id: 'radci', fn: decimalSIPrefix('Ci') },\n      { name: 'Gray (Gy)', id: 'radgy', fn: decimalSIPrefix('Gy') },\n      { name: 'rad', id: 'radrad', fn: decimalSIPrefix('rad') },\n      { name: 'Sievert (Sv)', id: 'radsv', fn: decimalSIPrefix('Sv') },\n      { name: 'milliSievert (mSv)', id: 'radmsv', fn: decimalSIPrefix('mSv', -1) },\n      { name: 'microSievert (µSv)', id: 'radusv', fn: decimalSIPrefix('µSv', -2) },\n      { name: 'rem', id: 'radrem', fn: decimalSIPrefix('rem') },\n      { name: 'Exposure (C/kg)', id: 'radexpckg', fn: decimalSIPrefix('C/kg') },\n      { name: 'roentgen (R)', id: 'radr', fn: decimalSIPrefix('R') },\n      { name: 'Sievert/hour (Sv/h)', id: 'radsvh', fn: decimalSIPrefix('Sv/h') },\n      { name: 'milliSievert/hour (mSv/h)', id: 'radmsvh', fn: decimalSIPrefix('Sv/h', -1) },\n      { name: 'microSievert/hour (µSv/h)', id: 'radusvh', fn: decimalSIPrefix('Sv/h', -2) },\n    ],\n  },\n  {\n    name: 'Temperature',\n    formats: [\n      { name: 'Celsius (°C)', id: 'celsius', fn: toFixedUnit('°C') },\n      { name: 'Fahrenheit (°F)', id: 'fahrenheit', fn: toFixedUnit('°F') },\n      { name: 'Kelvin (K)', id: 'kelvin', fn: toFixedUnit('K') },\n    ],\n  },\n  {\n    name: 'Time',\n    formats: [\n      { name: 'Hertz (1/s)', id: 'hertz', fn: decimalSIPrefix('Hz') },\n      { name: 'nanoseconds (ns)', id: 'ns', fn: toNanoSeconds },\n      { name: 'microseconds (µs)', id: 'µs', fn: toMicroSeconds },\n      { name: 'milliseconds (ms)', id: 'ms', fn: toMilliSeconds },\n      { name: 'seconds (s)', id: 's', fn: toSeconds },\n      { name: 'minutes (m)', id: 'm', fn: toMinutes },\n      { name: 'hours (h)', id: 'h', fn: toHours },\n      { name: 'days (d)', id: 'd', fn: toDays },\n      { name: 'duration (ms)', id: 'dtdurationms', fn: toDurationInMilliseconds },\n      { name: 'duration (s)', id: 'dtdurations', fn: toDurationInSeconds },\n      { name: 'duration (hh:mm:ss)', id: 'dthms', fn: toDurationInHoursMinutesSeconds },\n      { name: 'Timeticks (s/100)', id: 'timeticks', fn: toTimeTicks },\n      { name: 'clock (ms)', id: 'clockms', fn: toClockMilliseconds },\n      { name: 'clock (s)', id: 'clocks', fn: toClockSeconds },\n    ],\n  },\n  {\n    name: 'Throughput',\n    formats: [\n      { name: 'counts/sec (cps)', id: 'cps', fn: simpleCountUnit('cps') },\n      { name: 'ops/sec (ops)', id: 'ops', fn: simpleCountUnit('ops') },\n      { name: 'requests/sec (rps)', id: 'reqps', fn: simpleCountUnit('reqps') },\n      { name: 'reads/sec (rps)', id: 'rps', fn: simpleCountUnit('rps') },\n      { name: 'writes/sec (wps)', id: 'wps', fn: simpleCountUnit('wps') },\n      { name: 'I/O ops/sec (iops)', id: 'iops', fn: simpleCountUnit('iops') },\n      { name: 'counts/min (cpm)', id: 'cpm', fn: simpleCountUnit('cpm') },\n      { name: 'ops/min (opm)', id: 'opm', fn: simpleCountUnit('opm') },\n      { name: 'reads/min (rpm)', id: 'rpm', fn: simpleCountUnit('rpm') },\n      { name: 'writes/min (wpm)', id: 'wpm', fn: simpleCountUnit('wpm') },\n    ],\n  },\n  {\n    name: 'Velocity',\n    formats: [\n      { name: 'meters/second (m/s)', id: 'velocityms', fn: toFixedUnit('m/s') },\n      { name: 'kilometers/hour (km/h)', id: 'velocitykmh', fn: toFixedUnit('km/h') },\n      { name: 'miles/hour (mph)', id: 'velocitymph', fn: toFixedUnit('mph') },\n      { name: 'knot (kn)', id: 'velocityknot', fn: toFixedUnit('kn') },\n    ],\n  },\n  {\n    name: 'Volume',\n    formats: [\n      { name: 'millilitre (mL)', id: 'mlitre', fn: decimalSIPrefix('L', -1) },\n      { name: 'litre (L)', id: 'litre', fn: decimalSIPrefix('L') },\n      { name: 'cubic meter', id: 'm3', fn: toFixedUnit('m³') },\n      { name: 'Normal cubic meter', id: 'Nm3', fn: toFixedUnit('Nm³') },\n      { name: 'cubic decimeter', id: 'dm3', fn: toFixedUnit('dm³') },\n      { name: 'gallons', id: 'gallons', fn: toFixedUnit('gal') },\n    ],\n  },\n];\n","export * from './teams';\nexport * from './alerting';\nexport * from './location';\nexport * from './folders';\nexport * from './dashboard';\nexport * from './acl';\nexport * from './apiKeys';\nexport * from './user';\nexport * from './datasources';\nexport * from './plugins';\nexport * from './organization';\nexport * from './appNotifications';\nexport * from './explore';\nexport * from './store';\nexport * from './ldap';\nexport * from './appEvent';\nexport * from './angular';\n\nimport * as CoreEvents from './events';\nexport { CoreEvents };\n","export * from './theme';\nexport * from './input';\nexport * from './completion';\nexport * from './storybook';\nexport * from './forms';\nexport * from './icon';\n","import _ from 'lodash';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport templateSrv, { TemplateSrv } from 'app/features/templating/template_srv';\nimport coreModule from 'app/core/core_module';\nimport { getConfig } from 'app/core/config';\nimport {\n  DataFrame,\n  DataLink,\n  DataLinkBuiltInVars,\n  deprecationWarning,\n  Field,\n  FieldType,\n  KeyValue,\n  LinkModel,\n  locationUtil,\n  ScopedVars,\n  VariableOrigin,\n  VariableSuggestion,\n  VariableSuggestionsScope,\n  urlUtil,\n  textUtil,\n} from '@grafana/data';\n\nconst timeRangeVars = [\n  {\n    value: `${DataLinkBuiltInVars.keepTime}`,\n    label: 'Time range',\n    documentation: 'Adds current time range',\n    origin: VariableOrigin.BuiltIn,\n  },\n  {\n    value: `${DataLinkBuiltInVars.timeRangeFrom}`,\n    label: 'Time range: from',\n    documentation: \"Adds current time range's from value\",\n    origin: VariableOrigin.BuiltIn,\n  },\n  {\n    value: `${DataLinkBuiltInVars.timeRangeTo}`,\n    label: 'Time range: to',\n    documentation: \"Adds current time range's to value\",\n    origin: VariableOrigin.BuiltIn,\n  },\n];\n\nconst seriesVars = [\n  {\n    value: `${DataLinkBuiltInVars.seriesName}`,\n    label: 'Name',\n    documentation: 'Name of the series',\n    origin: VariableOrigin.Series,\n  },\n];\n\nconst valueVars = [\n  {\n    value: `${DataLinkBuiltInVars.valueNumeric}`,\n    label: 'Numeric',\n    documentation: 'Numeric representation of selected value',\n    origin: VariableOrigin.Value,\n  },\n  {\n    value: `${DataLinkBuiltInVars.valueText}`,\n    label: 'Text',\n    documentation: 'Text representation of selected value',\n    origin: VariableOrigin.Value,\n  },\n  {\n    value: `${DataLinkBuiltInVars.valueRaw}`,\n    label: 'Raw',\n    documentation: 'Raw value',\n    origin: VariableOrigin.Value,\n  },\n];\n\nconst buildLabelPath = (label: string) => {\n  return label.indexOf('.') > -1 ? `[\"${label}\"]` : `.${label}`;\n};\n\nexport const getPanelLinksVariableSuggestions = (): VariableSuggestion[] => [\n  ...templateSrv.getVariables().map(variable => ({\n    value: variable.name as string,\n    label: variable.name,\n    origin: VariableOrigin.Template,\n  })),\n  {\n    value: `${DataLinkBuiltInVars.includeVars}`,\n    label: 'All variables',\n    documentation: 'Adds current variables',\n    origin: VariableOrigin.Template,\n  },\n  ...timeRangeVars,\n];\n\nconst getFieldVars = (dataFrames: DataFrame[]) => {\n  const all = [];\n  for (const df of dataFrames) {\n    for (const f of df.fields) {\n      if (f.labels) {\n        for (const k of Object.keys(f.labels)) {\n          all.push(k);\n        }\n      }\n    }\n  }\n\n  const labels = _.chain(all)\n    .flatten()\n    .uniq()\n    .value();\n\n  return [\n    {\n      value: `${DataLinkBuiltInVars.fieldName}`,\n      label: 'Name',\n      documentation: 'Field name of the clicked datapoint (in ms epoch)',\n      origin: VariableOrigin.Field,\n    },\n    ...labels.map(label => ({\n      value: `__field.labels${buildLabelPath(label)}`,\n      label: `labels.${label}`,\n      documentation: `${label} label value`,\n      origin: VariableOrigin.Field,\n    })),\n  ];\n};\n\nconst getDataFrameVars = (dataFrames: DataFrame[]) => {\n  let numeric: Field = undefined;\n  let title: Field = undefined;\n  const suggestions: VariableSuggestion[] = [];\n  const keys: KeyValue<true> = {};\n\n  for (const df of dataFrames) {\n    for (const f of df.fields) {\n      if (keys[f.name]) {\n        continue;\n      }\n\n      suggestions.push({\n        value: `__data.fields[${f.name}]`,\n        label: `${f.name}`,\n        documentation: `Formatted value for ${f.name} on the same row`,\n        origin: VariableOrigin.Fields,\n      });\n\n      keys[f.name] = true;\n\n      if (!numeric && f.type === FieldType.number) {\n        numeric = f;\n      }\n\n      if (!title && f.config.displayName && f.config.displayName !== f.name) {\n        title = f;\n      }\n    }\n  }\n\n  if (suggestions.length) {\n    suggestions.push({\n      value: `__data.fields[0]`,\n      label: `Select by index`,\n      documentation: `Enter the field order`,\n      origin: VariableOrigin.Fields,\n    });\n  }\n\n  if (numeric) {\n    suggestions.push({\n      value: `__data.fields[${numeric.name}].numeric`,\n      label: `Show numeric value`,\n      documentation: `the numeric field value`,\n      origin: VariableOrigin.Fields,\n    });\n    suggestions.push({\n      value: `__data.fields[${numeric.name}].text`,\n      label: `Show text value`,\n      documentation: `the text value`,\n      origin: VariableOrigin.Fields,\n    });\n  }\n\n  if (title) {\n    suggestions.push({\n      value: `__data.fields[${title.config.displayName}]`,\n      label: `Select by title`,\n      documentation: `Use the title to pick the field`,\n      origin: VariableOrigin.Fields,\n    });\n  }\n\n  return suggestions;\n};\n\nexport const getDataLinksVariableSuggestions = (\n  dataFrames: DataFrame[],\n  scope?: VariableSuggestionsScope\n): VariableSuggestion[] => {\n  const valueTimeVar = {\n    value: `${DataLinkBuiltInVars.valueTime}`,\n    label: 'Time',\n    documentation: 'Time value of the clicked datapoint (in ms epoch)',\n    origin: VariableOrigin.Value,\n  };\n  const includeValueVars = scope === VariableSuggestionsScope.Values;\n\n  return includeValueVars\n    ? [\n        ...seriesVars,\n        ...getFieldVars(dataFrames),\n        ...valueVars,\n        valueTimeVar,\n        ...getDataFrameVars(dataFrames),\n        ...getPanelLinksVariableSuggestions(),\n      ]\n    : [\n        ...seriesVars,\n        ...getFieldVars(dataFrames),\n        ...getDataFrameVars(dataFrames),\n        ...getPanelLinksVariableSuggestions(),\n      ];\n};\n\nexport const getCalculationValueDataLinksVariableSuggestions = (dataFrames: DataFrame[]): VariableSuggestion[] => {\n  const fieldVars = getFieldVars(dataFrames);\n  const valueCalcVar = {\n    value: `${DataLinkBuiltInVars.valueCalc}`,\n    label: 'Calculation name',\n    documentation: 'Name of the calculation the value is a result of',\n    origin: VariableOrigin.Value,\n  };\n  return [...seriesVars, ...fieldVars, ...valueVars, valueCalcVar, ...getPanelLinksVariableSuggestions()];\n};\n\nexport interface LinkService {\n  getDataLinkUIModel: <T>(link: DataLink, scopedVars: ScopedVars, origin: T) => LinkModel<T>;\n  getAnchorInfo: (link: any) => any;\n  getLinkUrl: (link: any) => string;\n}\n\nexport class LinkSrv implements LinkService {\n  /** @ngInject */\n  constructor(private templateSrv: TemplateSrv, private timeSrv: TimeSrv) {}\n\n  getLinkUrl(link: any) {\n    let url = locationUtil.assureBaseUrl(this.templateSrv.replace(link.url || ''));\n    const params: { [key: string]: any } = {};\n\n    if (link.keepTime) {\n      const range = this.timeSrv.timeRangeForUrl();\n      params['from'] = range.from;\n      params['to'] = range.to;\n    }\n\n    if (link.includeVars) {\n      this.templateSrv.fillVariableValuesForUrl(params);\n    }\n\n    url = urlUtil.appendQueryToUrl(url, urlUtil.toUrlParams(params));\n    return getConfig().disableSanitizeHtml ? url : textUtil.sanitizeUrl(url);\n  }\n\n  getAnchorInfo(link: any) {\n    const info: any = {};\n    info.href = this.getLinkUrl(link);\n    info.title = this.templateSrv.replace(link.title || '');\n    return info;\n  }\n\n  /**\n   * Returns LinkModel which is basically a DataLink with all values interpolated through the templateSrv.\n   */\n  getDataLinkUIModel = <T>(link: DataLink, scopedVars: ScopedVars, origin: T): LinkModel<T> => {\n    const params: KeyValue = {};\n    const timeRangeUrl = urlUtil.toUrlParams(this.timeSrv.timeRangeForUrl());\n\n    let href = link.url;\n\n    if (link.onBuildUrl) {\n      href = link.onBuildUrl({\n        origin,\n        scopedVars,\n      });\n    }\n\n    let onClick: (e: any) => void = undefined;\n\n    if (link.onClick) {\n      onClick = (e: any) => {\n        link.onClick({\n          origin,\n          scopedVars,\n          e,\n        });\n      };\n    }\n\n    const info: LinkModel<T> = {\n      href: locationUtil.assureBaseUrl(href.replace(/\\n/g, '')),\n      title: this.templateSrv.replace(link.title || '', scopedVars),\n      target: link.targetBlank ? '_blank' : '_self',\n      origin,\n      onClick,\n    };\n\n    this.templateSrv.fillVariableValuesForUrl(params, scopedVars);\n\n    const variablesQuery = urlUtil.toUrlParams(params);\n\n    info.href = this.templateSrv.replace(info.href, {\n      ...scopedVars,\n      [DataLinkBuiltInVars.keepTime]: {\n        text: timeRangeUrl,\n        value: timeRangeUrl,\n      },\n      [DataLinkBuiltInVars.includeVars]: {\n        text: variablesQuery,\n        value: variablesQuery,\n      },\n    });\n\n    info.href = getConfig().disableSanitizeHtml ? info.href : textUtil.sanitizeUrl(info.href);\n\n    return info;\n  };\n\n  /**\n   * getPanelLinkAnchorInfo method is left for plugins compatibility reasons\n   *\n   * @deprecated Drilldown links should be generated using getDataLinkUIModel method\n   */\n  getPanelLinkAnchorInfo(link: DataLink, scopedVars: ScopedVars) {\n    deprecationWarning('link_srv.ts', 'getPanelLinkAnchorInfo', 'getDataLinkUIModel');\n    return this.getDataLinkUIModel(link, scopedVars, {});\n  }\n}\n\nlet singleton: LinkService;\n\nexport function setLinkSrv(srv: LinkService) {\n  singleton = srv;\n}\n\nexport function getLinkSrv(): LinkService {\n  return singleton;\n}\n\ncoreModule.service('linkSrv', LinkSrv);\n","import { GrafanaTheme } from '@grafana/data';\nimport tinycolor from 'tinycolor2';\n\nexport function cardChrome(theme: GrafanaTheme): string {\n  return `\n       background: ${theme.colors.bg2};\n       &:hover {\n         background: ${hoverColor(theme.colors.bg2, theme)};\n       }\n       box-shadow: ${theme.shadows.listItem};\n       border-radius: ${theme.border.radius.md};\n    `;\n}\n\nexport function hoverColor(color: string, theme: GrafanaTheme): string {\n  return theme.isDark\n    ? tinycolor(color)\n        .brighten(2)\n        .toString()\n    : tinycolor(color)\n        .darken(2)\n        .toString();\n}\n\nexport function listItem(theme: GrafanaTheme): string {\n  return `\n  background: ${theme.colors.bg2};\n  &:hover {\n    background: ${hoverColor(theme.colors.bg2, theme)};\n  }\n  box-shadow: ${theme.shadows.listItem};\n  border-radius: ${theme.border.radius.md};\n`;\n}\n\nexport function listItemSelected(theme: GrafanaTheme): string {\n  return `\n       background: ${hoverColor(theme.colors.bg2, theme)};\n       color: ${theme.colors.textStrong};\n    `;\n}\n\nexport const focusCss = (theme: GrafanaTheme) => `\n  outline: 2px dotted transparent;\n  outline-offset: 2px;\n  box-shadow: 0 0 0 2px ${theme.colors.bodyBg}, 0 0 0px 4px ${theme.colors.formFocusOutline};\n  transition: all 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n`;\n","import React, { PureComponent } from 'react';\nimport { VariableQueryProps } from 'app/types/plugins';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport default class DefaultVariableQueryEditor extends PureComponent<VariableQueryProps, any> {\n  constructor(props: VariableQueryProps) {\n    super(props);\n    this.state = { value: props.query };\n  }\n\n  onChange = (event: React.FormEvent<HTMLTextAreaElement>) => {\n    this.setState({ value: event.currentTarget.value });\n  };\n\n  onBlur = (event: React.FormEvent<HTMLTextAreaElement>) => {\n    this.props.onChange(event.currentTarget.value, event.currentTarget.value);\n  };\n\n  getLineCount() {\n    const { value } = this.state;\n\n    if (typeof value === 'string') {\n      return value.split('\\n').length;\n    }\n\n    return 1;\n  }\n\n  render() {\n    return (\n      <div className=\"gf-form\">\n        <span className=\"gf-form-label width-10\">Query</span>\n        <textarea\n          rows={this.getLineCount()}\n          className=\"gf-form-input\"\n          value={this.state.value}\n          onChange={this.onChange}\n          onBlur={this.onBlur}\n          placeholder=\"metric name or tags query\"\n          required\n          aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsQueryInput}\n        />\n      </div>\n    );\n  }\n}\n","import { createSlice } from '@reduxjs/toolkit';\n\nimport { ApiKeysState } from 'app/types';\n\nexport const initialApiKeysState: ApiKeysState = {\n  keys: [],\n  searchQuery: '',\n  hasFetched: false,\n  includeExpired: false,\n};\n\nconst apiKeysSlice = createSlice({\n  name: 'apiKeys',\n  initialState: initialApiKeysState,\n  reducers: {\n    apiKeysLoaded: (state, action): ApiKeysState => {\n      return { ...state, hasFetched: true, keys: action.payload };\n    },\n    setSearchQuery: (state, action): ApiKeysState => {\n      return { ...state, searchQuery: action.payload };\n    },\n  },\n});\n\nexport const { setSearchQuery, apiKeysLoaded } = apiKeysSlice.actions;\n\nexport const apiKeysReducer = apiKeysSlice.reducer;\n\nexport default {\n  apiKeys: apiKeysReducer,\n};\n","var path = 'public/app/plugins/panel/graph/tab_thresholds.html';\nvar html = \"<graph-threshold-form panel-ctrl=ctrl></graph-threshold-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash';\nimport $ from 'jquery';\nimport coreModule from '../core_module';\n\n/** @ngInject */\nexport function dropdownTypeahead($compile: any) {\n  const inputTemplate =\n    '<input type=\"text\"' +\n    ' class=\"gf-form-input input-medium tight-form-input\"' +\n    ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const buttonTemplate =\n    '<a class=\"gf-form-label tight-form-func dropdown-toggle\"' +\n    ' tabindex=\"1\" gf-dropdown=\"menuItems\" data-toggle=\"dropdown\"' +\n    ' ><i class=\"fa fa-plus\"></i></a>';\n\n  return {\n    scope: {\n      menuItems: '=dropdownTypeahead',\n      dropdownTypeaheadOnSelect: '&dropdownTypeaheadOnSelect',\n      model: '=ngModel',\n    },\n    link: ($scope: any, elem: any, attrs: any) => {\n      const $input = $(inputTemplate);\n      const $button = $(buttonTemplate);\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      if (attrs.linkText) {\n        $button.html(attrs.linkText);\n      }\n\n      if (attrs.ngModel) {\n        $scope.$watch('model', (newValue: any) => {\n          _.each($scope.menuItems, item => {\n            _.each(item.submenu, subItem => {\n              if (subItem.value === newValue) {\n                $button.html(subItem.text);\n              }\n            });\n          });\n        });\n      }\n\n      const typeaheadValues = _.reduce(\n        $scope.menuItems,\n        (memo: any[], value, index) => {\n          if (!value.submenu) {\n            value.click = 'menuItemSelected(' + index + ')';\n            memo.push(value.text);\n          } else {\n            _.each(value.submenu, (item, subIndex) => {\n              item.click = 'menuItemSelected(' + index + ',' + subIndex + ')';\n              memo.push(value.text + ' ' + item.text);\n            });\n          }\n          return memo;\n        },\n        []\n      );\n\n      const closeDropdownMenu = () => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        elem.removeClass('open');\n      };\n\n      $scope.menuItemSelected = (index: number, subIndex: number) => {\n        const menuItem = $scope.menuItems[index];\n        const payload: any = { $item: menuItem };\n        if (menuItem.submenu && subIndex !== void 0) {\n          payload.$subItem = menuItem.submenu[subIndex];\n        }\n        $scope.dropdownTypeaheadOnSelect(payload);\n        closeDropdownMenu();\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: typeaheadValues,\n        minLength: 1,\n        items: 10,\n        updater: (value: string) => {\n          const result: any = {};\n          _.each($scope.menuItems, menuItem => {\n            _.each(menuItem.submenu, submenuItem => {\n              if (value === menuItem.text + ' ' + submenuItem.text) {\n                result.$subItem = submenuItem;\n                result.$item = menuItem;\n              }\n            });\n          });\n\n          if (result.$item) {\n            $scope.$apply(() => {\n              $scope.dropdownTypeaheadOnSelect(result);\n            });\n          }\n\n          $input.trigger('blur');\n          return '';\n        },\n      });\n\n      $button.click(() => {\n        $button.hide();\n        $input.show();\n        $input.focus();\n      });\n\n      $input.keyup(() => {\n        elem.toggleClass('open', $input.val() === '');\n      });\n\n      elem.mousedown((evt: Event) => {\n        evt.preventDefault();\n      });\n\n      $input.blur(() => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        // clicking the function dropdown menu won't\n        // work if you remove class at once\n        setTimeout(() => {\n          elem.removeClass('open');\n        }, 200);\n      });\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\n/** @ngInject */\nexport function dropdownTypeahead2($compile: any) {\n  const inputTemplate =\n    '<input type=\"text\"' + ' class=\"gf-form-input\"' + ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const buttonTemplate =\n    '<a class=\"{{buttonTemplateClass}} dropdown-toggle\"' +\n    ' tabindex=\"1\" gf-dropdown=\"menuItems\" data-toggle=\"dropdown\"' +\n    ' ><i class=\"fa fa-plus\"></i></a>';\n\n  return {\n    scope: {\n      menuItems: '=dropdownTypeahead2',\n      dropdownTypeaheadOnSelect: '&dropdownTypeaheadOnSelect',\n      model: '=ngModel',\n      buttonTemplateClass: '@',\n    },\n    link: ($scope: any, elem: any, attrs: any) => {\n      const $input = $(inputTemplate);\n\n      if (!$scope.buttonTemplateClass) {\n        $scope.buttonTemplateClass = 'gf-form-input';\n      }\n\n      const $button = $(buttonTemplate);\n      const timeoutId = {\n        blur: null as any,\n      };\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      if (attrs.linkText) {\n        $button.html(attrs.linkText);\n      }\n\n      if (attrs.ngModel) {\n        $scope.$watch('model', (newValue: any) => {\n          _.each($scope.menuItems, item => {\n            _.each(item.submenu, subItem => {\n              if (subItem.value === newValue) {\n                $button.html(subItem.text);\n              }\n            });\n          });\n        });\n      }\n\n      const typeaheadValues = _.reduce(\n        $scope.menuItems,\n        (memo: any[], value, index) => {\n          if (!value.submenu) {\n            value.click = 'menuItemSelected(' + index + ')';\n            memo.push(value.text);\n          } else {\n            _.each(value.submenu, (item, subIndex) => {\n              item.click = 'menuItemSelected(' + index + ',' + subIndex + ')';\n              memo.push(value.text + ' ' + item.text);\n            });\n          }\n          return memo;\n        },\n        []\n      );\n\n      const closeDropdownMenu = () => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        elem.removeClass('open');\n      };\n\n      $scope.menuItemSelected = (index: number, subIndex: number) => {\n        const menuItem = $scope.menuItems[index];\n        const payload: any = { $item: menuItem };\n        if (menuItem.submenu && subIndex !== void 0) {\n          payload.$subItem = menuItem.submenu[subIndex];\n        }\n        $scope.dropdownTypeaheadOnSelect(payload);\n        closeDropdownMenu();\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: typeaheadValues,\n        minLength: 1,\n        items: 10,\n        updater: (value: string) => {\n          const result: any = {};\n          _.each($scope.menuItems, menuItem => {\n            _.each(menuItem.submenu, submenuItem => {\n              if (value === menuItem.text + ' ' + submenuItem.text) {\n                result.$subItem = submenuItem;\n                result.$item = menuItem;\n              }\n            });\n          });\n\n          if (result.$item) {\n            $scope.$apply(() => {\n              $scope.dropdownTypeaheadOnSelect(result);\n            });\n          }\n\n          $input.trigger('blur');\n          return '';\n        },\n      });\n\n      $button.click(() => {\n        $button.hide();\n        $input.show();\n        $input.focus();\n      });\n\n      $input.keyup(() => {\n        elem.toggleClass('open', $input.val() === '');\n      });\n\n      elem.mousedown((evt: Event) => {\n        evt.preventDefault();\n        timeoutId.blur = null;\n      });\n\n      $input.blur(() => {\n        timeoutId.blur = setTimeout(() => {\n          closeDropdownMenu();\n        }, 1);\n      });\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\ncoreModule.directive('dropdownTypeahead', dropdownTypeahead);\ncoreModule.directive('dropdownTypeahead2', dropdownTypeahead2);\n","import coreModule from '../core_module';\n\n/** @ngInject */\nexport function autofillEventFix($compile: any) {\n  return {\n    link: ($scope: any, elem: any) => {\n      const input = elem[0];\n      const dispatchChangeEvent = () => {\n        const event = new Event('change');\n        return input.dispatchEvent(event);\n      };\n      const onAnimationStart = ({ animationName }: AnimationEvent) => {\n        switch (animationName) {\n          case 'onAutoFillStart':\n            return dispatchChangeEvent();\n          case 'onAutoFillCancel':\n            return dispatchChangeEvent();\n        }\n        return null;\n      };\n\n      // const onChange = (evt: Event) => console.log(evt);\n\n      input.addEventListener('animationstart', onAnimationStart);\n      // input.addEventListener('change', onChange);\n\n      $scope.$on('$destroy', () => {\n        input.removeEventListener('animationstart', onAnimationStart);\n        // input.removeEventListener('change', onChange);\n      });\n    },\n  };\n}\n\ncoreModule.directive('autofillEventFix', autofillEventFix);\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport coreModule from '../core_module';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\n\n/** @ngInject */\nexport function metricSegment($compile: any, $sce: any, templateSrv: TemplateSrv) {\n  const inputTemplate =\n    '<input type=\"text\" data-provide=\"typeahead\" ' +\n    ' class=\"gf-form-input input-medium\"' +\n    ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const linkTemplate =\n    '<a class=\"gf-form-label\" ng-class=\"segment.cssClass\" ' +\n    'tabindex=\"1\" give-focus=\"segment.focus\" ng-bind-html=\"segment.html\"></a>';\n\n  const selectTemplate =\n    '<a class=\"gf-form-input gf-form-input--dropdown\" ng-class=\"segment.cssClass\" ' +\n    'tabindex=\"1\" give-focus=\"segment.focus\" ng-bind-html=\"segment.html\"></a>';\n\n  return {\n    scope: {\n      segment: '=',\n      getOptions: '&',\n      onChange: '&',\n      debounce: '@',\n    },\n    link: ($scope: any, elem: any) => {\n      const $input = $(inputTemplate);\n      const segment = $scope.segment;\n      const $button = $(segment.selectMode ? selectTemplate : linkTemplate);\n      let options = null;\n      let cancelBlur: any = null;\n      let linkMode = true;\n      const debounceLookup = $scope.debounce;\n\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      $scope.updateVariableValue = (value: string) => {\n        if (value === '' || segment.value === value) {\n          return;\n        }\n\n        $scope.$apply(() => {\n          const selected: any = _.find($scope.altSegments, { value: value });\n          if (selected) {\n            segment.value = selected.value;\n            segment.html = selected.html || $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(selected.value));\n            segment.fake = false;\n            segment.expandable = selected.expandable;\n\n            if (selected.type) {\n              segment.type = selected.type;\n            }\n          } else if (segment.custom !== 'false') {\n            segment.value = value;\n            segment.html = $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(value));\n            segment.expandable = true;\n            segment.fake = false;\n          }\n\n          $scope.onChange();\n        });\n      };\n\n      $scope.switchToLink = (fromClick: boolean) => {\n        if (linkMode && !fromClick) {\n          return;\n        }\n\n        clearTimeout(cancelBlur);\n        cancelBlur = null;\n        linkMode = true;\n        $input.hide();\n        $button.show();\n        $scope.updateVariableValue($input.val());\n      };\n\n      $scope.inputBlur = () => {\n        // happens long before the click event on the typeahead options\n        // need to have long delay because the blur\n        cancelBlur = setTimeout($scope.switchToLink, 200);\n      };\n\n      $scope.source = (query: string, callback: any) => {\n        $scope.$apply(() => {\n          $scope.getOptions({ $query: query }).then((altSegments: any) => {\n            $scope.altSegments = altSegments;\n            options = _.map($scope.altSegments, alt => {\n              return _.escape(alt.value);\n            });\n\n            // add custom values\n            if (segment.custom !== 'false') {\n              if (!segment.fake && _.indexOf(options, segment.value) === -1) {\n                options.unshift(_.escape(segment.value));\n              }\n            }\n\n            callback(options);\n          });\n        });\n      };\n\n      $scope.updater = (value: string) => {\n        value = _.unescape(value);\n        if (value === segment.value) {\n          clearTimeout(cancelBlur);\n          $input.focus();\n          return value;\n        }\n\n        $input.val(value);\n        $scope.switchToLink(true);\n\n        return value;\n      };\n\n      $scope.matcher = function(item: string) {\n        if (linkMode) {\n          return false;\n        }\n        let str = this.query;\n        if (str[0] === '/') {\n          str = str.substring(1);\n        }\n        if (str[str.length - 1] === '/') {\n          str = str.substring(0, str.length - 1);\n        }\n        try {\n          return item.toLowerCase().match(str.toLowerCase());\n        } catch (e) {\n          return false;\n        }\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: $scope.source,\n        minLength: 0,\n        items: 10000,\n        updater: $scope.updater,\n        matcher: $scope.matcher,\n      });\n\n      const typeahead = $input.data('typeahead');\n      typeahead.lookup = function() {\n        this.query = this.$element.val() || '';\n        const items = this.source(this.query, $.proxy(this.process, this));\n        return items ? this.process(items) : items;\n      };\n\n      if (debounceLookup) {\n        typeahead.lookup = _.debounce(typeahead.lookup, 500, { leading: true });\n      }\n\n      $button.keydown(evt => {\n        // trigger typeahead on down arrow or enter key\n        if (evt.keyCode === 40 || evt.keyCode === 13) {\n          $button.click();\n        }\n      });\n\n      $button.click(() => {\n        options = null;\n        $input.css('width', Math.max($button.width(), 80) + 16 + 'px');\n\n        $button.hide();\n        $input.show();\n        $input.focus();\n\n        linkMode = false;\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      });\n\n      $input.blur($scope.inputBlur);\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\n/** @ngInject */\nexport function metricSegmentModel(uiSegmentSrv: any) {\n  return {\n    template:\n      '<metric-segment segment=\"segment\" get-options=\"getOptionsInternal()\" on-change=\"onSegmentChange()\"></metric-segment>',\n    restrict: 'E',\n    scope: {\n      property: '=',\n      options: '=',\n      getOptions: '&',\n      onChange: '&',\n    },\n    link: {\n      pre: function postLink($scope: any, elem: any, attrs: any) {\n        let cachedOptions: any;\n\n        $scope.valueToSegment = (value: any) => {\n          const option: any = _.find($scope.options, { value: value });\n          const segment = {\n            cssClass: attrs.cssClass,\n            custom: attrs.custom,\n            value: option ? option.text : value,\n            selectMode: attrs.selectMode,\n          };\n\n          return uiSegmentSrv.newSegment(segment);\n        };\n\n        $scope.getOptionsInternal = () => {\n          if ($scope.options) {\n            cachedOptions = $scope.options;\n            return Promise.resolve(\n              _.map($scope.options, option => {\n                return { value: option.text };\n              })\n            );\n          } else {\n            return $scope.getOptions().then((options: any) => {\n              cachedOptions = options;\n              return _.map(options, option => {\n                if (option.html) {\n                  return option;\n                }\n                return { value: option.text };\n              });\n            });\n          }\n        };\n\n        $scope.onSegmentChange = () => {\n          if (cachedOptions) {\n            const option: any = _.find(cachedOptions, { text: $scope.segment.value });\n            if (option && option.value !== $scope.property) {\n              $scope.property = option.value;\n            } else if (attrs.custom !== 'false') {\n              $scope.property = $scope.segment.value;\n            }\n          } else {\n            $scope.property = $scope.segment.value;\n          }\n\n          // needs to call this after digest so\n          // property is synced with outerscope\n          $scope.$$postDigest(() => {\n            $scope.$apply(() => {\n              $scope.onChange();\n            });\n          });\n        };\n\n        $scope.segment = $scope.valueToSegment($scope.property);\n      },\n    },\n  };\n}\n\ncoreModule.directive('metricSegment', metricSegment);\ncoreModule.directive('metricSegmentModel', metricSegmentModel);\n","import angular from 'angular';\nimport Clipboard from 'clipboard';\nimport coreModule from '../core_module';\nimport kbn from 'app/core/utils/kbn';\nimport { appEvents } from 'app/core/core';\nimport { AppEvents } from '@grafana/data';\n\n/** @ngInject */\nfunction tip($compile: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      let _t =\n        '<i class=\"grafana-tip fa fa-' +\n        (attrs.icon || 'question-circle') +\n        '\" bs-tooltip=\"\\'' +\n        kbn.addslashes(elem.text()) +\n        '\\'\"></i>';\n      _t = _t.replace(/{/g, '\\\\{').replace(/}/g, '\\\\}');\n      elem.replaceWith($compile(angular.element(_t))(scope));\n    },\n  };\n}\n\nfunction clipboardButton() {\n  return {\n    scope: {\n      getText: '&clipboardButton',\n    },\n    link: (scope: any, elem: any) => {\n      scope.clipboard = new Clipboard(elem[0], {\n        text: () => {\n          return scope.getText();\n        },\n      });\n\n      scope.clipboard.on('success', () => {\n        appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\n      });\n\n      scope.$on('$destroy', () => {\n        if (scope.clipboard) {\n          scope.clipboard.destroy();\n        }\n      });\n    },\n  };\n}\n\n/** @ngInject */\nfunction compile($compile: any) {\n  return {\n    restrict: 'A',\n    link: (scope: any, element: any, attrs: any) => {\n      scope.$watch(\n        (scope: any) => {\n          return scope.$eval(attrs.compile);\n        },\n        (value: any) => {\n          element.html(value);\n          $compile(element.contents())(scope);\n        }\n      );\n    },\n  };\n}\n\nfunction watchChange() {\n  return {\n    scope: { onchange: '&watchChange' },\n    link: (scope: any, element: any) => {\n      element.on('input', () => {\n        scope.$apply(() => {\n          scope.onchange({ inputValue: element.val() });\n        });\n      });\n    },\n  };\n}\n\n/** @ngInject */\nfunction editorOptBool($compile: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      const ngchange = attrs.change ? ' ng-change=\"' + attrs.change + '\"' : '';\n      const tip = attrs.tip ? ' <tip>' + attrs.tip + '</tip>' : '';\n      const showIf = attrs.showIf ? ' ng-show=\"' + attrs.showIf + '\" ' : '';\n\n      const template =\n        '<div class=\"editor-option gf-form-checkbox text-center\"' +\n        showIf +\n        '>' +\n        ' <label for=\"' +\n        attrs.model +\n        '\" class=\"small\">' +\n        attrs.text +\n        tip +\n        '</label>' +\n        '<input class=\"cr1\" id=\"' +\n        attrs.model +\n        '\" type=\"checkbox\" ' +\n        '       ng-model=\"' +\n        attrs.model +\n        '\"' +\n        ngchange +\n        '       ng-checked=\"' +\n        attrs.model +\n        '\"></input>' +\n        ' <label for=\"' +\n        attrs.model +\n        '\" class=\"cr1\"></label>';\n      elem.replaceWith($compile(angular.element(template))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction editorCheckbox($compile: any, $interpolate: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      const text = $interpolate(attrs.text)(scope);\n      const model = $interpolate(attrs.model)(scope);\n      const ngchange = attrs.change ? ' ng-change=\"' + attrs.change + '\"' : '';\n      const tip = attrs.tip ? ' <tip>' + attrs.tip + '</tip>' : '';\n      const label = '<label for=\"' + scope.$id + model + '\" class=\"checkbox-label\">' + text + tip + '</label>';\n\n      let template =\n        '<input class=\"cr1\" id=\"' +\n        scope.$id +\n        model +\n        '\" type=\"checkbox\" ' +\n        '       ng-model=\"' +\n        model +\n        '\"' +\n        ngchange +\n        '       ng-checked=\"' +\n        model +\n        '\"></input>' +\n        ' <label for=\"' +\n        scope.$id +\n        model +\n        '\" class=\"cr1\"></label>';\n\n      template = template + label;\n      elem.addClass('gf-form-checkbox');\n      elem.html($compile(angular.element(template))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction gfDropdown($parse: any, $compile: any, $timeout: any) {\n  function buildTemplate(items: any, placement?: any) {\n    const upclass = placement === 'top' ? 'dropup' : '';\n    const ul = ['<ul class=\"dropdown-menu ' + upclass + '\" role=\"menu\" aria-labelledby=\"drop1\">', '</ul>'];\n\n    for (let index = 0; index < items.length; index++) {\n      const item = items[index];\n\n      if (item.divider) {\n        ul.splice(index + 1, 0, '<li class=\"divider\"></li>');\n        continue;\n      }\n\n      let li =\n        '<li' +\n        (item.submenu && item.submenu.length ? ' class=\"dropdown-submenu\"' : '') +\n        '>' +\n        '<a tabindex=\"-1\" ng-href=\"' +\n        (item.href || '') +\n        '\"' +\n        (item.click ? ' ng-click=\"' + item.click + '\"' : '') +\n        (item.target ? ' target=\"' + item.target + '\"' : '') +\n        (item.method ? ' data-method=\"' + item.method + '\"' : '') +\n        '>' +\n        (item.text || '') +\n        '</a>';\n\n      if (item.submenu && item.submenu.length) {\n        li += buildTemplate(item.submenu).join('\\n');\n      }\n\n      li += '</li>';\n      ul.splice(index + 1, 0, li);\n    }\n\n    return ul;\n  }\n\n  return {\n    restrict: 'EA',\n    scope: true,\n    link: function postLink(scope: any, iElement: any, iAttrs: any) {\n      const getter = $parse(iAttrs.gfDropdown),\n        items = getter(scope);\n      $timeout(() => {\n        const placement = iElement.data('placement');\n        const dropdown = angular.element(buildTemplate(items, placement).join(''));\n        dropdown.insertAfter(iElement);\n        $compile(iElement.next('ul.dropdown-menu'))(scope);\n      });\n\n      iElement.addClass('dropdown-toggle').attr('data-toggle', 'dropdown');\n    },\n  };\n}\n\ncoreModule.directive('tip', tip);\ncoreModule.directive('clipboardButton', clipboardButton);\ncoreModule.directive('compile', compile);\ncoreModule.directive('watchChange', watchChange);\ncoreModule.directive('editorOptBool', editorOptBool);\ncoreModule.directive('editorCheckbox', editorCheckbox);\ncoreModule.directive('gfDropdown', gfDropdown);\n","import coreModule from '../core_module';\nimport { rangeUtil } from '@grafana/data';\n\nfunction ngModelOnBlur() {\n  return {\n    restrict: 'A',\n    priority: 1,\n    require: 'ngModel',\n    link: (scope: any, elm: any, attr: any, ngModelCtrl: any) => {\n      if (attr.type === 'radio' || attr.type === 'checkbox') {\n        return;\n      }\n\n      elm.off('input keydown change');\n      elm.bind('blur', () => {\n        scope.$apply(() => {\n          ngModelCtrl.$setViewValue(elm.val());\n        });\n      });\n    },\n  };\n}\n\nfunction emptyToNull() {\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: (scope: any, elm: any, attrs: any, ctrl: any) => {\n      ctrl.$parsers.push((viewValue: any) => {\n        if (viewValue === '') {\n          return null;\n        }\n        return viewValue;\n      });\n    },\n  };\n}\n\nfunction validTimeSpan() {\n  return {\n    require: 'ngModel',\n    link: (scope: any, elm: any, attrs: any, ctrl: any) => {\n      ctrl.$validators.integer = (modelValue: any, viewValue: any) => {\n        if (ctrl.$isEmpty(modelValue)) {\n          return true;\n        }\n        if (viewValue.indexOf('$') === 0 || viewValue.indexOf('+$') === 0) {\n          return true; // allow template variable\n        }\n        const info = rangeUtil.describeTextRange(viewValue);\n        return info.invalid !== true;\n      };\n    },\n  };\n}\n\ncoreModule.directive('ngModelOnblur', ngModelOnBlur);\ncoreModule.directive('emptyToNull', emptyToNull);\ncoreModule.directive('validTimeSpan', validTimeSpan);\n","import angular from 'angular';\nimport { getTagColorsFromName } from '@grafana/ui';\nimport $ from 'jquery';\nimport coreModule from '../core_module';\nimport 'vendor/tagsinput/bootstrap-tagsinput.js';\n\nfunction setColor(name: string, element: JQuery) {\n  const { color, borderColor } = getTagColorsFromName(name);\n  element.css('background-color', color);\n  element.css('border-color', borderColor);\n}\n\nfunction tagColorFromName() {\n  return {\n    scope: { tagColorFromName: '=' },\n    link: (scope: any, element: any) => {\n      setColor(scope.tagColorFromName, element);\n    },\n  };\n}\n\nfunction bootstrapTagsinput() {\n  function getItemProperty(scope: any, property: any) {\n    if (!property) {\n      return undefined;\n    }\n\n    if (angular.isFunction(scope.$parent[property])) {\n      return scope.$parent[property];\n    }\n\n    return (item: any) => {\n      return item[property];\n    };\n  }\n\n  return {\n    restrict: 'EA',\n    scope: {\n      model: '=ngModel',\n      onTagsUpdated: '&',\n    },\n    template: '<select multiple></select>',\n    replace: false,\n    link: function(scope: any, element: any, attrs: any) {\n      if (!angular.isArray(scope.model)) {\n        scope.model = [];\n      }\n\n      const select = $('select', element);\n\n      if (attrs.placeholder) {\n        select.attr('placeholder', attrs.placeholder);\n      }\n\n      select.tagsinput({\n        typeahead: {\n          source: angular.isFunction(scope.$parent[attrs.typeaheadSource])\n            ? scope.$parent[attrs.typeaheadSource]\n            : null,\n        },\n        widthClass: attrs.widthClass,\n        itemValue: getItemProperty(scope, attrs.itemvalue),\n        itemText: getItemProperty(scope, attrs.itemtext),\n        tagClass: angular.isFunction(scope.$parent[attrs.tagclass])\n          ? scope.$parent[attrs.tagclass]\n          : () => {\n              return attrs.tagclass;\n            },\n      });\n\n      select.on('itemAdded', (event: any) => {\n        if (scope.model.indexOf(event.item) === -1) {\n          scope.model.push(event.item);\n          if (scope.onTagsUpdated) {\n            scope.onTagsUpdated();\n          }\n        }\n        const tagElement = select\n          .next()\n          .children('span')\n          .filter(() => {\n            return $(this).text() === event.item;\n          });\n        setColor(event.item, tagElement);\n      });\n\n      select.on('itemRemoved', (event: any) => {\n        const idx = scope.model.indexOf(event.item);\n        if (idx !== -1) {\n          scope.model.splice(idx, 1);\n          if (scope.onTagsUpdated) {\n            scope.onTagsUpdated();\n          }\n        }\n      });\n\n      scope.$watch(\n        'model',\n        () => {\n          if (!angular.isArray(scope.model)) {\n            scope.model = [];\n          }\n\n          select.tagsinput('removeAll');\n\n          for (let i = 0; i < scope.model.length; i++) {\n            select.tagsinput('add', scope.model[i]);\n          }\n        },\n        true\n      );\n    },\n  };\n}\n\ncoreModule.directive('tagColorFromName', tagColorFromName);\ncoreModule.directive('bootstrapTagsinput', bootstrapTagsinput);\n","import angular, { IScope } from 'angular';\nimport debounce from 'lodash/debounce';\nimport each from 'lodash/each';\nimport filter from 'lodash/filter';\nimport find from 'lodash/find';\nimport indexOf from 'lodash/indexOf';\nimport map from 'lodash/map';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport coreModule from '../core_module';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { containsSearchFilter } from '../../features/templating/utils';\n\nexport class ValueSelectDropdownCtrl {\n  dropdownVisible: any;\n  highlightIndex: any;\n  linkText: any;\n  oldVariableText: any;\n  options: any;\n  search: any;\n  selectedTags: any;\n  selectedValues: any;\n  tags: any;\n  variable: any;\n\n  hide: any;\n  onUpdated: any;\n  queryHasSearchFilter: boolean;\n  debouncedQueryChanged: Function;\n  selectors: typeof selectors.pages.Dashboard.SubMenu;\n\n  /** @ngInject */\n  constructor(private $scope: IScope) {\n    this.queryHasSearchFilter = this.variable ? containsSearchFilter(this.variable.query) : false;\n    this.debouncedQueryChanged = debounce(this.queryChanged.bind(this), 200);\n    this.selectors = selectors.pages.Dashboard.SubMenu;\n  }\n\n  show() {\n    this.oldVariableText = this.variable.current.text;\n    this.highlightIndex = -1;\n\n    this.options = this.variable.options;\n    this.selectedValues = filter(this.options, { selected: true });\n\n    this.tags = map(this.variable.tags, value => {\n      let tag = { text: value, selected: false };\n      each(this.variable.current.tags, tagObj => {\n        if (tagObj.text === value) {\n          tag = tagObj;\n        }\n      });\n      return tag;\n    });\n\n    // new behaviour, if this is a query that uses searchfilter it might be a nicer\n    // user experience to show the last typed search query in the input field\n    const query = this.queryHasSearchFilter && this.search && this.search.query ? this.search.query : '';\n\n    this.search = {\n      query,\n      options: this.options.slice(0, Math.min(this.options.length, 1000)),\n    };\n\n    this.dropdownVisible = true;\n  }\n\n  updateLinkText() {\n    const current = this.variable.current;\n\n    if (current.tags && current.tags.length) {\n      // filer out values that are in selected tags\n      const selectedAndNotInTag = filter(this.variable.options, option => {\n        if (!option.selected) {\n          return false;\n        }\n        for (let i = 0; i < current.tags.length; i++) {\n          const tag = current.tags[i];\n          if (indexOf(tag.values, option.value) !== -1) {\n            return false;\n          }\n        }\n        return true;\n      });\n\n      // convert values to text\n      const currentTexts = map(selectedAndNotInTag, 'text');\n\n      // join texts\n      this.linkText = currentTexts.join(' + ');\n      if (this.linkText.length > 0) {\n        this.linkText += ' + ';\n      }\n    } else {\n      this.linkText = this.variable.current.text;\n    }\n  }\n\n  clearSelections() {\n    this.selectedValues = filter(this.options, { selected: true });\n\n    if (this.selectedValues.length) {\n      each(this.options, option => {\n        option.selected = false;\n      });\n    } else {\n      each(this.search.options, option => {\n        option.selected = true;\n      });\n    }\n    this.selectionsChanged(false);\n  }\n\n  selectTag(tag: any) {\n    tag.selected = !tag.selected;\n    let tagValuesPromise;\n    if (!tag.values) {\n      tagValuesPromise = this.variable.getValuesForTag(tag.text);\n    } else {\n      tagValuesPromise = Promise.resolve(tag.values);\n    }\n\n    return tagValuesPromise.then((values: any) => {\n      tag.values = values;\n      tag.valuesText = values.join(' + ');\n      each(this.options, option => {\n        if (indexOf(tag.values, option.value) !== -1) {\n          option.selected = tag.selected;\n        }\n      });\n\n      this.selectionsChanged(false);\n    });\n  }\n\n  keyDown(evt: any) {\n    if (evt.keyCode === 27) {\n      this.hide();\n    }\n    if (evt.keyCode === 40) {\n      this.moveHighlight(1);\n    }\n    if (evt.keyCode === 38) {\n      this.moveHighlight(-1);\n    }\n    if (evt.keyCode === 13) {\n      if (this.search.options.length === 0) {\n        this.commitChanges();\n      } else {\n        this.selectValue(this.search.options[this.highlightIndex], {}, true);\n      }\n    }\n    if (evt.keyCode === 32) {\n      this.selectValue(this.search.options[this.highlightIndex], {}, false);\n    }\n  }\n\n  moveHighlight(direction: number) {\n    this.highlightIndex = (this.highlightIndex + direction) % this.search.options.length;\n  }\n\n  selectValue(option: any, event: any, commitChange?: boolean) {\n    if (!option) {\n      return;\n    }\n\n    option.selected = this.variable.multi ? !option.selected : true;\n\n    commitChange = commitChange || false;\n\n    const setAllExceptCurrentTo = (newValue: any) => {\n      each(this.options, other => {\n        if (option !== other) {\n          other.selected = newValue;\n        }\n      });\n    };\n\n    // commit action (enter key), should not deselect it\n    if (commitChange) {\n      option.selected = true;\n    }\n\n    if (option.text === 'All') {\n      // always clear search query if all is marked\n      this.search.query = '';\n      setAllExceptCurrentTo(false);\n      commitChange = true;\n    } else if (!this.variable.multi) {\n      setAllExceptCurrentTo(false);\n      commitChange = true;\n    } else if (event.ctrlKey || event.metaKey || event.shiftKey) {\n      commitChange = true;\n      setAllExceptCurrentTo(false);\n    }\n\n    this.selectionsChanged(commitChange);\n  }\n\n  selectionsChanged(commitChange: boolean) {\n    this.selectedValues = filter(this.options, { selected: true });\n\n    if (this.selectedValues.length > 1) {\n      if (this.selectedValues[0].text === 'All') {\n        this.selectedValues[0].selected = false;\n        this.selectedValues = this.selectedValues.slice(1, this.selectedValues.length);\n      }\n    }\n\n    // validate selected tags\n    each(this.tags, tag => {\n      if (tag.selected) {\n        each(tag.values, value => {\n          if (!find(this.selectedValues, { value: value })) {\n            tag.selected = false;\n          }\n        });\n      }\n    });\n\n    this.selectedTags = filter(this.tags, { selected: true });\n    this.variable.current.value = map(this.selectedValues, 'value');\n    this.variable.current.text = map(this.selectedValues, 'text').join(' + ');\n    this.variable.current.tags = this.selectedTags;\n\n    if (!this.variable.multi) {\n      this.variable.current.value = this.selectedValues[0].value;\n    }\n\n    if (commitChange) {\n      this.commitChanges();\n    }\n  }\n\n  commitChanges() {\n    // if we have a search query and no options use that\n    if (this.search.options.length === 0 && this.search.query.length > 0) {\n      this.variable.current = { text: this.search.query, value: this.search.query };\n    } else if (this.selectedValues.length === 0) {\n      // make sure one option is selected\n      this.options[0].selected = true;\n      this.selectionsChanged(false);\n    }\n\n    this.dropdownVisible = false;\n    this.updateLinkText();\n    if (this.queryHasSearchFilter) {\n      this.updateLazyLoadedOptions();\n    }\n\n    if (this.variable.current.text !== this.oldVariableText) {\n      this.onUpdated();\n    }\n  }\n\n  async queryChanged() {\n    if (this.queryHasSearchFilter) {\n      await this.updateLazyLoadedOptions();\n      return;\n    }\n\n    const options = filter(this.options, option => {\n      return option.text.toLowerCase().indexOf(this.search.query.toLowerCase()) !== -1;\n    });\n\n    this.updateUIBoundOptions(this.$scope, options);\n  }\n\n  init() {\n    this.selectedTags = this.variable.current.tags || [];\n    this.updateLinkText();\n  }\n\n  async updateLazyLoadedOptions() {\n    this.options = await this.lazyLoadOptions(this.search.query);\n    this.updateUIBoundOptions(this.$scope, this.options);\n  }\n\n  async lazyLoadOptions(query: string): Promise<any[]> {\n    await this.variable.updateOptions(query);\n    return this.variable.options;\n  }\n\n  updateUIBoundOptions($scope: IScope, options: any[]) {\n    this.highlightIndex = 0;\n    this.search.options = options.slice(0, Math.min(options.length, 1000));\n    $scope.$apply();\n  }\n}\n\n/** @ngInject */\nexport function valueSelectDropdown($compile: any, $window: any, $timeout: any, $rootScope: GrafanaRootScope) {\n  return {\n    scope: { dashboard: '=', variable: '=', onUpdated: '&' },\n    templateUrl: 'public/app/partials/valueSelectDropdown.html',\n    controller: 'ValueSelectDropdownCtrl',\n    controllerAs: 'vm',\n    bindToController: true,\n    link: (scope: any, elem: any) => {\n      const bodyEl = angular.element($window.document.body);\n      const linkEl = elem.find('.variable-value-link');\n      const inputEl = elem.find('input');\n\n      function openDropdown() {\n        inputEl.css('width', Math.max(linkEl.width(), 80) + 'px');\n\n        inputEl.show();\n        linkEl.hide();\n\n        inputEl.focus();\n        $timeout(\n          () => {\n            bodyEl.on('click', bodyOnClick);\n          },\n          0,\n          false\n        );\n      }\n\n      function switchToLink() {\n        inputEl.hide();\n        linkEl.show();\n        bodyEl.off('click', bodyOnClick);\n      }\n\n      function bodyOnClick(e: any) {\n        if (elem.has(e.target).length === 0) {\n          scope.$apply(() => {\n            scope.vm.commitChanges();\n          });\n        }\n      }\n\n      scope.$watch('vm.dropdownVisible', (newValue: any) => {\n        if (newValue) {\n          openDropdown();\n        } else {\n          switchToLink();\n        }\n      });\n\n      scope.vm.dashboard.on(\n        'template-variable-value-updated',\n        () => {\n          scope.vm.updateLinkText();\n        },\n        scope\n      );\n\n      scope.vm.init();\n    },\n  };\n}\n\ncoreModule.controller('ValueSelectDropdownCtrl', ValueSelectDropdownCtrl);\ncoreModule.directive('valueSelectDropdown', valueSelectDropdown);\n","import $ from 'jquery';\nimport coreModule from '../core_module';\n\nfunction getBlockNodes(nodes: any[]) {\n  let node = nodes[0];\n  const endNode = nodes[nodes.length - 1];\n  let blockNodes: any[];\n  node = node.nextSibling;\n\n  for (let i = 1; node !== endNode && node; i++) {\n    if (blockNodes || nodes[i] !== node) {\n      if (!blockNodes) {\n        blockNodes = $([].slice.call(nodes, 0, i)) as any;\n      }\n      blockNodes.push(node);\n    }\n    node = node.nextSibling;\n  }\n\n  return blockNodes || nodes;\n}\n\n/** @ngInject */\nfunction rebuildOnChange($animate: any) {\n  return {\n    multiElement: true,\n    terminal: true,\n    transclude: true,\n    priority: 600,\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any, ctrl: any, transclude: any) => {\n      let block: any, childScope: any, previousElements: any;\n\n      function cleanUp() {\n        if (previousElements) {\n          previousElements.remove();\n          previousElements = null;\n        }\n        if (childScope) {\n          childScope.$destroy();\n          childScope = null;\n        }\n        if (block) {\n          previousElements = getBlockNodes(block.clone);\n          $animate.leave(previousElements).then(() => {\n            previousElements = null;\n          });\n          block = null;\n        }\n      }\n\n      scope.$watch(attrs.property, function rebuildOnChangeAction(value: any, oldValue: any) {\n        if (childScope && value !== oldValue) {\n          cleanUp();\n        }\n\n        if (!childScope && (value || attrs.showNull)) {\n          transclude((clone: any, newScope: any) => {\n            childScope = newScope;\n            clone[clone.length++] = document.createComment(' end rebuild on change ');\n            block = { clone: clone };\n            $animate.enter(clone, elem.parent(), elem);\n          });\n        } else {\n          cleanUp();\n        }\n      });\n    },\n  };\n}\n\ncoreModule.directive('rebuildOnChange', rebuildOnChange);\n","import coreModule from '../core_module';\n\ncoreModule.directive('giveFocus', () => {\n  return (scope: any, element: any, attrs: any) => {\n    element.click((e: any) => {\n      e.stopPropagation();\n    });\n\n    scope.$watch(\n      attrs.giveFocus,\n      (newValue: any) => {\n        if (!newValue) {\n          return;\n        }\n        setTimeout(() => {\n          element.focus();\n          const domEl: any = element[0];\n          if (domEl.setSelectionRange) {\n            const pos = element.val().length * 2;\n            domEl.setSelectionRange(pos, pos);\n          }\n        }, 200);\n      },\n      true\n    );\n  };\n});\n\nexport default {};\n","import angular from 'angular';\nimport coreModule from '../core_module';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { CoreEvents } from 'app/types';\n\nexport class DeltaCtrl {\n  observer: any;\n\n  /** @ngInject */\n  constructor(private $rootScope: GrafanaRootScope) {\n    const waitForCompile = (mutations: any) => {\n      if (mutations.length === 1) {\n        this.$rootScope.appEvent(CoreEvents.jsonDiffReady);\n      }\n    };\n\n    this.observer = new MutationObserver(waitForCompile);\n\n    const observerConfig = {\n      attributes: true,\n      attributeFilter: ['class'],\n      characterData: false,\n      childList: true,\n      subtree: false,\n    };\n\n    this.observer.observe(angular.element('.delta-html')[0], observerConfig);\n  }\n\n  $onDestroy() {\n    this.observer.disconnect();\n  }\n}\n\nexport function delta() {\n  return {\n    controller: DeltaCtrl,\n    replace: false,\n    restrict: 'A',\n  };\n}\ncoreModule.directive('diffDelta', delta);\n\n// Link to JSON line number\nexport class LinkJSONCtrl {\n  /** @ngInject */\n  constructor(private $scope: any, private $rootScope: GrafanaRootScope, private $anchorScroll: any) {}\n\n  goToLine(line: number) {\n    let unbind: () => void;\n\n    const scroll = () => {\n      this.$anchorScroll(`l${line}`);\n      unbind();\n    };\n\n    this.$scope.switchView().then(() => {\n      unbind = this.$rootScope.$on('json-diff-ready', scroll.bind(this));\n    });\n  }\n}\n\nexport function linkJson() {\n  return {\n    controller: LinkJSONCtrl,\n    controllerAs: 'ctrl',\n    replace: true,\n    restrict: 'E',\n    scope: {\n      line: '@lineDisplay',\n      link: '@lineLink',\n      switchView: '&',\n    },\n    template: `<a class=\"diff-linenum btn btn-inverse btn-small\" ng-click=\"ctrl.goToLine(link)\">Line {{ line }}</a>`,\n  };\n}\ncoreModule.directive('diffLinkJson', linkJson);\n","import $ from 'jquery';\nimport angular from 'angular';\nimport _ from 'lodash';\n\nconst $win = $(window);\n\n$.fn.place_tt = (() => {\n  const defaults = {\n    offset: 5,\n  };\n\n  return function(this: any, x: number, y: number, opts: any) {\n    opts = $.extend(true, {}, defaults, opts);\n\n    return this.each(() => {\n      const $tooltip = $(this);\n      let width, height;\n\n      $tooltip.addClass('grafana-tooltip');\n\n      $('#tooltip').remove();\n      $tooltip.appendTo(document.body);\n\n      if (opts.compile) {\n        angular\n          .element(document)\n          .injector()\n          .invoke([\n            '$compile',\n            '$rootScope',\n            ($compile, $rootScope) => {\n              const tmpScope = $rootScope.$new(true);\n              _.extend(tmpScope, opts.scopeData);\n\n              $compile($tooltip)(tmpScope);\n              tmpScope.$digest();\n              tmpScope.$destroy();\n            },\n          ]);\n      }\n\n      width = $tooltip.outerWidth(true);\n      height = $tooltip.outerHeight(true);\n\n      const left = x + opts.offset + width > $win.width() ? x - opts.offset - width : x + opts.offset;\n      const top = y + opts.offset + height > $win.height() ? y - opts.offset - height : y + opts.offset;\n\n      $tooltip.css('left', left > 0 ? left : 0);\n      $tooltip.css('top', top > 0 ? top : 0);\n    });\n  };\n})();\n","import coreModule from 'app/core/core_module';\nimport { JsonExplorer } from '@grafana/ui';\n\ncoreModule.directive('jsonTree', [\n  function jsonTreeDirective() {\n    return {\n      restrict: 'E',\n      scope: {\n        object: '=',\n        startExpanded: '@',\n        rootName: '@',\n      },\n      link: (scope: any, elem) => {\n        let expansionLevel = scope.startExpanded;\n        if (scope.startExpanded === 'true') {\n          expansionLevel = 2;\n        } else if (scope.startExpanded === 'false') {\n          expansionLevel = 1;\n        }\n        const jsonObject = { [scope.rootName]: scope.object };\n        const jsonExp = new JsonExplorer(jsonObject, expansionLevel, {\n          animateOpen: true,\n        });\n        const html = jsonExp.render(true);\n        elem.append(html);\n      },\n    };\n  },\n]);\n","/**\n * codeEditor directive based on Ace code editor\n * https://github.com/ajaxorg/ace\n *\n * Basic usage:\n * <code-editor content=\"ctrl.target.query\" on-change=\"ctrl.panelCtrl.refresh()\"\n *  data-mode=\"sql\" data-show-gutter>\n * </code-editor>\n *\n * Params:\n * content:      Editor content.\n * onChange:     Function called on content change (invoked on editor blur, ctrl+enter, not on every change).\n * getCompleter: Function returned external completer. Completer is an object implemented getCompletions() method,\n *               see Prometheus Data Source implementation for details.\n *\n * Some Ace editor options available via data-* attributes:\n * data-mode               - Language mode (text, sql, javascript, etc.). Default is 'text'.\n * data-theme              - Editor theme (eg 'solarized_dark').\n * data-max-lines          - Max editor height in lines. Editor grows automatically from 1 to maxLines.\n * data-show-gutter        - Show gutter (contains line numbers and additional info).\n * data-tab-size           - Tab size, default is 2.\n * data-behaviours-enabled - Specifies whether to use behaviors or not. \"Behaviors\" in this case is the auto-pairing of\n *                           special characters, like quotation marks, parenthesis, or brackets.\n * data-snippets-enabled   - Specifies whether to use snippets or not. \"Snippets\" are small pieces of code that can be\n *                           inserted via the completion box.\n *\n * Keybindings:\n * Ctrl-Enter (Command-Enter): run onChange() function\n */\n\nimport coreModule from 'app/core/core_module';\nimport config from 'app/core/config';\n\nconst DEFAULT_THEME_DARK = 'ace/theme/grafana-dark';\nconst DEFAULT_THEME_LIGHT = 'ace/theme/textmate';\nconst DEFAULT_MODE = 'text';\nconst DEFAULT_MAX_LINES = 10;\nconst DEFAULT_TAB_SIZE = 2;\nconst DEFAULT_BEHAVIORS = true;\nconst DEFAULT_SNIPPETS = true;\n\nconst editorTemplate = `<div></div>`;\n\nasync function link(scope: any, elem: any, attrs: any) {\n  // Options\n  const langMode = attrs.mode || DEFAULT_MODE;\n  const maxLines = attrs.maxLines || DEFAULT_MAX_LINES;\n  const showGutter = attrs.showGutter !== undefined;\n  const tabSize = attrs.tabSize || DEFAULT_TAB_SIZE;\n  const behavioursEnabled = attrs.behavioursEnabled ? attrs.behavioursEnabled === 'true' : DEFAULT_BEHAVIORS;\n  const snippetsEnabled = attrs.snippetsEnabled ? attrs.snippetsEnabled === 'true' : DEFAULT_SNIPPETS;\n\n  // Initialize editor\n  const aceElem = elem.get(0);\n  const { default: ace } = await import(/* webpackChunkName: \"brace\" */ 'brace');\n  await import('brace/ext/language_tools');\n  await import('brace/theme/textmate');\n  await import('brace/mode/text');\n  await import('brace/snippets/text');\n  await import('brace/mode/sql');\n  await import('brace/snippets/sql');\n  await import('brace/mode/sqlserver');\n  await import('brace/snippets/sqlserver');\n  await import('brace/mode/markdown');\n  await import('brace/snippets/markdown');\n  await import('brace/mode/json');\n  await import('brace/snippets/json');\n\n  // @ts-ignore\n  await import('./theme-grafana-dark');\n\n  const codeEditor = ace.edit(aceElem);\n  const editorSession = codeEditor.getSession();\n\n  const editorOptions = {\n    maxLines: maxLines,\n    showGutter: showGutter,\n    tabSize: tabSize,\n    behavioursEnabled: behavioursEnabled,\n    highlightActiveLine: false,\n    showPrintMargin: false,\n    autoScrollEditorIntoView: true, // this is needed if editor is inside scrollable page\n  };\n\n  // Set options\n  codeEditor.setOptions(editorOptions);\n  // disable depreacation warning\n  codeEditor.$blockScrolling = Infinity;\n  // Padding hacks\n  (codeEditor.renderer as any).setScrollMargin(10, 10);\n  codeEditor.renderer.setPadding(10);\n\n  setThemeMode();\n  setLangMode(langMode);\n  setEditorContent(scope.content);\n\n  // Add classes\n  elem.addClass('gf-code-editor');\n  const textarea = elem.find('textarea');\n  textarea.addClass('gf-form-input');\n\n  if (scope.codeEditorFocus) {\n    setTimeout(() => {\n      textarea.focus();\n      const domEl = textarea[0];\n      if (domEl.setSelectionRange) {\n        const pos = textarea.val().length * 2;\n        domEl.setSelectionRange(pos, pos);\n      }\n    }, 100);\n  }\n\n  // Event handlers\n  editorSession.on('change', e => {\n    scope.$apply(() => {\n      const newValue = codeEditor.getValue();\n      scope.content = newValue;\n    });\n  });\n\n  // Sync with outer scope - update editor content if model has been changed from outside of directive.\n  scope.$watch('content', (newValue: any, oldValue: any) => {\n    const editorValue = codeEditor.getValue();\n    if (newValue !== editorValue && newValue !== oldValue) {\n      scope.$$postDigest(() => {\n        setEditorContent(newValue);\n      });\n    }\n  });\n\n  codeEditor.on('blur', () => {\n    scope.onChange();\n  });\n\n  scope.$on('$destroy', () => {\n    codeEditor.destroy();\n  });\n\n  // Keybindings\n  codeEditor.commands.addCommand({\n    name: 'executeQuery',\n    bindKey: { win: 'Ctrl-Enter', mac: 'Command-Enter' },\n    exec: () => {\n      scope.onChange();\n    },\n  });\n\n  function setLangMode(lang: string) {\n    ace.acequire('ace/ext/language_tools');\n    codeEditor.setOptions({\n      enableBasicAutocompletion: true,\n      enableLiveAutocompletion: true,\n      enableSnippets: snippetsEnabled,\n    });\n\n    if (scope.getCompleter()) {\n      // make copy of array as ace seems to share completers array between instances\n      const anyEditor = codeEditor as any;\n      anyEditor.completers = anyEditor.completers.slice();\n      anyEditor.completers.push(scope.getCompleter());\n    }\n\n    const aceModeName = `ace/mode/${lang}`;\n    editorSession.setMode(aceModeName);\n  }\n\n  function setThemeMode() {\n    let theme = DEFAULT_THEME_DARK;\n    if (config.bootData.user.lightTheme) {\n      theme = DEFAULT_THEME_LIGHT;\n    }\n\n    codeEditor.setTheme(theme);\n  }\n\n  function setEditorContent(value: string) {\n    codeEditor.setValue(value);\n    codeEditor.clearSelection();\n  }\n}\n\nexport function codeEditorDirective() {\n  return {\n    restrict: 'E',\n    template: editorTemplate,\n    scope: {\n      content: '=',\n      datasource: '=',\n      codeEditorFocus: '<',\n      onChange: '&',\n      getCompleter: '&',\n    },\n    link: link,\n  };\n}\n\ncoreModule.directive('codeEditor', codeEditorDirective);\n","/**\n * Wrapper for the new ngReact <color-picker> directive for backward compatibility.\n * Allows remaining <spectrum-picker> untouched in outdated plugins.\n * Technically, it's just a wrapper for react component with two-way data binding support.\n */\nimport coreModule from '../../core_module';\n\n/** @ngInject */\nexport function spectrumPicker() {\n  return {\n    restrict: 'E',\n    require: 'ngModel',\n    scope: true,\n    replace: true,\n    template: '<color-picker color=\"ngModel.$viewValue\" onChange=\"onColorChange\"></color-picker>',\n    link: (scope: any, element: any, attrs: any, ngModel: any) => {\n      scope.ngModel = ngModel;\n      scope.onColorChange = (color: string) => {\n        ngModel.$setViewValue(color);\n      };\n    },\n  };\n}\ncoreModule.directive('spectrumPicker', spectrumPicker);\n","//\n// This is using ng-react with this PR applied https://github.com/ngReact/ngReact/pull/199\n//\n\n// # ngReact\n// ### Use React Components inside of your Angular applications\n//\n// Composed of\n// - reactComponent (generic directive for delegating off to React Components)\n// - reactDirective (factory for creating specific directives that correspond to reactComponent directives)\n\nimport { kebabCase } from 'lodash';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport angular, { auto } from 'angular';\n\n// get a react component from name (components can be an angular injectable e.g. value, factory or\n// available on window\nfunction getReactComponent(name: string, $injector: auto.IInjectorService) {\n  // if name is a function assume it is component and return it\n  if (angular.isFunction(name)) {\n    return name;\n  }\n\n  // a React component name must be specified\n  if (!name) {\n    throw new Error('ReactComponent name attribute must be specified');\n  }\n\n  // ensure the specified React component is accessible, and fail fast if it's not\n  let reactComponent;\n  try {\n    reactComponent = $injector.get(name);\n  } catch (e) {}\n\n  if (!reactComponent) {\n    try {\n      reactComponent = name.split('.').reduce((current, namePart) => {\n        // @ts-ignore\n        return current[namePart];\n      }, window);\n    } catch (e) {}\n  }\n\n  if (!reactComponent) {\n    throw Error('Cannot find react component ' + name);\n  }\n\n  return reactComponent;\n}\n\n// wraps a function with scope.$apply, if already applied just return\nfunction applied(fn: any, scope: any) {\n  if (fn.wrappedInApply) {\n    return fn;\n  }\n  // this had the equivalent of `eslint-disable-next-line prefer-arrow/prefer-arrow-functions`\n  const wrapped: any = function() {\n    const args = arguments;\n    const phase = scope.$root.$$phase;\n    if (phase === '$apply' || phase === '$digest') {\n      return fn.apply(null, args);\n    } else {\n      return scope.$apply(() => {\n        return fn.apply(null, args);\n      });\n    }\n  };\n  wrapped.wrappedInApply = true;\n  return wrapped;\n}\n\n/**\n * wraps functions on obj in scope.$apply\n *\n * keeps backwards compatibility, as if propsConfig is not passed, it will\n * work as before, wrapping all functions and won't wrap only when specified.\n *\n * @version 0.4.1\n * @param obj react component props\n * @param scope current scope\n * @param propsConfig configuration object for all properties\n * @returns {Object} props with the functions wrapped in scope.$apply\n */\nfunction applyFunctions(obj: any, scope: any, propsConfig?: any): object {\n  return Object.keys(obj || {}).reduce((prev, key) => {\n    const value = obj[key];\n    const config = (propsConfig || {})[key] || {};\n    /**\n     * wrap functions in a function that ensures they are scope.$applied\n     * ensures that when function is called from a React component\n     * the Angular digest cycle is run\n     */\n    // @ts-ignore\n    prev[key] = angular.isFunction(value) && config.wrapApply !== false ? applied(value, scope) : value;\n\n    return prev;\n  }, {});\n}\n\n/**\n *\n * @param watchDepth (value of HTML watch-depth attribute)\n * @param scope (angular scope)\n *\n * Uses the watchDepth attribute to determine how to watch props on scope.\n * If watchDepth attribute is NOT reference or collection, watchDepth defaults to deep watching by value\n */\nfunction watchProps(watchDepth: string, scope: any, watchExpressions: any[], listener: any) {\n  const supportsWatchCollection = angular.isFunction(scope.$watchCollection);\n  const supportsWatchGroup = angular.isFunction(scope.$watchGroup);\n\n  const watchGroupExpressions = [];\n\n  for (const expr of watchExpressions) {\n    const actualExpr = getPropExpression(expr);\n    const exprWatchDepth = getPropWatchDepth(watchDepth, expr);\n\n    // ignore empty expressions & expressions with functions\n    if (!actualExpr || actualExpr.match(/\\(.*\\)/) || exprWatchDepth === 'one-time') {\n      continue;\n    }\n\n    if (exprWatchDepth === 'collection' && supportsWatchCollection) {\n      scope.$watchCollection(actualExpr, listener);\n    } else if (exprWatchDepth === 'reference' && supportsWatchGroup) {\n      watchGroupExpressions.push(actualExpr);\n    } else {\n      scope.$watch(actualExpr, listener, exprWatchDepth !== 'reference');\n    }\n  }\n\n  if (watchDepth === 'one-time') {\n    listener();\n  }\n\n  if (watchGroupExpressions.length) {\n    scope.$watchGroup(watchGroupExpressions, listener);\n  }\n}\n\n// render React component, with scope[attrs.props] being passed in as the component props\nfunction renderComponent(component: any, props: object, scope: any, elem: Element[]) {\n  scope.$evalAsync(() => {\n    ReactDOM.render(React.createElement(component, props), elem[0]);\n  });\n}\n\n// get prop name from prop (string or array)\nfunction getPropName(prop: any) {\n  return Array.isArray(prop) ? prop[0] : prop;\n}\n\n// get prop name from prop (string or array)\nfunction getPropConfig(prop: any) {\n  return Array.isArray(prop) ? prop[1] : {};\n}\n\n// get prop expression from prop (string or array)\nfunction getPropExpression(prop: any) {\n  return Array.isArray(prop) ? prop[0] : prop;\n}\n\n/**\n * Finds the normalized attribute knowing that React props accept any type of capitalization and it also handles\n * kabab case attributes which can be used in case the attribute would also be a standard html attribute and would be\n * evaluated by the browser as such.\n * @param attrs All attributes of the component.\n * @param propName Name of the prop that react component expects.\n */\nfunction findAttribute(attrs: string, propName: string): string {\n  const index = Object.keys(attrs).find(attr => {\n    return attr.toLowerCase() === propName.toLowerCase() || attr.toLowerCase() === kebabCase(propName);\n  });\n  // @ts-ignore\n  return attrs[index];\n}\n\n// get watch depth of prop (string or array)\nfunction getPropWatchDepth(defaultWatch: string, prop: string | any[]) {\n  const customWatchDepth = Array.isArray(prop) && angular.isObject(prop[1]) && prop[1].watchDepth;\n  return customWatchDepth || defaultWatch;\n}\n\n// # reactComponent\n// Directive that allows React components to be used in Angular templates.\n//\n// Usage:\n//     <react-component name=\"Hello\" props=\"name\"/>\n//\n// This requires that there exists an injectable or globally available 'Hello' React component.\n// The 'props' attribute is optional and is passed to the component.\n//\n// The following would would create and register the component:\n//\n//     var module = angular.module('ace.react.components');\n//     module.value('Hello', React.createClass({\n//         render: function() {\n//             return <div>Hello {this.props.name}</div>;\n//         }\n//     }));\n//\nconst reactComponent = ($injector: any): any => {\n  return {\n    restrict: 'E',\n    replace: true,\n    link: function(scope: any, elem: Element[], attrs: any) {\n      const reactComponent = getReactComponent(attrs.name, $injector);\n\n      const renderMyComponent = () => {\n        const scopeProps = scope.$eval(attrs.props);\n        const props = applyFunctions(scopeProps, scope);\n\n        renderComponent(reactComponent, props, scope, elem);\n      };\n\n      // If there are props, re-render when they change\n      attrs.props ? watchProps(attrs.watchDepth, scope, [attrs.props], renderMyComponent) : renderMyComponent();\n\n      // cleanup when scope is destroyed\n      scope.$on('$destroy', () => {\n        if (!attrs.onScopeDestroy) {\n          ReactDOM.unmountComponentAtNode(elem[0]);\n        } else {\n          scope.$eval(attrs.onScopeDestroy, {\n            unmountComponent: ReactDOM.unmountComponentAtNode.bind(this, elem[0]),\n          });\n        }\n      });\n    },\n  };\n};\n\n// # reactDirective\n// Factory function to create directives for React components.\n//\n// With a component like this:\n//\n//     var module = angular.module('ace.react.components');\n//     module.value('Hello', React.createClass({\n//         render: function() {\n//             return <div>Hello {this.props.name}</div>;\n//         }\n//     }));\n//\n// A directive can be created and registered with:\n//\n//     module.directive('hello', function(reactDirective) {\n//         return reactDirective('Hello', ['name']);\n//     });\n//\n// Where the first argument is the injectable or globally accessible name of the React component\n// and the second argument is an array of property names to be watched and passed to the React component\n// as props.\n//\n// This directive can then be used like this:\n//\n//     <hello name=\"name\"/>\n//\nconst reactDirective = ($injector: auto.IInjectorService) => {\n  return (reactComponentName: string, props: string[], conf: any, injectableProps: any) => {\n    const directive = {\n      restrict: 'E',\n      replace: true,\n      link: function(scope: any, elem: Element[], attrs: any) {\n        const reactComponent = getReactComponent(reactComponentName, $injector);\n\n        // if props is not defined, fall back to use the React component's propTypes if present\n        props = props || Object.keys(reactComponent.propTypes || {});\n\n        // for each of the properties, get their scope value and set it to scope.props\n        const renderMyComponent = () => {\n          let scopeProps: any = {};\n          const config: any = {};\n\n          props.forEach(prop => {\n            const propName = getPropName(prop);\n            scopeProps[propName] = scope.$eval(findAttribute(attrs, propName));\n            config[propName] = getPropConfig(prop);\n          });\n\n          scopeProps = applyFunctions(scopeProps, scope, config);\n          scopeProps = angular.extend({}, scopeProps, injectableProps);\n          renderComponent(reactComponent, scopeProps, scope, elem);\n        };\n\n        // watch each property name and trigger an update whenever something changes,\n        // to update scope.props with new values\n        const propExpressions = props.map(prop => {\n          return Array.isArray(prop)\n            ? [findAttribute(attrs, prop[0]), getPropConfig(prop)]\n            : findAttribute(attrs, prop);\n        });\n\n        // If we don't have any props, then our watch statement won't fire.\n        props.length ? watchProps(attrs.watchDepth, scope, propExpressions, renderMyComponent) : renderMyComponent();\n\n        // cleanup when scope is destroyed\n        scope.$on('$destroy', () => {\n          if (!attrs.onScopeDestroy) {\n            ReactDOM.unmountComponentAtNode(elem[0]);\n          } else {\n            scope.$eval(attrs.onScopeDestroy, {\n              unmountComponent: ReactDOM.unmountComponentAtNode.bind(this, elem[0]),\n            });\n          }\n        });\n      },\n    };\n    return angular.extend(directive, conf);\n  };\n};\n\nconst ngModule = angular.module('react', []);\nngModule.directive('reactComponent', ['$injector', reactComponent]);\nngModule.factory('reactDirective', ['$injector', reactDirective]);\n","import _ from 'lodash';\nimport coreModule from 'app/core/core_module';\n// @ts-ignore\nimport Drop from 'tether-drop';\n\nexport function infoPopover() {\n  return {\n    restrict: 'E',\n    template: `<icon name=\"'info-circle'\" style=\"margin-left: 10px;\" size=\"'xs'\"></icon>`,\n    transclude: true,\n    link: (scope: any, elem: any, attrs: any, ctrl: any, transclude: any) => {\n      const offset = attrs.offset || '0 -10px';\n      const position = attrs.position || 'right middle';\n      let classes = 'drop-help drop-hide-out-of-bounds';\n      const openOn = 'hover';\n\n      elem.addClass('gf-form-help-icon');\n\n      if (attrs.wide) {\n        classes += ' drop-wide';\n      }\n\n      if (attrs.mode) {\n        elem.addClass('gf-form-help-icon--' + attrs.mode);\n      }\n\n      transclude((clone: any, newScope: any) => {\n        const content = document.createElement('div');\n        content.className = 'markdown-html';\n\n        _.each(clone, node => {\n          content.appendChild(node);\n        });\n\n        const dropOptions = {\n          target: elem[0],\n          content: content,\n          position: position,\n          classes: classes,\n          openOn: openOn,\n          hoverOpenDelay: 400,\n          tetherOptions: {\n            offset: offset,\n            constraints: [\n              {\n                to: 'window',\n                attachment: 'together',\n                pin: true,\n              },\n            ],\n          },\n        };\n\n        // Create drop in next digest after directive content is rendered.\n        scope.$applyAsync(() => {\n          const drop = new Drop(dropOptions);\n\n          const unbind = scope.$on('$destroy', () => {\n            drop.destroy();\n            unbind();\n          });\n        });\n      });\n    },\n  };\n}\n\ncoreModule.directive('infoPopover', infoPopover);\n","import _ from 'lodash';\nimport coreModule from '../core_module';\n\nexport function arrayJoin() {\n  'use strict';\n\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: (scope: any, element: any, attr: any, ngModel: any) => {\n      function split_array(text: string) {\n        return (text || '').split(',');\n      }\n\n      function join_array(text: string) {\n        if (_.isArray(text)) {\n          return ((text || '') as any).join(',');\n        } else {\n          return text;\n        }\n      }\n\n      ngModel.$parsers.push(split_array);\n      ngModel.$formatters.push(join_array);\n    },\n  };\n}\n\ncoreModule.directive('arrayJoin', arrayJoin);\n","import _ from 'lodash';\nimport config from 'app/core/config';\n\nimport { Observable } from 'rxjs';\n\nexport class LiveSrv {\n  conn: any;\n  observers: any;\n  initPromise: any;\n\n  constructor() {\n    this.observers = {};\n  }\n\n  getWebSocketUrl() {\n    const l = window.location;\n    return (l.protocol === 'https:' ? 'wss://' : 'ws://') + l.host + config.appSubUrl + '/ws';\n  }\n\n  getConnection() {\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    if (this.conn && this.conn.readyState === 1) {\n      return Promise.resolve(this.conn);\n    }\n\n    this.initPromise = new Promise((resolve, reject) => {\n      console.log('Live: connecting...');\n      this.conn = new WebSocket(this.getWebSocketUrl());\n\n      this.conn.onclose = (evt: any) => {\n        console.log('Live: websocket onclose', evt);\n        reject({ message: 'Connection closed' });\n\n        this.initPromise = null;\n        setTimeout(this.reconnect.bind(this), 2000);\n      };\n\n      this.conn.onmessage = (evt: any) => {\n        this.handleMessage(evt.data);\n      };\n\n      this.conn.onerror = (evt: any) => {\n        this.initPromise = null;\n        reject({ message: 'Connection error' });\n        console.log('Live: websocket error', evt);\n      };\n\n      this.conn.onopen = (evt: any) => {\n        console.log('opened');\n        this.initPromise = null;\n        resolve(this.conn);\n      };\n    });\n\n    return this.initPromise;\n  }\n\n  handleMessage(message: any) {\n    message = JSON.parse(message);\n\n    if (!message.stream) {\n      console.log('Error: stream message without stream!', message);\n      return;\n    }\n\n    const observer = this.observers[message.stream];\n    if (!observer) {\n      this.removeObserver(message.stream, null);\n      return;\n    }\n\n    observer.next(message);\n  }\n\n  reconnect() {\n    // no need to reconnect if no one cares\n    if (_.keys(this.observers).length === 0) {\n      return;\n    }\n\n    console.log('LiveSrv: Reconnecting');\n\n    this.getConnection().then((conn: any) => {\n      _.each(this.observers, (value, key) => {\n        this.send({ action: 'subscribe', stream: key });\n      });\n    });\n  }\n\n  send(data: any) {\n    this.conn.send(JSON.stringify(data));\n  }\n\n  addObserver(stream: any, observer: any) {\n    this.observers[stream] = observer;\n\n    this.getConnection().then((conn: any) => {\n      this.send({ action: 'subscribe', stream: stream });\n    });\n  }\n\n  removeObserver(stream: any, observer: any) {\n    console.log('unsubscribe', stream);\n    delete this.observers[stream];\n\n    this.getConnection().then((conn: any) => {\n      this.send({ action: 'unsubscribe', stream: stream });\n    });\n  }\n\n  subscribe(streamName: string) {\n    console.log('LiveSrv.subscribe: ' + streamName);\n\n    return Observable.create((observer: any) => {\n      this.addObserver(streamName, observer);\n\n      return () => {\n        this.removeObserver(streamName, observer);\n      };\n    });\n\n    // return this.init().then(() =>  {\n    //   this.send({action: 'subscribe', stream: name});\n    // });\n  }\n}\n\nconst instance = new LiveSrv();\nexport { instance as liveSrv };\n","import coreModule from 'app/core/core_module';\n\nconst template = `\n<label for=\"check-{{ctrl.id}}\" class=\"gf-form-switch-container\">\n  <div class=\"gf-form-label {{ctrl.labelClass}}\" ng-show=\"ctrl.label\">\n    {{ctrl.label}}\n    <info-popover mode=\"right-normal\" ng-if=\"ctrl.tooltip\" position=\"top center\">\n      {{ctrl.tooltip}}\n    </info-popover>\n  </div>\n  <div class=\"gf-form-switch {{ctrl.switchClass}}\" ng-if=\"ctrl.show\">\n    <input id=\"check-{{ctrl.id}}\" type=\"checkbox\" ng-model=\"ctrl.checked\" ng-change=\"ctrl.internalOnChange()\">\n    <span class=\"gf-form-switch__slider\"></span>\n  </div>\n</label>\n`;\n\nconst checkboxTemplate = `\n<label for=\"check-{{ctrl.id}}\" class=\"gf-form-switch-container\">\n   <div class=\"gf-form-label {{ctrl.labelClass}}\" ng-show=\"ctrl.label\">\n    {{ctrl.label}}\n    <info-popover mode=\"right-normal\" ng-if=\"ctrl.tooltip\" position=\"top center\">\n      {{ctrl.tooltip}}\n    </info-popover>\n  </div>\n  <div class=\"gf-form-checkbox {{ctrl.switchClass}}\" ng-if=\"ctrl.show\">\n    <input id=\"check-{{ctrl.id}}\" type=\"checkbox\" ng-model=\"ctrl.checked\" ng-change=\"ctrl.internalOnChange()\">\n    <span class=\"gf-form-switch__checkbox\"></span>\n  </div>\n</label>\n`;\n\nexport class SwitchCtrl {\n  onChange: any;\n  checked: any;\n  show: any;\n  id: any;\n  label: string;\n\n  /** @ngInject */\n  constructor($scope: any, private $timeout: any) {\n    this.show = true;\n    this.id = $scope.$id;\n  }\n\n  internalOnChange() {\n    return this.$timeout(() => {\n      return this.onChange();\n    });\n  }\n}\n\nexport function switchDirective() {\n  return {\n    restrict: 'E',\n    controller: SwitchCtrl,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      checked: '=',\n      label: '@',\n      labelClass: '@',\n      tooltip: '@',\n      switchClass: '@',\n      onChange: '&',\n    },\n    template: template,\n  };\n}\n\nexport function checkboxDirective() {\n  return {\n    restrict: 'E',\n    controller: SwitchCtrl,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      checked: '=',\n      label: '@',\n      labelClass: '@',\n      tooltip: '@',\n      switchClass: '@',\n      onChange: '&',\n    },\n    template: checkboxTemplate,\n  };\n}\n\ncoreModule.directive('gfFormSwitch', switchDirective);\ncoreModule.directive('gfFormCheckbox', checkboxDirective);\n","import coreModule from 'app/core/core_module';\nimport { backendSrv } from '../services/backend_srv';\n\nconst template = `\n<select class=\"gf-form-input\" ng-model=\"ctrl.model\" ng-options=\"f.value as f.text for f in ctrl.options\"></select>\n`;\n\nexport class DashboardSelectorCtrl {\n  model: any;\n  options: any;\n\n  $onInit() {\n    this.options = [{ value: 0, text: 'Default' }];\n\n    return backendSrv.search({ starred: true }).then(res => {\n      res.forEach(dash => {\n        this.options.push({ value: dash.id, text: dash.title });\n      });\n    });\n  }\n}\n\nexport function dashboardSelector() {\n  return {\n    restrict: 'E',\n    controller: DashboardSelectorCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    template: template,\n    scope: {\n      model: '=',\n    },\n  };\n}\n\ncoreModule.directive('dashboardSelector', dashboardSelector);\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/core/core_module';\nimport { promiseToDigest } from '../../utils/promiseToDigest';\n\nconst template = `\n<div class=\"dropdown cascade-open\">\n<a ng-click=\"showActionsMenu()\" class=\"query-part-name pointer dropdown-toggle\" data-toggle=\"dropdown\">{{part.def.type}}</a>\n<span>(</span><span class=\"query-part-parameters\"></span><span>)</span>\n<ul class=\"dropdown-menu\">\n  <li ng-repeat=\"action in partActions\">\n    <a ng-click=\"triggerPartAction(action)\">{{action.text}}</a>\n  </li>\n</ul>\n`;\n\n/** @ngInject */\nexport function queryPartEditorDirective(templateSrv: any) {\n  const paramTemplate = '<input type=\"text\" class=\"hide input-mini tight-form-func-param\"></input>';\n\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      part: '=',\n      handleEvent: '&',\n      debounce: '@',\n    },\n    link: function postLink($scope: any, elem: any) {\n      const part = $scope.part;\n      const partDef = part.def;\n      const $paramsContainer = elem.find('.query-part-parameters');\n      const debounceLookup = $scope.debounce;\n\n      $scope.partActions = [];\n\n      function clickFuncParam(this: any, paramIndex: number) {\n        const $link = $(this);\n        const $input = $link.next();\n\n        $input.val(part.params[paramIndex]);\n        $input.css('width', $link.width() + 16 + 'px');\n\n        $link.hide();\n        $input.show();\n        $input.focus();\n        $input.select();\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      }\n\n      function inputBlur(this: any, paramIndex: number) {\n        const $input = $(this);\n        const $link = $input.prev();\n        const newValue = $input.val();\n\n        if (newValue !== '' || part.def.params[paramIndex].optional) {\n          $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n          part.updateParam($input.val(), paramIndex);\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'part-param-changed' } });\n          });\n        }\n\n        $input.hide();\n        $link.show();\n      }\n\n      function inputKeyPress(this: any, paramIndex: number, e: any) {\n        if (e.which === 13) {\n          inputBlur.call(this, paramIndex);\n        }\n      }\n\n      function inputKeyDown(this: any) {\n        this.style.width = (3 + this.value.length) * 8 + 'px';\n      }\n\n      function addTypeahead($input: JQuery, param: any, paramIndex: number) {\n        if (!param.options && !param.dynamicLookup) {\n          return;\n        }\n\n        const typeaheadSource = (query: string, callback: any) => {\n          if (param.options) {\n            let options = param.options;\n            if (param.type === 'int') {\n              options = _.map(options, val => {\n                return val.toString();\n              });\n            }\n            return options;\n          }\n\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'get-param-options' } }).then((result: any) => {\n              const dynamicOptions = _.map(result, op => {\n                return _.escape(op.value);\n              });\n              callback(dynamicOptions);\n            });\n          });\n        };\n\n        $input.attr('data-provide', 'typeahead');\n\n        $input.typeahead({\n          source: typeaheadSource,\n          minLength: 0,\n          items: 1000,\n          updater: (value: string) => {\n            value = _.unescape(value);\n            setTimeout(() => {\n              inputBlur.call($input[0], paramIndex);\n            }, 0);\n            return value;\n          },\n        });\n\n        const typeahead = $input.data('typeahead');\n        typeahead.lookup = function() {\n          this.query = this.$element.val() || '';\n          const items = this.source(this.query, $.proxy(this.process, this));\n          return items ? this.process(items) : items;\n        };\n\n        if (debounceLookup) {\n          typeahead.lookup = _.debounce(typeahead.lookup, 500, { leading: true });\n        }\n      }\n\n      $scope.showActionsMenu = () => {\n        promiseToDigest($scope)(\n          $scope.handleEvent({ $event: { name: 'get-part-actions' } }).then((res: any) => {\n            $scope.partActions = res;\n          })\n        );\n      };\n\n      $scope.triggerPartAction = (action: string) => {\n        $scope.handleEvent({ $event: { name: 'action', action: action } });\n      };\n\n      function addElementsAndCompile() {\n        _.each(partDef.params, (param: any, index: number) => {\n          if (param.optional && part.params.length <= index) {\n            return;\n          }\n\n          if (index > 0) {\n            $('<span>, </span>').appendTo($paramsContainer);\n          }\n\n          const paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);\n          const $paramLink = $('<a class=\"graphite-func-param-link pointer\">' + paramValue + '</a>');\n          const $input = $(paramTemplate);\n\n          $paramLink.appendTo($paramsContainer);\n          $input.appendTo($paramsContainer);\n\n          $input.blur(_.partial(inputBlur, index));\n          $input.keyup(inputKeyDown);\n          $input.keypress(_.partial(inputKeyPress, index));\n          $paramLink.click(_.partial(clickFuncParam, index));\n\n          addTypeahead($input, param, index);\n        });\n      }\n\n      function relink() {\n        $paramsContainer.empty();\n        addElementsAndCompile();\n      }\n\n      relink();\n    },\n  };\n}\n\ncoreModule.directive('queryPartEditor', queryPartEditorDirective);\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/core/core_module';\n\nconst template = `\n<div class=\"dropdown cascade-open\">\n<a ng-click=\"showActionsMenu()\" class=\"query-part-name pointer dropdown-toggle\" data-toggle=\"dropdown\">{{part.label}}</a>\n<span>{{part.def.wrapOpen}}</span><span class=\"query-part-parameters\"></span><span>{{part.def.wrapClose}}</span>\n<ul class=\"dropdown-menu\">\n  <li ng-repeat=\"action in partActions\">\n    <a ng-click=\"triggerPartAction(action)\">{{action.text}}</a>\n  </li>\n</ul>\n`;\n\n/** @ngInject */\nexport function sqlPartEditorDirective(templateSrv: any) {\n  const paramTemplate = '<input type=\"text\" class=\"hide input-mini\"></input>';\n\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      part: '=',\n      handleEvent: '&',\n      debounce: '@',\n    },\n    link: function postLink($scope: any, elem: any) {\n      const part = $scope.part;\n      const partDef = part.def;\n      const $paramsContainer = elem.find('.query-part-parameters');\n      const debounceLookup = $scope.debounce;\n      let cancelBlur: any = null;\n\n      $scope.partActions = [];\n\n      function clickFuncParam(this: any, paramIndex: number) {\n        const $link = $(this);\n        const $input = $link.next();\n\n        $input.val(part.params[paramIndex]);\n        $input.css('width', $link.width() + 16 + 'px');\n\n        $link.hide();\n        $input.show();\n        $input.focus();\n        $input.select();\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      }\n\n      function inputBlur($input: JQuery, paramIndex: number) {\n        cancelBlur = setTimeout(() => {\n          switchToLink($input, paramIndex);\n        }, 200);\n      }\n\n      function switchToLink($input: JQuery, paramIndex: number) {\n        const $link = $input.prev();\n        const newValue = $input.val();\n\n        if (newValue !== '' || part.def.params[paramIndex].optional) {\n          $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n          part.updateParam($input.val(), paramIndex);\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'part-param-changed' } });\n          });\n        }\n\n        $input.hide();\n        $link.show();\n      }\n\n      function inputKeyPress(this: any, paramIndex: number, e: any) {\n        if (e.which === 13) {\n          switchToLink($(this), paramIndex);\n        }\n      }\n\n      function inputKeyDown(this: any) {\n        this.style.width = (3 + this.value.length) * 8 + 'px';\n      }\n\n      function addTypeahead($input: JQuery, param: any, paramIndex: number) {\n        if (!param.options && !param.dynamicLookup) {\n          return;\n        }\n\n        const typeaheadSource = (query: string, callback: any) => {\n          if (param.options) {\n            let options = param.options;\n            if (param.type === 'int') {\n              options = _.map(options, val => {\n                return val.toString();\n              });\n            }\n            return options;\n          }\n\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'get-param-options', param: param } }).then((result: any) => {\n              const dynamicOptions = _.map(result, op => {\n                return _.escape(op.value);\n              });\n\n              // add current value to dropdown if it's not in dynamicOptions\n              if (_.indexOf(dynamicOptions, part.params[paramIndex]) === -1) {\n                dynamicOptions.unshift(_.escape(part.params[paramIndex]));\n              }\n\n              callback(dynamicOptions);\n            });\n          });\n        };\n\n        $input.attr('data-provide', 'typeahead');\n\n        $input.typeahead({\n          source: typeaheadSource,\n          minLength: 0,\n          items: 1000,\n          updater: (value: string) => {\n            value = _.unescape(value);\n            if (value === part.params[paramIndex]) {\n              clearTimeout(cancelBlur);\n              $input.focus();\n              return value;\n            }\n            return value;\n          },\n        });\n\n        const typeahead = $input.data('typeahead');\n        typeahead.lookup = function() {\n          this.query = this.$element.val() || '';\n          const items = this.source(this.query, $.proxy(this.process, this));\n          return items ? this.process(items) : items;\n        };\n\n        if (debounceLookup) {\n          typeahead.lookup = _.debounce(typeahead.lookup, 500, { leading: true });\n        }\n      }\n\n      $scope.showActionsMenu = () => {\n        $scope.handleEvent({ $event: { name: 'get-part-actions' } }).then((res: any) => {\n          $scope.partActions = res;\n        });\n      };\n\n      $scope.triggerPartAction = (action: string) => {\n        $scope.handleEvent({ $event: { name: 'action', action: action } });\n      };\n\n      function addElementsAndCompile() {\n        _.each(partDef.params, (param: any, index: number) => {\n          if (param.optional && part.params.length <= index) {\n            return;\n          }\n\n          if (index > 0) {\n            $('<span>' + partDef.separator + '</span>').appendTo($paramsContainer);\n          }\n\n          const paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);\n          const $paramLink = $('<a class=\"query-part__link\">' + paramValue + '</a>');\n          const $input = $(paramTemplate);\n\n          $paramLink.appendTo($paramsContainer);\n          $input.appendTo($paramsContainer);\n\n          $input.blur(_.partial(inputBlur, $input, index));\n          $input.keyup(inputKeyDown);\n          $input.keypress(_.partial(inputKeyPress, index));\n          $paramLink.click(_.partial(clickFuncParam, index));\n\n          addTypeahead($input, param, index);\n        });\n      }\n\n      function relink() {\n        $paramsContainer.empty();\n        addElementsAndCompile();\n      }\n\n      relink();\n    },\n  };\n}\n\ncoreModule.directive('sqlPartEditor', sqlPartEditorDirective);\n","import _ from 'lodash';\nimport coreModule from '../../core_module';\nimport { ISCEService } from 'angular';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nfunction typeaheadMatcher(this: any, item: string) {\n  let str = this.query;\n  if (str === '') {\n    return true;\n  }\n  if (str[0] === '/') {\n    str = str.substring(1);\n  }\n  if (str[str.length - 1] === '/') {\n    str = str.substring(0, str.length - 1);\n  }\n  return item.toLowerCase().match(str.toLowerCase());\n}\n\nexport class FormDropdownCtrl {\n  inputElement: JQLite;\n  linkElement: JQLite;\n  model: any;\n  display: any;\n  text: any;\n  options: any;\n  cssClass: any;\n  cssClasses: any;\n  allowCustom: any;\n  labelMode: boolean;\n  linkMode: boolean;\n  cancelBlur: any;\n  onChange: any;\n  getOptions: any;\n  optionCache: any;\n  lookupText: boolean;\n  placeholder: any;\n  startOpen: any;\n  debounce: number;\n\n  /** @ngInject */\n  constructor(private $scope: any, $element: JQLite, private $sce: ISCEService, private templateSrv: any) {\n    this.inputElement = $element.find('input').first();\n    this.linkElement = $element.find('a').first();\n    this.linkMode = true;\n    this.cancelBlur = null;\n\n    // listen to model changes\n    $scope.$watch('ctrl.model', this.modelChanged.bind(this));\n\n    if (this.labelMode) {\n      this.cssClasses = 'gf-form-label ' + this.cssClass;\n    } else {\n      this.cssClasses = 'gf-form-input gf-form-input--dropdown ' + this.cssClass;\n    }\n\n    if (this.placeholder) {\n      this.inputElement.attr('placeholder', this.placeholder);\n    }\n\n    this.inputElement.attr('data-provide', 'typeahead');\n    this.inputElement.typeahead({\n      source: this.typeaheadSource.bind(this),\n      minLength: 0,\n      items: 10000,\n      updater: this.typeaheadUpdater.bind(this),\n      matcher: typeaheadMatcher,\n    });\n\n    // modify typeahead lookup\n    // this = typeahead\n    const typeahead = this.inputElement.data('typeahead');\n    typeahead.lookup = function() {\n      this.query = this.$element.val() || '';\n      this.source(this.query, this.process.bind(this));\n    };\n\n    if (this.debounce) {\n      typeahead.lookup = _.debounce(typeahead.lookup, 500, { leading: true });\n    }\n\n    this.linkElement.keydown(evt => {\n      // trigger typeahead on down arrow or enter key\n      if (evt.keyCode === 40 || evt.keyCode === 13) {\n        this.linkElement.click();\n      }\n    });\n\n    this.inputElement.keydown(evt => {\n      if (evt.keyCode === 13) {\n        setTimeout(() => {\n          this.inputElement.blur();\n        }, 300);\n      }\n    });\n\n    this.inputElement.blur(this.inputBlur.bind(this));\n\n    if (this.startOpen) {\n      setTimeout(this.open.bind(this), 0);\n    }\n  }\n\n  getOptionsInternal(query: string) {\n    return promiseToDigest(this.$scope)(Promise.resolve(this.getOptions({ $query: query })));\n  }\n\n  isPromiseLike(obj: any) {\n    return obj && typeof obj.then === 'function';\n  }\n\n  modelChanged() {\n    if (_.isObject(this.model)) {\n      this.updateDisplay((this.model as any).text);\n    } else {\n      // if we have text use it\n      if (this.lookupText) {\n        this.getOptionsInternal('').then((options: any) => {\n          const item: any = _.find(options, { value: this.model });\n          this.updateDisplay(item ? item.text : this.model);\n        });\n      } else {\n        this.updateDisplay(this.model);\n      }\n    }\n  }\n\n  typeaheadSource(query: string, callback: (res: any) => void) {\n    this.getOptionsInternal(query).then((options: any) => {\n      this.optionCache = options;\n\n      // extract texts\n      const optionTexts = _.map(options, (op: any) => {\n        return _.escape(op.text);\n      });\n\n      // add custom values\n      if (this.allowCustom && this.text !== '') {\n        if (_.indexOf(optionTexts, this.text) === -1) {\n          optionTexts.unshift(this.text);\n        }\n      }\n\n      callback(optionTexts);\n    });\n  }\n\n  typeaheadUpdater(text: string) {\n    if (text === this.text) {\n      clearTimeout(this.cancelBlur);\n      this.inputElement.focus();\n      return text;\n    }\n\n    this.inputElement.val(text);\n    this.switchToLink(true);\n    return text;\n  }\n\n  switchToLink(fromClick: boolean) {\n    if (this.linkMode && !fromClick) {\n      return;\n    }\n\n    clearTimeout(this.cancelBlur);\n    this.cancelBlur = null;\n    this.linkMode = true;\n    this.inputElement.hide();\n    this.linkElement.show();\n    this.updateValue(this.inputElement.val());\n  }\n\n  inputBlur() {\n    // happens long before the click event on the typeahead options\n    // need to have long delay because the blur\n    this.cancelBlur = setTimeout(this.switchToLink.bind(this), 200);\n  }\n\n  updateValue(text: string) {\n    text = _.unescape(text);\n\n    if (text === '' || this.text === text) {\n      return;\n    }\n\n    this.$scope.$apply(() => {\n      const option: any = _.find(this.optionCache, { text: text });\n\n      if (option) {\n        if (_.isObject(this.model)) {\n          this.model = option;\n        } else {\n          this.model = option.value;\n        }\n        this.text = option.text;\n      } else if (this.allowCustom) {\n        if (_.isObject(this.model)) {\n          (this.model as any).text = (this.model as any).value = text;\n        } else {\n          this.model = text;\n        }\n        this.text = text;\n      }\n\n      // needs to call this after digest so\n      // property is synced with outerscope\n      this.$scope.$$postDigest(() => {\n        this.$scope.$apply(() => {\n          this.onChange({ $option: option });\n        });\n      });\n    });\n  }\n\n  updateDisplay(text: string) {\n    this.text = text;\n    this.display = this.$sce.trustAsHtml(this.templateSrv.highlightVariablesAsHtml(text));\n  }\n\n  open() {\n    this.inputElement.css('width', Math.max(this.linkElement.width(), 80) + 16 + 'px');\n\n    this.inputElement.show();\n    this.inputElement.focus();\n\n    this.linkElement.hide();\n    this.linkMode = false;\n\n    const typeahead = this.inputElement.data('typeahead');\n    if (typeahead) {\n      this.inputElement.val('');\n      typeahead.lookup();\n    }\n  }\n}\n\nconst template = `\n<input type=\"text\"\n  data-provide=\"typeahead\"\n  class=\"gf-form-input\"\n  spellcheck=\"false\"\n  style=\"display:none\">\n</input>\n<a ng-class=\"ctrl.cssClasses\"\n   tabindex=\"1\"\n   ng-click=\"ctrl.open()\"\n   give-focus=\"ctrl.focus\"\n   ng-bind-html=\"ctrl.display || '&nbsp;'\">\n</a>\n`;\n\nexport function formDropdownDirective() {\n  return {\n    restrict: 'E',\n    template: template,\n    controller: FormDropdownCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      model: '=',\n      getOptions: '&',\n      onChange: '&',\n      cssClass: '@',\n      allowCustom: '@',\n      labelMode: '@',\n      lookupText: '@',\n      placeholder: '@',\n      startOpen: '@',\n      debounce: '@',\n    },\n  };\n}\n\ncoreModule.directive('gfFormDropdown', formDropdownDirective);\n","import coreModule from '../core_module';\nimport config from 'app/core/config';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { promiseToDigest } from '../utils/promiseToDigest';\n\nexport class InvitedCtrl {\n  /** @ngInject */\n  constructor($scope: any, $routeParams: any, contextSrv: any) {\n    contextSrv.sidemenu = false;\n    $scope.formModel = {};\n\n    $scope.navModel = {\n      main: {\n        icon: 'grafana',\n        text: 'Invite',\n        subTitle: 'Register your Grafana account',\n        breadcrumbs: [{ title: 'Login', url: 'login' }],\n      },\n    };\n\n    $scope.init = () => {\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .get('/api/user/invite/' + $routeParams.code)\n          .then((invite: any) => {\n            $scope.formModel.name = invite.name;\n            $scope.formModel.email = invite.email;\n            $scope.formModel.username = invite.email;\n            $scope.formModel.inviteCode = $routeParams.code;\n\n            $scope.greeting = invite.name || invite.email || invite.username;\n            $scope.invitedBy = invite.invitedBy;\n          })\n      );\n    };\n\n    $scope.submit = () => {\n      if (!$scope.inviteForm.$valid) {\n        return;\n      }\n\n      getBackendSrv()\n        .post('/api/user/invite/complete', $scope.formModel)\n        .then(() => {\n          window.location.href = config.appSubUrl + '/';\n        });\n    };\n\n    $scope.init();\n  }\n}\n\ncoreModule.controller('InvitedCtrl', InvitedCtrl);\n","import config from 'app/core/config';\nimport coreModule from '../core_module';\nimport { getBackendSrv } from '@grafana/runtime/src/services';\nimport { promiseToDigest } from '../utils/promiseToDigest';\n\nexport class SignUpCtrl {\n  /** @ngInject */\n  constructor(private $scope: any, $location: any, contextSrv: any) {\n    contextSrv.sidemenu = false;\n    $scope.ctrl = this;\n\n    $scope.formModel = {};\n\n    const params = $location.search();\n\n    // validate email is semi ok\n    if (params.email && !params.email.match(/^\\S+@\\S+$/)) {\n      console.log('invalid email');\n      return;\n    }\n\n    $scope.formModel.orgName = params.email;\n    $scope.formModel.email = params.email;\n    $scope.formModel.username = params.email;\n    $scope.formModel.code = params.code;\n\n    $scope.verifyEmailEnabled = false;\n    $scope.autoAssignOrg = false;\n\n    $scope.navModel = {\n      main: {\n        icon: 'grafana',\n        text: 'Sign Up',\n        subTitle: 'Register your Grafana account',\n        breadcrumbs: [{ title: 'Login', url: 'login' }],\n      },\n    };\n\n    promiseToDigest($scope)(\n      getBackendSrv()\n        .get('/api/user/signup/options')\n        .then((options: any) => {\n          $scope.verifyEmailEnabled = options.verifyEmailEnabled;\n          $scope.autoAssignOrg = options.autoAssignOrg;\n        })\n    );\n  }\n\n  submit() {\n    if (!this.$scope.signUpForm.$valid) {\n      return;\n    }\n\n    getBackendSrv()\n      .post('/api/user/signup/step2', this.$scope.formModel)\n      .then((rsp: any) => {\n        if (rsp.code === 'redirect-to-select-org') {\n          window.location.href = config.appSubUrl + '/profile/select-org?signup=1';\n        } else {\n          window.location.href = config.appSubUrl + '/';\n        }\n      });\n  }\n}\n\ncoreModule.controller('SignUpCtrl', SignUpCtrl);\n","import coreModule from '../core_module';\nimport config from 'app/core/config';\nimport { AppEvents } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { promiseToDigest } from '../utils/promiseToDigest';\n\nexport class ResetPasswordCtrl {\n  /** @ngInject */\n  constructor($scope: any, $location: any) {\n    $scope.formModel = {};\n    $scope.mode = 'send';\n    $scope.ldapEnabled = config.ldapEnabled;\n    $scope.authProxyEnabled = config.authProxyEnabled;\n    $scope.disableLoginForm = config.disableLoginForm;\n\n    const params = $location.search();\n    if (params.code) {\n      $scope.mode = 'reset';\n      $scope.formModel.code = params.code;\n    }\n\n    $scope.navModel = {\n      main: {\n        icon: 'grafana',\n        text: 'Reset Password',\n        subTitle: 'Reset your Grafana password',\n        breadcrumbs: [{ title: 'Login', url: 'login' }],\n      },\n    };\n\n    $scope.sendResetEmail = () => {\n      if (!$scope.sendResetForm.$valid) {\n        return;\n      }\n\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .post('/api/user/password/send-reset-email', $scope.formModel)\n          .then(() => {\n            $scope.mode = 'email-sent';\n          })\n      );\n    };\n\n    $scope.submitReset = () => {\n      if (!$scope.resetForm.$valid) {\n        return;\n      }\n\n      if ($scope.formModel.newPassword !== $scope.formModel.confirmPassword) {\n        $scope.appEvent(AppEvents.alertWarning, ['New passwords do not match']);\n        return;\n      }\n\n      getBackendSrv()\n        .post('/api/user/password/reset', $scope.formModel)\n        .then(() => {\n          $location.path('login');\n        });\n    };\n  }\n}\n\ncoreModule.controller('ResetPasswordCtrl', ResetPasswordCtrl);\n","import config from 'app/core/config';\nimport coreModule from '../core_module';\nimport appEvents from 'app/core/app_events';\nimport { CoreEvents } from 'app/types';\n\nexport class ErrorCtrl {\n  /** @ngInject */\n  constructor($scope: any, contextSrv: any, navModelSrv: any) {\n    $scope.navModel = navModelSrv.getNotFoundNav();\n    $scope.appSubUrl = config.appSubUrl;\n\n    if (!contextSrv.isSignedIn) {\n      appEvents.emit(CoreEvents.toggleSidemenuHidden);\n    }\n\n    $scope.$on('destroy', () => {\n      if (!contextSrv.isSignedIn) {\n        appEvents.emit(CoreEvents.toggleSidemenuHidden);\n      }\n    });\n  }\n}\n\ncoreModule.controller('ErrorCtrl', ErrorCtrl);\n","import angular from 'angular';\nimport coreModule from '../core_module';\n\nexport class JsonEditorCtrl {\n  /** @ngInject */\n  constructor($scope: any) {\n    $scope.json = angular.toJson($scope.model.object, true);\n    $scope.canUpdate = $scope.model.updateHandler !== void 0 && $scope.model.canUpdate;\n    $scope.canCopy = $scope.model.enableCopy;\n\n    $scope.update = () => {\n      const newObject = angular.fromJson($scope.json);\n      $scope.model.updateHandler(newObject, $scope.model.object);\n    };\n\n    $scope.getContentForClipboard = () => $scope.json;\n  }\n}\n\ncoreModule.controller('JsonEditorCtrl', JsonEditorCtrl);\n","import coreModule from 'app/core/core_module';\n\nexport class AlertSrv {\n  constructor() {}\n\n  set() {\n    console.log('old depricated alert srv being used');\n  }\n}\n\n// this is just added to not break old plugins that might be using it\ncoreModule.service('alertSrv', AlertSrv);\n","import { connectWithProvider } from '../../utils/connectWithReduxStore';\nimport { ModalRoot, ModalsProvider } from '@grafana/ui';\nimport React from 'react';\n\n/**\n * Component that enables rendering React modals from Angular\n */\nexport const AngularModalProxy = connectWithProvider((props: any) => {\n  return (\n    <>\n      <ModalsProvider {...props}>\n        <ModalRoot />\n      </ModalsProvider>\n    </>\n  );\n});\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport coreModule from 'app/core/core_module';\nimport appEvents from 'app/core/app_events';\nimport { CoreEvents } from 'app/types';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { AngularModalProxy } from '../components/modals/AngularModalProxy';\nimport { provideTheme } from '../utils/ConfigProvider';\n\nexport class UtilSrv {\n  modalScope: any;\n  reactModalRoot = document.body;\n  reactModalNode = document.createElement('div');\n\n  /** @ngInject */\n  constructor(private $rootScope: GrafanaRootScope, private $modal: any) {\n    this.reactModalNode.setAttribute('id', 'angular2ReactModalRoot');\n  }\n\n  init() {\n    appEvents.on(CoreEvents.showModal, this.showModal.bind(this), this.$rootScope);\n    appEvents.on(CoreEvents.hideModal, this.hideModal.bind(this), this.$rootScope);\n    appEvents.on(CoreEvents.showConfirmModal, this.showConfirmModal.bind(this), this.$rootScope);\n    appEvents.on(CoreEvents.showModalReact, this.showModalReact.bind(this), this.$rootScope);\n  }\n\n  showModalReact(options: any) {\n    const { component, props } = options;\n    const modalProps = {\n      component,\n      props: {\n        ...props,\n        isOpen: true,\n        onDismiss: this.onReactModalDismiss,\n      },\n    };\n\n    const elem = React.createElement(provideTheme(AngularModalProxy), modalProps);\n    this.reactModalRoot.appendChild(this.reactModalNode);\n    return ReactDOM.render(elem, this.reactModalNode);\n  }\n\n  onReactModalDismiss = () => {\n    ReactDOM.unmountComponentAtNode(this.reactModalNode);\n    this.reactModalRoot.removeChild(this.reactModalNode);\n  };\n\n  hideModal() {\n    if (this.modalScope && this.modalScope.dismiss) {\n      this.modalScope.dismiss();\n    }\n  }\n\n  showModal(options: any) {\n    if (this.modalScope && this.modalScope.dismiss) {\n      this.modalScope.dismiss();\n    }\n\n    this.modalScope = options.scope;\n\n    if (options.model) {\n      this.modalScope = this.$rootScope.$new();\n      this.modalScope.model = options.model;\n    } else if (!this.modalScope) {\n      this.modalScope = this.$rootScope.$new();\n    }\n\n    const modal = this.$modal({\n      modalClass: options.modalClass,\n      template: options.src,\n      templateHtml: options.templateHtml,\n      persist: false,\n      show: false,\n      scope: this.modalScope,\n      keyboard: false,\n      backdrop: options.backdrop,\n    });\n\n    Promise.resolve(modal).then(modalEl => {\n      modalEl.modal('show');\n    });\n  }\n\n  showConfirmModal(payload: any) {\n    const scope: any = this.$rootScope.$new();\n\n    scope.updateConfirmText = (value: any) => {\n      scope.confirmTextValid = payload.confirmText.toLowerCase() === value.toLowerCase();\n    };\n\n    scope.title = payload.title;\n    scope.text = payload.text;\n    scope.text2 = payload.text2;\n    scope.text2htmlBind = payload.text2htmlBind;\n    scope.confirmText = payload.confirmText;\n\n    scope.onConfirm = payload.onConfirm;\n    scope.onAltAction = payload.onAltAction;\n    scope.altActionText = payload.altActionText;\n    scope.icon = payload.icon || 'check';\n    scope.yesText = payload.yesText || 'Yes';\n    scope.noText = payload.noText || 'Cancel';\n    scope.confirmTextValid = scope.confirmText ? false : true;\n    scope.selectors = selectors.pages.ConfirmModal;\n\n    appEvents.emit(CoreEvents.showModal, {\n      src: 'public/app/partials/confirm_modal.html',\n      scope: scope,\n      modalClass: 'confirm-modal',\n    });\n  }\n}\n\ncoreModule.service('utilSrv', UtilSrv);\n","import _ from 'lodash';\nimport coreModule from 'app/core/core_module';\nimport { ITimeoutService } from 'angular';\n\n// This service really just tracks a list of $timeout promises to give us a\n// method for canceling them all when we need to\nexport class Timer {\n  timers: Array<angular.IPromise<any>> = [];\n\n  /** @ngInject */\n  constructor(private $timeout: ITimeoutService) {}\n\n  register(promise: angular.IPromise<any>) {\n    this.timers.push(promise);\n    return promise;\n  }\n\n  cancel(promise: angular.IPromise<any>) {\n    this.timers = _.without(this.timers, promise);\n    this.$timeout.cancel(promise);\n  }\n\n  cancelAll() {\n    _.each(this.timers, t => {\n      this.$timeout.cancel(t);\n    });\n    this.timers = [];\n  }\n}\n\ncoreModule.service('timer', Timer);\n","import $ from 'jquery';\nimport coreModule from 'app/core/core_module';\nimport config from 'app/core/config';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\nexport class Analytics {\n  /** @ngInject */\n  constructor(private $rootScope: GrafanaRootScope, private $location: any) {}\n\n  gaInit() {\n    $.ajax({\n      url: 'https://www.google-analytics.com/analytics.js',\n      dataType: 'script',\n      cache: true,\n    });\n    const ga = ((window as any).ga =\n      (window as any).ga ||\n      // this had the equivalent of `eslint-disable-next-line prefer-arrow/prefer-arrow-functions`\n      function() {\n        (ga.q = ga.q || []).push(arguments);\n      });\n    ga.l = +new Date();\n    ga('create', (config as any).googleAnalyticsId, 'auto');\n    ga('set', 'anonymizeIp', true);\n    return ga;\n  }\n\n  init() {\n    this.$rootScope.$on('$viewContentLoaded', () => {\n      const track = { page: this.$location.url() };\n      const ga = (window as any).ga || this.gaInit();\n      ga('set', track);\n      ga('send', 'pageview');\n    });\n  }\n}\n\n/** @ngInject */\nfunction startAnalytics(googleAnalyticsSrv: Analytics) {\n  if ((config as any).googleAnalyticsId) {\n    googleAnalyticsSrv.init();\n  }\n}\n\ncoreModule.service('googleAnalyticsSrv', Analytics).run(startAnalytics);\n","import _ from 'lodash';\nimport coreModule from 'app/core/core_module';\n// @ts-ignore\nimport Drop from 'tether-drop';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\n/** @ngInject */\nfunction popoverSrv(this: any, $compile: any, $rootScope: GrafanaRootScope, $timeout: any) {\n  let openDrop: any = null;\n\n  this.close = () => {\n    if (openDrop) {\n      openDrop.close();\n    }\n  };\n\n  this.show = (options: any) => {\n    if (openDrop) {\n      openDrop.close();\n      openDrop = null;\n    }\n\n    const scope = _.extend($rootScope.$new(true), options.model);\n    let drop: any;\n\n    const cleanUp = () => {\n      setTimeout(() => {\n        scope.$destroy();\n\n        if (drop.tether) {\n          drop.destroy();\n        }\n\n        if (options.onClose) {\n          options.onClose();\n        }\n      });\n\n      openDrop = null;\n    };\n\n    scope.dismiss = () => {\n      drop.close();\n    };\n\n    const contentElement = document.createElement('div');\n    contentElement.innerHTML = options.template;\n\n    $compile(contentElement)(scope);\n\n    $timeout(() => {\n      drop = new Drop({\n        target: options.element,\n        content: contentElement,\n        position: options.position,\n        classes: options.classNames || 'drop-popover',\n        openOn: options.openOn,\n        hoverCloseDelay: 200,\n        tetherOptions: {\n          constraints: [{ to: 'scrollParent', attachment: 'together' }],\n        },\n      });\n\n      drop.on('close', () => {\n        cleanUp();\n      });\n\n      openDrop = drop;\n      openDrop.open();\n    }, 100);\n\n    // return close function\n    return () => {\n      if (drop) {\n        drop.close();\n      }\n    };\n  };\n}\n\ncoreModule.service('popoverSrv', popoverSrv);\n","import _ from 'lodash';\nimport coreModule from '../core_module';\n\n/** @ngInject */\nexport function uiSegmentSrv(this: any, $sce: any, templateSrv: any) {\n  const self = this;\n\n  class MetricSegment {\n    value: string;\n    html: any;\n    type: any;\n    expandable: boolean;\n    text: string;\n    cssClass: string;\n    fake: boolean;\n    custom: boolean;\n    selectMode: any;\n\n    constructor(options: any) {\n      if (options === '*' || options.value === '*') {\n        this.value = '*';\n        this.html = $sce.trustAsHtml('<i class=\"fa fa-asterisk\"><i>');\n        this.type = options.type;\n        this.expandable = true;\n        return;\n      }\n\n      if (_.isString(options)) {\n        this.value = options;\n        this.html = $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(this.value));\n        return;\n      }\n\n      // temp hack to work around legacy inconsistency in segment model\n      this.text = options.value;\n\n      this.cssClass = options.cssClass;\n      this.custom = options.custom;\n      this.type = options.type;\n      this.fake = options.fake;\n      this.value = options.value;\n      this.selectMode = options.selectMode;\n      this.type = options.type;\n      this.expandable = options.expandable;\n      this.html = options.html || $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(this.value));\n    }\n  }\n\n  this.getSegmentForValue = function(value: string, fallbackText: string) {\n    if (value) {\n      return this.newSegment(value);\n    } else {\n      return this.newSegment({ value: fallbackText, fake: true });\n    }\n  };\n\n  this.newSelectMeasurement = () => {\n    return new MetricSegment({ value: 'select measurement', fake: true });\n  };\n\n  this.newFake = (text: string, type: string, cssClass: string) => {\n    return new MetricSegment({ value: text, fake: true, type: type, cssClass: cssClass });\n  };\n\n  this.newSegment = (options: any) => {\n    return new MetricSegment(options);\n  };\n\n  this.newKey = (key: string) => {\n    return new MetricSegment({ value: key, type: 'key', cssClass: 'query-segment-key' });\n  };\n\n  this.newKeyValue = (value: string) => {\n    return new MetricSegment({ value: value, type: 'value', cssClass: 'query-segment-value' });\n  };\n\n  this.newCondition = (condition: string) => {\n    return new MetricSegment({ value: condition, type: 'condition', cssClass: 'query-keyword' });\n  };\n\n  this.newOperator = (op: string) => {\n    return new MetricSegment({ value: op, type: 'operator', cssClass: 'query-segment-operator' });\n  };\n\n  this.newOperators = (ops: string[]) => {\n    return _.map(ops, op => {\n      return new MetricSegment({ value: op, type: 'operator', cssClass: 'query-segment-operator' });\n    });\n  };\n\n  this.transformToSegments = (addTemplateVars: boolean, variableTypeFilter: string) => {\n    return (results: any[]) => {\n      const segments = _.map(results, segment => {\n        return self.newSegment({ value: segment.text, expandable: segment.expandable });\n      });\n\n      if (addTemplateVars) {\n        _.each(templateSrv.getVariables(), variable => {\n          if (variableTypeFilter === void 0 || variableTypeFilter === variable.type) {\n            segments.unshift(self.newSegment({ type: 'value', value: '$' + variable.name, expandable: true }));\n          }\n        });\n      }\n\n      return segments;\n    };\n  };\n\n  this.newSelectMetric = () => {\n    return new MetricSegment({ value: 'select metric', fake: true });\n  };\n\n  this.newPlusButton = () => {\n    return new MetricSegment({\n      fake: true,\n      html: '<i class=\"fa fa-plus \"></i>',\n      type: 'plus-button',\n      cssClass: 'query-part',\n    });\n  };\n}\n\ncoreModule.service('uiSegmentSrv', uiSegmentSrv);\n","import angular from 'angular';\nimport coreModule from '../core_module';\n\nclass DynamicDirectiveSrv {\n  /** @ngInject */\n  constructor(private $compile: angular.ICompileService) {}\n\n  addDirective(element: any, name: string, scope: any) {\n    const child = angular.element(document.createElement(name));\n    this.$compile(child)(scope);\n\n    element.empty();\n    element.append(child);\n  }\n\n  link(scope: any, elem: JQLite, attrs: any, options: any) {\n    const directiveInfo = options.directive(scope);\n    if (!directiveInfo || !directiveInfo.fn) {\n      elem.empty();\n      return;\n    }\n\n    if (!directiveInfo.fn.registered) {\n      coreModule.directive(attrs.$normalize(directiveInfo.name), directiveInfo.fn);\n      directiveInfo.fn.registered = true;\n    }\n\n    this.addDirective(elem, directiveInfo.name, scope);\n  }\n\n  create(options: any) {\n    const directiveDef = {\n      restrict: 'E',\n      scope: options.scope,\n      link: (scope: any, elem: JQLite, attrs: any) => {\n        if (options.watchPath) {\n          let childScope: any = null;\n          scope.$watch(options.watchPath, () => {\n            if (childScope) {\n              childScope.$destroy();\n            }\n            childScope = scope.$new();\n            this.link(childScope, elem, attrs, options);\n          });\n        } else {\n          this.link(scope, elem, attrs, options);\n        }\n      },\n    };\n\n    return directiveDef;\n  }\n}\n\ncoreModule.service('dynamicDirectiveSrv', DynamicDirectiveSrv);\n","import coreModule from 'app/core/core_module';\nimport appEvents from 'app/core/app_events';\nimport { store } from 'app/store/store';\nimport { updateLocation } from 'app/core/actions';\nimport { ILocationService, ITimeoutService, IWindowService } from 'angular';\nimport { CoreEvents } from 'app/types';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { locationUtil, UrlQueryMap } from '@grafana/data';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { VariableSrv } from 'app/features/templating/all';\n\n// Services that handles angular -> redux store sync & other react <-> angular sync\nexport class BridgeSrv {\n  private fullPageReloadRoutes: string[];\n  private lastQuery: UrlQueryMap = {};\n  private lastPath = '';\n  private angularUrl: string;\n\n  /** @ngInject */\n  constructor(\n    private $location: ILocationService,\n    private $timeout: ITimeoutService,\n    private $window: IWindowService,\n    private $rootScope: GrafanaRootScope,\n    private $route: any,\n    private variableSrv: VariableSrv\n  ) {\n    this.fullPageReloadRoutes = ['/logout'];\n    this.angularUrl = $location.url();\n  }\n\n  init() {\n    this.$rootScope.$on('$routeUpdate', (evt, data) => {\n      const state = store.getState();\n\n      this.angularUrl = this.$location.url();\n\n      if (state.location.url !== this.angularUrl) {\n        store.dispatch(\n          updateLocation({\n            path: this.$location.path(),\n            query: this.$location.search(),\n            routeParams: this.$route.current.params,\n          })\n        );\n      }\n    });\n\n    this.$rootScope.$on('$routeChangeSuccess', (evt, data) => {\n      this.angularUrl = this.$location.url();\n\n      store.dispatch(\n        updateLocation({\n          path: this.$location.path(),\n          query: this.$location.search(),\n          routeParams: this.$route.current.params,\n        })\n      );\n    });\n\n    // Listen for changes in redux location -> update angular location\n    store.subscribe(() => {\n      const state = store.getState();\n      const url = state.location.url;\n\n      if (this.angularUrl !== url) {\n        // store angular url right away as otherwise we end up syncing multiple times\n        this.angularUrl = url;\n\n        this.$timeout(() => {\n          this.$location.url(url);\n          // some state changes should not trigger new browser history\n          if (state.location.replace) {\n            this.$location.replace();\n          }\n        });\n\n        console.log('store updating angular $location.url', url);\n      }\n\n      // Check for template variable changes on a dashboard\n      if (state.location.path === this.lastPath) {\n        const changes = findTemplateVarChanges(state.location.query, this.lastQuery);\n        if (changes) {\n          const dash = getDashboardSrv().getCurrent();\n          if (dash) {\n            this.variableSrv.templateVarsChangedInUrl(changes);\n          }\n        }\n        this.lastQuery = state.location.query;\n      } else {\n        this.lastQuery = {};\n      }\n      this.lastPath = state.location.path;\n    });\n\n    appEvents.on(CoreEvents.locationChange, payload => {\n      const urlWithoutBase = locationUtil.stripBaseFromUrl(payload.href);\n      if (this.fullPageReloadRoutes.indexOf(urlWithoutBase) > -1) {\n        this.$window.location.href = payload.href;\n        return;\n      }\n\n      this.$timeout(() => {\n        // A hack to use timeout when we're changing things (in this case the url) from outside of Angular.\n        this.$location.url(urlWithoutBase);\n      });\n    });\n  }\n}\n\nexport function findTemplateVarChanges(query: UrlQueryMap, old: UrlQueryMap): UrlQueryMap | undefined {\n  let count = 0;\n  const changes: UrlQueryMap = {};\n  for (const key in query) {\n    if (!key.startsWith('var-')) {\n      continue;\n    }\n    if (query[key] !== old[key]) {\n      changes[key] = query[key];\n      count++;\n    }\n  }\n  for (const key in old) {\n    if (!key.startsWith('var-')) {\n      continue;\n    }\n    if (!query[key]) {\n      changes[key] = ''; // removed\n      count++;\n    }\n  }\n  return count ? changes : undefined;\n}\n\ncoreModule.service('bridgeSrv', BridgeSrv);\n","import _ from 'lodash';\nimport angular from 'angular';\nimport coreModule from '../core_module';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { dateTime } from '@grafana/data';\n\ncoreModule.filter('stringSort', () => {\n  return (input: any) => {\n    return input.sort();\n  };\n});\n\ncoreModule.filter('slice', () => {\n  return (arr: any[], start: any, end: any) => {\n    if (!_.isUndefined(arr)) {\n      return arr.slice(start, end);\n    }\n    return arr;\n  };\n});\n\ncoreModule.filter('stringify', () => {\n  return (arr: any[]) => {\n    if (_.isObject(arr) && !_.isArray(arr)) {\n      return angular.toJson(arr);\n    } else {\n      return _.isNull(arr) ? null : arr.toString();\n    }\n  };\n});\n\ncoreModule.filter('moment', () => {\n  return (date: string, mode: string) => {\n    switch (mode) {\n      case 'ago':\n        return dateTime(date).fromNow();\n    }\n    return dateTime(date).fromNow();\n  };\n});\n\n/** @ngInject */\nfunction interpolateTemplateVars(templateSrv: TemplateSrv) {\n  const filterFunc: any = (text: string, scope: any) => {\n    let scopedVars;\n    if (scope.ctrl) {\n      scopedVars = (scope.ctrl.panel || scope.ctrl.row).scopedVars;\n    } else {\n      scopedVars = scope.row.scopedVars;\n    }\n\n    return templateSrv.replaceWithText(text, scopedVars);\n  };\n\n  filterFunc.$stateful = true;\n  return filterFunc;\n}\n\ncoreModule.filter('interpolateTemplateVars', interpolateTemplateVars);\nexport default {};\n","import $ from 'jquery';\n// @ts-ignore\nimport baron from 'baron';\nimport coreModule from 'app/core/core_module';\n\nconst scrollBarHTML = `\n<div class=\"baron__track\">\n  <div class=\"baron__bar\"></div>\n</div>\n`;\n\nconst scrollRootClass = 'baron baron__root';\nconst scrollerClass = 'baron__scroller';\n\nexport function geminiScrollbar() {\n  return {\n    restrict: 'A',\n    link: (scope: any, elem: any, attrs: any) => {\n      let scrollRoot = elem.parent();\n      const scroller = elem;\n\n      console.log('scroll');\n      if (attrs.grafanaScrollbar && attrs.grafanaScrollbar === 'scrollonroot') {\n        scrollRoot = scroller;\n      }\n\n      scrollRoot.addClass(scrollRootClass);\n      $(scrollBarHTML).appendTo(scrollRoot);\n      elem.addClass(scrollerClass);\n\n      const scrollParams = {\n        root: scrollRoot[0],\n        scroller: scroller[0],\n        bar: '.baron__bar',\n        barOnCls: '_scrollbar',\n        scrollingCls: '_scrolling',\n        track: '.baron__track',\n        direction: 'v',\n      };\n\n      const scrollbar = baron(scrollParams);\n\n      scope.$on('$destroy', () => {\n        scrollbar.dispose();\n      });\n    },\n  };\n}\n\ncoreModule.directive('grafanaScrollbar', geminiScrollbar);\n","import React from 'react';\nimport { LegacyForms } from '@grafana/ui';\nconst { Input } = LegacyForms;\n\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { SelectableValue } from '@grafana/data';\n\nimport StackdriverDatasource from '../datasource';\nimport { Metrics, LabelFilter, AnnotationsHelp, Project } from './';\nimport { toOption } from '../functions';\nimport { AnnotationTarget, MetricDescriptor } from '../types';\n\nexport interface Props {\n  onQueryChange: (target: AnnotationTarget) => void;\n  target: AnnotationTarget;\n  datasource: StackdriverDatasource;\n  templateSrv: TemplateSrv;\n}\n\ninterface State extends AnnotationTarget {\n  variableOptionGroup: SelectableValue<string>;\n  variableOptions: Array<SelectableValue<string>>;\n  labels: any;\n  [key: string]: any;\n}\n\nconst DefaultTarget: State = {\n  projectName: '',\n  projects: [],\n  metricType: '',\n  filters: [],\n  metricKind: '',\n  valueType: '',\n  refId: 'annotationQuery',\n  title: '',\n  text: '',\n  labels: {},\n  variableOptionGroup: {},\n  variableOptions: [],\n};\n\nexport class AnnotationQueryEditor extends React.Component<Props, State> {\n  state: State = DefaultTarget;\n\n  async UNSAFE_componentWillMount() {\n    // Unfortunately, migrations like this need to go componentWillMount. As soon as there's\n    // migration hook for this module.ts, we can do the migrations there instead.\n    const { target, datasource } = this.props;\n    if (!target.projectName) {\n      target.projectName = datasource.getDefaultProject();\n    }\n\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      options: datasource.variables.map(toOption),\n    };\n\n    const projects = await datasource.getProjects();\n    this.setState({\n      variableOptionGroup,\n      variableOptions: variableOptionGroup.options,\n      ...target,\n      projects,\n    });\n\n    datasource.getLabels(target.metricType, target.projectName, target.refId).then(labels => this.setState({ labels }));\n  }\n\n  onMetricTypeChange = ({ valueType, metricKind, type, unit }: MetricDescriptor) => {\n    const { onQueryChange, datasource } = this.props;\n    this.setState(\n      {\n        metricType: type,\n        unit,\n        valueType,\n        metricKind,\n      },\n      () => {\n        onQueryChange(this.state);\n      }\n    );\n    datasource.getLabels(type, this.state.refId, this.state.projectName).then(labels => this.setState({ labels }));\n  };\n\n  onChange(prop: string, value: string | string[]) {\n    this.setState({ [prop]: value }, () => {\n      this.props.onQueryChange(this.state);\n    });\n  }\n\n  render() {\n    const { metricType, projectName, filters, title, text, variableOptionGroup, labels, variableOptions } = this.state;\n    const { datasource } = this.props;\n\n    return (\n      <>\n        <Project\n          templateVariableOptions={variableOptions}\n          datasource={datasource}\n          projectName={projectName || datasource.getDefaultProject()}\n          onChange={value => this.onChange('projectName', value)}\n        />\n        <Metrics\n          projectName={projectName}\n          metricType={metricType}\n          templateSrv={datasource.templateSrv}\n          datasource={datasource}\n          templateVariableOptions={variableOptions}\n          onChange={metric => this.onMetricTypeChange(metric)}\n        >\n          {metric => (\n            <>\n              <LabelFilter\n                labels={labels}\n                filters={filters}\n                onChange={value => this.onChange('filters', value)}\n                variableOptionGroup={variableOptionGroup}\n              />\n            </>\n          )}\n        </Metrics>\n        <div className=\"gf-form gf-form-inline\">\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label query-keyword width-9\">Title</span>\n            <Input\n              type=\"text\"\n              className=\"gf-form-input width-20\"\n              value={title}\n              onChange={e => this.onChange('title', e.target.value)}\n            />\n          </div>\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label query-keyword width-9\">Text</span>\n            <Input\n              type=\"text\"\n              className=\"gf-form-input width-20\"\n              value={text}\n              onChange={e => this.onChange('text', e.target.value)}\n            />\n          </div>\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label gf-form-label--grow\" />\n          </div>\n        </div>\n\n        <AnnotationsHelp />\n      </>\n    );\n  }\n}\n","import React, { ChangeEvent } from 'react';\nimport { LegacyForms } from '@grafana/ui';\nconst { Switch } = LegacyForms;\nimport { PanelData } from '@grafana/data';\nimport { AnnotationQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { QueryField, PanelQueryEditor } from './';\n\nexport type Props = {\n  query: AnnotationQuery;\n  datasource: CloudWatchDatasource;\n  onChange: (value: AnnotationQuery) => void;\n  data?: PanelData;\n};\n\nexport function AnnotationQueryEditor(props: React.PropsWithChildren<Props>) {\n  const { query, onChange } = props;\n  return (\n    <>\n      <PanelQueryEditor\n        {...props}\n        onChange={(editorQuery: AnnotationQuery) => onChange({ ...query, ...editorQuery })}\n        onRunQuery={() => {}}\n        history={[]}\n      ></PanelQueryEditor>\n      <div className=\"gf-form-inline\">\n        <Switch\n          label=\"Enable Prefix Matching\"\n          labelClass=\"query-keyword\"\n          checked={query.prefixMatching}\n          onChange={() => onChange({ ...query, prefixMatching: !query.prefixMatching })}\n        />\n\n        <div className=\"gf-form gf-form--grow\">\n          <QueryField label=\"Action\">\n            <input\n              disabled={!query.prefixMatching}\n              className=\"gf-form-input width-12\"\n              value={query.actionPrefix || ''}\n              onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                onChange({ ...query, actionPrefix: event.target.value })\n              }\n            />\n          </QueryField>\n          <QueryField label=\"Alarm Name\">\n            <input\n              disabled={!query.prefixMatching}\n              className=\"gf-form-input width-12\"\n              value={query.alarmNamePrefix || ''}\n              onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                onChange({ ...query, alarmNamePrefix: event.target.value })\n              }\n            />\n          </QueryField>\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label gf-form-label--grow\" />\n          </div>\n        </div>\n      </div>\n    </>\n  );\n}\n","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { Icon, IconName, useTheme } from '@grafana/ui';\n\nexport interface Props {\n  child: any;\n}\n\nconst DropDownChild: FC<Props> = props => {\n  const { child } = props;\n  const listItemClassName = child.divider ? 'divider' : '';\n  const theme = useTheme();\n  const iconClassName = css`\n    margin-right: ${theme.spacing.sm};\n  `;\n\n  return (\n    <li className={listItemClassName}>\n      <a href={child.url}>\n        {child.icon && <Icon name={child.icon as IconName} className={iconClassName} />}\n        {child.text}\n      </a>\n    </li>\n  );\n};\n\nexport default DropDownChild;\n","import React, { FC } from 'react';\nimport _ from 'lodash';\nimport DropDownChild from './DropDownChild';\nimport { NavModelItem } from '@grafana/data';\n\ninterface Props {\n  link: NavModelItem;\n  onHeaderClick?: () => void;\n}\n\nconst SideMenuDropDown: FC<Props> = props => {\n  const { link, onHeaderClick } = props;\n  let childrenLinks: NavModelItem[] = [];\n  if (link.children) {\n    childrenLinks = _.filter(link.children, item => !item.hideFromMenu);\n  }\n\n  return (\n    <ul className=\"dropdown-menu dropdown-menu--sidemenu\" role=\"menu\">\n      <li className=\"side-menu-header\">\n        <a className=\"side-menu-header-link\" href={link.url} onClick={onHeaderClick}>\n          <span className=\"sidemenu-item-text\">{link.text}</span>\n        </a>\n      </li>\n      {childrenLinks.map((child, index) => {\n        return <DropDownChild child={child} key={`${child.url}-${index}`} />;\n      })}\n    </ul>\n  );\n};\n\nexport default SideMenuDropDown;\n","import React, { FC } from 'react';\nimport SideMenuDropDown from './SideMenuDropDown';\nimport { Icon } from '@grafana/ui';\nimport { NavModelItem } from '@grafana/data';\n\nexport interface Props {\n  link: NavModelItem;\n  onClick?: () => void;\n}\n\nconst TopSectionItem: FC<Props> = props => {\n  const { link, onClick } = props;\n\n  return (\n    <div className=\"sidemenu-item dropdown\">\n      <a className=\"sidemenu-link\" href={link.url} target={link.target} onClick={onClick}>\n        <span className=\"icon-circle sidemenu-icon\">\n          <Icon name={link.icon as any} size=\"xl\" />\n          {link.img && <img src={link.img} />}\n        </span>\n      </a>\n      <SideMenuDropDown link={link} onHeaderClick={onClick} />\n    </div>\n  );\n};\n\nexport default TopSectionItem;\n","import React, { FC } from 'react';\nimport _ from 'lodash';\nimport TopSectionItem from './TopSectionItem';\nimport config from '../../config';\nimport { getLocationSrv } from '@grafana/runtime';\n\nconst TopSection: FC<any> = () => {\n  const navTree = _.cloneDeep(config.bootData.navTree);\n  const mainLinks = _.filter(navTree, item => !item.hideFromMenu);\n  const searchLink = {\n    text: 'Search',\n    icon: 'search',\n  };\n\n  const onOpenSearch = () => {\n    getLocationSrv().update({ query: { search: 'open' }, partial: true });\n  };\n\n  return (\n    <div className=\"sidemenu__top\">\n      <TopSectionItem link={searchLink} onClick={onOpenSearch} />\n      {mainLinks.map((link, index) => {\n        return <TopSectionItem link={link} key={`${link.id}-${index}`} />;\n      })}\n    </div>\n  );\n};\n\nexport default TopSection;\n","import React, { FC } from 'react';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { StoreState } from 'app/types';\nimport { Icon } from '@grafana/ui';\n\nexport const SignIn: FC<any> = ({ url }) => {\n  const loginUrl = `login?redirect=${encodeURIComponent(url)}`;\n  return (\n    <div className=\"sidemenu-item\">\n      <a href={loginUrl} className=\"sidemenu-link\" target=\"_self\">\n        <span className=\"icon-circle sidemenu-icon\">\n          <Icon name=\"sign-in-alt\" size=\"xl\" />\n        </span>\n      </a>\n      <a href={loginUrl} target=\"_self\">\n        <ul className=\"dropdown-menu dropdown-menu--sidemenu\" role=\"menu\">\n          <li className=\"side-menu-header\">\n            <span className=\"sidemenu-item-text\">Sign In</span>\n          </li>\n        </ul>\n      </a>\n    </div>\n  );\n};\n\nconst mapStateToProps = (state: StoreState) => ({\n  url: state.location.url,\n});\n\nexport default connectWithStore(SignIn, mapStateToProps);\n","import React from 'react';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { UserOrgDTO } from '@grafana/data';\nimport { Modal, Button } from '@grafana/ui';\n\nimport { contextSrv } from 'app/core/services/context_srv';\nimport config from 'app/core/config';\n\ninterface Props {\n  onDismiss: () => void;\n}\n\ninterface State {\n  orgs: UserOrgDTO[];\n}\n\nexport class OrgSwitcher extends React.PureComponent<Props, State> {\n  state: State = {\n    orgs: [],\n  };\n\n  componentDidMount() {\n    this.getUserOrgs();\n  }\n\n  getUserOrgs = async () => {\n    const orgs: UserOrgDTO[] = await getBackendSrv().get('/api/user/orgs');\n    this.setState({ orgs });\n  };\n\n  setCurrentOrg = async (org: UserOrgDTO) => {\n    await getBackendSrv().post(`/api/user/using/${org.orgId}`);\n    this.setWindowLocation(`${config.appSubUrl}${config.appSubUrl.endsWith('/') ? '' : '/'}?orgId=${org.orgId}`);\n  };\n\n  setWindowLocation(href: string) {\n    window.location.href = href;\n  }\n\n  render() {\n    const { onDismiss } = this.props;\n    const { orgs } = this.state;\n\n    const currentOrgId = contextSrv.user.orgId;\n\n    return (\n      <Modal title=\"Switch Organization\" icon=\"arrow-random\" onDismiss={onDismiss} isOpen={true}>\n        <table className=\"filter-table form-inline\">\n          <thead>\n            <tr>\n              <th>Name</th>\n              <th>Role</th>\n              <th />\n            </tr>\n          </thead>\n          <tbody>\n            {orgs.map(org => (\n              <tr key={org.orgId}>\n                <td>{org.name}</td>\n                <td>{org.role}</td>\n                <td className=\"text-right\">\n                  {org.orgId === currentOrgId ? (\n                    <Button size=\"sm\">Current</Button>\n                  ) : (\n                    <Button variant=\"secondary\" size=\"sm\" onClick={() => this.setCurrentOrg(org)}>\n                      Switch to\n                    </Button>\n                  )}\n                </td>\n              </tr>\n            ))}\n          </tbody>\n        </table>\n      </Modal>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { css } from 'emotion';\nimport appEvents from '../../app_events';\nimport { User } from '../../services/context_srv';\nimport { NavModelItem } from '@grafana/data';\nimport { Icon, IconName } from '@grafana/ui';\nimport { CoreEvents } from 'app/types';\nimport { OrgSwitcher } from '../OrgSwitcher';\nimport { getFooterLinks } from '../Footer/Footer';\n\nexport interface Props {\n  link: NavModelItem;\n  user: User;\n}\n\ninterface State {\n  showSwitcherModal: boolean;\n}\n\nexport default class BottomNavLinks extends PureComponent<Props, State> {\n  state: State = {\n    showSwitcherModal: false,\n  };\n\n  onOpenShortcuts = () => {\n    appEvents.emit(CoreEvents.showModal, {\n      templateHtml: '<help-modal></help-modal>',\n    });\n  };\n\n  toggleSwitcherModal = () => {\n    this.setState(prevState => ({\n      showSwitcherModal: !prevState.showSwitcherModal,\n    }));\n  };\n\n  render() {\n    const { link, user } = this.props;\n    const { showSwitcherModal } = this.state;\n    const subMenuIconClassName = css`\n      margin-right: 8px;\n    `;\n\n    let children = link.children || [];\n\n    if (link.id === 'help') {\n      children = getFooterLinks();\n    }\n\n    return (\n      <div className=\"sidemenu-item dropdown dropup\">\n        <a href={link.url} className=\"sidemenu-link\" target={link.target}>\n          <span className=\"icon-circle sidemenu-icon\">\n            {link.icon && <Icon name={link.icon as IconName} size=\"xl\" />}\n            {link.img && <img src={link.img} />}\n          </span>\n        </a>\n        <ul className=\"dropdown-menu dropdown-menu--sidemenu\" role=\"menu\">\n          {link.subTitle && (\n            <li className=\"sidemenu-subtitle\">\n              <span className=\"sidemenu-item-text\">{link.subTitle}</span>\n            </li>\n          )}\n          {link.showOrgSwitcher && (\n            <li className=\"sidemenu-org-switcher\">\n              <a onClick={this.toggleSwitcherModal}>\n                <div>\n                  <div className=\"sidemenu-org-switcher__org-current\">Current Org.:</div>\n                  <div className=\"sidemenu-org-switcher__org-name\">{user.orgName}</div>\n                </div>\n                <div className=\"sidemenu-org-switcher__switch\">\n                  <Icon name=\"arrow-random\" className={subMenuIconClassName} />\n                  Switch\n                </div>\n              </a>\n            </li>\n          )}\n\n          {showSwitcherModal && <OrgSwitcher onDismiss={this.toggleSwitcherModal} />}\n\n          {children.map((child, index) => {\n            return (\n              <li key={`${child.text}-${index}`}>\n                <a href={child.url} target={child.target} rel=\"noopener\">\n                  {child.icon && <Icon name={child.icon as IconName} className={subMenuIconClassName} />}\n                  {child.text}\n                </a>\n              </li>\n            );\n          })}\n\n          {link.id === 'help' && (\n            <li key=\"keyboard-shortcuts\">\n              <a onClick={() => this.onOpenShortcuts()}>\n                <Icon name=\"keyboard\" className={subMenuIconClassName} /> Keyboard shortcuts\n              </a>\n            </li>\n          )}\n\n          <li className=\"side-menu-header\">\n            <span className=\"sidemenu-item-text\">{link.text}</span>\n          </li>\n        </ul>\n      </div>\n    );\n  }\n}\n","import React from 'react';\nimport _ from 'lodash';\nimport SignIn from './SignIn';\nimport BottomNavLinks from './BottomNavLinks';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport config from '../../config';\nimport { NavModelItem } from '@grafana/data';\n\nexport default function BottomSection() {\n  const navTree: NavModelItem[] = _.cloneDeep(config.bootData.navTree);\n  const bottomNav: NavModelItem[] = _.filter(navTree, item => item.hideFromMenu);\n  const isSignedIn = contextSrv.isSignedIn;\n  const user = contextSrv.user;\n\n  if (user && user.orgCount > 1) {\n    const profileNode: any = _.find(bottomNav, { id: 'profile' });\n    if (profileNode) {\n      profileNode.showOrgSwitcher = true;\n    }\n  }\n\n  return (\n    <div className=\"sidemenu__bottom\">\n      {!isSignedIn && <SignIn />}\n      {bottomNav.map((link, index) => {\n        return <BottomNavLinks link={link} user={user} key={`${link.url}-${index}`} />;\n      })}\n    </div>\n  );\n}\n","import React, { PureComponent } from 'react';\nimport appEvents from '../../app_events';\nimport TopSection from './TopSection';\nimport BottomSection from './BottomSection';\nimport config from 'app/core/config';\nimport { CoreEvents } from 'app/types';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport { Icon } from '@grafana/ui';\n\nconst homeUrl = config.appSubUrl || '/';\n\nexport class SideMenu extends PureComponent {\n  toggleSideMenuSmallBreakpoint = () => {\n    appEvents.emit(CoreEvents.toggleSidemenuMobile);\n  };\n\n  render() {\n    return [\n      <a href={homeUrl} className=\"sidemenu__logo\" key=\"logo\">\n        <Branding.MenuLogo />\n      </a>,\n      <div className=\"sidemenu__logo_small_breakpoint\" onClick={this.toggleSideMenuSmallBreakpoint} key=\"hamburger\">\n        <Icon name=\"bars\" size=\"xl\" />\n        <span className=\"sidemenu__close\">\n          <Icon name=\"times\" />\n          &nbsp;Close\n        </span>\n      </div>,\n      <TopSection key=\"topsection\" />,\n      <BottomSection key=\"bottomsection\" />,\n    ];\n  }\n}\n","import React from 'react';\nimport _ from 'lodash';\n\nimport { LegacyForms } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { Variable } from 'app/types/templates';\nconst { Select } = LegacyForms;\n\nexport interface Props {\n  onChange: (value: string) => void;\n  options: Array<SelectableValue<string>>;\n  isSearchable: boolean;\n  value: string;\n  placeholder?: string;\n  className?: string;\n  variables?: Variable[];\n}\n\ninterface State {\n  options: Array<SelectableValue<string>>;\n}\n\nexport class MetricSelect extends React.Component<Props, State> {\n  static defaultProps: Partial<Props> = {\n    variables: [],\n    options: [],\n    isSearchable: true,\n  };\n\n  constructor(props: Props) {\n    super(props);\n    this.state = { options: [] };\n  }\n\n  componentDidMount() {\n    this.setState({ options: this.buildOptions(this.props) });\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps: Props) {\n    if (nextProps.options.length > 0 || nextProps.variables?.length) {\n      this.setState({ options: this.buildOptions(nextProps) });\n    }\n  }\n\n  shouldComponentUpdate(nextProps: Props) {\n    const nextOptions = this.buildOptions(nextProps);\n    return nextProps.value !== this.props.value || !_.isEqual(nextOptions, this.state.options);\n  }\n\n  buildOptions({ variables = [], options }: Props) {\n    return variables.length > 0 ? [this.getVariablesGroup(), ...options] : options;\n  }\n\n  getVariablesGroup() {\n    return {\n      label: 'Template Variables',\n      options: this.props.variables?.map(v => ({\n        label: `$${v.name}`,\n        value: `$${v.name}`,\n      })),\n    };\n  }\n\n  getSelectedOption() {\n    const { options } = this.state;\n    const allOptions = options.every(o => o.options) ? _.flatten(options.map(o => o.options)) : options;\n    return allOptions.find(option => option.value === this.props.value);\n  }\n\n  render() {\n    const { placeholder, className, isSearchable, onChange } = this.props;\n    const { options } = this.state;\n    const selectedOption = this.getSelectedOption();\n    return (\n      <Select\n        className={className}\n        isMulti={false}\n        isClearable={false}\n        backspaceRemovesValue={false}\n        onChange={item => onChange(item.value ?? '')}\n        options={options}\n        isSearchable={isSearchable}\n        maxMenuHeight={500}\n        placeholder={placeholder}\n        noOptionsMessage={() => 'No options found'}\n        value={selectedOption}\n      />\n    );\n  }\n}\n","import React, { Component } from 'react';\nimport { AppNotification } from 'app/types';\nimport { Alert } from '@grafana/ui';\n\ninterface Props {\n  appNotification: AppNotification;\n  onClearNotification: (id: number) => void;\n}\n\nexport default class AppNotificationItem extends Component<Props> {\n  shouldComponentUpdate(nextProps: Props) {\n    return this.props.appNotification.id !== nextProps.appNotification.id;\n  }\n\n  componentDidMount() {\n    const { appNotification, onClearNotification } = this.props;\n    setTimeout(() => {\n      onClearNotification(appNotification.id);\n    }, appNotification.timeout);\n  }\n\n  render() {\n    const { appNotification, onClearNotification } = this.props;\n\n    return (\n      <Alert\n        severity={appNotification.severity}\n        title={appNotification.title}\n        children={appNotification.component || appNotification.text}\n        onRemove={() => onClearNotification(appNotification.id)}\n      />\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport appEvents from 'app/core/app_events';\nimport AppNotificationItem from './AppNotificationItem';\nimport { notifyApp, clearAppNotification } from 'app/core/actions';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { AppNotification, StoreState } from 'app/types';\n\nimport {\n  createErrorNotification,\n  createSuccessNotification,\n  createWarningNotification,\n} from '../../copy/appNotification';\nimport { AppEvents } from '@grafana/data';\n\nexport interface Props {\n  appNotifications: AppNotification[];\n  notifyApp: typeof notifyApp;\n  clearAppNotification: typeof clearAppNotification;\n}\n\nexport class AppNotificationList extends PureComponent<Props> {\n  componentDidMount() {\n    const { notifyApp } = this.props;\n\n    appEvents.on(AppEvents.alertWarning, payload => notifyApp(createWarningNotification(...payload)));\n    appEvents.on(AppEvents.alertSuccess, payload => notifyApp(createSuccessNotification(...payload)));\n    appEvents.on(AppEvents.alertError, payload => notifyApp(createErrorNotification(...payload)));\n  }\n\n  onClearAppNotification = (id: number) => {\n    this.props.clearAppNotification(id);\n  };\n\n  render() {\n    const { appNotifications } = this.props;\n\n    return (\n      <div>\n        {appNotifications.map((appNotification, index) => {\n          return (\n            <AppNotificationItem\n              key={`${appNotification.id}-${index}`}\n              appNotification={appNotification}\n              onClearNotification={id => this.onClearAppNotification(id)}\n            />\n          );\n        })}\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n  appNotifications: state.appNotifications.appNotifications,\n});\n\nconst mapDispatchToProps = {\n  notifyApp,\n  clearAppNotification,\n};\n\nexport default connectWithStore(AppNotificationList, mapStateToProps, mapDispatchToProps);\n","import React from 'react';\nimport { Icon } from '@grafana/ui';\n\nexport interface FunctionDescriptor {\n  text: string;\n  params: string[];\n  def: {\n    category: string;\n    defaultParams: string[];\n    description?: string;\n    fake: boolean;\n    name: string;\n    params: string[];\n  };\n}\n\nexport interface FunctionEditorControlsProps {\n  onMoveLeft: (func: FunctionDescriptor) => void;\n  onMoveRight: (func: FunctionDescriptor) => void;\n  onRemove: (func: FunctionDescriptor) => void;\n}\n\nconst FunctionHelpButton = (props: { description: string; name: string; onDescriptionShow: () => void }) => {\n  if (props.description) {\n    return <Icon className=\"pointer\" name=\"question-circle\" onClick={props.onDescriptionShow} />;\n  }\n\n  return (\n    <Icon\n      className=\"pointer\"\n      name=\"question-circle\"\n      onClick={() => {\n        window.open(\n          'http://graphite.readthedocs.org/en/latest/functions.html#graphite.render.functions.' + props.name,\n          '_blank'\n        );\n      }}\n    />\n  );\n};\n\nexport const FunctionEditorControls = (\n  props: FunctionEditorControlsProps & {\n    func: FunctionDescriptor;\n    onDescriptionShow: () => void;\n  }\n) => {\n  const { func, onMoveLeft, onMoveRight, onRemove, onDescriptionShow } = props;\n  return (\n    <div\n      style={{\n        display: 'flex',\n        width: '60px',\n        justifyContent: 'space-between',\n      }}\n    >\n      <Icon name=\"arrow-left\" onClick={() => onMoveLeft(func)} />\n      <FunctionHelpButton\n        name={func.def.name}\n        description={func.def.description}\n        onDescriptionShow={onDescriptionShow}\n      />\n      <Icon name=\"times\" onClick={() => onRemove(func)} />\n      <Icon name=\"arrow-right\" onClick={() => onMoveRight(func)} />\n    </div>\n  );\n};\n","import React, { Suspense } from 'react';\nimport { PopoverController, Popover } from '@grafana/ui';\nimport { FunctionDescriptor, FunctionEditorControls, FunctionEditorControlsProps } from './FunctionEditorControls';\n\ninterface FunctionEditorProps extends FunctionEditorControlsProps {\n  func: FunctionDescriptor;\n}\n\ninterface FunctionEditorState {\n  showingDescription: boolean;\n}\nconst FunctionDescription = React.lazy(async () => {\n  // @ts-ignore\n  const { default: rst2html } = await import(/* webpackChunkName: \"rst2html\" */ 'rst2html');\n  return {\n    default: (props: { description: string }) => (\n      <div dangerouslySetInnerHTML={{ __html: rst2html(props.description) }} />\n    ),\n  };\n});\n\nclass FunctionEditor extends React.PureComponent<FunctionEditorProps, FunctionEditorState> {\n  private triggerRef = React.createRef<HTMLSpanElement>();\n\n  constructor(props: FunctionEditorProps) {\n    super(props);\n\n    this.state = {\n      showingDescription: false,\n    };\n  }\n\n  renderContent = ({ updatePopperPosition }: any) => {\n    const {\n      onMoveLeft,\n      onMoveRight,\n      func: {\n        def: { name, description },\n      },\n    } = this.props;\n    const { showingDescription } = this.state;\n\n    if (showingDescription) {\n      return (\n        <div style={{ overflow: 'auto', maxHeight: '30rem', textAlign: 'left', fontWeight: 'normal' }}>\n          <h4 style={{ color: 'white' }}> {name} </h4>\n          <Suspense fallback={<span>Loading description...</span>}>\n            <FunctionDescription description={description} />\n          </Suspense>\n        </div>\n      );\n    }\n\n    return (\n      <FunctionEditorControls\n        {...this.props}\n        onMoveLeft={() => {\n          onMoveLeft(this.props.func);\n          updatePopperPosition();\n        }}\n        onMoveRight={() => {\n          onMoveRight(this.props.func);\n          updatePopperPosition();\n        }}\n        onDescriptionShow={() => {\n          this.setState({ showingDescription: true }, () => {\n            updatePopperPosition();\n          });\n        }}\n      />\n    );\n  };\n\n  render() {\n    return (\n      <PopoverController content={this.renderContent} placement=\"top\" hideAfter={300}>\n        {(showPopper, hidePopper, popperProps) => {\n          return (\n            <>\n              {this.triggerRef && (\n                <Popover\n                  {...popperProps}\n                  referenceElement={this.triggerRef.current}\n                  wrapperClassName=\"popper\"\n                  className=\"popper__background\"\n                  onMouseLeave={() => {\n                    this.setState({ showingDescription: false });\n                    hidePopper();\n                  }}\n                  onMouseEnter={showPopper}\n                  renderArrow={({ arrowProps, placement }) => (\n                    <div className=\"popper__arrow\" data-placement={placement} {...arrowProps} />\n                  )}\n                />\n              )}\n\n              <span\n                ref={this.triggerRef}\n                onClick={popperProps.show ? hidePopper : showPopper}\n                onMouseLeave={() => {\n                  hidePopper();\n                  this.setState({ showingDescription: false });\n                }}\n                style={{ cursor: 'pointer' }}\n              >\n                {this.props.func.def.name}\n              </span>\n            </>\n          );\n        }}\n      </PopoverController>\n    );\n  }\n}\n\nexport { FunctionEditor };\n","import React, { PureComponent, ChangeEvent, MouseEvent } from 'react';\nimport { Button, InlineFormLabel, LegacyForms, Tooltip, Icon } from '@grafana/ui';\nconst { Input } = LegacyForms;\nimport { User } from 'app/types';\nimport config from 'app/core/config';\nimport { ProfileUpdateFields } from 'app/core/utils/UserProvider';\n\nexport interface Props {\n  user: User;\n  isSavingUser: boolean;\n  updateProfile: (payload: ProfileUpdateFields) => void;\n}\n\nexport interface State {\n  name: string;\n  email: string;\n  login: string;\n}\n\nexport class UserProfileEditForm extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    const {\n      user: { name, email, login },\n    } = this.props;\n\n    this.state = {\n      name,\n      email,\n      login,\n    };\n  }\n\n  onNameChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ name: event.target.value });\n  };\n\n  onEmailChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ email: event.target.value });\n  };\n\n  onLoginChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ login: event.target.value });\n  };\n\n  onSubmitProfileUpdate = (event: MouseEvent<HTMLInputElement>) => {\n    event.preventDefault();\n    this.props.updateProfile({ ...this.state });\n  };\n\n  render() {\n    const { name, email, login } = this.state;\n    const { isSavingUser } = this.props;\n    const { disableLoginForm } = config;\n\n    return (\n      <>\n        <h3 className=\"page-sub-heading\">Edit Profile</h3>\n        <form name=\"userForm\" className=\"gf-form-group\">\n          <div className=\"gf-form max-width-30\">\n            <InlineFormLabel className=\"width-8\">Name</InlineFormLabel>\n            <Input className=\"gf-form-input max-width-22\" type=\"text\" onChange={this.onNameChange} value={name} />\n          </div>\n          <div className=\"gf-form max-width-30\">\n            <InlineFormLabel className=\"width-8\">Email</InlineFormLabel>\n            <Input\n              className=\"gf-form-input max-width-22\"\n              type=\"text\"\n              onChange={this.onEmailChange}\n              value={email}\n              disabled={disableLoginForm}\n            />\n            {disableLoginForm && (\n              <Tooltip content=\"Login Details Locked - managed in another system.\">\n                <Icon name=\"lock\" className=\"gf-form-icon--right-absolute\" />\n              </Tooltip>\n            )}\n          </div>\n          <div className=\"gf-form max-width-30\">\n            <InlineFormLabel className=\"width-8\">Username</InlineFormLabel>\n            <Input\n              className=\"gf-form-input max-width-22\"\n              type=\"text\"\n              onChange={this.onLoginChange}\n              value={login}\n              disabled={disableLoginForm}\n            />\n            {disableLoginForm && (\n              <Tooltip content=\"Login Details Locked - managed in another system.\">\n                <Icon name=\"lock\" className=\"gf-form-icon--right-absolute\" />\n              </Tooltip>\n            )}\n          </div>\n          <div className=\"gf-form-button-row\">\n            <Button variant=\"primary\" onClick={this.onSubmitProfileUpdate} disabled={isSavingUser}>\n              Save\n            </Button>\n          </div>\n        </form>\n      </>\n    );\n  }\n}\n\nexport default UserProfileEditForm;\n","import React, { PureComponent } from 'react';\nimport { Team } from 'app/types';\nimport { LoadingPlaceholder } from '@grafana/ui';\n\nexport interface Props {\n  teams: Team[];\n  isLoading: boolean;\n  loadTeams: () => void;\n}\n\nexport class UserTeams extends PureComponent<Props> {\n  componentDidMount() {\n    this.props.loadTeams();\n  }\n\n  render() {\n    const { isLoading, teams } = this.props;\n\n    if (isLoading) {\n      return <LoadingPlaceholder text=\"Loading teams...\" />;\n    }\n\n    return (\n      <>\n        {teams.length > 0 && (\n          <>\n            <h3 className=\"page-sub-heading\">Teams</h3>\n            <div className=\"gf-form-group\">\n              <table className=\"filter-table form-inline\">\n                <thead>\n                  <tr>\n                    <th />\n                    <th>Name</th>\n                    <th>Email</th>\n                    <th>Members</th>\n                  </tr>\n                </thead>\n                <tbody>\n                  {teams.map((team: Team, index) => {\n                    return (\n                      <tr key={index}>\n                        <td className=\"width-4 text-center\">\n                          <img className=\"filter-table__avatar\" src={team.avatarUrl} />\n                        </td>\n                        <td>{team.name}</td>\n                        <td>{team.email}</td>\n                        <td>{team.memberCount}</td>\n                      </tr>\n                    );\n                  })}\n                </tbody>\n              </table>\n            </div>\n          </>\n        )}\n      </>\n    );\n  }\n}\n\nexport default UserTeams;\n","import React, { PureComponent } from 'react';\nimport { User } from 'app/types';\nimport { UserOrg } from 'app/core/utils/UserProvider';\nimport { LoadingPlaceholder, Button } from '@grafana/ui';\n\nexport interface Props {\n  user: User;\n  orgs: UserOrg[];\n  isLoading: boolean;\n  loadOrgs: () => void;\n  setUserOrg: (org: UserOrg) => void;\n}\n\nexport class UserOrganizations extends PureComponent<Props> {\n  componentDidMount() {\n    this.props.loadOrgs();\n  }\n\n  render() {\n    const { isLoading, orgs, user } = this.props;\n\n    if (isLoading) {\n      return <LoadingPlaceholder text=\"Loading organizations...\" />;\n    }\n\n    return (\n      <>\n        {orgs.length > 0 && (\n          <>\n            <h3 className=\"page-sub-heading\">Organizations</h3>\n            <div className=\"gf-form-group\">\n              <table className=\"filter-table form-inline\">\n                <thead>\n                  <tr>\n                    <th>Name</th>\n                    <th>Role</th>\n                    <th />\n                  </tr>\n                </thead>\n                <tbody>\n                  {orgs.map((org: UserOrg, index) => {\n                    return (\n                      <tr key={index}>\n                        <td>{org.name}</td>\n                        <td>{org.role}</td>\n                        <td className=\"text-right\">\n                          {org.orgId === user.orgId ? (\n                            <span className=\"btn btn-primary btn-small\">Current</span>\n                          ) : (\n                            <Button\n                              variant=\"secondary\"\n                              size=\"sm\"\n                              onClick={() => {\n                                this.props.setUserOrg(org);\n                              }}\n                            >\n                              Select\n                            </Button>\n                          )}\n                        </td>\n                      </tr>\n                    );\n                  })}\n                </tbody>\n              </table>\n            </div>\n          </>\n        )}\n      </>\n    );\n  }\n}\n\nexport default UserOrganizations;\n","import React from 'react';\nimport { UserProvider } from 'app/core/utils/UserProvider';\nimport { UserProfileEditForm } from './UserProfileEditForm';\nimport { SharedPreferences } from 'app/core/components/SharedPreferences/SharedPreferences';\nimport { UserTeams } from './UserTeams';\nimport { UserOrganizations } from './UserOrganizations';\nimport { config } from '@grafana/runtime';\nimport { LoadingPlaceholder } from '@grafana/ui';\n\nexport const ReactProfileWrapper = () => (\n  <UserProvider userId={config.bootData.user.id}>\n    {(api, states, teams, orgs, user) => {\n      return (\n        <>\n          {states.loadUser ? (\n            <LoadingPlaceholder text=\"Loading user profile...\" />\n          ) : (\n            <UserProfileEditForm\n              updateProfile={api.updateUserProfile}\n              isSavingUser={states.updateUserProfile}\n              user={user}\n            />\n          )}\n          <SharedPreferences resourceUri=\"user\" />\n          <UserTeams isLoading={states.loadTeams} loadTeams={api.loadTeams} teams={teams} />\n          {!states.loadUser && (\n            <UserOrganizations\n              isLoading={states.loadOrgs}\n              setUserOrg={api.setUserOrg}\n              loadOrgs={api.loadOrgs}\n              orgs={orgs}\n              user={user}\n            />\n          )}\n        </>\n      );\n    }}\n  </UserProvider>\n);\n\nexport default ReactProfileWrapper;\n","// Libraries\nimport React, { memo } from 'react';\n\n// Types\nimport { LokiQuery } from '../types';\nimport { useLokiSyntaxAndLabels } from './useLokiSyntaxAndLabels';\nimport { LokiQueryFieldForm } from './LokiQueryFieldForm';\nimport LokiDatasource from '../datasource';\n\ninterface Props {\n  expr: string;\n  datasource: LokiDatasource;\n  onChange: (expr: string) => void;\n}\n\nexport const LokiAnnotationsQueryEditor = memo(function LokiAnnotationQueryEditor(props: Props) {\n  const { expr, datasource, onChange } = props;\n\n  // Timerange to get existing labels from. Hard coding like this seems to be good enough right now.\n  const absolute = {\n    from: Date.now() - 10000,\n    to: Date.now(),\n  };\n\n  const { isSyntaxReady, setActiveOption, refreshLabels, syntax, logLabelOptions } = useLokiSyntaxAndLabels(\n    datasource.languageProvider,\n    absolute\n  );\n\n  const query: LokiQuery = {\n    refId: '',\n    expr,\n  };\n\n  return (\n    <div className=\"gf-form-group\">\n      <LokiQueryFieldForm\n        datasource={datasource}\n        query={query}\n        onChange={(query: LokiQuery) => onChange(query.expr)}\n        onRunQuery={() => {}}\n        history={[]}\n        data={null}\n        onLoadOptions={setActiveOption}\n        onLabelsRefresh={refreshLabels}\n        absoluteRange={absolute}\n        syntax={syntax}\n        syntaxLoaded={isSyntaxReady}\n        logLabelOptions={logLabelOptions}\n      />\n    </div>\n  );\n});\n","import React from 'react';\nimport { appEvents } from 'app/core/core';\nimport { Icon } from '@grafana/ui';\n\nexport class HelpModal extends React.PureComponent {\n  static tabIndex = 0;\n  static shortcuts = {\n    Global: [\n      { keys: ['g', 'h'], description: 'Go to Home Dashboard' },\n      { keys: ['g', 'p'], description: 'Go to Profile' },\n      { keys: ['s', 'o'], description: 'Open search' },\n      { keys: ['esc'], description: 'Exit edit/setting views' },\n    ],\n    Dashboard: [\n      { keys: ['mod+s'], description: 'Save dashboard' },\n      { keys: ['d', 'r'], description: 'Refresh all panels' },\n      { keys: ['d', 's'], description: 'Dashboard settings' },\n      { keys: ['d', 'v'], description: 'Toggle in-active / view mode' },\n      { keys: ['d', 'k'], description: 'Toggle kiosk mode (hides top nav)' },\n      { keys: ['d', 'E'], description: 'Expand all rows' },\n      { keys: ['d', 'C'], description: 'Collapse all rows' },\n      { keys: ['d', 'a'], description: 'Toggle auto fit panels (experimental feature)' },\n      { keys: ['mod+o'], description: 'Toggle shared graph crosshair' },\n      { keys: ['d', 'l'], description: 'Toggle all panel legends' },\n    ],\n    'Focused Panel': [\n      { keys: ['e'], description: 'Toggle panel edit view' },\n      { keys: ['v'], description: 'Toggle panel fullscreen view' },\n      { keys: ['p', 's'], description: 'Open Panel Share Modal' },\n      { keys: ['p', 'd'], description: 'Duplicate Panel' },\n      { keys: ['p', 'r'], description: 'Remove Panel' },\n      { keys: ['p', 'l'], description: 'Toggle panel legend' },\n    ],\n    'Time Range': [\n      { keys: ['t', 'z'], description: 'Zoom out time range' },\n      {\n        keys: ['t', <Icon name=\"arrow-left\" />],\n        description: 'Move time range back',\n      },\n      {\n        keys: ['t', <Icon name=\"arrow-right\" />],\n        description: 'Move time range forward',\n      },\n    ],\n  };\n\n  dismiss() {\n    appEvents.emit('hide-modal');\n  }\n\n  render() {\n    return (\n      <div className=\"modal-body\">\n        <div className=\"modal-header\">\n          <h2 className=\"modal-header-title\">\n            <Icon name=\"keyboard\" size=\"lg\" />\n            <span className=\"p-l-1\">Shortcuts</span>\n          </h2>\n          <a className=\"modal-header-close\" onClick={this.dismiss}>\n            <Icon name=\"times\" style={{ margin: '3px 0 0 0' }} />\n          </a>\n        </div>\n\n        <div className=\"modal-content help-modal\">\n          <p className=\"small\" style={{ position: 'absolute', top: '13px', right: '44px' }}>\n            <span className=\"shortcut-table-key\">mod</span> =\n            <span className=\"muted\"> CTRL on windows or linux and CMD key on Mac</span>\n          </p>\n\n          {Object.entries(HelpModal.shortcuts).map(([category, shortcuts], i) => (\n            <div className=\"shortcut-category\" key={i}>\n              <table className=\"shortcut-table\">\n                <tbody>\n                  <tr>\n                    <th className=\"shortcut-table-category-header\" colSpan={2}>\n                      {category}\n                    </th>\n                  </tr>\n                  {shortcuts.map((shortcut, j) => (\n                    <tr key={`${i}-${j}`}>\n                      <td className=\"shortcut-table-keys\">\n                        {shortcut.keys.map((key, k) => (\n                          <span className=\"shortcut-table-key\" key={`${i}-${j}-${k}`}>\n                            {key}\n                          </span>\n                        ))}\n                      </td>\n                      <td className=\"shortcut-table-description\">{shortcut.description}</td>\n                    </tr>\n                  ))}\n                </tbody>\n              </table>\n            </div>\n          ))}\n\n          <div className=\"clearfix\" />\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { MouseEvent, PureComponent } from 'react';\nimport { IconButton } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport EmptyListCTA from '../../../core/components/EmptyListCTA/EmptyListCTA';\nimport { QueryVariableModel, VariableModel } from '../../templating/types';\nimport { toVariableIdentifier, VariableIdentifier } from '../state/types';\n\nexport interface Props {\n  variables: VariableModel[];\n  onAddClick: (event: MouseEvent<HTMLAnchorElement>) => void;\n  onEditClick: (identifier: VariableIdentifier) => void;\n  onChangeVariableOrder: (identifier: VariableIdentifier, fromIndex: number, toIndex: number) => void;\n  onDuplicateVariable: (identifier: VariableIdentifier) => void;\n  onRemoveVariable: (identifier: VariableIdentifier) => void;\n}\n\nenum MoveType {\n  down = 1,\n  up = -1,\n}\n\nexport class VariableEditorList extends PureComponent<Props> {\n  onEditClick = (event: MouseEvent, identifier: VariableIdentifier) => {\n    event.preventDefault();\n    this.props.onEditClick(identifier);\n  };\n\n  onChangeVariableOrder = (event: MouseEvent, variable: VariableModel, moveType: MoveType) => {\n    event.preventDefault();\n    this.props.onChangeVariableOrder(toVariableIdentifier(variable), variable.index!, variable.index! + moveType);\n  };\n\n  onDuplicateVariable = (event: MouseEvent, identifier: VariableIdentifier) => {\n    event.preventDefault();\n    this.props.onDuplicateVariable(identifier);\n  };\n\n  onRemoveVariable = (event: MouseEvent, identifier: VariableIdentifier) => {\n    event.preventDefault();\n    this.props.onRemoveVariable(identifier);\n  };\n\n  render() {\n    return (\n      <div>\n        <div>\n          {this.props.variables.length === 0 && (\n            <div>\n              <EmptyListCTA\n                title=\"There are no variables yet\"\n                buttonIcon=\"calculator-alt\"\n                buttonTitle=\"Add variable\"\n                infoBox={{\n                  __html: ` <p>\n                    Variables enable more interactive and dynamic dashboards. Instead of hard-coding things like server\n                    or sensor names in your metric queries you can use variables in their place. Variables are shown as\n                    dropdown select boxes at the top of the dashboard. These dropdowns make it easy to change the data\n                    being displayed in your dashboard. Check out the\n                    <a class=\"external-link\" href=\"http://docs.grafana.org/reference/templating/\" target=\"_blank\">\n                      Templating documentation\n                    </a>\n                    for more information.\n                  </p>`,\n                }}\n                infoBoxTitle=\"What do variables do?\"\n                onClick={this.props.onAddClick}\n              />\n            </div>\n          )}\n\n          {this.props.variables.length > 0 && (\n            <div>\n              <table\n                className=\"filter-table filter-table--hover\"\n                aria-label={selectors.pages.Dashboard.Settings.Variables.List.table}\n              >\n                <thead>\n                  <tr>\n                    <th>Variable</th>\n                    <th>Definition</th>\n                    <th colSpan={5} />\n                  </tr>\n                </thead>\n                <tbody>\n                  {this.props.variables.map((state, index) => {\n                    const variable = state as QueryVariableModel;\n                    return (\n                      <tr key={`${variable.name}-${index}`}>\n                        <td style={{ width: '1%' }}>\n                          <span\n                            onClick={event => this.onEditClick(event, toVariableIdentifier(variable))}\n                            className=\"pointer template-variable\"\n                            aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowNameFields(\n                              variable.name\n                            )}\n                          >\n                            {variable.name}\n                          </span>\n                        </td>\n                        <td\n                          style={{ maxWidth: '200px' }}\n                          onClick={event => this.onEditClick(event, toVariableIdentifier(variable))}\n                          className=\"pointer max-width\"\n                          aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDefinitionFields(\n                            variable.name\n                          )}\n                        >\n                          {variable.definition ? variable.definition : variable.query}\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          {index > 0 && (\n                            <IconButton\n                              onClick={event => this.onChangeVariableOrder(event, variable, MoveType.up)}\n                              name=\"arrow-up\"\n                              title=\"Move variable up\"\n                              aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowArrowUpButtons(\n                                variable.name\n                              )}\n                            />\n                          )}\n                        </td>\n                        <td style={{ width: '1%' }}>\n                          {index < this.props.variables.length - 1 && (\n                            <IconButton\n                              onClick={event => this.onChangeVariableOrder(event, variable, MoveType.down)}\n                              name=\"arrow-down\"\n                              title=\"Move variable down\"\n                              aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowArrowDownButtons(\n                                variable.name\n                              )}\n                            />\n                          )}\n                        </td>\n                        <td style={{ width: '1%' }}>\n                          <IconButton\n                            onClick={event => this.onDuplicateVariable(event, toVariableIdentifier(variable))}\n                            name=\"copy\"\n                            title=\"Duplicate variable\"\n                            aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDuplicateButtons(\n                              variable.name\n                            )}\n                          />\n                        </td>\n                        <td style={{ width: '1%' }}>\n                          <IconButton\n                            onClick={event => this.onRemoveVariable(event, toVariableIdentifier(variable))}\n                            name=\"trash-alt\"\n                            title=\"Remove variable\"\n                            aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowRemoveButtons(\n                              variable.name\n                            )}\n                          />\n                        </td>\n                      </tr>\n                    );\n                  })}\n                </tbody>\n              </table>\n            </div>\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { VariableModel, VariableOption, VariableWithOptions } from '../../templating/types';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface VariableValuesPreviewProps {\n  variable: VariableModel;\n}\n\nexport const VariableValuesPreview: React.FunctionComponent<VariableValuesPreviewProps> = ({ variable }) => {\n  const [previewLimit, setPreviewLimit] = useState(20);\n  const [previewOptions, setPreviewOptions] = useState<VariableOption[]>([]);\n  const showMoreOptions = useCallback(() => setPreviewLimit(previewLimit + 20), [previewLimit, setPreviewLimit]);\n  useEffect(() => {\n    if (!variable || !variable.hasOwnProperty('options')) {\n      return;\n    }\n    const variableWithOptions = variable as VariableWithOptions;\n    setPreviewOptions(variableWithOptions.options.slice(0, previewLimit));\n  }, [previewLimit, variable]);\n\n  if (!previewOptions.length) {\n    return null;\n  }\n\n  return (\n    <div className=\"gf-form-group\">\n      <h5>Preview of values</h5>\n      <div className=\"gf-form-inline\">\n        {previewOptions.map((o, index) => (\n          <div className=\"gf-form\" key={`${o.value}-${index}`}>\n            <span\n              className=\"gf-form-label\"\n              aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.previewOfValuesOption}\n            >\n              {o.text}\n            </span>\n          </div>\n        ))}\n        {previewOptions.length > previewLimit && (\n          <div className=\"gf-form\" ng-if=\"current.options.length > optionsLimit\">\n            <a\n              className=\"gf-form-label btn-secondary\"\n              onClick={showMoreOptions}\n              aria-label=\"Variable editor Preview of Values Show More link\"\n            >\n              Show more\n            </a>\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\nVariableValuesPreview.displayName = 'VariableValuesPreview';\n","import { ThunkResult } from '../../../types';\nimport { getNewVariabelIndex, getVariable, getVariables } from '../state/selectors';\nimport {\n  changeVariableNameFailed,\n  changeVariableNameSucceeded,\n  clearIdInEditor,\n  setIdInEditor,\n  variableEditorMounted,\n  variableEditorUnMounted,\n} from './reducer';\nimport { variableAdapters } from '../adapters';\nimport {\n  AddVariable,\n  NEW_VARIABLE_ID,\n  toVariableIdentifier,\n  toVariablePayload,\n  VariableIdentifier,\n} from '../state/types';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { VariableType } from '@grafana/data';\nimport { addVariable, removeVariable, storeNewVariable } from '../state/sharedReducer';\n\nexport const variableEditorMount = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async dispatch => {\n    dispatch(variableEditorMounted({ name: getVariable(identifier.id!).name }));\n  };\n};\n\nexport const variableEditorUnMount = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    dispatch(variableEditorUnMounted(toVariablePayload(identifier)));\n    if (getState().templating.variables[NEW_VARIABLE_ID]) {\n      dispatch(removeVariable(toVariablePayload({ type: identifier.type, id: NEW_VARIABLE_ID }, { reIndex: false })));\n    }\n  };\n};\n\nexport const onEditorUpdate = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variableInState = getVariable(identifier.id!, getState());\n    await variableAdapters.get(variableInState.type).updateOptions(variableInState);\n    dispatch(switchToListMode());\n  };\n};\n\nexport const onEditorAdd = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const newVariableInState = getVariable(NEW_VARIABLE_ID, getState());\n    const id = newVariableInState.name;\n    dispatch(storeNewVariable(toVariablePayload({ type: identifier.type, id })));\n    const variableInState = getVariable(id, getState());\n    await variableAdapters.get(variableInState.type).updateOptions(variableInState);\n    dispatch(switchToListMode());\n    dispatch(removeVariable(toVariablePayload({ type: identifier.type, id: NEW_VARIABLE_ID }, { reIndex: false })));\n  };\n};\n\nexport const changeVariableName = (identifier: VariableIdentifier, newName: string): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const variableInState = getVariable(identifier.id, getState());\n    if (newName === variableInState.name) {\n      return;\n    }\n\n    let errorText = null;\n    if (!newName.match(/^(?!__).*$/)) {\n      errorText = \"Template names cannot begin with '__', that's reserved for Grafana's global variables\";\n    }\n\n    if (!newName.match(/^\\w+$/)) {\n      errorText = 'Only word and digit characters are allowed in variable names';\n    }\n\n    const variables = getVariables(getState());\n    const foundVariables = variables.filter(v => v.name === newName && v.id !== identifier.id);\n\n    if (foundVariables.length) {\n      errorText = 'Variable with the same name already exists';\n    }\n\n    if (errorText) {\n      dispatch(changeVariableNameFailed({ newName, errorText }));\n      return;\n    }\n\n    const thunkToCall = identifier.id === NEW_VARIABLE_ID ? completeChangeNewVariableName : completeChangeVariableName;\n    dispatch(thunkToCall(identifier, newName));\n  };\n};\n\nexport const completeChangeNewVariableName = (\n  identifier: VariableIdentifier,\n  newName: string\n): ThunkResult<void> => dispatch => {\n  dispatch(changeVariableNameSucceeded(toVariablePayload(identifier, { newName })));\n};\n\nexport const completeChangeVariableName = (identifier: VariableIdentifier, newName: string): ThunkResult<void> => (\n  dispatch,\n  getState\n) => {\n  const originalVariable = getVariable(identifier.id, getState());\n  const model = { ...cloneDeep(originalVariable), name: newName, id: newName };\n  const global = originalVariable.global!; // global is undefined because of old variable system\n  const index = originalVariable.index!; // index is undefined because of old variable system\n  const renamedIdentifier = toVariableIdentifier(model);\n\n  dispatch(addVariable(toVariablePayload(renamedIdentifier, { global, index, model })));\n  dispatch(changeVariableNameSucceeded(toVariablePayload(renamedIdentifier, { newName })));\n  dispatch(switchToEditMode(renamedIdentifier));\n  dispatch(removeVariable(toVariablePayload(identifier, { reIndex: false })));\n};\n\nexport const switchToNewMode = (): ThunkResult<void> => (dispatch, getState) => {\n  const type: VariableType = 'query';\n  const id = NEW_VARIABLE_ID;\n  const global = false;\n  const model = cloneDeep(variableAdapters.get(type).initialState);\n  const index = getNewVariabelIndex(getState());\n  const identifier = { type, id };\n  dispatch(\n    addVariable(\n      toVariablePayload<AddVariable>(identifier, { global, model, index })\n    )\n  );\n  dispatch(setIdInEditor({ id: identifier.id }));\n};\n\nexport const switchToEditMode = (identifier: VariableIdentifier): ThunkResult<void> => dispatch => {\n  dispatch(setIdInEditor({ id: identifier.id }));\n};\n\nexport const switchToListMode = (): ThunkResult<void> => dispatch => {\n  dispatch(clearIdInEditor());\n};\n","import React, { ChangeEvent, FormEvent, PureComponent } from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { AppEvents, VariableType } from '@grafana/data';\nimport { InlineFormLabel } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { variableAdapters } from '../adapters';\nimport { NEW_VARIABLE_ID, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { VariableHide, VariableModel } from '../../templating/types';\nimport { appEvents } from '../../../core/core';\nimport { VariableValuesPreview } from './VariableValuesPreview';\nimport { changeVariableName, onEditorAdd, onEditorUpdate, variableEditorMount, variableEditorUnMount } from './actions';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from '../../../types';\nimport { VariableEditorState } from './reducer';\nimport { getVariable } from '../state/selectors';\nimport { connectWithStore } from '../../../core/utils/connectWithReduxStore';\nimport { OnPropChangeArguments } from './types';\nimport { changeVariableProp, changeVariableType } from '../state/sharedReducer';\n\nexport interface OwnProps {\n  identifier: VariableIdentifier;\n}\n\ninterface ConnectedProps {\n  editor: VariableEditorState;\n  variable: VariableModel;\n}\n\ninterface DispatchProps {\n  variableEditorMount: typeof variableEditorMount;\n  variableEditorUnMount: typeof variableEditorUnMount;\n  changeVariableName: typeof changeVariableName;\n  changeVariableProp: typeof changeVariableProp;\n  onEditorUpdate: typeof onEditorUpdate;\n  onEditorAdd: typeof onEditorAdd;\n  changeVariableType: typeof changeVariableType;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport class VariableEditorEditorUnConnected extends PureComponent<Props> {\n  componentDidMount(): void {\n    this.props.variableEditorMount(this.props.identifier);\n  }\n\n  componentDidUpdate(prevProps: Readonly<Props>, prevState: Readonly<{}>, snapshot?: any): void {\n    if (!isEqual(prevProps.editor.errors, this.props.editor.errors)) {\n      Object.values(this.props.editor.errors).forEach(error => {\n        appEvents.emit(AppEvents.alertWarning, ['Validation', error]);\n      });\n    }\n  }\n\n  componentWillUnmount(): void {\n    this.props.variableEditorUnMount(this.props.identifier);\n  }\n\n  onNameChange = (event: ChangeEvent<HTMLInputElement>) => {\n    event.preventDefault();\n    this.props.changeVariableName(this.props.identifier, event.target.value);\n  };\n\n  onTypeChange = (event: ChangeEvent<HTMLSelectElement>) => {\n    event.preventDefault();\n    this.props.changeVariableType(\n      toVariablePayload(this.props.identifier, { newType: event.target.value as VariableType })\n    );\n  };\n\n  onLabelChange = (event: ChangeEvent<HTMLInputElement>) => {\n    event.preventDefault();\n    this.props.changeVariableProp(\n      toVariablePayload(this.props.identifier, { propName: 'label', propValue: event.target.value })\n    );\n  };\n\n  onHideChange = (event: ChangeEvent<HTMLSelectElement>) => {\n    event.preventDefault();\n    this.props.changeVariableProp(\n      toVariablePayload(this.props.identifier, {\n        propName: 'hide',\n        propValue: parseInt(event.target.value, 10) as VariableHide,\n      })\n    );\n  };\n\n  onPropChanged = async ({ propName, propValue, updateOptions = false }: OnPropChangeArguments) => {\n    this.props.changeVariableProp(toVariablePayload(this.props.identifier, { propName, propValue }));\n    if (updateOptions) {\n      await variableAdapters.get(this.props.variable.type).updateOptions(this.props.variable);\n    }\n  };\n\n  onHandleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n    event.preventDefault();\n    if (!this.props.editor.isValid) {\n      return;\n    }\n\n    if (this.props.variable.id !== NEW_VARIABLE_ID) {\n      await this.props.onEditorUpdate(this.props.identifier);\n    }\n\n    if (this.props.variable.id === NEW_VARIABLE_ID) {\n      await this.props.onEditorAdd(this.props.identifier);\n    }\n  };\n\n  render() {\n    const EditorToRender = variableAdapters.get(this.props.variable.type).editor;\n    if (!EditorToRender) {\n      return null;\n    }\n    const newVariable = this.props.variable.id && this.props.variable.id === NEW_VARIABLE_ID;\n\n    return (\n      <div>\n        <form aria-label=\"Variable editor Form\" onSubmit={this.onHandleSubmit}>\n          <h5 className=\"section-heading\">General</h5>\n          <div className=\"gf-form-group\">\n            <div className=\"gf-form-inline\">\n              <div className=\"gf-form max-width-19\">\n                <span className=\"gf-form-label width-6\">Name</span>\n                <input\n                  type=\"text\"\n                  className=\"gf-form-input\"\n                  name=\"name\"\n                  placeholder=\"name\"\n                  required\n                  value={this.props.editor.name}\n                  onChange={this.onNameChange}\n                  aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalNameInput}\n                />\n              </div>\n              <div className=\"gf-form max-width-19\">\n                <InlineFormLabel width={6} tooltip={variableAdapters.get(this.props.variable.type).description}>\n                  Type\n                </InlineFormLabel>\n                <div className=\"gf-form-select-wrapper max-width-17\">\n                  <select\n                    className=\"gf-form-input\"\n                    value={this.props.variable.type}\n                    onChange={this.onTypeChange}\n                    aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalTypeSelect}\n                  >\n                    {variableAdapters.list().map(({ id, name }) => (\n                      <option key={id} label={name} value={id}>\n                        {name}\n                      </option>\n                    ))}\n                  </select>\n                </div>\n              </div>\n            </div>\n\n            {this.props.editor.errors.name && (\n              <div className=\"gf-form\">\n                <span className=\"gf-form-label gf-form-label--error\">{this.props.editor.errors.name}</span>\n              </div>\n            )}\n\n            <div className=\"gf-form-inline\">\n              <div className=\"gf-form max-width-19\">\n                <span className=\"gf-form-label width-6\">Label</span>\n                <input\n                  type=\"text\"\n                  className=\"gf-form-input\"\n                  value={this.props.variable.label ?? ''}\n                  onChange={this.onLabelChange}\n                  placeholder=\"optional display name\"\n                  aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInput}\n                />\n              </div>\n              <div className=\"gf-form max-width-19\">\n                <span className=\"gf-form-label width-6\">Hide</span>\n                <div className=\"gf-form-select-wrapper max-width-15\">\n                  <select\n                    className=\"gf-form-input\"\n                    value={this.props.variable.hide}\n                    onChange={this.onHideChange}\n                    aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalHideSelect}\n                  >\n                    <option label=\"\" value={VariableHide.dontHide}>\n                      {''}\n                    </option>\n                    <option label=\"\" value={VariableHide.hideLabel}>\n                      Label\n                    </option>\n                    <option label=\"\" value={VariableHide.hideVariable}>\n                      Variable\n                    </option>\n                  </select>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          {EditorToRender && <EditorToRender variable={this.props.variable} onPropChange={this.onPropChanged} />}\n\n          <VariableValuesPreview variable={this.props.variable} />\n\n          <div className=\"gf-form-button-row p-y-0\">\n            {!newVariable && (\n              <button\n                type=\"submit\"\n                className=\"btn btn-primary\"\n                aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.updateButton}\n              >\n                Update\n              </button>\n            )}\n            {newVariable && (\n              <button\n                type=\"submit\"\n                className=\"btn btn-primary\"\n                aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.addButton}\n              >\n                Add\n              </button>\n            )}\n          </div>\n        </form>\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({\n  editor: state.templating.editor,\n  variable: getVariable(ownProps.identifier.id, state, false), // we could be renaming a variable and we don't want this to throw\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  variableEditorMount,\n  variableEditorUnMount,\n  changeVariableName,\n  changeVariableProp,\n  onEditorUpdate,\n  onEditorAdd,\n  changeVariableType,\n};\n\nexport const VariableEditorEditor = connectWithStore(\n  VariableEditorEditorUnConnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import React, { MouseEvent, PureComponent } from 'react';\nimport { Icon } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { NEW_VARIABLE_ID, toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { StoreState } from '../../../types';\nimport { VariableEditorList } from './VariableEditorList';\nimport { VariableEditorEditor } from './VariableEditorEditor';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { connectWithStore } from '../../../core/utils/connectWithReduxStore';\nimport { getVariables } from '../state/selectors';\nimport { VariableModel } from '../../templating/types';\nimport { switchToEditMode, switchToListMode, switchToNewMode } from './actions';\nimport { changeVariableOrder, duplicateVariable, removeVariable } from '../state/sharedReducer';\n\ninterface OwnProps {}\n\ninterface ConnectedProps {\n  idInEditor: string | null;\n  variables: VariableModel[];\n}\n\ninterface DispatchProps {\n  changeVariableOrder: typeof changeVariableOrder;\n  duplicateVariable: typeof duplicateVariable;\n  removeVariable: typeof removeVariable;\n  switchToNewMode: typeof switchToNewMode;\n  switchToEditMode: typeof switchToEditMode;\n  switchToListMode: typeof switchToListMode;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nclass VariableEditorContainerUnconnected extends PureComponent<Props> {\n  componentDidMount(): void {\n    this.props.switchToListMode();\n  }\n\n  onChangeToListMode = (event: MouseEvent<HTMLAnchorElement>) => {\n    event.preventDefault();\n    this.props.switchToListMode();\n  };\n\n  onEditVariable = (identifier: VariableIdentifier) => {\n    this.props.switchToEditMode(identifier);\n  };\n\n  onNewVariable = (event: MouseEvent<HTMLAnchorElement>) => {\n    event.preventDefault();\n    this.props.switchToNewMode();\n  };\n\n  onChangeVariableOrder = (identifier: VariableIdentifier, fromIndex: number, toIndex: number) => {\n    this.props.changeVariableOrder(toVariablePayload(identifier, { fromIndex, toIndex }));\n  };\n\n  onDuplicateVariable = (identifier: VariableIdentifier) => {\n    this.props.duplicateVariable(toVariablePayload(identifier, { newId: (undefined as unknown) as string }));\n  };\n\n  onRemoveVariable = (identifier: VariableIdentifier) => {\n    this.props.removeVariable(toVariablePayload(identifier, { reIndex: true }));\n  };\n\n  render() {\n    const variableToEdit = this.props.variables.find(s => s.id === this.props.idInEditor) ?? null;\n    return (\n      <div>\n        <div className=\"page-action-bar\">\n          <h3 className=\"dashboard-settings__header\">\n            <a\n              onClick={this.onChangeToListMode}\n              aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.headerLink}\n            >\n              Variables\n            </a>\n            {this.props.idInEditor === NEW_VARIABLE_ID && (\n              <span>\n                <Icon\n                  name=\"angle-right\"\n                  aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.modeLabelNew}\n                />\n                New\n              </span>\n            )}\n            {this.props.idInEditor && this.props.idInEditor !== NEW_VARIABLE_ID && (\n              <span>\n                <Icon\n                  name=\"angle-right\"\n                  aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.modeLabelEdit}\n                />\n                Edit\n              </span>\n            )}\n          </h3>\n\n          <div className=\"page-action-bar__spacer\" />\n          {this.props.variables.length > 0 && variableToEdit === null && (\n            <a\n              type=\"button\"\n              className=\"btn btn-primary\"\n              onClick={this.onNewVariable}\n              aria-label={selectors.pages.Dashboard.Settings.Variables.List.newButton}\n            >\n              New\n            </a>\n          )}\n        </div>\n\n        {!variableToEdit && (\n          <VariableEditorList\n            variables={this.props.variables}\n            onAddClick={this.onNewVariable}\n            onEditClick={this.onEditVariable}\n            onChangeVariableOrder={this.onChangeVariableOrder}\n            onDuplicateVariable={this.onDuplicateVariable}\n            onRemoveVariable={this.onRemoveVariable}\n          />\n        )}\n        {variableToEdit && <VariableEditorEditor identifier={toVariableIdentifier(variableToEdit)} />}\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = state => ({\n  variables: getVariables(state, true),\n  idInEditor: state.templating.editor.id,\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  changeVariableOrder,\n  duplicateVariable,\n  removeVariable,\n  switchToNewMode,\n  switchToEditMode,\n  switchToListMode,\n};\n\nexport const VariableEditorContainer = connectWithStore(\n  VariableEditorContainerUnconnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import React, { FC, useContext } from 'react';\nimport { css, cx } from 'emotion';\nimport { ThemeContext } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { DashboardQuery } from '../types';\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\n\ninterface SearchFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n  query: DashboardQuery;\n  onChange: (query: string) => void;\n  onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n  clearable?: boolean;\n  width?: number;\n}\n\nconst getSearchFieldStyles = (theme: GrafanaTheme) => ({\n  wrapper: css`\n    width: 100%;\n    display: flex;\n    position: relative;\n    align-items: center;\n  `,\n  input: css`\n    box-sizing: border-box;\n    outline: none;\n    background-color: transparent;\n    background: transparent;\n    border-bottom: 2px solid ${theme.colors.border1};\n    font-size: 20px;\n    line-height: 38px;\n    width: 100%;\n\n    &::placeholder {\n      color: ${theme.colors.textWeak};\n    }\n  `,\n  spacer: css`\n    flex-grow: 1;\n  `,\n  icon: cx(\n    css`\n      color: ${theme.colors.textWeak};\n      padding: 0 ${theme.spacing.md};\n    `\n  ),\n  clearButton: css`\n    font-size: ${theme.typography.size.sm};\n    color: ${theme.colors.textWeak};\n    text-decoration: underline;\n\n    &:hover {\n      cursor: pointer;\n      color: ${theme.colors.textStrong};\n    }\n  `,\n});\n\nexport const SearchField: FC<SearchFieldProps> = ({ query, onChange, size, clearable, className, ...inputProps }) => {\n  const theme = useContext(ThemeContext);\n  const styles = getSearchFieldStyles(theme);\n\n  return (\n    <div className={cx(styles.wrapper, className)}>\n      <input\n        type=\"text\"\n        placeholder=\"Search dashboards by name\"\n        value={query.query}\n        onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n          onChange(event.currentTarget.value);\n        }}\n        tabIndex={1}\n        spellCheck={false}\n        className={styles.input}\n        {...inputProps}\n      />\n\n      <div className={styles.spacer} />\n    </div>\n  );\n};\n","import React, { FC, memo } from 'react';\nimport { css } from 'emotion';\nimport { useTheme, CustomScrollbar, stylesFactory, IconButton } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useSearchQuery } from '../hooks/useSearchQuery';\nimport { useDashboardSearch } from '../hooks/useDashboardSearch';\nimport { SearchField } from './SearchField';\nimport { SearchResults } from './SearchResults';\nimport { ActionRow } from './ActionRow';\n\nexport interface Props {\n  onCloseSearch: () => void;\n  folder?: string;\n}\n\nexport const DashboardSearch: FC<Props> = memo(({ onCloseSearch, folder }) => {\n  const payload = folder ? { query: `folder:${folder} ` } : {};\n  const { query, onQueryChange, onTagFilterChange, onTagAdd, onSortChange, onLayoutChange } = useSearchQuery(payload);\n  const { results, loading, onToggleSection, onKeyDown } = useDashboardSearch(query, onCloseSearch);\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div tabIndex={0} className={styles.overlay}>\n      <div className={styles.container}>\n        <div className={styles.searchField}>\n          <SearchField query={query} onChange={onQueryChange} onKeyDown={onKeyDown} autoFocus clearable />\n          <div className={styles.closeBtn}>\n            <IconButton name=\"times\" surface=\"panel\" onClick={onCloseSearch} size=\"xxl\" tooltip=\"Close search\" />\n          </div>\n        </div>\n        <div className={styles.search}>\n          <ActionRow\n            {...{\n              onLayoutChange,\n              onSortChange,\n              onTagFilterChange,\n              query,\n            }}\n          />\n          <CustomScrollbar>\n            <SearchResults\n              results={results}\n              loading={loading}\n              onTagSelected={onTagAdd}\n              editable={false}\n              onToggleSection={onToggleSection}\n              layout={query.layout}\n            />\n          </CustomScrollbar>\n        </div>\n      </div>\n    </div>\n  );\n});\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    overlay: css`\n      left: 0;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      z-index: ${theme.zIndex.sidemenu};\n      position: fixed;\n      background: ${theme.colors.dashboardBg};\n\n      @media only screen and (min-width: ${theme.breakpoints.md}) {\n        left: 60px;\n        z-index: ${theme.zIndex.navbarFixed + 1};\n      }\n    `,\n    container: css`\n      max-width: 1400px;\n      margin: 0 auto;\n      padding: ${theme.spacing.md};\n\n      height: 100%;\n\n      @media only screen and (min-width: ${theme.breakpoints.md}) {\n        padding: 32px;\n      }\n    `,\n    closeBtn: css`\n      right: -5px;\n      top: 2px;\n      z-index: 1;\n      position: absolute;\n    `,\n    searchField: css`\n      position: relative;\n    `,\n    search: css`\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n    `,\n  };\n});\n","import { KeyboardEvent, useReducer } from 'react';\nimport { getLocationSrv } from '@grafana/runtime';\nimport { DashboardQuery, DashboardSearchItemType, DashboardSection } from '../types';\nimport { MOVE_SELECTION_DOWN, MOVE_SELECTION_UP } from '../reducers/actionTypes';\nimport { dashboardsSearchState, DashboardsSearchState, searchReducer } from '../reducers/dashboardSearch';\nimport { findSelected } from '../utils';\nimport { useSearch } from './useSearch';\nimport { locationUtil } from '@grafana/data';\n\nexport const useDashboardSearch = (query: DashboardQuery, onCloseSearch: () => void) => {\n  const reducer = useReducer(searchReducer, dashboardsSearchState);\n  const {\n    state: { results, loading },\n    onToggleSection,\n    dispatch,\n  } = useSearch<DashboardsSearchState>(query, reducer, { queryParsing: true });\n\n  const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n    switch (event.key) {\n      case 'Escape':\n        onCloseSearch();\n        break;\n      case 'ArrowUp':\n        dispatch({ type: MOVE_SELECTION_UP });\n        break;\n      case 'ArrowDown':\n        dispatch({ type: MOVE_SELECTION_DOWN });\n        break;\n      case 'Enter':\n        const selectedItem = findSelected(results);\n        if (selectedItem) {\n          if (selectedItem.type === DashboardSearchItemType.DashFolder) {\n            onToggleSection(selectedItem as DashboardSection);\n          } else {\n            getLocationSrv().update({\n              path: locationUtil.stripBaseFromUrl(selectedItem.url),\n            });\n            // Delay closing to prevent current page flicker\n            setTimeout(onCloseSearch, 0);\n          }\n        }\n    }\n  };\n\n  return {\n    results,\n    loading,\n    onToggleSection,\n    onKeyDown,\n  };\n};\n","import React, { FC, memo } from 'react';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { getLocationQuery } from 'app/core/selectors/location';\nimport { updateLocation } from 'app/core/reducers/location';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { StoreState } from 'app/types';\nimport { DashboardSearch } from './DashboardSearch';\n\ninterface OwnProps {\n  search?: string | null;\n  folder?: string;\n  queryText?: string;\n  filter?: string;\n}\n\ninterface DispatchProps {\n  updateLocation: typeof updateLocation;\n}\n\nexport type Props = OwnProps & DispatchProps;\n\nexport const SearchWrapper: FC<Props> = memo(({ search, folder, updateLocation }) => {\n  const isOpen = search === 'open';\n\n  const closeSearch = () => {\n    if (search === 'open') {\n      updateLocation({\n        query: {\n          search: null,\n          folder: null,\n        },\n        partial: true,\n      });\n    }\n  };\n\n  return isOpen ? <DashboardSearch onCloseSearch={closeSearch} folder={folder} /> : null;\n});\n\nconst mapStateToProps: MapStateToProps<{}, OwnProps, StoreState> = (state: StoreState) => {\n  const { search, folder } = getLocationQuery(state.location);\n  return { search, folder };\n};\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  updateLocation,\n};\n\nexport default connectWithStore(SearchWrapper, mapStateToProps, mapDispatchToProps);\n","import { react2AngularDirective } from 'app/core/utils/react2angular';\nimport { QueryEditor as StackdriverQueryEditor } from 'app/plugins/datasource/stackdriver/components/QueryEditor';\nimport { AnnotationQueryEditor as StackdriverAnnotationQueryEditor } from 'app/plugins/datasource/stackdriver/components/AnnotationQueryEditor';\nimport { AnnotationQueryEditor as CloudWatchAnnotationQueryEditor } from 'app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor';\nimport PageHeader from './components/PageHeader/PageHeader';\nimport EmptyListCTA from './components/EmptyListCTA/EmptyListCTA';\nimport { TagFilter } from './components/TagFilter/TagFilter';\nimport { SideMenu } from './components/sidemenu/SideMenu';\nimport { MetricSelect } from './components/Select/MetricSelect';\nimport AppNotificationList from './components/AppNotifications/AppNotificationList';\nimport {\n  ColorPicker,\n  DataSourceHttpSettings,\n  GraphContextMenu,\n  SeriesColorPickerPopoverWithTheme,\n  UnitPicker,\n  Icon,\n  LegacyForms,\n  DataLinksInlineEditor,\n} from '@grafana/ui';\nconst { SecretFormField } = LegacyForms;\nimport { FunctionEditor } from 'app/plugins/datasource/graphite/FunctionEditor';\nimport ReactProfileWrapper from 'app/features/profile/ReactProfileWrapper';\nimport { LokiAnnotationsQueryEditor } from '../plugins/datasource/loki/components/AnnotationsQueryEditor';\nimport { HelpModal } from './components/help/HelpModal';\nimport { Footer } from './components/Footer/Footer';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport {\n  SaveDashboardAsButtonConnected,\n  SaveDashboardButtonConnected,\n} from '../features/dashboard/components/SaveDashboard/SaveDashboardButton';\nimport { VariableEditorContainer } from '../features/variables/editor/VariableEditorContainer';\nimport { SearchField, SearchResults, SearchWrapper, SearchResultsFilter } from '../features/search';\nimport { TimePickerSettings } from 'app/features/dashboard/components/DashboardSettings/TimePickerSettings';\n\nexport function registerAngularDirectives() {\n  react2AngularDirective('footer', Footer, []);\n  react2AngularDirective('icon', Icon, [\n    'color',\n    'name',\n    'size',\n    'type',\n    ['onClick', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('helpModal', HelpModal, []);\n  react2AngularDirective('sidemenu', SideMenu, []);\n  react2AngularDirective('functionEditor', FunctionEditor, ['func', 'onRemove', 'onMoveLeft', 'onMoveRight']);\n  react2AngularDirective('appNotificationsList', AppNotificationList, []);\n  react2AngularDirective('pageHeader', PageHeader, ['model', 'noTabs']);\n  react2AngularDirective('emptyListCta', EmptyListCTA, [\n    'title',\n    'buttonIcon',\n    'buttonLink',\n    'buttonTitle',\n    ['onClick', { watchDepth: 'reference', wrapApply: true }],\n    'proTip',\n    'proTipLink',\n    'proTipLinkTitle',\n    'proTipTarget',\n    'infoBox',\n    'infoBoxTitle',\n  ]);\n  //Search\n  react2AngularDirective('searchField', SearchField, [\n    'query',\n    'autoFocus',\n    ['onChange', { watchDepth: 'reference' }],\n    ['onKeyDown', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchResults', SearchResults, [\n    'results',\n    'editable',\n    'selectors',\n    ['onSelectionChanged', { watchDepth: 'reference' }],\n    ['onTagSelected', { watchDepth: 'reference' }],\n    ['onFolderExpanding', { watchDepth: 'reference' }],\n    ['onToggleSelection', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchFilters', SearchResultsFilter, [\n    'allChecked',\n    'canMove',\n    'canDelete',\n    'tagFilterOptions',\n    'selectedStarredFilter',\n    'selectedTagFilter',\n    ['onSelectAllChanged', { watchDepth: 'reference' }],\n    ['deleteItem', { watchDepth: 'reference' }],\n    ['moveTo', { watchDepth: 'reference' }],\n    ['onStarredFilterChange', { watchDepth: 'reference' }],\n    ['onTagFilterChange', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchWrapper', SearchWrapper, []);\n  react2AngularDirective('tagFilter', TagFilter, [\n    'tags',\n    ['onChange', { watchDepth: 'reference' }],\n    ['tagOptions', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('colorPicker', ColorPicker, [\n    'color',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('seriesColorPickerPopover', SeriesColorPickerPopoverWithTheme, [\n    'color',\n    'series',\n    'onColorChange',\n    'onToggleAxis',\n  ]);\n  react2AngularDirective('unitPicker', UnitPicker, [\n    'value',\n    'width',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('metricSelect', MetricSelect, [\n    'options',\n    'onChange',\n    'value',\n    'isSearchable',\n    'className',\n    'placeholder',\n    ['variables', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('stackdriverQueryEditor', StackdriverQueryEditor, [\n    'target',\n    'onQueryChange',\n    'onExecuteQuery',\n    ['events', { watchDepth: 'reference' }],\n    ['datasource', { watchDepth: 'reference' }],\n    ['templateSrv', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('stackdriverAnnotationQueryEditor', StackdriverAnnotationQueryEditor, [\n    'target',\n    'onQueryChange',\n    ['datasource', { watchDepth: 'reference' }],\n    ['templateSrv', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudwatchAnnotationQueryEditor', CloudWatchAnnotationQueryEditor, [\n    'query',\n    'onChange',\n    ['datasource', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('secretFormField', SecretFormField, [\n    'value',\n    'isConfigured',\n    'inputWidth',\n    'labelWidth',\n    ['onReset', { watchDepth: 'reference', wrapApply: true }],\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('graphContextMenu', GraphContextMenu, [\n    'x',\n    'y',\n    'items',\n    ['onClose', { watchDepth: 'reference', wrapApply: true }],\n    ['getContextMenuSource', { watchDepth: 'reference', wrapApply: true }],\n    ['timeZone', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  // We keep the drilldown terminology here because of as using data-* directive\n  // being in conflict with HTML data attributes\n  react2AngularDirective('drilldownLinksEditor', DataLinksInlineEditor, [\n    'value',\n    'links',\n    'suggestions',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('reactProfileWrapper', ReactProfileWrapper, []);\n\n  react2AngularDirective('lokiAnnotationsQueryEditor', LokiAnnotationsQueryEditor, [\n    'expr',\n    'onChange',\n    ['datasource', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('datasourceHttpSettingsNext', DataSourceHttpSettings, [\n    'defaultUrl',\n    'showAccessOptions',\n    'dataSourceConfig',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('folderPicker', FolderPicker, [\n    'labelClass',\n    'rootName',\n    'enableCreateNew',\n    'enableReset',\n    'initialTitle',\n    'initialFolderId',\n    'dashboardId',\n    'onCreateFolder',\n    ['enterFolderCreation', { watchDepth: 'reference', wrapApply: true }],\n    ['exitFolderCreation', { watchDepth: 'reference', wrapApply: true }],\n    ['onLoad', { watchDepth: 'reference', wrapApply: true }],\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('saveDashboardButton', SaveDashboardButtonConnected, [\n    ['getDashboard', { watchDepth: 'reference', wrapApply: true }],\n    ['onSaveSuccess', { watchDepth: 'reference', wrapApply: true }],\n    ['dashboard', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('saveDashboardAsButton', SaveDashboardAsButtonConnected, [\n    'variant',\n    ['getDashboard', { watchDepth: 'reference', wrapApply: true }],\n    ['onSaveSuccess', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('variableEditorContainer', VariableEditorContainer, []);\n  react2AngularDirective('timePickerSettings', TimePickerSettings, [\n    ['getDashboard', { watchDepth: 'reference', wrapApply: true }],\n    ['onTimeZoneChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onRefreshIntervalChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onNowDelayChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onHideTimePickerChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n}\n","import './directives/dropdown_typeahead';\nimport './directives/autofill_event_fix';\nimport './directives/metric_segment';\nimport './directives/misc';\nimport './directives/ng_model_on_blur';\nimport './directives/tags';\nimport './directives/value_select_dropdown';\nimport './directives/rebuild_on_change';\nimport './directives/give_focus';\nimport './directives/diff-view';\nimport './jquery_extended';\nimport './partials';\nimport './components/jsontree/jsontree';\nimport './components/code_editor/code_editor';\nimport './utils/outline';\nimport './components/colorpicker/spectrum_picker';\nimport './services/search_srv';\nimport './services/ng_react';\nimport { colors, JsonExplorer } from '@grafana/ui/';\n\nimport { infoPopover } from './components/info_popover';\nimport { arrayJoin } from './directives/array_join';\nimport { liveSrv } from './live/live_srv';\nimport { Emitter } from './utils/emitter';\nimport { switchDirective } from './components/switch';\nimport { dashboardSelector } from './components/dashboard_selector';\nimport { queryPartEditorDirective } from './components/query_part/query_part_editor';\nimport { sqlPartEditorDirective } from './components/sql_part/sql_part_editor';\nimport { formDropdownDirective } from './components/form_dropdown/form_dropdown';\nimport 'app/core/controllers/all';\nimport 'app/core/services/all';\nimport './filters/filters';\nimport coreModule from './core_module';\nimport appEvents from './app_events';\nimport { assignModelProperties } from './utils/model_utils';\nimport { contextSrv } from './services/context_srv';\nimport { KeybindingSrv } from './services/keybindingSrv';\nimport { NavModelSrv } from './nav_model_srv';\nimport { geminiScrollbar } from './components/scroll/scroll';\nimport { profiler } from './profiler';\nimport { registerAngularDirectives } from './angular_wrappers';\nimport { updateLegendValues } from './time_series2';\nimport TimeSeries from './time_series2';\nimport { NavModel } from '@grafana/data';\n\nexport {\n  profiler,\n  registerAngularDirectives,\n  arrayJoin,\n  coreModule,\n  liveSrv,\n  switchDirective,\n  infoPopover,\n  Emitter,\n  appEvents,\n  dashboardSelector,\n  queryPartEditorDirective,\n  sqlPartEditorDirective,\n  colors,\n  formDropdownDirective,\n  assignModelProperties,\n  contextSrv,\n  KeybindingSrv,\n  JsonExplorer,\n  NavModelSrv,\n  NavModel,\n  geminiScrollbar,\n  TimeSeries,\n  updateLegendValues,\n};\n","import { ThresholdsConfig } from './thresholds';\nimport { ValueMapping } from './valueMapping';\nimport { QueryResultBase, Labels, NullValueMode } from './data';\nimport { DisplayProcessor, DisplayValue } from './displayValue';\nimport { DataLink, LinkModel } from './dataLink';\nimport { Vector } from './vector';\nimport { FieldColor } from './fieldColor';\nimport { ScopedVars } from './ScopedVars';\n\nexport enum FieldType {\n  time = 'time', // or date\n  number = 'number',\n  string = 'string',\n  boolean = 'boolean',\n  // Used to detect that the value is some kind of trace data to help with the visualisation and processing.\n  trace = 'trace',\n  other = 'other', // Object, Array, etc\n}\n\n/**\n * Every property is optional\n *\n * Plugins may extend this with additional properties. Something like series overrides\n */\nexport interface FieldConfig<TOptions extends object = any> {\n  displayName?: string; // The display value for this field.  This supports template variables blank is auto\n  filterable?: boolean;\n\n  // Numeric Options\n  unit?: string;\n  decimals?: number | null; // Significant digits (for display)\n  min?: number | null;\n  max?: number | null;\n\n  // Convert input values into a display string\n  mappings?: ValueMapping[];\n\n  // Map numeric values to states\n  thresholds?: ThresholdsConfig;\n\n  // Map values to a display color\n  color?: FieldColor;\n\n  // Used when reducing field values\n  nullValueMode?: NullValueMode;\n\n  // The behavior when clicking on a result\n  links?: DataLink[];\n\n  // Alternative to empty string\n  noValue?: string;\n\n  // Panel Specific Values\n  custom?: TOptions;\n}\n\nexport interface ValueLinkConfig {\n  /**\n   * Result of field reduction\n   */\n  calculatedValue?: DisplayValue;\n  /**\n   * Index of the value row within Field. Should be provided only when value is not a result of a reduction\n   */\n  valueRowIndex?: number;\n}\n\nexport interface Field<T = any, V = Vector<T>> {\n  /**\n   * Name of the field (column)\n   */\n  name: string;\n  /**\n   *  Field value type (string, number, etc)\n   */\n  type: FieldType;\n  /**\n   *  Meta info about how field and how to display it\n   */\n  config: FieldConfig;\n  values: V; // The raw field values\n  labels?: Labels;\n\n  /**\n   * Cached values with appropriate display and id values\n   */\n  state?: FieldState | null;\n\n  /**\n   * Convert text to the field value\n   */\n  parse?: (value: any) => T;\n\n  /**\n   * Convert a value for display\n   */\n  display?: DisplayProcessor;\n\n  /**\n   * Get value data links with variables interpolated\n   */\n  getLinks?: (config: ValueLinkConfig) => Array<LinkModel<Field>>;\n}\n\nexport interface FieldState {\n  /**\n   * An appropriate name for the field (does not include frame info)\n   */\n  displayName?: string | null;\n\n  /**\n   * Cache of reduced values\n   */\n  calcs?: FieldCalcs;\n\n  /**\n   * Appropriate values for templating\n   */\n  scopedVars?: ScopedVars;\n}\n\nexport interface DataFrame extends QueryResultBase {\n  name?: string;\n  fields: Field[]; // All fields of equal length\n\n  // The number of rows\n  length: number;\n}\n\n/**\n * Like a field, but properties are optional and values may be a simple array\n */\nexport interface FieldDTO<T = any> {\n  name: string; // The column name\n  type?: FieldType;\n  config?: FieldConfig;\n  values?: Vector<T> | T[]; // toJSON will always be T[], input could be either\n  labels?: Labels;\n}\n\n/**\n * Like a DataFrame, but fields may be a FieldDTO\n */\nexport interface DataFrameDTO extends QueryResultBase {\n  name?: string;\n  fields: Array<FieldDTO | Field>;\n}\n\nexport interface FieldCalcs extends Record<string, any> {}\n\nexport const TIME_SERIES_VALUE_FIELD_NAME = 'Value';\nexport const TIME_SERIES_TIME_FIELD_NAME = 'Time';\n","var path = 'public/app/features/dashboard/components/DashLinks/editor.html';\nvar html = \"<div class=page-action-bar>\\n  <h3 class=dashboard-settings__header>\\n    <a ng-click=ctrl.backToList()>Dashboard Links</a>\\n    <span ng-show=\\\"ctrl.mode === 'new'\\\"><icon name=\\\"'angle-right'\\\"></icon> New</span>\\n    <span ng-show=\\\"ctrl.mode === 'edit'\\\"><icon name=\\\"'angle-right'\\\"></icon> Edit</span>\\n  </h3>\\n\\n  <div class=page-action-bar__spacer></div>\\n  <a type=button class=\\\"btn btn-primary\\\" ng-click=ctrl.setupNew() ng-if=\\\"ctrl.dashboard.links.length > 0\\\" ng-hide=\\\"ctrl.mode === 'edit' || ctrl.mode === 'new'\\\">\\n    New\\n  </a>\\n</div>\\n\\n<div ng-if=\\\"ctrl.mode == 'list'\\\">\\n  <div ng-if=\\\"ctrl.dashboard.links.length === 0\\\">\\n    <empty-list-cta on-click=ctrl.setupNew title=ctrl.emptyListCta.title buttonicon=ctrl.emptyListCta.buttonIcon buttontitle=ctrl.emptyListCta.buttonTitle infobox=ctrl.emptyListCta.infoBox infoboxtitle=ctrl.emptyListCta.infoBoxTitle />\\n  </div>\\n\\n  <div ng-if=\\\"ctrl.dashboard.links.length > 0\\\">\\n    <table class=\\\"filter-table filter-table--hover\\\">\\n      <thead>\\n        <tr>\\n          <th>Type</th>\\n          <th>Info</th>\\n          <th colspan=3></th>\\n        </tr>\\n      </thead>\\n      <tbody>\\n        <tr ng-repeat=\\\"link in ctrl.dashboard.links\\\">\\n          <td class=pointer ng-click=ctrl.editLink(link)>\\n            <icon name=\\\"'external-link-alt'\\\"></icon>\\n            {{ link.type }}\\n          </td>\\n          <td>\\n            <div ng-if=link.title>\\n              {{ link.title }}\\n            </div>\\n            <div ng-if=\\\"!link.title && link.url\\\">\\n              {{ link.url }}\\n            </div>\\n            <span ng-if=\\\"!link.title && link.tags\\\" ng-repeat=\\\"tag in link.tags\\\" tag-color-from-name=tag class=\\\"label label-tag\\\" style=margin-right:6px>\\n              {{ tag }}\\n            </span>\\n          </td>\\n          <td style=width:1%>\\n            <icon ng-click=\\\"ctrl.moveLink($index, -1)\\\" ng-hide=$first name=\\\"'arrow-up'\\\"></icon>\\n          </td>\\n          <td style=width:1%>\\n            <icon ng-click=\\\"ctrl.moveLink($index, 1)\\\" ng-hide=$last name=\\\"'arrow-down'\\\"></icon>\\n          </td>\\n          <td style=width:1%>\\n            <a ng-click=ctrl.deleteLink($index) class=\\\"btn btn-danger btn-small\\\" ng-hide=annotation.builtIn>\\n              <icon name=\\\"'times'\\\" style=margin-bottom:0></icon>\\n            </a>\\n          </td>\\n        </tr>\\n      </tbody>\\n    </table>\\n  </div>\\n</div>\\n\\n<div ng-if=\\\"ctrl.mode == 'edit' || ctrl.mode == 'new'\\\">\\n  <div class=gf-form-group>\\n    <div class=gf-form-group>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-8\\\">Type</span>\\n        <div class=\\\"gf-form-select-wrapper width-10\\\">\\n          <select class=gf-form-input ng-model=ctrl.link.type ng-options=\\\"f for f in ['dashboards','link']\\\"></select>\\n        </div>\\n      </div>\\n\\n      <div class=gf-form ng-show=\\\"ctrl.link.type === 'dashboards'\\\">\\n        <span class=\\\"gf-form-label width-8\\\">With tags</span>\\n        <bootstrap-tagsinput ng-model=ctrl.link.tags tagclass=\\\"label label-tag\\\" placeholder=\\\"add tags\\\" style=margin-right:.25rem></bootstrap-tagsinput>\\n      </div>\\n\\n      <gf-form-switch ng-show=\\\"ctrl.link.type === 'dashboards'\\\" class=gf-form label=\\\"As dropdown\\\" checked=ctrl.link.asDropdown switch-class=max-width-4 label-class=width-8></gf-form-switch>\\n      <div class=gf-form ng-show=\\\"ctrl.link.type === 'dashboards' && ctrl.link.asDropdown\\\">\\n        <span class=\\\"gf-form-label width-8\\\">Title</span>\\n        <input type=text ng-model=ctrl.link.title class=\\\"gf-form-input max-width-10\\\" ng-model-onblur/>\\n      </div>\\n      <div ng-show=\\\"ctrl.link.type === 'link'\\\">\\n        <div class=gf-form>\\n          <li class=\\\"gf-form-label width-8\\\">Url</li>\\n          <input type=text ng-model=ctrl.link.url class=\\\"gf-form-input width-20\\\" ng-model-onblur/>\\n        </div>\\n\\n        <div class=gf-form>\\n          <span class=\\\"gf-form-label width-8\\\">Title</span>\\n          <input type=text ng-model=ctrl.link.title class=\\\"gf-form-input width-20\\\" ng-model-onblur/>\\n        </div>\\n\\n        <div class=gf-form>\\n          <span class=\\\"gf-form-label width-8\\\">Tooltip</span>\\n          <input type=text ng-model=ctrl.link.tooltip class=\\\"gf-form-input width-20\\\" placeholder=\\\"Open dashboard\\\" ng-model-onblur/>\\n        </div>\\n\\n        <div class=gf-form>\\n          <span class=\\\"gf-form-label width-8\\\">Icon</span>\\n          <div class=\\\"gf-form-select-wrapper width-20\\\">\\n            <select class=gf-form-input ng-model=ctrl.link.icon ng-options=\\\"k as k for (k, v) in ctrl.iconMap\\\"></select>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-group>\\n      <h5 class=section-heading>Include</h5>\\n      <div>\\n        <gf-form-switch class=gf-form label=\\\"Time range\\\" checked=ctrl.link.keepTime switch-class=max-width-6 label-class=width-9></gf-form-switch>\\n        <gf-form-switch class=gf-form label=\\\"Variable values\\\" checked=ctrl.link.includeVars switch-class=max-width-6 label-class=width-9></gf-form-switch>\\n        <gf-form-switch class=gf-form label=\\\"Open in new tab\\\" checked=ctrl.link.targetBlank switch-class=max-width-6 label-class=width-9></gf-form-switch>\\n      </div>\\n    </div>\\n  </div>\\n  <button class=\\\"btn btn-primary\\\" ng-if=\\\"ctrl.mode == 'new'\\\" ng-click=ctrl.addLink()>\\n    Add\\n  </button>\\n  <button class=\\\"btn btn-primary\\\" ng-if=\\\"ctrl.mode == 'edit'\\\" ng-click=ctrl.saveLink()>\\n    Update\\n  </button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/postgres/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl has-text-edit-mode=true>\\n\\n  <div ng-if=ctrl.target.rawQuery>\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <code-editor content=ctrl.target.rawSql datasource=ctrl.datasource on-change=ctrl.panelCtrl.refresh() data-mode=sql>\\n        </code-editor>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=!ctrl.target.rawQuery>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">FROM</label>\\n        <metric-segment segment=ctrl.tableSegment get-options=ctrl.getTableSegments() on-change=ctrl.tableChanged()></metric-segment>\\n\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">Time column</label>\\n        <metric-segment segment=ctrl.timeColumnSegment get-options=ctrl.getTimeColumnSegments() on-change=ctrl.timeColumnChanged()></metric-segment>\\n\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">\\n          Metric column\\n          <info-popover mode=right-normal>Column to be used as metric name for the value column.</info-popover>\\n        </label>\\n        <metric-segment segment=ctrl.metricColumnSegment get-options=ctrl.getMetricColumnSegments() on-change=ctrl.metricColumnChanged()></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n\\n    </div>\\n\\n    <div class=gf-form-inline ng-repeat=\\\"selectParts in ctrl.selectParts\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">\\n          <span ng-show=\\\"$index === 0\\\">SELECT</span>&nbsp;\\n        </label>\\n      </div>\\n\\n      <div class=gf-form ng-repeat=\\\"part in selectParts\\\">\\n        <sql-part-editor class=\\\"gf-form-label sql-part\\\" part=part handle-event=\\\"ctrl.handleSelectPartEvent(selectParts, part, $event)\\\">\\n        </sql-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=dropdown dropdown-typeahead2=ctrl.selectMenu dropdown-typeahead-on-select=\\\"ctrl.addSelectPart(selectParts, $item, $subItem)\\\" button-template-class=\\\"gf-form-label query-part\\\">\\n        </label>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">WHERE</label>\\n      </div>\\n\\n      <div class=gf-form ng-repeat=\\\"part in ctrl.whereParts\\\">\\n        <sql-part-editor class=\\\"gf-form-label sql-part\\\" part=part handle-event=\\\"ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)\\\">\\n        </sql-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <metric-segment segment=ctrl.whereAdd get-options=ctrl.getWhereOptions() on-change=\\\"ctrl.addWhereAction(part, $index)\\\"></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">\\n          <span>GROUP BY</span>\\n        </label>\\n\\n        <sql-part-editor ng-repeat=\\\"part in ctrl.groupParts\\\" part=part class=\\\"gf-form-label sql-part\\\" handle-event=\\\"ctrl.handleGroupPartEvent(part, $index, $event)\\\">\\n        </sql-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <metric-segment segment=ctrl.groupAdd get-options=ctrl.getGroupOptions() on-change=\\\"ctrl.addGroupAction(part, $index)\\\"></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\">Format as</label>\\n      <div class=gf-form-select-wrapper>\\n        <select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.target.format ng-options=\\\"f.value as f.text for f in ctrl.formats\\\" ng-change=ctrl.refresh()></select>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=ctrl.toggleEditorMode() ng-show=\\\"ctrl.panelCtrl.panel.type !== 'table'\\\">\\n        <span ng-show=ctrl.target.rawQuery>Query Builder</span>\\n        <span ng-hide=ctrl.target.rawQuery>Edit SQL</span>\\n      </label>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n    <div class=gf-form ng-show=ctrl.lastQueryMeta>\\n      <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=\\\"ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL\\\">\\n        Generated SQL\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showLastQuerySQL style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showLastQuerySQL style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showLastQuerySQL>\\n    <pre class=gf-form-pre>{{ctrl.lastQueryMeta.sql}}</pre>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showHelp>\\n    <pre class=\\\"gf-form-pre alert alert-info\\\">Time series:\\n- return column named <i>time</i> (UTC in seconds or timestamp)\\n- return column(s) with numeric datatype as values\\nOptional:\\n  - return column named <i>metric</i> to represent the series name.\\n  - If multiple value columns are returned the metric column is used as prefix.\\n  - If no column named metric is found the column name of the value column is used as series name\\n\\nResultsets of time series queries need to be sorted by time.\\n\\nTable:\\n- return any set of columns\\n\\nMacros:\\n- $__time(column) -&gt; column as \\\"time\\\"\\n- $__timeEpoch -&gt; extract(epoch from column) as \\\"time\\\"\\n- $__timeFilter(column) -&gt; column BETWEEN '2017-04-21T05:01:17Z' AND '2017-04-21T05:01:17Z'\\n- $__unixEpochFilter(column) -&gt;  column &gt;= 1492750877 AND column &lt;= 1492750877\\n- $__unixEpochNanoFilter(column) -&gt;  column &gt;= 1494410783152415214 AND column &lt;= 1494497183142514872\\n- $__timeGroup(column,'5m'[, fillvalue]) -&gt; (extract(epoch from column)/300)::bigint*300\\n     by setting fillvalue grafana will fill in missing values according to the interval\\n     fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet\\n- $__timeGroupAlias(column,'5m') -&gt; (extract(epoch from column)/300)::bigint*300 AS \\\"time\\\"\\n- $__unixEpochGroup(column,'5m') -&gt; floor(column/300)*300\\n- $__unixEpochGroupAlias(column,'5m') -&gt; floor(column/300)*300 AS \\\"time\\\"\\n\\nExample of group by and order by with $__timeGroup:\\nSELECT\\n  $__timeGroup(date_time_col, '1h'),\\n  sum(value) as value\\nFROM yourtable\\nGROUP BY time\\nORDER BY time\\n\\nOr build your own conditionals using these macros which just return the values:\\n- $__timeFrom() -&gt;  '2017-04-21T05:01:17Z'\\n- $__timeTo() -&gt;  '2017-04-21T05:01:17Z'\\n- $__unixEpochFrom() -&gt;  1492750877\\n- $__unixEpochTo() -&gt;  1492750877\\n- $__unixEpochNanoFrom() -&gt;  1494410783152415214\\n- $__unixEpochNanoTo() -&gt;  1494497183142514872\\n    </pre>\\n  </div>\\n\\n  \\n\\n  <div class=gf-form ng-show=ctrl.lastQueryError>\\n    <pre class=\\\"gf-form-pre alert alert-error\\\">{{ctrl.lastQueryError}}</pre>\\n  </div>\\n\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","export const Pages = {\n  Login: {\n    url: '/login',\n    username: 'Username input field',\n    password: 'Password input field',\n    submit: 'Login button',\n    skip: 'Skip change password button',\n  },\n  DataSource: {\n    name: 'Data source settings page name input field',\n    delete: 'Data source settings page Delete button',\n    saveAndTest: 'Data source settings page Save and Test button',\n    alert: 'Data source settings page Alert',\n    alertMessage: 'Data source settings page Alert message',\n  },\n  DataSources: {\n    url: '/datasources',\n    dataSources: (dataSourceName: string) => `Data source list item ${dataSourceName}`,\n  },\n  AddDataSource: {\n    url: '/datasources/new',\n    dataSourcePlugins: (pluginName: string) => `Data source plugin item ${pluginName}`,\n  },\n  ConfirmModal: {\n    delete: 'Confirm Modal Danger Button',\n  },\n  AddDashboard: {\n    url: '/dashboard/new',\n    addNewPanel: 'Add new panel',\n  },\n  Dashboard: {\n    url: (uid: string) => `/d/${uid}`,\n    Toolbar: {\n      toolbarItems: (button: string) => `Dashboard navigation bar button ${button}`,\n      navBar: () => '.navbar',\n    },\n    SubMenu: {\n      submenuItem: 'Dashboard template variables submenu item',\n      submenuItemLabels: (item: string) => `Dashboard template variables submenu Label ${item}`,\n      submenuItemValueDropDownValueLinkTexts: (item: string) =>\n        `Dashboard template variables Variable Value DropDown value link text ${item}`,\n      submenuItemValueDropDownDropDown: 'Dashboard template variables Variable Value DropDown DropDown',\n      submenuItemValueDropDownOptionTexts: (item: string) =>\n        `Dashboard template variables Variable Value DropDown option text ${item}`,\n    },\n    Settings: {\n      General: {\n        deleteDashBoard: 'Dashboard settings page delete dashboard button',\n        sectionItems: (item: string) => `Dashboard settings section item ${item}`,\n        saveDashBoard: 'Dashboard settings aside actions Save button',\n        saveAsDashBoard: 'Dashboard settings aside actions Save As button',\n        title: 'Dashboard settings page title',\n      },\n      Variables: {\n        List: {\n          addVariableCTA: 'Call to action button Add variable',\n          newButton: 'Variable editor New variable button',\n          table: 'Variable editor Table',\n          tableRowNameFields: (variableName: string) => `Variable editor Table Name field ${variableName}`,\n          tableRowDefinitionFields: (variableName: string) => `Variable editor Table Definition field ${variableName}`,\n          tableRowArrowUpButtons: (variableName: string) => `Variable editor Table ArrowUp button ${variableName}`,\n          tableRowArrowDownButtons: (variableName: string) => `Variable editor Table ArrowDown button ${variableName}`,\n          tableRowDuplicateButtons: (variableName: string) => `Variable editor Table Duplicate button ${variableName}`,\n          tableRowRemoveButtons: (variableName: string) => `Variable editor Table Remove button ${variableName}`,\n        },\n        Edit: {\n          General: {\n            headerLink: 'Variable editor Header link',\n            modeLabelNew: 'Variable editor Header mode New',\n            modeLabelEdit: 'Variable editor Header mode Edit',\n            generalNameInput: 'Variable editor Form Name field',\n            generalTypeSelect: 'Variable editor Form Type select',\n            generalLabelInput: 'Variable editor Form Label field',\n            generalHideSelect: 'Variable editor Form Hide select',\n            selectionOptionsMultiSwitch: 'Variable editor Form Multi switch',\n            selectionOptionsIncludeAllSwitch: 'Variable editor Form IncludeAll switch',\n            selectionOptionsCustomAllInput: 'Variable editor Form IncludeAll field',\n            previewOfValuesOption: 'Variable editor Preview of Values option',\n            addButton: 'Variable editor Add button',\n            updateButton: 'Variable editor Update button',\n          },\n          QueryVariable: {\n            queryOptionsDataSourceSelect: 'Variable editor Form Query DataSource select',\n            queryOptionsRefreshSelect: 'Variable editor Form Query Refresh select',\n            queryOptionsRegExInput: 'Variable editor Form Query RegEx field',\n            queryOptionsSortSelect: 'Variable editor Form Query Sort select',\n            queryOptionsQueryInput: 'Variable editor Form Default Variable Query Editor textarea',\n            valueGroupsTagsEnabledSwitch: 'Variable editor Form Query UseTags switch',\n            valueGroupsTagsTagsQueryInput: 'Variable editor Form Query TagsQuery field',\n            valueGroupsTagsTagsValuesQueryInput: 'Variable editor Form Query TagsValuesQuery field',\n          },\n          ConstantVariable: {\n            constantOptionsQueryInput: 'Variable editor Form Constant Query field',\n          },\n        },\n      },\n    },\n  },\n  Dashboards: {\n    url: '/dashboards',\n    dashboards: (title: string) => `Dashboard search item ${title}`,\n  },\n  SaveDashboardAsModal: {\n    newName: 'Save dashboard title field',\n    save: 'Save dashboard button',\n  },\n  SaveDashboardModal: {\n    save: 'Dashboard settings Save Dashboard Modal Save button',\n    saveVariables: 'Dashboard settings Save Dashboard Modal Save variables checkbox',\n    saveTimerange: 'Dashboard settings Save Dashboard Modal Save timerange checkbox',\n  },\n  SharePanelModal: {\n    linkToRenderedImage: 'Link to rendered image',\n  },\n  Explore: {\n    url: '/explore',\n    General: {\n      container: 'Explore',\n      runButton: 'Run button',\n    },\n  },\n};\n","import { Pages } from './pages';\n\nexport const Components = {\n  DataSource: {\n    TestData: {\n      QueryTab: {\n        scenarioSelect: 'Test Data Query scenario select',\n        max: 'TestData max',\n        min: 'TestData min',\n        noise: 'TestData noise',\n        seriesCount: 'TestData series count',\n        spread: 'TestData spread',\n        startValue: 'TestData start value',\n      },\n    },\n  },\n  Panels: {\n    Panel: {\n      title: (title: string) => `Panel header title item ${title}`,\n      headerItems: (item: string) => `Panel header item ${item}`,\n      containerByTitle: (title: string) => `Panel container title ${title}`,\n    },\n    Visualization: {\n      Graph: {\n        VisualizationTab: {\n          legendSection: 'Legend section',\n        },\n        Legend: {\n          legendItemAlias: (name: string) => `gpl alias ${name}`,\n          showLegendSwitch: 'gpl show legend',\n        },\n        xAxis: {\n          labels: () => 'div.flot-x-axis > div.flot-tick-label',\n        },\n      },\n    },\n  },\n  Drawer: {\n    General: {\n      title: (title: string) => `Drawer title ${title}`,\n      expand: 'Drawer expand',\n      contract: 'Drawer contract',\n      close: 'Drawer close',\n      rcContentWrapper: () => '.drawer-content-wrapper',\n    },\n  },\n  PanelEditor: {\n    General: {\n      content: 'Panel editor content',\n    },\n    OptionsPane: {\n      content: 'Panel editor option pane content',\n      close: Pages.Dashboard.Toolbar.toolbarItems('Close options pane'),\n      open: Pages.Dashboard.Toolbar.toolbarItems('Open options pane'),\n      select: 'Panel editor option pane select',\n      tab: (title: string) => `Panel editor option pane tab ${title}`,\n    },\n    // not sure about the naming *DataPane*\n    DataPane: {\n      content: 'Panel editor data pane content',\n    },\n  },\n  PanelInspector: {\n    Data: {\n      content: 'Panel inspector Data content',\n    },\n    Stats: {\n      content: 'Panel inspector Stats content',\n    },\n    Json: {\n      content: 'Panel inspector Json content',\n    },\n    Query: {\n      content: 'Panel inspector Query content',\n      refreshButton: 'Panel inspector Query refresh button',\n      jsonObjectKeys: () => '.json-formatter-key',\n    },\n  },\n  Tab: {\n    title: (title: string) => `Tab ${title}`,\n    active: () => '[class*=\"-activeTabStyle\"]',\n  },\n  QueryTab: {\n    content: 'Query editor tab content',\n    queryInspectorButton: 'Query inspector button',\n    addQuery: 'Query editor add query button',\n  },\n  QueryEditorRows: {\n    rows: 'Query editor row',\n  },\n  QueryEditorRow: {\n    actionButton: (title: string) => `${title} query operation action`,\n    title: (refId: string) => `Query editor row title ${refId}`,\n  },\n  AlertTab: {\n    content: 'Alert editor tab content',\n  },\n  TransformTab: {\n    content: 'Transform editor tab content',\n    newTransform: (title: string) => `New transform ${title}`,\n  },\n  Transforms: {\n    Reduce: {\n      calculationsLabel: 'Transform calculations label',\n    },\n  },\n  QueryEditorToolbarItem: {\n    button: (title: string) => `QueryEditor toolbar item button ${title}`,\n  },\n  BackButton: {\n    backArrow: 'Go Back button',\n  },\n  OptionsGroup: {\n    toggle: (title: string) => `Options group ${title}`,\n  },\n  PluginVisualization: {\n    item: (title: string) => `Plugin visualization item ${title}`,\n    current: () => '[class*=\"-currentVisualizationItem\"]',\n  },\n  Select: {\n    option: 'Select option',\n    input: () => 'input[id*=\"react-select-\"]',\n    singleValue: () => 'div[class*=\"-singleValue\"]',\n  },\n  FieldConfigEditor: {\n    content: 'Field config editor content',\n  },\n  OverridesConfigEditor: {\n    content: 'Field overrides editor content',\n  },\n  FolderPicker: {\n    container: 'Folder picker select container',\n  },\n  DataSourcePicker: {\n    container: 'Data source picker select container',\n  },\n  TimeZonePicker: {\n    container: 'Time zone picker select container',\n  },\n  QueryField: { container: 'Query field' },\n};\n","import { Pages } from './pages';\nimport { Components } from './components';\nimport { E2ESelectors } from '../types';\n\nexport const selectors: { pages: E2ESelectors<typeof Pages>; components: E2ESelectors<typeof Components> } = {\n  pages: Pages,\n  components: Components,\n};\n","var path = 'public/app/plugins/datasource/postgres/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form-inline>\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <textarea rows=10 class=gf-form-input ng-model=ctrl.annotation.rawQuery spellcheck=false placeholder=\\\"query expression\\\" data-min-length=0 data-items=100 ng-model-onblur ng-change=ctrl.panelCtrl.refresh()></textarea>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showHelp>\\n    <pre class=\\\"gf-form-pre alert alert-info\\\"><h6>Annotation Query Format</h6>\\nAn annotation is an event that is overlaid on top of graphs. The query can have up to four columns per row, the time column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\\n\\n- column with alias: <b>time</b> for the annotation event time. Use epoch time or any native date data type.\\n- column with alias: <b>timeend</b> for the annotation event time-end. Use epoch time or any native date data type.\\n- column with alias: <b>text</b> for the annotation text\\n- column with alias: <b>tags</b> for annotation tags. This is a comma separated string of tags e.g. 'tag1,tag2'\\n\\n\\nMacros:\\n- $__time(column) -&gt; column as \\\"time\\\"\\n- $__timeEpoch -&gt; extract(epoch from column) as \\\"time\\\"\\n- $__timeFilter(column) -&gt; column BETWEEN '2017-04-21T05:01:17Z' AND '2017-04-21T05:01:17Z'\\n- $__unixEpochFilter(column) -&gt;  column &gt;= 1492750877 AND column &lt;= 1492750877\\n- $__unixEpochNanoFilter(column) -&gt;  column &gt;= 1494410783152415214 AND column &lt;= 1494497183142514872\\n\\nOr build your own conditionals using these macros which just return the values:\\n- $__timeFrom() -&gt;  '2017-04-21T05:01:17Z'\\n- $__timeTo() -&gt;  '2017-04-21T05:01:17Z'\\n- $__unixEpochFrom() -&gt;  1492750877\\n- $__unixEpochTo() -&gt;  1492750877\\n- $__unixEpochNanoFrom() -&gt;  1494410783152415214\\n- $__unixEpochNanoTo() -&gt;  1494497183142514872\\n\\t\\t</pre>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { GroupProps } from 'react-select';\nimport { stylesFactory, withTheme, selectThemeVariant } from '../../themes';\nimport { Themeable } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\ninterface ExtendedGroupProps extends GroupProps<any>, Themeable {\n  data: {\n    label: string;\n    expanded: boolean;\n    options: any[];\n  };\n}\n\ninterface State {\n  expanded: boolean;\n}\n\nconst getSelectOptionGroupStyles = stylesFactory((theme: GrafanaTheme) => {\n  const optionBorder = selectThemeVariant(\n    {\n      light: theme.palette.gray4,\n      dark: theme.palette.dark9,\n    },\n    theme.type\n  );\n  return {\n    header: css`\n      display: flex;\n      align-items: center;\n      justify-content: flex-start;\n      justify-items: center;\n      cursor: pointer;\n      padding: 7px 10px;\n      width: 100%;\n      border-bottom: 1px solid ${optionBorder};\n      text-transform: capitalize;\n    `,\n    label: css`\n      flex-grow: 1;\n    `,\n    icon: css`\n      padding-right: 2px;\n    `,\n  };\n});\n\nclass UnthemedSelectOptionGroup extends PureComponent<ExtendedGroupProps, State> {\n  state = {\n    expanded: false,\n  };\n\n  componentDidMount() {\n    if (this.props.data.expanded) {\n      this.setState({ expanded: true });\n    } else if (this.props.selectProps && this.props.selectProps.value) {\n      const { value } = this.props.selectProps.value;\n\n      if (value && this.props.options.some(option => option.value === value)) {\n        this.setState({ expanded: true });\n      }\n    }\n  }\n\n  componentDidUpdate(nextProps: ExtendedGroupProps) {\n    if (nextProps.selectProps.inputValue !== '') {\n      this.setState({ expanded: true });\n    }\n  }\n\n  onToggleChildren = () => {\n    this.setState(prevState => ({\n      expanded: !prevState.expanded,\n    }));\n  };\n\n  render() {\n    const { children, label, theme } = this.props;\n    const { expanded } = this.state;\n    const styles = getSelectOptionGroupStyles(theme);\n    return (\n      <div>\n        <div className={styles.header} onClick={this.onToggleChildren}>\n          <span className={styles.label}>{label}</span>\n          <Icon className={styles.icon} name={expanded ? 'angle-left' : 'angle-down'} />{' '}\n        </div>\n        {expanded && children}\n      </div>\n    );\n  }\n}\n\nexport const SelectOptionGroup = withTheme(UnthemedSelectOptionGroup);\n","import includes from 'lodash/includes';\nimport isDate from 'lodash/isDate';\nimport { DateTime, dateTime, dateTimeForTimeZone, ISO_8601, isDateTime, DurationUnit } from './moment_wrapper';\nimport { TimeZone } from '../types/index';\n\nconst units: DurationUnit[] = ['y', 'M', 'w', 'd', 'h', 'm', 's'];\n\nexport function isMathString(text: string | DateTime | Date): boolean {\n  if (!text) {\n    return false;\n  }\n\n  if (typeof text === 'string' && (text.substring(0, 3) === 'now' || text.includes('||'))) {\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Parses different types input to a moment instance. There is a specific formatting language that can be used\n * if text arg is string. See unit tests for examples.\n * @param text\n * @param roundUp See parseDateMath function.\n * @param timezone Only string 'utc' is acceptable here, for anything else, local timezone is used.\n */\nexport function parse(\n  text?: string | DateTime | Date | null,\n  roundUp?: boolean,\n  timezone?: TimeZone\n): DateTime | undefined {\n  if (!text) {\n    return undefined;\n  }\n\n  if (typeof text !== 'string') {\n    if (isDateTime(text)) {\n      return text;\n    }\n    if (isDate(text)) {\n      return dateTime(text);\n    }\n    // We got some non string which is not a moment nor Date. TS should be able to check for that but not always.\n    return undefined;\n  } else {\n    let time;\n    let mathString = '';\n    let index;\n    let parseString;\n\n    if (text.substring(0, 3) === 'now') {\n      time = dateTimeForTimeZone(timezone);\n      mathString = text.substring('now'.length);\n    } else {\n      index = text.indexOf('||');\n      if (index === -1) {\n        parseString = text;\n        mathString = ''; // nothing else\n      } else {\n        parseString = text.substring(0, index);\n        mathString = text.substring(index + 2);\n      }\n      // We're going to just require ISO8601 timestamps, k?\n      time = dateTime(parseString, ISO_8601);\n    }\n\n    if (!mathString.length) {\n      return time;\n    }\n\n    return parseDateMath(mathString, time, roundUp);\n  }\n}\n\n/**\n * Checks if text is a valid date which in this context means that it is either a Moment instance or it can be parsed\n * by parse function. See parse function to see what is considered acceptable.\n * @param text\n */\nexport function isValid(text: string | DateTime): boolean {\n  const date = parse(text);\n  if (!date) {\n    return false;\n  }\n\n  if (isDateTime(date)) {\n    return date.isValid();\n  }\n\n  return false;\n}\n\n/**\n * Parses math part of the time string and shifts supplied time according to that math. See unit tests for examples.\n * @param mathString\n * @param time\n * @param roundUp If true it will round the time to endOf time unit, otherwise to startOf time unit.\n */\n// TODO: Had to revert Andrejs `time: moment.Moment` to `time: any`\nexport function parseDateMath(mathString: string, time: any, roundUp?: boolean): DateTime | undefined {\n  const strippedMathString = mathString.replace(/\\s/g, '');\n  const dateTime = time;\n  let i = 0;\n  const len = strippedMathString.length;\n\n  while (i < len) {\n    const c = strippedMathString.charAt(i++);\n    let type;\n    let num;\n    let unit;\n\n    if (c === '/') {\n      type = 0;\n    } else if (c === '+') {\n      type = 1;\n    } else if (c === '-') {\n      type = 2;\n    } else {\n      return undefined;\n    }\n\n    if (isNaN(parseInt(strippedMathString.charAt(i), 10))) {\n      num = 1;\n    } else if (strippedMathString.length === 2) {\n      num = strippedMathString.charAt(i);\n    } else {\n      const numFrom = i;\n      while (!isNaN(parseInt(strippedMathString.charAt(i), 10))) {\n        i++;\n        if (i > 10) {\n          return undefined;\n        }\n      }\n      num = parseInt(strippedMathString.substring(numFrom, i), 10);\n    }\n\n    if (type === 0) {\n      // rounding is only allowed on whole, single, units (eg M or 1M, not 0.5M or 2M)\n      if (num !== 1) {\n        return undefined;\n      }\n    }\n    unit = strippedMathString.charAt(i++);\n\n    if (!includes(units, unit)) {\n      return undefined;\n    } else {\n      if (type === 0) {\n        if (roundUp) {\n          dateTime.endOf(unit);\n        } else {\n          dateTime.startOf(unit);\n        }\n      } else if (type === 1) {\n        dateTime.add(num, unit);\n      } else if (type === 2) {\n        dateTime.subtract(num, unit);\n      }\n    }\n  }\n  return dateTime;\n}\n","import { TimeZone, DefaultTimeZone } from '../types/time';\n\n/**\n * The type describing date and time options. Used for all the helper functions\n * available to parse or format date and time values.\n *\n * @public\n */\nexport interface DateTimeOptions {\n  /**\n   * Specify this if you want to override the timeZone used when parsing or formatting\n   * a date and time value. If no timeZone is set, the default timeZone for the current\n   * user is used.\n   */\n  timeZone?: TimeZone;\n}\n\n/**\n * The type to describe the time zone resolver function that will be used to access\n * the default time zone of a user.\n *\n * @public\n */\nexport type TimeZoneResolver = () => TimeZone | undefined;\n\nlet defaultTimeZoneResolver: TimeZoneResolver = () => DefaultTimeZone;\n\n/**\n * Used by Grafana internals to set the {@link TimeZoneResolver} to access the current\n * user timeZone.\n *\n * @internal\n */\nexport const setTimeZoneResolver = (resolver: TimeZoneResolver) => {\n  defaultTimeZoneResolver = resolver ?? defaultTimeZoneResolver;\n};\n\n/**\n * Used within this package to get timeZone from an options value. If timezone\n * is not set in the options, then a default timeZone is be resolved instead.\n *\n * @internal\n */\nexport const getTimeZone = <T extends DateTimeOptions>(options?: T): TimeZone => {\n  return options?.timeZone ?? defaultTimeZoneResolver() ?? DefaultTimeZone;\n};\n","/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */\nimport moment, { MomentInput, Moment } from 'moment-timezone';\nimport { TimeZone } from '../types';\nimport { DateTimeInput } from './moment_wrapper';\nimport { DEFAULT_DATE_TIME_FORMAT, MS_DATE_TIME_FORMAT } from './formats';\nimport { DateTimeOptions, getTimeZone } from './common';\n\n/**\n * The type describing the options that can be passed to the {@link dateTimeFormat}\n * helper function to control how the date and time value passed to the function is\n * formatted.\n *\n * @public\n */\nexport interface DateTimeOptionsWithFormat extends DateTimeOptions {\n  /**\n   * Specify a {@link https://momentjs.com/docs/#/displaying/format | momentjs} format to\n   * use a custom formatting pattern of the date and time value. If no format is set,\n   * then {@link DEFAULT_DATE_TIME_FORMAT} is used.\n   */\n  format?: string;\n\n  /**\n   * Set this value to `true` if you want to include milliseconds when formatting date and time\n   * values in the default {@link DEFAULT_DATE_TIME_FORMAT} format.\n   */\n  defaultWithMS?: boolean;\n}\n\ntype DateTimeFormatter<T extends DateTimeOptions = DateTimeOptions> = (dateInUtc: DateTimeInput, options?: T) => string;\n\n/**\n * Helper function to format date and time according to the specified options. If no options\n * are supplied, then default values are used. For more details, see {@link DateTimeOptionsWithFormat}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormat: DateTimeFormatter<DateTimeOptionsWithFormat> = (dateInUtc, options?) =>\n  toTz(dateInUtc, getTimeZone(options)).format(getFormat(options));\n\n/**\n * Helper function to format date and time according to the standard ISO format e.g. 2013-02-04T22:44:30.652Z.\n * If no options are supplied, then default values are used. For more details, see {@link DateTimeOptionsWithFormat}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormatISO: DateTimeFormatter = (dateInUtc, options?) =>\n  toTz(dateInUtc, getTimeZone(options)).format();\n\n/**\n * Helper function to return elapsed time since passed date. The returned value will be formatted\n * in a human readable format e.g. 4 years ago. If no options are supplied, then default values are used.\n * For more details, see {@link DateTimeOptions}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormatTimeAgo: DateTimeFormatter = (dateInUtc, options?) =>\n  toTz(dateInUtc, getTimeZone(options)).fromNow();\n\n/**\n * Helper function to format date and time according to the Grafana default formatting, but it\n * also appends the time zone abbreviation at the end e.g. 2020-05-20 13:37:00 CET. If no options\n * are supplied, then default values are used. For more details please see {@link DateTimeOptions}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormatWithAbbrevation: DateTimeFormatter = (dateInUtc, options?) =>\n  toTz(dateInUtc, getTimeZone(options)).format(`${DEFAULT_DATE_TIME_FORMAT} z`);\n\n/**\n * Helper function to return only the time zone abbreviation for a given date and time value. If no options\n * are supplied, then default values are used. For more details please see {@link DateTimeOptions}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const timeZoneAbbrevation: DateTimeFormatter = (dateInUtc, options?) =>\n  toTz(dateInUtc, getTimeZone(options)).format('z');\n\nconst getFormat = <T extends DateTimeOptionsWithFormat>(options?: T): string => {\n  if (options?.defaultWithMS) {\n    return options?.format ?? MS_DATE_TIME_FORMAT;\n  }\n  return options?.format ?? DEFAULT_DATE_TIME_FORMAT;\n};\n\nconst toTz = (dateInUtc: DateTimeInput, timeZone: TimeZone): Moment => {\n  const date = dateInUtc as MomentInput;\n  const zone = moment.tz.zone(timeZone);\n\n  if (zone && zone.name) {\n    return moment.utc(date).tz(zone.name);\n  }\n\n  switch (timeZone) {\n    case 'utc':\n      return moment.utc(date);\n    default:\n      return moment.utc(date).local();\n  }\n};\n","export const DEFAULT_DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\nexport const MS_DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSS';\n","/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */\nimport moment, { MomentInput } from 'moment-timezone';\nimport { DateTimeInput, DateTime, isDateTime } from './moment_wrapper';\nimport { DateTimeOptions, getTimeZone } from './common';\nimport { parse, isValid } from './datemath';\nimport { lowerCase } from 'lodash';\n\n/**\n * The type that describes options that can be passed when parsing a date and time value.\n * @public\n */\nexport interface DateTimeOptionsWhenParsing extends DateTimeOptions {\n  /**\n   * If the input is a Grafana quick date, e.g. now-6h, then you can specify this to control\n   * whether the last part of the date and time value is included or excluded.\n   *\n   * Example: now-6h and the current time is 12:20:00 if roundUp is set to true\n   * the returned DateTime value will be 06:00:00.\n   */\n  roundUp?: boolean;\n}\n\ntype DateTimeParser<T extends DateTimeOptions = DateTimeOptions> = (value: DateTimeInput, options?: T) => DateTime;\n\n/**\n * Helper function to parse a number, text or Date to a DateTime value. If a timeZone is supplied the incoming value\n * is parsed with that timeZone as a base. The only exception to this is if the passed value is in a UTC-based\n * format. Then it will use UTC as the base. Examples on UTC-based values are Unix epoch and ISO formatted strings.\n *\n * It can also parse the Grafana quick date and time format, e.g. now-6h will be parsed as Date.now() - 6 hours and\n * returned as a valid DateTime value.\n *\n * If no options are supplied, then default values are used. For more details please see {@link DateTimeOptions}.\n *\n * @param value - should be a parsable date and time value\n * @param options\n *\n * @public\n */\nexport const dateTimeParse: DateTimeParser<DateTimeOptionsWhenParsing> = (value, options?): DateTime => {\n  if (isDateTime(value)) {\n    return value;\n  }\n\n  if (typeof value === 'string') {\n    return parseString(value, options);\n  }\n\n  return parseOthers(value, options);\n};\n\nconst parseString = (value: string, options?: DateTimeOptionsWhenParsing): DateTime => {\n  if (value.indexOf('now') !== -1) {\n    if (!isValid(value)) {\n      return moment() as DateTime;\n    }\n\n    const parsed = parse(value, options?.roundUp, options?.timeZone);\n    return parsed || (moment() as DateTime);\n  }\n\n  return parseOthers(value, options);\n};\n\nconst parseOthers = (value: DateTimeInput, options?: DateTimeOptionsWhenParsing): DateTime => {\n  const date = value as MomentInput;\n  const timeZone = getTimeZone(options);\n  const zone = moment.tz.zone(timeZone);\n\n  if (zone && zone.name) {\n    return moment.tz(date, zone.name) as DateTime;\n  }\n\n  switch (lowerCase(timeZone)) {\n    case 'utc':\n      return moment.utc(date) as DateTime;\n    default:\n      return moment(date) as DateTime;\n  }\n};\n","import each from 'lodash/each';\nimport groupBy from 'lodash/groupBy';\n\nimport { RawTimeRange, TimeRange, TimeZone } from '../types/time';\n\nimport * as dateMath from './datemath';\nimport { isDateTime } from './moment_wrapper';\nimport { timeZoneAbbrevation, dateTimeFormat, dateTimeFormatTimeAgo } from './formatter';\nimport { dateTimeParse } from './parser';\n\nconst spans: { [key: string]: { display: string; section?: number } } = {\n  s: { display: 'second' },\n  m: { display: 'minute' },\n  h: { display: 'hour' },\n  d: { display: 'day' },\n  w: { display: 'week' },\n  M: { display: 'month' },\n  y: { display: 'year' },\n};\n\nconst rangeOptions = [\n  { from: 'now/d', to: 'now/d', display: 'Today', section: 2 },\n  { from: 'now/d', to: 'now', display: 'Today so far', section: 2 },\n  { from: 'now/w', to: 'now/w', display: 'This week', section: 2 },\n  { from: 'now/w', to: 'now', display: 'This week so far', section: 2 },\n  { from: 'now/M', to: 'now/M', display: 'This month', section: 2 },\n  { from: 'now/M', to: 'now', display: 'This month so far', section: 2 },\n  { from: 'now/y', to: 'now/y', display: 'This year', section: 2 },\n  { from: 'now/y', to: 'now', display: 'This year so far', section: 2 },\n\n  { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday', section: 1 },\n  {\n    from: 'now-2d/d',\n    to: 'now-2d/d',\n    display: 'Day before yesterday',\n    section: 1,\n  },\n  {\n    from: 'now-7d/d',\n    to: 'now-7d/d',\n    display: 'This day last week',\n    section: 1,\n  },\n  { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week', section: 1 },\n  { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month', section: 1 },\n  { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year', section: 1 },\n\n  { from: 'now-5m', to: 'now', display: 'Last 5 minutes', section: 3 },\n  { from: 'now-15m', to: 'now', display: 'Last 15 minutes', section: 3 },\n  { from: 'now-30m', to: 'now', display: 'Last 30 minutes', section: 3 },\n  { from: 'now-1h', to: 'now', display: 'Last 1 hour', section: 3 },\n  { from: 'now-3h', to: 'now', display: 'Last 3 hours', section: 3 },\n  { from: 'now-6h', to: 'now', display: 'Last 6 hours', section: 3 },\n  { from: 'now-12h', to: 'now', display: 'Last 12 hours', section: 3 },\n  { from: 'now-24h', to: 'now', display: 'Last 24 hours', section: 3 },\n  { from: 'now-2d', to: 'now', display: 'Last 2 days', section: 0 },\n  { from: 'now-7d', to: 'now', display: 'Last 7 days', section: 0 },\n  { from: 'now-30d', to: 'now', display: 'Last 30 days', section: 0 },\n  { from: 'now-90d', to: 'now', display: 'Last 90 days', section: 0 },\n  { from: 'now-6M', to: 'now', display: 'Last 6 months', section: 0 },\n  { from: 'now-1y', to: 'now', display: 'Last 1 year', section: 0 },\n  { from: 'now-2y', to: 'now', display: 'Last 2 years', section: 0 },\n  { from: 'now-5y', to: 'now', display: 'Last 5 years', section: 0 },\n];\n\nconst hiddenRangeOptions = [\n  { from: 'now', to: 'now+1m', display: 'Next minute', section: 3 },\n  { from: 'now', to: 'now+5m', display: 'Next 5 minutes', section: 3 },\n  { from: 'now', to: 'now+15m', display: 'Next 15 minutes', section: 3 },\n  { from: 'now', to: 'now+30m', display: 'Next 30 minutes', section: 3 },\n  { from: 'now', to: 'now+1h', display: 'Next hour', section: 3 },\n  { from: 'now', to: 'now+3h', display: 'Next 3 hours', section: 3 },\n  { from: 'now', to: 'now+6h', display: 'Next 6 hours', section: 3 },\n  { from: 'now', to: 'now+12h', display: 'Next 12 hours', section: 3 },\n  { from: 'now', to: 'now+24h', display: 'Next 24 hours', section: 3 },\n  { from: 'now', to: 'now+2d', display: 'Next 2 days', section: 0 },\n  { from: 'now', to: 'now+7d', display: 'Next 7 days', section: 0 },\n  { from: 'now', to: 'now+30d', display: 'Next 30 days', section: 0 },\n  { from: 'now', to: 'now+90d', display: 'Next 90 days', section: 0 },\n  { from: 'now', to: 'now+6M', display: 'Next 6 months', section: 0 },\n  { from: 'now', to: 'now+1y', display: 'Next year', section: 0 },\n  { from: 'now', to: 'now+2y', display: 'Next 2 years', section: 0 },\n  { from: 'now', to: 'now+5y', display: 'Next 5 years', section: 0 },\n];\n\nconst rangeIndex: any = {};\neach(rangeOptions, (frame: any) => {\n  rangeIndex[frame.from + ' to ' + frame.to] = frame;\n});\neach(hiddenRangeOptions, (frame: any) => {\n  rangeIndex[frame.from + ' to ' + frame.to] = frame;\n});\n\nexport function getRelativeTimesList(timepickerSettings: any, currentDisplay: any) {\n  const groups = groupBy(rangeOptions, (option: any) => {\n    option.active = option.display === currentDisplay;\n    return option.section;\n  });\n\n  // _.each(timepickerSettings.time_options, (duration: string) => {\n  //   let info = describeTextRange(duration);\n  //   if (info.section) {\n  //     groups[info.section].push(info);\n  //   }\n  // });\n\n  return groups;\n}\n\n// handles expressions like\n// 5m\n// 5m to now/d\n// now/d to now\n// now/d\n// if no to <expr> then to now is assumed\nexport function describeTextRange(expr: any) {\n  const isLast = expr.indexOf('+') !== 0;\n  if (expr.indexOf('now') === -1) {\n    expr = (isLast ? 'now-' : 'now') + expr;\n  }\n\n  let opt = rangeIndex[expr + ' to now'];\n  if (opt) {\n    return opt;\n  }\n\n  if (isLast) {\n    opt = { from: expr, to: 'now' };\n  } else {\n    opt = { from: 'now', to: expr };\n  }\n\n  const parts = /^now([-+])(\\d+)(\\w)/.exec(expr);\n  if (parts) {\n    const unit = parts[3];\n    const amount = parseInt(parts[2], 10);\n    const span = spans[unit];\n    if (span) {\n      opt.display = isLast ? 'Last ' : 'Next ';\n      opt.display += amount + ' ' + span.display;\n      opt.section = span.section;\n      if (amount > 1) {\n        opt.display += 's';\n      }\n    }\n  } else {\n    opt.display = opt.from + ' to ' + opt.to;\n    opt.invalid = true;\n  }\n\n  return opt;\n}\n\n/**\n * Use this function to get a properly formatted string representation of a {@link @grafana/data:RawTimeRange | range}.\n *\n * @example\n * ```\n * // Prints \"2\":\n * console.log(add(1,1));\n * ```\n * @category TimeUtils\n * @param range - a time range (usually specified by the TimePicker)\n * @alpha\n */\nexport function describeTimeRange(range: RawTimeRange, timeZone?: TimeZone): string {\n  const option = rangeIndex[range.from.toString() + ' to ' + range.to.toString()];\n\n  if (option) {\n    return option.display;\n  }\n\n  const options = { timeZone };\n\n  if (isDateTime(range.from) && isDateTime(range.to)) {\n    return dateTimeFormat(range.from, options) + ' to ' + dateTimeFormat(range.to, options);\n  }\n\n  if (isDateTime(range.from)) {\n    const parsed = dateMath.parse(range.to, true, 'utc');\n    return parsed ? dateTimeFormat(range.from, options) + ' to ' + dateTimeFormatTimeAgo(parsed, options) : '';\n  }\n\n  if (isDateTime(range.to)) {\n    const parsed = dateMath.parse(range.from, false, 'utc');\n    return parsed ? dateTimeFormatTimeAgo(parsed, options) + ' to ' + dateTimeFormat(range.to, options) : '';\n  }\n\n  if (range.to.toString() === 'now') {\n    const res = describeTextRange(range.from);\n    return res.display;\n  }\n\n  return range.from.toString() + ' to ' + range.to.toString();\n}\n\nexport const isValidTimeSpan = (value: string) => {\n  if (value.indexOf('$') === 0 || value.indexOf('+$') === 0) {\n    return true;\n  }\n\n  const info = describeTextRange(value);\n  return info.invalid !== true;\n};\n\nexport const describeTimeRangeAbbrevation = (range: TimeRange, timeZone?: TimeZone) => {\n  if (isDateTime(range.from)) {\n    return timeZoneAbbrevation(range.from, { timeZone });\n  }\n  const parsed = dateMath.parse(range.from, true);\n  return parsed ? timeZoneAbbrevation(parsed, { timeZone }) : '';\n};\n\nexport const convertRawToRange = (raw: RawTimeRange, timeZone?: TimeZone): TimeRange => {\n  const from = dateTimeParse(raw.from, { roundUp: false, timeZone });\n  const to = dateTimeParse(raw.to, { roundUp: true, timeZone });\n\n  if (dateMath.isMathString(raw.from) || dateMath.isMathString(raw.to)) {\n    return { from, to, raw };\n  }\n\n  return { from, to, raw: { from, to } };\n};\n","import { TimeZone } from '../types';\nimport { getTimeZone } from './common';\n\nexport const timeZoneFormatUserFriendly = (timeZone: TimeZone | undefined) => {\n  switch (getTimeZone({ timeZone })) {\n    case 'browser':\n      return 'Local browser time';\n    case 'utc':\n      return 'UTC';\n    default:\n      return timeZone;\n  }\n};\n\n// List taken from https://stackoverflow.com/questions/38399465/how-to-get-list-of-all-timezones-in-javascript\nexport const getTimeZoneGroups = () => {\n  const europeZones = [\n    'Europe/Amsterdam',\n    'Europe/Andorra',\n    'Europe/Astrakhan',\n    'Europe/Athens',\n    'Europe/Belgrade',\n    'Europe/Berlin',\n    'Europe/Brussels',\n    'Europe/Bucharest',\n    'Europe/Budapest',\n    'Europe/Chisinau',\n    'Europe/Copenhagen',\n    'Europe/Dublin',\n    'Europe/Gibraltar',\n    'Europe/Helsinki',\n    'Europe/Istanbul',\n    'Europe/Kaliningrad',\n    'Europe/Kiev',\n    'Europe/Kirov',\n    'Europe/Lisbon',\n    'Europe/London',\n    'Europe/Luxembourg',\n    'Europe/Madrid',\n    'Europe/Malta',\n    'Europe/Minsk',\n    'Europe/Monaco',\n    'Europe/Moscow',\n    'Europe/Oslo',\n    'Europe/Paris',\n    'Europe/Prague',\n    'Europe/Riga',\n    'Europe/Rome',\n    'Europe/Samara',\n    'Europe/Saratov',\n    'Europe/Simferopol',\n    'Europe/Sofia',\n    'Europe/Stockholm',\n    'Europe/Tallinn',\n    'Europe/Tirane',\n    'Europe/Ulyanovsk',\n    'Europe/Uzhgorod',\n    'Europe/Vienna',\n    'Europe/Vilnius',\n    'Europe/Volgograd',\n    'Europe/Warsaw',\n    'Europe/Zaporozhye',\n    'Europe/Zurich',\n  ];\n\n  const africaZones = [\n    'Africa/Abidjan',\n    'Africa/Accra',\n    'Africa/Algiers',\n    'Africa/Bissau',\n    'Africa/Cairo',\n    'Africa/Casablanca',\n    'Africa/Ceuta',\n    'Africa/El_Aaiun',\n    'Africa/Johannesburg',\n    'Africa/Juba',\n    'Africa/Khartoum',\n    'Africa/Lagos',\n    'Africa/Maputo',\n    'Africa/Monrovia',\n    'Africa/Nairobi',\n    'Africa/Ndjamena',\n    'Africa/Sao_Tome',\n    'Africa/Tripoli',\n    'Africa/Tunis',\n    'Africa/Windhoek',\n  ];\n\n  const asiaZones = [\n    'Asia/Almaty',\n    'Asia/Amman',\n    'Asia/Anadyr',\n    'Asia/Aqtau',\n    'Asia/Aqtobe',\n    'Asia/Ashgabat',\n    'Asia/Atyrau',\n    'Asia/Baghdad',\n    'Asia/Baku',\n    'Asia/Bangkok',\n    'Asia/Barnaul',\n    'Asia/Beirut',\n    'Asia/Bishkek',\n    'Asia/Brunei',\n    'Asia/Chita',\n    'Asia/Choibalsan',\n    'Asia/Colombo',\n    'Asia/Damascus',\n    'Asia/Dhaka',\n    'Asia/Dili',\n    'Asia/Dubai',\n    'Asia/Dushanbe',\n    'Asia/Famagusta',\n    'Asia/Gaza',\n    'Asia/Hebron',\n    'Asia/Ho_Chi_Minh',\n    'Asia/Hong_Kong',\n    'Asia/Hovd',\n    'Asia/Irkutsk',\n    'Asia/Jakarta',\n    'Asia/Jayapura',\n    'Asia/Jerusalem',\n    'Asia/Kabul',\n    'Asia/Kamchatka',\n    'Asia/Karachi',\n    'Asia/Kathmandu',\n    'Asia/Khandyga',\n    'Asia/Kolkata',\n    'Asia/Krasnoyarsk',\n    'Asia/Kuala_Lumpur',\n    'Asia/Kuching',\n    'Asia/Macau',\n    'Asia/Magadan',\n    'Asia/Makassar',\n    'Asia/Manila',\n    'Asia/Nicosia',\n    'Asia/Novokuznetsk',\n    'Asia/Novosibirsk',\n    'Asia/Omsk',\n    'Asia/Oral',\n    'Asia/Pontianak',\n    'Asia/Pyongyang',\n    'Asia/Qatar',\n    'Asia/Qostanay',\n    'Asia/Qyzylorda',\n    'Asia/Riyadh',\n    'Asia/Sakhalin',\n    'Asia/Samarkand',\n    'Asia/Seoul',\n    'Asia/Shanghai',\n    'Asia/Singapore',\n    'Asia/Srednekolymsk',\n    'Asia/Taipei',\n    'Asia/Tashkent',\n    'Asia/Tbilisi',\n    'Asia/Tehran',\n    'Asia/Thimphu',\n    'Asia/Tokyo',\n    'Asia/Tomsk',\n    'Asia/Ulaanbaatar',\n    'Asia/Urumqi',\n    'Asia/Ust-Nera',\n    'Asia/Vladivostok',\n    'Asia/Yakutsk',\n    'Asia/Yangon',\n    'Asia/Yekaterinburg',\n    'Asia/Yerevan',\n  ];\n\n  const antarcticaZones = [\n    'Antarctica/Casey',\n    'Antarctica/Davis',\n    'Antarctica/DumontDUrville',\n    'Antarctica/Macquarie',\n    'Antarctica/Mawson',\n    'Antarctica/Palmer',\n    'Antarctica/Rothera',\n    'Antarctica/Syowa',\n    'Antarctica/Troll',\n    'Antarctica/Vostok',\n  ];\n\n  const americaZones = [\n    'America/Adak',\n    'America/Anchorage',\n    'America/Araguaina',\n    'America/Argentina/Buenos_Aires',\n    'America/Argentina/Catamarca',\n    'America/Argentina/Cordoba',\n    'America/Argentina/Jujuy',\n    'America/Argentina/La_Rioja',\n    'America/Argentina/Mendoza',\n    'America/Argentina/Rio_Gallegos',\n    'America/Argentina/Salta',\n    'America/Argentina/San_Juan',\n    'America/Argentina/San_Luis',\n    'America/Argentina/Tucuman',\n    'America/Argentina/Ushuaia',\n    'America/Asuncion',\n    'America/Atikokan',\n    'America/Bahia',\n    'America/Bahia_Banderas',\n    'America/Barbados',\n    'America/Belem',\n    'America/Belize',\n    'America/Blanc-Sablon',\n    'America/Boa_Vista',\n    'America/Bogota',\n    'America/Boise',\n    'America/Cambridge_Bay',\n    'America/Campo_Grande',\n    'America/Cancun',\n    'America/Caracas',\n    'America/Cayenne',\n    'America/Chicago',\n    'America/Chihuahua',\n    'America/Costa_Rica',\n    'America/Creston',\n    'America/Cuiaba',\n    'America/Curacao',\n    'America/Danmarkshavn',\n    'America/Dawson',\n    'America/Dawson_Creek',\n    'America/Denver',\n    'America/Detroit',\n    'America/Edmonton',\n    'America/Eirunepe',\n    'America/El_Salvador',\n    'America/Fort_Nelson',\n    'America/Fortaleza',\n    'America/Glace_Bay',\n    'America/Godthab',\n    'America/Goose_Bay',\n    'America/Grand_Turk',\n    'America/Guatemala',\n    'America/Guayaquil',\n    'America/Guyana',\n    'America/Halifax',\n    'America/Havana',\n    'America/Hermosillo',\n    'America/Indiana/Indianapolis',\n    'America/Indiana/Knox',\n    'America/Indiana/Marengo',\n    'America/Indiana/Petersburg',\n    'America/Indiana/Tell_City',\n    'America/Indiana/Vevay',\n    'America/Indiana/Vincennes',\n    'America/Indiana/Winamac',\n    'America/Inuvik',\n    'America/Iqaluit',\n    'America/Jamaica',\n    'America/Juneau',\n    'America/Kentucky/Louisville',\n    'America/Kentucky/Monticello',\n    'America/La_Paz',\n    'America/Lima',\n    'America/Los_Angeles',\n    'America/Maceio',\n    'America/Managua',\n    'America/Manaus',\n    'America/Martinique',\n    'America/Matamoros',\n    'America/Mazatlan',\n    'America/Menominee',\n    'America/Merida',\n    'America/Metlakatla',\n    'America/Mexico_City',\n    'America/Miquelon',\n    'America/Moncton',\n    'America/Monterrey',\n    'America/Montevideo',\n    'America/Nassau',\n    'America/New_York',\n    'America/Nipigon',\n    'America/Nome',\n    'America/Noronha',\n    'America/North_Dakota/Beulah',\n    'America/North_Dakota/Center',\n    'America/North_Dakota/New_Salem',\n    'America/Ojinaga',\n    'America/Panama',\n    'America/Pangnirtung',\n    'America/Paramaribo',\n    'America/Phoenix',\n    'America/Port-au-Prince',\n    'America/Port_of_Spain',\n    'America/Porto_Velho',\n    'America/Puerto_Rico',\n    'America/Punta_Arenas',\n    'America/Rainy_River',\n    'America/Rankin_Inlet',\n    'America/Recife',\n    'America/Regina',\n    'America/Resolute',\n    'America/Rio_Branco',\n    'America/Santarem',\n    'America/Santiago',\n    'America/Santo_Domingo',\n    'America/Sao_Paulo',\n    'America/Scoresbysund',\n    'America/Sitka',\n    'America/St_Johns',\n    'America/Swift_Current',\n    'America/Tegucigalpa',\n    'America/Thule',\n    'America/Thunder_Bay',\n    'America/Tijuana',\n    'America/Toronto',\n    'America/Vancouver',\n    'America/Whitehorse',\n    'America/Winnipeg',\n    'America/Yakutat',\n    'America/Yellowknife',\n  ];\n\n  const pacificZones = [\n    'Pacific/Apia',\n    'Pacific/Auckland',\n    'Pacific/Bougainville',\n    'Pacific/Chatham',\n    'Pacific/Chuuk',\n    'Pacific/Easter',\n    'Pacific/Efate',\n    'Pacific/Enderbury',\n    'Pacific/Fakaofo',\n    'Pacific/Fiji',\n    'Pacific/Funafuti',\n    'Pacific/Galapagos',\n    'Pacific/Gambier',\n    'Pacific/Guadalcanal',\n    'Pacific/Guam',\n    'Pacific/Honolulu',\n    'Pacific/Kiritimati',\n    'Pacific/Kosrae',\n    'Pacific/Kwajalein',\n    'Pacific/Majuro',\n    'Pacific/Marquesas',\n    'Pacific/Nauru',\n    'Pacific/Niue',\n    'Pacific/Norfolk',\n    'Pacific/Noumea',\n    'Pacific/Pago_Pago',\n    'Pacific/Palau',\n    'Pacific/Pitcairn',\n    'Pacific/Pohnpei',\n    'Pacific/Port_Moresby',\n    'Pacific/Rarotonga',\n    'Pacific/Tahiti',\n    'Pacific/Tarawa',\n    'Pacific/Tongatapu',\n    'Pacific/Wake',\n    'Pacific/Wallis',\n  ];\n\n  const australiaZones = [\n    'Australia/Adelaide',\n    'Australia/Brisbane',\n    'Australia/Broken_Hill',\n    'Australia/Currie',\n    'Australia/Darwin',\n    'Australia/Eucla',\n    'Australia/Hobart',\n    'Australia/Lindeman',\n    'Australia/Lord_Howe',\n    'Australia/Melbourne',\n    'Australia/Perth',\n    'Australia/Sydney',\n  ];\n\n  const atlanticZones = [\n    'Atlantic/Azores',\n    'Atlantic/Bermuda',\n    'Atlantic/Canary',\n    'Atlantic/Cape_Verde',\n    'Atlantic/Faroe',\n    'Atlantic/Madeira',\n    'Atlantic/Reykjavik',\n    'Atlantic/South_Georgia',\n    'Atlantic/Stanley',\n  ];\n\n  const indianZones = [\n    'Indian/Chagos',\n    'Indian/Christmas',\n    'Indian/Cocos',\n    'Indian/Kerguelen',\n    'Indian/Mahe',\n    'Indian/Maldives',\n    'Indian/Mauritius',\n    'Indian/Reunion',\n  ];\n\n  return [\n    { label: 'Africa', options: africaZones },\n    { label: 'America', options: americaZones },\n    { label: 'Antarctica', options: antarcticaZones },\n    { label: 'Asia', options: asiaZones },\n    { label: 'Atlantic', options: atlanticZones },\n    { label: 'Australia', options: australiaZones },\n    { label: 'Europe', options: europeZones },\n    { label: 'Indian', options: indianZones },\n    { label: 'Pacific', options: pacificZones },\n  ];\n};\n","// Names are too general to export globally\nimport * as dateMath from './datemath';\nimport * as rangeUtil from './rangeutil';\nexport * from './moment_wrapper';\nexport * from './timezones';\nexport * from './formats';\nexport * from './formatter';\nexport * from './parser';\nexport { dateMath, rangeUtil };\nexport { DateTimeOptions, setTimeZoneResolver, TimeZoneResolver } from './common';\n","import { useEffect } from 'react';\nimport { useDebounce } from 'react-use';\nimport { SearchSrv } from 'app/core/services/search_srv';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { FETCH_RESULTS, FETCH_ITEMS, TOGGLE_SECTION, SEARCH_START, FETCH_ITEMS_START } from '../reducers/actionTypes';\nimport { DashboardSection, UseSearch } from '../types';\nimport { hasId, getParsedQuery } from '../utils';\n\nconst searchSrv = new SearchSrv();\n\n/**\n * Base hook for search functionality.\n * Returns state and dispatch, among others, from 'reducer' param, so it can be\n * further extended.\n * @param query\n * @param reducer - return result of useReducer\n * @param params - custom params\n */\nexport const useSearch: UseSearch = (query, reducer, params = {}) => {\n  const { queryParsing } = params;\n  const [state, dispatch] = reducer;\n\n  const search = () => {\n    dispatch({ type: SEARCH_START });\n    const parsedQuery = getParsedQuery(query, queryParsing);\n    searchSrv.search(parsedQuery).then(results => {\n      dispatch({ type: FETCH_RESULTS, payload: results });\n    });\n  };\n\n  // Set loading state before debounced search\n  useEffect(() => {\n    dispatch({ type: SEARCH_START });\n  }, [query.tag, query.sort, query.starred, query.layout]);\n\n  useDebounce(search, 300, [query, queryParsing]);\n\n  const onToggleSection = (section: DashboardSection) => {\n    if (hasId(section.title) && !section.items.length) {\n      dispatch({ type: FETCH_ITEMS_START, payload: section.id });\n      backendSrv.search({ folderIds: [section.id] }).then(items => {\n        dispatch({ type: FETCH_ITEMS, payload: { section, items } });\n        dispatch({ type: TOGGLE_SECTION, payload: section });\n      });\n    } else {\n      dispatch({ type: TOGGLE_SECTION, payload: section });\n    }\n  };\n\n  return { state, dispatch, onToggleSection };\n};\n","import { GrafanaThemeCommons } from '@grafana/data';\n\nexport const commonColorsPalette = {\n  // New greys palette used by next-gen form elements\n  gray98: '#f7f8fa',\n  gray97: '#f1f5f9',\n  gray95: '#e9edf2',\n  gray90: '#dce1e6',\n  gray85: '#c7d0d9',\n  gray70: '#9fa7b3',\n  gray60: '#7b8087',\n  gray33: '#464c54',\n  gray25: '#2c3235',\n  gray15: '#202226',\n  gray10: '#141619',\n  gray05: '#0b0c0e',\n\n  // New blues palette used by next-gen form elements\n  blue95: '#5794f2', // blue95\n  blue85: '#33a2e5', // blueText\n  blue80: '#3274d9', // blue80\n  blue77: '#1f60c4', // blue77\n\n  // New reds palette used by next-gen form elements\n  red88: '#e02f44',\n};\n\nconst SPACING_BASE = 8;\n\nconst theme: GrafanaThemeCommons = {\n  name: 'Grafana Default',\n  typography: {\n    fontFamily: {\n      sansSerif: \"'Roboto', 'Helvetica Neue', Arial, sans-serif\",\n      monospace: \"Menlo, Monaco, Consolas, 'Courier New', monospace\",\n    },\n    size: {\n      base: '14px',\n      xs: '10px',\n      sm: '12px',\n      md: '14px',\n      lg: '18px',\n    },\n    heading: {\n      h1: '28px',\n      h2: '24px',\n      h3: '21px',\n      h4: '18px',\n      h5: '16px',\n      h6: '14px',\n    },\n    weight: {\n      light: 300,\n      regular: 400,\n      semibold: 500,\n      bold: 600,\n    },\n    lineHeight: {\n      xs: 1,\n      sm: 1.1,\n      md: 1.5,\n      lg: 2,\n    },\n    link: {\n      decoration: 'none',\n      hoverDecoration: 'none',\n    },\n  },\n  breakpoints: {\n    xs: '0',\n    sm: '544px',\n    md: '769px', // 1 more than regular ipad in portrait\n    lg: '992px',\n    xl: '1200px',\n    xxl: '1440px',\n  },\n  spacing: {\n    insetSquishMd: '4px 8px',\n    d: '16px',\n    xxs: '2px',\n    xs: '4px',\n    sm: '8px',\n    md: '16px',\n    lg: '24px',\n    xl: '32px',\n    gutter: '30px',\n\n    // Next-gen forms spacing variables\n    // TODO: Move variables definition to respective components when implementing\n    formSpacingBase: SPACING_BASE,\n    formMargin: `${SPACING_BASE * 4}px`,\n    formFieldsetMargin: `${SPACING_BASE * 2}px`,\n    formInputHeight: SPACING_BASE * 4,\n    formButtonHeight: SPACING_BASE * 4,\n    formInputPaddingHorizontal: `${SPACING_BASE}px`,\n\n    // Used for icons do define spacing between icon and input field\n    // Applied on the right(prefix) or left(suffix)\n    formInputAffixPaddingHorizontal: `${SPACING_BASE / 2}px`,\n\n    formInputMargin: `${SPACING_BASE * 2}px`,\n    formLabelPadding: '0 0 0 2px',\n    formLabelMargin: `0 0 ${SPACING_BASE / 2 + 'px'} 0`,\n    formValidationMessagePadding: '4px 8px',\n    formValidationMessageMargin: '4px 0 0 0',\n    inlineFormMargin: '4px',\n  },\n  border: {\n    radius: {\n      sm: '2px',\n      md: '3px',\n      lg: '5px',\n    },\n    width: {\n      sm: '1px',\n    },\n  },\n  height: {\n    sm: 24,\n    md: 32,\n    lg: 48,\n  },\n  panelPadding: 8,\n  panelHeaderHeight: 28,\n  zIndex: {\n    navbarFixed: 1000,\n    sidemenu: 1020,\n    dropdown: 1030,\n    typeahead: 1030,\n    tooltip: 1040,\n    modalBackdrop: 1050,\n    modal: 1060,\n  },\n};\n\nexport default theme;\n","import defaultTheme, { commonColorsPalette } from './default';\nimport { GrafanaThemeType, GrafanaTheme } from '@grafana/data';\n\nconst basicColors = {\n  ...commonColorsPalette,\n  black: '#000000',\n  white: '#ffffff',\n  dark1: '#141414',\n  dark2: '#161719',\n  dark3: '#1f1f20',\n  dark4: '#212124',\n  dark5: '#222426',\n  dark6: '#262628',\n  dark7: '#292a2d',\n  dark8: '#2f2f32',\n  dark9: '#343436',\n  dark10: '#424345',\n  gray1: '#555555',\n  gray2: '#8e8e8e',\n  gray3: '#b3b3b3',\n  gray4: '#d8d9da',\n  gray5: '#ececec',\n  gray6: '#f4f5f8', // not used in dark theme\n  gray7: '#fbfbfb', // not used in dark theme\n  redBase: '#e02f44',\n  redShade: '#c4162a',\n  greenBase: '#299c46',\n  greenShade: '#23843b',\n  red: '#d44a3a',\n  yellow: '#ecbb13',\n  purple: '#9933cc',\n  variable: '#32d1df',\n  orange: '#eb7b18',\n  orangeDark: '#ff780a',\n};\n\nconst backgrounds = {\n  bg1: basicColors.gray10,\n  bg2: basicColors.gray15,\n  bg3: basicColors.gray25,\n  dashboardBg: basicColors.gray05,\n  bgBlue1: basicColors.blue80,\n  bgBlue2: basicColors.blue77,\n};\n\nconst borders = {\n  border1: basicColors.gray15,\n  border2: basicColors.gray25,\n  border3: basicColors.gray33,\n};\n\nconst textColors = {\n  textStrong: basicColors.gray98,\n  textHeading: basicColors.gray4,\n  text: basicColors.gray85,\n  textSemiWeak: basicColors.gray70,\n  textWeak: basicColors.gray60,\n  textFaint: basicColors.gray33,\n  textBlue: basicColors.blue85,\n};\n\nconst form = {\n  // Next-gen forms functional colors\n  formLabel: textColors.textSemiWeak,\n  formDescription: basicColors.gray60,\n  formInputBg: basicColors.gray05,\n  formInputBgDisabled: basicColors.gray10,\n  formInputBorder: borders.border2,\n  formInputBorderHover: basicColors.gray33,\n  formInputBorderActive: basicColors.blue95,\n  formInputBorderInvalid: basicColors.red88,\n  formInputPlaceholderText: textColors.textFaint,\n  formInputText: basicColors.gray85,\n  formInputDisabledText: basicColors.gray70,\n  formFocusOutline: basicColors.blue77,\n  formValidationMessageText: basicColors.white,\n  formValidationMessageBg: basicColors.red88,\n  formSwitchBg: basicColors.gray25,\n  formSwitchBgActive: basicColors.blue95,\n  formSwitchBgHover: basicColors.gray33,\n  formSwitchBgActiveHover: basicColors.blue80,\n  formSwitchBgDisabled: basicColors.gray25,\n  formSwitchDot: basicColors.gray15,\n  formCheckboxBgChecked: basicColors.blue95,\n  formCheckboxBgCheckedHover: basicColors.blue80,\n  formCheckboxCheckmark: basicColors.gray25,\n};\n\nconst darkTheme: GrafanaTheme = {\n  ...defaultTheme,\n  type: GrafanaThemeType.Dark,\n  isDark: true,\n  isLight: false,\n  name: 'Grafana Dark',\n  palette: {\n    ...basicColors,\n    brandPrimary: basicColors.orange,\n    brandSuccess: basicColors.greenBase,\n    brandWarning: basicColors.orange,\n    brandDanger: basicColors.redBase,\n    queryRed: basicColors.redBase,\n    queryGreen: '#74e680',\n    queryPurple: '#fe85fc',\n    queryOrange: basicColors.orange,\n    online: basicColors.greenBase,\n    warn: '#f79520',\n    critical: basicColors.redBase,\n  },\n  colors: {\n    ...backgrounds,\n    ...borders,\n    ...form,\n    ...textColors,\n\n    bodyBg: backgrounds.bg1,\n    panelBg: backgrounds.bg1,\n    pageHeaderBg: backgrounds.bg2,\n    pageHeaderBorder: borders.border1,\n    panelBorder: borders.border1,\n\n    dropdownBg: form.formInputBg,\n    dropdownShadow: basicColors.black,\n    dropdownOptionHoverBg: backgrounds.bg2,\n\n    link: basicColors.gray4,\n    linkDisabled: basicColors.gray2,\n    linkHover: basicColors.white,\n    linkExternal: basicColors.blue85,\n  },\n  shadows: {\n    listItem: 'none',\n  },\n};\n\nexport default darkTheme;\n","import defaultTheme, { commonColorsPalette } from './default';\nimport { GrafanaThemeType, GrafanaTheme } from '@grafana/data';\n\nconst basicColors = {\n  ...commonColorsPalette,\n  black: '#000000',\n  white: '#ffffff',\n  dark1: '#1e2028',\n  dark2: '#41444b',\n  dark3: '#303133', // not used in light theme\n  dark4: '#35373f', // not used in light theme\n  dark5: '#41444b', // not used in light theme\n  dark6: '#41444b', // not used in light theme\n  dark7: '#41444b', // not used in light theme\n  dark8: '#2f2f32', // not used in light theme\n  dark9: '#343436', // not used in light theme\n  dark10: '#424345', // not used in light theme\n  gray1: '#52545c',\n  gray2: '#767980',\n  gray3: '#acb6bf',\n  gray4: '#c7d0d9',\n  gray5: '#dde4ed',\n  gray6: '#e9edf2', // same as gray95\n  gray7: '#f7f8fa', // same as gray98\n  redBase: '#e02f44',\n  redShade: '#c4162a',\n  greenBase: '#3eb15b',\n  greenShade: '#369b4f',\n  red: '#d44939',\n  yellow: '#ff851b',\n  purple: '#9954bb',\n  orange: '#ff7941',\n  orangeDark: '#ed5700',\n};\n\nconst backgrounds = {\n  bg1: basicColors.white,\n  bg2: basicColors.gray97,\n  bg3: basicColors.gray90,\n  dashboardBg: basicColors.gray98,\n  bgBlue1: basicColors.blue80,\n  bgBlue2: basicColors.blue77,\n};\n\nconst borders = {\n  border1: basicColors.gray90,\n  border2: basicColors.gray85,\n  border3: basicColors.gray70,\n};\n\nconst textColors = {\n  // Text colors\n  textStrong: basicColors.gray15,\n  text: basicColors.gray33,\n  textSemiWeak: basicColors.gray33,\n  textWeak: basicColors.gray60,\n  textFaint: basicColors.gray70,\n  textBlue: basicColors.blue85,\n};\n\nconst form = {\n  formLabel: textColors.text,\n  formDescription: textColors.textWeak,\n  formLegend: basicColors.gray25,\n  formInputBg: basicColors.white,\n  formInputBgDisabled: basicColors.gray95,\n  formInputBorder: basicColors.gray85,\n  formInputBorderHover: basicColors.gray70,\n  formInputBorderActive: basicColors.blue77,\n  formInputBorderInvalid: basicColors.red88,\n  formInputText: textColors.text,\n  formInputPlaceholderText: textColors.textFaint,\n  formInputDisabledText: textColors.textWeak,\n  formFocusOutline: basicColors.blue95,\n  formValidationMessageText: basicColors.white,\n  formValidationMessageBg: basicColors.red88,\n  formSwitchBg: basicColors.gray85,\n  formSwitchBgActive: basicColors.blue77,\n  formSwitchBgHover: basicColors.gray3,\n  formSwitchBgActiveHover: basicColors.blue80,\n  formSwitchBgDisabled: basicColors.gray4,\n  formSwitchDot: basicColors.white,\n  formCheckboxBgChecked: basicColors.blue77,\n  formCheckboxBgCheckedHover: basicColors.blue80,\n  formCheckboxCheckmark: basicColors.white,\n};\n\nconst lightTheme: GrafanaTheme = {\n  ...defaultTheme,\n  type: GrafanaThemeType.Light,\n  isDark: false,\n  isLight: true,\n  name: 'Grafana Light',\n  palette: {\n    ...basicColors,\n    brandPrimary: basicColors.orange,\n    brandSuccess: basicColors.greenBase,\n    brandWarning: basicColors.orange,\n    brandDanger: basicColors.redBase,\n    queryRed: basicColors.redBase,\n    queryGreen: basicColors.greenBase,\n    queryPurple: basicColors.purple,\n    queryOrange: basicColors.orange,\n    online: basicColors.greenShade,\n    warn: '#f79520',\n    critical: basicColors.redShade,\n  },\n  colors: {\n    ...backgrounds,\n    ...borders,\n    ...textColors,\n    ...form,\n\n    bodyBg: backgrounds.bg1,\n    panelBg: backgrounds.bg1,\n    pageHeaderBg: backgrounds.bg2,\n    pageHeaderBorder: borders.border1,\n    panelBorder: borders.border1,\n\n    dropdownBg: form.formInputBg,\n    dropdownShadow: basicColors.gray3,\n    dropdownOptionHoverBg: backgrounds.bg2,\n\n    // Link colors\n    link: textColors.text,\n    linkDisabled: textColors.textWeak,\n    linkHover: textColors.textStrong,\n    linkExternal: basicColors.blue85,\n    textHeading: basicColors.gray25,\n  },\n  shadows: {\n    listItem: 'none',\n  },\n};\n\nexport default lightTheme;\n","import darkTheme from './dark';\nimport lightTheme from './light';\nimport { GrafanaTheme } from '@grafana/data';\n\nlet themeMock: ((name?: string) => GrafanaTheme) | null;\n\nexport const getTheme = (name?: string) =>\n  (themeMock && themeMock(name)) || (name === 'light' ? lightTheme : darkTheme);\n\nexport const mockTheme = (mock: (name?: string) => GrafanaTheme) => {\n  themeMock = mock;\n  return () => {\n    themeMock = null;\n  };\n};\n","// Services & Utils\nimport { getBackendSrv } from '@grafana/runtime';\nimport { createSuccessNotification } from 'app/core/copy/appNotification';\n// Actions\nimport { loadPluginDashboards } from '../../plugins/state/actions';\nimport { loadDashboardPermissions, panelModelAndPluginReady, setPanelAngularComponent } from './reducers';\nimport { notifyApp } from 'app/core/actions';\nimport { loadPanelPlugin } from 'app/features/plugins/state/actions';\n// Types\nimport { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel, ThunkResult } from 'app/types';\nimport { PanelModel } from './PanelModel';\n\nexport function getDashboardPermissions(id: number): ThunkResult<void> {\n  return async dispatch => {\n    const permissions = await getBackendSrv().get(`/api/dashboards/id/${id}/permissions`);\n    dispatch(loadDashboardPermissions(permissions));\n  };\n}\n\nfunction toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {\n  return {\n    userId: item.userId,\n    teamId: item.teamId,\n    role: item.role,\n    permission: item.permission,\n  };\n}\n\nexport function updateDashboardPermission(\n  dashboardId: number,\n  itemToUpdate: DashboardAcl,\n  level: PermissionLevel\n): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    const { dashboard } = getStore();\n    const itemsToUpdate = [];\n\n    for (const item of dashboard.permissions) {\n      if (item.inherited) {\n        continue;\n      }\n\n      const updated = toUpdateItem(item);\n\n      // if this is the item we want to update, update it's permission\n      if (itemToUpdate === item) {\n        updated.permission = level;\n      }\n\n      itemsToUpdate.push(updated);\n    }\n\n    await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });\n    await dispatch(getDashboardPermissions(dashboardId));\n  };\n}\n\nexport function removeDashboardPermission(dashboardId: number, itemToDelete: DashboardAcl): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    const dashboard = getStore().dashboard;\n    const itemsToUpdate = [];\n\n    for (const item of dashboard.permissions) {\n      if (item.inherited || item === itemToDelete) {\n        continue;\n      }\n      itemsToUpdate.push(toUpdateItem(item));\n    }\n\n    await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });\n    await dispatch(getDashboardPermissions(dashboardId));\n  };\n}\n\nexport function addDashboardPermission(dashboardId: number, newItem: NewDashboardAclItem): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    const { dashboard } = getStore();\n    const itemsToUpdate = [];\n\n    for (const item of dashboard.permissions) {\n      if (item.inherited) {\n        continue;\n      }\n      itemsToUpdate.push(toUpdateItem(item));\n    }\n\n    itemsToUpdate.push({\n      userId: newItem.userId,\n      teamId: newItem.teamId,\n      role: newItem.role,\n      permission: newItem.permission,\n    });\n\n    await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });\n    await dispatch(getDashboardPermissions(dashboardId));\n  };\n}\n\nexport function importDashboard(data: any, dashboardTitle: string): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().post('/api/dashboards/import', data);\n    dispatch(notifyApp(createSuccessNotification('Dashboard Imported', dashboardTitle)));\n    dispatch(loadPluginDashboards());\n  };\n}\n\nexport function removeDashboard(uri: string): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().delete(`/api/dashboards/${uri}`);\n    dispatch(loadPluginDashboards());\n  };\n}\n\nexport function initDashboardPanel(panel: PanelModel): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    let plugin = getStore().plugins.panels[panel.type];\n\n    if (!plugin) {\n      plugin = await dispatch(loadPanelPlugin(panel.type));\n    }\n\n    if (!panel.plugin) {\n      panel.pluginLoaded(plugin);\n    }\n\n    dispatch(panelModelAndPluginReady({ panelId: panel.id, plugin }));\n  };\n}\n\nexport function changePanelPlugin(panel: PanelModel, pluginId: string): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    // ignore action is no change\n    if (panel.type === pluginId) {\n      return;\n    }\n\n    const store = getStore();\n    let plugin = store.plugins.panels[pluginId];\n\n    if (!plugin) {\n      plugin = await dispatch(loadPanelPlugin(pluginId));\n    }\n\n    // clean up angular component (scope / ctrl state)\n    const angularComponent = store.dashboard.panels[panel.id].angularComponent;\n    if (angularComponent) {\n      angularComponent.destroy();\n      dispatch(setPanelAngularComponent({ panelId: panel.id, angularComponent: null }));\n    }\n\n    panel.changePlugin(plugin);\n\n    dispatch(panelModelAndPluginReady({ panelId: panel.id, plugin }));\n  };\n}\n","import { Field, FieldType, DataFrame } from '../types/dataFrame';\nimport { vectorToArray } from '../vector/vectorToArray';\nimport { Vector, QueryResultMeta } from '../types';\nimport { guessFieldTypeFromNameAndValue, toDataFrameDTO } from './processDataFrame';\nimport { FunctionalVector } from '../vector/FunctionalVector';\n\nexport type ValueConverter<T = any> = (val: any) => T;\n\nconst NOOP: ValueConverter = v => v;\n\nclass ArrayPropertyVector<T = any> implements Vector<T> {\n  converter = NOOP;\n\n  constructor(private source: any[], private prop: string) {}\n\n  get length(): number {\n    return this.source.length;\n  }\n\n  get(index: number): T {\n    return this.converter(this.source[index][this.prop]);\n  }\n\n  toArray(): T[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): T[] {\n    return vectorToArray(this);\n  }\n}\n\n/**\n * The ArrayDataFrame takes an array of objects and presents it as a DataFrame\n *\n * @alpha\n */\nexport class ArrayDataFrame<T = any> extends FunctionalVector<T> implements DataFrame {\n  name?: string;\n  refId?: string;\n  meta?: QueryResultMeta;\n\n  fields: Field[] = [];\n  length = 0;\n\n  constructor(private source: T[], names?: string[]) {\n    super();\n\n    this.length = source.length;\n    const first: any = source.length ? source[0] : {};\n    if (names) {\n      this.fields = names.map(name => {\n        return {\n          name,\n          type: guessFieldTypeFromNameAndValue(name, first[name]),\n          config: {},\n          values: new ArrayPropertyVector(source, name),\n        };\n      });\n    } else {\n      this.setFieldsFromObject(first);\n    }\n  }\n\n  /**\n   * Add a field for each property in the object.  This will guess the type\n   */\n  setFieldsFromObject(obj: any) {\n    this.fields = Object.keys(obj).map(name => {\n      return {\n        name,\n        type: guessFieldTypeFromNameAndValue(name, obj[name]),\n        config: {},\n        values: new ArrayPropertyVector(this.source, name),\n      };\n    });\n  }\n\n  /**\n   * Configure how the object property is passed to the data frame\n   */\n  setFieldType(name: string, type: FieldType, converter?: ValueConverter): Field {\n    let field = this.fields.find(f => f.name === name);\n    if (field) {\n      field.type = type;\n    } else {\n      field = {\n        name,\n        type,\n        config: {},\n        values: new ArrayPropertyVector(this.source, name),\n      };\n      this.fields.push(field);\n    }\n    (field.values as any).converter = converter ?? NOOP;\n    return field;\n  }\n\n  /**\n   * Get an object with a property for each field in the DataFrame\n   */\n  get(idx: number): T {\n    return this.source[idx];\n  }\n\n  /**\n   * The simplified JSON values used in JSON.stringify()\n   */\n  toJSON() {\n    return toDataFrameDTO(this);\n  }\n}\n","// Libraries\nimport { cloneDeep } from 'lodash';\nimport { ReplaySubject, Unsubscribable, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n// Services & Utils\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport kbn from 'app/core/utils/kbn';\nimport templateSrv from 'app/features/templating/template_srv';\nimport { runRequest, preProcessPanelData } from './runRequest';\nimport { runSharedRequest, isSharedDashboardQuery } from '../../../plugins/datasource/dashboard';\n\n// Types\nimport {\n  PanelData,\n  DataQuery,\n  CoreApp,\n  DataQueryRequest,\n  DataSourceApi,\n  DataSourceJsonData,\n  TimeRange,\n  DataTransformerConfig,\n  transformDataFrame,\n  ScopedVars,\n  applyFieldOverrides,\n  DataConfigSource,\n  TimeZone,\n} from '@grafana/data';\n\nexport interface QueryRunnerOptions<\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n  datasource: string | DataSourceApi<TQuery, TOptions>;\n  queries: TQuery[];\n  panelId: number;\n  dashboardId?: number;\n  timezone?: string;\n  timeRange: TimeRange;\n  timeInfo?: string; // String description of time range for display\n  maxDataPoints: number;\n  minInterval: string | undefined | null;\n  scopedVars?: ScopedVars;\n  cacheTimeout?: string;\n  delayStateNotification?: number; // default 100ms.\n  transformations?: DataTransformerConfig[];\n}\n\nlet counter = 100;\nfunction getNextRequestId() {\n  return 'Q' + counter++;\n}\n\nexport interface GetDataOptions {\n  withTransforms: boolean;\n  withFieldConfig: boolean;\n}\n\nexport class PanelQueryRunner {\n  private subject?: ReplaySubject<PanelData>;\n  private subscription?: Unsubscribable;\n  private lastResult?: PanelData;\n  private dataConfigSource: DataConfigSource;\n  private timeZone?: TimeZone;\n\n  constructor(dataConfigSource: DataConfigSource) {\n    this.subject = new ReplaySubject(1);\n    this.dataConfigSource = dataConfigSource;\n  }\n\n  /**\n   * Returns an observable that subscribes to the shared multi-cast subject (that reply last result).\n   */\n  getData(options: GetDataOptions): Observable<PanelData> {\n    const { withFieldConfig, withTransforms } = options;\n\n    return this.subject.pipe(\n      map((data: PanelData) => {\n        let processedData = data;\n\n        // Apply transformation\n        if (withTransforms) {\n          const transformations = this.dataConfigSource.getTransformations();\n\n          if (transformations && transformations.length > 0) {\n            processedData = {\n              ...processedData,\n              series: transformDataFrame(transformations, data.series),\n            };\n          }\n        }\n\n        if (withFieldConfig) {\n          // Apply field defaults & overrides\n          const fieldConfig = this.dataConfigSource.getFieldOverrideOptions();\n          if (fieldConfig) {\n            processedData = {\n              ...processedData,\n              series: applyFieldOverrides({\n                timeZone: this.timeZone,\n                autoMinMax: true,\n                data: processedData.series,\n                ...fieldConfig,\n              }),\n            };\n          }\n        }\n\n        return processedData;\n      })\n    );\n  }\n\n  async run(options: QueryRunnerOptions) {\n    const {\n      queries,\n      timezone,\n      datasource,\n      panelId,\n      dashboardId,\n      timeRange,\n      timeInfo,\n      cacheTimeout,\n      maxDataPoints,\n      scopedVars,\n      minInterval,\n    } = options;\n\n    this.timeZone = timezone;\n\n    if (isSharedDashboardQuery(datasource)) {\n      this.pipeToSubject(runSharedRequest(options));\n      return;\n    }\n\n    const request: DataQueryRequest = {\n      app: CoreApp.Dashboard,\n      requestId: getNextRequestId(),\n      timezone,\n      panelId,\n      dashboardId,\n      range: timeRange,\n      timeInfo,\n      interval: '',\n      intervalMs: 0,\n      targets: cloneDeep(queries),\n      maxDataPoints: maxDataPoints,\n      scopedVars: scopedVars || {},\n      cacheTimeout,\n      startTime: Date.now(),\n    };\n\n    // Add deprecated property\n    (request as any).rangeRaw = timeRange.raw;\n\n    try {\n      const ds = await getDataSource(datasource, request.scopedVars);\n\n      // Attach the datasource name to each query\n      request.targets = request.targets.map(query => {\n        if (!query.datasource) {\n          query.datasource = ds.name;\n        }\n        return query;\n      });\n\n      const lowerIntervalLimit = minInterval ? templateSrv.replace(minInterval, request.scopedVars) : ds.interval;\n      const norm = kbn.calculateInterval(timeRange, maxDataPoints, lowerIntervalLimit);\n\n      // make shallow copy of scoped vars,\n      // and add built in variables interval and interval_ms\n      request.scopedVars = Object.assign({}, request.scopedVars, {\n        __interval: { text: norm.interval, value: norm.interval },\n        __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n      });\n\n      request.interval = norm.interval;\n      request.intervalMs = norm.intervalMs;\n\n      this.pipeToSubject(runRequest(ds, request));\n    } catch (err) {\n      console.log('PanelQueryRunner Error', err);\n    }\n  }\n\n  private pipeToSubject(observable: Observable<PanelData>) {\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n\n    this.subscription = observable.subscribe({\n      next: (data: PanelData) => {\n        this.lastResult = preProcessPanelData(data, this.lastResult);\n        // Store preprocessed query results for applying overrides later on in the pipeline\n        this.subject.next(this.lastResult);\n      },\n    });\n  }\n\n  resendLastResult = () => {\n    if (this.lastResult) {\n      this.subject.next(this.lastResult);\n    }\n  };\n\n  /**\n   * Called when the panel is closed\n   */\n  destroy() {\n    // Tell anyone listening that we are done\n    if (this.subject) {\n      this.subject.complete();\n    }\n\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n  }\n\n  useLastResultFrom(runner: PanelQueryRunner) {\n    this.lastResult = runner.getLastResult();\n\n    if (this.lastResult) {\n      // The subject is a replay subject so anyone subscribing will get this last result\n      this.subject.next(this.lastResult);\n    }\n  }\n\n  getLastResult(): PanelData {\n    return this.lastResult;\n  }\n}\n\nasync function getDataSource(\n  datasource: string | DataSourceApi | null,\n  scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n  if (datasource && (datasource as any).query) {\n    return datasource as DataSourceApi;\n  }\n  return await getDatasourceSrv().get(datasource as string, scopedVars);\n}\n","// Libraries\nimport _ from 'lodash';\n// Utils\nimport { Emitter } from 'app/core/utils/emitter';\nimport { getNextRefIdChar } from 'app/core/utils/query';\nimport templateSrv from 'app/features/templating/template_srv';\n// Types\nimport {\n  DataConfigSource,\n  DataLink,\n  DataQuery,\n  DataQueryResponseData,\n  DataTransformerConfig,\n  eventFactory,\n  FieldConfigSource,\n  PanelEvents,\n  PanelPlugin,\n  ScopedVars,\n} from '@grafana/data';\nimport { EDIT_PANEL_ID } from 'app/core/constants';\nimport config from 'app/core/config';\nimport { PanelQueryRunner } from './PanelQueryRunner';\n\nexport const panelAdded = eventFactory<PanelModel | undefined>('panel-added');\nexport const panelRemoved = eventFactory<PanelModel | undefined>('panel-removed');\n\nexport interface GridPos {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  static?: boolean;\n}\n\nconst notPersistedProperties: { [str: string]: boolean } = {\n  events: true,\n  isViewing: true,\n  isEditing: true,\n  isInView: true,\n  hasRefreshed: true,\n  cachedPluginOptions: true,\n  plugin: true,\n  queryRunner: true,\n  replaceVariables: true,\n  editSourceId: true,\n};\n\n// For angular panels we need to clean up properties when changing type\n// To make sure the change happens without strange bugs happening when panels use same\n// named property with different type / value expectations\n// This is not required for react panels\nconst mustKeepProps: { [str: string]: boolean } = {\n  id: true,\n  gridPos: true,\n  type: true,\n  title: true,\n  scopedVars: true,\n  repeat: true,\n  repeatIteration: true,\n  repeatPanelId: true,\n  repeatDirection: true,\n  repeatedByRow: true,\n  minSpan: true,\n  collapsed: true,\n  panels: true,\n  targets: true,\n  datasource: true,\n  timeFrom: true,\n  timeShift: true,\n  hideTimeOverride: true,\n  description: true,\n  links: true,\n  fullscreen: true,\n  isEditing: true,\n  hasRefreshed: true,\n  events: true,\n  cacheTimeout: true,\n  cachedPluginOptions: true,\n  transparent: true,\n  pluginVersion: true,\n  queryRunner: true,\n  transformations: true,\n  fieldConfig: true,\n  editSourceId: true,\n  maxDataPoints: true,\n  interval: true,\n};\n\nconst defaults: any = {\n  gridPos: { x: 0, y: 0, h: 3, w: 6 },\n  targets: [{ refId: 'A' }],\n  cachedPluginOptions: {},\n  transparent: false,\n  options: {},\n  datasource: null,\n};\n\nexport class PanelModel implements DataConfigSource {\n  /* persisted id, used in URL to identify a panel */\n  id: number;\n  editSourceId: number;\n  gridPos: GridPos;\n  type: string;\n  title: string;\n  alert?: any;\n  scopedVars?: ScopedVars;\n  repeat?: string;\n  repeatIteration?: number;\n  repeatPanelId?: number;\n  repeatDirection?: string;\n  repeatedByRow?: boolean;\n  maxPerRow?: number;\n  collapsed?: boolean;\n  panels?: any;\n  soloMode?: boolean;\n  targets: DataQuery[];\n  transformations?: DataTransformerConfig[];\n  datasource: string;\n  thresholds?: any;\n  pluginVersion?: string;\n\n  snapshotData?: DataQueryResponseData[];\n  timeFrom?: any;\n  timeShift?: any;\n  hideTimeOverride?: any;\n  options: {\n    [key: string]: any;\n  };\n  fieldConfig: FieldConfigSource;\n\n  maxDataPoints?: number;\n  interval?: string;\n  description?: string;\n  links?: DataLink[];\n  transparent: boolean;\n\n  // non persisted\n  isViewing: boolean;\n  isEditing: boolean;\n  isInView: boolean;\n  hasRefreshed: boolean;\n  events: Emitter;\n  cacheTimeout?: any;\n  cachedPluginOptions?: any;\n  legend?: { show: boolean; sort?: string; sortDesc?: boolean };\n  plugin?: PanelPlugin;\n\n  private queryRunner?: PanelQueryRunner;\n\n  constructor(model: any) {\n    this.events = new Emitter();\n    this.restoreModel(model);\n    this.replaceVariables = this.replaceVariables.bind(this);\n  }\n\n  /** Given a persistened PanelModel restores property values */\n  restoreModel(model: any) {\n    // Start with clean-up\n    for (const property in this) {\n      if (notPersistedProperties[property] || !this.hasOwnProperty(property)) {\n        continue;\n      }\n\n      if (model[property]) {\n        continue;\n      }\n\n      if (typeof (this as any)[property] === 'function') {\n        continue;\n      }\n\n      if (typeof (this as any)[property] === 'symbol') {\n        continue;\n      }\n\n      delete (this as any)[property];\n    }\n\n    // copy properties from persisted model\n    for (const property in model) {\n      (this as any)[property] = model[property];\n    }\n\n    // defaults\n    _.defaultsDeep(this, _.cloneDeep(defaults));\n\n    // queries must have refId\n    this.ensureQueryIds();\n  }\n\n  ensureQueryIds() {\n    if (this.targets && _.isArray(this.targets)) {\n      for (const query of this.targets) {\n        if (!query.refId) {\n          query.refId = getNextRefIdChar(this.targets);\n        }\n      }\n    }\n  }\n\n  getOptions() {\n    return this.options;\n  }\n  getFieldConfig() {\n    return this.fieldConfig;\n  }\n\n  updateOptions(options: object) {\n    this.options = options;\n    this.render();\n  }\n\n  updateFieldConfig(config: FieldConfigSource) {\n    this.fieldConfig = config;\n\n    this.resendLastResult();\n    this.render();\n  }\n\n  getSaveModel() {\n    const model: any = {};\n\n    for (const property in this) {\n      if (notPersistedProperties[property] || !this.hasOwnProperty(property)) {\n        continue;\n      }\n\n      if (_.isEqual(this[property], defaults[property])) {\n        continue;\n      }\n\n      model[property] = _.cloneDeep(this[property]);\n    }\n\n    if (model.datasource === undefined) {\n      // This is part of defaults as defaults are removed in save model and\n      // this should not be removed in save model as exporter needs to templatize it\n      model.datasource = null;\n    }\n\n    return model;\n  }\n\n  setIsViewing(isViewing: boolean) {\n    this.isViewing = isViewing;\n  }\n\n  updateGridPos(newPos: GridPos) {\n    let sizeChanged = false;\n\n    if (this.gridPos.w !== newPos.w || this.gridPos.h !== newPos.h) {\n      sizeChanged = true;\n    }\n\n    this.gridPos.x = newPos.x;\n    this.gridPos.y = newPos.y;\n    this.gridPos.w = newPos.w;\n    this.gridPos.h = newPos.h;\n\n    if (sizeChanged) {\n      this.events.emit(PanelEvents.panelSizeChanged);\n    }\n  }\n\n  resizeDone() {\n    this.events.emit(PanelEvents.panelSizeChanged);\n  }\n\n  refresh() {\n    this.hasRefreshed = true;\n    this.events.emit(PanelEvents.refresh);\n  }\n\n  render() {\n    if (!this.hasRefreshed) {\n      this.refresh();\n    } else {\n      this.events.emit(PanelEvents.render);\n    }\n  }\n\n  initialized() {\n    this.events.emit(PanelEvents.panelInitialized);\n  }\n\n  private getOptionsToRemember() {\n    return Object.keys(this).reduce((acc, property) => {\n      if (notPersistedProperties[property] || mustKeepProps[property]) {\n        return acc;\n      }\n      return {\n        ...acc,\n        [property]: (this as any)[property],\n      };\n    }, {});\n  }\n\n  private restorePanelOptions(pluginId: string) {\n    const prevOptions = this.cachedPluginOptions[pluginId] || {};\n\n    Object.keys(prevOptions).map(property => {\n      (this as any)[property] = prevOptions[property];\n    });\n  }\n\n  private applyPluginOptionDefaults(plugin: PanelPlugin) {\n    if (plugin.angularConfigCtrl) {\n      return;\n    }\n    this.options = _.mergeWith({}, plugin.defaults, this.options || {}, (objValue: any, srcValue: any): any => {\n      if (_.isArray(srcValue)) {\n        return srcValue;\n      }\n    });\n\n    this.fieldConfig = {\n      defaults: _.mergeWith(\n        {},\n        plugin.fieldConfigDefaults.defaults,\n        this.fieldConfig ? this.fieldConfig.defaults : {},\n        (objValue: any, srcValue: any): any => {\n          if (_.isArray(srcValue)) {\n            return srcValue;\n          }\n        }\n      ),\n      overrides: [\n        ...plugin.fieldConfigDefaults.overrides,\n        ...(this.fieldConfig && this.fieldConfig.overrides ? this.fieldConfig.overrides : []),\n      ],\n    };\n  }\n\n  pluginLoaded(plugin: PanelPlugin) {\n    this.plugin = plugin;\n\n    if (plugin.panel && plugin.onPanelMigration) {\n      const version = getPluginVersion(plugin);\n\n      if (version !== this.pluginVersion) {\n        this.options = plugin.onPanelMigration(this);\n        this.pluginVersion = version;\n      }\n    }\n\n    this.applyPluginOptionDefaults(plugin);\n    this.resendLastResult();\n  }\n\n  changePlugin(newPlugin: PanelPlugin) {\n    const pluginId = newPlugin.meta.id;\n    const oldOptions: any = this.getOptionsToRemember();\n    const oldPluginId = this.type;\n    const wasAngular = !!this.plugin.angularPanelCtrl;\n\n    // remove panel type specific  options\n    for (const key of _.keys(this)) {\n      if (mustKeepProps[key]) {\n        continue;\n      }\n\n      delete (this as any)[key];\n    }\n\n    this.cachedPluginOptions[oldPluginId] = oldOptions;\n    this.restorePanelOptions(pluginId);\n\n    // Let panel plugins inspect options from previous panel and keep any that it can use\n    if (newPlugin.onPanelTypeChanged) {\n      let old: any = {};\n\n      if (wasAngular) {\n        old = { angular: oldOptions };\n      } else if (oldOptions && oldOptions.options) {\n        old = oldOptions.options;\n      }\n      this.options = this.options || {};\n      Object.assign(this.options, newPlugin.onPanelTypeChanged(this, oldPluginId, old));\n    }\n\n    // switch\n    this.type = pluginId;\n    this.plugin = newPlugin;\n\n    // For some reason I need to rebind replace variables here, otherwise the viz repeater does not work\n    this.replaceVariables = this.replaceVariables.bind(this);\n    this.applyPluginOptionDefaults(newPlugin);\n\n    if (newPlugin.onPanelMigration) {\n      this.pluginVersion = getPluginVersion(newPlugin);\n    }\n  }\n\n  addQuery(query?: Partial<DataQuery>) {\n    query = query || { refId: 'A' };\n    query.refId = getNextRefIdChar(this.targets);\n    this.targets.push(query as DataQuery);\n  }\n\n  changeQuery(query: DataQuery, index: number) {\n    // ensure refId is maintained\n    query.refId = this.targets[index].refId;\n\n    // update query in array\n    this.targets = this.targets.map((item, itemIndex) => {\n      if (itemIndex === index) {\n        return query;\n      }\n      return item;\n    });\n  }\n\n  getEditClone() {\n    const sourceModel = this.getSaveModel();\n\n    // Temporary id for the clone, restored later in redux action when changes are saved\n    sourceModel.id = EDIT_PANEL_ID;\n    sourceModel.editSourceId = this.id;\n\n    const clone = new PanelModel(sourceModel);\n    clone.isEditing = true;\n    const sourceQueryRunner = this.getQueryRunner();\n\n    // Copy last query result\n    clone.getQueryRunner().useLastResultFrom(sourceQueryRunner);\n\n    return clone;\n  }\n\n  getTransformations() {\n    return this.transformations;\n  }\n\n  getFieldOverrideOptions() {\n    if (!this.plugin) {\n      return undefined;\n    }\n\n    return {\n      fieldConfig: this.fieldConfig,\n      replaceVariables: this.replaceVariables,\n      fieldConfigRegistry: this.plugin.fieldConfigRegistry,\n      theme: config.theme,\n    };\n  }\n\n  getQueryRunner(): PanelQueryRunner {\n    if (!this.queryRunner) {\n      this.queryRunner = new PanelQueryRunner(this);\n    }\n    return this.queryRunner;\n  }\n\n  hasTitle() {\n    return this.title && this.title.length > 0;\n  }\n\n  isAngularPlugin(): boolean {\n    return this.plugin && !!this.plugin.angularPanelCtrl;\n  }\n\n  destroy() {\n    this.events.emit(PanelEvents.panelTeardown);\n    this.events.removeAllListeners();\n\n    if (this.queryRunner) {\n      this.queryRunner.destroy();\n    }\n  }\n\n  setTransformations(transformations: DataTransformerConfig[]) {\n    this.transformations = transformations;\n    this.resendLastResult();\n  }\n\n  replaceVariables(value: string, extraVars?: ScopedVars, format?: string) {\n    let vars = this.scopedVars;\n    if (extraVars) {\n      vars = vars ? { ...vars, ...extraVars } : extraVars;\n    }\n    return templateSrv.replace(value, vars, format);\n  }\n\n  resendLastResult() {\n    if (!this.plugin) {\n      return;\n    }\n\n    this.getQueryRunner().resendLastResult();\n  }\n\n  /*\n   * Panel have a different id while in edit mode (to more easily be able to discard changes)\n   * Use this to always get the underlying source id\n   * */\n  getSavedId(): number {\n    return this.editSourceId ?? this.id;\n  }\n}\n\nfunction getPluginVersion(plugin: PanelPlugin): string {\n  return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n}\n","import React, { useCallback, useState } from 'react';\nimport { css } from 'emotion';\nimport { saveAs } from 'file-saver';\nimport { Button, HorizontalGroup, stylesFactory, TextArea, useTheme, VerticalGroup } from '@grafana/ui';\nimport { CopyToClipboard } from 'app/core/components/CopyToClipboard/CopyToClipboard';\nimport { SaveDashboardFormProps } from '../types';\nimport { AppEvents, GrafanaTheme } from '@grafana/data';\nimport appEvents from '../../../../../core/app_events';\n\nexport const SaveProvisionedDashboardForm: React.FC<SaveDashboardFormProps> = ({ dashboard, onCancel }) => {\n  const theme = useTheme();\n  const [dashboardJSON, setDashboardJson] = useState(() => {\n    const clone = dashboard.getSaveModelClone();\n    delete clone.id;\n    return JSON.stringify(clone, null, 2);\n  });\n\n  const saveToFile = useCallback(() => {\n    const blob = new Blob([dashboardJSON], {\n      type: 'application/json;charset=utf-8',\n    });\n    saveAs(blob, dashboard.title + '-' + new Date().getTime() + '.json');\n  }, [dashboardJSON]);\n\n  const onCopyToClipboardSuccess = useCallback(() => {\n    appEvents.emit(AppEvents.alertSuccess, ['Dashboard JSON copied to clipboard']);\n  }, []);\n\n  const styles = getStyles(theme);\n  return (\n    <>\n      <VerticalGroup spacing=\"lg\">\n        <small>\n          This dashboard cannot be saved from Grafana's UI since it has been provisioned from another source. Copy the\n          JSON or save it to a file below. Then you can update your dashboard in corresponding provisioning source.\n          <br />\n          <i>\n            See{' '}\n            <a\n              className=\"external-link\"\n              href=\"http://docs.grafana.org/administration/provisioning/#dashboards\"\n              target=\"_blank\"\n            >\n              documentation\n            </a>{' '}\n            for more information about provisioning.\n          </i>\n        </small>\n        <div>\n          <strong>File path: </strong> {dashboard.meta.provisionedExternalId}\n        </div>\n        <TextArea\n          spellCheck={false}\n          value={dashboardJSON}\n          onChange={e => {\n            setDashboardJson(e.currentTarget.value);\n          }}\n          className={styles.json}\n        />\n        <HorizontalGroup>\n          <CopyToClipboard text={() => dashboardJSON} elType={Button} onSuccess={onCopyToClipboardSuccess}>\n            Copy JSON to clipboard\n          </CopyToClipboard>\n          <Button onClick={saveToFile}>Save JSON to file</Button>\n          <Button variant=\"secondary\" onClick={onCancel}>\n            Cancel\n          </Button>\n        </HorizontalGroup>\n      </VerticalGroup>\n    </>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    json: css`\n      height: 400px;\n      width: 100%;\n      overflow: auto;\n      resize: none;\n      font-family: monospace;\n    `,\n  };\n});\n","import React from 'react';\nimport { Modal } from '@grafana/ui';\nimport { SaveProvisionedDashboardForm } from './forms/SaveProvisionedDashboardForm';\nimport { SaveDashboardModalProps } from './types';\n\nexport const SaveProvisionedDashboard: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss }) => {\n  return (\n    <Modal isOpen={true} title=\"Cannot save provisioned dashboard\" icon=\"copy\" onDismiss={onDismiss}>\n      <SaveProvisionedDashboardForm dashboard={dashboard} onCancel={onDismiss} onSuccess={onDismiss} />\n    </Modal>\n  );\n};\n","import React, { useMemo } from 'react';\n\nimport { Button, Checkbox, Form, HorizontalGroup, TextArea } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { SaveDashboardFormProps } from '../types';\n\ninterface SaveDashboardFormDTO {\n  message: string;\n  saveVariables: boolean;\n  saveTimerange: boolean;\n}\n\nexport const SaveDashboardForm: React.FC<SaveDashboardFormProps> = ({ dashboard, onCancel, onSuccess, onSubmit }) => {\n  const hasTimeChanged = useMemo(() => dashboard.hasTimeChanged(), [dashboard]);\n  const hasVariableChanged = useMemo(() => dashboard.hasVariableValuesChanged(), [dashboard]);\n\n  return (\n    <Form\n      onSubmit={async (data: SaveDashboardFormDTO) => {\n        const result = await onSubmit(dashboard.getSaveModelClone(data), data, dashboard);\n        if (result.status === 'success') {\n          if (data.saveVariables) {\n            dashboard.resetOriginalVariables();\n          }\n          if (data.saveTimerange) {\n            dashboard.resetOriginalTime();\n          }\n          onSuccess();\n        }\n      }}\n    >\n      {({ register, errors }) => (\n        <>\n          <div className=\"gf-form-group\">\n            {hasTimeChanged && (\n              <Checkbox\n                label=\"Save current time range as dashboard default\"\n                name=\"saveTimerange\"\n                ref={register}\n                aria-label={selectors.pages.SaveDashboardModal.saveTimerange}\n              />\n            )}\n            {hasVariableChanged && (\n              <Checkbox\n                label=\"Save current variable values as dashboard default\"\n                name=\"saveVariables\"\n                ref={register}\n                aria-label={selectors.pages.SaveDashboardModal.saveVariables}\n              />\n            )}\n            {(hasVariableChanged || hasTimeChanged) && <div className=\"gf-form-group\" />}\n\n            <TextArea name=\"message\" ref={register} placeholder=\"Add a note to describe your changes...\" autoFocus />\n          </div>\n\n          <HorizontalGroup>\n            <Button type=\"submit\" aria-label={selectors.pages.SaveDashboardModal.save}>\n              Save\n            </Button>\n            <Button variant=\"secondary\" onClick={onCancel}>\n              Cancel\n            </Button>\n          </HorizontalGroup>\n        </>\n      )}\n    </Form>\n  );\n};\n","import React, { useState } from 'react';\nimport { Modal } from '@grafana/ui';\nimport { css } from 'emotion';\nimport { SaveDashboardForm } from './forms/SaveDashboardForm';\nimport { SaveDashboardErrorProxy } from './SaveDashboardErrorProxy';\nimport { useDashboardSave } from './useDashboardSave';\nimport { SaveDashboardModalProps } from './types';\n\nexport const SaveDashboardModal: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss, onSaveSuccess }) => {\n  const { state, onDashboardSave } = useDashboardSave(dashboard);\n  const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState();\n\n  return (\n    <>\n      {state.error && (\n        <SaveDashboardErrorProxy\n          error={state.error}\n          dashboard={dashboard}\n          dashboardSaveModel={dashboardSaveModelClone}\n          onDismiss={onDismiss}\n        />\n      )}\n      {!state.error && (\n        <Modal\n          isOpen={true}\n          title=\"Save dashboard\"\n          icon=\"copy\"\n          onDismiss={onDismiss}\n          className={css`\n            width: 500px;\n          `}\n        >\n          <SaveDashboardForm\n            dashboard={dashboard}\n            onCancel={onDismiss}\n            onSuccess={() => {\n              onDismiss();\n              if (onSaveSuccess) {\n                onSaveSuccess();\n              }\n            }}\n            onSubmit={(clone, options, dashboard) => {\n              setDashboardSaveModelClone(clone);\n              return onDashboardSave(clone, options, dashboard);\n            }}\n          />\n        </Modal>\n      )}\n    </>\n  );\n};\n","import React from 'react';\nimport { SaveProvisionedDashboard } from './SaveProvisionedDashboard';\nimport { SaveDashboardAsModal } from './SaveDashboardAsModal';\nimport { SaveDashboardModalProps } from './types';\nimport { SaveDashboardModal } from './SaveDashboardModal';\n\nexport const SaveDashboardModalProxy: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss, onSaveSuccess }) => {\n  const isProvisioned = dashboard.meta.provisioned;\n  const isNew = dashboard.version === 0;\n  const isChanged = dashboard.version > 0;\n\n  const modalProps = {\n    dashboard,\n    onDismiss,\n    onSaveSuccess,\n  };\n\n  return (\n    <>\n      {isChanged && !isProvisioned && <SaveDashboardModal {...modalProps} />}\n      {isProvisioned && <SaveProvisionedDashboard {...modalProps} />}\n      {isNew && <SaveDashboardAsModal {...modalProps} isNew />}\n    </>\n  );\n};\n","var path = 'public/app/plugins/panel/table-old/editor.html';\nvar html = \"<div class=gf-form-group>\\n  <h5 class=section-heading>Data</h5>\\n  <div class=\\\"gf-form gf-form--grow\\\">\\n    <label class=\\\"gf-form-label width-8\\\">Table Transform</label>\\n    <div class=gf-form-select-wrapper>\\n      <select class=gf-form-input ng-model=editor.panel.transform ng-options=\\\"k as v.description for (k, v) in editor.transformers\\\" ng-change=editor.transformChanged()></select>\\n    </div>\\n  </div>\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Columns</label>\\n    </div>\\n    <div class=gf-form ng-repeat=\\\"column in editor.panel.columns\\\">\\n      <label class=gf-form-label>\\n        <icon name=\\\"'times'\\\" ng-click=editor.removeColumn(column)></icon>\\n        <span>{{ column.text }}</span>\\n      </label>\\n    </div>\\n    <div class=gf-form ng-show=editor.canSetColumns>\\n      <metric-segment segment=editor.addColumnSegment get-options=editor.getColumnOptions() on-change=editor.addColumn()></metric-segment>\\n    </div>\\n    <div class=gf-form ng-hide=editor.canSetColumns>\\n      <label class=gf-form-label>\\n        Auto\\n        <info-popover mode=right-normal ng-if=editor.columnsHelpMessage>\\n          {{ editor.columnsHelpMessage }}\\n        </info-popover>\\n      </label>\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-group>\\n  <h5 class=section-heading>Paging</h5>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label width-8\\\">Rows per page</label>\\n    <input type=number class=\\\"gf-form-input width-7\\\" placeholder=100 data-placement=right ng-model=editor.panel.pageSize ng-change=editor.render() ng-model-onblur/>\\n  </div>\\n  <div class=\\\"gf-form max-width-17\\\">\\n    <label class=\\\"gf-form-label width-8\\\">Font size</label>\\n    <div class=\\\"gf-form-select-wrapper width-7\\\">\\n      <select class=gf-form-input ng-model=editor.panel.fontSize ng-options=\\\"f for f in editor.fontSizes\\\" ng-change=editor.render()></select>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","// Vendored and converted to TS, source: https://github.com/xpl/ansicolor/blob/b82360563ed29de444dc7618b9236191e0a77096/ansicolor.js\n// License: Unlicense, author: https://github.com/xpl\n\nconst O = Object;\n\n/*  See https://misc.flogisoft.com/bash/tip_colors_and_formatting\n    ------------------------------------------------------------------------ */\n\nconst colorCodes = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'lightGray', '', 'default'],\n  colorCodesLight = [\n    'darkGray',\n    'lightRed',\n    'lightGreen',\n    'lightYellow',\n    'lightBlue',\n    'lightMagenta',\n    'lightCyan',\n    'white',\n    '',\n  ],\n  styleCodes = ['', 'bright', 'dim', 'italic', 'underline', '', '', 'inverse'],\n  asBright = {\n    red: 'lightRed',\n    green: 'lightGreen',\n    yellow: 'lightYellow',\n    blue: 'lightBlue',\n    magenta: 'lightMagenta',\n    cyan: 'lightCyan',\n    black: 'darkGray',\n    lightGray: 'white',\n  },\n  types = {\n    0: 'style',\n    2: 'unstyle',\n    3: 'color',\n    9: 'colorLight',\n    4: 'bgColor',\n    10: 'bgColorLight',\n  },\n  subtypes = {\n    color: colorCodes,\n    colorLight: colorCodesLight,\n    bgColor: colorCodes,\n    bgColorLight: colorCodesLight,\n    style: styleCodes,\n    unstyle: styleCodes,\n  };\n\n/*  ------------------------------------------------------------------------ */\n\nconst clean = (obj: any) => {\n  for (const k in obj) {\n    if (!obj[k]) {\n      delete obj[k];\n    }\n  }\n  return O.keys(obj).length === 0 ? undefined : obj;\n};\n\n/*  ------------------------------------------------------------------------ */\n\nclass Color {\n  background?: boolean;\n  name?: string;\n  brightness?: number;\n\n  constructor(background?: boolean, name?: string, brightness?: number) {\n    this.background = background;\n    this.name = name;\n    this.brightness = brightness;\n  }\n\n  get inverse() {\n    return new Color(!this.background, this.name || (this.background ? 'black' : 'white'), this.brightness);\n  }\n\n  get clean() {\n    return clean({\n      name: this.name === 'default' ? '' : this.name,\n      bright: this.brightness === Code.bright,\n      dim: this.brightness === Code.dim,\n    });\n  }\n\n  defaultBrightness(value?: number) {\n    return new Color(this.background, this.name, this.brightness || value);\n  }\n\n  css(inverted: boolean) {\n    const color = inverted ? this.inverse : this;\n\n    // @ts-ignore\n    const rgbName = (color.brightness === Code.bright && asBright[color.name]) || color.name;\n\n    const prop = color.background ? 'background:' : 'color:';\n\n    // @ts-ignore\n    const rgb = Colors.rgb[rgbName];\n    const alpha = this.brightness === Code.dim ? 0.5 : 1;\n\n    return rgb\n      ? prop + 'rgba(' + [...rgb, alpha].join(',') + ');'\n      : !color.background && alpha < 1\n      ? 'color:rgba(0,0,0,0.5);'\n      : ''; // Chrome does not support 'opacity' property...\n  }\n}\n\n/*  ------------------------------------------------------------------------ */\n\nclass Code {\n  static reset = 0;\n  static bright = 1;\n  static dim = 2;\n  static inverse = 7;\n  static noBrightness = 22;\n  static noItalic = 23;\n  static noUnderline = 24;\n  static noInverse = 27;\n  static noColor = 39;\n  static noBgColor = 49;\n\n  value: number | undefined;\n\n  constructor(n?: string | number) {\n    if (n !== undefined) {\n      this.value = Number(n);\n    } else {\n      this.value = undefined;\n    }\n  }\n\n  get type() {\n    // @ts-ignore\n    return types[Math.floor(this.value / 10)];\n  }\n\n  get subtype() {\n    // @ts-ignore\n    return subtypes[this.type][this.value % 10];\n  }\n\n  get str() {\n    return this.value ? '\\u001b[' + this.value + 'm' : '';\n  }\n\n  static str(x: string | number) {\n    return new Code(x).str;\n  }\n\n  get isBrightness() {\n    return this.value === Code.noBrightness || this.value === Code.bright || this.value === Code.dim;\n  }\n}\n\n/*  ------------------------------------------------------------------------ */\n\nconst replaceAll = (str: string, a: string, b: string) => str.split(a).join(b);\n\n/*  ANSI brightness codes do not overlap, e.g. \"{bright}{dim}foo\" will be rendered bright (not dim).\n    So we fix it by adding brightness canceling before each brightness code, so the former example gets\n    converted to \"{noBrightness}{bright}{noBrightness}{dim}foo\" – this way it gets rendered as expected.\n */\n\nconst denormalizeBrightness = (s: string) => s.replace(/(\\u001b\\[(1|2)m)/g, '\\u001b[22m$1');\nconst normalizeBrightness = (s: string) => s.replace(/\\u001b\\[22m(\\u001b\\[(1|2)m)/g, '$1');\n\n// @ts-ignore\nconst wrap = (x, openCode, closeCode) => {\n  const open = Code.str(openCode),\n    close = Code.str(closeCode);\n\n  return String(x)\n    .split('\\n')\n    .map(line => denormalizeBrightness(open + replaceAll(normalizeBrightness(line), close, open) + close))\n    .join('\\n');\n};\n\n/*  ------------------------------------------------------------------------ */\n\nconst camel = (a: string, b: string) => a + b.charAt(0).toUpperCase() + b.slice(1);\n\nconst stringWrappingMethods = (() =>\n  [\n    ...colorCodes.map((k, i) =>\n      !k\n        ? []\n        : [\n            // color methods\n\n            [k, 30 + i, Code.noColor],\n            [camel('bg', k), 40 + i, Code.noBgColor],\n          ]\n    ),\n\n    ...colorCodesLight.map((k, i) =>\n      !k\n        ? []\n        : [\n            // light color methods\n\n            [k, 90 + i, Code.noColor],\n            [camel('bg', k), 100 + i, Code.noBgColor],\n          ]\n    ),\n\n    /* THIS ONE IS FOR BACKWARDS COMPATIBILITY WITH PREVIOUS VERSIONS (had 'bright' instead of 'light' for backgrounds)\n     */\n    ...['', 'BrightRed', 'BrightGreen', 'BrightYellow', 'BrightBlue', 'BrightMagenta', 'BrightCyan'].map((k, i) =>\n      !k ? [] : [['bg' + k, 100 + i, Code.noBgColor]]\n    ),\n\n    ...styleCodes.map((k, i) =>\n      !k\n        ? []\n        : [\n            // style methods\n\n            [k, i, k === 'bright' || k === 'dim' ? Code.noBrightness : 20 + i],\n          ]\n    ),\n  ].reduce((a, b) => a.concat(b)))();\n\n/*  ------------------------------------------------------------------------ */\n\n// @ts-ignore\nconst assignStringWrappingAPI = (target, wrapBefore = target) =>\n  stringWrappingMethods.reduce(\n    (memo, [k, open, close]) =>\n      O.defineProperty(memo, k, {\n        // @ts-ignore\n        get: () => assignStringWrappingAPI(str => wrapBefore(wrap(str, open, close))),\n      }),\n\n    target\n  );\n\n/*  ------------------------------------------------------------------------ */\n\nconst TEXT = 0,\n  BRACKET = 1,\n  CODE = 2;\n\nfunction rawParse(s: string) {\n  let state = TEXT,\n    buffer = '',\n    text = '',\n    code = '',\n    codes = [];\n  const spans = [];\n\n  for (let i = 0, n = s.length; i < n; i++) {\n    const c = s[i];\n\n    buffer += c;\n\n    switch (state) {\n      case TEXT: {\n        if (c === '\\u001b') {\n          state = BRACKET;\n          buffer = c;\n        } else {\n          text += c;\n        }\n        break;\n      }\n      case BRACKET:\n        if (c === '[') {\n          state = CODE;\n          code = '';\n          codes = [];\n        } else {\n          state = TEXT;\n          text += buffer;\n        }\n        break;\n\n      case CODE:\n        if (c >= '0' && c <= '9') {\n          code += c;\n        } else if (c === ';') {\n          codes.push(new Code(code));\n          code = '';\n        } else if (c === 'm' && code.length) {\n          codes.push(new Code(code));\n          for (const code of codes) {\n            spans.push({ text, code });\n            text = '';\n          }\n          state = TEXT;\n        } else {\n          state = TEXT;\n          text += buffer;\n        }\n    }\n  }\n\n  if (state !== TEXT) {\n    text += buffer;\n  }\n\n  if (text) {\n    spans.push({ text, code: new Code() });\n  }\n\n  return spans;\n}\n\n/*  ------------------------------------------------------------------------ */\n\n/**\n * Represents an ANSI-escaped string.\n */\nexport default class Colors {\n  spans: any[];\n  static names = stringWrappingMethods.map(([k]) => k);\n  static rgb = {\n    black: [0, 0, 0],\n    darkGray: [100, 100, 100],\n    lightGray: [200, 200, 200],\n    white: [255, 255, 255],\n\n    red: [204, 0, 0],\n    lightRed: [255, 51, 0],\n\n    green: [0, 204, 0],\n    lightGreen: [51, 204, 51],\n\n    yellow: [204, 102, 0],\n    lightYellow: [255, 153, 51],\n\n    blue: [0, 0, 255],\n    lightBlue: [26, 140, 255],\n\n    magenta: [204, 0, 204],\n    lightMagenta: [255, 0, 255],\n\n    cyan: [0, 153, 255],\n    lightCyan: [0, 204, 255],\n  };\n\n  /**\n   * @param {string} s a string containing ANSI escape codes.\n   */\n  constructor(s?: string) {\n    this.spans = s ? rawParse(s) : [];\n  }\n\n  get str() {\n    return this.spans.reduce((str, p) => str + p.text + p.code.str, '');\n  }\n\n  get parsed() {\n    let styles: Set<string>;\n    let brightness: number | undefined;\n    let color: Color;\n    let bgColor: Color;\n\n    function reset() {\n      (color = new Color()),\n        (bgColor = new Color(true /* background */)),\n        (brightness = undefined),\n        (styles = new Set());\n    }\n\n    reset();\n\n    return O.assign(new Colors(), {\n      spans: this.spans\n        .map(span => {\n          const c = span.code;\n\n          const inverted = styles.has('inverse'),\n            underline = styles.has('underline') ? 'text-decoration: underline;' : '',\n            italic = styles.has('italic') ? 'font-style: italic;' : '',\n            bold = brightness === Code.bright ? 'font-weight: bold;' : '';\n\n          const foreColor = color.defaultBrightness(brightness);\n\n          const styledSpan = O.assign(\n            { css: bold + italic + underline + foreColor.css(inverted) + bgColor.css(inverted) },\n            clean({ bold: !!bold, color: foreColor.clean, bgColor: bgColor.clean }),\n            span\n          );\n\n          for (const k of styles) {\n            styledSpan[k] = true;\n          }\n\n          if (c.isBrightness) {\n            brightness = c.value;\n          } else if (span.code.value !== undefined) {\n            if (span.code.value === Code.reset) {\n              reset();\n            } else {\n              switch (span.code.type) {\n                case 'color':\n                case 'colorLight':\n                  color = new Color(false, c.subtype);\n                  break;\n\n                case 'bgColor':\n                case 'bgColorLight':\n                  bgColor = new Color(true, c.subtype);\n                  break;\n\n                case 'style':\n                  styles.add(c.subtype);\n                  break;\n                case 'unstyle':\n                  styles.delete(c.subtype);\n                  break;\n              }\n            }\n          }\n\n          return styledSpan;\n        })\n        .filter(s => s.text.length > 0),\n    });\n  }\n\n  /*  Outputs with Chrome DevTools-compatible format     */\n\n  get asChromeConsoleLogArguments() {\n    const spans = this.parsed.spans;\n\n    return [spans.map(s => '%c' + s.text).join(''), ...spans.map(s => s.css)];\n  }\n\n  get browserConsoleArguments() /* LEGACY, DEPRECATED */ {\n    return this.asChromeConsoleLogArguments;\n  }\n\n  /**\n   * @desc installs String prototype extensions\n   * @example\n   * require ('ansicolor').nice\n   * console.log ('foo'.bright.red)\n   */\n  static get nice() {\n    Colors.names.forEach(k => {\n      if (!(k in String.prototype)) {\n        O.defineProperty(String.prototype, k, {\n          get: function() {\n            // @ts-ignore\n            return Colors[k](this);\n          },\n        });\n      }\n    });\n\n    return Colors;\n  }\n\n  /**\n   * @desc parses a string containing ANSI escape codes\n   * @return {Colors} parsed representation.\n   */\n  static parse(s: string) {\n    return new Colors(s).parsed;\n  }\n\n  /**\n   * @desc strips ANSI codes from a string\n   * @param {string} s a string containing ANSI escape codes.\n   * @return {string} clean string.\n   */\n  static strip(s: string) {\n    return s.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g, ''); // hope V8 caches the regexp\n  }\n\n  /**\n   * @example\n   * const spans = [...ansi.parse ('\\u001b[7m\\u001b[7mfoo\\u001b[7mbar\\u001b[27m')]\n   */\n  [Symbol.iterator]() {\n    return this.spans[Symbol.iterator]();\n  }\n}\n\n/*  ------------------------------------------------------------------------ */\n\nassignStringWrappingAPI(Colors, (str: string) => str);\n","import React, { useContext } from 'react';\nimport { css, cx } from 'emotion';\nimport { LegendComponentProps } from './Legend';\nimport { Icon } from '../Icon/Icon';\nimport { ThemeContext } from '../../themes/ThemeContext';\n\nexport interface LegendTableProps extends LegendComponentProps {\n  columns: string[];\n  sortBy?: string;\n  sortDesc?: boolean;\n  onToggleSort?: (sortBy: string) => void;\n}\n\nexport const LegendTable: React.FunctionComponent<LegendTableProps> = ({\n  items,\n  columns,\n  sortBy,\n  sortDesc,\n  itemRenderer,\n  className,\n  onToggleSort,\n}) => {\n  const theme = useContext(ThemeContext);\n\n  return (\n    <table\n      className={cx(\n        css`\n          width: 100%;\n          td {\n            padding: 2px 10px;\n          }\n        `,\n        className\n      )}\n    >\n      <thead>\n        <tr>\n          {columns.map(columnHeader => {\n            return (\n              <th\n                key={columnHeader}\n                className={css`\n                  color: ${theme.colors.textBlue};\n                  font-weight: bold;\n                  text-align: right;\n                  cursor: pointer;\n                `}\n                onClick={() => {\n                  if (onToggleSort) {\n                    onToggleSort(columnHeader);\n                  }\n                }}\n              >\n                {columnHeader}\n                {sortBy === columnHeader && (\n                  <Icon\n                    className={css`\n                      margin-left: ${theme.spacing.sm};\n                    `}\n                    name={sortDesc ? 'angle-down' : 'angle-up'}\n                  />\n                )}\n              </th>\n            );\n          })}\n        </tr>\n      </thead>\n      <tbody>\n        {items.map((item, index) => {\n          return itemRenderer ? (\n            itemRenderer(item, index)\n          ) : (\n            <tr key={`${item.label}-${index}`}>\n              <td>{item.label}</td>\n            </tr>\n          );\n        })}\n      </tbody>\n    </table>\n  );\n};\n","export * from './data';\nexport * from './dataFrame';\nexport * from './dataLink';\nexport * from './logs';\nexport * from './navModel';\nexport * from './select';\nexport * from './time';\nexport * from './thresholds';\nexport * from './utils';\nexport * from './valueMapping';\nexport * from './displayValue';\nexport * from './graph';\nexport * from './ScopedVars';\nexport * from './transformations';\nexport * from './fieldOverrides';\nexport * from './vector';\nexport * from './app';\nexport * from './datasource';\nexport * from './panel';\nexport * from './plugin';\nexport * from './thresholds';\nexport * from './templateVars';\nexport * from './fieldColor';\nexport * from './theme';\nexport * from './orgs';\nexport * from './flot';\n\nimport * as AppEvents from './appEvents';\nimport { AppEvent } from './appEvents';\nexport { AppEvent, AppEvents };\n\nimport * as PanelEvents from './panelEvents';\nexport { PanelEvents };\nexport { GrafanaConfig, BuildInfo, FeatureToggles, LicenseInfo } from './config';\n","export * from './selectors';\n","// Libraries\nimport React, { ReactNode } from 'react';\n\nimport {\n  ButtonCascader,\n  CascaderOption,\n  SlatePrism,\n  TypeaheadOutput,\n  SuggestionsState,\n  QueryField,\n  TypeaheadInput,\n  BracesPlugin,\n} from '@grafana/ui';\n\n// Utils & Services\n// dom also includes Element polyfills\nimport { Plugin, Node } from 'slate';\n\n// Types\nimport { DOMUtil } from '@grafana/ui';\nimport { ExploreQueryFieldProps, AbsoluteTimeRange } from '@grafana/data';\nimport { LokiQuery, LokiOptions } from '../types';\nimport { Grammar } from 'prismjs';\nimport LokiLanguageProvider, { LokiHistoryItem } from '../language_provider';\nimport LokiDatasource from '../datasource';\n\nfunction getChooserText(hasSyntax: boolean, hasLogLabels: boolean) {\n  if (!hasSyntax) {\n    return 'Loading labels...';\n  }\n  if (!hasLogLabels) {\n    return '(No labels found)';\n  }\n  return 'Log labels';\n}\n\nfunction willApplySuggestion(suggestion: string, { typeaheadContext, typeaheadText }: SuggestionsState): string {\n  // Modify suggestion based on context\n  switch (typeaheadContext) {\n    case 'context-labels': {\n      const nextChar = DOMUtil.getNextCharacter();\n      if (!nextChar || nextChar === '}' || nextChar === ',') {\n        suggestion += '=';\n      }\n      break;\n    }\n\n    case 'context-label-values': {\n      // Always add quotes and remove existing ones instead\n      if (!typeaheadText.match(/^(!?=~?\"|\")/)) {\n        suggestion = `\"${suggestion}`;\n      }\n      if (DOMUtil.getNextCharacter() !== '\"') {\n        suggestion = `${suggestion}\"`;\n      }\n      break;\n    }\n\n    default:\n  }\n  return suggestion;\n}\n\nexport interface LokiQueryFieldFormProps extends ExploreQueryFieldProps<LokiDatasource, LokiQuery, LokiOptions> {\n  history: LokiHistoryItem[];\n  syntax: Grammar;\n  logLabelOptions: CascaderOption[];\n  syntaxLoaded: boolean;\n  absoluteRange: AbsoluteTimeRange;\n  onLoadOptions: (selectedOptions: CascaderOption[]) => void;\n  onLabelsRefresh?: () => void;\n  ExtraFieldElement?: ReactNode;\n}\n\nexport class LokiQueryFieldForm extends React.PureComponent<LokiQueryFieldFormProps> {\n  plugins: Plugin[];\n\n  constructor(props: LokiQueryFieldFormProps, context: React.Context<any>) {\n    super(props, context);\n\n    this.plugins = [\n      BracesPlugin(),\n      SlatePrism({\n        onlyIn: (node: Node) => node.object === 'block' && node.type === 'code_block',\n        getSyntax: (node: Node) => 'promql',\n      }),\n    ];\n  }\n\n  loadOptions = (selectedOptions: CascaderOption[]) => {\n    this.props.onLoadOptions(selectedOptions);\n  };\n\n  onChangeLogLabels = (values: string[], selectedOptions: CascaderOption[]) => {\n    if (selectedOptions.length === 2) {\n      const key = selectedOptions[0].value;\n      const value = selectedOptions[1].value;\n      const query = `{${key}=\"${value}\"}`;\n      this.onChangeQuery(query, true);\n    }\n  };\n\n  onChangeQuery = (value: string, override?: boolean) => {\n    // Send text change to parent\n    const { query, onChange, onRunQuery } = this.props;\n    if (onChange) {\n      const nextQuery = { ...query, expr: value };\n      onChange(nextQuery);\n\n      if (override && onRunQuery) {\n        onRunQuery();\n      }\n    }\n  };\n\n  onTypeahead = async (typeahead: TypeaheadInput): Promise<TypeaheadOutput> => {\n    const { datasource } = this.props;\n\n    if (!datasource.languageProvider) {\n      return { suggestions: [] };\n    }\n\n    const lokiLanguageProvider = datasource.languageProvider as LokiLanguageProvider;\n    const { history, absoluteRange } = this.props;\n    const { prefix, text, value, wrapperClasses, labelKey } = typeahead;\n\n    const result = await lokiLanguageProvider.provideCompletionItems(\n      { text, value, prefix, wrapperClasses, labelKey },\n      { history, absoluteRange }\n    );\n\n    //console.log('handleTypeahead', wrapperClasses, text, prefix, nextChar, labelKey, result.context);\n\n    return result;\n  };\n\n  render() {\n    const {\n      ExtraFieldElement,\n      query,\n      syntaxLoaded,\n      logLabelOptions,\n      onLoadOptions,\n      onLabelsRefresh,\n      datasource,\n    } = this.props;\n    const lokiLanguageProvider = datasource.languageProvider as LokiLanguageProvider;\n    const cleanText = datasource.languageProvider ? lokiLanguageProvider.cleanText : undefined;\n    const hasLogLabels = logLabelOptions && logLabelOptions.length > 0;\n    const chooserText = getChooserText(syntaxLoaded, hasLogLabels);\n    const buttonDisabled = !(syntaxLoaded && hasLogLabels);\n\n    return (\n      <>\n        <div className=\"gf-form-inline gf-form-inline--nowrap flex-grow-1\">\n          <div className=\"gf-form flex-shrink-0\">\n            <ButtonCascader\n              options={logLabelOptions || []}\n              disabled={buttonDisabled}\n              onChange={this.onChangeLogLabels}\n              loadData={onLoadOptions}\n              onPopupVisibleChange={isVisible => isVisible && onLabelsRefresh && onLabelsRefresh()}\n            >\n              {chooserText}\n            </ButtonCascader>\n          </div>\n          <div className=\"gf-form gf-form--grow flex-shrink-1\">\n            <QueryField\n              additionalPlugins={this.plugins}\n              cleanText={cleanText}\n              query={query.expr}\n              onTypeahead={this.onTypeahead}\n              onWillApplySuggestion={willApplySuggestion}\n              onChange={this.onChangeQuery}\n              onBlur={this.props.onBlur}\n              onRunQuery={this.props.onRunQuery}\n              placeholder=\"Enter a Loki query (run with Shift+Enter)\"\n              portalOrigin=\"loki\"\n              syntaxLoaded={syntaxLoaded}\n            />\n          </div>\n          {ExtraFieldElement}\n        </div>\n      </>\n    );\n  }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport {\n  DashboardInitPhase,\n  DashboardState,\n  DashboardAclDTO,\n  DashboardInitError,\n  PanelState,\n  QueriesToUpdateOnDashboardLoad,\n} from 'app/types';\nimport { AngularComponent } from '@grafana/runtime';\nimport { EDIT_PANEL_ID } from 'app/core/constants';\nimport { processAclItems } from 'app/core/utils/acl';\nimport { panelEditorReducer } from '../components/PanelEditor/state/reducers';\nimport { DashboardModel } from './DashboardModel';\nimport { PanelModel } from './PanelModel';\nimport { PanelPlugin } from '@grafana/data';\n\nexport const initialState: DashboardState = {\n  initPhase: DashboardInitPhase.NotStarted,\n  isInitSlow: false,\n  getModel: () => null,\n  permissions: [],\n  modifiedQueries: null,\n  panels: {},\n  initError: null,\n};\n\nconst dashbardSlice = createSlice({\n  name: 'dashboard',\n  initialState,\n  reducers: {\n    loadDashboardPermissions: (state, action: PayloadAction<DashboardAclDTO[]>) => {\n      state.permissions = processAclItems(action.payload);\n    },\n    dashboardInitFetching: (state, action: PayloadAction) => {\n      state.initPhase = DashboardInitPhase.Fetching;\n    },\n    dashboardInitServices: (state, action: PayloadAction) => {\n      state.initPhase = DashboardInitPhase.Services;\n    },\n    dashboardInitSlow: (state, action: PayloadAction) => {\n      state.isInitSlow = true;\n    },\n    dashboardInitCompleted: (state, action: PayloadAction<DashboardModel>) => {\n      state.getModel = () => action.payload;\n      state.initPhase = DashboardInitPhase.Completed;\n      state.isInitSlow = false;\n\n      for (const panel of action.payload.panels) {\n        state.panels[panel.id] = {\n          pluginId: panel.type,\n        };\n      }\n    },\n    dashboardInitFailed: (state, action: PayloadAction<DashboardInitError>) => {\n      state.initPhase = DashboardInitPhase.Failed;\n      state.initError = action.payload;\n      state.getModel = () => {\n        return new DashboardModel({ title: 'Dashboard init failed' }, { canSave: false, canEdit: false });\n      };\n    },\n    cleanUpDashboard: (state, action: PayloadAction) => {\n      if (state.getModel()) {\n        state.getModel()!.destroy();\n        state.getModel = () => null;\n      }\n\n      state.panels = {};\n      state.initPhase = DashboardInitPhase.NotStarted;\n      state.isInitSlow = false;\n      state.initError = null;\n    },\n    setDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction<QueriesToUpdateOnDashboardLoad>) => {\n      state.modifiedQueries = action.payload;\n    },\n    clearDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction) => {\n      state.modifiedQueries = null;\n    },\n    panelModelAndPluginReady: (state: DashboardState, action: PayloadAction<PanelModelAndPluginReadyPayload>) => {\n      updatePanelState(state, action.payload.panelId, { plugin: action.payload.plugin });\n    },\n    cleanUpEditPanel: (state, action: PayloadAction) => {\n      // TODO: refactor, since the state should be mutated by copying only\n      delete state.panels[EDIT_PANEL_ID];\n    },\n    setPanelAngularComponent: (state: DashboardState, action: PayloadAction<SetPanelAngularComponentPayload>) => {\n      updatePanelState(state, action.payload.panelId, { angularComponent: action.payload.angularComponent });\n    },\n    addPanel: (state, action: PayloadAction<PanelModel>) => {\n      // TODO: refactor, since the state should be mutated by copying only\n      state.panels[action.payload.id] = { pluginId: action.payload.type };\n    },\n  },\n});\n\nexport function updatePanelState(state: DashboardState, panelId: number, ps: Partial<PanelState>) {\n  if (!state.panels[panelId]) {\n    state.panels[panelId] = ps as PanelState;\n  } else {\n    Object.assign(state.panels[panelId], ps);\n  }\n}\n\nexport interface PanelModelAndPluginReadyPayload {\n  panelId: number;\n  plugin: PanelPlugin;\n}\n\nexport interface SetPanelAngularComponentPayload {\n  panelId: number;\n  angularComponent: AngularComponent | null;\n}\n\nexport const {\n  loadDashboardPermissions,\n  dashboardInitFetching,\n  dashboardInitFailed,\n  dashboardInitSlow,\n  dashboardInitCompleted,\n  dashboardInitServices,\n  cleanUpDashboard,\n  setDashboardQueriesToUpdateOnLoad,\n  clearDashboardQueriesToUpdateOnLoad,\n  panelModelAndPluginReady,\n  addPanel,\n  cleanUpEditPanel,\n  setPanelAngularComponent,\n} = dashbardSlice.actions;\n\nexport const dashboardReducer = dashbardSlice.reducer;\n\nexport default {\n  dashboard: dashboardReducer,\n  panelEditor: panelEditorReducer,\n};\n","import { TimeRange, toUtc, AbsoluteTimeRange } from '@grafana/data';\n\nexport const getShiftedTimeRange = (direction: number, origRange: TimeRange): AbsoluteTimeRange => {\n  const range = {\n    from: toUtc(origRange.from),\n    to: toUtc(origRange.to),\n  };\n\n  const timespan = (range.to.valueOf() - range.from.valueOf()) / 2;\n  let to: number, from: number;\n\n  if (direction === -1) {\n    to = range.to.valueOf() - timespan;\n    from = range.from.valueOf() - timespan;\n  } else if (direction === 1) {\n    to = range.to.valueOf() + timespan;\n    from = range.from.valueOf() + timespan;\n    if (to > Date.now() && range.to.valueOf() < Date.now()) {\n      to = Date.now();\n      from = range.from.valueOf();\n    }\n  } else {\n    to = range.to.valueOf();\n    from = range.from.valueOf();\n  }\n\n  return { from, to };\n};\n\nexport const getZoomedTimeRange = (range: TimeRange, factor: number): AbsoluteTimeRange => {\n  const timespan = range.to.valueOf() - range.from.valueOf();\n  const center = range.to.valueOf() - timespan / 2;\n\n  const to = center + (timespan * factor) / 2;\n  const from = center - (timespan * factor) / 2;\n\n  return { from, to };\n};\n","import React from 'react';\nimport config from 'app/core/config';\n\nimport { updateLocation } from 'app/core/actions';\nimport { connect } from 'react-redux';\nimport { StoreState } from 'app/types';\nimport { PureComponent } from 'react';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { hot } from 'react-hot-loader';\nimport appEvents from 'app/core/app_events';\nimport { AppEvents } from '@grafana/data';\n\nconst isOauthEnabled = () => {\n  return !!config.oauth && Object.keys(config.oauth).length > 0;\n};\n\nexport interface FormModel {\n  user: string;\n  password: string;\n  email: string;\n}\ninterface Props {\n  routeParams?: any;\n  updateLocation?: typeof updateLocation;\n  children: (props: {\n    isLoggingIn: boolean;\n    changePassword: (pw: string) => void;\n    isChangingPassword: boolean;\n    skipPasswordChange: Function;\n    login: (data: FormModel) => void;\n    disableLoginForm: boolean;\n    ldapEnabled: boolean;\n    authProxyEnabled: boolean;\n    disableUserSignUp: boolean;\n    isOauthEnabled: boolean;\n    loginHint: string;\n    passwordHint: string;\n  }) => JSX.Element;\n}\n\ninterface State {\n  isLoggingIn: boolean;\n  isChangingPassword: boolean;\n}\n\nexport class LoginCtrl extends PureComponent<Props, State> {\n  result: any = {};\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      isLoggingIn: false,\n      isChangingPassword: false,\n    };\n\n    if (config.loginError) {\n      appEvents.emit(AppEvents.alertWarning, ['Login Failed', config.loginError]);\n    }\n  }\n\n  changePassword = (password: string) => {\n    const pw = {\n      newPassword: password,\n      confirmNew: password,\n      oldPassword: 'admin',\n    };\n    getBackendSrv()\n      .put('/api/user/password', pw)\n      .then(() => {\n        this.toGrafana();\n      })\n      .catch((err: any) => console.log(err));\n  };\n\n  login = (formModel: FormModel) => {\n    this.setState({\n      isLoggingIn: true,\n    });\n\n    getBackendSrv()\n      .post('/login', formModel)\n      .then((result: any) => {\n        this.result = result;\n        if (formModel.password !== 'admin' || config.ldapEnabled || config.authProxyEnabled) {\n          this.toGrafana();\n          return;\n        } else {\n          this.changeView();\n        }\n      })\n      .catch(() => {\n        this.setState({\n          isLoggingIn: false,\n        });\n      });\n  };\n\n  changeView = () => {\n    this.setState({\n      isChangingPassword: true,\n    });\n  };\n\n  toGrafana = () => {\n    const params = this.props.routeParams;\n    // Use window.location.href to force page reload\n    if (params.redirect && params.redirect[0] === '/') {\n      if (config.appSubUrl !== '' && !params.redirect.startsWith(config.appSubUrl)) {\n        window.location.href = config.appSubUrl + params.redirect;\n      } else {\n        window.location.href = params.redirect;\n      }\n    } else if (this.result.redirectUrl) {\n      if (config.appSubUrl !== '' && !this.result.redirectUrl.startsWith(config.appSubUrl)) {\n        window.location.href = config.appSubUrl + this.result.redirectUrl;\n      } else {\n        window.location.href = this.result.redirectUrl;\n      }\n    } else {\n      window.location.href = config.appSubUrl + '/';\n    }\n  };\n\n  render() {\n    const { children } = this.props;\n    const { isLoggingIn, isChangingPassword } = this.state;\n    const { login, toGrafana, changePassword } = this;\n    const { loginHint, passwordHint, disableLoginForm, ldapEnabled, authProxyEnabled, disableUserSignUp } = config;\n\n    return (\n      <>\n        {children({\n          isOauthEnabled: isOauthEnabled(),\n          loginHint,\n          passwordHint,\n          disableLoginForm,\n          ldapEnabled,\n          authProxyEnabled,\n          disableUserSignUp,\n          login,\n          isLoggingIn,\n          changePassword,\n          skipPasswordChange: toGrafana,\n          isChangingPassword,\n        })}\n      </>\n    );\n  }\n}\n\nexport const mapStateToProps = (state: StoreState) => ({\n  routeParams: state.location.routeParams,\n});\n\nconst mapDispatchToProps = { updateLocation };\n\nexport default hot(module)(connect(mapStateToProps, mapDispatchToProps)(LoginCtrl));\n","import { QueryVariableModel, VariableModel, AdHocVariableModel, VariableWithMultiSupport } from '../templating/types';\n\nexport const isQuery = (model: VariableModel): model is QueryVariableModel => {\n  return model.type === 'query';\n};\n\nexport const isAdHoc = (model: VariableModel): model is AdHocVariableModel => {\n  return model.type === 'adhoc';\n};\n\nexport const isMulti = (model: VariableModel): model is VariableWithMultiSupport => {\n  const withMulti = model as VariableWithMultiSupport;\n  return withMulti.hasOwnProperty('multi') && typeof withMulti.multi === 'boolean';\n};\n","var path = 'public/app/plugins/panel/graph/tab_display.html';\nvar html = \"<div class=gf-form-group>\\n  <gf-form-switch class=gf-form label=Bars label-class=width-8 checked=ctrl.panel.bars on-change=ctrl.render()></gf-form-switch>\\n\\n  <gf-form-switch class=gf-form label=Lines label-class=width-8 checked=ctrl.panel.lines on-change=ctrl.render()></gf-form-switch>\\n\\n  <div class=gf-form ng-if=ctrl.panel.lines>\\n    <label class=\\\"gf-form-label width-8\\\">Line width</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-5\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.linewidth ng-options=\\\"f for f in [0,1,2,3,4,5,6,7,8,9,10]\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n\\n  <gf-form-switch ng-disabled=!ctrl.panel.lines class=gf-form label=Staircase label-class=width-8 checked=ctrl.panel.steppedLine on-change=ctrl.render()></gf-form-switch>\\n\\n  <div class=gf-form ng-if=ctrl.panel.lines>\\n    <label class=\\\"gf-form-label width-8\\\">Area fill</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-5\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.fill ng-options=\\\"f for f in [0,1,2,3,4,5,6,7,8,9,10]\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-if=\\\"ctrl.panel.lines && ctrl.panel.fill\\\">\\n    <label class=\\\"gf-form-label width-8\\\">Fill gradient</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-5\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.fillGradient ng-options=\\\"f for f in [0,1,2,3,4,5,6,7,8,9,10]\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n\\n  <gf-form-switch class=gf-form label=Points label-class=width-8 checked=ctrl.panel.points on-change=ctrl.render()></gf-form-switch>\\n\\n  <div class=gf-form ng-if=ctrl.panel.points>\\n    <label class=\\\"gf-form-label width-8\\\">Point Radius</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-5\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.pointradius ng-options=\\\"f for f in [0.5,1,2,3,4,5,6,7,8,9,10]\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-group>\\n  <h5 class=section-heading>Hover tooltip</h5>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label width-9\\\">Mode</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-8\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.tooltip.shared ng-options=\\\"f.value as f.text for f in [{text: 'All series', value: true}, {text: 'Single', value: false}]\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label width-9\\\">Sort order</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-8\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.tooltip.sort ng-options=\\\"f.value as f.text for f in [{text: 'None', value: 0}, {text: 'Increasing', value: 1}, {text: 'Decreasing', value: 2}]\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n  <div class=gf-form ng-show=ctrl.panel.stack>\\n    <label class=\\\"gf-form-label width-9\\\">Stacked value</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-8\\\">\\n      <select class=gf-form-input ng-model=ctrl.panel.tooltip.value_type ng-options=\\\"f for f in ['cumulative','individual']\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-group>\\n  <h5 class=section-heading>Stacking and null value</h5>\\n  <gf-form-switch class=gf-form label=Stack label-class=width-7 checked=ctrl.panel.stack on-change=ctrl.render()>\\n  </gf-form-switch>\\n  <gf-form-switch class=gf-form ng-show=ctrl.panel.stack label=Percent label-class=width-7 checked=ctrl.panel.percentage on-change=ctrl.render()>\\n  </gf-form-switch>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label width-7\\\">Null value</label>\\n    <div class=gf-form-select-wrapper>\\n      <select class=\\\"gf-form-input max-width-9\\\" ng-model=ctrl.panel.nullPointMode ng-options=\\\"f for f in ['connected', 'null', 'null as zero']\\\" ng-change=ctrl.render()></select>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React from 'react';\nimport { ListProps, AbstractList } from './AbstractList';\n\nexport class List<T> extends React.PureComponent<ListProps<T>> {\n  render() {\n    return <AbstractList {...this.props} />;\n  }\n}\n","import _ from 'lodash';\nimport { PanelCtrl } from 'app/features/panel/panel_ctrl';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport {\n  DataFrame,\n  DataQueryResponse,\n  DataSourceApi,\n  LegacyResponseData,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  TimeRange,\n  toDataFrameDTO,\n  toLegacyResponseData,\n} from '@grafana/data';\nimport { Unsubscribable } from 'rxjs';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { PanelQueryRunner } from '../dashboard/state/PanelQueryRunner';\n\nclass MetricsPanelCtrl extends PanelCtrl {\n  scope: any;\n  datasource: DataSourceApi;\n  $timeout: any;\n  contextSrv: ContextSrv;\n  datasourceSrv: any;\n  timeSrv: any;\n  templateSrv: any;\n  range: TimeRange;\n  interval: any;\n  intervalMs: any;\n  resolution: any;\n  timeInfo?: string;\n  skipDataOnInit: boolean;\n  dataList: LegacyResponseData[];\n  querySubscription?: Unsubscribable;\n  useDataFrames = false;\n\n  constructor($scope: any, $injector: any) {\n    super($scope, $injector);\n\n    this.contextSrv = $injector.get('contextSrv');\n    this.datasourceSrv = $injector.get('datasourceSrv');\n    this.timeSrv = $injector.get('timeSrv');\n    this.templateSrv = $injector.get('templateSrv');\n    this.scope = $scope;\n    this.panel.datasource = this.panel.datasource || null;\n\n    this.events.on(PanelEvents.refresh, this.onMetricsPanelRefresh.bind(this));\n    this.events.on(PanelEvents.panelTeardown, this.onPanelTearDown.bind(this));\n    this.events.on(PanelEvents.componentDidMount, this.onMetricsPanelMounted.bind(this));\n  }\n\n  private onMetricsPanelMounted() {\n    const queryRunner = this.panel.getQueryRunner() as PanelQueryRunner;\n    this.querySubscription = queryRunner\n      .getData({ withTransforms: true, withFieldConfig: true })\n      .subscribe(this.panelDataObserver);\n  }\n\n  private onPanelTearDown() {\n    if (this.querySubscription) {\n      this.querySubscription.unsubscribe();\n      this.querySubscription = null;\n    }\n  }\n\n  private onMetricsPanelRefresh() {\n    // ignore fetching data if another panel is in fullscreen\n    if (this.otherPanelInFullscreenMode()) {\n      return;\n    }\n\n    // if we have snapshot data use that\n    if (this.panel.snapshotData) {\n      this.updateTimeRange();\n      let data = this.panel.snapshotData;\n      // backward compatibility\n      if (!_.isArray(data)) {\n        data = data.data;\n      }\n\n      // Defer panel rendering till the next digest cycle.\n      // For some reason snapshot panels don't init at this time, so this helps to avoid rendering issues.\n      return this.$timeout(() => {\n        this.events.emit(PanelEvents.dataSnapshotLoad, data);\n      });\n    }\n\n    // clear loading/error state\n    delete this.error;\n    this.loading = true;\n\n    // load datasource service\n    return this.datasourceSrv\n      .get(this.panel.datasource, this.panel.scopedVars)\n      .then(this.updateTimeRange.bind(this))\n      .then(this.issueQueries.bind(this))\n      .catch((err: any) => {\n        this.processDataError(err);\n      });\n  }\n\n  processDataError(err: any) {\n    // if canceled  keep loading set to true\n    if (err.cancelled) {\n      console.log('Panel request cancelled', err);\n      return;\n    }\n\n    this.error = err.message || 'Request Error';\n\n    if (err.data) {\n      if (err.data.message) {\n        this.error = err.data.message;\n      } else if (err.data.error) {\n        this.error = err.data.error;\n      }\n    }\n\n    this.angularDirtyCheck();\n  }\n\n  angularDirtyCheck() {\n    if (!this.$scope.$root.$$phase) {\n      this.$scope.$digest();\n    }\n  }\n\n  // Updates the response with information from the stream\n  panelDataObserver = {\n    next: (data: PanelData) => {\n      if (data.state === LoadingState.Error) {\n        this.loading = false;\n        this.processDataError(data.error);\n      }\n\n      // Ignore data in loading state\n      if (data.state === LoadingState.Loading) {\n        this.loading = true;\n        this.angularDirtyCheck();\n        return;\n      }\n\n      if (data.request) {\n        const { timeInfo } = data.request;\n        if (timeInfo) {\n          this.timeInfo = timeInfo;\n        }\n      }\n\n      if (data.timeRange) {\n        this.range = data.timeRange;\n      }\n\n      if (this.useDataFrames) {\n        this.handleDataFrames(data.series);\n      } else {\n        // Make the results look as if they came directly from a <6.2 datasource request\n        const legacy = data.series.map(v => toLegacyResponseData(v));\n        this.handleQueryResult({ data: legacy });\n      }\n\n      this.angularDirtyCheck();\n    },\n  };\n\n  updateTimeRange(datasource?: DataSourceApi) {\n    this.datasource = datasource || this.datasource;\n    this.range = this.timeSrv.timeRange();\n\n    const newTimeData = applyPanelTimeOverrides(this.panel, this.range);\n    this.timeInfo = newTimeData.timeInfo;\n    this.range = newTimeData.timeRange;\n\n    return this.datasource;\n  }\n\n  issueQueries(datasource: DataSourceApi) {\n    this.datasource = datasource;\n\n    const panel = this.panel as PanelModel;\n    const queryRunner = panel.getQueryRunner();\n\n    return queryRunner.run({\n      datasource: panel.datasource,\n      queries: panel.targets,\n      panelId: panel.id,\n      dashboardId: this.dashboard.id,\n      timezone: this.dashboard.getTimezone(),\n      timeInfo: this.timeInfo,\n      timeRange: this.range,\n      maxDataPoints: panel.maxDataPoints || this.width,\n      minInterval: panel.interval,\n      scopedVars: panel.scopedVars,\n      cacheTimeout: panel.cacheTimeout,\n      transformations: panel.transformations,\n    });\n  }\n\n  handleDataFrames(data: DataFrame[]) {\n    this.loading = false;\n\n    if (this.dashboard && this.dashboard.snapshot) {\n      this.panel.snapshotData = data.map(frame => toDataFrameDTO(frame));\n    }\n\n    try {\n      this.events.emit(PanelEvents.dataFramesReceived, data);\n    } catch (err) {\n      this.processDataError(err);\n    }\n  }\n\n  handleQueryResult(result: DataQueryResponse) {\n    this.loading = false;\n\n    if (this.dashboard.snapshot) {\n      this.panel.snapshotData = result.data;\n    }\n\n    if (!result || !result.data) {\n      console.log('Data source query result invalid, missing data field:', result);\n      result = { data: [] };\n    }\n\n    try {\n      this.events.emit(PanelEvents.dataReceived, result.data);\n    } catch (err) {\n      this.processDataError(err);\n    }\n  }\n}\n\nexport { MetricsPanelCtrl };\n","import { PanelCtrl } from 'app/features/panel/panel_ctrl';\nimport { MetricsPanelCtrl } from 'app/features/panel/metrics_panel_ctrl';\nimport { QueryCtrl } from 'app/features/panel/query_ctrl';\nimport { alertTab } from 'app/features/alerting/AlertTabCtrl';\nimport { loadPluginCss } from '@grafana/runtime';\n\nexport { PanelCtrl, MetricsPanelCtrl, QueryCtrl, alertTab, loadPluginCss };\n","var path = 'public/app/plugins/datasource/elasticsearch/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n\\t<div class=gf-form ng-if=ctrl.annotation.index>\\n\\t\\t<span class=\\\"gf-form-label width-14\\\">Index name</span>\\n\\t\\t<input type=text class=\\\"gf-form-input max-width-20\\\" ng-model=ctrl.annotation.index placeholder=events-*>\\n\\t</div>\\n\\t<div class=gf-form-group>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.annotation.query placeholder=\\\"Elasticsearch lucene query\\\">\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n<div class=gf-form-group>\\n\\t<h6>Field mappings</h6>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=gf-form-label>Time</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-14\\\" ng-model=ctrl.annotation.timeField placeholder=@timestamp>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=gf-form-label>Time End</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-14\\\" ng-model=ctrl.annotation.timeEndField placeholder=\\\"\\\">\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=gf-form-label>Text</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-14\\\" ng-model=ctrl.annotation.textField placeholder=\\\"\\\">\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=gf-form-label>Tags</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-10\\\" ng-model=ctrl.annotation.tagsField placeholder=tags>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-show=ctrl.annotation.titleField>\\n\\t\\t\\t<span class=gf-form-label>Title <em class=muted>(deprecated)</em></span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-16\\\" ng-model=ctrl.annotation.titleField placeholder=desc>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/features/playlist/partials/playlists.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n  <div ng-if=\\\"ctrl.playlists.length > 0\\\">\\n    <div class=page-action-bar>\\n      <div class=page-action-bar__spacer></div>\\n      <a class=\\\"btn btn-primary pull-right\\\" href=playlists/create>\\n        New playlist\\n      </a>\\n    </div>\\n\\n    <table class=\\\"filter-table filter-table--hover\\\">\\n      <thead>\\n        <th><strong>Name</strong></th>\\n        <th style=width:100px></th>\\n        <th style=width:78px></th>\\n      </thead>\\n      <tr ng-repeat=\\\"playlist in ctrl.playlists\\\">\\n        <td class=link-td>\\n          <a href=playlists/edit/{{playlist.id}}>{{playlist.name}}</a>\\n        </td>\\n        <td class=dropdown>\\n          <button class=\\\"btn btn-inverse btn-small\\\" data-toggle=dropdown>\\n            Start playlist\\n            <icon name=\\\"'angle-down'\\\"></icon>\\n          </button>\\n          <ul class=dropdown-menu role=menu>\\n            <li>\\n              <a href={{playlist.startUrl}}>\\n                <icon name=\\\"'play'\\\"></icon> In Normal mode\\n              </a>\\n              <a href=\\\"{{playlist.startUrl}}?kiosk=tv\\\">\\n                <icon name=\\\"'play'\\\"></icon> In TV mode\\n              </a>\\n              <a href=\\\"{{playlist.startUrl}}?kiosk=tv&autofitpanels\\\">\\n                <icon name=\\\"'play'\\\"></icon> In TV mode <span class=muted>(with auto fit panels)</span>\\n              </a>\\n              <a href={{playlist.startUrl}}?kiosk>\\n                <icon name=\\\"'play'\\\"></icon> In Kiosk mode\\n              </a>\\n              <a ng-href={{playlist.startUrl}}?kiosk&autofitpanels>\\n                <icon name=\\\"'play'\\\"></icon> In Kiosk mode <span class=muted>(with auto fit panels)</span>\\n              </a>\\n            </li>\\n          </ul>\\n        </td>\\n        <td class=text-right>\\n          <a ng-click=ctrl.removePlaylist(playlist) class=\\\"btn btn-danger btn-small\\\">\\n            <icon name=\\\"'times'\\\"></icon>\\n          </a>\\n        </td>\\n      </tr>\\n    </table>\\n  </div>\\n  <div ng-if=\\\"ctrl.playlists.length === 0\\\">\\n    <empty-list-cta title=\\\"'There are no playlists created yet'\\\" buttonicon=\\\"'plus'\\\" buttonlink=\\\"'playlists/create'\\\" buttontitle=\\\"'Create Playlist'\\\" protip=\\\"'You can use playlists to cycle dashboards on TVs without user control'\\\" protiplink=\\\"'http://docs.grafana.org/reference/playlist/'\\\" protiplinktitle=\\\"'Learn more'\\\" protiptarget=\\\"'_blank'\\\"/>\\n  </div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport {\n  DataLink,\n  DisplayValue,\n  Field,\n  FieldDisplay,\n  formattedValueToString,\n  getFieldDisplayValuesProxy,\n  getTimeField,\n  Labels,\n  LinkModel,\n  LinkModelSupplier,\n  ScopedVar,\n  ScopedVars,\n} from '@grafana/data';\nimport { getLinkSrv } from './link_srv';\nimport { config } from 'app/core/config';\n\ninterface SeriesVars {\n  name?: string;\n  refId?: string;\n}\n\ninterface FieldVars {\n  name: string;\n  labels?: Labels;\n}\n\ninterface ValueVars {\n  raw: any;\n  numeric: number;\n  text: string;\n  time?: number;\n  calc?: string;\n}\n\ninterface DataViewVars {\n  name?: string;\n  refId?: string;\n  fields?: Record<string, DisplayValue>;\n}\n\ninterface DataLinkScopedVars extends ScopedVars {\n  __series?: ScopedVar<SeriesVars>;\n  __field?: ScopedVar<FieldVars>;\n  __value?: ScopedVar<ValueVars>;\n  __data?: ScopedVar<DataViewVars>;\n}\n\n/**\n * Link suppliers creates link models based on a link origin\n */\n\nexport const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<FieldDisplay> | undefined => {\n  const links = value.field.links;\n  if (!links || links.length === 0) {\n    return undefined;\n  }\n  return {\n    getLinks: (_scopedVars?: any) => {\n      const scopedVars: DataLinkScopedVars = {};\n\n      if (value.view) {\n        const { dataFrame } = value.view;\n\n        scopedVars['__series'] = {\n          value: {\n            name: dataFrame.name,\n            refId: dataFrame.refId,\n          },\n          text: 'Series',\n        };\n\n        const field = value.colIndex !== undefined ? dataFrame.fields[value.colIndex] : undefined;\n        if (field) {\n          console.log('Full Field Info:', field);\n          scopedVars['__field'] = {\n            value: {\n              name: field.name,\n              labels: field.labels,\n            },\n            text: 'Field',\n          };\n        }\n\n        if (!isNaN(value.rowIndex)) {\n          const { timeField } = getTimeField(dataFrame);\n          scopedVars['__value'] = {\n            value: {\n              raw: field.values.get(value.rowIndex),\n              numeric: value.display.numeric,\n              text: formattedValueToString(value.display),\n              time: timeField ? timeField.values.get(value.rowIndex) : undefined,\n            },\n            text: 'Value',\n          };\n\n          // Expose other values on the row\n          if (value.view) {\n            scopedVars['__data'] = {\n              value: {\n                name: dataFrame.name,\n                refId: dataFrame.refId,\n                fields: getFieldDisplayValuesProxy(dataFrame, value.rowIndex!, {\n                  theme: config.theme,\n                }),\n              },\n              text: 'Data',\n            };\n          }\n        } else {\n          // calculation\n          scopedVars['__value'] = {\n            value: {\n              raw: value.display.numeric,\n              numeric: value.display.numeric,\n              text: formattedValueToString(value.display),\n              calc: value.name,\n            },\n            text: 'Value',\n          };\n        }\n      } else {\n        console.log('VALUE', value);\n      }\n\n      return links.map(link => {\n        return getLinkSrv().getDataLinkUIModel(link, scopedVars, value);\n      });\n    },\n  };\n};\n\nexport const getPanelLinksSupplier = (value: PanelModel): LinkModelSupplier<PanelModel> => {\n  const links = value.links;\n\n  if (!links || links.length === 0) {\n    return undefined;\n  }\n\n  return {\n    getLinks: () => {\n      return links.map(link => {\n        return getLinkSrv().getDataLinkUIModel(link, value.scopedVars, value);\n      });\n    },\n  };\n};\n\nexport const getLinksFromLogsField = (\n  field: Field,\n  rowIndex: number\n): Array<{ linkModel: LinkModel<Field>; link: DataLink }> => {\n  const scopedVars: any = {};\n  scopedVars['__value'] = {\n    value: {\n      raw: field.values.get(rowIndex),\n    },\n    text: 'Raw value',\n  };\n\n  return field.config.links\n    ? field.config.links.map(link => {\n        return {\n          link,\n          linkModel: getLinkSrv().getDataLinkUIModel(link, scopedVars, field),\n        };\n      })\n    : [];\n};\n","import { ThemeContext, withTheme, useTheme, useStyles, mockThemeContext } from './ThemeContext';\nimport { getTheme, mockTheme } from './getTheme';\nimport { selectThemeVariant } from './selectThemeVariant';\nexport { stylesFactory } from './stylesFactory';\nexport { ThemeContext, withTheme, mockTheme, getTheme, selectThemeVariant, useTheme, mockThemeContext, useStyles };\n\nimport * as styleMixins from './mixins';\nexport { styleMixins };\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\nimport RCCascader from 'rc-cascader';\n\nimport { Select } from '../Select/Select';\nimport { Input } from '../Input/Input';\nimport { SelectableValue } from '@grafana/data';\nimport { css } from 'emotion';\nimport { onChangeCascader } from './optionMappings';\n\ninterface CascaderProps {\n  /** The seperator between levels in the search */\n  separator?: string;\n  placeholder?: string;\n  options: CascaderOption[];\n  onSelect(val: string): void;\n  /** Sets the width to a multiple of 8px. Should only be used with inline forms. Setting width of the container is preferred in other cases.*/\n  width?: number;\n  initialValue?: string;\n  allowCustomValue?: boolean;\n  /** A function for formatting the message for custom value creation. Only applies when allowCustomValue is set to true*/\n  formatCreateLabel?: (val: string) => string;\n}\n\ninterface CascaderState {\n  isSearching: boolean;\n  searchableOptions: Array<SelectableValue<string[]>>;\n  focusCascade: boolean;\n  //Array for cascade navigation\n  rcValue: SelectableValue<string[]>;\n  activeLabel: string;\n}\n\nexport interface CascaderOption {\n  /**\n   *  The value used under the hood\n   */\n  value: any;\n  /**\n   *  The label to display in the UI\n   */\n  label: string;\n  /** Items will be just flattened into the main list of items recursively. */\n  items?: CascaderOption[];\n  disabled?: boolean;\n  /** Avoid using */\n  title?: string;\n  /**  Children will be shown in a submenu. Use 'items' instead, as 'children' exist to ensure backwards compatibility.*/\n  children?: CascaderOption[];\n}\n\nconst disableDivFocus = css(`\n&:focus{\n  outline: none;\n}\n`);\n\nexport class Cascader extends React.PureComponent<CascaderProps, CascaderState> {\n  constructor(props: CascaderProps) {\n    super(props);\n    const searchableOptions = this.flattenOptions(props.options);\n    const { rcValue, activeLabel } = this.setInitialValue(searchableOptions, props.initialValue);\n    this.state = {\n      isSearching: false,\n      focusCascade: false,\n      searchableOptions,\n      rcValue,\n      activeLabel,\n    };\n  }\n\n  flattenOptions = (options: CascaderOption[], optionPath: CascaderOption[] = []) => {\n    let selectOptions: Array<SelectableValue<string[]>> = [];\n    for (const option of options) {\n      const cpy = [...optionPath];\n      cpy.push(option);\n      if (!option.items) {\n        selectOptions.push({\n          singleLabel: cpy[cpy.length - 1].label,\n          label: cpy.map(o => o.label).join(this.props.separator || ' / '),\n          value: cpy.map(o => o.value),\n        });\n      } else {\n        selectOptions = [...selectOptions, ...this.flattenOptions(option.items, cpy)];\n      }\n    }\n    return selectOptions;\n  };\n\n  setInitialValue(searchableOptions: Array<SelectableValue<string[]>>, initValue?: string) {\n    if (!initValue) {\n      return { rcValue: [], activeLabel: '' };\n    }\n    for (const option of searchableOptions) {\n      const optionPath = option.value || [];\n\n      if (optionPath.indexOf(initValue) === optionPath.length - 1) {\n        return {\n          rcValue: optionPath,\n          activeLabel: option.singleLabel || '',\n        };\n      }\n    }\n    if (this.props.allowCustomValue) {\n      return { rcValue: [], activeLabel: initValue };\n    }\n    return { rcValue: [], activeLabel: '' };\n  }\n\n  //For rc-cascader\n  onChange = (value: string[], selectedOptions: CascaderOption[]) => {\n    this.setState({\n      rcValue: value,\n      focusCascade: true,\n      activeLabel: selectedOptions[selectedOptions.length - 1].label,\n    });\n\n    this.props.onSelect(selectedOptions[selectedOptions.length - 1].value);\n  };\n\n  //For select\n  onSelect = (obj: SelectableValue<string[]>) => {\n    const valueArray = obj.value || [];\n    this.setState({\n      activeLabel: obj.singleLabel || '',\n      rcValue: valueArray,\n      isSearching: false,\n    });\n    this.props.onSelect(valueArray[valueArray.length - 1]);\n  };\n\n  onCreateOption = (value: string) => {\n    this.setState({\n      activeLabel: value,\n      rcValue: [],\n      isSearching: false,\n    });\n    this.props.onSelect(value);\n  };\n\n  onBlur = () => {\n    this.setState({\n      isSearching: false,\n      focusCascade: false,\n    });\n\n    if (this.state.activeLabel === '') {\n      this.setState({\n        rcValue: [],\n      });\n    }\n  };\n\n  onBlurCascade = () => {\n    this.setState({\n      focusCascade: false,\n    });\n  };\n\n  onInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (\n      e.key === 'ArrowDown' ||\n      e.key === 'ArrowUp' ||\n      e.key === 'Enter' ||\n      e.key === 'ArrowLeft' ||\n      e.key === 'ArrowRight'\n    ) {\n      return;\n    }\n    this.setState({\n      focusCascade: false,\n      isSearching: true,\n    });\n  };\n\n  render() {\n    const { allowCustomValue, placeholder, width } = this.props;\n    const { focusCascade, isSearching, searchableOptions, rcValue, activeLabel } = this.state;\n\n    return (\n      <div>\n        {isSearching ? (\n          <Select\n            allowCustomValue={allowCustomValue}\n            placeholder={placeholder}\n            autoFocus={!focusCascade}\n            onChange={this.onSelect}\n            onBlur={this.onBlur}\n            options={searchableOptions}\n            onCreateOption={this.onCreateOption}\n            formatCreateLabel={this.props.formatCreateLabel}\n            width={width}\n          />\n        ) : (\n          <RCCascader\n            onChange={onChangeCascader(this.onChange)}\n            options={this.props.options}\n            changeOnSelect\n            value={rcValue.value}\n            fieldNames={{ label: 'label', value: 'value', children: 'items' }}\n            expandIcon={null}\n            // Required, otherwise the portal that the popup is shown in will render under other components\n            popupClassName={css`\n              z-index: 9999;\n            `}\n          >\n            <div className={disableDivFocus}>\n              <Input\n                width={width}\n                placeholder={placeholder}\n                onBlur={this.onBlurCascade}\n                value={activeLabel}\n                onKeyDown={this.onInputKeyDown}\n                onChange={() => {}}\n                suffix={\n                  focusCascade ? (\n                    <Icon name=\"angle-up\" />\n                  ) : (\n                    <Icon name=\"angle-down\" style={{ marginBottom: 0, marginLeft: '4px' }} />\n                  )\n                }\n              />\n            </div>\n          </RCCascader>\n        )}\n      </div>\n    );\n  }\n}\n","import React from 'react';\nimport { Button, ButtonVariant, ModalsController, FullWidthButtonContainer } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { connectWithProvider } from 'app/core/utils/connectWithReduxStore';\nimport { provideModalsContext } from 'app/routes/ReactContainer';\nimport { SaveDashboardAsModal } from './SaveDashboardAsModal';\nimport { SaveDashboardModalProxy } from './SaveDashboardModalProxy';\n\ninterface SaveDashboardButtonProps {\n  dashboard: DashboardModel;\n  /**\n   * Added for being able to render this component as Angular directive!\n   * TODO[angular-migrations]: Remove when we migrate Dashboard Settings view to React\n   */\n  getDashboard?: () => DashboardModel;\n  onSaveSuccess?: () => void;\n}\n\nexport const SaveDashboardButton: React.FC<SaveDashboardButtonProps> = ({ dashboard, onSaveSuccess, getDashboard }) => {\n  return (\n    <ModalsController>\n      {({ showModal, hideModal }) => {\n        return (\n          <Button\n            onClick={() => {\n              showModal(SaveDashboardModalProxy, {\n                // TODO[angular-migrations]: Remove tenary op when we migrate Dashboard Settings view to React\n                dashboard: getDashboard ? getDashboard() : dashboard,\n                onSaveSuccess,\n                onDismiss: hideModal,\n              });\n            }}\n          >\n            Save dashboard\n          </Button>\n        );\n      }}\n    </ModalsController>\n  );\n};\n\nexport const SaveDashboardAsButton: React.FC<SaveDashboardButtonProps & { variant?: ButtonVariant }> = ({\n  dashboard,\n  onSaveSuccess,\n  getDashboard,\n  variant,\n}) => {\n  return (\n    <ModalsController>\n      {({ showModal, hideModal }) => {\n        return (\n          <FullWidthButtonContainer>\n            <Button\n              onClick={() => {\n                showModal(SaveDashboardAsModal, {\n                  // TODO[angular-migrations]: Remove tenary op when we migrate Dashboard Settings view to React\n                  dashboard: getDashboard ? getDashboard() : dashboard,\n                  onSaveSuccess,\n                  onDismiss: hideModal,\n                });\n              }}\n              // TODO[angular-migrations]: Hacking the different variants for this single button\n              // In Dashboard Settings in sidebar we need to use new form but with inverse variant to make it look like it should\n              // Everywhere else we use old button component :(\n              variant={variant as ButtonVariant}\n            >\n              Save As...\n            </Button>\n          </FullWidthButtonContainer>\n        );\n      }}\n    </ModalsController>\n  );\n};\n\n// TODO: this is an ugly solution for the save button to have access to Redux and Modals controller\n// When we migrate dashboard settings to Angular it won't be necessary.\nexport const SaveDashboardButtonConnected = connectWithProvider(provideModalsContext(SaveDashboardButton));\nexport const SaveDashboardAsButtonConnected = connectWithProvider(provideModalsContext(SaveDashboardAsButton));\n","import React, { PureComponent, ChangeEvent } from 'react';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { ExploreQueryFieldProps } from '@grafana/data';\nimport { LegacyForms, ValidationEvents, EventsWithValidation, Icon } from '@grafana/ui';\nconst { Input, Switch } = LegacyForms;\nimport { CloudWatchQuery, CloudWatchMetricsQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { QueryField, Alias, MetricsQueryFieldsEditor } from './';\n\nexport type Props = ExploreQueryFieldProps<CloudWatchDatasource, CloudWatchQuery>;\n\ninterface State {\n  showMeta: boolean;\n}\n\nconst idValidationEvents: ValidationEvents = {\n  [EventsWithValidation.onBlur]: [\n    {\n      rule: value => new RegExp(/^$|^[a-z][a-zA-Z0-9_]*$/).test(value),\n      errorMessage: 'Invalid format. Only alphanumeric characters and underscores are allowed',\n    },\n  ],\n};\n\nexport const normalizeQuery = ({\n  namespace,\n  metricName,\n  expression,\n  dimensions,\n  region,\n  id,\n  alias,\n  statistics,\n  period,\n  ...rest\n}: CloudWatchMetricsQuery): CloudWatchMetricsQuery => {\n  const normalizedQuery = {\n    namespace: namespace || '',\n    metricName: metricName || '',\n    expression: expression || '',\n    dimensions: dimensions || {},\n    region: region || 'default',\n    id: id || '',\n    alias: alias || '',\n    statistics: isEmpty(statistics) ? ['Average'] : statistics,\n    period: period || '',\n    ...rest,\n  };\n  return !rest.hasOwnProperty('matchExact') ? { ...normalizedQuery, matchExact: true } : normalizedQuery;\n};\n\nexport class MetricsQueryEditor extends PureComponent<Props, State> {\n  state: State = { showMeta: false };\n\n  componentDidMount(): void {\n    const metricsQuery = this.props.query as CloudWatchMetricsQuery;\n    const query = normalizeQuery(metricsQuery);\n    this.props.onChange(query);\n  }\n\n  onChange(query: CloudWatchMetricsQuery) {\n    const { onChange, onRunQuery } = this.props;\n    onChange(query);\n    onRunQuery();\n  }\n\n  render() {\n    const { data, onRunQuery } = this.props;\n    const metricsQuery = this.props.query as CloudWatchMetricsQuery;\n    const { showMeta } = this.state;\n    const query = normalizeQuery(metricsQuery);\n    const metaDataExist = data && Object.values(data).length && data.state === 'Done';\n\n    return (\n      <>\n        <MetricsQueryFieldsEditor {...{ ...this.props, query }}></MetricsQueryFieldsEditor>\n        {query.statistics.length <= 1 && (\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <QueryField\n                label=\"Id\"\n                tooltip=\"Id can include numbers, letters, and underscore, and must start with a lowercase letter.\"\n              >\n                <Input\n                  className=\"gf-form-input width-8\"\n                  onBlur={onRunQuery}\n                  onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                    this.onChange({ ...metricsQuery, id: event.target.value })\n                  }\n                  validationEvents={idValidationEvents}\n                  value={query.id}\n                />\n              </QueryField>\n            </div>\n            <div className=\"gf-form gf-form--grow\">\n              <QueryField\n                className=\"gf-form--grow\"\n                label=\"Expression\"\n                tooltip=\"Optionally you can add an expression here. Please note that if a math expression that is referencing other queries is being used, it will not be possible to create an alert rule based on this query\"\n              >\n                <Input\n                  className=\"gf-form-input\"\n                  onBlur={onRunQuery}\n                  value={query.expression || ''}\n                  onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                    this.onChange({ ...metricsQuery, expression: event.target.value })\n                  }\n                />\n              </QueryField>\n            </div>\n          </div>\n        )}\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <QueryField label=\"Period\" tooltip=\"Minimum interval between points in seconds\">\n              <Input\n                className=\"gf-form-input width-8\"\n                value={query.period || ''}\n                placeholder=\"auto\"\n                onBlur={onRunQuery}\n                onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                  this.onChange({ ...metricsQuery, period: event.target.value })\n                }\n              />\n            </QueryField>\n          </div>\n          <div className=\"gf-form\">\n            <QueryField\n              label=\"Alias\"\n              tooltip=\"Alias replacement variables: {{metric}}, {{stat}}, {{namespace}}, {{region}}, {{period}}, {{label}}, {{YOUR_DIMENSION_NAME}}\"\n            >\n              <Alias\n                value={metricsQuery.alias}\n                onChange={(value: string) => this.onChange({ ...metricsQuery, alias: value })}\n              />\n            </QueryField>\n            <Switch\n              label=\"Match Exact\"\n              labelClass=\"query-keyword\"\n              tooltip=\"Only show metrics that exactly match all defined dimension names.\"\n              checked={metricsQuery.matchExact}\n              onChange={() =>\n                this.onChange({\n                  ...metricsQuery,\n                  matchExact: !metricsQuery.matchExact,\n                })\n              }\n            />\n            <label className=\"gf-form-label\">\n              <a\n                onClick={() =>\n                  metaDataExist &&\n                  this.setState({\n                    showMeta: !showMeta,\n                  })\n                }\n              >\n                <Icon name={showMeta ? 'angle-down' : 'angle-right'} /> {showMeta ? 'Hide' : 'Show'} Query Preview\n              </a>\n            </label>\n          </div>\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label gf-form-label--grow\" />\n          </div>\n          {showMeta && metaDataExist && (\n            <table className=\"filter-table form-inline\">\n              <thead>\n                <tr>\n                  <th>Metric Data Query ID</th>\n                  <th>Metric Data Query Expression</th>\n                  <th>Period</th>\n                  <th />\n                </tr>\n              </thead>\n              <tbody>\n                {data?.series?.[0]?.meta?.gmdMeta?.map(({ ID, Expression, Period }: any) => (\n                  <tr key={ID}>\n                    <td>{ID}</td>\n                    <td>{Expression}</td>\n                    <td>{Period}</td>\n                  </tr>\n                ))}\n              </tbody>\n            </table>\n          )}\n        </div>\n      </>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { ExploreQueryFieldProps, ExploreMode } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\nimport { CloudWatchQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { QueryInlineField } from './';\nimport { MetricsQueryEditor } from './MetricsQueryEditor';\nimport LogsQueryEditor from './LogsQueryEditor';\n\nexport type Props = ExploreQueryFieldProps<CloudWatchDatasource, CloudWatchQuery>;\n\nconst apiModes = {\n  Metrics: { label: 'CloudWatch Metrics', value: 'Metrics' },\n  Logs: { label: 'CloudWatch Logs', value: 'Logs' },\n};\n\nexport class PanelQueryEditor extends PureComponent<Props> {\n  render() {\n    const { query } = this.props;\n    const apiMode = query.apiMode ?? query.queryMode ?? 'Metrics';\n\n    return (\n      <>\n        <QueryInlineField label=\"Query Mode\">\n          <Segment\n            value={apiModes[apiMode]}\n            options={Object.values(apiModes)}\n            onChange={({ value }) =>\n              this.props.onChange({ ...query, apiMode: (value as 'Metrics' | 'Logs') ?? 'Metrics' })\n            }\n          />\n        </QueryInlineField>\n        {apiMode === ExploreMode.Logs ? <LogsQueryEditor {...this.props} /> : <MetricsQueryEditor {...this.props} />}\n      </>\n    );\n  }\n}\n","// Libraries\nimport _ from 'lodash';\n// Utils\nimport kbn from 'app/core/utils/kbn';\nimport coreModule from 'app/core/core_module';\n// Types\nimport {\n  dateMath,\n  DefaultTimeRange,\n  TimeRange,\n  RawTimeRange,\n  TimeZone,\n  toUtc,\n  dateTime,\n  isDateTime,\n} from '@grafana/data';\nimport { ITimeoutService, ILocationService } from 'angular';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { getZoomedTimeRange, getShiftedTimeRange } from 'app/core/utils/timePicker';\nimport { appEvents } from '../../../core/core';\nimport { CoreEvents } from '../../../types';\n\nimport { config } from 'app/core/config';\n\nexport class TimeSrv {\n  time: any;\n  refreshTimer: any;\n  refresh: any;\n  oldRefresh: boolean;\n  dashboard: Partial<DashboardModel>;\n  timeAtLoad: any;\n  private autoRefreshBlocked: boolean;\n\n  /** @ngInject */\n  constructor(\n    $rootScope: GrafanaRootScope,\n    private $timeout: ITimeoutService,\n    private $location: ILocationService,\n    private timer: any,\n    private contextSrv: ContextSrv\n  ) {\n    // default time\n    this.time = DefaultTimeRange.raw;\n\n    appEvents.on(CoreEvents.zoomOut, this.zoomOut.bind(this));\n    appEvents.on(CoreEvents.shiftTime, this.shiftTime.bind(this));\n    $rootScope.$on('$routeUpdate', this.routeUpdated.bind(this));\n\n    document.addEventListener('visibilitychange', () => {\n      if (this.autoRefreshBlocked && document.visibilityState === 'visible') {\n        this.autoRefreshBlocked = false;\n        this.refreshDashboard();\n      }\n    });\n  }\n\n  init(dashboard: Partial<DashboardModel>) {\n    this.timer.cancelAll();\n\n    this.dashboard = dashboard;\n    this.time = dashboard.time;\n    this.refresh = dashboard.refresh;\n\n    this.initTimeFromUrl();\n    this.parseTime();\n\n    // remember time at load so we can go back to it\n    this.timeAtLoad = _.cloneDeep(this.time);\n\n    if (this.refresh) {\n      this.setAutoRefresh(this.refresh);\n    }\n  }\n\n  getValidIntervals(intervals: string[]): string[] {\n    if (!this.contextSrv.minRefreshInterval) {\n      return intervals;\n    }\n\n    const validIntervals = intervals.filter(str => str !== '').filter(this.contextSrv.isAllowedInterval);\n\n    if (validIntervals.indexOf(this.contextSrv.minRefreshInterval) === -1) {\n      validIntervals.unshift(this.contextSrv.minRefreshInterval);\n    }\n    return validIntervals;\n  }\n\n  private parseTime() {\n    // when absolute time is saved in json it is turned to a string\n    if (_.isString(this.time.from) && this.time.from.indexOf('Z') >= 0) {\n      this.time.from = dateTime(this.time.from).utc();\n    }\n    if (_.isString(this.time.to) && this.time.to.indexOf('Z') >= 0) {\n      this.time.to = dateTime(this.time.to).utc();\n    }\n  }\n\n  private parseUrlParam(value: any) {\n    if (value.indexOf('now') !== -1) {\n      return value;\n    }\n    if (value.length === 8) {\n      const utcValue = toUtc(value, 'YYYYMMDD');\n      if (utcValue.isValid()) {\n        return utcValue;\n      }\n    } else if (value.length === 15) {\n      const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n      if (utcValue.isValid()) {\n        return utcValue;\n      }\n    }\n\n    if (!isNaN(value)) {\n      const epoch = parseInt(value, 10);\n      return toUtc(epoch);\n    }\n\n    return null;\n  }\n\n  private getTimeWindow(time: string, timeWindow: string) {\n    const valueTime = parseInt(time, 10);\n    let timeWindowMs;\n\n    if (timeWindow.match(/^\\d+$/) && parseInt(timeWindow, 10)) {\n      // when time window specified in ms\n      timeWindowMs = parseInt(timeWindow, 10);\n    } else {\n      timeWindowMs = kbn.interval_to_ms(timeWindow);\n    }\n\n    return {\n      from: toUtc(valueTime - timeWindowMs / 2),\n      to: toUtc(valueTime + timeWindowMs / 2),\n    };\n  }\n\n  private initTimeFromUrl() {\n    const params = this.$location.search();\n\n    if (params.time && params['time.window']) {\n      this.time = this.getTimeWindow(params.time, params['time.window']);\n    }\n\n    if (params.from) {\n      this.time.from = this.parseUrlParam(params.from) || this.time.from;\n    }\n    if (params.to) {\n      this.time.to = this.parseUrlParam(params.to) || this.time.to;\n    }\n    // if absolute ignore refresh option saved to dashboard\n    if (params.to && params.to.indexOf('now') === -1) {\n      this.refresh = false;\n      this.dashboard.refresh = false;\n    }\n    // but if refresh explicitly set then use that\n    if (params.refresh) {\n      if (!this.contextSrv.isAllowedInterval(params.refresh)) {\n        this.refresh = config.minRefreshInterval;\n      } else {\n        this.refresh = params.refresh || this.refresh;\n      }\n    }\n  }\n\n  private routeUpdated() {\n    const params = this.$location.search();\n    if (params.left) {\n      return; // explore handles this;\n    }\n    const urlRange = this.timeRangeForUrl();\n    // check if url has time range\n    if (params.from && params.to) {\n      // is it different from what our current time range?\n      if (params.from !== urlRange.from || params.to !== urlRange.to) {\n        // issue update\n        this.initTimeFromUrl();\n        this.setTime(this.time, true);\n      }\n    } else if (this.timeHasChangedSinceLoad()) {\n      this.setTime(this.timeAtLoad, true);\n    }\n  }\n\n  private timeHasChangedSinceLoad() {\n    return this.timeAtLoad && (this.timeAtLoad.from !== this.time.from || this.timeAtLoad.to !== this.time.to);\n  }\n\n  setAutoRefresh(interval: any) {\n    this.dashboard.refresh = interval;\n    this.cancelNextRefresh();\n\n    if (interval) {\n      const validInterval = this.contextSrv.getValidInterval(interval);\n      const intervalMs = kbn.interval_to_ms(validInterval);\n\n      this.refreshTimer = this.timer.register(\n        this.$timeout(() => {\n          this.startNextRefreshTimer(intervalMs);\n          this.refreshDashboard();\n        }, intervalMs)\n      );\n    }\n\n    // update url inside timeout to so that a digest happens after (called from react)\n    this.$timeout(() => {\n      const params = this.$location.search();\n      if (interval) {\n        params.refresh = this.contextSrv.getValidInterval(interval);\n        this.$location.search(params);\n      } else if (params.refresh) {\n        delete params.refresh;\n        this.$location.search(params);\n      }\n    });\n  }\n\n  refreshDashboard() {\n    this.dashboard.timeRangeUpdated(this.timeRange());\n  }\n\n  private startNextRefreshTimer(afterMs: number) {\n    this.cancelNextRefresh();\n    this.refreshTimer = this.timer.register(\n      this.$timeout(() => {\n        this.startNextRefreshTimer(afterMs);\n        if (this.contextSrv.isGrafanaVisible()) {\n          this.refreshDashboard();\n        } else {\n          this.autoRefreshBlocked = true;\n        }\n      }, afterMs)\n    );\n  }\n\n  private cancelNextRefresh() {\n    this.timer.cancel(this.refreshTimer);\n  }\n\n  setTime(time: RawTimeRange, fromRouteUpdate?: boolean) {\n    _.extend(this.time, time);\n\n    // disable refresh if zoom in or zoom out\n    if (isDateTime(time.to)) {\n      this.oldRefresh = this.dashboard.refresh || this.oldRefresh;\n      this.setAutoRefresh(false);\n    } else if (this.oldRefresh && this.oldRefresh !== this.dashboard.refresh) {\n      this.setAutoRefresh(this.oldRefresh);\n      this.oldRefresh = null;\n    }\n\n    // update url\n    if (fromRouteUpdate !== true) {\n      const urlRange = this.timeRangeForUrl();\n      const urlParams = this.$location.search();\n      urlParams.from = urlRange.from;\n      urlParams.to = urlRange.to;\n      this.$location.search(urlParams);\n    }\n\n    this.$timeout(this.refreshDashboard.bind(this), 0);\n  }\n\n  timeRangeForUrl = () => {\n    const range = this.timeRange().raw;\n\n    if (isDateTime(range.from)) {\n      range.from = range.from.valueOf().toString();\n    }\n    if (isDateTime(range.to)) {\n      range.to = range.to.valueOf().toString();\n    }\n\n    return range;\n  };\n\n  timeRange(): TimeRange {\n    // make copies if they are moment  (do not want to return out internal moment, because they are mutable!)\n    const raw = {\n      from: isDateTime(this.time.from) ? dateTime(this.time.from) : this.time.from,\n      to: isDateTime(this.time.to) ? dateTime(this.time.to) : this.time.to,\n    };\n\n    const timezone: TimeZone = this.dashboard ? this.dashboard.getTimezone() : undefined;\n\n    return {\n      from: dateMath.parse(raw.from, false, timezone),\n      to: dateMath.parse(raw.to, true, timezone),\n      raw: raw,\n    };\n  }\n\n  zoomOut(factor: number) {\n    const range = this.timeRange();\n    const { from, to } = getZoomedTimeRange(range, factor);\n\n    this.setTime({ from: toUtc(from), to: toUtc(to) });\n  }\n\n  shiftTime(direction: number) {\n    const range = this.timeRange();\n    const { from, to } = getShiftedTimeRange(direction, range);\n\n    this.setTime({\n      from: toUtc(from),\n      to: toUtc(to),\n    });\n  }\n}\n\nlet singleton: TimeSrv;\n\nexport function setTimeSrv(srv: TimeSrv) {\n  singleton = srv;\n}\n\nexport function getTimeSrv(): TimeSrv {\n  return singleton;\n}\n\ncoreModule.service('timeSrv', TimeSrv);\n","import { from, merge, MonoTypeOperatorFunction, Observable, of, Subject, throwError } from 'rxjs';\nimport { catchError, filter, map, mergeMap, retryWhen, share, takeUntil, tap, throwIfEmpty } from 'rxjs/operators';\nimport { fromFetch } from 'rxjs/fetch';\nimport { BackendSrv as BackendService, BackendSrvRequest } from '@grafana/runtime';\nimport { AppEvents } from '@grafana/data';\n\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\nimport { DataSourceResponse } from 'app/types/events';\nimport { DashboardSearchHit } from 'app/features/search/types';\nimport { CoreEvents, DashboardDTO, FolderInfo, DashboardDataDTO } from 'app/types';\nimport { coreModule } from 'app/core/core_module';\nimport { ContextSrv, contextSrv } from './context_srv';\nimport { Emitter } from '../utils/emitter';\nimport { parseInitFromOptions, parseUrlFromOptions } from '../utils/fetch';\n\nexport interface DatasourceRequestOptions {\n  retry?: number;\n  method?: string;\n  requestId?: string;\n  timeout?: Promise<any>;\n  url?: string;\n  headers?: Record<string, any>;\n  silent?: boolean;\n  data?: Record<string, any>;\n}\n\ninterface FetchResponseProps {\n  message?: string;\n}\n\ninterface ErrorResponseProps extends FetchResponseProps {\n  status?: string;\n  error?: string | any;\n}\n\nexport interface FetchResponse<T extends FetchResponseProps = any> extends DataSourceResponse<T> {}\n\ninterface SuccessResponse extends FetchResponseProps, Record<any, any> {}\n\ninterface DataSourceSuccessResponse<T extends {} = any> extends FetchResponse<T> {}\n\ninterface ErrorResponse<T extends ErrorResponseProps = any> {\n  status: number;\n  statusText?: string;\n  isHandled?: boolean;\n  data: T | string;\n  cancelled?: boolean;\n}\n\nenum CancellationType {\n  request,\n  dataSourceRequest,\n}\n\nexport interface BackendSrvDependencies {\n  fromFetch: (input: string | Request, init?: RequestInit) => Observable<Response>;\n  appEvents: Emitter;\n  contextSrv: ContextSrv;\n  logout: () => void;\n}\n\nexport class BackendSrv implements BackendService {\n  private inFlightRequests: Subject<string> = new Subject<string>();\n  private HTTP_REQUEST_CANCELED = -1;\n  private noBackendCache: boolean;\n  private dependencies: BackendSrvDependencies = {\n    fromFetch: fromFetch,\n    appEvents: appEvents,\n    contextSrv: contextSrv,\n    logout: () => {\n      window.location.href = config.appSubUrl + '/logout';\n    },\n  };\n\n  constructor(deps?: BackendSrvDependencies) {\n    if (deps) {\n      this.dependencies = {\n        ...this.dependencies,\n        ...deps,\n      };\n    }\n  }\n\n  async get(url: string, params?: any, requestId?: string) {\n    return await this.request({ method: 'GET', url, params, requestId });\n  }\n\n  async delete(url: string) {\n    return await this.request({ method: 'DELETE', url });\n  }\n\n  async post(url: string, data?: any) {\n    return await this.request({ method: 'POST', url, data });\n  }\n\n  async patch(url: string, data: any) {\n    return await this.request({ method: 'PATCH', url, data });\n  }\n\n  async put(url: string, data: any) {\n    return await this.request({ method: 'PUT', url, data });\n  }\n\n  withNoBackendCache(callback: any) {\n    this.noBackendCache = true;\n    return callback().finally(() => {\n      this.noBackendCache = false;\n    });\n  }\n\n  requestErrorHandler = (err: ErrorResponse) => {\n    if (err.isHandled) {\n      return;\n    }\n\n    let data = err.data ?? { message: 'Unexpected error' };\n    if (typeof data === 'string') {\n      data = { message: data };\n    }\n\n    if (err.status === 422) {\n      this.dependencies.appEvents.emit(AppEvents.alertWarning, ['Validation failed', data.message]);\n      throw data;\n    }\n\n    if (data.message) {\n      let description = '';\n      let message = data.message;\n      if (message.length > 80) {\n        description = message;\n        message = 'Error';\n      }\n\n      this.dependencies.appEvents.emit(err.status < 500 ? AppEvents.alertWarning : AppEvents.alertError, [\n        message,\n        description,\n      ]);\n    }\n\n    throw data;\n  };\n\n  async request(options: BackendSrvRequest): Promise<any> {\n    // A requestId is a unique identifier for a particular query.\n    // Every observable below has a takeUntil that subscribes to this.inFlightRequests and\n    // will cancel/unsubscribe that observable when a new datasourceRequest with the same requestId is made\n    if (options.requestId) {\n      this.inFlightRequests.next(options.requestId);\n    }\n\n    options = this.parseRequestOptions(options, this.dependencies.contextSrv.user?.orgId);\n\n    const fromFetchStream = this.getFromFetchStream(options);\n    const failureStream = fromFetchStream.pipe(this.toFailureStream(options));\n    const successStream = fromFetchStream.pipe(\n      filter(response => response.ok === true),\n      map(response => {\n        const fetchSuccessResponse: SuccessResponse = response.data;\n        return fetchSuccessResponse;\n      }),\n      tap(response => {\n        if (options.method !== 'GET' && response?.message && options.showSuccessAlert !== false) {\n          this.dependencies.appEvents.emit(AppEvents.alertSuccess, [response.message]);\n        }\n      })\n    );\n\n    return merge(successStream, failureStream)\n      .pipe(\n        catchError((err: ErrorResponse) => {\n          // this setTimeout hack enables any caller catching this err to set isHandled to true\n          setTimeout(() => this.requestErrorHandler(err), 50);\n          return throwError(err);\n        }),\n        this.handleStreamCancellation(options, CancellationType.request)\n      )\n      .toPromise();\n  }\n\n  resolveCancelerIfExists(requestId: string) {\n    this.inFlightRequests.next(requestId);\n  }\n\n  async datasourceRequest(options: BackendSrvRequest): Promise<any> {\n    // A requestId is provided by the datasource as a unique identifier for a\n    // particular query. Every observable below has a takeUntil that subscribes to this.inFlightRequests and\n    // will cancel/unsubscribe that observable when a new datasourceRequest with the same requestId is made\n    if (options.requestId) {\n      this.inFlightRequests.next(options.requestId);\n    }\n\n    options = this.parseDataSourceRequestOptions(\n      options,\n      this.dependencies.contextSrv.user?.orgId,\n      this.noBackendCache\n    );\n\n    const fromFetchStream = this.getFromFetchStream(options);\n    const failureStream = fromFetchStream.pipe(this.toDataSourceRequestFailureStream(options));\n    const successStream = fromFetchStream.pipe(\n      filter(response => response.ok === true),\n      map(response => {\n        const fetchSuccessResponse: DataSourceSuccessResponse = { ...response };\n        return fetchSuccessResponse;\n      }),\n      tap(res => {\n        if (!options.silent) {\n          this.dependencies.appEvents.emit(CoreEvents.dsRequestResponse, res);\n        }\n      })\n    );\n\n    return merge(successStream, failureStream)\n      .pipe(\n        catchError((err: ErrorResponse) => {\n          // populate error obj on Internal Error\n          if (typeof err.data === 'string' && err.status === 500) {\n            err.data = {\n              error: err.statusText,\n              response: err.data,\n            };\n          }\n\n          // for Prometheus\n          if (err.data && !err.data.message && typeof err.data.error === 'string') {\n            err.data.message = err.data.error;\n          }\n\n          if (!options.silent) {\n            this.dependencies.appEvents.emit(CoreEvents.dsRequestError, err);\n          }\n\n          return throwError(err);\n        }),\n        this.handleStreamCancellation(options, CancellationType.dataSourceRequest)\n      )\n      .toPromise();\n  }\n\n  loginPing() {\n    return this.request({ url: '/api/login/ping', method: 'GET', retry: 1 });\n  }\n\n  search(query: any): Promise<DashboardSearchHit[]> {\n    return this.get('/api/search', query);\n  }\n\n  getDashboardBySlug(slug: string) {\n    return this.get(`/api/dashboards/db/${slug}`);\n  }\n\n  getDashboardByUid(uid: string) {\n    return this.get(`/api/dashboards/uid/${uid}`);\n  }\n\n  getFolderByUid(uid: string) {\n    return this.get(`/api/folders/${uid}`);\n  }\n\n  saveDashboard(\n    dashboard: DashboardDataDTO,\n    { message = '', folderId, overwrite = false }: { message?: string; folderId?: number; overwrite?: boolean } = {}\n  ) {\n    return this.post('/api/dashboards/db/', {\n      dashboard,\n      folderId,\n      overwrite,\n      message,\n    });\n  }\n\n  createFolder(payload: any) {\n    return this.post('/api/folders', payload);\n  }\n\n  deleteFolder(uid: string, showSuccessAlert: boolean) {\n    return this.request({ method: 'DELETE', url: `/api/folders/${uid}`, showSuccessAlert: showSuccessAlert === true });\n  }\n\n  deleteDashboard(uid: string, showSuccessAlert: boolean) {\n    return this.request({\n      method: 'DELETE',\n      url: `/api/dashboards/uid/${uid}`,\n      showSuccessAlert: showSuccessAlert === true,\n    });\n  }\n\n  deleteFoldersAndDashboards(folderUids: string[], dashboardUids: string[]) {\n    const tasks = [];\n\n    for (const folderUid of folderUids) {\n      tasks.push(this.createTask(this.deleteFolder.bind(this), true, folderUid, true));\n    }\n\n    for (const dashboardUid of dashboardUids) {\n      tasks.push(this.createTask(this.deleteDashboard.bind(this), true, dashboardUid, true));\n    }\n\n    return this.executeInOrder(tasks);\n  }\n\n  moveDashboards(dashboardUids: string[], toFolder: FolderInfo) {\n    const tasks = [];\n\n    for (const uid of dashboardUids) {\n      tasks.push(this.createTask(this.moveDashboard.bind(this), true, uid, toFolder));\n    }\n\n    return this.executeInOrder(tasks).then((result: any) => {\n      return {\n        totalCount: result.length,\n        successCount: result.filter((res: any) => res.succeeded).length,\n        alreadyInFolderCount: result.filter((res: any) => res.alreadyInFolder).length,\n      };\n    });\n  }\n\n  private async moveDashboard(uid: string, toFolder: FolderInfo) {\n    const fullDash: DashboardDTO = await this.getDashboardByUid(uid);\n\n    if ((!fullDash.meta.folderId && toFolder.id === 0) || fullDash.meta.folderId === toFolder.id) {\n      return { alreadyInFolder: true };\n    }\n\n    const clone = fullDash.dashboard;\n    const options = {\n      folderId: toFolder.id,\n      overwrite: false,\n    };\n\n    try {\n      await this.saveDashboard(clone, options);\n      return { succeeded: true };\n    } catch (err) {\n      if (err.data?.status !== 'plugin-dashboard') {\n        return { succeeded: false };\n      }\n\n      err.isHandled = true;\n      options.overwrite = true;\n\n      try {\n        await this.saveDashboard(clone, options);\n        return { succeeded: true };\n      } catch (e) {\n        return { succeeded: false };\n      }\n    }\n  }\n\n  private createTask(fn: (...args: any[]) => Promise<any>, ignoreRejections: boolean, ...args: any[]) {\n    return async (result: any) => {\n      try {\n        const res = await fn(...args);\n        return Array.prototype.concat(result, [res]);\n      } catch (err) {\n        if (ignoreRejections) {\n          return result;\n        }\n\n        throw err;\n      }\n    };\n  }\n\n  private executeInOrder(tasks: any[]) {\n    return tasks.reduce((acc, task) => {\n      return Promise.resolve(acc).then(task);\n    }, []);\n  }\n\n  private parseRequestOptions = (options: BackendSrvRequest, orgId?: number): BackendSrvRequest => {\n    options.retry = options.retry ?? 0;\n    const requestIsLocal = !options.url.match(/^http/);\n\n    if (requestIsLocal) {\n      if (orgId) {\n        options.headers = options.headers ?? {};\n        options.headers['X-Grafana-Org-Id'] = orgId;\n      }\n\n      if (options.url.startsWith('/')) {\n        options.url = options.url.substring(1);\n      }\n\n      if (options.url.endsWith('/')) {\n        options.url = options.url.slice(0, -1);\n      }\n    }\n\n    return options;\n  };\n\n  private parseDataSourceRequestOptions = (\n    options: BackendSrvRequest,\n    orgId?: number,\n    noBackendCache?: boolean\n  ): BackendSrvRequest => {\n    options.retry = options.retry ?? 0;\n    const requestIsLocal = !options.url.match(/^http/);\n\n    if (requestIsLocal) {\n      if (orgId) {\n        options.headers = options.headers || {};\n        options.headers['X-Grafana-Org-Id'] = orgId;\n      }\n\n      if (options.url.startsWith('/')) {\n        options.url = options.url.substring(1);\n      }\n\n      if (options.headers?.Authorization) {\n        options.headers['X-DS-Authorization'] = options.headers.Authorization;\n        delete options.headers.Authorization;\n      }\n\n      if (noBackendCache) {\n        options.headers['X-Grafana-NoCache'] = 'true';\n      }\n    }\n\n    return options;\n  };\n\n  private getFromFetchStream = (options: BackendSrvRequest) => {\n    const url = parseUrlFromOptions(options);\n    const init = parseInitFromOptions(options);\n    return this.dependencies.fromFetch(url, init).pipe(\n      mergeMap(async response => {\n        const { status, statusText, ok, headers, url, type, redirected } = response;\n        const textData = await response.text(); // this could be just a string, prometheus requests for instance\n        let data;\n        try {\n          data = JSON.parse(textData); // majority of the requests this will be something that can be parsed\n        } catch {\n          data = textData;\n        }\n        const fetchResponse: FetchResponse = {\n          status,\n          statusText,\n          ok,\n          data,\n          headers,\n          url,\n          type,\n          redirected,\n          config: options,\n        };\n        return fetchResponse;\n      }),\n      share() // sharing this so we can split into success and failure and then merge back\n    );\n  };\n\n  private toFailureStream = (options: BackendSrvRequest): MonoTypeOperatorFunction<FetchResponse> => inputStream =>\n    inputStream.pipe(\n      filter(response => response.ok === false),\n      mergeMap(response => {\n        const { status, statusText, data } = response;\n        const fetchErrorResponse: ErrorResponse = { status, statusText, data };\n        return throwError(fetchErrorResponse);\n      }),\n      retryWhen((attempts: Observable<any>) =>\n        attempts.pipe(\n          mergeMap((error, i) => {\n            const firstAttempt = i === 0 && options.retry === 0;\n\n            if (error.status === 401 && this.dependencies.contextSrv.user.isSignedIn && firstAttempt) {\n              return from(this.loginPing()).pipe(\n                catchError(err => {\n                  if (err.status === 401) {\n                    this.dependencies.logout();\n                    return throwError(err);\n                  }\n                  return throwError(err);\n                })\n              );\n            }\n\n            return throwError(error);\n          })\n        )\n      )\n    );\n\n  private toDataSourceRequestFailureStream = (\n    options: BackendSrvRequest\n  ): MonoTypeOperatorFunction<FetchResponse> => inputStream =>\n    inputStream.pipe(\n      filter(response => response.ok === false),\n      mergeMap(response => {\n        const { status, statusText, data } = response;\n        const fetchErrorResponse: ErrorResponse = { status, statusText, data };\n        return throwError(fetchErrorResponse);\n      }),\n      retryWhen((attempts: Observable<any>) =>\n        attempts.pipe(\n          mergeMap((error, i) => {\n            const requestIsLocal = !options.url.match(/^http/);\n            const firstAttempt = i === 0 && options.retry === 0;\n\n            // First retry, if loginPing returns 401 this retry sequence will abort with throwError and user is logged out\n            if (requestIsLocal && firstAttempt && error.status === 401) {\n              return from(this.loginPing()).pipe(\n                catchError(err => {\n                  if (err.status === 401) {\n                    this.dependencies.logout();\n                    return throwError(err);\n                  }\n                  return throwError(err);\n                })\n              );\n            }\n\n            return throwError(error);\n          })\n        )\n      )\n    );\n\n  private handleStreamCancellation = (\n    options: BackendSrvRequest,\n    resultType: CancellationType\n  ): MonoTypeOperatorFunction<FetchResponse | DataSourceSuccessResponse | SuccessResponse> => inputStream =>\n    inputStream.pipe(\n      takeUntil(\n        this.inFlightRequests.pipe(\n          filter(requestId => {\n            let cancelRequest = false;\n            if (options && options.requestId && options.requestId === requestId) {\n              // when a new requestId is started it will be published to inFlightRequests\n              // if a previous long running request that hasn't finished yet has the same requestId\n              // we need to cancel that request\n              cancelRequest = true;\n            }\n            return cancelRequest;\n          })\n        )\n      ),\n      // when a request is cancelled by takeUntil it will complete without emitting anything so we use throwIfEmpty to identify this case\n      // in throwIfEmpty we'll then throw an cancelled error and then we'll return the correct result in the catchError or rethrow\n      throwIfEmpty(() => ({\n        cancelled: true,\n      })),\n      catchError(err => {\n        if (!err.cancelled) {\n          return throwError(err);\n        }\n\n        if (resultType === CancellationType.dataSourceRequest) {\n          return of({\n            data: [],\n            status: this.HTTP_REQUEST_CANCELED,\n            statusText: 'Request was aborted',\n            config: options,\n          });\n        }\n\n        return of([]);\n      })\n    );\n}\n\ncoreModule.factory('backendSrv', () => backendSrv);\n// Used for testing and things that really need BackendSrv\nexport const backendSrv = new BackendSrv();\nexport const getBackendSrv = (): BackendSrv => backendSrv;\n","var path = 'public/app/plugins/datasource/elasticsearch/partials/bucket_agg.html';\nvar html = \"<div class=gf-form-inline>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-7\\\">\\n      <span ng-show=isFirst>Group by</span>\\n      <span ng-hide=isFirst>Then by</span>\\n    </label>\\n\\n    <gf-form-dropdown model=agg.type lookup-text=true get-options=getBucketAggTypes() on-change=onTypeChanged() allow-custom=false label-mode=true css-class=width-10>\\n    </gf-form-dropdown>\\n    <gf-form-dropdown ng-if=agg.field model=agg.field get-options=getFieldsInternal() on-change=onChange() allow-custom=false label-mode=true css-class=width-12>\\n    </gf-form-dropdown>\\n  </div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\">\\n    <label class=\\\"gf-form-label gf-form-label--grow\\\">\\n      <a ng-click=toggleOptions()>\\n        <icon name=\\\"'angle-down'\\\" ng-show=showOptions></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=showOptions></icon>\\n        {{settingsLinkText}}\\n      </a>\\n    </label>\\n  </div>\\n\\n  <div class=gf-form>\\n    <label class=gf-form-label ng-if=isFirst>\\n      <a class=pointer ng-click=addBucketAgg()><icon name=\\\"'plus'\\\"></icon></a>\\n    </label>\\n    <label class=gf-form-label ng-if=\\\"bucketAggCount > 1\\\">\\n      <a class=pointer ng-click=removeBucketAgg()><icon name=\\\"'minus'\\\"></icon></a>\\n    </label>\\n  </div>\\n</div>\\n\\n<div class=gf-form-group ng-if=showOptions>\\n  <div ng-if=\\\"agg.type === 'date_histogram'\\\">\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Interval</label>\\n      <gf-form-dropdown model=agg.settings.interval get-options=getIntervalOptions() on-change=onChangeInternal() allow-custom=true label-mode=true css-class=width-12>\\n      </gf-form-dropdown>\\n    </div>\\n\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Min Doc Count</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.min_doc_count ng-blur=onChangeInternal() />\\n    </div>\\n\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">\\n        Trim edges\\n        <info-popover mode=right-normal>\\n          Trim the edges on the timeseries datapoints\\n        </info-popover>\\n      </label>\\n      <input class=\\\"gf-form-input max-width-12\\\" type=number ng-model=agg.settings.trimEdges ng-change=onChangeInternal() />\\n    </div>\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">\\n        Offset\\n        <info-popover mode=right-normal>\\n          Change the start value of each bucket by the specified positive (+) or negative offset (-) duration, such as\\n          1h for an hour, or 1d for a day\\n        </info-popover>\\n      </label>\\n      <input class=\\\"gf-form-input max-width-12\\\" type=text ng-model=agg.settings.offset ng-change=onChangeInternal() />\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"agg.type === 'histogram'\\\">\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Interval</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.interval ng-blur=onChangeInternal() />\\n    </div>\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Min Doc Count</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.min_doc_count ng-blur=onChangeInternal() />\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"agg.type === 'terms'\\\">\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Order</label>\\n      <gf-form-dropdown model=agg.settings.order lookup-text=true get-options=getOrderOptions() on-change=onChangeInternal() label-mode=true css-class=width-12>\\n      </gf-form-dropdown>\\n    </div>\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Size</label>\\n      <gf-form-dropdown model=agg.settings.size lookup-text=true get-options=getSizeOptions() on-change=onChangeInternal() label-mode=true allow-custom=true css-class=width-12>\\n      </gf-form-dropdown>\\n    </div>\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Min Doc Count</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.min_doc_count ng-blur=onChangeInternal() />\\n    </div>\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Order By</label>\\n      <gf-form-dropdown model=agg.settings.orderBy lookup-text=true get-options=getOrderByOptions() on-change=onChangeInternal() label-mode=true css-class=width-12>\\n      </gf-form-dropdown>\\n    </div>\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">\\n        Missing\\n        <info-popover mode=right-normal>\\n          The missing parameter defines how documents that are missing a value should be treated. By default they will\\n          be ignored but it is also possible to treat them as if they had a value\\n        </info-popover>\\n      </label>\\n      <input type=text class=\\\"gf-form-input max-width-12\\\" empty-to-null ng-model=agg.settings.missing ng-blur=onChangeInternal() spellcheck=false />\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"agg.type === 'filters'\\\">\\n    <div class=\\\"gf-form-inline offset-width-7\\\" ng-repeat=\\\"filter in agg.settings.filters\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-10\\\">Query {{$index + 1}}</label>\\n        <input type=text class=\\\"gf-form-input max-width-12\\\" ng-model=filter.query spellcheck=false placeholder=\\\"Lucene query\\\" ng-blur=onChangeInternal() />\\n        <label class=\\\"gf-form-label width-10\\\">Label {{$index + 1}}</label>\\n        <input type=text class=\\\"gf-form-input max-width-12\\\" ng-model=filter.label spellcheck=false placeholder=Label ng-blur=onChangeInternal() />\\n      </div>\\n      <div class=gf-form>\\n        <label class=gf-form-label ng-if=$first>\\n          <a class=pointer ng-click=addFiltersQuery()><icon name=\\\"'plus'\\\"></icon></a>\\n        </label>\\n        <label class=gf-form-label ng-if=!$first>\\n          <a class=pointer ng-click=removeFiltersQuery(filter)><icon name=\\\"'minus'\\\"></icon></a>\\n        </label>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"agg.type === 'geohash_grid'\\\">\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Precision</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.precision spellcheck=false placeholder=3 ng-blur=onChangeInternal() />\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React from 'react';\nimport { useTheme, stylesFactory } from '../../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { getPropertiesForButtonSize } from '../commonStyles';\nimport { focusCss } from '../../../themes/mixins';\n\nexport type RadioButtonSize = 'sm' | 'md';\n\nexport interface RadioButtonProps {\n  size?: RadioButtonSize;\n  disabled?: boolean;\n  name?: string;\n  active: boolean;\n  id: string;\n  onChange: () => void;\n  fullWidth?: boolean;\n}\n\nconst getRadioButtonStyles = stylesFactory((theme: GrafanaTheme, size: RadioButtonSize, fullWidth?: boolean) => {\n  const { fontSize, height, padding } = getPropertiesForButtonSize({\n    theme,\n    size,\n    hasIcon: false,\n    hasText: true,\n    variant: 'secondary',\n  });\n\n  const c = theme.palette;\n  const textColor = theme.colors.textSemiWeak;\n  const textColorHover = theme.colors.text;\n  const textColorActive = theme.colors.textBlue;\n  const borderColor = theme.colors.border2;\n  const borderColorHover = theme.colors.border3;\n  const borderColorActive = theme.colors.border2;\n  const bg = theme.colors.bodyBg;\n  const bgDisabled = theme.isLight ? c.gray95 : c.gray15;\n  const bgActive = theme.colors.bg2;\n\n  const border = `1px solid ${borderColor}`;\n  const borderActive = `1px solid ${borderColorActive}`;\n  const borderHover = `1px solid ${borderColorHover}`;\n\n  return {\n    radio: css`\n      position: absolute;\n      opacity: 0;\n      z-index: -1000;\n\n      &:checked + label {\n        border: ${borderActive};\n        color: ${textColorActive};\n        background: ${bgActive};\n        z-index: 3;\n      }\n\n      &:focus + label {\n        ${focusCss(theme)};\n        z-index: 3;\n      }\n\n      &:disabled + label {\n        cursor: default;\n        background: ${bgDisabled};\n        color: ${textColor};\n      }\n    `,\n    radioLabel: css`\n      display: inline-block;\n      position: relative;\n      font-size: ${fontSize};\n      height: ${height}px;\n      // Deduct border from line-height for perfect vertical centering on windows and linux\n      line-height: ${height - 2}px;\n      color: ${textColor};\n      padding: ${padding};\n      margin-left: -1px;\n      border-radius: ${theme.border.radius.sm};\n      border: ${border};\n      background: ${bg};\n      cursor: pointer;\n      z-index: 1;\n      flex-grow: ${fullWidth ? 1 : 0};\n      text-align: center;\n\n      user-select: none;\n\n      &:hover {\n        color: ${textColorHover};\n        border: ${borderHover};\n        z-index: 2;\n      }\n    `,\n  };\n});\n\nexport const RadioButton: React.FC<RadioButtonProps> = ({\n  children,\n  active = false,\n  disabled = false,\n  size = 'md',\n  onChange,\n  id,\n  name = undefined,\n  fullWidth,\n}) => {\n  const theme = useTheme();\n  const styles = getRadioButtonStyles(theme, size, fullWidth);\n\n  return (\n    <>\n      <input\n        type=\"radio\"\n        className={cx(styles.radio)}\n        onChange={onChange}\n        disabled={disabled}\n        id={id}\n        checked={active}\n        name={name}\n      />\n      <label className={cx(styles.radioLabel)} htmlFor={id}>\n        {children}\n      </label>\n    </>\n  );\n};\n\nRadioButton.displayName = 'RadioButton';\n","import React, { useCallback, useRef } from 'react';\nimport { css } from 'emotion';\nimport uniqueId from 'lodash/uniqueId';\nimport { SelectableValue } from '@grafana/data';\nimport { RadioButtonSize, RadioButton } from './RadioButton';\nimport { Icon } from '../../Icon/Icon';\n\nconst getRadioButtonGroupStyles = () => {\n  return {\n    wrapper: css`\n      display: flex;\n      flex-direction: row;\n      flex-wrap: nowrap;\n      position: relative;\n    `,\n    radioGroup: css`\n      display: flex;\n      flex-direction: row;\n      flex-wrap: nowrap;\n\n      label {\n        border-radius: 0px;\n\n        &:first-of-type {\n          border-radius: 2px 0px 0px 2px;\n        }\n\n        &:last-of-type {\n          border-radius: 0px 2px 2px 0px;\n        }\n      }\n    `,\n    icon: css`\n      margin-right: 6px;\n    `,\n  };\n};\n\ninterface RadioButtonGroupProps<T> {\n  value?: T;\n  disabled?: boolean;\n  disabledOptions?: T[];\n  options: Array<SelectableValue<T>>;\n  onChange?: (value?: T) => void;\n  size?: RadioButtonSize;\n  fullWidth?: boolean;\n}\n\nexport function RadioButtonGroup<T>({\n  options,\n  value,\n  onChange,\n  disabled,\n  disabledOptions,\n  size = 'md',\n  fullWidth = false,\n}: RadioButtonGroupProps<T>) {\n  const handleOnChange = useCallback(\n    (option: SelectableValue<T>) => {\n      return () => {\n        if (onChange) {\n          onChange(option.value);\n        }\n      };\n    },\n    [onChange]\n  );\n  const id = uniqueId('radiogroup-');\n  const groupName = useRef(id);\n  const styles = getRadioButtonGroupStyles();\n\n  return (\n    <div className={styles.radioGroup}>\n      {options.map((o, i) => {\n        const isItemDisabled = disabledOptions && o.value && disabledOptions.includes(o.value);\n        return (\n          <RadioButton\n            size={size}\n            disabled={isItemDisabled || disabled}\n            active={value === o.value}\n            key={`o.label-${i}`}\n            onChange={handleOnChange(o)}\n            id={`option-${o.value}-${id}`}\n            name={groupName.current}\n            fullWidth={fullWidth}\n          >\n            {o.icon && <Icon name={o.icon} className={styles.icon} />}\n            {o.label}\n          </RadioButton>\n        );\n      })}\n    </div>\n  );\n}\n\nRadioButtonGroup.displayName = 'RadioButtonGroup';\n","var path = 'public/app/plugins/panel/heatmap/module.html';\nvar html = \"<div class=heatmap-wrapper>\\n\\t<div class=heatmap-canvas-wrapper>\\n\\n\\t\\t<div class=datapoints-warning ng-if=ctrl.dataWarning>\\n\\t\\t\\t<span class=small bs-tooltip=ctrl.dataWarning.tip>{{ctrl.dataWarning.title}}</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=heatmap-panel ng-dblclick=ctrl.zoomOut()></div>\\n\\t</div>\\n\\t<div class=heatmap-legend-wrapper ng-if=ctrl.panel.legend.show>\\n\\t\\t<heatmap-legend></heatmap-legend>\\n\\t</div>\\n</div>\\n<div class=clearfix></div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = \"Nu4n\";","import React from 'react';\nimport { css } from 'emotion';\nimport { DataQuery, DataSourceApi, GrafanaTheme } from '@grafana/data';\nimport { HorizontalGroup, stylesFactory, useTheme } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\ninterface QueryEditorRowTitleProps {\n  query: DataQuery;\n  datasource: DataSourceApi;\n  inMixedMode: boolean;\n  disabled: boolean;\n  onClick: (e: React.MouseEvent) => void;\n  collapsedText: string;\n}\n\nexport const QueryEditorRowTitle: React.FC<QueryEditorRowTitleProps> = ({\n  datasource,\n  inMixedMode,\n  disabled,\n  query,\n  onClick,\n  collapsedText,\n}) => {\n  const theme = useTheme();\n  const styles = getQueryEditorRowTitleStyles(theme);\n  return (\n    <HorizontalGroup align=\"center\">\n      <div className={styles.refId} aria-label={selectors.components.QueryEditorRow.title(query.refId)}>\n        <span>{query.refId}</span>\n        {inMixedMode && <em className={styles.contextInfo}> ({datasource.name})</em>}\n        {disabled && <em className={styles.contextInfo}> Disabled</em>}\n      </div>\n      {collapsedText && (\n        <div className={styles.collapsedText} onClick={onClick}>\n          {collapsedText}\n        </div>\n      )}\n    </HorizontalGroup>\n  );\n};\n\nconst getQueryEditorRowTitleStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    refId: css`\n      font-weight: ${theme.typography.weight.semibold};\n      color: ${theme.colors.textBlue};\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n    `,\n    collapsedText: css`\n      font-weight: ${theme.typography.weight.regular};\n      font-size: ${theme.typography.size.sm};\n      color: ${theme.colors.textWeak};\n      padding: 0 10px;\n      display: flex;\n      align-items: center;\n      flex-grow: 1;\n      overflow: hidden;\n      font-style: italic;\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      min-width: 0;\n    `,\n    contextInfo: css`\n      font-size: ${theme.typography.size.sm};\n      font-style: italic;\n      color: ${theme.colors.textWeak};\n      padding-left: 10px;\n    `,\n  };\n});\n","// Libraries\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport _ from 'lodash';\n// Utils & Services\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\nimport { Emitter } from 'app/core/utils/emitter';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\n// Types\nimport { PanelModel } from '../state/PanelModel';\n\nimport { ErrorBoundaryAlert, HorizontalGroup } from '@grafana/ui';\nimport {\n  DataQuery,\n  DataSourceApi,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  TimeRange,\n  toLegacyResponseData,\n} from '@grafana/data';\nimport { QueryEditorRowTitle } from './QueryEditorRowTitle';\nimport { QueryOperationRow } from 'app/core/components/QueryOperationRow/QueryOperationRow';\nimport { QueryOperationAction } from 'app/core/components/QueryOperationRow/QueryOperationAction';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { selectors } from '@grafana/e2e-selectors';\n\ninterface Props {\n  panel: PanelModel;\n  data: PanelData;\n  query: DataQuery;\n  dashboard: DashboardModel;\n  onAddQuery: (query?: DataQuery) => void;\n  onRemoveQuery: (query: DataQuery) => void;\n  onMoveQuery: (query: DataQuery, direction: number) => void;\n  onChange: (query: DataQuery) => void;\n  dataSourceValue: string | null;\n  inMixedMode: boolean;\n}\n\ninterface State {\n  loadedDataSourceValue: string | null | undefined;\n  datasource: DataSourceApi | null;\n  hasTextEditMode: boolean;\n  data?: PanelData;\n  isOpen?: boolean;\n}\n\nexport class QueryEditorRow extends PureComponent<Props, State> {\n  element: HTMLElement | null = null;\n  angularScope: AngularQueryComponentScope | null;\n  angularQueryEditor: AngularComponent | null = null;\n\n  state: State = {\n    datasource: null,\n    loadedDataSourceValue: undefined,\n    hasTextEditMode: false,\n    data: undefined,\n    isOpen: true,\n  };\n\n  componentDidMount() {\n    this.loadDatasource();\n  }\n\n  componentWillUnmount() {\n    if (this.angularQueryEditor) {\n      this.angularQueryEditor.destroy();\n    }\n  }\n\n  getAngularQueryComponentScope(): AngularQueryComponentScope {\n    const { panel, query, dashboard } = this.props;\n    const { datasource } = this.state;\n\n    return {\n      datasource: datasource,\n      target: query,\n      panel: panel,\n      dashboard: dashboard,\n      refresh: () => panel.refresh(),\n      render: () => panel.render(),\n      events: panel.events,\n      range: getTimeSrv().timeRange(),\n    };\n  }\n\n  async loadDatasource() {\n    const { query, panel } = this.props;\n    const dataSourceSrv = getDatasourceSrv();\n    let datasource;\n\n    try {\n      datasource = await dataSourceSrv.get(query.datasource || panel.datasource);\n    } catch (error) {\n      datasource = await dataSourceSrv.get();\n    }\n\n    this.setState({\n      datasource,\n      loadedDataSourceValue: this.props.dataSourceValue,\n      hasTextEditMode: _.has(datasource, 'components.QueryCtrl.prototype.toggleEditorMode'),\n    });\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    const { loadedDataSourceValue } = this.state;\n    const { data, query, panel } = this.props;\n\n    if (data !== prevProps.data) {\n      this.setState({ data: filterPanelDataToQuery(data, query.refId) });\n\n      if (this.angularScope) {\n        this.angularScope.range = getTimeSrv().timeRange();\n      }\n\n      if (this.angularQueryEditor) {\n        notifyAngularQueryEditorsOfData(panel, data, this.angularQueryEditor);\n      }\n    }\n\n    // check if we need to load another datasource\n    if (loadedDataSourceValue !== this.props.dataSourceValue) {\n      if (this.angularQueryEditor) {\n        this.angularQueryEditor.destroy();\n        this.angularQueryEditor = null;\n      }\n      this.loadDatasource();\n      return;\n    }\n\n    if (!this.element || this.angularQueryEditor) {\n      return;\n    }\n    this.renderAngularQueryEditor();\n  }\n\n  renderAngularQueryEditor = () => {\n    if (!this.element) {\n      return;\n    }\n    if (this.angularQueryEditor) {\n      this.angularQueryEditor.destroy();\n      this.angularQueryEditor = null;\n    }\n    const loader = getAngularLoader();\n    const template = '<plugin-component type=\"query-ctrl\" />';\n    const scopeProps = { ctrl: this.getAngularQueryComponentScope() };\n    this.angularQueryEditor = loader.load(this.element, scopeProps, template);\n    this.angularScope = scopeProps.ctrl;\n  };\n\n  onOpen = () => {\n    this.renderAngularQueryEditor();\n  };\n\n  onRunQuery = () => {\n    this.props.panel.refresh();\n  };\n\n  renderPluginEditor = () => {\n    const { query, onChange } = this.props;\n    const { datasource, data } = this.state;\n\n    if (datasource?.components?.QueryCtrl) {\n      return <div ref={element => (this.element = element)} />;\n    }\n\n    if (datasource?.components?.QueryEditor) {\n      const QueryEditor = datasource.components.QueryEditor;\n\n      return (\n        <QueryEditor\n          key={datasource?.name}\n          query={query}\n          datasource={datasource}\n          onChange={onChange}\n          onRunQuery={this.onRunQuery}\n          data={data}\n        />\n      );\n    }\n\n    return <div>Data source plugin does not export any Query Editor component</div>;\n  };\n\n  onToggleEditMode = (e: React.MouseEvent, { isOpen, openRow }: { isOpen: boolean; openRow: () => void }) => {\n    e.stopPropagation();\n    if (this.angularScope && this.angularScope.toggleEditorMode) {\n      this.angularScope.toggleEditorMode();\n      this.angularQueryEditor?.digest();\n      if (!isOpen) {\n        openRow();\n      }\n    }\n  };\n\n  onRemoveQuery = () => {\n    this.props.onRemoveQuery(this.props.query);\n  };\n\n  onCopyQuery = () => {\n    const copy = _.cloneDeep(this.props.query);\n    this.props.onAddQuery(copy);\n  };\n\n  onDisableQuery = () => {\n    this.props.query.hide = !this.props.query.hide;\n    this.onRunQuery();\n    this.forceUpdate();\n  };\n\n  renderCollapsedText(): string | null {\n    const { datasource } = this.state;\n    if (datasource?.getQueryDisplayText) {\n      return datasource.getQueryDisplayText(this.props.query);\n    }\n\n    if (this.angularScope && this.angularScope.getCollapsedText) {\n      return this.angularScope.getCollapsedText();\n    }\n    return null;\n  }\n\n  renderActions = (props: { isOpen: boolean; openRow: () => void }) => {\n    const { query } = this.props;\n    const { hasTextEditMode } = this.state;\n    const isDisabled = query.hide;\n\n    return (\n      <HorizontalGroup>\n        {hasTextEditMode && (\n          <QueryOperationAction\n            title=\"Toggle text edit mode\"\n            icon=\"pen\"\n            onClick={e => {\n              this.onToggleEditMode(e, props);\n            }}\n          />\n        )}\n        <QueryOperationAction\n          title=\"Move query down\"\n          icon=\"arrow-down\"\n          onClick={() => this.props.onMoveQuery(query, 1)}\n        />\n        <QueryOperationAction title=\"Move query up\" icon=\"arrow-up\" onClick={() => this.props.onMoveQuery(query, -1)} />\n\n        <QueryOperationAction title=\"Duplicate query\" icon=\"copy\" onClick={this.onCopyQuery} />\n        <QueryOperationAction\n          title=\"Disable/enable query\"\n          icon={isDisabled ? 'eye-slash' : 'eye'}\n          onClick={this.onDisableQuery}\n        />\n        <QueryOperationAction title=\"Remove query\" icon=\"trash-alt\" onClick={this.onRemoveQuery} />\n      </HorizontalGroup>\n    );\n  };\n\n  renderTitle = (props: { isOpen: boolean; openRow: () => void }) => {\n    const { query, inMixedMode } = this.props;\n    const { datasource } = this.state;\n    const isDisabled = query.hide;\n    return (\n      <QueryEditorRowTitle\n        query={query}\n        inMixedMode={inMixedMode}\n        datasource={datasource}\n        disabled={isDisabled}\n        onClick={e => this.onToggleEditMode(e, props)}\n        collapsedText={!props.isOpen ? this.renderCollapsedText() : null}\n      />\n    );\n  };\n\n  render() {\n    const { query } = this.props;\n    const { datasource } = this.state;\n    const isDisabled = query.hide;\n\n    const rowClasses = classNames('query-editor-row', {\n      'query-editor-row--disabled': isDisabled,\n      'gf-form-disabled': isDisabled,\n    });\n\n    if (!datasource) {\n      return null;\n    }\n\n    const editor = this.renderPluginEditor();\n\n    return (\n      <div aria-label={selectors.components.QueryEditorRows.rows}>\n        <QueryOperationRow title={this.renderTitle} actions={this.renderActions} onOpen={this.onOpen}>\n          <div className={rowClasses}>\n            <ErrorBoundaryAlert>{editor}</ErrorBoundaryAlert>\n          </div>\n        </QueryOperationRow>\n      </div>\n    );\n  }\n}\n\n// To avoid sending duplicate events for each row we have this global cached object here\n// So we can check if we already emitted this legacy data event\nlet globalLastPanelDataCache: PanelData | null = null;\n\nfunction notifyAngularQueryEditorsOfData(panel: PanelModel, data: PanelData, editor: AngularComponent) {\n  if (data === globalLastPanelDataCache) {\n    return;\n  }\n\n  globalLastPanelDataCache = data;\n\n  if (data.state === LoadingState.Done) {\n    const legacy = data.series.map(v => toLegacyResponseData(v));\n    panel.events.emit(PanelEvents.dataReceived, legacy);\n  } else if (data.state === LoadingState.Error) {\n    panel.events.emit(PanelEvents.dataError, data.error);\n  }\n\n  // Some query controllers listen to data error events and need a digest\n  // for some reason this needs to be done in next tick\n  setTimeout(editor.digest);\n}\n\nexport interface AngularQueryComponentScope {\n  target: DataQuery;\n  panel: PanelModel;\n  dashboard: DashboardModel;\n  events: Emitter;\n  refresh: () => void;\n  render: () => void;\n  datasource: DataSourceApi;\n  toggleEditorMode?: () => void;\n  getCollapsedText?: () => string;\n  range: TimeRange;\n}\n\n/**\n * Get a version of the PanelData limited to the query we are looking at\n */\nexport function filterPanelDataToQuery(data: PanelData, refId: string): PanelData | undefined {\n  const series = data.series.filter(series => series.refId === refId);\n\n  // No matching series\n  if (!series.length) {\n    // If there was an error with no data, pass it to the QueryEditors\n    if (data.error && !data.series.length) {\n      return {\n        ...data,\n        state: LoadingState.Error,\n      };\n    }\n    return undefined;\n  }\n\n  // Only say this is an error if the error links to the query\n  let state = LoadingState.Done;\n  const error = data.error && data.error.refId === refId ? data.error : undefined;\n  if (error) {\n    state = LoadingState.Error;\n  }\n\n  const timeRange = data.timeRange;\n\n  return {\n    ...data,\n    state,\n    series,\n    error,\n    timeRange,\n  };\n}\n","import React from 'react';\nimport { ListProps, AbstractList } from './AbstractList';\n\nexport class InlineList<T> extends React.PureComponent<ListProps<T>> {\n  render() {\n    return <AbstractList inline {...this.props} />;\n  }\n}\n","var path = 'public/app/plugins/datasource/stackdriver/partials/config.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=grafana-info-box>\\n    <h4>Stackdriver Authentication</h4>\\n    <p>\\n      There are two ways to authenticate the Stackdriver plugin - either by uploading a Service Account key file, or by\\n      automatically retrieving credentials from the Google metadata server. The latter option is only available when\\n      running Grafana on a GCE virtual machine.\\n    </p>\\n\\n    <h5>Uploading a Service Account Key File</h5>\\n    <p>\\n      First you need to create a Google Cloud Platform (GCP) Service Account for the Project you want to show data for.\\n      A Grafana datasource integrates with one GCP Project. If you want to visualize data from multiple GCP Projects\\n      then you need to create one datasource per GCP Project.\\n    </p>\\n    <p>\\n      The <strong>Monitoring Viewer</strong> role provides all the permissions that Grafana needs. The following API\\n      needs to be enabled on GCP for the datasource to work:\\n      <a class=external-link target=_blank href=https://console.cloud.google.com/apis/library/monitoring.googleapis.com>Monitoring API</a>\\n    </p>\\n\\n    <h5>GCE Default Service Account</h5>\\n    <p>\\n      If Grafana is running on a Google Compute Engine (GCE) virtual machine, it is possible for Grafana to\\n      automatically retrieve the default project id and authentication token from the metadata server. In order for this\\n      to work, you need to make sure that you have a service account that is setup as the default account for the\\n      virtual machine and that the service account has been given read access to the Stackdriver Monitoring API.\\n    </p>\\n\\n    <p>\\n      Detailed instructions on how to create a Service Account can be found\\n      <a class=external-link target=_blank href=http://docs.grafana.org/datasources/stackdriver/ >in the documentation.</a>\\n    </p>\\n  </div>\\n</div>\\n\\n<div class=gf-form-group>\\n  <div class=gf-form>\\n    <h3>Authentication</h3>\\n    <info-popover mode=header>Upload your Service Account key file or paste in the contents of the file. The file contents will be encrypted\\n      and saved in the Grafana database.</info-popover>\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=\\\"gf-form max-width-30\\\">\\n      <span class=\\\"gf-form-label width-10\\\">Authentication Type</span>\\n      <div class=\\\"gf-form-select-wrapper max-width-24\\\">\\n        <select class=gf-form-input ng-change=\\\"ctrl.gceError = ''\\\" ng-model=ctrl.current.jsonData.authenticationType ng-options=\\\"f.key as f.value for f in ctrl.authenticationTypes\\\"></select>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=\\\"ctrl.current.jsonData.authenticationType === ctrl.defaultAuthenticationType && !ctrl.current.jsonData.clientEmail && !ctrl.inputDataValid\\\">\\n    <div class=gf-form-group ng-if=!ctrl.inputDataValid>\\n      <div class=gf-form>\\n        <form>\\n          <dash-upload on-upload=ctrl.onUpload(dash) btn-text=\\\"Upload Service Account key file\\\"></dash-upload>\\n        </form>\\n      </div>\\n    </div>\\n    <div class=gf-form-group>\\n      <h5 class=section-heading ng-if=!ctrl.inputDataValid>Or paste Service Account key JSON</h5>\\n      <div class=gf-form ng-if=!ctrl.inputDataValid>\\n        <textarea rows=10 data-share-panel-url=\\\"\\\" class=gf-form-input ng-model=ctrl.jsonText ng-paste=ctrl.onPasteJwt($event)></textarea>\\n      </div>\\n      <div ng-repeat=\\\"valError in ctrl.validationErrors\\\" class=\\\"text-error p-l-1\\\">\\n        <icon name=\\\"'exclamation-triangle'\\\"></icon>\\n        {{valError}}\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-group ng-if=\\\"ctrl.current.jsonData.authenticationType === ctrl.defaultAuthenticationType && (ctrl.inputDataValid || ctrl.current.jsonData.clientEmail)\\\">\\n  <h6>Uploaded Key Details</h6>\\n\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-10\\\">Project</span>\\n    <input class=\\\"gf-form-input width-40\\\" disabled=disabled type=text ng-model=ctrl.current.jsonData.defaultProject />\\n  </div>\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-10\\\">Client Email</span>\\n    <input class=\\\"gf-form-input width-40\\\" disabled=disabled type=text ng-model=ctrl.current.jsonData.clientEmail />\\n  </div>\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-10\\\">Token URI</span>\\n    <input class=\\\"gf-form-input width-40\\\" disabled=disabled type=text ng-model=ctrl.current.jsonData.tokenUri />\\n  </div>\\n  <div class=gf-form ng-if=ctrl.current.secureJsonFields.privateKey>\\n    <span class=\\\"gf-form-label width-10\\\">Private Key</span>\\n    <input type=text class=\\\"gf-form-input max-width-12\\\" disabled=disabled value=configured />\\n  </div>\\n\\n  <div class=\\\"gf-form width-18\\\" style=margin-top:24px>\\n    <a class=\\\"btn btn-secondary gf-form-btn\\\" href=# ng-click=ctrl.resetValidationMessages()>Reset Service Account Key\\n    </a>\\n    <info-popover mode=right-normal>\\n      Reset to clear the uploaded key and upload a new file.\\n    </info-popover>\\n  </div>\\n</div>\\n\\n<p class=gf-form-label ng-hide=\\\"ctrl.current.secureJsonFields.privateKey || ctrl.current.jsonData.authenticationType !== ctrl.defaultAuthenticationType\\\">\\n  <icon name=\\\"'save'\\\"></icon> Do not forget to save your changes after uploading a file.\\n</p>\\n\\n<div class=gf-form ng-if=ctrl.gceError>\\n  <pre class=\\\"gf-form-pre alert alert-error\\\">{{ctrl.gceError}}</pre>\\n</div>\\n\\n<p class=gf-form-label ng-show=\\\"ctrl.current.jsonData.authenticationType !== ctrl.defaultAuthenticationType\\\">\\n  <icon name=\\\"'save'\\\"></icon> Verify GCE default service account by clicking Save & Test\\n</p>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { forwardRef } from 'react';\n\ninterface ColorPickerTriggerProps {\n  onClick: () => void;\n  onMouseLeave: () => void;\n  color: string;\n}\n\nexport const ColorPickerTrigger = forwardRef(function ColorPickerTrigger(\n  props: ColorPickerTriggerProps,\n  ref: React.Ref<HTMLDivElement>\n) {\n  return (\n    <div\n      ref={ref}\n      onClick={props.onClick}\n      onMouseLeave={props.onMouseLeave}\n      style={{\n        overflow: 'hidden',\n        background: 'inherit',\n        border: 'none',\n        color: 'inherit',\n        padding: 0,\n        borderRadius: 10,\n        cursor: 'pointer',\n      }}\n    >\n      <div\n        style={{\n          position: 'relative',\n          width: 15,\n          height: 15,\n          border: 'none',\n          margin: 0,\n          float: 'left',\n          zIndex: 0,\n          backgroundImage:\n            // eslint-disable-next-line max-len\n            'url(data:image/png,base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)',\n        }}\n      >\n        <div\n          style={{\n            backgroundColor: props.color,\n            display: 'block',\n            position: 'absolute',\n            top: 0,\n            left: 0,\n            bottom: 0,\n            right: 0,\n          }}\n        />\n      </div>\n    </div>\n  );\n});\n","// Types\nimport { Unsubscribable } from 'rxjs';\nimport { createAction } from '@reduxjs/toolkit';\n\nimport { Emitter } from 'app/core/core';\nimport {\n  AbsoluteTimeRange,\n  DataQuery,\n  DataSourceApi,\n  HistoryItem,\n  LoadingState,\n  LogLevel,\n  PanelData,\n  QueryFixAction,\n  TimeRange,\n  ExploreMode,\n} from '@grafana/data';\nimport { ExploreId, ExploreItemState, ExploreUIState } from 'app/types/explore';\n\nexport interface AddQueryRowPayload {\n  exploreId: ExploreId;\n  index: number;\n  query: DataQuery;\n}\n\nexport interface ChangeModePayload {\n  exploreId: ExploreId;\n  mode: ExploreMode;\n}\n\nexport interface ChangeQueryPayload {\n  exploreId: ExploreId;\n  query: DataQuery;\n  index: number;\n  override: boolean;\n}\n\nexport interface ChangeSizePayload {\n  exploreId: ExploreId;\n  width: number;\n  height: number;\n}\n\nexport interface ChangeRefreshIntervalPayload {\n  exploreId: ExploreId;\n  refreshInterval: string;\n}\n\nexport interface ClearQueriesPayload {\n  exploreId: ExploreId;\n}\n\nexport interface HighlightLogsExpressionPayload {\n  exploreId: ExploreId;\n  expressions: string[];\n}\n\nexport interface InitializeExplorePayload {\n  exploreId: ExploreId;\n  containerWidth: number;\n  eventBridge: Emitter;\n  queries: DataQuery[];\n  range: TimeRange;\n  mode: ExploreMode;\n  ui: ExploreUIState;\n  originPanelId: number;\n}\n\nexport interface LoadDatasourceMissingPayload {\n  exploreId: ExploreId;\n}\n\nexport interface LoadDatasourcePendingPayload {\n  exploreId: ExploreId;\n  requestedDatasourceName: string;\n}\n\nexport interface LoadDatasourceReadyPayload {\n  exploreId: ExploreId;\n  history: HistoryItem[];\n}\n\nexport interface ModifyQueriesPayload {\n  exploreId: ExploreId;\n  modification: QueryFixAction;\n  index?: number;\n  modifier: (query: DataQuery, modification: QueryFixAction) => DataQuery;\n}\n\nexport interface QueryEndedPayload {\n  exploreId: ExploreId;\n  response: PanelData;\n}\n\nexport interface QueryStoreSubscriptionPayload {\n  exploreId: ExploreId;\n  querySubscription: Unsubscribable;\n}\n\nexport interface HistoryUpdatedPayload {\n  exploreId: ExploreId;\n  history: HistoryItem[];\n}\n\nexport interface RemoveQueryRowPayload {\n  exploreId: ExploreId;\n  index: number;\n}\n\nexport interface ScanStartPayload {\n  exploreId: ExploreId;\n}\n\nexport interface ScanStopPayload {\n  exploreId: ExploreId;\n}\n\nexport interface SetQueriesPayload {\n  exploreId: ExploreId;\n  queries: DataQuery[];\n}\n\nexport interface SplitCloseActionPayload {\n  itemId: ExploreId;\n}\n\nexport interface SplitOpenPayload {\n  itemState: ExploreItemState;\n}\n\nexport interface SyncTimesPayload {\n  syncedTimes: boolean;\n}\n\nexport interface ToggleTablePayload {\n  exploreId: ExploreId;\n}\n\nexport interface ToggleGraphPayload {\n  exploreId: ExploreId;\n}\n\nexport interface UpdateUIStatePayload extends Partial<ExploreUIState> {\n  exploreId: ExploreId;\n}\n\nexport interface UpdateDatasourceInstancePayload {\n  exploreId: ExploreId;\n  datasourceInstance: DataSourceApi;\n  version?: string;\n  mode?: ExploreMode;\n}\n\nexport interface ToggleLogLevelPayload {\n  exploreId: ExploreId;\n  hiddenLogLevels: LogLevel[];\n}\n\nexport interface QueriesImportedPayload {\n  exploreId: ExploreId;\n  queries: DataQuery[];\n}\n\nexport interface SetUrlReplacedPayload {\n  exploreId: ExploreId;\n}\n\nexport interface ChangeRangePayload {\n  exploreId: ExploreId;\n  range: TimeRange;\n  absoluteRange: AbsoluteTimeRange;\n}\n\nexport interface ChangeLoadingStatePayload {\n  exploreId: ExploreId;\n  loadingState: LoadingState;\n}\n\nexport interface SetPausedStatePayload {\n  exploreId: ExploreId;\n  isPaused: boolean;\n}\n\nexport interface ResetExplorePayload {\n  force?: boolean;\n}\n\n/**\n * Adds a query row after the row with the given index.\n */\nexport const addQueryRowAction = createAction<AddQueryRowPayload>('explore/addQueryRow');\n\n/**\n * Change the mode of Explore.\n */\nexport const changeModeAction = createAction<ChangeModePayload>('explore/changeMode');\n\n/**\n * Query change handler for the query row with the given index.\n * If `override` is reset the query modifications and run the queries. Use this to set queries via a link.\n */\nexport const changeQueryAction = createAction<ChangeQueryPayload>('explore/changeQuery');\n\n/**\n * Keep track of the Explore container size, in particular the width.\n * The width will be used to calculate graph intervals (number of datapoints).\n */\nexport const changeSizeAction = createAction<ChangeSizePayload>('explore/changeSize');\n\n/**\n * Change the time range of Explore. Usually called from the Timepicker or a graph interaction.\n */\nexport const changeRefreshIntervalAction = createAction<ChangeRefreshIntervalPayload>('explore/changeRefreshInterval');\n\n/**\n * Clear all queries and results.\n */\nexport const clearQueriesAction = createAction<ClearQueriesPayload>('explore/clearQueries');\n\n/**\n * Cancel running queries.\n */\nexport const cancelQueriesAction = createAction<ClearQueriesPayload>('explore/cancelQueries');\n\n/**\n * Highlight expressions in the log results\n */\nexport const highlightLogsExpressionAction = createAction<HighlightLogsExpressionPayload>(\n  'explore/highlightLogsExpression'\n);\n\n/**\n * Initialize Explore state with state from the URL and the React component.\n * Call this only on components for with the Explore state has not been initialized.\n */\nexport const initializeExploreAction = createAction<InitializeExplorePayload>('explore/initializeExplore');\n\n/**\n * Display an error when no datasources have been configured\n */\nexport const loadDatasourceMissingAction = createAction<LoadDatasourceMissingPayload>('explore/loadDatasourceMissing');\n\n/**\n * Start the async process of loading a datasource to display a loading indicator\n */\nexport const loadDatasourcePendingAction = createAction<LoadDatasourcePendingPayload>('explore/loadDatasourcePending');\n\n/**\n * Datasource loading was completed.\n */\nexport const loadDatasourceReadyAction = createAction<LoadDatasourceReadyPayload>('explore/loadDatasourceReady');\n\n/**\n * Action to modify a query given a datasource-specific modifier action.\n * @param exploreId Explore area\n * @param modification Action object with a type, e.g., ADD_FILTER\n * @param index Optional query row index. If omitted, the modification is applied to all query rows.\n * @param modifier Function that executes the modification, typically `datasourceInstance.modifyQueries`.\n */\nexport const modifyQueriesAction = createAction<ModifyQueriesPayload>('explore/modifyQueries');\n\nexport const queryStreamUpdatedAction = createAction<QueryEndedPayload>('explore/queryStreamUpdated');\n\nexport const queryStoreSubscriptionAction = createAction<QueryStoreSubscriptionPayload>(\n  'explore/queryStoreSubscription'\n);\n\n/**\n * Remove query row of the given index, as well as associated query results.\n */\nexport const removeQueryRowAction = createAction<RemoveQueryRowPayload>('explore/removeQueryRow');\n\n/**\n * Start a scan for more results using the given scanner.\n * @param exploreId Explore area\n * @param scanner Function that a) returns a new time range and b) triggers a query run for the new range\n */\nexport const scanStartAction = createAction<ScanStartPayload>('explore/scanStart');\n\n/**\n * Stop any scanning for more results.\n */\nexport const scanStopAction = createAction<ScanStopPayload>('explore/scanStop');\n\n/**\n * Reset queries to the given queries. Any modifications will be discarded.\n * Use this action for clicks on query examples. Triggers a query run.\n */\nexport const setQueriesAction = createAction<SetQueriesPayload>('explore/setQueries');\n\n/**\n * Close the split view and save URL state.\n */\nexport const splitCloseAction = createAction<SplitCloseActionPayload>('explore/splitClose');\n\n/**\n * Open the split view and copy the left state to be the right state.\n * The right state is automatically initialized.\n * The copy keeps all query modifications but wipes the query results.\n */\nexport const splitOpenAction = createAction<SplitOpenPayload>('explore/splitOpen');\n\nexport const syncTimesAction = createAction<SyncTimesPayload>('explore/syncTimes');\n\nexport const richHistoryUpdatedAction = createAction<any>('explore/richHistoryUpdated');\n/**\n * Update state of Explores UI elements (panels visiblity and deduplication  strategy)\n */\nexport const updateUIStateAction = createAction<UpdateUIStatePayload>('explore/updateUIState');\n\n/**\n * Expand/collapse the table result viewer. When collapsed, table queries won't be run.\n */\nexport const toggleTableAction = createAction<ToggleTablePayload>('explore/toggleTable');\n\n/**\n * Expand/collapse the graph result viewer. When collapsed, graph queries won't be run.\n */\nexport const toggleGraphAction = createAction<ToggleGraphPayload>('explore/toggleGraph');\n\n/**\n * Updates datasource instance before datasouce loading has started\n */\nexport const updateDatasourceInstanceAction = createAction<UpdateDatasourceInstancePayload>(\n  'explore/updateDatasourceInstance'\n);\n\nexport const toggleLogLevelAction = createAction<ToggleLogLevelPayload>('explore/toggleLogLevel');\n\n/**\n * Resets state for explore.\n */\nexport const resetExploreAction = createAction<ResetExplorePayload>('explore/resetExplore');\nexport const queriesImportedAction = createAction<QueriesImportedPayload>('explore/queriesImported');\n\nexport const historyUpdatedAction = createAction<HistoryUpdatedPayload>('explore/historyUpdated');\n\nexport const setUrlReplacedAction = createAction<SetUrlReplacedPayload>('explore/setUrlReplaced');\n\nexport const changeRangeAction = createAction<ChangeRangePayload>('explore/changeRange');\n\nexport const changeLoadingStateAction = createAction<ChangeLoadingStatePayload>('changeLoadingState');\n\nexport const setPausedStateAction = createAction<SetPausedStatePayload>('explore/setPausedState');\n","/**\n * A library containing most of the core functionality and data types used in Grafana.\n *\n * @packageDocumentation\n */\nexport * from './utils';\nexport * from './types';\nexport * from './vector';\nexport * from './dataframe';\nexport * from './transformations';\nexport * from './datetime';\nexport * from './text';\nexport * from './valueFormats';\nexport * from './field';\nexport { PanelPlugin } from './panel/PanelPlugin';\n","import React from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { SegmentAsync } from '@grafana/ui';\nimport StackdriverDatasource from '../datasource';\n\nexport interface Props {\n  datasource: StackdriverDatasource;\n  onChange: (projectName: string) => void;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  projectName: string;\n}\n\nexport function Project({ projectName, datasource, onChange, templateVariableOptions }: Props) {\n  return (\n    <div className=\"gf-form-inline\">\n      <span className=\"gf-form-label width-9 query-keyword\">Project</span>\n      <SegmentAsync\n        allowCustomValue\n        onChange={({ value }) => onChange(value!)}\n        loadOptions={() =>\n          datasource.getProjects().then(projects => [\n            {\n              label: 'Template Variables',\n              options: templateVariableOptions,\n            },\n            ...projects,\n          ])\n        }\n        value={projectName}\n        placeholder=\"Select Project\"\n      />\n      <div className=\"gf-form gf-form--grow\">\n        <div className=\"gf-form-label gf-form-label--grow\" />\n      </div>\n    </div>\n  );\n}\n","import React, { useEffect, useState } from 'react';\nimport _ from 'lodash';\n\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { SelectableValue } from '@grafana/data';\nimport StackdriverDatasource from '../datasource';\nimport { Segment } from '@grafana/ui';\nimport { MetricDescriptor } from '../types';\n\nexport interface Props {\n  onChange: (metricDescriptor: MetricDescriptor) => void;\n  templateSrv: TemplateSrv;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  datasource: StackdriverDatasource;\n  projectName: string;\n  metricType: string;\n  children?: (renderProps: any) => JSX.Element;\n}\n\ninterface State {\n  metricDescriptors: MetricDescriptor[];\n  metrics: any[];\n  services: any[];\n  service: string;\n  metric: string;\n  metricDescriptor: MetricDescriptor;\n  projectName: string;\n}\n\nexport function Metrics(props: Props) {\n  const [state, setState] = useState<State>({\n    metricDescriptors: [],\n    metrics: [],\n    services: [],\n    service: '',\n    metric: '',\n    metricDescriptor: null,\n    projectName: null,\n  });\n\n  const { services, service, metrics } = state;\n  const { metricType, templateVariableOptions, projectName } = props;\n\n  const loadMetricDescriptors = async () => {\n    if (projectName) {\n      const metricDescriptors = await props.datasource.getMetricTypes(props.projectName);\n      const services = getServicesList(metricDescriptors);\n      const metrics = getMetricsList(metricDescriptors);\n      const service = metrics.length > 0 ? metrics[0].service : '';\n      const metricDescriptor = getSelectedMetricDescriptor(metricDescriptors, props.metricType);\n      setState({ ...state, metricDescriptors, services, metrics, service: service, metricDescriptor });\n    }\n  };\n\n  useEffect(() => {\n    loadMetricDescriptors();\n  }, [projectName]);\n\n  const getSelectedMetricDescriptor = (metricDescriptors: MetricDescriptor[], metricType: string) => {\n    return metricDescriptors.find(md => md.type === props.templateSrv.replace(metricType));\n  };\n\n  const getMetricsList = (metricDescriptors: MetricDescriptor[]) => {\n    const selectedMetricDescriptor = getSelectedMetricDescriptor(metricDescriptors, props.metricType);\n    if (!selectedMetricDescriptor) {\n      return [];\n    }\n    const metricsByService = metricDescriptors\n      .filter(m => m.service === selectedMetricDescriptor.service)\n      .map(m => ({\n        service: m.service,\n        value: m.type,\n        label: m.displayName,\n        description: m.description,\n      }));\n    return metricsByService;\n  };\n\n  const onServiceChange = ({ value: service }: any) => {\n    const { metricDescriptors } = state;\n    const { metricType, templateSrv } = props;\n\n    const metrics = metricDescriptors\n      .filter((m: MetricDescriptor) => m.service === templateSrv.replace(service))\n      .map((m: MetricDescriptor) => ({\n        service: m.service,\n        value: m.type,\n        label: m.displayName,\n        description: m.description,\n      }));\n\n    if (metrics.length > 0 && !metrics.some(m => m.value === templateSrv.replace(metricType))) {\n      onMetricTypeChange(metrics[0], { service, metrics });\n    } else {\n      setState({ ...state, service, metrics });\n    }\n  };\n\n  const onMetricTypeChange = ({ value }: SelectableValue<string>, extra: any = {}) => {\n    const metricDescriptor = getSelectedMetricDescriptor(state.metricDescriptors, value);\n    setState({ ...state, metricDescriptor, ...extra });\n    props.onChange({ ...metricDescriptor, type: value });\n  };\n\n  const getServicesList = (metricDescriptors: MetricDescriptor[]) => {\n    const services = metricDescriptors.map(m => ({\n      value: m.service,\n      label: _.startCase(m.serviceShortName),\n    }));\n\n    return services.length > 0 ? _.uniqBy(services, s => s.value) : [];\n  };\n\n  return (\n    <>\n      <div className=\"gf-form-inline\">\n        <span className=\"gf-form-label width-9 query-keyword\">Service</span>\n        <Segment\n          onChange={onServiceChange}\n          value={[...services, ...templateVariableOptions].find(s => s.value === service)}\n          options={[\n            {\n              label: 'Template Variables',\n              options: templateVariableOptions,\n            },\n            ...services,\n          ]}\n          placeholder=\"Select Services\"\n        ></Segment>\n        <div className=\"gf-form gf-form--grow\">\n          <div className=\"gf-form-label gf-form-label--grow\" />\n        </div>\n      </div>\n      <div className=\"gf-form-inline\">\n        <span className=\"gf-form-label width-9 query-keyword\">Metric</span>\n\n        <Segment\n          className=\"query-part\"\n          onChange={onMetricTypeChange}\n          value={[...metrics, ...templateVariableOptions].find(s => s.value === metricType)}\n          options={[\n            {\n              label: 'Template Variables',\n              options: templateVariableOptions,\n            },\n            ...metrics,\n          ]}\n          placeholder=\"Select Metric\"\n        ></Segment>\n        <div className=\"gf-form gf-form--grow\">\n          <div className=\"gf-form-label gf-form-label--grow\" />\n        </div>\n      </div>\n      {props.children(state.metricDescriptor)}\n    </>\n  );\n}\n","import React from 'react';\nimport { MetricDescriptor } from '../types';\nimport { Icon } from '@grafana/ui';\n\nexport interface Props {\n  rawQuery: string;\n  lastQueryError: string;\n  metricDescriptor?: MetricDescriptor;\n}\n\ninterface State {\n  displayHelp: boolean;\n  displaRawQuery: boolean;\n}\n\nexport class Help extends React.Component<Props, State> {\n  state: State = {\n    displayHelp: false,\n    displaRawQuery: false,\n  };\n\n  onHelpClicked = () => {\n    this.setState({ displayHelp: !this.state.displayHelp });\n  };\n\n  onRawQueryClicked = () => {\n    this.setState({ displaRawQuery: !this.state.displaRawQuery });\n  };\n\n  shouldComponentUpdate(nextProps: Props) {\n    return nextProps.metricDescriptor !== null;\n  }\n\n  render() {\n    const { displayHelp, displaRawQuery } = this.state;\n    const { rawQuery, lastQueryError } = this.props;\n\n    return (\n      <>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\" onClick={this.onHelpClicked}>\n            <label className=\"gf-form-label query-keyword pointer\">\n              Show Help <Icon name={displayHelp ? 'angle-down' : 'angle-right'} />\n            </label>\n          </div>\n\n          {rawQuery && (\n            <div className=\"gf-form\" onClick={this.onRawQueryClicked}>\n              <label className=\"gf-form-label query-keyword\">\n                Raw query\n                <Icon\n                  name={displaRawQuery ? 'angle-down' : 'angle-right'}\n                  ng-show=\"ctrl.showHelp\"\n                  style={{ marginTop: '3px' }}\n                />\n              </label>\n            </div>\n          )}\n\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label gf-form-label--grow\" />\n          </div>\n        </div>\n        {rawQuery && displaRawQuery && (\n          <div className=\"gf-form\">\n            <pre className=\"gf-form-pre\">{rawQuery}</pre>\n          </div>\n        )}\n\n        {displayHelp && (\n          <div className=\"gf-form grafana-info-box alert-info\">\n            <div>\n              <h5>Alias Patterns</h5>Format the legend keys any way you want by using alias patterns. Format the legend\n              keys any way you want by using alias patterns.\n              <br /> <br />\n              Example:\n              <code>{`${'{{metricDescriptor.name}} - {{metricDescriptor.label.instance_name}}'}`}</code>\n              <br />\n              Result: &nbsp;&nbsp;<code>cpu/usage_time - server1-europe-west-1</code>\n              <br />\n              <br />\n              <strong>Patterns</strong>\n              <br />\n              <ul>\n                <li>\n                  <code>{`${'{{metricDescriptor.type}}'}`}</code> = metric type e.g.\n                  compute.googleapis.com/instance/cpu/usage_time\n                </li>\n                <li>\n                  <code>{`${'{{metricDescriptor.name}}'}`}</code> = name part of metric e.g. instance/cpu/usage_time\n                </li>\n                <li>\n                  <code>{`${'{{metricDescriptor.service}}'}`}</code> = service part of metric e.g. compute\n                </li>\n                <li>\n                  <code>{`${'{{metricDescriptor.label.label_name}}'}`}</code> = Metric label metadata e.g.\n                  metricDescriptor.label.instance_name\n                </li>\n                <li>\n                  <code>{`${'{{resource.label.label_name}}'}`}</code> = Resource label metadata e.g. resource.label.zone\n                </li>\n                <li>\n                  <code>{`${'{{metadata.system_labels.name}}'}`}</code> = Meta data system labels e.g.\n                  metadata.system_labels.name. For this to work, the needs to be included in the group by\n                </li>\n                <li>\n                  <code>{`${'{{metadata.user_labels.name}}'}`}</code> = Meta data user labels e.g.\n                  metadata.user_labels.name. For this to work, the needs to be included in the group by\n                </li>\n                <li>\n                  <code>{`${'{{bucket}}'}`}</code> = bucket boundary for distribution metrics when using a heatmap in\n                  Grafana\n                </li>\n                <li>\n                  <code>{`${'{{project}}'}`}</code> = The project name that was specified in the query editor\n                </li>\n                <li>\n                  <code>{`${'{{service}}'}`}</code> = The service id that was specified in the SLO query editor\n                </li>\n                <li>\n                  <code>{`${'{{slo}}'}`}</code> = The SLO id that was specified in the SLO query editor\n                </li>\n                <li>\n                  <code>{`${'{{selector}}'}`}</code> = The Selector function that was specified in the SLO query editor\n                </li>\n              </ul>\n            </div>\n          </div>\n        )}\n\n        {lastQueryError && (\n          <div className=\"gf-form\">\n            <pre className=\"gf-form-pre alert alert-error\">{lastQueryError}</pre>\n          </div>\n        )}\n      </>\n    );\n  }\n}\n","import React, { FunctionComponent } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Segment, Icon } from '@grafana/ui';\nimport { labelsToGroupedOptions } from '../functions';\nimport { systemLabels } from '../constants';\n\nexport interface Props {\n  values: string[];\n  onChange: (values: string[]) => void;\n  variableOptionGroup: SelectableValue<string>;\n  groupBys: string[];\n}\n\nconst removeText = '-- remove group by --';\nconst removeOption: SelectableValue<string> = { label: removeText, value: removeText };\n\nexport const GroupBys: FunctionComponent<Props> = ({ groupBys = [], values = [], onChange, variableOptionGroup }) => {\n  const options = [removeOption, variableOptionGroup, ...labelsToGroupedOptions([...groupBys, ...systemLabels])];\n  return (\n    <div className=\"gf-form-inline\">\n      <label className=\"gf-form-label query-keyword width-9\">Group By</label>\n      {values &&\n        values.map((value, index) => (\n          <Segment\n            allowCustomValue\n            key={value + index}\n            value={value}\n            options={options}\n            onChange={({ value = '' }) =>\n              onChange(\n                value === removeText\n                  ? values.filter((_, i) => i !== index)\n                  : values.map((v, i) => (i === index ? value : v))\n              )\n            }\n          />\n        ))}\n      {values.length !== groupBys.length && (\n        <Segment\n          Component={\n            <a className=\"gf-form-label query-part\">\n              <Icon name=\"plus\" />\n            </a>\n          }\n          allowCustomValue\n          onChange={({ value = '' }) => onChange([...values, value])}\n          options={[\n            variableOptionGroup,\n            ...labelsToGroupedOptions([...groupBys.filter(groupBy => !values.includes(groupBy)), ...systemLabels]),\n          ]}\n        />\n      )}\n      <div className=\"gf-form gf-form--grow\">\n        <label className=\"gf-form-label gf-form-label--grow\"></label>\n      </div>\n    </div>\n  );\n};\n","import React, { FunctionComponent, Fragment } from 'react';\nimport _ from 'lodash';\nimport { SelectableValue } from '@grafana/data';\nimport { Segment, Icon } from '@grafana/ui';\nimport { labelsToGroupedOptions, filtersToStringArray, stringArrayToFilters, toOption } from '../functions';\nimport { Filter } from '../types';\n\nexport interface Props {\n  labels: { [key: string]: string[] };\n  filters: string[];\n  onChange: (filters: string[]) => void;\n  variableOptionGroup: SelectableValue<string>;\n}\n\nconst removeText = '-- remove filter --';\nconst removeOption: SelectableValue<string> = { label: removeText, value: removeText, icon: 'times' };\nconst operators = ['=', '!=', '=~', '!=~'];\n\nexport const LabelFilter: FunctionComponent<Props> = ({\n  labels = {},\n  filters: filterArray,\n  onChange,\n  variableOptionGroup,\n}) => {\n  const filters = stringArrayToFilters(filterArray);\n\n  const options = [removeOption, variableOptionGroup, ...labelsToGroupedOptions(Object.keys(labels))];\n\n  return (\n    <div className=\"gf-form-inline\">\n      <label className=\"gf-form-label query-keyword width-9\">Filter</label>\n      {filters.map(({ key, operator, value, condition }, index) => (\n        <Fragment key={index}>\n          <Segment\n            allowCustomValue\n            value={key}\n            options={options}\n            onChange={({ value: key = '' }) => {\n              if (key === removeText) {\n                onChange(filtersToStringArray(filters.filter((_, i) => i !== index)));\n              } else {\n                onChange(\n                  filtersToStringArray(\n                    filters.map((f, i) => (i === index ? { key, operator, condition, value: '' } : f))\n                  )\n                );\n              }\n            }}\n          />\n          <Segment\n            value={operator}\n            className=\"gf-form-label query-segment-operator\"\n            options={operators.map(toOption)}\n            onChange={({ value: operator = '=' }) =>\n              onChange(filtersToStringArray(filters.map((f, i) => (i === index ? { ...f, operator } : f))))\n            }\n          />\n          <Segment\n            allowCustomValue\n            value={value}\n            placeholder=\"add filter value\"\n            options={\n              labels.hasOwnProperty(key) ? [variableOptionGroup, ...labels[key].map(toOption)] : [variableOptionGroup]\n            }\n            onChange={({ value = '' }) =>\n              onChange(filtersToStringArray(filters.map((f, i) => (i === index ? { ...f, value } : f))))\n            }\n          />\n          {filters.length > 1 && index + 1 !== filters.length && (\n            <label className=\"gf-form-label query-keyword\">{condition}</label>\n          )}\n        </Fragment>\n      ))}\n      {Object.values(filters).every(({ value }) => value) && (\n        <Segment\n          allowCustomValue\n          Component={\n            <a className=\"gf-form-label query-part\">\n              <Icon name=\"plus\" />\n            </a>\n          }\n          options={[variableOptionGroup, ...labelsToGroupedOptions(Object.keys(labels))]}\n          onChange={({ value: key = '' }) =>\n            onChange(filtersToStringArray([...filters, { key, operator: '=', condition: 'AND', value: '' } as Filter]))\n          }\n        />\n      )}\n      <div className=\"gf-form gf-form--grow\">\n        <label className=\"gf-form-label gf-form-label--grow\"></label>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\n\nexport const AnnotationsHelp: FC = () => {\n  return (\n    <div className=\"gf-form grafana-info-box alert-info\">\n      <div>\n        <h5>Annotation Query Format</h5>\n        <p>\n          An annotation is an event that is overlaid on top of graphs. Annotation rendering is expensive so it is\n          important to limit the number of rows returned.{' '}\n        </p>\n        <p>\n          The Title and Text fields support templating and can use data returned from the query. For example, the Title\n          field could have the following text:\n        </p>\n        <code>\n          {`${'{{metric.type}}'}`} has value: {`${'{{metric.value}}'}`}\n        </code>\n        <p>\n          Example Result: <code>monitoring.googleapis.com/uptime_check/http_status has this value: 502</code>\n        </p>\n        <label>Patterns:</label>\n        <p>\n          <code>{`${'{{metric.value}}'}`}</code> = value of the metric/point\n        </p>\n        <p>\n          <code>{`${'{{metric.type}}'}`}</code> = metric type e.g. compute.googleapis.com/instance/cpu/usage_time\n        </p>\n        <p>\n          <code>{`${'{{metric.name}}'}`}</code> = name part of metric e.g. instance/cpu/usage_time\n        </p>\n        <p>\n          <code>{`${'{{metric.service}}'}`}</code> = service part of metric e.g. compute\n        </p>\n        <p>\n          <code>{`${'{{metric.label.label_name}}'}`}</code> = Metric label metadata e.g. metric.label.instance_name\n        </p>\n        <p>\n          <code>{`${'{{resource.label.label_name}}'}`}</code> = Resource label metadata e.g. resource.label.zone\n        </p>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\n\nexport interface Props {\n  onChange: (perSeriesAligner: string) => void;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  alignOptions: Array<SelectableValue<string>>;\n  perSeriesAligner: string;\n}\n\nexport const Alignments: FC<Props> = ({ perSeriesAligner, templateVariableOptions, onChange, alignOptions }) => {\n  return (\n    <>\n      <div className=\"gf-form-inline\">\n        <div className=\"gf-form offset-width-9\">\n          <label className=\"gf-form-label query-keyword width-15\">Aligner</label>\n          <Segment\n            onChange={({ value }) => onChange(value!)}\n            value={[...alignOptions, ...templateVariableOptions].find(s => s.value === perSeriesAligner)}\n            options={[\n              {\n                label: 'Template Variables',\n                options: templateVariableOptions,\n              },\n              {\n                label: 'Alignment options',\n                expanded: true,\n                options: alignOptions,\n              },\n            ]}\n            placeholder=\"Select Alignment\"\n          ></Segment>\n        </div>\n      </div>\n    </>\n  );\n};\n","import React, { FC } from 'react';\nimport _ from 'lodash';\n\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport kbn from 'app/core/utils/kbn';\nimport { SelectableValue } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\nimport { alignmentPeriods, alignOptions } from '../constants';\n\nexport interface Props {\n  onChange: (alignmentPeriod: string) => void;\n  templateSrv: TemplateSrv;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  alignmentPeriod: string;\n  perSeriesAligner: string;\n  usedAlignmentPeriod: string;\n}\n\nexport const AlignmentPeriods: FC<Props> = ({\n  alignmentPeriod,\n  templateSrv,\n  templateVariableOptions,\n  onChange,\n  perSeriesAligner,\n  usedAlignmentPeriod,\n}) => {\n  const alignment = alignOptions.find(ap => ap.value === templateSrv.replace(perSeriesAligner));\n  const formatAlignmentText = `${kbn.secondsToHms(usedAlignmentPeriod)} interval (${alignment ? alignment.text : ''})`;\n  const options = alignmentPeriods.map(ap => ({\n    ...ap,\n    label: ap.text,\n  }));\n\n  return (\n    <>\n      <div className=\"gf-form-inline\">\n        <label className=\"gf-form-label query-keyword width-9\">Alignment Period</label>\n        <Segment\n          onChange={({ value }) => onChange(value!)}\n          value={[...options, ...templateVariableOptions].find(s => s.value === alignmentPeriod)}\n          options={[\n            {\n              label: 'Template Variables',\n              options: templateVariableOptions,\n            },\n            {\n              label: 'Aggregations',\n              expanded: true,\n              options: options,\n            },\n          ]}\n          placeholder=\"Select Alignment\"\n        ></Segment>\n        <div className=\"gf-form gf-form--grow\">\n          {usedAlignmentPeriod && <label className=\"gf-form-label gf-form-label--grow\">{formatAlignmentText}</label>}\n        </div>\n      </div>\n    </>\n  );\n};\n","import React, { FunctionComponent, useState } from 'react';\nimport { debounce } from 'lodash';\nimport { QueryInlineField } from '.';\n\nexport interface Props {\n  onChange: (alias: any) => void;\n  value: string;\n}\n\nexport const AliasBy: FunctionComponent<Props> = ({ value = '', onChange }) => {\n  const [alias, setAlias] = useState(value);\n\n  const propagateOnChange = debounce(onChange, 1000);\n\n  onChange = (e: any) => {\n    setAlias(e.target.value);\n    propagateOnChange(e.target.value);\n  };\n\n  return (\n    <QueryInlineField label=\"Alias By\">\n      <input type=\"text\" className=\"gf-form-input width-26\" value={alias} onChange={onChange} />\n    </QueryInlineField>\n  );\n};\n","import React from 'react';\nimport _ from 'lodash';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Segment, Icon } from '@grafana/ui';\nimport { getAggregationOptionsByMetric } from '../functions';\nimport { ValueTypes, MetricKind } from '../constants';\n\nexport interface Props {\n  onChange: (metricDescriptor: string) => void;\n  metricDescriptor: {\n    valueType: string;\n    metricKind: string;\n  };\n  crossSeriesReducer: string;\n  groupBys: string[];\n  children?: (renderProps: any) => JSX.Element;\n  templateVariableOptions: Array<SelectableValue<string>>;\n}\n\nexport interface State {\n  aggOptions: any[];\n  displayAdvancedOptions: boolean;\n}\n\nexport class Aggregations extends React.Component<Props, State> {\n  state: State = {\n    aggOptions: [],\n    displayAdvancedOptions: false,\n  };\n\n  componentDidMount() {\n    this.setAggOptions(this.props);\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps: Props) {\n    this.setAggOptions(nextProps);\n  }\n\n  setAggOptions({ metricDescriptor }: Props) {\n    let aggOptions: any[] = [];\n    if (metricDescriptor) {\n      aggOptions = getAggregationOptionsByMetric(\n        metricDescriptor.valueType as ValueTypes,\n        metricDescriptor.metricKind as MetricKind\n      ).map(a => ({\n        ...a,\n        label: a.text,\n      }));\n    }\n    this.setState({ aggOptions });\n  }\n\n  onToggleDisplayAdvanced = () => {\n    this.setState(state => ({\n      displayAdvancedOptions: !state.displayAdvancedOptions,\n    }));\n  };\n\n  render() {\n    const { displayAdvancedOptions, aggOptions } = this.state;\n    const { templateVariableOptions, onChange, crossSeriesReducer } = this.props;\n\n    return (\n      <>\n        <div className=\"gf-form-inline\">\n          <label className=\"gf-form-label query-keyword width-9\">Aggregation</label>\n          <Segment\n            onChange={({ value }) => onChange(value)}\n            value={[...aggOptions, ...templateVariableOptions].find(s => s.value === crossSeriesReducer)}\n            options={[\n              {\n                label: 'Template Variables',\n                options: templateVariableOptions,\n              },\n              {\n                label: 'Aggregations',\n                expanded: true,\n                options: aggOptions,\n              },\n            ]}\n            placeholder=\"Select Reducer\"\n          ></Segment>\n          <div className=\"gf-form gf-form--grow\">\n            <label className=\"gf-form-label gf-form-label--grow\">\n              <a onClick={this.onToggleDisplayAdvanced}>\n                <>\n                  <Icon name={displayAdvancedOptions ? 'angle-down' : 'angle-right'} /> Advanced Options\n                </>\n              </a>\n            </label>\n          </div>\n        </div>\n        {this.props.children && this.props.children(this.state.displayAdvancedOptions)}\n      </>\n    );\n  }\n}\n","import React, { ChangeEvent, FC } from 'react';\n\ninterface Props {\n  onValueChange: (e: ChangeEvent<HTMLSelectElement>) => void;\n  options: Array<{ value: string; name: string }>;\n  value: string;\n  label: string;\n}\n\nexport const SimpleSelect: FC<Props> = props => {\n  const { label, onValueChange, value, options } = props;\n  return (\n    <div className=\"gf-form max-width-21\">\n      <span className=\"gf-form-label width-10 query-keyword\">{label}</span>\n      <div className=\"gf-form-select-wrapper max-width-12\">\n        <select className=\"gf-form-input\" required onChange={onValueChange} value={value}>\n          {options.map(({ value, name }, i) => (\n            <option key={i} value={value}>\n              {name}\n            </option>\n          ))}\n        </select>\n      </div>\n    </div>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport _ from 'lodash';\nimport { SelectableValue } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\nimport { QueryType, queryTypes } from '../types';\n\nexport interface Props {\n  value: QueryType;\n  onChange: (slo: QueryType) => void;\n  templateVariableOptions: Array<SelectableValue<string>>;\n}\n\nexport const QueryTypeSelector: FunctionComponent<Props> = ({ onChange, value, templateVariableOptions }) => {\n  return (\n    <div className=\"gf-form-inline\">\n      <label className=\"gf-form-label query-keyword width-9\">Query Type</label>\n      <Segment\n        value={[...queryTypes, ...templateVariableOptions].find(qt => qt.value === value)}\n        options={[\n          ...queryTypes,\n          {\n            label: 'Template Variables',\n            options: templateVariableOptions,\n          },\n        ]}\n        onChange={({ value }: SelectableValue<QueryType>) => onChange(value!)}\n      />\n\n      <div className=\"gf-form gf-form--grow\">\n        <label className=\"gf-form-label gf-form-label--grow\"></label>\n      </div>\n    </div>\n  );\n};\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes<HTMLInputElement> {\n  label: string;\n  tooltip?: string;\n  children?: React.ReactNode;\n}\n\nexport const QueryField: FunctionComponent<Partial<Props>> = ({ label, tooltip, children }) => (\n  <>\n    <InlineFormLabel width={9} className=\"query-keyword\" tooltip={tooltip}>\n      {label}\n    </InlineFormLabel>\n    {children}\n  </>\n);\n\nexport const QueryInlineField: FunctionComponent<Props> = ({ ...props }) => {\n  return (\n    <div className={'gf-form-inline'}>\n      <QueryField {...props} />\n      <div className=\"gf-form gf-form--grow\">\n        <div className=\"gf-form-label gf-form-label--grow\" />\n      </div>\n    </div>\n  );\n};\n","export { Project } from './Project';\nexport { Metrics } from './Metrics';\nexport { Help } from './Help';\nexport { GroupBys } from './GroupBys';\nexport { LabelFilter } from './LabelFilter';\nexport { AnnotationsHelp } from './AnnotationsHelp';\nexport { Alignments } from './Alignments';\nexport { AlignmentPeriods } from './AlignmentPeriods';\nexport { AliasBy } from './AliasBy';\nexport { Aggregations } from './Aggregations';\nexport { SimpleSelect } from './SimpleSelect';\nexport { MetricQueryEditor } from './MetricQueryEditor';\nexport { SLOQueryEditor } from './SLOQueryEditor';\nexport { QueryTypeSelector } from './QueryType';\nexport { QueryInlineField, QueryField } from './Fields';\n","import { CascaderOption as RCCascaderOption } from 'rc-cascader/lib/Cascader';\nimport { CascaderOption } from './Cascader';\n\ntype onChangeType = ((values: string[], options: CascaderOption[]) => void) | undefined;\n\nexport const onChangeCascader = (onChanged: onChangeType) => (values: string[], options: RCCascaderOption[]) => {\n  if (onChanged) {\n    onChanged(values, fromRCOptions(options));\n  }\n};\n\ntype onLoadDataType = ((options: CascaderOption[]) => void) | undefined;\n\nexport const onLoadDataCascader = (onLoadData: onLoadDataType) => (options: RCCascaderOption[]) => {\n  if (onLoadData) {\n    onLoadData(fromRCOptions(options));\n  }\n};\n\nconst fromRCOptions = (options: RCCascaderOption[]): CascaderOption[] => {\n  return options.map(fromRCOption);\n};\n\nconst fromRCOption = (option: RCCascaderOption): CascaderOption => {\n  return {\n    value: option.value ?? '',\n    label: (option.label as unknown) as string,\n  };\n};\n","export * from './Button';\n","var path = 'public/app/plugins/datasource/mssql/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form-inline>\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <textarea rows=10 class=gf-form-input ng-model=ctrl.annotation.rawQuery spellcheck=false placeholder=\\\"query expression\\\" data-min-length=0 data-items=100 ng-model-onblur ng-change=ctrl.panelCtrl.refresh()></textarea>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showHelp>\\n    <pre class=\\\"gf-form-pre alert alert-info\\\"><h6>Annotation Query Format</h6>\\nAn annotation is an event that is overlaid on top of graphs. The query can have up to four columns per row, the <b>time</b> column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\\n\\n- column with alias: <b>time</b> for the annotation event time. Use epoch time or any native date data type.\\n- column with alias: <b>timeend</b> for the annotation event end time. Use epoch time or any native date data type.\\n- column with alias: <b>text</b> for the annotation text.\\n- column with alias: <b>tags</b> for annotation tags. This is a comma separated string of tags e.g. 'tag1,tag2'.\\n\\n\\nMacros:\\n- $__time(column) -&gt; column AS time\\n- $__timeEpoch(column) -&gt; DATEDIFF(second, '1970-01-01', column) AS time\\n- $__timeFilter(column) -&gt; column BETWEEN '2017-04-21T05:01:17Z' AND '2017-04-21T05:01:17Z'\\n- $__unixEpochFilter(column) -&gt; column &gt;= 1492750877 AND column &lt;= 1492750877\\n- $__unixEpochNanoFilter(column) -&gt;  column &gt;= 1494410783152415214 AND column &lt;= 1494497183142514872\\n\\nOr build your own conditionals using these macros which just return the values:\\n- $__timeFrom() -&gt;  '2017-04-21T05:01:17Z'\\n- $__timeTo() -&gt;  '2017-04-21T05:01:17Z'\\n- $__unixEpochFrom() -&gt; 1492750877\\n- $__unixEpochTo() -&gt; 1492750877\\n- $__unixEpochNanoFrom() -&gt;  1494410783152415214\\n- $__unixEpochNanoTo() -&gt;  1494497183142514872\\n\\t\\t</pre>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash';\nimport { alignOptions, aggOptions, ValueTypes, MetricKind, systemLabels } from './constants';\nimport { SelectableValue } from '@grafana/data';\nimport StackdriverDatasource from './datasource';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { MetricDescriptor, Filter, MetricQuery } from './types';\n\nexport const extractServicesFromMetricDescriptors = (metricDescriptors: MetricDescriptor[]) =>\n  _.uniqBy(metricDescriptors, 'service');\n\nexport const getMetricTypesByService = (metricDescriptors: MetricDescriptor[], service: string) =>\n  metricDescriptors.filter((m: MetricDescriptor) => m.service === service);\n\nexport const getMetricTypes = (\n  metricDescriptors: MetricDescriptor[],\n  metricType: string,\n  interpolatedMetricType: string,\n  selectedService: string\n) => {\n  const metricTypes = getMetricTypesByService(metricDescriptors, selectedService).map((m: any) => ({\n    value: m.type,\n    name: m.displayName,\n  }));\n  const metricTypeExistInArray = metricTypes.some(\n    (m: { value: string; name: string }) => m.value === interpolatedMetricType\n  );\n  const selectedMetricType = metricTypeExistInArray ? metricType : metricTypes[0].value;\n  return {\n    metricTypes,\n    selectedMetricType,\n  };\n};\n\nexport const getAlignmentOptionsByMetric = (metricValueType: string, metricKind: string) => {\n  return !metricValueType\n    ? []\n    : alignOptions.filter(i => {\n        return (\n          i.valueTypes.indexOf(metricValueType as ValueTypes) !== -1 &&\n          i.metricKinds.indexOf(metricKind as MetricKind) !== -1\n        );\n      });\n};\n\nexport const getAggregationOptionsByMetric = (valueType: ValueTypes, metricKind: MetricKind) => {\n  return !metricKind\n    ? []\n    : aggOptions.filter(i => {\n        return i.valueTypes.indexOf(valueType) !== -1 && i.metricKinds.indexOf(metricKind) !== -1;\n      });\n};\n\nexport const getLabelKeys = async (\n  datasource: StackdriverDatasource,\n  selectedMetricType: string,\n  projectName: string\n) => {\n  const refId = 'handleLabelKeysQuery';\n  const labels = await datasource.getLabels(selectedMetricType, refId, projectName);\n  return [...Object.keys(labels), ...systemLabels];\n};\n\nexport const getAlignmentPickerData = (\n  { valueType, metricKind, perSeriesAligner }: Partial<MetricQuery>,\n  templateSrv: TemplateSrv\n) => {\n  const alignOptions = getAlignmentOptionsByMetric(valueType!, metricKind!).map(option => ({\n    ...option,\n    label: option.text,\n  }));\n  if (!alignOptions.some((o: { value: string }) => o.value === templateSrv.replace(perSeriesAligner!))) {\n    perSeriesAligner = alignOptions.length > 0 ? alignOptions[0].value : '';\n  }\n  return { alignOptions, perSeriesAligner };\n};\n\nexport const labelsToGroupedOptions = (groupBys: string[]) => {\n  const groups = groupBys.reduce((acc: any, curr: string) => {\n    const arr = curr.split('.').map(_.startCase);\n    const group = (arr.length === 2 ? arr : _.initial(arr)).join(' ');\n    const option = {\n      value: curr,\n      label: curr,\n    };\n    if (acc[group]) {\n      acc[group] = [...acc[group], option];\n    } else {\n      acc[group] = [option];\n    }\n    return acc;\n  }, {});\n  return Object.entries(groups).map(([label, options]) => ({ label, options, expanded: true }), []);\n};\n\nexport const filtersToStringArray = (filters: Filter[]) => {\n  const strArr = _.flatten(filters.map(({ key, operator, value, condition }) => [key, operator, value, condition]));\n  return strArr.filter((_, i) => i !== strArr.length - 1);\n};\n\nexport const stringArrayToFilters = (filterArray: string[]) =>\n  _.chunk(filterArray, 4).map(([key, operator, value, condition = 'AND']) => ({\n    key,\n    operator,\n    value,\n    condition,\n  }));\n\nexport const toOption = (value: string) => ({ label: value, value } as SelectableValue<string>);\n\nexport const formatStackdriverError = (error: any) => {\n  let message = error.statusText ?? '';\n  if (error.data && error.data.error) {\n    try {\n      const res = JSON.parse(error.data.error);\n      message += res.error.code + '. ' + res.error.message;\n    } catch (err) {\n      message += error.data.error;\n    }\n  } else if (error.data && error.data.message) {\n    try {\n      message = JSON.parse(error.data.message).error.message;\n    } catch (err) {\n      error.error;\n    }\n  }\n  return message;\n};\n","export function assignModelProperties(target: any, source: any, defaults: any, removeDefaults?: undefined) {\n  for (const key in defaults) {\n    if (!defaults.hasOwnProperty(key)) {\n      continue;\n    }\n\n    target[key] = source[key] === undefined ? defaults[key] : source[key];\n  }\n}\n","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { ConfirmModal, stylesFactory, useTheme } from '@grafana/ui';\nimport { getLocationSrv } from '@grafana/runtime';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSection, OnDeleteItems } from '../types';\nimport { getCheckedUids } from '../utils';\n\ninterface Props {\n  onDeleteItems: OnDeleteItems;\n  results: DashboardSection[];\n  isOpen: boolean;\n  onDismiss: () => void;\n}\n\nexport const ConfirmDeleteModal: FC<Props> = ({ results, onDeleteItems, isOpen, onDismiss }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  const uids = getCheckedUids(results);\n  const { folders, dashboards } = uids;\n  const folderCount = folders.length;\n  const dashCount = dashboards.length;\n\n  let text = 'Do you want to delete the ';\n  let subtitle;\n  const dashEnding = dashCount === 1 ? '' : 's';\n  const folderEnding = folderCount === 1 ? '' : 's';\n\n  if (folderCount > 0 && dashCount > 0) {\n    text += `selected folder${folderEnding} and dashboard${dashEnding}?\\n`;\n    subtitle = `All dashboards of the selected folder${folderEnding} will also be deleted`;\n  } else if (folderCount > 0) {\n    text += `selected folder${folderEnding} and all its dashboards?`;\n  } else {\n    text += `selected dashboard${dashEnding}?`;\n  }\n\n  const deleteItems = () => {\n    backendSrv.deleteFoldersAndDashboards(folders, dashboards).then(() => {\n      onDismiss();\n      // Redirect to /dashboard in case folder was deleted from f/:folder.uid\n      getLocationSrv().update({ path: '/dashboards' });\n      onDeleteItems(folders, dashboards);\n    });\n  };\n\n  return isOpen ? (\n    <ConfirmModal\n      isOpen={isOpen}\n      title=\"Delete\"\n      body={\n        <>\n          {text} {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n        </>\n      }\n      confirmText=\"Delete\"\n      onConfirm={deleteItems}\n      onDismiss={onDismiss}\n    />\n  ) : null;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    subtitle: css`\n      font-size: ${theme.typography.size.base};\n      padding-top: ${theme.spacing.md};\n    `,\n  };\n});\n","import { has } from 'lodash';\nimport {\n  getValueFormat,\n  getValueFormatterIndex,\n  getValueFormats,\n  stringToJsRegex,\n  TimeRange,\n  deprecationWarning,\n  DecimalCount,\n  formattedValueToString,\n} from '@grafana/data';\n\nconst kbn: any = {};\n\nkbn.valueFormats = {};\n\nkbn.regexEscape = (value: string) => {\n  return value.replace(/[\\\\^$*+?.()|[\\]{}\\/]/g, '\\\\$&');\n};\n\n///// HELPER FUNCTIONS /////\n\nkbn.round_interval = (interval: number) => {\n  switch (true) {\n    // 0.015s\n    case interval < 15:\n      return 10; // 0.01s\n    // 0.035s\n    case interval < 35:\n      return 20; // 0.02s\n    // 0.075s\n    case interval < 75:\n      return 50; // 0.05s\n    // 0.15s\n    case interval < 150:\n      return 100; // 0.1s\n    // 0.35s\n    case interval < 350:\n      return 200; // 0.2s\n    // 0.75s\n    case interval < 750:\n      return 500; // 0.5s\n    // 1.5s\n    case interval < 1500:\n      return 1000; // 1s\n    // 3.5s\n    case interval < 3500:\n      return 2000; // 2s\n    // 7.5s\n    case interval < 7500:\n      return 5000; // 5s\n    // 12.5s\n    case interval < 12500:\n      return 10000; // 10s\n    // 17.5s\n    case interval < 17500:\n      return 15000; // 15s\n    // 25s\n    case interval < 25000:\n      return 20000; // 20s\n    // 45s\n    case interval < 45000:\n      return 30000; // 30s\n    // 1.5m\n    case interval < 90000:\n      return 60000; // 1m\n    // 3.5m\n    case interval < 210000:\n      return 120000; // 2m\n    // 7.5m\n    case interval < 450000:\n      return 300000; // 5m\n    // 12.5m\n    case interval < 750000:\n      return 600000; // 10m\n    // 12.5m\n    case interval < 1050000:\n      return 900000; // 15m\n    // 25m\n    case interval < 1500000:\n      return 1200000; // 20m\n    // 45m\n    case interval < 2700000:\n      return 1800000; // 30m\n    // 1.5h\n    case interval < 5400000:\n      return 3600000; // 1h\n    // 2.5h\n    case interval < 9000000:\n      return 7200000; // 2h\n    // 4.5h\n    case interval < 16200000:\n      return 10800000; // 3h\n    // 9h\n    case interval < 32400000:\n      return 21600000; // 6h\n    // 1d\n    case interval < 86400000:\n      return 43200000; // 12h\n    // 1w\n    case interval < 604800000:\n      return 86400000; // 1d\n    // 3w\n    case interval < 1814400000:\n      return 604800000; // 1w\n    // 6w\n    case interval < 3628800000:\n      return 2592000000; // 30d\n    default:\n      return 31536000000; // 1y\n  }\n};\n\nkbn.secondsToHms = (seconds: number) => {\n  const numyears = Math.floor(seconds / 31536000);\n  if (numyears) {\n    return numyears + 'y';\n  }\n  const numdays = Math.floor((seconds % 31536000) / 86400);\n  if (numdays) {\n    return numdays + 'd';\n  }\n  const numhours = Math.floor(((seconds % 31536000) % 86400) / 3600);\n  if (numhours) {\n    return numhours + 'h';\n  }\n  const numminutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);\n  if (numminutes) {\n    return numminutes + 'm';\n  }\n  const numseconds = Math.floor((((seconds % 31536000) % 86400) % 3600) % 60);\n  if (numseconds) {\n    return numseconds + 's';\n  }\n  const nummilliseconds = Math.floor(seconds * 1000.0);\n  if (nummilliseconds) {\n    return nummilliseconds + 'ms';\n  }\n\n  return 'less than a millisecond'; //'just now' //or other string you like;\n};\n\nkbn.secondsToHhmmss = (seconds: number) => {\n  const strings: string[] = [];\n  const numhours = Math.floor(seconds / 3600);\n  const numminutes = Math.floor((seconds % 3600) / 60);\n  const numseconds = Math.floor((seconds % 3600) % 60);\n  numhours > 9 ? strings.push('' + numhours) : strings.push('0' + numhours);\n  numminutes > 9 ? strings.push('' + numminutes) : strings.push('0' + numminutes);\n  numseconds > 9 ? strings.push('' + numseconds) : strings.push('0' + numseconds);\n  return strings.join(':');\n};\n\nkbn.to_percent = (nr: number, outof: number) => {\n  return Math.floor((nr / outof) * 10000) / 100 + '%';\n};\n\nkbn.addslashes = (str: string) => {\n  str = str.replace(/\\\\/g, '\\\\\\\\');\n  str = str.replace(/\\'/g, \"\\\\'\");\n  str = str.replace(/\\\"/g, '\\\\\"');\n  str = str.replace(/\\0/g, '\\\\0');\n  return str;\n};\n\nkbn.interval_regex = /(\\d+(?:\\.\\d+)?)(ms|[Mwdhmsy])/;\n\n// histogram & trends\nkbn.intervals_in_seconds = {\n  y: 31536000,\n  M: 2592000,\n  w: 604800,\n  d: 86400,\n  h: 3600,\n  m: 60,\n  s: 1,\n  ms: 0.001,\n};\n\nkbn.calculateInterval = (range: TimeRange, resolution: number, lowLimitInterval: string[]) => {\n  let lowLimitMs = 1; // 1 millisecond default low limit\n  let intervalMs;\n\n  if (lowLimitInterval) {\n    if (lowLimitInterval[0] === '>') {\n      lowLimitInterval = lowLimitInterval.slice(1);\n    }\n    lowLimitMs = kbn.interval_to_ms(lowLimitInterval);\n  }\n\n  intervalMs = kbn.round_interval((range.to.valueOf() - range.from.valueOf()) / resolution);\n  if (lowLimitMs > intervalMs) {\n    intervalMs = lowLimitMs;\n  }\n\n  return {\n    intervalMs: intervalMs,\n    interval: kbn.secondsToHms(intervalMs / 1000),\n  };\n};\n\nkbn.describe_interval = (str: string) => {\n  // Default to seconds if no unit is provided\n  if (Number(str)) {\n    return {\n      sec: kbn.intervals_in_seconds.s,\n      type: 's',\n      count: parseInt(str, 10),\n    };\n  }\n\n  const matches = str.match(kbn.interval_regex);\n  if (!matches || !has(kbn.intervals_in_seconds, matches[2])) {\n    throw new Error(\n      `Invalid interval string, has to be either unit-less or end with one of the following units: \"${Object.keys(\n        kbn.intervals_in_seconds\n      ).join(', ')}\"`\n    );\n  } else {\n    return {\n      sec: kbn.intervals_in_seconds[matches[2]],\n      type: matches[2],\n      count: parseInt(matches[1], 10),\n    };\n  }\n};\n\nkbn.interval_to_ms = (str: string) => {\n  const info = kbn.describe_interval(str);\n  return info.sec * 1000 * info.count;\n};\n\nkbn.interval_to_seconds = (str: string) => {\n  const info = kbn.describe_interval(str);\n  return info.sec * info.count;\n};\n\nkbn.query_color_dot = (color: string, diameter: string) => {\n  return (\n    '<div class=\"icon-circle\" style=\"' +\n    ['display:inline-block', 'color:' + color, 'font-size:' + diameter + 'px'].join(';') +\n    '\"></div>'\n  );\n};\n\nkbn.slugifyForUrl = (str: string) => {\n  return str\n    .toLowerCase()\n    .replace(/[^\\w ]+/g, '')\n    .replace(/ +/g, '-');\n};\n\n/** deprecated since 6.1, use grafana/data */\nkbn.stringToJsRegex = (str: string) => {\n  deprecationWarning('kbn.ts', 'kbn.stringToJsRegex()', '@grafana/data');\n  return stringToJsRegex(str);\n};\n\nkbn.toFixed = (value: number | null, decimals: number) => {\n  if (value === null) {\n    return '';\n  }\n\n  const factor = decimals ? Math.pow(10, Math.max(0, decimals)) : 1;\n  const formatted = String(Math.round(value * factor) / factor);\n\n  // if exponent return directly\n  if (formatted.indexOf('e') !== -1 || value === 0) {\n    return formatted;\n  }\n\n  // If tickDecimals was specified, ensure that we have exactly that\n  // much precision; otherwise default to the value's own precision.\n  if (decimals != null) {\n    const decimalPos = formatted.indexOf('.');\n    const precision = decimalPos === -1 ? 0 : formatted.length - decimalPos - 1;\n    if (precision < decimals) {\n      return (precision ? formatted : formatted + '.') + String(factor).substr(1, decimals - precision);\n    }\n  }\n\n  return formatted;\n};\n\nkbn.toFixedScaled = (\n  value: number,\n  decimals: number,\n  scaledDecimals: number | null,\n  additionalDecimals: number,\n  ext: number\n) => {\n  if (scaledDecimals === null) {\n    return kbn.toFixed(value, decimals) + ext;\n  } else {\n    return kbn.toFixed(value, scaledDecimals + additionalDecimals) + ext;\n  }\n};\n\nkbn.roundValue = (num: number, decimals: number) => {\n  if (num === null) {\n    return null;\n  }\n  const n = Math.pow(10, decimals);\n  const formatted = (n * num).toFixed(decimals);\n  return Math.round(parseFloat(formatted)) / n;\n};\n\n///// FORMAT MENU /////\n\nkbn.getUnitFormats = () => {\n  return getValueFormats();\n};\n\n//\n// Backward compatible layer for value formats to support old plugins\n//\nif (typeof Proxy !== 'undefined') {\n  kbn.valueFormats = new Proxy(kbn.valueFormats, {\n    get(target, name, receiver) {\n      if (typeof name !== 'string') {\n        throw { message: `Value format ${String(name)} is not a string` };\n      }\n\n      const formatter = getValueFormat(name);\n      if (formatter) {\n        // Return the results as a simple string\n        return (value: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount, isUtc?: boolean) => {\n          return formattedValueToString(formatter(value, decimals, scaledDecimals, isUtc ? 'utc' : 'browser'));\n        };\n      }\n\n      // default to look here\n      return Reflect.get(target, name, receiver);\n    },\n  });\n} else {\n  kbn.valueFormats = getValueFormatterIndex();\n}\n\nexport default kbn;\n","import { seriesToColumnsTransformer } from './seriesToColumns';\nimport { DataFrame } from '../../types/dataFrame';\nimport { getTimeField } from '../../dataframe/processDataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { DataTransformerID } from './ids';\n\nexport const ensureColumnsTransformer: DataTransformerInfo = {\n  id: DataTransformerID.ensureColumns,\n  name: 'Ensure Columns Transformer',\n  description: 'Will check if current data frames is series or columns. If in series it will convert to columns.',\n  transformer: () => (data: DataFrame[]) => {\n    // Assume timeseries should first be joined by time\n    const timeFieldName = findConsistentTimeFieldName(data);\n\n    if (data.length > 1 && timeFieldName) {\n      return seriesToColumnsTransformer.transformer({\n        byField: timeFieldName,\n      })(data);\n    }\n\n    return data;\n  },\n};\n\n/**\n * Find the name for the time field used in all frames (if one exists)\n */\nfunction findConsistentTimeFieldName(data: DataFrame[]): string | undefined {\n  let name: string | undefined = undefined;\n  for (const frame of data) {\n    const { timeField } = getTimeField(frame);\n    if (!timeField) {\n      return undefined; // Not timeseries\n    }\n    if (!name) {\n      name = timeField.name;\n    } else if (name !== timeField.name) {\n      // Second frame has a different time column?!\n      return undefined;\n    }\n  }\n  return name;\n}\n","var path = 'public/app/plugins/datasource/elasticsearch/partials/metric_agg.html';\nvar html = \"<div class=gf-form-inline ng-class=\\\"{'gf-form-disabled': agg.hide}\\\">\\n\\t<div class=gf-form>\\n\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\tMetric\\n\\t\\t\\t&nbsp;\\n\\t\\t\\t<a ng-click=toggleShowMetric() bs-tooltip=\\\"'Click to toggle show / hide metric'\\\" style=margin-top:2px>\\n\\t\\t\\t\\t<icon name=\\\"'eye'\\\" size=\\\"'sm'\\\" ng-hide=agg.hide></icon>\\n\\t\\t\\t\\t<icon name=\\\"'eye-slash'\\\" size=\\\"'sm'\\\" ng-show=agg.hide></icon>\\n\\t\\t\\t</a>\\n\\t\\t</label>\\n\\t</div>\\n\\n\\t<div class=gf-form>\\n\\t\\t<metric-segment-model property=agg.type options=metricAggTypes on-change=onTypeChange() custom=false css-class=width-10></metric-segment-model>\\n\\t\\t<metric-segment-model ng-if=aggDef.requiresField property=agg.field get-options=getFieldsInternal() on-change=onChange() css-class=width-12></metric-segment-model>\\n\\t\\t<metric-segment-model ng-if=\\\"aggDef.isPipelineAgg && !aggDef.supportsMultipleBucketPaths\\\" property=agg.pipelineAgg options=pipelineAggOptions on-change=onChangeInternal() custom=false css-class=width-12></metric-segment-model>\\n\\t</div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\" ng-if=\\\"aggDef.isPipelineAgg && aggDef.supportsMultipleBucketPaths\\\">\\n\\t\\t<label class=\\\"gf-form-label gf-form-label--grow\\\">\\n\\t\\t\\t<a ng-click=toggleVariables()>\\n\\t\\t\\t\\t<icon name=\\\"'angle-down'\\\" ng-show=showVariables></icon>\\n\\t\\t\\t\\t<icon name=\\\"'angle-right'\\\" ng-hide=showVariables></icon>\\n        {{variablesLinkText}}\\n\\t\\t\\t</a>\\n\\t\\t</label>\\n\\t</div>\\n\\n\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t<label class=\\\"gf-form-label gf-form-label--grow\\\">\\n\\t\\t\\t<a ng-click=toggleOptions() ng-if=settingsLinkText>\\n\\t\\t\\t\\t<icon name=\\\"'angle-down'\\\" ng-show=showOptions></icon>\\n\\t\\t\\t\\t<icon name=\\\"'angle-right'\\\" ng-hide=showOptions></icon>\\n\\t\\t\\t\\t\\t{{settingsLinkText}}\\n\\t\\t\\t</a>\\n\\t\\t</label>\\n\\t</div>\\n\\n\\t<div class=gf-form>\\n\\t\\t<label class=gf-form-label ng-if=isFirst>\\n\\t\\t\\t<a class=pointer ng-click=addMetricAgg()><icon name=\\\"'plus'\\\"></icon></a>\\n\\t\\t</label>\\n\\t\\t<label class=gf-form-label ng-if=!isSingle>\\n\\t\\t\\t<a class=pointer ng-click=removeMetricAgg()><icon name=\\\"'minus'\\\"></icon></a>\\n\\t\\t</label>\\n\\t</div>\\n</div>\\n\\n<div class=gf-form-group ng-if=showVariables>\\n\\t<elastic-pipeline-variables variables=agg.pipelineVariables options=pipelineAggOptions on-change=onChangeInternal() />\\n  <div class=\\\"gf-form offset-width-7\\\">\\n    <label class=\\\"gf-form-label width-10\\\">\\n      Script\\n      <info-popover mode=right-normal>\\n        Elasticsearch v5.0 and above: Scripting language is Painless. Use <i>params.&lt;var&gt;</i> to reference a variable.<br/><br/>\\n        Elasticsearch pre-v5.0: Scripting language is per default Groovy if not changed. For Groovy use <i>&lt;var&gt;</i> to reference a variable.\\n      </info-popover>\\n    </label>\\n    <input type=text class=\\\"gf-form-input max-width-24\\\" empty-to-null ng-model=agg.settings.script ng-blur=onChangeInternal() spellcheck=false placeholder=\\\"params.var1 / params.var2\\\">\\n  </div>\\n</div>\\n\\n<div class=gf-form-group ng-if=showOptions>\\n\\t<div class=\\\"gf-form offset-width-7\\\" ng-if=\\\"agg.type === 'derivative'\\\">\\n\\t\\t<label class=\\\"gf-form-label width-10\\\">Unit</label>\\n\\t\\t<input type=text class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.unit ng-blur=onChangeInternal() spellcheck=false>\\n\\t</div>\\n\\n  <div ng-if=\\\"agg.type === 'moving_avg'\\\">\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Model</label>\\n      <metric-segment-model property=agg.settings.model options=movingAvgModelTypes on-change=onChangeClearInternal() custom=false css-class=width-12></metric-segment-model>\\n    </div>\\n\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Window</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.window ng-blur=onChangeInternal() spellcheck=false>\\n    </div>\\n\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Predict</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.predict ng-blur=onChangeInternal() spellcheck=false>\\n    </div>\\n\\n\\n    <div class=\\\"gf-form offset-width-7\\\" ng-repeat=\\\"setting in modelSettings\\\">\\n      <label class=\\\"gf-form-label width-10\\\">{{setting.text}}</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.settings[setting.value] ng-blur=onChangeInternal() spellcheck=false>\\n    </div>\\n\\n    <gf-form-switch ng-if=\\\"agg.settings.model == 'holt_winters'\\\" class=\\\"gf-form offset-width-7\\\" label=Pad label-class=width-10 checked=agg.settings.settings.pad on-change=onChangeInternal()></gf-form-switch>\\n    <gf-form-switch ng-if=\\\"agg.settings.model.match('ewma|holt_winters|holt') !== null\\\" class=\\\"gf-form offset-width-7\\\" label=Minimize label-class=width-10 checked=agg.settings.minimize on-change=onChangeInternal()></gf-form-switch>\\n  </div>\\n\\n  <div class=\\\"gf-form offset-width-7\\\" ng-if=\\\"agg.type === 'percentiles'\\\">\\n    <label class=\\\"gf-form-label width-10\\\">Percentiles</label>\\n    <input type=text class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.percents array-join ng-blur=onChange()>\\n  </div>\\n  <div class=\\\"gf-form offset-width-7\\\" ng-if=\\\"agg.type === 'raw_document'\\\">\\n    <label class=\\\"gf-form-label width-10\\\">Size</label>\\n    <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.size ng-blur=onChange()>\\n  </div>\\n\\n\\n  <div class=\\\"gf-form offset-width-7\\\" ng-if=\\\"agg.type === 'cardinality'\\\">\\n    <label class=\\\"gf-form-label width-10\\\">Precision threshold</label>\\n    <input type=number class=\\\"gf-form-input max-width-12\\\" ng-model=agg.settings.precision_threshold ng-blur=onChange()>\\n  </div>\\n\\n  <div ng-if=\\\"agg.type === 'extended_stats'\\\">\\n    <gf-form-switch ng-repeat=\\\"stat in extendedStats\\\" class=\\\"gf-form offset-width-7\\\" label={{stat.text}} label-class=width-10 checked=agg.meta[stat.value] on-change=onChangeInternal()></gf-form-switch>\\n\\n    <div class=\\\"gf-form offset-width-7\\\">\\n      <label class=\\\"gf-form-label width-10\\\">Sigma</label>\\n      <input type=number class=\\\"gf-form-input max-width-12\\\" placeholder=3 ng-model=agg.settings.sigma ng-blur=onChange()>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"gf-form offset-width-7\\\" ng-if=aggDef.supportsInlineScript>\\n    <label class=\\\"gf-form-label width-10\\\">Script</label>\\n    <input type=text class=\\\"gf-form-input max-width-12\\\" empty-to-null ng-model=agg.inlineScript ng-blur=onChangeInternal() spellcheck=false placeholder=\\\"_value * 1\\\">\\n  </div>\\n\\n  <div class=\\\"gf-form offset-width-7\\\" ng-if=aggDef.supportsMissing>\\n\\t\\t<label class=\\\"gf-form-label width-10\\\">\\n\\t\\t\\tMissing\\n\\t\\t\\t<tip>The missing parameter defines how documents that are missing a value should be treated. By default they will be ignored but it is also possible to treat them as if they had a value</tip>\\n\\t\\t</label>\\n\\t\\t<input type=number class=\\\"gf-form-input max-width-12\\\" empty-to-null ng-model=agg.settings.missing ng-blur=onChangeInternal() spellcheck=false>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import coreModule from 'app/core/core_module';\nimport { provideTheme } from 'app/core/utils/ConfigProvider';\n\nexport function react2AngularDirective(name: string, component: any, options: any) {\n  coreModule.directive(name, [\n    'reactDirective',\n    reactDirective => {\n      return reactDirective(provideTheme(component), options);\n    },\n  ]);\n}\n","var path = 'public/app/features/org/partials/select_org.html';\nvar html = \"<page-header model=navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\n\\t<div class=signup>\\n\\t\\t<div class=login-form>\\n\\n\\t\\t\\t<div class=modal-tagline>\\n\\t\\t\\t\\tYou have been added to another Organization due to an open invitation!\\n\\n\\t\\t\\t\\tPlease select which organization you want to <br>\\n\\t\\t\\t\\tuse right now (you can change this later at any time).\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div style=\\\"display:inline-block;width:400px;margin:30px 0\\\">\\n\\t\\t\\t\\t<div ng-repeat=\\\"org in orgs\\\">\\n\\t\\t\\t\\t\\t<a ng-click=setUsingOrg(org) class=\\\"btn btn-primary\\\">\\n\\t\\t\\t\\t\\t\\t{{org.name}} ({{org.role}})\\n\\t\\t\\t\\t\\t</a>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","export enum FieldColorMode {\n  Thresholds = 'thresholds',\n  Scheme = 'scheme',\n  Fixed = 'fixed',\n}\n\nexport interface FieldColor {\n  mode: FieldColorMode;\n  schemeName?: ColorScheme;\n  fixedColor?: string;\n}\n\n// https://github.com/d3/d3-scale-chromatic\nexport enum ColorScheme {\n  BrBG = 'BrBG',\n  PRGn = 'PRGn',\n  PiYG = 'PiYG',\n  PuOr = 'PuOr',\n  RdBu = 'RdBu',\n  RdGy = 'RdGy',\n  RdYlBu = 'RdYlBu',\n  RdYlGn = 'RdYlGn',\n  Spectral = 'Spectral',\n  BuGn = 'BuGn',\n  BuPu = 'BuPu',\n  GnBu = 'GnBu',\n  OrRd = 'OrRd',\n  PuBuGn = 'PuBuGn',\n  PuBu = 'PuBu',\n  PuRd = 'PuRd',\n  RdPu = 'RdPu',\n  YlGnBu = 'YlGnBu',\n  YlGn = 'YlGn',\n  YlOrBr = 'YlOrBr',\n  YlOrRd = 'YlOrRd',\n  Blues = 'Blues',\n  Greens = 'Greens',\n  Greys = 'Greys',\n  Purples = 'Purples',\n  Reds = 'Reds',\n  Oranges = 'Oranges',\n\n  // interpolateCubehelix\n  // interpolateRainbow,\n  // interpolateWarm\n  // interpolateCool\n  // interpolateSinebow\n  // interpolateViridis\n  // interpolateMagma\n  // interpolateInferno\n  // interpolatePlasma\n}\n","var path = 'public/app/features/admin/partials/edit_user.html';\nvar html = \"<page-header model=navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n  <h3 class=page-sub-heading>Edit User</h3>\\n\\n  <form name=userForm class=gf-form-group>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-10\\\">Name</span>\\n      <input type=text required ng-model=user.name class=\\\"gf-form-input max-width-25\\\"/>\\n    </div>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-10\\\">Email</span>\\n      <input type=email ng-model=user.email class=\\\"gf-form-input max-width-25\\\"/>\\n    </div>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-10\\\">Username</span>\\n      <input type=text ng-model=user.login class=\\\"gf-form-input max-width-25\\\"/>\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button type=submit class=\\\"btn btn-primary\\\" ng-click=update() ng-show=!createMode>Update</button>\\n    </div>\\n  </form>\\n\\n  <h3 class=page-heading>Change password</h3>\\n\\n  <form name=passwordForm class=gf-form-group>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-10\\\">New password</span>\\n      <input type=password required ng-minlength=4 ng-model=password class=\\\"gf-form-input max-width-25\\\"/>\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button type=submit class=\\\"btn btn-primary\\\" ng-click=setPassword()>Update</button>\\n    </div>\\n  </form>\\n\\n  <h3 class=page-heading>Permissions</h3>\\n\\n  <form name=passwordForm class=gf-form-group>\\n    <div class=gf-form>\\n      <gf-form-switch class=gf-form label=\\\"Grafana Admin\\\" checked=permissions.isGrafanaAdmin switch-class=max-width-6 on-change=updatePermissions()></gf-form-switch>\\n    </div>\\n  </form>\\n\\n  <h3 class=page-heading>Organizations</h3>\\n\\n  <form name=addOrgForm class=gf-form-group>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <span class=gf-form-label>Add</span>\\n        <input type=text ng-model=newOrg.name bs-typeahead=searchOrgs required class=\\\"gf-form-input max-width-20\\\" placeholder=\\\"organization name\\\"/>\\n      </div>\\n      <div class=gf-form>\\n        <span class=gf-form-label>Role</span>\\n        <span class=gf-form-select-wrapper>\\n          <select type=text ng-model=newOrg.role class=\\\"gf-form-input width-10\\\" ng-options=\\\"f for f in ['Viewer', 'Editor', 'Admin']\\\"></select>\\n        </span>\\n      </div>\\n      <div class=gf-form>\\n        <button class=\\\"btn btn-primary gf-form-btn\\\" ng-click=addOrgUser()>Add</button>\\n      </div>\\n    </div>\\n  </form>\\n\\n  <div class=gf-form-group>\\n    <table class=filter-table>\\n      <thead>\\n        <tr>\\n          <th>Name</th>\\n          <th>Role</th>\\n          <th></th>\\n        </tr>\\n      </thead>\\n      <tr ng-repeat=\\\"org in orgs\\\">\\n        <td>{{org.name}} <span class=\\\"label label-info\\\" ng-show=\\\"org.orgId === user.orgId\\\">Current</span></td>\\n        <td>\\n          <div class=gf-form>\\n            <span class=gf-form-select-wrapper>\\n              <select type=text ng-model=org.role class=\\\"gf-form-input max-width-12\\\" ng-options=\\\"f for f in ['Viewer', 'Editor', 'Admin']\\\" ng-change=updateOrgUser(org)>\\n              </select>\\n            </span>\\n          </div>\\n        </td>\\n        <td style=width:1%>\\n          <a ng-click=removeOrgUser(org) class=\\\"btn btn-danger btn-small\\\">\\n            <icon name=\\\"'times'\\\" style=margin-bottom:0></icon>\\n          </a>\\n        </td>\\n      </tr>\\n    </table>\\n  </div>\\n\\n  <h3 class=page-heading>Sessions</h3>\\n\\n  <div class=gf-form-group>\\n    <div class=gf-form>\\n      <table class=\\\"filter-table form-inline\\\">\\n        <thead>\\n          <tr>\\n            <th>Last seen</th>\\n            <th>Logged on</th>\\n            <th>IP address</th>\\n            <th>Browser &amp; OS</th>\\n            <th></th>\\n          </tr>\\n        </thead>\\n        <tbody>\\n          <tr ng-repeat=\\\"session in sessions\\\">\\n            <td ng-if=session.isActive>Now</td>\\n            <td ng-if=!session.isActive>{{session.seenAt}}</td>\\n            <td>{{session.createdAt}}</td>\\n            <td>{{session.clientIp}}</td>\\n            <td>{{session.browser}} on {{session.os}} {{session.osVersion}}</td>\\n            <td>\\n              <button class=\\\"btn btn-danger btn-small\\\" ng-click=revokeUserSession(session.id)>\\n                <icon name=\\\"'power'\\\" style=margin-top:-2px></icon>\\n              </button>\\n            </td>\\n          </tr>\\n        </tbody>\\n      </table>\\n    </div>\\n    <div class=gf-form-button-row>\\n      <button ng-if=sessions.length class=\\\"btn btn-danger\\\" ng-click=revokeAllUserSessions()>\\n        Logout user from all devices\\n      </button>\\n    </div>\\n  </div>\\n\\n  <h3 class=page-heading>User status</h3>\\n\\n  <div class=gf-form-group>\\n    <div class=gf-form-button-row>\\n      <button type=submit class=\\\"btn btn-danger\\\" ng-if=!user.isDisabled ng-click=disableUser($event) bs-tooltip=\\\"user.isExternal ? 'External user cannot be enabled or disabled' : ''\\\" ng-class=\\\"{'disabled': user.isExternal}\\\">\\n        Disable\\n      </button>\\n      <button type=submit class=\\\"btn btn-primary\\\" ng-if=user.isDisabled ng-click=disableUser($event) bs-tooltip=\\\"user.isExternal ? 'External user cannot be enabled or disabled' : ''\\\" ng-class=\\\"{'disabled': user.isExternal}\\\">\\n        Enable\\n      </button>\\n      <button type=submit class=\\\"btn btn-danger\\\" ng-click=deleteUser(user) ng-show=!createMode>\\n        Delete User\\n      </button>\\n    </div>\\n  </div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash';\nimport { colors, ansicolor } from '@grafana/ui';\n\nimport {\n  Labels,\n  LogLevel,\n  DataFrame,\n  findCommonLabels,\n  findUniqueLabels,\n  getLogLevel,\n  FieldType,\n  getLogLevelFromKey,\n  LogRowModel,\n  LogsModel,\n  LogsMetaItem,\n  LogsMetaKind,\n  LogsDedupStrategy,\n  GraphSeriesXY,\n  dateTimeFormat,\n  dateTimeFormatTimeAgo,\n  NullValueMode,\n  toDataFrame,\n  FieldCache,\n  FieldWithIndex,\n  getFlotPairs,\n  TimeZone,\n  getDisplayProcessor,\n  textUtil,\n  dateTime,\n} from '@grafana/data';\nimport { getThemeColor } from 'app/core/utils/colors';\n\nimport { sortInAscendingOrder, deduplicateLogRowsById } from 'app/core/utils/explore';\nimport { getGraphSeriesModel } from 'app/plugins/panel/graph2/getGraphSeriesModel';\nimport { decimalSIPrefix } from '@grafana/data/src/valueFormats/symbolFormatters';\n\nexport const LogLevelColor = {\n  [LogLevel.critical]: colors[7],\n  [LogLevel.warning]: colors[1],\n  [LogLevel.error]: colors[4],\n  [LogLevel.info]: colors[0],\n  [LogLevel.debug]: colors[5],\n  [LogLevel.trace]: colors[2],\n  [LogLevel.unknown]: getThemeColor('#8e8e8e', '#dde4ed'),\n};\n\nconst isoDateRegexp = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-6]\\d[,\\.]\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\nfunction isDuplicateRow(row: LogRowModel, other: LogRowModel, strategy?: LogsDedupStrategy): boolean {\n  switch (strategy) {\n    case LogsDedupStrategy.exact:\n      // Exact still strips dates\n      return row.entry.replace(isoDateRegexp, '') === other.entry.replace(isoDateRegexp, '');\n\n    case LogsDedupStrategy.numbers:\n      return row.entry.replace(/\\d/g, '') === other.entry.replace(/\\d/g, '');\n\n    case LogsDedupStrategy.signature:\n      return row.entry.replace(/\\w/g, '') === other.entry.replace(/\\w/g, '');\n\n    default:\n      return false;\n  }\n}\n\nexport function dedupLogRows(rows: LogRowModel[], strategy?: LogsDedupStrategy): LogRowModel[] {\n  if (strategy === LogsDedupStrategy.none) {\n    return rows;\n  }\n\n  return rows.reduce((result: LogRowModel[], row: LogRowModel, index) => {\n    const rowCopy = { ...row };\n    const previous = result[result.length - 1];\n    if (index > 0 && isDuplicateRow(row, previous, strategy)) {\n      previous.duplicates!++;\n    } else {\n      rowCopy.duplicates = 0;\n      result.push(rowCopy);\n    }\n    return result;\n  }, []);\n}\n\nexport function filterLogLevels(logRows: LogRowModel[], hiddenLogLevels: Set<LogLevel>): LogRowModel[] {\n  if (hiddenLogLevels.size === 0) {\n    return logRows;\n  }\n\n  return logRows.filter((row: LogRowModel) => {\n    return !hiddenLogLevels.has(row.logLevel);\n  });\n}\n\nexport function makeSeriesForLogs(rows: LogRowModel[], intervalMs: number, timeZone: TimeZone): GraphSeriesXY[] {\n  // currently interval is rangeMs / resolution, which is too low for showing series as bars.\n  // need at least 10px per bucket, so we multiply interval by 10. Should be solved higher up the chain\n  // when executing queries & interval calculated and not here but this is a temporary fix.\n  // intervalMs = intervalMs * 10;\n\n  // Graph time series by log level\n  const seriesByLevel: any = {};\n  const bucketSize = intervalMs * 10;\n  const seriesList: any[] = [];\n\n  const sortedRows = rows.sort(sortInAscendingOrder);\n  for (const row of sortedRows) {\n    let series = seriesByLevel[row.logLevel];\n\n    if (!series) {\n      seriesByLevel[row.logLevel] = series = {\n        lastTs: null,\n        datapoints: [],\n        alias: row.logLevel,\n        target: row.logLevel,\n        color: LogLevelColor[row.logLevel],\n      };\n\n      seriesList.push(series);\n    }\n\n    // align time to bucket size - used Math.floor for calculation as time of the bucket\n    // must be in the past (before Date.now()) to be displayed on the graph\n    const time = Math.floor(row.timeEpochMs / bucketSize) * bucketSize;\n\n    // Entry for time\n    if (time === series.lastTs) {\n      series.datapoints[series.datapoints.length - 1][0]++;\n    } else {\n      series.datapoints.push([1, time]);\n      series.lastTs = time;\n    }\n\n    // add zero to other levels to aid stacking so each level series has same number of points\n    for (const other of seriesList) {\n      if (other !== series && other.lastTs !== time) {\n        other.datapoints.push([0, time]);\n        other.lastTs = time;\n      }\n    }\n  }\n\n  return seriesList.map((series, i) => {\n    series.datapoints.sort((a: number[], b: number[]) => a[1] - b[1]);\n\n    // EEEP: converts GraphSeriesXY to DataFrame and back again!\n    const data = toDataFrame(series);\n    const fieldCache = new FieldCache(data);\n\n    const timeField = fieldCache.getFirstFieldOfType(FieldType.time);\n    timeField.display = getDisplayProcessor({\n      field: timeField,\n      timeZone,\n    });\n\n    const valueField = fieldCache.getFirstFieldOfType(FieldType.number);\n    valueField.config = {\n      ...valueField.config,\n      color: series.color,\n    };\n\n    const points = getFlotPairs({\n      xField: timeField,\n      yField: valueField,\n      nullValueMode: NullValueMode.Null,\n    });\n\n    const graphSeries: GraphSeriesXY = {\n      color: series.color,\n      label: series.alias,\n      data: points,\n      isVisible: true,\n      yAxis: {\n        index: 1,\n        min: 0,\n        tickDecimals: 0,\n      },\n      seriesIndex: i,\n      timeField,\n      valueField,\n      // for now setting the time step to be 0,\n      // and handle the bar width by setting lineWidth instead of barWidth in flot options\n      timeStep: 0,\n    };\n\n    return graphSeries;\n  });\n}\n\nfunction isLogsData(series: DataFrame) {\n  return series.fields.some(f => f.type === FieldType.time) && series.fields.some(f => f.type === FieldType.string);\n}\n\n/**\n * Convert dataFrame into LogsModel which consists of creating separate array of log rows and metrics series. Metrics\n * series can be either already included in the dataFrame or will be computed from the log rows.\n * @param dataFrame\n * @param intervalMs In case there are no metrics series, we use this for computing it from log rows.\n */\nexport function dataFrameToLogsModel(\n  dataFrame: DataFrame[],\n  intervalMs: number | undefined,\n  timeZone: TimeZone\n): LogsModel {\n  const { logSeries, metricSeries } = separateLogsAndMetrics(dataFrame);\n  const logsModel = logSeriesToLogsModel(logSeries);\n\n  if (logsModel) {\n    if (metricSeries.length === 0) {\n      // Create metrics from logs\n      // If interval is not defined or 0 we cannot really compute the series\n      logsModel.series = intervalMs ? makeSeriesForLogs(logsModel.rows, intervalMs, timeZone) : [];\n    } else {\n      // We got metrics in the dataFrame so process those\n      logsModel.series = getGraphSeriesModel(\n        metricSeries,\n        timeZone,\n        {},\n        { showBars: true, showLines: false, showPoints: false },\n        {\n          asTable: false,\n          isVisible: true,\n          placement: 'under',\n        }\n      );\n    }\n\n    return logsModel;\n  }\n\n  return {\n    hasUniqueLabels: false,\n    rows: [],\n    meta: [],\n    series: [],\n  };\n}\n\nfunction separateLogsAndMetrics(dataFrames: DataFrame[]) {\n  const metricSeries: DataFrame[] = [];\n  const logSeries: DataFrame[] = [];\n\n  for (const dataFrame of dataFrames) {\n    if (isLogsData(dataFrame)) {\n      logSeries.push(dataFrame);\n      continue;\n    }\n\n    if (dataFrame.length > 0) {\n      metricSeries.push(dataFrame);\n    }\n  }\n\n  return { logSeries, metricSeries };\n}\n\ninterface LogFields {\n  series: DataFrame;\n\n  timeField: FieldWithIndex;\n  stringField: FieldWithIndex;\n  timeNanosecondField?: FieldWithIndex;\n  logLevelField?: FieldWithIndex;\n  idField?: FieldWithIndex;\n}\n\n/**\n * Converts dataFrames into LogsModel. This involves merging them into one list, sorting them and computing metadata\n * like common labels.\n */\nexport function logSeriesToLogsModel(logSeries: DataFrame[]): LogsModel | undefined {\n  if (logSeries.length === 0) {\n    return undefined;\n  }\n  const allLabels: Labels[] = [];\n\n  // Find the fields we care about and collect all labels\n  const allSeries: LogFields[] = logSeries.map(series => {\n    const fieldCache = new FieldCache(series);\n\n    const stringField = fieldCache.hasFieldNamed('line')\n      ? fieldCache.getFieldByName('line')\n      : fieldCache.getFirstFieldOfType(FieldType.string);\n    if (stringField?.labels) {\n      allLabels.push(stringField.labels);\n    }\n    return {\n      series,\n      timeField: fieldCache.getFirstFieldOfType(FieldType.time),\n      timeNanosecondField: fieldCache.hasFieldWithNameAndType('tsNs', FieldType.time)\n        ? fieldCache.getFieldByName('tsNs')\n        : undefined,\n      stringField,\n      logLevelField: fieldCache.getFieldByName('level'),\n      idField: getIdField(fieldCache),\n    } as LogFields;\n  });\n\n  const commonLabels = allLabels.length > 0 ? findCommonLabels(allLabels) : {};\n\n  const rows: LogRowModel[] = [];\n  let hasUniqueLabels = false;\n\n  for (const info of allSeries) {\n    const { timeField, timeNanosecondField, stringField, logLevelField, idField, series } = info;\n    const labels = stringField.labels;\n    const uniqueLabels = findUniqueLabels(labels, commonLabels);\n    if (Object.keys(uniqueLabels).length > 0) {\n      hasUniqueLabels = true;\n    }\n\n    let seriesLogLevel: LogLevel | undefined = undefined;\n    if (labels && Object.keys(labels).indexOf('level') !== -1) {\n      seriesLogLevel = getLogLevelFromKey(labels['level']);\n    }\n\n    for (let j = 0; j < series.length; j++) {\n      const ts = timeField.values.get(j);\n      const time = dateTime(ts);\n      const tsNs = timeNanosecondField ? timeNanosecondField.values.get(j) : undefined;\n      const timeEpochNs = tsNs ? tsNs : time.valueOf() + '000000';\n\n      const messageValue: unknown = stringField.values.get(j);\n      // This should be string but sometimes isn't (eg elastic) because the dataFrame is not strongly typed.\n      const message: string = typeof messageValue === 'string' ? messageValue : JSON.stringify(messageValue);\n\n      const hasAnsi = textUtil.hasAnsiCodes(message);\n      const searchWords = series.meta && series.meta.searchWords ? series.meta.searchWords : [];\n\n      let logLevel = LogLevel.unknown;\n      if (logLevelField && logLevelField.values.get(j)) {\n        logLevel = getLogLevelFromKey(logLevelField.values.get(j));\n      } else if (seriesLogLevel) {\n        logLevel = seriesLogLevel;\n      } else {\n        logLevel = getLogLevel(message);\n      }\n      rows.push({\n        entryFieldIndex: stringField.index,\n        rowIndex: j,\n        dataFrame: series,\n        logLevel,\n        timeFromNow: dateTimeFormatTimeAgo(ts),\n        timeEpochMs: time.valueOf(),\n        timeEpochNs,\n        timeLocal: dateTimeFormat(ts, { timeZone: 'browser' }),\n        timeUtc: dateTimeFormat(ts, { timeZone: 'utc' }),\n        uniqueLabels,\n        hasAnsi,\n        searchWords,\n        entry: hasAnsi ? ansicolor.strip(message) : message,\n        raw: message,\n        labels: stringField.labels || {},\n        uid: idField ? idField.values.get(j) : j.toString(),\n      });\n    }\n  }\n\n  const deduplicatedLogRows = deduplicateLogRowsById(rows);\n\n  // Meta data to display in status\n  const meta: LogsMetaItem[] = [];\n  if (_.size(commonLabels) > 0) {\n    meta.push({\n      label: 'Common labels',\n      value: commonLabels,\n      kind: LogsMetaKind.LabelsMap,\n    });\n  }\n\n  const limits = logSeries.filter(series => series.meta && series.meta.limit);\n  const limitValue = Object.values(\n    limits.reduce((acc: any, elem: any) => {\n      acc[elem.refId] = elem.meta.limit;\n      return acc;\n    }, {})\n  ).reduce((acc: number, elem: any) => (acc += elem), 0);\n\n  if (limits.length > 0) {\n    meta.push({\n      label: 'Limit',\n      value: `${limitValue} (${deduplicatedLogRows.length} returned)`,\n      kind: LogsMetaKind.String,\n    });\n  }\n\n  // Hack to print loki stats in Explore. Should be using proper stats display via drawer in Explore (rework in 7.1)\n  let totalBytes = 0;\n  const queriesVisited: { [refId: string]: boolean } = {};\n  for (const series of logSeries) {\n    const totalBytesKey = series.meta?.custom?.lokiQueryStatKey;\n    // Stats are per query, keeping track by refId\n    const { refId } = series;\n    if (refId && !queriesVisited[refId]) {\n      if (totalBytesKey && series.meta.stats) {\n        const byteStat = series.meta.stats.find(stat => stat.displayName === totalBytesKey);\n        if (byteStat) {\n          totalBytes += byteStat.value;\n        }\n      }\n      queriesVisited[refId] = true;\n    }\n  }\n  if (totalBytes > 0) {\n    const { text, suffix } = decimalSIPrefix('B')(totalBytes);\n    meta.push({\n      label: 'Total bytes processed',\n      value: `${text} ${suffix}`,\n      kind: LogsMetaKind.String,\n    });\n  }\n\n  return {\n    hasUniqueLabels,\n    meta,\n    rows: deduplicatedLogRows,\n  };\n}\n\nfunction getIdField(fieldCache: FieldCache): FieldWithIndex | undefined {\n  const idFieldNames = ['id'];\n  for (const fieldName of idFieldNames) {\n    const idField = fieldCache.getFieldByName(fieldName);\n    if (idField) {\n      return idField;\n    }\n  }\n  return undefined;\n}\n","import config from 'app/core/config';\n\nexport function getThemeColor(dark: string, light: string): string {\n  return config.bootData.user.lightTheme ? light : dark;\n}\n","import _ from 'lodash';\n\nexport class QueryPartDef {\n  type: string;\n  params: any[];\n  defaultParams: any[];\n  renderer: any;\n  category: any;\n  addStrategy: any;\n\n  constructor(options: any) {\n    this.type = options.type;\n    this.params = options.params;\n    this.defaultParams = options.defaultParams;\n    this.renderer = options.renderer;\n    this.category = options.category;\n    this.addStrategy = options.addStrategy;\n  }\n}\n\nexport class QueryPart {\n  part: any;\n  def: QueryPartDef;\n  params: any[];\n  text: string;\n\n  constructor(part: any, def: any) {\n    this.part = part;\n    this.def = def;\n    if (!this.def) {\n      throw { message: 'Could not find query part ' + part.type };\n    }\n\n    part.params = part.params || _.clone(this.def.defaultParams);\n    this.params = part.params;\n    this.updateText();\n  }\n\n  render(innerExpr: string) {\n    return this.def.renderer(this, innerExpr);\n  }\n\n  hasMultipleParamsInString(strValue: string, index: number) {\n    if (strValue.indexOf(',') === -1) {\n      return false;\n    }\n\n    return this.def.params[index + 1] && this.def.params[index + 1].optional;\n  }\n\n  updateParam(strValue: string, index: number) {\n    // handle optional parameters\n    // if string contains ',' and next param is optional, split and update both\n    if (this.hasMultipleParamsInString(strValue, index)) {\n      _.each(strValue.split(','), (partVal, idx) => {\n        this.updateParam(partVal.trim(), idx);\n      });\n      return;\n    }\n\n    if (strValue === '' && this.def.params[index].optional) {\n      this.params.splice(index, 1);\n    } else {\n      this.params[index] = strValue;\n    }\n\n    this.part.params = this.params;\n    this.updateText();\n  }\n\n  updateText() {\n    if (this.params.length === 0) {\n      this.text = this.def.type + '()';\n      return;\n    }\n\n    let text = this.def.type + '(';\n    text += this.params.join(', ');\n    text += ')';\n    this.text = text;\n  }\n}\n\nexport function functionRenderer(part: any, innerExpr: string) {\n  const str = part.def.type + '(';\n  const parameters = _.map(part.params, (value, index) => {\n    const paramType = part.def.params[index];\n    if (paramType.type === 'time') {\n      if (value === 'auto') {\n        value = '$__interval';\n      }\n    }\n    if (paramType.quote === 'single') {\n      return \"'\" + value + \"'\";\n    } else if (paramType.quote === 'double') {\n      return '\"' + value + '\"';\n    }\n\n    return value;\n  });\n\n  if (innerExpr) {\n    parameters.unshift(innerExpr);\n  }\n  return str + parameters.join(', ') + ')';\n}\n\nexport function suffixRenderer(part: QueryPartDef, innerExpr: string) {\n  return innerExpr + ' ' + part.params[0];\n}\n\nexport function identityRenderer(part: QueryPartDef, innerExpr: string) {\n  return part.params[0];\n}\n\nexport function quotedIdentityRenderer(part: QueryPartDef, innerExpr: string) {\n  return '\"' + part.params[0] + '\"';\n}\n","import { config } from '@grafana/runtime';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport templateSrv from 'app/features/templating/template_srv';\nimport { PanelModel, dateTime, urlUtil } from '@grafana/data';\n\nexport function buildParams(\n  useCurrentTimeRange: boolean,\n  includeTemplateVars: boolean,\n  selectedTheme?: string,\n  panel?: PanelModel\n) {\n  const params = urlUtil.getUrlSearchParams();\n\n  const range = getTimeSrv().timeRange();\n  params.from = range.from.valueOf();\n  params.to = range.to.valueOf();\n  params.orgId = config.bootData.user.orgId;\n\n  if (!useCurrentTimeRange) {\n    delete params.from;\n    delete params.to;\n  }\n\n  if (includeTemplateVars) {\n    templateSrv.fillVariableValuesForUrl(params);\n  }\n\n  if (selectedTheme !== 'current') {\n    params.theme = selectedTheme;\n  }\n\n  if (panel && !params.editPanel) {\n    params.viewPanel = panel.id;\n  } else {\n    delete params.viewPanel;\n  }\n\n  return params;\n}\n\nexport function buildBaseUrl() {\n  let baseUrl = window.location.href;\n  const queryStart = baseUrl.indexOf('?');\n\n  if (queryStart !== -1) {\n    baseUrl = baseUrl.substring(0, queryStart);\n  }\n\n  return baseUrl;\n}\n\nexport function buildShareUrl(\n  useCurrentTimeRange: boolean,\n  includeTemplateVars: boolean,\n  selectedTheme?: string,\n  panel?: PanelModel\n) {\n  const baseUrl = buildBaseUrl();\n  const params = buildParams(useCurrentTimeRange, includeTemplateVars, selectedTheme, panel);\n\n  return urlUtil.appendQueryToUrl(baseUrl, urlUtil.toUrlParams(params));\n}\n\nexport function buildSoloUrl(\n  useCurrentTimeRange: boolean,\n  includeTemplateVars: boolean,\n  selectedTheme?: string,\n  panel?: PanelModel\n) {\n  const baseUrl = buildBaseUrl();\n  const params = buildParams(useCurrentTimeRange, includeTemplateVars, selectedTheme, panel);\n\n  let soloUrl = baseUrl.replace(config.appSubUrl + '/dashboard/', config.appSubUrl + '/dashboard-solo/');\n  soloUrl = soloUrl.replace(config.appSubUrl + '/d/', config.appSubUrl + '/d-solo/');\n\n  params.panelId = params.editPanel ?? params.viewPanel;\n  delete params.editPanel;\n  delete params.viewPanel;\n\n  return urlUtil.appendQueryToUrl(soloUrl, urlUtil.toUrlParams(params));\n}\n\nexport function buildImageUrl(\n  useCurrentTimeRange: boolean,\n  includeTemplateVars: boolean,\n  selectedTheme?: string,\n  panel?: PanelModel\n) {\n  let soloUrl = buildSoloUrl(useCurrentTimeRange, includeTemplateVars, selectedTheme, panel);\n\n  let imageUrl = soloUrl.replace(config.appSubUrl + '/dashboard-solo/', config.appSubUrl + '/render/dashboard-solo/');\n  imageUrl = imageUrl.replace(config.appSubUrl + '/d-solo/', config.appSubUrl + '/render/d-solo/');\n  imageUrl += '&width=1000&height=500' + getLocalTimeZone();\n  return imageUrl;\n}\n\nexport function buildIframeHtml(\n  useCurrentTimeRange: boolean,\n  includeTemplateVars: boolean,\n  selectedTheme?: string,\n  panel?: PanelModel\n) {\n  let soloUrl = buildSoloUrl(useCurrentTimeRange, includeTemplateVars, selectedTheme, panel);\n  return '<iframe src=\"' + soloUrl + '\" width=\"450\" height=\"200\" frameborder=\"0\"></iframe>';\n}\n\nexport function getLocalTimeZone() {\n  const utcOffset = '&tz=UTC' + encodeURIComponent(dateTime().format('Z'));\n\n  // Older browser does not the internationalization API\n  if (!(window as any).Intl) {\n    return utcOffset;\n  }\n\n  const dateFormat = (window as any).Intl.DateTimeFormat();\n  if (!dateFormat.resolvedOptions) {\n    return utcOffset;\n  }\n\n  const options = dateFormat.resolvedOptions();\n  if (!options.timeZone) {\n    return utcOffset;\n  }\n\n  return '&tz=' + encodeURIComponent(options.timeZone);\n}\n","import React, { PureComponent } from 'react';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { LegacyForms, ClipboardButton, Icon, InfoBox } from '@grafana/ui';\nconst { Select, Switch } = LegacyForms;\nimport { SelectableValue, PanelModel, AppEvents } from '@grafana/data';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { buildImageUrl, buildShareUrl } from './utils';\nimport { appEvents } from 'app/core/core';\nimport config from 'app/core/config';\n\nconst themeOptions: Array<SelectableValue<string>> = [\n  { label: 'current', value: 'current' },\n  { label: 'dark', value: 'dark' },\n  { label: 'light', value: 'light' },\n];\n\nexport interface Props {\n  dashboard: DashboardModel;\n  panel?: PanelModel;\n}\n\nexport interface State {\n  useCurrentTimeRange: boolean;\n  includeTemplateVars: boolean;\n  selectedTheme: SelectableValue<string>;\n  shareUrl: string;\n  imageUrl: string;\n}\n\nexport class ShareLink extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      useCurrentTimeRange: true,\n      includeTemplateVars: true,\n      selectedTheme: themeOptions[0],\n      shareUrl: '',\n      imageUrl: '',\n    };\n  }\n\n  componentDidMount() {\n    this.buildUrl();\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { useCurrentTimeRange, includeTemplateVars, selectedTheme } = this.state;\n    if (\n      prevState.useCurrentTimeRange !== useCurrentTimeRange ||\n      prevState.includeTemplateVars !== includeTemplateVars ||\n      prevState.selectedTheme.value !== selectedTheme.value\n    ) {\n      this.buildUrl();\n    }\n  }\n\n  buildUrl = () => {\n    const { panel } = this.props;\n    const { useCurrentTimeRange, includeTemplateVars, selectedTheme } = this.state;\n\n    const shareUrl = buildShareUrl(useCurrentTimeRange, includeTemplateVars, selectedTheme.value, panel);\n    const imageUrl = buildImageUrl(useCurrentTimeRange, includeTemplateVars, selectedTheme.value, panel);\n    this.setState({ shareUrl, imageUrl });\n  };\n\n  onUseCurrentTimeRangeChange = () => {\n    this.setState({ useCurrentTimeRange: !this.state.useCurrentTimeRange });\n  };\n\n  onIncludeTemplateVarsChange = () => {\n    this.setState({ includeTemplateVars: !this.state.includeTemplateVars });\n  };\n\n  onThemeChange = (value: SelectableValue<string>) => {\n    this.setState({ selectedTheme: value });\n  };\n\n  onShareUrlCopy = () => {\n    appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\n  };\n\n  getShareUrl = () => {\n    return this.state.shareUrl;\n  };\n\n  render() {\n    const { panel } = this.props;\n    const { useCurrentTimeRange, includeTemplateVars, selectedTheme, shareUrl, imageUrl } = this.state;\n    const selectors = e2eSelectors.pages.SharePanelModal;\n\n    return (\n      <div className=\"share-modal-body\">\n        <div className=\"share-modal-header\">\n          <Icon name=\"link\" className=\"share-modal-big-icon\" size=\"xxl\" />\n          <div className=\"share-modal-content\">\n            <p className=\"share-modal-info-text\">\n              Create a direct link to this dashboard or panel, customized with the options below.\n            </p>\n            <div className=\"gf-form-group\">\n              <Switch\n                labelClass=\"width-12\"\n                label=\"Current time range\"\n                checked={useCurrentTimeRange}\n                onChange={this.onUseCurrentTimeRangeChange}\n              />\n              <Switch\n                labelClass=\"width-12\"\n                label=\"Template variables\"\n                checked={includeTemplateVars}\n                onChange={this.onIncludeTemplateVarsChange}\n              />\n              <div className=\"gf-form\">\n                <label className=\"gf-form-label width-12\">Theme</label>\n                <Select width={10} options={themeOptions} value={selectedTheme} onChange={this.onThemeChange} />\n              </div>\n            </div>\n            <div>\n              <div className=\"gf-form-group\">\n                <div className=\"gf-form-inline\">\n                  <div className=\"gf-form gf-form--grow\">\n                    <input type=\"text\" className=\"gf-form-input\" defaultValue={shareUrl} />\n                  </div>\n                  <div className=\"gf-form\">\n                    <ClipboardButton variant=\"primary\" getText={this.getShareUrl} onClipboardCopy={this.onShareUrlCopy}>\n                      Copy\n                    </ClipboardButton>\n                  </div>\n                </div>\n              </div>\n            </div>\n            {panel && config.rendererAvailable && (\n              <div className=\"gf-form\">\n                <a href={imageUrl} target=\"_blank\" aria-label={selectors.linkToRenderedImage}>\n                  <Icon name=\"camera\" /> Direct link rendered image\n                </a>\n              </div>\n            )}\n            {panel && !config.rendererAvailable && (\n              <InfoBox>\n                <p>\n                  <>To render a panel image, you must install the </>\n                  <a\n                    href=\"https://grafana.com/grafana/plugins/grafana-image-renderer\"\n                    target=\"_blank\"\n                    rel=\"noopener\"\n                    className=\"external-link\"\n                  >\n                    Grafana Image Renderer plugin\n                  </a>\n                  . Please contact your Grafana administrator to install the plugin.\n                </p>\n              </InfoBox>\n            )}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { Button, ClipboardButton, LinkButton, LegacyForms, Icon } from '@grafana/ui';\nconst { Select, Input } = LegacyForms;\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { appEvents } from 'app/core/core';\n\nconst snapshotApiUrl = '/api/snapshots';\n\nconst expireOptions: Array<SelectableValue<number>> = [\n  { label: 'Never', value: 0 },\n  { label: '1 Hour', value: 60 * 60 },\n  { label: '1 Day', value: 60 * 60 * 24 },\n  { label: '7 Days', value: 60 * 60 * 24 * 7 },\n];\n\ninterface Props {\n  dashboard: DashboardModel;\n  panel?: PanelModel;\n  onDismiss(): void;\n}\n\ninterface State {\n  isLoading: boolean;\n  step: number;\n  snapshotName: string;\n  selectedExpireOption: SelectableValue<number>;\n  snapshotExpires?: number;\n  snapshotUrl: string;\n  deleteUrl: string;\n  timeoutSeconds: number;\n  externalEnabled: boolean;\n  sharingButtonText: string;\n}\n\nexport class ShareSnapshot extends PureComponent<Props, State> {\n  private dashboard: DashboardModel;\n\n  constructor(props: Props) {\n    super(props);\n    this.dashboard = props.dashboard;\n    this.state = {\n      isLoading: false,\n      step: 1,\n      selectedExpireOption: expireOptions[0],\n      snapshotExpires: expireOptions[0].value,\n      snapshotName: props.dashboard.title,\n      timeoutSeconds: 4,\n      snapshotUrl: '',\n      deleteUrl: '',\n      externalEnabled: false,\n      sharingButtonText: '',\n    };\n  }\n\n  componentDidMount() {\n    this.getSnaphotShareOptions();\n  }\n\n  async getSnaphotShareOptions() {\n    const shareOptions = await getBackendSrv().get('/api/snapshot/shared-options');\n    this.setState({\n      sharingButtonText: shareOptions['externalSnapshotName'],\n      externalEnabled: shareOptions['externalEnabled'],\n    });\n  }\n\n  createSnapshot = (external?: boolean) => () => {\n    const { timeoutSeconds } = this.state;\n    this.dashboard.snapshot = {\n      timestamp: new Date(),\n    };\n\n    if (!external) {\n      this.dashboard.snapshot.originalUrl = window.location.href;\n    }\n\n    this.setState({ isLoading: true });\n    this.dashboard.startRefresh();\n\n    setTimeout(() => {\n      this.saveSnapshot(this.dashboard, external);\n    }, timeoutSeconds * 1000);\n  };\n\n  saveSnapshot = async (dashboard: DashboardModel, external?: boolean) => {\n    const { snapshotExpires } = this.state;\n    const dash = this.dashboard.getSaveModelClone();\n    this.scrubDashboard(dash);\n\n    const cmdData = {\n      dashboard: dash,\n      name: dash.title,\n      expires: snapshotExpires,\n      external: external,\n    };\n\n    try {\n      const results: { deleteUrl: any; url: any } = await getBackendSrv().post(snapshotApiUrl, cmdData);\n      this.setState({\n        deleteUrl: results.deleteUrl,\n        snapshotUrl: results.url,\n        step: 2,\n      });\n    } finally {\n      this.setState({ isLoading: false });\n    }\n  };\n\n  scrubDashboard = (dash: DashboardModel) => {\n    const { panel } = this.props;\n    const { snapshotName } = this.state;\n    // change title\n    dash.title = snapshotName;\n\n    // make relative times absolute\n    dash.time = getTimeSrv().timeRange();\n\n    // remove panel queries & links\n    dash.panels.forEach(panel => {\n      panel.targets = [];\n      panel.links = [];\n      panel.datasource = null;\n    });\n\n    // remove annotation queries\n    const annotations = dash.annotations.list.filter(annotation => annotation.enable);\n    dash.annotations.list = annotations.map((annotation: any) => {\n      return {\n        name: annotation.name,\n        enable: annotation.enable,\n        iconColor: annotation.iconColor,\n        snapshotData: annotation.snapshotData,\n        type: annotation.type,\n        builtIn: annotation.builtIn,\n        hide: annotation.hide,\n      };\n    });\n\n    // remove template queries\n    dash.getVariables().forEach(variable => {\n      variable.query = '';\n      variable.options = variable.current;\n      variable.refresh = false;\n    });\n\n    // snapshot single panel\n    if (panel) {\n      const singlePanel = panel.getSaveModel();\n      singlePanel.gridPos.w = 24;\n      singlePanel.gridPos.x = 0;\n      singlePanel.gridPos.y = 0;\n      singlePanel.gridPos.h = 20;\n      dash.panels = [singlePanel];\n    }\n\n    // cleanup snapshotData\n    delete this.dashboard.snapshot;\n    this.dashboard.forEachPanel((panel: PanelModel) => {\n      delete panel.snapshotData;\n    });\n    this.dashboard.annotations.list.forEach(annotation => {\n      delete annotation.snapshotData;\n    });\n  };\n\n  deleteSnapshot = async () => {\n    const { deleteUrl } = this.state;\n    await getBackendSrv().get(deleteUrl);\n    this.setState({ step: 3 });\n  };\n\n  getSnapshotUrl = () => {\n    return this.state.snapshotUrl;\n  };\n\n  onSnapshotNameChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    this.setState({ snapshotName: event.target.value });\n  };\n\n  onTimeoutChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    this.setState({ timeoutSeconds: Number(event.target.value) });\n  };\n\n  onExpireChange = (option: SelectableValue<number>) => {\n    this.setState({\n      selectedExpireOption: option,\n      snapshotExpires: option.value,\n    });\n  };\n\n  onSnapshotUrlCopy = () => {\n    appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\n  };\n\n  renderStep1() {\n    const { onDismiss } = this.props;\n    const {\n      snapshotName,\n      selectedExpireOption,\n      timeoutSeconds,\n      isLoading,\n      sharingButtonText,\n      externalEnabled,\n    } = this.state;\n\n    return (\n      <>\n        <div>\n          <p className=\"share-modal-info-text\">\n            A snapshot is an instant way to share an interactive dashboard publicly. When created, we{' '}\n            <strong>strip sensitive data</strong> like queries (metric, template and annotation) and panel links,\n            leaving only the visible metric data and series names embedded into your dashboard.\n          </p>\n          <p className=\"share-modal-info-text\">\n            Keep in mind, your <strong>snapshot can be viewed by anyone</strong> that has the link and can reach the\n            URL. Share wisely.\n          </p>\n        </div>\n        <div className=\"gf-form-group share-modal-options\">\n          <div className=\"gf-form\" ng-if=\"step === 1\">\n            <label className=\"gf-form-label width-12\">Snapshot name</label>\n            <Input width={15} value={snapshotName} onChange={this.onSnapshotNameChange} />\n          </div>\n          <div className=\"gf-form\" ng-if=\"step === 1\">\n            <label className=\"gf-form-label width-12\">Expire</label>\n            <Select width={15} options={expireOptions} value={selectedExpireOption} onChange={this.onExpireChange} />\n          </div>\n        </div>\n\n        <p className=\"share-modal-info-text\">\n          You may need to configure the timeout value if it takes a long time to collect your dashboard's metrics.\n        </p>\n\n        <div className=\"gf-form-group share-modal-options\">\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label width-12\">Timeout (seconds)</span>\n            <Input type=\"number\" width={15} value={timeoutSeconds} onChange={this.onTimeoutChange} />\n          </div>\n        </div>\n\n        <div className=\"gf-form-button-row\">\n          <Button className=\"width-10\" variant=\"primary\" disabled={isLoading} onClick={this.createSnapshot()}>\n            Local Snapshot\n          </Button>\n          {externalEnabled && (\n            <Button className=\"width-16\" variant=\"secondary\" disabled={isLoading} onClick={this.createSnapshot(true)}>\n              {sharingButtonText}\n            </Button>\n          )}\n          <Button variant=\"secondary\" onClick={onDismiss}>\n            Cancel\n          </Button>\n        </div>\n      </>\n    );\n  }\n\n  renderStep2() {\n    const { snapshotUrl } = this.state;\n\n    return (\n      <>\n        <div className=\"gf-form\" style={{ marginTop: '40px' }}>\n          <div className=\"gf-form-row\">\n            <a href={snapshotUrl} className=\"large share-modal-link\" target=\"_blank\">\n              <Icon name=\"external-link-alt\" /> {snapshotUrl}\n            </a>\n            <br />\n            <ClipboardButton variant=\"secondary\" getText={this.getSnapshotUrl} onClipboardCopy={this.onSnapshotUrlCopy}>\n              Copy Link\n            </ClipboardButton>\n          </div>\n        </div>\n\n        <div className=\"pull-right\" ng-if=\"step === 2\" style={{ padding: '5px' }}>\n          Did you make a mistake?{' '}\n          <LinkButton variant=\"link\" target=\"_blank\" onClick={this.deleteSnapshot}>\n            delete snapshot.\n          </LinkButton>\n        </div>\n      </>\n    );\n  }\n\n  renderStep3() {\n    return (\n      <div className=\"share-modal-header\">\n        <p className=\"share-modal-info-text\">\n          The snapshot has now been deleted. If it you have already accessed it once, It might take up to an hour before\n          it is removed from browser caches or CDN caches.\n        </p>\n      </div>\n    );\n  }\n\n  render() {\n    const { isLoading, step } = this.state;\n\n    return (\n      <div className=\"share-modal-body\">\n        <div className=\"share-modal-header\">\n          {isLoading ? (\n            <div className=\"share-modal-big-icon\">\n              <Icon name=\"fa fa-spinner\" className=\"fa-spin\" />\n            </div>\n          ) : (\n            <Icon name=\"camera\" className=\"share-modal-big-icon\" size=\"xxl\" />\n          )}\n          <div className=\"share-modal-content\">\n            {step === 1 && this.renderStep1()}\n            {step === 2 && this.renderStep2()}\n            {step === 3 && this.renderStep3()}\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { saveAs } from 'file-saver';\nimport { Button, LegacyForms, Icon } from '@grafana/ui';\nconst { Switch } = LegacyForms;\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { DashboardExporter } from 'app/features/dashboard/components/DashExportModal';\nimport { appEvents } from 'app/core/core';\nimport { CoreEvents } from 'app/types';\n\ninterface Props {\n  dashboard: DashboardModel;\n  panel?: PanelModel;\n  onDismiss(): void;\n}\n\ninterface State {\n  shareExternally: boolean;\n}\n\nexport class ShareExport extends PureComponent<Props, State> {\n  private exporter: DashboardExporter;\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      shareExternally: false,\n    };\n\n    this.exporter = new DashboardExporter();\n  }\n\n  onShareExternallyChange = () => {\n    this.setState({\n      shareExternally: !this.state.shareExternally,\n    });\n  };\n\n  onSaveAsFile = () => {\n    const { dashboard } = this.props;\n    const { shareExternally } = this.state;\n\n    if (shareExternally) {\n      this.exporter.makeExportable(dashboard).then((dashboardJson: any) => {\n        this.openSaveAsDialog(dashboardJson);\n      });\n    } else {\n      this.openSaveAsDialog(dashboard.getSaveModelClone());\n    }\n  };\n\n  onViewJson = () => {\n    const { dashboard } = this.props;\n    const { shareExternally } = this.state;\n\n    if (shareExternally) {\n      this.exporter.makeExportable(dashboard).then((dashboardJson: any) => {\n        this.openJsonModal(dashboardJson);\n      });\n    } else {\n      this.openJsonModal(dashboard.getSaveModelClone());\n    }\n  };\n\n  openSaveAsDialog = (dash: any) => {\n    const dashboardJsonPretty = JSON.stringify(dash, null, 2);\n    const blob = new Blob([dashboardJsonPretty], {\n      type: 'application/json;charset=utf-8',\n    });\n    const time = new Date().getTime();\n    saveAs(blob, `${dash.title}-${time}.json`);\n  };\n\n  openJsonModal = (clone: object) => {\n    const model = {\n      object: clone,\n      enableCopy: true,\n    };\n\n    appEvents.emit(CoreEvents.showModal, {\n      src: 'public/app/partials/edit_json.html',\n      model,\n    });\n\n    this.props.onDismiss();\n  };\n\n  render() {\n    const { onDismiss } = this.props;\n    const { shareExternally } = this.state;\n\n    return (\n      <div className=\"share-modal-body\">\n        <div className=\"share-modal-header\">\n          <Icon name=\"cloud-upload\" size=\"xxl\" className=\"share-modal-big-icon\" />\n          <div className=\"share-modal-content\">\n            <Switch\n              labelClass=\"width-16\"\n              label=\"Export for sharing externally\"\n              checked={shareExternally}\n              onChange={this.onShareExternallyChange}\n            />\n\n            <div className=\"gf-form-button-row\">\n              <Button variant=\"primary\" onClick={this.onSaveAsFile}>\n                Save to file\n              </Button>\n              <Button variant=\"secondary\" onClick={this.onViewJson}>\n                View JSON\n              </Button>\n              <Button variant=\"secondary\" onClick={onDismiss}>\n                Cancel\n              </Button>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { LegacyForms, Icon } from '@grafana/ui';\nconst { Select, Switch } = LegacyForms;\nimport { SelectableValue } from '@grafana/data';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { buildIframeHtml } from './utils';\n\nconst themeOptions: Array<SelectableValue<string>> = [\n  { label: 'current', value: 'current' },\n  { label: 'dark', value: 'dark' },\n  { label: 'light', value: 'light' },\n];\n\ninterface Props {\n  dashboard: DashboardModel;\n  panel?: PanelModel;\n}\n\ninterface State {\n  useCurrentTimeRange: boolean;\n  includeTemplateVars: boolean;\n  selectedTheme: SelectableValue<string>;\n  iframeHtml: string;\n}\n\nexport class ShareEmbed extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      useCurrentTimeRange: true,\n      includeTemplateVars: true,\n      selectedTheme: themeOptions[0],\n      iframeHtml: '',\n    };\n  }\n\n  componentDidMount() {\n    this.buildIframeHtml();\n  }\n\n  buildIframeHtml = () => {\n    const { panel } = this.props;\n    const { useCurrentTimeRange, includeTemplateVars, selectedTheme } = this.state;\n\n    const iframeHtml = buildIframeHtml(useCurrentTimeRange, includeTemplateVars, selectedTheme.value, panel);\n    this.setState({ iframeHtml });\n  };\n\n  onUseCurrentTimeRangeChange = () => {\n    this.setState(\n      {\n        useCurrentTimeRange: !this.state.useCurrentTimeRange,\n      },\n      this.buildIframeHtml\n    );\n  };\n\n  onIncludeTemplateVarsChange = () => {\n    this.setState(\n      {\n        includeTemplateVars: !this.state.includeTemplateVars,\n      },\n      this.buildIframeHtml\n    );\n  };\n\n  onThemeChange = (value: SelectableValue<string>) => {\n    this.setState(\n      {\n        selectedTheme: value,\n      },\n      this.buildIframeHtml\n    );\n  };\n\n  render() {\n    const { useCurrentTimeRange, includeTemplateVars, selectedTheme, iframeHtml } = this.state;\n\n    return (\n      <div className=\"share-modal-body\">\n        <div className=\"share-modal-header\">\n          <Icon name=\"link\" className=\"share-modal-big-icon\" size=\"xxl\" />\n          <div className=\"share-modal-content\">\n            <div className=\"gf-form-group\">\n              <Switch\n                labelClass=\"width-12\"\n                label=\"Current time range\"\n                checked={useCurrentTimeRange}\n                onChange={this.onUseCurrentTimeRangeChange}\n              />\n              <Switch\n                labelClass=\"width-12\"\n                label=\"Template variables\"\n                checked={includeTemplateVars}\n                onChange={this.onIncludeTemplateVarsChange}\n              />\n              <div className=\"gf-form\">\n                <label className=\"gf-form-label width-12\">Theme</label>\n                <Select width={10} options={themeOptions} value={selectedTheme} onChange={this.onThemeChange} />\n              </div>\n            </div>\n\n            <p className=\"share-modal-info-text\">\n              The html code below can be pasted and included in another web page. Unless anonymous access is enabled,\n              the user viewing that page need to be signed into grafana for the graph to load.\n            </p>\n\n            <div className=\"gf-form-group gf-form--grow\">\n              <div className=\"gf-form\">\n                <textarea rows={5} data-share-panel-url className=\"gf-form-input\" defaultValue={iframeHtml}></textarea>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import React from 'react';\nimport { Modal, ModalTabsHeader, TabContent } from '@grafana/ui';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { ShareLink } from './ShareLink';\nimport { ShareSnapshot } from './ShareSnapshot';\nimport { ShareExport } from './ShareExport';\nimport { ShareEmbed } from './ShareEmbed';\nimport { ShareModalTabModel } from './types';\n\nconst shareCommonTabs: ShareModalTabModel[] = [\n  { label: 'Link', value: 'link', component: ShareLink },\n  { label: 'Snapshot', value: 'snapshot', component: ShareSnapshot },\n];\n\n// prettier-ignore\nconst shareDashboardTabs: ShareModalTabModel[] = [\n  { label: 'Export', value: 'export', component: ShareExport },\n];\n\n// prettier-ignore\nconst sharePanelTabs: ShareModalTabModel[] = [\n  { label: 'Embed', value: 'embed', component: ShareEmbed },\n];\n\nconst customDashboardTabs: ShareModalTabModel[] = [];\nconst customPanelTabs: ShareModalTabModel[] = [];\n\nexport function addDashboardShareTab(tab: ShareModalTabModel) {\n  customDashboardTabs.push(tab);\n}\n\nexport function addPanelShareTab(tab: ShareModalTabModel) {\n  customPanelTabs.push(tab);\n}\n\nfunction getInitialState(props: Props): State {\n  const tabs = getTabs(props);\n  return {\n    tabs,\n    activeTab: tabs[0].value,\n  };\n}\n\nfunction getTabs(props: Props) {\n  const { panel } = props;\n  const tabs = [...shareCommonTabs];\n\n  if (panel) {\n    tabs.push(...sharePanelTabs);\n    tabs.push(...customPanelTabs);\n  } else {\n    tabs.push(...shareDashboardTabs);\n    tabs.push(...customDashboardTabs);\n  }\n\n  return tabs;\n}\n\ninterface Props {\n  dashboard: DashboardModel;\n  panel?: PanelModel;\n\n  onDismiss(): void;\n}\n\ninterface State {\n  tabs: ShareModalTabModel[];\n  activeTab: string;\n}\n\nexport class ShareModal extends React.Component<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = getInitialState(props);\n  }\n\n  onDismiss = () => {\n    this.setState(getInitialState(this.props));\n    this.props.onDismiss();\n  };\n\n  onSelectTab = (t: any) => {\n    this.setState({ activeTab: t.value });\n  };\n\n  getTabs() {\n    return getTabs(this.props);\n  }\n\n  getActiveTab() {\n    const { tabs, activeTab } = this.state;\n    return tabs.find(t => t.value === activeTab);\n  }\n\n  renderTitle() {\n    const { panel } = this.props;\n    const { activeTab } = this.state;\n    const title = panel ? 'Share Panel' : 'Share';\n    const tabs = this.getTabs();\n\n    return (\n      <ModalTabsHeader\n        title={title}\n        icon=\"share-alt\"\n        tabs={tabs}\n        activeTab={activeTab}\n        onChangeTab={this.onSelectTab}\n      />\n    );\n  }\n\n  render() {\n    const { dashboard, panel } = this.props;\n    const activeTabModel = this.getActiveTab();\n    const ActiveTab = activeTabModel?.component;\n\n    return (\n      <Modal isOpen={true} title={this.renderTitle()} onDismiss={this.onDismiss}>\n        <TabContent>\n          <ActiveTab dashboard={dashboard} panel={panel} onDismiss={this.onDismiss} />\n        </TabContent>\n      </Modal>\n    );\n  }\n}\n","import React, { MouseEvent, useContext } from 'react';\nimport { CallToActionCard, LinkButton, ThemeContext, Icon, IconName } from '@grafana/ui';\nimport { css } from 'emotion';\n\nexport interface Props {\n  title: string;\n  buttonIcon: IconName;\n  buttonLink?: string;\n  buttonTitle: string;\n  onClick?: (event: MouseEvent) => void;\n  proTip?: string;\n  proTipLink?: string;\n  proTipLinkTitle?: string;\n  proTipTarget?: string;\n  infoBox?: { __html: string };\n  infoBoxTitle?: string;\n}\n\nconst ctaStyle = css`\n  text-align: center;\n`;\n\nconst infoBoxStyles = css`\n  max-width: 700px;\n  margin: 0 auto;\n`;\n\nconst EmptyListCTA: React.FunctionComponent<Props> = ({\n  title,\n  buttonIcon,\n  buttonLink,\n  buttonTitle,\n  onClick,\n  proTip,\n  proTipLink,\n  proTipLinkTitle,\n  proTipTarget,\n  infoBox,\n  infoBoxTitle,\n}) => {\n  const theme = useContext(ThemeContext);\n\n  const footer = () => {\n    return (\n      <>\n        {proTip ? (\n          <span key=\"proTipFooter\">\n            <Icon name=\"rocket\" />\n            <> ProTip: {proTip} </>\n            <a href={proTipLink} target={proTipTarget} className=\"text-link\">\n              {proTipLinkTitle}\n            </a>\n          </span>\n        ) : (\n          ''\n        )}\n        {infoBox ? (\n          <div key=\"infoBoxHtml\" className={`grafana-info-box ${infoBoxStyles}`}>\n            {infoBoxTitle && <h5>{infoBoxTitle}</h5>}\n            <div dangerouslySetInnerHTML={infoBox} />\n          </div>\n        ) : (\n          ''\n        )}\n      </>\n    );\n  };\n\n  const ctaElementClassName = !footer()\n    ? css`\n        margin-bottom: 20px;\n      `\n    : '';\n\n  const ctaElement = (\n    <LinkButton\n      size=\"lg\"\n      onClick={onClick}\n      href={buttonLink}\n      icon={buttonIcon}\n      className={ctaElementClassName}\n      aria-label={`Call to action button ${buttonTitle}`}\n    >\n      {buttonTitle}\n    </LinkButton>\n  );\n\n  return (\n    <CallToActionCard\n      className={ctaStyle}\n      message={title}\n      footer={footer()}\n      callToActionElement={ctaElement}\n      theme={theme}\n    />\n  );\n};\n\nexport default EmptyListCTA;\n","/**\n * AngularStrap - Twitter Bootstrap directives for AngularJS\n * @version v0.7.5 - 2013-07-21\n * @link http://mgcrea.github.com/angular-strap\n * @author Olivier Louvignes <olivier@mg-crea.com>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\nangular.module('$strap.config', []).value('$strapConfig', {});\nangular.module('$strap.filters', ['$strap.config']);\nangular.module('$strap.directives', ['$strap.config']);\nangular.module('$strap', [\n  '$strap.filters',\n  '$strap.directives',\n  '$strap.config'\n]);\n'use strict';\nangular.module('$strap.directives').factory('$modal', [\n  '$rootScope',\n  '$compile',\n  '$http',\n  '$timeout',\n  '$q',\n  '$templateCache',\n  '$strapConfig',\n  function ($rootScope, $compile, $http, $timeout, $q, $templateCache, $strapConfig) {\n    var ModalFactory = function ModalFactory(config) {\n      function Modal(config) {\n        var options = angular.extend({ show: true }, $strapConfig.modal, config);\n        var scope = options.scope ? options.scope : $rootScope.$new()\n        var templateUrl = options.template;\n        return $q.when(options.templateHtml || $templateCache.get(templateUrl) || $http.get(templateUrl, { cache: true }).then(function (res) {\n          return res.data;\n        })).then(function onSuccess(template) {\n          var id = scope.$id;\n          if (templateUrl) {\n            id += templateUrl.replace('.html', '').replace(/[\\/|\\.|:]/g, '-');\n          }\n          // grafana change, removed fade\n          var $modal = $('<div class=\"modal hide\" tabindex=\"-1\"></div>').attr('id', id).html(template);\n          if (options.modalClass)\n            $modal.addClass(options.modalClass);\n          $('body').append($modal);\n          $timeout(function () {\n            $compile($modal)(scope);\n          });\n          scope.$modal = function (name) {\n            $modal.modal(name);\n          };\n          angular.forEach([\n            'show',\n            'hide'\n          ], function (name) {\n            scope[name] = function () {\n              $modal.modal(name);\n            };\n          });\n          scope.dismiss = scope.hide;\n          angular.forEach([\n            'show',\n            'shown',\n            'hide',\n            'hidden'\n          ], function (name) {\n            $modal.on(name, function (ev) {\n              scope.$emit('modal-' + name, ev);\n            });\n          });\n          $modal.on('shown', function (ev) {\n            $('input[autofocus], textarea[autofocus]', $modal).first().trigger('focus');\n          });\n          $modal.on('hidden', function (ev) {\n            if (!options.persist)\n              scope.$destroy();\n          });\n          scope.$on('$destroy', function () {\n            $modal.remove();\n          });\n          $modal.modal(options);\n          return $modal;\n        });\n      }\n      return new Modal(config);\n    };\n    return ModalFactory;\n  }\n])\n\n'use strict';\nangular.module('$strap.directives').directive('bsTooltip', [\n  '$parse',\n  '$compile',\n  function ($parse, $compile) {\n    return {\n      restrict: 'A',\n      scope: true,\n      link: function postLink(scope, element, attrs, ctrl) {\n        var getter = $parse(attrs.bsTooltip), setter = getter.assign, value = getter(scope);\n        scope.$watch(attrs.bsTooltip, function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            value = newValue;\n          }\n        });\n        // Grafana change, always hide other tooltips\n        if (true) {\n          element.on('show', function (ev) {\n            $('.tooltip.in').each(function () {\n              var $this = $(this), tooltip = $this.data('tooltip');\n              if (tooltip && !tooltip.$element.is(element)) {\n                $this.tooltip('hide');\n              }\n            });\n          });\n        }\n        element.tooltip({\n          title: function () {\n            return angular.isFunction(value) ? value.apply(null, arguments) : value;\n          },\n          html: true,\n          container: 'body', // Grafana change\n        });\n        var tooltip = element.data('tooltip');\n        tooltip.show = function () {\n          var r = $.fn.tooltip.Constructor.prototype.show.apply(this, arguments);\n          this.tip().data('tooltip', this);\n          return r;\n        };\n        scope._tooltip = function (event) {\n          element.tooltip(event);\n        };\n        scope.hide = function () {\n          element.tooltip('hide');\n        };\n        scope.show = function () {\n          element.tooltip('show');\n        };\n        scope.dismiss = scope.hide;\n      }\n    };\n  }\n]);\n\n'use strict';\nangular.module('$strap.directives').directive('bsTypeahead', [\n  '$parse',\n  function ($parse) {\n    return {\n      restrict: 'A',\n      require: '?ngModel',\n      link: function postLink(scope, element, attrs, controller) {\n        var getter = $parse(attrs.bsTypeahead), setter = getter.assign, value = getter(scope);\n        scope.$watch(attrs.bsTypeahead, function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            value = newValue;\n          }\n        });\n        element.attr('data-provide', 'typeahead');\n        element.typeahead({\n          source: function (query) {\n            return angular.isFunction(value) ? value.apply(null, arguments) : value;\n          },\n          minLength: attrs.minLength || 1,\n          items: attrs.items,\n          updater: function (value) {\n            if (controller) {\n              scope.$apply(function () {\n                controller.$setViewValue(value);\n              });\n            }\n            scope.$emit('typeahead-updated', value);\n            return value;\n          }\n        });\n        var typeahead = element.data('typeahead');\n        typeahead.lookup = function (ev) {\n          var items;\n          this.query = this.$element.val() || '';\n          if (this.query.length < this.options.minLength) {\n            return this.shown ? this.hide() : this;\n          }\n          items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source;\n          return items ? this.process(items) : this;\n        };\n        if (!!attrs.matchAll) {\n          typeahead.matcher = function (item) {\n            return true;\n          };\n        }\n        if (attrs.minLength === '0') {\n          setTimeout(function () {\n            element.on('focus', function () {\n              element.val().length === 0 && setTimeout(element.typeahead.bind(element, 'lookup'), 200);\n            });\n          });\n        }\n      }\n    };\n  }\n]);\n","var path = 'public/app/plugins/datasource/grafana-azure-monitor-datasource/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-9\\\">Service</label>\\n    <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n      <select class=\\\"gf-form-input service-dropdown\\\" ng-model=ctrl.annotation.queryType ng-options=\\\"f as f for f in ['Application Insights', 'Azure Monitor', 'Azure Log Analytics']\\\"></select>\\n    </div>\\n  </div>\\n  <div class=gf-form ng-show=\\\"ctrl.annotation.queryType === 'Azure Log Analytics'\\\">\\n    <label class=\\\"gf-form-label query-keyword width-9\\\">Subscription</label>\\n    <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n      <select class=\\\"gf-form-input service-dropdown\\\" ng-model=ctrl.annotation.subscription ng-options=\\\"f.value as f.text for f in ctrl.subscriptions\\\" ng-change=ctrl.onSubscriptionChange()></select>\\n    </div>\\n  </div>\\n  <div ng-show=\\\"ctrl.annotation.queryType === 'Azure Log Analytics'\\\">\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">Workspace</label>\\n        <div class=\\\"gf-form-select-wrapper gf-form-select-wrapper--caret-indent\\\">\\n          <select class=\\\"gf-form-input min-width-12\\\" ng-model=ctrl.annotation.workspace ng-options=\\\"f.value as f.text for f in ctrl.workspaces\\\"></select>\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n        <div class=width-1></div>\\n      </div>\\n      <div class=gf-form>\\n        <button class=\\\"btn btn-primary width-10\\\" ng-click=ctrl.panelCtrl.refresh()>Run</button>\\n      </div>\\n      <div class=gf-form>\\n        <label class=gf-form-label>(New Line: Shift+Enter, Run Query: Enter, Trigger Suggestion: Ctrl+Space)</label>\\n      </div>\\n    </div>\\n    <kusto-editor class=\\\"gf-form gf-form--grow\\\" query=ctrl.annotation.rawQuery variables=ctrl.templateVariables change=ctrl.onLogAnalyticsQueryChange getschema=ctrl.getAzureLogAnalyticsSchema />\\n  </div>\\n\\n  <div class=gf-form-inline ng-show=\\\"ctrl.annotation.queryType !== 'Azure Log Analytics'\\\">\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <label class=gf-form-label>No annotations support for {{ctrl.annotation.queryType}}</label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showHelp>\\n    <pre class=\\\"gf-form-pre alert alert-info\\\" ng-show=\\\"ctrl.annotation.queryType === 'Azure Log Analytics'\\\"><h6>Annotation Query Format</h6>\\nAn annotation is an event that is overlaid on top of graphs. The query can have up to three columns per row, the datetime column is mandatory. Annotation rendering is expensive so it is important to limit the number of rows returned.\\n\\n- column with the datetime type.\\n- column with alias: <b>Text</b> or <b>text</b> for the annotation text\\n- column with alias: <b>Tags</b> or <b>tags</b> for annotation tags. This is should return a comma separated string of tags e.g. 'tag1,tag2'\\n\\nMacros:\\n    - $__timeFilter() -&gt; TimeGenerated &ge; datetime(2018-06-05T18:09:58.907Z) and TimeGenerated &le; datetime(2018-06-05T20:09:58.907Z)\\n    - $__timeFilter(datetimeColumn) -&gt;  datetimeColumn  &ge; datetime(2018-06-05T18:09:58.907Z) and datetimeColumn &le; datetime(2018-06-05T20:09:58.907Z)\\n\\n    Or build your own conditionals using these built-in variables which just return the values:\\n    - $__timeFrom -&gt;  datetime(2018-06-05T18:09:58.907Z)\\n    - $__timeTo -&gt; datetime(2018-06-05T20:09:58.907Z)\\n    - $__interval -&gt; 5m\\n</pre>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/panel/dashlist/editor.html';\nvar html = \"<div>\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Options</h5>\\n\\n    <gf-form-switch class=gf-form label=Starred label-class=width-9 checked=ctrl.panel.starred on-change=ctrl.refresh()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=\\\"Recently viewed\\\" label-class=width-9 checked=ctrl.panel.recent on-change=ctrl.refresh()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=Search label-class=width-9 checked=ctrl.panel.search on-change=ctrl.refresh()></gf-form-switch>\\n\\n    <gf-form-switch class=gf-form label=\\\"Show headings\\\" label-class=width-9 checked=ctrl.panel.headings on-change=ctrl.refresh()></gf-form-switch>\\n\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-9\\\">Max items</span>\\n      <input class=\\\"gf-form-input max-width-5\\\" type=number ng-model=ctrl.panel.limit ng-model-onblur ng-change=ctrl.refresh()>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Search</h5>\\n\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-6\\\">Query</span>\\n      <input type=text class=gf-form-input placeholder=\\\"title query\\\" ng-model=ctrl.panel.query ng-change=ctrl.refresh() ng-model-onblur>\\n    </div>\\n\\n    <div class=gf-form>\\n      <folder-picker initial-folder-id=ctrl.panel.folderId on-change=ctrl.onFolderChange label-class=width-6 initial-title=\\\"'All'\\\" enable-reset=true>\\n      </folder-picker>\\n    </div>\\n\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-6\\\">Tags</span>\\n      <bootstrap-tagsinput ng-model=ctrl.panel.tags tagclass=\\\"label label-tag\\\" placeholder=\\\"add tags\\\" on-tags-updated=ctrl.refresh()>\\n      </bootstrap-tagsinput>\\n    </div>\\n  </div>\\n\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React from 'react';\n\nexport default () => {\n  return (\n    <div className=\"\">\n      <h5>What are Permissions?</h5>\n      <p>\n        An Access Control List (ACL) model is used to limit access to Dashboard Folders. A user or a Team can be\n        assigned permissions for a folder or for a single dashboard.\n      </p>\n    </div>\n  );\n};\n","const JSURL = require('jsurl');\n\nexport interface AwsUrl {\n  end: string;\n  start: string;\n  timeType?: 'ABSOLUTE' | 'RELATIVE';\n  tz?: 'local' | 'UTC';\n  unit?: string;\n  editorString: string;\n  isLiveTail: boolean;\n  source: string[];\n}\n\nexport function encodeUrl(obj: AwsUrl, region: string): string {\n  return `https://${region}.console.aws.amazon.com/cloudwatch/home?region=${region}#logs-insights:queryDetail=${JSURL.stringify(\n    obj\n  )}`;\n}\n","import { AnyAction, createAction } from '@reduxjs/toolkit';\nimport { NavIndex, NavModelItem } from '@grafana/data';\n\nimport config from 'app/core/config';\n\nexport function buildInitialState(): NavIndex {\n  const navIndex: NavIndex = {};\n  const rootNodes = config.bootData.navTree as NavModelItem[];\n  buildNavIndex(navIndex, rootNodes);\n  return navIndex;\n}\n\nfunction buildNavIndex(navIndex: NavIndex, children: NavModelItem[], parentItem?: NavModelItem) {\n  for (const node of children) {\n    navIndex[node.id] = {\n      ...node,\n      parentItem: parentItem,\n    };\n\n    if (node.children) {\n      buildNavIndex(navIndex, node.children, node);\n    }\n  }\n}\n\nexport const initialState: NavIndex = {};\n\nexport const updateNavIndex = createAction<NavModelItem>('navIndex/updateNavIndex');\n\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because Angular would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const navIndexReducer = (state: NavIndex = initialState, action: AnyAction): NavIndex => {\n  if (updateNavIndex.match(action)) {\n    const newPages: NavIndex = {};\n    const payload = action.payload;\n\n    for (const node of payload.children) {\n      newPages[node.id] = {\n        ...node,\n        parentItem: payload,\n      };\n    }\n\n    return { ...state, ...newPages };\n  }\n\n  return state;\n};\n","import { Labels } from './data';\nimport { GraphSeriesXY } from './graph';\nimport { DataFrame } from './dataFrame';\n\n/**\n * Mapping of log level abbreviation to canonical log level.\n * Supported levels are reduce to limit color variation.\n */\nexport enum LogLevel {\n  emerg = 'critical',\n  fatal = 'critical',\n  alert = 'critical',\n  crit = 'critical',\n  critical = 'critical',\n  warn = 'warning',\n  warning = 'warning',\n  err = 'error',\n  eror = 'error',\n  error = 'error',\n  info = 'info',\n  information = 'info',\n  notice = 'info',\n  dbug = 'debug',\n  debug = 'debug',\n  trace = 'trace',\n  unknown = 'unknown',\n}\n\nexport enum LogsMetaKind {\n  Number,\n  String,\n  LabelsMap,\n}\n\nexport interface LogsMetaItem {\n  label: string;\n  value: string | number | Labels;\n  kind: LogsMetaKind;\n}\n\nexport interface LogRowModel {\n  // Index of the field from which the entry has been created so that we do not show it later in log row details.\n  entryFieldIndex: number;\n\n  // Index of the row in the dataframe. As log rows can be stitched from multiple dataFrames, this does not have to be\n  // the same as rows final index when rendered.\n  rowIndex: number;\n\n  // Full DataFrame from which we parsed this log.\n  // TODO: refactor this so we do not need to pass whole dataframes in addition to also parsed data.\n  dataFrame: DataFrame;\n  duplicates?: number;\n\n  // Actual log line\n  entry: string;\n  hasAnsi: boolean;\n  labels: Labels;\n  logLevel: LogLevel;\n  raw: string;\n  searchWords?: string[];\n  timeFromNow: string;\n  timeEpochMs: number;\n  // timeEpochNs stores time with nanosecond-level precision,\n  // as millisecond-level precision is usually not enough for proper sorting of logs\n  timeEpochNs: string;\n  timeLocal: string;\n  timeUtc: string;\n  uid: string;\n  uniqueLabels?: Labels;\n}\n\nexport interface LogsModel {\n  hasUniqueLabels: boolean;\n  meta?: LogsMetaItem[];\n  rows: LogRowModel[];\n  series?: GraphSeriesXY[];\n}\n\nexport interface LogSearchMatch {\n  start: number;\n  length: number;\n  text: string;\n}\n\nexport interface LogLabelStatsModel {\n  active?: boolean;\n  count: number;\n  proportion: number;\n  value: string;\n}\n\nexport enum LogsDedupStrategy {\n  none = 'none',\n  exact = 'exact',\n  numbers = 'numbers',\n  signature = 'signature',\n}\n\nexport interface LogsParser {\n  /**\n   * Value-agnostic matcher for a field label.\n   * Used to filter rows, and first capture group contains the value.\n   */\n  buildMatcher: (label: string) => RegExp;\n\n  /**\n   * Returns all parsable substrings from a line, used for highlighting\n   */\n  getFields: (line: string) => string[];\n\n  /**\n   * Gets the label name from a parsable substring of a line\n   */\n  getLabelFromField: (field: string) => string;\n\n  /**\n   * Gets the label value from a parsable substring of a line\n   */\n  getValueFromField: (field: string) => string;\n  /**\n   * Function to verify if this is a valid parser for the given line.\n   * The parser accepts the line unless it returns undefined.\n   */\n  test: (line: string) => any;\n}\n\nexport enum LogsDedupDescription {\n  none = 'No de-duplication',\n  exact = 'De-duplication of successive lines that are identical, ignoring ISO datetimes.',\n  numbers = 'De-duplication of successive lines that are identical when ignoring numbers, e.g., IP addresses, latencies.',\n  signature = 'De-duplication of successive lines that have identical punctuation and whitespace.',\n}\n","import React, { PureComponent } from 'react';\n\nimport isArray from 'lodash/isArray';\nimport difference from 'lodash/difference';\n\nimport { Select } from '../Select/Select';\n\nimport { fieldReducers, SelectableValue } from '@grafana/data';\n\ninterface Props {\n  placeholder?: string;\n  onChange: (stats: string[]) => void;\n  stats: string[];\n  allowMultiple?: boolean;\n  defaultStat?: string;\n  className?: string;\n  menuPlacement?: 'auto' | 'bottom' | 'top';\n}\n\nexport class StatsPicker extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\n    allowMultiple: false,\n  };\n\n  componentDidMount() {\n    this.checkInput();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    this.checkInput();\n  }\n\n  checkInput = () => {\n    const { stats, allowMultiple, defaultStat, onChange } = this.props;\n\n    const current = fieldReducers.list(stats);\n    if (current.length !== stats.length) {\n      const found = current.map(v => v.id);\n      const notFound = difference(stats, found);\n      console.warn('Unknown stats', notFound, stats);\n      onChange(current.map(stat => stat.id));\n    }\n\n    // Make sure there is only one\n    if (!allowMultiple && stats.length > 1) {\n      console.warn('Removing extra stat', stats);\n      onChange([stats[0]]);\n    }\n\n    // Set the reducer from callback\n    if (defaultStat && stats.length < 1) {\n      onChange([defaultStat]);\n    }\n  };\n\n  onSelectionChange = (item: SelectableValue<string>) => {\n    const { onChange } = this.props;\n    if (isArray(item)) {\n      onChange(item.map(v => v.value));\n    } else {\n      onChange(item && item.value ? [item.value] : []);\n    }\n  };\n\n  render() {\n    const { stats, allowMultiple, defaultStat, placeholder, className, menuPlacement } = this.props;\n\n    const select = fieldReducers.selectOptions(stats);\n    return (\n      <Select\n        value={select.current}\n        className={className}\n        isClearable={!defaultStat}\n        isMulti={allowMultiple}\n        isSearchable={true}\n        options={select.options}\n        placeholder={placeholder}\n        onChange={this.onSelectionChange}\n        menuPlacement={menuPlacement}\n      />\n    );\n  }\n}\n","import { MutableVector } from '../types/vector';\nimport { vectorToArray } from './vectorToArray';\nimport { FunctionalVector } from './FunctionalVector';\n\ninterface CircularOptions<T> {\n  buffer?: T[];\n  append?: 'head' | 'tail';\n  capacity?: number;\n}\n\n/**\n * Circular vector uses a single buffer to capture a stream of values\n * overwriting the oldest value on add.\n *\n * This supports addting to the 'head' or 'tail' and will grow the buffer\n * to match a configured capacity.\n */\nexport class CircularVector<T = any> extends FunctionalVector implements MutableVector<T> {\n  private buffer: T[];\n  private index: number;\n  private capacity: number;\n  private tail: boolean;\n\n  constructor(options: CircularOptions<T>) {\n    super();\n\n    this.buffer = options.buffer || [];\n    this.capacity = this.buffer.length;\n    this.tail = 'head' !== options.append;\n    this.index = 0;\n\n    this.add = this.getAddFunction();\n    if (options.capacity) {\n      this.setCapacity(options.capacity);\n    }\n  }\n\n  /**\n   * This gets the appropriate add function depending on the buffer state:\n   *  * head vs tail\n   *  * growing buffer vs overwriting values\n   */\n  private getAddFunction() {\n    // When we are not at capacity, it should actually modify the buffer\n    if (this.capacity > this.buffer.length) {\n      if (this.tail) {\n        return (value: T) => {\n          this.buffer.push(value);\n          if (this.buffer.length >= this.capacity) {\n            this.add = this.getAddFunction();\n          }\n        };\n      } else {\n        return (value: T) => {\n          this.buffer.unshift(value);\n          if (this.buffer.length >= this.capacity) {\n            this.add = this.getAddFunction();\n          }\n        };\n      }\n    }\n\n    if (this.tail) {\n      return (value: T) => {\n        this.buffer[this.index] = value;\n        this.index = (this.index + 1) % this.buffer.length;\n      };\n    }\n\n    // Append values to the head\n    return (value: T) => {\n      let idx = this.index - 1;\n      if (idx < 0) {\n        idx = this.buffer.length - 1;\n      }\n      this.buffer[idx] = value;\n      this.index = idx;\n    };\n  }\n\n  setCapacity(v: number) {\n    if (this.capacity === v) {\n      return;\n    }\n    // Make a copy so it is in order and new additions can be at the head or tail\n    const copy = this.toArray();\n    if (v > this.length) {\n      this.buffer = copy;\n    } else if (v < this.capacity) {\n      // Shrink the buffer\n      const delta = this.length - v;\n      if (this.tail) {\n        this.buffer = copy.slice(delta, copy.length); // Keep last items\n      } else {\n        this.buffer = copy.slice(0, copy.length - delta); // Keep first items\n      }\n    }\n    this.capacity = v;\n    this.index = 0;\n    this.add = this.getAddFunction();\n  }\n\n  setAppendMode(mode: 'head' | 'tail') {\n    const tail = 'head' !== mode;\n    if (tail !== this.tail) {\n      this.buffer = this.toArray().reverse();\n      this.index = 0;\n      this.tail = tail;\n      this.add = this.getAddFunction();\n    }\n  }\n\n  reverse() {\n    this.buffer.reverse();\n  }\n\n  /**\n   * Add the value to the buffer\n   */\n  add: (value: T) => void;\n\n  get(index: number) {\n    return this.buffer[(index + this.index) % this.buffer.length];\n  }\n\n  set(index: number, value: T) {\n    this.buffer[(index + this.index) % this.buffer.length] = value;\n  }\n\n  get length() {\n    return this.buffer.length;\n  }\n\n  toArray(): T[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): T[] {\n    return vectorToArray(this);\n  }\n}\n","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var path = 'public/app/features/annotations/partials/editor.html';\nvar html = \"<div ng-controller=AnnotationsEditorCtrl>\\n  <div class=page-action-bar>\\n    <h3 class=dashboard-settings__header>\\n      <a ng-click=ctrl.backToList()>Annotations</a>\\n      <span ng-show=\\\"ctrl.mode === 'new'\\\"><icon name=\\\"'angle-right'\\\"></icon> New</span>\\n      <span ng-show=\\\"ctrl.mode === 'edit'\\\"><icon name=\\\"'angle-right'\\\"></icon> Edit</span>\\n    </h3>\\n\\n    <div class=page-action-bar__spacer></div>\\n\\n    <a type=button class=\\\"btn btn-primary\\\" ng-click=ctrl.setupNew(); ng-if=\\\"ctrl.annotations.length > 1\\\" ng-hide=\\\"ctrl.mode === 'edit' || ctrl.mode === 'new'\\\">\\n      New\\n    </a>\\n  </div>\\n\\n  <div ng-if=\\\"ctrl.mode === 'list'\\\">\\n    <table class=\\\"filter-table filter-table--hover\\\">\\n      <thead>\\n        <tr>\\n          <th>Query name</th>\\n          <th>Data source</th>\\n          <th colspan=3></th>\\n        </tr>\\n      </thead>\\n      <tbody>\\n        <tr ng-repeat=\\\"annotation in ctrl.annotations track by annotation.name\\\">\\n          <td style=width:90% ng-hide=annotation.builtIn class=pointer ng-click=ctrl.edit(annotation)>\\n            <icon name=\\\"'comment-alt'\\\" style=color:{};></icon> &nbsp; {{ annotation.name }}\\n          </td>\\n          <td style=width:90% ng-show=annotation.builtIn class=pointer ng-click=ctrl.edit(annotation)>\\n            <icon name=\\\"'comment-alt'\\\"></icon> &nbsp;\\n            <em class=muted>{{ annotation.name }} (Built-in)</em>\\n          </td>\\n          <td class=pointer ng-click=ctrl.edit(annotation)>\\n            {{ annotation.datasource || 'Default' }}\\n          </td>\\n          <td style=width:1%>\\n            <icon ng-click=ctrl.move($index,-1) ng-hide=$first name=\\\"'arrow-up'\\\"></icon>\\n          </td>\\n          <td style=width:1%>\\n            <icon ng-click=ctrl.move($index,1) ng-hide=$last name=\\\"'arrow-down'\\\"></icon>\\n          </td>\\n          <td style=width:1%>\\n            <a ng-click=ctrl.removeAnnotation(annotation) class=\\\"btn btn-danger btn-small\\\" ng-hide=annotation.builtIn>\\n              <icon name=\\\"'times'\\\" style=margin-bottom:0></icon>\\n            </a>\\n          </td>\\n        </tr>\\n      </tbody>\\n    </table>\\n\\n    <!-- empty list cta, there is always one built in query -->\\n    <div ng-if=\\\"ctrl.annotations.length === 1\\\" class=p-t-2>\\n      <empty-list-cta title=ctrl.emptyListCta.title buttonicon=ctrl.emptyListCta.buttonIcon buttontitle=ctrl.emptyListCta.buttonTitle infobox=ctrl.emptyListCta.infoBox infoboxtitle=ctrl.emptyListCta.infoBoxTitle on-click=ctrl.setupNew />\\n    </div>\\n  </div>\\n\\n  <div class=annotations-basic-settings ng-if=\\\"ctrl.mode === 'edit' || ctrl.mode === 'new'\\\">\\n    <div class=gf-form-group>\\n      <h5 class=section-heading>General</h5>\\n      <div class=gf-form-inline>\\n        <div class=gf-form>\\n          <span class=\\\"gf-form-label width-7\\\">Name</span>\\n          <input type=text class=\\\"gf-form-input width-20\\\" ng-model=ctrl.currentAnnotation.name placeholder=name />\\n        </div>\\n        <div class=gf-form>\\n          <span class=\\\"gf-form-label width-7\\\">Data source</span>\\n          <div class=gf-form-select-wrapper>\\n            <select class=gf-form-input ng-model=ctrl.currentAnnotation.datasource ng-options=\\\"f.name as f.name for f in ctrl.datasources\\\" ng-change=ctrl.datasourceChanged()></select>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-group>\\n      <div class=gf-form-inline>\\n        <gf-form-switch class=gf-form label=Enabled checked=ctrl.currentAnnotation.enable label-class=width-7>\\n        </gf-form-switch>\\n        <gf-form-switch class=gf-form label=Hidden tooltip=\\\"Hides the annotation query toggle from showing at the top of the dashboard\\\" checked=ctrl.currentAnnotation.hide label-class=width-7>\\n        </gf-form-switch>\\n        <div class=gf-form>\\n          <label class=\\\"gf-form-label width-9\\\">Color</label>\\n          <span class=gf-form-label>\\n            <color-picker color=ctrl.currentAnnotation.iconColor onchange=ctrl.onColorChange></color-picker>\\n          </span>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <h5 class=section-heading>Query</h5>\\n    <rebuild-on-change property=ctrl.currentDatasource>\\n      <plugin-component type=annotations-query-ctrl> </plugin-component>\\n    </rebuild-on-change>\\n\\n    <div class=gf-form>\\n      <div class=\\\"gf-form-button-row p-y-0\\\">\\n        <button ng-show=\\\"ctrl.mode === 'new'\\\" type=button class=\\\"btn gf-form-button btn-primary\\\" ng-click=ctrl.add()>\\n          Add\\n        </button>\\n        <button ng-show=\\\"ctrl.mode === 'edit'\\\" type=button class=\\\"btn btn-primary pull-left\\\" ng-click=ctrl.update()>\\n          Update\\n        </button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport { css } from 'emotion';\nimport { ConfirmButton, ConfirmModal, Button } from '@grafana/ui';\nimport { UserSession } from 'app/types';\n\ninterface Props {\n  sessions: UserSession[];\n\n  onSessionRevoke: (id: number) => void;\n  onAllSessionsRevoke: () => void;\n}\n\ninterface State {\n  showLogoutModal: boolean;\n}\n\nexport class UserSessions extends PureComponent<Props, State> {\n  state: State = {\n    showLogoutModal: false,\n  };\n\n  showLogoutConfirmationModal = (show: boolean) => () => {\n    this.setState({ showLogoutModal: show });\n  };\n\n  onSessionRevoke = (id: number) => {\n    return () => {\n      this.props.onSessionRevoke(id);\n    };\n  };\n\n  onAllSessionsRevoke = () => {\n    this.setState({ showLogoutModal: false });\n    this.props.onAllSessionsRevoke();\n  };\n\n  render() {\n    const { sessions } = this.props;\n    const { showLogoutModal } = this.state;\n\n    const logoutFromAllDevicesClass = css`\n      margin-top: 0.8rem;\n    `;\n\n    return (\n      <>\n        <h3 className=\"page-heading\">Sessions</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <thead>\n                <tr>\n                  <th>Last seen</th>\n                  <th>Logged on</th>\n                  <th>IP address</th>\n                  <th colSpan={2}>Browser &amp; OS</th>\n                </tr>\n              </thead>\n              <tbody>\n                {sessions &&\n                  sessions.map((session, index) => (\n                    <tr key={`${session.id}-${index}`}>\n                      <td>{session.isActive ? 'Now' : session.seenAt}</td>\n                      <td>{session.createdAt}</td>\n                      <td>{session.clientIp}</td>\n                      <td>{`${session.browser} on ${session.os} ${session.osVersion}`}</td>\n                      <td>\n                        <div className=\"pull-right\">\n                          <ConfirmButton\n                            confirmText=\"Confirm logout\"\n                            confirmVariant=\"destructive\"\n                            onConfirm={this.onSessionRevoke(session.id)}\n                          >\n                            Force logout\n                          </ConfirmButton>\n                        </div>\n                      </td>\n                    </tr>\n                  ))}\n              </tbody>\n            </table>\n          </div>\n          <div className={logoutFromAllDevicesClass}>\n            {sessions.length > 0 && (\n              <Button variant=\"secondary\" onClick={this.showLogoutConfirmationModal(true)}>\n                Force logout from all devices\n              </Button>\n            )}\n            <ConfirmModal\n              isOpen={showLogoutModal}\n              title=\"Force logout from all devices\"\n              body=\"Are you sure you want to force logout from all devices?\"\n              confirmText=\"Force logout\"\n              onConfirm={this.onAllSessionsRevoke}\n              onDismiss={this.showLogoutConfirmationModal(false)}\n            />\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n","import {\n  FieldConfigSource,\n  GrafanaPlugin,\n  PanelEditorProps,\n  PanelMigrationHandler,\n  PanelOptionEditorsRegistry,\n  PanelPluginMeta,\n  PanelProps,\n  PanelTypeChangedHandler,\n  FieldConfigProperty,\n} from '../types';\nimport { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders';\nimport { ComponentClass, ComponentType } from 'react';\nimport set from 'lodash/set';\nimport { deprecationWarning } from '../utils';\nimport { FieldConfigOptionsRegistry, standardFieldConfigEditorRegistry } from '../field';\n\nexport interface SetFieldConfigOptionsArgs<TFieldConfigOptions = any> {\n  /**\n   * Array of standard field config properties\n   *\n   * @example\n   * ```typescript\n   * {\n   *   standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max, FieldConfigProperty.Unit]\n   * }\n   * ```\n   */\n  standardOptions?: FieldConfigProperty[];\n\n  /**\n   * Object specyfing standard option properties default values\n   *\n   * @example\n   * ```typescript\n   * {\n   *   standardOptionsDefaults: {\n   *     [FieldConfigProperty.Min]: 20,\n   *     [FieldConfigProperty.Max]: 100\n   *   }\n   * }\n   * ```\n   */\n  standardOptionsDefaults?: Partial<Record<FieldConfigProperty, any>>;\n\n  /**\n   * Function that allows custom field config properties definition.\n   *\n   * @param builder\n   *\n   * @example\n   * ```typescript\n   * useCustomConfig: builder => {\n   *   builder\n   *    .addNumberInput({\n   *      id: 'shapeBorderWidth',\n   *      name: 'Border width',\n   *      description: 'Border width of the shape',\n   *      settings: {\n   *        min: 1,\n   *        max: 5,\n   *      },\n   *    })\n   *    .addSelect({\n   *      id: 'displayMode',\n   *      name: 'Display mode',\n   *      description: 'How the shape shout be rendered'\n   *      settings: {\n   *      options: [{value: 'fill', label: 'Fill' }, {value: 'transparent', label: 'Transparent }]\n   *    },\n   *  })\n   * }\n   * ```\n   */\n  useCustomConfig?: (builder: FieldConfigEditorBuilder<TFieldConfigOptions>) => void;\n}\n\nexport class PanelPlugin<TOptions = any, TFieldConfigOptions extends object = any> extends GrafanaPlugin<\n  PanelPluginMeta\n> {\n  private _defaults?: TOptions;\n  private _fieldConfigDefaults: FieldConfigSource<TFieldConfigOptions> = {\n    defaults: {},\n    overrides: [],\n  };\n\n  private _fieldConfigRegistry?: FieldConfigOptionsRegistry;\n  private _initConfigRegistry = () => {\n    return new FieldConfigOptionsRegistry();\n  };\n\n  private _optionEditors?: PanelOptionEditorsRegistry;\n  private registerOptionEditors?: (builder: PanelOptionsEditorBuilder<TOptions>) => void;\n\n  panel: ComponentType<PanelProps<TOptions>> | null;\n  editor?: ComponentClass<PanelEditorProps<TOptions>>;\n  onPanelMigration?: PanelMigrationHandler<TOptions>;\n  onPanelTypeChanged?: PanelTypeChangedHandler<TOptions>;\n  noPadding?: boolean;\n\n  /**\n   * Legacy angular ctrl.  If this exists it will be used instead of the panel\n   */\n  angularPanelCtrl?: any;\n\n  constructor(panel: ComponentType<PanelProps<TOptions>> | null) {\n    super();\n    this.panel = panel;\n  }\n\n  get defaults() {\n    let result = this._defaults || {};\n\n    if (!this._defaults) {\n      const editors = this.optionEditors;\n\n      if (!editors || editors.list().length === 0) {\n        return null;\n      }\n\n      for (const editor of editors.list()) {\n        set(result, editor.id, editor.defaultValue);\n      }\n    }\n    return result;\n  }\n\n  get fieldConfigDefaults(): FieldConfigSource<TFieldConfigOptions> {\n    const configDefaults = this._fieldConfigDefaults.defaults;\n    configDefaults.custom = {} as TFieldConfigOptions;\n\n    for (const option of this.fieldConfigRegistry.list()) {\n      set(configDefaults, option.id, option.defaultValue);\n    }\n\n    return {\n      defaults: {\n        ...configDefaults,\n      },\n      overrides: this._fieldConfigDefaults.overrides,\n    };\n  }\n\n  /**\n   * @deprecated setDefaults is deprecated in favor of setPanelOptions\n   */\n  setDefaults(defaults: TOptions) {\n    deprecationWarning('PanelPlugin', 'setDefaults', 'setPanelOptions');\n    this._defaults = defaults;\n    return this;\n  }\n\n  get fieldConfigRegistry() {\n    if (!this._fieldConfigRegistry) {\n      this._fieldConfigRegistry = this._initConfigRegistry();\n    }\n\n    return this._fieldConfigRegistry;\n  }\n\n  get optionEditors() {\n    if (!this._optionEditors && this.registerOptionEditors) {\n      const builder = new PanelOptionsEditorBuilder<TOptions>();\n      this.registerOptionEditors(builder);\n      this._optionEditors = builder.getRegistry();\n    }\n\n    return this._optionEditors;\n  }\n\n  /**\n   * @deprecated setEditor is deprecated in favor of setPanelOptions\n   */\n  setEditor(editor: ComponentClass<PanelEditorProps<TOptions>>) {\n    deprecationWarning('PanelPlugin', 'setEditor', 'setPanelOptions');\n    this.editor = editor;\n    return this;\n  }\n\n  setNoPadding() {\n    this.noPadding = true;\n    return this;\n  }\n\n  /**\n   * This function is called before the panel first loads if\n   * the current version is different than the version that was saved.\n   *\n   * This is a good place to support any changes to the options model\n   */\n  setMigrationHandler(handler: PanelMigrationHandler) {\n    this.onPanelMigration = handler;\n    return this;\n  }\n\n  /**\n   * This function is called when the visualization was changed. This\n   * passes in the panel model for previous visualisation options inspection\n   * and panel model updates.\n   *\n   * This is useful for supporting PanelModel API updates when changing\n   * between Angular and React panels.\n   */\n  setPanelChangeHandler(handler: PanelTypeChangedHandler) {\n    this.onPanelTypeChanged = handler;\n    return this;\n  }\n\n  /**\n   * Enables panel options editor creation\n   *\n   * @example\n   * ```typescript\n   *\n   * import { ShapePanel } from './ShapePanel';\n   *\n   * interface ShapePanelOptions {}\n   *\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *   .setPanelOptions(builder => {\n   *     builder\n   *       .addSelect({\n   *         id: 'shape',\n   *         name: 'Shape',\n   *         description: 'Select shape to render'\n   *         settings: {\n   *           options: [\n   *             {value: 'circle', label: 'Circle' },\n   *             {value: 'square', label: 'Square },\n   *             {value: 'triangle', label: 'Triangle }\n   *            ]\n   *         },\n   *       })\n   *   })\n   * ```\n   *\n   * @public\n   **/\n  setPanelOptions(builder: (builder: PanelOptionsEditorBuilder<TOptions>) => void) {\n    // builder is applied lazily when options UI is created\n    this.registerOptionEditors = builder;\n    return this;\n  }\n\n  /**\n   * Allows specyfing which standard field config options panel should use and defining default values\n   *\n   * @example\n   * ```typescript\n   *\n   * import { ShapePanel } from './ShapePanel';\n   *\n   * interface ShapePanelOptions {}\n   *\n   * // when plugin should use all standard options\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig();\n   *\n   * // when plugin should only display specific standard options\n   * // note, that options will be displayed in the order they are provided\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig({\n   *    standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max]\n   *   });\n   *\n   * // when standard option's default value needs to be provided\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig({\n   *    standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max],\n   *    standardOptionsDefaults: {\n   *      [FieldConfigProperty.Min]: 20,\n   *      [FieldConfigProperty.Max]: 100\n   *    }\n   *  });\n   *\n   * // when custom field config options needs to be provided\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig({\n   *    useCustomConfig: builder => {\n   *      builder\n   *       .addNumberInput({\n   *         id: 'shapeBorderWidth',\n   *         name: 'Border width',\n   *         description: 'Border width of the shape',\n   *         settings: {\n   *           min: 1,\n   *           max: 5,\n   *         },\n   *       })\n   *       .addSelect({\n   *         id: 'displayMode',\n   *         name: 'Display mode',\n   *         description: 'How the shape shout be rendered'\n   *         settings: {\n   *         options: [{value: 'fill', label: 'Fill' }, {value: 'transparent', label: 'Transparent }]\n   *       },\n   *     })\n   *   },\n   *  });\n   *\n   * ```\n   *\n   * @public\n   */\n  useFieldConfig(config?: SetFieldConfigOptionsArgs<TFieldConfigOptions>) {\n    // builder is applied lazily when custom field configs are accessed\n    this._initConfigRegistry = () => {\n      const registry = new FieldConfigOptionsRegistry();\n\n      // Add custom options\n      if (config && config.useCustomConfig) {\n        const builder = new FieldConfigEditorBuilder<TFieldConfigOptions>();\n        config.useCustomConfig(builder);\n\n        for (const customProp of builder.getRegistry().list()) {\n          customProp.isCustom = true;\n          customProp.category = ['Custom options'].concat(customProp.category || []);\n          // need to do something to make the custom items not conflict with standard ones\n          // problem is id (registry index) is used as property path\n          // so sort of need a property path on the FieldPropertyEditorItem\n          customProp.id = 'custom.' + customProp.id;\n          registry.register(customProp);\n        }\n      }\n\n      if (config && config.standardOptions) {\n        for (const standardOption of config.standardOptions) {\n          const standardEditor = standardFieldConfigEditorRegistry.get(standardOption);\n          registry.register({\n            ...standardEditor,\n            defaultValue:\n              (config.standardOptionsDefaults && config.standardOptionsDefaults[standardOption]) ||\n              standardEditor.defaultValue,\n          });\n        }\n      } else {\n        for (const fieldConfigProp of standardFieldConfigEditorRegistry.list()) {\n          registry.register(fieldConfigProp);\n        }\n      }\n\n      return registry;\n    };\n\n    return this;\n  }\n}\n","type StoreValue = string | number | boolean | null;\n\nexport class Store {\n  get(key: string) {\n    return window.localStorage[key];\n  }\n\n  set(key: string, value: StoreValue) {\n    window.localStorage[key] = value;\n  }\n\n  getBool(key: string, def: boolean): boolean {\n    if (def !== void 0 && !this.exists(key)) {\n      return def;\n    }\n    return window.localStorage[key] === 'true';\n  }\n\n  getObject(key: string, def?: any) {\n    let ret = def;\n    if (this.exists(key)) {\n      const json = window.localStorage[key];\n      try {\n        ret = JSON.parse(json);\n      } catch (error) {\n        console.error(`Error parsing store object: ${key}. Returning default: ${def}. [${error}]`);\n      }\n    }\n    return ret;\n  }\n\n  /* Returns true when successfully stored, throws error if not successfully stored */\n  setObject(key: string, value: any) {\n    let json;\n    try {\n      json = JSON.stringify(value);\n    } catch (error) {\n      throw new Error(`Could not stringify object: ${key}. [${error}]`);\n    }\n    try {\n      this.set(key, json);\n    } catch (error) {\n      // Likely hitting storage quota\n      throw new Error(`Could not save item in localStorage: ${key}. [${error}]`);\n    }\n    return true;\n  }\n\n  exists(key: string) {\n    return window.localStorage[key] !== void 0;\n  }\n\n  delete(key: string) {\n    window.localStorage.removeItem(key);\n  }\n}\n\nconst store = new Store();\nexport default store;\n","let templates = (require as any).context('../', true, /\\.html$/);\ntemplates.keys().forEach((key: string) => {\n  templates(key);\n});\n","var path = 'public/app/plugins/datasource/influxdb/partials/annotations.editor.html';\nvar html = \"\\n<div class=gf-form-group>\\n\\t<div class=gf-form>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.annotation.query placeholder=\\\"select text from events where $timeFilter limit 1000\\\">\\n\\t</div>\\n</div>\\n\\n<h5 class=section-heading>Field mappings <tip>If your influxdb query returns more than one field you need to specify the column names below. An annotation event is composed of a title, tags, and an additional text field.</tip></h5>\\n<div class=gf-form-group>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-4\\\">Text</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-10\\\" ng-model=ctrl.annotation.textColumn placeholder=\\\"\\\">\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-4\\\">Tags</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-10\\\" ng-model=ctrl.annotation.tagsColumn placeholder=\\\"\\\">\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-show=ctrl.annotation.titleColumn>\\n\\t\\t\\t<span class=\\\"gf-form-label width-4\\\">Title <em class=muted>(deprecated)</em></span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-10\\\" ng-model=ctrl.annotation.titleColumn placeholder=\\\"\\\">\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\nexport class Profiler {\n  panelsRendered: number;\n  enabled: boolean;\n  $rootScope: GrafanaRootScope;\n  window: any;\n\n  init(config: any, $rootScope: GrafanaRootScope) {\n    this.$rootScope = $rootScope;\n    this.window = window;\n\n    if (!this.enabled) {\n      return;\n    }\n  }\n\n  renderingCompleted() {\n    // add render counter to root scope\n    // used by image renderer to know when panel has rendered\n    this.panelsRendered = (this.panelsRendered || 0) + 1;\n\n    // this window variable is used by backend rendering tools to know\n    // all panels have completed rendering\n    this.window.panelsRendered = this.panelsRendered;\n  }\n}\n\nconst profiler = new Profiler();\nexport { profiler };\n","import React from 'react';\nimport { Icon } from '../../../Icon/Icon';\n\n// Ignoring because I couldn't get @types/react-select work wih Torkel's fork\n// @ts-ignore\nimport { components } from '@torkelo/react-select';\n\nexport const IndicatorsContainer = (props: any) => {\n  const isOpen = props.selectProps.menuIsOpen;\n  return (\n    <components.IndicatorsContainer {...props}>\n      <Icon name={isOpen ? 'angle-up' : 'angle-down'} style={{ marginTop: '7px' }} />\n    </components.IndicatorsContainer>\n  );\n};\n\nexport default IndicatorsContainer;\n","export interface AppNotification {\n  id: number;\n  severity: AppNotificationSeverity;\n  icon: string;\n  title: string;\n  text: string;\n  component?: React.ReactElement;\n  timeout: AppNotificationTimeout;\n}\n\nexport enum AppNotificationSeverity {\n  Success = 'success',\n  Warning = 'warning',\n  Error = 'error',\n  Info = 'info',\n}\n\nexport enum AppNotificationTimeout {\n  Warning = 5000,\n  Success = 3000,\n  Error = 7000,\n}\n\nexport interface AppNotificationsState {\n  appNotifications: AppNotification[];\n}\n","var path = 'public/app/plugins/panel/graph/tab_time_regions.html';\nvar html = \"<graph-time-region-form panel-ctrl=ctrl></graph-time-region-form>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/mssql/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl can-collapse=false>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<code-editor content=ctrl.target.rawSql datasource=ctrl.datasource on-change=ctrl.panelCtrl.refresh() data-mode=sqlserver>\\n\\t\\t\\t</code-editor>\\n\\t\\t</div>\\n\\t</div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Format as</label>\\n\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t<select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.target.format ng-options=\\\"f.value as f.text for f in ctrl.formats\\\" ng-change=ctrl.refresh()></select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-show=ctrl.lastQueryMeta>\\n      <label class=\\\"gf-form-label query-keyword\\\" ng-click=\\\"ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL\\\">\\n        Generated SQL\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showLastQuerySQL style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showLastQuerySQL style=margin-top:3px></icon>\\n      </label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form ng-show=ctrl.showLastQuerySQL>\\n\\t\\t<pre class=gf-form-pre>{{ctrl.lastQueryMeta.sql}}</pre>\\n\\t</div>\\n\\n\\t<div class=gf-form ng-show=ctrl.showHelp>\\n\\t\\t<pre class=\\\"gf-form-pre alert alert-info\\\">Time series:\\n- return column named time (in UTC), as a unix time stamp or any sql native date data type. You can use the macros below.\\n- any other columns returned will be the time point values.\\nOptional:\\n  - return column named <i>metric</i> to represent the series name.\\n  - If multiple value columns are returned the metric column is used as prefix.\\n  - If no column named metric is found the column name of the value column is used as series name\\n\\nResultsets of time series queries need to be sorted by time.\\n\\nTable:\\n- return any set of columns\\n\\nMacros:\\n- $__time(column) -&gt; column AS time\\n- $__timeEpoch(column) -&gt; DATEDIFF(second, '1970-01-01', column) AS time\\n- $__timeFilter(column) -&gt; column BETWEEN '2017-04-21T05:01:17Z' AND '2017-04-21T05:01:17Z'\\n- $__unixEpochFilter(column) -&gt; column &gt;= 1492750877 AND column &lt;= 1492750877\\n- $__unixEpochNanoFilter(column) -&gt;  column &gt;= 1494410783152415214 AND column &lt;= 1494497183142514872\\n- $__timeGroup(column, '5m'[, fillvalue]) -&gt; CAST(ROUND(DATEDIFF(second, '1970-01-01', column)/300.0, 0) as bigint)*300.\\n     by setting fillvalue grafana will fill in missing values according to the interval\\n     fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet\\n- $__timeGroupAlias(column, '5m'[, fillvalue]) -&gt; CAST(ROUND(DATEDIFF(second, '1970-01-01', column)/300.0, 0) as bigint)*300 AS [time]\\n- $__unixEpochGroup(column,'5m') -&gt; FLOOR(column/300)*300\\n- $__unixEpochGroupAlias(column,'5m') -&gt; FLOOR(column/300)*300 AS [time]\\n\\nExample of group by and order by with $__timeGroup:\\nSELECT\\n  $__timeGroup(date_time_col, '1h') AS time,\\n  sum(value) as value\\nFROM yourtable\\nGROUP BY $__timeGroup(date_time_col, '1h')\\nORDER BY 1\\n\\nOr build your own conditionals using these macros which just return the values:\\n- $__timeFrom() -&gt;  '2017-04-21T05:01:17Z'\\n- $__timeTo() -&gt;  '2017-04-21T05:01:17Z'\\n- $__unixEpochFrom() -&gt; 1492750877\\n- $__unixEpochTo() -&gt; 1492750877\\n- $__unixEpochNanoFrom() -&gt;  1494410783152415214\\n- $__unixEpochNanoTo() -&gt;  1494497183142514872\\n\\t\\t</pre>\\n\\t</div>\\n\\n\\t\\n\\n\\t<div class=gf-form ng-show=ctrl.lastQueryError>\\n\\t\\t<pre class=\\\"gf-form-pre alert alert-error\\\">{{ctrl.lastQueryError}}</pre>\\n\\t</div>\\n\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { Field } from '../types/dataFrame';\nimport { NullValueMode } from '../types/data';\nimport { GraphSeriesValue } from '../types/graph';\nimport { TimeRange } from '../types/time';\n\n// Types\n// import { NullValueMode, GraphSeriesValue, Field, TimeRange } from '@grafana/data';\nexport interface FlotPairsOptions {\n  xField: Field;\n  yField: Field;\n  nullValueMode?: NullValueMode;\n}\n\nexport function getFlotPairs({ xField, yField, nullValueMode }: FlotPairsOptions): GraphSeriesValue[][] {\n  const vX = xField.values;\n  const vY = yField.values;\n  const length = vX.length;\n  if (vY.length !== length) {\n    throw new Error('Unexpected field length');\n  }\n\n  const ignoreNulls = nullValueMode === NullValueMode.Ignore;\n  const nullAsZero = nullValueMode === NullValueMode.AsZero;\n\n  const pairs: any[][] = [];\n\n  for (let i = 0; i < length; i++) {\n    const x = vX.get(i);\n    let y = vY.get(i);\n\n    if (y === null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        y = 0;\n      }\n    }\n\n    // X must be a value\n    if (x === null) {\n      continue;\n    }\n\n    pairs.push([x, y]);\n  }\n  return pairs;\n}\n\n/**\n * Returns a constant series based on the first value from the provide series.\n * @param seriesData Series\n * @param range Start and end time for the constant series\n */\nexport function getFlotPairsConstant(seriesData: GraphSeriesValue[][], range: TimeRange): GraphSeriesValue[][] {\n  if (!range.from || !range.to || !seriesData || seriesData.length === 0) {\n    return [];\n  }\n\n  const from = range.from.valueOf();\n  const to = range.to.valueOf();\n  const value = seriesData[0][1];\n  return [\n    [from, value],\n    [to, value],\n  ];\n}\n","var path = 'public/app/plugins/panel/pluginlist/module.html';\nvar html = \"<div class=pluginlist>\\n  <div class=pluginlist-section ng-repeat=\\\"category in ctrl.viewModel\\\">\\n    <h6 class=pluginlist-section-header>\\n      {{category.header}}\\n    </h6>\\n    <div class=pluginlist-item ng-repeat=\\\"plugin in category.list\\\">\\n      <a class=\\\"pluginlist-link pluginlist-link-{{plugin.state}} pointer\\\" href={{plugin.defaultNavUrl}}>\\n        <span>\\n          <img ng-src={{plugin.info.logos.small}} class=pluginlist-image>\\n          <span class=pluginlist-title>{{plugin.name}}</span>\\n          <span class=pluginlist-version>v{{plugin.info.version}}</span>\\n        </span>\\n        <span ng-if=ctrl.isAdmin>\\n          <span class=\\\"pluginlist-message pluginlist-message--update\\\" ng-show=plugin.hasUpdate ng-click=\\\"ctrl.updateAvailable(plugin, $event)\\\" bs-tooltip=\\\"'New version: ' + plugin.latestVersion\\\">\\n            Update available!\\n          </span>\\n          <span class=\\\"pluginlist-message pluginlist-message--enable\\\" ng-show=\\\"!plugin.enabled && !plugin.hasUpdate\\\">\\n            Enable now\\n          </span>\\n          <span class=\\\"pluginlist-message pluginlist-message--no-update\\\" ng-show=\\\"plugin.enabled && !plugin.hasUpdate\\\">\\n            Up to date\\n          </span>\\n        </span>\\n      </a>\\n    </div>\\n    <div class=pluginlist-item ng-show=\\\"category.list.length === 0\\\">\\n      <a class=\\\"pluginlist-link pluginlist-link-{{plugin.state}}\\\" href=https://grafana.com/plugins>\\n        <span class=pluginlist-none-installed>None installed. <span class=pluginlist-emphasis>Browse Grafana.com</span></span>\\n      </a>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { vectorToArray } from './vectorToArray';\nimport { Vector } from '../types';\n\nexport abstract class FunctionalVector<T = any> implements Vector<T>, Iterable<T> {\n  abstract get length(): number;\n\n  abstract get(index: number): T;\n\n  // Implement \"iterator protocol\"\n  *iterator() {\n    for (let i = 0; i < this.length; i++) {\n      yield this.get(i);\n    }\n  }\n\n  // Implement \"iterable protocol\"\n  [Symbol.iterator]() {\n    return this.iterator();\n  }\n\n  forEach(iterator: (row: T) => void) {\n    return vectorator(this).forEach(iterator);\n  }\n\n  map<V>(transform: (item: T, index: number) => V) {\n    return vectorator(this).map(transform);\n  }\n\n  filter<V>(predicate: (item: T) => V) {\n    return vectorator(this).filter(predicate);\n  }\n\n  toArray(): T[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): any {\n    return this.toArray();\n  }\n}\n\n/**\n * Use functional programming with your vector\n */\nexport function vectorator<T>(vector: Vector<T>) {\n  return {\n    *[Symbol.iterator]() {\n      for (let i = 0; i < vector.length; i++) {\n        yield vector.get(i);\n      }\n    },\n\n    forEach(iterator: (row: T) => void) {\n      for (let i = 0; i < vector.length; i++) {\n        iterator(vector.get(i));\n      }\n    },\n\n    map<V>(transform: (item: T, index: number) => V) {\n      const result: V[] = [];\n      for (let i = 0; i < vector.length; i++) {\n        result.push(transform(vector.get(i), i));\n      }\n      return result;\n    },\n\n    filter<V>(predicate: (item: T) => V) {\n      const result: T[] = [];\n      for (const val of this) {\n        if (predicate(val)) {\n          result.push(val);\n        }\n      }\n      return result;\n    },\n  };\n}\n","export enum GrafanaThemeType {\n  Light = 'light',\n  Dark = 'dark',\n}\n\nexport interface GrafanaThemeCommons {\n  name: string;\n  // TODO: not sure if should be a part of theme\n  breakpoints: {\n    xs: string;\n    sm: string;\n    md: string;\n    lg: string;\n    xl: string;\n    xxl: string;\n  };\n  typography: {\n    fontFamily: {\n      sansSerif: string;\n      monospace: string;\n    };\n    size: {\n      base: string;\n      xs: string;\n      sm: string;\n      md: string;\n      lg: string;\n    };\n    weight: {\n      light: number;\n      regular: number;\n      semibold: number;\n      bold: number;\n    };\n    lineHeight: {\n      xs: number; //1\n      sm: number; //1.1\n      md: number; // 4/3\n      lg: number; // 1.5\n    };\n    // TODO: Refactor to use size instead of custom defs\n    heading: {\n      h1: string;\n      h2: string;\n      h3: string;\n      h4: string;\n      h5: string;\n      h6: string;\n    };\n    link: {\n      decoration: string;\n      hoverDecoration: string;\n    };\n  };\n  spacing: {\n    insetSquishMd: string;\n    d: string;\n    xxs: string;\n    xs: string;\n    sm: string;\n    md: string;\n    lg: string;\n    xl: string;\n    gutter: string;\n\n    // Next-gen forms spacing variables\n    // TODO: Move variables definition to respective components when implementing\n    formSpacingBase: number;\n    formMargin: string;\n    formFieldsetMargin: string;\n    formInputHeight: number;\n    formButtonHeight: number;\n    formInputPaddingHorizontal: string;\n    // Used for icons do define spacing between icon and input field\n    // Applied on the right(prefix) or left(suffix)\n    formInputAffixPaddingHorizontal: string;\n    formInputMargin: string;\n    formLabelPadding: string;\n    formLabelMargin: string;\n    formValidationMessagePadding: string;\n    formValidationMessageMargin: string;\n    inlineFormMargin: string;\n  };\n  border: {\n    radius: {\n      sm: string;\n      md: string;\n      lg: string;\n    };\n    width: {\n      sm: string;\n    };\n  };\n  height: {\n    sm: number;\n    md: number;\n    lg: number;\n  };\n  panelPadding: number;\n  panelHeaderHeight: number;\n  zIndex: {\n    dropdown: number;\n    navbarFixed: number;\n    sidemenu: number;\n    tooltip: number;\n    modalBackdrop: number;\n    modal: number;\n    typeahead: number;\n  };\n}\n\nexport interface GrafanaTheme extends GrafanaThemeCommons {\n  type: GrafanaThemeType;\n  isDark: boolean;\n  isLight: boolean;\n  palette: {\n    black: string;\n    white: string;\n    dark1: string;\n    dark2: string;\n    dark3: string;\n    dark4: string;\n    dark5: string;\n    dark6: string;\n    dark7: string;\n    dark8: string;\n    dark9: string;\n    dark10: string;\n    gray1: string;\n    gray2: string;\n    gray3: string;\n    gray4: string;\n    gray5: string;\n    gray6: string;\n    gray7: string;\n\n    // New greys palette used by next-gen form elements\n    gray98: string;\n    gray95: string;\n    gray85: string;\n    gray70: string;\n    gray60: string;\n    gray33: string;\n    gray25: string;\n    gray15: string;\n    gray10: string;\n    gray05: string;\n\n    // New blues palette used by next-gen form elements\n    blue95: string;\n    blue85: string;\n    blue80: string;\n    blue77: string;\n\n    // New reds palette used by next-gen form elements\n    red88: string;\n\n    // Accent colors\n    redBase: string;\n    redShade: string;\n    greenBase: string;\n    greenShade: string;\n    red: string;\n    yellow: string;\n    purple: string;\n    orange: string;\n    orangeDark: string;\n    queryRed: string;\n    queryGreen: string;\n    queryPurple: string;\n    queryOrange: string;\n    brandPrimary: string;\n    brandSuccess: string;\n    brandWarning: string;\n    brandDanger: string;\n\n    // Status colors\n    online: string;\n    warn: string;\n    critical: string;\n  };\n  colors: {\n    bg1: string;\n    bg2: string;\n    bg3: string;\n    border1: string;\n    border2: string;\n    border3: string;\n\n    bgBlue1: string;\n    bgBlue2: string;\n\n    dashboardBg: string;\n    bodyBg: string;\n    panelBg: string;\n    panelBorder: string;\n    pageHeaderBg: string;\n    pageHeaderBorder: string;\n\n    dropdownBg: string;\n    dropdownShadow: string;\n    dropdownOptionHoverBg: string;\n\n    // Link colors\n    link: string;\n    linkDisabled: string;\n    linkHover: string;\n    linkExternal: string;\n\n    // Text colors\n    textStrong: string;\n    textHeading: string;\n    text: string;\n    textSemiWeak: string;\n    textWeak: string;\n    textFaint: string;\n    textBlue: string;\n\n    // Next-gen forms functional colors\n    formLabel: string;\n    formDescription: string;\n    formInputBg: string;\n    formInputBgDisabled: string;\n    formInputBorder: string;\n    formInputBorderHover: string;\n    formInputBorderActive: string;\n    formInputBorderInvalid: string;\n    formFocusOutline: string;\n    formInputText: string;\n    formInputDisabledText: string;\n    formInputPlaceholderText: string;\n    formValidationMessageText: string;\n    formValidationMessageBg: string;\n    formSwitchBg: string;\n    formSwitchBgActive: string;\n    formSwitchBgActiveHover: string;\n    formSwitchBgHover: string;\n    formSwitchBgDisabled: string;\n    formSwitchDot: string;\n    formCheckboxBgChecked: string;\n    formCheckboxBgCheckedHover: string;\n    formCheckboxCheckmark: string;\n  };\n  shadows: {\n    listItem: string;\n  };\n}\n","var path = 'public/app/partials/error.html';\nvar html = \"<page-header model=navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n  <div class=\\\"panel-container error-container\\\">\\n    <div class=\\\"error-column graph-box\\\">\\n      <div class=error-row>\\n        <div class=\\\"error-column error-space-between graph-percentage\\\">\\n          <p>100%</p>\\n          <p>80%</p>\\n          <p>60%</p>\\n          <p>40%</p>\\n          <p>20%</p>\\n          <p>0%</p>\\n        </div>\\n        <div class=\\\"error-column image-box\\\">\\n          <img src=public/img/graph404.svg width=100% />\\n          <div class=\\\"error-row error-space-between\\\">\\n            <p class=graph-text>Then</p>\\n            <p class=graph-text>Now</p>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=\\\"error-column info-box\\\">\\n      <div class=\\\"error-row current-box\\\">\\n        <p class=current-text>current</p>\\n      </div>\\n      <div class=error-row style=flex:1>\\n        <icon name=\\\"'minus-circle'\\\" classname=error-minus></icon>\\n        <div class=\\\"error-column error-space-between error-full-width\\\">\\n          <div class=\\\"error-row error-space-between\\\">\\n            <p>Chances you are on the page you are looking for.</p>\\n            <p class=left-margin>0%</p>\\n          </div>\\n          <div>\\n            <h3>Sorry for the inconvenience</h3>\\n            <p>Please go back to your <a href={{appSubUrl}}/ class=error-link>home dashboard</a> and try again.</p>\\n            <p>\\n              If the error persists, seek help on the\\n              <a href=https://community.grafana.com target=_blank class=error-link>community site</a>.\\n            </p>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n    <span class=react-resizable-handle style=cursor:default></span>\\n  </div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/partials/edit_json.html';\nvar html = \"<div ng-controller=JsonEditorCtrl>\\n  <div class=tabbed-view-header>\\n    <h2 class=tabbed-view-title>\\n      JSON\\n    </h2>\\n\\n    <button class=tabbed-view-close-btn ng-click=dismiss()>\\n      <icon name=\\\"'times'\\\"></icon>\\n    </button>\\n  </div>\\n\\n  <div class=tabbed-view-body>\\n    <div class=gf-form>\\n      <code-editor content=json data-mode=json data-max-lines=20></code-editor>\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button type=button class=\\\"btn btn-primary\\\" ng-show=canUpdate ng-click=\\\"update(); dismiss();\\\">Update</button>\\n      <button class=\\\"btn btn-secondary\\\" ng-if=canCopy clipboard-button=getContentForClipboard()>\\n        Copy to Clipboard\\n      </button>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import angular from 'angular';\nimport _ from 'lodash';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { CoreEvents } from 'app/types';\n\nexport let iconMap: { [key: string]: string } = {\n  'external link': 'external-link-alt',\n  dashboard: 'apps',\n  question: 'question-circle',\n  info: 'info-circle',\n  bolt: 'bolt',\n  doc: 'file-alt',\n  cloud: 'cloud',\n};\n\nexport class DashLinksEditorCtrl {\n  dashboard: DashboardModel;\n  iconMap: any;\n  mode: any;\n  link: any;\n\n  emptyListCta = {\n    title: 'There are no dashboard links added yet',\n    buttonIcon: 'link',\n    buttonTitle: 'Add Dashboard Link',\n    infoBox: {\n      __html: `<p>\n      Dashboard Links allow you to place links to other dashboards and web sites directly below the dashboard\n      header.\n    </p>`,\n    },\n    infoBoxTitle: 'What are Dashboard Links?',\n  };\n\n  /** @ngInject */\n  constructor($scope: any, $rootScope: GrafanaRootScope) {\n    this.iconMap = iconMap;\n    this.dashboard.links = this.dashboard.links || [];\n    this.mode = 'list';\n\n    $scope.$on('$destroy', () => {\n      $rootScope.appEvent(CoreEvents.dashLinksUpdated);\n    });\n  }\n\n  backToList() {\n    this.mode = 'list';\n  }\n\n  setupNew = () => {\n    this.mode = 'new';\n    this.link = { type: 'dashboards', icon: 'external link' };\n  };\n\n  addLink() {\n    this.dashboard.links.push(this.link);\n    this.mode = 'list';\n    this.dashboard.updateSubmenuVisibility();\n  }\n\n  editLink(link: any) {\n    this.link = link;\n    this.mode = 'edit';\n  }\n\n  saveLink() {\n    this.backToList();\n  }\n\n  moveLink(index: string | number, dir: string | number) {\n    // @ts-ignore\n    _.move(this.dashboard.links, index, index + dir);\n  }\n\n  deleteLink(index: number) {\n    this.dashboard.links.splice(index, 1);\n    this.dashboard.updateSubmenuVisibility();\n  }\n}\n\nfunction dashLinksEditor() {\n  return {\n    restrict: 'E',\n    controller: DashLinksEditorCtrl,\n    templateUrl: 'public/app/features/dashboard/components/DashLinks/editor.html',\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      dashboard: '=',\n    },\n  };\n}\n\nangular.module('grafana.directives').directive('dashLinksEditor', dashLinksEditor);\n","import { AppNotification, AppNotificationSeverity, AppNotificationTimeout } from 'app/types';\nimport { getMessageFromError } from 'app/core/utils/errors';\n\nconst defaultSuccessNotification = {\n  title: '',\n  text: '',\n  severity: AppNotificationSeverity.Success,\n  icon: 'check',\n  timeout: AppNotificationTimeout.Success,\n};\n\nconst defaultWarningNotification = {\n  title: '',\n  text: '',\n  severity: AppNotificationSeverity.Warning,\n  icon: 'exclamation-triangle',\n  timeout: AppNotificationTimeout.Warning,\n};\n\nconst defaultErrorNotification = {\n  title: '',\n  text: '',\n  severity: AppNotificationSeverity.Error,\n  icon: 'exclamation-triangle',\n  timeout: AppNotificationTimeout.Error,\n};\n\nexport const createSuccessNotification = (title: string, text = ''): AppNotification => ({\n  ...defaultSuccessNotification,\n  title: title,\n  text: text,\n  id: Date.now(),\n});\n\nexport const createErrorNotification = (\n  title: string,\n  text: string | Error = '',\n  component?: React.ReactElement\n): AppNotification => {\n  return {\n    ...defaultErrorNotification,\n    text: getMessageFromError(text),\n    title,\n    id: Date.now(),\n    component,\n  };\n};\n\nexport const createWarningNotification = (title: string, text = ''): AppNotification => ({\n  ...defaultWarningNotification,\n  title: title,\n  text: text,\n  id: Date.now(),\n});\n","var path = 'public/app/features/profile/partials/profile.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n  <react-profile-wrapper></react-profile-wrapper>\\n\\n  <h3 class=page-heading>Sessions</h3>\\n  <div class=gf-form-group>\\n    <table class=\\\"filter-table form-inline\\\">\\n      <thead>\\n        <tr>\\n          <th>Last seen</th>\\n          <th>Logged on</th>\\n          <th>IP address</th>\\n          <th>Browser &amp; OS</th>\\n          <th></th>\\n        </tr>\\n      </thead>\\n      <tbody>\\n        <tr ng-repeat=\\\"session in ctrl.sessions\\\">\\n          <td ng-if=session.isActive>Now</td>\\n          <td ng-if=!session.isActive>{{ session.seenAt }}</td>\\n          <td>{{ session.createdAt }}</td>\\n          <td>{{ session.clientIp }}</td>\\n          <td>{{ session.browser }} on {{ session.os }} {{ session.osVersion }}</td>\\n          <td>\\n            <button class=\\\"btn btn-danger btn-small\\\" ng-click=ctrl.revokeUserSession(session.id)>\\n              <icon name=\\\"'power'\\\"></icon>\\n            </button>\\n          </td>\\n        </tr>\\n      </tbody>\\n    </table>\\n  </div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { User, Team } from 'app/types';\nimport { config } from 'app/core/config';\n\nexport interface UserAPI {\n  changePassword: (changePassword: ChangePasswordFields) => void;\n  updateUserProfile: (profile: ProfileUpdateFields) => void;\n  loadUser: () => void;\n  loadTeams: () => void;\n  loadOrgs: () => void;\n  setUserOrg: (org: UserOrg) => void;\n}\n\ninterface LoadingStates {\n  changePassword: boolean;\n  loadUser: boolean;\n  loadTeams: boolean;\n  loadOrgs: boolean;\n  updateUserProfile: boolean;\n  updateUserOrg: boolean;\n}\n\nexport interface ChangePasswordFields {\n  oldPassword: string;\n  newPassword: string;\n  confirmNew: string;\n}\n\nexport interface ProfileUpdateFields {\n  name: string;\n  email: string;\n  login: string;\n}\n\nexport interface UserOrg {\n  orgId: number;\n  name: string;\n  role: string;\n}\n\nexport interface Props {\n  userId?: number; // passed, will load user on mount\n  children: (api: UserAPI, states: LoadingStates, teams: Team[], orgs: UserOrg[], user?: User) => JSX.Element;\n}\n\nexport interface State {\n  user?: User;\n  teams: Team[];\n  orgs: UserOrg[];\n  loadingStates: LoadingStates;\n}\n\nexport class UserProvider extends PureComponent<Props, State> {\n  state: State = {\n    teams: [] as Team[],\n    orgs: [] as UserOrg[],\n    loadingStates: {\n      changePassword: false,\n      loadUser: true,\n      loadTeams: false,\n      loadOrgs: false,\n      updateUserProfile: false,\n      updateUserOrg: false,\n    },\n  };\n\n  componentWillMount() {\n    if (this.props.userId) {\n      this.loadUser();\n    }\n  }\n\n  changePassword = async (payload: ChangePasswordFields) => {\n    this.setState({ loadingStates: { ...this.state.loadingStates, changePassword: true } });\n    await getBackendSrv().put('/api/user/password', payload);\n    this.setState({ loadingStates: { ...this.state.loadingStates, changePassword: false } });\n  };\n\n  loadUser = async () => {\n    this.setState({\n      loadingStates: { ...this.state.loadingStates, loadUser: true },\n    });\n    const user = await getBackendSrv().get('/api/user');\n    this.setState({ user, loadingStates: { ...this.state.loadingStates, loadUser: Object.keys(user).length === 0 } });\n  };\n\n  loadTeams = async () => {\n    this.setState({\n      loadingStates: { ...this.state.loadingStates, loadTeams: true },\n    });\n    const teams = await getBackendSrv().get('/api/user/teams');\n    this.setState({ teams, loadingStates: { ...this.state.loadingStates, loadTeams: false } });\n  };\n\n  loadOrgs = async () => {\n    this.setState({\n      loadingStates: { ...this.state.loadingStates, loadOrgs: true },\n    });\n    const orgs = await getBackendSrv().get('/api/user/orgs');\n    this.setState({ orgs, loadingStates: { ...this.state.loadingStates, loadOrgs: false } });\n  };\n\n  setUserOrg = async (org: UserOrg) => {\n    this.setState({\n      loadingStates: { ...this.state.loadingStates, updateUserOrg: true },\n    });\n    await getBackendSrv()\n      .post('/api/user/using/' + org.orgId, {})\n      .then(() => {\n        window.location.href = config.appSubUrl + '/profile';\n      })\n      .finally(() => {\n        this.setState({ loadingStates: { ...this.state.loadingStates, updateUserOrg: false } });\n      });\n  };\n\n  updateUserProfile = async (payload: ProfileUpdateFields) => {\n    this.setState({ loadingStates: { ...this.state.loadingStates, updateUserProfile: true } });\n    await getBackendSrv()\n      .put('/api/user', payload)\n      .then(() => {\n        this.loadUser();\n      })\n      .catch(e => console.log(e))\n      .finally(() => {\n        this.setState({ loadingStates: { ...this.state.loadingStates, updateUserProfile: false } });\n      });\n  };\n\n  render() {\n    const { children } = this.props;\n    const { loadingStates, teams, orgs, user } = this.state;\n\n    const api = {\n      changePassword: this.changePassword,\n      loadUser: this.loadUser,\n      loadTeams: this.loadTeams,\n      loadOrgs: this.loadOrgs,\n      updateUserProfile: this.updateUserProfile,\n      setUserOrg: this.setUserOrg,\n    };\n\n    return <>{children(api, loadingStates, teams, orgs, user)}</>;\n  }\n}\n\nexport default UserProvider;\n","import React from 'react';\nimport { useTheme, stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { Icon } from '../Icon/Icon';\n\nexport interface FieldValidationMessageProps {\n  children: string;\n  className?: string;\n}\n\nexport const getFieldValidationMessageStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    fieldValidationMessage: css`\n      font-size: ${theme.typography.size.sm};\n      font-weight: ${theme.typography.weight.semibold};\n      margin: ${theme.spacing.formValidationMessageMargin};\n      padding: ${theme.spacing.formValidationMessagePadding};\n      color: ${theme.colors.formValidationMessageText};\n      background: ${theme.colors.formValidationMessageBg};\n      border-radius: ${theme.border.radius.sm};\n      position: relative;\n      display: inline-block;\n\n      &:before {\n        content: '';\n        position: absolute;\n        left: 9px;\n        top: -4px;\n        width: 0;\n        height: 0;\n        border-left: 4px solid transparent;\n        border-right: 4px solid transparent;\n        border-bottom: 4px solid ${theme.colors.formValidationMessageBg};\n      }\n    `,\n    fieldValidationMessageIcon: css`\n      margin-right: ${theme.spacing.formSpacingBase}px;\n    `,\n  };\n});\n\nexport const FieldValidationMessage: React.FC<FieldValidationMessageProps> = ({ children, className }) => {\n  const theme = useTheme();\n  const styles = getFieldValidationMessageStyles(theme);\n\n  return (\n    <div className={cx(styles.fieldValidationMessage, className)}>\n      <Icon className={styles.fieldValidationMessageIcon} name=\"exclamation-triangle\" />\n      {children}\n    </div>\n  );\n};\n","var path = 'public/app/plugins/datasource/elasticsearch/partials/pipeline_variables.html';\nvar html = \"<div ng-repeat=\\\"var in variables\\\">\\n  <div class=\\\"gf-form offset-width-7\\\" ng-if=\\\"$index === 0\\\">\\n    <label class=\\\"gf-form-label width-10\\\">Variables</label>\\n    <input type=text class=\\\"gf-form-input max-width-12\\\" ng-model=var.name placeholder=\\\"Variable name\\\" ng-blur=onChangeInternal() spellcheck=false />\\n    <metric-segment-model property=var.pipelineAgg options=options on-change=onChangeInternal() custom=false css-class=width-12></metric-segment-model>\\n    <label class=gf-form-label>\\n      <a class=pointer ng-click=remove($index)><icon name=\\\"'minus'\\\"></icon></a>\\n    </label>\\n    <label class=gf-form-label>\\n      <a class=pointer ng-click=add()><icon name=\\\"'plus'\\\"></icon></a>\\n    </label>\\n  </div>\\n  <div class=\\\"gf-form offset-width-17\\\" ng-if=\\\"$index !== 0\\\">\\n    <input type=text class=\\\"gf-form-input max-width-12\\\" ng-model=var.name placeholder=\\\"Variable name\\\" ng-blur=onChangeInternal() spellcheck=false />\\n    <metric-segment-model property=var.pipelineAgg options=options on-change=onChangeInternal() custom=false css-class=width-12></metric-segment-model>\\n    <label class=gf-form-label>\\n      <a class=pointer ng-click=remove($index)><icon name=\\\"'minus'\\\"></icon></a>\\n    </label>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { DashboardQuery, SearchAction, SearchLayout } from '../types';\nimport {\n  ADD_TAG,\n  CLEAR_FILTERS,\n  LAYOUT_CHANGE,\n  QUERY_CHANGE,\n  REMOVE_STARRED,\n  REMOVE_TAG,\n  SET_TAGS,\n  TOGGLE_SORT,\n  TOGGLE_STARRED,\n} from './actionTypes';\n\nexport const defaultQuery: DashboardQuery = {\n  query: '',\n  tag: [],\n  starred: false,\n  skipRecent: false,\n  skipStarred: false,\n  folderIds: [],\n  sort: null,\n  layout: SearchLayout.Folders,\n};\n\nexport const queryReducer = (state: DashboardQuery, action: SearchAction) => {\n  switch (action.type) {\n    case QUERY_CHANGE:\n      return { ...state, query: action.payload };\n    case REMOVE_TAG:\n      return { ...state, tag: state.tag.filter(t => t !== action.payload) };\n    case SET_TAGS:\n      return { ...state, tag: action.payload };\n    case ADD_TAG: {\n      const tag = action.payload;\n      return tag && !state.tag.includes(tag) ? { ...state, tag: [...state.tag, tag] } : state;\n    }\n    case TOGGLE_STARRED:\n      return { ...state, starred: action.payload };\n    case REMOVE_STARRED:\n      return { ...state, starred: false };\n    case CLEAR_FILTERS:\n      return { ...state, query: '', tag: [], starred: false, sort: null };\n    case TOGGLE_SORT: {\n      const sort = action.payload;\n      if (state.layout === SearchLayout.Folders) {\n        return { ...state, sort, layout: SearchLayout.List };\n      }\n      return { ...state, sort };\n    }\n    case LAYOUT_CHANGE: {\n      const layout = action.payload;\n      if (state.sort && layout === SearchLayout.Folders) {\n        return { ...state, layout, sort: null };\n      }\n      return { ...state, layout };\n    }\n    default:\n      return state;\n  }\n};\n","import { FormEvent, useReducer } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { defaultQuery, queryReducer } from '../reducers/searchQueryReducer';\nimport {\n  ADD_TAG,\n  CLEAR_FILTERS,\n  LAYOUT_CHANGE,\n  QUERY_CHANGE,\n  SET_TAGS,\n  TOGGLE_SORT,\n  TOGGLE_STARRED,\n} from '../reducers/actionTypes';\nimport { DashboardQuery, SearchLayout } from '../types';\nimport { hasFilters } from '../utils';\n\nexport const useSearchQuery = (queryParams: Partial<DashboardQuery>) => {\n  const initialState = { ...defaultQuery, ...queryParams };\n  const [query, dispatch] = useReducer(queryReducer, initialState);\n\n  const onQueryChange = (query: string) => {\n    dispatch({ type: QUERY_CHANGE, payload: query });\n  };\n\n  const onTagFilterChange = (tags: string[]) => {\n    dispatch({ type: SET_TAGS, payload: tags });\n  };\n\n  const onTagAdd = (tag: string) => {\n    dispatch({ type: ADD_TAG, payload: tag });\n  };\n\n  const onClearFilters = () => {\n    dispatch({ type: CLEAR_FILTERS });\n  };\n\n  const onStarredFilterChange = (e: FormEvent<HTMLInputElement>) => {\n    dispatch({ type: TOGGLE_STARRED, payload: (e.target as HTMLInputElement).checked });\n  };\n\n  const onSortChange = (sort: SelectableValue | null) => {\n    dispatch({ type: TOGGLE_SORT, payload: sort });\n  };\n\n  const onLayoutChange = (layout: SearchLayout) => {\n    dispatch({ type: LAYOUT_CHANGE, payload: layout });\n  };\n\n  return {\n    query,\n    hasFilters: hasFilters(query),\n    onQueryChange,\n    onClearFilters,\n    onTagFilterChange,\n    onStarredFilterChange,\n    onTagAdd,\n    onSortChange,\n    onLayoutChange,\n  };\n};\n","import { Vector } from '../types';\nimport { vectorToArray } from './vectorToArray';\n\n/**\n * RowVector makes the row values look like a vector\n * @internal\n */\nexport class RowVector implements Vector {\n  constructor(private columns: Vector[]) {}\n\n  rowIndex = 0;\n\n  get length(): number {\n    return this.columns.length;\n  }\n\n  get(index: number): number {\n    return this.columns[index].get(this.rowIndex);\n  }\n\n  toArray(): number[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): number[] {\n    return vectorToArray(this);\n  }\n}\n","import { DataFrame, DataTransformerInfo, Vector, FieldType, Field, NullValueMode } from '../../types';\nimport { DataTransformerID } from './ids';\nimport { ReducerID, fieldReducers } from '../fieldReducer';\nimport { getFieldMatcher } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\nimport { RowVector } from '../../vector/RowVector';\nimport { ArrayVector, BinaryOperationVector, ConstantVector } from '../../vector';\nimport { doStandardCalcs } from '../fieldReducer';\nimport { getTimeField } from '../../dataframe/processDataFrame';\nimport defaults from 'lodash/defaults';\nimport { BinaryOperationID, binaryOperators } from '../../utils/binaryOperators';\nimport { ensureColumnsTransformer } from './ensureColumns';\nimport { getFieldDisplayName } from '../../field';\n\nexport enum CalculateFieldMode {\n  ReduceRow = 'reduceRow',\n  BinaryOperation = 'binary',\n}\n\nexport interface ReduceOptions {\n  include?: string[]; // Assume all fields\n  reducer: ReducerID;\n  nullValueMode?: NullValueMode;\n}\n\nexport interface BinaryOptions {\n  left: string;\n  operator: BinaryOperationID;\n  right: string;\n}\n\nconst defaultReduceOptions: ReduceOptions = {\n  reducer: ReducerID.sum,\n};\n\nconst defaultBinaryOptions: BinaryOptions = {\n  left: '',\n  operator: BinaryOperationID.Add,\n  right: '',\n};\n\nexport interface CalculateFieldTransformerOptions {\n  // True/False or auto\n  timeSeries?: boolean;\n  mode: CalculateFieldMode; // defaults to 'reduce'\n\n  // Only one should be filled\n  reduce?: ReduceOptions;\n  binary?: BinaryOptions;\n\n  // Remove other fields\n  replaceFields?: boolean;\n\n  // Output field properties\n  alias?: string; // The output field name\n  // TODO: config?: FieldConfig; or maybe field overrides? since the UI exists\n}\n\ntype ValuesCreator = (data: DataFrame) => Vector;\n\nexport const calculateFieldTransformer: DataTransformerInfo<CalculateFieldTransformerOptions> = {\n  id: DataTransformerID.calculateField,\n  name: 'Add field from calculation',\n  description: 'Use the row values to calculate a new field',\n  defaultOptions: {\n    mode: CalculateFieldMode.ReduceRow,\n    reduce: {\n      reducer: ReducerID.sum,\n    },\n  },\n  transformer: options => (data: DataFrame[]) => {\n    if (options && options.timeSeries !== false) {\n      data = ensureColumnsTransformer.transformer(null)(data);\n    }\n\n    const mode = options.mode ?? CalculateFieldMode.ReduceRow;\n    let creator: ValuesCreator | undefined = undefined;\n\n    if (mode === CalculateFieldMode.ReduceRow) {\n      creator = getReduceRowCreator(defaults(options.reduce, defaultReduceOptions), data);\n    } else if (mode === CalculateFieldMode.BinaryOperation) {\n      creator = getBinaryCreator(defaults(options.binary, defaultBinaryOptions), data);\n    }\n\n    // Nothing configured\n    if (!creator) {\n      return data;\n    }\n\n    return data.map(frame => {\n      // delegate field creation to the specific function\n      const values = creator!(frame);\n      if (!values) {\n        return frame;\n      }\n\n      const field = {\n        name: getNameFromOptions(options),\n        type: FieldType.number,\n        config: {},\n        values,\n      };\n      let fields: Field[] = [];\n\n      // Replace all fields with the single field\n      if (options.replaceFields) {\n        const { timeField } = getTimeField(frame);\n        if (timeField && options.timeSeries !== false) {\n          fields = [timeField, field];\n        } else {\n          fields = [field];\n        }\n      } else {\n        fields = [...frame.fields, field];\n      }\n      return {\n        ...frame,\n        fields,\n      };\n    });\n  },\n};\n\nfunction getReduceRowCreator(options: ReduceOptions, allFrames: DataFrame[]): ValuesCreator {\n  let matcher = getFieldMatcher({\n    id: FieldMatcherID.numeric,\n  });\n\n  if (options.include && options.include.length) {\n    matcher = getFieldMatcher({\n      id: FieldMatcherID.byNames,\n      options: options.include,\n    });\n  }\n\n  const info = fieldReducers.get(options.reducer);\n\n  if (!info) {\n    throw new Error(`Unknown reducer: ${options.reducer}`);\n  }\n\n  const reducer = info.reduce ?? doStandardCalcs;\n  const ignoreNulls = options.nullValueMode === NullValueMode.Ignore;\n  const nullAsZero = options.nullValueMode === NullValueMode.AsZero;\n\n  return (frame: DataFrame) => {\n    // Find the columns that should be examined\n    const columns: Vector[] = [];\n    for (const field of frame.fields) {\n      if (matcher(field, frame, allFrames)) {\n        columns.push(field.values);\n      }\n    }\n\n    // Prepare a \"fake\" field for the row\n    const iter = new RowVector(columns);\n    const row: Field = {\n      name: 'temp',\n      values: iter,\n      type: FieldType.number,\n      config: {},\n    };\n    const vals: number[] = [];\n\n    for (let i = 0; i < frame.length; i++) {\n      iter.rowIndex = i;\n      const val = reducer(row, ignoreNulls, nullAsZero)[options.reducer];\n      vals.push(val);\n    }\n\n    return new ArrayVector(vals);\n  };\n}\n\nfunction findFieldValuesWithNameOrConstant(frame: DataFrame, name: string, allFrames: DataFrame[]): Vector | undefined {\n  if (!name) {\n    return undefined;\n  }\n\n  for (const f of frame.fields) {\n    if (name === getFieldDisplayName(f, frame, allFrames)) {\n      return f.values;\n    }\n  }\n\n  const v = parseFloat(name);\n  if (!isNaN(v)) {\n    return new ConstantVector(v, frame.length);\n  }\n\n  return undefined;\n}\n\nfunction getBinaryCreator(options: BinaryOptions, allFrames: DataFrame[]): ValuesCreator {\n  const operator = binaryOperators.getIfExists(options.operator);\n\n  return (frame: DataFrame) => {\n    const left = findFieldValuesWithNameOrConstant(frame, options.left, allFrames);\n    const right = findFieldValuesWithNameOrConstant(frame, options.right, allFrames);\n    if (!left || !right || !operator) {\n      return (undefined as unknown) as Vector;\n    }\n\n    return new BinaryOperationVector(left, right, operator.operation);\n  };\n}\n\nexport function getNameFromOptions(options: CalculateFieldTransformerOptions) {\n  if (options.alias?.length) {\n    return options.alias;\n  }\n\n  if (options.mode === CalculateFieldMode.BinaryOperation) {\n    const { binary } = options;\n    return `${binary?.left ?? ''} ${binary?.operator ?? ''} ${binary?.right ?? ''}`;\n  }\n\n  if (options.mode === CalculateFieldMode.ReduceRow) {\n    const r = fieldReducers.getIfExists(options.reduce?.reducer);\n    if (r) {\n      return r.name;\n    }\n  }\n\n  return 'math';\n}\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Apps: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width={size} height={size} {...rest}>\n      <rect width=\"9\" height=\"9\" x=\"2\" y=\"2\" rx=\"1\" />\n      <rect width=\"9\" height=\"9\" x=\"2\" y=\"13\" rx=\"1\" opacity=\"0.6\" />\n      <rect width=\"9\" height=\"9\" x=\"13\" y=\"2\" rx=\"1\" opacity=\"0.6\" />\n      <rect width=\"9\" height=\"9\" x=\"13\" y=\"13\" rx=\"1\" opacity=\"0.6\" />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Cog: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width={size} height={size} {...rest}>\n      <path d=\"M21.31641,9.55176l-1.88672-.62891.88965-1.77832a.99983.99983,0,0,0-.1875-1.1543L18.01025,3.86816a.99981.99981,0,0,0-1.15429-.1875l-1.77832.88965-.62891-1.88672A1,1,0,0,0,13.5,2h-3a1,1,0,0,0-.94873.68359L8.92236,4.57031,7.144,3.68066a.99634.99634,0,0,0-1.15429.1875L3.86816,5.99023a.99983.99983,0,0,0-.1875,1.1543l.88965,1.77832-1.88672.62891A.9989.9989,0,0,0,2,10.5v3a.9989.9989,0,0,0,.68359.94824l1.88672.62891-.88965,1.77832a.99983.99983,0,0,0,.1875,1.1543l2.12159,2.12207a.99813.99813,0,0,0,1.15429.1875l1.77832-.88965.62891,1.88672A1,1,0,0,0,10.5,22h3a1,1,0,0,0,.94873-.68359l.62891-1.88672,1.77832.88965a.99994.99994,0,0,0,1.15429-.1875l2.12159-2.12207a.99983.99983,0,0,0,.1875-1.1543l-.88916-1.77832,1.88623-.62891A.9989.9989,0,0,0,22,13.5v-3A.9989.9989,0,0,0,21.31641,9.55176ZM12,15a3,3,0,1,1,3-3A3.00344,3.00344,0,0,1,12,15Z\" />\n      <path\n        opacity=\"0.6\"\n        d=\"M12,16a4,4,0,1,1,4-4A4.00427,4.00427,0,0,1,12,16Zm0-6a2,2,0,1,0,2,2A2.00229,2.00229,0,0,0,12,10Z\"\n      />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Shield: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width={size} height={size} {...rest}>\n      <path d=\"M12,22a.9986.9986,0,0,1-.581-.18652l-3.6504-2.60743A9.01643,9.01643,0,0,1,4,11.88281v-7.457a1.00039,1.00039,0,0,1,1.20605-.97851,8.00088,8.00088,0,0,0,6.22168-1.26758.99888.99888,0,0,1,1.14454,0A7.9976,7.9976,0,0,0,18.794,3.44727,1.00039,1.00039,0,0,1,20,4.42578v7.457a9.01643,9.01643,0,0,1-3.76855,7.32324l-3.6504,2.60743A.9986.9986,0,0,1,12,22Z\" />\n      <path\n        opacity=\"0.6\"\n        d=\"M10.84961,14.7002h0a.99927.99927,0,0,1-.707-.293L8.543,12.80664A.99989.99989,0,0,1,9.957,11.39258l.89258.89355L13.543,9.59277A.99989.99989,0,1,1,14.957,11.00684l-3.40039,3.40039A.99928.99928,0,0,1,10.84961,14.7002Z\"\n      />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Favorite: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width={size} height={size} {...rest}>\n      <path d=\"M17.56249,21.55957a.99941.99941,0,0,1-.46581-.11523L12,18.76465,6.90332,21.44434a.9999.9999,0,0,1-1.45117-1.05372l.97363-5.67578-4.124-4.01953a.99965.99965,0,0,1,.55469-1.70508l5.69824-.82812,2.54883-5.16406a1.04012,1.04012,0,0,1,1.793,0l2.54883,5.16406,5.69824.82812a.99965.99965,0,0,1,.55469,1.70508l-4.124,4.01953.97363,5.67578a1.00024,1.00024,0,0,1-.98536,1.169Z\" />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Grafana: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 85.12 92.46\" height={size} width={size} {...rest}>\n      <defs>\n        <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"42.562\" y1=\"113.2595\" x2=\"42.562\" y2=\"28.7828\">\n          <stop offset=\"0\" style={{ stopColor: '#FFF200' }} />\n          <stop offset=\"1\" style={{ stopColor: '#F15A29' }} />\n        </linearGradient>\n      </defs>\n      <path\n        fill=\"url(#SVGID_1_)\"\n        d=\"M85.01,40.8c-0.14-1.55-0.41-3.35-0.93-5.32c-0.51-1.97-1.28-4.13-2.39-6.37c-1.12-2.24-2.57-4.57-4.47-6.82\n    c-0.74-0.88-1.54-1.76-2.42-2.6c1.3-5.17-1.59-9.65-1.59-9.65c-4.98-0.31-8.14,1.54-9.31,2.39c-0.2-0.08-0.39-0.17-0.59-0.25\n    c-0.85-0.34-1.72-0.66-2.61-0.95c-0.89-0.28-1.81-0.54-2.74-0.76c-0.94-0.22-1.89-0.4-2.86-0.55c-0.17-0.03-0.34-0.05-0.51-0.07\n    C52.41,2.9,46.18,0,46.18,0c-6.95,4.41-8.27,10.57-8.27,10.57s-0.03,0.14-0.07,0.36c-0.38,0.11-0.77,0.22-1.15,0.34\n    c-0.53,0.16-1.06,0.36-1.59,0.55c-0.53,0.21-1.06,0.41-1.58,0.64c-1.05,0.45-2.09,0.96-3.1,1.53c-0.99,0.55-1.95,1.16-2.9,1.82\n    c-0.14-0.06-0.24-0.11-0.24-0.11c-9.62-3.68-18.17,0.75-18.17,0.75c-0.78,10.24,3.84,16.68,4.76,17.86\n    c-0.23,0.63-0.44,1.27-0.64,1.92c-0.71,2.32-1.24,4.7-1.57,7.16c-0.05,0.35-0.09,0.71-0.13,1.07C2.63,48.84,0,57.84,0,57.84\n    c7.42,8.53,16.07,9.06,16.07,9.06c0.01-0.01,0.02-0.01,0.02-0.02c1.1,1.96,2.37,3.83,3.8,5.57c0.6,0.73,1.23,1.43,1.88,2.11\n    c-2.71,7.74,0.38,14.18,0.38,14.18c8.26,0.31,13.69-3.61,14.83-4.52c0.82,0.28,1.66,0.53,2.5,0.74c2.54,0.65,5.14,1.04,7.74,1.15\n    c0.65,0.03,1.3,0.04,1.95,0.04l0.31,0l0.21-0.01l0.41-0.01l0.4-0.02l0.01,0.01c3.89,5.55,10.74,6.34,10.74,6.34\n    c4.87-5.13,5.15-10.22,5.15-11.33l0,0c0,0,0-0.04,0-0.07c0-0.09,0-0.15,0-0.15s0,0,0,0c0-0.08-0.01-0.15-0.01-0.23\n    c1.02-0.72,2-1.49,2.92-2.31c1.95-1.76,3.65-3.77,5.06-5.93c0.13-0.2,0.26-0.41,0.39-0.62c5.51,0.32,9.39-3.41,9.39-3.41\n    c-0.91-5.74-4.18-8.54-4.87-9.07l0,0c0,0-0.03-0.02-0.07-0.05c-0.04-0.03-0.06-0.05-0.06-0.05l0,0c-0.04-0.02-0.08-0.05-0.12-0.08\n    c0.03-0.35,0.06-0.69,0.08-1.04c0.04-0.62,0.06-1.24,0.06-1.85l0-0.46l0-0.23l0-0.12c0-0.16,0-0.1,0-0.16l-0.02-0.38l-0.03-0.52\n    c-0.01-0.18-0.02-0.34-0.04-0.5c-0.01-0.16-0.03-0.32-0.05-0.48l-0.06-0.48l-0.07-0.47c-0.09-0.63-0.21-1.26-0.36-1.88\n    c-0.58-2.47-1.54-4.82-2.82-6.93c-1.28-2.11-2.86-3.98-4.65-5.56c-1.79-1.58-3.79-2.85-5.9-3.79c-2.1-0.95-4.31-1.55-6.51-1.83\n    c-1.1-0.14-2.2-0.2-3.28-0.19l-0.41,0.01l-0.1,0c-0.03,0-0.15,0-0.14,0l-0.17,0.01l-0.4,0.03c-0.15,0.01-0.31,0.02-0.45,0.04\n    c-0.56,0.05-1.11,0.13-1.66,0.23c-2.18,0.41-4.24,1.2-6.06,2.28c-1.82,1.09-3.39,2.45-4.68,3.98c-1.28,1.54-2.28,3.24-2.96,5\n    c-0.69,1.76-1.07,3.58-1.18,5.35c-0.03,0.44-0.04,0.88-0.03,1.32c0,0.11,0,0.22,0.01,0.33l0.01,0.35c0.02,0.21,0.03,0.42,0.05,0.63\n    c0.09,0.9,0.25,1.75,0.49,2.58c0.48,1.66,1.25,3.15,2.2,4.43c0.95,1.28,2.08,2.33,3.28,3.15c1.2,0.82,2.49,1.41,3.76,1.79\n    c1.27,0.38,2.54,0.54,3.74,0.53c0.15,0,0.3,0,0.44-0.01c0.08,0,0.16-0.01,0.24-0.01c0.08,0,0.16-0.01,0.24-0.01\n    c0.13-0.01,0.25-0.03,0.38-0.04c0.03,0,0.07-0.01,0.11-0.01l0.12-0.02c0.08-0.01,0.15-0.02,0.23-0.03c0.16-0.02,0.29-0.05,0.43-0.08\n    c0.14-0.03,0.28-0.05,0.42-0.09c0.27-0.06,0.54-0.14,0.8-0.22c0.52-0.17,1.01-0.38,1.46-0.61c0.45-0.23,0.87-0.5,1.26-0.77\n    c0.11-0.08,0.22-0.16,0.33-0.25c0.42-0.33,0.48-0.94,0.15-1.35c-0.29-0.36-0.79-0.45-1.19-0.23c-0.1,0.05-0.2,0.11-0.3,0.16\n    c-0.35,0.17-0.71,0.32-1.09,0.45c-0.39,0.12-0.79,0.22-1.2,0.29c-0.21,0.03-0.42,0.06-0.63,0.08c-0.11,0.01-0.21,0.02-0.32,0.02\n    c-0.11,0-0.22,0.01-0.32,0.01c-0.1,0-0.21,0-0.31-0.01c-0.13-0.01-0.26-0.01-0.39-0.02c0,0-0.07,0-0.01,0l-0.04,0L51.4,61.6\n    c-0.06-0.01-0.12-0.01-0.17-0.02c-0.12-0.01-0.23-0.03-0.35-0.04c-0.93-0.13-1.88-0.4-2.79-0.82c-0.91-0.41-1.79-0.98-2.57-1.69\n    c-0.79-0.71-1.48-1.56-2.01-2.52c-0.54-0.96-0.92-2.03-1.09-3.16c-0.09-0.56-0.13-1.14-0.11-1.71c0.01-0.16,0.01-0.31,0.02-0.47\n    c0,0.04,0-0.02,0-0.03l0-0.06l0.01-0.12c0.01-0.08,0.01-0.15,0.02-0.23c0.03-0.31,0.08-0.62,0.13-0.92\n    c0.43-2.45,1.65-4.83,3.55-6.65c0.47-0.45,0.98-0.87,1.53-1.25c0.55-0.37,1.12-0.7,1.73-0.98c0.6-0.28,1.23-0.5,1.88-0.68\n    c0.65-0.17,1.31-0.29,1.98-0.35c0.34-0.03,0.67-0.04,1.01-0.04c0.09,0,0.16,0,0.23,0l0.27,0.01l0.17,0.01c0.07,0,0,0,0.03,0l0.07,0\n    l0.27,0.02c0.73,0.06,1.46,0.16,2.17,0.32c1.43,0.32,2.83,0.85,4.13,1.57c2.6,1.44,4.81,3.69,6.17,6.4c0.69,1.35,1.16,2.81,1.4,4.31\n    c0.06,0.38,0.1,0.76,0.13,1.14l0.02,0.29l0.01,0.29c0.01,0.1,0.01,0.19,0.01,0.29c0,0.09,0.01,0.2,0,0.27l0,0.25l-0.01,0.28\n    c-0.01,0.19-0.02,0.49-0.03,0.67c-0.03,0.42-0.07,0.83-0.12,1.24c-0.05,0.41-0.12,0.82-0.19,1.22c-0.08,0.4-0.17,0.81-0.27,1.21\n    c-0.2,0.8-0.46,1.59-0.76,2.36c-0.61,1.54-1.42,3-2.4,4.36c-1.96,2.7-4.64,4.9-7.69,6.29c-1.52,0.69-3.13,1.19-4.78,1.47\n    c-0.82,0.14-1.66,0.22-2.5,0.25l-0.15,0.01l-0.13,0l-0.27,0l-0.41,0l-0.21,0c0.11,0-0.02,0-0.01,0l-0.08,0\n    c-0.45-0.01-0.9-0.03-1.34-0.07c-1.79-0.13-3.55-0.45-5.27-0.95c-1.71-0.49-3.38-1.16-4.95-2c-3.14-1.68-5.95-3.98-8.15-6.76\n    c-1.11-1.38-2.07-2.87-2.87-4.43c-0.8-1.56-1.42-3.2-1.89-4.88c-0.46-1.68-0.75-3.39-0.86-5.12l-0.02-0.32l-0.01-0.08l0-0.07l0-0.14\n    l-0.01-0.28l0-0.07l0-0.1l0-0.2l-0.01-0.4l0-0.08c0,0.01,0,0.01,0-0.03l0-0.16c0-0.21,0.01-0.42,0.01-0.63\n    c0.03-0.85,0.1-1.73,0.21-2.61c0.11-0.88,0.26-1.76,0.44-2.63c0.18-0.87,0.39-1.74,0.64-2.59c0.49-1.71,1.1-3.36,1.82-4.92\n    c1.44-3.12,3.34-5.88,5.61-8.09c0.57-0.55,1.16-1.08,1.77-1.57c0.61-0.49,1.25-0.95,1.9-1.37c0.65-0.43,1.32-0.82,2.02-1.18\n    c0.34-0.19,0.7-0.35,1.05-0.52c0.18-0.08,0.36-0.16,0.53-0.24c0.18-0.08,0.36-0.16,0.54-0.23c0.72-0.3,1.46-0.56,2.21-0.8\n    c0.19-0.06,0.38-0.11,0.56-0.17c0.19-0.06,0.38-0.1,0.57-0.16c0.38-0.11,0.76-0.2,1.14-0.29c0.19-0.05,0.39-0.08,0.58-0.13\n    c0.19-0.04,0.38-0.08,0.58-0.12c0.19-0.04,0.39-0.07,0.58-0.11l0.29-0.05l0.29-0.04c0.2-0.03,0.39-0.06,0.59-0.09\n    c0.22-0.04,0.44-0.05,0.66-0.09c0.18-0.02,0.48-0.06,0.65-0.08c0.14-0.01,0.28-0.03,0.41-0.04l0.28-0.03l0.14-0.01l0.16-0.01\n    c0.22-0.01,0.44-0.03,0.66-0.04l0.33-0.02c0,0,0.12,0,0.02,0l0.07,0l0.14-0.01c0.19-0.01,0.38-0.02,0.56-0.03\n    c0.75-0.02,1.5-0.02,2.24,0c1.48,0.06,2.93,0.22,4.34,0.48c2.82,0.53,5.49,1.43,7.89,2.62c2.41,1.18,4.57,2.63,6.44,4.2\n    c0.12,0.1,0.23,0.2,0.35,0.3c0.11,0.1,0.23,0.2,0.34,0.3c0.23,0.2,0.44,0.41,0.66,0.61c0.22,0.2,0.43,0.41,0.64,0.62\n    c0.2,0.21,0.41,0.41,0.61,0.63c0.8,0.84,1.53,1.69,2.19,2.55c1.33,1.71,2.39,3.44,3.24,5.07c0.05,0.1,0.11,0.2,0.16,0.3\n    c0.05,0.1,0.1,0.2,0.15,0.3c0.1,0.2,0.2,0.4,0.29,0.6c0.09,0.2,0.19,0.39,0.27,0.59c0.09,0.2,0.17,0.39,0.25,0.58\n    c0.32,0.76,0.61,1.49,0.84,2.18c0.39,1.11,0.67,2.11,0.89,2.98c0.09,0.35,0.42,0.58,0.78,0.55c0.37-0.03,0.66-0.34,0.66-0.71\n    C85.14,43.15,85.11,42.05,85.01,40.8z\"\n      />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Bell: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 24 24\"\n      viewBox=\"0 0 24 24\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <path\n        opacity=\"0.6\"\n        d=\"M18,13.18463V10c0-3.31372-2.68628-6-6-6s-6,2.68628-6,6v3.18463C4.83832,13.59863,4.00146,14.69641,4,16v2c0,0.00037,0,0.00073,0,0.00116C4.00031,18.5531,4.44806,19.00031,5,19h14c0.00037,0,0.00073,0,0.00116,0C19.5531,18.99969,20.00031,18.55194,20,18v-2C19.99854,14.69641,19.16168,13.59863,18,13.18463z\"\n      />\n      <path d=\"M8.14233 19c.4472 1.72119 1.99689 2.99817 3.85767 3 1.86078-.00183 3.41046-1.27881 3.85767-3H8.14233zM12 4c.34149 0 .67413.03516 1 .08997V3c0-.55231-.44769-1-1-1s-1 .44769-1 1v1.08997C11.32587 4.03516 11.65851 4 12 4z\" />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const PlusSquare: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 24 24\"\n      viewBox=\"0 0 24 24\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <path d=\"M17,11H13V7a1,1,0,0,0-2,0v4H7a1,1,0,0,0,0,2h4v4a1,1,0,0,0,2,0V13h4a1,1,0,0,0,0-2Z\" />\n      <path\n        opacity=\"0.6\"\n        d=\"M21,2H3A.99974.99974,0,0,0,2,3V21a.99974.99974,0,0,0,1,1H21a.99974.99974,0,0,0,1-1V3A.99974.99974,0,0,0,21,2ZM17,13H13v4a1,1,0,0,1-2,0V13H7a1,1,0,0,1,0-2h4V7a1,1,0,0,1,2,0v4h4a1,1,0,0,1,0,2Z\"\n      />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const FolderPlus: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 24 24\"\n      viewBox=\"0 0 24 24\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <path\n        opacity=\"0.6\"\n        d=\"M19,21.5H5a3.00328,3.00328,0,0,1-3-3V5.5a3.00328,3.00328,0,0,1,3-3H9.55859A2.99629,2.99629,0,0,1,12.4043,4.55078L12.7207,5.5H19a3.00328,3.00328,0,0,1,3,3v10A3.00328,3.00328,0,0,1,19,21.5Z\"\n      />\n      <path d=\"M14,12.5H13v-1a1,1,0,0,0-2,0v1H10a1,1,0,0,0,0,2h1v1a1,1,0,0,0,2,0v-1h1a1,1,0,0,0,0-2Z\" />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Folder: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width={size} height={size} {...rest}>\n      <path d=\"M19,21.5H5a3.00328,3.00328,0,0,1-3-3V5.5a3.00328,3.00328,0,0,1,3-3H9.55859A2.99629,2.99629,0,0,1,12.4043,4.55078L12.7207,5.5H19a3.00328,3.00328,0,0,1,3,3v10A3.00328,3.00328,0,0,1,19,21.5Z\" />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Import: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 24 24\"\n      viewBox=\"0 0 24 24\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <svg xmlns=\"http://www.w3.org/2000/svg\" enable-background=\"new 0 0 24 24\" viewBox=\"0 0 24 24\">\n        <path d=\"M19,22H5c-1.65611-0.00181-2.99819-1.34389-3-3v-4c0-0.55229,0.44772-1,1-1s1,0.44771,1,1v4c0.00037,0.55213,0.44787,0.99963,1,1h14c0.55213-0.00037,0.99963-0.44787,1-1v-4c0-0.55229,0.44772-1,1-1s1,0.44771,1,1v4C21.99819,20.65611,20.65611,21.99819,19,22z\" />\n        <path\n          opacity=\"0.6\"\n          d=\"M16.707,10.293c-0.39027-0.39048-1.02319-0.39065-1.41368-0.00038c-0.00013,0.00013-0.00026,0.00026-0.00038,0.00038L13,12.58594V3c0-0.55228-0.44771-1-1-1s-1,0.44772-1,1v9.58594L8.707,10.293c-0.39402-0.38691-1.02709-0.38116-1.414,0.01286c-0.38195,0.38896-0.38195,1.01218,0,1.40114l4,4c0.39028,0.39048,1.02321,0.39065,1.41369,0.00037c0.00012-0.00012,0.00025-0.00025,0.00037-0.00037l4-4c0.39045-0.3903,0.39058-1.02322,0.00028-1.41367C16.70723,10.29322,16.70712,10.29311,16.707,10.293z\"\n        />\n      </svg>\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const PanelAdd: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 117.8 64\"\n      viewBox=\"0 0 117.8 64\"\n      xmlSpace=\"preserve\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"96.4427\" y1=\"83.7013\" x2=\"96.4427\" y2=\"-9.4831\">\n        <stop offset=\"0\" style={{ stopColor: '#FFF23A' }} />\n        <stop offset=\"4.010540e-02\" style={{ stopColor: '#FEE62D' }} />\n        <stop offset=\"0.1171\" style={{ stopColor: '#FED41A' }} />\n        <stop offset=\"0.1964\" style={{ stopColor: '#FDC90F' }} />\n        <stop offset=\"0.2809\" style={{ stopColor: '#FDC60B' }} />\n        <stop offset=\"0.6685\" style={{ stopColor: '#F28F3F' }} />\n        <stop offset=\"0.8876\" style={{ stopColor: '#ED693C' }} />\n        <stop offset=\"1\" style={{ stopColor: '#E83E39' }} />\n      </linearGradient>\n      <path\n        d=\"M15.2,22.7H1.9c-1.1,0-1.9,0.9-1.9,1.9v37.5C0,63.2,0.9,64,1.9,64h13.3c1.1,0,1.9-0.9,1.9-1.9V24.6\n\t\tC17.1,23.5,16.3,22.7,15.2,22.7z\"\n      />\n      <path\n        d=\"M36.3,10.2H23c-1.1,0-1.9,0.9-1.9,1.9v50c0,1.1,0.9,1.9,1.9,1.9h13.3c1.1,0,1.9-0.9,1.9-1.9v-50\n\t\tC38.2,11.1,37.3,10.2,36.3,10.2z\"\n      />\n      <path\n        d=\"M57.3,32H44c-1.1,0-1.9,0.9-1.9,1.9v28.1c0,1.1,0.9,1.9,1.9,1.9h13.3c1.1,0,1.9-0.9,1.9-1.9V34\n\t\tC59.2,32.9,58.4,32,57.3,32z\"\n      />\n      <path\n        d=\"M70.1,38V26.1c0-3.4,2.7-6.1,6.1-6.1h4.1V2c0-1.1-0.9-1.9-1.9-1.9H65.1C64,0,63.1,0.9,63.1,2v60.1\n\t\tc0,1.1,0.9,1.9,1.9,1.9h13.3c1.1,0,1.9-0.9,1.9-1.9V44.1h-4.1C72.9,44.1,70.1,41.3,70.1,38z\"\n      />\n      <path\n        fill=\"url(#SVGID_1_)\"\n        d=\"M116.7,24.9h-7.2h-0.5h-5.4V11.8c0-0.6-0.5-1.1-1.1-1.1H90.5c-0.6,0-1.1,0.5-1.1,1.1v13.1h-9.1h-4.1\n\t\tc-0.6,0-1.1,0.5-1.1,1.1V38c0,0.6,0.5,1.1,1.1,1.1h4.1h9.1v4.6v1.9v6.7c0,0.6,0.5,1.1,1.1,1.1h11.9c0.6,0,1.1-0.5,1.1-1.1V39.1\n\t\th13.1c0.6,0,1.1-0.5,1.1-1.1V26.1C117.8,25.5,117.3,24.9,116.7,24.9z\"\n      />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const Circle: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 24 24\"\n      viewBox=\"0 0 24 24\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <circle cx=\"12\" cy=\"12\" r=\"10\" />\n    </svg>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { SvgProps } from './types';\n\nexport const SquareShape: FunctionComponent<SvgProps> = ({ size, ...rest }) => {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      enableBackground=\"new 0 0 24 24\"\n      viewBox=\"0 0 24 24\"\n      width={size}\n      height={size}\n      {...rest}\n    >\n      <rect width=\"85%\" height=\"85%\" x=\"2\" y=\"2\" rx=\"5\" />\n    </svg>\n  );\n};\n","import React from 'react';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme, toPascalCase } from '@grafana/data';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { IconName, IconType, IconSize } from '../../types/icon';\n//@ts-ignore\nimport * as DefaultIcon from '@iconscout/react-unicons';\nimport * as MonoIcon from './assets';\n\nconst alwaysMonoIcons = ['grafana', 'favorite'];\n\nexport interface IconProps extends React.HTMLAttributes<HTMLDivElement> {\n  name: IconName;\n  size?: IconSize;\n  type?: IconType;\n}\n\nconst getIconStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      display: inline-block;\n    `,\n    icon: css`\n      vertical-align: middle;\n      display: inline-block;\n      margin-bottom: ${theme.spacing.xxs};\n      fill: currentColor;\n    `,\n    orange: css`\n      fill: ${theme.palette.orange};\n    `,\n  };\n});\n\nexport const Icon = React.forwardRef<HTMLDivElement, IconProps>(\n  ({ size = 'md', type = 'default', name, className, style, ...divElementProps }, ref) => {\n    const theme = useTheme();\n    const styles = getIconStyles(theme);\n    const svgSize = getSvgSize(size);\n\n    /* Temporary solution to display also font awesome icons */\n    const isFontAwesome = name?.includes('fa-');\n    if (isFontAwesome) {\n      return <i className={cx(name, className)} {...divElementProps} style={style} />;\n    }\n\n    if (alwaysMonoIcons.includes(name)) {\n      type = 'mono';\n    }\n\n    const iconName = type === 'default' ? `Uil${toPascalCase(name)}` : toPascalCase(name);\n\n    /* Unicons don't have type definitions */\n    //@ts-ignore\n    const Component = type === 'default' ? DefaultIcon[iconName] : MonoIcon[iconName];\n\n    if (!Component) {\n      return <div />;\n    }\n\n    return (\n      <div className={styles.container} {...divElementProps} ref={ref}>\n        {type === 'default' && <Component size={svgSize} className={cx(styles.icon, className)} style={style} />}\n        {type === 'mono' && (\n          <Component\n            size={svgSize}\n            className={cx(styles.icon, { [styles.orange]: name === 'favorite' }, className)}\n            style={style}\n          />\n        )}\n      </div>\n    );\n  }\n);\n\nIcon.displayName = 'Icon';\n\n/* Transform string with px to number and add 2 pxs as path in svg is 2px smaller */\nexport const getSvgSize = (size: IconSize) => {\n  switch (size) {\n    case 'xs':\n      return 12;\n    case 'sm':\n      return 14;\n    case 'md':\n      return 16;\n    case 'lg':\n      return 18;\n    case 'xl':\n      return 24;\n    case 'xxl':\n      return 36;\n    case 'xxxl':\n      return 48;\n  }\n};\n","import React from 'react';\nimport { css } from 'emotion';\nimport { CSSTransition } from 'react-transition-group';\nimport { stylesFactory } from '../../themes';\n\nconst getStyles = stylesFactory((duration: number) => {\n  return {\n    enter: css`\n      label: enter;\n      opacity: 0;\n    `,\n    enterActive: css`\n      label: enterActive;\n      opacity: 1;\n      transition: opacity ${duration}ms ease-out;\n    `,\n    exit: css`\n      label: exit;\n      opacity: 1;\n    `,\n    exitActive: css`\n      label: exitActive;\n      opacity: 0;\n      transition: opacity ${duration}ms ease-out;\n    `,\n  };\n});\n\ntype Props = {\n  children: React.ReactNode;\n  visible: boolean;\n  duration?: number;\n};\n\nexport function FadeTransition(props: Props) {\n  const { visible, children, duration = 250 } = props;\n  const styles = getStyles(duration);\n  return (\n    <CSSTransition in={visible} mountOnEnter={true} unmountOnExit={true} timeout={duration} classNames={styles}>\n      {children}\n    </CSSTransition>\n  );\n}\n","import _ from 'lodash';\nimport { PanelCtrl } from 'app/plugins/sdk';\n\nimport config from 'app/core/config';\nimport { auto, ISCEService } from 'angular';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { PanelEvents, textUtil } from '@grafana/data';\nimport { renderMarkdown } from '@grafana/data';\n\nconst defaultContent = `\n# Title\n\nFor markdown syntax help: [commonmark.org/help](https://commonmark.org/help/)\n\n\n\n`;\n\nexport class TextPanelCtrl extends PanelCtrl {\n  static templateUrl = `public/app/plugins/panel/text/module.html`;\n  static scrollable = true;\n\n  content: string;\n  // Set and populate defaults\n  panelDefaults = {\n    mode: 'markdown', // 'html', 'markdown', 'text'\n    content: defaultContent,\n  };\n\n  /** @ngInject */\n  constructor(\n    $scope: any,\n    $injector: auto.IInjectorService,\n    private templateSrv: TemplateSrv,\n    private $sce: ISCEService\n  ) {\n    super($scope, $injector);\n\n    _.defaults(this.panel, this.panelDefaults);\n\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n    this.events.on(PanelEvents.refresh, this.onRefresh.bind(this));\n    this.events.on(PanelEvents.render, this.onRender.bind(this));\n\n    const renderWhenChanged = (scope: any) => {\n      const { panel } = scope.ctrl;\n      return [panel.content, panel.mode].join();\n    };\n\n    $scope.$watch(\n      renderWhenChanged,\n      _.throttle(() => {\n        this.render();\n      }, 100)\n    );\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Options', 'public/app/plugins/panel/text/editor.html');\n\n    if (this.panel.mode === 'text') {\n      this.panel.mode = 'markdown';\n    }\n  }\n\n  onRefresh() {\n    this.render();\n  }\n\n  onRender() {\n    if (this.panel.mode === 'markdown') {\n      this.renderMarkdown(this.panel.content);\n    } else if (this.panel.mode === 'html') {\n      this.updateContent(this.panel.content);\n    }\n    this.renderingCompleted();\n  }\n\n  renderText(content: string) {\n    const safeContent = textUtil.escapeHtml(content).replace(/\\n/g, '<br/>');\n    this.updateContent(safeContent);\n  }\n\n  renderMarkdown(content: string) {\n    this.$scope.$applyAsync(() => {\n      this.updateContent(renderMarkdown(content));\n    });\n  }\n\n  updateContent(html: string) {\n    try {\n      html = this.templateSrv.replace(html, this.panel.scopedVars, 'html');\n    } catch (e) {\n      console.log('Text panel error: ', e);\n    }\n\n    this.content = this.$sce.trustAsHtml(config.disableSanitizeHtml ? html : textUtil.sanitize(html));\n  }\n}\n\nexport { TextPanelCtrl as PanelCtrl };\n","// Libraries\nimport React, { PureComponent } from 'react';\nimport { debounce } from 'lodash';\nimport { PanelProps, renderMarkdown, textUtil } from '@grafana/data';\n// Utils\nimport config from 'app/core/config';\n// Types\nimport { TextOptions } from './types';\n\ninterface Props extends PanelProps<TextOptions> {}\ninterface State {\n  html: string;\n}\n\nexport class TextPanel extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      html: this.processContent(props.options),\n    };\n  }\n\n  updateHTML = debounce(() => {\n    const html = this.processContent(this.props.options);\n    if (html !== this.state.html) {\n      this.setState({ html });\n    }\n  }, 150);\n\n  componentDidUpdate(prevProps: Props) {\n    // Since any change could be referenced in a template variable,\n    // This needs to process everytime (with debounce)\n    this.updateHTML();\n  }\n\n  prepareHTML(html: string): string {\n    const { replaceVariables } = this.props;\n\n    html = replaceVariables(html, {}, 'html');\n\n    return config.disableSanitizeHtml ? html : textUtil.sanitize(html);\n  }\n\n  prepareText(content: string): string {\n    return this.prepareHTML(\n      content\n        .replace(/&/g, '&amp;')\n        .replace(/>/g, '&gt;')\n        .replace(/</g, '&lt;')\n        .replace(/\\n/g, '<br/>')\n    );\n  }\n\n  prepareMarkdown(content: string): string {\n    return this.prepareHTML(renderMarkdown(content));\n  }\n\n  processContent(options: TextOptions): string {\n    const { mode, content } = options;\n\n    if (!content) {\n      return '';\n    }\n\n    if (mode === 'markdown') {\n      return this.prepareMarkdown(content);\n    }\n    if (mode === 'html') {\n      return this.prepareHTML(content);\n    }\n\n    return this.prepareText(content);\n  }\n\n  render() {\n    const { html } = this.state;\n\n    return <div className=\"markdown-html panel-text-content\" dangerouslySetInnerHTML={{ __html: html }} />;\n  }\n}\n","import { PanelModel, PanelPlugin } from '@grafana/data';\n\nimport { TextPanel } from './TextPanel';\nimport { TextOptions } from './types';\n\nexport const plugin = new PanelPlugin<TextOptions>(TextPanel)\n  .setPanelOptions(builder => {\n    builder\n      .addRadio({\n        path: 'mode',\n        name: 'Mode',\n        description: 'text mode of the panel',\n        settings: {\n          options: [\n            { value: 'markdown', label: 'Markdown' },\n            { value: 'text', label: 'Text' },\n            { value: 'html', label: 'HTML' },\n          ],\n        },\n        defaultValue: 'markdown',\n      })\n      .addTextInput({\n        path: 'content',\n        name: 'Content',\n        description: 'Content of the panel',\n        settings: {\n          useTextarea: true,\n          rows: 5,\n        },\n        defaultValue: `# Title\n        \nFor markdown syntax help: [commonmark.org/help](https://commonmark.org/help/)\n         `,\n      });\n  })\n  .setPanelChangeHandler((panel: PanelModel<TextOptions>, prevPluginId: string, prevOptions: any) => {\n    if (prevPluginId === 'text') {\n      return prevOptions as TextOptions;\n    }\n    return panel.options;\n  });\n","import React from 'react';\nimport { GraphSeriesToggler } from '@grafana/ui';\nimport { PanelData, GraphSeriesXY, AbsoluteTimeRange, TimeZone, FieldConfigSource } from '@grafana/data';\n\nimport { getGraphSeriesModel } from './getGraphSeriesModel';\nimport { Options, SeriesOptions } from './types';\nimport { SeriesColorChangeHandler, SeriesAxisToggleHandler } from '@grafana/ui/src/components/Graph/GraphWithLegend';\n\ninterface GraphPanelControllerAPI {\n  series: GraphSeriesXY[];\n  onSeriesAxisToggle: SeriesAxisToggleHandler;\n  onSeriesColorChange: SeriesColorChangeHandler;\n  onSeriesToggle: (label: string, event: React.MouseEvent<HTMLElement>) => void;\n  onToggleSort: (sortBy: string) => void;\n  onHorizontalRegionSelected: (from: number, to: number) => void;\n}\n\ninterface GraphPanelControllerProps {\n  children: (api: GraphPanelControllerAPI) => JSX.Element;\n  options: Options;\n  fieldConfig: FieldConfigSource;\n  data: PanelData;\n  timeZone: TimeZone;\n  onOptionsChange: (options: Options) => void;\n  onChangeTimeRange: (timeRange: AbsoluteTimeRange) => void;\n}\n\ninterface GraphPanelControllerState {\n  graphSeriesModel: GraphSeriesXY[];\n}\n\nexport class GraphPanelController extends React.Component<GraphPanelControllerProps, GraphPanelControllerState> {\n  constructor(props: GraphPanelControllerProps) {\n    super(props);\n\n    this.onSeriesColorChange = this.onSeriesColorChange.bind(this);\n    this.onSeriesAxisToggle = this.onSeriesAxisToggle.bind(this);\n    this.onToggleSort = this.onToggleSort.bind(this);\n    this.onHorizontalRegionSelected = this.onHorizontalRegionSelected.bind(this);\n\n    this.state = {\n      graphSeriesModel: getGraphSeriesModel(\n        props.data.series,\n        props.timeZone,\n        props.options.series || {},\n        props.options.graph,\n        props.options.legend,\n        props.fieldConfig\n      ),\n    };\n  }\n\n  static getDerivedStateFromProps(props: GraphPanelControllerProps, state: GraphPanelControllerState) {\n    return {\n      ...state,\n      graphSeriesModel: getGraphSeriesModel(\n        props.data.series,\n        props.timeZone,\n        props.options.series || {},\n        props.options.graph,\n        props.options.legend,\n        props.fieldConfig\n      ),\n    };\n  }\n\n  onSeriesOptionsUpdate(label: string, optionsUpdate: SeriesOptions) {\n    const { onOptionsChange, options } = this.props;\n    const updatedSeriesOptions: { [label: string]: SeriesOptions } = { ...options.series };\n    updatedSeriesOptions[label] = optionsUpdate;\n    onOptionsChange({\n      ...options,\n      series: updatedSeriesOptions,\n    });\n  }\n\n  onSeriesAxisToggle(label: string, yAxis: number) {\n    const {\n      options: { series },\n    } = this.props;\n    const seriesOptionsUpdate: SeriesOptions = series[label]\n      ? {\n          ...series[label],\n          yAxis: {\n            ...series[label].yAxis,\n            index: yAxis,\n          },\n        }\n      : {\n          yAxis: {\n            index: yAxis,\n          },\n        };\n    this.onSeriesOptionsUpdate(label, seriesOptionsUpdate);\n  }\n\n  onSeriesColorChange(label: string, color: string) {\n    const {\n      options: { series },\n    } = this.props;\n    const seriesOptionsUpdate: SeriesOptions = series[label]\n      ? {\n          ...series[label],\n          color,\n        }\n      : {\n          color,\n        };\n\n    this.onSeriesOptionsUpdate(label, seriesOptionsUpdate);\n  }\n\n  onToggleSort(sortBy: string) {\n    const { onOptionsChange, options } = this.props;\n    onOptionsChange({\n      ...options,\n      legend: {\n        ...options.legend,\n        sortBy,\n        sortDesc: sortBy === options.legend.sortBy ? !options.legend.sortDesc : false,\n      },\n    });\n  }\n\n  onHorizontalRegionSelected(from: number, to: number) {\n    const { onChangeTimeRange } = this.props;\n    onChangeTimeRange({ from, to });\n  }\n\n  render() {\n    const { children } = this.props;\n    const { graphSeriesModel } = this.state;\n\n    return (\n      <GraphSeriesToggler series={graphSeriesModel}>\n        {({ onSeriesToggle, toggledSeries }) => {\n          return children({\n            series: toggledSeries,\n            onSeriesColorChange: this.onSeriesColorChange,\n            onSeriesAxisToggle: this.onSeriesAxisToggle,\n            onToggleSort: this.onToggleSort,\n            onSeriesToggle: onSeriesToggle,\n            onHorizontalRegionSelected: this.onHorizontalRegionSelected,\n          });\n        }}\n      </GraphSeriesToggler>\n    );\n  }\n}\n","import React from 'react';\nimport { GraphWithLegend, Chart } from '@grafana/ui';\nimport { PanelProps } from '@grafana/data';\nimport { Options } from './types';\nimport { GraphPanelController } from './GraphPanelController';\nimport { LegendDisplayMode } from '@grafana/ui/src/components/Legend/Legend';\n\ninterface GraphPanelProps extends PanelProps<Options> {}\n\nexport const GraphPanel: React.FunctionComponent<GraphPanelProps> = ({\n  data,\n  timeRange,\n  timeZone,\n  width,\n  height,\n  options,\n  fieldConfig,\n  onOptionsChange,\n  onChangeTimeRange,\n}) => {\n  if (!data) {\n    return (\n      <div className=\"panel-empty\">\n        <p>No data found in response</p>\n      </div>\n    );\n  }\n\n  const {\n    graph: { showLines, showBars, showPoints },\n    legend: legendOptions,\n    tooltipOptions,\n  } = options;\n\n  const graphProps = {\n    showBars,\n    showLines,\n    showPoints,\n    tooltipOptions,\n  };\n  const { asTable, isVisible, ...legendProps } = legendOptions;\n  return (\n    <GraphPanelController\n      data={data}\n      timeZone={timeZone}\n      options={options}\n      fieldConfig={fieldConfig}\n      onOptionsChange={onOptionsChange}\n      onChangeTimeRange={onChangeTimeRange}\n    >\n      {({ onSeriesToggle, onHorizontalRegionSelected, ...controllerApi }) => {\n        return (\n          <GraphWithLegend\n            timeRange={timeRange}\n            timeZone={timeZone}\n            width={width}\n            height={height}\n            displayMode={asTable ? LegendDisplayMode.Table : LegendDisplayMode.List}\n            isLegendVisible={isVisible}\n            sortLegendBy={legendOptions.sortBy}\n            sortLegendDesc={legendOptions.sortDesc}\n            onSeriesToggle={onSeriesToggle}\n            onHorizontalRegionSelected={onHorizontalRegionSelected}\n            {...graphProps}\n            {...legendProps}\n            {...controllerApi}\n          >\n            <Chart.Tooltip mode={tooltipOptions.mode} />\n          </GraphWithLegend>\n        );\n      }}\n    </GraphPanelController>\n  );\n};\n","import { FieldConfigProperty, PanelPlugin } from '@grafana/data';\nimport { GraphPanel } from './GraphPanel';\nimport { Options } from './types';\n\nexport const plugin = new PanelPlugin<Options>(GraphPanel)\n  .useFieldConfig({ standardOptions: [FieldConfigProperty.Unit, FieldConfigProperty.Decimals] })\n  .setPanelOptions(builder => {\n    builder\n      .addBooleanSwitch({\n        path: 'graph.showBars',\n        name: 'Show bars',\n        description: '',\n        defaultValue: false,\n      })\n      .addBooleanSwitch({\n        path: 'graph.showLines',\n        name: 'Show lines',\n        description: '',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        path: 'graph.showPoints',\n        name: 'Show poins',\n        description: '',\n        defaultValue: false,\n      })\n      .addBooleanSwitch({\n        path: 'legend.isVisible',\n        name: 'Show legend',\n        description: '',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        path: 'legend.asTable',\n        name: 'Display legend as table',\n        description: '',\n        defaultValue: false,\n      })\n      .addRadio({\n        path: 'legend.placement',\n        name: 'Legend placement',\n        description: '',\n        defaultValue: 'under',\n        settings: {\n          options: [\n            { value: 'under', label: 'Below graph' },\n            { value: 'right', label: 'Right to the graph' },\n          ],\n        },\n      })\n      .addRadio({\n        path: 'tooltipOptions.mode',\n        name: 'Tooltip mode',\n        description: '',\n        defaultValue: 'single',\n        settings: {\n          options: [\n            { value: 'single', label: 'Single series' },\n            { value: 'multi', label: 'All series' },\n          ],\n        },\n      });\n  });\n","import angular from 'angular';\nimport $ from 'jquery';\nimport _ from 'lodash';\n//@ts-ignore\nimport Drop from 'tether-drop';\nimport { CreatePlotOverlay } from '@grafana/data';\n\n/** @ngInject */\nconst createAnnotationToolip: CreatePlotOverlay = (element, event, plot) => {\n  const injector = angular.element(document).injector();\n  const content = document.createElement('div');\n  content.innerHTML = '<annotation-tooltip event=\"event\" on-edit=\"onEdit()\"></annotation-tooltip>';\n\n  injector.invoke([\n    '$compile',\n    '$rootScope',\n    ($compile, $rootScope) => {\n      const eventManager = plot.getOptions().events.manager;\n      const tmpScope = $rootScope.$new(true);\n      tmpScope.event = event;\n      tmpScope.onEdit = () => {\n        eventManager.editEvent(event);\n      };\n\n      $compile(content)(tmpScope);\n      tmpScope.$digest();\n      tmpScope.$destroy();\n\n      const drop = new Drop({\n        target: element[0],\n        content: content,\n        position: 'bottom center',\n        classes: 'drop-popover drop-popover--annotation',\n        openOn: 'hover',\n        hoverCloseDelay: 200,\n        tetherOptions: {\n          constraints: [{ to: 'window', pin: true, attachment: 'both' }],\n        },\n      });\n\n      drop.open();\n\n      drop.on('close', () => {\n        setTimeout(() => {\n          drop.destroy();\n        });\n      });\n    },\n  ]);\n};\n\nlet markerElementToAttachTo: any = null;\n\n/** @ngInject */\nconst createEditPopover: CreatePlotOverlay = (element, event, plot) => {\n  const eventManager = plot.getOptions().events.manager;\n  if (eventManager.editorOpen) {\n    // update marker element to attach to (needed in case of legend on the right\n    // when there is a double render pass and the initial marker element is removed)\n    markerElementToAttachTo = element;\n    return;\n  }\n\n  // mark as openend\n  eventManager.editorOpened();\n  // set marker elment to attache to\n  markerElementToAttachTo = element;\n\n  // wait for element to be attached and positioned\n  setTimeout(() => {\n    const injector = angular.element(document).injector();\n    const content = document.createElement('div');\n    content.innerHTML = '<event-editor panel-ctrl=\"panelCtrl\" event=\"event\" close=\"close()\"></event-editor>';\n\n    injector.invoke([\n      '$compile',\n      '$rootScope',\n      ($compile, $rootScope) => {\n        const scope = $rootScope.$new(true);\n        let drop: any;\n\n        scope.event = event;\n        scope.panelCtrl = eventManager.panelCtrl;\n        scope.close = () => {\n          drop.close();\n        };\n\n        $compile(content)(scope);\n        scope.$digest();\n\n        drop = new Drop({\n          target: markerElementToAttachTo[0],\n          content: content,\n          position: 'bottom center',\n          classes: 'drop-popover drop-popover--form',\n          openOn: 'click',\n          tetherOptions: {\n            constraints: [{ to: 'window', pin: true, attachment: 'both' }],\n          },\n        });\n\n        drop.open();\n        eventManager.editorOpened();\n\n        drop.on('close', () => {\n          // need timeout here in order call drop.destroy\n          setTimeout(() => {\n            eventManager.editorClosed();\n            scope.$destroy();\n            drop.destroy();\n          });\n        });\n      },\n    ]);\n  }, 100);\n};\n\nexport { createEditPopover, createAnnotationToolip };\n\n/*\n * jquery.flot.events\n *\n * description: Flot plugin for adding events/markers to the plot\n * version: 0.2.5\n * authors:\n *    Alexander Wunschik <alex@wunschik.net>\n *    Joel Oughton <joeloughton@gmail.com>\n *    Nicolas Joseph <www.nicolasjoseph.com>\n *\n * website: https://github.com/mojoaxel/flot-events\n *\n * released under MIT License and GPLv2+\n */\n\n/**\n * A class that allows for the drawing an remove of some object\n */\nexport class DrawableEvent {\n  _object: any;\n  _drawFunc: any;\n  _clearFunc: any;\n  _moveFunc: any;\n  _position: any;\n  _width: any;\n  _height: any;\n\n  /** @ngInject */\n  constructor(\n    object: JQuery,\n    drawFunc: any,\n    clearFunc: any,\n    moveFunc: any,\n    left: number,\n    top: number,\n    width: number,\n    height: number\n  ) {\n    this._object = object;\n    this._drawFunc = drawFunc;\n    this._clearFunc = clearFunc;\n    this._moveFunc = moveFunc;\n    this._position = { left, top };\n    this._width = width;\n    this._height = height;\n  }\n\n  width() {\n    return this._width;\n  }\n  height() {\n    return this._height;\n  }\n  position() {\n    return this._position;\n  }\n  draw() {\n    this._drawFunc(this._object);\n  }\n  clear() {\n    this._clearFunc(this._object);\n  }\n  getObject() {\n    return this._object;\n  }\n  moveTo(position: { left: number; top: number }) {\n    this._position = position;\n    this._moveFunc(this._object, this._position);\n  }\n}\n\n/**\n * Event class that stores options (eventType, min, max, title, description) and the object to draw.\n */\nexport class VisualEvent {\n  _parent: any;\n  _options: any;\n  _drawableEvent: any;\n  _hidden: any;\n\n  /** @ngInject */\n  constructor(options: any, drawableEvent: DrawableEvent) {\n    this._options = options;\n    this._drawableEvent = drawableEvent;\n    this._hidden = false;\n  }\n\n  visual() {\n    return this._drawableEvent;\n  }\n  getOptions() {\n    return this._options;\n  }\n  getParent() {\n    return this._parent;\n  }\n  isHidden() {\n    return this._hidden;\n  }\n  hide() {\n    this._hidden = true;\n  }\n  unhide() {\n    this._hidden = false;\n  }\n}\n\n/**\n * A Class that handles the event-markers inside the given plot\n */\nexport class EventMarkers {\n  _events: any;\n  _types: any;\n  _plot: any;\n  eventsEnabled: any;\n\n  /** @ngInject */\n  constructor(plot: any) {\n    this._events = [];\n    this._types = [];\n    this._plot = plot;\n    this.eventsEnabled = false;\n  }\n\n  getEvents() {\n    return this._events;\n  }\n\n  setTypes(types: any) {\n    return (this._types = types);\n  }\n\n  /**\n   * create internal objects for the given events\n   */\n  setupEvents(events: any[]) {\n    const parts = _.partition(events, 'isRegion');\n    const regions = parts[0];\n    events = parts[1];\n\n    $.each(events, (index, event) => {\n      const ve = new VisualEvent(event, this._buildDiv(event));\n      this._events.push(ve);\n    });\n\n    $.each(regions, (index, event) => {\n      const vre = new VisualEvent(event, this._buildRegDiv(event));\n      this._events.push(vre);\n    });\n\n    this._events.sort((a: any, b: any) => {\n      const ao = a.getOptions(),\n        bo = b.getOptions();\n      if (ao.min > bo.min) {\n        return 1;\n      }\n      if (ao.min < bo.min) {\n        return -1;\n      }\n      return 0;\n    });\n  }\n\n  /**\n   * draw the events to the plot\n   */\n  drawEvents() {\n    // var o = this._plot.getPlotOffset();\n\n    $.each(this._events, (index, event) => {\n      // check event is inside the graph range\n      if (this._insidePlot(event.getOptions().min) && !event.isHidden()) {\n        event.visual().draw();\n      } else {\n        event\n          .visual()\n          .getObject()\n          .hide();\n      }\n    });\n  }\n\n  /**\n   * update the position of the event-markers (e.g. after scrolling or zooming)\n   */\n  updateEvents() {\n    const o = this._plot.getPlotOffset();\n    let left;\n    let top;\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n\n    $.each(this._events, (index, event) => {\n      top = o.top + this._plot.height() - event.visual().height();\n      left = xaxis.p2c(event.getOptions().min) + o.left - event.visual().width() / 2;\n      event.visual().moveTo({ top: top, left: left });\n    });\n  }\n\n  /**\n   * remove all events from the plot\n   */\n  _clearEvents() {\n    $.each(this._events, (index, val) => {\n      val.visual().clear();\n    });\n    this._events = [];\n  }\n\n  /**\n   * create a DOM element for the given event\n   */\n  _buildDiv(event: { eventType: any; min: any; editModel: any }) {\n    const that = this;\n\n    const container = this._plot.getPlaceholder();\n    const o = this._plot.getPlotOffset();\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    let top, left, color, markerSize, markerShow, lineStyle, lineWidth;\n    let markerTooltip;\n\n    // map the eventType to a types object\n    const eventTypeId = event.eventType;\n\n    if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].color) {\n      color = '#666';\n    } else {\n      color = this._types[eventTypeId].color;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].markerSize) {\n      markerSize = 8; //default marker size\n    } else {\n      markerSize = this._types[eventTypeId].markerSize;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerShow === undefined) {\n      markerShow = true;\n    } else {\n      markerShow = this._types[eventTypeId].markerShow;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerTooltip === undefined) {\n      markerTooltip = true;\n    } else {\n      markerTooltip = this._types[eventTypeId].markerTooltip;\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || !this._types[eventTypeId].lineStyle) {\n      lineStyle = 'dashed'; //default line style\n    } else {\n      lineStyle = this._types[eventTypeId].lineStyle.toLowerCase();\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || this._types[eventTypeId].lineWidth === undefined) {\n      lineWidth = 1; //default line width\n    } else {\n      lineWidth = this._types[eventTypeId].lineWidth;\n    }\n\n    let topOffset = xaxis.options.eventSectionHeight || 0;\n    topOffset = topOffset / 3;\n\n    top = o.top + this._plot.height() + topOffset;\n    left = xaxis.p2c(event.min) + o.left;\n\n    const line = $('<div class=\"events_line flot-temp-elem\"></div>')\n      .css({\n        position: 'absolute',\n        opacity: 0.8,\n        left: left + 'px',\n        top: 8,\n        width: lineWidth + 'px',\n        height: this._plot.height() + topOffset * 0.8,\n        'border-left-width': lineWidth + 'px',\n        'border-left-style': lineStyle,\n        'border-left-color': color,\n        color: color,\n      })\n      .appendTo(container);\n\n    if (markerShow) {\n      const marker = $('<div class=\"events_marker\"></div>').css({\n        position: 'absolute',\n        left: -markerSize - Math.round(lineWidth / 2) + 'px',\n        'font-size': 0,\n        'line-height': 0,\n        width: 0,\n        height: 0,\n        'border-left': markerSize + 'px solid transparent',\n        'border-right': markerSize + 'px solid transparent',\n      });\n\n      marker.appendTo(line);\n\n      if (\n        this._types[eventTypeId] &&\n        this._types[eventTypeId].position &&\n        this._types[eventTypeId].position.toUpperCase() === 'BOTTOM'\n      ) {\n        marker.css({\n          top: top - markerSize - 8 + 'px',\n          'border-top': 'none',\n          'border-bottom': markerSize + 'px solid ' + color,\n        });\n      } else {\n        marker.css({\n          top: '0px',\n          'border-top': markerSize + 'px solid ' + color,\n          'border-bottom': 'none',\n        });\n      }\n\n      marker.data({\n        event: event,\n      });\n\n      const mouseenter = function(this: any) {\n        createAnnotationToolip(marker, $(this).data('event'), that._plot);\n      };\n\n      if (event.editModel) {\n        createEditPopover(marker, event.editModel, that._plot);\n      }\n\n      const mouseleave = () => {\n        that._plot.clearSelection();\n      };\n\n      if (markerTooltip) {\n        marker.css({ cursor: 'help' });\n        marker.hover(mouseenter, mouseleave);\n      }\n    }\n\n    const drawableEvent = new DrawableEvent(\n      line,\n      function drawFunc(obj: { show: () => void }) {\n        obj.show();\n      },\n      (obj: { remove: () => void }) => {\n        obj.remove();\n      },\n      (obj: any, position: { top: any; left: any }) => {\n        obj.css({\n          top: position.top,\n          left: position.left,\n        });\n      },\n      left,\n      top,\n      line.width(),\n      line.height()\n    );\n\n    return drawableEvent;\n  }\n\n  /**\n   * create a DOM element for the given region\n   */\n  _buildRegDiv(event: { eventType: any; min: number; timeEnd: number; editModel: any }) {\n    const that = this;\n\n    const container = this._plot.getPlaceholder();\n    const o = this._plot.getPlotOffset();\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    let top,\n      left,\n      lineWidth: number,\n      regionWidth,\n      lineStyle: string | number | cssPropertySetter,\n      color: string,\n      markerTooltip;\n\n    // map the eventType to a types object\n    const eventTypeId = event.eventType;\n\n    if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].color) {\n      color = '#666';\n    } else {\n      color = this._types[eventTypeId].color;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerTooltip === undefined) {\n      markerTooltip = true;\n    } else {\n      markerTooltip = this._types[eventTypeId].markerTooltip;\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || this._types[eventTypeId].lineWidth === undefined) {\n      lineWidth = 1; //default line width\n    } else {\n      lineWidth = this._types[eventTypeId].lineWidth;\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || !this._types[eventTypeId].lineStyle) {\n      lineStyle = 'dashed'; //default line style\n    } else {\n      lineStyle = this._types[eventTypeId].lineStyle.toLowerCase();\n    }\n\n    const topOffset = 2;\n    top = o.top + this._plot.height() + topOffset;\n\n    const timeFrom = Math.min(event.min, event.timeEnd);\n    const timeTo = Math.max(event.min, event.timeEnd);\n    left = xaxis.p2c(timeFrom) + o.left;\n    const right = xaxis.p2c(timeTo) + o.left;\n    regionWidth = right - left;\n\n    _.each([left, right], position => {\n      const line = $('<div class=\"events_line flot-temp-elem\"></div>').css({\n        position: 'absolute',\n        opacity: 0.8,\n        left: position + 'px',\n        top: 8,\n        width: lineWidth + 'px',\n        height: this._plot.height() + topOffset,\n        'border-left-width': lineWidth + 'px',\n        'border-left-style': lineStyle,\n        'border-left-color': color,\n        color: color,\n      });\n      line.appendTo(container);\n    });\n\n    const region = $('<div class=\"events_marker region_marker flot-temp-elem\"></div>').css({\n      position: 'absolute',\n      opacity: 0.5,\n      left: left + 'px',\n      top: top,\n      width: Math.round(regionWidth + lineWidth) + 'px',\n      height: '0.5rem',\n      'border-left-color': color,\n      color: color,\n      'background-color': color,\n    });\n    region.appendTo(container);\n\n    region.data({\n      event: event,\n    });\n\n    const mouseenter = function(this: any) {\n      createAnnotationToolip(region, $(this).data('event'), that._plot);\n    };\n\n    if (event.editModel) {\n      createEditPopover(region, event.editModel, that._plot);\n    }\n\n    const mouseleave = () => {\n      that._plot.clearSelection();\n    };\n\n    if (markerTooltip) {\n      region.css({ cursor: 'help' });\n      region.hover(mouseenter, mouseleave);\n    }\n\n    const drawableEvent = new DrawableEvent(\n      region,\n      function drawFunc(obj: { show: () => void }) {\n        obj.show();\n      },\n      (obj: { remove: () => void }) => {\n        obj.remove();\n      },\n      (obj: { css: (arg0: { top: any; left: any }) => void }, position: { top: any; left: any }) => {\n        obj.css({\n          top: position.top,\n          left: position.left,\n        });\n      },\n      left,\n      top,\n      region.width(),\n      region.height()\n    );\n\n    return drawableEvent;\n  }\n\n  /**\n   * check if the event is inside visible range\n   */\n  _insidePlot(x: any) {\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    const xc = xaxis.p2c(x);\n    return xc > 0 && xc < xaxis.p2c(xaxis.max);\n  }\n}\n\n/**\n * initialize the plugin for the given plot\n */\n\n/** @ngInject */\nexport function init(this: any, plot: any) {\n  const that = this;\n  const eventMarkers = new EventMarkers(plot);\n\n  plot.getEvents = () => {\n    return eventMarkers._events;\n  };\n\n  plot.hideEvents = () => {\n    $.each(eventMarkers._events, (index, event) => {\n      event\n        .visual()\n        .getObject()\n        .hide();\n    });\n  };\n\n  plot.showEvents = () => {\n    plot.hideEvents();\n    $.each(eventMarkers._events, (index, event) => {\n      event.hide();\n    });\n\n    that.eventMarkers.drawEvents();\n  };\n\n  // change events on an existing plot\n  plot.setEvents = (events: any[]) => {\n    if (eventMarkers.eventsEnabled) {\n      eventMarkers.setupEvents(events);\n    }\n  };\n\n  plot.hooks.processOptions.push((plot: any, options: any) => {\n    // enable the plugin\n    if (options.events.data != null) {\n      eventMarkers.eventsEnabled = true;\n    }\n  });\n\n  plot.hooks.draw.push((plot: any) => {\n    const options = plot.getOptions();\n\n    if (eventMarkers.eventsEnabled) {\n      // check for first run\n      if (eventMarkers.getEvents().length < 1) {\n        eventMarkers.setTypes(options.events.types);\n        eventMarkers.setupEvents(options.events.data);\n      } else {\n        eventMarkers.updateEvents();\n      }\n    }\n\n    eventMarkers.drawEvents();\n  });\n}\n\nconst defaultOptions: any = {\n  events: {\n    data: null,\n    types: null,\n    xaxis: 1,\n    position: 'BOTTOM',\n  },\n};\n\n$.plot.plugins.push({\n  init: init,\n  options: defaultOptions,\n  name: 'events',\n  version: '0.2.5',\n});\n","import $ from 'jquery';\nimport { appEvents } from 'app/core/core';\nimport { CoreEvents } from 'app/types';\nimport { textUtil } from '@grafana/data';\n\nexport default function GraphTooltip(this: any, elem: any, dashboard: any, scope: any, getSeriesFn: any) {\n  const self = this;\n  const ctrl = scope.ctrl;\n  const panel = ctrl.panel;\n\n  const $tooltip = $('<div class=\"graph-tooltip\">');\n\n  this.destroy = () => {\n    $tooltip.remove();\n  };\n\n  this.findHoverIndexFromDataPoints = (posX: number, series: any, last: number) => {\n    const ps = series.datapoints.pointsize;\n    const initial = last * ps;\n    const len = series.datapoints.points.length;\n    let j;\n    for (j = initial; j < len; j += ps) {\n      // Special case of a non stepped line, highlight the very last point just before a null point\n      if (\n        (!series.lines.steps && series.datapoints.points[initial] != null && series.datapoints.points[j] == null) ||\n        //normal case\n        series.datapoints.points[j] > posX\n      ) {\n        return Math.max(j - ps, 0) / ps;\n      }\n    }\n    return j / ps - 1;\n  };\n\n  this.findHoverIndexFromData = (posX: any, series: any) => {\n    let lower = 0;\n    let upper = series.data.length - 1;\n    let middle;\n    while (true) {\n      if (lower > upper) {\n        return Math.max(upper, 0);\n      }\n      middle = Math.floor((lower + upper) / 2);\n      if (series.data[middle][0] === posX) {\n        return middle;\n      } else if (series.data[middle][0] < posX) {\n        lower = middle + 1;\n      } else {\n        upper = middle - 1;\n      }\n    }\n  };\n\n  this.renderAndShow = (absoluteTime: string, innerHtml: string, pos: { pageX: number; pageY: any }, xMode: string) => {\n    if (xMode === 'time') {\n      innerHtml = '<div class=\"graph-tooltip-time\">' + absoluteTime + '</div>' + innerHtml;\n    }\n    $tooltip.html(innerHtml).place_tt(pos.pageX + 20, pos.pageY);\n  };\n\n  this.getMultiSeriesPlotHoverInfo = function(seriesList: any[], pos: { x: number }) {\n    let value, i, series, hoverIndex, hoverDistance, pointTime, yaxis;\n    // 3 sub-arrays, 1st for hidden series, 2nd for left yaxis, 3rd for right yaxis.\n    let results: any = [[], [], []];\n\n    //now we know the current X (j) position for X and Y values\n    let lastValue = 0; //needed for stacked values\n\n    let minDistance, minTime;\n\n    for (i = 0; i < seriesList.length; i++) {\n      series = seriesList[i];\n\n      if (!series.data.length || (panel.legend.hideEmpty && series.allIsNull)) {\n        // Init value so that it does not brake series sorting\n        results[0].push({ hidden: true, value: 0 });\n        continue;\n      }\n\n      if (!series.data.length || (panel.legend.hideZero && series.allIsZero)) {\n        // Init value so that it does not brake series sorting\n        results[0].push({ hidden: true, value: 0 });\n        continue;\n      }\n\n      if (series.hideTooltip) {\n        results[0].push({ hidden: true, value: 0 });\n        continue;\n      }\n\n      hoverIndex = this.findHoverIndexFromData(pos.x, series);\n      hoverDistance = pos.x - series.data[hoverIndex][0];\n      pointTime = series.data[hoverIndex][0];\n\n      // Take the closest point before the cursor, or if it does not exist, the closest after\n      if (\n        !minDistance ||\n        (hoverDistance >= 0 && (hoverDistance < minDistance || minDistance < 0)) ||\n        (hoverDistance < 0 && hoverDistance > minDistance)\n      ) {\n        minDistance = hoverDistance;\n        minTime = pointTime;\n      }\n\n      if (series.stack) {\n        if (panel.tooltip.value_type === 'individual') {\n          value = series.data[hoverIndex][1];\n        } else if (!series.stack) {\n          value = series.data[hoverIndex][1];\n        } else {\n          lastValue += series.data[hoverIndex][1];\n          value = lastValue;\n        }\n      } else {\n        value = series.data[hoverIndex][1];\n      }\n\n      // Highlighting multiple Points depending on the plot type\n      if (series.lines.steps || series.stack) {\n        // stacked and steppedLine plots can have series with different length.\n        // Stacked series can increase its length on each new stacked serie if null points found,\n        // to speed the index search we begin always on the last found hoverIndex.\n        hoverIndex = this.findHoverIndexFromDataPoints(pos.x, series, hoverIndex);\n      }\n\n      // Be sure we have a yaxis so that it does not brake series sorting\n      yaxis = 0;\n      if (series.yaxis) {\n        yaxis = series.yaxis.n;\n      }\n\n      results[yaxis].push({\n        value: value,\n        hoverIndex: hoverIndex,\n        color: series.color,\n        label: series.aliasEscaped,\n        time: pointTime,\n        distance: hoverDistance,\n        index: i,\n      });\n    }\n\n    // Contat the 3 sub-arrays\n    results = results[0].concat(results[1], results[2]);\n\n    // Time of the point closer to pointer\n    results.time = minTime;\n\n    return results;\n  };\n\n  elem.mouseleave(() => {\n    if (panel.tooltip?.shared) {\n      const plot = elem.data().plot;\n      if (plot) {\n        $tooltip.detach();\n        plot.unhighlight();\n      }\n    }\n    appEvents.emit(CoreEvents.graphHoverClear);\n  });\n\n  elem.bind('plothover', (event: any, pos: { panelRelY: number; pageY: number }, item: any) => {\n    self.show(pos, item);\n\n    // broadcast to other graph panels that we are hovering!\n    pos.panelRelY = (pos.pageY - elem.offset().top) / elem.height();\n    appEvents.emit(CoreEvents.graphHover, { pos: pos, panel: panel });\n  });\n\n  elem.bind('plotclick', (event: any, pos: any, item: any) => {\n    appEvents.emit(CoreEvents.graphClicked, { pos: pos, panel: panel, item: item });\n  });\n\n  elem.bind('plotleave', () => {\n    if (!panel.tooltip.shared) {\n      return;\n    }\n\n    const plot = elem.data().plot;\n    if (plot) {\n      $tooltip.detach();\n      plot.unhighlight();\n    }\n  });\n\n  this.clear = (plot: { clearCrosshair: () => void; unhighlight: () => void }) => {\n    $tooltip.detach();\n    plot.clearCrosshair();\n    plot.unhighlight();\n  };\n\n  this.show = (pos: any, item: any) => {\n    const plot = elem.data().plot;\n    const plotData = plot.getData();\n    const xAxes = plot.getXAxes();\n    const xMode = xAxes[0].options.mode;\n    const seriesList = getSeriesFn();\n    let allSeriesMode = panel.tooltip.shared;\n    let group, value, absoluteTime, hoverInfo, i, series, seriesHtml, tooltipFormat;\n\n    // if panelRelY is defined another panel wants us to show a tooltip\n    // get pageX from position on x axis and pageY from relative position in original panel\n    if (pos.panelRelY) {\n      const pointOffset = plot.pointOffset({ x: pos.x });\n      if (Number.isNaN(pointOffset.left) || pointOffset.left < 0 || pointOffset.left > elem.width()) {\n        self.clear(plot);\n        return;\n      }\n      pos.pageX = elem.offset().left + pointOffset.left;\n      pos.pageY = elem.offset().top + elem.height() * pos.panelRelY;\n      const isVisible =\n        pos.pageY >= $(window).scrollTop() && pos.pageY <= $(window).innerHeight() + $(window).scrollTop();\n      if (!isVisible) {\n        self.clear(plot);\n        return;\n      }\n      plot.setCrosshair(pos);\n      allSeriesMode = true;\n\n      if (dashboard.sharedCrosshairModeOnly()) {\n        // if only crosshair mode we are done\n        return;\n      }\n    }\n\n    if (seriesList.length === 0) {\n      return;\n    }\n\n    if (seriesList[0].hasMsResolution) {\n      tooltipFormat = 'YYYY-MM-DD HH:mm:ss.SSS';\n    } else {\n      tooltipFormat = 'YYYY-MM-DD HH:mm:ss';\n    }\n\n    if (allSeriesMode) {\n      plot.unhighlight();\n\n      const seriesHoverInfo = self.getMultiSeriesPlotHoverInfo(plotData, pos);\n\n      seriesHtml = '';\n\n      absoluteTime = dashboard.formatDate(seriesHoverInfo.time, tooltipFormat);\n\n      // Dynamically reorder the hovercard for the current time point if the\n      // option is enabled.\n      if (panel.tooltip.sort === 2) {\n        seriesHoverInfo.sort((a: { value: number }, b: { value: number }) => {\n          return b.value - a.value;\n        });\n      } else if (panel.tooltip.sort === 1) {\n        seriesHoverInfo.sort((a: { value: number }, b: { value: number }) => {\n          return a.value - b.value;\n        });\n      }\n\n      for (i = 0; i < seriesHoverInfo.length; i++) {\n        hoverInfo = seriesHoverInfo[i];\n\n        if (hoverInfo.hidden) {\n          continue;\n        }\n\n        let highlightClass = '';\n        if (item && hoverInfo.index === item.seriesIndex) {\n          highlightClass = 'graph-tooltip-list-item--highlight';\n        }\n\n        series = seriesList[hoverInfo.index];\n        value = textUtil.sanitize(series.formatValue(hoverInfo.value));\n\n        const color = textUtil.sanitize(hoverInfo.color);\n        const label = textUtil.sanitize(hoverInfo.label);\n\n        seriesHtml +=\n          '<div class=\"graph-tooltip-list-item ' + highlightClass + '\"><div class=\"graph-tooltip-series-name\">';\n        seriesHtml += '<i class=\"fa fa-minus\" style=\"color:' + color + ';\"></i> ' + label + ':</div>';\n        seriesHtml += '<div class=\"graph-tooltip-value\">' + value + '</div></div>';\n        plot.highlight(hoverInfo.index, hoverInfo.hoverIndex);\n      }\n\n      self.renderAndShow(absoluteTime, seriesHtml, pos, xMode);\n    } else if (item) {\n      // single series tooltip\n      const color = textUtil.sanitize(item.series.color);\n      series = seriesList[item.seriesIndex];\n      group = '<div class=\"graph-tooltip-list-item\"><div class=\"graph-tooltip-series-name\">';\n      group += '<i class=\"fa fa-minus\" style=\"color:' + color + ';\"></i> ' + series.aliasEscaped + ':</div>';\n\n      if (panel.stack && panel.tooltip.value_type === 'individual') {\n        value = item.datapoint[1] - item.datapoint[2];\n      } else {\n        value = item.datapoint[1];\n      }\n\n      value = textUtil.sanitize(series.formatValue(value));\n      absoluteTime = dashboard.formatDate(item.datapoint[0], tooltipFormat);\n\n      group += '<div class=\"graph-tooltip-value\">' + value + '</div>';\n\n      self.renderAndShow(absoluteTime, group, pos, xMode);\n    } else {\n      // no hit\n      $tooltip.detach();\n    }\n  };\n}\n","import 'vendor/flot/jquery.flot';\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport { getColorFromHexRgbOrName } from '@grafana/data';\nimport { CoreEvents } from 'app/types';\nimport { PanelCtrl } from 'app/features/panel/panel_ctrl';\n\nexport class ThresholdManager {\n  plot: any;\n  placeholder: any;\n  height: any;\n  thresholds: any;\n  needsCleanup: boolean;\n  hasSecondYAxis: any;\n\n  constructor(private panelCtrl: PanelCtrl) {}\n\n  getHandleHtml(handleIndex: any, model: { colorMode: string }, valueStr: any) {\n    let stateClass = model.colorMode;\n    if (model.colorMode === 'custom') {\n      stateClass = 'critical';\n    }\n\n    return `\n    <div class=\"alert-handle-wrapper alert-handle-wrapper--T${handleIndex}\">\n      <div class=\"alert-handle-line alert-handle-line--${stateClass}\">\n      </div>\n      <div class=\"alert-handle\" data-handle-index=\"${handleIndex}\">\n        <i class=\"icon-gf icon-gf-${stateClass} alert-state-${stateClass}\"></i>\n        <span class=\"alert-handle-value\">${valueStr}<i class=\"alert-handle-grip\"></i></span>\n      </div>\n    </div>`;\n  }\n\n  initDragging(evt: any) {\n    const handleElem = $(evt.currentTarget).parents('.alert-handle-wrapper');\n    const handleIndex = $(evt.currentTarget).data('handleIndex');\n\n    let lastY: number | null = null;\n    let posTop: number;\n    const plot = this.plot;\n    const panelCtrl = this.panelCtrl;\n    const model = this.thresholds[handleIndex];\n\n    function dragging(evt: any) {\n      if (lastY === null) {\n        lastY = evt.clientY;\n      } else {\n        const diff = evt.clientY - lastY;\n        posTop = posTop + diff;\n        lastY = evt.clientY;\n        handleElem.css({ top: posTop + diff });\n      }\n    }\n\n    function stopped() {\n      // calculate graph level\n      let graphValue = plot.c2p({ left: 0, top: posTop }).y;\n      graphValue = parseInt(graphValue.toFixed(0), 10);\n      model.value = graphValue;\n\n      handleElem.off('mousemove', dragging);\n      document.removeEventListener('mouseup', stopped);\n\n      // trigger digest and render\n      panelCtrl.$scope.$apply(() => {\n        panelCtrl.render();\n        panelCtrl.events.emit(CoreEvents.thresholdChanged, {\n          threshold: model,\n          handleIndex: handleIndex,\n        });\n      });\n    }\n\n    lastY = null;\n    posTop = handleElem.position().top;\n\n    handleElem.on('mousemove', dragging);\n    document.addEventListener('mouseup', stopped);\n  }\n\n  cleanUp() {\n    this.placeholder.find('.alert-handle-wrapper').remove();\n    this.needsCleanup = false;\n  }\n\n  renderHandle(handleIndex: number, defaultHandleTopPos: number) {\n    const model = this.thresholds[handleIndex];\n    const value = model.value;\n    let valueStr = value;\n    let handleTopPos = 0;\n\n    // handle no value\n    if (!_.isNumber(value)) {\n      valueStr = '';\n      handleTopPos = defaultHandleTopPos;\n    } else {\n      const valueCanvasPos = this.plot.p2c({ x: 0, y: value });\n      handleTopPos = Math.round(Math.min(Math.max(valueCanvasPos.top, 0), this.height) - 6);\n    }\n\n    const handleElem = $(this.getHandleHtml(handleIndex, model, valueStr));\n    this.placeholder.append(handleElem);\n\n    handleElem.toggleClass('alert-handle-wrapper--no-value', valueStr === '');\n    handleElem.css({ top: handleTopPos });\n  }\n\n  shouldDrawHandles() {\n    // @ts-ignore\n    return !this.hasSecondYAxis && this.panelCtrl.editingThresholds && this.panelCtrl.panel.thresholds.length > 0;\n  }\n\n  prepare(elem: JQuery, data: any[]) {\n    this.hasSecondYAxis = false;\n    for (let i = 0; i < data.length; i++) {\n      if (data[i].yaxis > 1) {\n        this.hasSecondYAxis = true;\n        break;\n      }\n    }\n\n    if (this.shouldDrawHandles()) {\n      const thresholdMargin = this.panelCtrl.panel.thresholds.length > 1 ? '220px' : '110px';\n      elem.css('margin-right', thresholdMargin);\n    } else if (this.needsCleanup) {\n      elem.css('margin-right', '0');\n    }\n  }\n\n  draw(plot: any) {\n    this.thresholds = this.panelCtrl.panel.thresholds;\n    this.plot = plot;\n    this.placeholder = plot.getPlaceholder();\n\n    if (this.needsCleanup) {\n      this.cleanUp();\n    }\n\n    if (!this.shouldDrawHandles()) {\n      return;\n    }\n\n    this.height = plot.height();\n\n    if (this.thresholds.length > 0) {\n      this.renderHandle(0, 10);\n    }\n    if (this.thresholds.length > 1) {\n      this.renderHandle(1, this.height - 30);\n    }\n\n    this.placeholder.off('mousedown', '.alert-handle');\n    this.placeholder.on('mousedown', '.alert-handle', this.initDragging.bind(this));\n    this.needsCleanup = true;\n  }\n\n  addFlotOptions(options: any, panel: any) {\n    if (!panel.thresholds || panel.thresholds.length === 0) {\n      return;\n    }\n\n    let gtLimit = Infinity;\n    let ltLimit = -Infinity;\n    let i, threshold, other;\n\n    for (i = 0; i < panel.thresholds.length; i++) {\n      threshold = panel.thresholds[i];\n      if (!_.isNumber(threshold.value)) {\n        continue;\n      }\n\n      let limit;\n      switch (threshold.op) {\n        case 'gt': {\n          limit = gtLimit;\n          // if next threshold is less then op and greater value, then use that as limit\n          if (panel.thresholds.length > i + 1) {\n            other = panel.thresholds[i + 1];\n            if (other.value > threshold.value) {\n              limit = other.value;\n              ltLimit = limit;\n            }\n          }\n          break;\n        }\n        case 'lt': {\n          limit = ltLimit;\n          // if next threshold is less then op and greater value, then use that as limit\n          if (panel.thresholds.length > i + 1) {\n            other = panel.thresholds[i + 1];\n            if (other.value < threshold.value) {\n              limit = other.value;\n              gtLimit = limit;\n            }\n          }\n          break;\n        }\n      }\n\n      let fillColor, lineColor;\n\n      switch (threshold.colorMode) {\n        case 'critical': {\n          fillColor = 'rgba(234, 112, 112, 0.12)';\n          lineColor = 'rgba(237, 46, 24, 0.60)';\n          break;\n        }\n        case 'warning': {\n          fillColor = 'rgba(235, 138, 14, 0.12)';\n          lineColor = 'rgba(247, 149, 32, 0.60)';\n          break;\n        }\n        case 'ok': {\n          fillColor = 'rgba(11, 237, 50, 0.090)';\n          lineColor = 'rgba(6,163,69, 0.60)';\n          break;\n        }\n        case 'custom': {\n          fillColor = threshold.fillColor;\n          lineColor = threshold.lineColor;\n          break;\n        }\n      }\n\n      // fill\n      if (threshold.fill) {\n        if (threshold.yaxis === 'right' && this.hasSecondYAxis) {\n          options.grid.markings.push({\n            y2axis: { from: threshold.value, to: limit },\n            color: getColorFromHexRgbOrName(fillColor),\n          });\n        } else {\n          options.grid.markings.push({\n            yaxis: { from: threshold.value, to: limit },\n            color: getColorFromHexRgbOrName(fillColor),\n          });\n        }\n      }\n      if (threshold.line) {\n        if (threshold.yaxis === 'right' && this.hasSecondYAxis) {\n          options.grid.markings.push({\n            y2axis: { from: threshold.value, to: threshold.value },\n            color: getColorFromHexRgbOrName(lineColor),\n          });\n        } else {\n          options.grid.markings.push({\n            yaxis: { from: threshold.value, to: threshold.value },\n            color: getColorFromHexRgbOrName(lineColor),\n          });\n        }\n      }\n    }\n  }\n}\n","import 'vendor/flot/jquery.flot';\nimport _ from 'lodash';\nimport { GrafanaThemeType, getColorFromHexRgbOrName, dateTime, DateTime, AbsoluteTimeRange } from '@grafana/data';\n\ntype TimeRegionColorDefinition = {\n  fill: string | null;\n  line: string | null;\n};\n\nexport const colorModes: any = {\n  gray: {\n    themeDependent: true,\n    title: 'Gray',\n    darkColor: { fill: 'rgba(255, 255, 255, 0.09)', line: 'rgba(255, 255, 255, 0.2)' },\n    lightColor: { fill: 'rgba(0, 0, 0, 0.09)', line: 'rgba(0, 0, 0, 0.2)' },\n  },\n  red: {\n    title: 'Red',\n    color: { fill: 'rgba(234, 112, 112, 0.12)', line: 'rgba(237, 46, 24, 0.60)' },\n  },\n  green: {\n    title: 'Green',\n    color: { fill: 'rgba(11, 237, 50, 0.090)', line: 'rgba(6,163,69, 0.60)' },\n  },\n  blue: {\n    title: 'Blue',\n    color: { fill: 'rgba(11, 125, 238, 0.12)', line: 'rgba(11, 125, 238, 0.60)' },\n  },\n  yellow: {\n    title: 'Yellow',\n    color: { fill: 'rgba(235, 138, 14, 0.12)', line: 'rgba(247, 149, 32, 0.60)' },\n  },\n  custom: { title: 'Custom' },\n};\n\nexport function getColorModes() {\n  return _.map(Object.keys(colorModes), key => {\n    return {\n      key,\n      value: colorModes[key].title,\n    };\n  });\n}\n\nfunction getColor(timeRegion: any, theme: GrafanaThemeType): TimeRegionColorDefinition {\n  if (Object.keys(colorModes).indexOf(timeRegion.colorMode) === -1) {\n    timeRegion.colorMode = 'red';\n  }\n\n  if (timeRegion.colorMode === 'custom') {\n    return {\n      fill: timeRegion.fill && timeRegion.fillColor ? getColorFromHexRgbOrName(timeRegion.fillColor, theme) : null,\n      line: timeRegion.line && timeRegion.lineColor ? getColorFromHexRgbOrName(timeRegion.lineColor, theme) : null,\n    };\n  }\n\n  const colorMode = colorModes[timeRegion.colorMode];\n\n  if (colorMode.themeDependent === true) {\n    return theme === GrafanaThemeType.Light ? colorMode.lightColor : colorMode.darkColor;\n  }\n\n  return {\n    fill: timeRegion.fill ? getColorFromHexRgbOrName(colorMode.color.fill, theme) : null,\n    line: timeRegion.fill ? getColorFromHexRgbOrName(colorMode.color.line, theme) : null,\n  };\n}\n\nexport class TimeRegionManager {\n  plot: any;\n  timeRegions: any;\n\n  constructor(private panelCtrl: any, private theme: GrafanaThemeType = GrafanaThemeType.Dark) {}\n\n  draw(plot: any) {\n    this.timeRegions = this.panelCtrl.panel.timeRegions;\n    this.plot = plot;\n  }\n\n  addFlotOptions(options: any, panel: any) {\n    if (!panel.timeRegions || panel.timeRegions.length === 0) {\n      return;\n    }\n\n    const tRange = {\n      from: dateTime(this.panelCtrl.range.from).utc(),\n      to: dateTime(this.panelCtrl.range.to).utc(),\n    };\n\n    let i: number,\n      hRange: { from: any; to: any },\n      timeRegion: any,\n      regions: AbsoluteTimeRange[],\n      fromStart: DateTime,\n      fromEnd: DateTime,\n      timeRegionColor: TimeRegionColorDefinition;\n\n    const timeRegionsCopy = panel.timeRegions.map((a: any) => ({ ...a }));\n\n    for (i = 0; i < timeRegionsCopy.length; i++) {\n      timeRegion = timeRegionsCopy[i];\n\n      if (!(timeRegion.fromDayOfWeek || timeRegion.from) && !(timeRegion.toDayOfWeek || timeRegion.to)) {\n        continue;\n      }\n\n      if (timeRegion.from && !timeRegion.to) {\n        timeRegion.to = timeRegion.from;\n      }\n\n      if (!timeRegion.from && timeRegion.to) {\n        timeRegion.from = timeRegion.to;\n      }\n\n      hRange = {\n        from: this.parseTimeRange(timeRegion.from),\n        to: this.parseTimeRange(timeRegion.to),\n      };\n\n      if (!timeRegion.fromDayOfWeek && timeRegion.toDayOfWeek) {\n        timeRegion.fromDayOfWeek = timeRegion.toDayOfWeek;\n      }\n\n      if (!timeRegion.toDayOfWeek && timeRegion.fromDayOfWeek) {\n        timeRegion.toDayOfWeek = timeRegion.fromDayOfWeek;\n      }\n\n      if (timeRegion.fromDayOfWeek) {\n        hRange.from.dayOfWeek = Number(timeRegion.fromDayOfWeek);\n      }\n\n      if (timeRegion.toDayOfWeek) {\n        hRange.to.dayOfWeek = Number(timeRegion.toDayOfWeek);\n      }\n\n      if (hRange.from.dayOfWeek && hRange.from.h === null && hRange.from.m === null) {\n        hRange.from.h = 0;\n        hRange.from.m = 0;\n        hRange.from.s = 0;\n      }\n\n      if (hRange.to.dayOfWeek && hRange.to.h === null && hRange.to.m === null) {\n        hRange.to.h = 23;\n        hRange.to.m = 59;\n        hRange.to.s = 59;\n      }\n\n      if (!hRange.from || !hRange.to) {\n        continue;\n      }\n\n      regions = [];\n\n      fromStart = dateTime(tRange.from);\n      fromStart.set('hour', 0);\n      fromStart.set('minute', 0);\n      fromStart.set('second', 0);\n      fromStart.add(hRange.from.h, 'hours');\n      fromStart.add(hRange.from.m, 'minutes');\n      fromStart.add(hRange.from.s, 'seconds');\n\n      while (fromStart.unix() <= tRange.to.unix()) {\n        while (hRange.from.dayOfWeek && hRange.from.dayOfWeek !== fromStart.isoWeekday()) {\n          fromStart.add(24, 'hours');\n        }\n\n        if (fromStart.unix() > tRange.to.unix()) {\n          break;\n        }\n\n        fromEnd = dateTime(fromStart);\n\n        if (fromEnd.hour) {\n          if (hRange.from.h <= hRange.to.h) {\n            fromEnd.add(hRange.to.h - hRange.from.h, 'hours');\n          } else if (hRange.from.h > hRange.to.h) {\n            while (fromEnd.hour() !== hRange.to.h) {\n              fromEnd.add(1, 'hours');\n            }\n          } else {\n            fromEnd.add(24 - hRange.from.h, 'hours');\n\n            while (fromEnd.hour() !== hRange.to.h) {\n              fromEnd.add(1, 'hours');\n            }\n          }\n        }\n\n        fromEnd.set('minute', hRange.to.m);\n        fromEnd.set('second', hRange.to.s);\n\n        while (hRange.to.dayOfWeek && hRange.to.dayOfWeek !== fromEnd.isoWeekday()) {\n          fromEnd.add(24, 'hours');\n        }\n\n        const outsideRange =\n          (fromStart.unix() < tRange.from.unix() && fromEnd.unix() < tRange.from.unix()) ||\n          (fromStart.unix() > tRange.to.unix() && fromEnd.unix() > tRange.to.unix());\n\n        if (!outsideRange) {\n          regions.push({ from: fromStart.valueOf(), to: fromEnd.valueOf() });\n        }\n\n        fromStart.add(24, 'hours');\n      }\n\n      timeRegionColor = getColor(timeRegion, this.theme);\n\n      for (let j = 0; j < regions.length; j++) {\n        const r = regions[j];\n        if (timeRegion.fill) {\n          options.grid.markings.push({\n            xaxis: { from: r.from, to: r.to },\n            color: timeRegionColor.fill,\n          });\n        }\n\n        if (timeRegion.line) {\n          options.grid.markings.push({\n            xaxis: { from: r.from, to: r.from },\n            color: timeRegionColor.line,\n          });\n          options.grid.markings.push({\n            xaxis: { from: r.to, to: r.to },\n            color: timeRegionColor.line,\n          });\n        }\n      }\n    }\n  }\n\n  parseTimeRange(str: string) {\n    const timeRegex = /^([\\d]+):?(\\d{2})?/;\n    const result: any = { h: null, m: null };\n    const match = timeRegex.exec(str);\n\n    if (!match) {\n      return result;\n    }\n\n    if (match.length > 1) {\n      result.h = Number(match[1]);\n      result.m = 0;\n\n      if (match.length > 2 && match[2] !== undefined) {\n        result.m = Number(match[2]);\n      }\n\n      if (result.h > 23) {\n        result.h = 23;\n      }\n\n      if (result.m > 59) {\n        result.m = 59;\n      }\n    }\n\n    return result;\n  }\n}\n","import _ from 'lodash';\nimport TimeSeries from 'app/core/time_series2';\n\n/**\n * Convert series into array of series values.\n * @param data Array of series\n */\nexport function getSeriesValues(dataList: TimeSeries[]): number[] {\n  const VALUE_INDEX = 0;\n  const values = [];\n\n  // Count histogam stats\n  for (let i = 0; i < dataList.length; i++) {\n    const series = dataList[i];\n    const datapoints = series.datapoints;\n    for (let j = 0; j < datapoints.length; j++) {\n      if (datapoints[j][VALUE_INDEX] !== null) {\n        values.push(datapoints[j][VALUE_INDEX]);\n      }\n    }\n  }\n\n  return values;\n}\n\n/**\n * Convert array of values into timeseries-like histogram:\n * [[val_1, count_1], [val_2, count_2], ..., [val_n, count_n]]\n * @param values\n * @param bucketSize\n */\nexport function convertValuesToHistogram(values: number[], bucketSize: number, min: number, max: number): any[] {\n  const histogram: any = {};\n\n  const minBound = getBucketBound(min, bucketSize);\n  const maxBound = getBucketBound(max, bucketSize);\n  let bound = minBound;\n  let n = 0;\n  while (bound <= maxBound) {\n    histogram[bound] = 0;\n    bound = minBound + bucketSize * n;\n    n++;\n  }\n\n  for (let i = 0; i < values.length; i++) {\n    // filter out values outside the min and max boundaries\n    if (values[i] < min || values[i] > max) {\n      continue;\n    }\n    const bound = getBucketBound(values[i], bucketSize);\n    histogram[bound] = histogram[bound] + 1;\n  }\n\n  const histogamSeries = _.map(histogram, (count, bound) => {\n    return [Number(bound), count];\n  });\n\n  // Sort by Y axis values\n  return _.sortBy(histogamSeries, point => point[0]);\n}\n\n/**\n * Convert series into array of histogram data.\n * @param data Array of series\n * @param bucketSize\n */\nexport function convertToHistogramData(\n  data: any,\n  bucketSize: number,\n  hiddenSeries: any,\n  min: number,\n  max: number\n): any[] {\n  return data.map((series: any) => {\n    const values = getSeriesValues([series]);\n    series.histogram = true;\n    if (!hiddenSeries[series.alias]) {\n      const histogram = convertValuesToHistogram(values, bucketSize, min, max);\n      series.data = histogram;\n    } else {\n      series.data = [];\n    }\n    return series;\n  });\n}\n\nfunction getBucketBound(value: number, bucketSize: number): number {\n  return Math.floor(value / bucketSize) * bucketSize;\n}\n","import _ from 'lodash';\n\n/**\n * To align two Y axes by Y level\n * @param yAxes data [{min: min_y1, min: max_y1}, {min: min_y2, max: max_y2}]\n * @param level Y level\n */\nexport function alignYLevel(yAxes: any, level: any) {\n  if (isNaN(level) || !checkCorrectAxis(yAxes)) {\n    return;\n  }\n\n  const [yLeft, yRight] = yAxes;\n  moveLevelToZero(yLeft, yRight, level);\n\n  expandStuckValues(yLeft, yRight);\n\n  // one of graphs on zero\n  const zero = yLeft.min === 0 || yRight.min === 0 || yLeft.max === 0 || yRight.max === 0;\n\n  const oneSide = checkOneSide(yLeft, yRight);\n\n  if (zero && oneSide) {\n    yLeft.min = yLeft.max > 0 ? 0 : yLeft.min;\n    yLeft.max = yLeft.max > 0 ? yLeft.max : 0;\n    yRight.min = yRight.max > 0 ? 0 : yRight.min;\n    yRight.max = yRight.max > 0 ? yRight.max : 0;\n  } else {\n    if (checkOppositeSides(yLeft, yRight)) {\n      if (yLeft.min >= 0) {\n        yLeft.min = -yLeft.max;\n        yRight.max = -yRight.min;\n      } else {\n        yLeft.max = -yLeft.min;\n        yRight.min = -yRight.max;\n      }\n    } else {\n      const rate = getRate(yLeft, yRight);\n\n      if (oneSide) {\n        // all graphs above the Y level\n        if (yLeft.min > 0) {\n          yLeft.min = yLeft.max / rate;\n          yRight.min = yRight.max / rate;\n        } else {\n          yLeft.max = yLeft.min / rate;\n          yRight.max = yRight.min / rate;\n        }\n      } else {\n        if (checkTwoCross(yLeft, yRight)) {\n          yLeft.min = yRight.min ? yRight.min * rate : yLeft.min;\n          yRight.min = yLeft.min ? yLeft.min / rate : yRight.min;\n          yLeft.max = yRight.max ? yRight.max * rate : yLeft.max;\n          yRight.max = yLeft.max ? yLeft.max / rate : yRight.max;\n        } else {\n          yLeft.min = yLeft.min > 0 ? yRight.min * rate : yLeft.min;\n          yRight.min = yRight.min > 0 ? yLeft.min / rate : yRight.min;\n          yLeft.max = yLeft.max < 0 ? yRight.max * rate : yLeft.max;\n          yRight.max = yRight.max < 0 ? yLeft.max / rate : yRight.max;\n        }\n      }\n    }\n  }\n\n  restoreLevelFromZero(yLeft, yRight, level);\n}\n\nfunction expandStuckValues(yLeft: { max: number; min: number }, yRight: { max: number; min: number }) {\n  // wide Y min and max using increased wideFactor\n  const wideFactor = 0.25;\n  if (yLeft.max === yLeft.min) {\n    yLeft.min -= wideFactor;\n    yLeft.max += wideFactor;\n  }\n  if (yRight.max === yRight.min) {\n    yRight.min -= wideFactor;\n    yRight.max += wideFactor;\n  }\n}\n\nfunction moveLevelToZero(yLeft: { min: number; max: number }, yRight: { min: number; max: number }, level: number) {\n  if (level !== 0) {\n    yLeft.min -= level;\n    yLeft.max -= level;\n    yRight.min -= level;\n    yRight.max -= level;\n  }\n}\n\nfunction restoreLevelFromZero(\n  yLeft: { min: number; max: number },\n  yRight: { min: number; max: number },\n  level: number\n) {\n  if (level !== 0) {\n    yLeft.min += level;\n    yLeft.max += level;\n    yRight.min += level;\n    yRight.max += level;\n  }\n}\n\ninterface AxisSide {\n  max: number;\n  min: number;\n}\n\nfunction checkCorrectAxis(axis: any[]): boolean {\n  return axis.length === 2 && checkCorrectAxes(axis[0]) && checkCorrectAxes(axis[1]);\n}\n\nfunction checkCorrectAxes(axes: any): boolean {\n  return 'min' in axes && 'max' in axes;\n}\n\nfunction checkOneSide(yLeft: AxisSide, yRight: AxisSide): boolean {\n  // on the one hand with respect to zero\n  return (yLeft.min >= 0 && yRight.min >= 0) || (yLeft.max <= 0 && yRight.max <= 0);\n}\n\nfunction checkTwoCross(yLeft: AxisSide, yRight: AxisSide): boolean {\n  // both across zero\n  return yLeft.min <= 0 && yLeft.max >= 0 && yRight.min <= 0 && yRight.max >= 0;\n}\n\nfunction checkOppositeSides(yLeft: AxisSide, yRight: AxisSide): boolean {\n  // on the opposite sides with respect to zero\n  return (yLeft.min >= 0 && yRight.max <= 0) || (yLeft.max <= 0 && yRight.min >= 0);\n}\n\nfunction getRate(yLeft: AxisSide, yRight: AxisSide): number {\n  if (checkTwoCross(yLeft, yRight)) {\n    const rateLeft = yRight.min ? yLeft.min / yRight.min : 0;\n    const rateRight = yRight.max ? yLeft.max / yRight.max : 0;\n\n    return rateLeft > rateRight ? rateLeft : rateRight;\n  }\n\n  if (checkOneSide(yLeft, yRight)) {\n    const absLeftMin = Math.abs(yLeft.min);\n    const absLeftMax = Math.abs(yLeft.max);\n    const absRightMin = Math.abs(yRight.min);\n    const absRightMax = Math.abs(yRight.max);\n    const upLeft = Math.max(absLeftMin, absLeftMax);\n    const downLeft = Math.min(absLeftMin, absLeftMax);\n    const upRight = Math.max(absRightMin, absRightMax);\n    const downRight = Math.min(absRightMin, absRightMax);\n\n    const rateLeft = downLeft !== 0 ? upLeft / downLeft : upLeft;\n    const rateRight = downRight !== 0 ? upRight / downRight : upRight;\n\n    return rateLeft > rateRight ? rateLeft : rateRight;\n  }\n\n  if (yLeft.min > 0 || yRight.min > 0) {\n    return yLeft.max / yRight.max;\n  } else {\n    return yLeft.min / yRight.min;\n  }\n}\n","import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { TimeSeries } from 'app/core/core';\nimport { Icon, SeriesColorPicker } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport const LEGEND_STATS = ['min', 'max', 'avg', 'current', 'total'];\n\nexport interface LegendLabelProps {\n  series: TimeSeries;\n  asTable?: boolean;\n  hidden?: boolean;\n  onLabelClick: (series: any, event: any) => void;\n  onColorChange: (series: any, color: string) => void;\n  onToggleAxis: (series: any) => void;\n}\n\nexport interface LegendValuesProps {\n  values?: boolean;\n  min?: boolean;\n  max?: boolean;\n  avg?: boolean;\n  current?: boolean;\n  total?: boolean;\n}\n\ntype LegendItemProps = LegendLabelProps & LegendValuesProps;\n\ninterface LegendItemState {\n  yaxis: number;\n}\n\nexport class LegendItem extends PureComponent<LegendItemProps, LegendItemState> {\n  static defaultProps = {\n    asTable: false,\n    hidden: false,\n    onLabelClick: () => {},\n    onColorChange: () => {},\n    onToggleAxis: () => {},\n  };\n\n  constructor(props: LegendItemProps) {\n    super(props);\n    this.state = {\n      yaxis: this.props.series.yaxis,\n    };\n  }\n\n  onLabelClick = (e: any) => this.props.onLabelClick(this.props.series, e);\n\n  onToggleAxis = () => {\n    const yaxis = this.state.yaxis === 2 ? 1 : 2;\n    const info = { alias: this.props.series.alias, yaxis: yaxis };\n    this.setState({ yaxis: yaxis });\n    this.props.onToggleAxis(info);\n  };\n\n  onColorChange = (color: string) => {\n    this.props.onColorChange(this.props.series, color);\n    // Because of PureComponent nature it makes only shallow props comparison and changing of series.color doesn't run\n    // component re-render. In this case we can't rely on color, selected by user, because it may be overwritten\n    // by series overrides. So we need to use forceUpdate() to make sure we have proper series color.\n    this.forceUpdate();\n  };\n\n  renderLegendValues() {\n    const { series, asTable } = this.props;\n    const legendValueItems = [];\n    for (const valueName of LEGEND_STATS) {\n      // @ts-ignore\n      if (this.props[valueName]) {\n        const valueFormatted = series.formatValue(series.stats[valueName]);\n        legendValueItems.push(\n          <LegendValue key={valueName} valueName={valueName} value={valueFormatted} asTable={asTable} />\n        );\n      }\n    }\n    return legendValueItems;\n  }\n\n  render() {\n    const { series, values, asTable, hidden } = this.props;\n    const seriesOptionClasses = classNames({\n      'graph-legend-series-hidden': hidden,\n      'graph-legend-series--right-y': series.yaxis === 2,\n    });\n    const valueItems = values ? this.renderLegendValues() : [];\n    const seriesLabel = (\n      <LegendSeriesLabel\n        label={series.alias}\n        color={series.color}\n        yaxis={this.state.yaxis}\n        onLabelClick={this.onLabelClick}\n        onColorChange={this.onColorChange}\n        onToggleAxis={this.onToggleAxis}\n      />\n    );\n\n    if (asTable) {\n      return (\n        <tr className={`graph-legend-series ${seriesOptionClasses}`}>\n          <td>{seriesLabel}</td>\n          {valueItems}\n        </tr>\n      );\n    } else {\n      return (\n        <div className={`graph-legend-series ${seriesOptionClasses}`}>\n          {seriesLabel}\n          {valueItems}\n        </div>\n      );\n    }\n  }\n}\n\ninterface LegendSeriesLabelProps {\n  label: string;\n  color: string;\n  yaxis?: number;\n  onLabelClick?: (event: any) => void;\n}\n\nclass LegendSeriesLabel extends PureComponent<LegendSeriesLabelProps & LegendSeriesIconProps> {\n  static defaultProps: Partial<LegendSeriesLabelProps> = {\n    yaxis: undefined,\n    onLabelClick: () => {},\n  };\n\n  render() {\n    const { label, color, yaxis } = this.props;\n    const { onColorChange, onToggleAxis } = this.props;\n    return [\n      <LegendSeriesIcon\n        key=\"icon\"\n        color={color}\n        yaxis={yaxis}\n        onColorChange={onColorChange}\n        onToggleAxis={onToggleAxis}\n      />,\n      <a\n        className=\"graph-legend-alias pointer\"\n        title={label}\n        key=\"label\"\n        onClick={e => this.props.onLabelClick(e)}\n        aria-label={selectors.components.Panels.Visualization.Graph.Legend.legendItemAlias(label)}\n      >\n        {label}\n      </a>,\n    ];\n  }\n}\n\ninterface LegendSeriesIconProps {\n  color: string;\n  yaxis?: number;\n  onColorChange?: (color: string) => void;\n  onToggleAxis?: () => void;\n}\n\ninterface LegendSeriesIconState {\n  color: string;\n}\n\nfunction SeriesIcon({ color }: { color: string }) {\n  return <Icon name=\"minus\" style={{ color }} />;\n}\n\nclass LegendSeriesIcon extends PureComponent<LegendSeriesIconProps, LegendSeriesIconState> {\n  static defaultProps: Partial<LegendSeriesIconProps> = {\n    yaxis: undefined,\n    onColorChange: () => {},\n    onToggleAxis: () => {},\n  };\n\n  render() {\n    return (\n      <SeriesColorPicker\n        yaxis={this.props.yaxis}\n        color={this.props.color}\n        onChange={this.props.onColorChange}\n        onToggleAxis={this.props.onToggleAxis}\n        enableNamedColors\n      >\n        {({ ref, showColorPicker, hideColorPicker }) => (\n          <span ref={ref} onClick={showColorPicker} onMouseLeave={hideColorPicker} className=\"graph-legend-icon\">\n            <SeriesIcon color={this.props.color} />\n          </span>\n        )}\n      </SeriesColorPicker>\n    );\n  }\n}\n\ninterface LegendValueProps {\n  value: string;\n  valueName: string;\n  asTable?: boolean;\n}\n\nfunction LegendValue(props: LegendValueProps) {\n  const value = props.value;\n  const valueName = props.valueName;\n  if (props.asTable) {\n    return <td className={`graph-legend-value ${valueName}`}>{value}</td>;\n  }\n  return <div className={`graph-legend-value ${valueName}`}>{value}</div>;\n}\n","import _ from 'lodash';\nimport React, { PureComponent } from 'react';\nimport { TimeSeries } from 'app/core/core';\nimport { CustomScrollbar, Icon } from '@grafana/ui';\nimport { LegendItem, LEGEND_STATS } from './LegendSeriesItem';\n\ntype Sort = 'min' | 'max' | 'avg' | 'current' | 'total';\ninterface LegendProps {\n  seriesList: TimeSeries[];\n  optionalClass?: string;\n}\n\ninterface LegendEventHandlers {\n  onToggleSeries?: (hiddenSeries: any) => void;\n  onToggleSort?: (sortBy: any, sortDesc: any) => void;\n  onToggleAxis?: (series: TimeSeries) => void;\n  onColorChange?: (series: TimeSeries, color: string) => void;\n}\n\ninterface LegendComponentEventHandlers {\n  onToggleSeries?: (series: TimeSeries, event: any) => void;\n  onToggleSort?: (sortBy: Sort, sortDesc: any) => void;\n  onToggleAxis?: (series: TimeSeries) => void;\n  onColorChange?: (series: TimeSeries, color: string) => void;\n}\n\ninterface LegendDisplayProps {\n  hiddenSeries: any;\n  hideEmpty?: boolean;\n  hideZero?: boolean;\n  alignAsTable?: boolean;\n  rightSide?: boolean;\n  sideWidth?: number;\n}\n\ninterface LegendValuesProps {\n  values?: boolean;\n  min?: boolean;\n  max?: boolean;\n  avg?: boolean;\n  current?: boolean;\n  total?: boolean;\n}\n\ninterface LegendSortProps {\n  sort?: Sort;\n  sortDesc?: boolean;\n}\n\nexport type GraphLegendProps = LegendProps &\n  LegendDisplayProps &\n  LegendValuesProps &\n  LegendSortProps &\n  LegendEventHandlers;\nexport type LegendComponentProps = LegendProps &\n  LegendDisplayProps &\n  LegendValuesProps &\n  LegendSortProps &\n  LegendComponentEventHandlers;\n\ninterface LegendState {\n  hiddenSeries: { [seriesAlias: string]: boolean };\n}\n\nexport class GraphLegend extends PureComponent<GraphLegendProps, LegendState> {\n  static defaultProps: Partial<GraphLegendProps> = {\n    values: false,\n    min: false,\n    max: false,\n    avg: false,\n    current: false,\n    total: false,\n    alignAsTable: false,\n    rightSide: false,\n    sort: undefined,\n    sortDesc: false,\n    optionalClass: '',\n    onToggleSeries: () => {},\n    onToggleSort: () => {},\n    onToggleAxis: () => {},\n    onColorChange: () => {},\n  };\n\n  constructor(props: GraphLegendProps) {\n    super(props);\n    this.state = {\n      hiddenSeries: this.props.hiddenSeries,\n    };\n  }\n\n  sortLegend() {\n    let seriesList: TimeSeries[] = [...this.props.seriesList] || [];\n    if (this.props.sort && this.props[this.props.sort] && this.props.alignAsTable) {\n      seriesList = _.sortBy(seriesList, series => {\n        let sort = series.stats[this.props.sort];\n        if (sort === null) {\n          sort = -Infinity;\n        }\n        return sort;\n      }) as TimeSeries[];\n      if (this.props.sortDesc) {\n        seriesList = seriesList.reverse();\n      }\n    }\n    return seriesList;\n  }\n\n  onToggleSeries = (series: TimeSeries, event: any) => {\n    let hiddenSeries = { ...this.state.hiddenSeries };\n    if (event.ctrlKey || event.metaKey || event.shiftKey) {\n      if (hiddenSeries[series.alias]) {\n        delete hiddenSeries[series.alias];\n      } else {\n        hiddenSeries[series.alias] = true;\n      }\n    } else {\n      hiddenSeries = this.toggleSeriesExclusiveMode(series);\n    }\n    this.setState({ hiddenSeries: hiddenSeries });\n    this.props.onToggleSeries(hiddenSeries);\n  };\n\n  toggleSeriesExclusiveMode(series: TimeSeries) {\n    const hiddenSeries = { ...this.state.hiddenSeries };\n\n    if (hiddenSeries[series.alias]) {\n      delete hiddenSeries[series.alias];\n    }\n\n    // check if every other series is hidden\n    const alreadyExclusive = this.props.seriesList.every(value => {\n      if (value.alias === series.alias) {\n        return true;\n      }\n\n      return hiddenSeries[value.alias];\n    });\n\n    if (alreadyExclusive) {\n      // remove all hidden series\n      this.props.seriesList.forEach(value => {\n        delete hiddenSeries[value.alias];\n      });\n    } else {\n      // hide all but this serie\n      this.props.seriesList.forEach(value => {\n        if (value.alias === series.alias) {\n          return;\n        }\n\n        hiddenSeries[value.alias] = true;\n      });\n    }\n\n    return hiddenSeries;\n  }\n\n  render() {\n    const {\n      optionalClass,\n      rightSide,\n      sideWidth,\n      sort,\n      sortDesc,\n      hideEmpty,\n      hideZero,\n      values,\n      min,\n      max,\n      avg,\n      current,\n      total,\n    } = this.props;\n    const seriesValuesProps = { values, min, max, avg, current, total };\n    const hiddenSeries = this.state.hiddenSeries;\n    const seriesHideProps = { hideEmpty, hideZero };\n    const sortProps = { sort, sortDesc };\n    const seriesList = this.sortLegend().filter(series => !series.hideFromLegend(seriesHideProps));\n    const legendClass = `${this.props.alignAsTable ? 'graph-legend-table' : ''} ${optionalClass}`;\n\n    // Set min-width if side style and there is a value, otherwise remove the CSS property\n    // Set width so it works with IE11\n    const width: any = rightSide && sideWidth ? sideWidth : undefined;\n    const ieWidth: any = rightSide && sideWidth ? sideWidth - 1 : undefined;\n    const legendStyle: React.CSSProperties = {\n      minWidth: width,\n      width: ieWidth,\n    };\n\n    const legendProps: LegendComponentProps = {\n      seriesList: seriesList,\n      hiddenSeries: hiddenSeries,\n      onToggleSeries: this.onToggleSeries,\n      onToggleAxis: this.props.onToggleAxis,\n      onToggleSort: this.props.onToggleSort,\n      onColorChange: this.props.onColorChange,\n      ...seriesValuesProps,\n      ...sortProps,\n    };\n\n    return (\n      <div className={`graph-legend-content ${legendClass}`} style={legendStyle}>\n        {this.props.alignAsTable ? <LegendTable {...legendProps} /> : <LegendSeriesList {...legendProps} />}\n      </div>\n    );\n  }\n}\n\nclass LegendSeriesList extends PureComponent<LegendComponentProps> {\n  render() {\n    const { seriesList, hiddenSeries, values, min, max, avg, current, total } = this.props;\n    const seriesValuesProps = { values, min, max, avg, current, total };\n    return seriesList.map((series, i) => (\n      <LegendItem\n        // This trick required because TimeSeries.id is not unique (it's just TimeSeries.alias).\n        // In future would be good to make id unique across the series list.\n        key={`${series.id}-${i}`}\n        series={series}\n        hidden={hiddenSeries[series.alias]}\n        {...seriesValuesProps}\n        onLabelClick={this.props.onToggleSeries}\n        onColorChange={this.props.onColorChange}\n        onToggleAxis={this.props.onToggleAxis}\n      />\n    ));\n  }\n}\n\nclass LegendTable extends PureComponent<Partial<LegendComponentProps>> {\n  onToggleSort = (stat: Sort) => {\n    let sortDesc = this.props.sortDesc;\n    let sortBy = this.props.sort;\n    if (stat !== sortBy) {\n      sortDesc = null;\n    }\n\n    // if already sort ascending, disable sorting\n    if (sortDesc === false) {\n      sortBy = null;\n      sortDesc = null;\n    } else {\n      sortDesc = !sortDesc;\n      sortBy = stat;\n    }\n    this.props.onToggleSort(sortBy, sortDesc);\n  };\n\n  render() {\n    const seriesList = this.props.seriesList;\n    const { values, min, max, avg, current, total, sort, sortDesc, hiddenSeries } = this.props;\n    const seriesValuesProps: any = { values, min, max, avg, current, total };\n    return (\n      <table>\n        <colgroup>\n          <col style={{ width: '100%' }} />\n        </colgroup>\n        <thead>\n          <tr>\n            <th style={{ textAlign: 'left' }} />\n            {LEGEND_STATS.map(\n              statName =>\n                seriesValuesProps[statName] && (\n                  <LegendTableHeaderItem\n                    key={statName}\n                    statName={statName}\n                    sort={sort}\n                    sortDesc={sortDesc}\n                    onClick={this.onToggleSort}\n                  />\n                )\n            )}\n          </tr>\n        </thead>\n        <tbody>\n          {seriesList.map((series, i) => (\n            <LegendItem\n              key={`${series.id}-${i}`}\n              asTable={true}\n              series={series}\n              hidden={hiddenSeries[series.alias]}\n              onLabelClick={this.props.onToggleSeries}\n              onColorChange={this.props.onColorChange}\n              onToggleAxis={this.props.onToggleAxis}\n              {...seriesValuesProps}\n            />\n          ))}\n        </tbody>\n      </table>\n    );\n  }\n}\n\ninterface LegendTableHeaderProps {\n  statName: string;\n  onClick?: (statName: string) => void;\n}\n\nclass LegendTableHeaderItem extends PureComponent<LegendTableHeaderProps & LegendSortProps> {\n  onClick = () => this.props.onClick(this.props.statName);\n\n  render() {\n    const { statName, sort, sortDesc } = this.props;\n    return (\n      <th className=\"pointer\" onClick={this.onClick}>\n        {statName}\n        {sort === statName && <Icon name={sortDesc ? 'angle-down' : 'angle-up'} />}\n      </th>\n    );\n  }\n}\n\nexport class Legend extends PureComponent<GraphLegendProps> {\n  render() {\n    return (\n      <CustomScrollbar hideHorizontalTrack>\n        <GraphLegend {...this.props} />\n      </CustomScrollbar>\n    );\n  }\n}\n\nexport default Legend;\n","import 'vendor/flot/jquery.flot';\nimport 'vendor/flot/jquery.flot.selection';\nimport 'vendor/flot/jquery.flot.time';\nimport 'vendor/flot/jquery.flot.stack';\nimport 'vendor/flot/jquery.flot.stackpercent';\nimport 'vendor/flot/jquery.flot.fillbelow';\nimport 'vendor/flot/jquery.flot.crosshair';\nimport 'vendor/flot/jquery.flot.dashes';\nimport './jquery.flot.events';\n\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport { tickStep } from 'app/core/utils/ticks';\nimport { appEvents, coreModule, updateLegendValues } from 'app/core/core';\nimport GraphTooltip from './graph_tooltip';\nimport { ThresholdManager } from './threshold_manager';\nimport { TimeRegionManager } from './time_region_manager';\nimport { EventManager } from 'app/features/annotations/all';\nimport { convertToHistogramData } from './histogram';\nimport { alignYLevel } from './align_yaxes';\nimport config from 'app/core/config';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { GraphLegendProps, Legend } from './Legend/Legend';\n\nimport { GraphCtrl } from './module';\nimport { ContextMenuGroup, ContextMenuItem, graphTimeFormat, graphTickFormatter } from '@grafana/ui';\nimport { getCurrentTheme, provideTheme } from 'app/core/utils/ConfigProvider';\nimport {\n  DataFrame,\n  DataFrameView,\n  FieldDisplay,\n  FieldType,\n  formattedValueToString,\n  getDisplayProcessor,\n  getFlotPairsConstant,\n  getTimeField,\n  getValueFormat,\n  hasLinks,\n  LinkModelSupplier,\n  PanelEvents,\n  toUtc,\n} from '@grafana/data';\nimport { GraphContextMenuCtrl } from './GraphContextMenuCtrl';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { getFieldLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\nimport { CoreEvents } from 'app/types';\n\nconst LegendWithThemeProvider = provideTheme(Legend);\n\nclass GraphElement {\n  ctrl: GraphCtrl;\n  contextMenu: GraphContextMenuCtrl;\n  tooltip: any;\n  dashboard: any;\n  annotations: object[];\n  panel: any;\n  plot: any;\n  sortedSeries: any[];\n  data: any[];\n  panelWidth: number;\n  eventManager: EventManager;\n  thresholdManager: ThresholdManager;\n  timeRegionManager: TimeRegionManager;\n  legendElem: HTMLElement;\n\n  constructor(private scope: any, private elem: JQuery, private timeSrv: TimeSrv) {\n    this.ctrl = scope.ctrl;\n    this.contextMenu = scope.ctrl.contextMenuCtrl;\n    this.dashboard = this.ctrl.dashboard;\n    this.panel = this.ctrl.panel;\n    this.annotations = [];\n\n    this.panelWidth = 0;\n    this.eventManager = new EventManager(this.ctrl);\n    this.thresholdManager = new ThresholdManager(this.ctrl);\n    this.timeRegionManager = new TimeRegionManager(this.ctrl, config.theme.type);\n    // @ts-ignore\n    this.tooltip = new GraphTooltip(this.elem, this.ctrl.dashboard, this.scope, () => {\n      return this.sortedSeries;\n    });\n\n    // panel events\n    this.ctrl.events.on(PanelEvents.panelTeardown, this.onPanelTeardown.bind(this));\n    this.ctrl.events.on(PanelEvents.render, this.onRender.bind(this));\n\n    // global events\n    appEvents.on(CoreEvents.graphHover, this.onGraphHover.bind(this), scope);\n    appEvents.on(CoreEvents.graphHoverClear, this.onGraphHoverClear.bind(this), scope);\n    this.elem.bind('plotselected', this.onPlotSelected.bind(this));\n    this.elem.bind('plotclick', this.onPlotClick.bind(this));\n\n    // get graph legend element\n    if (this.elem && this.elem.parent) {\n      this.legendElem = this.elem.parent().find('.graph-legend')[0];\n    }\n  }\n\n  onRender(renderData: any[]) {\n    this.data = renderData || this.data;\n    if (!this.data) {\n      return;\n    }\n\n    this.annotations = this.ctrl.annotations || [];\n    this.buildFlotPairs(this.data);\n    const graphHeight = this.ctrl.height;\n    updateLegendValues(this.data, this.panel, graphHeight);\n\n    if (!this.panel.legend.show) {\n      if (this.legendElem.hasChildNodes()) {\n        ReactDOM.unmountComponentAtNode(this.legendElem);\n      }\n      this.renderPanel();\n      return;\n    }\n\n    const { values, min, max, avg, current, total } = this.panel.legend;\n    const { alignAsTable, rightSide, sideWidth, sort, sortDesc, hideEmpty, hideZero } = this.panel.legend;\n    const legendOptions = { alignAsTable, rightSide, sideWidth, sort, sortDesc, hideEmpty, hideZero };\n    const valueOptions = { values, min, max, avg, current, total };\n    const legendProps: GraphLegendProps = {\n      seriesList: this.data,\n      hiddenSeries: this.ctrl.hiddenSeries,\n      ...legendOptions,\n      ...valueOptions,\n      onToggleSeries: this.ctrl.onToggleSeries,\n      onToggleSort: this.ctrl.onToggleSort,\n      onColorChange: this.ctrl.onColorChange,\n      onToggleAxis: this.ctrl.onToggleAxis,\n    };\n\n    const legendReactElem = React.createElement(LegendWithThemeProvider, legendProps);\n    ReactDOM.render(legendReactElem, this.legendElem, () => this.renderPanel());\n  }\n\n  onGraphHover(evt: any) {\n    // ignore other graph hover events if shared tooltip is disabled\n    if (!this.dashboard.sharedTooltipModeEnabled()) {\n      return;\n    }\n\n    // ignore if we are the emitter\n    if (!this.plot || evt.panel.id === this.panel.id || this.ctrl.otherPanelInFullscreenMode()) {\n      return;\n    }\n\n    this.tooltip.show(evt.pos);\n  }\n\n  onPanelTeardown() {\n    if (this.plot) {\n      this.plot.destroy();\n      this.plot = null;\n    }\n\n    this.tooltip.destroy();\n    this.elem.off();\n    this.elem.remove();\n\n    ReactDOM.unmountComponentAtNode(this.legendElem);\n  }\n\n  onGraphHoverClear(event: any, info: any) {\n    if (this.plot) {\n      this.tooltip.clear(this.plot);\n    }\n  }\n\n  onPlotSelected(event: JQueryEventObject, ranges: any) {\n    if (this.panel.xaxis.mode !== 'time') {\n      // Skip if panel in histogram or series mode\n      this.plot.clearSelection();\n      return;\n    }\n\n    if ((ranges.ctrlKey || ranges.metaKey) && (this.dashboard.meta.canEdit || this.dashboard.meta.canMakeEditable)) {\n      // Add annotation\n      setTimeout(() => {\n        this.eventManager.updateTime(ranges.xaxis);\n      }, 100);\n    } else {\n      this.scope.$apply(() => {\n        this.timeSrv.setTime({\n          from: toUtc(ranges.xaxis.from),\n          to: toUtc(ranges.xaxis.to),\n        });\n      });\n    }\n  }\n\n  getContextMenuItemsSupplier = (\n    flotPosition: { x: number; y: number },\n    linksSupplier?: LinkModelSupplier<FieldDisplay>\n  ): (() => ContextMenuGroup[]) => {\n    return () => {\n      // Fixed context menu items\n      const items: ContextMenuGroup[] = [\n        {\n          items: [\n            {\n              label: 'Add annotation',\n              icon: 'comment-alt',\n              onClick: () => this.eventManager.updateTime({ from: flotPosition.x, to: null }),\n            },\n          ],\n        },\n      ];\n\n      if (!linksSupplier) {\n        return items;\n      }\n\n      const dataLinks = [\n        {\n          items: linksSupplier.getLinks(this.panel.scopedVars).map<ContextMenuItem>(link => {\n            return {\n              label: link.title,\n              url: link.href,\n              target: link.target,\n              icon: `${link.target === '_self' ? 'link' : 'external-link-alt'}`,\n              onClick: link.onClick,\n            };\n          }),\n        },\n      ];\n\n      return [...items, ...dataLinks];\n    };\n  };\n\n  onPlotClick(event: JQueryEventObject, pos: any, item: any) {\n    const scrollContextElement = this.elem.closest('.view') ? this.elem.closest('.view').get()[0] : null;\n    const contextMenuSourceItem = item;\n\n    if (this.panel.xaxis.mode !== 'time') {\n      // Skip if panel in histogram or series mode\n      return;\n    }\n\n    if ((pos.ctrlKey || pos.metaKey) && (this.dashboard.meta.canEdit || this.dashboard.meta.canMakeEditable)) {\n      // Skip if range selected (added in \"plotselected\" event handler)\n      if (pos.x !== pos.x1) {\n        return;\n      }\n      setTimeout(() => {\n        this.eventManager.updateTime({ from: pos.x, to: null });\n      }, 100);\n      return;\n    } else {\n      this.tooltip.clear(this.plot);\n      let linksSupplier: LinkModelSupplier<FieldDisplay> | undefined;\n\n      if (item) {\n        // pickup y-axis index to know which field's config to apply\n        const yAxisConfig = this.panel.yaxes[item.series.yaxis.n === 2 ? 1 : 0];\n        const dataFrame = this.ctrl.dataList[item.series.dataFrameIndex];\n        const field = dataFrame.fields[item.series.fieldIndex];\n        const dataIndex = this.getDataIndexWithNullValuesCorrection(item, dataFrame);\n\n        let links: any[] = this.panel.options.dataLinks || [];\n        const hasLinksValue = hasLinks(field);\n        if (hasLinksValue) {\n          // Append the configured links to the panel datalinks\n          links = [...links, ...field.config.links];\n        }\n        const fieldConfig = {\n          decimals: yAxisConfig.decimals,\n          links,\n        };\n        const fieldDisplay = getDisplayProcessor({\n          field: { config: fieldConfig, type: FieldType.number },\n          theme: getCurrentTheme(),\n          timeZone: this.dashboard.getTimezone(),\n        })(field.values.get(dataIndex));\n        linksSupplier = links.length\n          ? getFieldLinksSupplier({\n              display: fieldDisplay,\n              name: field.name,\n              view: new DataFrameView(dataFrame),\n              rowIndex: dataIndex,\n              colIndex: item.series.fieldIndex,\n              field: fieldConfig,\n              hasLinks: hasLinksValue,\n            })\n          : undefined;\n      }\n\n      this.scope.$apply(() => {\n        // Setting nearest CustomScrollbar element as a scroll context for graph context menu\n        this.contextMenu.setScrollContextElement(scrollContextElement);\n        this.contextMenu.setSource(contextMenuSourceItem);\n        this.contextMenu.setMenuItemsSupplier(this.getContextMenuItemsSupplier(pos, linksSupplier) as any);\n        this.contextMenu.toggleMenu(pos);\n      });\n    }\n  }\n\n  getDataIndexWithNullValuesCorrection(item: any, dataFrame: DataFrame): number {\n    /** This is one added to handle the scenario where we have null values in\n     *  the time series data and the: \"visualization options -> null value\"\n     *  set to \"connected\". In this scenario we will get the wrong dataIndex.\n     *\n     *  https://github.com/grafana/grafana/issues/22651\n     */\n    const { datapoint, dataIndex } = item;\n\n    if (!Array.isArray(datapoint) || datapoint.length === 0) {\n      return dataIndex;\n    }\n\n    const ts = datapoint[0];\n    const { timeField } = getTimeField(dataFrame);\n\n    if (!timeField || !timeField.values) {\n      return dataIndex;\n    }\n\n    const field = timeField.values.get(dataIndex);\n\n    if (field === ts) {\n      return dataIndex;\n    }\n\n    const correctIndex = timeField.values.toArray().findIndex(value => value === ts);\n    return correctIndex > -1 ? correctIndex : dataIndex;\n  }\n\n  shouldAbortRender() {\n    if (!this.data) {\n      return true;\n    }\n\n    if (this.panelWidth === 0) {\n      return true;\n    }\n\n    return false;\n  }\n\n  drawHook(plot: any) {\n    // add left axis labels\n    if (this.panel.yaxes[0].label && this.panel.yaxes[0].show) {\n      $(\"<div class='axisLabel left-yaxis-label flot-temp-elem'></div>\")\n        .text(this.panel.yaxes[0].label)\n        .appendTo(this.elem);\n    }\n\n    // add right axis labels\n    if (this.panel.yaxes[1].label && this.panel.yaxes[1].show) {\n      $(\"<div class='axisLabel right-yaxis-label flot-temp-elem'></div>\")\n        .text(this.panel.yaxes[1].label)\n        .appendTo(this.elem);\n    }\n\n    const { dataWarning } = this.ctrl;\n    if (dataWarning) {\n      const msg = $(`<div class=\"datapoints-warning flot-temp-elem\">${dataWarning.title}</div>`);\n      if (dataWarning.action) {\n        $(`<button class=\"btn btn-secondary\">${dataWarning.actionText}</button>`)\n          .click(dataWarning.action)\n          .appendTo(msg);\n      }\n      msg.appendTo(this.elem);\n    }\n\n    this.thresholdManager.draw(plot);\n    this.timeRegionManager.draw(plot);\n  }\n\n  processOffsetHook(plot: any, gridMargin: { left: number; right: number }) {\n    const left = this.panel.yaxes[0];\n    const right = this.panel.yaxes[1];\n    if (left.show && left.label) {\n      gridMargin.left = 20;\n    }\n    if (right.show && right.label) {\n      gridMargin.right = 20;\n    }\n\n    // apply y-axis min/max options\n    const yaxis = plot.getYAxes();\n    for (let i = 0; i < yaxis.length; i++) {\n      const axis: any = yaxis[i];\n      const panelOptions = this.panel.yaxes[i];\n      axis.options.max = axis.options.max !== null ? axis.options.max : panelOptions.max;\n      axis.options.min = axis.options.min !== null ? axis.options.min : panelOptions.min;\n    }\n  }\n\n  processRangeHook(plot: any) {\n    const yAxes = plot.getYAxes();\n    const align = this.panel.yaxis.align || false;\n\n    if (yAxes.length > 1 && align === true) {\n      const level = this.panel.yaxis.alignLevel || 0;\n      alignYLevel(yAxes, parseFloat(level));\n    }\n  }\n\n  // Series could have different timeSteps,\n  // let's find the smallest one so that bars are correctly rendered.\n  // In addition, only take series which are rendered as bars for this.\n  getMinTimeStepOfSeries(data: any[]) {\n    let min = Number.MAX_VALUE;\n\n    for (let i = 0; i < data.length; i++) {\n      if (!data[i].stats.timeStep) {\n        continue;\n      }\n      if (this.panel.bars) {\n        if (data[i].bars && data[i].bars.show === false) {\n          continue;\n        }\n      } else {\n        if (typeof data[i].bars === 'undefined' || typeof data[i].bars.show === 'undefined' || !data[i].bars.show) {\n          continue;\n        }\n      }\n\n      if (data[i].stats.timeStep < min) {\n        min = data[i].stats.timeStep;\n      }\n    }\n\n    return min;\n  }\n\n  // Function for rendering panel\n  renderPanel() {\n    this.panelWidth = this.elem.width();\n    if (this.shouldAbortRender()) {\n      return;\n    }\n\n    // give space to alert editing\n    this.thresholdManager.prepare(this.elem, this.data);\n\n    // un-check dashes if lines are unchecked\n    this.panel.dashes = this.panel.lines ? this.panel.dashes : false;\n\n    // Populate element\n    const options: any = this.buildFlotOptions(this.panel);\n    this.prepareXAxis(options, this.panel);\n    this.configureYAxisOptions(this.data, options);\n    this.thresholdManager.addFlotOptions(options, this.panel);\n    this.timeRegionManager.addFlotOptions(options, this.panel);\n    this.eventManager.addFlotEvents(this.annotations, options);\n    this.sortedSeries = this.sortSeries(this.data, this.panel);\n    this.callPlot(options, true);\n  }\n\n  buildFlotPairs(data: any) {\n    for (let i = 0; i < data.length; i++) {\n      const series = data[i];\n      series.data = series.getFlotPairs(series.nullPointMode || this.panel.nullPointMode);\n\n      if (series.transform === 'constant') {\n        series.data = getFlotPairsConstant(series.data, this.ctrl.range);\n      }\n\n      // if hidden remove points and disable stack\n      if (this.ctrl.hiddenSeries[series.alias]) {\n        series.data = [];\n        series.stack = false;\n      }\n    }\n  }\n\n  prepareXAxis(options: any, panel: any) {\n    switch (panel.xaxis.mode) {\n      case 'series': {\n        options.series.bars.barWidth = 0.7;\n        options.series.bars.align = 'center';\n\n        for (let i = 0; i < this.data.length; i++) {\n          const series = this.data[i];\n          series.data = [[i + 1, series.stats[panel.xaxis.values[0]]]];\n        }\n\n        this.addXSeriesAxis(options);\n        break;\n      }\n      case 'histogram': {\n        let bucketSize: number;\n\n        if (this.data.length) {\n          let histMin = _.min(_.map(this.data, s => s.stats.min));\n          let histMax = _.max(_.map(this.data, s => s.stats.max));\n          const ticks = panel.xaxis.buckets || this.panelWidth / 50;\n          if (panel.xaxis.min != null) {\n            const isInvalidXaxisMin = tickStep(panel.xaxis.min, histMax, ticks) <= 0;\n            histMin = isInvalidXaxisMin ? histMin : panel.xaxis.min;\n          }\n          if (panel.xaxis.max != null) {\n            const isInvalidXaxisMax = tickStep(histMin, panel.xaxis.max, ticks) <= 0;\n            histMax = isInvalidXaxisMax ? histMax : panel.xaxis.max;\n          }\n          bucketSize = tickStep(histMin, histMax, ticks);\n          options.series.bars.barWidth = bucketSize * 0.8;\n          this.data = convertToHistogramData(this.data, bucketSize, this.ctrl.hiddenSeries, histMin, histMax);\n        } else {\n          bucketSize = 0;\n        }\n\n        this.addXHistogramAxis(options, bucketSize);\n        break;\n      }\n      case 'table': {\n        options.series.bars.barWidth = 0.7;\n        options.series.bars.align = 'center';\n        this.addXTableAxis(options);\n        break;\n      }\n      default: {\n        options.series.bars.barWidth = this.getMinTimeStepOfSeries(this.data) / 1.5;\n        options.series.bars.align = 'center';\n        this.addTimeAxis(options);\n        break;\n      }\n    }\n  }\n\n  callPlot(options: any, incrementRenderCounter: boolean) {\n    try {\n      this.plot = $.plot(this.elem, this.sortedSeries, options);\n      if (this.ctrl.renderError) {\n        delete this.ctrl.error;\n      }\n    } catch (e) {\n      console.log('flotcharts error', e);\n      this.ctrl.error = e.message || 'Render Error';\n      this.ctrl.renderError = true;\n    }\n\n    if (incrementRenderCounter) {\n      this.ctrl.renderingCompleted();\n    }\n  }\n\n  buildFlotOptions(panel: any) {\n    let gridColor = '#c8c8c8';\n    if (config.bootData.user.lightTheme === true) {\n      gridColor = '#a1a1a1';\n    }\n    const stack = panel.stack ? true : null;\n    const options: any = {\n      hooks: {\n        draw: [this.drawHook.bind(this)],\n        processOffset: [this.processOffsetHook.bind(this)],\n        processRange: [this.processRangeHook.bind(this)],\n      },\n      legend: { show: false },\n      series: {\n        stackpercent: panel.stack ? panel.percentage : false,\n        stack: panel.percentage ? null : stack,\n        lines: {\n          show: panel.lines,\n          zero: false,\n          fill: this.translateFillOption(panel.fill),\n          fillColor: this.getFillGradient(panel.fillGradient),\n          lineWidth: panel.dashes ? 0 : panel.linewidth,\n          steps: panel.steppedLine,\n        },\n        dashes: {\n          show: panel.dashes,\n          lineWidth: panel.linewidth,\n          dashLength: [panel.dashLength, panel.spaceLength],\n        },\n        bars: {\n          show: panel.bars,\n          fill: 1,\n          barWidth: 1,\n          zero: false,\n          lineWidth: 0,\n        },\n        points: {\n          show: panel.points,\n          fill: 1,\n          fillColor: false,\n          radius: panel.points ? panel.pointradius : 2,\n        },\n        shadowSize: 0,\n      },\n      yaxes: [],\n      xaxis: {},\n      grid: {\n        minBorderMargin: 0,\n        markings: [],\n        backgroundColor: null,\n        borderWidth: 0,\n        hoverable: true,\n        clickable: true,\n        color: gridColor,\n        margin: { left: 0, right: 0 },\n        labelMarginX: 0,\n        mouseActiveRadius: 30,\n      },\n      selection: {\n        mode: 'x',\n        color: '#666',\n      },\n      crosshair: {\n        mode: 'x',\n      },\n    };\n    return options;\n  }\n\n  sortSeries(series: any, panel: any) {\n    const sortBy = panel.legend.sort;\n    const sortOrder = panel.legend.sortDesc;\n    const haveSortBy = sortBy !== null && sortBy !== undefined && panel.legend[sortBy];\n    const haveSortOrder = sortOrder !== null && sortOrder !== undefined;\n    const shouldSortBy = panel.stack && haveSortBy && haveSortOrder && panel.legend.alignAsTable;\n    const sortDesc = panel.legend.sortDesc === true ? -1 : 1;\n\n    if (shouldSortBy) {\n      return _.sortBy(series, s => s.stats[sortBy] * sortDesc);\n    } else {\n      return _.sortBy(series, s => s.zindex);\n    }\n  }\n\n  getFillGradient(amount: number) {\n    if (!amount) {\n      return null;\n    }\n\n    return {\n      colors: [{ opacity: 0.0 }, { opacity: amount / 10 }],\n    };\n  }\n\n  translateFillOption(fill: number) {\n    if (this.panel.percentage && this.panel.stack) {\n      return fill === 0 ? 0.001 : fill / 10;\n    } else {\n      return fill / 10;\n    }\n  }\n\n  addTimeAxis(options: any) {\n    const ticks = this.panelWidth / 100;\n    const min = _.isUndefined(this.ctrl.range.from) ? null : this.ctrl.range.from.valueOf();\n    const max = _.isUndefined(this.ctrl.range.to) ? null : this.ctrl.range.to.valueOf();\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: 'time',\n      min: min,\n      max: max,\n      label: 'Datetime',\n      ticks: ticks,\n      timeformat: graphTimeFormat(ticks, min, max),\n      tickFormatter: graphTickFormatter,\n    };\n  }\n\n  addXSeriesAxis(options: any) {\n    const ticks = _.map(this.data, (series, index) => {\n      return [index + 1, series.alias];\n    });\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: null,\n      min: 0,\n      max: ticks.length + 1,\n      label: 'Datetime',\n      ticks: ticks,\n    };\n  }\n\n  addXHistogramAxis(options: any, bucketSize: number) {\n    let ticks: number | number[];\n    let min: number | undefined;\n    let max: number | undefined;\n\n    const defaultTicks = this.panelWidth / 50;\n\n    if (this.data.length && bucketSize) {\n      const tickValues = [];\n\n      for (const d of this.data) {\n        for (const point of d.data) {\n          tickValues[point[0]] = true;\n        }\n      }\n\n      ticks = Object.keys(tickValues).map(v => Number(v));\n      min = _.min(ticks)!;\n      max = _.max(ticks)!;\n\n      // Adjust tick step\n      let tickStep = bucketSize;\n      let ticksNum = Math.floor((max - min) / tickStep);\n      while (ticksNum > defaultTicks) {\n        tickStep = tickStep * 2;\n        ticksNum = Math.ceil((max - min) / tickStep);\n      }\n\n      // Expand ticks for pretty view\n      min = Math.floor(min / tickStep) * tickStep;\n      // 1.01 is 101% - ensure we have enough space for last bar\n      max = Math.ceil((max * 1.01) / tickStep) * tickStep;\n\n      ticks = [];\n      for (let i = min; i <= max; i += tickStep) {\n        ticks.push(i);\n      }\n    } else {\n      // Set defaults if no data\n      ticks = defaultTicks / 2;\n      min = 0;\n      max = 1;\n    }\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: null,\n      min: min,\n      max: max,\n      label: 'Histogram',\n      ticks: ticks,\n    };\n\n    // Use 'short' format for histogram values\n    this.configureAxisMode(options.xaxis, 'short');\n  }\n\n  addXTableAxis(options: any) {\n    let ticks = _.map(this.data, (series, seriesIndex) => {\n      return _.map(series.datapoints, (point, pointIndex) => {\n        const tickIndex = seriesIndex * series.datapoints.length + pointIndex;\n        return [tickIndex + 1, point[1]];\n      });\n    });\n    // @ts-ignore, potential bug? is this _.flattenDeep?\n    ticks = _.flatten(ticks, true);\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: null,\n      min: 0,\n      max: ticks.length + 1,\n      label: 'Datetime',\n      ticks: ticks,\n    };\n  }\n\n  configureYAxisOptions(data: any, options: any) {\n    const defaults = {\n      position: 'left',\n      show: this.panel.yaxes[0].show,\n      index: 1,\n      logBase: this.panel.yaxes[0].logBase || 1,\n      min: this.parseNumber(this.panel.yaxes[0].min),\n      max: this.parseNumber(this.panel.yaxes[0].max),\n      tickDecimals: this.panel.yaxes[0].decimals,\n    };\n\n    options.yaxes.push(defaults);\n\n    if (_.find(data, { yaxis: 2 })) {\n      const secondY = _.clone(defaults);\n      secondY.index = 2;\n      secondY.show = this.panel.yaxes[1].show;\n      secondY.logBase = this.panel.yaxes[1].logBase || 1;\n      secondY.position = 'right';\n      secondY.min = this.parseNumber(this.panel.yaxes[1].min);\n      secondY.max = this.parseNumber(this.panel.yaxes[1].max);\n      secondY.tickDecimals = this.panel.yaxes[1].decimals;\n      options.yaxes.push(secondY);\n\n      this.applyLogScale(options.yaxes[1], data);\n      this.configureAxisMode(\n        options.yaxes[1],\n        this.panel.percentage && this.panel.stack ? 'percent' : this.panel.yaxes[1].format\n      );\n    }\n    this.applyLogScale(options.yaxes[0], data);\n    this.configureAxisMode(\n      options.yaxes[0],\n      this.panel.percentage && this.panel.stack ? 'percent' : this.panel.yaxes[0].format\n    );\n  }\n\n  parseNumber(value: any) {\n    if (value === null || typeof value === 'undefined') {\n      return null;\n    }\n\n    return _.toNumber(value);\n  }\n\n  applyLogScale(axis: any, data: any) {\n    if (axis.logBase === 1) {\n      return;\n    }\n\n    const minSetToZero = axis.min === 0;\n\n    if (axis.min < Number.MIN_VALUE) {\n      axis.min = null;\n    }\n    if (axis.max < Number.MIN_VALUE) {\n      axis.max = null;\n    }\n\n    let series, i;\n    let max = axis.max,\n      min = axis.min;\n\n    for (i = 0; i < data.length; i++) {\n      series = data[i];\n      if (series.yaxis === axis.index) {\n        if (!max || max < series.stats.max) {\n          max = series.stats.max;\n        }\n        if (!min || min > series.stats.logmin) {\n          min = series.stats.logmin;\n        }\n      }\n    }\n\n    axis.transform = (v: number) => {\n      return v < Number.MIN_VALUE ? null : Math.log(v) / Math.log(axis.logBase);\n    };\n    axis.inverseTransform = (v: any) => {\n      return Math.pow(axis.logBase, v);\n    };\n\n    if (!max && !min) {\n      max = axis.inverseTransform(+2);\n      min = axis.inverseTransform(-2);\n    } else if (!max) {\n      max = min * axis.inverseTransform(+4);\n    } else if (!min) {\n      min = max * axis.inverseTransform(-4);\n    }\n\n    if (axis.min) {\n      min = axis.inverseTransform(Math.ceil(axis.transform(axis.min)));\n    } else {\n      min = axis.min = axis.inverseTransform(Math.floor(axis.transform(min)));\n    }\n    if (axis.max) {\n      max = axis.inverseTransform(Math.floor(axis.transform(axis.max)));\n    } else {\n      max = axis.max = axis.inverseTransform(Math.ceil(axis.transform(max)));\n    }\n\n    if (!min || min < Number.MIN_VALUE || !max || max < Number.MIN_VALUE) {\n      return;\n    }\n\n    if (Number.isFinite(min) && Number.isFinite(max)) {\n      if (minSetToZero) {\n        axis.min = 0.1;\n        min = 1;\n      }\n\n      axis.ticks = this.generateTicksForLogScaleYAxis(min, max, axis.logBase);\n      if (minSetToZero) {\n        axis.ticks.unshift(0.1);\n      }\n      if (axis.ticks[axis.ticks.length - 1] > axis.max) {\n        axis.max = axis.ticks[axis.ticks.length - 1];\n      }\n    } else {\n      axis.ticks = [1, 2];\n      delete axis.min;\n      delete axis.max;\n    }\n  }\n\n  generateTicksForLogScaleYAxis(min: any, max: number, logBase: number) {\n    let ticks = [];\n\n    let nextTick;\n    for (nextTick = min; nextTick <= max; nextTick *= logBase) {\n      ticks.push(nextTick);\n    }\n\n    const maxNumTicks = Math.ceil(this.ctrl.height / 25);\n    const numTicks = ticks.length;\n    if (numTicks > maxNumTicks) {\n      const factor = Math.ceil(numTicks / maxNumTicks) * logBase;\n      ticks = [];\n\n      for (nextTick = min; nextTick <= max * factor; nextTick *= factor) {\n        ticks.push(nextTick);\n      }\n    }\n\n    return ticks;\n  }\n\n  configureAxisMode(axis: { tickFormatter: (val: any, axis: any) => string }, format: string) {\n    axis.tickFormatter = (val, axis) => {\n      const formatter = getValueFormat(format);\n\n      if (!formatter) {\n        throw new Error(`Unit '${format}' is not supported`);\n      }\n      return formattedValueToString(formatter(val, axis.tickDecimals, axis.scaledDecimals));\n    };\n  }\n}\n\n/** @ngInject */\nfunction graphDirective(timeSrv: TimeSrv, popoverSrv: any, contextSrv: ContextSrv) {\n  return {\n    restrict: 'A',\n    template: '',\n    link: (scope: any, elem: JQuery) => {\n      return new GraphElement(scope, elem, timeSrv);\n    },\n  };\n}\n\ncoreModule.directive('grafanaGraph', graphDirective);\nexport { GraphElement, graphDirective };\n","import _ from 'lodash';\nimport coreModule from 'app/core/core_module';\n\n/** @ngInject */\nexport function SeriesOverridesCtrl($scope: any, $element: JQuery, popoverSrv: any) {\n  $scope.overrideMenu = [];\n  $scope.currentOverrides = [];\n  $scope.override = $scope.override || {};\n  $scope.colorPickerModel = {};\n\n  $scope.addOverrideOption = (name: string, propertyName: string, values: any) => {\n    const option = {\n      text: name,\n      propertyName: propertyName,\n      index: $scope.overrideMenu.length,\n      values,\n      submenu: _.map(values, value => {\n        return { text: String(value), value: value };\n      }),\n    };\n\n    $scope.overrideMenu.push(option);\n  };\n\n  $scope.setOverride = (item: { propertyName: string }, subItem: { value: any }) => {\n    // handle color overrides\n    if (item.propertyName === 'color') {\n      $scope.openColorSelector($scope.override['color']);\n      return;\n    }\n\n    $scope.override[item.propertyName] = subItem.value;\n\n    // automatically disable lines for this series and the fill below to series\n    // can be removed by the user if they still want lines\n    if (item.propertyName === 'fillBelowTo') {\n      $scope.override['lines'] = false;\n      $scope.ctrl.addSeriesOverride({ alias: subItem.value, lines: false });\n    }\n\n    $scope.updateCurrentOverrides();\n    $scope.ctrl.render();\n  };\n\n  $scope.colorSelected = (color: any) => {\n    $scope.override['color'] = color;\n    $scope.updateCurrentOverrides();\n    $scope.ctrl.render();\n\n    // update picker model so that the picker UI will also update\n    $scope.colorPickerModel.series.color = color;\n  };\n\n  $scope.openColorSelector = (color: any) => {\n    $scope.colorPickerModel = {\n      autoClose: true,\n      colorSelected: $scope.colorSelected,\n      series: { color },\n    };\n\n    popoverSrv.show({\n      element: $element.find('.dropdown')[0],\n      position: 'top center',\n      openOn: 'click',\n      template: '<series-color-picker-popover color=\"series.color\" onColorChange=\"colorSelected\" />',\n      classNames: 'drop-popover drop-popover--transparent',\n      model: $scope.colorPickerModel,\n      onClose: () => {\n        $scope.ctrl.render();\n      },\n    });\n  };\n\n  $scope.removeOverride = (option: { propertyName: string | number }) => {\n    delete $scope.override[option.propertyName];\n    $scope.updateCurrentOverrides();\n    $scope.ctrl.refresh();\n  };\n\n  $scope.getSeriesNames = () => {\n    return _.map($scope.ctrl.seriesList, series => {\n      return series.alias;\n    });\n  };\n\n  $scope.updateCurrentOverrides = () => {\n    $scope.currentOverrides = [];\n    _.each($scope.overrideMenu, option => {\n      const value = $scope.override[option.propertyName];\n      if (_.isUndefined(value)) {\n        return;\n      }\n      $scope.currentOverrides.push({\n        name: option.text,\n        propertyName: option.propertyName,\n        value: String(value),\n      });\n    });\n  };\n\n  $scope.addOverrideOption('Bars', 'bars', [true, false]);\n  $scope.addOverrideOption('Lines', 'lines', [true, false]);\n  $scope.addOverrideOption('Line fill', 'fill', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n  $scope.addOverrideOption('Fill gradient', 'fillGradient', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n  $scope.addOverrideOption('Line width', 'linewidth', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n  $scope.addOverrideOption('Null point mode', 'nullPointMode', ['connected', 'null', 'null as zero']);\n  $scope.addOverrideOption('Fill below to', 'fillBelowTo', $scope.getSeriesNames());\n  $scope.addOverrideOption('Staircase line', 'steppedLine', [true, false]);\n  $scope.addOverrideOption('Dashes', 'dashes', [true, false]);\n  $scope.addOverrideOption('Hidden Series', 'hiddenSeries', [true, false]);\n  $scope.addOverrideOption('Dash Length', 'dashLength', [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    20,\n  ]);\n  $scope.addOverrideOption('Dash Space', 'spaceLength', [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    20,\n  ]);\n  $scope.addOverrideOption('Points', 'points', [true, false]);\n  $scope.addOverrideOption('Points Radius', 'pointradius', [1, 2, 3, 4, 5]);\n  $scope.addOverrideOption('Stack', 'stack', [true, false, 'A', 'B', 'C', 'D']);\n  $scope.addOverrideOption('Color', 'color', ['change']);\n  $scope.addOverrideOption('Y-axis', 'yaxis', [1, 2]);\n  $scope.addOverrideOption('Z-index', 'zindex', [-3, -2, -1, 0, 1, 2, 3]);\n  $scope.addOverrideOption('Transform', 'transform', ['constant', 'negative-Y']);\n  $scope.addOverrideOption('Legend', 'legend', [true, false]);\n  $scope.addOverrideOption('Hide in tooltip', 'hideTooltip', [true, false]);\n  $scope.updateCurrentOverrides();\n}\n\ncoreModule.controller('SeriesOverridesCtrl', SeriesOverridesCtrl);\n","import coreModule from 'app/core/core_module';\nimport config from 'app/core/config';\nimport tinycolor from 'tinycolor2';\nexport class ThresholdFormCtrl {\n  panelCtrl: any;\n  panel: any;\n  disabled: boolean;\n\n  /** @ngInject */\n  constructor($scope: any) {\n    this.panel = this.panelCtrl.panel;\n\n    if (this.panel.alert) {\n      this.disabled = true;\n    }\n\n    const unbindDestroy = $scope.$on('$destroy', () => {\n      this.panelCtrl.editingThresholds = false;\n      this.panelCtrl.render();\n      unbindDestroy();\n    });\n\n    this.panelCtrl.editingThresholds = true;\n  }\n\n  addThreshold() {\n    this.panel.thresholds.push({\n      value: undefined,\n      colorMode: 'critical',\n      op: 'gt',\n      fill: true,\n      line: true,\n      yaxis: 'left',\n    });\n    this.panelCtrl.render();\n  }\n\n  removeThreshold(index: number) {\n    this.panel.thresholds.splice(index, 1);\n    this.panelCtrl.render();\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  onFillColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.thresholds[index].fillColor = newColor;\n      this.render();\n    };\n  }\n\n  onLineColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.thresholds[index].lineColor = newColor;\n      this.render();\n    };\n  }\n\n  onThresholdTypeChange(index: number) {\n    // Because of the ng-model binding, threshold's color mode is already set here\n    if (this.panel.thresholds[index].colorMode === 'custom') {\n      this.panel.thresholds[index].fillColor = tinycolor(config.theme.palette.blue85)\n        .setAlpha(0.2)\n        .toRgbString();\n      this.panel.thresholds[index].lineColor = tinycolor(config.theme.palette.blue77)\n        .setAlpha(0.6)\n        .toRgbString();\n    }\n    this.panelCtrl.render();\n  }\n}\n\ncoreModule.directive('graphThresholdForm', () => {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/plugins/panel/graph/thresholds_form.html',\n    controller: ThresholdFormCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      panelCtrl: '=',\n    },\n  };\n});\n","import coreModule from 'app/core/core_module';\nimport { getColorModes } from './time_region_manager';\n\nexport class TimeRegionFormCtrl {\n  panelCtrl: any;\n  panel: any;\n  disabled: boolean;\n  colorModes: any;\n\n  /** @ngInject */\n  constructor($scope: any) {\n    this.panel = this.panelCtrl.panel;\n\n    const unbindDestroy = $scope.$on('$destroy', () => {\n      this.panelCtrl.editingTimeRegions = false;\n      this.panelCtrl.render();\n      unbindDestroy();\n    });\n\n    this.colorModes = getColorModes();\n    this.panelCtrl.editingTimeRegions = true;\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  addTimeRegion() {\n    this.panel.timeRegions.push({\n      op: 'time',\n      fromDayOfWeek: undefined,\n      from: undefined,\n      toDayOfWeek: undefined,\n      to: undefined,\n      colorMode: 'background6',\n      fill: true,\n      line: false,\n      // Default colors for new\n      fillColor: 'rgba(234, 112, 112, 0.12)',\n      lineColor: 'rgba(237, 46, 24, 0.60)',\n    });\n    this.panelCtrl.render();\n  }\n\n  removeTimeRegion(index: number) {\n    this.panel.timeRegions.splice(index, 1);\n    this.panelCtrl.render();\n  }\n\n  onFillColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.timeRegions[index].fillColor = newColor;\n      this.render();\n    };\n  }\n\n  onLineColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.timeRegions[index].lineColor = newColor;\n      this.render();\n    };\n  }\n}\n\ncoreModule.directive('graphTimeRegionForm', () => {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/plugins/panel/graph/time_regions_form.html',\n    controller: TimeRegionFormCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      panelCtrl: '=',\n    },\n  };\n});\n","import _ from 'lodash';\nimport { colors } from '@grafana/ui';\nimport {\n  getColorFromHexRgbOrName,\n  TimeRange,\n  FieldType,\n  Field,\n  DataFrame,\n  getTimeField,\n  dateTime,\n  getFieldDisplayName,\n} from '@grafana/data';\nimport TimeSeries from 'app/core/time_series2';\nimport config from 'app/core/config';\n\ntype Options = {\n  dataList: DataFrame[];\n  range?: TimeRange;\n};\n\nexport class DataProcessor {\n  constructor(private panel: any) {}\n\n  getSeriesList(options: Options): TimeSeries[] {\n    const list: TimeSeries[] = [];\n    const { dataList, range } = options;\n\n    if (!dataList || !dataList.length) {\n      return list;\n    }\n\n    for (let i = 0; i < dataList.length; i++) {\n      const series = dataList[i];\n      const { timeField } = getTimeField(series);\n\n      if (!timeField) {\n        continue;\n      }\n\n      for (let j = 0; j < series.fields.length; j++) {\n        const field = series.fields[j];\n\n        if (field.type !== FieldType.number) {\n          continue;\n        }\n        const name = getFieldDisplayName(field, series, dataList);\n        const datapoints = [];\n\n        for (let r = 0; r < series.length; r++) {\n          datapoints.push([field.values.get(r), dateTime(timeField.values.get(r)).valueOf()]);\n        }\n\n        list.push(this.toTimeSeries(field, name, i, j, datapoints, list.length, range));\n      }\n    }\n\n    // Merge all the rows if we want to show a histogram\n    if (this.panel.xaxis.mode === 'histogram' && !this.panel.stack && list.length > 1) {\n      const first = list[0];\n      first.alias = first.aliasEscaped = 'Count';\n\n      for (let i = 1; i < list.length; i++) {\n        first.datapoints = first.datapoints.concat(list[i].datapoints);\n      }\n\n      return [first];\n    }\n\n    return list;\n  }\n\n  private toTimeSeries(\n    field: Field,\n    alias: string,\n    dataFrameIndex: number,\n    fieldIndex: number,\n    datapoints: any[][],\n    index: number,\n    range?: TimeRange\n  ) {\n    const colorIndex = index % colors.length;\n    const color = this.panel.aliasColors[alias] || colors[colorIndex];\n\n    const series = new TimeSeries({\n      datapoints: datapoints || [],\n      alias: alias,\n      color: getColorFromHexRgbOrName(color, config.theme.type),\n      unit: field.config ? field.config.unit : undefined,\n      dataFrameIndex,\n      fieldIndex,\n    });\n\n    if (datapoints && datapoints.length > 0 && range) {\n      const last = datapoints[datapoints.length - 1][1];\n      const from = range.from;\n\n      if (last - from.valueOf() < -10000) {\n        series.isOutsideRange = true;\n      }\n    }\n    return series;\n  }\n\n  setPanelDefaultsForNewXAxisMode() {\n    switch (this.panel.xaxis.mode) {\n      case 'time': {\n        this.panel.bars = false;\n        this.panel.lines = true;\n        this.panel.points = false;\n        this.panel.legend.show = true;\n        this.panel.tooltip.shared = true;\n        this.panel.xaxis.values = [];\n        break;\n      }\n      case 'series': {\n        this.panel.bars = true;\n        this.panel.lines = false;\n        this.panel.points = false;\n        this.panel.stack = false;\n        this.panel.legend.show = false;\n        this.panel.tooltip.shared = false;\n        this.panel.xaxis.values = ['total'];\n        break;\n      }\n      case 'histogram': {\n        this.panel.bars = true;\n        this.panel.lines = false;\n        this.panel.points = false;\n        this.panel.stack = false;\n        this.panel.legend.show = false;\n        this.panel.tooltip.shared = false;\n        break;\n      }\n    }\n  }\n\n  validateXAxisSeriesValue() {\n    switch (this.panel.xaxis.mode) {\n      case 'series': {\n        if (this.panel.xaxis.values.length === 0) {\n          this.panel.xaxis.values = ['total'];\n          return;\n        }\n\n        const validOptions = this.getXAxisValueOptions({});\n        const found: any = _.find(validOptions, { value: this.panel.xaxis.values[0] });\n        if (!found) {\n          this.panel.xaxis.values = ['total'];\n        }\n        return;\n      }\n    }\n  }\n\n  getXAxisValueOptions(options: any) {\n    switch (this.panel.xaxis.mode) {\n      case 'series': {\n        return [\n          { text: 'Avg', value: 'avg' },\n          { text: 'Min', value: 'min' },\n          { text: 'Max', value: 'max' },\n          { text: 'Total', value: 'total' },\n          { text: 'Count', value: 'count' },\n        ];\n      }\n    }\n\n    return [];\n  }\n\n  pluckDeep(obj: any, property: string) {\n    const propertyParts = property.split('.');\n    let value = obj;\n    for (let i = 0; i < propertyParts.length; ++i) {\n      if (value[propertyParts[i]]) {\n        value = value[propertyParts[i]];\n      } else {\n        return undefined;\n      }\n    }\n    return value;\n  }\n}\n","import { selectors } from '@grafana/e2e-selectors';\nimport { GraphCtrl } from './module';\n\nexport class AxesEditorCtrl {\n  panel: any;\n  panelCtrl: GraphCtrl;\n  logScales: any;\n  xAxisModes: any;\n  xAxisStatOptions: any;\n  xNameSegment: any;\n  selectors: typeof selectors.components.Panels.Visualization.Graph.VisualizationTab;\n\n  /** @ngInject */\n  constructor(private $scope: any) {\n    this.panelCtrl = $scope.ctrl as GraphCtrl;\n    this.panel = this.panelCtrl.panel;\n    this.$scope.ctrl = this;\n\n    this.logScales = {\n      linear: 1,\n      'log (base 2)': 2,\n      'log (base 10)': 10,\n      'log (base 32)': 32,\n      'log (base 1024)': 1024,\n    };\n\n    this.xAxisModes = {\n      Time: 'time',\n      Series: 'series',\n      Histogram: 'histogram',\n      // 'Data field': 'field',\n    };\n\n    this.xAxisStatOptions = [\n      { text: 'Avg', value: 'avg' },\n      { text: 'Min', value: 'min' },\n      { text: 'Max', value: 'max' },\n      { text: 'Total', value: 'total' },\n      { text: 'Count', value: 'count' },\n      { text: 'Current', value: 'current' },\n    ];\n\n    if (this.panel.xaxis.mode === 'custom') {\n      if (!this.panel.xaxis.name) {\n        this.panel.xaxis.name = 'specify field';\n      }\n    }\n    this.selectors = selectors.components.Panels.Visualization.Graph.VisualizationTab;\n  }\n\n  setUnitFormat(axis: { format: any }) {\n    return (unit: string) => {\n      axis.format = unit;\n      this.panelCtrl.render();\n    };\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  xAxisModeChanged() {\n    this.panelCtrl.processor.setPanelDefaultsForNewXAxisMode();\n    this.panelCtrl.onDataFramesReceived(this.panelCtrl.dataList);\n  }\n\n  xAxisValueChanged() {\n    this.panelCtrl.onDataFramesReceived(this.panelCtrl.dataList);\n  }\n}\n\n/** @ngInject */\nexport function axesEditorComponent() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/graph/axes_editor.html',\n    controller: AxesEditorCtrl,\n  };\n}\n","import { ContextMenuItem } from '@grafana/ui';\nimport { FlotDataPoint } from '@grafana/data';\n\nexport class GraphContextMenuCtrl {\n  private source?: FlotDataPoint | null;\n  private scope?: any;\n  menuItemsSupplier?: () => ContextMenuItem[];\n  scrollContextElement: HTMLElement | null;\n  position: {\n    x: number;\n    y: number;\n  };\n\n  isVisible: boolean;\n\n  constructor($scope: any) {\n    this.isVisible = false;\n    this.scope = $scope;\n  }\n\n  onClose = () => {\n    if (this.scrollContextElement) {\n      this.scrollContextElement.removeEventListener('scroll', this.onClose);\n    }\n\n    this.scope.$apply(() => {\n      this.isVisible = false;\n    });\n  };\n\n  toggleMenu = (event?: { pageX: number; pageY: number }) => {\n    this.isVisible = !this.isVisible;\n    if (this.isVisible && this.scrollContextElement) {\n      this.scrollContextElement.addEventListener('scroll', this.onClose);\n    }\n\n    if (this.source) {\n      this.position = {\n        x: this.source.pageX,\n        y: this.source.pageY,\n      };\n    } else {\n      this.position = {\n        x: event ? event.pageX : 0,\n        y: event ? event.pageY : 0,\n      };\n    }\n  };\n\n  // Sets element which is considered as a scroll context of given context menu.\n  // Having access to this element allows scroll event attachement for menu to be closed when user scrolls\n  setScrollContextElement = (el: HTMLElement | null) => {\n    this.scrollContextElement = el;\n  };\n\n  setSource = (source: FlotDataPoint | null) => {\n    this.source = source;\n  };\n\n  getSource = () => {\n    return this.source;\n  };\n\n  setMenuItemsSupplier = (menuItemsSupplier: () => ContextMenuItem[]) => {\n    this.menuItemsSupplier = menuItemsSupplier;\n  };\n}\n","import './graph';\nimport './series_overrides_ctrl';\nimport './thresholds_form';\nimport './time_regions_form';\n\nimport template from './template';\nimport _ from 'lodash';\n\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { DataProcessor } from './data_processor';\nimport { axesEditorComponent } from './axes_editor';\nimport config from 'app/core/config';\nimport TimeSeries from 'app/core/time_series2';\nimport { getProcessedDataFrames } from 'app/features/dashboard/state/runRequest';\nimport { getColorFromHexRgbOrName, PanelEvents, DataFrame, DataLink, VariableSuggestion } from '@grafana/data';\n\nimport { GraphContextMenuCtrl } from './GraphContextMenuCtrl';\nimport { getDataLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv';\n\nimport { auto } from 'angular';\nimport { AnnotationsSrv } from 'app/features/annotations/all';\nimport { CoreEvents } from 'app/types';\nimport { DataWarning } from './types';\nimport { getLocationSrv } from '@grafana/runtime';\nimport { getDataTimeRange } from './utils';\nimport { changePanelPlugin } from 'app/features/dashboard/state/actions';\nimport { dispatch } from 'app/store/store';\n\nclass GraphCtrl extends MetricsPanelCtrl {\n  static template = template;\n\n  renderError: boolean;\n  hiddenSeries: any = {};\n  hiddenSeriesTainted = false;\n  seriesList: TimeSeries[] = [];\n  dataList: DataFrame[] = [];\n  annotations: any = [];\n  alertState: any;\n\n  annotationsPromise: any;\n  dataWarning?: DataWarning;\n  colors: any = [];\n  subTabIndex: number;\n  processor: DataProcessor;\n  contextMenuCtrl: GraphContextMenuCtrl;\n  linkVariableSuggestions: VariableSuggestion[] = [];\n\n  panelDefaults: any = {\n    // datasource name, null = default datasource\n    datasource: null,\n    // sets client side (flot) or native graphite png renderer (png)\n    renderer: 'flot',\n    yaxes: [\n      {\n        label: null,\n        show: true,\n        logBase: 1,\n        min: null,\n        max: null,\n        format: 'short',\n      },\n      {\n        label: null,\n        show: true,\n        logBase: 1,\n        min: null,\n        max: null,\n        format: 'short',\n      },\n    ],\n    xaxis: {\n      show: true,\n      mode: 'time',\n      name: null,\n      values: [],\n      buckets: null,\n    },\n    yaxis: {\n      align: false,\n      alignLevel: null,\n    },\n    // show/hide lines\n    lines: true,\n    // fill factor\n    fill: 1,\n    // fill gradient\n    fillGradient: 0,\n    // line width in pixels\n    linewidth: 1,\n    // show/hide dashed line\n    dashes: false,\n    // show/hide line\n    hiddenSeries: false,\n    // length of a dash\n    dashLength: 10,\n    // length of space between two dashes\n    spaceLength: 10,\n    // show hide points\n    points: false,\n    // point radius in pixels\n    pointradius: 2,\n    // show hide bars\n    bars: false,\n    // enable/disable stacking\n    stack: false,\n    // stack percentage mode\n    percentage: false,\n    // legend options\n    legend: {\n      show: true, // disable/enable legend\n      values: false, // disable/enable legend values\n      min: false,\n      max: false,\n      current: false,\n      total: false,\n      avg: false,\n    },\n    // how null points should be handled\n    nullPointMode: 'null',\n    // staircase line mode\n    steppedLine: false,\n    // tooltip options\n    tooltip: {\n      value_type: 'individual',\n      shared: true,\n      sort: 0,\n    },\n    // time overrides\n    timeFrom: null,\n    timeShift: null,\n    // metric queries\n    targets: [{}],\n    // series color overrides\n    aliasColors: {},\n    // other style overrides\n    seriesOverrides: [],\n    thresholds: [],\n    timeRegions: [],\n    options: {\n      dataLinks: [],\n    },\n  };\n\n  /** @ngInject */\n  constructor($scope: any, $injector: auto.IInjectorService, private annotationsSrv: AnnotationsSrv) {\n    super($scope, $injector);\n\n    _.defaults(this.panel, this.panelDefaults);\n    _.defaults(this.panel.tooltip, this.panelDefaults.tooltip);\n    _.defaults(this.panel.legend, this.panelDefaults.legend);\n    _.defaults(this.panel.xaxis, this.panelDefaults.xaxis);\n    _.defaults(this.panel.options, this.panelDefaults.options);\n\n    this.useDataFrames = true;\n    this.processor = new DataProcessor(this.panel);\n    this.contextMenuCtrl = new GraphContextMenuCtrl($scope);\n\n    this.events.on(PanelEvents.render, this.onRender.bind(this));\n    this.events.on(PanelEvents.dataFramesReceived, this.onDataFramesReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onDataSnapshotLoad.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n    this.events.on(PanelEvents.initPanelActions, this.onInitPanelActions.bind(this));\n\n    this.onDataLinksChange = this.onDataLinksChange.bind(this);\n    this.annotationsPromise = Promise.resolve({ annotations: [] });\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Display', 'public/app/plugins/panel/graph/tab_display.html');\n    this.addEditorTab('Series overrides', 'public/app/plugins/panel/graph/tab_series_overrides.html');\n    this.addEditorTab('Axes', axesEditorComponent);\n    this.addEditorTab('Legend', 'public/app/plugins/panel/graph/tab_legend.html');\n    this.addEditorTab('Thresholds', 'public/app/plugins/panel/graph/tab_thresholds.html');\n    this.addEditorTab('Time regions', 'public/app/plugins/panel/graph/tab_time_regions.html');\n    this.addEditorTab('Data links', 'public/app/plugins/panel/graph/tab_drilldown_links.html');\n    this.subTabIndex = 0;\n    this.hiddenSeriesTainted = false;\n  }\n\n  onInitPanelActions(actions: any[]) {\n    actions.push({ text: 'Toggle legend', click: 'ctrl.toggleLegend()', shortcut: 'p l' });\n  }\n\n  issueQueries(datasource: any) {\n    this.annotationsPromise = this.annotationsSrv.getAnnotations({\n      dashboard: this.dashboard,\n      panel: this.panel,\n      range: this.range,\n    });\n\n    /* Wait for annotationSrv requests to get datasources to\n     * resolve before issuing queries. This allows the annotations\n     * service to fire annotations queries before graph queries\n     * (but not wait for completion). This resolves\n     * issue 11806.\n     */\n    return this.annotationsSrv.datasourcePromises.then((r: any) => {\n      return super.issueQueries(datasource);\n    });\n  }\n\n  zoomOut(evt: any) {\n    this.publishAppEvent(CoreEvents.zoomOut, 2);\n  }\n\n  onDataSnapshotLoad(snapshotData: any) {\n    this.annotationsPromise = this.annotationsSrv.getAnnotations({\n      dashboard: this.dashboard,\n      panel: this.panel,\n      range: this.range,\n    });\n\n    const frames = getProcessedDataFrames(snapshotData);\n    this.onDataFramesReceived(frames);\n  }\n\n  onDataFramesReceived(data: DataFrame[]) {\n    this.dataList = data;\n    this.seriesList = this.processor.getSeriesList({\n      dataList: this.dataList,\n      range: this.range,\n    });\n\n    this.linkVariableSuggestions = getDataLinksVariableSuggestions(data);\n\n    this.dataWarning = this.getDataWarning();\n\n    this.annotationsPromise.then(\n      (result: { alertState: any; annotations: any }) => {\n        this.loading = false;\n        this.alertState = result.alertState;\n        this.annotations = result.annotations;\n\n        // Temp alerting & react hack\n        // Add it to the seriesList so react can access it\n        if (this.alertState) {\n          (this.seriesList as any).alertState = this.alertState.state;\n        }\n\n        this.render(this.seriesList);\n      },\n      () => {\n        this.loading = false;\n        this.render(this.seriesList);\n      }\n    );\n  }\n\n  getDataWarning(): DataWarning {\n    const datapointsCount = this.seriesList.reduce((prev, series) => {\n      return prev + series.datapoints.length;\n    }, 0);\n\n    if (datapointsCount === 0) {\n      if (this.dataList) {\n        for (const frame of this.dataList) {\n          if (frame.length && frame.fields?.length) {\n            return {\n              title: 'Unable to graph data',\n              tip: 'Data exists, but is not timeseries',\n              actionText: 'Switch to table view',\n              action: () => {\n                console.log('Change from graph to table');\n                dispatch(changePanelPlugin(this.panel, 'table'));\n              },\n            };\n          }\n        }\n      }\n\n      return {\n        title: 'No data',\n        tip: 'No data returned from query',\n      };\n    }\n\n    // Look for data points outside time range\n    for (const series of this.seriesList) {\n      if (!series.isOutsideRange) {\n        continue;\n      }\n\n      const dataWarning: DataWarning = {\n        title: 'Data outside time range',\n        tip: 'Can be caused by timezone mismatch or missing time filter in query',\n      };\n\n      const range = getDataTimeRange(this.dataList);\n\n      if (range) {\n        dataWarning.actionText = 'Zoom to data';\n        dataWarning.action = () => {\n          getLocationSrv().update({\n            partial: true,\n            query: {\n              from: range.from,\n              to: range.to,\n            },\n          });\n        };\n      }\n\n      return dataWarning;\n    }\n\n    return null;\n  }\n\n  onRender() {\n    if (!this.seriesList) {\n      return;\n    }\n\n    for (const series of this.seriesList) {\n      series.applySeriesOverrides(this.panel.seriesOverrides);\n\n      if (series.unit) {\n        this.panel.yaxes[series.yaxis - 1].format = series.unit;\n      }\n      if (this.hiddenSeriesTainted === false && series.hiddenSeries === true) {\n        this.hiddenSeries[series.alias] = true;\n      }\n    }\n  }\n\n  onColorChange = (series: any, color: string) => {\n    series.setColor(getColorFromHexRgbOrName(color, config.theme.type));\n    this.panel.aliasColors[series.alias] = color;\n    this.render();\n  };\n\n  onToggleSeries = (hiddenSeries: any) => {\n    this.hiddenSeriesTainted = true;\n    this.hiddenSeries = hiddenSeries;\n    this.render();\n  };\n\n  onToggleSort = (sortBy: any, sortDesc: any) => {\n    this.panel.legend.sort = sortBy;\n    this.panel.legend.sortDesc = sortDesc;\n    this.render();\n  };\n\n  onToggleAxis = (info: { alias: any; yaxis: any }) => {\n    let override: any = _.find(this.panel.seriesOverrides, { alias: info.alias });\n    if (!override) {\n      override = { alias: info.alias };\n      this.panel.seriesOverrides.push(override);\n    }\n    override.yaxis = info.yaxis;\n    this.render();\n  };\n\n  onDataLinksChange(dataLinks: DataLink[]) {\n    this.panel.updateOptions({\n      ...this.panel.options,\n      dataLinks,\n    });\n  }\n\n  addSeriesOverride(override: any) {\n    this.panel.seriesOverrides.push(override || {});\n  }\n\n  removeSeriesOverride(override: any) {\n    this.panel.seriesOverrides = _.without(this.panel.seriesOverrides, override);\n    this.render();\n  }\n\n  toggleLegend() {\n    this.panel.legend.show = !this.panel.legend.show;\n    this.render();\n  }\n\n  legendValuesOptionChanged() {\n    const legend = this.panel.legend;\n    legend.values = legend.min || legend.max || legend.avg || legend.current || legend.total;\n    this.render();\n  }\n\n  onContextMenuClose = () => {\n    this.contextMenuCtrl.toggleMenu();\n  };\n\n  getTimeZone = () => this.dashboard.getTimezone();\n\n  getDataFrameByRefId = (refId: string) => {\n    return this.dataList.filter(dataFrame => dataFrame.refId === refId)[0];\n  };\n}\n\nexport { GraphCtrl, GraphCtrl as PanelCtrl };\n","import { DataFrame, ReducerID, reduceField, AbsoluteTimeRange, FieldType } from '@grafana/data';\n\n/**\n * Find the min and max time that covers all data\n */\nexport function getDataTimeRange(frames: DataFrame[]): AbsoluteTimeRange | undefined {\n  const range: AbsoluteTimeRange = {\n    from: Number.MAX_SAFE_INTEGER,\n    to: Number.MIN_SAFE_INTEGER,\n  };\n  let found = false;\n  const reducers = [ReducerID.min, ReducerID.max];\n  for (const frame of frames) {\n    for (const field of frame.fields) {\n      if (field.type === FieldType.time) {\n        const calcs = reduceField({ field, reducers });\n        range.from = Math.min(range.from, calcs[ReducerID.min]);\n        range.to = Math.max(range.to, calcs[ReducerID.max]);\n        found = true;\n      }\n    }\n  }\n  return found ? range : undefined;\n}\n","const template = `\n<div class=\"graph-panel\" ng-class=\"{'graph-panel--legend-right': ctrl.panel.legend.rightSide}\">\n  <div class=\"graph-panel__chart\" grafana-graph ng-dblclick=\"ctrl.zoomOut()\">\n  </div>\n\n  <div class=\"graph-legend\">\n    <div class=\"graph-legend-content\" graph-legend></div>\n  </div>\n  <div ng-if=\"ctrl.contextMenuCtrl.isVisible\">\n    <graph-context-menu\n      items=\"ctrl.contextMenuCtrl.menuItemsSupplier()\"\n      onClose=\"ctrl.onContextMenuClose\"\n      getContextMenuSource=\"ctrl.contextMenuCtrl.getSource\"\n      timeZone=\"ctrl.getTimeZone()\"\n      x=\"ctrl.contextMenuCtrl.position.x\"\n      y=\"ctrl.contextMenuCtrl.position.y\"\n    ></graph-context-menu>\n  </div>\n</div>\n`;\n\nexport default template;\n","import _ from 'lodash';\nimport { PanelCtrl } from 'app/plugins/sdk';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport { auto, IScope } from 'angular';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { PanelEvents } from '@grafana/data';\nimport { promiseToDigest } from '../../../core/utils/promiseToDigest';\n\nclass DashListCtrl extends PanelCtrl {\n  static templateUrl = 'module.html';\n  static scrollable = true;\n\n  groups: any[];\n  modes: any[];\n\n  panelDefaults: any = {\n    query: '',\n    limit: 10,\n    tags: [],\n    recent: false,\n    search: false,\n    starred: true,\n    headings: true,\n    folderId: null,\n  };\n\n  /** @ngInject */\n  constructor($scope: IScope, $injector: auto.IInjectorService, private dashboardSrv: DashboardSrv) {\n    super($scope, $injector);\n    _.defaults(this.panel, this.panelDefaults);\n\n    if (this.panel.tag) {\n      this.panel.tags = [this.panel.tag];\n      delete this.panel.tag;\n    }\n\n    this.events.on(PanelEvents.refresh, this.onRefresh.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n\n    this.groups = [\n      { list: [], show: false, header: 'Starred dashboards' },\n      { list: [], show: false, header: 'Recently viewed dashboards' },\n      { list: [], show: false, header: 'Search' },\n    ];\n\n    // update capability\n    if (this.panel.mode) {\n      if (this.panel.mode === 'starred') {\n        this.panel.starred = true;\n        this.panel.headings = false;\n      }\n      if (this.panel.mode === 'recently viewed') {\n        this.panel.recent = true;\n        this.panel.starred = false;\n        this.panel.headings = false;\n      }\n      if (this.panel.mode === 'search') {\n        this.panel.search = true;\n        this.panel.starred = false;\n        this.panel.headings = false;\n      }\n      delete this.panel.mode;\n    }\n  }\n\n  onInitEditMode() {\n    this.modes = ['starred', 'search', 'recently viewed'];\n    this.addEditorTab('Options', 'public/app/plugins/panel/dashlist/editor.html');\n  }\n\n  onRefresh() {\n    const promises = [];\n\n    promises.push(this.getRecentDashboards());\n    promises.push(this.getStarred());\n    promises.push(this.getSearch());\n\n    return Promise.all(promises).then(this.renderingCompleted.bind(this));\n  }\n\n  getSearch() {\n    this.groups[2].show = this.panel.search;\n    if (!this.panel.search) {\n      return Promise.resolve();\n    }\n\n    const params = {\n      limit: this.panel.limit,\n      query: this.panel.query,\n      tag: this.panel.tags,\n      folderIds: this.panel.folderId,\n      type: 'dash-db',\n    };\n\n    return promiseToDigest(this.$scope)(\n      backendSrv.search(params).then(result => {\n        this.groups[2].list = result;\n      })\n    );\n  }\n\n  getStarred() {\n    this.groups[0].show = this.panel.starred;\n    if (!this.panel.starred) {\n      return Promise.resolve();\n    }\n\n    const params = { limit: this.panel.limit, starred: 'true' };\n    return promiseToDigest(this.$scope)(\n      backendSrv.search(params).then(result => {\n        this.groups[0].list = result;\n      })\n    );\n  }\n\n  starDashboard(dash: any, evt: any) {\n    this.dashboardSrv.starDashboard(dash.id, dash.isStarred).then((newState: any) => {\n      dash.isStarred = newState;\n    });\n\n    if (evt) {\n      evt.stopPropagation();\n      evt.preventDefault();\n    }\n  }\n\n  getRecentDashboards() {\n    this.groups[1].show = this.panel.recent;\n    if (!this.panel.recent) {\n      return Promise.resolve();\n    }\n\n    const dashIds = _.take(impressionSrv.getDashboardOpened(), this.panel.limit);\n    return promiseToDigest(this.$scope)(\n      backendSrv.search({ dashboardIds: dashIds, limit: this.panel.limit }).then(result => {\n        this.groups[1].list = dashIds\n          .map(orderId => {\n            return _.find(result, dashboard => {\n              return dashboard.id === orderId;\n            });\n          })\n          .filter(el => {\n            return el !== undefined;\n          });\n      })\n    );\n  }\n\n  onFolderChange = (folder: any) => {\n    this.panel.folderId = folder.id;\n    this.refresh();\n  };\n}\n\nexport { DashListCtrl, DashListCtrl as PanelCtrl };\n","import _ from 'lodash';\nimport { PanelCtrl } from '../../../features/panel/panel_ctrl';\nimport { auto, IScope } from 'angular';\nimport { ContextSrv } from '../../../core/services/context_srv';\nimport { CoreEvents } from 'app/types';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nclass PluginListCtrl extends PanelCtrl {\n  static templateUrl = 'module.html';\n  static scrollable = true;\n\n  pluginList: any[];\n  viewModel: any;\n  isAdmin: boolean;\n\n  // Set and populate defaults\n  panelDefaults = {};\n\n  /** @ngInject */\n  constructor($scope: IScope, $injector: auto.IInjectorService, contextSrv: ContextSrv) {\n    super($scope, $injector);\n\n    _.defaults(this.panel, this.panelDefaults);\n\n    this.isAdmin = contextSrv.hasRole('Admin');\n    this.pluginList = [];\n    this.viewModel = [\n      { header: 'Installed Apps', list: [], type: 'app' },\n      { header: 'Installed Panels', list: [], type: 'panel' },\n      { header: 'Installed Datasources', list: [], type: 'datasource' },\n    ];\n\n    this.update();\n  }\n\n  gotoPlugin(plugin: { id: any }, evt: any) {\n    if (evt) {\n      evt.stopPropagation();\n    }\n    this.$location.url(`plugins/${plugin.id}/edit`);\n  }\n\n  updateAvailable(plugin: any, $event: any) {\n    $event.stopPropagation();\n    $event.preventDefault();\n\n    const modalScope = this.$scope.$new(true);\n    modalScope.plugin = plugin;\n\n    this.publishAppEvent(CoreEvents.showModal, {\n      src: 'public/app/features/plugins/partials/update_instructions.html',\n      scope: modalScope,\n    });\n  }\n\n  update() {\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get('api/plugins', { embedded: 0, core: 0 })\n        .then(plugins => {\n          this.pluginList = plugins;\n          this.viewModel[0].list = _.filter(plugins, { type: 'app' });\n          this.viewModel[1].list = _.filter(plugins, { type: 'panel' });\n          this.viewModel[2].list = _.filter(plugins, { type: 'datasource' });\n\n          for (const plugin of this.pluginList) {\n            if (plugin.hasUpdate) {\n              plugin.state = 'has-update';\n            } else if (!plugin.enabled) {\n              plugin.state = 'not-enabled';\n            }\n          }\n        })\n    );\n  }\n}\n\nexport { PluginListCtrl, PluginListCtrl as PanelCtrl };\n","import _ from 'lodash';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { dateMath, dateTime, PanelEvents } from '@grafana/data';\nimport { auto, IScope } from 'angular';\n\nimport alertDef from '../../../features/alerting/state/alertDef';\nimport { PanelCtrl } from 'app/plugins/sdk';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nclass AlertListPanel extends PanelCtrl {\n  static templateUrl = 'module.html';\n  static scrollable = true;\n\n  showOptions = [\n    { text: 'Current state', value: 'current' },\n    { text: 'Recent state changes', value: 'changes' },\n  ];\n\n  sortOrderOptions = [\n    { text: 'Alphabetical (asc)', value: 1 },\n    { text: 'Alphabetical (desc)', value: 2 },\n    { text: 'Importance', value: 3 },\n  ];\n\n  stateFilter: any = {};\n  currentAlerts: any = [];\n  alertHistory: any = [];\n  noAlertsMessage: string;\n  templateSrv: string;\n\n  // Set and populate defaults\n  panelDefaults: any = {\n    show: 'current',\n    limit: 10,\n    stateFilter: [],\n    onlyAlertsOnDashboard: false,\n    sortOrder: 1,\n    dashboardFilter: '',\n    nameFilter: '',\n    folderId: null,\n  };\n\n  /** @ngInject */\n  constructor($scope: IScope, $injector: auto.IInjectorService) {\n    super($scope, $injector);\n    _.defaults(this.panel, this.panelDefaults);\n\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n    this.events.on(PanelEvents.refresh, this.onRefresh.bind(this));\n    this.templateSrv = this.$injector.get('templateSrv');\n\n    for (const key in this.panel.stateFilter) {\n      this.stateFilter[this.panel.stateFilter[key]] = true;\n    }\n  }\n\n  sortResult(alerts: any[]) {\n    if (this.panel.sortOrder === 3) {\n      return _.sortBy(alerts, a => {\n        // @ts-ignore\n        return alertDef.alertStateSortScore[a.state];\n      });\n    }\n\n    const result = _.sortBy(alerts, a => {\n      return a.name.toLowerCase();\n    });\n    if (this.panel.sortOrder === 2) {\n      result.reverse();\n    }\n\n    return result;\n  }\n\n  updateStateFilter() {\n    const result = [];\n\n    for (const key in this.stateFilter) {\n      if (this.stateFilter[key]) {\n        result.push(key);\n      }\n    }\n\n    this.panel.stateFilter = result;\n    this.onRefresh();\n  }\n\n  onRefresh() {\n    let getAlertsPromise;\n\n    if (this.panel.show === 'current') {\n      getAlertsPromise = this.getCurrentAlertState();\n    }\n\n    if (this.panel.show === 'changes') {\n      getAlertsPromise = this.getStateChanges();\n    }\n\n    getAlertsPromise.then(() => {\n      this.renderingCompleted();\n    });\n  }\n\n  onFolderChange = (folder: any) => {\n    this.panel.folderId = folder.id;\n    this.refresh();\n  };\n\n  getStateChanges() {\n    const params: any = {\n      limit: this.panel.limit,\n      type: 'alert',\n      newState: this.panel.stateFilter,\n    };\n\n    if (this.panel.onlyAlertsOnDashboard) {\n      params.dashboardId = this.dashboard.id;\n    }\n\n    params.from = dateMath.parse(this.dashboard.time.from).unix() * 1000;\n    params.to = dateMath.parse(this.dashboard.time.to).unix() * 1000;\n\n    return promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get('/api/annotations', params, `alert-list-get-state-changes-${this.panel.id}`)\n        .then(data => {\n          this.alertHistory = _.map(data, al => {\n            al.time = this.dashboard.formatDate(al.time, 'MMM D, YYYY HH:mm:ss');\n            al.stateModel = alertDef.getStateDisplayModel(al.newState);\n            al.info = alertDef.getAlertAnnotationInfo(al);\n            return al;\n          });\n\n          this.noAlertsMessage = this.alertHistory.length === 0 ? 'No alerts in current time range' : '';\n\n          return this.alertHistory;\n        })\n    );\n  }\n\n  getCurrentAlertState() {\n    const params: any = {\n      state: this.panel.stateFilter,\n    };\n\n    if (this.panel.nameFilter) {\n      params.query = this.templateSrv.replace(this.panel.nameFilter, this.panel.scopedVars);\n    }\n\n    if (this.panel.folderId >= 0) {\n      params.folderId = this.panel.folderId;\n    }\n\n    if (this.panel.dashboardFilter) {\n      params.dashboardQuery = this.panel.dashboardFilter;\n    }\n\n    if (this.panel.onlyAlertsOnDashboard) {\n      params.dashboardId = this.dashboard.id;\n    }\n\n    if (this.panel.dashboardTags) {\n      params.dashboardTag = this.panel.dashboardTags;\n    }\n\n    return promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get('/api/alerts', params, `alert-list-get-current-alert-state-${this.panel.id}`)\n        .then(data => {\n          this.currentAlerts = this.sortResult(\n            _.map(data, al => {\n              al.stateModel = alertDef.getStateDisplayModel(al.state);\n              al.newStateDateAgo = dateTime(al.newStateDate)\n                .locale('en')\n                .fromNow(true);\n              return al;\n            })\n          );\n          if (this.currentAlerts.length > this.panel.limit) {\n            this.currentAlerts = this.currentAlerts.slice(0, this.panel.limit);\n          }\n          this.noAlertsMessage = this.currentAlerts.length === 0 ? 'No alerts' : '';\n\n          return this.currentAlerts;\n        })\n    );\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Options', 'public/app/plugins/panel/alertlist/editor.html');\n  }\n}\n\nexport { AlertListPanel, AlertListPanel as PanelCtrl };\n","// Libraries\nimport React, { PureComponent } from 'react';\n// Types\nimport { AnnoOptions } from './types';\nimport { AnnotationEvent, AppEvents, dateTime, DurationUnit, PanelProps } from '@grafana/data';\nimport { Tooltip } from '@grafana/ui';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { AbstractList } from '@grafana/ui/src/components/List/AbstractList';\nimport { TagBadge } from 'app/core/components/TagFilter/TagBadge';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport appEvents from 'app/core/app_events';\n\nimport { updateLocation } from 'app/core/actions';\nimport { store } from 'app/store/store';\nimport { css, cx } from 'emotion';\n\ninterface UserInfo {\n  id: number;\n  login: string;\n  email: string;\n}\n\ninterface Props extends PanelProps<AnnoOptions> {}\ninterface State {\n  annotations: AnnotationEvent[];\n  timeInfo: string;\n  loaded: boolean;\n  queryUser?: UserInfo;\n  queryTags: string[];\n}\n\nexport class AnnoListPanel extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      annotations: [],\n      timeInfo: '',\n      loaded: false,\n      queryTags: [],\n    };\n  }\n\n  componentDidMount() {\n    this.doSearch();\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { options, timeRange } = this.props;\n    const needsQuery =\n      options !== prevProps.options ||\n      this.state.queryTags !== prevState.queryTags ||\n      this.state.queryUser !== prevState.queryUser ||\n      timeRange !== prevProps.timeRange;\n\n    if (needsQuery) {\n      this.doSearch();\n    }\n  }\n\n  async doSearch() {\n    // http://docs.grafana.org/http_api/annotations/\n    // https://github.com/grafana/grafana/blob/master/public/app/core/services/backend_srv.ts\n    // https://github.com/grafana/grafana/blob/master/public/app/features/annotations/annotations_srv.ts\n\n    const { options } = this.props;\n    const { queryUser, queryTags } = this.state;\n\n    const params: any = {\n      tags: options.tags,\n      limit: options.limit,\n      type: 'annotation', // Skip the Annotations that are really alerts.  (Use the alerts panel!)\n    };\n\n    if (options.onlyFromThisDashboard) {\n      params.dashboardId = getDashboardSrv().getCurrent().id;\n    }\n\n    let timeInfo = '';\n    if (options.onlyInTimeRange) {\n      const { timeRange } = this.props;\n      params.from = timeRange.from.valueOf();\n      params.to = timeRange.to.valueOf();\n    } else {\n      timeInfo = 'All Time';\n    }\n\n    if (queryUser) {\n      params.userId = queryUser.id;\n    }\n\n    if (options.tags && options.tags.length) {\n      params.tags = options.tags;\n    }\n\n    if (queryTags.length) {\n      params.tags = params.tags ? [...params.tags, ...queryTags] : queryTags;\n    }\n\n    const annotations = await getBackendSrv().get('/api/annotations', params, `anno-list-panel-${this.props.id}`);\n\n    this.setState({\n      annotations,\n      timeInfo,\n      loaded: true,\n    });\n  }\n\n  onAnnoClick = (e: React.SyntheticEvent, anno: AnnotationEvent) => {\n    e.stopPropagation();\n    const { options } = this.props;\n    const dashboardSrv = getDashboardSrv();\n    const current = dashboardSrv.getCurrent();\n\n    const params: any = {\n      from: this._timeOffset(anno.time, options.navigateBefore, true),\n      to: this._timeOffset(anno.time, options.navigateAfter, false),\n    };\n\n    if (options.navigateToPanel) {\n      params.viewPanel = anno.panelId;\n    }\n\n    if (current.id === anno.dashboardId) {\n      store.dispatch(\n        updateLocation({\n          query: params,\n          partial: true,\n        })\n      );\n      return;\n    }\n\n    getBackendSrv()\n      .get('/api/search', { dashboardIds: anno.dashboardId })\n      .then((res: any[]) => {\n        if (res && res.length && res[0].id === anno.dashboardId) {\n          const dash = res[0];\n          store.dispatch(\n            updateLocation({\n              query: params,\n              path: dash.url,\n            })\n          );\n          return;\n        }\n        appEvents.emit(AppEvents.alertWarning, ['Unknown Dashboard: ' + anno.dashboardId]);\n      });\n  };\n\n  _timeOffset(time: number, offset: string, subtract = false): number {\n    let incr = 5;\n    let unit = 'm';\n    const parts = /^(\\d+)(\\w)/.exec(offset);\n    if (parts && parts.length === 3) {\n      incr = parseInt(parts[1], 10);\n      unit = parts[2];\n    }\n\n    const t = dateTime(time);\n    if (subtract) {\n      incr *= -1;\n    }\n    return t.add(incr, unit as DurationUnit).valueOf();\n  }\n\n  onTagClick = (e: React.SyntheticEvent, tag: string, remove: boolean) => {\n    e.stopPropagation();\n    const queryTags = remove ? this.state.queryTags.filter(item => item !== tag) : [...this.state.queryTags, tag];\n\n    this.setState({ queryTags });\n  };\n\n  onUserClick = (e: React.SyntheticEvent, anno: AnnotationEvent) => {\n    e.stopPropagation();\n    this.setState({\n      queryUser: {\n        id: anno.userId,\n        login: anno.login,\n        email: anno.email,\n      },\n    });\n  };\n\n  onClearUser = () => {\n    this.setState({\n      queryUser: undefined,\n    });\n  };\n\n  renderTags = (tags: string[], remove: boolean): JSX.Element | null => {\n    if (!tags || !tags.length) {\n      return null;\n    }\n    return (\n      <>\n        {tags.map(tag => {\n          return (\n            <span key={tag} onClick={e => this.onTagClick(e, tag, remove)} className=\"pointer\">\n              <TagBadge label={tag} removeIcon={remove} count={0} />\n            </span>\n          );\n        })}\n      </>\n    );\n  };\n\n  renderItem = (anno: AnnotationEvent, index: number): JSX.Element => {\n    const { options } = this.props;\n    const { showUser, showTags, showTime } = options;\n    const dashboard = getDashboardSrv().getCurrent();\n\n    return (\n      <div className=\"dashlist-item\">\n        <span\n          className=\"dashlist-link pointer\"\n          onClick={e => {\n            this.onAnnoClick(e, anno);\n          }}\n        >\n          <span\n            className={cx([\n              'dashlist-title',\n              css`\n                margin-right: 8px;\n              `,\n            ])}\n          >\n            {anno.text}\n          </span>\n\n          <span className=\"pluginlist-message\">\n            {anno.login && showUser && (\n              <span className=\"graph-annotation\">\n                <Tooltip\n                  content={\n                    <span>\n                      Created by:\n                      <br /> {anno.email}\n                    </span>\n                  }\n                  theme=\"info\"\n                  placement=\"top\"\n                >\n                  <span onClick={e => this.onUserClick(e, anno)} className=\"graph-annotation__user\">\n                    <img src={anno.avatarUrl} />\n                  </span>\n                </Tooltip>\n              </span>\n            )}\n            {showTags && this.renderTags(anno.tags, false)}\n          </span>\n\n          <span className=\"pluginlist-version\">{showTime && <span>{dashboard.formatDate(anno.time)}</span>}</span>\n        </span>\n      </div>\n    );\n  };\n\n  render() {\n    const { height } = this.props;\n    const { loaded, annotations, queryUser, queryTags } = this.state;\n    if (!loaded) {\n      return <div>loading...</div>;\n    }\n\n    // Previously we showed inidication that it covered all time\n    // { timeInfo && (\n    //   <span className=\"panel-time-info\">\n    //     <i className=\"fa fa-clock-o\" /> {timeInfo}\n    //   </span>\n    // )}\n\n    const hasFilter = queryUser || queryTags.length > 0;\n\n    return (\n      <div style={{ height, overflow: 'scroll' }}>\n        {hasFilter && (\n          <div>\n            <b>Filter: &nbsp; </b>\n            {queryUser && (\n              <span onClick={this.onClearUser} className=\"pointer\">\n                {queryUser.email}\n              </span>\n            )}\n            {queryTags.length > 0 && this.renderTags(queryTags, true)}\n          </div>\n        )}\n\n        {annotations.length < 1 && <div className=\"panel-alert-list__no-alerts\">No Annotations Found</div>}\n\n        <AbstractList\n          items={annotations}\n          renderItem={this.renderItem}\n          getItemKey={item => {\n            return item.id + '';\n          }}\n          className=\"dashlist\"\n        />\n      </div>\n    );\n  }\n}\n","import React from 'react';\nimport { PanelModel, PanelPlugin } from '@grafana/data';\nimport { TagsInput } from '@grafana/ui';\nimport { AnnoListPanel } from './AnnoListPanel';\nimport { AnnoOptions } from './types';\n\nexport const plugin = new PanelPlugin<AnnoOptions>(AnnoListPanel)\n  .setPanelOptions(builder => {\n    builder\n      .addBooleanSwitch({\n        path: 'showUser',\n        name: 'Show user',\n        description: '',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        path: 'showTime',\n        name: 'Show time',\n        description: '',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        path: 'showTags',\n        name: 'Show tags',\n        description: '',\n        defaultValue: true,\n      })\n      .addTextInput({\n        path: 'navigateBefore',\n        name: 'Before',\n        defaultValue: '10m',\n        description: '',\n      })\n      .addTextInput({\n        path: 'navigateAfter',\n        name: 'After',\n        defaultValue: '10m',\n        description: '',\n      })\n      .addBooleanSwitch({\n        path: 'navigateToPanel',\n        name: 'To panel',\n        description: '',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        path: 'onlyFromThisDashboard',\n        name: 'Only this dashboard',\n        description: '',\n        defaultValue: false,\n      })\n      .addBooleanSwitch({\n        path: 'onlyInTimeRange',\n        name: 'Within Time Range',\n        description: '',\n        defaultValue: false,\n      })\n      .addCustomEditor({\n        id: 'tags',\n        path: 'tags',\n        name: 'Tags',\n        description: '',\n        editor: props => {\n          return <TagsInput tags={props.value} onChange={props.onChange} />;\n        },\n      })\n      .addNumberInput({\n        path: 'limit',\n        name: 'Limit',\n        description: '',\n        defaultValue: 10,\n      });\n  })\n  // TODO, we should support this directly in the plugin infrastructure\n  .setPanelChangeHandler((panel: PanelModel<AnnoOptions>, prevPluginId: string, prevOptions: any) => {\n    if (prevPluginId === 'ryantxu-annolist-panel') {\n      return prevOptions as AnnoOptions;\n    }\n    return panel.options;\n  });\n","import * as d3 from 'd3';\nimport * as d3ScaleChromatic from 'd3-scale-chromatic';\n\nexport function getColorScale(colorScheme: any, lightTheme: boolean, maxValue: number, minValue = 0): (d: any) => any {\n  //@ts-ignore\n  const colorInterpolator = d3ScaleChromatic[colorScheme.value];\n  const colorScaleInverted = colorScheme.invert === 'always' || colorScheme.invert === (lightTheme ? 'light' : 'dark');\n\n  const start = colorScaleInverted ? maxValue : minValue;\n  const end = colorScaleInverted ? minValue : maxValue;\n\n  return d3.scaleSequential(colorInterpolator).domain([start, end]);\n}\n\nexport function getOpacityScale(\n  options: { cardColor?: null; colorScale?: any; exponent?: any },\n  maxValue: number,\n  minValue = 0\n): any {\n  let legendOpacityScale;\n  if (options.colorScale === 'linear') {\n    legendOpacityScale = d3\n      .scaleLinear()\n      .domain([minValue, maxValue])\n      .range([0, 1]);\n  } else if (options.colorScale === 'sqrt') {\n    legendOpacityScale = d3\n      .scalePow()\n      .exponent(options.exponent)\n      .domain([minValue, maxValue])\n      .range([0, 1]);\n  }\n  return legendOpacityScale;\n}\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as d3 from 'd3';\nimport { contextSrv } from 'app/core/core';\nimport { tickStep } from 'app/core/utils/ticks';\nimport { getColorScale, getOpacityScale } from './color_scale';\nimport coreModule from 'app/core/core_module';\nimport { PanelEvents, GrafanaThemeType, getColorFromHexRgbOrName } from '@grafana/data';\n\nconst LEGEND_HEIGHT_PX = 6;\nconst LEGEND_WIDTH_PX = 100;\nconst LEGEND_TICK_SIZE = 0;\nconst LEGEND_VALUE_MARGIN = 0;\nconst LEGEND_PADDING_LEFT = 10;\nconst LEGEND_SEGMENT_WIDTH = 10;\n\n/**\n * Color legend for heatmap editor.\n */\ncoreModule.directive('colorLegend', () => {\n  return {\n    restrict: 'E',\n    template: '<div class=\"heatmap-color-legend\"><svg width=\"16.5rem\" height=\"24px\"></svg></div>',\n    link: (scope: any, elem, attrs) => {\n      const ctrl = scope.ctrl;\n      const panel = scope.ctrl.panel;\n\n      render();\n\n      ctrl.events.on(PanelEvents.render, () => {\n        render();\n      });\n\n      function render() {\n        const legendElem = $(elem).find('svg');\n        const legendWidth = Math.floor(legendElem.outerWidth());\n\n        if (panel.color.mode === 'spectrum') {\n          const colorScheme: any = _.find(ctrl.colorSchemes, {\n            value: panel.color.colorScheme,\n          });\n          const colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, legendWidth);\n          drawSimpleColorLegend(elem, colorScale);\n        } else if (panel.color.mode === 'opacity') {\n          const colorOptions = panel.color;\n          drawSimpleOpacityLegend(elem, colorOptions);\n        }\n      }\n    },\n  };\n});\n\n/**\n * Heatmap legend with scale values.\n */\ncoreModule.directive('heatmapLegend', () => {\n  return {\n    restrict: 'E',\n    template: `<div class=\"heatmap-color-legend\"><svg width=\"${LEGEND_WIDTH_PX}px\" height=\"${LEGEND_HEIGHT_PX}px\"></svg></div>`,\n    link: (scope: any, elem, attrs) => {\n      const ctrl = scope.ctrl;\n      const panel = scope.ctrl.panel;\n\n      render();\n      ctrl.events.on(PanelEvents.render, () => {\n        render();\n      });\n\n      function render() {\n        clearLegend(elem);\n        if (!_.isEmpty(ctrl.data) && !_.isEmpty(ctrl.data.cards)) {\n          const cardStats = ctrl.data.cardStats;\n          const rangeFrom = _.isNil(panel.color.min) ? Math.min(cardStats.min, 0) : panel.color.min;\n          const rangeTo = _.isNil(panel.color.max) ? cardStats.max : panel.color.max;\n          const maxValue = cardStats.max;\n          const minValue = cardStats.min;\n\n          if (panel.color.mode === 'spectrum') {\n            const colorScheme: any = _.find(ctrl.colorSchemes, {\n              value: panel.color.colorScheme,\n            });\n            drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue);\n          } else if (panel.color.mode === 'opacity') {\n            const colorOptions = panel.color;\n            drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue);\n          }\n        }\n      }\n    },\n  };\n});\n\nfunction drawColorLegend(\n  elem: JQuery,\n  colorScheme: any,\n  rangeFrom: number,\n  rangeTo: number,\n  maxValue: number,\n  minValue: number\n) {\n  const legendElem = $(elem).find('svg');\n  const legend = d3.select(legendElem.get(0));\n  clearLegend(elem);\n\n  const legendWidth = Math.floor(legendElem.outerWidth()) - 30;\n  const legendHeight = legendElem.attr('height');\n\n  const rangeStep = ((rangeTo - rangeFrom) / legendWidth) * LEGEND_SEGMENT_WIDTH;\n  const widthFactor = legendWidth / (rangeTo - rangeFrom);\n  const valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n  const colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, rangeTo, rangeFrom);\n  legend\n    .append('g')\n    .attr('class', 'legend-color-bar')\n    .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)')\n    .selectAll('.heatmap-color-legend-rect')\n    .data(valuesRange)\n    .enter()\n    .append('rect')\n    .attr('x', d => Math.round((d - rangeFrom) * widthFactor))\n    .attr('y', 0)\n    .attr('width', Math.round(rangeStep * widthFactor + 1)) // Overlap rectangles to prevent gaps\n    .attr('height', legendHeight)\n    .attr('stroke-width', 0)\n    .attr('fill', d => colorScale(d));\n\n  drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange);\n}\n\nfunction drawOpacityLegend(\n  elem: JQuery,\n  options: { cardColor: null },\n  rangeFrom: number,\n  rangeTo: number,\n  maxValue: any,\n  minValue: number\n) {\n  const legendElem = $(elem).find('svg');\n  const legend = d3.select(legendElem.get(0));\n  clearLegend(elem);\n\n  const legendWidth = Math.floor(legendElem.outerWidth()) - 30;\n  const legendHeight = legendElem.attr('height');\n\n  const rangeStep = ((rangeTo - rangeFrom) / legendWidth) * LEGEND_SEGMENT_WIDTH;\n  const widthFactor = legendWidth / (rangeTo - rangeFrom);\n  const valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n  const opacityScale = getOpacityScale(options, rangeTo, rangeFrom);\n  legend\n    .append('g')\n    .attr('class', 'legend-color-bar')\n    .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)')\n    .selectAll('.heatmap-opacity-legend-rect')\n    .data(valuesRange)\n    .enter()\n    .append('rect')\n    .attr('x', d => Math.round((d - rangeFrom) * widthFactor))\n    .attr('y', 0)\n    .attr('width', Math.round(rangeStep * widthFactor))\n    .attr('height', legendHeight)\n    .attr('stroke-width', 0)\n    .attr('fill', options.cardColor)\n    .style('opacity', d => opacityScale(d));\n\n  drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange);\n}\n\nfunction drawLegendValues(\n  elem: JQuery,\n  rangeFrom: number,\n  rangeTo: number,\n  maxValue: any,\n  minValue: any,\n  legendWidth: number,\n  valuesRange: number[]\n) {\n  const legendElem = $(elem).find('svg');\n  const legend = d3.select(legendElem.get(0));\n\n  if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n    return;\n  }\n\n  const legendValueScale = d3\n    .scaleLinear()\n    .domain([rangeFrom, rangeTo])\n    .range([0, legendWidth]);\n\n  const ticks = buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue);\n  const xAxis = d3\n    .axisBottom(legendValueScale)\n    .tickValues(ticks)\n    .tickSize(LEGEND_TICK_SIZE);\n\n  const colorRect = legendElem.find(':first-child');\n  const posY = getSvgElemHeight(legendElem) + LEGEND_VALUE_MARGIN;\n  const posX = getSvgElemX(colorRect) + LEGEND_PADDING_LEFT;\n\n  d3.select(legendElem.get(0))\n    .append('g')\n    .attr('class', 'axis')\n    .attr('transform', 'translate(' + posX + ',' + posY + ')')\n    .call(xAxis);\n\n  legend\n    .select('.axis')\n    .select('.domain')\n    .remove();\n}\n\nfunction drawSimpleColorLegend(elem: JQuery, colorScale: any) {\n  const legendElem = $(elem).find('svg');\n  clearLegend(elem);\n\n  const legendWidth = Math.floor(legendElem.outerWidth());\n  const legendHeight = legendElem.attr('height');\n\n  if (legendWidth) {\n    const valuesNumber = Math.floor(legendWidth / 2);\n    const rangeStep = Math.floor(legendWidth / valuesNumber);\n    const valuesRange = d3.range(0, legendWidth, rangeStep);\n\n    const legend = d3.select(legendElem.get(0));\n    const legendRects = legend.selectAll('.heatmap-color-legend-rect').data(valuesRange);\n\n    legendRects\n      .enter()\n      .append('rect')\n      .attr('x', d => d)\n      .attr('y', 0)\n      .attr('width', rangeStep + 1) // Overlap rectangles to prevent gaps\n      .attr('height', legendHeight)\n      .attr('stroke-width', 0)\n      .attr('fill', d => colorScale(d));\n  }\n}\n\nfunction drawSimpleOpacityLegend(elem: JQuery, options: { colorScale: string; exponent: number; cardColor: string }) {\n  const legendElem = $(elem).find('svg');\n  clearLegend(elem);\n\n  const legend = d3.select(legendElem.get(0));\n  const legendWidth = Math.floor(legendElem.outerWidth());\n  const legendHeight = legendElem.attr('height');\n\n  if (legendWidth) {\n    let legendOpacityScale: any;\n    if (options.colorScale === 'linear') {\n      legendOpacityScale = d3\n        .scaleLinear()\n        .domain([0, legendWidth])\n        .range([0, 1]);\n    } else if (options.colorScale === 'sqrt') {\n      legendOpacityScale = d3\n        .scalePow()\n        .exponent(options.exponent)\n        .domain([0, legendWidth])\n        .range([0, 1]);\n    }\n\n    const rangeStep = 10;\n    const valuesRange = d3.range(0, legendWidth, rangeStep);\n    const legendRects = legend.selectAll('.heatmap-opacity-legend-rect').data(valuesRange);\n\n    legendRects\n      .enter()\n      .append('rect')\n      .attr('x', d => d)\n      .attr('y', 0)\n      .attr('width', rangeStep)\n      .attr('height', legendHeight)\n      .attr('stroke-width', 0)\n      .attr(\n        'fill',\n        getColorFromHexRgbOrName(\n          options.cardColor,\n          contextSrv.user.lightTheme ? GrafanaThemeType.Light : GrafanaThemeType.Dark\n        )\n      )\n      .style('opacity', d => legendOpacityScale(d));\n  }\n}\n\nfunction clearLegend(elem: JQuery) {\n  const legendElem = $(elem).find('svg');\n  legendElem.empty();\n}\n\nfunction getSvgElemX(elem: JQuery) {\n  const svgElem: any = elem.get(0) as any;\n  if (svgElem && svgElem.x && svgElem.x.baseVal) {\n    return svgElem.x.baseVal.value;\n  } else {\n    return 0;\n  }\n}\n\nfunction getSvgElemHeight(elem: JQuery) {\n  const svgElem: any = elem.get(0);\n  if (svgElem && svgElem.height && svgElem.height.baseVal) {\n    return svgElem.height.baseVal.value;\n  } else {\n    return 0;\n  }\n}\n\nfunction buildLegendTicks(rangeFrom: number, rangeTo: number, maxValue: number, minValue: number) {\n  const range = rangeTo - rangeFrom;\n  const tickStepSize = tickStep(rangeFrom, rangeTo, 3);\n  const ticksNum = Math.ceil(range / tickStepSize);\n  const firstTick = getFirstCloseTick(rangeFrom, tickStepSize);\n  let ticks = [];\n\n  for (let i = 0; i < ticksNum; i++) {\n    const current = firstTick + tickStepSize * i;\n    // Add user-defined min and max if it had been set\n    if (isValueCloseTo(minValue, current, tickStepSize)) {\n      ticks.push(minValue);\n      continue;\n    } else if (minValue < current) {\n      ticks.push(minValue);\n    }\n    if (isValueCloseTo(maxValue, current, tickStepSize)) {\n      ticks.push(maxValue);\n      continue;\n    } else if (maxValue < current) {\n      ticks.push(maxValue);\n    }\n    ticks.push(current);\n  }\n  if (!isValueCloseTo(maxValue, rangeTo, tickStepSize)) {\n    ticks.push(maxValue);\n  }\n  ticks.push(rangeTo);\n  ticks = _.sortBy(_.uniq(ticks));\n  return ticks;\n}\n\nfunction isValueCloseTo(val: number, valueTo: number, step: number) {\n  const diff = Math.abs(val - valueTo);\n  return diff < step * 0.3;\n}\n\nfunction getFirstCloseTick(minValue: number, step: number) {\n  if (minValue < 0) {\n    return Math.floor(minValue / step) * step;\n  }\n  return 0;\n}\n","import kbn from 'app/core/utils/kbn';\nexport class AxesEditorCtrl {\n  panel: any;\n  panelCtrl: any;\n  unitFormats: any;\n  logScales: any;\n  dataFormats: any;\n  yBucketBoundModes: any;\n\n  /** @ngInject */\n  constructor($scope: any, uiSegmentSrv: any) {\n    $scope.editor = this;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n    this.unitFormats = kbn.getUnitFormats();\n\n    this.logScales = {\n      linear: 1,\n      'log (base 2)': 2,\n      'log (base 10)': 10,\n      'log (base 32)': 32,\n      'log (base 1024)': 1024,\n    };\n\n    this.dataFormats = {\n      'Time series': 'timeseries',\n      'Time series buckets': 'tsbuckets',\n    };\n\n    this.yBucketBoundModes = {\n      Auto: 'auto',\n      Upper: 'upper',\n      Lower: 'lower',\n      Middle: 'middle',\n    };\n  }\n\n  setUnitFormat(subItem: any) {\n    this.panel.yAxis.format = subItem.value;\n    this.panelCtrl.render();\n  }\n}\n\n/** @ngInject */\nexport function axesEditor() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/heatmap/partials/axes_editor.html',\n    controller: AxesEditorCtrl,\n  };\n}\n","export class HeatmapDisplayEditorCtrl {\n  panel: any;\n  panelCtrl: any;\n\n  /** @ngInject */\n  constructor($scope: any) {\n    $scope.editor = this;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n\n    this.panelCtrl.render();\n  }\n}\n\n/** @ngInject */\nexport function heatmapDisplayEditor() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/heatmap/partials/display_editor.html',\n    controller: HeatmapDisplayEditorCtrl,\n  };\n}\n","import _ from 'lodash';\nimport { TimeSeries } from 'app/core/core';\nimport { Bucket, HeatmapCard, HeatmapCardStats, YBucket, XBucket } from './types';\n\nconst VALUE_INDEX = 0;\nconst TIME_INDEX = 1;\n\n/**\n * Convert histogram represented by the list of series to heatmap object.\n * @param seriesList List of time series\n */\nfunction histogramToHeatmap(seriesList: TimeSeries[]) {\n  const heatmap: any = {};\n\n  for (let i = 0; i < seriesList.length; i++) {\n    const series = seriesList[i];\n    const bound = i;\n    if (isNaN(bound)) {\n      return heatmap;\n    }\n\n    for (const point of series.datapoints) {\n      const count = point[VALUE_INDEX];\n      const time = point[TIME_INDEX];\n\n      if (!_.isNumber(count)) {\n        continue;\n      }\n\n      let bucket = heatmap[time];\n      if (!bucket) {\n        bucket = heatmap[time] = { x: time, buckets: {} };\n      }\n\n      bucket.buckets[bound] = {\n        y: bound,\n        count: count,\n        bounds: {\n          top: null,\n          bottom: bound,\n        },\n        values: [],\n        points: [],\n      };\n    }\n  }\n\n  return heatmap;\n}\n\n/**\n * Sort series representing histogram by label value.\n */\nfunction sortSeriesByLabel(s1: { label: string }, s2: { label: string }) {\n  let label1, label2;\n\n  try {\n    // fail if not integer. might happen with bad queries\n    label1 = parseHistogramLabel(s1.label);\n    label2 = parseHistogramLabel(s2.label);\n  } catch (err) {\n    console.log(err.message || err);\n    return 0;\n  }\n\n  if (label1 > label2) {\n    return 1;\n  }\n\n  if (label1 < label2) {\n    return -1;\n  }\n\n  return 0;\n}\n\nfunction parseHistogramLabel(label: string): number {\n  if (label === '+Inf' || label === 'inf') {\n    return +Infinity;\n  }\n  const value = Number(label);\n  if (isNaN(value)) {\n    throw new Error(`Error parsing histogram label: ${label} is not a number`);\n  }\n  return value;\n}\n\n/**\n * Convert buckets into linear array of \"cards\" - objects, represented heatmap elements.\n * @param  {Object} buckets\n * @return {Object}          Array of \"card\" objects and stats\n */\nfunction convertToCards(buckets: any, hideZero = false): { cards: HeatmapCard[]; cardStats: HeatmapCardStats } {\n  let min = 0,\n    max = 0;\n  const cards: HeatmapCard[] = [];\n  _.forEach(buckets, xBucket => {\n    _.forEach(xBucket.buckets, yBucket => {\n      const card: HeatmapCard = {\n        x: xBucket.x,\n        y: yBucket.y,\n        yBounds: yBucket.bounds,\n        values: yBucket.values,\n        count: yBucket.count,\n      };\n      if (!hideZero || card.count !== 0) {\n        cards.push(card);\n      }\n\n      if (cards.length === 1) {\n        min = yBucket.count;\n        max = yBucket.count;\n      }\n\n      min = yBucket.count < min ? yBucket.count : min;\n      max = yBucket.count > max ? yBucket.count : max;\n    });\n  });\n\n  const cardStats = { min, max };\n  return { cards, cardStats };\n}\n\n/**\n * Special method for log scales. When series converted into buckets with log scale,\n * for simplification, 0 values are converted into 0, not into -Infinity. On the other hand, we mean\n * that all values less than series minimum, is 0 values, and we create special \"minimum\" bucket for\n * that values (actually, there're no values less than minimum, so this bucket is empty).\n *  8-16|    | ** |    |  * |  **|\n *   4-8|  * |*  *|*   |** *| *  |\n *   2-4| * *|    | ***|    |*   |\n *   1-2|*   |    |    |    |    | This bucket contains minimum series value\n * 0.5-1|____|____|____|____|____| This bucket should be displayed as 0 on graph\n *     0|____|____|____|____|____| This bucket is for 0 values (should actually be -Infinity)\n * So we should merge two bottom buckets into one (0-value bucket).\n *\n * @param  {Object} buckets  Heatmap buckets\n * @param  {Number} minValue Minimum series value\n * @return {Object}          Transformed buckets\n */\nfunction mergeZeroBuckets(buckets: any, minValue: number) {\n  _.forEach(buckets, xBucket => {\n    const yBuckets = xBucket.buckets;\n\n    const emptyBucket: any = {\n      bounds: { bottom: 0, top: 0 },\n      values: [],\n      points: [],\n      count: 0,\n    };\n\n    const nullBucket = yBuckets[0] || emptyBucket;\n    const minBucket = yBuckets[minValue] || emptyBucket;\n\n    const newBucket: any = {\n      y: 0,\n      bounds: { bottom: minValue, top: minBucket.bounds.top || minValue },\n      values: [],\n      points: [],\n      count: 0,\n    };\n\n    newBucket.points = nullBucket.points.concat(minBucket.points);\n    newBucket.values = nullBucket.values.concat(minBucket.values);\n    newBucket.count = newBucket.values.length;\n\n    if (newBucket.count === 0) {\n      return;\n    }\n\n    delete yBuckets[minValue];\n    yBuckets[0] = newBucket;\n  });\n\n  return buckets;\n}\n\n/**\n * Convert set of time series into heatmap buckets\n * @return {Object}    Heatmap object:\n * {\n *   xBucketBound_1: {\n *     x: xBucketBound_1,\n *     buckets: {\n *       yBucketBound_1: {\n *         y: yBucketBound_1,\n *         bounds: {bottom, top}\n *         values: [val_1, val_2, ..., val_K],\n *         points: [[val_Y, val_X, series_name], ..., [...]],\n *         seriesStat: {seriesName_1: val_1, seriesName_2: val_2}\n *       },\n *       ...\n *       yBucketBound_M: {}\n *     },\n *     values: [val_1, val_2, ..., val_K],\n *     points: [\n *       [val_Y, val_X, series_name], (point_1)\n *       ...\n *       [...] (point_K)\n *     ]\n *   },\n *   xBucketBound_2: {},\n *   ...\n *   xBucketBound_N: {}\n * }\n */\nfunction convertToHeatMap(seriesList: TimeSeries[], yBucketSize: number, xBucketSize: number, logBase = 1) {\n  const heatmap = {};\n\n  for (const series of seriesList) {\n    const datapoints = series.datapoints;\n    const seriesName = series.label;\n\n    // Slice series into X axis buckets\n    // |    | ** |    |  * |  **|\n    // |  * |*  *|*   |** *| *  |\n    // |** *|    | ***|    |*   |\n    // |____|____|____|____|____|_\n    //\n    _.forEach(datapoints, point => {\n      const bucketBound = getBucketBound(point[TIME_INDEX], xBucketSize);\n      pushToXBuckets(heatmap, point, bucketBound, seriesName);\n    });\n  }\n\n  // Slice X axis buckets into Y (value) buckets\n  // |  **|     |2|,\n  // | *  | --\\ |1|,\n  // |*   | --/ |1|,\n  // |____|     |0|\n  //\n  _.forEach(heatmap, (xBucket: any) => {\n    if (logBase !== 1) {\n      xBucket.buckets = convertToLogScaleValueBuckets(xBucket, yBucketSize, logBase);\n    } else {\n      xBucket.buckets = convertToValueBuckets(xBucket, yBucketSize);\n    }\n  });\n\n  return heatmap;\n}\n\nfunction pushToXBuckets(buckets: any, point: any[], bucketNum: number, seriesName: string) {\n  const value = point[VALUE_INDEX];\n  if (value === null || value === undefined || isNaN(value)) {\n    return;\n  }\n\n  // Add series name to point for future identification\n  const pointExt = _.concat(point, seriesName);\n\n  if (buckets[bucketNum] && buckets[bucketNum].values) {\n    buckets[bucketNum].values.push(value);\n    buckets[bucketNum].points.push(pointExt);\n  } else {\n    buckets[bucketNum] = {\n      x: bucketNum,\n      values: [value],\n      points: [pointExt],\n    };\n  }\n}\n\nfunction pushToYBuckets(\n  buckets: Bucket,\n  bucketNum: number,\n  value: any,\n  point: string[],\n  bounds: { bottom: number; top: number }\n) {\n  let count = 1;\n  // Use the 3rd argument as scale/count\n  if (point.length > 3) {\n    count = parseInt(point[2], 10);\n  }\n  if (buckets[bucketNum]) {\n    buckets[bucketNum].values.push(value);\n    buckets[bucketNum].points?.push(point);\n    buckets[bucketNum].count += count;\n  } else {\n    buckets[bucketNum] = {\n      y: bucketNum,\n      bounds: bounds,\n      values: [value],\n      points: [point],\n      count: count,\n    };\n  }\n}\n\nfunction getValueBucketBound(value: any, yBucketSize: number, logBase: number) {\n  if (logBase === 1) {\n    return getBucketBound(value, yBucketSize);\n  } else {\n    return getLogScaleBucketBound(value, yBucketSize, logBase);\n  }\n}\n\n/**\n * Find bucket for given value (for linear scale)\n */\nfunction getBucketBounds(value: number, bucketSize: number) {\n  let bottom, top;\n  bottom = Math.floor(value / bucketSize) * bucketSize;\n  top = (Math.floor(value / bucketSize) + 1) * bucketSize;\n\n  return { bottom, top };\n}\n\nfunction getBucketBound(value: number, bucketSize: number) {\n  const bounds = getBucketBounds(value, bucketSize);\n  return bounds.bottom;\n}\n\nfunction convertToValueBuckets(xBucket: { values: any; points: any }, bucketSize: number) {\n  const values = xBucket.values;\n  const points = xBucket.points;\n  const buckets = {};\n\n  _.forEach(values, (val, index) => {\n    const bounds = getBucketBounds(val, bucketSize);\n    const bucketNum = bounds.bottom;\n    pushToYBuckets(buckets, bucketNum, val, points[index], bounds);\n  });\n\n  return buckets;\n}\n\n/**\n * Find bucket for given value (for log scales)\n */\nfunction getLogScaleBucketBounds(value: number, yBucketSplitFactor: number, logBase: number) {\n  let top, bottom;\n  if (value === 0) {\n    return { bottom: 0, top: 0 };\n  }\n\n  const valueLog = logp(value, logBase);\n  let pow, powTop;\n  if (yBucketSplitFactor === 1 || !yBucketSplitFactor) {\n    pow = Math.floor(valueLog);\n    powTop = pow + 1;\n  } else {\n    const additionalBucketSize = 1 / yBucketSplitFactor;\n    let additionalLog = valueLog - Math.floor(valueLog);\n    additionalLog = Math.floor(additionalLog / additionalBucketSize) * additionalBucketSize;\n    pow = Math.floor(valueLog) + additionalLog;\n    powTop = pow + additionalBucketSize;\n  }\n  bottom = Math.pow(logBase, pow);\n  top = Math.pow(logBase, powTop);\n\n  return { bottom, top };\n}\n\nfunction getLogScaleBucketBound(value: number, yBucketSplitFactor: number, logBase: number) {\n  const bounds = getLogScaleBucketBounds(value, yBucketSplitFactor, logBase);\n  return bounds.bottom;\n}\n\nfunction convertToLogScaleValueBuckets(\n  xBucket: { values: any; points: any },\n  yBucketSplitFactor: number,\n  logBase: number\n) {\n  const values = xBucket.values;\n  const points = xBucket.points;\n\n  const buckets = {};\n  _.forEach(values, (val, index) => {\n    const bounds = getLogScaleBucketBounds(val, yBucketSplitFactor, logBase);\n    const bucketNum = bounds.bottom;\n    pushToYBuckets(buckets, bucketNum, val, points[index], bounds);\n  });\n\n  return buckets;\n}\n\n/**\n * Logarithm for custom base\n * @param value\n * @param base logarithm base\n */\nfunction logp(value: number, base: number) {\n  return Math.log(value) / Math.log(base);\n}\n\n/**\n * Calculate size of Y bucket from given buckets bounds.\n * @param bounds Array of Y buckets bounds\n * @param logBase Logarithm base\n */\nfunction calculateBucketSize(bounds: number[], logBase = 1): number {\n  let bucketSize = Infinity;\n\n  if (bounds.length === 0) {\n    return 0;\n  } else if (bounds.length === 1) {\n    return bounds[0];\n  } else {\n    bounds = _.sortBy(bounds);\n    for (let i = 1; i < bounds.length; i++) {\n      const distance = getDistance(bounds[i], bounds[i - 1], logBase);\n      bucketSize = distance < bucketSize ? distance : bucketSize;\n    }\n  }\n\n  return bucketSize;\n}\n\n/**\n * Calculate distance between two numbers in given scale (linear or logarithmic).\n * @param a\n * @param b\n * @param logBase\n */\nfunction getDistance(a: number, b: number, logBase = 1): number {\n  if (logBase === 1) {\n    // Linear distance\n    return Math.abs(b - a);\n  } else {\n    // logarithmic distance\n    const ratio = Math.max(a, b) / Math.min(a, b);\n    return logp(ratio, logBase);\n  }\n}\n\n/**\n * Compare two heatmap data objects\n * @param objA\n * @param objB\n */\nfunction isHeatmapDataEqual(objA: any, objB: any): boolean {\n  let isEql = !emptyXOR(objA, objB);\n\n  _.forEach(objA, (xBucket: XBucket, x) => {\n    if (objB[x]) {\n      if (emptyXOR(xBucket.buckets, objB[x].buckets)) {\n        isEql = false;\n        return false;\n      }\n\n      _.forEach(xBucket.buckets, (yBucket: YBucket, y) => {\n        if (objB[x].buckets && objB[x].buckets[y]) {\n          if (objB[x].buckets[y].values) {\n            isEql = _.isEqual(_.sortBy(yBucket.values), _.sortBy(objB[x].buckets[y].values));\n            if (!isEql) {\n              return false;\n            } else {\n              return true;\n            }\n          } else {\n            isEql = false;\n            return false;\n          }\n        } else {\n          isEql = false;\n          return false;\n        }\n      });\n\n      if (!isEql) {\n        return false;\n      } else {\n        return true;\n      }\n    } else {\n      isEql = false;\n      return false;\n    }\n  });\n\n  return isEql;\n}\n\nfunction emptyXOR(foo: any, bar: any): boolean {\n  return (_.isEmpty(foo) || _.isEmpty(bar)) && !(_.isEmpty(foo) && _.isEmpty(bar));\n}\n\nexport {\n  convertToHeatMap,\n  histogramToHeatmap,\n  convertToCards,\n  mergeZeroBuckets,\n  getValueBucketBound,\n  isHeatmapDataEqual,\n  calculateBucketSize,\n  sortSeriesByLabel,\n};\n","import * as d3 from 'd3';\nimport $ from 'jquery';\nimport _ from 'lodash';\nimport { getValueBucketBound } from './heatmap_data_converter';\nimport { getValueFormat, formattedValueToString } from '@grafana/data';\n\nconst TOOLTIP_PADDING_X = 30;\nconst TOOLTIP_PADDING_Y = 5;\nconst HISTOGRAM_WIDTH = 160;\nconst HISTOGRAM_HEIGHT = 40;\n\nexport class HeatmapTooltip {\n  tooltip: any;\n  scope: any;\n  dashboard: any;\n  panelCtrl: any;\n  panel: any;\n  heatmapPanel: any;\n  mouseOverBucket: boolean;\n  originalFillColor: any;\n\n  constructor(elem: JQuery, scope: any) {\n    this.scope = scope;\n    this.dashboard = scope.ctrl.dashboard;\n    this.panelCtrl = scope.ctrl;\n    this.panel = scope.ctrl.panel;\n    this.heatmapPanel = elem;\n    this.mouseOverBucket = false;\n    this.originalFillColor = null;\n\n    elem.on('mouseleave', this.onMouseLeave.bind(this));\n  }\n\n  onMouseLeave() {\n    this.destroy();\n  }\n\n  onMouseMove(e: any) {\n    if (!this.panel.tooltip.show) {\n      return;\n    }\n\n    this.move(e);\n  }\n\n  add() {\n    this.tooltip = d3\n      .select('body')\n      .append('div')\n      .attr('class', 'heatmap-tooltip graph-tooltip grafana-tooltip');\n  }\n\n  destroy() {\n    if (this.tooltip) {\n      this.tooltip.remove();\n    }\n\n    this.tooltip = null;\n  }\n\n  show(pos: { panelRelY: any }, data: any) {\n    if (!this.panel.tooltip.show || !data) {\n      return;\n    }\n    // shared tooltip mode\n    if (pos.panelRelY) {\n      return;\n    }\n\n    const { xBucketIndex, yBucketIndex } = this.getBucketIndexes(pos, data);\n\n    if (!data.buckets[xBucketIndex]) {\n      this.destroy();\n      return;\n    }\n\n    if (!this.tooltip) {\n      this.add();\n    }\n\n    let boundBottom, boundTop, valuesNumber;\n    const xData = data.buckets[xBucketIndex];\n    // Search in special 'zero' bucket also\n    const yData: any = _.find(xData.buckets, (bucket, bucketIndex) => {\n      return bucket.bounds.bottom === yBucketIndex || bucketIndex === yBucketIndex.toString();\n    });\n\n    const tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n    const time = this.dashboard.formatDate(xData.x, tooltipTimeFormat);\n\n    // Decimals override. Code from panel/graph/graph.ts\n    let countValueFormatter, bucketBoundFormatter;\n    if (_.isNumber(this.panel.tooltipDecimals)) {\n      countValueFormatter = this.countValueFormatter(this.panel.tooltipDecimals, null);\n      bucketBoundFormatter = this.panelCtrl.tickValueFormatter(this.panelCtrl.decimals, null);\n    } else {\n      // auto decimals\n      // legend and tooltip gets one more decimal precision\n      // than graph legend ticks\n      const decimals = (this.panelCtrl.decimals || -1) + 1;\n      countValueFormatter = this.countValueFormatter(decimals, this.panelCtrl.scaledDecimals + 2);\n      bucketBoundFormatter = this.panelCtrl.tickValueFormatter(decimals, this.panelCtrl.scaledDecimals + 2);\n    }\n\n    let tooltipHtml = `<div class=\"graph-tooltip-time\">${time}</div>\n      <div class=\"heatmap-histogram\"></div>`;\n\n    if (yData) {\n      if (yData.bounds) {\n        if (data.tsBuckets) {\n          // Use Y-axis labels\n          const tickFormatter = (valIndex: string | number) => {\n            return data.tsBucketsFormatted ? data.tsBucketsFormatted[valIndex] : data.tsBuckets[valIndex];\n          };\n\n          boundBottom = tickFormatter(yBucketIndex);\n          if (this.panel.yBucketBound !== 'middle') {\n            boundTop = yBucketIndex < data.tsBuckets.length - 1 ? tickFormatter(yBucketIndex + 1) : '';\n          }\n        } else {\n          // Display 0 if bucket is a special 'zero' bucket\n          const bottom = yData.y ? yData.bounds.bottom : 0;\n          boundBottom = bucketBoundFormatter(bottom);\n          boundTop = bucketBoundFormatter(yData.bounds.top);\n        }\n        valuesNumber = countValueFormatter(yData.count);\n        const boundStr = boundTop && boundBottom ? `${boundBottom} - ${boundTop}` : boundBottom || boundTop;\n        tooltipHtml += `<div>\n          bucket: <b>${boundStr}</b> <br>\n          count: <b>${valuesNumber}</b> <br>\n        </div>`;\n      } else {\n        // currently no bounds for pre bucketed data\n        tooltipHtml += `<div>count: <b>${yData.count}</b><br></div>`;\n      }\n    } else {\n      if (!this.panel.tooltip.showHistogram) {\n        this.destroy();\n        return;\n      }\n      boundBottom = yBucketIndex;\n      boundTop = '';\n      valuesNumber = 0;\n    }\n\n    this.tooltip.html(tooltipHtml);\n\n    if (this.panel.tooltip.showHistogram) {\n      this.addHistogram(xData);\n    }\n\n    this.move(pos);\n  }\n\n  getBucketIndexes(pos: { panelRelY?: any; x?: any; y?: any }, data: any) {\n    const xBucketIndex = this.getXBucketIndex(pos.x, data);\n    const yBucketIndex = this.getYBucketIndex(pos.y, data);\n    return { xBucketIndex, yBucketIndex };\n  }\n\n  getXBucketIndex(x: number, data: { buckets: any; xBucketSize: number }) {\n    // First try to find X bucket by checking x pos is in the\n    // [bucket.x, bucket.x + xBucketSize] interval\n    const xBucket: any = _.find(data.buckets, bucket => {\n      return x > bucket.x && x - bucket.x <= data.xBucketSize;\n    });\n    return xBucket ? xBucket.x : getValueBucketBound(x, data.xBucketSize, 1);\n  }\n\n  getYBucketIndex(y: number, data: { tsBuckets: any; yBucketSize: number }) {\n    if (data.tsBuckets) {\n      return Math.floor(y);\n    }\n    const yBucketIndex = getValueBucketBound(y, data.yBucketSize, this.panel.yAxis.logBase);\n    return yBucketIndex;\n  }\n\n  getSharedTooltipPos(pos: { pageX: any; x: any; pageY: any; panelRelY: number }) {\n    // get pageX from position on x axis and pageY from relative position in original panel\n    pos.pageX = this.heatmapPanel.offset().left + this.scope.xScale(pos.x);\n    pos.pageY = this.heatmapPanel.offset().top + this.scope.chartHeight * pos.panelRelY;\n    return pos;\n  }\n\n  addHistogram(data: { x: string | number }) {\n    const xBucket = this.scope.ctrl.data.buckets[data.x];\n    const yBucketSize = this.scope.ctrl.data.yBucketSize;\n    let min: number, max: number, ticks: number;\n    if (this.scope.ctrl.data.tsBuckets) {\n      min = 0;\n      max = this.scope.ctrl.data.tsBuckets.length - 1;\n      ticks = this.scope.ctrl.data.tsBuckets.length;\n    } else {\n      min = this.scope.ctrl.data.yAxis.min;\n      max = this.scope.ctrl.data.yAxis.max;\n      ticks = this.scope.ctrl.data.yAxis.ticks;\n    }\n    let histogramData = _.map(xBucket.buckets, bucket => {\n      const count = bucket.count !== undefined ? bucket.count : bucket.values.length;\n      return [bucket.bounds.bottom, count];\n    });\n    histogramData = _.filter(histogramData, d => {\n      return d[0] >= min && d[0] <= max;\n    });\n\n    const scale = this.scope.yScale.copy();\n    const histXScale = scale.domain([min, max]).range([0, HISTOGRAM_WIDTH]);\n\n    let barWidth: number;\n    if (this.panel.yAxis.logBase === 1) {\n      barWidth = Math.floor((HISTOGRAM_WIDTH / (max - min)) * yBucketSize * 0.9);\n    } else {\n      const barNumberFactor = yBucketSize ? yBucketSize : 1;\n      barWidth = Math.floor((HISTOGRAM_WIDTH / ticks / barNumberFactor) * 0.9);\n    }\n    barWidth = Math.max(barWidth, 1);\n\n    // Normalize histogram Y axis\n    const histogramDomain = _.reduce(\n      _.map(histogramData, d => d[1]),\n      (sum, val) => sum + val,\n      0\n    );\n    const histYScale = d3\n      .scaleLinear()\n      .domain([0, histogramDomain])\n      .range([0, HISTOGRAM_HEIGHT]);\n\n    const histogram = this.tooltip\n      .select('.heatmap-histogram')\n      .append('svg')\n      .attr('width', HISTOGRAM_WIDTH)\n      .attr('height', HISTOGRAM_HEIGHT);\n\n    histogram\n      .selectAll('.bar')\n      .data(histogramData)\n      .enter()\n      .append('rect')\n      .attr('x', (d: any[]) => {\n        return histXScale(d[0]);\n      })\n      .attr('width', barWidth)\n      .attr('y', (d: any[]) => {\n        return HISTOGRAM_HEIGHT - histYScale(d[1]);\n      })\n      .attr('height', (d: any[]) => {\n        return histYScale(d[1]);\n      });\n  }\n\n  move(pos: { panelRelY?: any; pageX?: any; pageY?: any }) {\n    if (!this.tooltip) {\n      return;\n    }\n\n    const elem = $(this.tooltip.node())[0];\n    const tooltipWidth = elem.clientWidth;\n    const tooltipHeight = elem.clientHeight;\n\n    let left = pos.pageX + TOOLTIP_PADDING_X;\n    let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n    if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n      left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n    }\n\n    if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n      top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n    }\n\n    return this.tooltip.style('left', left + 'px').style('top', top + 'px');\n  }\n\n  countValueFormatter(decimals: number, scaledDecimals: any = null) {\n    const fmt = getValueFormat('short');\n    return (value: number) => {\n      return formattedValueToString(fmt(value, decimals, scaledDecimals));\n    };\n  }\n}\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport * as d3 from 'd3';\nimport { appEvents, contextSrv } from 'app/core/core';\nimport * as ticksUtils from 'app/core/utils/ticks';\nimport { HeatmapTooltip } from './heatmap_tooltip';\nimport { mergeZeroBuckets } from './heatmap_data_converter';\nimport { getColorScale, getOpacityScale } from './color_scale';\nimport {\n  toUtc,\n  PanelEvents,\n  GrafanaThemeType,\n  getColorFromHexRgbOrName,\n  getValueFormat,\n  formattedValueToString,\n  dateTimeFormat,\n} from '@grafana/data';\nimport { CoreEvents } from 'app/types';\n\nconst MIN_CARD_SIZE = 1,\n  CARD_PADDING = 1,\n  CARD_ROUND = 0,\n  DATA_RANGE_WIDING_FACTOR = 1.2,\n  DEFAULT_X_TICK_SIZE_PX = 100,\n  DEFAULT_Y_TICK_SIZE_PX = 50,\n  X_AXIS_TICK_PADDING = 10,\n  Y_AXIS_TICK_PADDING = 5,\n  MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n  return new HeatmapRenderer(scope, elem, attrs, ctrl);\n}\nexport class HeatmapRenderer {\n  width: number;\n  height: number;\n  yScale: any;\n  xScale: any;\n  chartWidth: number;\n  chartHeight: number;\n  chartTop: number;\n  chartBottom: number;\n  yAxisWidth: number;\n  xAxisHeight: number;\n  cardPadding: number;\n  cardRound: number;\n  cardWidth: number;\n  cardHeight: number;\n  colorScale: any;\n  opacityScale: any;\n  mouseUpHandler: any;\n  data: any;\n  panel: any;\n  $heatmap: any;\n  tooltip: HeatmapTooltip;\n  heatmap: any;\n  timeRange: any;\n\n  selection: any;\n  padding: any;\n  margin: any;\n  dataRangeWidingFactor: number;\n  constructor(private scope: any, private elem: any, attrs: any, private ctrl: any) {\n    // $heatmap is JQuery object, but heatmap is D3\n    this.$heatmap = this.elem.find('.heatmap-panel');\n    this.tooltip = new HeatmapTooltip(this.$heatmap, this.scope);\n\n    this.selection = {\n      active: false,\n      x1: -1,\n      x2: -1,\n    };\n\n    this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n    this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n    this.dataRangeWidingFactor = DATA_RANGE_WIDING_FACTOR;\n\n    this.ctrl.events.on(PanelEvents.render, this.onRender.bind(this));\n\n    this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n    /////////////////////////////\n    // Selection and crosshair //\n    /////////////////////////////\n\n    // Shared crosshair and tooltip\n    appEvents.on(CoreEvents.graphHover, this.onGraphHover.bind(this), this.scope);\n\n    appEvents.on(CoreEvents.graphHoverClear, this.onGraphHoverClear.bind(this), this.scope);\n\n    // Register selection listeners\n    this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n    this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n    this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n  }\n\n  onGraphHoverClear() {\n    this.clearCrosshair();\n  }\n\n  onGraphHover(event: { pos: any }) {\n    this.drawSharedCrosshair(event.pos);\n  }\n\n  onRender() {\n    this.render();\n    this.ctrl.renderingCompleted();\n  }\n\n  setElementHeight() {\n    try {\n      let height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n      if (_.isString(height)) {\n        height = parseInt(height.replace('px', ''), 10);\n      }\n\n      height -= this.panel.legend.show ? 28 : 11; // bottom padding and space for legend\n\n      this.$heatmap.css('height', height + 'px');\n\n      return true;\n    } catch (e) {\n      // IE throws errors sometimes\n      return false;\n    }\n  }\n\n  getYAxisWidth(elem: any) {\n    const axisText = elem.selectAll('.axis-y text').nodes();\n    const maxTextWidth = _.max(\n      _.map(axisText, text => {\n        // Use SVG getBBox method\n        return text.getBBox().width;\n      })\n    );\n\n    return maxTextWidth;\n  }\n\n  getXAxisHeight(elem: any) {\n    const axisLine = elem.select('.axis-x line');\n    if (!axisLine.empty()) {\n      const axisLinePosition = parseFloat(elem.select('.axis-x line').attr('y2'));\n      const canvasWidth = parseFloat(elem.attr('height'));\n      return canvasWidth - axisLinePosition;\n    } else {\n      // Default height\n      return 30;\n    }\n  }\n\n  addXAxis() {\n    this.scope.xScale = this.xScale = d3\n      .scaleTime()\n      .domain([this.timeRange.from, this.timeRange.to])\n      .range([0, this.chartWidth]);\n\n    const ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n    const format = ticksUtils.grafanaTimeFormat(ticks, this.timeRange.from, this.timeRange.to);\n    const timeZone = this.ctrl.dashboard.getTimezone();\n    const formatter = (date: Date) => dateTimeFormat(date, { format, timeZone });\n\n    const xAxis = d3\n      .axisBottom(this.xScale)\n      .ticks(ticks)\n      .tickFormat(formatter)\n      .tickPadding(X_AXIS_TICK_PADDING)\n      .tickSize(this.chartHeight);\n\n    const posY = this.margin.top;\n    const posX = this.yAxisWidth;\n    this.heatmap\n      .append('g')\n      .attr('class', 'axis axis-x')\n      .attr('transform', 'translate(' + posX + ',' + posY + ')')\n      .call(xAxis);\n\n    // Remove horizontal line in the top of axis labels (called domain in d3)\n    this.heatmap\n      .select('.axis-x')\n      .select('.domain')\n      .remove();\n  }\n\n  addYAxis() {\n    let ticks = Math.ceil(this.chartHeight / DEFAULT_Y_TICK_SIZE_PX);\n    let tickInterval = ticksUtils.tickStep(this.data.heatmapStats.min, this.data.heatmapStats.max, ticks);\n    let { yMin, yMax } = this.wideYAxisRange(this.data.heatmapStats.min, this.data.heatmapStats.max, tickInterval);\n\n    // Rewrite min and max if it have been set explicitly\n    yMin = this.panel.yAxis.min !== null ? this.panel.yAxis.min : yMin;\n    yMax = this.panel.yAxis.max !== null ? this.panel.yAxis.max : yMax;\n\n    // Adjust ticks after Y range widening\n    tickInterval = ticksUtils.tickStep(yMin, yMax, ticks);\n    ticks = Math.ceil((yMax - yMin) / tickInterval);\n\n    const decimalsAuto = ticksUtils.getPrecision(tickInterval);\n    let decimals = this.panel.yAxis.decimals === null ? decimalsAuto : this.panel.yAxis.decimals;\n    // Calculate scaledDecimals for log scales using tick size (as in jquery.flot.js)\n    const flotTickSize = ticksUtils.getFlotTickSize(yMin, yMax, ticks, decimalsAuto);\n    const scaledDecimals = ticksUtils.getScaledDecimals(decimals, flotTickSize);\n    this.ctrl.decimals = decimals;\n    this.ctrl.scaledDecimals = scaledDecimals;\n\n    // Set default Y min and max if no data\n    if (_.isEmpty(this.data.buckets)) {\n      yMax = 1;\n      yMin = -1;\n      ticks = 3;\n      decimals = 1;\n    }\n\n    this.data.yAxis = {\n      min: yMin,\n      max: yMax,\n      ticks: ticks,\n    };\n\n    this.scope.yScale = this.yScale = d3\n      .scaleLinear()\n      .domain([yMin, yMax])\n      .range([this.chartHeight, 0]);\n\n    const yAxis = d3\n      .axisLeft(this.yScale)\n      .ticks(ticks)\n      .tickFormat(this.tickValueFormatter(decimals, scaledDecimals))\n      .tickSizeInner(0 - this.width)\n      .tickSizeOuter(0)\n      .tickPadding(Y_AXIS_TICK_PADDING);\n\n    this.heatmap\n      .append('g')\n      .attr('class', 'axis axis-y')\n      .call(yAxis);\n\n    // Calculate Y axis width first, then move axis into visible area\n    const posY = this.margin.top;\n    const posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.heatmap.select('.axis-y').attr('transform', 'translate(' + posX + ',' + posY + ')');\n\n    // Remove vertical line in the right of axis labels (called domain in d3)\n    this.heatmap\n      .select('.axis-y')\n      .select('.domain')\n      .remove();\n  }\n\n  // Wide Y values range and anjust to bucket size\n  wideYAxisRange(min: number, max: number, tickInterval: number) {\n    const yWiding = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n    let yMin, yMax;\n\n    if (tickInterval === 0) {\n      yMax = max * this.dataRangeWidingFactor;\n      yMin = min - min * (this.dataRangeWidingFactor - 1);\n    } else {\n      yMax = Math.ceil((max + yWiding) / tickInterval) * tickInterval;\n      yMin = Math.floor((min - yWiding) / tickInterval) * tickInterval;\n    }\n\n    // Don't wide axis below 0 if all values are positive\n    if (min >= 0 && yMin < 0) {\n      yMin = 0;\n    }\n\n    return { yMin, yMax };\n  }\n\n  addLogYAxis() {\n    const logBase = this.panel.yAxis.logBase;\n    let { yMin, yMax } = this.adjustLogRange(this.data.heatmapStats.minLog, this.data.heatmapStats.max, logBase);\n\n    yMin =\n      this.panel.yAxis.min && this.panel.yAxis.min !== '0' ? this.adjustLogMin(this.panel.yAxis.min, logBase) : yMin;\n    yMax = this.panel.yAxis.max !== null ? this.adjustLogMax(this.panel.yAxis.max, logBase) : yMax;\n\n    // Set default Y min and max if no data\n    if (_.isEmpty(this.data.buckets)) {\n      yMax = Math.pow(logBase, 2);\n      yMin = 1;\n    }\n\n    this.scope.yScale = this.yScale = d3\n      .scaleLog()\n      .base(this.panel.yAxis.logBase)\n      .domain([yMin, yMax])\n      .range([this.chartHeight, 0]);\n\n    const domain = this.yScale.domain();\n    const tickValues = this.logScaleTickValues(domain, logBase);\n\n    const decimalsAuto = ticksUtils.getPrecision(yMin);\n    const decimals = this.panel.yAxis.decimals || decimalsAuto;\n\n    // Calculate scaledDecimals for log scales using tick size (as in jquery.flot.js)\n    const flotTickSize = ticksUtils.getFlotTickSize(yMin, yMax, tickValues.length, decimalsAuto);\n    const scaledDecimals = ticksUtils.getScaledDecimals(decimals, flotTickSize);\n    this.ctrl.decimals = decimals;\n    this.ctrl.scaledDecimals = scaledDecimals;\n\n    this.data.yAxis = {\n      min: yMin,\n      max: yMax,\n      ticks: tickValues.length,\n    };\n\n    const yAxis = d3\n      .axisLeft(this.yScale)\n      .tickValues(tickValues)\n      .tickFormat(this.tickValueFormatter(decimals, scaledDecimals))\n      .tickSizeInner(0 - this.width)\n      .tickSizeOuter(0)\n      .tickPadding(Y_AXIS_TICK_PADDING);\n\n    this.heatmap\n      .append('g')\n      .attr('class', 'axis axis-y')\n      .call(yAxis);\n\n    // Calculate Y axis width first, then move axis into visible area\n    const posY = this.margin.top;\n    const posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.heatmap.select('.axis-y').attr('transform', 'translate(' + posX + ',' + posY + ')');\n\n    // Set first tick as pseudo 0\n    if (yMin < 1) {\n      this.heatmap\n        .select('.axis-y')\n        .select('.tick text')\n        .text('0');\n    }\n\n    // Remove vertical line in the right of axis labels (called domain in d3)\n    this.heatmap\n      .select('.axis-y')\n      .select('.domain')\n      .remove();\n  }\n\n  addYAxisFromBuckets() {\n    const tsBuckets = this.data.tsBuckets;\n\n    this.scope.yScale = this.yScale = d3\n      .scaleLinear()\n      .domain([0, tsBuckets.length - 1])\n      .range([this.chartHeight, 0]);\n\n    const tickValues = _.map(tsBuckets, (b, i) => i);\n    const decimalsAuto = _.max(_.map(tsBuckets, ticksUtils.getStringPrecision));\n    const decimals = this.panel.yAxis.decimals === null ? decimalsAuto : this.panel.yAxis.decimals;\n    this.ctrl.decimals = decimals;\n\n    const tickValueFormatter = this.tickValueFormatter.bind(this);\n    function tickFormatter(valIndex: string) {\n      let valueFormatted = tsBuckets[valIndex];\n      if (!_.isNaN(_.toNumber(valueFormatted)) && valueFormatted !== '') {\n        // Try to format numeric tick labels\n        valueFormatted = tickValueFormatter(decimals)(_.toNumber(valueFormatted));\n      }\n      return valueFormatted;\n    }\n\n    const tsBucketsFormatted = _.map(tsBuckets, (v, i) => tickFormatter(i));\n    this.data.tsBucketsFormatted = tsBucketsFormatted;\n\n    const yAxis = d3\n      .axisLeft(this.yScale)\n      .tickValues(tickValues)\n      .tickFormat(tickFormatter)\n      .tickSizeInner(0 - this.width)\n      .tickSizeOuter(0)\n      .tickPadding(Y_AXIS_TICK_PADDING);\n\n    this.heatmap\n      .append('g')\n      .attr('class', 'axis axis-y')\n      .call(yAxis);\n\n    // Calculate Y axis width first, then move axis into visible area\n    const posY = this.margin.top;\n    const posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.heatmap.select('.axis-y').attr('transform', 'translate(' + posX + ',' + posY + ')');\n\n    if (this.panel.yBucketBound === 'middle' && tickValues && tickValues.length) {\n      // Shift Y axis labels to the middle of bucket\n      const tickShift = 0 - this.chartHeight / (tickValues.length - 1) / 2;\n      this.heatmap.selectAll('.axis-y text').attr('transform', 'translate(' + 0 + ',' + tickShift + ')');\n    }\n\n    // Remove vertical line in the right of axis labels (called domain in d3)\n    this.heatmap\n      .select('.axis-y')\n      .select('.domain')\n      .remove();\n  }\n\n  // Adjust data range to log base\n  adjustLogRange(min: number, max: number, logBase: number) {\n    let yMin = this.data.heatmapStats.minLog;\n    if (this.data.heatmapStats.minLog > 1 || !this.data.heatmapStats.minLog) {\n      yMin = 1;\n    } else {\n      yMin = this.adjustLogMin(this.data.heatmapStats.minLog, logBase);\n    }\n\n    // Adjust max Y value to log base\n    const yMax = this.adjustLogMax(this.data.heatmapStats.max, logBase);\n\n    return { yMin, yMax };\n  }\n\n  adjustLogMax(max: number, base: number) {\n    return Math.pow(base, Math.ceil(ticksUtils.logp(max, base)));\n  }\n\n  adjustLogMin(min: number, base: number) {\n    return Math.pow(base, Math.floor(ticksUtils.logp(min, base)));\n  }\n\n  logScaleTickValues(domain: any[], base: number) {\n    const domainMin = domain[0];\n    const domainMax = domain[1];\n    const tickValues = [];\n\n    if (domainMin < 1) {\n      const underOneTicks = Math.floor(ticksUtils.logp(domainMin, base));\n      for (let i = underOneTicks; i < 0; i++) {\n        const tickValue = Math.pow(base, i);\n        tickValues.push(tickValue);\n      }\n    }\n\n    const ticks = Math.ceil(ticksUtils.logp(domainMax, base));\n    for (let i = 0; i <= ticks; i++) {\n      const tickValue = Math.pow(base, i);\n      tickValues.push(tickValue);\n    }\n\n    return tickValues;\n  }\n\n  tickValueFormatter(decimals: number, scaledDecimals: any = null) {\n    const format = this.panel.yAxis.format;\n    return (value: any) => {\n      try {\n        if (format !== 'none') {\n          const v = getValueFormat(format)(value, decimals, scaledDecimals);\n          return formattedValueToString(v);\n        }\n      } catch (err) {\n        console.error(err.message || err);\n      }\n      return value;\n    };\n  }\n\n  fixYAxisTickSize() {\n    this.heatmap\n      .select('.axis-y')\n      .selectAll('.tick line')\n      .attr('x2', this.chartWidth);\n  }\n\n  addAxes() {\n    this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n    this.chartTop = this.margin.top;\n    this.chartBottom = this.chartTop + this.chartHeight;\n    if (this.panel.dataFormat === 'tsbuckets') {\n      this.addYAxisFromBuckets();\n    } else {\n      if (this.panel.yAxis.logBase === 1) {\n        this.addYAxis();\n      } else {\n        this.addLogYAxis();\n      }\n    }\n\n    this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n    this.fixYAxisTickSize();\n\n    this.addXAxis();\n    this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n    if (!this.panel.yAxis.show) {\n      this.heatmap\n        .select('.axis-y')\n        .selectAll('line')\n        .style('opacity', 0);\n    }\n\n    if (!this.panel.xAxis.show) {\n      this.heatmap\n        .select('.axis-x')\n        .selectAll('line')\n        .style('opacity', 0);\n    }\n  }\n\n  addHeatmapCanvas() {\n    const heatmapElem = this.$heatmap[0];\n\n    this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n    this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n    this.cardPadding = this.panel.cards.cardPadding !== null ? this.panel.cards.cardPadding : CARD_PADDING;\n    this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n    if (this.heatmap) {\n      this.heatmap.remove();\n    }\n\n    this.heatmap = d3\n      .select(heatmapElem)\n      .append('svg')\n      .attr('width', this.width)\n      .attr('height', this.height);\n  }\n\n  addHeatmap() {\n    this.addHeatmapCanvas();\n    this.addAxes();\n\n    if (this.panel.yAxis.logBase !== 1 && this.panel.dataFormat !== 'tsbuckets') {\n      const logBase = this.panel.yAxis.logBase;\n      const domain = this.yScale.domain();\n      const tickValues = this.logScaleTickValues(domain, logBase);\n      this.data.buckets = mergeZeroBuckets(this.data.buckets, _.min(tickValues)!);\n    }\n\n    const cardsData = this.data.cards;\n    const cardStats = this.data.cardStats;\n    const maxValueAuto = cardStats.max;\n    const minValueAuto = Math.min(cardStats.min, 0);\n    const maxValue = _.isNil(this.panel.color.max) ? maxValueAuto : this.panel.color.max;\n    const minValue = _.isNil(this.panel.color.min) ? minValueAuto : this.panel.color.min;\n    const colorScheme: any = _.find(this.ctrl.colorSchemes, {\n      value: this.panel.color.colorScheme,\n    });\n    this.colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, maxValue, minValue);\n    this.opacityScale = getOpacityScale(this.panel.color, maxValue, minValue);\n    this.setCardSize();\n\n    let cards = this.heatmap.selectAll('.heatmap-card').data(cardsData);\n    cards.append('title');\n    cards = cards\n      .enter()\n      .append('rect')\n      .attr('x', this.getCardX.bind(this))\n      .attr('width', this.getCardWidth.bind(this))\n      .attr('y', this.getCardY.bind(this))\n      .attr('height', this.getCardHeight.bind(this))\n      .attr('rx', this.cardRound)\n      .attr('ry', this.cardRound)\n      .attr('class', 'bordered heatmap-card')\n      .style('fill', this.getCardColor.bind(this))\n      .style('stroke', this.getCardColor.bind(this))\n      .style('stroke-width', 0)\n      .style('opacity', this.getCardOpacity.bind(this));\n\n    const $cards = this.$heatmap.find('.heatmap-card');\n    $cards\n      .on('mouseenter', (event: any) => {\n        this.tooltip.mouseOverBucket = true;\n        this.highlightCard(event);\n      })\n      .on('mouseleave', (event: any) => {\n        this.tooltip.mouseOverBucket = false;\n        this.resetCardHighLight(event);\n      });\n  }\n\n  highlightCard(event: any) {\n    const color = d3.select(event.target).style('fill');\n    const highlightColor = d3.color(color)!.darker(2);\n    const strokeColor = d3.color(color)!.brighter(4);\n    const currentCard = d3.select(event.target);\n    this.tooltip.originalFillColor = color;\n    currentCard\n      .style('fill', highlightColor.toString())\n      .style('stroke', strokeColor.toString())\n      .style('stroke-width', 1);\n  }\n\n  resetCardHighLight(event: any) {\n    d3.select(event.target)\n      .style('fill', this.tooltip.originalFillColor)\n      .style('stroke', this.tooltip.originalFillColor)\n      .style('stroke-width', 0);\n  }\n\n  setCardSize() {\n    const xGridSize = Math.floor(this.xScale(this.data.xBucketSize) - this.xScale(0));\n    let yGridSize = Math.floor(this.yScale(this.yScale.invert(0) - this.data.yBucketSize));\n\n    if (this.panel.yAxis.logBase !== 1) {\n      const base = this.panel.yAxis.logBase;\n      const splitFactor = this.data.yBucketSize || 1;\n      yGridSize = Math.floor((this.yScale(1) - this.yScale(base)) / splitFactor);\n    }\n\n    const cardWidth = xGridSize - this.cardPadding * 2;\n    this.cardWidth = Math.max(cardWidth, MIN_CARD_SIZE);\n    this.cardHeight = yGridSize ? yGridSize - this.cardPadding * 2 : 0;\n  }\n\n  getCardX(d: { x: any }) {\n    let x;\n    if (this.xScale(d.x) < 0) {\n      // Cut card left to prevent overlay\n      x = this.yAxisWidth + this.cardPadding;\n    } else {\n      x = this.xScale(d.x) + this.yAxisWidth + this.cardPadding;\n    }\n\n    return x;\n  }\n\n  getCardWidth(d: { x: any }) {\n    let w = this.cardWidth;\n    if (this.xScale(d.x) < 0) {\n      // Cut card left to prevent overlay\n      w = this.xScale(d.x) + this.cardWidth;\n    } else if (this.xScale(d.x) + this.cardWidth > this.chartWidth) {\n      // Cut card right to prevent overlay\n      w = this.chartWidth - this.xScale(d.x) - this.cardPadding;\n    }\n\n    // Card width should be MIN_CARD_SIZE at least, but cut cards shouldn't be displayed\n    w = w > 0 ? Math.max(w, MIN_CARD_SIZE) : 0;\n    return w;\n  }\n\n  getCardY(d: { y: number }) {\n    let y = this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardPadding;\n    if (this.panel.yAxis.logBase !== 1 && d.y === 0) {\n      y = this.chartBottom - this.cardHeight - this.cardPadding;\n    } else {\n      if (y < this.chartTop) {\n        y = this.chartTop;\n      }\n    }\n\n    return y;\n  }\n\n  getCardHeight(d: { y: number }) {\n    const y = this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardPadding;\n    let h = this.cardHeight;\n\n    if (this.panel.yAxis.logBase !== 1 && d.y === 0) {\n      return this.cardHeight;\n    }\n\n    // Cut card height to prevent overlay\n    if (y < this.chartTop) {\n      h = this.yScale(d.y) - this.cardPadding;\n    } else if (this.yScale(d.y) > this.chartBottom) {\n      h = this.chartBottom - y;\n    } else if (y + this.cardHeight > this.chartBottom) {\n      h = this.chartBottom - y;\n    }\n\n    // Height can't be more than chart height\n    h = Math.min(h, this.chartHeight);\n    // Card height should be MIN_CARD_SIZE at least\n    h = Math.max(h, MIN_CARD_SIZE);\n\n    return h;\n  }\n\n  getCardColor(d: { count: any }) {\n    if (this.panel.color.mode === 'opacity') {\n      return getColorFromHexRgbOrName(\n        this.panel.color.cardColor,\n        contextSrv.user.lightTheme ? GrafanaThemeType.Light : GrafanaThemeType.Dark\n      );\n    } else {\n      return this.colorScale(d.count);\n    }\n  }\n\n  getCardOpacity(d: { count: any }) {\n    if (this.panel.color.mode === 'opacity') {\n      return this.opacityScale(d.count);\n    } else {\n      return 1;\n    }\n  }\n\n  getEventOffset(event: any) {\n    const elemOffset = this.$heatmap.offset();\n    const x = Math.floor(event.clientX - elemOffset.left);\n    const y = Math.floor(event.clientY - elemOffset.top);\n    return { x, y };\n  }\n\n  onMouseDown(event: any) {\n    const offset = this.getEventOffset(event);\n    this.selection.active = true;\n    this.selection.x1 = offset.x;\n\n    this.mouseUpHandler = () => {\n      this.onMouseUp();\n    };\n\n    $(document).one('mouseup', this.mouseUpHandler.bind(this));\n  }\n\n  onMouseUp() {\n    $(document).unbind('mouseup', this.mouseUpHandler.bind(this));\n    this.mouseUpHandler = null;\n    this.selection.active = false;\n\n    const selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n    if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n      const timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth);\n      const timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth);\n\n      this.ctrl.timeSrv.setTime({\n        from: toUtc(timeFrom),\n        to: toUtc(timeTo),\n      });\n    }\n\n    this.clearSelection();\n  }\n\n  onMouseLeave() {\n    appEvents.emit(CoreEvents.graphHoverClear);\n    this.clearCrosshair();\n  }\n\n  onMouseMove(event: any) {\n    if (!this.heatmap) {\n      return;\n    }\n\n    const offset = this.getEventOffset(event);\n    if (this.selection.active) {\n      // Clear crosshair and tooltip\n      this.clearCrosshair();\n      this.tooltip.destroy();\n\n      this.selection.x2 = this.limitSelection(offset.x);\n      this.drawSelection(this.selection.x1, this.selection.x2);\n    } else {\n      const pos = this.getEventPos(event, offset);\n      this.drawCrosshair(offset.x);\n      this.tooltip.show(pos, this.data);\n      this.emitGraphHoverEvent(pos);\n    }\n  }\n\n  getEventPos(event: { pageX: any; pageY: any }, offset: { x: any; y: any }) {\n    const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n    const y = this.yScale.invert(offset.y - this.chartTop);\n    const pos: any = {\n      pageX: event.pageX,\n      pageY: event.pageY,\n      x: x,\n      x1: x,\n      y: y,\n      y1: y,\n      panelRelY: null,\n      offset,\n    };\n\n    return pos;\n  }\n\n  emitGraphHoverEvent(pos: { panelRelY: number; offset: { y: number } }) {\n    // Set minimum offset to prevent showing legend from another panel\n    pos.panelRelY = Math.max(pos.offset.y / this.height, 0.001);\n    // broadcast to other graph panels that we are hovering\n    appEvents.emit(CoreEvents.graphHover, { pos: pos, panel: this.panel });\n  }\n\n  limitSelection(x2: number) {\n    x2 = Math.max(x2, this.yAxisWidth);\n    x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n    return x2;\n  }\n\n  drawSelection(posX1: number, posX2: number) {\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-selection').remove();\n      const selectionX = Math.min(posX1, posX2);\n      const selectionWidth = Math.abs(posX1 - posX2);\n\n      if (selectionWidth > MIN_SELECTION_WIDTH) {\n        this.heatmap\n          .append('rect')\n          .attr('class', 'heatmap-selection')\n          .attr('x', selectionX)\n          .attr('width', selectionWidth)\n          .attr('y', this.chartTop)\n          .attr('height', this.chartHeight);\n      }\n    }\n  }\n\n  clearSelection() {\n    this.selection.x1 = -1;\n    this.selection.x2 = -1;\n\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-selection').remove();\n    }\n  }\n\n  drawCrosshair(position: number) {\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-crosshair').remove();\n\n      let posX = position;\n      posX = Math.max(posX, this.yAxisWidth);\n      posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n      this.heatmap\n        .append('g')\n        .attr('class', 'heatmap-crosshair')\n        .attr('transform', 'translate(' + posX + ',0)')\n        .append('line')\n        .attr('x1', 1)\n        .attr('y1', this.chartTop)\n        .attr('x2', 1)\n        .attr('y2', this.chartBottom)\n        .attr('stroke-width', 1);\n    }\n  }\n\n  drawSharedCrosshair(pos: { x: any }) {\n    if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n      const posX = this.xScale(pos.x) + this.yAxisWidth;\n      this.drawCrosshair(posX);\n    }\n  }\n\n  clearCrosshair() {\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-crosshair').remove();\n    }\n  }\n\n  render() {\n    this.data = this.ctrl.data;\n    this.panel = this.ctrl.panel;\n    this.timeRange = this.ctrl.range;\n\n    if (!this.setElementHeight() || !this.data) {\n      return;\n    }\n\n    // Draw default axes and return if no data\n    if (_.isEmpty(this.data.buckets)) {\n      this.addHeatmapCanvas();\n      this.addAxes();\n      return;\n    }\n\n    this.addHeatmap();\n    this.scope.yAxisWidth = this.yAxisWidth;\n    this.scope.xAxisHeight = this.xAxisHeight;\n    this.scope.chartHeight = this.chartHeight;\n    this.scope.chartWidth = this.chartWidth;\n    this.scope.chartTop = this.chartTop;\n  }\n}\n","import { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport _ from 'lodash';\nimport kbn from 'app/core/utils/kbn';\nimport TimeSeries from 'app/core/time_series2';\nimport { axesEditor } from './axes_editor';\nimport { heatmapDisplayEditor } from './display_editor';\nimport rendering from './rendering';\nimport {\n  convertToHeatMap,\n  convertToCards,\n  histogramToHeatmap,\n  calculateBucketSize,\n  sortSeriesByLabel,\n} from './heatmap_data_converter';\nimport { auto } from 'angular';\nimport { getProcessedDataFrames } from 'app/features/dashboard/state/runRequest';\nimport { DataProcessor } from '../graph/data_processor';\nimport { LegacyResponseData, PanelEvents, DataFrame } from '@grafana/data';\nimport { CoreEvents } from 'app/types';\n\nconst X_BUCKET_NUMBER_DEFAULT = 30;\nconst Y_BUCKET_NUMBER_DEFAULT = 10;\n\nconst panelDefaults: any = {\n  heatmap: {},\n  cards: {\n    cardPadding: null,\n    cardRound: null,\n  },\n  color: {\n    mode: 'spectrum',\n    cardColor: '#b4ff00',\n    colorScale: 'sqrt',\n    exponent: 0.5,\n    colorScheme: 'interpolateOranges',\n  },\n  legend: {\n    show: false,\n  },\n  dataFormat: 'timeseries',\n  yBucketBound: 'auto',\n  reverseYBuckets: false,\n  xAxis: {\n    show: true,\n  },\n  yAxis: {\n    show: true,\n    format: 'short',\n    decimals: null,\n    logBase: 1,\n    splitFactor: null,\n    min: null,\n    max: null,\n  },\n  xBucketSize: null,\n  xBucketNumber: null,\n  yBucketSize: null,\n  yBucketNumber: null,\n  tooltip: {\n    show: true,\n    showHistogram: false,\n  },\n  highlightCards: true,\n  hideZeroBuckets: false,\n};\n\nconst colorModes = ['opacity', 'spectrum'];\nconst opacityScales = ['linear', 'sqrt'];\n\n// Schemes from d3-scale-chromatic\n// https://github.com/d3/d3-scale-chromatic\nconst colorSchemes = [\n  // Diverging\n  { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n  { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n\n  // Sequential (Single Hue)\n  { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n  { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n  { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n  { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n  { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n  { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n  // Sequential (Multi-Hue)\n  { name: 'Turbo', value: 'interpolateTurbo', invert: 'light' },\n  { name: 'Cividis', value: 'interpolateCividis', invert: 'light' },\n  { name: 'Viridis', value: 'interpolateViridis', invert: 'light' },\n  { name: 'Magma', value: 'interpolateMagma', invert: 'light' },\n  { name: 'Inferno', value: 'interpolateInferno', invert: 'light' },\n  { name: 'Plasma', value: 'interpolatePlasma', invert: 'light' },\n  { name: 'Warm', value: 'interpolateWarm', invert: 'light' },\n  { name: 'Cool', value: 'interpolateCool', invert: 'light' },\n  { name: 'Cubehelix', value: 'interpolateCubehelixDefault', invert: 'light' },\n  { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n  { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n  { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n  { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n  { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n  { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n  { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n  { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n  { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n  { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n  { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n  { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' },\n];\n\nconst dsSupportHistogramSort = ['elasticsearch'];\n\nexport class HeatmapCtrl extends MetricsPanelCtrl {\n  static templateUrl = 'module.html';\n\n  opacityScales: any = [];\n  colorModes: any = [];\n  colorSchemes: any = [];\n  selectionActivated: boolean;\n  unitFormats: any;\n  data: any;\n  series: TimeSeries[];\n  dataWarning: any;\n  decimals: number;\n  scaledDecimals: number;\n\n  processor: DataProcessor; // Shared with graph panel\n\n  /** @ngInject */\n  constructor($scope: any, $injector: auto.IInjectorService) {\n    super($scope, $injector);\n    this.selectionActivated = false;\n\n    _.defaultsDeep(this.panel, panelDefaults);\n    this.opacityScales = opacityScales;\n    this.colorModes = colorModes;\n    this.colorSchemes = colorSchemes;\n\n    // Use DataFrames\n    this.useDataFrames = true;\n    this.processor = new DataProcessor({\n      xaxis: { mode: 'custom' }, // NOT: 'histogram' :)\n      aliasColors: {}, // avoids null reference\n    });\n\n    // Bind grafana panel events\n    this.events.on(PanelEvents.render, this.onRender.bind(this));\n    this.events.on(PanelEvents.dataFramesReceived, this.onDataFramesReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onSnapshotLoad.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n\n    this.onCardColorChange = this.onCardColorChange.bind(this);\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Axes', axesEditor, 2);\n    this.addEditorTab('Display', heatmapDisplayEditor, 3);\n    this.unitFormats = kbn.getUnitFormats();\n  }\n\n  zoomOut(evt: any) {\n    this.publishAppEvent(CoreEvents.zoomOut, 2);\n  }\n\n  onRender() {\n    if (!this.range || !this.series) {\n      return;\n    }\n\n    if (this.panel.dataFormat === 'tsbuckets') {\n      this.convertHistogramToHeatmapData();\n    } else {\n      this.convertTimeSeriesToHeatmapData();\n    }\n  }\n\n  convertTimeSeriesToHeatmapData() {\n    let xBucketSize, yBucketSize, bucketsData, heatmapStats;\n    const logBase = this.panel.yAxis.logBase;\n\n    const xBucketNumber = this.panel.xBucketNumber || X_BUCKET_NUMBER_DEFAULT;\n    const xBucketSizeByNumber = Math.floor((this.range.to.valueOf() - this.range.from.valueOf()) / xBucketNumber);\n\n    // Parse X bucket size (number or interval)\n    const isIntervalString = kbn.interval_regex.test(this.panel.xBucketSize);\n    if (isIntervalString) {\n      xBucketSize = kbn.interval_to_ms(this.panel.xBucketSize);\n    } else if (\n      isNaN(Number(this.panel.xBucketSize)) ||\n      this.panel.xBucketSize === '' ||\n      this.panel.xBucketSize === null\n    ) {\n      xBucketSize = xBucketSizeByNumber;\n    } else {\n      xBucketSize = Number(this.panel.xBucketSize);\n    }\n\n    // Calculate Y bucket size\n    heatmapStats = this.parseSeries(this.series);\n    const yBucketNumber = this.panel.yBucketNumber || Y_BUCKET_NUMBER_DEFAULT;\n    if (logBase !== 1) {\n      yBucketSize = this.panel.yAxis.splitFactor;\n    } else {\n      if (heatmapStats.max === heatmapStats.min) {\n        if (heatmapStats.max) {\n          yBucketSize = heatmapStats.max / Y_BUCKET_NUMBER_DEFAULT;\n        } else {\n          yBucketSize = 1;\n        }\n      } else {\n        yBucketSize = (heatmapStats.max - heatmapStats.min) / yBucketNumber;\n      }\n      yBucketSize = this.panel.yBucketSize || yBucketSize;\n    }\n\n    bucketsData = convertToHeatMap(this.series, yBucketSize, xBucketSize, logBase);\n\n    // Set default Y range if no data\n    if (!heatmapStats.min && !heatmapStats.max) {\n      heatmapStats = { min: -1, max: 1, minLog: 1 };\n      yBucketSize = 1;\n    }\n\n    const { cards, cardStats } = convertToCards(bucketsData, this.panel.hideZeroBuckets);\n\n    this.data = {\n      buckets: bucketsData,\n      heatmapStats: heatmapStats,\n      xBucketSize: xBucketSize,\n      yBucketSize: yBucketSize,\n      cards: cards,\n      cardStats: cardStats,\n    };\n  }\n\n  convertHistogramToHeatmapData() {\n    const panelDatasource = this.getPanelDataSourceType();\n    let xBucketSize, yBucketSize, bucketsData, tsBuckets;\n\n    // Try to sort series by bucket bound, if datasource doesn't do it.\n    if (!_.includes(dsSupportHistogramSort, panelDatasource)) {\n      this.series.sort(sortSeriesByLabel);\n    }\n\n    if (this.panel.reverseYBuckets) {\n      this.series.reverse();\n    }\n\n    // Convert histogram to heatmap. Each histogram bucket represented by the series which name is\n    // a top (or bottom, depends of datasource) bucket bound. Further, these values will be used as Y axis labels.\n    bucketsData = histogramToHeatmap(this.series);\n\n    tsBuckets = _.map(this.series, 'label');\n    const yBucketBound = this.panel.yBucketBound;\n    if (\n      (panelDatasource === 'prometheus' && yBucketBound !== 'lower' && yBucketBound !== 'middle') ||\n      yBucketBound === 'upper'\n    ) {\n      // Prometheus labels are upper inclusive bounds, so add empty bottom bucket label.\n      tsBuckets = [''].concat(tsBuckets);\n    } else {\n      // Elasticsearch uses labels as lower bucket bounds, so add empty top bucket label.\n      // Use this as a default mode as well.\n      tsBuckets.push('');\n    }\n\n    // Calculate bucket size based on heatmap data\n    const xBucketBoundSet = _.map(_.keys(bucketsData), key => Number(key));\n    xBucketSize = calculateBucketSize(xBucketBoundSet);\n    // Always let yBucketSize=1 in 'tsbuckets' mode\n    yBucketSize = 1;\n\n    const { cards, cardStats } = convertToCards(bucketsData, this.panel.hideZeroBuckets);\n\n    this.data = {\n      buckets: bucketsData,\n      xBucketSize: xBucketSize,\n      yBucketSize: yBucketSize,\n      tsBuckets: tsBuckets,\n      cards: cards,\n      cardStats: cardStats,\n    };\n  }\n\n  getPanelDataSourceType() {\n    if (this.datasource && this.datasource.meta && this.datasource.meta.id) {\n      return this.datasource.meta.id;\n    } else {\n      return 'unknown';\n    }\n  }\n\n  // This should only be called from the snapshot callback\n  onSnapshotLoad(dataList: LegacyResponseData[]) {\n    this.onDataFramesReceived(getProcessedDataFrames(dataList));\n  }\n\n  // Directly support DataFrame\n  onDataFramesReceived(data: DataFrame[]) {\n    this.series = this.processor.getSeriesList({ dataList: data, range: this.range }).map(ts => {\n      ts.color = undefined; // remove whatever the processor set\n      ts.flotpairs = ts.getFlotPairs(this.panel.nullPointMode);\n      return ts;\n    });\n\n    this.dataWarning = null;\n    const datapointsCount = _.reduce(\n      this.series,\n      (sum, series) => {\n        return sum + series.datapoints.length;\n      },\n      0\n    );\n\n    if (datapointsCount === 0) {\n      this.dataWarning = {\n        title: 'No data points',\n        tip: 'No datapoints returned from data query',\n      };\n    } else {\n      for (const series of this.series) {\n        if (series.isOutsideRange) {\n          this.dataWarning = {\n            title: 'Data points outside time range',\n            tip: 'Can be caused by timezone mismatch or missing time filter in query',\n          };\n          break;\n        }\n      }\n    }\n\n    this.render();\n  }\n\n  onDataError() {\n    this.series = [];\n    this.render();\n  }\n\n  onCardColorChange(newColor: any) {\n    this.panel.color.cardColor = newColor;\n    this.render();\n  }\n\n  parseSeries(series: TimeSeries[]) {\n    const min = _.min(_.map(series, s => s.stats.min));\n    const minLog = _.min(_.map(series, s => s.stats.logmin));\n    const max = _.max(_.map(series, s => s.stats.max));\n\n    return {\n      max,\n      min,\n      minLog,\n    };\n  }\n\n  parseHistogramSeries(series: TimeSeries[]) {\n    const bounds = _.map(series, s => Number(s.alias));\n    const min = _.min(bounds);\n    const minLog = _.min(bounds);\n    const max = _.max(bounds);\n\n    return {\n      max: max,\n      min: min,\n      minLog: minLog,\n    };\n  }\n\n  link(scope: any, elem: any, attrs: any, ctrl: any) {\n    rendering(scope, elem, attrs, ctrl);\n  }\n}\n","import React, { Component } from 'react';\n\nimport { Table, Select } from '@grafana/ui';\nimport { FieldMatcherID, PanelProps, DataFrame, SelectableValue, getFrameDisplayName } from '@grafana/data';\nimport { Options } from './types';\nimport { css } from 'emotion';\nimport { config } from 'app/core/config';\nimport { TableSortByFieldState } from '@grafana/ui/src/components/Table/types';\n\ninterface Props extends PanelProps<Options> {}\n\nexport class TablePanel extends Component<Props> {\n  constructor(props: Props) {\n    super(props);\n  }\n\n  onColumnResize = (fieldDisplayName: string, width: number) => {\n    const { fieldConfig } = this.props;\n    const { overrides } = fieldConfig;\n\n    const matcherId = FieldMatcherID.byName;\n    const propId = 'custom.width';\n\n    // look for existing override\n    const override = overrides.find(o => o.matcher.id === matcherId && o.matcher.options === fieldDisplayName);\n\n    if (override) {\n      // look for existing property\n      const property = override.properties.find(prop => prop.id === propId);\n      if (property) {\n        property.value = width;\n      } else {\n        override.properties.push({ id: propId, value: width });\n      }\n    } else {\n      overrides.push({\n        matcher: { id: matcherId, options: fieldDisplayName },\n        properties: [{ id: propId, value: width }],\n      });\n    }\n\n    this.props.onFieldConfigChange({\n      ...fieldConfig,\n      overrides,\n    });\n  };\n\n  onSortByChange = (sortBy: TableSortByFieldState[]) => {\n    this.props.onOptionsChange({\n      ...this.props.options,\n      sortBy,\n    });\n  };\n\n  onChangeTableSelection = (val: SelectableValue<number>) => {\n    this.props.onOptionsChange({\n      ...this.props.options,\n      frameIndex: val.value || 0,\n    });\n\n    // Force a redraw -- but no need to re-query\n    this.forceUpdate();\n  };\n\n  renderTable(frame: DataFrame, width: number, height: number) {\n    const { options } = this.props;\n\n    return (\n      <Table\n        height={height}\n        width={width}\n        data={frame}\n        noHeader={!options.showHeader}\n        resizable={true}\n        initialSortBy={options.sortBy}\n        onSortByChange={this.onSortByChange}\n        onColumnResize={this.onColumnResize}\n      />\n    );\n  }\n\n  getCurrentFrameIndex() {\n    const { data, options } = this.props;\n    const count = data.series?.length;\n    return options.frameIndex > 0 && options.frameIndex < count ? options.frameIndex : 0;\n  }\n\n  render() {\n    const { data, height, width } = this.props;\n\n    const count = data.series?.length;\n\n    if (!count || count < 1) {\n      return <div>No data</div>;\n    }\n\n    if (count > 1) {\n      const inputHeight = config.theme.spacing.formInputHeight;\n      const padding = 8 * 2;\n      const currentIndex = this.getCurrentFrameIndex();\n      const names = data.series.map((frame, index) => {\n        return {\n          label: getFrameDisplayName(frame),\n          value: index,\n        };\n      });\n\n      return (\n        <div className={tableStyles.wrapper}>\n          {this.renderTable(data.series[currentIndex], width, height - inputHeight - padding)}\n          <div className={tableStyles.selectWrapper}>\n            <Select options={names} value={names[currentIndex]} onChange={this.onChangeTableSelection} />\n          </div>\n        </div>\n      );\n    }\n\n    return this.renderTable(data.series[0], width, height - 12);\n  }\n}\n\nconst tableStyles = {\n  wrapper: css`\n    display: flex;\n    flex-direction: column;\n    justify-content: space-between;\n    height: 100%;\n  `,\n  selectWrapper: css`\n    padding: 8px;\n  `,\n};\n","import { PanelPlugin } from '@grafana/data';\nimport { TablePanel } from './TablePanel';\nimport { CustomFieldConfig, Options } from './types';\nimport { tablePanelChangedHandler, tableMigrationHandler } from './migrations';\nimport { TableCellDisplayMode } from '@grafana/ui';\n\nexport const plugin = new PanelPlugin<Options, CustomFieldConfig>(TablePanel)\n  .setPanelChangeHandler(tablePanelChangedHandler)\n  .setMigrationHandler(tableMigrationHandler)\n  .setNoPadding()\n  .useFieldConfig({\n    useCustomConfig: builder => {\n      builder\n        .addNumberInput({\n          path: 'width',\n          name: 'Column width',\n          settings: {\n            placeholder: 'auto',\n            min: 20,\n            max: 300,\n          },\n          shouldApply: () => true,\n        })\n        .addRadio({\n          path: 'align',\n          name: 'Column alignment',\n          settings: {\n            options: [\n              { label: 'auto', value: null },\n              { label: 'left', value: 'left' },\n              { label: 'center', value: 'center' },\n              { label: 'right', value: 'right' },\n            ],\n          },\n          defaultValue: null,\n        })\n        .addSelect({\n          path: 'displayMode',\n          name: 'Cell display mode',\n          description: 'Color text, background, show as gauge, etc',\n          settings: {\n            options: [\n              { value: TableCellDisplayMode.Auto, label: 'Auto' },\n              { value: TableCellDisplayMode.ColorText, label: 'Color text' },\n              { value: TableCellDisplayMode.ColorBackground, label: 'Color background' },\n              { value: TableCellDisplayMode.GradientGauge, label: 'Gradient gauge' },\n              { value: TableCellDisplayMode.LcdGauge, label: 'LCD gauge' },\n              { value: TableCellDisplayMode.JSONView, label: 'JSON View' },\n            ],\n          },\n        });\n    },\n  })\n  .setPanelOptions(builder => {\n    builder.addBooleanSwitch({\n      path: 'showHeader',\n      name: 'Show header',\n      description: \"To display table's header or not to display\",\n      defaultValue: true,\n    });\n  });\n","import { PanelModel } from '@grafana/data';\nimport { Options } from './types';\n\n/**\n * At 7.0, the `table` panel was swapped from an angular implementation to a react one.\n * The models do not match, so this process will delegate to the old implementation when\n * a saved table configuration exists.\n */\nexport const tableMigrationHandler = (panel: PanelModel<Options>): Partial<Options> => {\n  // Table was saved as an angular table, lets just swap to the 'table-old' panel\n  if (!panel.pluginVersion && (panel as any).columns) {\n    console.log('Was angular table', panel);\n  }\n\n  // Nothing changed\n  return panel.options;\n};\n\n/**\n * This is called when the panel changes from another panel\n */\nexport const tablePanelChangedHandler = (\n  panel: PanelModel<Partial<Options>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) => {\n  // Changing from angular table panel\n  if (prevPluginId === 'table-old' && prevOptions.angular) {\n    // Todo write migration logic\n  }\n\n  return {};\n};\n","import _ from 'lodash';\nimport flatten from 'app/core/utils/flatten';\nimport TimeSeries from 'app/core/time_series2';\nimport TableModel, { mergeTablesIntoModel } from 'app/core/table_model';\nimport { TableTransform } from './types';\nimport { Column, TableData } from '@grafana/data';\n\nconst transformers: { [key: string]: TableTransform } = {};\nexport const timeSeriesFormatFilterer = (data: any): any[] => {\n  if (!Array.isArray(data)) {\n    return data.datapoints ? [data] : [];\n  }\n\n  return data.reduce((acc, series) => {\n    if (!series.datapoints) {\n      return acc;\n    }\n\n    return acc.concat(series);\n  }, []);\n};\n\nexport const tableDataFormatFilterer = (data: any): any[] => {\n  if (!Array.isArray(data)) {\n    return data.columns ? [data] : [];\n  }\n\n  return data.reduce((acc, series) => {\n    if (!series.columns) {\n      return acc;\n    }\n\n    return acc.concat(series);\n  }, []);\n};\n\ntransformers['timeseries_to_rows'] = {\n  description: 'Time series to rows',\n  getColumns: () => {\n    return [];\n  },\n  transform: (data, panel, model) => {\n    model.columns = [{ text: 'Time', type: 'date' }, { text: 'Metric' }, { text: 'Value' }];\n    const filteredData = timeSeriesFormatFilterer(data);\n\n    for (let i = 0; i < filteredData.length; i++) {\n      const series = filteredData[i];\n      for (let y = 0; y < series.datapoints.length; y++) {\n        const dp = series.datapoints[y];\n        model.rows.push([dp[1], series.target, dp[0]]);\n      }\n    }\n  },\n};\n\ntransformers['timeseries_to_columns'] = {\n  description: 'Time series to columns',\n  getColumns: () => {\n    return [];\n  },\n  transform: (data, panel, model) => {\n    model.columns.push({ text: 'Time', type: 'date' });\n\n    // group by time\n    const points: any = {};\n    const filteredData = timeSeriesFormatFilterer(data);\n\n    for (let i = 0; i < filteredData.length; i++) {\n      const series = filteredData[i];\n      model.columns.push({ text: series.target });\n\n      for (let y = 0; y < series.datapoints.length; y++) {\n        const dp = series.datapoints[y];\n        const timeKey = dp[1].toString();\n\n        if (!points[timeKey]) {\n          points[timeKey] = { time: dp[1] };\n          points[timeKey][i] = dp[0];\n        } else {\n          points[timeKey][i] = dp[0];\n        }\n      }\n    }\n\n    for (const time in points) {\n      const point = points[time];\n      const values = [point.time];\n\n      for (let i = 0; i < filteredData.length; i++) {\n        const value = point[i];\n        values.push(value);\n      }\n\n      model.rows.push(values);\n    }\n  },\n};\n\ntransformers['timeseries_aggregations'] = {\n  description: 'Time series aggregations',\n  getColumns: () => {\n    return [\n      { text: 'Avg', value: 'avg' },\n      { text: 'Min', value: 'min' },\n      { text: 'Max', value: 'max' },\n      { text: 'Total', value: 'total' },\n      { text: 'Current', value: 'current' },\n      { text: 'Count', value: 'count' },\n    ];\n  },\n  transform: (data, panel, model) => {\n    let i, y;\n    model.columns.push({ text: 'Metric' });\n\n    for (i = 0; i < panel.columns.length; i++) {\n      model.columns.push({ text: panel.columns[i].text });\n    }\n\n    const filteredData = timeSeriesFormatFilterer(data);\n\n    for (i = 0; i < filteredData.length; i++) {\n      const series = new TimeSeries({\n        datapoints: filteredData[i].datapoints,\n        alias: filteredData[i].target,\n      });\n\n      series.getFlotPairs('connected');\n      const cells = [series.alias];\n\n      for (y = 0; y < panel.columns.length; y++) {\n        cells.push(series.stats[panel.columns[y].value]);\n      }\n\n      model.rows.push(cells);\n    }\n  },\n};\n\ntransformers['annotations'] = {\n  description: 'Annotations',\n  getColumns: () => {\n    return [];\n  },\n  transform: (data, panel, model) => {\n    model.columns.push({ text: 'Time', type: 'date' });\n    model.columns.push({ text: 'Title' });\n    model.columns.push({ text: 'Text' });\n    model.columns.push({ text: 'Tags' });\n\n    if (!data || !data.annotations || data.annotations.length === 0) {\n      return;\n    }\n\n    for (let i = 0; i < data.annotations.length; i++) {\n      const evt = data.annotations[i];\n      model.rows.push([evt.time, evt.title, evt.text, evt.tags]);\n    }\n  },\n};\n\ntransformers['table'] = {\n  description: 'Table',\n  getColumns: data => {\n    if (!data || data.length === 0) {\n      return [];\n    }\n\n    // Single query returns data columns as is\n    if (data.length === 1) {\n      return [...data[0].columns];\n    }\n\n    const filteredData = tableDataFormatFilterer(data);\n\n    // Track column indexes: name -> index\n    const columnNames: any = {};\n\n    // Union of all columns\n    const columns = filteredData.reduce((acc: Column[], series: TableData) => {\n      series.columns.forEach(col => {\n        const { text } = col;\n        if (columnNames[text] === undefined) {\n          columnNames[text] = acc.length;\n          acc.push(col);\n        }\n      });\n      return acc;\n    }, []);\n\n    return columns;\n  },\n  transform: (data: any[], panel, model) => {\n    if (!data || data.length === 0) {\n      return;\n    }\n    const filteredData = tableDataFormatFilterer(data);\n    const noTableIndex = _.findIndex(filteredData, d => 'columns' in d && 'rows' in d);\n    if (noTableIndex < 0) {\n      throw {\n        message: `Result of query #${String.fromCharCode(\n          65 + noTableIndex\n        )} is not in table format, try using another transform.`,\n      };\n    }\n\n    mergeTablesIntoModel(model, ...filteredData);\n  },\n};\n\ntransformers['json'] = {\n  description: 'JSON Data',\n  getColumns: data => {\n    if (!data || data.length === 0) {\n      return [];\n    }\n\n    const names: any = {};\n    for (let i = 0; i < data.length; i++) {\n      const series = data[i];\n      if (series.type !== 'docs') {\n        continue;\n      }\n\n      // only look at 100 docs\n      const maxDocs = Math.min(series.datapoints.length, 100);\n      for (let y = 0; y < maxDocs; y++) {\n        const doc = series.datapoints[y];\n        const flattened = flatten(doc, {});\n        for (const propName in flattened) {\n          names[propName] = true;\n        }\n      }\n    }\n\n    return _.map(names, (value, key) => {\n      return { text: key, value: key };\n    });\n  },\n  transform: (data, panel, model) => {\n    let i, y, z;\n\n    for (const column of panel.columns) {\n      const tableCol: any = { text: column.text };\n\n      // if filterable data then set columns to filterable\n      if (data.length > 0 && data[0].filterable) {\n        tableCol.filterable = true;\n      }\n\n      model.columns.push(tableCol);\n    }\n\n    if (model.columns.length === 0) {\n      model.columns.push({ text: 'JSON' });\n    }\n\n    for (i = 0; i < data.length; i++) {\n      const series = data[i];\n\n      for (y = 0; y < series.datapoints.length; y++) {\n        const dp = series.datapoints[y];\n        const values = [];\n\n        if (_.isObject(dp) && panel.columns.length > 0) {\n          const flattened = flatten(dp);\n          for (z = 0; z < panel.columns.length; z++) {\n            values.push(flattened[panel.columns[z].value]);\n          }\n        } else {\n          values.push(JSON.stringify(dp));\n        }\n\n        model.rows.push(values);\n      }\n    }\n  },\n};\n\nfunction transformDataToTable(data: any, panel: any) {\n  const model = new TableModel();\n\n  if (!data || data.length === 0) {\n    return model;\n  }\n\n  const transformer = transformers[panel.transform];\n  if (!transformer) {\n    throw { message: 'Transformer ' + panel.transform + ' not found' };\n  }\n\n  transformer.transform(data, panel, model);\n  return model;\n}\n\nexport { transformers, transformDataToTable };\n","import _ from 'lodash';\nimport { transformers } from './transformers';\nimport { ColumnStyle } from './types';\n\nexport class TablePanelEditorCtrl {\n  panel: any;\n  panelCtrl: any;\n  transformers: any;\n  fontSizes: any;\n  addColumnSegment: any;\n  getColumnNames: any;\n  canSetColumns: boolean;\n  columnsHelpMessage: string;\n\n  /** @ngInject */\n  constructor($scope: any, private uiSegmentSrv: any) {\n    $scope.editor = this;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n    this.transformers = transformers;\n    this.fontSizes = ['80%', '90%', '100%', '110%', '120%', '130%', '150%', '160%', '180%', '200%', '220%', '250%'];\n    this.addColumnSegment = uiSegmentSrv.newPlusButton();\n    this.updateTransformHints();\n  }\n\n  updateTransformHints() {\n    this.canSetColumns = false;\n    this.columnsHelpMessage = '';\n\n    switch (this.panel.transform) {\n      case 'timeseries_aggregations': {\n        this.canSetColumns = true;\n        break;\n      }\n      case 'json': {\n        this.canSetColumns = true;\n        break;\n      }\n      case 'table': {\n        this.columnsHelpMessage = 'Columns and their order are determined by the data query';\n      }\n    }\n  }\n\n  getColumnOptions() {\n    if (!this.panelCtrl.dataRaw) {\n      return Promise.resolve([]);\n    }\n    const columns = this.transformers[this.panel.transform].getColumns(this.panelCtrl.dataRaw);\n    const segments = _.map(columns, (c: any) => this.uiSegmentSrv.newSegment({ value: c.text }));\n    return Promise.resolve(segments);\n  }\n\n  addColumn() {\n    const columns = transformers[this.panel.transform].getColumns(this.panelCtrl.dataRaw);\n    const column: any = _.find(columns, { text: this.addColumnSegment.value });\n\n    if (column) {\n      this.panel.columns.push(column);\n      this.render();\n    }\n\n    const plusButton = this.uiSegmentSrv.newPlusButton();\n    this.addColumnSegment.html = plusButton.html;\n    this.addColumnSegment.value = plusButton.value;\n  }\n\n  transformChanged() {\n    this.panel.columns = [];\n    if (this.panel.transform === 'annotations') {\n      this.panelCtrl.refresh();\n    } else {\n      if (this.panel.transform === 'timeseries_aggregations') {\n        this.panel.columns.push({ text: 'Avg', value: 'avg' });\n      }\n\n      this.updateTransformHints();\n      this.render();\n    }\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  removeColumn(column: ColumnStyle) {\n    this.panel.columns = _.without(this.panel.columns, column);\n    this.panelCtrl.render();\n  }\n}\n\nexport function tablePanelEditor(uiSegmentSrv: any) {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/table-old/editor.html',\n    controller: TablePanelEditorCtrl,\n  };\n}\n","import _ from 'lodash';\nimport { getValueFormats } from '@grafana/data';\n\nexport class ColumnOptionsCtrl {\n  panel: any;\n  panelCtrl: any;\n  colorModes: any;\n  columnStyles: any;\n  columnTypes: any;\n  fontSizes: any;\n  dateFormats: any;\n  addColumnSegment: any;\n  unitFormats: any;\n  getColumnNames: any;\n  activeStyleIndex: number;\n  mappingTypes: any;\n\n  alignTypes: any;\n  static readonly alignTypesEnum = [\n    { text: 'auto', value: '' },\n    { text: 'left', value: 'left' },\n    { text: 'center', value: 'center' },\n    { text: 'right', value: 'right' },\n  ];\n\n  /** @ngInject */\n  constructor($scope: any) {\n    $scope.editor = this;\n\n    this.activeStyleIndex = 0;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n    this.unitFormats = getValueFormats();\n    this.colorModes = [\n      { text: 'Disabled', value: null },\n      { text: 'Cell', value: 'cell' },\n      { text: 'Value', value: 'value' },\n      { text: 'Row', value: 'row' },\n    ];\n    this.columnTypes = [\n      { text: 'Number', value: 'number' },\n      { text: 'String', value: 'string' },\n      { text: 'Date', value: 'date' },\n      { text: 'Hidden', value: 'hidden' },\n    ];\n    this.fontSizes = ['80%', '90%', '100%', '110%', '120%', '130%', '150%', '160%', '180%', '200%', '220%', '250%'];\n    this.dateFormats = [\n      { text: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss' },\n      { text: 'YYYY-MM-DD HH:mm:ss.SSS', value: 'YYYY-MM-DD HH:mm:ss.SSS' },\n      { text: 'MM/DD/YY h:mm:ss a', value: 'MM/DD/YY h:mm:ss a' },\n      { text: 'MMMM D, YYYY LT', value: 'MMMM D, YYYY LT' },\n      { text: 'YYYY-MM-DD', value: 'YYYY-MM-DD' },\n    ];\n    this.mappingTypes = [\n      { text: 'Value to text', value: 1 },\n      { text: 'Range to text', value: 2 },\n    ];\n    this.alignTypes = ColumnOptionsCtrl.alignTypesEnum;\n\n    this.getColumnNames = () => {\n      if (!this.panelCtrl.table) {\n        return [];\n      }\n      return _.map(this.panelCtrl.table.columns, (col: any) => {\n        return col.text;\n      });\n    };\n\n    this.onColorChange = this.onColorChange.bind(this);\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  setUnitFormat(column: any) {\n    return (value: any) => {\n      column.unit = value;\n      this.panelCtrl.render();\n    };\n  }\n\n  addColumnStyle() {\n    const newStyleRule: object = {\n      unit: 'short',\n      type: 'number',\n      alias: '',\n      decimals: 2,\n      colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n      colorMode: null,\n      pattern: '',\n      dateFormat: 'YYYY-MM-DD HH:mm:ss',\n      thresholds: [],\n      mappingType: 1,\n      align: 'auto',\n    };\n\n    const styles = this.panel.styles;\n    const stylesCount = styles.length;\n    let indexToInsert = stylesCount;\n\n    // check if last is a catch all rule, then add it before that one\n    if (stylesCount > 0) {\n      const last = styles[stylesCount - 1];\n      if (last.pattern === '/.*/') {\n        indexToInsert = stylesCount - 1;\n      }\n    }\n\n    styles.splice(indexToInsert, 0, newStyleRule);\n    this.activeStyleIndex = indexToInsert;\n  }\n\n  removeColumnStyle(style: any) {\n    this.panel.styles = _.without(this.panel.styles, style);\n  }\n\n  invertColorOrder(index: number) {\n    const ref = this.panel.styles[index].colors;\n    const copy = ref[0];\n    ref[0] = ref[2];\n    ref[2] = copy;\n    this.panelCtrl.render();\n  }\n\n  onColorChange(style: any, colorIndex: number) {\n    return (newColor: string) => {\n      style.colors[colorIndex] = newColor;\n      this.render();\n    };\n  }\n\n  addValueMap(style: any) {\n    if (!style.valueMaps) {\n      style.valueMaps = [];\n    }\n    style.valueMaps.push({ value: '', text: '' });\n    this.panelCtrl.render();\n  }\n\n  removeValueMap(style: any, index: number) {\n    style.valueMaps.splice(index, 1);\n    this.panelCtrl.render();\n  }\n\n  addRangeMap(style: any) {\n    if (!style.rangeMaps) {\n      style.rangeMaps = [];\n    }\n    style.rangeMaps.push({ from: '', to: '', text: '' });\n    this.panelCtrl.render();\n  }\n\n  removeRangeMap(style: any, index: number) {\n    style.rangeMaps.splice(index, 1);\n    this.panelCtrl.render();\n  }\n}\n\nexport function columnOptionsTab() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/table-old/column_options.html',\n    controller: ColumnOptionsCtrl,\n  };\n}\n","import _ from 'lodash';\nimport {\n  escapeStringForRegex,\n  formattedValueToString,\n  getColorFromHexRgbOrName,\n  getValueFormat,\n  GrafanaThemeType,\n  ScopedVars,\n  stringStartsAsRegEx,\n  stringToJsRegex,\n  textUtil,\n  unEscapeStringFromRegex,\n  TimeZone,\n  dateTimeFormatISO,\n  dateTimeFormat,\n} from '@grafana/data';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { ColumnRender, TableRenderModel, ColumnStyle } from './types';\nimport { ColumnOptionsCtrl } from './column_options';\n\nexport class TableRenderer {\n  formatters: any[];\n  colorState: any;\n\n  constructor(\n    private panel: { styles: ColumnStyle[]; pageSize: number },\n    private table: TableRenderModel,\n    private timeZone: TimeZone,\n    private sanitize: (v: any) => any,\n    private templateSrv: TemplateSrv,\n    private theme?: GrafanaThemeType\n  ) {\n    this.initColumns();\n  }\n\n  setTable(table: TableRenderModel) {\n    this.table = table;\n\n    this.initColumns();\n  }\n\n  initColumns() {\n    this.formatters = [];\n    this.colorState = {};\n\n    for (let colIndex = 0; colIndex < this.table.columns.length; colIndex++) {\n      const column = this.table.columns[colIndex];\n      column.title = column.text;\n\n      for (let i = 0; i < this.panel.styles.length; i++) {\n        const style = this.panel.styles[i];\n\n        const escapedPattern = stringStartsAsRegEx(style.pattern)\n          ? style.pattern\n          : escapeStringForRegex(unEscapeStringFromRegex(style.pattern));\n        const regex = stringToJsRegex(escapedPattern);\n        if (column.text.match(regex)) {\n          column.style = style;\n\n          if (style.alias) {\n            column.title = textUtil.escapeHtml(column.text.replace(regex, style.alias));\n          }\n\n          break;\n        }\n      }\n\n      this.formatters[colIndex] = this.createColumnFormatter(column);\n    }\n  }\n\n  getColorForValue(value: number, style: ColumnStyle) {\n    if (!style.thresholds || !style.colors) {\n      return null;\n    }\n    for (let i = style.thresholds.length; i > 0; i--) {\n      if (value >= style.thresholds[i - 1]) {\n        return getColorFromHexRgbOrName(style.colors[i], this.theme);\n      }\n    }\n    return getColorFromHexRgbOrName(_.first(style.colors), this.theme);\n  }\n\n  defaultCellFormatter(v: any, style: ColumnStyle) {\n    if (v === null || v === void 0 || v === undefined) {\n      return '';\n    }\n\n    if (_.isArray(v)) {\n      v = v.join(', ');\n    }\n\n    if (style && style.sanitize) {\n      return this.sanitize(v);\n    } else {\n      return _.escape(v);\n    }\n  }\n\n  createColumnFormatter(column: ColumnRender) {\n    if (!column.style) {\n      return this.defaultCellFormatter;\n    }\n\n    if (column.style.type === 'hidden') {\n      return (v: any): undefined => undefined;\n    }\n\n    if (column.style.type === 'date') {\n      return (v: any) => {\n        if (v === undefined || v === null) {\n          return '-';\n        }\n\n        if (_.isArray(v)) {\n          v = v[0];\n        }\n\n        // if is an epoch (numeric string and len > 12)\n        if (_.isString(v) && !isNaN(v as any) && v.length > 12) {\n          v = parseInt(v, 10);\n        }\n\n        if (!column.style.dateFormat) {\n          return dateTimeFormatISO(v, {\n            timeZone: this.timeZone,\n          });\n        }\n\n        return dateTimeFormat(v, {\n          format: column.style.dateFormat,\n          timeZone: this.timeZone,\n        });\n      };\n    }\n\n    if (column.style.type === 'string') {\n      return (v: any): any => {\n        if (_.isArray(v)) {\n          v = v.join(', ');\n        }\n\n        const mappingType = column.style.mappingType || 0;\n\n        if (mappingType === 1 && column.style.valueMaps) {\n          for (let i = 0; i < column.style.valueMaps.length; i++) {\n            const map = column.style.valueMaps[i];\n\n            if (v === null) {\n              if (map.value === 'null') {\n                return map.text;\n              }\n              continue;\n            }\n\n            // Allow both numeric and string values to be mapped\n            if ((!_.isString(v) && Number(map.value) === Number(v)) || map.value === v) {\n              this.setColorState(v, column.style);\n              return this.defaultCellFormatter(map.text, column.style);\n            }\n          }\n        }\n\n        if (mappingType === 2 && column.style.rangeMaps) {\n          for (let i = 0; i < column.style.rangeMaps.length; i++) {\n            const map = column.style.rangeMaps[i];\n\n            if (v === null) {\n              if (map.from === 'null' && map.to === 'null') {\n                return map.text;\n              }\n              continue;\n            }\n\n            if (Number(map.from) <= Number(v) && Number(map.to) >= Number(v)) {\n              this.setColorState(v, column.style);\n              return this.defaultCellFormatter(map.text, column.style);\n            }\n          }\n        }\n\n        if (v === null || v === void 0) {\n          return '-';\n        }\n\n        this.setColorState(v, column.style);\n        return this.defaultCellFormatter(v, column.style);\n      };\n    }\n\n    if (column.style.type === 'number') {\n      const valueFormatter = getValueFormat(column.unit || column.style.unit);\n\n      return (v: any): any => {\n        if (v === null || v === void 0) {\n          return '-';\n        }\n\n        if (isNaN(v) || _.isArray(v)) {\n          return this.defaultCellFormatter(v, column.style);\n        }\n\n        this.setColorState(v, column.style);\n        return formattedValueToString(valueFormatter(v, column.style.decimals, null));\n      };\n    }\n\n    return (value: any) => {\n      return this.defaultCellFormatter(value, column.style);\n    };\n  }\n\n  setColorState(value: any, style: ColumnStyle) {\n    if (!style.colorMode) {\n      return;\n    }\n\n    if (value === null || value === void 0 || _.isArray(value)) {\n      return;\n    }\n\n    const numericValue = Number(value);\n    if (isNaN(numericValue)) {\n      return;\n    }\n\n    this.colorState[style.colorMode] = this.getColorForValue(numericValue, style);\n  }\n\n  renderRowVariables(rowIndex: number) {\n    const scopedVars: ScopedVars = {};\n    let cellVariable;\n    const row = this.table.rows[rowIndex];\n    for (let i = 0; i < row.length; i++) {\n      cellVariable = `__cell_${i}`;\n      scopedVars[cellVariable] = { value: row[i], text: row[i] ? row[i].toString() : '' };\n    }\n    return scopedVars;\n  }\n\n  formatColumnValue(colIndex: number, value: any) {\n    const fmt = this.formatters[colIndex];\n    if (fmt) {\n      return fmt(value);\n    }\n    return value;\n  }\n\n  renderCell(columnIndex: number, rowIndex: number, value: any, addWidthHack = false) {\n    value = this.formatColumnValue(columnIndex, value);\n\n    const column = this.table.columns[columnIndex];\n    const cellStyles = [];\n    let cellStyle = '';\n    const cellClasses = [];\n    let cellClass = '';\n\n    if (this.colorState.cell) {\n      cellStyles.push('background-color:' + this.colorState.cell);\n      cellClasses.push('table-panel-color-cell');\n      this.colorState.cell = null;\n    } else if (this.colorState.value) {\n      cellStyles.push('color:' + this.colorState.value);\n      this.colorState.value = null;\n    }\n    // because of the fixed table headers css only solution\n    // there is an issue if header cell is wider the cell\n    // this hack adds header content to cell (not visible)\n    let columnHtml = '';\n    if (addWidthHack) {\n      columnHtml = '<div class=\"table-panel-width-hack\">' + this.table.columns[columnIndex].title + '</div>';\n    }\n\n    if (value === undefined) {\n      cellStyles.push('display:none');\n      column.hidden = true;\n    } else {\n      column.hidden = false;\n    }\n\n    if (column.hidden === true) {\n      return '';\n    }\n\n    if (column.style && column.style.preserveFormat) {\n      cellClasses.push('table-panel-cell-pre');\n    }\n\n    if (column.style && column.style.align) {\n      const textAlign = _.find(ColumnOptionsCtrl.alignTypesEnum, ['text', column.style.align]);\n      if (textAlign && textAlign['value']) {\n        cellStyles.push(`text-align:${textAlign['value']}`);\n      }\n    }\n\n    if (cellStyles.length) {\n      cellStyle = ' style=\"' + cellStyles.join(';') + '\"';\n    }\n\n    if (column.style && column.style.link) {\n      // Render cell as link\n      const scopedVars = this.renderRowVariables(rowIndex);\n      scopedVars['__cell'] = { value: value, text: value ? value.toString() : '' };\n\n      const cellLink = this.templateSrv.replace(column.style.linkUrl, scopedVars, encodeURIComponent);\n      const sanitizedCellLink = textUtil.sanitizeUrl(cellLink);\n\n      const cellLinkTooltip = textUtil.escapeHtml(this.templateSrv.replace(column.style.linkTooltip, scopedVars));\n      const cellTarget = column.style.linkTargetBlank ? '_blank' : '';\n\n      cellClasses.push('table-panel-cell-link');\n\n      columnHtml += `<a href=\"${sanitizedCellLink}\" target=\"${cellTarget}\" data-link-tooltip data-original-title=\"${cellLinkTooltip}\" data-placement=\"right\"${cellStyle}>`;\n      columnHtml += `${value}`;\n      columnHtml += `</a>`;\n    } else {\n      columnHtml += value;\n    }\n\n    if (column.filterable) {\n      cellClasses.push('table-panel-cell-filterable');\n      columnHtml += `<a class=\"table-panel-filter-link\" data-link-tooltip data-original-title=\"Filter out value\" data-placement=\"bottom\"\n           data-row=\"${rowIndex}\" data-column=\"${columnIndex}\" data-operator=\"!=\">`;\n      columnHtml += `<i class=\"fa fa-search-minus\"></i>`;\n      columnHtml += `</a>`;\n      columnHtml += `<a class=\"table-panel-filter-link\" data-link-tooltip data-original-title=\"Filter for value\" data-placement=\"bottom\"\n           data-row=\"${rowIndex}\" data-column=\"${columnIndex}\" data-operator=\"=\">`;\n      columnHtml += `<i class=\"fa fa-search-plus\"></i>`;\n      columnHtml += `</a>`;\n    }\n\n    if (cellClasses.length) {\n      cellClass = ' class=\"' + cellClasses.join(' ') + '\"';\n    }\n\n    columnHtml = '<td' + cellClass + cellStyle + '>' + columnHtml + '</td>';\n    return columnHtml;\n  }\n\n  render(page: number) {\n    const pageSize = this.panel.pageSize || 100;\n    const startPos = page * pageSize;\n    const endPos = Math.min(startPos + pageSize, this.table.rows.length);\n    let html = '';\n\n    for (let y = startPos; y < endPos; y++) {\n      const row = this.table.rows[y];\n      let cellHtml = '';\n      let rowStyle = '';\n      const rowClasses = [];\n      let rowClass = '';\n      for (let i = 0; i < this.table.columns.length; i++) {\n        cellHtml += this.renderCell(i, y, row[i], y === startPos);\n      }\n\n      if (this.colorState.row) {\n        rowStyle = ' style=\"background-color:' + this.colorState.row + '\"';\n        rowClasses.push('table-panel-color-row');\n        this.colorState.row = null;\n      }\n\n      if (rowClasses.length) {\n        rowClass = ' class=\"' + rowClasses.join(' ') + '\"';\n      }\n\n      html += '<tr ' + rowClass + rowStyle + '>' + cellHtml + '</tr>';\n    }\n\n    return html;\n  }\n\n  render_values() {\n    const rows = [];\n    const visibleColumns = this.table.columns.filter(column => !column.hidden);\n\n    for (let y = 0; y < this.table.rows.length; y++) {\n      const row = this.table.rows[y];\n      const newRow = [];\n      for (let i = 0; i < this.table.columns.length; i++) {\n        if (!this.table.columns[i].hidden) {\n          newRow.push(this.formatColumnValue(i, row[i]));\n        }\n      }\n      rows.push(newRow);\n    }\n    return {\n      columns: visibleColumns,\n      rows: rows,\n    };\n  }\n}\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport config, { getConfig } from 'app/core/config';\nimport { transformDataToTable } from './transformers';\nimport { tablePanelEditor } from './editor';\nimport { columnOptionsTab } from './column_options';\nimport { TableRenderer } from './renderer';\nimport { isTableData, PanelEvents, PanelPlugin } from '@grafana/data';\nimport { dispatch } from 'app/store/store';\nimport { ComponentType } from 'react';\nimport { PanelProps } from '@grafana/data';\nimport { applyFilterFromTable } from 'app/features/variables/adhoc/actions';\n\nexport class TablePanelCtrl extends MetricsPanelCtrl {\n  static templateUrl = 'module.html';\n\n  pageIndex: number;\n  dataRaw: any;\n  table: any;\n  renderer: any;\n\n  panelDefaults: any = {\n    targets: [{}],\n    transform: 'timeseries_to_columns',\n    pageSize: null,\n    showHeader: true,\n    styles: [\n      {\n        type: 'date',\n        pattern: 'Time',\n        alias: 'Time',\n        dateFormat: 'YYYY-MM-DD HH:mm:ss',\n        align: 'auto',\n      },\n      {\n        unit: 'short',\n        type: 'number',\n        alias: '',\n        decimals: 2,\n        colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n        colorMode: null,\n        pattern: '/.*/',\n        thresholds: [],\n        align: 'right',\n      },\n    ],\n    columns: [],\n\n    fontSize: '100%',\n    sort: { col: 0, desc: true },\n  };\n\n  /** @ngInject */\n  constructor(\n    $scope: any,\n    $injector: any,\n    private annotationsSrv: any,\n    private $sanitize: any,\n    private variableSrv: any\n  ) {\n    super($scope, $injector);\n\n    this.pageIndex = 0;\n\n    if (this.panel.styles === void 0) {\n      this.panel.styles = this.panel.columns;\n      this.panel.columns = this.panel.fields;\n      delete this.panel.columns;\n      delete this.panel.fields;\n    }\n\n    _.defaults(this.panel, this.panelDefaults);\n\n    this.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onDataReceived.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Options', tablePanelEditor, 2);\n    this.addEditorTab('Column Styles', columnOptionsTab, 3);\n  }\n\n  issueQueries(datasource: any) {\n    this.pageIndex = 0;\n\n    if (this.panel.transform === 'annotations') {\n      return this.annotationsSrv\n        .getAnnotations({\n          dashboard: this.dashboard,\n          panel: this.panel,\n          range: this.range,\n        })\n        .then((anno: any) => {\n          this.loading = false;\n          this.dataRaw = anno;\n          this.pageIndex = 0;\n          this.render();\n          return { data: this.dataRaw }; // Not used\n        });\n    }\n\n    return super.issueQueries(datasource);\n  }\n\n  onDataReceived(dataList: any) {\n    this.dataRaw = dataList;\n    this.pageIndex = 0;\n\n    // automatically correct transform mode based on data\n    if (this.dataRaw && this.dataRaw.length) {\n      if (isTableData(this.dataRaw[0])) {\n        this.panel.transform = 'table';\n      } else {\n        if (this.dataRaw[0].type === 'docs') {\n          this.panel.transform = 'json';\n        } else {\n          if (this.panel.transform === 'table' || this.panel.transform === 'json') {\n            this.panel.transform = 'timeseries_to_rows';\n          }\n        }\n      }\n    }\n\n    this.render();\n  }\n\n  render() {\n    this.table = transformDataToTable(this.dataRaw, this.panel);\n    this.table.sort(this.panel.sort);\n\n    this.renderer = new TableRenderer(\n      this.panel,\n      this.table,\n      this.dashboard.getTimezone(),\n      this.$sanitize,\n      this.templateSrv,\n      config.theme.type\n    );\n\n    return super.render(this.table);\n  }\n\n  toggleColumnSort(col: any, colIndex: any) {\n    // remove sort flag from current column\n    if (this.table.columns[this.panel.sort.col]) {\n      this.table.columns[this.panel.sort.col].sort = false;\n    }\n\n    if (this.panel.sort.col === colIndex) {\n      if (this.panel.sort.desc) {\n        this.panel.sort.desc = false;\n      } else {\n        this.panel.sort.col = null;\n      }\n    } else {\n      this.panel.sort.col = colIndex;\n      this.panel.sort.desc = true;\n    }\n    this.render();\n  }\n\n  link(scope: any, elem: JQuery, attrs: any, ctrl: TablePanelCtrl) {\n    let data: any;\n    const panel = ctrl.panel;\n    let pageCount = 0;\n\n    function getTableHeight() {\n      let panelHeight = ctrl.height;\n\n      if (pageCount > 1) {\n        panelHeight -= 26;\n      }\n\n      return panelHeight - 31 + 'px';\n    }\n\n    function appendTableRows(tbodyElem: JQuery) {\n      ctrl.renderer.setTable(data);\n      tbodyElem.empty();\n      tbodyElem.html(ctrl.renderer.render(ctrl.pageIndex));\n    }\n\n    function switchPage(e: any) {\n      const el = $(e.currentTarget);\n      ctrl.pageIndex = parseInt(el.text(), 10) - 1;\n      renderPanel();\n    }\n\n    function appendPaginationControls(footerElem: JQuery) {\n      footerElem.empty();\n\n      const pageSize = panel.pageSize || 100;\n      pageCount = Math.ceil(data.rows.length / pageSize);\n      if (pageCount === 1) {\n        return;\n      }\n\n      const startPage = Math.max(ctrl.pageIndex - 3, 0);\n      const endPage = Math.min(pageCount, startPage + 9);\n\n      const paginationList = $('<ul></ul>');\n\n      for (let i = startPage; i < endPage; i++) {\n        const activeClass = i === ctrl.pageIndex ? 'active' : '';\n        const pageLinkElem = $(\n          '<li><a class=\"table-panel-page-link pointer ' + activeClass + '\">' + (i + 1) + '</a></li>'\n        );\n        paginationList.append(pageLinkElem);\n      }\n\n      footerElem.append(paginationList);\n    }\n\n    function renderPanel() {\n      const panelElem = elem.parents('.panel-content');\n      const rootElem = elem.find('.table-panel-scroll');\n      const tbodyElem = elem.find('tbody');\n      const footerElem = elem.find('.table-panel-footer');\n\n      elem.css({ 'font-size': panel.fontSize });\n      panelElem.addClass('table-panel-content');\n\n      appendTableRows(tbodyElem);\n      appendPaginationControls(footerElem);\n\n      rootElem.css({ 'max-height': getTableHeight() });\n    }\n\n    // hook up link tooltips\n    elem.tooltip({\n      selector: '[data-link-tooltip]',\n    });\n\n    function addFilterClicked(e: any) {\n      const filterData = $(e.currentTarget).data();\n      const options = {\n        datasource: panel.datasource,\n        key: data.columns[filterData.column].text,\n        value: data.rows[filterData.row][filterData.column],\n        operator: filterData.operator,\n      };\n\n      if (getConfig().featureToggles.newVariables) {\n        dispatch(applyFilterFromTable(options));\n      } else {\n        ctrl.variableSrv.setAdhocFilter(options);\n      }\n    }\n\n    elem.on('click', '.table-panel-page-link', switchPage);\n    elem.on('click', '.table-panel-filter-link', addFilterClicked);\n\n    const unbindDestroy = scope.$on('$destroy', () => {\n      elem.off('click', '.table-panel-page-link');\n      elem.off('click', '.table-panel-filter-link');\n      unbindDestroy();\n    });\n\n    ctrl.events.on(PanelEvents.render, (renderData: any) => {\n      data = renderData || data;\n      if (data) {\n        renderPanel();\n      }\n      ctrl.renderingCompleted();\n    });\n  }\n}\n\nexport const plugin = new PanelPlugin((null as unknown) as ComponentType<PanelProps<any>>);\nplugin.angularPanelCtrl = TablePanelCtrl;\nplugin.setNoPadding();\n","import _ from 'lodash';\nimport { auto } from 'angular';\nimport $ from 'jquery';\nimport 'vendor/flot/jquery.flot';\nimport 'vendor/flot/jquery.flot.gauge';\nimport 'app/features/panel/panellinks/link_srv';\n\nimport {\n  DataFrame,\n  DisplayValue,\n  Field,\n  fieldReducers,\n  FieldType,\n  GraphSeriesValue,\n  KeyValue,\n  LinkModel,\n  reduceField,\n  ReducerID,\n  LegacyResponseData,\n  getFlotPairs,\n  getDisplayProcessor,\n  getColorFromHexRgbOrName,\n  PanelEvents,\n  formattedValueToString,\n  locationUtil,\n  getFieldDisplayName,\n} from '@grafana/data';\n\nimport { convertOldAngularValueMapping } from '@grafana/ui';\n\nimport config from 'app/core/config';\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { LinkSrv } from 'app/features/panel/panellinks/link_srv';\nimport { getProcessedDataFrames } from 'app/features/dashboard/state/runRequest';\n\nconst BASE_FONT_SIZE = 38;\n\nexport interface ShowData {\n  field: Field;\n  value: any;\n  sparkline: GraphSeriesValue[][];\n  display: DisplayValue;\n\n  scopedVars: any;\n\n  thresholds: any[];\n  colorMap: any;\n}\n\nclass SingleStatCtrl extends MetricsPanelCtrl {\n  static templateUrl = 'module.html';\n\n  data: Partial<ShowData> = {};\n\n  fontSizes: any[];\n  fieldNames: string[] = [];\n\n  invalidGaugeRange: boolean;\n  panel: any;\n  events: any;\n  valueNameOptions: any[] = [\n    { value: 'min', text: 'Min' },\n    { value: 'max', text: 'Max' },\n    { value: 'avg', text: 'Average' },\n    { value: 'current', text: 'Current' },\n    { value: 'total', text: 'Total' },\n    { value: 'name', text: 'Name' },\n    { value: 'first', text: 'First' },\n    { value: 'delta', text: 'Delta' },\n    { value: 'diff', text: 'Difference' },\n    { value: 'range', text: 'Range' },\n    { value: 'last_time', text: 'Time of last point' },\n  ];\n\n  // Set and populate defaults\n  panelDefaults: any = {\n    links: [],\n    datasource: null,\n    maxDataPoints: 100,\n    interval: null,\n    targets: [{}],\n    cacheTimeout: null,\n    format: 'none',\n    prefix: '',\n    postfix: '',\n    nullText: null,\n    valueMaps: [{ value: 'null', op: '=', text: 'N/A' }],\n    mappingTypes: [\n      { name: 'value to text', value: 1 },\n      { name: 'range to text', value: 2 },\n    ],\n    rangeMaps: [{ from: 'null', to: 'null', text: 'N/A' }],\n    mappingType: 1,\n    nullPointMode: 'connected',\n    valueName: 'avg',\n    prefixFontSize: '50%',\n    valueFontSize: '80%',\n    postfixFontSize: '50%',\n    thresholds: '',\n    colorBackground: false,\n    colorValue: false,\n    colors: ['#299c46', 'rgba(237, 129, 40, 0.89)', '#d44a3a'],\n    sparkline: {\n      show: false,\n      full: false,\n      ymin: null,\n      ymax: null,\n      lineColor: 'rgb(31, 120, 193)',\n      fillColor: 'rgba(31, 118, 189, 0.18)',\n    },\n    gauge: {\n      show: false,\n      minValue: 0,\n      maxValue: 100,\n      thresholdMarkers: true,\n      thresholdLabels: false,\n    },\n    tableColumn: '',\n  };\n\n  /** @ngInject */\n  constructor($scope: any, $injector: auto.IInjectorService, private linkSrv: LinkSrv, private $sanitize: any) {\n    super($scope, $injector);\n    _.defaults(this.panel, this.panelDefaults);\n\n    this.events.on(PanelEvents.dataFramesReceived, this.onFramesReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onSnapshotLoad.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n\n    this.useDataFrames = true;\n\n    this.onSparklineColorChange = this.onSparklineColorChange.bind(this);\n    this.onSparklineFillChange = this.onSparklineFillChange.bind(this);\n  }\n\n  onInitEditMode() {\n    this.fontSizes = ['20%', '30%', '50%', '70%', '80%', '100%', '110%', '120%', '150%', '170%', '200%'];\n    this.addEditorTab('Options', 'public/app/plugins/panel/singlestat/editor.html', 2);\n    this.addEditorTab('Value Mappings', 'public/app/plugins/panel/singlestat/mappings.html', 3);\n  }\n\n  migrateToPanel(type: string) {\n    this.onPluginTypeChange(config.panels[type]);\n  }\n\n  setUnitFormat() {\n    return (unit: string) => {\n      this.panel.format = unit;\n      this.refresh();\n    };\n  }\n\n  onSnapshotLoad(dataList: LegacyResponseData[]) {\n    this.onFramesReceived(getProcessedDataFrames(dataList));\n  }\n\n  onFramesReceived(frames: DataFrame[]) {\n    const { panel } = this;\n    this.dataList = frames;\n\n    if (frames && frames.length > 1) {\n      this.data = {\n        value: 0,\n        display: {\n          text: 'Only queries that return single series/table is supported',\n          numeric: NaN,\n        },\n      };\n      this.render();\n      return;\n    }\n\n    const distinct = getDistinctNames(frames);\n    let fieldInfo: FieldInfo | undefined = distinct.byName[panel.tableColumn];\n\n    this.fieldNames = distinct.names;\n\n    if (!fieldInfo) {\n      fieldInfo = distinct.first;\n    }\n\n    if (!fieldInfo) {\n      const processor = getDisplayProcessor({\n        field: {\n          config: {\n            mappings: convertOldAngularValueMapping(this.panel),\n            noValue: 'No Data',\n          },\n        },\n        theme: config.theme,\n        timeZone: this.dashboard.getTimezone(),\n      });\n      // When we don't have any field\n      this.data = {\n        value: null,\n        display: processor(null),\n      };\n    } else {\n      this.data = this.processField(fieldInfo);\n    }\n\n    this.render();\n  }\n\n  processField(fieldInfo: FieldInfo) {\n    const { panel, dashboard } = this;\n\n    const name = getFieldDisplayName(fieldInfo.field, fieldInfo.frame.frame, this.dataList as DataFrame[]);\n    let calc = panel.valueName;\n    let calcField = fieldInfo.field;\n    let val: any = undefined;\n\n    if ('name' === calc) {\n      val = name;\n    } else {\n      if ('last_time' === calc) {\n        if (fieldInfo.frame.firstTimeField) {\n          calcField = fieldInfo.frame.firstTimeField;\n          calc = ReducerID.last;\n        }\n      }\n\n      // Normalize functions (avg -> mean, etc)\n      const r = fieldReducers.getIfExists(calc);\n      if (r) {\n        calc = r.id;\n        // With strings, don't accidentally use a math function\n        if (calcField.type === FieldType.string) {\n          const avoid = [ReducerID.mean, ReducerID.sum];\n          if (avoid.includes(calc)) {\n            calc = panel.valueName = ReducerID.first;\n          }\n        }\n      } else {\n        calc = ReducerID.lastNotNull;\n      }\n\n      // Calculate the value\n      val = reduceField({\n        field: calcField,\n        reducers: [calc],\n      })[calc];\n    }\n\n    const processor = getDisplayProcessor({\n      field: {\n        ...fieldInfo.field,\n        config: {\n          ...fieldInfo.field.config,\n          unit: panel.format,\n          decimals: panel.decimals,\n          mappings: convertOldAngularValueMapping(panel),\n        },\n      },\n      theme: config.theme,\n      timeZone: dashboard.getTimezone(),\n    });\n\n    const sparkline: any[] = [];\n    const data = {\n      field: fieldInfo.field,\n      value: val,\n      display: processor(val),\n      scopedVars: _.extend({}, panel.scopedVars),\n      sparkline,\n    };\n\n    data.scopedVars['__name'] = { value: name };\n    panel.tableColumn = this.fieldNames.length > 1 ? name : '';\n\n    // Get the fields for a sparkline\n    if (panel.sparkline && panel.sparkline.show && fieldInfo.frame.firstTimeField) {\n      data.sparkline = getFlotPairs({\n        xField: fieldInfo.frame.firstTimeField,\n        yField: fieldInfo.field,\n        nullValueMode: panel.nullPointMode,\n      });\n    }\n\n    return data;\n  }\n\n  canModifyText() {\n    return !this.panel.gauge.show;\n  }\n\n  setColoring(options: { background: any }) {\n    if (options.background) {\n      this.panel.colorValue = false;\n      this.panel.colors = ['rgba(71, 212, 59, 0.4)', 'rgba(245, 150, 40, 0.73)', 'rgba(225, 40, 40, 0.59)'];\n    } else {\n      this.panel.colorBackground = false;\n      this.panel.colors = ['rgba(50, 172, 45, 0.97)', 'rgba(237, 129, 40, 0.89)', 'rgba(245, 54, 54, 0.9)'];\n    }\n    this.render();\n  }\n\n  invertColorOrder() {\n    const tmp = this.panel.colors[0];\n    this.panel.colors[0] = this.panel.colors[2];\n    this.panel.colors[2] = tmp;\n    this.render();\n  }\n\n  onColorChange(panelColorIndex: number) {\n    return (color: string) => {\n      this.panel.colors[panelColorIndex] = color;\n      this.render();\n    };\n  }\n\n  onSparklineColorChange(newColor: string) {\n    this.panel.sparkline.lineColor = newColor;\n    this.render();\n  }\n\n  onSparklineFillChange(newColor: string) {\n    this.panel.sparkline.fillColor = newColor;\n    this.render();\n  }\n\n  removeValueMap(map: any) {\n    const index = _.indexOf(this.panel.valueMaps, map);\n    this.panel.valueMaps.splice(index, 1);\n    this.render();\n  }\n\n  addValueMap() {\n    this.panel.valueMaps.push({ value: '', op: '=', text: '' });\n  }\n\n  removeRangeMap(rangeMap: any) {\n    const index = _.indexOf(this.panel.rangeMaps, rangeMap);\n    this.panel.rangeMaps.splice(index, 1);\n    this.render();\n  }\n\n  addRangeMap() {\n    this.panel.rangeMaps.push({ from: '', to: '', text: '' });\n  }\n\n  link(scope: any, elem: JQuery, attrs: any, ctrl: any) {\n    const $location = this.$location;\n    const linkSrv = this.linkSrv;\n    const $timeout = this.$timeout;\n    const $sanitize = this.$sanitize;\n    const panel = ctrl.panel;\n    const templateSrv = this.templateSrv;\n    let linkInfo: LinkModel<any> | null = null;\n    elem = elem.find('.singlestat-panel');\n\n    function getPanelContainer() {\n      return elem.closest('.panel-container');\n    }\n\n    function applyColoringThresholds(valueString: string) {\n      const data = ctrl.data;\n      const color = getColorForValue(data, data.value);\n      if (color) {\n        return '<span style=\"color:' + color + '\">' + valueString + '</span>';\n      }\n\n      return valueString;\n    }\n\n    function getSpan(className: string, fontSizePercent: string, applyColoring: any, value: string) {\n      value = $sanitize(templateSrv.replace(value, ctrl.data.scopedVars));\n      value = applyColoring ? applyColoringThresholds(value) : value;\n      const pixelSize = (parseInt(fontSizePercent, 10) / 100) * BASE_FONT_SIZE;\n      return '<span class=\"' + className + '\" style=\"font-size:' + pixelSize + 'px\">' + value + '</span>';\n    }\n\n    function getBigValueHtml() {\n      const data: ShowData = ctrl.data;\n      let body = '<div class=\"singlestat-panel-value-container\">';\n\n      if (panel.prefix) {\n        body += getSpan('singlestat-panel-prefix', panel.prefixFontSize, panel.colorPrefix, panel.prefix);\n      }\n\n      body += getSpan(\n        'singlestat-panel-value',\n        panel.valueFontSize,\n        panel.colorValue,\n        formattedValueToString(data.display)\n      );\n\n      if (panel.postfix) {\n        body += getSpan('singlestat-panel-postfix', panel.postfixFontSize, panel.colorPostfix, panel.postfix);\n      }\n\n      body += '</div>';\n\n      return body;\n    }\n\n    function getValueText() {\n      const data: ShowData = ctrl.data;\n      let result = panel.prefix ? templateSrv.replace(panel.prefix, data.scopedVars) : '';\n      result += formattedValueToString(data.display);\n      result += panel.postfix ? templateSrv.replace(panel.postfix, data.scopedVars) : '';\n\n      return result;\n    }\n\n    function addGauge() {\n      const data: ShowData = ctrl.data;\n      const width = elem.width();\n      const height = elem.height();\n      // Allow to use a bit more space for wide gauges\n      const dimension = Math.min(width, height * 1.3);\n\n      ctrl.invalidGaugeRange = false;\n      if (panel.gauge.minValue > panel.gauge.maxValue) {\n        ctrl.invalidGaugeRange = true;\n        return;\n      }\n\n      const plotCanvas = $('<div></div>');\n      const plotCss = {\n        top: '5px',\n        margin: 'auto',\n        position: 'relative',\n        height: height * 0.9 + 'px',\n        width: dimension + 'px',\n      };\n\n      plotCanvas.css(plotCss);\n\n      const thresholds = [];\n\n      for (let i = 0; i < data.thresholds.length; i++) {\n        thresholds.push({\n          value: data.thresholds[i],\n          color: data.colorMap[i],\n        });\n      }\n      thresholds.push({\n        value: panel.gauge.maxValue,\n        color: data.colorMap[data.colorMap.length - 1],\n      });\n\n      const bgColor = config.bootData.user.lightTheme ? 'rgb(230,230,230)' : 'rgb(38,38,38)';\n\n      const fontScale = parseInt(panel.valueFontSize, 10) / 100;\n      const fontSize = Math.min(dimension / 5, 100) * fontScale;\n      // Reduce gauge width if threshold labels enabled\n      const gaugeWidthReduceRatio = panel.gauge.thresholdLabels ? 1.5 : 1;\n      const gaugeWidth = Math.min(dimension / 6, 60) / gaugeWidthReduceRatio;\n      const thresholdMarkersWidth = gaugeWidth / 5;\n      const thresholdLabelFontSize = fontSize / 2.5;\n\n      const options: any = {\n        series: {\n          gauges: {\n            gauge: {\n              min: panel.gauge.minValue,\n              max: panel.gauge.maxValue,\n              background: { color: bgColor },\n              border: { color: null },\n              shadow: { show: false },\n              width: gaugeWidth,\n            },\n            frame: { show: false },\n            label: { show: false },\n            layout: { margin: 0, thresholdWidth: 0 },\n            cell: { border: { width: 0 } },\n            threshold: {\n              values: thresholds,\n              label: {\n                show: panel.gauge.thresholdLabels,\n                margin: thresholdMarkersWidth + 1,\n                font: { size: thresholdLabelFontSize },\n              },\n              show: panel.gauge.thresholdMarkers,\n              width: thresholdMarkersWidth,\n            },\n            value: {\n              color: panel.colorValue ? getColorForValue(data, data.display.numeric) : null,\n              formatter: () => {\n                return getValueText();\n              },\n              font: {\n                size: fontSize,\n                family: config.theme.typography.fontFamily.sansSerif,\n              },\n            },\n            show: true,\n          },\n        },\n      };\n\n      elem.append(plotCanvas);\n\n      const plotSeries = {\n        data: [[0, data.value]],\n      };\n\n      $.plot(plotCanvas, [plotSeries], options);\n    }\n\n    function addSparkline() {\n      const data: ShowData = ctrl.data;\n      const width = elem.width();\n      if (width < 30) {\n        // element has not gotten it's width yet\n        // delay sparkline render\n        setTimeout(addSparkline, 30);\n        return;\n      }\n      if (!data.sparkline || !data.sparkline.length) {\n        // no sparkline data\n        return;\n      }\n\n      const height = ctrl.height;\n      const plotCanvas = $('<div></div>');\n      const plotCss: any = {};\n      plotCss.position = 'absolute';\n      plotCss.bottom = '0px';\n\n      if (panel.sparkline.full) {\n        plotCss.left = '0px';\n        plotCss.width = width + 'px';\n        const dynamicHeightMargin = height <= 100 ? 5 : Math.round(height / 100) * 15 + 5;\n        plotCss.height = height - dynamicHeightMargin + 'px';\n      } else {\n        plotCss.left = '0px';\n        plotCss.width = width + 'px';\n        plotCss.height = Math.floor(height * 0.25) + 'px';\n      }\n\n      plotCanvas.css(plotCss);\n\n      const options = {\n        legend: { show: false },\n        series: {\n          lines: {\n            show: true,\n            fill: 1,\n            lineWidth: 1,\n            fillColor: getColorFromHexRgbOrName(panel.sparkline.fillColor, config.theme.type),\n            zero: false,\n          },\n        },\n        yaxis: {\n          show: false,\n          min: panel.sparkline.ymin,\n          max: panel.sparkline.ymax,\n        },\n        xaxis: {\n          show: false,\n          mode: 'time',\n          min: ctrl.range.from.valueOf(),\n          max: ctrl.range.to.valueOf(),\n        },\n        grid: { hoverable: false, show: false },\n      };\n\n      elem.append(plotCanvas);\n\n      const plotSeries = {\n        data: data.sparkline,\n        color: getColorFromHexRgbOrName(panel.sparkline.lineColor, config.theme.type),\n      };\n\n      $.plot(plotCanvas, [plotSeries], options);\n    }\n\n    function render() {\n      if (!ctrl.data) {\n        return;\n      }\n      const { data, panel } = ctrl;\n\n      // get thresholds\n      data.thresholds = panel.thresholds\n        ? panel.thresholds.split(',').map((strVale: string) => {\n            return Number(strVale.trim());\n          })\n        : [];\n\n      // Map panel colors to hex or rgb/a values\n      if (panel.colors) {\n        data.colorMap = panel.colors.map((color: string) => getColorFromHexRgbOrName(color, config.theme.type));\n      }\n\n      const body = panel.gauge.show ? '' : getBigValueHtml();\n\n      if (panel.colorBackground) {\n        const color = getColorForValue(data, data.display.numeric);\n        if (color) {\n          getPanelContainer().css('background-color', color);\n          if (scope.fullscreen) {\n            elem.css('background-color', color);\n          } else {\n            elem.css('background-color', '');\n          }\n        } else {\n          getPanelContainer().css('background-color', '');\n          elem.css('background-color', '');\n        }\n      } else {\n        getPanelContainer().css('background-color', '');\n        elem.css('background-color', '');\n      }\n\n      elem.html(body);\n\n      if (panel.sparkline.show) {\n        addSparkline();\n      }\n\n      if (panel.gauge.show) {\n        addGauge();\n      }\n\n      elem.toggleClass('pointer', panel.links.length > 0);\n\n      if (panel.links.length > 0) {\n        linkInfo = linkSrv.getDataLinkUIModel(panel.links[0], data.scopedVars, {});\n      } else {\n        linkInfo = null;\n      }\n    }\n\n    function hookupDrilldownLinkTooltip() {\n      // drilldown link tooltip\n      const drilldownTooltip = $('<div id=\"tooltip\" class=\"\">hello</div>\"');\n\n      elem.mouseleave(() => {\n        if (panel.links.length === 0) {\n          return;\n        }\n        $timeout(() => {\n          drilldownTooltip.detach();\n        });\n      });\n\n      elem.click(evt => {\n        if (!linkInfo) {\n          return;\n        }\n        // ignore title clicks in title\n        if ($(evt).parents('.panel-header').length > 0) {\n          return;\n        }\n\n        if (linkInfo.target === '_blank') {\n          window.open(linkInfo.href, '_blank');\n          return;\n        }\n\n        if (linkInfo.href.indexOf('http') === 0) {\n          window.location.href = linkInfo.href;\n        } else {\n          $timeout(() => {\n            $location.url(locationUtil.stripBaseFromUrl(linkInfo!.href));\n          });\n        }\n\n        drilldownTooltip.detach();\n      });\n\n      elem.mousemove(e => {\n        if (!linkInfo) {\n          return;\n        }\n\n        drilldownTooltip.text('click to go to: ' + linkInfo.title);\n        drilldownTooltip.place_tt(e.pageX, e.pageY - 50);\n      });\n    }\n\n    hookupDrilldownLinkTooltip();\n\n    this.events.on(PanelEvents.render, () => {\n      render();\n      ctrl.renderingCompleted();\n    });\n  }\n}\n\nfunction getColorForValue(data: any, value: number) {\n  if (!_.isFinite(value)) {\n    return null;\n  }\n\n  for (let i = data.thresholds.length; i > 0; i--) {\n    if (value >= data.thresholds[i - 1]) {\n      return data.colorMap[i];\n    }\n  }\n\n  return _.first(data.colorMap);\n}\n\n//------------------------------------------------\n// Private utility functions\n// Something like this should be available in a\n//  DataFrame[] abstraction helper\n//------------------------------------------------\n\ninterface FrameInfo {\n  firstTimeField?: Field;\n  frame: DataFrame;\n}\n\ninterface FieldInfo {\n  field: Field;\n  frame: FrameInfo;\n}\n\ninterface DistinctFieldsInfo {\n  first?: FieldInfo;\n  byName: KeyValue<FieldInfo>;\n  names: string[];\n}\n\nfunction getDistinctNames(data: DataFrame[]): DistinctFieldsInfo {\n  const distinct: DistinctFieldsInfo = {\n    byName: {},\n    names: [],\n  };\n  for (const frame of data) {\n    const info: FrameInfo = { frame };\n    for (const field of frame.fields) {\n      if (field.type === FieldType.time) {\n        if (!info.firstTimeField) {\n          info.firstTimeField = field;\n        }\n      } else {\n        const f = { field, frame: info };\n        if (!distinct.first) {\n          distinct.first = f;\n        }\n        let t = field.config.displayName;\n        if (t && !distinct.byName[t]) {\n          distinct.byName[t] = f;\n          distinct.names.push(t);\n        }\n        t = field.name;\n        if (t && !distinct.byName[t]) {\n          distinct.byName[t] = f;\n          distinct.names.push(t);\n        }\n      }\n    }\n  }\n  return distinct;\n}\n\nexport { SingleStatCtrl, SingleStatCtrl as PanelCtrl, getColorForValue };\n","import { SingleStatBaseOptions, BigValueColorMode, BigValueGraphMode, BigValueJustifyMode } from '@grafana/ui';\nimport {\n  ReducerID,\n  SelectableValue,\n  standardEditorsRegistry,\n  FieldOverrideContext,\n  getFieldDisplayName,\n  escapeStringForRegex,\n} from '@grafana/data';\nimport { PanelOptionsEditorBuilder } from '@grafana/data';\n\n// Structure copied from angular\nexport interface StatPanelOptions extends SingleStatBaseOptions {\n  graphMode: BigValueGraphMode;\n  colorMode: BigValueColorMode;\n  justifyMode: BigValueJustifyMode;\n}\n\nexport const colorModes: Array<SelectableValue<BigValueColorMode>> = [\n  { value: BigValueColorMode.Value, label: 'Value' },\n  { value: BigValueColorMode.Background, label: 'Background' },\n];\n\nexport const graphModes: Array<SelectableValue<BigValueGraphMode>> = [\n  { value: BigValueGraphMode.None, label: 'None' },\n  { value: BigValueGraphMode.Area, label: 'Area graph' },\n];\n\nexport const justifyModes: Array<SelectableValue<BigValueJustifyMode>> = [\n  { value: BigValueJustifyMode.Auto, label: 'Auto' },\n  { value: BigValueJustifyMode.Center, label: 'Center' },\n];\n\nexport function addStandardDataReduceOptions(\n  builder: PanelOptionsEditorBuilder<SingleStatBaseOptions>,\n  includeOrientation = true,\n  includeFieldMatcher = true\n) {\n  builder.addRadio({\n    path: 'reduceOptions.values',\n    name: 'Show',\n    description: 'Calculate a single value per column or series or show each row',\n    settings: {\n      options: [\n        { value: false, label: 'Calculate' },\n        { value: true, label: 'All values' },\n      ],\n    },\n    defaultValue: false,\n  });\n\n  builder.addNumberInput({\n    path: 'reduceOptions.limit',\n    name: 'Limit',\n    description: 'Max number of rows to display',\n    settings: {\n      placeholder: '5000',\n      integer: true,\n      min: 1,\n      max: 5000,\n    },\n    showIf: options => options.reduceOptions.values === true,\n  });\n\n  builder.addCustomEditor({\n    id: 'reduceOptions.calcs',\n    path: 'reduceOptions.calcs',\n    name: 'Value',\n    description: 'Choose a reducer function / calculation',\n    editor: standardEditorsRegistry.get('stats-picker').editor as any,\n    defaultValue: [ReducerID.mean],\n    // Hides it when all values mode is on\n    showIf: currentConfig => currentConfig.reduceOptions.values === false,\n  });\n\n  if (includeFieldMatcher) {\n    builder.addSelect({\n      path: 'reduceOptions.fields',\n      name: 'Fields',\n      description: 'Select the fields that should be included in the panel',\n      settings: {\n        allowCustomValue: true,\n        options: [],\n        getOptions: async (context: FieldOverrideContext) => {\n          const options = [\n            { value: '', label: 'Numeric Fields' },\n            { value: '/.*/', label: 'All Fields' },\n          ];\n          if (context && context.data) {\n            for (const frame of context.data) {\n              for (const field of frame.fields) {\n                const name = getFieldDisplayName(field, frame, context.data);\n                const value = `/^${escapeStringForRegex(name)}$/`;\n                options.push({ value, label: name });\n              }\n            }\n          }\n          return Promise.resolve(options);\n        },\n      },\n      defaultValue: '',\n    });\n  }\n\n  if (includeOrientation) {\n    builder.addRadio({\n      path: 'orientation',\n      name: 'Orientation',\n      description: 'Stacking direction in case of multiple series or fields',\n      settings: {\n        options: [\n          { value: 'auto', label: 'Auto' },\n          { value: 'horizontal', label: 'Horizontal' },\n          { value: 'vertical', label: 'Vertical' },\n        ],\n      },\n      defaultValue: 'auto',\n    });\n  }\n}\n","import React, { PureComponent } from 'react';\nimport {\n  BigValue,\n  BigValueGraphMode,\n  BigValueSparkline,\n  DataLinksContextMenu,\n  VizRepeater,\n  VizRepeaterRenderValueProps,\n} from '@grafana/ui';\nimport {\n  DisplayValueAlignmentFactors,\n  FieldDisplay,\n  getDisplayValueAlignmentFactors,\n  getFieldDisplayValues,\n  PanelProps,\n  ReducerID,\n} from '@grafana/data';\n\nimport { config } from 'app/core/config';\nimport { StatPanelOptions } from './types';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\n\nexport class StatPanel extends PureComponent<PanelProps<StatPanelOptions>> {\n  renderComponent = (\n    valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>,\n    menuProps: DataLinksContextMenuApi\n  ): JSX.Element => {\n    const { timeRange, options } = this.props;\n    const { value, alignmentFactors, width, height } = valueProps;\n    const { openMenu, targetClassName } = menuProps;\n    let sparkline: BigValueSparkline | undefined;\n\n    if (value.sparkline) {\n      sparkline = {\n        data: value.sparkline,\n        xMin: timeRange.from.valueOf(),\n        xMax: timeRange.to.valueOf(),\n        yMin: value.field.min,\n        yMax: value.field.max,\n      };\n\n      const calc = options.reduceOptions.calcs[0];\n      if (calc === ReducerID.last) {\n        sparkline.highlightIndex = sparkline.data.length - 1;\n      }\n    }\n\n    return (\n      <BigValue\n        value={value.display}\n        sparkline={sparkline}\n        colorMode={options.colorMode}\n        graphMode={options.graphMode}\n        justifyMode={options.justifyMode}\n        alignmentFactors={alignmentFactors}\n        width={width}\n        height={height}\n        theme={config.theme}\n        onClick={openMenu}\n        className={targetClassName}\n      />\n    );\n  };\n  renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>): JSX.Element => {\n    const { value } = valueProps;\n    const { getLinks, hasLinks } = value;\n\n    if (!hasLinks) {\n      return this.renderComponent(valueProps, {});\n    }\n\n    return (\n      <DataLinksContextMenu links={getLinks}>\n        {api => {\n          return this.renderComponent(valueProps, api);\n        }}\n      </DataLinksContextMenu>\n    );\n  };\n\n  getValues = (): FieldDisplay[] => {\n    const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;\n\n    return getFieldDisplayValues({\n      fieldConfig,\n      reduceOptions: options.reduceOptions,\n      replaceVariables,\n      theme: config.theme,\n      data: data.series,\n      sparkline: options.graphMode !== BigValueGraphMode.None,\n      autoMinMax: true,\n      timeZone,\n    });\n  };\n\n  render() {\n    const { height, options, width, data, renderCounter } = this.props;\n\n    return (\n      <VizRepeater\n        getValues={this.getValues}\n        getAlignmentFactors={getDisplayValueAlignmentFactors}\n        renderValue={this.renderValue}\n        width={width}\n        height={height}\n        source={data}\n        itemSpacing={3}\n        renderCounter={renderCounter}\n        autoGrid={true}\n        orientation={options.orientation}\n      />\n    );\n  }\n}\n","import { sharedSingleStatMigrationHandler } from '@grafana/ui';\nimport { PanelPlugin } from '@grafana/data';\nimport { StatPanelOptions, addStandardDataReduceOptions } from './types';\nimport { StatPanel } from './StatPanel';\nimport { statPanelChangedHandler } from './StatMigrations';\n\nexport const plugin = new PanelPlugin<StatPanelOptions>(StatPanel)\n  .useFieldConfig()\n  .setPanelOptions(builder => {\n    addStandardDataReduceOptions(builder);\n\n    builder\n      .addRadio({\n        path: 'colorMode',\n        name: 'Color mode',\n        description: 'Color either the value or the background',\n        defaultValue: 'value',\n        settings: {\n          options: [\n            { value: 'value', label: 'Value' },\n            { value: 'background', label: 'Background' },\n          ],\n        },\n      })\n      .addRadio({\n        path: 'graphMode',\n        name: 'Graph mode',\n        description: 'Stat panel graph / sparkline mode',\n        defaultValue: 'area',\n        settings: {\n          options: [\n            { value: 'none', label: 'None' },\n            { value: 'area', label: 'Area' },\n          ],\n        },\n      })\n      .addRadio({\n        path: 'justifyMode',\n        name: 'Alignment mode',\n        description: 'Value & title posititioning',\n        defaultValue: 'auto',\n        settings: {\n          options: [\n            { value: 'auto', label: 'Auto' },\n            { value: 'center', label: 'Center' },\n          ],\n        },\n      });\n  })\n  .setNoPadding()\n  .setPanelChangeHandler(statPanelChangedHandler)\n  .setMigrationHandler(sharedSingleStatMigrationHandler);\n","import { sharedSingleStatPanelChangedHandler, BigValueGraphMode, BigValueColorMode } from '@grafana/ui';\nimport { PanelModel } from '@grafana/data';\nimport { StatPanelOptions } from './types';\n\n// This is called when the panel changes from another panel\nexport const statPanelChangedHandler = (\n  panel: PanelModel<Partial<StatPanelOptions>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) => {\n  // This handles most config changes\n  const options = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as StatPanelOptions;\n\n  // Changing from angular singlestat\n  if (prevPluginId === 'singlestat' && prevOptions.angular) {\n    const oldOptions = prevOptions.angular;\n\n    options.graphMode =\n      oldOptions.sparkline && oldOptions.sparkline.show === true ? BigValueGraphMode.Area : BigValueGraphMode.None;\n\n    if (oldOptions.colorBackground) {\n      options.colorMode = BigValueColorMode.Background;\n    } else {\n      options.colorMode = BigValueColorMode.Value;\n    }\n  }\n\n  return options;\n};\n","import { GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\nimport { stylesFactory } from '@grafana/ui';\n\nexport const cardStyle = stylesFactory((theme: GrafanaTheme, complete: boolean) => {\n  const completeGradient = 'linear-gradient(to right, #5182CC 0%, #245BAF 100%)';\n  const darkThemeGradients = complete ? completeGradient : 'linear-gradient(to right, #f05a28 0%, #fbca0a 100%)';\n  const lightThemeGradients = complete ? completeGradient : 'linear-gradient(to right, #FBCA0A 0%, #F05A28 100%)';\n\n  const borderGradient = theme.isDark ? darkThemeGradients : lightThemeGradients;\n\n  return `\n      background-color: ${theme.colors.bg1};\n      margin-right: ${theme.spacing.xl};\n      border: 1px solid ${theme.colors.border1};\n      border-bottom-left-radius: ${theme.border.radius.md};\n      border-bottom-right-radius: ${theme.border.radius.md};\n      position: relative;\n      max-height: 230px;\n\n      @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n        margin-right: ${theme.spacing.md};\n      }\n      &::before {\n        display: block;\n        content: ' ';\n        position: absolute;\n        left: 0;\n        right: 0;\n        height: 2px;\n        top: 0;\n        background-image: ${borderGradient};\n      }\n`;\n});\n\nexport const iconStyle = stylesFactory(\n  (theme: GrafanaTheme, complete: boolean) => css`\n    color: ${complete ? theme.palette.blue95 : theme.colors.textWeak};\n\n    @media only screen and (max-width: ${theme.breakpoints.sm}) {\n      display: none;\n    }\n  `\n);\n\nexport const cardContent = css`\n  padding: 24px 16px;\n`;\n","import React, { FC, MouseEvent } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, stylesFactory, useTheme } from '@grafana/ui';\nimport { css } from 'emotion';\nimport store from 'app/core/store';\nimport { cardContent, cardStyle, iconStyle } from './sharedStyles';\nimport { TutorialCardType } from '../types';\n\ninterface Props {\n  card: TutorialCardType;\n}\n\nexport const TutorialCard: FC<Props> = ({ card }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme, card.done);\n\n  return (\n    <a className={styles.card} onClick={(event: MouseEvent<HTMLAnchorElement>) => handleTutorialClick(event, card)}>\n      <div className={cardContent}>\n        <div className={styles.type}>{card.type}</div>\n        <div className={styles.heading}>{card.done ? 'complete' : card.heading}</div>\n        <h4>{card.title}</h4>\n        <div className={styles.info}>{card.info}</div>\n        <Icon className={iconStyle(theme, card.done)} name={card.icon} size=\"xxl\" />\n      </div>\n    </a>\n  );\n};\n\nconst handleTutorialClick = (event: MouseEvent<HTMLAnchorElement>, card: TutorialCardType) => {\n  event.preventDefault();\n  const isSet = store.get(card.key);\n  if (!isSet) {\n    store.set(card.key, true);\n  }\n  window.open(`${card.href}?utm_source=grafana_gettingstarted`, '_blank');\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, complete: boolean) => {\n  const textColor = `${complete ? theme.palette.blue95 : '#FFB357'}`;\n  return {\n    card: css`\n      ${cardStyle(theme, complete)}\n      width: 460px;\n      min-width: 460px;\n\n      @media only screen and (max-width: ${theme.breakpoints.xl}) {\n        min-width: 368px;\n      }\n\n      @media only screen and (max-width: ${theme.breakpoints.lg}) {\n        min-width: 272px;\n      }\n    `,\n    type: css`\n      color: ${textColor};\n      text-transform: uppercase;\n    `,\n    heading: css`\n      text-transform: uppercase;\n      color: ${textColor};\n      margin-bottom: ${theme.spacing.sm};\n    `,\n    info: css`\n      margin-bottom: ${theme.spacing.md};\n    `,\n    status: css`\n      display: flex;\n      justify-content: flex-end;\n    `,\n  };\n});\n","import React, { FC } from 'react';\nimport { Card } from '../types';\nimport { Icon, stylesFactory, useTheme } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\nimport { cardContent, cardStyle, iconStyle } from './sharedStyles';\n\ninterface Props {\n  card: Card;\n}\n\nexport const DocsCard: FC<Props> = ({ card }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme, card.done);\n\n  return (\n    <div className={styles.card}>\n      <div className={cardContent}>\n        <a href={`${card.href}?utm_source=grafana_gettingstarted`}>\n          <div className={styles.heading}>{card.done ? 'complete' : card.heading}</div>\n          <h4 className={styles.title}>{card.title}</h4>\n          <div>\n            <Icon className={iconStyle(theme, card.done)} name={card.icon} size=\"xxl\" />\n          </div>\n        </a>\n      </div>\n      <a href={`${card.learnHref}?utm_source=grafana_gettingstarted`} className={styles.url} target=\"_blank\">\n        Learn how in the docs <Icon name=\"external-link-alt\" />\n      </a>\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, complete: boolean) => {\n  return {\n    card: css`\n      ${cardStyle(theme, complete)}\n\n      min-width: 230px;\n\n      @media only screen and (max-width: ${theme.breakpoints.md}) {\n        min-width: 192px;\n      }\n    `,\n    heading: css`\n      text-transform: uppercase;\n      color: ${complete ? theme.palette.blue95 : '#FFB357'};\n      margin-bottom: ${theme.spacing.md};\n    `,\n    title: css`\n      margin-bottom: 48px;\n    `,\n    url: css`\n      border-top: 1px solid ${theme.colors.border1};\n      position: absolute;\n      bottom: 0;\n      padding: 8px 16px;\n      width: 100%;\n    `,\n  };\n});\n","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '@grafana/ui';\nimport { TutorialCard } from './TutorialCard';\nimport { Card, SetupStep, TutorialCardType } from '../types';\nimport { DocsCard } from './DocsCard';\n\ninterface Props {\n  step: SetupStep;\n}\n\nexport const Step: FC<Props> = ({ step }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.setup}>\n      <div className={styles.info}>\n        <h2 className={styles.title}>{step.title}</h2>\n        <p>{step.info}</p>\n      </div>\n      <div className={styles.cards}>\n        {step.cards.map((card: Card | TutorialCardType, index: number) => {\n          const key = `${card.title}-${index}`;\n          if (card.type === 'tutorial') {\n            return <TutorialCard key={key} card={card as TutorialCardType} />;\n          }\n          return <DocsCard key={key} card={card} />;\n        })}\n      </div>\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    setup: css`\n      display: flex;\n      width: 95%;\n    `,\n    info: css`\n      width: 172px;\n      margin-right: 5%;\n\n      @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n        margin-right: ${theme.spacing.xl};\n      }\n      @media only screen and (max-width: ${theme.breakpoints.sm}) {\n        display: none;\n      }\n    `,\n    title: css`\n      color: ${theme.palette.blue95};\n    `,\n    cards: css`\n      overflow-x: scroll;\n      overflow-y: hidden;\n      width: 100%;\n      display: flex;\n      justify-content: center;\n\n      @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n        justify-content: flex-start;\n      }\n    `,\n  };\n});\n","export default __webpack_public_path__ + \"static/img/Onboarding_Panel_dark.da2034ff.svg\";","export default __webpack_public_path__ + \"static/img/Onboarding_Panel_light.44da5afe.svg\";","import { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport store from 'app/core/store';\nimport { SetupStep } from './types';\n\nconst step1TutorialTitle = 'Grafana fundamentals';\nconst step2TutorialTitle = 'Create users and teams';\nconst keyPrefix = 'getting.started.';\nconst step1Key = `${keyPrefix}${step1TutorialTitle\n  .replace(' ', '-')\n  .trim()\n  .toLowerCase()}`;\nconst step2Key = `${keyPrefix}${step2TutorialTitle\n  .replace(' ', '-')\n  .trim()\n  .toLowerCase()}`;\n\nexport const getSteps = (): SetupStep[] => [\n  {\n    heading: 'Welcome to Grafana',\n    subheading: 'The steps below will guide you to quickly finish setting up your Grafana installation.',\n    title: 'Basic',\n    info: 'The steps below will guide you to quickly finish setting up your Grafana installation.',\n    done: false,\n    cards: [\n      {\n        type: 'tutorial',\n        heading: 'Data source and dashboards',\n        title: step1TutorialTitle,\n        info:\n          'Set up and understand Grafana if you have no prior experience. This tutorial guides you through the entire process and covers the “Data source” and “Dashboards” steps to the right.',\n        href: 'https://grafana.com/tutorials/grafana-fundamentals',\n        icon: 'grafana',\n        check: () => Promise.resolve(store.get(step1Key)),\n        key: step1Key,\n        done: false,\n      },\n      {\n        type: 'docs',\n        title: 'Add your first data source',\n        heading: 'data sources',\n        icon: 'database',\n        learnHref: 'https://grafana.com/docs/grafana/latest/features/datasources/add-a-data-source',\n        href: 'datasources/new',\n        check: () => {\n          return new Promise(resolve => {\n            resolve(\n              getDatasourceSrv()\n                .getMetricSources()\n                .filter(item => {\n                  return item.meta.builtIn !== true;\n                }).length > 0\n            );\n          });\n        },\n        done: false,\n      },\n      {\n        type: 'docs',\n        heading: 'dashboards',\n        title: 'Create your first dashboard',\n        icon: 'apps',\n        href: 'dashboard/new',\n        learnHref: 'https://grafana.com/docs/grafana/latest/guides/getting_started/#create-a-dashboard',\n        check: async () => {\n          const result = await getBackendSrv().search({ limit: 1 });\n          return result.length > 0;\n        },\n        done: false,\n      },\n    ],\n  },\n  {\n    heading: 'Setup complete!',\n    subheading:\n      'All necessary steps to use Grafana are done. Now tackle advanced steps or make the best use of this home dashboard – it is, after all, a fully customizable dashboard – and remove this panel.',\n    title: 'Advanced',\n    info: ' Manage your users and teams and add plugins. These steps are optional',\n    done: false,\n    cards: [\n      {\n        type: 'tutorial',\n        heading: 'Users',\n        title: 'Create users and teams',\n        info: 'Learn to organize your users in teams and manage resource access and roles.',\n        href: 'https://grafana.com/tutorials/create-users-and-teams',\n        icon: 'users-alt',\n        key: step2Key,\n        check: () => Promise.resolve(store.get(step2Key)),\n        done: false,\n      },\n      {\n        type: 'docs',\n        heading: 'plugins',\n        title: 'Find and install plugins',\n        learnHref: 'https://grafana.com/docs/grafana/latest/plugins/installation',\n        href: 'plugins',\n        icon: 'plug',\n        check: async () => {\n          const plugins = await getBackendSrv().get('/api/plugins', { embedded: 0, core: 0 });\n          return Promise.resolve(plugins.length > 0);\n        },\n        done: false,\n      },\n    ],\n  },\n];\n","// Libraries\nimport React, { PureComponent } from 'react';\nimport { PanelProps } from '@grafana/data';\nimport { Button, Spinner, stylesFactory } from '@grafana/ui';\nimport { config } from '@grafana/runtime';\nimport { css, cx } from 'emotion';\nimport { contextSrv } from 'app/core/core';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { Step } from './components/Step';\nimport imageDark from './img/Onboarding_Panel_dark.svg';\nimport imageLight from './img/Onboarding_Panel_light.svg';\nimport { getSteps } from './steps';\nimport { Card, SetupStep } from './types';\n\ninterface State {\n  checksDone: boolean;\n  currentStep: number;\n  steps: SetupStep[];\n}\n\nexport class GettingStarted extends PureComponent<PanelProps, State> {\n  state = {\n    checksDone: false,\n    currentStep: 0,\n    steps: getSteps(),\n  };\n\n  async componentDidMount() {\n    const { steps } = this.state;\n\n    const checkedStepsPromises: Array<Promise<SetupStep>> = steps.map(async (step: SetupStep) => {\n      const checkedCardsPromises: Array<Promise<Card>> = step.cards.map((card: Card) => {\n        return card.check().then(passed => {\n          return { ...card, done: passed };\n        });\n      });\n      const checkedCards = await Promise.all(checkedCardsPromises);\n      return {\n        ...step,\n        done: checkedCards.every(c => c.done),\n        cards: checkedCards,\n      };\n    });\n\n    const checkedSteps = await Promise.all(checkedStepsPromises);\n\n    this.setState({\n      currentStep: !checkedSteps[0].done ? 0 : 1,\n      steps: checkedSteps,\n      checksDone: true,\n    });\n  }\n\n  onForwardClick = () => {\n    this.setState(prevState => ({\n      currentStep: prevState.currentStep + 1,\n    }));\n  };\n\n  onPreviousClick = () => {\n    this.setState(prevState => ({\n      currentStep: prevState.currentStep - 1,\n    }));\n  };\n\n  dismiss = () => {\n    const { id } = this.props;\n    const dashboard = getDashboardSrv().getCurrent();\n    const panel = dashboard.getPanelById(id);\n    dashboard.removePanel(panel);\n    backendSrv\n      .request({\n        method: 'PUT',\n        url: '/api/user/helpflags/1',\n        showSuccessAlert: false,\n      })\n      .then((res: any) => {\n        contextSrv.user.helpFlags1 = res.helpFlags1;\n      });\n  };\n\n  render() {\n    const { checksDone, currentStep, steps } = this.state;\n    const styles = getStyles();\n    const step = steps[currentStep];\n\n    return (\n      <div className={styles.container}>\n        {!checksDone ? (\n          <div className={styles.loading}>\n            <div className={styles.loadingText}>Checking completed setup steps</div>\n            <Spinner size={24} inline />\n          </div>\n        ) : (\n          <>\n            <div className={styles.dismiss}>\n              <div onClick={this.dismiss}>Remove this panel</div>\n            </div>\n            {currentStep === steps.length - 1 && (\n              <div className={cx(styles.backForwardButtons, styles.previous)} onClick={this.onPreviousClick}>\n                <Button icon=\"angle-left\" variant=\"secondary\" />\n              </div>\n            )}\n            <div className={styles.content}>\n              <Step step={step} />\n            </div>\n            {currentStep < steps.length - 1 && (\n              <div className={cx(styles.backForwardButtons, styles.forward)} onClick={this.onForwardClick}>\n                <Button icon=\"angle-right\" variant=\"secondary\" />\n              </div>\n            )}\n          </>\n        )}\n      </div>\n    );\n  }\n}\n\nconst getStyles = stylesFactory(() => {\n  const { theme } = config;\n  const backgroundImage = theme.isDark ? imageDark : imageLight;\n  return {\n    container: css`\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      background: url(${backgroundImage}) no-repeat;\n      background-size: cover;\n      padding: ${theme.spacing.xl} ${theme.spacing.md} 0;\n    `,\n    content: css`\n      label: content;\n      display: flex;\n      justify-content: center;\n\n      @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n        margin-left: ${theme.spacing.lg};\n        justify-content: flex-start;\n      }\n    `,\n    header: css`\n      label: header;\n      margin-bottom: ${theme.spacing.lg};\n      display: flex;\n      flex-direction: column;\n\n      @media only screen and (min-width: ${theme.breakpoints.lg}) {\n        flex-direction: row;\n      }\n    `,\n    headerLogo: css`\n      height: 58px;\n      padding-right: ${theme.spacing.md};\n      display: none;\n\n      @media only screen and (min-width: ${theme.breakpoints.md}) {\n        display: block;\n      }\n    `,\n    heading: css`\n      label: heading;\n      margin-right: ${theme.spacing.lg};\n      margin-bottom: ${theme.spacing.lg};\n      flex-grow: 1;\n      display: flex;\n\n      @media only screen and (min-width: ${theme.breakpoints.md}) {\n        margin-bottom: 0;\n      }\n    `,\n    backForwardButtons: css`\n      position: absolute;\n      bottom: 50%;\n      top: 50%;\n      height: 50px;\n    `,\n    previous: css`\n      left: 10px;\n\n      @media only screen and (max-width: ${theme.breakpoints.md}) {\n        left: 0;\n      }\n    `,\n    forward: css`\n      right: 10px;\n\n      @media only screen and (max-width: ${theme.breakpoints.md}) {\n        right: 0;\n      }\n    `,\n    dismiss: css`\n      display: flex;\n      justify-content: flex-end;\n      cursor: pointer;\n      text-decoration: underline;\n      margin-right: ${theme.spacing.md};\n      margin-bottom: ${theme.spacing.sm};\n    `,\n    loading: css`\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      height: 100%;\n    `,\n    loadingText: css`\n      margin-right: ${theme.spacing.sm};\n    `,\n  };\n});\n","import { PanelPlugin } from '@grafana/data';\nimport { GettingStarted } from './GettingStarted';\n\n// Simplest possible panel plugin\nexport const plugin = new PanelPlugin(GettingStarted).setNoPadding();\n","import React, { PureComponent } from 'react';\nimport { FieldDisplay, getFieldDisplayValues, PanelProps, VizOrientation } from '@grafana/data';\nimport { DataLinksContextMenu, Gauge, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\n\nimport { config } from 'app/core/config';\nimport { GaugeOptions } from './types';\n\nexport class GaugePanel extends PureComponent<PanelProps<GaugeOptions>> {\n  renderComponent = (\n    valueProps: VizRepeaterRenderValueProps<FieldDisplay>,\n    menuProps: DataLinksContextMenuApi\n  ): JSX.Element => {\n    const { options } = this.props;\n    const { value, width, height } = valueProps;\n    const { field, display } = value;\n    const { openMenu, targetClassName } = menuProps;\n\n    return (\n      <Gauge\n        value={display}\n        width={width}\n        height={height}\n        field={field}\n        showThresholdLabels={options.showThresholdLabels}\n        showThresholdMarkers={options.showThresholdMarkers}\n        theme={config.theme}\n        onClick={openMenu}\n        className={targetClassName}\n      />\n    );\n  };\n\n  renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay>): JSX.Element => {\n    const { value } = valueProps;\n    const { getLinks, hasLinks } = value;\n\n    if (!hasLinks) {\n      return this.renderComponent(valueProps, {});\n    }\n\n    return (\n      <DataLinksContextMenu links={getLinks}>\n        {api => {\n          return this.renderComponent(valueProps, api);\n        }}\n      </DataLinksContextMenu>\n    );\n  };\n\n  getValues = (): FieldDisplay[] => {\n    const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;\n    return getFieldDisplayValues({\n      fieldConfig,\n      reduceOptions: options.reduceOptions,\n      replaceVariables,\n      theme: config.theme,\n      data: data.series,\n      autoMinMax: true,\n      timeZone,\n    });\n  };\n\n  render() {\n    const { height, width, data, renderCounter } = this.props;\n    return (\n      <VizRepeater\n        getValues={this.getValues}\n        renderValue={this.renderValue}\n        width={width}\n        height={height}\n        source={data}\n        autoGrid={true}\n        renderCounter={renderCounter}\n        orientation={VizOrientation.Auto}\n      />\n    );\n  }\n}\n","import { PanelPlugin } from '@grafana/data';\nimport { GaugePanel } from './GaugePanel';\nimport { GaugeOptions } from './types';\nimport { addStandardDataReduceOptions } from '../stat/types';\nimport { gaugePanelMigrationHandler, gaugePanelChangedHandler } from './GaugeMigrations';\n\nexport const plugin = new PanelPlugin<GaugeOptions>(GaugePanel)\n  .useFieldConfig()\n  .setPanelOptions(builder => {\n    addStandardDataReduceOptions(builder);\n    builder\n      .addBooleanSwitch({\n        path: 'showThresholdLabels',\n        name: 'Show threshold labels',\n        description: 'Render the threshold values around the gauge bar',\n        defaultValue: false,\n      })\n      .addBooleanSwitch({\n        path: 'showThresholdMarkers',\n        name: 'Show threshold markers',\n        description: 'Renders the thresholds as an outer bar',\n        defaultValue: true,\n      });\n  })\n  .setPanelChangeHandler(gaugePanelChangedHandler)\n  .setMigrationHandler(gaugePanelMigrationHandler);\n","import { sharedSingleStatPanelChangedHandler, sharedSingleStatMigrationHandler } from '@grafana/ui';\nimport { PanelModel } from '@grafana/data';\nimport { GaugeOptions } from './types';\n\n// This is called when the panel first loads\nexport const gaugePanelMigrationHandler = (panel: PanelModel<GaugeOptions>): Partial<GaugeOptions> => {\n  return sharedSingleStatMigrationHandler(panel);\n};\n\n// This is called when the panel changes from another panel\nexport const gaugePanelChangedHandler = (\n  panel: PanelModel<Partial<GaugeOptions>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) => {\n  // This handles most config changes\n  const opts = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as GaugeOptions;\n\n  // Changing from angular singlestat\n  if (prevPluginId === 'singlestat' && prevOptions.angular) {\n    const gauge = prevOptions.angular.gauge;\n    if (gauge) {\n      opts.showThresholdMarkers = gauge.thresholdMarkers;\n      opts.showThresholdLabels = gauge.thresholdLabels;\n    }\n  }\n  return opts;\n};\n","// Libraries\nimport React, { PureComponent } from 'react';\n\n// Services & Utils\nimport { config } from 'app/core/config';\n\n// Components\nimport { PieChart } from '@grafana/ui';\nimport { getFieldDisplayValues } from '@grafana/data';\n\n// Types\nimport { PieChartOptions } from './types';\nimport { PanelProps } from '@grafana/data';\n\ninterface Props extends PanelProps<PieChartOptions> {}\n\nexport class PieChartPanel extends PureComponent<Props> {\n  render() {\n    const { width, height, options, data, replaceVariables, fieldConfig, timeZone } = this.props;\n\n    const values = getFieldDisplayValues({\n      fieldConfig,\n      reduceOptions: options.reduceOptions,\n      data: data.series,\n      theme: config.theme,\n      replaceVariables: replaceVariables,\n      timeZone,\n    }).map(v => v.display);\n\n    return (\n      <PieChart\n        width={width}\n        height={height}\n        values={values}\n        pieType={options.pieType}\n        strokeWidth={options.strokeWidth}\n        theme={config.theme}\n      />\n    );\n  }\n}\n","import { PanelPlugin } from '@grafana/data';\nimport { PieChartPanel } from './PieChartPanel';\nimport { PieChartOptions } from './types';\nimport { addStandardDataReduceOptions } from '../stat/types';\nimport { PieChartType } from '@grafana/ui';\n\nexport const plugin = new PanelPlugin<PieChartOptions>(PieChartPanel).setPanelOptions(builder => {\n  addStandardDataReduceOptions(builder, false);\n\n  builder\n    .addRadio({\n      name: 'Piechart type',\n      description: 'How the piechart should be rendered',\n      path: 'pieType',\n      settings: {\n        options: [\n          { value: PieChartType.PIE, label: 'Pie' },\n          { value: PieChartType.DONUT, label: 'Donut' },\n        ],\n      },\n      defaultValue: PieChartType.PIE,\n    })\n    .addNumberInput({\n      name: 'Width',\n      description: 'Width of the piechart outline',\n      path: 'strokeWidth',\n      defaultValue: 1,\n    });\n});\n","import React, { PureComponent } from 'react';\nimport {\n  DisplayValueAlignmentFactors,\n  FieldDisplay,\n  getDisplayValueAlignmentFactors,\n  getFieldDisplayValues,\n  PanelProps,\n} from '@grafana/data';\nimport { BarGauge, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';\n\nimport { config } from 'app/core/config';\nimport { BarGaugeOptions } from './types';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\n\nexport class BarGaugePanel extends PureComponent<PanelProps<BarGaugeOptions>> {\n  renderComponent = (\n    valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>,\n    menuProps: DataLinksContextMenuApi\n  ): JSX.Element => {\n    const { options } = this.props;\n    const { value, alignmentFactors, orientation, width, height } = valueProps;\n    const { field, display, view, colIndex } = value;\n    const { openMenu, targetClassName } = menuProps;\n\n    return (\n      <BarGauge\n        value={display}\n        width={width}\n        height={height}\n        orientation={orientation}\n        field={field}\n        display={view?.getFieldDisplayProcessor(colIndex)}\n        theme={config.theme}\n        itemSpacing={this.getItemSpacing()}\n        displayMode={options.displayMode}\n        onClick={openMenu}\n        className={targetClassName}\n        alignmentFactors={alignmentFactors}\n        showUnfilled={options.showUnfilled}\n      />\n    );\n  };\n\n  renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>): JSX.Element => {\n    const { value } = valueProps;\n    const { hasLinks, getLinks } = value;\n\n    if (!hasLinks) {\n      return this.renderComponent(valueProps, {});\n    }\n\n    return (\n      <DataLinksContextMenu links={getLinks}>\n        {api => {\n          return this.renderComponent(valueProps, api);\n        }}\n      </DataLinksContextMenu>\n    );\n  };\n\n  getValues = (): FieldDisplay[] => {\n    const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;\n    return getFieldDisplayValues({\n      fieldConfig,\n      reduceOptions: options.reduceOptions,\n      replaceVariables,\n      theme: config.theme,\n      data: data.series,\n      autoMinMax: true,\n      timeZone,\n    });\n  };\n\n  getItemSpacing(): number {\n    if (this.props.options.displayMode === 'lcd') {\n      return 2;\n    }\n\n    return 10;\n  }\n\n  render() {\n    const { height, width, options, data, renderCounter } = this.props;\n\n    return (\n      <VizRepeater\n        source={data}\n        getAlignmentFactors={getDisplayValueAlignmentFactors}\n        getValues={this.getValues}\n        renderValue={this.renderValue}\n        renderCounter={renderCounter}\n        width={width}\n        height={height}\n        itemSpacing={this.getItemSpacing()}\n        orientation={options.orientation}\n      />\n    );\n  }\n}\n","import { SingleStatBaseOptions, BarGaugeDisplayMode } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nexport interface BarGaugeOptions extends SingleStatBaseOptions {\n  displayMode: BarGaugeDisplayMode;\n  showUnfilled: boolean;\n}\n\nexport const displayModes: Array<SelectableValue<string>> = [\n  { value: BarGaugeDisplayMode.Gradient, label: 'Gradient' },\n  { value: BarGaugeDisplayMode.Lcd, label: 'Retro LCD' },\n  { value: BarGaugeDisplayMode.Basic, label: 'Basic' },\n];\n","import { sharedSingleStatPanelChangedHandler } from '@grafana/ui';\nimport { PanelPlugin } from '@grafana/data';\nimport { BarGaugePanel } from './BarGaugePanel';\nimport { BarGaugeOptions, displayModes } from './types';\nimport { addStandardDataReduceOptions } from '../stat/types';\nimport { barGaugePanelMigrationHandler } from './BarGaugeMigrations';\n\nexport const plugin = new PanelPlugin<BarGaugeOptions>(BarGaugePanel)\n  .useFieldConfig()\n  .setPanelOptions(builder => {\n    addStandardDataReduceOptions(builder);\n    builder\n      .addRadio({\n        path: 'displayMode',\n        name: 'Display mode',\n        settings: {\n          options: displayModes,\n        },\n        defaultValue: 'gradient',\n      })\n      .addBooleanSwitch({\n        path: 'showUnfilled',\n        name: 'Show unfilled area',\n        description: 'When enabled renders the unfilled region as gray',\n        defaultValue: true,\n        showIf: (options: BarGaugeOptions) => options.displayMode !== 'lcd',\n      });\n  })\n  .setPanelChangeHandler(sharedSingleStatPanelChangedHandler)\n  .setMigrationHandler(barGaugePanelMigrationHandler);\n","import { PanelModel } from '@grafana/data';\nimport { sharedSingleStatMigrationHandler } from '@grafana/ui';\nimport { BarGaugeOptions } from './types';\n\nexport const barGaugePanelMigrationHandler = (panel: PanelModel<BarGaugeOptions>): Partial<BarGaugeOptions> => {\n  return sharedSingleStatMigrationHandler(panel);\n};\n","import { PanelPlugin } from '@grafana/data';\nimport { Options } from './types';\nimport { LogsPanel } from './LogsPanel';\nimport { SortOrder } from '../../../core/utils/explore';\n\nexport const plugin = new PanelPlugin<Options>(LogsPanel).setPanelOptions(builder => {\n  builder\n    .addBooleanSwitch({\n      path: 'showTime',\n      name: 'Time',\n      description: '',\n      defaultValue: false,\n    })\n    .addBooleanSwitch({\n      path: 'showLabels',\n      name: 'Unique labels',\n      description: '',\n      defaultValue: false,\n    })\n    .addBooleanSwitch({\n      path: 'wrapLogMessage',\n      name: 'Wrap lines',\n      description: '',\n      defaultValue: false,\n    })\n    .addRadio({\n      path: 'sortOrder',\n      name: 'Order',\n      description: '',\n      settings: {\n        options: [\n          { value: SortOrder.Descending, label: 'Descending' },\n          { value: SortOrder.Ascending, label: 'Ascending' },\n        ],\n      },\n      defaultValue: SortOrder.Descending,\n    });\n});\n","import React from 'react';\nimport { LogRows, CustomScrollbar } from '@grafana/ui';\nimport { LogsDedupStrategy, PanelProps } from '@grafana/data';\nimport { Options } from './types';\nimport { dataFrameToLogsModel } from 'app/core/logs_model';\nimport { sortLogsResult } from 'app/core/utils/explore';\n\ninterface LogsPanelProps extends PanelProps<Options> {}\n\nexport const LogsPanel: React.FunctionComponent<LogsPanelProps> = ({\n  data,\n  timeZone,\n  options: { showLabels, showTime, wrapLogMessage, sortOrder },\n  width,\n}) => {\n  if (!data) {\n    return (\n      <div className=\"panel-empty\">\n        <p>No data found in response</p>\n      </div>\n    );\n  }\n\n  const newResults = data ? dataFrameToLogsModel(data.series, data.request?.intervalMs, timeZone) : null;\n  const sortedNewResults = sortLogsResult(newResults, sortOrder);\n\n  return (\n    <CustomScrollbar autoHide>\n      <LogRows\n        logRows={sortedNewResults.rows}\n        dedupStrategy={LogsDedupStrategy.none}\n        highlighterExpressions={[]}\n        showLabels={showLabels}\n        showTime={showTime}\n        wrapLogMessage={wrapLogMessage}\n        timeZone={timeZone}\n        allowDetails={true}\n        disableCustomHorizontalScroll={true}\n      />\n    </CustomScrollbar>\n  );\n};\n","import { RssFeed } from './types';\nimport { ArrayVector, FieldType, DataFrame, dateTime } from '@grafana/data';\n\nexport function feedToDataFrame(feed: RssFeed): DataFrame {\n  const date = new ArrayVector<number>([]);\n  const title = new ArrayVector<string>([]);\n  const link = new ArrayVector<string>([]);\n  const content = new ArrayVector<string>([]);\n\n  for (const item of feed.items) {\n    const val = dateTime(item.pubDate);\n\n    try {\n      date.buffer.push(val.valueOf());\n      title.buffer.push(item.title);\n      link.buffer.push(item.link);\n\n      if (item.content) {\n        const body = item.content.replace(/<\\/?[^>]+(>|$)/g, '');\n        content.buffer.push(body);\n      }\n    } catch (err) {\n      console.warn('Error reading news item:', err, item);\n    }\n  }\n\n  return {\n    fields: [\n      { name: 'date', type: FieldType.time, config: { displayName: 'Date' }, values: date },\n      { name: 'title', type: FieldType.string, config: {}, values: title },\n      { name: 'link', type: FieldType.string, config: {}, values: link },\n      { name: 'content', type: FieldType.string, config: {}, values: content },\n    ],\n    length: date.length,\n  };\n}\n","import { RssFeed, RssItem } from './types';\n\nexport async function loadRSSFeed(url: string): Promise<RssFeed> {\n  const rsp = await fetch(url);\n  const txt = await rsp.text();\n  const domParser = new DOMParser();\n  const doc = domParser.parseFromString(txt, 'text/xml');\n  const feed: RssFeed = {\n    items: [],\n  };\n\n  const getProperty = (node: Element, property: string) => {\n    const propNode = node.querySelector(property);\n    if (propNode) {\n      return propNode.textContent ?? '';\n    }\n    return '';\n  };\n\n  doc.querySelectorAll('item').forEach(node => {\n    const item: RssItem = {\n      title: getProperty(node, 'title'),\n      link: getProperty(node, 'link'),\n      content: getProperty(node, 'description'),\n      pubDate: getProperty(node, 'pubDate'),\n    };\n\n    feed.items.push(item);\n  });\n\n  return feed;\n}\n","// Libraries\nimport React, { PureComponent } from 'react';\n\n// Utils & Services\nimport { CustomScrollbar, stylesFactory } from '@grafana/ui';\n\nimport config from 'app/core/config';\nimport { feedToDataFrame } from './utils';\nimport { loadRSSFeed } from './rss';\n\n// Types\nimport { PanelProps, DataFrameView, dateTimeFormat, GrafanaTheme, textUtil } from '@grafana/data';\nimport { NewsOptions, NewsItem } from './types';\nimport { DEFAULT_FEED_URL, PROXY_PREFIX } from './constants';\nimport { css } from 'emotion';\n\ninterface Props extends PanelProps<NewsOptions> {}\n\ninterface State {\n  news?: DataFrameView<NewsItem>;\n  isError?: boolean;\n}\n\nexport class NewsPanel extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {};\n  }\n\n  componentDidMount(): void {\n    this.loadFeed();\n  }\n\n  componentDidUpdate(prevProps: Props): void {\n    if (this.props.options.feedUrl !== prevProps.options.feedUrl) {\n      this.loadFeed();\n    }\n  }\n\n  async loadFeed() {\n    const { options } = this.props;\n    try {\n      const url = options.feedUrl\n        ? options.useProxy\n          ? `${PROXY_PREFIX}${options.feedUrl}`\n          : options.feedUrl\n        : DEFAULT_FEED_URL;\n      const res = await loadRSSFeed(url);\n      const frame = feedToDataFrame(res);\n      this.setState({\n        news: new DataFrameView<NewsItem>(frame),\n        isError: false,\n      });\n    } catch (err) {\n      console.error('Error Loading News', err);\n      this.setState({\n        news: undefined,\n        isError: true,\n      });\n    }\n  }\n\n  render() {\n    const { isError, news } = this.state;\n    const styles = getStyles(config.theme);\n\n    if (isError) {\n      return <div>Error Loading News</div>;\n    }\n    if (!news) {\n      return <div>loading...</div>;\n    }\n\n    return (\n      <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n        {news.map((item, index) => {\n          return (\n            <div key={index} className={styles.item}>\n              <a href={item.link} target=\"_blank\">\n                <div className={styles.title}>{item.title}</div>\n                <div className={styles.date}>{dateTimeFormat(item.date, { format: 'MMM DD' })} </div>\n              </a>\n              <div className={styles.content} dangerouslySetInnerHTML={{ __html: textUtil.sanitize(item.content) }} />\n            </div>\n          );\n        })}\n      </CustomScrollbar>\n    );\n  }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  container: css`\n    height: 100%;\n  `,\n  item: css`\n    padding: ${theme.spacing.sm};\n    position: relative;\n    margin-bottom: 4px;\n    margin-right: ${theme.spacing.sm};\n    border-bottom: 2px solid ${theme.colors.border1};\n  `,\n  title: css`\n    color: ${theme.colors.linkExternal};\n    max-width: calc(100% - 70px);\n    font-size: 16px;\n    margin-bottom: ${theme.spacing.sm};\n  `,\n  content: css`\n    p {\n      margin-bottom: 4px;\n      color: ${theme.colors.text};\n    }\n  `,\n  date: css`\n    position: absolute;\n    top: 0;\n    right: 0;\n    background: ${theme.colors.panelBg};\n    width: 55px;\n    text-align: right;\n    padding: ${theme.spacing.xs};\n    font-weight: 500;\n    border-radius: 0 0 0 3px;\n    color: ${theme.colors.textWeak};\n  `,\n}));\n","export const DEFAULT_FEED_URL = 'https://grafana.com/blog/news.xml';\nexport const PROXY_PREFIX = 'https://cors-anywhere.herokuapp.com/';\n","import { PanelPlugin } from '@grafana/data';\nimport { NewsPanel } from './NewsPanel';\nimport { NewsOptions } from './types';\nimport { DEFAULT_FEED_URL, PROXY_PREFIX } from './constants';\n\nexport const plugin = new PanelPlugin<NewsOptions>(NewsPanel).setPanelOptions(builder => {\n  builder\n    .addTextInput({\n      path: 'feedUrl',\n      name: 'URL',\n      description: 'Only RSS feed formats are supported (not Atom).',\n      settings: {\n        placeholder: DEFAULT_FEED_URL,\n      },\n    })\n    .addBooleanSwitch({\n      path: 'useProxy',\n      name: 'Use Proxy',\n      description: 'If the feed is unable to connect, consider a CORS proxy',\n      showIf: (currentConfig: NewsOptions) => {\n        return currentConfig.feedUrl && !currentConfig.feedUrl.startsWith(PROXY_PREFIX);\n      },\n    });\n});\n","// Libraries\nimport React, { PureComponent, FC } from 'react';\nimport { css } from 'emotion';\n\n// Utils & Services\nimport { PanelPlugin } from '@grafana/data';\nimport { stylesFactory, styleMixins, Icon, IconName } from '@grafana/ui';\nimport config from 'app/core/config';\n\n// Types\nimport { PanelProps } from '@grafana/data';\n\nexport interface Props extends PanelProps {}\n\nexport class GrafanaLinksPanel extends PureComponent<Props> {\n  render() {\n    const styles = getStyles();\n\n    return (\n      <>\n        <div className={styles.list}>\n          <HomeLink\n            title=\"Documentation\"\n            icon=\"book\"\n            url=\"https://grafana.com/docs/grafana/latest?utm_source=grafana_homelinks\"\n            target=\"_blank\"\n          />\n          <HomeLink\n            title=\"Getting started\"\n            icon=\"bolt\"\n            url=\"https://grafana.com/docs/grafana/latest/guides/getting_started/?utm_source=grafana_homelinks\"\n            target=\"_blank\"\n          />\n          <HomeLink\n            title=\"Community forum\"\n            icon=\"comments-alt\"\n            url=\"https://community.grafana.com?utm_source=grafana_homelinks\"\n            target=\"_blank\"\n          />\n          <HomeLink\n            title=\"Report a bug\"\n            icon=\"bug\"\n            url=\"https://github.com/grafana/grafana/issues/new?template=1-bug_report.md\"\n            target=\"_blank\"\n          />\n        </div>\n        <VersionFooter />\n      </>\n    );\n  }\n}\n\ninterface HomeLinkProps {\n  title: string;\n  url: string;\n  target?: string;\n  icon: IconName;\n}\n\nexport const HomeLink: FC<HomeLinkProps> = ({ title, url, target, icon }) => {\n  const styles = getStyles();\n\n  return (\n    <a className={styles.item} href={url} target={target}>\n      <Icon name={icon} className={styles.icon} />\n      {title}\n    </a>\n  );\n};\n\nexport const VersionFooter: FC = () => {\n  const styles = getStyles();\n  const { version, commit } = config.buildInfo;\n\n  return (\n    <div className={styles.footer}>\n      Version {version} ({commit})\n    </div>\n  );\n};\n\nexport const getStyles = stylesFactory(() => {\n  const { theme } = config;\n\n  return {\n    list: css`\n      display: flex;\n      flex-direction: column;\n      padding: ${theme.spacing.md};\n    `,\n    icon: css`\n      margin-right: ${theme.spacing.sm};\n    `,\n    footer: css`\n      background: ${theme.colors.bg2};\n      font-size: ${theme.typography.size.sm};\n      position: absolute;\n      bottom: 0;\n      width: 100%;\n      text-align: center;\n      padding: ${theme.spacing.sm};\n      border-radius: 0;\n      box-shadow: none;\n      color: ${theme.colors.textWeak};\n    `,\n    item: css`\n      ${styleMixins.listItem(theme)}\n      padding: ${theme.spacing.sm};\n      display: flex;\n      margin-bottom: ${theme.spacing.xs};\n      align-items: center;\n    `,\n  };\n});\n\nexport const plugin = new PanelPlugin(GrafanaLinksPanel).setNoPadding();\n","export default __webpack_public_path__ + \"static/img/background_light.5e2b7b1a.svg\";","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '@grafana/ui';\nimport lightBackground from './img/background_light.svg';\n\nconst helpOptions = [\n  { value: 0, label: 'Documentation', href: 'https://grafana.com/docs/grafana/latest' },\n  { value: 1, label: 'Tutorials', href: 'https://grafana.com/tutorials' },\n  { value: 2, label: 'Community', href: 'https://community.grafana.com' },\n  { value: 3, label: 'Public Slack', href: 'http://slack.grafana.com' },\n];\n\nexport const WelcomeBanner: FC = () => {\n  const styles = getStyles(useTheme());\n\n  return (\n    <div className={styles.container}>\n      <h1 className={styles.title}>Welcome to Grafana</h1>\n      <div className={styles.help}>\n        <h3 className={styles.helpText}>Need help?</h3>\n        <div className={styles.helpLinks}>\n          {helpOptions.map((option, index) => {\n            return (\n              <a\n                key={`${option.label}-${index}`}\n                className={styles.helpLink}\n                href={`${option.href}?utm_source=grafana_gettingstarted`}\n              >\n                {option.label}\n              </a>\n            );\n          })}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const backgroundImage = theme.isDark ? 'public/img/login_background_dark.svg' : lightBackground;\n\n  return {\n    container: css`\n      display: flex;\n      background: url(${backgroundImage}) no-repeat;\n      background-size: cover;\n      height: 100%;\n      align-items: center;\n      padding: 0 16px;\n      justify-content: space-between;\n      padding: 0 ${theme.spacing.lg};\n\n      @media only screen and (max-width: ${theme.breakpoints.lg}) {\n        background-position: 0px;\n        flex-direction: column;\n        align-items: flex-start;\n        justify-content: center;\n      }\n\n      @media only screen and (max-width: ${theme.breakpoints.sm}) {\n        padding: 0 ${theme.spacing.sm};\n      }\n    `,\n    title: css`\n      margin-bottom: 0;\n\n      @media only screen and (max-width: ${theme.breakpoints.lg}) {\n        margin-bottom: ${theme.spacing.sm};\n      }\n\n      @media only screen and (max-width: ${theme.breakpoints.md}) {\n        font-size: ${theme.typography.heading.h2};\n      }\n      @media only screen and (max-width: ${theme.breakpoints.sm}) {\n        font-size: ${theme.typography.heading.h3};\n      }\n    `,\n    help: css`\n      display: flex;\n      align-items: baseline;\n    `,\n    helpText: css`\n      margin-right: ${theme.spacing.md};\n      margin-bottom: 0;\n\n      @media only screen and (max-width: ${theme.breakpoints.md}) {\n        font-size: ${theme.typography.heading.h4};\n      }\n\n      @media only screen and (max-width: ${theme.breakpoints.sm}) {\n        display: none;\n      }\n    `,\n    helpLinks: css`\n      display: flex;\n      flex-wrap: wrap;\n    `,\n    helpLink: css`\n      margin-right: ${theme.spacing.md};\n      text-decoration: underline;\n      text-wrap: no-wrap;\n\n      @media only screen and (max-width: ${theme.breakpoints.sm}) {\n        margin-right: 8px;\n      }\n    `,\n  };\n});\n","import { PanelPlugin } from '@grafana/data';\nimport { WelcomeBanner } from './Welcome';\n\nexport const plugin = new PanelPlugin(WelcomeBanner).setNoPadding();\n","const graphitePlugin = async () =>\n  await import(/* webpackChunkName: \"graphitePlugin\" */ 'app/plugins/datasource/graphite/module');\nconst cloudwatchPlugin = async () =>\n  await import(/* webpackChunkName: \"cloudwatchPlugin\" */ 'app/plugins/datasource/cloudwatch/module');\nconst dashboardDSPlugin = async () =>\n  await import(/* webpackChunkName \"dashboardDSPlugin\" */ 'app/plugins/datasource/dashboard/module');\nconst elasticsearchPlugin = async () =>\n  await import(/* webpackChunkName: \"elasticsearchPlugin\" */ 'app/plugins/datasource/elasticsearch/module');\nconst opentsdbPlugin = async () =>\n  await import(/* webpackChunkName: \"opentsdbPlugin\" */ 'app/plugins/datasource/opentsdb/module');\nconst grafanaPlugin = async () =>\n  await import(/* webpackChunkName: \"grafanaPlugin\" */ 'app/plugins/datasource/grafana/module');\nconst influxdbPlugin = async () =>\n  await import(/* webpackChunkName: \"influxdbPlugin\" */ 'app/plugins/datasource/influxdb/module');\nconst lokiPlugin = async () => await import(/* webpackChunkName: \"lokiPlugin\" */ 'app/plugins/datasource/loki/module');\nconst jaegerPlugin = async () =>\n  await import(/* webpackChunkName: \"jaegerPlugin\" */ 'app/plugins/datasource/jaeger/module');\nconst zipkinPlugin = async () =>\n  await import(/* webpackChunkName: \"zipkinPlugin\" */ 'app/plugins/datasource/zipkin/module');\nconst mixedPlugin = async () =>\n  await import(/* webpackChunkName: \"mixedPlugin\" */ 'app/plugins/datasource/mixed/module');\nconst mysqlPlugin = async () =>\n  await import(/* webpackChunkName: \"mysqlPlugin\" */ 'app/plugins/datasource/mysql/module');\nconst postgresPlugin = async () =>\n  await import(/* webpackChunkName: \"postgresPlugin\" */ 'app/plugins/datasource/postgres/module');\nconst prometheusPlugin = async () =>\n  await import(/* webpackChunkName: \"prometheusPlugin\" */ 'app/plugins/datasource/prometheus/module');\nconst mssqlPlugin = async () =>\n  await import(/* webpackChunkName: \"mssqlPlugin\" */ 'app/plugins/datasource/mssql/module');\nconst testDataDSPlugin = async () =>\n  await import(/* webpackChunkName: \"testDataDSPlugin\" */ 'app/plugins/datasource/testdata/module');\nconst stackdriverPlugin = async () =>\n  await import(/* webpackChunkName: \"stackdriverPlugin\" */ 'app/plugins/datasource/stackdriver/module');\nconst azureMonitorPlugin = async () =>\n  await import(\n    /* webpackChunkName: \"azureMonitorPlugin\" */ 'app/plugins/datasource/grafana-azure-monitor-datasource/module'\n  );\n\nimport * as textPanel from 'app/plugins/panel/text/module';\nimport * as text2Panel from 'app/plugins/panel/text2/module';\nimport * as graph2Panel from 'app/plugins/panel/graph2/module';\nimport * as graphPanel from 'app/plugins/panel/graph/module';\nimport * as dashListPanel from 'app/plugins/panel/dashlist/module';\nimport * as pluginsListPanel from 'app/plugins/panel/pluginlist/module';\nimport * as alertListPanel from 'app/plugins/panel/alertlist/module';\nimport * as annoListPanel from 'app/plugins/panel/annolist/module';\nimport * as heatmapPanel from 'app/plugins/panel/heatmap/module';\nimport * as tablePanel from 'app/plugins/panel/table/module';\nimport * as oldTablePanel from 'app/plugins/panel/table-old/module';\nimport * as singlestatPanel from 'app/plugins/panel/singlestat/module';\nimport * as singlestatPanel2 from 'app/plugins/panel/stat/module';\nimport * as gettingStartedPanel from 'app/plugins/panel/gettingstarted/module';\nimport * as gaugePanel from 'app/plugins/panel/gauge/module';\nimport * as pieChartPanel from 'app/plugins/panel/piechart/module';\nimport * as barGaugePanel from 'app/plugins/panel/bargauge/module';\nimport * as logsPanel from 'app/plugins/panel/logs/module';\nimport * as newsPanel from 'app/plugins/panel/news/module';\nimport * as homeLinksPanel from 'app/plugins/panel/homelinks/module';\nimport * as welcomeBanner from 'app/plugins/panel/welcome/module';\n\nconst builtInPlugins: any = {\n  'app/plugins/datasource/graphite/module': graphitePlugin,\n  'app/plugins/datasource/cloudwatch/module': cloudwatchPlugin,\n  'app/plugins/datasource/dashboard/module': dashboardDSPlugin,\n  'app/plugins/datasource/elasticsearch/module': elasticsearchPlugin,\n  'app/plugins/datasource/opentsdb/module': opentsdbPlugin,\n  'app/plugins/datasource/grafana/module': grafanaPlugin,\n  'app/plugins/datasource/influxdb/module': influxdbPlugin,\n  'app/plugins/datasource/loki/module': lokiPlugin,\n  'app/plugins/datasource/jaeger/module': jaegerPlugin,\n  'app/plugins/datasource/zipkin/module': zipkinPlugin,\n  'app/plugins/datasource/mixed/module': mixedPlugin,\n  'app/plugins/datasource/mysql/module': mysqlPlugin,\n  'app/plugins/datasource/postgres/module': postgresPlugin,\n  'app/plugins/datasource/mssql/module': mssqlPlugin,\n  'app/plugins/datasource/prometheus/module': prometheusPlugin,\n  'app/plugins/datasource/testdata/module': testDataDSPlugin,\n  'app/plugins/datasource/stackdriver/module': stackdriverPlugin,\n  'app/plugins/datasource/grafana-azure-monitor-datasource/module': azureMonitorPlugin,\n\n  'app/plugins/panel/text/module': textPanel,\n  'app/plugins/panel/text2/module': text2Panel,\n  'app/plugins/panel/graph2/module': graph2Panel,\n  'app/plugins/panel/graph/module': graphPanel,\n  'app/plugins/panel/dashlist/module': dashListPanel,\n  'app/plugins/panel/pluginlist/module': pluginsListPanel,\n  'app/plugins/panel/alertlist/module': alertListPanel,\n  'app/plugins/panel/annolist/module': annoListPanel,\n  'app/plugins/panel/heatmap/module': heatmapPanel,\n  'app/plugins/panel/table/module': tablePanel,\n  'app/plugins/panel/table-old/module': oldTablePanel,\n  'app/plugins/panel/news/module': newsPanel,\n  'app/plugins/panel/singlestat/module': singlestatPanel,\n  'app/plugins/panel/stat/module': singlestatPanel2,\n  'app/plugins/panel/gettingstarted/module': gettingStartedPanel,\n  'app/plugins/panel/gauge/module': gaugePanel,\n  'app/plugins/panel/piechart/module': pieChartPanel,\n  'app/plugins/panel/bargauge/module': barGaugePanel,\n  'app/plugins/panel/logs/module': logsPanel,\n  'app/plugins/panel/homelinks/module': homeLinksPanel,\n  'app/plugins/panel/welcome/module': welcomeBanner,\n};\n\nexport default builtInPlugins;\n","// Libraries\nimport _ from 'lodash';\nimport React, { PureComponent, ReactNode } from 'react';\n\n// Types\nimport { AppNotificationSeverity } from 'app/types';\nimport { Alert } from '@grafana/ui';\nimport { PanelProps, PanelPlugin, PluginType, PanelPluginMeta } from '@grafana/data';\n\ninterface Props {\n  title: string;\n  text?: ReactNode;\n}\n\nclass PanelPluginError extends PureComponent<Props> {\n  constructor(props: Props) {\n    super(props);\n  }\n\n  render() {\n    const style = {\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      height: '100%',\n    };\n\n    return (\n      <div style={style}>\n        <Alert severity={AppNotificationSeverity.Error} {...this.props} />\n      </div>\n    );\n  }\n}\n\nexport function getPanelPluginLoadError(meta: PanelPluginMeta, err: any): PanelPlugin {\n  const LoadError = class LoadError extends PureComponent<PanelProps> {\n    render() {\n      const text = (\n        <>\n          Check the server startup logs for more information. <br />\n          If this plugin was loaded from git, make sure it was compiled.\n        </>\n      );\n      return <PanelPluginError title={`Error loading: ${meta.id}`} text={text} />;\n    }\n  };\n  const plugin = new PanelPlugin(LoadError);\n  plugin.meta = meta;\n  plugin.loadError = true;\n  return plugin;\n}\n\nexport function getPanelPluginNotFound(id: string): PanelPlugin {\n  const NotFound = class NotFound extends PureComponent<PanelProps> {\n    render() {\n      return <PanelPluginError title={`Panel plugin not found: ${id}`} />;\n    }\n  };\n\n  const plugin = new PanelPlugin(NotFound);\n  plugin.meta = {\n    id: id,\n    name: id,\n    sort: 100,\n    type: PluginType.panel,\n    module: '',\n    baseUrl: '',\n    info: {\n      author: {\n        name: '',\n      },\n      description: '',\n      links: [],\n      logos: {\n        large: '',\n        small: '',\n      },\n      screenshots: [],\n      updated: '',\n      version: '',\n    },\n  };\n  return plugin;\n}\n","import _ from 'lodash';\nimport * as sdk from 'app/plugins/sdk';\nimport kbn from 'app/core/utils/kbn';\nimport moment from 'moment'; // eslint-disable-line no-restricted-imports\nimport angular from 'angular';\nimport jquery from 'jquery';\n\n// Experimental module exports\nimport prismjs from 'prismjs';\nimport slate from 'slate';\n// @ts-ignore\nimport slateReact from '@grafana/slate-react';\n// @ts-ignore\nimport slatePlain from 'slate-plain-serializer';\nimport react from 'react';\nimport reactDom from 'react-dom';\nimport * as reactRedux from 'react-redux';\nimport * as redux from 'redux';\n\nimport config from 'app/core/config';\nimport TimeSeries from 'app/core/time_series2';\nimport TableModel from 'app/core/table_model';\nimport { coreModule, appEvents, contextSrv } from 'app/core/core';\nimport {\n  DataSourcePlugin,\n  AppPlugin,\n  PanelPlugin,\n  PluginMeta,\n  DataSourcePluginMeta,\n  dateMath,\n  DataSourceApi,\n  DataSourceJsonData,\n  DataQuery,\n} from '@grafana/data';\nimport * as flatten from 'app/core/utils/flatten';\nimport * as ticks from 'app/core/utils/ticks';\nimport { BackendSrv, getBackendSrv } from 'app/core/services/backend_srv';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport builtInPlugins from './built_in_plugins';\nimport * as d3 from 'd3';\nimport * as emotion from 'emotion';\nimport * as grafanaData from '@grafana/data';\nimport * as grafanaUIraw from '@grafana/ui';\nimport * as grafanaRuntime from '@grafana/runtime';\n\n// Help the 6.4 to 6.5 migration\n// The base classes were moved from @grafana/ui to @grafana/data\n// This exposes the same classes on both import paths\nconst grafanaUI = grafanaUIraw as any;\ngrafanaUI.PanelPlugin = grafanaData.PanelPlugin;\ngrafanaUI.DataSourcePlugin = grafanaData.DataSourcePlugin;\ngrafanaUI.AppPlugin = grafanaData.AppPlugin;\ngrafanaUI.DataSourceApi = grafanaData.DataSourceApi;\n\n// rxjs\nimport * as rxjs from 'rxjs';\nimport * as rxjsOperators from 'rxjs/operators';\n\n// add cache busting\nconst bust = `?_cache=${Date.now()}`;\nfunction locate(load: { address: string }) {\n  return load.address + bust;\n}\ngrafanaRuntime.SystemJS.registry.set('plugin-loader', grafanaRuntime.SystemJS.newModule({ locate: locate }));\n\ngrafanaRuntime.SystemJS.config({\n  baseURL: 'public',\n  defaultExtension: 'js',\n  packages: {\n    plugins: {\n      defaultExtension: 'js',\n    },\n  },\n  map: {\n    text: 'vendor/plugin-text/text.js',\n    css: 'vendor/plugin-css/css.js',\n  },\n  meta: {\n    '/*': {\n      esModule: true,\n      authorization: true,\n      loader: 'plugin-loader',\n    },\n  },\n});\n\nfunction exposeToPlugin(name: string, component: any) {\n  grafanaRuntime.SystemJS.registerDynamic(name, [], true, (require: any, exports: any, module: { exports: any }) => {\n    module.exports = component;\n  });\n}\n\nexposeToPlugin('@grafana/data', grafanaData);\nexposeToPlugin('@grafana/ui', grafanaUI);\nexposeToPlugin('@grafana/runtime', grafanaRuntime);\nexposeToPlugin('lodash', _);\nexposeToPlugin('moment', moment);\nexposeToPlugin('jquery', jquery);\nexposeToPlugin('angular', angular);\nexposeToPlugin('d3', d3);\nexposeToPlugin('rxjs', rxjs);\nexposeToPlugin('rxjs/operators', rxjsOperators);\n\n// Experimental modules\nexposeToPlugin('prismjs', prismjs);\nexposeToPlugin('slate', slate);\nexposeToPlugin('@grafana/slate-react', slateReact);\nexposeToPlugin('slate-plain-serializer', slatePlain);\nexposeToPlugin('react', react);\nexposeToPlugin('react-dom', reactDom);\nexposeToPlugin('react-redux', reactRedux);\nexposeToPlugin('redux', redux);\nexposeToPlugin('emotion', emotion);\n\nexposeToPlugin('app/features/dashboard/impression_store', {\n  impressions: impressionSrv,\n  __esModule: true,\n});\n\n/**\n * NOTE: this is added temporarily while we explore a long term solution\n * If you use this export, only use the:\n *  get/delete/post/patch/request methods\n */\nexposeToPlugin('app/core/services/backend_srv', {\n  BackendSrv,\n  getBackendSrv,\n});\n\nexposeToPlugin('app/plugins/sdk', sdk);\nexposeToPlugin('app/core/utils/datemath', dateMath);\nexposeToPlugin('app/core/utils/flatten', flatten);\nexposeToPlugin('app/core/utils/kbn', kbn);\nexposeToPlugin('app/core/utils/ticks', ticks);\nexposeToPlugin('app/core/utils/promiseToDigest', {\n  promiseToDigest: promiseToDigest,\n  __esModule: true,\n});\n\nexposeToPlugin('app/core/config', config);\nexposeToPlugin('app/core/time_series', TimeSeries);\nexposeToPlugin('app/core/time_series2', TimeSeries);\nexposeToPlugin('app/core/table_model', TableModel);\nexposeToPlugin('app/core/app_events', appEvents);\nexposeToPlugin('app/core/core_module', coreModule);\nexposeToPlugin('app/core/core', {\n  coreModule: coreModule,\n  appEvents: appEvents,\n  contextSrv: contextSrv,\n  __esModule: true,\n});\n\nimport 'vendor/flot/jquery.flot';\nimport 'vendor/flot/jquery.flot.selection';\nimport 'vendor/flot/jquery.flot.time';\nimport 'vendor/flot/jquery.flot.stack';\nimport 'vendor/flot/jquery.flot.stackpercent';\nimport 'vendor/flot/jquery.flot.fillbelow';\nimport 'vendor/flot/jquery.flot.crosshair';\nimport 'vendor/flot/jquery.flot.dashes';\nimport 'vendor/flot/jquery.flot.gauge';\n\nconst flotDeps = [\n  'jquery.flot',\n  'jquery.flot.pie',\n  'jquery.flot.time',\n  'jquery.flot.fillbelow',\n  'jquery.flot.crosshair',\n  'jquery.flot.stack',\n  'jquery.flot.selection',\n  'jquery.flot.stackpercent',\n  'jquery.flot.events',\n  'jquery.flot.gauge',\n];\n\nfor (const flotDep of flotDeps) {\n  exposeToPlugin(flotDep, { fakeDep: 1 });\n}\n\nexport async function importPluginModule(path: string): Promise<any> {\n  const builtIn = builtInPlugins[path];\n  if (builtIn) {\n    // for handling dynamic imports\n    if (typeof builtIn === 'function') {\n      return await builtIn();\n    } else {\n      return Promise.resolve(builtIn);\n    }\n  }\n  return grafanaRuntime.SystemJS.import(path);\n}\n\nexport function importDataSourcePlugin(meta: DataSourcePluginMeta): Promise<GenericDataSourcePlugin> {\n  return importPluginModule(meta.module).then(pluginExports => {\n    if (pluginExports.plugin) {\n      const dsPlugin = pluginExports.plugin as GenericDataSourcePlugin;\n      dsPlugin.meta = meta;\n      return dsPlugin;\n    }\n\n    if (pluginExports.Datasource) {\n      const dsPlugin = new DataSourcePlugin<\n        DataSourceApi<DataQuery, DataSourceJsonData>,\n        DataQuery,\n        DataSourceJsonData\n      >(pluginExports.Datasource);\n      dsPlugin.setComponentsFromLegacyExports(pluginExports);\n      dsPlugin.meta = meta;\n      return dsPlugin;\n    }\n\n    throw new Error('Plugin module is missing DataSourcePlugin or Datasource constructor export');\n  });\n}\n\nexport function importAppPlugin(meta: PluginMeta): Promise<AppPlugin> {\n  return importPluginModule(meta.module).then(pluginExports => {\n    const plugin = pluginExports.plugin ? (pluginExports.plugin as AppPlugin) : new AppPlugin();\n    plugin.init(meta);\n    plugin.meta = meta;\n    plugin.setComponentsFromLegacyExports(pluginExports);\n    return plugin;\n  });\n}\n\nimport { getPanelPluginNotFound, getPanelPluginLoadError } from '../dashboard/dashgrid/PanelPluginError';\nimport { GenericDataSourcePlugin } from '../datasources/settings/PluginSettings';\n\ninterface PanelCache {\n  [key: string]: Promise<PanelPlugin>;\n}\nconst panelCache: PanelCache = {};\n\nexport function importPanelPlugin(id: string): Promise<PanelPlugin> {\n  const loaded = panelCache[id];\n\n  if (loaded) {\n    return loaded;\n  }\n\n  const meta = config.panels[id];\n\n  if (!meta) {\n    return Promise.resolve(getPanelPluginNotFound(id));\n  }\n\n  panelCache[id] = importPluginModule(meta.module)\n    .then(pluginExports => {\n      if (pluginExports.plugin) {\n        return pluginExports.plugin as PanelPlugin;\n      } else if (pluginExports.PanelCtrl) {\n        const plugin = new PanelPlugin(null);\n        plugin.angularPanelCtrl = pluginExports.PanelCtrl;\n        return plugin;\n      }\n      throw new Error('missing export: plugin or PanelCtrl');\n    })\n    .then(plugin => {\n      plugin.meta = meta;\n      return plugin;\n    })\n    .catch(err => {\n      // TODO, maybe a different error plugin\n      console.warn('Error loading panel plugin: ' + id, err);\n      return getPanelPluginLoadError(meta, err);\n    });\n\n  return panelCache[id];\n}\n","import { VariableModel } from '../../templating/types';\nimport { VariablesState } from './variablesReducer';\nimport { VariableType } from '@grafana/data';\n\nexport const NEW_VARIABLE_ID = '00000000-0000-0000-0000-000000000000';\nexport const ALL_VARIABLE_TEXT = 'All';\nexport const ALL_VARIABLE_VALUE = '$__all';\nexport const NONE_VARIABLE_TEXT = 'None';\nexport const NONE_VARIABLE_VALUE = '';\n\nexport const getInstanceState = <Model extends VariableModel = VariableModel>(state: VariablesState, id: string) => {\n  return state[id] as Model;\n};\n\nexport interface VariableIdentifier {\n  type: VariableType;\n  id: string;\n}\n\nexport interface VariablePayload<T extends any = undefined> extends VariableIdentifier {\n  data: T;\n}\n\nexport interface AddVariable<T extends VariableModel = VariableModel> {\n  global: boolean; // part of dashboard or global\n  index: number; // the order in variables list\n  model: T;\n}\n\nexport const toVariableIdentifier = (variable: VariableModel): VariableIdentifier => {\n  return { type: variable.type, id: variable.id! };\n};\n\nexport function toVariablePayload<T extends any = undefined>(\n  identifier: VariableIdentifier,\n  data?: T\n): VariablePayload<T>;\nexport function toVariablePayload<T extends any = undefined>(model: VariableModel, data?: T): VariablePayload<T>;\nexport function toVariablePayload<T extends any = undefined>(\n  obj: VariableIdentifier | VariableModel,\n  data?: T\n): VariablePayload<T> {\n  return { type: obj.type, id: obj.id!, data: data as T };\n}\n","var path = 'public/app/features/alerting/partials/notification_edit.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\n  <h3 class=page-sub-heading ng-hide=ctrl.isNew>Edit Notification Channel</h3>\\n  <h3 class=page-sub-heading ng-show=ctrl.isNew>New Notification Channel</h3>\\n\\n  <form name=ctrl.theForm ng-if=ctrl.notifiers>\\n    <div class=gf-form-group>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-12\\\">Name</span>\\n        <input type=text required class=\\\"gf-form-input max-width-15\\\" ng-model=ctrl.model.name required>\\n      </div>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-12\\\">Type</span>\\n        <div class=\\\"gf-form-select-wrapper width-15\\\">\\n          <select class=gf-form-input ng-model=ctrl.model.type ng-options=\\\"t.type as t.name for t in ctrl.notifiers\\\" ng-change=\\\"ctrl.typeChanged(notification, $index)\\\">\\n          </select>\\n        </div>\\n      </div>\\n      <gf-form-switch class=gf-form label=\\\"Default (send on all alerts)\\\" label-class=width-14 checked=ctrl.model.isDefault tooltip=\\\"Use this notification for all alerts\\\">\\n      </gf-form-switch>\\n      <gf-form-switch class=gf-form label=\\\"Include image\\\" label-class=width-14 checked=ctrl.model.settings.uploadImage tooltip=\\\"Captures an image and include it in the notification\\\">\\n      </gf-form-switch>\\n      <div class=\\\"grafana-info-box m-t-2\\\" ng-show=\\\"ctrl.model.settings.uploadImage && !ctrl.rendererAvailable\\\">\\n        <h5>No image renderer available/installed</h5>\\n        <p>\\n          Grafana cannot find an image renderer to capture an image for the notification.\\n          Please make sure the <a href=https://grafana.com/grafana/plugins/grafana-image-renderer target=_blank rel=noreferrer>Grafana Image Renderer plugin</a> is installed.\\n        </p>\\n        <p>\\n          Please contact your Grafana administrator to install the plugin.\\n        </p>\\n      </div>\\n      <gf-form-switch class=gf-form label=\\\"Disable Resolve Message\\\" label-class=width-14 checked=ctrl.model.disableResolveMessage tooltip=\\\"Disable the resolve message [OK] that is sent when alerting state returns to false\\\">\\n      </gf-form-switch>\\n      <gf-form-switch class=gf-form label=\\\"Send reminders\\\" label-class=width-14 checked=ctrl.model.sendReminder tooltip=\\\"Send additional notifications for triggered alerts\\\">\\n      </gf-form-switch>\\n      <div class=gf-form-inline>\\n        <div class=gf-form ng-if=ctrl.model.sendReminder>\\n          <span class=\\\"gf-form-label width-12\\\">Send reminder every\\n            <info-popover mode=right-normal position=\\\"top center\\\">\\n              Specify how often reminders should be sent, e.g. every 30s, 1m, 10m, 30m or 1h etc.\\n            </info-popover>\\n          </span>\\n          <input type=text placeholder=\\\"Select or specify custom\\\" class=\\\"gf-form-input width-15\\\" ng-model=ctrl.model.frequency bs-typeahead=ctrl.getFrequencySuggestion data-min-length=0 ng-required=ctrl.model.sendReminder>\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n          <span class=\\\"alert alert-info width-30\\\" ng-if=ctrl.model.sendReminder>\\n            Alert reminders are sent after rules are evaluated. Therefore a reminder can never be sent more frequently than a configured alert rule evaluation interval.\\n          </span>\\n        </div>\\n    </div>\\n\\n    <div class=gf-form-group ng-include src=ctrl.notifierTemplateId>\\n    </div>\\n\\n    <div class=\\\"gf-form-group gf-form-button-row\\\">\\n\\t\\t\\t<button type=submit ng-click=ctrl.save() class=\\\"btn btn-primary width-7\\\">Save</button>\\n\\t\\t\\t<button type=submit ng-click=ctrl.testNotification() class=\\\"btn btn-secondary\\\">Send Test</button>\\n\\t\\t\\t<button type=delete ng-if=!ctrl.isNew ng-click=ctrl.deleteNotification() class=\\\"btn btn-danger width-7\\\">Delete</button>\\n\\t\\t\\t<a href=alerting/notifications class=\\\"btn btn-inverse\\\">Back</a>\\n    </div>\\n  </form>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash';\n\nimport coreModule from 'app/core/core_module';\nimport appEvents from 'app/core/app_events';\nimport { getExploreUrl } from 'app/core/utils/explore';\nimport { store } from 'app/store/store';\nimport { AppEventEmitter, CoreEvents } from 'app/types';\n\nimport Mousetrap from 'mousetrap';\nimport 'mousetrap-global-bind';\nimport { ContextSrv } from './context_srv';\nimport { ILocationService, IRootScopeService, ITimeoutService } from 'angular';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { DashboardModel } from '../../features/dashboard/state';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { SaveDashboardModalProxy } from '../../features/dashboard/components/SaveDashboard/SaveDashboardModalProxy';\nimport { locationUtil } from '@grafana/data';\n\nexport class KeybindingSrv {\n  helpModal: boolean;\n  modalOpen = false;\n  timepickerOpen = false;\n\n  /** @ngInject */\n  constructor(\n    private $rootScope: GrafanaRootScope,\n    private $location: ILocationService,\n    private $timeout: ITimeoutService,\n    private datasourceSrv: any,\n    private timeSrv: any,\n    private contextSrv: ContextSrv\n  ) {\n    // clear out all shortcuts on route change\n    $rootScope.$on('$routeChangeSuccess', () => {\n      Mousetrap.reset();\n      // rebind global shortcuts\n      this.setupGlobal();\n    });\n\n    this.setupGlobal();\n    appEvents.on(CoreEvents.showModal, () => (this.modalOpen = true));\n    appEvents.on(CoreEvents.timepickerOpen, () => (this.timepickerOpen = true));\n    appEvents.on(CoreEvents.timepickerClosed, () => (this.timepickerOpen = false));\n  }\n\n  setupGlobal() {\n    if (!(this.$location.path() === '/login')) {\n      this.bind(['?', 'h'], this.showHelpModal);\n      this.bind('g h', this.goToHome);\n      this.bind('g a', this.openAlerting);\n      this.bind('g p', this.goToProfile);\n      this.bind('s o', this.openSearch);\n      this.bind('f', this.openSearch);\n      this.bind('esc', this.exit);\n      this.bindGlobal('esc', this.globalEsc);\n    }\n  }\n\n  globalEsc() {\n    const anyDoc = document as any;\n    const activeElement = anyDoc.activeElement;\n\n    // typehead needs to handle it\n    const typeaheads = document.querySelectorAll('.slate-typeahead--open');\n    if (typeaheads.length > 0) {\n      return;\n    }\n\n    // second check if we are in an input we can blur\n    if (activeElement && activeElement.blur) {\n      if (\n        activeElement.nodeName === 'INPUT' ||\n        activeElement.nodeName === 'TEXTAREA' ||\n        activeElement.hasAttribute('data-slate-editor')\n      ) {\n        anyDoc.activeElement.blur();\n        return;\n      }\n    }\n\n    // ok no focused input or editor that should block this, let exist!\n    this.exit();\n  }\n\n  openSearch() {\n    const search = _.extend(this.$location.search(), { search: 'open' });\n    this.$location.search(search);\n  }\n\n  closeSearch() {\n    const search = _.extend(this.$location.search(), { search: null });\n    this.$location.search(search);\n  }\n\n  openAlerting() {\n    this.$location.url('/alerting');\n  }\n\n  goToHome() {\n    this.$location.url('/');\n  }\n\n  goToProfile() {\n    this.$location.url('/profile');\n  }\n\n  showHelpModal() {\n    appEvents.emit(CoreEvents.showModal, { templateHtml: '<help-modal></help-modal>' });\n  }\n\n  exit() {\n    appEvents.emit(CoreEvents.hideModal);\n\n    if (this.modalOpen) {\n      this.modalOpen = false;\n      return;\n    }\n\n    if (this.timepickerOpen) {\n      this.$rootScope.appEvent(CoreEvents.closeTimepicker);\n      this.timepickerOpen = false;\n      return;\n    }\n\n    // close settings view\n    const search = this.$location.search();\n    if (search.editview) {\n      delete search.editview;\n      this.$location.search(search);\n      return;\n    }\n\n    if (search.inspect) {\n      delete search.inspect;\n      delete search.inspectTab;\n      this.$location.search(search);\n      return;\n    }\n\n    if (search.editPanel) {\n      delete search.editPanel;\n      delete search.tab;\n      this.$location.search(search);\n      return;\n    }\n\n    if (search.viewPanel) {\n      delete search.viewPanel;\n      this.$location.search(search);\n      return;\n    }\n\n    if (search.kiosk) {\n      this.$rootScope.appEvent(CoreEvents.toggleKioskMode, { exit: true });\n    }\n\n    if (search.search) {\n      this.closeSearch();\n    }\n  }\n\n  bind(keyArg: string | string[], fn: () => void) {\n    Mousetrap.bind(\n      keyArg,\n      (evt: any) => {\n        evt.preventDefault();\n        evt.stopPropagation();\n        evt.returnValue = false;\n        return this.$rootScope.$apply(fn.bind(this));\n      },\n      'keydown'\n    );\n  }\n\n  bindGlobal(keyArg: string, fn: () => void) {\n    Mousetrap.bindGlobal(\n      keyArg,\n      (evt: any) => {\n        evt.preventDefault();\n        evt.stopPropagation();\n        evt.returnValue = false;\n        return this.$rootScope.$apply(fn.bind(this));\n      },\n      'keydown'\n    );\n  }\n\n  unbind(keyArg: string, keyType?: string) {\n    Mousetrap.unbind(keyArg, keyType);\n  }\n\n  showDashEditView() {\n    const search = _.extend(this.$location.search(), { editview: 'settings' });\n    this.$location.search(search);\n  }\n\n  setupDashboardBindings(scope: IRootScopeService & AppEventEmitter, dashboard: DashboardModel) {\n    this.bind('mod+o', () => {\n      dashboard.graphTooltip = (dashboard.graphTooltip + 1) % 3;\n      appEvents.emit(CoreEvents.graphHoverClear);\n      dashboard.startRefresh();\n    });\n\n    this.bind('mod+s', () => {\n      appEvents.emit(CoreEvents.showModalReact, {\n        component: SaveDashboardModalProxy,\n        props: {\n          dashboard,\n        },\n      });\n    });\n\n    this.bind('t z', () => {\n      scope.appEvent(CoreEvents.zoomOut, 2);\n    });\n\n    this.bind('ctrl+z', () => {\n      scope.appEvent(CoreEvents.zoomOut, 2);\n    });\n\n    this.bind('t left', () => {\n      scope.appEvent(CoreEvents.shiftTime, -1);\n    });\n\n    this.bind('t right', () => {\n      scope.appEvent(CoreEvents.shiftTime, 1);\n    });\n\n    // edit panel\n    this.bind('e', () => {\n      if (dashboard.canEditPanelById(dashboard.meta.focusPanelId)) {\n        const search = _.extend(this.$location.search(), { editPanel: dashboard.meta.focusPanelId });\n        this.$location.search(search);\n      }\n    });\n\n    // view panel\n    this.bind('v', () => {\n      if (dashboard.meta.focusPanelId) {\n        const search = _.extend(this.$location.search(), { viewPanel: dashboard.meta.focusPanelId });\n        this.$location.search(search);\n      }\n    });\n\n    this.bind('i', () => {\n      if (dashboard.meta.focusPanelId) {\n        const search = _.extend(this.$location.search(), { inspect: dashboard.meta.focusPanelId });\n        this.$location.search(search);\n      }\n    });\n\n    // jump to explore if permissions allow\n    if (this.contextSrv.hasAccessToExplore()) {\n      this.bind('x', async () => {\n        if (dashboard.meta.focusPanelId) {\n          const panel = dashboard.getPanelById(dashboard.meta.focusPanelId);\n          const datasource = await this.datasourceSrv.get(panel.datasource);\n          const url = await getExploreUrl({\n            panel,\n            panelTargets: panel.targets,\n            panelDatasource: datasource,\n            datasourceSrv: this.datasourceSrv,\n            timeSrv: this.timeSrv,\n          });\n          const urlWithoutBase = locationUtil.stripBaseFromUrl(url);\n\n          if (urlWithoutBase) {\n            this.$timeout(() => this.$location.url(urlWithoutBase));\n          }\n        }\n      });\n    }\n\n    // delete panel\n    this.bind('p r', () => {\n      if (dashboard.canEditPanelById(dashboard.meta.focusPanelId)) {\n        appEvents.emit(CoreEvents.removePanel, dashboard.meta.focusPanelId);\n        dashboard.meta.focusPanelId = 0;\n      }\n    });\n\n    // duplicate panel\n    this.bind('p d', () => {\n      if (dashboard.canEditPanelById(dashboard.meta.focusPanelId)) {\n        const panelIndex = dashboard.getPanelInfoById(dashboard.meta.focusPanelId).index;\n        dashboard.duplicatePanel(dashboard.panels[panelIndex]);\n      }\n    });\n\n    // share panel\n    this.bind('p s', () => {\n      if (dashboard.meta.focusPanelId) {\n        const panelInfo = dashboard.getPanelInfoById(dashboard.meta.focusPanelId);\n\n        appEvents.emit(CoreEvents.showModalReact, {\n          component: ShareModal,\n          props: {\n            dashboard: dashboard,\n            panel: panelInfo?.panel,\n          },\n        });\n      }\n    });\n\n    // toggle panel legend\n    this.bind('p l', () => {\n      if (dashboard.meta.focusPanelId) {\n        const panelInfo = dashboard.getPanelInfoById(dashboard.meta.focusPanelId);\n        if (panelInfo.panel.legend) {\n          const panelRef = dashboard.getPanelById(dashboard.meta.focusPanelId);\n          panelRef.legend.show = !panelRef.legend.show;\n          panelRef.render();\n        }\n      }\n    });\n\n    // toggle all panel legends\n    this.bind('d l', () => {\n      dashboard.toggleLegendsForAll();\n    });\n\n    // collapse all rows\n    this.bind('d shift+c', () => {\n      dashboard.collapseRows();\n    });\n\n    // expand all rows\n    this.bind('d shift+e', () => {\n      dashboard.expandRows();\n    });\n\n    this.bind('d n', () => {\n      this.$location.url('/dashboard/new');\n    });\n\n    this.bind('d r', () => {\n      dashboard.startRefresh();\n    });\n\n    this.bind('d s', () => {\n      this.showDashEditView();\n    });\n\n    this.bind('d k', () => {\n      appEvents.emit(CoreEvents.toggleKioskMode);\n    });\n\n    this.bind('d v', () => {\n      appEvents.emit(CoreEvents.toggleViewMode);\n    });\n\n    //Autofit panels\n    this.bind('d a', () => {\n      // this has to be a full page reload\n      const queryParams = store.getState().location.query;\n      const newUrlParam = queryParams.autofitpanels ? '' : '&autofitpanels';\n      window.location.href = window.location.href + newUrlParam;\n    });\n  }\n}\n\ncoreModule.service('keybindingSrv', KeybindingSrv);\n\n/**\n * Code below exports the service to react components\n */\n\nlet singletonInstance: KeybindingSrv;\n\nexport function setKeybindingSrv(instance: KeybindingSrv) {\n  singletonInstance = instance;\n}\n\nexport function getKeybindingSrv(): KeybindingSrv {\n  return singletonInstance;\n}\n","// Libraries\nimport sortBy from 'lodash/sortBy';\nimport coreModule from 'app/core/core_module';\n// Services & Utils\nimport config from 'app/core/config';\nimport { importDataSourcePlugin } from './plugin_loader';\nimport { DataSourceSrv as DataSourceService, getDataSourceSrv as getDataSourceService } from '@grafana/runtime';\n// Types\nimport { AppEvents, DataSourceApi, DataSourceInstanceSettings, DataSourceSelectItem, ScopedVars } from '@grafana/data';\nimport { auto } from 'angular';\nimport { TemplateSrv } from '../templating/template_srv';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n// Pretend Datasource\nimport { expressionDatasource } from 'app/features/expressions/ExpressionDatasource';\nimport { DataSourceVariableModel } from '../templating/types';\n\nexport class DatasourceSrv implements DataSourceService {\n  datasources: Record<string, DataSourceApi> = {};\n\n  /** @ngInject */\n  constructor(\n    private $injector: auto.IInjectorService,\n    private $rootScope: GrafanaRootScope,\n    private templateSrv: TemplateSrv\n  ) {\n    this.init();\n  }\n\n  init() {\n    this.datasources = {};\n  }\n\n  getDataSourceSettingsByUid(uid: string): DataSourceInstanceSettings | undefined {\n    return Object.values(config.datasources).find(ds => ds.uid === uid);\n  }\n\n  get(name?: string, scopedVars?: ScopedVars): Promise<DataSourceApi> {\n    if (!name) {\n      return this.get(config.defaultDatasource);\n    }\n\n    // Interpolation here is to support template variable in data source selection\n    name = this.templateSrv.replace(name, scopedVars, (value: any[]) => {\n      if (Array.isArray(value)) {\n        return value[0];\n      }\n      return value;\n    });\n\n    if (name === 'default') {\n      return this.get(config.defaultDatasource);\n    }\n\n    if (this.datasources[name]) {\n      return Promise.resolve(this.datasources[name]);\n    }\n\n    return this.loadDatasource(name);\n  }\n\n  async loadDatasource(name: string): Promise<DataSourceApi<any, any>> {\n    // Expression Datasource (not a real datasource)\n    if (name === expressionDatasource.name) {\n      this.datasources[name] = expressionDatasource as any;\n      return Promise.resolve(expressionDatasource);\n    }\n\n    const dsConfig = config.datasources[name];\n    if (!dsConfig) {\n      return Promise.reject({ message: `Datasource named ${name} was not found` });\n    }\n\n    try {\n      const dsPlugin = await importDataSourcePlugin(dsConfig.meta);\n      // check if its in cache now\n      if (this.datasources[name]) {\n        return this.datasources[name];\n      }\n\n      // If there is only one constructor argument it is instanceSettings\n      const useAngular = dsPlugin.DataSourceClass.length !== 1;\n      const instance: DataSourceApi = useAngular\n        ? this.$injector.instantiate(dsPlugin.DataSourceClass, {\n            instanceSettings: dsConfig,\n          })\n        : new dsPlugin.DataSourceClass(dsConfig);\n\n      instance.components = dsPlugin.components;\n      instance.meta = dsConfig.meta;\n\n      // store in instance cache\n      this.datasources[name] = instance;\n      return instance;\n    } catch (err) {\n      this.$rootScope.appEvent(AppEvents.alertError, [dsConfig.name + ' plugin failed', err.toString()]);\n      return Promise.reject({ message: `Datasource named ${name} was not found` });\n    }\n  }\n\n  getAll(): DataSourceInstanceSettings[] {\n    const { datasources } = config;\n    return Object.keys(datasources).map(name => datasources[name]);\n  }\n\n  getExternal(): DataSourceInstanceSettings[] {\n    const datasources = this.getAll().filter(ds => !ds.meta.builtIn);\n    return sortBy(datasources, ['name']);\n  }\n\n  getAnnotationSources() {\n    const sources: any[] = [];\n\n    this.addDataSourceVariables(sources);\n\n    Object.values(config.datasources).forEach(value => {\n      if (value.meta?.annotations) {\n        sources.push(value);\n      }\n    });\n\n    return sources;\n  }\n\n  getMetricSources(options?: { skipVariables?: boolean }) {\n    const metricSources: DataSourceSelectItem[] = [];\n\n    Object.entries(config.datasources).forEach(([key, value]) => {\n      if (value.meta?.metrics) {\n        let metricSource = { value: key, name: key, meta: value.meta, sort: key };\n\n        //Make sure grafana and mixed are sorted at the bottom\n        if (value.meta.id === 'grafana') {\n          metricSource.sort = String.fromCharCode(253);\n        } else if (value.meta.id === 'dashboard') {\n          metricSource.sort = String.fromCharCode(254);\n        } else if (value.meta.id === 'mixed') {\n          metricSource.sort = String.fromCharCode(255);\n        }\n\n        metricSources.push(metricSource);\n\n        if (key === config.defaultDatasource) {\n          metricSource = { value: null, name: 'default', meta: value.meta, sort: key };\n          metricSources.push(metricSource);\n        }\n      }\n    });\n\n    if (!options || !options.skipVariables) {\n      this.addDataSourceVariables(metricSources);\n    }\n\n    metricSources.sort((a, b) => {\n      if (a.sort.toLowerCase() > b.sort.toLowerCase()) {\n        return 1;\n      }\n      if (a.sort.toLowerCase() < b.sort.toLowerCase()) {\n        return -1;\n      }\n      return 0;\n    });\n\n    return metricSources;\n  }\n\n  addDataSourceVariables(list: any[]) {\n    // look for data source variables\n    this.templateSrv\n      .getVariables()\n      .filter(variable => variable.type === 'datasource')\n      .forEach((variable: DataSourceVariableModel) => {\n        const first = variable.current.value === 'default' ? config.defaultDatasource : variable.current.value;\n        const index = (first as unknown) as string;\n        const ds = config.datasources[index];\n\n        if (ds) {\n          const key = `$${variable.name}`;\n          list.push({\n            name: key,\n            value: key,\n            meta: ds.meta,\n            sort: key,\n          });\n        }\n      });\n  }\n}\n\nexport const getDatasourceSrv = (): DatasourceSrv => {\n  return getDataSourceService() as DatasourceSrv;\n};\n\ncoreModule.service('datasourceSrv', DatasourceSrv);\nexport default DatasourceSrv;\n","var path = 'public/app/features/datasources/partials/http_settings_next.html';\nvar html = \"<datasource-http-settings-next on-change=onChange datasourceconfig=current showaccessoptions=showAccessOption defaulturl=suggestUrl />\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { FC } from 'react';\nimport { RadioButtonGroup } from '@grafana/ui';\n\nexport type LayoutMode = LayoutModes.Grid | LayoutModes.List;\n\nexport enum LayoutModes {\n  Grid = 'grid',\n  List = 'list',\n}\n\ninterface Props {\n  mode: LayoutMode;\n  onLayoutModeChanged: (mode: LayoutMode) => {};\n}\n\nconst options = [\n  { icon: 'table', value: LayoutModes.Grid },\n  { icon: 'list-ul', value: LayoutModes.List },\n];\n\nconst LayoutSelector: FC<Props> = ({ mode, onLayoutModeChanged }) => (\n  <div className=\"layout-selector\">\n    <RadioButtonGroup value={mode} options={options} onChange={onLayoutModeChanged} />\n  </div>\n);\n\nexport default LayoutSelector;\n","import React, { FC, useCallback, CSSProperties } from 'react';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { useTheme, TagList, styleMixins, stylesFactory } from '@grafana/ui';\nimport { DashboardSectionItem, OnToggleChecked } from '../types';\nimport { SearchCheckbox } from './SearchCheckbox';\nimport { SEARCH_ITEM_HEIGHT, SEARCH_ITEM_MARGIN } from '../constants';\n\nexport interface Props {\n  item: DashboardSectionItem;\n  editable?: boolean;\n  onTagSelected: (name: string) => any;\n  onToggleChecked?: OnToggleChecked;\n  style?: CSSProperties;\n}\n\nconst selectors = e2eSelectors.pages.Dashboards;\n\nexport const SearchItem: FC<Props> = ({ item, editable, onToggleChecked, onTagSelected, style }) => {\n  const theme = useTheme();\n  const styles = getResultsItemStyles(theme);\n\n  const tagSelected = useCallback((tag: string, event: React.MouseEvent<HTMLElement>) => {\n    onTagSelected(tag);\n  }, []);\n\n  const toggleItem = useCallback(\n    (event: React.MouseEvent) => {\n      event.preventDefault();\n      if (onToggleChecked) {\n        onToggleChecked(item);\n      }\n    },\n    [item]\n  );\n\n  return (\n    <div\n      style={style}\n      aria-label={selectors.dashboards(item.title)}\n      className={cx(styles.wrapper, { [styles.selected]: item.selected })}\n    >\n      <SearchCheckbox editable={editable} checked={item.checked} onClick={toggleItem} />\n\n      <a href={item.url} className={styles.link}>\n        <div className={styles.body}>\n          <span>{item.title}</span>\n          <span className={styles.folderTitle}>{item.folderTitle}</span>\n        </div>\n      </a>\n      <TagList tags={item.tags} onClick={tagSelected} className={styles.tags} />\n    </div>\n  );\n};\n\nconst getResultsItemStyles = stylesFactory((theme: GrafanaTheme) => ({\n  wrapper: css`\n    ${styleMixins.listItem(theme)};\n    display: flex;\n    align-items: center;\n    height: ${SEARCH_ITEM_HEIGHT}px;\n    margin-bottom: ${SEARCH_ITEM_MARGIN}px;\n    padding: 0 ${theme.spacing.md};\n\n    &:last-child {\n      margin-bottom: ${SEARCH_ITEM_MARGIN * 2}px;\n    }\n\n    :hover {\n      cursor: pointer;\n    }\n  `,\n  selected: css`\n    ${styleMixins.listItemSelected(theme)};\n  `,\n  body: css`\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    flex: 1 1 auto;\n    overflow: hidden;\n  `,\n  folderTitle: css`\n    color: ${theme.colors.textWeak};\n    font-size: ${theme.typography.size.xs};\n    line-height: ${theme.typography.lineHeight.xs};\n    position: relative;\n    top: -1px;\n  `,\n  icon: css`\n    margin-left: 10px;\n  `,\n  tags: css`\n    flex-grow: 0;\n    justify-content: flex-end;\n    @media only screen and (max-width: ${theme.breakpoints.md}) {\n      display: none;\n    }\n  `,\n  link: css`\n    display: flex;\n    align-items: center;\n    flex-shrink: 0;\n    flex-grow: 1;\n    height: 100%;\n  `,\n}));\n","import { LocationState } from 'app/types';\n\nexport const getRouteParamsId = (state: LocationState) => state.routeParams.id;\nexport const getRouteParamsPage = (state: LocationState) => state.routeParams.page;\nexport const getRouteParams = (state: LocationState) => state.routeParams;\nexport const getLocationQuery = (state: LocationState) => state.query;\nexport const getUrl = (state: LocationState) => state.url;\n","var path = 'public/app/features/plugins/partials/update_instructions.html';\nvar html = \"<div class=modal-body>\\n\\t<div class=modal-header>\\n\\t\\t<h2 class=modal-header-title>\\n\\t\\t\\t<icon name=\\\"'cloud-download'\\\" size=\\\"'lg'\\\"></icon>\\n\\t\\t\\t<span class=p-l-1>Update Plugin</span>\\n\\t\\t</h2>\\n\\n\\t\\t<a class=modal-header-close ng-click=dismiss();>\\n\\t\\t\\t<icon name=\\\"'times'\\\"></icon>\\n\\t\\t</a>\\n\\t</div>\\n\\n\\t<div class=modal-content>\\n\\t\\t<div class=gf-form-group>\\n\\t\\t\\t<p>Type the following on the command line to update {{model.name}}.</p>\\n\\t\\t\\t<pre><code>grafana-cli plugins update {{model.id}}</code></pre>\\n\\t\\t\\t<span class=small>Check out {{model.name}} on <a href=https://grafana.com/plugins/{{model.id}}>Grafana.com</a> for README and changelog. If you do not have access to the command line, ask your Grafana administator.</span>\\n\\t\\t</div>\\n\\t\\t<p class=pluginlist-none-installed><img class=pluginlist-inline-logo src=public/img/grafana_icon.svg><strong>Pro tip</strong>: To update all plugins at once, type <code class=code--small>grafana-cli plugins update-all</code> on the command line.</p></div>\\n\\t</div>\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { Emitter } from './utils/emitter';\n\nexport const appEvents = new Emitter();\n\nexport default appEvents;\n","var path = 'public/app/features/panel/partials/general_tab.html';\nvar html = \"<div class=panel-options-group>\\n  <!-- <div class=\\\"panel&#45;option&#45;section__header\\\">Information</div> -->\\n  <div class=panel-options-group__body>\\n    <div class=section>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-7\\\">Title</span>\\n        <input type=text class=\\\"gf-form-input width-25\\\" ng-model=ctrl.panel.title ng-model-onblur>\\n      </div>\\n      <gf-form-switch class=gf-form label-class=width-7 switch-class=max-width-6 label=Transparent checked=ctrl.panel.transparent on-change=ctrl.render()></gf-form-switch>\\n    </div>\\n    <div class=section>\\n      <div class=\\\"gf-form gf-form--v-stretch\\\">\\n        <span class=\\\"gf-form-label width-7\\\">Description</span>\\n        <textarea class=\\\"gf-form-input width-25\\\" rows=5 ng-model=ctrl.panel.description ng-model-onblur placeholder=\\\"Panel description, supports markdown & links\\\"></textarea>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=panel-options-group>\\n  <div class=panel-options-group__header>\\n    <div class=panel-options-group__title>Repeating</div>\\n  </div>\\n  <div class=panel-options-group__body>\\n    <div class=section>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-9\\\">Repeat</span>\\n        <dash-repeat-option panel=ctrl.panel></dash-repeat-option>\\n      </div>\\n      <div class=gf-form ng-show=ctrl.panel.repeat>\\n        <span class=\\\"gf-form-label width-9\\\">Direction</span>\\n        <select class=gf-form-input ng-model=ctrl.panel.repeatDirection ng-options=\\\"f.value as f.text for f in [{value: 'v', text: 'Vertical'}, {value: 'h', text: 'Horizontal'}]\\\">\\n          <option value=\\\"\\\"></option>\\n        </select>\\n      </div>\\n      <div class=gf-form ng-show=\\\"ctrl.panel.repeat && ctrl.panel.repeatDirection == 'h'\\\">\\n        <span class=\\\"gf-form-label width-9\\\">Max per row</span>\\n        <select class=gf-form-input ng-model=ctrl.panel.maxPerRow ng-options=\\\"f for f in [2,3,4,6,12,24]\\\">\\n          <option value=\\\"\\\"></option>\\n        </select>\\n      </div>\\n      <div class=gf-form-hint>\\n        <div class=\\\"gf-form-hint-text muted\\\">\\n          Note: You may need to change the variable selection to see this in action.\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { FC } from 'react';\nimport { OrgRole } from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\ninterface Props {\n  value: OrgRole;\n  onChange: (role: OrgRole) => void;\n}\n\nconst options = Object.keys(OrgRole).map(key => ({ label: key, value: key }));\n\nexport const OrgRolePicker: FC<Props> = ({ value, onChange, ...restProps }) => (\n  <Select\n    value={value}\n    options={options}\n    onChange={val => onChange(val.value as OrgRole)}\n    placeholder=\"Choose role...\"\n    {...restProps}\n  />\n);\n","export { ShareModal, addDashboardShareTab, addPanelShareTab } from './ShareModal';\nexport * from './types';\n","export class Edge {\n  inputNode: Node;\n  outputNode: Node;\n\n  _linkTo(node: Node, direction: number) {\n    if (direction <= 0) {\n      node.inputEdges.push(this);\n    }\n\n    if (direction >= 0) {\n      node.outputEdges.push(this);\n    }\n\n    node.edges.push(this);\n  }\n\n  link(inputNode: Node, outputNode: Node) {\n    if (!inputNode) {\n      throw Error('inputNode is required');\n    }\n\n    if (!outputNode) {\n      throw Error('outputNode is required');\n    }\n\n    this.unlink();\n    this.inputNode = inputNode;\n    this.outputNode = outputNode;\n\n    this._linkTo(inputNode, 1);\n    this._linkTo(outputNode, -1);\n    return this;\n  }\n\n  unlink() {\n    let pos;\n    const inode = this.inputNode;\n    const onode = this.outputNode;\n\n    if (!(inode && onode)) {\n      return;\n    }\n\n    pos = inode.edges.indexOf(this);\n    if (pos > -1) {\n      inode.edges.splice(pos, 1);\n    }\n\n    pos = onode.edges.indexOf(this);\n    if (pos > -1) {\n      onode.edges.splice(pos, 1);\n    }\n\n    pos = inode.outputEdges.indexOf(this);\n    if (pos > -1) {\n      inode.outputEdges.splice(pos, 1);\n    }\n\n    pos = onode.inputEdges.indexOf(this);\n    if (pos > -1) {\n      onode.inputEdges.splice(pos, 1);\n    }\n\n    this.inputNode = null;\n    this.outputNode = null;\n  }\n}\n\nexport class Node {\n  name: string;\n  edges: Edge[];\n  inputEdges: Edge[];\n  outputEdges: Edge[];\n\n  constructor(name: string) {\n    this.name = name;\n    this.edges = [];\n    this.inputEdges = [];\n    this.outputEdges = [];\n  }\n\n  getEdgeFrom(from: string | Node): Edge {\n    if (!from) {\n      return null;\n    }\n\n    if (typeof from === 'object') {\n      return this.inputEdges.find(e => e.inputNode.name === from.name);\n    }\n\n    return this.inputEdges.find(e => e.inputNode.name === from);\n  }\n\n  getEdgeTo(to: string | Node): Edge {\n    if (!to) {\n      return null;\n    }\n\n    if (typeof to === 'object') {\n      return this.outputEdges.find(e => e.outputNode.name === to.name);\n    }\n\n    return this.outputEdges.find(e => e.outputNode.name === to);\n  }\n\n  getOptimizedInputEdges(): Edge[] {\n    const toBeRemoved: any[] = [];\n    this.inputEdges.forEach(e => {\n      const inputEdgesNodes = e.inputNode.inputEdges.map(e => e.inputNode);\n\n      inputEdgesNodes.forEach(n => {\n        const edgeToRemove = n.getEdgeTo(this.name);\n        if (edgeToRemove) {\n          toBeRemoved.push(edgeToRemove);\n        }\n      });\n    });\n\n    return this.inputEdges.filter(e => toBeRemoved.indexOf(e) === -1);\n  }\n}\n\nexport class Graph {\n  nodes: any = {};\n\n  constructor() {}\n\n  createNode(name: string): Node {\n    const n = new Node(name);\n    this.nodes[name] = n;\n    return n;\n  }\n\n  createNodes(names: string[]): Node[] {\n    const nodes: Node[] = [];\n    names.forEach(name => {\n      nodes.push(this.createNode(name));\n    });\n    return nodes;\n  }\n\n  link(input: string | string[] | Node | Node[], output: string | string[] | Node | Node[]): Edge[] {\n    let inputArr = [];\n    let outputArr = [];\n    const inputNodes: Node[] = [];\n    const outputNodes: Node[] = [];\n\n    if (input instanceof Array) {\n      inputArr = input;\n    } else {\n      inputArr = [input];\n    }\n\n    if (output instanceof Array) {\n      outputArr = output;\n    } else {\n      outputArr = [output];\n    }\n\n    for (let n = 0; n < inputArr.length; n++) {\n      const i = inputArr[n];\n      if (typeof i === 'string') {\n        const n = this.getNode(i);\n        if (!n) {\n          throw Error(`cannot link input node named ${i} since it doesn't exist in graph`);\n        }\n        inputNodes.push(n);\n      } else {\n        inputNodes.push(i);\n      }\n    }\n\n    for (let n = 0; n < outputArr.length; n++) {\n      const i = outputArr[n];\n      if (typeof i === 'string') {\n        const n = this.getNode(i);\n        if (!n) {\n          throw Error(`cannot link output node named ${i} since it doesn't exist in graph`);\n        }\n        outputNodes.push(n);\n      } else {\n        outputNodes.push(i);\n      }\n    }\n\n    const edges: Edge[] = [];\n    inputNodes.forEach(input => {\n      outputNodes.forEach(output => {\n        edges.push(this.createEdge().link(input, output));\n      });\n    });\n    return edges;\n  }\n\n  createEdge(): Edge {\n    return new Edge();\n  }\n\n  getNode(name: string): Node {\n    return this.nodes[name];\n  }\n}\n\nexport const printGraph = (g: Graph) => {\n  Object.keys(g.nodes).forEach(name => {\n    const n = g.nodes[name];\n    let outputEdges = n.outputEdges.map((e: Edge) => e.outputNode.name).join(', ');\n    if (!outputEdges) {\n      outputEdges = '<none>';\n    }\n    let inputEdges = n.inputEdges.map((e: Edge) => e.inputNode.name).join(', ');\n    if (!inputEdges) {\n      inputEdges = '<none>';\n    }\n    console.log(`${n.name}:\\n - links to:   ${outputEdges}\\n - links from: ${inputEdges}`);\n  });\n};\n","var path = 'public/app/partials/reset_password.html';\nvar html = \"<page-header model=navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\t<div class=signup>\\n\\t\\t<h3 class=p-b-1>Reset password</h3>\\n\\n\\t\\t<div ng-if=\\\"ldapEnabled || authProxyEnabled\\\">\\n\\t\\t\\tYou cannot reset password when LDAP or Auth Proxy authentication is enabled.\\n\\t\\t</div>\\n\\t\\t<div ng-if=disableLoginForm>\\n\\t\\t\\tYou cannot reset password when login form is disabled.\\n\\t\\t</div>\\n\\t\\t<form name=sendResetForm class=\\\"login-form gf-form-group\\\" ng-show=\\\"mode === 'send'\\\" ng-hide=\\\"ldapEnabled || authProxyEnabled || disableLoginForm || mode === 'reset'\\\">\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">User</span>\\n\\t\\t\\t\\t\\t<input type=text name=username class=\\\"gf-form-input max-width-14\\\" required ng-model=formModel.userOrEmail placeholder=\\\"email or username\\\">\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=gf-form-button-row>\\n\\t\\t\\t\\t<button type=submit class=\\\"btn btn-primary\\\" ng-click=sendResetEmail(); ng-disabled=!sendResetForm.$valid>\\n\\t\\t\\t\\t\\tReset Password\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t\\t<a href=login class=\\\"btn btn-inverse\\\">\\n\\t\\t\\t\\t\\tBack\\n\\t\\t\\t\\t</a>\\n\\n\\t\\t\\t</div>\\n\\t\\t</form>\\n\\t\\t<div ng-show=\\\"mode === 'email-sent'\\\">\\n\\t\\t\\tAn email with a reset link has been sent to the email address. <br>\\n\\t\\t\\tYou should receive it shortly.\\n\\t\\t\\t<div class=p-t-1>\\n\\t\\t\\t\\t<a href=login class=\\\"btn btn-primary p-t-1\\\">\\n\\t\\t\\t\\t\\tLogin\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<form name=resetForm class=\\\"login-form gf-form-group\\\" ng-show=\\\"mode === 'reset'\\\">\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-9\\\">New Password</span>\\n\\t\\t\\t\\t<input type=password name=NewPassword class=\\\"gf-form-input max-width-14\\\" required ng-minlength=4 ng-model=formModel.newPassword placeholder=password watch-change=\\\"formModel.newPassword = inputValue;\\\">\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-9\\\">Confirm Password</span>\\n\\t\\t\\t\\t<input type=password name=ConfirmPassword class=\\\"gf-form-input max-width-14\\\" required ng-minlength=4 ng-model=formModel.confirmPassword placeholder=\\\"confirm password\\\">\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=signup__password-strength>\\n\\t\\t\\t\\t<password-strength password=formModel.newPassword></password-strength>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=gf-form-button-row>\\n\\t\\t\\t\\t<button type=submit class=\\\"btn btn-primary\\\" ng-click=submitReset(); ng-disabled=!resetForm.$valid>\\n\\t\\t\\t\\t\\tReset Password\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t</div>\\n\\t\\t</form>\\n\\t</div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { PayloadAction } from '@reduxjs/toolkit';\nimport { cleanUpDashboard } from '../../dashboard/state/reducers';\nimport { variableAdapters } from '../adapters';\nimport { sharedReducer } from './sharedReducer';\nimport { VariableModel } from '../../templating/types';\nimport { VariablePayload } from './types';\n\nexport interface VariablesState extends Record<string, VariableModel> {}\n\nexport const initialVariablesState: VariablesState = {};\n\nexport const variablesReducer = (\n  state: VariablesState = initialVariablesState,\n  action: PayloadAction<VariablePayload>\n): VariablesState => {\n  if (cleanUpDashboard.match(action)) {\n    const globalVariables = Object.values(state).filter(v => v.global);\n    if (!globalVariables) {\n      return initialVariablesState;\n    }\n\n    const variables = globalVariables.reduce((allVariables, state) => {\n      allVariables[state.id!] = state;\n      return allVariables;\n    }, {} as Record<string, VariableModel>);\n\n    return variables;\n  }\n\n  if (action?.payload?.type && variableAdapters.getIfExists(action?.payload?.type)) {\n    // Now that we know we are dealing with a payload that is addressed for an adapted variable let's reduce state:\n    // Firstly call the sharedTemplatingReducer that handles all shared actions between variable types\n    // Secondly call the specific variable type's reducer\n    return variableAdapters.get(action.payload.type).reducer(sharedReducer(state, action), action);\n  }\n\n  return state;\n};\n","import React, { FC } from 'react';\nimport { Button, LinkButton, Input, Form, Field } from '@grafana/ui';\nimport { css } from 'emotion';\n\nimport { getConfig } from 'app/core/config';\nimport { getBackendSrv } from '@grafana/runtime';\n\ninterface SignupFormModel {\n  email: string;\n  username?: string;\n  password: string;\n  orgName: string;\n  code?: string;\n  name?: string;\n}\ninterface Props {\n  email?: string;\n  orgName?: string;\n  username?: string;\n  code?: string;\n  name?: string;\n  verifyEmailEnabled?: boolean;\n  autoAssignOrg?: boolean;\n}\n\nconst buttonSpacing = css`\n  margin-left: 15px;\n`;\n\nexport const SignupForm: FC<Props> = props => {\n  const verifyEmailEnabled = props.verifyEmailEnabled;\n  const autoAssignOrg = props.autoAssignOrg;\n\n  const onSubmit = async (formData: SignupFormModel) => {\n    if (formData.name === '') {\n      delete formData.name;\n    }\n\n    const response = await getBackendSrv().post('/api/user/signup/step2', {\n      email: formData.email,\n      code: formData.code,\n      username: formData.email,\n      orgName: formData.orgName,\n      password: formData.password,\n      name: formData.name,\n    });\n\n    if (response.code === 'redirect-to-select-org') {\n      window.location.href = getConfig().appSubUrl + '/profile/select-org?signup=1';\n    }\n    window.location.href = getConfig().appSubUrl + '/';\n  };\n\n  const defaultValues = {\n    orgName: props.orgName,\n    email: props.email,\n    username: props.email,\n    code: props.code,\n    name: props.name,\n  };\n\n  return (\n    <Form defaultValues={defaultValues} onSubmit={onSubmit}>\n      {({ register, errors }) => {\n        return (\n          <>\n            {verifyEmailEnabled && (\n              <Field label=\"Email verification code (sent to your email)\">\n                <Input name=\"code\" ref={register} placeholder=\"Code\" />\n              </Field>\n            )}\n            {!autoAssignOrg && (\n              <Field label=\"Org. name\">\n                <Input name=\"orgName\" placeholder=\"Org. name\" ref={register} />\n              </Field>\n            )}\n            <Field label=\"Your name\">\n              <Input name=\"name\" placeholder=\"(optional)\" ref={register} />\n            </Field>\n            <Field label=\"Email\" invalid={!!errors.email} error={!!errors.email && errors.email.message}>\n              <Input\n                name=\"email\"\n                type=\"email\"\n                placeholder=\"Email\"\n                ref={register({\n                  required: 'Email is required',\n                  pattern: {\n                    value: /^\\S+@\\S+$/,\n                    message: 'Email is invalid',\n                  },\n                })}\n              />\n            </Field>\n            <Field label=\"Password\" invalid={!!errors.password} error={!!errors.password && errors.password.message}>\n              <Input\n                name=\"password\"\n                type=\"password\"\n                placeholder=\"Password\"\n                ref={register({ required: 'Password is required' })}\n              />\n            </Field>\n\n            <Button type=\"submit\">Submit</Button>\n            <span className={buttonSpacing}>\n              <LinkButton href={getConfig().appSubUrl + '/login'} variant=\"secondary\">\n                Back\n              </LinkButton>\n            </span>\n          </>\n        );\n      }}\n    </Form>\n  );\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { VariablePayload } from '../state/types';\n\ntype VariableEditorExtension<ExtendedProps extends {} = {}> = { [P in keyof ExtendedProps]: ExtendedProps[P] };\nexport interface VariableEditorState<ExtendedProps extends {} = {}> {\n  id: string;\n  name: string;\n  errors: Record<string, string>;\n  isValid: boolean;\n  extended: VariableEditorExtension<ExtendedProps> | null;\n}\n\nexport const initialVariableEditorState: VariableEditorState = {\n  id: '',\n  isValid: true,\n  errors: {},\n  name: '',\n  extended: null,\n};\n\nconst variableEditorReducerSlice = createSlice({\n  name: 'templating/editor',\n  initialState: initialVariableEditorState,\n  reducers: {\n    setIdInEditor: (state: VariableEditorState, action: PayloadAction<{ id: string }>) => {\n      state.id = action.payload.id;\n    },\n    clearIdInEditor: (state: VariableEditorState, action: PayloadAction<undefined>) => {\n      state.id = '';\n    },\n    variableEditorMounted: (state: VariableEditorState, action: PayloadAction<{ name: string }>) => {\n      state.name = action.payload.name;\n    },\n    variableEditorUnMounted: (state: VariableEditorState, action: PayloadAction<VariablePayload>) => {\n      return initialVariableEditorState;\n    },\n    changeVariableNameSucceeded: (\n      state: VariableEditorState,\n      action: PayloadAction<VariablePayload<{ newName: string }>>\n    ) => {\n      state.name = action.payload.data.newName;\n      delete state.errors['name'];\n      state.isValid = Object.keys(state.errors).length === 0;\n    },\n    changeVariableNameFailed: (\n      state: VariableEditorState,\n      action: PayloadAction<{ newName: string; errorText: string }>\n    ) => {\n      state.name = action.payload.newName;\n      state.errors.name = action.payload.errorText;\n      state.isValid = Object.keys(state.errors).length === 0;\n    },\n    addVariableEditorError: (\n      state: VariableEditorState,\n      action: PayloadAction<{ errorProp: string; errorText: any }>\n    ) => {\n      state.errors[action.payload.errorProp] = action.payload.errorText;\n      state.isValid = Object.keys(state.errors).length === 0;\n    },\n    removeVariableEditorError: (state: VariableEditorState, action: PayloadAction<{ errorProp: string }>) => {\n      delete state.errors[action.payload.errorProp];\n      state.isValid = Object.keys(state.errors).length === 0;\n    },\n    changeVariableEditorExtended: (\n      state: VariableEditorState,\n      action: PayloadAction<{ propName: string; propValue: any }>\n    ) => {\n      state.extended = {\n        ...state.extended,\n        [action.payload.propName]: action.payload.propValue,\n      };\n    },\n  },\n});\n\nexport const variableEditorReducer = variableEditorReducerSlice.reducer;\n\nexport const {\n  setIdInEditor,\n  clearIdInEditor,\n  changeVariableNameSucceeded,\n  changeVariableNameFailed,\n  variableEditorMounted,\n  variableEditorUnMounted,\n  changeVariableEditorExtended,\n  addVariableEditorError,\n  removeVariableEditorError,\n} = variableEditorReducerSlice.actions;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport {\n  LdapConnectionInfo,\n  LdapError,\n  LdapState,\n  LdapUser,\n  SyncInfo,\n  UserAdminError,\n  UserAdminState,\n  UserDTO,\n  UserOrg,\n  UserSession,\n  UserListAdminState,\n} from 'app/types';\n\nconst initialLdapState: LdapState = {\n  connectionInfo: [],\n  syncInfo: null,\n  user: null,\n  connectionError: null,\n  userError: null,\n};\n\nconst ldapSlice = createSlice({\n  name: 'ldap',\n  initialState: initialLdapState,\n  reducers: {\n    ldapConnectionInfoLoadedAction: (state, action: PayloadAction<LdapConnectionInfo>): LdapState => ({\n      ...state,\n      ldapError: null,\n      connectionInfo: action.payload,\n    }),\n    ldapFailedAction: (state, action: PayloadAction<LdapError>): LdapState => ({\n      ...state,\n      ldapError: action.payload,\n    }),\n    ldapSyncStatusLoadedAction: (state, action: PayloadAction<SyncInfo>): LdapState => ({\n      ...state,\n      syncInfo: action.payload,\n    }),\n    userMappingInfoLoadedAction: (state, action: PayloadAction<LdapUser>): LdapState => ({\n      ...state,\n      user: action.payload,\n      userError: null,\n    }),\n    userMappingInfoFailedAction: (state, action: PayloadAction<LdapError>): LdapState => ({\n      ...state,\n      user: null,\n      userError: action.payload,\n    }),\n    clearUserMappingInfoAction: (state, action: PayloadAction<undefined>): LdapState => ({\n      ...state,\n      user: null,\n    }),\n    clearUserErrorAction: (state, action: PayloadAction<undefined>): LdapState => ({\n      ...state,\n      userError: null,\n    }),\n  },\n});\n\nexport const {\n  clearUserErrorAction,\n  clearUserMappingInfoAction,\n  ldapConnectionInfoLoadedAction,\n  ldapFailedAction,\n  ldapSyncStatusLoadedAction,\n  userMappingInfoFailedAction,\n  userMappingInfoLoadedAction,\n} = ldapSlice.actions;\n\nexport const ldapReducer = ldapSlice.reducer;\n\n// UserAdminPage\n\nconst initialUserAdminState: UserAdminState = {\n  user: null,\n  sessions: [],\n  orgs: [],\n  isLoading: true,\n  error: null,\n};\n\nexport const userAdminSlice = createSlice({\n  name: 'userAdmin',\n  initialState: initialUserAdminState,\n  reducers: {\n    userProfileLoadedAction: (state, action: PayloadAction<UserDTO>): UserAdminState => ({\n      ...state,\n      user: action.payload,\n    }),\n    userOrgsLoadedAction: (state, action: PayloadAction<UserOrg[]>): UserAdminState => ({\n      ...state,\n      orgs: action.payload,\n    }),\n    userSessionsLoadedAction: (state, action: PayloadAction<UserSession[]>): UserAdminState => ({\n      ...state,\n      sessions: action.payload,\n    }),\n    userAdminPageLoadedAction: (state, action: PayloadAction<boolean>): UserAdminState => ({\n      ...state,\n      isLoading: !action.payload,\n    }),\n    userAdminPageFailedAction: (state, action: PayloadAction<UserAdminError>): UserAdminState => ({\n      ...state,\n      error: action.payload,\n      isLoading: false,\n    }),\n  },\n});\n\nexport const {\n  userProfileLoadedAction,\n  userOrgsLoadedAction,\n  userSessionsLoadedAction,\n  userAdminPageLoadedAction,\n  userAdminPageFailedAction,\n} = userAdminSlice.actions;\n\nexport const userAdminReducer = userAdminSlice.reducer;\n\n// UserListAdminPage\n\nconst initialUserListAdminState: UserListAdminState = {\n  users: [],\n  query: '',\n  page: 0,\n  perPage: 50,\n  totalPages: 1,\n  showPaging: false,\n};\n\ninterface UsersFetched {\n  users: UserDTO[];\n  perPage: number;\n  page: number;\n  totalCount: number;\n}\n\nexport const userListAdminSlice = createSlice({\n  name: 'userListAdmin',\n  initialState: initialUserListAdminState,\n  reducers: {\n    usersFetched: (state, action: PayloadAction<UsersFetched>) => {\n      const { totalCount, perPage, ...rest } = action.payload;\n      const totalPages = Math.ceil(totalCount / perPage);\n\n      return {\n        ...state,\n        ...rest,\n        totalPages,\n        perPage,\n        showPaging: totalPages > 1,\n      };\n    },\n    queryChanged: (state, action: PayloadAction<string>) => ({\n      ...state,\n      query: action.payload,\n    }),\n    pageChanged: (state, action: PayloadAction<number>) => ({\n      ...state,\n      page: action.payload,\n    }),\n  },\n});\n\nexport const { usersFetched, queryChanged, pageChanged } = userListAdminSlice.actions;\nexport const userListAdminReducer = userListAdminSlice.reducer;\n\nexport default {\n  ldap: ldapReducer,\n  userAdmin: userAdminReducer,\n  userListAdmin: userListAdminReducer,\n};\n","import { useState, useEffect } from 'react';\nimport { AbsoluteTimeRange } from '@grafana/data';\nimport { CascaderOption } from '@grafana/ui';\n\nimport LokiLanguageProvider from 'app/plugins/datasource/loki/language_provider';\nimport { useRefMounted } from 'app/core/hooks/useRefMounted';\n\n/**\n *\n * @param languageProvider\n * @param languageProviderInitialised\n * @param absoluteRange\n *\n * @description Fetches missing labels and enables labels refresh\n */\nexport const useLokiLabels = (\n  languageProvider: LokiLanguageProvider,\n  languageProviderInitialised: boolean,\n  absoluteRange: AbsoluteTimeRange\n) => {\n  const mounted = useRefMounted();\n\n  // State\n  const [logLabelOptions, setLogLabelOptions] = useState([]);\n  const [shouldTryRefreshLabels, setRefreshLabels] = useState(false);\n  /**\n   * Holds information about currently selected option from rc-cascader to perform effect\n   * that loads option values not fetched yet. Based on that useLokiLabels hook decides whether or not\n   * the option requires additional data fetching\n   */\n  const [activeOption, setActiveOption] = useState<CascaderOption[]>([]);\n\n  // Async\n  const fetchOptionValues = async (option: string) => {\n    await languageProvider.fetchLabelValues(option, absoluteRange);\n    if (mounted.current) {\n      setLogLabelOptions(languageProvider.logLabelOptions);\n    }\n  };\n\n  const tryLabelsRefresh = async () => {\n    await languageProvider.refreshLogLabels(absoluteRange);\n\n    if (mounted.current) {\n      setRefreshLabels(false);\n      setLogLabelOptions(languageProvider.logLabelOptions);\n    }\n  };\n\n  // Effects\n\n  // This effect performs loading of options that hasn't been loaded yet\n  // It's a subject of activeOption state change only. This is because of specific behavior or rc-cascader\n  // https://github.com/react-component/cascader/blob/master/src/Cascader.jsx#L165\n  useEffect(() => {\n    if (languageProviderInitialised) {\n      const targetOption = activeOption[activeOption.length - 1];\n      if (targetOption) {\n        const nextOptions = logLabelOptions.map(option => {\n          if (option.value === targetOption.value) {\n            return {\n              ...option,\n              loading: true,\n            };\n          }\n          return option;\n        });\n        setLogLabelOptions(nextOptions); // to set loading\n        fetchOptionValues(targetOption.value);\n      }\n    }\n  }, [activeOption]);\n\n  // This effect is performed on shouldTryRefreshLabels state change only.\n  // Since shouldTryRefreshLabels is reset AFTER the labels are refreshed we are secured in case of trying to refresh\n  // when previous refresh hasn't finished yet\n  useEffect(() => {\n    if (shouldTryRefreshLabels) {\n      tryLabelsRefresh();\n    }\n  }, [shouldTryRefreshLabels]);\n\n  // Initialize labels from the provider after it gets initialized (it's initialisation happens outside of this hook)\n  useEffect(() => {\n    if (languageProviderInitialised) {\n      setLogLabelOptions(languageProvider.logLabelOptions);\n    }\n  }, [languageProviderInitialised]);\n\n  return {\n    logLabelOptions,\n    refreshLabels: () => setRefreshLabels(true),\n    setActiveOption,\n  };\n};\n","import { useState, useEffect } from 'react';\nimport Prism, { Grammar } from 'prismjs';\nimport { AbsoluteTimeRange } from '@grafana/data';\nimport LokiLanguageProvider from 'app/plugins/datasource/loki/language_provider';\nimport { useLokiLabels } from 'app/plugins/datasource/loki/components/useLokiLabels';\nimport { useRefMounted } from 'app/core/hooks/useRefMounted';\n\nconst PRISM_SYNTAX = 'promql';\n\n/**\n * Initialise the language provider. Returns a languageProviderInitialized boolean cause there does not seem other way\n * to know if the provider is already initialised or not. By the initialisation it modifies the provided\n * languageProvider directly.\n */\nconst useInitLanguageProvider = (languageProvider: LokiLanguageProvider, absoluteRange: AbsoluteTimeRange) => {\n  const mounted = useRefMounted();\n\n  const [languageProviderInitialized, setLanguageProviderInitialized] = useState(false);\n\n  // Async\n  const initializeLanguageProvider = async () => {\n    languageProvider.initialRange = absoluteRange;\n    await languageProvider.start();\n    if (mounted.current) {\n      setLanguageProviderInitialized(true);\n    }\n  };\n\n  useEffect(() => {\n    initializeLanguageProvider();\n  }, []);\n\n  return languageProviderInitialized;\n};\n\n/**\n * Returns syntax from languageProvider and initialises global Prism syntax. Waits until languageProvider itself is\n * initialised (outside of this hook).\n */\nconst useLokiSyntax = (languageProvider: LokiLanguageProvider, languageProviderInitialized: boolean) => {\n  // State\n  const [syntax, setSyntax] = useState<Grammar>(null);\n\n  // Effects\n  useEffect(() => {\n    if (languageProviderInitialized) {\n      const syntax = languageProvider.getSyntax();\n      Prism.languages[PRISM_SYNTAX] = syntax;\n      setSyntax(syntax);\n    }\n  }, [languageProviderInitialized, languageProvider]);\n\n  return {\n    isSyntaxReady: !!syntax,\n    syntax,\n  };\n};\n\n/**\n * Initializes given language provider, exposes Loki syntax and enables loading label option values\n */\nexport const useLokiSyntaxAndLabels = (languageProvider: LokiLanguageProvider, absoluteRange: AbsoluteTimeRange) => {\n  const languageProviderInitialized = useInitLanguageProvider(languageProvider, absoluteRange);\n\n  const { logLabelOptions, refreshLabels, setActiveOption } = useLokiLabels(\n    languageProvider,\n    languageProviderInitialized,\n    absoluteRange\n  );\n  const { isSyntaxReady, syntax } = useLokiSyntax(languageProvider, languageProviderInitialized);\n\n  return {\n    isSyntaxReady,\n    syntax,\n    logLabelOptions,\n    setActiveOption,\n    refreshLabels,\n  };\n};\n","import { Vector } from '../types/vector';\nimport { vectorToArray } from './vectorToArray';\n\n/**\n * Values are returned in the order defined by the input parameter\n */\nexport class SortedVector<T = any> implements Vector<T> {\n  constructor(private source: Vector<T>, private order: number[]) {}\n\n  get length(): number {\n    return this.source.length;\n  }\n\n  get(index: number): T {\n    return this.source.get(this.order[index]);\n  }\n\n  toArray(): T[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): T[] {\n    return vectorToArray(this);\n  }\n}\n","import { Observable } from 'rxjs';\nimport { ComponentType } from 'react';\nimport { GrafanaPlugin, PluginMeta } from './plugin';\nimport { PanelData } from './panel';\nimport { LogRowModel } from './logs';\nimport { AnnotationEvent, KeyValue, LoadingState, TableData, TimeSeries } from './data';\nimport { DataFrame, DataFrameDTO } from './dataFrame';\nimport { RawTimeRange, TimeRange, AbsoluteTimeRange } from './time';\nimport { ScopedVars } from './ScopedVars';\nimport { CoreApp } from './app';\n\nexport interface DataSourcePluginOptionsEditorProps<JSONData = DataSourceJsonData, SecureJSONData = {}> {\n  options: DataSourceSettings<JSONData, SecureJSONData>;\n  onOptionsChange: (options: DataSourceSettings<JSONData, SecureJSONData>) => void;\n}\n\n// Utility type to extract the query type TQuery from a class extending DataSourceApi<TQuery, TOptions>\nexport type DataSourceQueryType<DSType extends DataSourceApi<any, any>> = DSType extends DataSourceApi<\n  infer TQuery,\n  infer _TOptions\n>\n  ? TQuery\n  : never;\n\n// Utility type to extract the options type TOptions from a class extending DataSourceApi<TQuery, TOptions>\nexport type DataSourceOptionsType<DSType extends DataSourceApi<any, any>> = DSType extends DataSourceApi<\n  infer _TQuery,\n  infer TOptions\n>\n  ? TOptions\n  : never;\n\nexport class DataSourcePlugin<\n  DSType extends DataSourceApi<TQuery, TOptions>,\n  TQuery extends DataQuery = DataSourceQueryType<DSType>,\n  TOptions extends DataSourceJsonData = DataSourceOptionsType<DSType>,\n  TSecureOptions = {}\n> extends GrafanaPlugin<DataSourcePluginMeta<TOptions>> {\n  components: DataSourcePluginComponents<DSType, TQuery, TOptions, TSecureOptions> = {};\n\n  constructor(public DataSourceClass: DataSourceConstructor<DSType, TQuery, TOptions>) {\n    super();\n  }\n\n  setConfigEditor(editor: ComponentType<DataSourcePluginOptionsEditorProps<TOptions, TSecureOptions>>) {\n    this.components.ConfigEditor = editor;\n    return this;\n  }\n\n  setConfigCtrl(ConfigCtrl: any) {\n    this.angularConfigCtrl = ConfigCtrl;\n    return this;\n  }\n\n  setQueryCtrl(QueryCtrl: any) {\n    this.components.QueryCtrl = QueryCtrl;\n    return this;\n  }\n\n  setAnnotationQueryCtrl(AnnotationsQueryCtrl: any) {\n    this.components.AnnotationsQueryCtrl = AnnotationsQueryCtrl;\n    return this;\n  }\n\n  setQueryEditor(QueryEditor: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n    this.components.QueryEditor = QueryEditor;\n    return this;\n  }\n\n  setExploreQueryField(ExploreQueryField: ComponentType<ExploreQueryFieldProps<DSType, TQuery, TOptions>>) {\n    this.components.ExploreQueryField = ExploreQueryField;\n    return this;\n  }\n\n  setExploreMetricsQueryField(ExploreQueryField: ComponentType<ExploreQueryFieldProps<DSType, TQuery, TOptions>>) {\n    this.components.ExploreMetricsQueryField = ExploreQueryField;\n    return this;\n  }\n\n  setExploreLogsQueryField(ExploreQueryField: ComponentType<ExploreQueryFieldProps<DSType, TQuery, TOptions>>) {\n    this.components.ExploreLogsQueryField = ExploreQueryField;\n    return this;\n  }\n\n  setExploreStartPage(ExploreStartPage: ComponentType<ExploreStartPageProps>) {\n    this.components.ExploreStartPage = ExploreStartPage;\n    return this;\n  }\n\n  setVariableQueryEditor(VariableQueryEditor: any) {\n    this.components.VariableQueryEditor = VariableQueryEditor;\n    return this;\n  }\n\n  setMetadataInspector(MetadataInspector: ComponentType<MetadataInspectorProps<DSType, TQuery, TOptions>>) {\n    this.components.MetadataInspector = MetadataInspector;\n    return this;\n  }\n\n  setComponentsFromLegacyExports(pluginExports: any) {\n    this.angularConfigCtrl = pluginExports.ConfigCtrl;\n\n    this.components.QueryCtrl = pluginExports.QueryCtrl;\n    this.components.AnnotationsQueryCtrl = pluginExports.AnnotationsQueryCtrl;\n    this.components.ExploreQueryField = pluginExports.ExploreQueryField;\n    this.components.ExploreStartPage = pluginExports.ExploreStartPage;\n    this.components.QueryEditor = pluginExports.QueryEditor;\n    this.components.VariableQueryEditor = pluginExports.VariableQueryEditor;\n  }\n}\n\nexport interface DataSourcePluginMeta<T extends KeyValue = {}> extends PluginMeta<T> {\n  builtIn?: boolean; // Is this for all\n  metrics?: boolean;\n  logs?: boolean;\n  annotations?: boolean;\n  alerting?: boolean;\n  tracing?: boolean;\n  mixed?: boolean;\n  hasQueryHelp?: boolean;\n  category?: string;\n  queryOptions?: PluginMetaQueryOptions;\n  sort?: number;\n  streaming?: boolean;\n}\n\ninterface PluginMetaQueryOptions {\n  cacheTimeout?: boolean;\n  maxDataPoints?: boolean;\n  minInterval?: boolean;\n}\n\nexport interface DataSourcePluginComponents<\n  DSType extends DataSourceApi<TQuery, TOptions>,\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData,\n  TSecureOptions = {}\n> {\n  QueryCtrl?: any;\n  AnnotationsQueryCtrl?: any;\n  VariableQueryEditor?: any;\n  QueryEditor?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\n  ExploreQueryField?: ComponentType<ExploreQueryFieldProps<DSType, TQuery, TOptions>>;\n  ExploreMetricsQueryField?: ComponentType<ExploreQueryFieldProps<DSType, TQuery, TOptions>>;\n  ExploreLogsQueryField?: ComponentType<ExploreQueryFieldProps<DSType, TQuery, TOptions>>;\n  ExploreStartPage?: ComponentType<ExploreStartPageProps>;\n  ConfigEditor?: ComponentType<DataSourcePluginOptionsEditorProps<TOptions, TSecureOptions>>;\n  MetadataInspector?: ComponentType<MetadataInspectorProps<DSType, TQuery, TOptions>>;\n}\n\n// Only exported for tests\nexport interface DataSourceConstructor<\n  DSType extends DataSourceApi<TQuery, TOptions>,\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n  new (instanceSettings: DataSourceInstanceSettings<TOptions>, ...args: any[]): DSType;\n}\n\n/**\n * The main data source abstraction interface, represents an instance of a data source\n *\n * Although this is a class, datasource implementations do not *yet* need to extend it.\n * As such, we can not yet add functions with default implementations.\n */\nexport abstract class DataSourceApi<\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n  /**\n   *  Set in constructor\n   */\n  readonly name: string;\n\n  /**\n   *  Set in constructor\n   */\n  readonly id: number;\n\n  /**\n   *  min interval range\n   */\n  interval?: string;\n\n  constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n    this.name = instanceSettings.name;\n    this.id = instanceSettings.id;\n    this.meta = {} as DataSourcePluginMeta;\n  }\n\n  /**\n   * Imports queries from a different datasource\n   */\n  importQueries?(queries: TQuery[], originMeta: PluginMeta): Promise<TQuery[]>;\n\n  /**\n   * Initializes a datasource after instantiation\n   */\n  init?: () => void;\n\n  /**\n   * Query for data, and optionally stream results\n   */\n  abstract query(request: DataQueryRequest<TQuery>): Promise<DataQueryResponse> | Observable<DataQueryResponse>;\n\n  /**\n   * Test & verify datasource settings & connection details\n   */\n  abstract testDatasource(): Promise<any>;\n\n  /**\n   *  Get hints for query improvements\n   */\n  getQueryHints?(query: TQuery, results: any[], ...rest: any): QueryHint[];\n\n  /**\n   * Convert a query to a simple text string\n   */\n  getQueryDisplayText?(query: TQuery): string;\n\n  /**\n   * Retrieve context for a given log row\n   */\n  getLogRowContext?: <TContextQueryOptions extends {}>(\n    row: LogRowModel,\n    options?: TContextQueryOptions\n  ) => Promise<DataQueryResponse>;\n\n  /**\n   * Variable query action.\n   */\n  metricFindQuery?(query: any, options?: any): Promise<MetricFindValue[]>;\n\n  /**\n   * Get tag keys for adhoc filters\n   */\n  getTagKeys?(options?: any): Promise<MetricFindValue[]>;\n\n  /**\n   * Get tag values for adhoc filters\n   */\n  getTagValues?(options: any): Promise<MetricFindValue[]>;\n\n  /**\n   * Set after constructor call, as the data source instance is the most common thing to pass around\n   * we attach the components to this instance for easy access\n   */\n  components?: DataSourcePluginComponents<DataSourceApi<TQuery, TOptions>, TQuery, TOptions>;\n\n  /**\n   * static information about the datasource\n   */\n  meta: DataSourcePluginMeta;\n\n  /**\n   * Used by alerting to check if query contains template variables\n   */\n  targetContainsTemplate?(query: TQuery): boolean;\n\n  /**\n   * Used in explore\n   */\n  modifyQuery?(query: TQuery, action: QueryFixAction): TQuery;\n\n  /**\n   * Used in explore\n   */\n  getHighlighterExpression?(query: TQuery): string[];\n\n  /**\n   * Used in explore\n   */\n  languageProvider?: any;\n\n  getVersion?(optionalOptions?: any): Promise<string>;\n\n  showContextToggle?(row?: LogRowModel): boolean;\n\n  /**\n   * Can be optionally implemented to allow datasource to be a source of annotations for dashboard. To be visible\n   * in the annotation editor `annotations` capability also needs to be enabled in plugin.json.\n   */\n  annotationQuery?(options: AnnotationQueryRequest<TQuery>): Promise<AnnotationEvent[]>;\n\n  interpolateVariablesInQueries?(queries: TQuery[], scopedVars: ScopedVars | {}): TQuery[];\n}\n\nexport interface MetadataInspectorProps<\n  DSType extends DataSourceApi<TQuery, TOptions>,\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n  datasource: DSType;\n\n  // All Data from this DataSource\n  data: DataFrame[];\n}\n\nexport interface QueryEditorProps<\n  DSType extends DataSourceApi<TQuery, TOptions>,\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n  datasource: DSType;\n  query: TQuery;\n  onRunQuery: () => void;\n  onChange: (value: TQuery) => void;\n  onBlur?: () => void;\n  /**\n   * Contains query response filtered by refId of QueryResultBase and possible query error\n   */\n  data?: PanelData;\n  exploreMode?: ExploreMode;\n  exploreId?: any;\n  history?: HistoryItem[];\n}\n\nexport enum DataSourceStatus {\n  Connected,\n  Disconnected,\n}\n\nexport enum ExploreMode {\n  Logs = 'Logs',\n  Metrics = 'Metrics',\n  Tracing = 'Tracing',\n}\n\nexport interface ExploreQueryFieldProps<\n  DSType extends DataSourceApi<TQuery, TOptions>,\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends QueryEditorProps<DSType, TQuery, TOptions> {\n  history: any[];\n  onBlur?: () => void;\n  absoluteRange?: AbsoluteTimeRange;\n  exploreMode?: ExploreMode;\n  exploreId?: any;\n}\n\nexport interface ExploreStartPageProps {\n  datasource?: DataSourceApi;\n  exploreMode: ExploreMode;\n  onClickExample: (query: DataQuery) => void;\n  exploreId?: any;\n}\n\n/**\n * Starting in v6.2 DataFrame can represent both TimeSeries and TableData\n */\nexport type LegacyResponseData = TimeSeries | TableData | any;\n\nexport type DataQueryResponseData = DataFrame | DataFrameDTO | LegacyResponseData;\n\nexport interface DataQueryResponse {\n  /**\n   * The response data.  When streaming, this may be empty\n   * or a partial result set\n   */\n  data: DataQueryResponseData[];\n\n  /**\n   * When returning multiple partial responses or streams\n   * Use this key to inform Grafana how to combine the partial responses\n   * Multiple responses with same key are replaced (latest used)\n   */\n  key?: string;\n\n  /**\n   * Optionally include error info along with the response data\n   */\n  error?: DataQueryError;\n\n  /**\n   * Use this to control which state the response should have\n   * Defaults to LoadingState.Done if state is not defined\n   */\n  state?: LoadingState;\n}\n\n/**\n * These are the common properties available to all queries in all datasources\n * Specific implementations will extend this interface adding the required properties\n * for the given context\n */\nexport interface DataQuery {\n  /**\n   * A - Z\n   */\n  refId: string;\n\n  /**\n   * true if query is disabled (ie should not be returned to the dashboard)\n   */\n  hide?: boolean;\n\n  /**\n   * Unique, guid like, string used in explore mode\n   */\n  key?: string;\n\n  /**\n   * Specify the query flavor\n   */\n  queryType?: string;\n\n  /**\n   * For mixed data sources the selected datasource is on the query level.\n   * For non mixed scenarios this is undefined.\n   */\n  datasource?: string | null;\n}\n\nexport interface DataQueryError {\n  data?: {\n    message?: string;\n    error?: string;\n  };\n  message?: string;\n  status?: string;\n  statusText?: string;\n  refId?: string;\n  cancelled?: boolean;\n}\n\nexport interface DataQueryRequest<TQuery extends DataQuery = DataQuery> {\n  requestId: string; // Used to identify results and optionally cancel the request in backendSrv\n\n  dashboardId: number;\n  interval: string;\n  intervalMs?: number;\n  maxDataPoints?: number;\n  panelId: number;\n  range: TimeRange;\n  reverse?: boolean;\n  scopedVars: ScopedVars;\n  targets: TQuery[];\n  timezone: string;\n  app: CoreApp | string;\n\n  cacheTimeout?: string;\n  exploreMode?: ExploreMode;\n  rangeRaw?: RawTimeRange;\n  timeInfo?: string; // The query time description (blue text in the upper right)\n\n  // Request Timing\n  startTime: number;\n  endTime?: number;\n}\n\nexport interface DataQueryTimings {\n  dataProcessingTime: number;\n}\n\nexport interface QueryFix {\n  type: string;\n  label: string;\n  action?: QueryFixAction;\n}\n\nexport interface QueryFixAction {\n  type: string;\n  query?: string;\n  preventSubmit?: boolean;\n}\n\nexport interface QueryHint {\n  type: string;\n  label: string;\n  fix?: QueryFix;\n}\n\nexport interface MetricFindValue {\n  text: string;\n}\n\nexport interface DataSourceJsonData {\n  authType?: string;\n  defaultRegion?: string;\n}\n\n/**\n * Data Source instance edit model.  This is returned from:\n *  /api/datasources\n */\nexport interface DataSourceSettings<T extends DataSourceJsonData = DataSourceJsonData, S = {}> {\n  id: number;\n  orgId: number;\n  name: string;\n  typeLogoUrl: string;\n  type: string;\n  access: string;\n  url: string;\n  password: string;\n  user: string;\n  database: string;\n  basicAuth: boolean;\n  basicAuthPassword: string;\n  basicAuthUser: string;\n  isDefault: boolean;\n  jsonData: T;\n  secureJsonData?: S;\n  secureJsonFields?: KeyValue<boolean>;\n  readOnly: boolean;\n  withCredentials: boolean;\n  version?: number;\n}\n\n/**\n * Frontend settings model that is passed to Datasource constructor. This differs a bit from the model above\n * as this data model is available to every user who has access to a data source (Viewers+).  This is loaded\n * in bootData (on page load), or from: /api/frontend/settings\n */\nexport interface DataSourceInstanceSettings<T extends DataSourceJsonData = DataSourceJsonData> {\n  id: number;\n  uid: string;\n  type: string;\n  name: string;\n  meta: DataSourcePluginMeta;\n  url?: string;\n  jsonData: T;\n  username?: string;\n  password?: string; // when access is direct, for some legacy datasources\n  database?: string;\n\n  /**\n   * This is the full Authorization header if basic auth is ennabled.\n   * Only available here when access is Browser (direct), when access is Server (proxy)\n   * The basic auth header, username & password is never exposted to browser/Frontend\n   * so this will be empty then.\n   */\n  basicAuth?: string;\n  withCredentials?: boolean;\n}\n\nexport interface DataSourceSelectItem {\n  name: string;\n  value: string | null;\n  meta: DataSourcePluginMeta;\n  sort: string;\n}\n\n/**\n * Options passed to the datasource.annotationQuery method. See docs/plugins/developing/datasource.md\n */\nexport interface AnnotationQueryRequest<MoreOptions = {}> {\n  range: TimeRange;\n  rangeRaw: RawTimeRange;\n  // Should be DataModel but cannot import that here from the main app. Needs to be moved to package first.\n  dashboard: any;\n  annotation: {\n    datasource: string;\n    enable: boolean;\n    name: string;\n  } & MoreOptions;\n}\n\nexport interface HistoryItem<TQuery extends DataQuery = DataQuery> {\n  ts: number;\n  query: TQuery;\n}\n\nexport abstract class LanguageProvider {\n  abstract datasource: DataSourceApi<any, any>;\n  abstract request: (url: string, params?: any) => Promise<any>;\n\n  /**\n   * Returns startTask that resolves with a task list when main syntax is loaded.\n   * Task list consists of secondary promises that load more detailed language features.\n   */\n  abstract start: () => Promise<any[]>;\n  startTask?: Promise<any[]>;\n}\n","import React, { FC } from 'react';\nimport { css, cx } from 'emotion';\nimport { useTheme, stylesFactory } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { OptionProps } from 'react-select/src/components/Option';\nimport { TagBadge } from './TagBadge';\n\n// https://github.com/JedWatson/react-select/issues/3038\ninterface ExtendedOptionProps extends OptionProps<any> {\n  data: any;\n}\n\nexport const TagOption: FC<ExtendedOptionProps> = ({ data, className, label, isFocused, innerProps }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={cx(styles.option, isFocused && styles.optionFocused)} aria-label=\"Tag option\" {...innerProps}>\n      <div className={`tag-filter-option ${className || ''}`}>\n        <TagBadge label={label} removeIcon={false} count={data.count} />\n      </div>\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    option: css`\n      padding: 8px;\n      white-space: nowrap;\n      cursor: pointer;\n      border-left: 2px solid transparent;\n      &:hover {\n        background: ${theme.colors.dropdownOptionHoverBg};\n      }\n    `,\n    optionFocused: css`\n      background: ${theme.colors.dropdownOptionHoverBg};\n      border-style: solid;\n      border-top: 0;\n      border-right: 0;\n      border-bottom: 0;\n      border-left-width: 2px;\n    `,\n  };\n});\n","// Libraries\nimport React, { FC } from 'react';\nimport { css } from 'emotion';\n// @ts-ignore\nimport { components } from '@torkelo/react-select';\nimport { AsyncSelect, stylesFactory, useTheme, resetSelectStyles, Icon } from '@grafana/ui';\nimport { escapeStringForRegex, GrafanaTheme } from '@grafana/data';\n// Components\nimport { TagOption } from './TagOption';\nimport { TagBadge } from './TagBadge';\n\nexport interface TermCount {\n  term: string;\n  count: number;\n}\n\nexport interface Props {\n  /** Do not show selected values inside Select. Useful when the values need to be shown in some other components */\n  hideValues?: boolean;\n  isClearable?: boolean;\n  onChange: (tags: string[]) => void;\n  placeholder?: string;\n  tagOptions: () => Promise<TermCount[]>;\n  tags: string[];\n  width?: number;\n}\n\nconst filterOption = (option: any, searchQuery: string) => {\n  const regex = RegExp(escapeStringForRegex(searchQuery), 'i');\n  return regex.test(option.value);\n};\n\nexport const TagFilter: FC<Props> = ({\n  hideValues,\n  isClearable,\n  onChange,\n  placeholder = 'Filter by tag',\n  tagOptions,\n  tags,\n  width,\n}) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  const onLoadOptions = (query: string) => {\n    return tagOptions().then(options => {\n      return options.map(option => ({\n        value: option.term,\n        label: option.term,\n        count: option.count,\n      }));\n    });\n  };\n\n  const onTagChange = (newTags: any[]) => {\n    // On remove with 1 item returns null, so we need to make sure it's an empty array in that case\n    // https://github.com/JedWatson/react-select/issues/3632\n    onChange((newTags || []).map(tag => tag.value));\n  };\n\n  const value = tags.map(tag => ({ value: tag, label: tag, count: 0 }));\n\n  const selectOptions = {\n    defaultOptions: true,\n    filterOption,\n    getOptionLabel: (i: any) => i.label,\n    getOptionValue: (i: any) => i.value,\n    isMulti: true,\n    loadOptions: onLoadOptions,\n    loadingMessage: 'Loading...',\n    noOptionsMessage: 'No tags found',\n    onChange: onTagChange,\n    placeholder,\n    styles: resetSelectStyles(),\n    value,\n    width,\n    components: {\n      Option: TagOption,\n      MultiValueLabel: (): any => {\n        return null; // We want the whole tag to be clickable so we use MultiValueRemove instead\n      },\n      MultiValueRemove: (props: any) => {\n        const { data } = props;\n\n        return (\n          <components.MultiValueRemove {...props}>\n            <TagBadge key={data.label} label={data.label} removeIcon={true} count={data.count} />\n          </components.MultiValueRemove>\n        );\n      },\n      MultiValueContainer: hideValues ? (): any => null : components.MultiValueContainer,\n    },\n  };\n\n  return (\n    <div className={styles.tagFilter}>\n      {isClearable && tags.length > 0 && (\n        <span className={styles.clear} onClick={() => onTagChange([])}>\n          Clear tags\n        </span>\n      )}\n      <AsyncSelect {...selectOptions} prefix={<Icon name=\"tag-alt\" />} />\n    </div>\n  );\n};\n\nTagFilter.displayName = 'TagFilter';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    tagFilter: css`\n      position: relative;\n      min-width: 180px;\n      flex-grow: 1;\n\n      .label-tag {\n        margin-left: 6px;\n        cursor: pointer;\n      }\n    `,\n    clear: css`\n      text-decoration: underline;\n      font-size: 12px;\n      position: absolute;\n      top: -22px;\n      right: 0;\n      cursor: pointer;\n      color: ${theme.colors.textWeak};\n\n      &:hover {\n        color: ${theme.colors.textStrong};\n      }\n    `,\n  };\n});\n","import React, { PureComponent, ChangeEvent } from 'react';\nimport classNames from 'classnames';\nimport { validate, EventsWithValidation, hasValidationEvent } from '../../../../utils';\nimport { ValidationEvents, ValidationRule } from '../../../../types';\n\nexport enum LegacyInputStatus {\n  Invalid = 'invalid',\n  Valid = 'valid',\n}\n\ninterface Props extends React.HTMLProps<HTMLInputElement> {\n  validationEvents?: ValidationEvents;\n  hideErrorMessage?: boolean;\n  inputRef?: React.LegacyRef<HTMLInputElement>;\n\n  // Override event props and append status as argument\n  onBlur?: (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => void;\n  onFocus?: (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => void;\n  onChange?: (event: React.ChangeEvent<HTMLInputElement>, status?: LegacyInputStatus) => void;\n}\n\ninterface State {\n  error: string | null;\n}\n\nexport class Input extends PureComponent<Props, State> {\n  static defaultProps = {\n    className: '',\n  };\n\n  state: State = {\n    error: null,\n  };\n\n  get status() {\n    return this.state.error ? LegacyInputStatus.Invalid : LegacyInputStatus.Valid;\n  }\n\n  get isInvalid() {\n    return this.status === LegacyInputStatus.Invalid;\n  }\n\n  validatorAsync = (validationRules: ValidationRule[]) => {\n    return (evt: ChangeEvent<HTMLInputElement>) => {\n      const errors = validate(evt.target.value, validationRules);\n      this.setState(prevState => {\n        return { ...prevState, error: errors ? errors[0] : null };\n      });\n    };\n  };\n\n  populateEventPropsWithStatus = (restProps: any, validationEvents: ValidationEvents | undefined) => {\n    const inputElementProps = { ...restProps };\n    if (!validationEvents) {\n      return inputElementProps;\n    }\n    Object.keys(EventsWithValidation).forEach(eventName => {\n      if (hasValidationEvent(eventName as EventsWithValidation, validationEvents) || restProps[eventName]) {\n        inputElementProps[eventName] = async (evt: ChangeEvent<HTMLInputElement>) => {\n          evt.persist(); // Needed for async. https://reactjs.org/docs/events.html#event-pooling\n          if (hasValidationEvent(eventName as EventsWithValidation, validationEvents)) {\n            await this.validatorAsync(validationEvents[eventName]).apply(this, [evt]);\n          }\n          if (restProps[eventName]) {\n            restProps[eventName].apply(null, [evt, this.status]);\n          }\n        };\n      }\n    });\n    return inputElementProps;\n  };\n\n  render() {\n    const { validationEvents, className, hideErrorMessage, inputRef, ...restProps } = this.props;\n    const { error } = this.state;\n    const inputClassName = classNames('gf-form-input', { invalid: this.isInvalid }, className);\n    const inputElementProps = this.populateEventPropsWithStatus(restProps, validationEvents);\n\n    return (\n      <div style={{ flexGrow: 1 }}>\n        <input {...inputElementProps} ref={inputRef} className={inputClassName} />\n        {error && !hideErrorMessage && <span>{error}</span>}\n      </div>\n    );\n  }\n}\n","import { config, GrafanaBootConfig } from '@grafana/runtime';\n// Legacy binding paths\nexport { config, GrafanaBootConfig as Settings };\n\nlet grafanaConfig: GrafanaBootConfig = config;\n\nexport default grafanaConfig;\n\nexport const getConfig = () => {\n  return grafanaConfig;\n};\n\nexport const updateConfig = (update: Partial<GrafanaBootConfig>) => {\n  grafanaConfig = {\n    ...grafanaConfig,\n    ...update,\n  };\n};\n","var path = 'public/app/plugins/panel/graph/axes_editor.html';\nvar html = \"<div class=editor-row>\\n  <div class=gf-form-group ng-repeat=\\\"yaxis in ctrl.panel.yaxes\\\">\\n    <h5 class=section-heading ng-show=\\\"$index === 0\\\">Left Y</h5>\\n    <h5 class=section-heading ng-show=\\\"$index === 1\\\">Right Y</h5>\\n\\n    <gf-form-switch class=gf-form label=Show label-class=width-6 checked=yaxis.show on-change=ctrl.render()></gf-form-switch>\\n\\n    <div ng-if=yaxis.show>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <label class=\\\"gf-form-label width-6\\\">Unit</label>\\n        <unit-picker onchange=ctrl.setUnitFormat(yaxis) value=yaxis.format class=flex-grow-1 />\\n      </div>\\n    </div>\\n\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-6\\\">Scale</label>\\n      <div class=\\\"gf-form-select-wrapper max-width-20\\\">\\n        <select class=gf-form-input ng-model=yaxis.logBase ng-options=\\\"v as k for (k, v) in ctrl.logScales\\\" ng-change=ctrl.render()></select>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-6\\\">Y-Min</label>\\n      <input type=text class=gf-form-input placeholder=auto empty-to-null ng-model=yaxis.min ng-change=ctrl.render() ng-model-onblur/>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-6\\\">Y-Max</label>\\n      <input type=text class=gf-form-input placeholder=auto empty-to-null ng-model=yaxis.max ng-change=ctrl.render() ng-model-onblur/>\\n    </div>\\n\\n    <div ng-if=yaxis.show>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Decimals</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto empty-to-null bs-tooltip=\\\"'Override automatic decimal precision for y-axis'\\\" data-placement=right ng-model=yaxis.decimals ng-change=ctrl.render() ng-model-onblur/>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Label</label>\\n        <input type=text class=\\\"gf-form-input max-width-20\\\" ng-model=yaxis.label ng-change=ctrl.render() ng-model-onblur/>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h5 class=section-heading>Y-Axes</h5>\\n    <gf-form-switch class=gf-form label=\\\"Align Y-Axes\\\" label-class=width-6 switch-class=width-5 checked=ctrl.panel.yaxis.align on-change=ctrl.render()></gf-form-switch>\\n    <div class=gf-form ng-show=ctrl.panel.yaxis.align>\\n      <label class=\\\"gf-form-label width-6\\\">\\n        Level\\n      </label>\\n      <input type=number class=\\\"gf-form-input width-6\\\" placeholder=0 ng-model=ctrl.panel.yaxis.alignLevel ng-change=ctrl.render() ng-model-onblur bs-tooltip=\\\"'Alignment of Y-axes are based on this value, starting from Y=0'\\\" data-placement=right />\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group aria-label={{ctrl.selectors.xAxisSection}}>\\n    <h5 class=section-heading>X-Axis</h5>\\n    <gf-form-switch class=gf-form label=Show label-class=width-6 checked=ctrl.panel.xaxis.show on-change=ctrl.render()></gf-form-switch>\\n\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-6\\\">Mode</label>\\n      <div class=\\\"gf-form-select-wrapper max-width-15\\\">\\n        <select class=gf-form-input ng-model=ctrl.panel.xaxis.mode ng-options=\\\"v as k for (k, v) in ctrl.xAxisModes\\\" ng-change=ctrl.xAxisModeChanged()>\\n        </select>\\n      </div>\\n    </div>\\n\\n    <!-- Series mode -->\\n    <div class=gf-form ng-if=\\\"ctrl.panel.xaxis.mode === 'series'\\\">\\n      <label class=\\\"gf-form-label width-6\\\">Value</label>\\n      <metric-segment-model property=ctrl.panel.xaxis.values[0] options=ctrl.xAxisStatOptions on-change=ctrl.xAxisValueChanged() custom=false css-class=width-10 select-mode=true></metric-segment-model>\\n    </div>\\n\\n    <!-- Histogram mode -->\\n    <div class=gf-form ng-if=\\\"ctrl.panel.xaxis.mode === 'histogram'\\\">\\n      <label class=\\\"gf-form-label width-6\\\">Buckets</label>\\n      <input type=number class=\\\"gf-form-input max-width-8\\\" ng-model=ctrl.panel.xaxis.buckets placeholder=auto ng-change=ctrl.render() ng-model-onblur bs-tooltip=\\\"'Number of buckets'\\\" data-placement=right />\\n    </div>\\n\\n    <div class=gf-form-inline ng-if=\\\"ctrl.panel.xaxis.mode === 'histogram'\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">X-Min</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto empty-to-null ng-model=ctrl.panel.xaxis.min ng-change=ctrl.render() ng-model-onblur/>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">X-Max</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto empty-to-null ng-model=ctrl.panel.xaxis.max ng-change=ctrl.render() ng-model-onblur/>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { FC } from 'react';\nimport { LoadingPlaceholder } from '@grafana/ui';\n\ninterface Props {\n  pageName?: string;\n}\n\nconst PageLoader: FC<Props> = ({ pageName = '' }) => {\n  const loadingText = `Loading ${pageName}...`;\n  return (\n    <div className=\"page-loader-wrapper\">\n      <LoadingPlaceholder text={loadingText} />\n    </div>\n  );\n};\n\nexport default PageLoader;\n","// Libraries\nimport React, { Component } from 'react';\n\n// Components\nimport PageLoader from '../PageLoader/PageLoader';\n\ninterface Props {\n  isLoading?: boolean;\n  children: JSX.Element[] | JSX.Element;\n}\n\nclass PageContents extends Component<Props> {\n  render() {\n    const { isLoading } = this.props;\n\n    return <div className=\"page-container page-body\">{isLoading ? <PageLoader /> : this.props.children}</div>;\n  }\n}\n\nexport default PageContents;\n","// Libraries\nimport React, { Component } from 'react';\nimport { getTitleFromNavModel } from 'app/core/selectors/navModel';\n\n// Components\nimport PageHeader from '../PageHeader/PageHeader';\nimport { Footer } from '../Footer/Footer';\nimport PageContents from './PageContents';\nimport { CustomScrollbar } from '@grafana/ui';\nimport { NavModel } from '@grafana/data';\nimport { isEqual } from 'lodash';\nimport { Branding } from '../Branding/Branding';\n\ninterface Props {\n  children: JSX.Element[] | JSX.Element;\n  navModel: NavModel;\n}\n\nclass Page extends Component<Props> {\n  static Header = PageHeader;\n  static Contents = PageContents;\n\n  componentDidMount() {\n    this.updateTitle();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    if (!isEqual(prevProps.navModel, this.props.navModel)) {\n      this.updateTitle();\n    }\n  }\n\n  updateTitle = () => {\n    const title = this.getPageTitle;\n    document.title = title ? title + ' - ' + Branding.AppTitle : Branding.AppTitle;\n  };\n\n  get getPageTitle() {\n    const { navModel } = this.props;\n    if (navModel) {\n      return getTitleFromNavModel(navModel) || undefined;\n    }\n    return undefined;\n  }\n\n  render() {\n    const { navModel } = this.props;\n    return (\n      <div className=\"page-scrollbar-wrapper\">\n        <CustomScrollbar autoHeightMin={'100%'} className=\"custom-scrollbar--page\">\n          <div className=\"page-scrollbar-content\">\n            <PageHeader model={navModel} />\n            {this.props.children}\n            <Footer />\n          </div>\n        </CustomScrollbar>\n      </div>\n    );\n  }\n}\n\nexport default Page;\n","import { DashboardAcl, DashboardAclDTO } from 'app/types/acl';\n\nexport function processAclItems(items: DashboardAclDTO[]): DashboardAcl[] {\n  return items.map(processAclItem).sort((a, b) => b.sortRank - a.sortRank || a.name.localeCompare(b.name));\n}\n\nfunction processAclItem(dto: DashboardAclDTO): DashboardAcl {\n  const item = dto as DashboardAcl;\n\n  item.sortRank = 0;\n  if (item.userId > 0) {\n    item.name = item.userLogin;\n    item.sortRank = 10;\n  } else if (item.teamId > 0) {\n    item.name = item.team;\n    item.sortRank = 20;\n  } else if (item.role) {\n    item.icon = 'fa fa-fw fa-street-view';\n    item.name = item.role;\n    item.sortRank = 30;\n    if (item.role === 'Editor') {\n      item.sortRank += 1;\n    }\n  }\n\n  if (item.inherited) {\n    item.sortRank += 100;\n  }\n\n  return item;\n}\n","// Libraries\nimport isNumber from 'lodash/isNumber';\n\nimport { NullValueMode, Field, FieldState, FieldCalcs } from '../types/index';\nimport { Registry, RegistryItem } from '../utils/Registry';\n\nexport enum ReducerID {\n  sum = 'sum',\n  max = 'max',\n  min = 'min',\n  logmin = 'logmin',\n  mean = 'mean',\n  last = 'last',\n  first = 'first',\n  count = 'count',\n  range = 'range',\n  diff = 'diff',\n  delta = 'delta',\n  step = 'step',\n\n  firstNotNull = 'firstNotNull',\n  lastNotNull = 'lastNotNull',\n\n  changeCount = 'changeCount',\n  distinctCount = 'distinctCount',\n\n  allIsZero = 'allIsZero',\n  allIsNull = 'allIsNull',\n}\n\n// Internal function\ntype FieldReducer = (field: Field, ignoreNulls: boolean, nullAsZero: boolean) => FieldCalcs;\n\nexport interface FieldReducerInfo extends RegistryItem {\n  // Internal details\n  emptyInputResult?: any; // typically null, but some things like 'count' & 'sum' should be zero\n  standard: boolean; // The most common stats can all be calculated in a single pass\n  reduce?: FieldReducer;\n}\n\ninterface ReduceFieldOptions {\n  field: Field;\n  reducers: string[]; // The stats to calculate\n}\n\n/**\n * @returns an object with a key for each selected stat\n */\nexport function reduceField(options: ReduceFieldOptions): FieldCalcs {\n  const { field, reducers } = options;\n\n  if (!field || !reducers || reducers.length < 1) {\n    return {};\n  }\n\n  if (field.state?.calcs) {\n    // Find the values we need to calculate\n    const missing: string[] = [];\n    for (const s of reducers) {\n      if (!field.state.calcs.hasOwnProperty(s)) {\n        missing.push(s);\n      }\n    }\n    if (missing.length < 1) {\n      return {\n        ...field.state.calcs,\n      };\n    }\n  }\n  if (!field.state) {\n    field.state = {} as FieldState;\n  }\n\n  const queue = fieldReducers.list(reducers);\n\n  // Return early for empty series\n  // This lets the concrete implementations assume at least one row\n  const data = field.values;\n  if (data.length < 1) {\n    const calcs = { ...field.state.calcs } as FieldCalcs;\n    for (const reducer of queue) {\n      calcs[reducer.id] = reducer.emptyInputResult !== null ? reducer.emptyInputResult : null;\n    }\n    return (field.state.calcs = calcs);\n  }\n\n  const { nullValueMode } = field.config;\n  const ignoreNulls = nullValueMode === NullValueMode.Ignore;\n  const nullAsZero = nullValueMode === NullValueMode.AsZero;\n\n  // Avoid calculating all the standard stats if possible\n  if (queue.length === 1 && queue[0].reduce) {\n    const values = queue[0].reduce(field, ignoreNulls, nullAsZero);\n    field.state.calcs = {\n      ...field.state.calcs,\n      ...values,\n    };\n    return values;\n  }\n\n  // For now everything can use the standard stats\n  let values = doStandardCalcs(field, ignoreNulls, nullAsZero);\n\n  for (const reducer of queue) {\n    if (!values.hasOwnProperty(reducer.id) && reducer.reduce) {\n      values = {\n        ...values,\n        ...reducer.reduce(field, ignoreNulls, nullAsZero),\n      };\n    }\n  }\n\n  field.state.calcs = {\n    ...field.state.calcs,\n    ...values,\n  };\n  return values;\n}\n\n// ------------------------------------------------------------------------------\n//\n//  No Exported symbols below here.\n//\n// ------------------------------------------------------------------------------\n\nexport const fieldReducers = new Registry<FieldReducerInfo>(() => [\n  {\n    id: ReducerID.lastNotNull,\n    name: 'Last (not null)',\n    description: 'Last non-null value',\n    standard: true,\n    aliasIds: ['current'],\n    reduce: calculateLastNotNull,\n  },\n  {\n    id: ReducerID.last,\n    name: 'Last',\n    description: 'Last Value',\n    standard: true,\n    reduce: calculateLast,\n  },\n  { id: ReducerID.first, name: 'First', description: 'First Value', standard: true, reduce: calculateFirst },\n  {\n    id: ReducerID.firstNotNull,\n    name: 'First (not null)',\n    description: 'First non-null value',\n    standard: true,\n    reduce: calculateFirstNotNull,\n  },\n  { id: ReducerID.min, name: 'Min', description: 'Minimum Value', standard: true },\n  { id: ReducerID.max, name: 'Max', description: 'Maximum Value', standard: true },\n  { id: ReducerID.mean, name: 'Mean', description: 'Average Value', standard: true, aliasIds: ['avg'] },\n  {\n    id: ReducerID.sum,\n    name: 'Total',\n    description: 'The sum of all values',\n    emptyInputResult: 0,\n    standard: true,\n    aliasIds: ['total'],\n  },\n  {\n    id: ReducerID.count,\n    name: 'Count',\n    description: 'Number of values in response',\n    emptyInputResult: 0,\n    standard: true,\n  },\n  {\n    id: ReducerID.range,\n    name: 'Range',\n    description: 'Difference between minimum and maximum values',\n    standard: true,\n  },\n  {\n    id: ReducerID.delta,\n    name: 'Delta',\n    description: 'Cumulative change in value',\n    standard: true,\n  },\n  {\n    id: ReducerID.step,\n    name: 'Step',\n    description: 'Minimum interval between values',\n    standard: true,\n  },\n  {\n    id: ReducerID.diff,\n    name: 'Difference',\n    description: 'Difference between first and last values',\n    standard: true,\n  },\n  {\n    id: ReducerID.logmin,\n    name: 'Min (above zero)',\n    description: 'Used for log min scale',\n    standard: true,\n  },\n  {\n    id: ReducerID.allIsZero,\n    name: 'All Zeros',\n    description: 'All values are zero',\n    emptyInputResult: false,\n    standard: true,\n  },\n  {\n    id: ReducerID.allIsNull,\n    name: 'All Nulls',\n    description: 'All values are null',\n    emptyInputResult: true,\n    standard: true,\n  },\n  {\n    id: ReducerID.changeCount,\n    name: 'Change Count',\n    description: 'Number of times the value changes',\n    standard: false,\n    reduce: calculateChangeCount,\n  },\n  {\n    id: ReducerID.distinctCount,\n    name: 'Distinct Count',\n    description: 'Number of distinct values',\n    standard: false,\n    reduce: calculateDistinctCount,\n  },\n]);\n\nexport function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const calcs = {\n    sum: 0,\n    max: -Number.MAX_VALUE,\n    min: Number.MAX_VALUE,\n    logmin: Number.MAX_VALUE,\n    mean: null,\n    last: null,\n    first: null,\n    lastNotNull: null,\n    firstNotNull: null,\n    count: 0,\n    nonNullCount: 0,\n    allIsNull: true,\n    allIsZero: true,\n    range: null,\n    diff: null,\n    delta: 0,\n    step: Number.MAX_VALUE,\n\n    // Just used for calcutations -- not exposed as a stat\n    previousDeltaUp: true,\n  } as FieldCalcs;\n\n  const data = field.values;\n  calcs.count = data.length;\n\n  for (let i = 0; i < data.length; i++) {\n    let currentValue = data.get(i);\n\n    if (i === 0) {\n      calcs.first = currentValue;\n    }\n\n    calcs.last = currentValue;\n\n    if (currentValue === null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n\n    if (currentValue !== null && currentValue !== undefined) {\n      const isFirst = calcs.firstNotNull === null;\n      if (isFirst) {\n        calcs.firstNotNull = currentValue;\n      }\n\n      if (isNumber(currentValue)) {\n        calcs.sum += currentValue;\n        calcs.allIsNull = false;\n        calcs.nonNullCount++;\n\n        if (!isFirst) {\n          const step = currentValue - calcs.lastNotNull!;\n          if (calcs.step > step) {\n            calcs.step = step; // the minimum interval\n          }\n\n          if (calcs.lastNotNull! > currentValue) {\n            // counter reset\n            calcs.previousDeltaUp = false;\n            if (i === data.length - 1) {\n              // reset on last\n              calcs.delta += currentValue;\n            }\n          } else {\n            if (calcs.previousDeltaUp) {\n              calcs.delta += step; // normal increment\n            } else {\n              calcs.delta += currentValue; // account for counter reset\n            }\n            calcs.previousDeltaUp = true;\n          }\n        }\n\n        if (currentValue > calcs.max) {\n          calcs.max = currentValue;\n        }\n\n        if (currentValue < calcs.min) {\n          calcs.min = currentValue;\n        }\n\n        if (currentValue < calcs.logmin && currentValue > 0) {\n          calcs.logmin = currentValue;\n        }\n      }\n\n      if (currentValue !== 0) {\n        calcs.allIsZero = false;\n      }\n\n      calcs.lastNotNull = currentValue;\n    }\n  }\n\n  if (calcs.max === -Number.MAX_VALUE) {\n    calcs.max = null;\n  }\n\n  if (calcs.min === Number.MAX_VALUE) {\n    calcs.min = null;\n  }\n\n  if (calcs.step === Number.MAX_VALUE) {\n    calcs.step = null;\n  }\n\n  if (calcs.nonNullCount > 0) {\n    calcs.mean = calcs.sum! / calcs.nonNullCount;\n  }\n\n  if (calcs.allIsNull) {\n    calcs.allIsZero = false;\n  }\n\n  if (calcs.max !== null && calcs.min !== null) {\n    calcs.range = calcs.max - calcs.min;\n  }\n\n  if (isNumber(calcs.firstNotNull) && isNumber(calcs.lastNotNull)) {\n    calcs.diff = calcs.lastNotNull - calcs.firstNotNull;\n  }\n\n  return calcs;\n}\n\nfunction calculateFirst(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  return { first: field.values.get(0) };\n}\n\nfunction calculateFirstNotNull(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  for (let idx = 0; idx < data.length; idx++) {\n    const v = data.get(idx);\n    if (v != null && v !== undefined) {\n      return { firstNotNull: v };\n    }\n  }\n  return { firstNotNull: null };\n}\n\nfunction calculateLast(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  return { last: data.get(data.length - 1) };\n}\n\nfunction calculateLastNotNull(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  let idx = data.length - 1;\n  while (idx >= 0) {\n    const v = data.get(idx--);\n    if (v != null && v !== undefined) {\n      return { lastNotNull: v };\n    }\n  }\n  return { lastNotNull: null };\n}\n\nfunction calculateChangeCount(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  let count = 0;\n  let first = true;\n  let last: any = null;\n  for (let i = 0; i < data.length; i++) {\n    let currentValue = data.get(i);\n    if (currentValue === null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n    if (!first && last !== currentValue) {\n      count++;\n    }\n    first = false;\n    last = currentValue;\n  }\n\n  return { changeCount: count };\n}\n\nfunction calculateDistinctCount(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  const distinct = new Set<any>();\n  for (let i = 0; i < data.length; i++) {\n    let currentValue = data.get(i);\n    if (currentValue === null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n    distinct.add(currentValue);\n  }\n  return { distinctCount: distinct.size };\n}\n","export const NO_ID_SECTIONS = ['Recent', 'Starred'];\n// Height of the search result item\nexport const SEARCH_ITEM_HEIGHT = 48;\nexport const SEARCH_ITEM_MARGIN = 4;\nexport const DEFAULT_SORT = { label: 'A-Z', value: 'alpha-asc' };\nexport const SECTION_STORAGE_KEY = 'search.sections';\n","import React, { PureComponent } from 'react';\nimport { Select, Input, Tooltip, LegacyForms } from '@grafana/ui';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { getTimeZoneGroups, TimeZone, rangeUtil, SelectableValue } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport kbn from 'app/core/utils/kbn';\nimport isEmpty from 'lodash/isEmpty';\nimport { selectors } from '@grafana/e2e-selectors';\n\nconst grafanaTimeZones = [\n  { value: '', label: 'Default' },\n  { value: 'browser', label: 'Local browser time' },\n  { value: 'utc', label: 'UTC' },\n];\n\nconst timeZones = getTimeZoneGroups().reduce((tzs, group) => {\n  const options = group.options.map(tz => ({ value: tz, label: tz }));\n  tzs.push.apply(tzs, options);\n  return tzs;\n}, grafanaTimeZones);\n\ninterface Props {\n  getDashboard: () => DashboardModel;\n  onTimeZoneChange: (timeZone: TimeZone) => void;\n  onRefreshIntervalChange: (interval: string[]) => void;\n  onNowDelayChange: (nowDelay: string) => void;\n  onHideTimePickerChange: (hide: boolean) => void;\n}\n\ninterface State {\n  isNowDelayValid: boolean;\n}\n\nexport class TimePickerSettings extends PureComponent<Props, State> {\n  state: State = { isNowDelayValid: true };\n\n  componentDidMount() {\n    const { timepicker } = this.props.getDashboard();\n    let intervals: string[] = timepicker.refresh_intervals ?? [\n      '5s',\n      '10s',\n      '30s',\n      '1m',\n      '5m',\n      '15m',\n      '30m',\n      '1h',\n      '2h',\n      '1d',\n    ];\n\n    if (config.minRefreshInterval) {\n      intervals = intervals.filter(rate => {\n        return kbn.interval_to_ms(rate) > kbn.interval_to_ms(config.minRefreshInterval);\n      });\n    }\n\n    this.props.onRefreshIntervalChange(intervals);\n  }\n\n  getRefreshIntervals = () => {\n    const dashboard = this.props.getDashboard();\n    if (!Array.isArray(dashboard.timepicker.refresh_intervals)) {\n      return '';\n    }\n    return dashboard.timepicker.refresh_intervals.join(',');\n  };\n\n  onRefreshIntervalChange = (event: React.FormEvent<HTMLInputElement>) => {\n    if (!event.currentTarget.value) {\n      return;\n    }\n    const intervals = event.currentTarget.value.split(',');\n    this.props.onRefreshIntervalChange(intervals);\n    this.forceUpdate();\n  };\n\n  onNowDelayChange = (event: React.FormEvent<HTMLInputElement>) => {\n    const value = event.currentTarget.value;\n\n    if (isEmpty(value)) {\n      this.setState({ isNowDelayValid: true });\n      return this.props.onNowDelayChange(value);\n    }\n\n    if (rangeUtil.isValidTimeSpan(value)) {\n      this.setState({ isNowDelayValid: true });\n      return this.props.onNowDelayChange(value);\n    }\n\n    this.setState({ isNowDelayValid: false });\n  };\n\n  onHideTimePickerChange = () => {\n    const dashboard = this.props.getDashboard();\n    this.props.onHideTimePickerChange(!dashboard.timepicker.hidden);\n    this.forceUpdate();\n  };\n\n  onTimeZoneChange = (timeZone: SelectableValue<string>) => {\n    if (!timeZone || typeof timeZone.value !== 'string') {\n      return;\n    }\n    this.props.onTimeZoneChange(timeZone.value);\n    this.forceUpdate();\n  };\n\n  render() {\n    const dashboard = this.props.getDashboard();\n    const value = timeZones.find(item => item.value === dashboard.timezone);\n\n    return (\n      <div className=\"editor-row\">\n        <h5 className=\"section-heading\">Time Options</h5>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\" aria-label={selectors.components.TimeZonePicker.container}>\n            <label className=\"gf-form-label width-7\">Timezone</label>\n            <Select isSearchable={true} value={value} onChange={this.onTimeZoneChange} options={timeZones} width={40} />\n          </div>\n\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label width-7\">Auto-refresh</span>\n            <Input width={60} value={this.getRefreshIntervals()} onChange={this.onRefreshIntervalChange} />\n          </div>\n          <div className=\"gf-form\">\n            <span className=\"gf-form-label width-7\">Now delay now-</span>\n            <Tooltip\n              placement=\"right\"\n              content={'Enter 1m to ignore the last minute (because it can contain incomplete metrics)'}\n            >\n              <Input\n                width={60}\n                invalid={!this.state.isNowDelayValid}\n                placeholder=\"0m\"\n                onChange={this.onNowDelayChange}\n                defaultValue={dashboard.timepicker.nowDelay}\n              />\n            </Tooltip>\n          </div>\n\n          <div className=\"gf-form\">\n            <LegacyForms.Switch\n              labelClass=\"width-7\"\n              label=\"Hide time picker\"\n              checked={dashboard.timepicker.hidden ?? false}\n              onChange={this.onHideTimePickerChange}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","export class Deferred {\n  resolve: any;\n  reject: any;\n  promise: Promise<any>;\n  constructor() {\n    this.resolve = null;\n    this.reject = null;\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = resolve;\n      this.reject = reject;\n    });\n    Object.freeze(this);\n  }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { default as lodashDefaults } from 'lodash/defaults';\n\nimport { VariableType } from '@grafana/data';\nimport { VariableModel, VariableOption, VariableWithOptions } from '../../templating/types';\nimport { AddVariable, ALL_VARIABLE_VALUE, getInstanceState, NEW_VARIABLE_ID, VariablePayload } from './types';\nimport { variableAdapters } from '../adapters';\nimport { changeVariableNameSucceeded } from '../editor/reducer';\nimport { Deferred } from '../../../core/utils/deferred';\nimport { initialVariablesState, VariablesState } from './variablesReducer';\nimport { isQuery } from '../guard';\n\nconst sharedReducerSlice = createSlice({\n  name: 'templating/shared',\n  initialState: initialVariablesState,\n  reducers: {\n    addVariable: (state: VariablesState, action: PayloadAction<VariablePayload<AddVariable>>) => {\n      const id = action.payload.id ?? action.payload.data.model.name; // for testing purposes we can call this with an id\n      const initialState = cloneDeep(variableAdapters.get(action.payload.type).initialState);\n      const model = cloneDeep(action.payload.data.model);\n\n      const variable = {\n        ...lodashDefaults({}, model, initialState),\n        id: id,\n        index: action.payload.data.index,\n        global: action.payload.data.global,\n      };\n\n      state[id] = variable;\n    },\n    addInitLock: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState(state, action.payload.id!);\n      instanceState.initLock = new Deferred();\n    },\n    resolveInitLock: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState(state, action.payload.id!);\n      instanceState.initLock?.resolve();\n    },\n    removeInitLock: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const instanceState = getInstanceState(state, action.payload.id!);\n      instanceState.initLock = null;\n    },\n    removeVariable: (state: VariablesState, action: PayloadAction<VariablePayload<{ reIndex: boolean }>>) => {\n      delete state[action.payload.id!];\n      if (!action.payload.data.reIndex) {\n        return;\n      }\n\n      const variableStates = Object.values(state);\n      for (let index = 0; index < variableStates.length; index++) {\n        variableStates[index].index = index;\n      }\n    },\n    duplicateVariable: (state: VariablesState, action: PayloadAction<VariablePayload<{ newId: string }>>) => {\n      const original = cloneDeep<VariableModel>(state[action.payload.id]);\n      const name = `copy_of_${original.name}`;\n      const newId = action.payload.data?.newId ?? name;\n      const index = Object.keys(state).length;\n      state[newId] = {\n        ...cloneDeep(variableAdapters.get(action.payload.type).initialState),\n        ...original,\n        id: newId,\n        name,\n        index,\n      };\n    },\n    changeVariableOrder: (\n      state: VariablesState,\n      action: PayloadAction<VariablePayload<{ fromIndex: number; toIndex: number }>>\n    ) => {\n      const variables = Object.values(state).map(s => s);\n      const fromVariable = variables.find(v => v.index === action.payload.data.fromIndex);\n      const toVariable = variables.find(v => v.index === action.payload.data.toIndex);\n\n      if (fromVariable) {\n        state[fromVariable.id!].index = action.payload.data.toIndex;\n      }\n\n      if (toVariable) {\n        state[toVariable.id!].index = action.payload.data.fromIndex;\n      }\n    },\n    storeNewVariable: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n      const id = action.payload.id!;\n      const emptyVariable = cloneDeep<VariableModel>(state[NEW_VARIABLE_ID]);\n      state[id!] = {\n        ...cloneDeep(variableAdapters.get(action.payload.type).initialState),\n        ...emptyVariable,\n        id,\n        index: emptyVariable.index,\n      };\n    },\n    changeVariableType: (state: VariablesState, action: PayloadAction<VariablePayload<{ newType: VariableType }>>) => {\n      const { id } = action.payload;\n      const { label, name, index } = state[id!];\n\n      state[id!] = {\n        ...cloneDeep(variableAdapters.get(action.payload.data.newType).initialState),\n        id: id,\n        label,\n        name,\n        index,\n      };\n    },\n    setCurrentVariableValue: (\n      state: VariablesState,\n      action: PayloadAction<VariablePayload<{ option: VariableOption | undefined }>>\n    ) => {\n      if (!action.payload.data.option) {\n        return;\n      }\n\n      const instanceState = getInstanceState<VariableWithOptions>(state, action.payload.id);\n      const current = { ...action.payload.data.option };\n\n      if (Array.isArray(current.text) && current.text.length > 0) {\n        current.text = current.text.join(' + ');\n      } else if (Array.isArray(current.value) && current.value[0] !== ALL_VARIABLE_VALUE) {\n        current.text = current.value.join(' + ');\n      }\n\n      instanceState.current = current;\n      instanceState.options = instanceState.options.map(option => {\n        let selected = false;\n        if (Array.isArray(current.value)) {\n          for (let index = 0; index < current.value.length; index++) {\n            const value = current.value[index];\n            if (option.value === value) {\n              selected = true;\n              break;\n            }\n          }\n        } else if (option.value === current.value) {\n          selected = true;\n        }\n        option.selected = selected;\n        return option;\n      });\n\n      if (hasTags(current) && isQuery(instanceState)) {\n        const selected = current!.tags!.reduce((all: Record<string, boolean>, tag) => {\n          all[tag.text.toString()] = tag.selected;\n          return all;\n        }, {});\n\n        instanceState.tags = instanceState.tags.map(t => {\n          const text = t.text.toString();\n          t.selected = selected[text];\n          return t;\n        });\n      }\n    },\n    changeVariableProp: (\n      state: VariablesState,\n      action: PayloadAction<VariablePayload<{ propName: string; propValue: any }>>\n    ) => {\n      const instanceState = getInstanceState(state, action.payload.id!);\n      (instanceState as Record<string, any>)[action.payload.data.propName] = action.payload.data.propValue;\n    },\n  },\n  extraReducers: builder =>\n    builder.addCase(changeVariableNameSucceeded, (state, action) => {\n      const instanceState = getInstanceState(state, action.payload.id);\n      instanceState.name = action.payload.data.newName;\n    }),\n});\n\nexport const sharedReducer = sharedReducerSlice.reducer;\n\nexport const {\n  addInitLock,\n  removeVariable,\n  addVariable,\n  changeVariableProp,\n  changeVariableOrder,\n  storeNewVariable,\n  duplicateVariable,\n  setCurrentVariableValue,\n  changeVariableType,\n  removeInitLock,\n  resolveInitLock,\n} = sharedReducerSlice.actions;\n\nconst hasTags = (option: VariableOption): boolean => {\n  return Array.isArray(option.tags);\n};\n","import React, { PureComponent, SyntheticEvent } from 'react';\nimport { cx, css } from 'emotion';\nimport { stylesFactory, withTheme } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Themeable } from '../../types';\nimport { ComponentSize } from '../../types/size';\nimport { Button, ButtonVariant } from '../Button';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    buttonContainer: css`\n      direction: rtl;\n      display: flex;\n      align-items: center;\n    `,\n    buttonDisabled: css`\n      text-decoration: none;\n      color: ${theme.colors.text};\n      opacity: 0.65;\n      cursor: not-allowed;\n      pointer-events: none;\n    `,\n    buttonShow: css`\n      opacity: 1;\n      transition: opacity 0.1s ease;\n      z-index: 2;\n    `,\n    buttonHide: css`\n      opacity: 0;\n      transition: opacity 0.1s ease;\n      z-index: 0;\n    `,\n    confirmButtonContainer: css`\n      overflow: hidden;\n      position: absolute;\n      z-index: 1;\n    `,\n    confirmButton: css`\n      display: flex;\n      align-items: flex-start;\n    `,\n    confirmButtonShow: css`\n      opacity: 1;\n      transition: opacity 0.08s ease-out, transform 0.1s ease-out;\n      transform: translateX(0);\n    `,\n    confirmButtonHide: css`\n      opacity: 0;\n      transition: opacity 0.12s ease-in, transform 0.14s ease-in;\n      transform: translateX(100px);\n    `,\n  };\n});\n\nexport interface Props extends Themeable {\n  className?: string;\n  size?: ComponentSize;\n  confirmText?: string;\n  disabled?: boolean;\n  confirmVariant?: ButtonVariant;\n  closeOnConfirm?: boolean;\n\n  onConfirm(): void;\n  onClick?(): void;\n  onCancel?(): void;\n}\n\ninterface State {\n  showConfirm: boolean;\n}\n\nclass UnThemedConfirmButton extends PureComponent<Props, State> {\n  static defaultProps: Partial<Props> = {\n    size: 'md',\n    confirmText: 'Save',\n    disabled: false,\n    confirmVariant: 'primary',\n  };\n\n  state: State = {\n    showConfirm: false,\n  };\n\n  onClickButton = (event: SyntheticEvent) => {\n    if (event) {\n      event.preventDefault();\n    }\n\n    this.setState({\n      showConfirm: true,\n    });\n\n    if (this.props.onClick) {\n      this.props.onClick();\n    }\n  };\n\n  onClickCancel = (event: SyntheticEvent) => {\n    if (event) {\n      event.preventDefault();\n    }\n    this.setState({\n      showConfirm: false,\n    });\n    if (this.props.onCancel) {\n      this.props.onCancel();\n    }\n  };\n  onConfirm = (event: SyntheticEvent) => {\n    this.props.onConfirm();\n    if (this.props.closeOnConfirm) {\n      this.setState({\n        showConfirm: false,\n      });\n    }\n  };\n\n  render() {\n    const {\n      theme,\n      className,\n      size,\n      disabled,\n      confirmText,\n      confirmVariant: confirmButtonVariant,\n      children,\n    } = this.props;\n    const styles = getStyles(theme);\n    const buttonClass = cx(\n      className,\n      this.state.showConfirm ? styles.buttonHide : styles.buttonShow,\n      disabled && styles.buttonDisabled\n    );\n    const confirmButtonClass = cx(\n      styles.confirmButton,\n      this.state.showConfirm ? styles.confirmButtonShow : styles.confirmButtonHide\n    );\n    const onClick = disabled ? () => {} : this.onClickButton;\n\n    return (\n      <span className={styles.buttonContainer}>\n        {typeof children === 'string' ? (\n          <span className={buttonClass}>\n            <Button size={size} variant=\"link\" onClick={onClick}>\n              {children}\n            </Button>\n          </span>\n        ) : (\n          <span className={buttonClass} onClick={onClick}>\n            {children}\n          </span>\n        )}\n        <span className={styles.confirmButtonContainer}>\n          <span className={confirmButtonClass}>\n            <Button size={size} variant=\"link\" onClick={this.onClickCancel}>\n              Cancel\n            </Button>\n            <Button size={size} variant={confirmButtonVariant} onClick={this.onConfirm}>\n              {confirmText}\n            </Button>\n          </span>\n        </span>\n      </span>\n    );\n  }\n}\n\nexport const ConfirmButton = withTheme(UnThemedConfirmButton);\nConfirmButton.displayName = 'ConfirmButton';\n","import React, { FC } from 'react';\nimport { ConfirmButton } from './ConfirmButton';\nimport { ComponentSize } from '../../types/size';\nimport { Button } from '../Button';\n\nexport interface Props {\n  size?: ComponentSize;\n  disabled?: boolean;\n  onConfirm(): void;\n}\n\nexport const DeleteButton: FC<Props> = ({ size, disabled, onConfirm }) => {\n  return (\n    <ConfirmButton\n      confirmText=\"Delete\"\n      confirmVariant=\"destructive\"\n      size={size || 'md'}\n      disabled={disabled}\n      onConfirm={onConfirm}\n    >\n      <Button variant=\"destructive\" icon=\"times\" size={size || 'sm'} />\n    </ConfirmButton>\n  );\n};\n","import React, { PureComponent } from 'react';\nimport Clipboard from 'clipboard';\nimport { Button, ButtonProps } from '../Button';\n\ninterface Props extends ButtonProps {\n  getText(): string;\n  onClipboardCopy?(e: Clipboard.Event): void;\n  onClipboardError?(e: Clipboard.Event): void;\n}\n\nexport class ClipboardButton extends PureComponent<Props> {\n  // @ts-ignore\n  private clipboard: Clipboard;\n  // @ts-ignore\n  private elem: HTMLButtonElement;\n\n  setRef = (elem: HTMLButtonElement) => {\n    this.elem = elem;\n  };\n\n  componentDidMount() {\n    const { getText, onClipboardCopy, onClipboardError } = this.props;\n\n    this.clipboard = new Clipboard(this.elem, {\n      text: () => getText(),\n    });\n\n    this.clipboard.on('success', (e: Clipboard.Event) => {\n      onClipboardCopy && onClipboardCopy(e);\n    });\n\n    this.clipboard.on('error', (e: Clipboard.Event) => {\n      onClipboardError && onClipboardError(e);\n    });\n  }\n\n  componentWillUnmount() {\n    this.clipboard.destroy();\n  }\n\n  render() {\n    const { getText, onClipboardCopy, onClipboardError, children, ...buttonProps } = this.props;\n\n    return (\n      <Button {...buttonProps} ref={this.setRef}>\n        {children}\n      </Button>\n    );\n  }\n}\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\nimport { css, cx } from 'emotion';\n\n// @ts-ignore\nimport RCCascader from 'rc-cascader';\nimport { CascaderOption } from '../Cascader/Cascader';\nimport { onChangeCascader, onLoadDataCascader } from '../Cascader/optionMappings';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\n\nexport interface ButtonCascaderProps {\n  options: CascaderOption[];\n  children: string;\n  disabled?: boolean;\n  value?: string[];\n  fieldNames?: { label: string; value: string; children: string };\n  loadData?: (selectedOptions: CascaderOption[]) => void;\n  onChange?: (value: string[], selectedOptions: CascaderOption[]) => void;\n  onPopupVisibleChange?: (visible: boolean) => void;\n  className?: string;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    popup: css`\n      label: popup;\n      z-index: ${theme.zIndex.dropdown};\n    `,\n    icon: css`\n      margin: 1px 0 0 4px;\n    `,\n  };\n});\n\nexport const ButtonCascader: React.FC<ButtonCascaderProps> = props => {\n  const { onChange, className, loadData, ...rest } = props;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <RCCascader\n      onChange={onChangeCascader(onChange)}\n      loadData={onLoadDataCascader(loadData)}\n      popupClassName={styles.popup}\n      {...rest}\n      expandIcon={null}\n    >\n      <button className={cx('gf-form-label', className)} disabled={props.disabled}>\n        {props.children} <Icon name=\"angle-down\" className={styles.icon} />\n      </button>\n    </RCCascader>\n  );\n};\n\nButtonCascader.displayName = 'ButtonCascader';\n","import React, { SFC } from 'react';\nimport { Icon } from '../Icon/Icon';\n\ninterface LoadingPlaceholderProps {\n  text: string;\n}\n\nexport const LoadingPlaceholder: SFC<LoadingPlaceholderProps> = ({ text }) => (\n  <div className=\"gf-form-group\">\n    {text} <Icon name=\"fa fa-spinner\" className=\"fa-spin\" />\n  </div>\n);\n","import React, { PureComponent } from 'react';\nimport { select, pie, arc, event } from 'd3';\nimport sum from 'lodash/sum';\nimport { DisplayValue, GrafanaThemeType, formattedValueToString } from '@grafana/data';\nimport { Themeable } from '../../index';\nimport { colors as grafana_colors } from '../../utils/index';\n\nexport enum PieChartType {\n  PIE = 'pie',\n  DONUT = 'donut',\n}\n\nexport interface Props extends Themeable {\n  height: number;\n  width: number;\n  values: DisplayValue[];\n\n  pieType: PieChartType;\n  strokeWidth: number;\n}\n\nexport class PieChart extends PureComponent<Props> {\n  containerElement: any;\n  svgElement: any;\n  tooltipElement: any;\n  tooltipValueElement: any;\n\n  static defaultProps = {\n    pieType: 'pie',\n    format: 'short',\n    stat: 'current',\n    strokeWidth: 1,\n    theme: GrafanaThemeType.Dark,\n  };\n\n  componentDidMount() {\n    this.draw();\n  }\n\n  componentDidUpdate() {\n    this.draw();\n  }\n\n  draw() {\n    const { values, pieType, strokeWidth } = this.props;\n\n    if (values.length === 0) {\n      return;\n    }\n\n    const data = values.map(datapoint => datapoint.numeric);\n    const names = values.map(datapoint => formattedValueToString(datapoint));\n    const colors = values.map((p, idx) => {\n      if (p.color) {\n        return p.color;\n      }\n      return grafana_colors[idx % grafana_colors.length];\n    });\n\n    const total = sum(data) || 1;\n    const percents = data.map((item: number) => (item / total) * 100);\n\n    const width = this.containerElement.offsetWidth;\n    const height = this.containerElement.offsetHeight;\n    const radius = Math.min(width, height) / 2;\n\n    const outerRadius = radius - radius / 10;\n    const innerRadius = pieType === PieChartType.PIE ? 0 : radius - radius / 3;\n\n    const svg = select(this.svgElement)\n      .html('')\n      .attr('width', width)\n      .attr('height', height)\n      .append('g')\n      .attr('transform', `translate(${width / 2},${height / 2})`);\n\n    const pieChart = pie();\n\n    const customArc = arc()\n      .outerRadius(outerRadius)\n      .innerRadius(innerRadius)\n      .padAngle(0);\n\n    svg\n      .selectAll('path')\n      .data(pieChart(data))\n      .enter()\n      .append('path')\n      .attr('d', customArc as any)\n      .attr('fill', (d: any, idx: number) => colors[idx])\n      .style('fill-opacity', 0.15)\n      .style('stroke', (d: any, idx: number) => colors[idx])\n      .style('stroke-width', `${strokeWidth}px`)\n      .on('mouseover', (d: any, idx: any) => {\n        select(this.tooltipElement).style('opacity', 1);\n        select(this.tooltipValueElement).text(`${names[idx]} (${percents[idx].toFixed(2)}%)`);\n      })\n      .on('mousemove', () => {\n        select(this.tooltipElement)\n          .style('top', `${event.pageY - height / 2}px`)\n          .style('left', `${event.pageX}px`);\n      })\n      .on('mouseout', () => {\n        select(this.tooltipElement).style('opacity', 0);\n      });\n  }\n\n  render() {\n    const { height, width, values } = this.props;\n\n    if (values.length > 0) {\n      return (\n        <div className=\"piechart-panel\">\n          <div\n            ref={element => (this.containerElement = element)}\n            className=\"piechart-container\"\n            style={{\n              height: `${height * 0.9}px`,\n              width: `${Math.min(width, height * 1.3)}px`,\n            }}\n          >\n            <svg ref={element => (this.svgElement = element)} />\n          </div>\n          <div className=\"piechart-tooltip\" ref={element => (this.tooltipElement = element)}>\n            <div className=\"piechart-tooltip-time\">\n              <div\n                id=\"tooltip-value\"\n                className=\"piechart-tooltip-value\"\n                ref={element => (this.tooltipValueElement = element)}\n              />\n            </div>\n          </div>\n        </div>\n      );\n    } else {\n      return (\n        <div className=\"piechart-panel\">\n          <div className=\"datapoints-warning\">\n            <span className=\"small\">No data points</span>\n          </div>\n        </div>\n      );\n    }\n  }\n}\n","// Libraries\nimport React, { FunctionComponent } from 'react';\nimport { Icon } from '../Icon/Icon';\n\ninterface Props {\n  title?: string | JSX.Element;\n  onClose?: () => void;\n  children: JSX.Element | JSX.Element[] | boolean;\n  onAdd?: () => void;\n}\n\nexport const PanelOptionsGroup: FunctionComponent<Props> = props => {\n  return (\n    <div className=\"panel-options-group\">\n      {props.onAdd ? (\n        <div className=\"panel-options-group__header\">\n          <button className=\"panel-options-group__add-btn\" onClick={props.onAdd}>\n            <div className=\"panel-options-group__add-circle\">\n              <Icon name=\"plus\" />\n            </div>\n            <span className=\"panel-options-group__title\">{props.title}</span>\n          </button>\n        </div>\n      ) : (\n        props.title && (\n          <div className=\"panel-options-group__header\">\n            <span className=\"panel-options-group__title\">{props.title}</span>\n            {props.onClose && (\n              <button className=\"btn btn-link\" onClick={props.onClose}>\n                <Icon name=\"times\" />\n              </button>\n            )}\n          </div>\n        )\n      )}\n      {props.children && <div className=\"panel-options-group__body\">{props.children}</div>}\n    </div>\n  );\n};\n","import React, { SFC } from 'react';\n\ninterface Props {\n  cols?: number;\n  children: JSX.Element[] | JSX.Element;\n}\n\nexport const PanelOptionsGrid: SFC<Props> = ({ children }) => {\n  return <div className=\"panel-options-grid\">{children}</div>;\n};\n","import React, { FC } from 'react';\n\nexport interface Props {\n  children: JSX.Element | string;\n}\n\nconst EmptySearchResult: FC<Props> = ({ children }) => {\n  return <div className=\"empty-search-result\">{children}</div>;\n};\n\nexport { EmptySearchResult };\n","import React, { FC } from 'react';\nimport RcTimePicker from 'rc-time-picker';\nimport { css, cx } from 'emotion';\nimport { dateTime, DateTime, dateTimeAsMoment, GrafanaTheme } from '@grafana/data';\nimport { useTheme, Icon } from '../../index';\nimport { stylesFactory } from '../../themes';\nimport { inputSizes } from '../Forms/commonStyles';\nimport { FormInputSize } from '../Forms/types';\nimport { focusCss } from '../../themes/mixins';\n\nexport interface Props {\n  onChange: (value: DateTime) => void;\n  value: DateTime;\n  showHour?: boolean;\n  minuteStep?: number;\n  size?: FormInputSize;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const bgColor = theme.colors.formInputBg;\n  const menuShadowColor = theme.colors.dropdownShadow;\n  const optionBgHover = theme.colors.dropdownOptionHoverBg;\n  const borderRadius = theme.border.radius.sm;\n  const borderColor = theme.colors.formInputBorder;\n  return {\n    caretWrapper: css`\n      position: absolute;\n      right: 8px;\n      top: 50%;\n      transform: translateY(-50%);\n      display: inline-block;\n      text-align: right;\n      z-index: 1071;\n    `,\n    picker: css`\n      .rc-time-picker-panel-select {\n        font-size: 14px;\n        background-color: ${bgColor};\n        border-color: ${borderColor};\n        li {\n          outline-width: 2px;\n          &.rc-time-picker-panel-select-option-selected {\n            background-color: inherit;\n            border: 1px solid ${theme.palette.orange};\n            border-radius: ${borderRadius};\n          }\n\n          &:hover {\n            background: ${optionBgHover};\n          }\n        }\n      }\n\n      .rc-time-picker-panel-inner {\n        box-shadow: 0px 4px 4px ${menuShadowColor};\n        background-color: ${bgColor};\n        border-color: ${borderColor};\n        border-radius: ${borderRadius};\n        margin-top: 3px;\n\n        .rc-time-picker-panel-input-wrap {\n          margin-right: 2px;\n\n          &,\n          .rc-time-picker-panel-input {\n            background-color: ${bgColor};\n            padding-top: 2px;\n          }\n        }\n      }\n    `,\n    input: css`\n      .rc-time-picker-input {\n        background-color: ${bgColor};\n        border-radius: ${borderRadius};\n        border-color: ${borderColor};\n        height: ${theme.spacing.formInputHeight}px;\n\n        &:focus {\n          ${focusCss(theme)}\n        }\n      }\n    `,\n  };\n});\n\nexport const TimeOfDayPicker: FC<Props> = ({ minuteStep = 1, showHour = true, onChange, value, size = 'auto' }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n  return (\n    <div>\n      <RcTimePicker\n        className={cx(inputSizes()[size], styles.input)}\n        popupClassName={styles.picker}\n        defaultValue={dateTimeAsMoment()}\n        onChange={(value: any) => onChange(dateTime(value))}\n        allowEmpty={false}\n        showSecond={false}\n        value={dateTimeAsMoment(value)}\n        showHour={showHour}\n        minuteStep={minuteStep}\n        inputIcon={<Caret wrapperStyle={styles.caretWrapper} />}\n      />\n    </div>\n  );\n};\n\ninterface CaretProps {\n  wrapperStyle?: string;\n}\n\nconst Caret: FC<CaretProps> = ({ wrapperStyle = '' }) => {\n  return (\n    <div className={wrapperStyle}>\n      <Icon name=\"angle-down\" />\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { getTagColorsFromName } from '../../utils';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { GrafanaTheme } from '@grafana/data';\n\ninterface Props {\n  name: string;\n\n  onRemove: (tag: string) => void;\n}\n\nconst getStyles = stylesFactory(({ theme, name }: { theme: GrafanaTheme; name: string }) => {\n  const { color, borderColor } = getTagColorsFromName(name);\n\n  return {\n    itemStyle: css`\n      background-color: ${color};\n      color: ${theme.palette.white};\n      border: 1px solid ${borderColor};\n      border-radius: 3px;\n      padding: 3px 6px;\n      margin: 3px;\n      white-space: nowrap;\n      text-shadow: none;\n      font-weight: 500;\n      line-height: 14px;\n      display: flex;\n      align-items: center;\n    `,\n\n    nameStyle: css`\n      margin-right: 3px;\n    `,\n  };\n});\n\nexport const TagItem: FC<Props> = ({ name, onRemove }) => {\n  const theme = useTheme();\n  const styles = getStyles({ theme, name });\n\n  return (\n    <div className={styles.itemStyle}>\n      <span className={styles.nameStyle}>{name}</span>\n      <Icon name=\"times\" onClick={() => onRemove(name)} />\n    </div>\n  );\n};\n","import React, { ChangeEvent, KeyboardEvent, PureComponent } from 'react';\nimport { css, cx } from 'emotion';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { Button } from '../Button';\nimport { Input } from '../Forms/Legacy/Input/Input';\nimport { TagItem } from './TagItem';\n\ninterface Props {\n  tags?: string[];\n  width?: number;\n\n  onChange: (tags: string[]) => void;\n}\n\ninterface State {\n  newTag: string;\n  tags: string[];\n}\n\nexport class TagsInput extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      newTag: '',\n      tags: this.props.tags || [],\n    };\n  }\n\n  onNameChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({\n      newTag: event.target.value,\n    });\n  };\n\n  onRemove = (tagToRemove: string) => {\n    this.setState(\n      (prevState: State) => ({\n        ...prevState,\n        tags: prevState.tags.filter(tag => tagToRemove !== tag),\n      }),\n      () => this.onChange()\n    );\n  };\n\n  // Using React.MouseEvent to avoid tslint error\n  onAdd = (event: React.MouseEvent) => {\n    event.preventDefault();\n    if (this.state.newTag !== '') {\n      this.setNewTags();\n    }\n  };\n\n  onKeyboardAdd = (event: KeyboardEvent) => {\n    event.preventDefault();\n    if (event.key === 'Enter' && this.state.newTag !== '') {\n      this.setNewTags();\n    }\n  };\n\n  setNewTags = () => {\n    // We don't want to duplicate tags, clearing the input if\n    // the user is trying to add the same tag.\n    if (!this.state.tags.includes(this.state.newTag)) {\n      this.setState(\n        (prevState: State) => ({\n          ...prevState,\n          tags: [...prevState.tags, prevState.newTag],\n          newTag: '',\n        }),\n        () => this.onChange()\n      );\n    } else {\n      this.setState({ newTag: '' });\n    }\n  };\n\n  onChange = () => {\n    this.props.onChange(this.state.tags);\n  };\n\n  render() {\n    const { tags, newTag } = this.state;\n\n    const getStyles = stylesFactory(() => ({\n      tagsCloudStyle: css`\n        display: flex;\n        justify-content: flex-start;\n        flex-wrap: wrap;\n      `,\n\n      addButtonStyle: css`\n        margin-left: 8px;\n      `,\n    }));\n\n    return (\n      <div className=\"width-20\">\n        <div\n          className={cx(\n            ['gf-form-inline'],\n            css`\n              margin-bottom: 4px;\n            `\n          )}\n        >\n          <Input placeholder=\"Add Name\" onChange={this.onNameChange} value={newTag} onKeyUp={this.onKeyboardAdd} />\n          <Button className={getStyles().addButtonStyle} onClick={this.onAdd} variant=\"secondary\" size=\"md\">\n            Add\n          </Button>\n        </div>\n        <div className={getStyles().tagsCloudStyle}>\n          {tags &&\n            tags.map((tag: string, index: number) => {\n              return <TagItem key={`${tag}-${index}`} name={tag} onRemove={this.onRemove} />;\n            })}\n        </div>\n      </div>\n    );\n  }\n}\n","import React from 'react';\nimport { css } from 'emotion';\nimport { stylesFactory } from '../../themes';\nimport { Button, ButtonVariant } from '../Button';\n\ninterface Props {\n  currentPage: number;\n  numberOfPages: number;\n  onNavigate: (toPage: number) => void;\n}\n\nexport const Pagination: React.FC<Props> = ({ currentPage, numberOfPages, onNavigate }) => {\n  const styles = getStyles();\n  const pages = [...new Array(numberOfPages).keys()];\n\n  return (\n    <div className={styles.container}>\n      <ol>\n        {pages.map(pageIndex => {\n          const page = pageIndex + 1;\n          const variant: ButtonVariant = page === currentPage ? 'primary' : 'secondary';\n\n          return (\n            <li key={page} className={styles.item}>\n              <Button size=\"sm\" variant={variant} onClick={() => onNavigate(page)}>\n                {page}\n              </Button>\n            </li>\n          );\n        })}\n      </ol>\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory(() => {\n  return {\n    container: css`\n      float: right;\n    `,\n    item: css`\n      display: inline-block;\n      padding-left: 10px;\n      margin-bottom: 5px;\n    `,\n  };\n});\n","import React, { forwardRef, HTMLAttributes } from 'react';\nimport { cx, css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useTheme } from '../../themes';\nimport { getTagColor, getTagColorsFromName } from '../../utils';\n\nexport type OnTagClick = (name: string, event: React.MouseEvent<HTMLElement>) => any;\n\nexport interface Props extends Omit<HTMLAttributes<HTMLElement>, 'onClick'> {\n  /** Name of the tag to display */\n  name: string;\n  /** Use constant color from TAG_COLORS. Using index instead of color directly so we can match other styling. */\n  colorIndex?: number;\n  onClick?: OnTagClick;\n}\n\nexport const Tag = forwardRef<HTMLElement, Props>(({ name, onClick, className, colorIndex, ...rest }, ref) => {\n  const theme = useTheme();\n  const styles = getTagStyles(theme, name, colorIndex);\n\n  const onTagClick = (event: React.MouseEvent<HTMLElement>) => {\n    if (onClick) {\n      onClick(name, event);\n    }\n  };\n\n  return (\n    <span key={name} ref={ref} onClick={onTagClick} className={cx(styles.wrapper, className)} {...rest}>\n      {name}\n    </span>\n  );\n});\n\nconst getTagStyles = (theme: GrafanaTheme, name: string, colorIndex?: number) => {\n  let colors;\n  if (colorIndex === undefined) {\n    colors = getTagColorsFromName(name);\n  } else {\n    colors = getTagColor(colorIndex);\n  }\n  return {\n    wrapper: css`\n      font-weight: ${theme.typography.weight.semibold};\n      font-size: ${theme.typography.size.sm};\n      line-height: ${theme.typography.lineHeight.xs};\n      vertical-align: baseline;\n      background-color: ${colors.color};\n      color: ${theme.palette.gray98};\n      white-space: nowrap;\n      text-shadow: none;\n      padding: 3px 6px;\n      border-radius: ${theme.border.radius.md};\n\n      :hover {\n        opacity: 0.85;\n        cursor: pointer;\n      }\n    `,\n  };\n};\n","import React, { FC, memo } from 'react';\nimport { cx, css } from 'emotion';\nimport { OnTagClick, Tag } from './Tag';\n\nexport interface Props {\n  tags: string[];\n  onClick?: OnTagClick;\n  /** Custom styles for the wrapper component */\n  className?: string;\n}\n\nexport const TagList: FC<Props> = memo(({ tags, onClick, className }) => {\n  const styles = getStyles();\n\n  return (\n    <span className={cx(styles.wrapper, className)}>\n      {tags.map(tag => (\n        <Tag key={tag} name={tag} onClick={onClick} className={styles.tag} />\n      ))}\n    </span>\n  );\n});\n\nconst getStyles = () => {\n  return {\n    wrapper: css`\n      display: flex;\n      flex: 1 1 auto;\n      flex-wrap: wrap;\n    `,\n    tag: css`\n      margin-left: 6px;\n    `,\n  };\n};\n","import React, { useContext } from 'react';\nimport { stylesFactory, ThemeContext } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\nimport { IconButton } from '../IconButton/IconButton';\nimport { IconName } from '../../types';\n\ninterface FilterPillProps {\n  selected: boolean;\n  label: string;\n  onClick: React.MouseEventHandler<HTMLElement>;\n  icon?: IconName;\n}\n\nexport const FilterPill: React.FC<FilterPillProps> = ({ label, selected, onClick, icon = 'check' }) => {\n  const theme = useContext(ThemeContext);\n  const styles = getFilterPillStyles(theme, selected);\n  return (\n    <div className={styles.wrapper} onClick={onClick}>\n      <IconButton\n        name={icon}\n        onClick={e => {\n          e.stopPropagation();\n          onClick(e);\n        }}\n        className={styles.icon}\n        surface=\"header\"\n      />\n      <span className={styles.label}>{label}</span>\n    </div>\n  );\n};\n\nconst getFilterPillStyles = stylesFactory((theme: GrafanaTheme, isSelected: boolean) => {\n  const labelColor = isSelected ? theme.colors.text : theme.colors.textWeak;\n\n  return {\n    wrapper: css`\n      padding: ${theme.spacing.xxs} ${theme.spacing.sm};\n      background: ${theme.colors.bg2};\n      border-radius: ${theme.border.radius.sm};\n      display: inline-block;\n      padding: 0 ${theme.spacing.md} 0 ${theme.spacing.xs};\n      font-weight: ${theme.typography.weight.semibold};\n      font-size: ${theme.typography.size.sm};\n      color: ${theme.colors.text};\n      display: flex;\n      align-items: center;\n      height: 32px;\n      cursor: pointer;\n    `,\n    icon: css`\n      margin-right: ${theme.spacing.sm};\n      margin-left: ${theme.spacing.xs};\n      color: ${labelColor};\n    `,\n    label: css`\n      color: ${labelColor};\n    `,\n  };\n});\n","import React, { FC, useContext } from 'react';\nimport { css } from 'emotion';\nimport { Modal } from '../Modal/Modal';\nimport { IconName } from '../../types/icon';\nimport { Button } from '../Button';\nimport { stylesFactory, ThemeContext } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { HorizontalGroup } from '..';\n\nexport interface Props {\n  isOpen: boolean;\n  title: string;\n  body: React.ReactNode;\n  confirmText: string;\n  dismissText?: string;\n  icon?: IconName;\n  onConfirm(): void;\n  onDismiss(): void;\n}\n\nexport const ConfirmModal: FC<Props> = ({\n  isOpen,\n  title,\n  body,\n  confirmText,\n  dismissText = 'Cancel',\n  icon = 'exclamation-triangle',\n  onConfirm,\n  onDismiss,\n}) => {\n  const theme = useContext(ThemeContext);\n  const styles = getStyles(theme);\n\n  return (\n    <Modal className={styles.modal} title={title} icon={icon} isOpen={isOpen} onDismiss={onDismiss}>\n      <div className={styles.modalContent}>\n        <div className={styles.modalText}>{body}</div>\n        <HorizontalGroup justify=\"center\">\n          <Button variant=\"destructive\" onClick={onConfirm}>\n            {confirmText}\n          </Button>\n          <Button variant=\"secondary\" onClick={onDismiss}>\n            {dismissText}\n          </Button>\n        </HorizontalGroup>\n      </div>\n    </Modal>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  modal: css`\n    width: 500px;\n  `,\n  modalContent: css`\n    text-align: center;\n  `,\n  modalText: css`\n    font-size: ${theme.typography.heading.h4};\n    color: ${theme.colors.link};\n    margin-bottom: calc(${theme.spacing.d} * 2);\n    padding-top: ${theme.spacing.d};\n  `,\n}));\n","import _ from 'lodash';\nimport React, { Context } from 'react';\n\nimport { Value, Editor as CoreEditor } from 'slate';\nimport { Editor, Plugin } from '@grafana/slate-react';\nimport Plain from 'slate-plain-serializer';\nimport classnames from 'classnames';\n\nimport {\n  ClearPlugin,\n  NewlinePlugin,\n  SelectionShortcutsPlugin,\n  IndentationPlugin,\n  ClipboardPlugin,\n  RunnerPlugin,\n  SuggestionsPlugin,\n} from '../../slate-plugins';\n\nimport { makeValue, SCHEMA, CompletionItemGroup, TypeaheadOutput, TypeaheadInput, SuggestionsState } from '../..';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface QueryFieldProps {\n  additionalPlugins?: Plugin[];\n  cleanText?: (text: string) => string;\n  disabled?: boolean;\n  // We have both value and local state. This is usually an antipattern but we need to keep local state\n  // for perf reasons and also have outside value in for example in Explore redux that is mutable from logs\n  // creating a two way binding.\n  query: string | null;\n  onRunQuery?: () => void;\n  onBlur?: () => void;\n  onChange?: (value: string) => void;\n  onRichValueChange?: (value: Value) => void;\n  onClick?: (event: Event, editor: CoreEditor, next: () => any) => any;\n  onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>;\n  onWillApplySuggestion?: (suggestion: string, state: SuggestionsState) => string;\n  placeholder?: string;\n  portalOrigin: string;\n  syntax?: string;\n  syntaxLoaded?: boolean;\n}\n\nexport interface QueryFieldState {\n  suggestions: CompletionItemGroup[];\n  typeaheadContext: string | null;\n  typeaheadPrefix: string;\n  typeaheadText: string;\n  value: Value;\n}\n\n/**\n * Renders an editor field.\n * Pass initial value as initialQuery and listen to changes in props.onValueChanged.\n * This component can only process strings. Internally it uses Slate Value.\n * Implement props.onTypeahead to use suggestions, see PromQueryField.tsx as an example.\n */\nexport class QueryField extends React.PureComponent<QueryFieldProps, QueryFieldState> {\n  plugins: Plugin[];\n  runOnChangeDebounced: Function;\n  lastExecutedValue: Value | null = null;\n  mounted = false;\n  editor: Editor | null = null;\n\n  constructor(props: QueryFieldProps, context: Context<any>) {\n    super(props, context);\n\n    this.runOnChangeDebounced = _.debounce(this.runOnChange, 500);\n\n    const { onTypeahead, cleanText, portalOrigin, onWillApplySuggestion } = props;\n\n    // Base plugins\n    this.plugins = [\n      // SuggestionsPlugin and RunnerPlugin need to be before NewlinePlugin\n      // because they override Enter behavior\n      SuggestionsPlugin({ onTypeahead, cleanText, portalOrigin, onWillApplySuggestion }),\n      RunnerPlugin({ handler: this.runOnChangeAndRunQuery }),\n      NewlinePlugin(),\n      ClearPlugin(),\n      SelectionShortcutsPlugin(),\n      IndentationPlugin(),\n      ClipboardPlugin(),\n      ...(props.additionalPlugins || []),\n    ].filter(p => p);\n\n    this.state = {\n      suggestions: [],\n      typeaheadContext: null,\n      typeaheadPrefix: '',\n      typeaheadText: '',\n      value: makeValue(props.query || '', props.syntax),\n    };\n  }\n\n  componentDidMount() {\n    this.mounted = true;\n  }\n\n  componentWillUnmount() {\n    this.mounted = false;\n  }\n\n  componentDidUpdate(prevProps: QueryFieldProps, prevState: QueryFieldState) {\n    const { query, syntax, syntaxLoaded } = this.props;\n\n    if (!prevProps.syntaxLoaded && syntaxLoaded && this.editor) {\n      // Need a bogus edit to re-render the editor after syntax has fully loaded\n      const editor = this.editor.insertText(' ').deleteBackward(1);\n      this.onChange(editor.value, true);\n    }\n    const { value } = this.state;\n\n    // Handle two way binging between local state and outside prop.\n    // if query changed from the outside\n    if (query !== prevProps.query) {\n      // and we have a version that differs\n      if (query !== Plain.serialize(value)) {\n        this.setState({ value: makeValue(query || '', syntax) });\n      }\n    }\n  }\n\n  /**\n   * Update local state, propagate change upstream and optionally run the query afterwards.\n   */\n  onChange = (value: Value, runQuery?: boolean) => {\n    const documentChanged = value.document !== this.state.value.document;\n    const prevValue = this.state.value;\n    if (this.props.onRichValueChange) {\n      this.props.onRichValueChange(value);\n    }\n\n    // Update local state with new value and optionally change value upstream.\n    this.setState({ value }, () => {\n      // The diff is needed because the actual value of editor have much more metadata (for example text selection)\n      // that is not passed upstream so every change of editor value does not mean change of the query text.\n      if (documentChanged) {\n        const textChanged = Plain.serialize(prevValue) !== Plain.serialize(value);\n        if (textChanged && runQuery) {\n          this.runOnChangeAndRunQuery();\n        }\n        if (textChanged && !runQuery) {\n          // Debounce change propagation by default for perf reasons.\n          this.runOnChangeDebounced();\n        }\n      }\n    });\n  };\n\n  runOnChange = () => {\n    const { onChange } = this.props;\n\n    if (onChange) {\n      onChange(Plain.serialize(this.state.value));\n    }\n  };\n\n  runOnRunQuery = () => {\n    const { onRunQuery } = this.props;\n\n    if (onRunQuery) {\n      onRunQuery();\n      this.lastExecutedValue = this.state.value;\n    }\n  };\n\n  runOnChangeAndRunQuery = () => {\n    // onRunQuery executes query from Redux in Explore so it needs to be updated sync in case we want to run\n    // the query.\n    this.runOnChange();\n    this.runOnRunQuery();\n  };\n\n  /**\n   * We need to handle blur events here mainly because of dashboard panels which expect to have query executed on blur.\n   */\n  handleBlur = (event: Event, editor: CoreEditor, next: Function) => {\n    const { onBlur } = this.props;\n\n    if (onBlur) {\n      onBlur();\n    } else {\n      // Run query by default on blur\n      const previousValue = this.lastExecutedValue ? Plain.serialize(this.lastExecutedValue) : null;\n      const currentValue = Plain.serialize(editor.value);\n\n      if (previousValue !== currentValue) {\n        this.runOnChangeAndRunQuery();\n      }\n    }\n    return next();\n  };\n\n  render() {\n    const { disabled } = this.props;\n    const wrapperClassName = classnames('slate-query-field__wrapper', {\n      'slate-query-field__wrapper--disabled': disabled,\n    });\n\n    return (\n      <div className={wrapperClassName}>\n        <div className=\"slate-query-field\" aria-label={selectors.components.QueryField.container}>\n          <Editor\n            ref={editor => (this.editor = editor!)}\n            schema={SCHEMA}\n            autoCorrect={false}\n            readOnly={this.props.disabled}\n            onBlur={this.handleBlur}\n            onClick={this.props.onClick}\n            // onKeyDown={this.onKeyDown}\n            onChange={(change: { value: Value }) => {\n              this.onChange(change.value, false);\n            }}\n            placeholder={this.props.placeholder}\n            plugins={this.plugins}\n            spellCheck={false}\n            value={this.state.value}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default QueryField;\n","import React, { ReactNode } from 'react';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\n\nexport interface Props {\n  /** Children should be a single <Tab /> or an array of <Tab /> */\n  children: ReactNode;\n  className?: string;\n  /** For hiding the bottom border (on PageHeader for example) */\n  hideBorder?: boolean;\n}\n\nconst getTabsBarStyles = stylesFactory((theme: GrafanaTheme, hideBorder = false) => {\n  const colors = theme.colors;\n\n  return {\n    tabsWrapper:\n      !hideBorder &&\n      css`\n        border-bottom: 1px solid ${colors.pageHeaderBorder};\n      `,\n    tabs: css`\n      position: relative;\n      top: 1px;\n      display: flex;\n      // Sometimes TabsBar is rendered without any tabs, and should preserve height\n      height: 41px;\n    `,\n  };\n});\n\nexport const TabsBar = React.forwardRef<HTMLDivElement, Props>(({ children, className, hideBorder }, ref) => {\n  const theme = useTheme();\n  const tabsStyles = getTabsBarStyles(theme, hideBorder);\n\n  return (\n    <div className={cx(tabsStyles.tabsWrapper, className)} ref={ref}>\n      <ul className={tabsStyles.tabs}>{children}</ul>\n    </div>\n  );\n});\n","import React, { FC, useContext } from 'react';\nimport { css } from 'emotion';\nimport { stylesFactory, ThemeContext } from '../../themes';\nimport { GrafanaTheme, locale } from '@grafana/data';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    counter: css`\n      label: counter;\n      margin-left: ${theme.spacing.sm};\n      border-radius: ${theme.spacing.lg};\n      background-color: ${theme.colors.bg2};\n      padding: ${theme.spacing.xxs} ${theme.spacing.sm};\n      color: ${theme.colors.textWeak};\n      font-weight: ${theme.typography.weight.semibold};\n      font-size: ${theme.typography.size.sm};\n    `,\n  };\n});\n\nexport interface CounterProps {\n  value: number;\n}\n\nexport const Counter: FC<CounterProps> = ({ value }) => {\n  const theme = useContext(ThemeContext);\n  const styles = getStyles(theme);\n\n  return <span className={styles.counter}>{locale(value, 0).text}</span>;\n};\n","import React, { HTMLProps } from 'react';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Counter } from './Counter';\n\nexport interface TabProps extends HTMLProps<HTMLLIElement> {\n  label: string;\n  active?: boolean;\n  icon?: IconName;\n  onChangeTab: () => void;\n  counter?: number;\n}\n\nexport const Tab = React.forwardRef<HTMLLIElement, TabProps>(\n  ({ label, active, icon, onChangeTab, counter, className, ...otherProps }, ref) => {\n    const theme = useTheme();\n    const tabsStyles = getTabStyles(theme);\n\n    return (\n      <li\n        {...otherProps}\n        className={cx(tabsStyles.tabItem, active && tabsStyles.activeStyle)}\n        onClick={() => {\n          if (!active) {\n            onChangeTab();\n          }\n        }}\n        aria-label={otherProps['aria-label'] || selectors.components.Tab.title(label)}\n        ref={ref}\n      >\n        {icon && <Icon name={icon} />}\n        {label}\n        {typeof counter === 'number' && <Counter value={counter} />}\n      </li>\n    );\n  }\n);\n\nconst getTabStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = theme.colors;\n\n  return {\n    tabItem: css`\n      list-style: none;\n      padding: 11px 15px 9px;\n      margin-right: ${theme.spacing.md};\n      position: relative;\n      display: block;\n      border: solid transparent;\n      border-width: 0 1px 1px;\n      border-radius: ${theme.border.radius.md} ${theme.border.radius.md} 0 0;\n      color: ${colors.text};\n      cursor: pointer;\n\n      svg {\n        margin-right: ${theme.spacing.sm};\n      }\n\n      &:hover,\n      &:focus {\n        color: ${colors.linkHover};\n      }\n    `,\n    activeStyle: css`\n      label: activeTabStyle;\n      border-color: ${theme.palette.orange} ${colors.pageHeaderBorder} transparent;\n      background: ${colors.bodyBg};\n      color: ${colors.link};\n      overflow: hidden;\n      cursor: default;\n\n      &::before {\n        display: block;\n        content: ' ';\n        position: absolute;\n        left: 0;\n        right: 0;\n        height: 2px;\n        top: 0;\n        background-image: linear-gradient(to right, #f05a28 30%, #fbca0a 99%);\n      }\n    `,\n  };\n});\n","import React from 'react';\nimport { IconName } from '../../types';\nimport { TabsBar } from '../Tabs/TabsBar';\nimport { Tab } from '../Tabs/Tab';\nimport { ModalHeader } from './ModalHeader';\n\ninterface ModalTab {\n  value: string;\n  label: string;\n  icon?: IconName;\n}\n\ninterface Props {\n  icon: IconName;\n  title: string;\n  tabs: ModalTab[];\n  activeTab: string;\n  onChangeTab(tab: ModalTab): void;\n}\n\nexport const ModalTabsHeader: React.FC<Props> = ({ icon, title, tabs, activeTab, onChangeTab }) => {\n  return (\n    <ModalHeader icon={icon} title={title}>\n      <TabsBar hideBorder={true}>\n        {tabs.map((t, index) => {\n          return (\n            <Tab\n              key={`${t.value}-${index}`}\n              label={t.label}\n              icon={t.icon}\n              active={t.value === activeTab}\n              onChangeTab={() => onChangeTab(t)}\n            />\n          );\n        })}\n      </TabsBar>\n    </ModalHeader>\n  );\n};\n","import React from 'react';\nimport { cx } from 'emotion';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\ninterface Props {\n  icon?: IconName;\n  iconClass?: string;\n}\n\nexport const ModalTabContent: React.FC<Props> = ({ icon, iconClass, children }) => {\n  return (\n    <div className=\"share-modal-body\">\n      <div className=\"share-modal-header\">\n        {icon && <Icon name={icon} size=\"xxl\" className={cx(iconClass, 'share-modal-big-icon')} />}\n        <div className=\"share-modal-content\">{children}</div>\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\n\ninterface ModalsContextState {\n  component: React.ComponentType<any> | null;\n  props: any;\n  showModal: <T>(component: React.ComponentType<T>, props: T) => void;\n  hideModal: () => void;\n}\n\nconst ModalsContext = React.createContext<ModalsContextState>({\n  component: null,\n  props: {},\n  showModal: () => {},\n  hideModal: () => {},\n});\n\ninterface ModalsProviderProps {\n  children: React.ReactNode;\n  /** Set default component to render as modal. Useful when rendering modals from Angular */\n  component?: React.ComponentType<any> | null;\n  /** Set default component props. Useful when rendering modals from Angular */\n  props?: any;\n}\n\nexport class ModalsProvider extends React.Component<ModalsProviderProps, ModalsContextState> {\n  constructor(props: ModalsProviderProps) {\n    super(props);\n    this.state = {\n      component: props.component || null,\n      props: props.props || {},\n      showModal: this.showModal,\n      hideModal: this.hideModal,\n    };\n  }\n\n  showModal = (component: React.ComponentType<any>, props: any) => {\n    this.setState({\n      component,\n      props,\n    });\n  };\n\n  hideModal = () => {\n    this.setState({\n      component: null,\n      props: {},\n    });\n  };\n\n  render() {\n    return <ModalsContext.Provider value={this.state}>{this.props.children}</ModalsContext.Provider>;\n  }\n}\n\nexport const ModalRoot = () => (\n  <ModalsContext.Consumer>\n    {({ component: Component, props }) => {\n      return Component ? <Component {...props} /> : null;\n    }}\n  </ModalsContext.Consumer>\n);\n\nexport const ModalsController = ModalsContext.Consumer;\n","import { PureComponent } from 'react';\nimport { interval, Subscription, Subject, of, NEVER } from 'rxjs';\nimport { tap, switchMap } from 'rxjs/operators';\nimport _ from 'lodash';\n\nimport { stringToMs, SelectableValue } from '@grafana/data';\nimport { RefreshPicker } from '../RefreshPicker/RefreshPicker';\n\nexport function getIntervalFromString(strInterval: string): SelectableValue<number> {\n  return {\n    label: strInterval,\n    value: stringToMs(strInterval),\n  };\n}\n\ninterface Props {\n  func: () => any; // TODO\n  loading: boolean;\n  interval: string;\n}\n\nexport class SetInterval extends PureComponent<Props> {\n  private propsSubject: Subject<Props>;\n  private subscription: Subscription | null;\n\n  constructor(props: Props) {\n    super(props);\n    this.propsSubject = new Subject<Props>();\n    this.subscription = null;\n  }\n\n  componentDidMount() {\n    // Creating a subscription to propsSubject. This subject pushes values every time\n    // SetInterval's props change\n    this.subscription = this.propsSubject\n      .pipe(\n        // switchMap creates a new observables based on the input stream,\n        // which becomes part of the propsSubject stream\n        switchMap(props => {\n          // If the query is live, empty value is emited. `of` creates single value,\n          // which is merged to propsSubject stream\n          if (RefreshPicker.isLive(props.interval)) {\n            return of({});\n          }\n\n          // When query is loading, a new stream is merged. But it's a stream that emits no values(NEVER),\n          // hence next call of this function will happen when query changes, and new props are passed into this component\n          // When query is NOT loading, a new value is emited, this time it's an interval value,\n          // which makes tap function below execute on that interval basis.\n          return props.loading ? NEVER : interval(stringToMs(props.interval));\n        }),\n        // tap will execute function passed via func prop\n        // * on value from `of` stream merged if query is live\n        // * on specified interval (triggered by values emited by interval)\n        tap(() => this.props.func())\n      )\n      .subscribe();\n\n    // When component has mounted, propsSubject emits it's first value\n    this.propsSubject.next(this.props);\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    if (\n      (RefreshPicker.isLive(prevProps.interval) && RefreshPicker.isLive(this.props.interval)) ||\n      _.isEqual(prevProps, this.props)\n    ) {\n      return;\n    }\n    // if props changed, a new value is emited from propsSubject\n    this.propsSubject.next(this.props);\n  }\n\n  componentWillUnmount() {\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n\n    this.propsSubject.unsubscribe();\n  }\n\n  render(): null {\n    return null;\n  }\n}\n","import React, { FC } from 'react';\nimport { TableCellProps } from './types';\nimport { formattedValueToString, LinkModel } from '@grafana/data';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nexport const DefaultCell: FC<TableCellProps> = props => {\n  const { field, cell, tableStyles, row } = props;\n  let link: LinkModel<any> | undefined;\n\n  const displayValue = field.display ? field.display(cell.value) : cell.value;\n\n  if (field.getLinks) {\n    link = field.getLinks({\n      valueRowIndex: row.index,\n    })[0];\n  }\n  const value = field.display ? formattedValueToString(displayValue) : displayValue;\n\n  return (\n    <div className={tableStyles.tableCell}>\n      {link ? (\n        <Tooltip content={link.title}>\n          <a href={link.href} target={link.target} title={link.title} className={tableStyles.tableCellLink}>\n            {value}\n          </a>\n        </Tooltip>\n      ) : (\n        value\n      )}\n    </div>\n  );\n};\n","import React, { FC, CSSProperties } from 'react';\nimport { FormattedValue } from '@grafana/data';\n\nexport interface Props {\n  className?: string;\n  value: FormattedValue;\n  style: CSSProperties;\n}\n\nfunction fontSizeReductionFactor(fontSize: number) {\n  if (fontSize < 20) {\n    return 0.9;\n  }\n  if (fontSize < 26) {\n    return 0.8;\n  }\n  return 0.6;\n}\n\nexport const FormattedValueDisplay: FC<Props> = ({ value, className, style }) => {\n  const fontSize = style.fontSize as number;\n  const reductionFactor = fontSizeReductionFactor(fontSize);\n  const hasPrefix = (value.prefix ?? '').length > 0;\n  const hasSuffix = (value.suffix ?? '').length > 0;\n\n  return (\n    <div className={className} style={style}>\n      <div>\n        {hasPrefix && <span>{value.prefix}</span>}\n        <span>{value.text}</span>\n        {hasSuffix && <span style={{ fontSize: fontSize * reductionFactor }}>{value.suffix}</span>}\n      </div>\n    </div>\n  );\n};\n\nFormattedValueDisplay.displayName = 'FormattedDisplayValue';\n","// Library\nimport React, { PureComponent, CSSProperties, ReactNode } from 'react';\nimport tinycolor from 'tinycolor2';\nimport * as d3 from 'd3-scale-chromatic';\nimport {\n  TimeSeriesValue,\n  DisplayValue,\n  formattedValueToString,\n  FormattedValue,\n  DisplayValueAlignmentFactors,\n  ThresholdsMode,\n  DisplayProcessor,\n  FieldConfig,\n  FieldColorMode,\n} from '@grafana/data';\n\n// Compontents\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\n\n// Utils\nimport { getColorFromHexRgbOrName } from '@grafana/data';\nimport { measureText, calculateFontSize } from '../../utils/measureText';\n\n// Types\nimport { VizOrientation } from '@grafana/data';\nimport { Themeable } from '../../types';\n\nconst MIN_VALUE_HEIGHT = 18;\nconst MAX_VALUE_HEIGHT = 50;\nconst MIN_VALUE_WIDTH = 50;\nconst MAX_VALUE_WIDTH = 150;\nconst TITLE_LINE_HEIGHT = 1.5;\nconst VALUE_LINE_HEIGHT = 1;\nconst VALUE_LEFT_PADDING = 10;\n\nexport interface Props extends Themeable {\n  height: number;\n  width: number;\n  field: FieldConfig;\n  display?: DisplayProcessor;\n  value: DisplayValue;\n  orientation: VizOrientation;\n  itemSpacing?: number;\n  lcdCellWidth?: number;\n  displayMode: BarGaugeDisplayMode;\n  onClick?: React.MouseEventHandler<HTMLElement>;\n  className?: string;\n  showUnfilled?: boolean;\n  alignmentFactors?: DisplayValueAlignmentFactors;\n}\n\nexport enum BarGaugeDisplayMode {\n  Basic = 'basic',\n  Lcd = 'lcd',\n  Gradient = 'gradient',\n}\n\nexport class BarGauge extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\n    lcdCellWidth: 12,\n    value: {\n      text: '100',\n      numeric: 100,\n    },\n    displayMode: BarGaugeDisplayMode.Gradient,\n    orientation: VizOrientation.Horizontal,\n    field: {\n      min: 0,\n      max: 100,\n      thresholds: {\n        mode: ThresholdsMode.Absolute,\n        steps: [],\n      },\n    },\n    itemSpacing: 8,\n    showUnfilled: true,\n  };\n\n  render() {\n    const { onClick, className } = this.props;\n    const { title } = this.props.value;\n    const styles = getTitleStyles(this.props);\n\n    if (!title) {\n      return (\n        <div style={styles.wrapper} onClick={onClick} className={className}>\n          {this.renderBarAndValue()}\n        </div>\n      );\n    }\n\n    return (\n      <div style={styles.wrapper} onClick={onClick} className={className}>\n        <div style={styles.title}>{title}</div>\n        {this.renderBarAndValue()}\n      </div>\n    );\n  }\n\n  renderBarAndValue() {\n    switch (this.props.displayMode) {\n      case 'lcd':\n        return this.renderRetroBars();\n      case 'basic':\n      case 'gradient':\n      default:\n        return this.renderBasicAndGradientBars();\n    }\n  }\n\n  renderBasicAndGradientBars(): ReactNode {\n    const { value, showUnfilled } = this.props;\n\n    const styles = getBasicAndGradientStyles(this.props);\n\n    return (\n      <div style={styles.wrapper}>\n        <FormattedValueDisplay className=\"bar-gauge__value\" value={value} style={styles.value} />\n        {showUnfilled && <div style={styles.emptyBar} />}\n        <div style={styles.bar} />\n      </div>\n    );\n  }\n\n  getCellColor(positionValue: TimeSeriesValue): CellColors {\n    const { value, display } = this.props;\n    if (positionValue === null) {\n      return {\n        background: 'gray',\n        border: 'gray',\n      };\n    }\n\n    const color = display ? display(positionValue).color : null;\n\n    if (color) {\n      // if we are past real value the cell is not \"on\"\n      if (value === null || (positionValue !== null && positionValue > value.numeric)) {\n        return {\n          background: tinycolor(color)\n            .setAlpha(0.18)\n            .toRgbString(),\n          border: 'transparent',\n          isLit: false,\n        };\n      } else {\n        return {\n          background: tinycolor(color)\n            .setAlpha(0.95)\n            .toRgbString(),\n          backgroundShade: tinycolor(color)\n            .setAlpha(0.55)\n            .toRgbString(),\n          border: tinycolor(color)\n            .setAlpha(0.9)\n            .toRgbString(),\n          isLit: true,\n        };\n      }\n    }\n\n    return {\n      background: 'gray',\n      border: 'gray',\n    };\n  }\n\n  renderRetroBars(): ReactNode {\n    const { field, value, itemSpacing, alignmentFactors, orientation, lcdCellWidth } = this.props;\n    const {\n      valueHeight,\n      valueWidth,\n      maxBarHeight,\n      maxBarWidth,\n      wrapperWidth,\n      wrapperHeight,\n    } = calculateBarAndValueDimensions(this.props);\n    const minValue = field.min!;\n    const maxValue = field.max!;\n\n    const isVert = isVertical(orientation);\n    const valueRange = maxValue - minValue;\n    const maxSize = isVert ? maxBarHeight : maxBarWidth;\n    const cellSpacing = itemSpacing!;\n    const cellCount = Math.floor(maxSize / lcdCellWidth!);\n    const cellSize = Math.floor((maxSize - cellSpacing * cellCount) / cellCount);\n    const valueColor = getValueColor(this.props);\n\n    const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n    const valueStyles = getValueStyles(valueToBaseSizeOn, valueColor, valueWidth, valueHeight, orientation);\n\n    const containerStyles: CSSProperties = {\n      width: `${wrapperWidth}px`,\n      height: `${wrapperHeight}px`,\n      display: 'flex',\n    };\n\n    if (isVert) {\n      containerStyles.flexDirection = 'column-reverse';\n      containerStyles.alignItems = 'center';\n    } else {\n      containerStyles.flexDirection = 'row';\n      containerStyles.alignItems = 'center';\n      valueStyles.justifyContent = 'flex-end';\n    }\n\n    const cells: JSX.Element[] = [];\n\n    for (let i = 0; i < cellCount; i++) {\n      const currentValue = minValue + (valueRange / cellCount) * i;\n      const cellColor = this.getCellColor(currentValue);\n      const cellStyles: CSSProperties = {\n        borderRadius: '2px',\n      };\n\n      if (cellColor.isLit) {\n        cellStyles.backgroundImage = `radial-gradient(${cellColor.background} 10%, ${cellColor.backgroundShade})`;\n      } else {\n        cellStyles.backgroundColor = cellColor.background;\n      }\n\n      if (isVert) {\n        cellStyles.height = `${cellSize}px`;\n        cellStyles.width = `${maxBarWidth}px`;\n        cellStyles.marginTop = `${cellSpacing}px`;\n      } else {\n        cellStyles.width = `${cellSize}px`;\n        cellStyles.height = `${maxBarHeight}px`;\n        cellStyles.marginRight = `${cellSpacing}px`;\n      }\n\n      cells.push(<div key={i.toString()} style={cellStyles} />);\n    }\n\n    return (\n      <div style={containerStyles}>\n        {cells}\n        <FormattedValueDisplay className=\"bar-gauge__value\" value={value} style={valueStyles} />\n      </div>\n    );\n  }\n}\n\ninterface CellColors {\n  background: string;\n  backgroundShade?: string;\n  border: string;\n  isLit?: boolean;\n}\n\ninterface TitleDimensions {\n  fontSize: number;\n  placement: 'above' | 'left' | 'below';\n  width: number;\n  height: number;\n}\n\nfunction isVertical(orientation: VizOrientation) {\n  return orientation === VizOrientation.Vertical;\n}\n\nfunction calculateTitleDimensions(props: Props): TitleDimensions {\n  const { height, width, alignmentFactors, orientation } = props;\n  const title = alignmentFactors ? alignmentFactors.title : props.value.title;\n\n  if (!title) {\n    return { fontSize: 0, width: 0, height: 0, placement: 'above' };\n  }\n\n  if (isVertical(orientation)) {\n    return {\n      fontSize: 14,\n      width: width,\n      height: 14 * TITLE_LINE_HEIGHT,\n      placement: 'below',\n    };\n  }\n\n  // if height above 40 put text to above bar\n  if (height > 40) {\n    const maxTitleHeightRatio = 0.45;\n    const titleHeight = Math.max(Math.min(height * maxTitleHeightRatio, MAX_VALUE_HEIGHT), 17);\n\n    return {\n      fontSize: titleHeight / TITLE_LINE_HEIGHT,\n      width: 0,\n      height: titleHeight,\n      placement: 'above',\n    };\n  }\n\n  // title to left of bar scenario\n  const maxTitleHeightRatio = 0.6;\n  const titleHeight = Math.max(height * maxTitleHeightRatio, MIN_VALUE_HEIGHT);\n  const titleFontSize = titleHeight / TITLE_LINE_HEIGHT;\n  const textSize = measureText(title, titleFontSize);\n\n  return {\n    fontSize: titleFontSize,\n    height: 0,\n    width: textSize.width + 15,\n    placement: 'left',\n  };\n}\n\nexport function getTitleStyles(props: Props): { wrapper: CSSProperties; title: CSSProperties } {\n  const wrapperStyles: CSSProperties = {\n    display: 'flex',\n    overflow: 'hidden',\n    width: '100%',\n  };\n\n  const titleDim = calculateTitleDimensions(props);\n\n  const titleStyles: CSSProperties = {\n    fontSize: `${titleDim.fontSize}px`,\n    whiteSpace: 'nowrap',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    width: '100%',\n    alignItems: 'center',\n    alignSelf: 'center',\n  };\n\n  if (isVertical(props.orientation)) {\n    wrapperStyles.flexDirection = 'column-reverse';\n    titleStyles.textAlign = 'center';\n  } else {\n    if (titleDim.placement === 'above') {\n      wrapperStyles.flexDirection = 'column';\n    } else {\n      wrapperStyles.flexDirection = 'row';\n\n      titleStyles.width = `${titleDim.width}px`;\n      titleStyles.textAlign = 'right';\n      titleStyles.paddingRight = '10px';\n    }\n  }\n\n  return {\n    wrapper: wrapperStyles,\n    title: titleStyles,\n  };\n}\n\ninterface BasicAndGradientStyles {\n  wrapper: CSSProperties;\n  bar: CSSProperties;\n  emptyBar: CSSProperties;\n  value: CSSProperties;\n}\n\ninterface BarAndValueDimensions {\n  valueWidth: number;\n  valueHeight: number;\n  maxBarWidth: number;\n  maxBarHeight: number;\n  wrapperHeight: number;\n  wrapperWidth: number;\n}\n\nfunction calculateBarAndValueDimensions(props: Props): BarAndValueDimensions {\n  const { height, width, orientation } = props;\n  const titleDim = calculateTitleDimensions(props);\n\n  let maxBarHeight = 0;\n  let maxBarWidth = 0;\n  let valueHeight = 0;\n  let valueWidth = 0;\n  let wrapperWidth = 0;\n  let wrapperHeight = 0;\n\n  if (isVertical(orientation)) {\n    valueHeight = Math.min(Math.max(height * 0.1, MIN_VALUE_HEIGHT), MAX_VALUE_HEIGHT);\n    valueWidth = width;\n    maxBarHeight = height - (titleDim.height + valueHeight);\n    maxBarWidth = width;\n    wrapperWidth = width;\n    wrapperHeight = height - titleDim.height;\n  } else {\n    valueHeight = height - titleDim.height;\n    valueWidth = Math.max(Math.min(width * 0.2, MAX_VALUE_WIDTH), MIN_VALUE_WIDTH);\n    maxBarHeight = height - titleDim.height;\n    maxBarWidth = width - valueWidth - titleDim.width;\n\n    if (titleDim.placement === 'above') {\n      wrapperWidth = width;\n      wrapperHeight = height - titleDim.height;\n    } else {\n      wrapperWidth = width - titleDim.width;\n      wrapperHeight = height;\n    }\n  }\n\n  return {\n    valueWidth,\n    valueHeight,\n    maxBarWidth,\n    maxBarHeight,\n    wrapperHeight,\n    wrapperWidth,\n  };\n}\n\nexport function getValuePercent(value: number, minValue: number, maxValue: number): number {\n  return Math.min((value - minValue) / (maxValue - minValue), 1);\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBasicAndGradientStyles(props: Props): BasicAndGradientStyles {\n  const { displayMode, field, value, alignmentFactors, orientation, theme } = props;\n  const { valueWidth, valueHeight, maxBarHeight, maxBarWidth } = calculateBarAndValueDimensions(props);\n\n  const valuePercent = getValuePercent(value.numeric, field.min!, field.max!);\n  const valueColor = getValueColor(props);\n\n  const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n  const valueStyles = getValueStyles(valueToBaseSizeOn, valueColor, valueWidth, valueHeight, orientation);\n\n  const isBasic = displayMode === 'basic';\n  const wrapperStyles: CSSProperties = {\n    display: 'flex',\n    flexGrow: 1,\n  };\n\n  const barStyles: CSSProperties = {\n    borderRadius: '3px',\n    position: 'relative',\n    zIndex: 1,\n  };\n\n  const emptyBar: CSSProperties = {\n    background: `rgba(${theme.isDark ? '255,255,255' : '0,0,0'}, 0.07)`,\n    flexGrow: 1,\n    display: 'flex',\n    borderRadius: '3px',\n    position: 'relative',\n  };\n\n  if (isVertical(orientation)) {\n    const barHeight = Math.max(valuePercent * maxBarHeight, 1);\n\n    // vertical styles\n    wrapperStyles.flexDirection = 'column';\n    wrapperStyles.justifyContent = 'flex-end';\n\n    barStyles.transition = 'height 1s';\n    barStyles.height = `${barHeight}px`;\n    barStyles.width = `${maxBarWidth}px`;\n\n    // adjust so that filled in bar is at the bottom\n    emptyBar.bottom = '-3px';\n\n    if (isBasic) {\n      // Basic styles\n      barStyles.background = `${tinycolor(valueColor)\n        .setAlpha(0.35)\n        .toRgbString()}`;\n\n      barStyles.borderTop = `2px solid ${valueColor}`;\n    } else {\n      // Gradient styles\n      barStyles.background = getBarGradient(props, maxBarHeight);\n    }\n  } else {\n    const barWidth = Math.max(valuePercent * maxBarWidth, 1);\n\n    // Custom styles for horizontal orientation\n    wrapperStyles.flexDirection = 'row-reverse';\n    wrapperStyles.justifyContent = 'flex-end';\n    wrapperStyles.alignItems = 'stretch';\n\n    barStyles.transition = 'width 1s';\n    barStyles.height = `${maxBarHeight}px`;\n    barStyles.width = `${barWidth}px`;\n\n    // shift empty region back to fill gaps due to border radius\n    emptyBar.left = '-3px';\n\n    if (isBasic) {\n      // Basic styles\n      barStyles.background = `${tinycolor(valueColor)\n        .setAlpha(0.35)\n        .toRgbString()}`;\n      barStyles.borderRight = `2px solid ${valueColor}`;\n    } else {\n      // Gradient styles\n      barStyles.background = getBarGradient(props, maxBarWidth);\n    }\n  }\n\n  return {\n    wrapper: wrapperStyles,\n    bar: barStyles,\n    value: valueStyles,\n    emptyBar,\n  };\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBarGradient(props: Props, maxSize: number): string {\n  const { field, value, orientation } = props;\n  const cssDirection = isVertical(orientation) ? '0deg' : '90deg';\n  const minValue = field.min!;\n  const maxValue = field.max!;\n\n  let gradient = '';\n  let lastpos = 0;\n\n  if (field.color && field.color.mode === FieldColorMode.Scheme) {\n    const schemeSet = (d3 as any)[`scheme${field.color.schemeName}`] as any[];\n    if (!schemeSet) {\n      // Error: unknown scheme\n      const color = '#F00';\n      gradient = `linear-gradient(${cssDirection}, ${color}, ${color}`;\n      gradient += ` ${maxSize}px, ${color}`;\n      return gradient + ')';\n    }\n    // Get the scheme with as many steps as possible\n    const scheme = schemeSet[schemeSet.length - 1] as string[];\n    for (let i = 0; i < scheme.length; i++) {\n      const color = scheme[i];\n      const valuePercent = i / (scheme.length - 1);\n      const pos = valuePercent * maxSize;\n      const offset = Math.round(pos - (pos - lastpos) / 2);\n\n      if (gradient === '') {\n        gradient = `linear-gradient(${cssDirection}, ${color}, ${color}`;\n      } else {\n        lastpos = pos;\n        gradient += ` ${offset}px, ${color}`;\n      }\n    }\n  } else {\n    const thresholds = field.thresholds!;\n\n    for (let i = 0; i < thresholds.steps.length; i++) {\n      const threshold = thresholds.steps[i];\n      const color = getColorFromHexRgbOrName(threshold.color);\n      const valuePercent = getValuePercent(threshold.value, minValue, maxValue);\n      const pos = valuePercent * maxSize;\n      const offset = Math.round(pos - (pos - lastpos) / 2);\n\n      if (gradient === '') {\n        gradient = `linear-gradient(${cssDirection}, ${color}, ${color}`;\n      } else if (value.numeric < threshold.value) {\n        break;\n      } else {\n        lastpos = pos;\n        gradient += ` ${offset}px, ${color}`;\n      }\n    }\n  }\n\n  return gradient + ')';\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getValueColor(props: Props): string {\n  const { theme, value } = props;\n  if (value.color) {\n    return value.color;\n  }\n  return getColorFromHexRgbOrName('gray', theme.type);\n}\n\nfunction getValueStyles(\n  value: FormattedValue,\n  color: string,\n  width: number,\n  height: number,\n  orientation: VizOrientation\n): CSSProperties {\n  const styles: CSSProperties = {\n    color: color,\n    height: `${height}px`,\n    width: `${width}px`,\n    display: 'flex',\n    alignItems: 'center',\n    lineHeight: VALUE_LINE_HEIGHT,\n  };\n\n  // how many pixels in wide can the text be?\n  let textWidth = width;\n  const formattedValueString = formattedValueToString(value);\n\n  if (isVertical(orientation)) {\n    styles.fontSize = calculateFontSize(formattedValueString, textWidth, height, VALUE_LINE_HEIGHT);\n    styles.justifyContent = `center`;\n  } else {\n    styles.fontSize = calculateFontSize(\n      formattedValueString,\n      textWidth - VALUE_LEFT_PADDING * 2,\n      height,\n      VALUE_LINE_HEIGHT\n    );\n    styles.justifyContent = `flex-end`;\n    styles.paddingLeft = `${VALUE_LEFT_PADDING}px`;\n    styles.paddingRight = `${VALUE_LEFT_PADDING}px`;\n    // Need to remove the left padding from the text width constraints\n    textWidth -= VALUE_LEFT_PADDING;\n\n    // adjust width of title box\n    styles.width = measureText(formattedValueString, styles.fontSize).width + VALUE_LEFT_PADDING * 2;\n  }\n\n  return styles;\n}\n","import { CellProps } from 'react-table';\nimport { Field } from '@grafana/data';\nimport { TableStyles } from './styles';\nimport { FC } from 'react';\n\nexport interface TableFieldOptions {\n  width: number;\n  align: FieldTextAlignment;\n  displayMode: TableCellDisplayMode;\n  hidden?: boolean;\n}\n\nexport enum TableCellDisplayMode {\n  Auto = 'auto',\n  ColorText = 'color-text',\n  ColorBackground = 'color-background',\n  GradientGauge = 'gradient-gauge',\n  LcdGauge = 'lcd-gauge',\n  JSONView = 'json-view',\n}\n\nexport type FieldTextAlignment = 'auto' | 'left' | 'right' | 'center';\n\nexport interface TableRow {\n  [x: string]: any;\n}\n\nexport type TableFilterActionCallback = (key: string, value: string) => void;\nexport type TableColumnResizeActionCallback = (fieldDisplayName: string, width: number) => void;\nexport type TableSortByActionCallback = (state: TableSortByFieldState[]) => void;\n\nexport interface TableSortByFieldState {\n  displayName: string;\n  desc?: boolean;\n}\n\nexport interface TableCellProps extends CellProps<any> {\n  tableStyles: TableStyles;\n  field: Field;\n}\n\nexport type CellComponent = FC<TableCellProps>;\n","import React, { FC } from 'react';\nimport { ThresholdsConfig, ThresholdsMode, VizOrientation } from '@grafana/data';\nimport { BarGauge, BarGaugeDisplayMode } from '../BarGauge/BarGauge';\nimport { TableCellProps, TableCellDisplayMode } from './types';\n\nconst defaultScale: ThresholdsConfig = {\n  mode: ThresholdsMode.Absolute,\n  steps: [\n    {\n      color: 'blue',\n      value: -Infinity,\n    },\n    {\n      color: 'green',\n      value: 20,\n    },\n  ],\n};\n\nexport const BarGaugeCell: FC<TableCellProps> = props => {\n  const { field, column, tableStyles, cell } = props;\n\n  if (!field.display) {\n    return null;\n  }\n\n  let { config } = field;\n  if (!config.thresholds) {\n    config = {\n      ...config,\n      thresholds: defaultScale,\n    };\n  }\n\n  const displayValue = field.display(cell.value);\n  let barGaugeMode = BarGaugeDisplayMode.Gradient;\n\n  if (field.config.custom && field.config.custom.displayMode === TableCellDisplayMode.LcdGauge) {\n    barGaugeMode = BarGaugeDisplayMode.Lcd;\n  }\n\n  let width;\n  if (column.width) {\n    width = (column.width as number) - tableStyles.cellPadding * 2;\n  } else {\n    width = tableStyles.cellPadding * 2;\n  }\n\n  return (\n    <div className={tableStyles.tableCell}>\n      <BarGauge\n        width={width}\n        height={tableStyles.cellHeightInner}\n        field={config}\n        display={field.display}\n        value={displayValue}\n        orientation={VizOrientation.Horizontal}\n        theme={tableStyles.theme}\n        itemSpacing={1}\n        lcdCellWidth={8}\n        displayMode={barGaugeMode}\n      />\n    </div>\n  );\n};\n","import { CellComponent, TableCellProps } from './types';\nimport { TableStyles } from './styles';\n\nexport const withTableStyles = (\n  CellComponent: CellComponent,\n  getExtendedStyles: (props: TableCellProps) => TableStyles\n): CellComponent => {\n  function WithTableStyles(props: TableCellProps) {\n    return CellComponent({ ...props, tableStyles: getExtendedStyles(props) });\n  }\n\n  WithTableStyles.displayName = CellComponent.displayName || CellComponent.name;\n  return WithTableStyles;\n};\n","// Based on work https://github.com/mohsen1/json-formatter-js\n// License MIT, Copyright (c) 2015 Mohsen Azimi\n\n/*\n * Escapes `\"` characters from string\n */\nfunction escapeString(str: string): string {\n  return str.replace('\"', '\"');\n}\n\n/*\n * Determines if a value is an object\n */\nexport function isObject(value: any): boolean {\n  const type = typeof value;\n  return !!value && type === 'object';\n}\n\n/*\n * Gets constructor name of an object.\n * From http://stackoverflow.com/a/332429\n *\n */\nexport function getObjectName(object: object): string {\n  if (object === undefined) {\n    return '';\n  }\n  if (object === null) {\n    return 'Object';\n  }\n  if (typeof object === 'object' && !object.constructor) {\n    return 'Object';\n  }\n\n  const funcNameRegex = /function ([^(]*)/;\n  const results = funcNameRegex.exec(object.constructor.toString());\n  if (results && results.length > 1) {\n    return results[1];\n  } else {\n    return '';\n  }\n}\n\n/*\n * Gets type of an object. Returns \"null\" for null objects\n */\nexport function getType(object: object): string {\n  if (object === null) {\n    return 'null';\n  }\n  return typeof object;\n}\n\n/*\n * Generates inline preview for a JavaScript object based on a value\n */\nexport function getValuePreview(object: object, value: string): string {\n  const type = getType(object);\n\n  if (type === 'null' || type === 'undefined') {\n    return type;\n  }\n\n  if (type === 'string') {\n    value = '\"' + escapeString(value) + '\"';\n  }\n  if (type === 'function') {\n    // Remove content of the function\n    return (\n      object\n        .toString()\n        .replace(/[\\r\\n]/g, '')\n        .replace(/\\{.*\\}/, '') + '{…}'\n    );\n  }\n  return value;\n}\n\n/*\n * Generates inline preview for a JavaScript object\n */\nlet value = '';\nexport function getPreview(obj: object): string {\n  if (isObject(obj)) {\n    value = getObjectName(obj);\n    if (Array.isArray(obj)) {\n      value += '[' + obj.length + ']';\n    }\n  } else {\n    value = getValuePreview(obj, obj.toString());\n  }\n  return value;\n}\n\n/*\n * Generates a prefixed CSS class name\n */\nexport function cssClass(className: string): string {\n  return `json-formatter-${className}`;\n}\n\n/*\n * Creates a new DOM element with given type and class\n * TODO: move me to helpers\n */\nexport function createElement(type: string, className?: string, content?: Element | string): Element {\n  const el = document.createElement(type);\n  if (className) {\n    el.classList.add(cssClass(className));\n  }\n  if (content !== undefined) {\n    if (content instanceof Node) {\n      el.appendChild(content);\n    } else {\n      el.appendChild(document.createTextNode(String(content)));\n    }\n  }\n  return el;\n}\n","// Based on work https://github.com/mohsen1/json-formatter-js\n// License MIT, Copyright (c) 2015 Mohsen Azimi\n\nimport { isObject, getObjectName, getType, getValuePreview, cssClass, createElement } from './helpers';\n\nimport _ from 'lodash';\n\nconst DATE_STRING_REGEX = /(^\\d{1,4}[\\.|\\\\/|-]\\d{1,2}[\\.|\\\\/|-]\\d{1,4})(\\s*(?:0?[1-9]:[0-5]|1(?=[012])\\d:[0-5])\\d\\s*[ap]m)?$/;\nconst PARTIAL_DATE_REGEX = /\\d{2}:\\d{2}:\\d{2} GMT-\\d{4}/;\nconst JSON_DATE_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/;\n\n// When toggleing, don't animated removal or addition of more than a few items\nconst MAX_ANIMATED_TOGGLE_ITEMS = 10;\n\nconst requestAnimationFrame =\n  window.requestAnimationFrame ||\n  ((cb: () => void) => {\n    cb();\n    return 0;\n  });\n\nexport interface JsonExplorerConfig {\n  animateOpen?: boolean;\n  animateClose?: boolean;\n  theme?: string;\n}\n\nconst _defaultConfig: JsonExplorerConfig = {\n  animateOpen: true,\n  animateClose: true,\n};\n\n/**\n * @class JsonExplorer\n *\n * JsonExplorer allows you to render JSON objects in HTML with a\n * **collapsible** navigation.\n */\nexport class JsonExplorer {\n  // Hold the open state after the toggler is used\n  private _isOpen: boolean | null = null;\n\n  // A reference to the element that we render to\n  private element: Element | null = null;\n\n  private skipChildren = false;\n\n  /**\n   * @param {object} json The JSON object you want to render. It has to be an\n   * object or array. Do NOT pass raw JSON string.\n   *\n   * @param {number} [open=1] his number indicates up to how many levels the\n   * rendered tree should expand. Set it to `0` to make the whole tree collapsed\n   * or set it to `Infinity` to expand the tree deeply\n   *\n   * @param {object} [config=defaultConfig] -\n   *  defaultConfig = {\n   *   hoverPreviewEnabled: false,\n   *   hoverPreviewArrayCount: 100,\n   *   hoverPreviewFieldCount: 5\n   * }\n   *\n   * Available configurations:\n   *  #####Hover Preview\n   * * `hoverPreviewEnabled`:  enable preview on hover\n   * * `hoverPreviewArrayCount`: number of array items to show in preview Any\n   *    array larger than this number will be shown as `Array[XXX]` where `XXX`\n   *    is length of the array.\n   * * `hoverPreviewFieldCount`: number of object properties to show for object\n   *   preview. Any object with more properties that thin number will be\n   *   truncated.\n   *\n   * @param {string} [key=undefined] The key that this object in it's parent\n   * context\n   */\n  constructor(\n    public json: any,\n    private open = 1,\n    private config: JsonExplorerConfig = _defaultConfig,\n    private key?: string\n  ) {}\n\n  /*\n   * is formatter open?\n   */\n  private get isOpen(): boolean {\n    if (this._isOpen !== null) {\n      return this._isOpen;\n    } else {\n      return this.open > 0;\n    }\n  }\n\n  /*\n   * set open state (from toggler)\n   */\n  private set isOpen(value: boolean) {\n    this._isOpen = value;\n  }\n\n  /*\n   * is this a date string?\n   */\n  private get isDate(): boolean {\n    return (\n      this.type === 'string' &&\n      (DATE_STRING_REGEX.test(this.json) || JSON_DATE_REGEX.test(this.json) || PARTIAL_DATE_REGEX.test(this.json))\n    );\n  }\n\n  /*\n   * is this a URL string?\n   */\n  private get isUrl(): boolean {\n    return this.type === 'string' && this.json.indexOf('http') === 0;\n  }\n\n  /*\n   * is this an array?\n   */\n  private get isArray(): boolean {\n    return Array.isArray(this.json);\n  }\n\n  /*\n   * is this an object?\n   * Note: In this context arrays are object as well\n   */\n  private get isObject(): boolean {\n    return isObject(this.json);\n  }\n\n  /*\n   * is this an empty object with no properties?\n   */\n  private get isEmptyObject(): boolean {\n    return !this.keys.length && !this.isArray;\n  }\n\n  /*\n   * is this an empty object or array?\n   */\n  private get isEmpty(): boolean {\n    return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray);\n  }\n\n  /*\n   * did we receive a key argument?\n   * This means that the formatter was called as a sub formatter of a parent formatter\n   */\n  private get hasKey(): boolean {\n    return typeof this.key !== 'undefined';\n  }\n\n  /*\n   * if this is an object, get constructor function name\n   */\n  private get constructorName(): string {\n    return getObjectName(this.json);\n  }\n\n  /*\n   * get type of this value\n   * Possible values: all JavaScript primitive types plus \"array\" and \"null\"\n   */\n  private get type(): string {\n    return getType(this.json);\n  }\n\n  /*\n   * get object keys\n   * If there is an empty key we pad it wit quotes to make it visible\n   */\n  private get keys(): string[] {\n    if (this.isObject) {\n      return Object.keys(this.json).map(key => (key ? key : '\"\"'));\n    } else {\n      return [];\n    }\n  }\n\n  /**\n   * Toggles `isOpen` state\n   *\n   */\n  toggleOpen() {\n    this.isOpen = !this.isOpen;\n\n    if (this.element) {\n      if (this.isOpen) {\n        this.appendChildren(this.config.animateOpen);\n      } else {\n        this.removeChildren(this.config.animateClose);\n      }\n      this.element.classList.toggle(cssClass('open'));\n    }\n  }\n\n  /**\n   * Open all children up to a certain depth.\n   * Allows actions such as expand all/collapse all\n   *\n   */\n  openAtDepth(depth = 1) {\n    if (depth < 0) {\n      return;\n    }\n\n    this.open = depth;\n    this.isOpen = depth !== 0;\n\n    if (this.element) {\n      this.removeChildren(false);\n\n      if (depth === 0) {\n        this.element.classList.remove(cssClass('open'));\n      } else {\n        this.appendChildren(this.config.animateOpen);\n        this.element.classList.add(cssClass('open'));\n      }\n    }\n  }\n\n  isNumberArray() {\n    return this.json.length > 0 && this.json.length < 4 && (_.isNumber(this.json[0]) || _.isNumber(this.json[1]));\n  }\n\n  renderArray() {\n    const arrayWrapperSpan = createElement('span');\n    arrayWrapperSpan.appendChild(createElement('span', 'bracket', '['));\n\n    // some pretty handling of number arrays\n    if (this.isNumberArray()) {\n      this.json.forEach((val: any, index: number) => {\n        if (index > 0) {\n          arrayWrapperSpan.appendChild(createElement('span', 'array-comma', ','));\n        }\n        arrayWrapperSpan.appendChild(createElement('span', 'number', val));\n      });\n      this.skipChildren = true;\n    } else {\n      arrayWrapperSpan.appendChild(createElement('span', 'number', this.json.length));\n    }\n\n    arrayWrapperSpan.appendChild(createElement('span', 'bracket', ']'));\n    return arrayWrapperSpan;\n  }\n\n  /**\n   * Renders an HTML element and installs event listeners\n   *\n   * @returns {HTMLDivElement}\n   */\n  render(skipRoot = false): HTMLDivElement {\n    // construct the root element and assign it to this.element\n    this.element = createElement('div', 'row');\n\n    // construct the toggler link\n    const togglerLink = createElement('a', 'toggler-link');\n    const togglerIcon = createElement('span', 'toggler');\n\n    // if this is an object we need a wrapper span (toggler)\n    if (this.isObject) {\n      togglerLink.appendChild(togglerIcon);\n    }\n\n    // if this is child of a parent formatter we need to append the key\n    if (this.hasKey) {\n      togglerLink.appendChild(createElement('span', 'key', `${this.key}:`));\n    }\n\n    // Value for objects and arrays\n    if (this.isObject) {\n      // construct the value holder element\n      const value = createElement('span', 'value');\n\n      // we need a wrapper span for objects\n      const objectWrapperSpan = createElement('span');\n\n      // get constructor name and append it to wrapper span\n      const constructorName = createElement('span', 'constructor-name', this.constructorName);\n      objectWrapperSpan.appendChild(constructorName);\n\n      // if it's an array append the array specific elements like brackets and length\n      if (this.isArray) {\n        const arrayWrapperSpan = this.renderArray();\n        objectWrapperSpan.appendChild(arrayWrapperSpan);\n      }\n\n      // append object wrapper span to toggler link\n      value.appendChild(objectWrapperSpan);\n      togglerLink.appendChild(value);\n      // Primitive values\n    } else {\n      // make a value holder element\n      const value = this.isUrl ? createElement('a') : createElement('span');\n\n      // add type and other type related CSS classes\n      value.classList.add(cssClass(this.type));\n      if (this.isDate) {\n        value.classList.add(cssClass('date'));\n      }\n      if (this.isUrl) {\n        value.classList.add(cssClass('url'));\n        value.setAttribute('href', this.json);\n      }\n\n      // Append value content to value element\n      const valuePreview = getValuePreview(this.json, this.json);\n      value.appendChild(document.createTextNode(valuePreview));\n\n      // append the value element to toggler link\n      togglerLink.appendChild(value);\n    }\n\n    // construct a children element\n    const children = createElement('div', 'children');\n\n    // set CSS classes for children\n    if (this.isObject) {\n      children.classList.add(cssClass('object'));\n    }\n    if (this.isArray) {\n      children.classList.add(cssClass('array'));\n    }\n    if (this.isEmpty) {\n      children.classList.add(cssClass('empty'));\n    }\n\n    // set CSS classes for root element\n    if (this.config && this.config.theme) {\n      this.element.classList.add(cssClass(this.config.theme));\n    }\n    if (this.isOpen) {\n      this.element.classList.add(cssClass('open'));\n    }\n\n    // append toggler and children elements to root element\n    if (!skipRoot) {\n      this.element.appendChild(togglerLink);\n    }\n\n    if (!this.skipChildren) {\n      this.element.appendChild(children);\n    } else {\n      // remove togglerIcon\n      togglerLink.removeChild(togglerIcon);\n    }\n\n    // if formatter is set to be open call appendChildren\n    if (this.isObject && this.isOpen) {\n      this.appendChildren();\n    }\n\n    // add event listener for toggling\n    if (this.isObject) {\n      togglerLink.addEventListener('click', this.toggleOpen.bind(this));\n    }\n\n    return this.element as HTMLDivElement;\n  }\n\n  /**\n   * Appends all the children to children element\n   * Animated option is used when user triggers this via a click\n   */\n  appendChildren(animated = false) {\n    const children = this.element && this.element.querySelector(`div.${cssClass('children')}`);\n\n    if (!children || this.isEmpty) {\n      return;\n    }\n\n    if (animated) {\n      let index = 0;\n      const addAChild = () => {\n        const key = this.keys[index];\n        const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n        children.appendChild(formatter.render());\n\n        index += 1;\n\n        if (index < this.keys.length) {\n          if (index > MAX_ANIMATED_TOGGLE_ITEMS) {\n            addAChild();\n          } else {\n            requestAnimationFrame(addAChild);\n          }\n        }\n      };\n\n      requestAnimationFrame(addAChild);\n    } else {\n      this.keys.forEach(key => {\n        const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n        children.appendChild(formatter.render());\n      });\n    }\n  }\n\n  /**\n   * Removes all the children from children element\n   * Animated option is used when user triggers this via a click\n   */\n  removeChildren(animated = false) {\n    const childrenElement =\n      this.element && (this.element.querySelector(`div.${cssClass('children')}`) as HTMLDivElement);\n\n    if (animated) {\n      let childrenRemoved = 0;\n      const removeAChild = () => {\n        if (childrenElement && childrenElement.children.length) {\n          childrenElement.removeChild(childrenElement.children[0]);\n          childrenRemoved += 1;\n          if (childrenRemoved > MAX_ANIMATED_TOGGLE_ITEMS) {\n            removeAChild();\n          } else {\n            requestAnimationFrame(removeAChild);\n          }\n        }\n      };\n      requestAnimationFrame(removeAChild);\n    } else {\n      if (childrenElement) {\n        childrenElement.innerHTML = '';\n      }\n    }\n  }\n}\n","import React, { PureComponent, createRef } from 'react';\nimport { JsonExplorer } from './json_explorer/json_explorer'; // We have made some monkey-patching of json-formatter-js so we can't switch right now\n\ninterface Props {\n  className?: string;\n  json: {};\n  config?: any;\n  open?: number;\n  onDidRender?: (formattedJson: any) => void;\n}\n\nexport class JSONFormatter extends PureComponent<Props> {\n  private wrapperRef = createRef<HTMLDivElement>();\n\n  static defaultProps = {\n    open: 3,\n    config: {\n      animateOpen: true,\n    },\n  };\n\n  componentDidMount() {\n    this.renderJson();\n  }\n\n  componentDidUpdate() {\n    this.renderJson();\n  }\n\n  renderJson = () => {\n    const { json, config, open, onDidRender } = this.props;\n    const wrapperEl = this.wrapperRef.current;\n    const formatter = new JsonExplorer(json, open, config);\n    // @ts-ignore\n    const hasChildren: boolean = wrapperEl.hasChildNodes();\n    if (hasChildren) {\n      // @ts-ignore\n      wrapperEl.replaceChild(formatter.render(), wrapperEl.lastChild);\n    } else {\n      // @ts-ignore\n      wrapperEl.appendChild(formatter.render());\n    }\n\n    if (onDidRender) {\n      onDidRender(formatter.json);\n    }\n  };\n\n  render() {\n    const { className } = this.props;\n    return <div className={className} ref={this.wrapperRef} />;\n  }\n}\n","import React, { FC } from 'react';\nimport { css, cx } from 'emotion';\nimport { TableCellProps } from './types';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { JSONFormatter } from '../JSONFormatter/JSONFormatter';\n\nexport const JSONViewCell: FC<TableCellProps> = props => {\n  const { field, cell, tableStyles } = props;\n\n  if (!field.display) {\n    return null;\n  }\n\n  const txt = css`\n    cursor: pointer;\n    font-family: monospace;\n  `;\n\n  const displayValue = JSON.stringify(cell.value);\n  const content = <JSONTooltip value={cell.value} />;\n  return (\n    <div className={cx(txt, tableStyles.tableCell)}>\n      <Tooltip placement=\"auto\" content={content} theme={'info'}>\n        <div className={tableStyles.overflow}>{displayValue}</div>\n      </Tooltip>\n    </div>\n  );\n};\n\ninterface PopupProps {\n  value: any;\n}\n\nconst JSONTooltip: FC<PopupProps> = props => {\n  const clazz = css`\n    padding: 10px;\n  `;\n  return (\n    <div className={clazz}>\n      <JSONFormatter json={props.value} open={4} />\n    </div>\n  );\n};\n","import { TextAlignProperty } from 'csstype';\nimport { DataFrame, Field, FieldType, getFieldDisplayName } from '@grafana/data';\nimport { Column } from 'react-table';\nimport { DefaultCell } from './DefaultCell';\nimport { BarGaugeCell } from './BarGaugeCell';\nimport { TableCellDisplayMode, TableCellProps, TableFieldOptions } from './types';\nimport { css, cx } from 'emotion';\nimport { withTableStyles } from './withTableStyles';\nimport tinycolor from 'tinycolor2';\nimport { JSONViewCell } from './JSONViewCell';\n\nexport function getTextAlign(field?: Field): TextAlignProperty {\n  if (!field) {\n    return 'left';\n  }\n\n  if (field.config.custom) {\n    const custom = field.config.custom as TableFieldOptions;\n\n    switch (custom.align) {\n      case 'right':\n        return 'right';\n      case 'left':\n        return 'left';\n      case 'center':\n        return 'center';\n    }\n  }\n\n  if (field.type === FieldType.number) {\n    return 'right';\n  }\n\n  return 'left';\n}\n\nexport function getColumns(data: DataFrame, availableWidth: number, columnMinWidth: number): Column[] {\n  const columns: Column[] = [];\n  let fieldCountWithoutWidth = data.fields.length;\n\n  for (const [fieldIndex, field] of data.fields.entries()) {\n    const fieldTableOptions = (field.config.custom || {}) as TableFieldOptions;\n\n    if (fieldTableOptions.hidden) {\n      continue;\n    }\n\n    if (fieldTableOptions.width) {\n      availableWidth -= fieldTableOptions.width;\n      fieldCountWithoutWidth -= 1;\n    }\n\n    const Cell = getCellComponent(fieldTableOptions.displayMode, field);\n    columns.push({\n      Cell,\n      id: fieldIndex.toString(),\n      Header: getFieldDisplayName(field, data),\n      accessor: (row: any, i: number) => {\n        return field.values.get(i);\n      },\n      width: fieldTableOptions.width,\n      minWidth: 50,\n    });\n  }\n\n  // divide up the rest of the space\n  const sharedWidth = availableWidth / fieldCountWithoutWidth;\n  for (const column of columns) {\n    if (!column.width) {\n      column.width = Math.max(sharedWidth, columnMinWidth);\n    }\n  }\n\n  return columns;\n}\n\nfunction getCellComponent(displayMode: TableCellDisplayMode, field: Field) {\n  switch (displayMode) {\n    case TableCellDisplayMode.ColorText:\n      return withTableStyles(DefaultCell, getTextColorStyle);\n    case TableCellDisplayMode.ColorBackground:\n      return withTableStyles(DefaultCell, getBackgroundColorStyle);\n    case TableCellDisplayMode.LcdGauge:\n    case TableCellDisplayMode.GradientGauge:\n      return BarGaugeCell;\n    case TableCellDisplayMode.JSONView:\n      return JSONViewCell;\n  }\n\n  // Default or Auto\n  if (field.type === FieldType.other) {\n    return JSONViewCell;\n  }\n  return DefaultCell;\n}\n\nfunction getTextColorStyle(props: TableCellProps) {\n  const { field, cell, tableStyles } = props;\n\n  if (!field.display) {\n    return tableStyles;\n  }\n\n  const displayValue = field.display(cell.value);\n  if (!displayValue.color) {\n    return tableStyles;\n  }\n\n  const extendedStyle = css`\n    color: ${displayValue.color};\n  `;\n\n  return {\n    ...tableStyles,\n    tableCell: cx(tableStyles.tableCell, extendedStyle),\n  };\n}\n\nfunction getBackgroundColorStyle(props: TableCellProps) {\n  const { field, cell, tableStyles } = props;\n  if (!field.display) {\n    return tableStyles;\n  }\n\n  const displayValue = field.display(cell.value);\n  if (!displayValue.color) {\n    return tableStyles;\n  }\n\n  const themeFactor = tableStyles.theme.isDark ? 1 : -0.7;\n  const bgColor2 = tinycolor(displayValue.color)\n    .darken(10 * themeFactor)\n    .spin(5)\n    .toRgbString();\n\n  const extendedStyle = css`\n    background: linear-gradient(120deg, ${bgColor2}, ${displayValue.color});\n    color: white;\n    height: ${tableStyles.cellHeight}px;\n    padding: ${tableStyles.cellPadding}px;\n  `;\n\n  return {\n    ...tableStyles,\n    tableCell: cx(tableStyles.tableCell, extendedStyle),\n  };\n}\n","import { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, styleMixins } from '../../themes';\nimport { getScrollbarWidth } from '../../utils';\n\nexport interface TableStyles {\n  cellHeight: number;\n  cellHeightInner: number;\n  cellPadding: number;\n  rowHeight: number;\n  table: string;\n  thead: string;\n  headerCell: string;\n  headerCellLabel: string;\n  tableCell: string;\n  tableCellWrapper: string;\n  tableCellLink: string;\n  row: string;\n  theme: GrafanaTheme;\n  resizeHandle: string;\n  overflow: string;\n}\n\nexport const getTableStyles = stylesFactory(\n  (theme: GrafanaTheme): TableStyles => {\n    const { palette, colors } = theme;\n    const headerBg = theme.colors.bg2;\n    const borderColor = theme.colors.border1;\n    const resizerColor = theme.isLight ? palette.blue95 : palette.blue77;\n    const padding = 6;\n    const lineHeight = theme.typography.lineHeight.md;\n    const bodyFontSize = 14;\n    const cellHeight = padding * 2 + bodyFontSize * lineHeight;\n    const rowHoverBg = styleMixins.hoverColor(theme.colors.bg1, theme);\n    const scollbarWidth = getScrollbarWidth();\n\n    return {\n      theme,\n      cellHeight,\n      cellPadding: padding,\n      cellHeightInner: bodyFontSize * lineHeight,\n      rowHeight: cellHeight + 2,\n      table: css`\n        height: 100%;\n        width: 100%;\n        overflow: auto;\n        display: flex;\n      `,\n      thead: css`\n        label: thead;\n        height: ${cellHeight}px;\n        overflow-y: auto;\n        overflow-x: hidden;\n        background: ${headerBg};\n        position: relative;\n      `,\n      headerCell: css`\n        padding: ${padding}px;\n        cursor: pointer;\n        overflow: hidden;\n        white-space: nowrap;\n        color: ${colors.textBlue};\n        border-right: 1px solid ${theme.colors.panelBg};\n\n        &:last-child {\n          border-right: none;\n        }\n      `,\n      headerCellLabel: css`\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      `,\n      row: css`\n        label: row;\n        border-bottom: 1px solid ${borderColor};\n\n        &:hover {\n          background-color: ${rowHoverBg};\n        }\n      `,\n      tableCellWrapper: css`\n        border-right: 1px solid ${borderColor};\n\n        &:last-child {\n          border-right: none;\n\n          > div {\n            padding-right: ${scollbarWidth + padding}px;\n          }\n        }\n      `,\n      tableCellLink: css`\n        text-decoration: underline;\n      `,\n      tableCell: css`\n        padding: ${padding}px;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n      `,\n      overflow: css`\n        overflow: hidden;\n        text-overflow: ellipsis;\n      `,\n      resizeHandle: css`\n        label: resizeHandle;\n        cursor: col-resize !important;\n        display: inline-block;\n        background: ${resizerColor};\n        opacity: 0;\n        transition: opacity 0.2s ease-in-out;\n        width: 8px;\n        height: 100%;\n        position: absolute;\n        right: -4px;\n        border-radius: 3px;\n        top: 0;\n        z-index: ${theme.zIndex.dropdown};\n        touch-action: none;\n\n        &:hover {\n          opacity: 1;\n        }\n      `,\n    };\n  }\n);\n","import React, { FC } from 'react';\nimport { Cell } from 'react-table';\nimport { Field } from '@grafana/data';\nimport { getTextAlign } from './utils';\nimport { TableFilterActionCallback } from './types';\nimport { TableStyles } from './styles';\n\ninterface Props {\n  cell: Cell;\n  field: Field;\n  tableStyles: TableStyles;\n  onCellClick?: TableFilterActionCallback;\n}\n\nexport const TableCell: FC<Props> = ({ cell, field, tableStyles, onCellClick }) => {\n  const filterable = field.config.filterable;\n  const cellProps = cell.getCellProps();\n\n  let onClick: ((event: React.SyntheticEvent) => void) | undefined = undefined;\n\n  if (filterable && onCellClick) {\n    if (cellProps.style) {\n      cellProps.style.cursor = 'pointer';\n    }\n\n    onClick = () => onCellClick(cell.column.Header as string, cell.value);\n  }\n\n  if (cellProps.style) {\n    cellProps.style.textAlign = getTextAlign(field);\n  }\n\n  return (\n    <div {...cellProps} onClick={onClick} className={tableStyles.tableCellWrapper}>\n      {cell.render('Cell', { field, tableStyles })}\n    </div>\n  );\n};\n","import React, { FC, memo, useCallback, useMemo } from 'react';\nimport { DataFrame, Field, getFieldDisplayName } from '@grafana/data';\nimport {\n  Cell,\n  Column,\n  HeaderGroup,\n  useAbsoluteLayout,\n  useResizeColumns,\n  UseResizeColumnsState,\n  useSortBy,\n  UseSortByState,\n  useTable,\n} from 'react-table';\nimport { FixedSizeList } from 'react-window';\nimport { getColumns, getTextAlign } from './utils';\nimport { useTheme } from '../../themes';\nimport {\n  TableColumnResizeActionCallback,\n  TableFilterActionCallback,\n  TableSortByActionCallback,\n  TableSortByFieldState,\n} from './types';\nimport { getTableStyles, TableStyles } from './styles';\nimport { TableCell } from './TableCell';\nimport { Icon } from '../Icon/Icon';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\n\nconst COLUMN_MIN_WIDTH = 150;\n\nexport interface Props {\n  data: DataFrame;\n  width: number;\n  height: number;\n  /** Minimal column width specified in pixels */\n  columnMinWidth?: number;\n  noHeader?: boolean;\n  resizable?: boolean;\n  initialSortBy?: TableSortByFieldState[];\n  onCellClick?: TableFilterActionCallback;\n  onColumnResize?: TableColumnResizeActionCallback;\n  onSortByChange?: TableSortByActionCallback;\n}\n\ninterface ReactTableInternalState extends UseResizeColumnsState<{}>, UseSortByState<{}> {}\n\nfunction useTableStateReducer(props: Props) {\n  return useCallback(\n    (newState: ReactTableInternalState, action: any) => {\n      switch (action.type) {\n        case 'columnDoneResizing':\n          if (props.onColumnResize) {\n            const { data } = props;\n            const info = (newState.columnResizing.headerIdWidths as any)[0];\n            const columnIdString = info[0];\n            const fieldIndex = parseInt(columnIdString, 10);\n            const width = Math.round(newState.columnResizing.columnWidths[columnIdString] as number);\n\n            const field = data.fields[fieldIndex];\n            if (!field) {\n              return newState;\n            }\n\n            const fieldDisplayName = getFieldDisplayName(field, data);\n            props.onColumnResize(fieldDisplayName, width);\n          }\n        case 'toggleSortBy':\n          if (props.onSortByChange) {\n            const { data } = props;\n            const sortByFields: TableSortByFieldState[] = [];\n\n            for (const sortItem of newState.sortBy) {\n              const field = data.fields[parseInt(sortItem.id, 10)];\n              if (!field) {\n                continue;\n              }\n\n              sortByFields.push({\n                displayName: getFieldDisplayName(field, data),\n                desc: sortItem.desc,\n              });\n            }\n\n            props.onSortByChange(sortByFields);\n          }\n          break;\n      }\n\n      return newState;\n    },\n    [props.onColumnResize, props.onSortByChange, props.data]\n  );\n}\n\nfunction getInitialState(props: Props, columns: Column[]): Partial<ReactTableInternalState> {\n  const state: Partial<ReactTableInternalState> = {};\n\n  if (props.initialSortBy) {\n    state.sortBy = [];\n\n    for (const sortBy of props.initialSortBy) {\n      for (const col of columns) {\n        if (col.Header === sortBy.displayName) {\n          state.sortBy.push({ id: col.id as string, desc: sortBy.desc });\n        }\n      }\n    }\n  }\n\n  return state;\n}\n\nexport const Table: FC<Props> = memo((props: Props) => {\n  const { data, height, onCellClick, width, columnMinWidth = COLUMN_MIN_WIDTH, noHeader, resizable = true } = props;\n  const theme = useTheme();\n  const tableStyles = getTableStyles(theme);\n\n  // React table data array. This data acts just like a dummy array to let react-table know how many rows exist\n  // The cells use the field to look up values\n  const memoizedData = useMemo(() => {\n    if (!data.fields.length) {\n      return [];\n    }\n    // as we only use this to fake the length of our data set for react-table we need to make sure we always return an array\n    // filled with values at each index otherwise we'll end up trying to call accessRow for null|undefined value in\n    // https://github.com/tannerlinsley/react-table/blob/7be2fc9d8b5e223fc998af88865ae86a88792fdb/src/hooks/useTable.js#L585\n    return Array(data.length).fill(0);\n  }, [data]);\n\n  // React-table column definitions\n  const memoizedColumns = useMemo(() => getColumns(data, width, columnMinWidth), [data, width, columnMinWidth]);\n\n  // Internal react table state reducer\n  const stateReducer = useTableStateReducer(props);\n\n  const options: any = useMemo(\n    () => ({\n      columns: memoizedColumns,\n      data: memoizedData,\n      disableResizing: !resizable,\n      stateReducer: stateReducer,\n      initialState: getInitialState(props, memoizedColumns),\n    }),\n    [memoizedColumns, memoizedData, stateReducer, resizable]\n  );\n\n  const { getTableProps, headerGroups, rows, prepareRow, totalColumnsWidth } = useTable(\n    options,\n    useSortBy,\n    useAbsoluteLayout,\n    useResizeColumns\n  );\n\n  const RenderRow = React.useCallback(\n    ({ index, style }) => {\n      const row = rows[index];\n      prepareRow(row);\n      return (\n        <div {...row.getRowProps({ style })} className={tableStyles.row}>\n          {row.cells.map((cell: Cell, index: number) => (\n            <TableCell\n              key={index}\n              field={data.fields[index]}\n              tableStyles={tableStyles}\n              cell={cell}\n              onCellClick={onCellClick}\n            />\n          ))}\n        </div>\n      );\n    },\n    [prepareRow, rows]\n  );\n\n  const headerHeight = noHeader ? 0 : tableStyles.cellHeight;\n\n  return (\n    <div {...getTableProps()} className={tableStyles.table}>\n      <CustomScrollbar hideVerticalTrack={true}>\n        <div style={{ width: `${totalColumnsWidth}px` }}>\n          {!noHeader && (\n            <div>\n              {headerGroups.map((headerGroup: HeaderGroup) => {\n                return (\n                  <div className={tableStyles.thead} {...headerGroup.getHeaderGroupProps()}>\n                    {headerGroup.headers.map((column: Column, index: number) =>\n                      renderHeaderCell(column, tableStyles, data.fields[index])\n                    )}\n                  </div>\n                );\n              })}\n            </div>\n          )}\n          <FixedSizeList\n            height={height - headerHeight}\n            itemCount={rows.length}\n            itemSize={tableStyles.rowHeight}\n            width={'100%'}\n            style={{ overflow: 'hidden auto' }}\n          >\n            {RenderRow}\n          </FixedSizeList>\n        </div>\n      </CustomScrollbar>\n    </div>\n  );\n});\n\nTable.displayName = 'Table';\n\nfunction renderHeaderCell(column: any, tableStyles: TableStyles, field?: Field) {\n  const headerProps = column.getHeaderProps();\n\n  if (column.canResize) {\n    headerProps.style.userSelect = column.isResizing ? 'none' : 'auto'; // disables selecting text while resizing\n  }\n\n  headerProps.style.position = 'absolute';\n  headerProps.style.textAlign = getTextAlign(field);\n\n  return (\n    <div className={tableStyles.headerCell} {...headerProps}>\n      {column.canSort && (\n        <div {...column.getSortByToggleProps()} className={tableStyles.headerCellLabel} title={column.render('Header')}>\n          {column.render('Header')}\n          {column.isSorted && (column.isSortedDesc ? <Icon name=\"angle-down\" /> : <Icon name=\"angle-up\" />)}\n        </div>\n      )}\n      {!column.canSort && <div>{column.render('Header')}</div>}\n      {column.canResize && <div {...column.getResizerProps()} className={tableStyles.resizeHandle} />}\n    </div>\n  );\n}\n","import React from 'react';\nimport debounce from 'lodash/debounce';\nimport { DataFrame, CSVConfig, readCSV } from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\n\ninterface Props {\n  config?: CSVConfig;\n  text: string;\n  width: string | number;\n  height: string | number;\n  onSeriesParsed: (data: DataFrame[], text: string) => void;\n}\n\ninterface State {\n  text: string;\n  data: DataFrame[];\n}\n\n/**\n * Expects the container div to have size set and will fill it 100%\n */\nexport class TableInputCSV extends React.PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    const { text, config } = props;\n    this.state = {\n      text,\n      data: readCSV(text, { config }),\n    };\n  }\n\n  readCSV: any = debounce(() => {\n    const { config } = this.props;\n    const { text } = this.state;\n\n    this.setState({ data: readCSV(text, { config }) });\n  }, 150);\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { text } = this.state;\n\n    if (text !== prevState.text || this.props.config !== prevProps.config) {\n      this.readCSV();\n    }\n\n    // If the props text has changed, replace our local version\n    if (this.props.text !== prevProps.text && this.props.text !== text) {\n      this.setState({ text: this.props.text });\n    }\n\n    if (this.state.data !== prevState.data) {\n      this.props.onSeriesParsed(this.state.data, this.state.text);\n    }\n  }\n\n  onTextChange = (event: any) => {\n    this.setState({ text: event.target.value });\n  };\n\n  render() {\n    const { width, height } = this.props;\n    const { data } = this.state;\n    return (\n      <div className=\"gf-table-input-csv\">\n        <textarea\n          style={{ width, height }}\n          placeholder=\"Enter CSV here...\"\n          value={this.state.text}\n          onChange={this.onTextChange}\n          className=\"gf-form-input\"\n        />\n        {data && (\n          <footer>\n            {data.map((frame, index) => {\n              return (\n                <span key={index}>\n                  Rows:{frame.length}, Columns:{frame.fields.length} &nbsp;\n                  <Icon name=\"check-circle\" />\n                </span>\n              );\n            })}\n          </footer>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default TableInputCSV;\n","import React, { FC, HTMLAttributes, ReactNode } from 'react';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n  children: ReactNode;\n}\n\nconst getTabContentStyle = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    tabContent: css`\n      padding: ${theme.spacing.sm};\n    `,\n  };\n});\n\nexport const TabContent: FC<Props> = ({ children, className, ...restProps }) => {\n  const theme = useTheme();\n  const styles = getTabContentStyle(theme);\n\n  return (\n    <div {...restProps} className={cx(styles.tabContent, className)}>\n      {children}\n    </div>\n  );\n};\n","// Libraries\nimport React, { CSSProperties } from 'react';\nimport tinycolor from 'tinycolor2';\nimport { Chart, Geom } from 'bizcharts';\n\n// Utils\nimport { getColorFromHexRgbOrName, formattedValueToString } from '@grafana/data';\nimport { calculateFontSize } from '../../utils/measureText';\n\n// Types\nimport { BigValueColorMode, Props, BigValueJustifyMode } from './BigValue';\n\nconst LINE_HEIGHT = 1.2;\nconst MAX_TITLE_SIZE = 30;\n\nexport abstract class BigValueLayout {\n  titleFontSize: number;\n  valueFontSize: number;\n  chartHeight: number;\n  chartWidth: number;\n  valueColor: string;\n  panelPadding: number;\n  justifyCenter: boolean;\n  titleToAlignTo?: string;\n  valueToAlignTo: string;\n  maxTextWidth: number;\n  maxTextHeight: number;\n\n  constructor(private props: Props) {\n    const { width, height, value, alignmentFactors, theme } = props;\n\n    this.valueColor = getColorFromHexRgbOrName(value.color || 'green', theme.type);\n    this.justifyCenter = shouldJustifyCenter(props);\n    this.panelPadding = height > 100 ? 12 : 8;\n    this.titleToAlignTo = alignmentFactors ? alignmentFactors.title : value.title;\n    this.valueToAlignTo = formattedValueToString(alignmentFactors ? alignmentFactors : value);\n\n    this.titleFontSize = 14;\n    this.valueFontSize = 14;\n    this.chartHeight = 0;\n    this.chartWidth = 0;\n    this.maxTextWidth = width - this.panelPadding * 2;\n    this.maxTextHeight = height - this.panelPadding * 2;\n  }\n\n  getTitleStyles(): CSSProperties {\n    const styles: CSSProperties = {\n      fontSize: `${this.titleFontSize}px`,\n      lineHeight: LINE_HEIGHT,\n    };\n\n    if (this.props.colorMode === BigValueColorMode.Background) {\n      styles.color = 'white';\n    }\n\n    return styles;\n  }\n\n  getValueStyles(): CSSProperties {\n    const styles: CSSProperties = {\n      fontSize: this.valueFontSize,\n      fontWeight: 500,\n      lineHeight: LINE_HEIGHT,\n    };\n\n    switch (this.props.colorMode) {\n      case BigValueColorMode.Value:\n        styles.color = this.valueColor;\n        break;\n      case BigValueColorMode.Background:\n        styles.color = 'white';\n    }\n\n    return styles;\n  }\n\n  getValueAndTitleContainerStyles() {\n    const styles: CSSProperties = {\n      display: 'flex',\n    };\n\n    if (this.justifyCenter) {\n      styles.alignItems = 'center';\n      styles.justifyContent = 'center';\n      styles.flexGrow = 1;\n    }\n\n    return styles;\n  }\n\n  getPanelStyles(): CSSProperties {\n    const { width, height, theme, colorMode } = this.props;\n\n    const panelStyles: CSSProperties = {\n      width: `${width}px`,\n      height: `${height}px`,\n      padding: `${this.panelPadding}px`,\n      borderRadius: '3px',\n      position: 'relative',\n      display: 'flex',\n    };\n\n    const themeFactor = theme.isDark ? 1 : -0.7;\n\n    switch (colorMode) {\n      case BigValueColorMode.Background:\n        const bgColor2 = tinycolor(this.valueColor)\n          .darken(15 * themeFactor)\n          .spin(8)\n          .toRgbString();\n        const bgColor3 = tinycolor(this.valueColor)\n          .darken(5 * themeFactor)\n          .spin(-8)\n          .toRgbString();\n        panelStyles.background = `linear-gradient(120deg, ${bgColor2}, ${bgColor3})`;\n        break;\n      case BigValueColorMode.Value:\n        panelStyles.background = `transparent`;\n        break;\n    }\n\n    if (this.justifyCenter) {\n      panelStyles.alignItems = 'center';\n      panelStyles.flexDirection = 'row';\n    }\n\n    return panelStyles;\n  }\n\n  renderChart(): JSX.Element | null {\n    const { sparkline } = this.props;\n\n    if (!sparkline || sparkline.data.length === 0) {\n      return null;\n    }\n\n    const data = sparkline.data.map(values => {\n      return { time: values[0], value: values[1], name: 'A' };\n    });\n\n    const scales = {\n      time: {\n        type: 'time',\n        min: sparkline.xMin,\n        max: sparkline.xMax,\n      },\n      value: {\n        min: sparkline.yMin,\n        max: sparkline.yMax,\n      },\n    };\n\n    if (sparkline.xMax && sparkline.xMin) {\n      // Having the last data point align with the edge of the panel looks good\n      // So if it's close adjust time.max to the last data point time\n      const timeDelta = sparkline.xMax - sparkline.xMin;\n      const lastDataPointTime = data[data.length - 1].time || 0;\n      const lastTimeDiffFromMax = Math.abs(sparkline.xMax - lastDataPointTime);\n\n      // if last data point is just 5% or lower from the edge adjust it\n      if (lastTimeDiffFromMax / timeDelta < 0.05) {\n        scales.time.max = lastDataPointTime;\n      }\n    }\n\n    return (\n      <Chart\n        height={this.chartHeight}\n        width={this.chartWidth}\n        data={data}\n        animate={false}\n        padding={[4, 0, 0, 0]}\n        scale={scales}\n        style={this.getChartStyles()}\n      >\n        {this.renderGeom()}\n      </Chart>\n    );\n  }\n\n  renderGeom(): JSX.Element {\n    const { colorMode } = this.props;\n\n    const lineStyle: any = {\n      opacity: 1,\n      fillOpacity: 1,\n      lineWidth: 2,\n    };\n\n    let fillColor: string;\n    let lineColor: string;\n\n    switch (colorMode) {\n      case BigValueColorMode.Value:\n        lineColor = this.valueColor;\n        fillColor = tinycolor(this.valueColor)\n          .setAlpha(0.2)\n          .toRgbString();\n        break;\n      case BigValueColorMode.Background:\n        fillColor = 'rgba(255,255,255,0.4)';\n        lineColor = tinycolor(this.valueColor)\n          .brighten(40)\n          .toRgbString();\n    }\n\n    lineStyle.stroke = lineColor;\n\n    return (\n      <>\n        <Geom type=\"area\" position=\"time*value\" size={0} color={fillColor} style={lineStyle} shape=\"smooth\" />\n        <Geom type=\"line\" position=\"time*value\" size={1} color={lineColor} style={lineStyle} shape=\"smooth\" />\n      </>\n    );\n  }\n\n  getChartStyles(): CSSProperties {\n    return {\n      position: 'absolute',\n      right: 0,\n      bottom: 0,\n    };\n  }\n}\n\nexport class WideNoChartLayout extends BigValueLayout {\n  constructor(props: Props) {\n    super(props);\n\n    const valueWidthPercent = 0.3;\n\n    if (this.titleToAlignTo && this.titleToAlignTo.length > 0) {\n      // initial value size\n      this.valueFontSize = calculateFontSize(\n        this.valueToAlignTo,\n        this.maxTextWidth * valueWidthPercent,\n        this.maxTextHeight,\n        LINE_HEIGHT\n      );\n\n      // How big can we make the title and still have it fit\n      this.titleFontSize = calculateFontSize(\n        this.titleToAlignTo,\n        this.maxTextWidth * 0.6,\n        this.maxTextHeight,\n        LINE_HEIGHT,\n        MAX_TITLE_SIZE\n      );\n\n      // make sure it's a bit smaller than valueFontSize\n      this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n    } else {\n      // if no title wide\n      this.valueFontSize = calculateFontSize(this.valueToAlignTo, this.maxTextWidth, this.maxTextHeight, LINE_HEIGHT);\n    }\n  }\n\n  getValueAndTitleContainerStyles() {\n    const styles = super.getValueAndTitleContainerStyles();\n    styles.flexDirection = 'row';\n    styles.alignItems = 'center';\n    styles.flexGrow = 1;\n\n    if (!this.justifyCenter) {\n      styles.justifyContent = 'space-between';\n    }\n\n    return styles;\n  }\n\n  renderChart(): JSX.Element | null {\n    return null;\n  }\n\n  getPanelStyles() {\n    const panelStyles = super.getPanelStyles();\n    panelStyles.alignItems = 'center';\n    return panelStyles;\n  }\n}\n\nexport class WideWithChartLayout extends BigValueLayout {\n  constructor(props: Props) {\n    super(props);\n\n    const { width, height } = props;\n    const chartHeightPercent = 0.5;\n    const titleWidthPercent = 0.6;\n    const valueWidthPercent = 1 - titleWidthPercent;\n    const textHeightPercent = 0.4;\n\n    this.chartWidth = width;\n    this.chartHeight = height * chartHeightPercent;\n\n    if (this.titleToAlignTo && this.titleToAlignTo.length > 0) {\n      this.titleFontSize = calculateFontSize(\n        this.titleToAlignTo,\n        this.maxTextWidth * titleWidthPercent,\n        this.maxTextHeight * textHeightPercent,\n        LINE_HEIGHT,\n        MAX_TITLE_SIZE\n      );\n    }\n\n    this.valueFontSize = calculateFontSize(\n      this.valueToAlignTo,\n      this.maxTextWidth * valueWidthPercent,\n      this.maxTextHeight * chartHeightPercent,\n      LINE_HEIGHT\n    );\n  }\n\n  getValueAndTitleContainerStyles() {\n    const styles = super.getValueAndTitleContainerStyles();\n    styles.flexDirection = 'row';\n    styles.flexGrow = 1;\n\n    if (!this.justifyCenter) {\n      styles.justifyContent = 'space-between';\n    }\n\n    return styles;\n  }\n\n  getPanelStyles() {\n    const styles = super.getPanelStyles();\n    styles.flexDirection = 'row';\n    styles.justifyContent = 'space-between';\n    return styles;\n  }\n}\n\nexport class StackedWithChartLayout extends BigValueLayout {\n  constructor(props: Props) {\n    super(props);\n\n    const { width, height } = props;\n    const titleHeightPercent = 0.15;\n    const chartHeightPercent = 0.25;\n    let titleHeight = 0;\n\n    this.chartHeight = height * chartHeightPercent;\n    this.chartWidth = width;\n\n    if (this.titleToAlignTo && this.titleToAlignTo.length > 0) {\n      this.titleFontSize = calculateFontSize(\n        this.titleToAlignTo,\n        this.maxTextWidth,\n        height * titleHeightPercent,\n        LINE_HEIGHT,\n        MAX_TITLE_SIZE\n      );\n\n      titleHeight = this.titleFontSize * LINE_HEIGHT;\n    }\n\n    this.valueFontSize = calculateFontSize(\n      this.valueToAlignTo,\n      this.maxTextWidth,\n      this.maxTextHeight - this.chartHeight - titleHeight,\n      LINE_HEIGHT\n    );\n\n    // make title fontsize it's a bit smaller than valueFontSize\n    this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n\n    // make chart take up onused space\n    this.chartHeight = height - this.titleFontSize * LINE_HEIGHT - this.valueFontSize * LINE_HEIGHT;\n  }\n\n  getValueAndTitleContainerStyles() {\n    const styles = super.getValueAndTitleContainerStyles();\n    styles.flexDirection = 'column';\n    styles.justifyContent = 'center';\n    return styles;\n  }\n\n  getPanelStyles() {\n    const styles = super.getPanelStyles();\n    styles.flexDirection = 'column';\n    return styles;\n  }\n}\n\nexport class StackedWithNoChartLayout extends BigValueLayout {\n  constructor(props: Props) {\n    super(props);\n\n    const { height } = props;\n    const titleHeightPercent = 0.15;\n    let titleHeight = 0;\n\n    if (this.titleToAlignTo && this.titleToAlignTo.length > 0) {\n      this.titleFontSize = calculateFontSize(\n        this.titleToAlignTo,\n        this.maxTextWidth,\n        height * titleHeightPercent,\n        LINE_HEIGHT,\n        MAX_TITLE_SIZE\n      );\n\n      titleHeight = this.titleFontSize * LINE_HEIGHT;\n    }\n\n    this.valueFontSize = calculateFontSize(\n      this.valueToAlignTo,\n      this.maxTextWidth,\n      this.maxTextHeight - titleHeight,\n      LINE_HEIGHT\n    );\n\n    // make title fontsize it's a bit smaller than valueFontSize\n    this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n  }\n\n  getValueAndTitleContainerStyles() {\n    const styles = super.getValueAndTitleContainerStyles();\n    styles.flexDirection = 'column';\n    styles.flexGrow = 1;\n    return styles;\n  }\n\n  getPanelStyles() {\n    const styles = super.getPanelStyles();\n    styles.alignItems = 'center';\n    return styles;\n  }\n}\n\nexport function buildLayout(props: Props): BigValueLayout {\n  const { width, height, sparkline } = props;\n  const useWideLayout = width / height > 2.5;\n\n  if (useWideLayout) {\n    if (height > 50 && !!sparkline) {\n      return new WideWithChartLayout(props);\n    } else {\n      return new WideNoChartLayout(props);\n    }\n  }\n\n  // stacked layouts\n  if (height > 100 && !!sparkline) {\n    return new StackedWithChartLayout(props);\n  } else {\n    return new StackedWithNoChartLayout(props);\n  }\n}\n\nexport function shouldJustifyCenter(props: Props) {\n  const { value, justifyMode } = props;\n  if (justifyMode === BigValueJustifyMode.Center) {\n    return true;\n  }\n  return (value.title ?? '').length === 0;\n}\n","// Library\nimport React, { PureComponent } from 'react';\nimport { DisplayValue, GraphSeriesValue, DisplayValueAlignmentFactors } from '@grafana/data';\n\n// Types\nimport { Themeable } from '../../types';\nimport { buildLayout } from './BigValueLayout';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\n\nexport interface BigValueSparkline {\n  data: GraphSeriesValue[][];\n  xMin?: number | null;\n  xMax?: number | null;\n  yMin?: number | null;\n  yMax?: number | null;\n  highlightIndex?: number;\n}\n\nexport enum BigValueColorMode {\n  Value = 'value',\n  Background = 'background',\n}\n\nexport enum BigValueGraphMode {\n  None = 'none',\n  Line = 'line',\n  Area = 'area',\n}\n\nexport enum BigValueJustifyMode {\n  Auto = 'auto',\n  Center = 'center',\n}\n\nexport interface Props extends Themeable {\n  height: number;\n  width: number;\n  value: DisplayValue;\n  sparkline?: BigValueSparkline;\n  onClick?: React.MouseEventHandler<HTMLElement>;\n  className?: string;\n  colorMode: BigValueColorMode;\n  graphMode: BigValueGraphMode;\n  justifyMode?: BigValueJustifyMode;\n  alignmentFactors?: DisplayValueAlignmentFactors;\n}\n\nexport class BigValue extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\n    justifyMode: BigValueJustifyMode.Auto,\n  };\n\n  render() {\n    const { value, onClick, className } = this.props;\n\n    const layout = buildLayout(this.props);\n    const panelStyles = layout.getPanelStyles();\n    const valueAndTitleContainerStyles = layout.getValueAndTitleContainerStyles();\n    const valueStyles = layout.getValueStyles();\n    const titleStyles = layout.getTitleStyles();\n\n    return (\n      <div className={className} style={panelStyles} onClick={onClick}>\n        <div style={valueAndTitleContainerStyles}>\n          {value.title && <div style={titleStyles}>{value.title}</div>}\n          <FormattedValueDisplay value={value} style={valueStyles} />\n        </div>\n        {layout.renderChart()}\n      </div>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport $ from 'jquery';\nimport {\n  DisplayValue,\n  getColorFromHexRgbOrName,\n  formattedValueToString,\n  FieldConfig,\n  ThresholdsMode,\n  getActiveThreshold,\n  Threshold,\n} from '@grafana/data';\nimport { Themeable } from '../../types';\nimport { selectThemeVariant } from '../../themes';\n\nexport interface Props extends Themeable {\n  height: number;\n  field: FieldConfig;\n  showThresholdMarkers: boolean;\n  showThresholdLabels: boolean;\n  width: number;\n  value: DisplayValue;\n  onClick?: React.MouseEventHandler<HTMLElement>;\n  className?: string;\n}\n\nconst FONT_SCALE = 1;\n\nexport class Gauge extends PureComponent<Props> {\n  canvasElement: any;\n\n  static defaultProps: Partial<Props> = {\n    showThresholdMarkers: true,\n    showThresholdLabels: false,\n    field: {\n      min: 0,\n      max: 100,\n      thresholds: {\n        mode: ThresholdsMode.Absolute,\n        steps: [\n          { value: -Infinity, color: 'green' },\n          { value: 80, color: 'red' },\n        ],\n      },\n    },\n  };\n\n  componentDidMount() {\n    this.draw();\n  }\n\n  componentDidUpdate() {\n    this.draw();\n  }\n\n  getFormattedThresholds(decimals: number): Threshold[] {\n    const { field, theme } = this.props;\n    const thresholds = field.thresholds ?? Gauge.defaultProps.field?.thresholds!;\n    const isPercent = thresholds.mode === ThresholdsMode.Percentage;\n    const steps = thresholds.steps;\n    let min = field.min!;\n    let max = field.max!;\n    if (isPercent) {\n      min = 0;\n      max = 100;\n    }\n\n    const first = getActiveThreshold(min, steps);\n    const last = getActiveThreshold(max, steps);\n    const formatted: Threshold[] = [];\n    formatted.push({ value: +min.toFixed(decimals), color: getColorFromHexRgbOrName(first.color, theme.type) });\n    let skip = true;\n    for (let i = 0; i < steps.length; i++) {\n      const step = steps[i];\n      if (skip) {\n        if (first === step) {\n          skip = false;\n        }\n        continue;\n      }\n      const prev = steps[i - 1];\n      formatted.push({ value: step.value, color: getColorFromHexRgbOrName(prev!.color, theme.type) });\n      if (step === last) {\n        break;\n      }\n    }\n    formatted.push({ value: +max.toFixed(decimals), color: getColorFromHexRgbOrName(last.color, theme.type) });\n    return formatted;\n  }\n\n  getFontScale(length: number): number {\n    if (length > 12) {\n      return FONT_SCALE - (length * 5) / 110;\n    }\n    return FONT_SCALE - (length * 5) / 101;\n  }\n\n  draw() {\n    const { field, showThresholdLabels, showThresholdMarkers, width, height, theme, value } = this.props;\n\n    const autoProps = calculateGaugeAutoProps(width, height, value.title);\n    const dimension = Math.min(width, autoProps.gaugeHeight);\n\n    const backgroundColor = selectThemeVariant(\n      {\n        dark: theme.palette.dark8,\n        light: theme.palette.gray6,\n      },\n      theme.type\n    );\n\n    const gaugeWidthReduceRatio = showThresholdLabels ? 1.5 : 1;\n    const gaugeWidth = Math.min(dimension / 5.5, 40) / gaugeWidthReduceRatio;\n    const thresholdMarkersWidth = gaugeWidth / 5;\n    const text = formattedValueToString(value);\n    const fontSize = Math.min(dimension / 4, 100) * (text !== null ? this.getFontScale(text.length) : 1);\n\n    const thresholdLabelFontSize = fontSize / 2.5;\n\n    let min = field.min!;\n    let max = field.max!;\n    let numeric = value.numeric;\n    if (field.thresholds?.mode === ThresholdsMode.Percentage) {\n      min = 0;\n      max = 100;\n      if (value.percent === undefined) {\n        numeric = ((numeric - min) / (max - min)) * 100;\n      } else {\n        numeric = value.percent! * 100;\n      }\n    }\n\n    const decimals = field.decimals === undefined ? 2 : field.decimals!;\n    if (showThresholdMarkers) {\n      min = +min.toFixed(decimals);\n      max = +max.toFixed(decimals);\n    }\n\n    const options: any = {\n      series: {\n        gauges: {\n          gauge: {\n            min,\n            max,\n            background: { color: backgroundColor },\n            border: { color: null },\n            shadow: { show: false },\n            width: gaugeWidth,\n          },\n          frame: { show: false },\n          label: { show: false },\n          layout: { margin: 0, thresholdWidth: 0, vMargin: 0 },\n          cell: { border: { width: 0 } },\n          threshold: {\n            values: this.getFormattedThresholds(decimals),\n            label: {\n              show: showThresholdLabels,\n              margin: thresholdMarkersWidth + 1,\n              font: { size: thresholdLabelFontSize },\n            },\n            show: showThresholdMarkers,\n            width: thresholdMarkersWidth,\n          },\n          value: {\n            color: value.color,\n            formatter: () => {\n              return text;\n            },\n            font: { size: fontSize, family: theme.typography.fontFamily.sansSerif },\n          },\n          show: true,\n        },\n      },\n    };\n\n    const plotSeries = {\n      data: [[0, numeric]],\n      label: value.title,\n    };\n\n    try {\n      $.plot(this.canvasElement, [plotSeries], options);\n    } catch (err) {\n      console.log('Gauge rendering error', err, options, value);\n    }\n  }\n\n  renderVisualization = () => {\n    const { width, value, height, onClick } = this.props;\n    const autoProps = calculateGaugeAutoProps(width, height, value.title);\n\n    return (\n      <>\n        <div\n          style={{ height: `${autoProps.gaugeHeight}px`, width: '100%' }}\n          ref={element => (this.canvasElement = element)}\n          onClick={onClick}\n        />\n        {autoProps.showLabel && (\n          <div\n            style={{\n              textAlign: 'center',\n              fontSize: autoProps.titleFontSize,\n              overflow: 'hidden',\n              textOverflow: 'ellipsis',\n              whiteSpace: 'nowrap',\n              position: 'relative',\n              width: '100%',\n              top: '-4px',\n              cursor: 'default',\n            }}\n          >\n            {value.title}\n          </div>\n        )}\n      </>\n    );\n  };\n\n  render() {\n    return (\n      <div\n        style={{\n          width: '100%',\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n          justifyContent: 'center',\n          overflow: 'hidden',\n        }}\n        className={this.props.className}\n      >\n        {this.renderVisualization()}\n      </div>\n    );\n  }\n}\n\ninterface GaugeAutoProps {\n  titleFontSize: number;\n  gaugeHeight: number;\n  showLabel: boolean;\n}\n\nfunction calculateGaugeAutoProps(width: number, height: number, title: string | undefined): GaugeAutoProps {\n  const showLabel = title !== null && title !== undefined;\n  const titleFontSize = Math.min((width * 0.15) / 1.5, 20); // 20% of height * line-height, max 40px\n  const titleHeight = titleFontSize * 1.5;\n  const availableHeight = showLabel ? height - titleHeight : height;\n  const gaugeHeight = Math.min(availableHeight, width);\n\n  return {\n    showLabel,\n    gaugeHeight,\n    titleFontSize,\n  };\n}\n","import React, { useState, useLayoutEffect, useRef } from 'react';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\nimport { css } from 'emotion';\nimport { useTheme } from '../../themes/ThemeContext';\nimport useWindowSize from 'react-use/lib/useWindowSize';\nimport { GrafanaTheme } from '@grafana/data';\n\ninterface TooltipContainerProps {\n  position: { x: number; y: number };\n  offset: { x: number; y: number };\n  children?: JSX.Element;\n}\n\nconst getTooltipContainerStyles = stylesFactory((theme: GrafanaTheme) => {\n  const bgColor = selectThemeVariant({ light: theme.palette.gray5, dark: theme.palette.dark1 }, theme.type);\n  return {\n    wrapper: css`\n      overflow: hidden;\n      background: ${bgColor};\n      /* max-width is set up based on .grafana-tooltip class that's used in dashboard */\n      max-width: 800px;\n      padding: ${theme.spacing.sm};\n      border-radius: ${theme.border.radius.sm};\n      z-index: ${theme.zIndex.tooltip};\n    `,\n  };\n});\n\nexport const TooltipContainer: React.FC<TooltipContainerProps> = ({ position, offset, children }) => {\n  const theme = useTheme();\n  const tooltipRef = useRef<HTMLDivElement>(null);\n  const { width, height } = useWindowSize();\n  const [placement, setPlacement] = useState({\n    x: position.x + offset.x,\n    y: position.y + offset.y,\n  });\n\n  // Make sure tooltip does not overflow window\n  useLayoutEffect(() => {\n    let xO = 0,\n      yO = 0;\n    if (tooltipRef && tooltipRef.current) {\n      const measurement = tooltipRef.current.getBoundingClientRect();\n      const xOverflow = width - (position.x + measurement.width);\n      const yOverflow = height - (position.y + measurement.height);\n      if (xOverflow < 0) {\n        xO = measurement.width + offset.x;\n      }\n\n      if (yOverflow < 0) {\n        yO = measurement.height + offset.y;\n      }\n    }\n\n    setPlacement({\n      x: position.x - xO,\n      y: position.y - yO,\n    });\n  }, [tooltipRef, position]);\n\n  const styles = getTooltipContainerStyles(theme);\n\n  return (\n    <div\n      ref={tooltipRef}\n      style={{\n        position: 'fixed',\n        left: 0,\n        top: 0,\n        transform: `translate3d(${placement.x}px, ${placement.y}px, 0)`,\n      }}\n      className={styles.wrapper}\n    >\n      {children}\n    </div>\n  );\n};\n\nTooltipContainer.displayName = 'TooltipContainer';\n","import React from 'react';\nimport { css } from 'emotion';\nimport { Portal } from '../Portal/Portal';\nimport { Dimensions, TimeZone } from '@grafana/data';\nimport { FlotPosition } from '../Graph/types';\nimport { TooltipContainer } from './TooltipContainer';\n\nexport type TooltipMode = 'single' | 'multi';\n\n// Describes active dimensions user interacts with\n// It's a key-value pair where:\n// - key is the name of the dimension\n// - value is a tuple addresing which column and row from given dimension is active.\n//   If row is undefined, it means that we are not hovering over a datapoint\nexport type ActiveDimensions<T extends Dimensions = any> = { [key in keyof T]: [number, number | undefined] | null };\n\nexport interface TooltipContentProps<T extends Dimensions = any> {\n  // Each dimension is described by array of fields representing it\n  // I.e. for graph there are two dimensions: x and y axis:\n  // { xAxis: [<array of time fields>], yAxis: [<array of value fields>]}\n  // TODO: type this better, no good idea how yet\n  dimensions: T; // Dimension[]\n  activeDimensions?: ActiveDimensions<T>;\n  timeZone?: TimeZone;\n  pos: FlotPosition;\n  mode: TooltipMode;\n}\n\nexport interface TooltipProps {\n  /** Element used as tooltips content */\n  content?: React.ReactElement<any>;\n\n  /** Optional component to be used as a tooltip content */\n  tooltipComponent?: React.ComponentType<TooltipContentProps>;\n\n  /** x/y position relative to the window */\n  position?: { x: number; y: number };\n\n  /** x/y offset relative to tooltip origin element, i.e. graph's datapoint */\n  offset?: { x: number; y: number };\n\n  // Mode in which tooltip works\n  // - single - display single series info\n  // - multi - display all series info\n  mode?: TooltipMode;\n}\n\nexport const Tooltip: React.FC<TooltipProps> = ({ content, position, offset }) => {\n  if (position) {\n    return (\n      <Portal\n        className={css`\n          position: absolute;\n          top: 0;\n          left: 0;\n          pointer-events: none;\n          width: 100%;\n          height: 100%;\n        `}\n      >\n        <TooltipContainer position={position} offset={offset || { x: 0, y: 0 }}>\n          {content}\n        </TooltipContainer>\n      </Portal>\n    );\n  }\n  return null;\n};\n\nTooltip.displayName = 'ChartTooltip';\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\n\nexport interface SeriesIconProps {\n  color: string;\n  className?: string;\n}\n\nexport const SeriesIcon: React.FunctionComponent<SeriesIconProps> = ({ color, className }) => {\n  return <Icon name=\"minus\" className={className} style={{ color }} />;\n};\n\nSeriesIcon.displayName = 'SeriesIcon';\n","import React from 'react';\nimport { stylesFactory } from '../../../themes/stylesFactory';\nimport { GrafanaTheme, GraphSeriesValue } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { SeriesIcon } from '../../Legend/SeriesIcon';\nimport { useTheme } from '../../../themes';\n\ninterface SeriesTableRowProps {\n  color?: string;\n  label?: string;\n  value: string | GraphSeriesValue;\n  isActive?: boolean;\n}\n\nconst getSeriesTableRowStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    icon: css`\n      margin-right: ${theme.spacing.xs};\n    `,\n    seriesTable: css`\n      display: table;\n    `,\n    seriesTableRow: css`\n      display: table-row;\n      font-size: ${theme.typography.size.sm};\n    `,\n    seriesTableCell: css`\n      display: table-cell;\n    `,\n    label: css`\n      word-break: break-all;\n    `,\n    value: css`\n      padding-left: ${theme.spacing.md};\n    `,\n    activeSeries: css`\n      font-weight: ${theme.typography.weight.bold};\n    `,\n    timestamp: css`\n      font-weight: ${theme.typography.weight.bold};\n      font-size: ${theme.typography.size.sm};\n    `,\n  };\n});\n\nconst SeriesTableRow: React.FC<SeriesTableRowProps> = ({ color, label, value, isActive }) => {\n  const theme = useTheme();\n  const styles = getSeriesTableRowStyles(theme);\n  return (\n    <div className={cx(styles.seriesTableRow, isActive && styles.activeSeries)}>\n      {color && (\n        <div className={styles.seriesTableCell}>\n          <SeriesIcon color={color} className={styles.icon} />\n        </div>\n      )}\n      <div className={cx(styles.seriesTableCell, styles.label)}>{label}</div>\n      <div className={cx(styles.seriesTableCell, styles.value)}>{value}</div>\n    </div>\n  );\n};\n\ninterface SeriesTableProps {\n  timestamp?: string | GraphSeriesValue;\n  series: SeriesTableRowProps[];\n}\n\nexport const SeriesTable: React.FC<SeriesTableProps> = ({ timestamp, series }) => {\n  const theme = useTheme();\n  const styles = getSeriesTableRowStyles(theme);\n\n  return (\n    <>\n      {timestamp && (\n        <div className={styles.timestamp} aria-label=\"Timestamp\">\n          {timestamp}\n        </div>\n      )}\n      {series.map(s => {\n        return <SeriesTableRow isActive={s.isActive} label={s.label} color={s.color} value={s.value} key={s.label} />;\n      })}\n    </>\n  );\n};\n","import React from 'react';\nimport {\n  getValueFromDimension,\n  getColumnFromDimension,\n  formattedValueToString,\n  getDisplayProcessor,\n} from '@grafana/data';\nimport { SeriesTable } from './SeriesTable';\nimport { GraphTooltipContentProps } from './types';\n\nexport const SingleModeGraphTooltip: React.FC<GraphTooltipContentProps> = ({\n  dimensions,\n  activeDimensions,\n  timeZone,\n}) => {\n  // not hovering over a point, skip rendering\n  if (\n    activeDimensions.yAxis === null ||\n    activeDimensions.yAxis[1] === undefined ||\n    activeDimensions.xAxis === null ||\n    activeDimensions.xAxis[1] === undefined\n  ) {\n    return null;\n  }\n  const time = getValueFromDimension(dimensions.xAxis, activeDimensions.xAxis[0], activeDimensions.xAxis[1]);\n  const timeField = getColumnFromDimension(dimensions.xAxis, activeDimensions.xAxis[0]);\n  const processedTime = timeField.display ? formattedValueToString(timeField.display(time)) : time;\n\n  const valueField = getColumnFromDimension(dimensions.yAxis, activeDimensions.yAxis[0]);\n  const value = getValueFromDimension(dimensions.yAxis, activeDimensions.yAxis[0], activeDimensions.yAxis[1]);\n  const display = valueField.display ?? getDisplayProcessor({ field: valueField, timeZone });\n  const disp = display(value);\n\n  return (\n    <SeriesTable\n      series={[\n        {\n          color: disp.color,\n          label: valueField.name,\n          value: formattedValueToString(disp),\n        },\n      ]}\n      timestamp={processedTime}\n    />\n  );\n};\n\nSingleModeGraphTooltip.displayName = 'SingleModeGraphTooltip';\n","import {\n  GraphSeriesValue,\n  Field,\n  formattedValueToString,\n  getDisplayProcessor,\n  TimeZone,\n  dateTimeFormat,\n} from '@grafana/data';\n\n/**\n * Returns index of the closest datapoint BEFORE hover position\n *\n * @param posX\n * @param series\n */\nexport const findHoverIndexFromData = (xAxisDimension: Field, xPos: number) => {\n  let lower = 0;\n  let upper = xAxisDimension.values.length - 1;\n  let middle;\n\n  while (true) {\n    if (lower > upper) {\n      return Math.max(upper, 0);\n    }\n    middle = Math.floor((lower + upper) / 2);\n    const xPosition = xAxisDimension.values.get(middle);\n\n    if (xPosition === xPos) {\n      return middle;\n    } else if (xPosition && xPosition < xPos) {\n      lower = middle + 1;\n    } else {\n      upper = middle - 1;\n    }\n  }\n};\n\ninterface MultiSeriesHoverInfo {\n  value: string;\n  time: string;\n  datapointIndex: number;\n  seriesIndex: number;\n  label?: string;\n  color?: string;\n}\n\n/**\n * Returns information about closest datapoints when hovering over a Graph\n *\n * @param seriesList list of series visible on the Graph\n * @param pos mouse cursor position, based on jQuery.flot position\n */\nexport const getMultiSeriesGraphHoverInfo = (\n  // x and y axis dimensions order is aligned\n  yAxisDimensions: Field[],\n  xAxisDimensions: Field[],\n  /** Well, time basically */\n  xAxisPosition: number,\n  timeZone?: TimeZone\n): {\n  results: MultiSeriesHoverInfo[];\n  time?: GraphSeriesValue;\n} => {\n  let i, field, hoverIndex, hoverDistance, pointTime;\n\n  const results: MultiSeriesHoverInfo[] = [];\n\n  let minDistance, minTime;\n\n  for (i = 0; i < yAxisDimensions.length; i++) {\n    field = yAxisDimensions[i];\n    const time = xAxisDimensions[i];\n    hoverIndex = findHoverIndexFromData(time, xAxisPosition);\n    hoverDistance = xAxisPosition - time.values.get(hoverIndex);\n    pointTime = time.values.get(hoverIndex);\n    // Take the closest point before the cursor, or if it does not exist, the closest after\n    if (\n      minDistance === undefined ||\n      (hoverDistance >= 0 && (hoverDistance < minDistance || minDistance < 0)) ||\n      (hoverDistance < 0 && hoverDistance > minDistance)\n    ) {\n      minDistance = hoverDistance;\n      minTime = time.display ? formattedValueToString(time.display(pointTime)) : pointTime;\n    }\n\n    const display = field.display ?? getDisplayProcessor({ field, timeZone });\n    const disp = display(field.values.get(hoverIndex));\n\n    results.push({\n      value: formattedValueToString(disp),\n      datapointIndex: hoverIndex,\n      seriesIndex: i,\n      color: disp.color,\n      label: field.name,\n      time: time.display ? formattedValueToString(time.display(pointTime)) : pointTime,\n    });\n  }\n\n  return {\n    results,\n    time: minTime,\n  };\n};\n\nexport const graphTickFormatter = (epoch: number, axis: any) => {\n  return dateTimeFormat(epoch, {\n    format: axis?.options?.timeformat,\n    timeZone: axis?.options?.timezone,\n  });\n};\n\nexport const graphTimeFormat = (ticks: number | null, min: number | null, max: number | null): string => {\n  if (min && max && ticks) {\n    const range = max - min;\n    const secPerTick = range / ticks / 1000;\n    // Need have 10 millisecond margin on the day range\n    // As sometimes last 24 hour dashboard evaluates to more than 86400000\n    const oneDay = 86400010;\n    const oneYear = 31536000000;\n\n    if (secPerTick <= 45) {\n      return 'HH:mm:ss';\n    }\n    if (secPerTick <= 7200 || range <= oneDay) {\n      return 'HH:mm';\n    }\n    if (secPerTick <= 80000) {\n      return 'MM/DD HH:mm';\n    }\n    if (secPerTick <= 2419200 || range <= oneYear) {\n      return 'MM/DD';\n    }\n    return 'YYYY-MM';\n  }\n\n  return 'HH:mm';\n};\n","import React from 'react';\nimport { SeriesTable } from './SeriesTable';\nimport { GraphTooltipContentProps } from './types';\nimport { getMultiSeriesGraphHoverInfo } from '../utils';\nimport { FlotPosition } from '../types';\nimport { getValueFromDimension } from '@grafana/data';\n\nexport const MultiModeGraphTooltip: React.FC<GraphTooltipContentProps & {\n  // We expect position to figure out correct values when not hovering over a datapoint\n  pos: FlotPosition;\n}> = ({ dimensions, activeDimensions, pos, timeZone }) => {\n  let activeSeriesIndex: number | null = null;\n  // when no x-axis provided, skip rendering\n  if (activeDimensions.xAxis === null) {\n    return null;\n  }\n\n  if (activeDimensions.yAxis) {\n    activeSeriesIndex = activeDimensions.yAxis[0];\n  }\n\n  // when not hovering over a point, time is undefined, and we use pos.x as time\n  const time = activeDimensions.xAxis[1]\n    ? getValueFromDimension(dimensions.xAxis, activeDimensions.xAxis[0], activeDimensions.xAxis[1])\n    : pos.x;\n\n  const hoverInfo = getMultiSeriesGraphHoverInfo(dimensions.yAxis.columns, dimensions.xAxis.columns, time, timeZone);\n  const timestamp = hoverInfo.time;\n\n  const series = hoverInfo.results.map((s, i) => {\n    return {\n      color: s.color,\n      label: s.label,\n      value: s.value,\n      isActive: activeSeriesIndex === i,\n    };\n  });\n\n  return <SeriesTable series={series} timestamp={timestamp} />;\n};\n\nMultiModeGraphTooltip.displayName = 'MultiModeGraphTooltip';\n","import React from 'react';\nimport { TooltipContentProps } from '../../Chart/Tooltip';\nimport { SingleModeGraphTooltip } from './SingleModeGraphTooltip';\nimport { MultiModeGraphTooltip } from './MultiModeGraphTooltip';\nimport { GraphDimensions } from './types';\n\nexport const GraphTooltip: React.FC<TooltipContentProps<GraphDimensions>> = ({\n  mode = 'single',\n  dimensions,\n  activeDimensions,\n  pos,\n  timeZone,\n}) => {\n  // When\n  // [1] no active dimension or\n  // [2] no xAxis position\n  // we assume no tooltip should be rendered\n  if (!activeDimensions || !activeDimensions.xAxis) {\n    return null;\n  }\n\n  if (mode === 'single') {\n    return <SingleModeGraphTooltip dimensions={dimensions} activeDimensions={activeDimensions} timeZone={timeZone} />;\n  } else {\n    return (\n      <MultiModeGraphTooltip\n        dimensions={dimensions}\n        activeDimensions={activeDimensions}\n        pos={pos}\n        timeZone={timeZone}\n      />\n    );\n  }\n};\n\nGraphTooltip.displayName = 'GraphTooltip';\n","import React, { useContext, useRef, useState, useLayoutEffect } from 'react';\nimport { css, cx } from 'emotion';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport { selectThemeVariant, ThemeContext } from '../../index';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { Portal, List } from '../index';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\nimport { LinkTarget } from '@grafana/data';\n\nexport interface ContextMenuItem {\n  label: string;\n  target?: LinkTarget;\n  icon?: string;\n  url?: string;\n  onClick?: (event?: React.SyntheticEvent<HTMLElement>) => void;\n  group?: string;\n}\n\nexport interface ContextMenuGroup {\n  label?: string;\n  items: ContextMenuItem[];\n}\nexport interface ContextMenuProps {\n  x: number;\n  y: number;\n  onClose: () => void;\n  items?: ContextMenuGroup[];\n  renderHeader?: () => React.ReactNode;\n}\n\nconst getContextMenuStyles = stylesFactory((theme: GrafanaTheme) => {\n  const linkColor = selectThemeVariant(\n    {\n      light: theme.palette.dark2,\n      dark: theme.colors.text,\n    },\n    theme.type\n  );\n  const linkColorHover = selectThemeVariant(\n    {\n      light: theme.colors.link,\n      dark: theme.palette.white,\n    },\n    theme.type\n  );\n  const wrapperBg = selectThemeVariant(\n    {\n      light: theme.palette.gray7,\n      dark: theme.palette.dark2,\n    },\n    theme.type\n  );\n  const wrapperShadow = selectThemeVariant(\n    {\n      light: theme.palette.gray3,\n      dark: theme.palette.black,\n    },\n    theme.type\n  );\n  const itemColor = selectThemeVariant(\n    {\n      light: theme.palette.black,\n      dark: theme.palette.white,\n    },\n    theme.type\n  );\n\n  const groupLabelColor = selectThemeVariant(\n    {\n      light: theme.palette.gray1,\n      dark: theme.colors.textWeak,\n    },\n    theme.type\n  );\n\n  const itemBgHover = selectThemeVariant(\n    {\n      light: theme.palette.gray5,\n      dark: theme.palette.dark7,\n    },\n    theme.type\n  );\n  const headerBg = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.dark1,\n    },\n    theme.type\n  );\n  const headerSeparator = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.dark7,\n    },\n    theme.type\n  );\n\n  return {\n    header: css`\n      padding: 4px;\n      border-bottom: 1px solid ${headerSeparator};\n      background: ${headerBg};\n      margin-bottom: ${theme.spacing.xs};\n      border-radius: ${theme.border.radius.sm} ${theme.border.radius.sm} 0 0;\n    `,\n    wrapper: css`\n      background: ${wrapperBg};\n      z-index: 1;\n      box-shadow: 0 2px 5px 0 ${wrapperShadow};\n      min-width: 200px;\n      display: inline-block;\n      border-radius: ${theme.border.radius.sm};\n    `,\n    link: css`\n      color: ${linkColor};\n      display: flex;\n      cursor: pointer;\n      &:hover {\n        color: ${linkColorHover};\n        text-decoration: none;\n      }\n    `,\n    item: css`\n      background: none;\n      padding: 4px 8px;\n      color: ${itemColor};\n      border-left: 2px solid transparent;\n      cursor: pointer;\n      &:hover {\n        background: ${itemBgHover};\n        border-image: linear-gradient(#f05a28 30%, #fbca0a 99%);\n        border-image-slice: 1;\n      }\n    `,\n    groupLabel: css`\n      color: ${groupLabelColor};\n      font-size: ${theme.typography.size.sm};\n      line-height: ${theme.typography.lineHeight.md};\n      padding: ${theme.spacing.xs} ${theme.spacing.sm};\n    `,\n    icon: css`\n      opacity: 0.7;\n      margin-right: 10px;\n      color: ${theme.colors.linkDisabled};\n    `,\n  };\n});\n\nexport const ContextMenu: React.FC<ContextMenuProps> = React.memo(({ x, y, onClose, items, renderHeader }) => {\n  const theme = useContext(ThemeContext);\n  const menuRef = useRef<HTMLDivElement>(null);\n  const [positionStyles, setPositionStyles] = useState({});\n\n  useLayoutEffect(() => {\n    const menuElement = menuRef.current;\n    if (menuElement) {\n      const rect = menuElement.getBoundingClientRect();\n      const OFFSET = 5;\n      const collisions = {\n        right: window.innerWidth < x + rect.width,\n        bottom: window.innerHeight < rect.bottom + rect.height + OFFSET,\n      };\n\n      setPositionStyles({\n        position: 'fixed',\n        left: collisions.right ? x - rect.width - OFFSET : x - OFFSET,\n        top: collisions.bottom ? y - rect.height - OFFSET : y + OFFSET,\n      });\n    }\n  }, [menuRef.current]);\n\n  useClickAway(menuRef, () => {\n    if (onClose) {\n      onClose();\n    }\n  });\n\n  const styles = getContextMenuStyles(theme);\n  const header = renderHeader && renderHeader();\n  return (\n    <Portal>\n      <div ref={menuRef} style={positionStyles} className={styles.wrapper}>\n        {header && <div className={styles.header}>{header}</div>}\n        <List\n          items={items || []}\n          renderItem={(item, index) => {\n            return (\n              <>\n                <ContextMenuGroup group={item} onClick={onClose} />\n              </>\n            );\n          }}\n        />\n      </div>\n    </Portal>\n  );\n});\n\ninterface ContextMenuItemProps {\n  label: string;\n  icon?: string;\n  url?: string;\n  target?: string;\n  onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n  className?: string;\n}\n\nconst ContextMenuItem: React.FC<ContextMenuItemProps> = React.memo(\n  ({ url, icon, label, target, onClick, className }) => {\n    const theme = useContext(ThemeContext);\n    const styles = getContextMenuStyles(theme);\n    return (\n      <div className={styles.item}>\n        <a\n          href={url ? url : undefined}\n          target={target}\n          className={cx(className, styles.link)}\n          onClick={e => {\n            if (onClick) {\n              onClick(e);\n            }\n          }}\n        >\n          {icon && <Icon name={icon as IconName} className={styles.icon} />} {label}\n        </a>\n      </div>\n    );\n  }\n);\n\ninterface ContextMenuGroupProps {\n  group: ContextMenuGroup;\n  onClick?: () => void; // Used with 'onClose'\n}\n\nconst ContextMenuGroup: React.FC<ContextMenuGroupProps> = ({ group, onClick }) => {\n  const theme = useContext(ThemeContext);\n  const styles = getContextMenuStyles(theme);\n\n  if (group.items.length === 0) {\n    return null;\n  }\n\n  return (\n    <div>\n      {group.label && <div className={styles.groupLabel}>{group.label}</div>}\n      <List\n        items={group.items || []}\n        renderItem={item => {\n          return (\n            <ContextMenuItem\n              url={item.url}\n              label={item.label}\n              target={item.target}\n              icon={item.icon}\n              onClick={(e: React.MouseEvent<HTMLElement>) => {\n                if (item.onClick) {\n                  item.onClick(e);\n                }\n\n                // Typically closes the context menu\n                if (onClick) {\n                  onClick();\n                }\n              }}\n            />\n          );\n        }}\n      />\n    </div>\n  );\n};\nContextMenu.displayName = 'ContextMenu';\n","import React, { useContext } from 'react';\nimport { ContextMenu, ContextMenuProps } from '../ContextMenu/ContextMenu';\nimport { ThemeContext } from '../../themes';\nimport { SeriesIcon } from '../Legend/SeriesIcon';\nimport { GraphDimensions } from './GraphTooltip/types';\nimport {\n  FlotDataPoint,\n  getValueFromDimension,\n  getDisplayProcessor,\n  formattedValueToString,\n  Dimensions,\n  dateTimeFormat,\n  TimeZone,\n} from '@grafana/data';\nimport { css } from 'emotion';\n\nexport type ContextDimensions<T extends Dimensions = any> = { [key in keyof T]: [number, number | undefined] | null };\n\nexport type GraphContextMenuProps = ContextMenuProps & {\n  getContextMenuSource: () => FlotDataPoint | null;\n  timeZone?: TimeZone;\n  dimensions?: GraphDimensions;\n  contextDimensions?: ContextDimensions;\n};\n\nexport const GraphContextMenu: React.FC<GraphContextMenuProps> = ({\n  getContextMenuSource,\n  timeZone,\n  items,\n  dimensions,\n  contextDimensions,\n  ...otherProps\n}) => {\n  const theme = useContext(ThemeContext);\n  const source = getContextMenuSource();\n\n  //  Do not render items that do not have label specified\n  const itemsToRender = items\n    ? items.map(group => ({\n        ...group,\n        items: group.items.filter(item => item.label),\n      }))\n    : [];\n\n  const renderHeader = () => {\n    if (!source) {\n      return null;\n    }\n\n    // If dimensions supplied, we can calculate and display value\n    let value;\n    if (dimensions?.yAxis && contextDimensions?.yAxis?.[1]) {\n      const valueFromDimensions = getValueFromDimension(\n        dimensions.yAxis,\n        contextDimensions.yAxis[0],\n        contextDimensions.yAxis[1]\n      );\n      const display =\n        source.series.valueField.display ??\n        getDisplayProcessor({\n          field: source.series.valueField,\n          timeZone,\n        });\n      value = display(valueFromDimensions);\n    }\n\n    const formattedValue = dateTimeFormat(source.datapoint[0], {\n      defaultWithMS: source.series.hasMsResolution,\n      timeZone,\n    });\n\n    return (\n      <div\n        className={css`\n          padding: ${theme.spacing.xs} ${theme.spacing.sm};\n          font-size: ${theme.typography.size.sm};\n          z-index: ${theme.zIndex.tooltip};\n        `}\n      >\n        <strong>{formattedValue}</strong>\n        <div>\n          <SeriesIcon color={source.series.color} />\n          <span\n            className={css`\n              white-space: nowrap;\n              padding-left: ${theme.spacing.xs};\n            `}\n          >\n            {source.series.alias || source.series.label}\n          </span>\n          {value && (\n            <span\n              className={css`\n                white-space: nowrap;\n                padding-left: ${theme.spacing.md};\n              `}\n            >\n              {formattedValueToString(value)}\n            </span>\n          )}\n        </div>\n      </div>\n    );\n  };\n\n  return <ContextMenu {...otherProps} items={itemsToRender} renderHeader={renderHeader} />;\n};\n","// Libraries\nimport $ from 'jquery';\nimport React, { PureComponent } from 'react';\nimport uniqBy from 'lodash/uniqBy';\n// Types\nimport { TimeRange, GraphSeriesXY, TimeZone, createDimension } from '@grafana/data';\nimport _ from 'lodash';\nimport { FlotPosition, FlotItem } from './types';\nimport { TooltipProps, TooltipContentProps, ActiveDimensions, Tooltip } from '../Chart/Tooltip';\nimport { GraphTooltip } from './GraphTooltip/GraphTooltip';\nimport { GraphContextMenu, GraphContextMenuProps, ContextDimensions } from './GraphContextMenu';\nimport { GraphDimensions } from './GraphTooltip/types';\nimport { graphTimeFormat, graphTickFormatter } from './utils';\n\nexport interface GraphProps {\n  children?: JSX.Element | JSX.Element[];\n  series: GraphSeriesXY[];\n  timeRange: TimeRange; // NOTE: we should aim to make `time` a property of the axis, not force it for all graphs\n  timeZone?: TimeZone; // NOTE: we should aim to make `time` a property of the axis, not force it for all graphs\n  showLines?: boolean;\n  showPoints?: boolean;\n  showBars?: boolean;\n  width: number;\n  height: number;\n  isStacked?: boolean;\n  lineWidth?: number;\n  onHorizontalRegionSelected?: (from: number, to: number) => void;\n}\n\ninterface GraphState {\n  pos?: FlotPosition;\n  contextPos?: FlotPosition;\n  isTooltipVisible: boolean;\n  isContextVisible: boolean;\n  activeItem?: FlotItem<GraphSeriesXY>;\n  contextItem?: FlotItem<GraphSeriesXY>;\n}\n\nexport class Graph extends PureComponent<GraphProps, GraphState> {\n  static defaultProps = {\n    showLines: true,\n    showPoints: false,\n    showBars: false,\n    isStacked: false,\n    lineWidth: 1,\n  };\n\n  state: GraphState = {\n    isTooltipVisible: false,\n    isContextVisible: false,\n  };\n\n  element: HTMLElement | null = null;\n  $element: any;\n\n  componentDidUpdate(prevProps: GraphProps, prevState: GraphState) {\n    if (prevProps !== this.props) {\n      this.draw();\n    }\n  }\n\n  componentDidMount() {\n    this.draw();\n    if (this.element) {\n      this.$element = $(this.element);\n      this.$element.bind('plotselected', this.onPlotSelected);\n      this.$element.bind('plothover', this.onPlotHover);\n      this.$element.bind('plotclick', this.onPlotClick);\n    }\n  }\n\n  componentWillUnmount() {\n    this.$element.unbind('plotselected', this.onPlotSelected);\n  }\n\n  onPlotSelected = (event: JQueryEventObject, ranges: { xaxis: { from: number; to: number } }) => {\n    const { onHorizontalRegionSelected } = this.props;\n    if (onHorizontalRegionSelected) {\n      onHorizontalRegionSelected(ranges.xaxis.from, ranges.xaxis.to);\n    }\n  };\n\n  onPlotHover = (event: JQueryEventObject, pos: FlotPosition, item?: FlotItem<GraphSeriesXY>) => {\n    this.setState({\n      isTooltipVisible: true,\n      activeItem: item,\n      pos,\n    });\n  };\n\n  onPlotClick = (event: JQueryEventObject, contextPos: FlotPosition, item?: FlotItem<GraphSeriesXY>) => {\n    this.setState({\n      isContextVisible: true,\n      isTooltipVisible: false,\n      contextItem: item,\n      contextPos,\n    });\n  };\n\n  getYAxes(series: GraphSeriesXY[]) {\n    if (series.length === 0) {\n      return [{ show: true, min: -1, max: 1 }];\n    }\n    return uniqBy(\n      series.map(s => {\n        const index = s.yAxis ? s.yAxis.index : 1;\n        const min = s.yAxis && !isNaN(s.yAxis.min as number) ? s.yAxis.min : null;\n        const tickDecimals = s.yAxis && !isNaN(s.yAxis.tickDecimals as number) ? s.yAxis.tickDecimals : null;\n        return {\n          show: true,\n          index,\n          position: index === 1 ? 'left' : 'right',\n          min,\n          tickDecimals,\n        };\n      }),\n      yAxisConfig => yAxisConfig.index\n    );\n  }\n\n  renderTooltip = () => {\n    const { children, series, timeZone } = this.props;\n    const { pos, activeItem, isTooltipVisible } = this.state;\n    let tooltipElement: React.ReactElement<TooltipProps> | null = null;\n\n    if (!isTooltipVisible || !pos || series.length === 0) {\n      return null;\n    }\n\n    // Find children that indicate tooltip to be rendered\n    React.Children.forEach(children, c => {\n      // We have already found tooltip\n      if (tooltipElement) {\n        return;\n      }\n      // @ts-ignore\n      const childType = c && c.type && (c.type.displayName || c.type.name);\n\n      if (childType === Tooltip.displayName) {\n        tooltipElement = c as React.ReactElement<TooltipProps>;\n      }\n    });\n    // If no tooltip provided, skip rendering\n    if (!tooltipElement) {\n      return null;\n    }\n    const tooltipElementProps = (tooltipElement as React.ReactElement<TooltipProps>).props;\n\n    const tooltipMode = tooltipElementProps.mode || 'single';\n\n    // If mode is single series and user is not hovering over item, skip rendering\n    if (!activeItem && tooltipMode === 'single') {\n      return null;\n    }\n\n    // Check if tooltip needs to be rendered with custom tooltip component, otherwise default to GraphTooltip\n    const tooltipContentRenderer = tooltipElementProps.tooltipComponent || GraphTooltip;\n    // Indicates column(field) index in y-axis dimension\n    const seriesIndex = activeItem ? activeItem.series.seriesIndex : 0;\n    // Indicates row index in active field values\n    const rowIndex = activeItem ? activeItem.dataIndex : undefined;\n\n    const activeDimensions: ActiveDimensions<GraphDimensions> = {\n      // Described x-axis active item\n      // When hovering over an item - let's take it's dataIndex, otherwise undefined\n      // Tooltip itself needs to figure out correct datapoint display information based on pos passed to it\n      xAxis: [seriesIndex, rowIndex],\n      // Describes y-axis active item\n      yAxis: activeItem ? [activeItem.series.seriesIndex, activeItem.dataIndex] : null,\n    };\n\n    const tooltipContentProps: TooltipContentProps<GraphDimensions> = {\n      dimensions: {\n        // time/value dimension columns are index-aligned - see getGraphSeriesModel\n        xAxis: createDimension(\n          'xAxis',\n          series.map(s => s.timeField)\n        ),\n        yAxis: createDimension(\n          'yAxis',\n          series.map(s => s.valueField)\n        ),\n      },\n      activeDimensions,\n      pos,\n      mode: tooltipElementProps.mode || 'single',\n      timeZone,\n    };\n\n    const tooltipContent = React.createElement(tooltipContentRenderer, { ...tooltipContentProps });\n\n    return React.cloneElement<TooltipProps>(tooltipElement as React.ReactElement<TooltipProps>, {\n      content: tooltipContent,\n      position: { x: pos.pageX, y: pos.pageY },\n      offset: { x: 10, y: 10 },\n    });\n  };\n\n  renderContextMenu = () => {\n    const { series } = this.props;\n    const { contextPos, contextItem, isContextVisible } = this.state;\n\n    if (!isContextVisible || !contextPos || !contextItem || series.length === 0) {\n      return null;\n    }\n\n    // Indicates column(field) index in y-axis dimension\n    const seriesIndex = contextItem ? contextItem.series.seriesIndex : 0;\n    // Indicates row index in context field values\n    const rowIndex = contextItem ? contextItem.dataIndex : undefined;\n\n    const contextDimensions: ContextDimensions<GraphDimensions> = {\n      // Described x-axis context item\n      xAxis: [seriesIndex, rowIndex],\n      // Describes y-axis context item\n      yAxis: contextItem ? [contextItem.series.seriesIndex, contextItem.dataIndex] : null,\n    };\n\n    const dimensions: GraphDimensions = {\n      // time/value dimension columns are index-aligned - see getGraphSeriesModel\n      xAxis: createDimension(\n        'xAxis',\n        series.map(s => s.timeField)\n      ),\n      yAxis: createDimension(\n        'yAxis',\n        series.map(s => s.valueField)\n      ),\n    };\n\n    const closeContext = () => this.setState({ isContextVisible: false });\n\n    const getContextMenuSource = () => {\n      return {\n        datapoint: contextItem.datapoint,\n        dataIndex: contextItem.dataIndex,\n        series: contextItem.series,\n        seriesIndex: contextItem.series.seriesIndex,\n        pageX: contextPos.pageX,\n        pageY: contextPos.pageY,\n      };\n    };\n\n    const contextContentProps: GraphContextMenuProps = {\n      x: contextPos.pageX,\n      y: contextPos.pageY,\n      onClose: closeContext,\n      getContextMenuSource: getContextMenuSource,\n      timeZone: this.props.timeZone,\n      dimensions,\n      contextDimensions,\n    };\n\n    return <GraphContextMenu {...contextContentProps} />;\n  };\n\n  getBarWidth = () => {\n    const { series } = this.props;\n    return Math.min(...series.map(s => s.timeStep));\n  };\n\n  draw() {\n    if (this.element === null) {\n      return;\n    }\n\n    const {\n      width,\n      series,\n      timeRange,\n      showLines,\n      showBars,\n      showPoints,\n      isStacked,\n      lineWidth,\n      timeZone,\n      onHorizontalRegionSelected,\n    } = this.props;\n\n    if (!width) {\n      return;\n    }\n\n    const ticks = width / 100;\n    const min = timeRange.from.valueOf();\n    const max = timeRange.to.valueOf();\n    const yaxes = this.getYAxes(series);\n\n    const flotOptions: any = {\n      legend: {\n        show: false,\n      },\n      series: {\n        stack: isStacked,\n        lines: {\n          show: showLines,\n          lineWidth: lineWidth,\n          zero: false,\n        },\n        points: {\n          show: showPoints,\n          fill: 1,\n          fillColor: false,\n          radius: 2,\n        },\n        bars: {\n          show: showBars,\n          fill: 1,\n          // Dividig the width by 1.5 to make the bars not touch each other\n          barWidth: showBars ? this.getBarWidth() / 1.5 : 1,\n          zero: false,\n          lineWidth: lineWidth,\n        },\n        shadowSize: 0,\n      },\n      xaxis: {\n        timezone: timeZone,\n        show: true,\n        mode: 'time',\n        min: min,\n        max: max,\n        label: 'Datetime',\n        ticks: ticks,\n        timeformat: graphTimeFormat(ticks, min, max),\n        tickFormatter: graphTickFormatter,\n      },\n      yaxes,\n      grid: {\n        minBorderMargin: 0,\n        markings: [],\n        backgroundColor: null,\n        borderWidth: 0,\n        hoverable: true,\n        clickable: true,\n        color: '#a1a1a1',\n        margin: { left: 0, right: 0 },\n        labelMarginX: 0,\n        mouseActiveRadius: 30,\n      },\n      selection: {\n        mode: onHorizontalRegionSelected ? 'x' : null,\n        color: '#666',\n      },\n      crosshair: {\n        mode: 'x',\n      },\n    };\n\n    try {\n      $.plot(\n        this.element,\n        series.filter(s => s.isVisible),\n        flotOptions\n      );\n    } catch (err) {\n      console.log('Graph rendering error', err, flotOptions, series);\n      throw new Error('Error rendering panel');\n    }\n  }\n\n  render() {\n    const { height, width, series } = this.props;\n    const noDataToBeDisplayed = series.length === 0;\n    const tooltip = this.renderTooltip();\n    const context = this.renderContextMenu();\n    return (\n      <div className=\"graph-panel\">\n        <div\n          className=\"graph-panel__chart\"\n          ref={e => (this.element = e)}\n          style={{ height, width }}\n          onMouseLeave={() => {\n            this.setState({ isTooltipVisible: false });\n          }}\n        />\n        {noDataToBeDisplayed && <div className=\"datapoints-warning\">No data</div>}\n        {tooltip}\n        {context}\n      </div>\n    );\n  }\n}\n\nexport default Graph;\n","import React from 'react';\nimport { css, cx } from 'emotion';\nimport { SeriesColorPicker } from '../ColorPicker/ColorPicker';\nimport { SeriesIcon, SeriesIconProps } from './SeriesIcon';\n\ninterface LegendSeriesIconProps {\n  disabled: boolean;\n  color: string;\n  yAxis: number;\n  onColorChange: (color: string) => void;\n  onToggleAxis?: () => void;\n}\n\nexport const LegendSeriesIcon: React.FunctionComponent<LegendSeriesIconProps> = ({\n  disabled,\n  yAxis,\n  color,\n  onColorChange,\n  onToggleAxis,\n}) => {\n  let iconProps: SeriesIconProps = {\n    color,\n  };\n\n  if (!disabled) {\n    iconProps = {\n      ...iconProps,\n      className: 'pointer',\n    };\n  }\n\n  return disabled ? (\n    <span\n      className={cx(\n        'graph-legend-icon',\n        disabled &&\n          css`\n            cursor: default;\n          `\n      )}\n    >\n      <SeriesIcon {...iconProps} />\n    </span>\n  ) : (\n    <SeriesColorPicker\n      yaxis={yAxis}\n      color={color}\n      onChange={onColorChange}\n      onToggleAxis={onToggleAxis}\n      enableNamedColors\n    >\n      {({ ref, showColorPicker, hideColorPicker }) => (\n        <span ref={ref} onClick={showColorPicker} onMouseLeave={hideColorPicker} className=\"graph-legend-icon\">\n          <SeriesIcon {...iconProps} />\n        </span>\n      )}\n    </SeriesColorPicker>\n  );\n};\n\nLegendSeriesIcon.displayName = 'LegendSeriesIcon';\n","import React from 'react';\nimport { InlineList } from '../List/InlineList';\nimport { css } from 'emotion';\nimport { DisplayValue, formattedValueToString } from '@grafana/data';\nimport capitalize from 'lodash/capitalize';\n\nconst LegendItemStat: React.FunctionComponent<{ stat: DisplayValue }> = ({ stat }) => {\n  return (\n    <div\n      className={css`\n        margin-left: 6px;\n      `}\n    >\n      {stat.title && `${capitalize(stat.title)}:`} {formattedValueToString(stat)}\n    </div>\n  );\n};\n\nLegendItemStat.displayName = 'LegendItemStat';\n\nexport const LegendStatsList: React.FunctionComponent<{ stats: DisplayValue[] }> = ({ stats }) => {\n  if (stats.length === 0) {\n    return null;\n  }\n  return <InlineList items={stats} renderItem={stat => <LegendItemStat stat={stat} />} />;\n};\n\nLegendStatsList.displayName = 'LegendStatsList';\n","import React, { useContext } from 'react';\nimport { css, cx } from 'emotion';\nimport { LegendSeriesIcon } from '../Legend/LegendSeriesIcon';\nimport { LegendItem } from '../Legend/Legend';\nimport { SeriesColorChangeHandler } from './GraphWithLegend';\nimport { LegendStatsList } from '../Legend/LegendStatsList';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme, formattedValueToString } from '@grafana/data';\n\nexport interface GraphLegendItemProps {\n  key?: React.Key;\n  item: LegendItem;\n  className?: string;\n  onLabelClick?: (item: LegendItem, event: React.MouseEvent<HTMLDivElement>) => void;\n  onSeriesColorChange?: SeriesColorChangeHandler;\n  onToggleAxis?: () => void;\n}\n\nexport const GraphLegendListItem: React.FunctionComponent<GraphLegendItemProps> = ({\n  item,\n  onSeriesColorChange,\n  onToggleAxis,\n  onLabelClick,\n}) => {\n  const theme = useContext(ThemeContext);\n\n  return (\n    <>\n      <LegendSeriesIcon\n        disabled={!onSeriesColorChange}\n        color={item.color}\n        onColorChange={color => {\n          if (onSeriesColorChange) {\n            onSeriesColorChange(item.label, color);\n          }\n        }}\n        onToggleAxis={onToggleAxis}\n        yAxis={item.yAxis}\n      />\n      <div\n        onClick={event => {\n          if (onLabelClick) {\n            onLabelClick(item, event);\n          }\n        }}\n        className={css`\n          cursor: pointer;\n          white-space: pre-wrap;\n          color: ${!item.isVisible && theme.colors.linkDisabled};\n        `}\n      >\n        {item.label}\n      </div>\n\n      {item.displayValues && <LegendStatsList stats={item.displayValues} />}\n    </>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    row: css`\n      font-size: ${theme.typography.size.sm};\n      td {\n        padding: ${theme.spacing.xxs} ${theme.spacing.sm};\n        white-space: nowrap;\n      }\n    `,\n    label: css`\n      cursor: pointer;\n      white-space: nowrap;\n    `,\n    itemWrapper: css`\n      display: flex;\n      white-space: nowrap;\n    `,\n    value: css`\n      text-align: right;\n    `,\n    yAxisLabel: css`\n      color: ${theme.palette.gray2};\n    `,\n  };\n});\n\nexport const GraphLegendTableRow: React.FunctionComponent<GraphLegendItemProps> = ({\n  item,\n  onSeriesColorChange,\n  onToggleAxis,\n  onLabelClick,\n  className,\n}) => {\n  const theme = useContext(ThemeContext);\n  const styles = getStyles(theme);\n  return (\n    <tr className={cx(styles.row, className)}>\n      <td>\n        <span className={styles.itemWrapper}>\n          <LegendSeriesIcon\n            disabled={!!onSeriesColorChange}\n            color={item.color}\n            onColorChange={color => {\n              if (onSeriesColorChange) {\n                onSeriesColorChange(item.label, color);\n              }\n            }}\n            onToggleAxis={onToggleAxis}\n            yAxis={item.yAxis}\n          />\n          <div\n            onClick={event => {\n              if (onLabelClick) {\n                onLabelClick(item, event);\n              }\n            }}\n            className={styles.label}\n          >\n            {item.label} {item.yAxis === 2 && <span className={styles.yAxisLabel}>(right y-axis)</span>}\n          </div>\n        </span>\n      </td>\n      {item.displayValues &&\n        item.displayValues.map((stat, index) => {\n          return (\n            <td className={styles.value} key={`${stat.title}-${index}`}>\n              {formattedValueToString(stat)}\n            </td>\n          );\n        })}\n    </tr>\n  );\n};\n","import React, { useContext } from 'react';\nimport { LegendProps, LegendItem, LegendDisplayMode } from '../Legend/Legend';\nimport { GraphLegendListItem, GraphLegendTableRow } from './GraphLegendItem';\nimport { SeriesColorChangeHandler, SeriesAxisToggleHandler } from './GraphWithLegend';\nimport { LegendTable } from '../Legend/LegendTable';\nimport { LegendList } from '../Legend/LegendList';\nimport union from 'lodash/union';\nimport sortBy from 'lodash/sortBy';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { css } from 'emotion';\nimport { selectThemeVariant } from '../../themes/index';\n\nexport interface GraphLegendProps extends LegendProps {\n  displayMode: LegendDisplayMode;\n  sortBy?: string;\n  sortDesc?: boolean;\n  onSeriesColorChange?: SeriesColorChangeHandler;\n  onSeriesAxisToggle?: SeriesAxisToggleHandler;\n  onToggleSort?: (sortBy: string) => void;\n  onLabelClick?: (item: LegendItem, event: React.MouseEvent<HTMLElement>) => void;\n}\n\nexport const GraphLegend: React.FunctionComponent<GraphLegendProps> = ({\n  items,\n  displayMode,\n  sortBy: sortKey,\n  sortDesc,\n  onToggleSort,\n  onSeriesAxisToggle,\n  placement,\n  className,\n  ...graphLegendItemProps\n}) => {\n  const theme = useContext(ThemeContext);\n\n  if (displayMode === LegendDisplayMode.Table) {\n    const columns = items\n      .map(item => {\n        if (item.displayValues) {\n          return item.displayValues.map(i => i.title);\n        }\n        return [];\n      })\n      .reduce(\n        (acc, current) => {\n          return union(\n            acc,\n            current.filter(item => !!item)\n          );\n        },\n        ['']\n      ) as string[];\n\n    const sortedItems = sortKey\n      ? sortBy(items, item => {\n          if (item.displayValues) {\n            const stat = item.displayValues.filter(stat => stat.title === sortKey)[0];\n            return stat && stat.numeric;\n          }\n          return undefined;\n        })\n      : items;\n\n    const legendTableEvenRowBackground = selectThemeVariant(\n      {\n        dark: theme.palette.dark6,\n        light: theme.palette.gray5,\n      },\n      theme.type\n    );\n\n    return (\n      <LegendTable\n        className={css`\n          font-size: ${theme.typography.size.sm};\n          th {\n            padding: ${theme.spacing.xxs} ${theme.spacing.sm};\n          }\n        `}\n        items={sortDesc ? sortedItems.reverse() : sortedItems}\n        columns={columns}\n        placement={placement}\n        sortBy={sortKey}\n        sortDesc={sortDesc}\n        itemRenderer={(item, index) => (\n          <GraphLegendTableRow\n            key={`${item.label}-${index}`}\n            item={item}\n            onToggleAxis={() => {\n              if (onSeriesAxisToggle) {\n                onSeriesAxisToggle(item.label, item.yAxis === 1 ? 2 : 1);\n              }\n            }}\n            className={css`\n              background: ${index % 2 === 0 ? legendTableEvenRowBackground : 'none'};\n            `}\n            {...graphLegendItemProps}\n          />\n        )}\n        onToggleSort={onToggleSort}\n      />\n    );\n  }\n  return (\n    <LegendList\n      items={items}\n      placement={placement}\n      itemRenderer={item => (\n        <GraphLegendListItem\n          item={item}\n          onToggleAxis={() => {\n            if (onSeriesAxisToggle) {\n              onSeriesAxisToggle(item.label, item.yAxis === 1 ? 2 : 1);\n            }\n          }}\n          {...graphLegendItemProps}\n        />\n      )}\n    />\n  );\n};\n\nGraphLegend.displayName = 'GraphLegend';\n","// Libraries\n\nimport React from 'react';\nimport { css } from 'emotion';\nimport { GraphSeriesValue } from '@grafana/data';\n\nimport { Graph, GraphProps } from './Graph';\nimport { LegendRenderOptions, LegendItem, LegendDisplayMode } from '../Legend/Legend';\nimport { GraphLegend } from './GraphLegend';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { stylesFactory } from '../../themes';\n\nexport type SeriesOptionChangeHandler<TOption> = (label: string, option: TOption) => void;\nexport type SeriesColorChangeHandler = SeriesOptionChangeHandler<string>;\nexport type SeriesAxisToggleHandler = SeriesOptionChangeHandler<number>;\n\nexport interface GraphWithLegendProps extends GraphProps, LegendRenderOptions {\n  isLegendVisible: boolean;\n  displayMode: LegendDisplayMode;\n  sortLegendBy?: string;\n  sortLegendDesc?: boolean;\n  onSeriesColorChange?: SeriesColorChangeHandler;\n  onSeriesAxisToggle?: SeriesAxisToggleHandler;\n  onSeriesToggle?: (label: string, event: React.MouseEvent<HTMLElement>) => void;\n  onToggleSort: (sortBy: string) => void;\n}\n\nconst getGraphWithLegendStyles = stylesFactory(({ placement }: GraphWithLegendProps) => ({\n  wrapper: css`\n    display: flex;\n    flex-direction: ${placement === 'under' ? 'column' : 'row'};\n    height: 100%;\n  `,\n  graphContainer: css`\n    min-height: 65%;\n    flex-grow: 1;\n  `,\n  legendContainer: css`\n    padding: 10px 0;\n    max-height: ${placement === 'under' ? '35%' : 'none'};\n  `,\n}));\n\nconst shouldHideLegendItem = (data: GraphSeriesValue[][], hideEmpty = false, hideZero = false) => {\n  const isZeroOnlySeries = data.reduce((acc, current) => acc + (current[1] || 0), 0) === 0;\n  const isNullOnlySeries = !data.reduce((acc, current) => acc && current[1] !== null, true);\n\n  return (hideEmpty && isNullOnlySeries) || (hideZero && isZeroOnlySeries);\n};\n\nexport const GraphWithLegend: React.FunctionComponent<GraphWithLegendProps> = (props: GraphWithLegendProps) => {\n  const {\n    series,\n    timeRange,\n    width,\n    height,\n    showBars,\n    showLines,\n    showPoints,\n    sortLegendBy,\n    sortLegendDesc,\n    isLegendVisible,\n    displayMode,\n    placement,\n    onSeriesAxisToggle,\n    onSeriesColorChange,\n    onSeriesToggle,\n    onToggleSort,\n    hideEmpty,\n    hideZero,\n    isStacked,\n    lineWidth,\n    onHorizontalRegionSelected,\n    timeZone,\n    children,\n  } = props;\n  const { graphContainer, wrapper, legendContainer } = getGraphWithLegendStyles(props);\n\n  const legendItems = series.reduce<LegendItem[]>((acc, s) => {\n    return shouldHideLegendItem(s.data, hideEmpty, hideZero)\n      ? acc\n      : acc.concat([\n          {\n            label: s.label,\n            color: s.color || '',\n            isVisible: s.isVisible,\n            yAxis: s.yAxis.index,\n            displayValues: s.info || [],\n          },\n        ]);\n  }, []);\n\n  return (\n    <div className={wrapper}>\n      <div className={graphContainer}>\n        <Graph\n          series={series}\n          timeRange={timeRange}\n          timeZone={timeZone}\n          showLines={showLines}\n          showPoints={showPoints}\n          showBars={showBars}\n          width={width}\n          height={height}\n          key={isLegendVisible ? 'legend-visible' : 'legend-invisible'}\n          isStacked={isStacked}\n          lineWidth={lineWidth}\n          onHorizontalRegionSelected={onHorizontalRegionSelected}\n        >\n          {children}\n        </Graph>\n      </div>\n\n      {isLegendVisible && (\n        <div className={legendContainer}>\n          <CustomScrollbar hideHorizontalTrack>\n            <GraphLegend\n              items={legendItems}\n              displayMode={displayMode}\n              placement={placement}\n              sortBy={sortLegendBy}\n              sortDesc={sortLegendDesc}\n              onLabelClick={(item, event) => {\n                if (onSeriesToggle) {\n                  onSeriesToggle(item.label, event);\n                }\n              }}\n              onSeriesColorChange={onSeriesColorChange}\n              onSeriesAxisToggle={onSeriesAxisToggle}\n              onToggleSort={onToggleSort}\n            />\n          </CustomScrollbar>\n        </div>\n      )}\n    </div>\n  );\n};\n","/**\n * This function will calculate how many squares we can fit inside a rectangle.\n * Please have a look at this post for more details about the implementation:\n * https://math.stackexchange.com/questions/466198/algorithm-to-get-the-maximum-size-of-n-squares-that-fit-into-a-rectangle-with-a\n *\n * @param parentWidth width of the parent container\n * @param parentHeight height of the parent container\n * @param numberOfChildren number of children that should fit in the parent container\n */\nexport const calculateGridDimensions = (\n  parentWidth: number,\n  parentHeight: number,\n  itemSpacing: number,\n  numberOfChildren: number\n) => {\n  const vertical = calculateSizeOfChild(parentWidth, parentHeight, numberOfChildren);\n  const horizontal = calculateSizeOfChild(parentHeight, parentWidth, numberOfChildren);\n  const square = Math.max(vertical, horizontal);\n  let xCount = Math.floor(parentWidth / square);\n  let yCount = Math.ceil(numberOfChildren / xCount);\n\n  // after yCount update xCount to make split between rows more even\n  xCount = Math.ceil(numberOfChildren / yCount);\n\n  const itemsOnLastRow = xCount - (xCount * yCount - numberOfChildren);\n  const widthOnLastRow = parentWidth / itemsOnLastRow - itemSpacing + itemSpacing / itemsOnLastRow;\n\n  return {\n    width: parentWidth / xCount - itemSpacing + itemSpacing / xCount,\n    height: parentHeight / yCount - itemSpacing + itemSpacing / yCount,\n    widthOnLastRow,\n    xCount,\n    yCount,\n  };\n};\n\nfunction calculateSizeOfChild(parentWidth: number, parentHeight: number, numberOfChildren: number): number {\n  const parts = Math.ceil(Math.sqrt((numberOfChildren * parentWidth) / parentHeight));\n\n  if (Math.floor((parts * parentHeight) / parentWidth) * parts < numberOfChildren) {\n    return parentHeight / Math.ceil((parts * parentHeight) / parentWidth);\n  }\n\n  return parentWidth / parts;\n}\n","import React, { PureComponent, CSSProperties } from 'react';\nimport { VizOrientation } from '@grafana/data';\nimport { calculateGridDimensions } from '../../utils/squares';\n\ninterface Props<V, D> {\n  /**\n   * Optionally precalculate dimensions to support consistent behavior between repeated\n   * values.  Two typical patterns are:\n   * 1) Calculate raw values like font size etc and pass them to each vis\n   * 2) find the maximum input values and pass that to the vis\n   */\n  getAlignmentFactors?: (values: V[], width: number, height: number) => D;\n\n  /**\n   * Render a single value\n   */\n  renderValue: (props: VizRepeaterRenderValueProps<V, D>) => JSX.Element;\n  height: number;\n  width: number;\n  source: any; // If this changes, new values will be requested\n  getValues: () => V[];\n  renderCounter: number; // force update of values & render\n  orientation: VizOrientation;\n  itemSpacing?: number;\n  /** When orientation is set to auto layout items in a grid */\n  autoGrid?: boolean;\n}\n\nexport interface VizRepeaterRenderValueProps<V, D = {}> {\n  value: V;\n  width: number;\n  height: number;\n  orientation: VizOrientation;\n  alignmentFactors: D;\n}\n\ninterface DefaultProps {\n  itemSpacing: number;\n}\n\ntype PropsWithDefaults<V, D> = Props<V, D> & DefaultProps;\n\ninterface State<V> {\n  values: V[];\n}\n\nexport class VizRepeater<V, D = {}> extends PureComponent<Props<V, D>, State<V>> {\n  static defaultProps: DefaultProps = {\n    itemSpacing: 8,\n  };\n\n  constructor(props: Props<V, D>) {\n    super(props);\n\n    this.state = {\n      values: props.getValues(),\n    };\n  }\n\n  componentDidUpdate(prevProps: Props<V, D>) {\n    const { renderCounter, source } = this.props;\n    if (renderCounter !== prevProps.renderCounter || source !== prevProps.source) {\n      this.setState({ values: this.props.getValues() });\n    }\n  }\n\n  getOrientation(): VizOrientation {\n    const { orientation, width, height } = this.props;\n\n    if (orientation === VizOrientation.Auto) {\n      if (width > height) {\n        return VizOrientation.Vertical;\n      } else {\n        return VizOrientation.Horizontal;\n      }\n    }\n\n    return orientation;\n  }\n\n  renderGrid() {\n    const { renderValue, height, width, itemSpacing, getAlignmentFactors, orientation } = this\n      .props as PropsWithDefaults<V, D>;\n\n    const { values } = this.state;\n    const grid = calculateGridDimensions(width, height, itemSpacing, values.length);\n    const alignmentFactors = getAlignmentFactors ? getAlignmentFactors(values, grid.width, grid.height) : ({} as D);\n\n    let xGrid = 0;\n    let yGrid = 0;\n    let items: JSX.Element[] = [];\n\n    for (let i = 0; i < values.length; i++) {\n      const value = values[i];\n      const isLastRow = yGrid === grid.yCount - 1;\n\n      const itemWidth = isLastRow ? grid.widthOnLastRow : grid.width;\n      const itemHeight = grid.height;\n\n      const xPos = xGrid * itemWidth + itemSpacing * xGrid;\n      const yPos = yGrid * itemHeight + itemSpacing * yGrid;\n\n      const itemStyles: CSSProperties = {\n        position: 'absolute',\n        left: xPos,\n        top: yPos,\n        width: `${itemWidth}px`,\n        height: `${itemHeight}px`,\n      };\n\n      items.push(\n        <div key={i} style={itemStyles}>\n          {renderValue({ value, width: itemWidth, height: itemHeight, alignmentFactors, orientation })}\n        </div>\n      );\n\n      xGrid++;\n\n      if (xGrid === grid.xCount) {\n        xGrid = 0;\n        yGrid++;\n      }\n    }\n\n    return <div style={{ position: 'relative' }}>{items}</div>;\n  }\n\n  render() {\n    const { renderValue, height, width, itemSpacing, getAlignmentFactors, autoGrid, orientation } = this\n      .props as PropsWithDefaults<V, D>;\n    const { values } = this.state;\n\n    if (autoGrid && orientation === VizOrientation.Auto) {\n      return this.renderGrid();\n    }\n\n    const itemStyles: React.CSSProperties = {\n      display: 'flex',\n    };\n\n    const repeaterStyle: React.CSSProperties = {\n      display: 'flex',\n    };\n\n    let vizHeight = height;\n    let vizWidth = width;\n\n    let resolvedOrientation = this.getOrientation();\n\n    switch (resolvedOrientation) {\n      case VizOrientation.Horizontal:\n        repeaterStyle.flexDirection = 'column';\n        itemStyles.marginBottom = `${itemSpacing}px`;\n        vizWidth = width;\n        vizHeight = height / values.length - itemSpacing + itemSpacing / values.length;\n        break;\n      case VizOrientation.Vertical:\n        repeaterStyle.flexDirection = 'row';\n        repeaterStyle.justifyContent = 'space-between';\n        itemStyles.marginRight = `${itemSpacing}px`;\n        vizHeight = height;\n        vizWidth = width / values.length - itemSpacing + itemSpacing / values.length;\n    }\n\n    itemStyles.width = `${vizWidth}px`;\n    itemStyles.height = `${vizHeight}px`;\n\n    const alignmentFactors = getAlignmentFactors ? getAlignmentFactors(values, vizWidth, vizHeight) : ({} as D);\n\n    return (\n      <div style={repeaterStyle}>\n        {values.map((value, index) => {\n          return (\n            <div key={index} style={getItemStylesForIndex(itemStyles, index, values.length)}>\n              {renderValue({\n                value,\n                width: vizWidth,\n                height: vizHeight,\n                alignmentFactors,\n                orientation: resolvedOrientation,\n              })}\n            </div>\n          );\n        })}\n      </div>\n    );\n  }\n}\n\n/*\n * Removes any padding on the last item\n */\nfunction getItemStylesForIndex(itemStyles: CSSProperties, index: number, length: number): CSSProperties {\n  if (index === length - 1) {\n    return {\n      ...itemStyles,\n      marginRight: 0,\n      marginBottom: 0,\n    };\n  }\n  return itemStyles;\n}\n","import React, { FC, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types/icon';\n\nexport type AlertVariant = 'success' | 'warning' | 'error' | 'info';\n\ninterface AlertProps {\n  title: string;\n  buttonText?: string;\n  onButtonClick?: (event: React.MouseEvent) => void;\n  onRemove?: (event: React.MouseEvent) => void;\n  severity?: AlertVariant;\n  children?: ReactNode;\n}\n\nfunction getIconFromSeverity(severity: AlertVariant): string {\n  switch (severity) {\n    case 'error': {\n      return 'exclamation-triangle';\n    }\n    case 'warning': {\n      return 'exclamation-triangle';\n    }\n    case 'info': {\n      return 'info-circle';\n    }\n    case 'success': {\n      return 'check';\n    }\n    default:\n      return '';\n  }\n}\n\nexport const Alert: FC<AlertProps> = ({ title, buttonText, onButtonClick, onRemove, children, severity = 'error' }) => {\n  const alertClass = classNames('alert', `alert-${severity}`);\n  return (\n    <div className=\"alert-container\">\n      <div className={alertClass}>\n        <div className=\"alert-icon\">\n          <Icon size=\"xl\" name={getIconFromSeverity(severity) as IconName} />\n        </div>\n        <div className=\"alert-body\">\n          <div className=\"alert-title\">{title}</div>\n          {children && <div className=\"alert-text\">{children}</div>}\n        </div>\n        {/* If onRemove is specified , giving preference to onRemove */}\n        {onRemove && (\n          <button type=\"button\" className=\"alert-close\" onClick={onRemove}>\n            <Icon name=\"times\" size=\"lg\" />\n          </button>\n        )}\n        {onButtonClick && (\n          <button type=\"button\" className=\"btn btn-outline-danger\" onClick={onButtonClick}>\n            {buttonText}\n          </button>\n        )}\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\nimport { GraphSeriesXY } from '@grafana/data';\nimport difference from 'lodash/difference';\nimport isEqual from 'lodash/isEqual';\n\nexport interface GraphSeriesTogglerAPI {\n  onSeriesToggle: (label: string, event: React.MouseEvent<HTMLElement>) => void;\n  toggledSeries: GraphSeriesXY[];\n}\n\nexport interface GraphSeriesTogglerProps {\n  children: (api: GraphSeriesTogglerAPI) => JSX.Element;\n  series: GraphSeriesXY[];\n  onHiddenSeriesChanged?: (hiddenSeries: string[]) => void;\n}\n\nexport interface GraphSeriesTogglerState {\n  hiddenSeries: string[];\n  toggledSeries: GraphSeriesXY[];\n}\n\nexport class GraphSeriesToggler extends React.Component<GraphSeriesTogglerProps, GraphSeriesTogglerState> {\n  constructor(props: GraphSeriesTogglerProps) {\n    super(props);\n\n    this.onSeriesToggle = this.onSeriesToggle.bind(this);\n\n    this.state = {\n      hiddenSeries: [],\n      toggledSeries: props.series,\n    };\n  }\n\n  componentDidUpdate(prevProps: Readonly<GraphSeriesTogglerProps>) {\n    const { series } = this.props;\n    if (!isEqual(prevProps.series, series)) {\n      this.setState({ hiddenSeries: [], toggledSeries: series });\n    }\n  }\n\n  onSeriesToggle(label: string, event: React.MouseEvent<HTMLElement>) {\n    const { series, onHiddenSeriesChanged } = this.props;\n    const { hiddenSeries } = this.state;\n\n    if (event.ctrlKey || event.metaKey || event.shiftKey) {\n      // Toggling series with key makes the series itself to toggle\n      const newHiddenSeries =\n        hiddenSeries.indexOf(label) > -1\n          ? hiddenSeries.filter(series => series !== label)\n          : hiddenSeries.concat([label]);\n\n      const toggledSeries = series.map(series => ({\n        ...series,\n        isVisible: newHiddenSeries.indexOf(series.label) === -1,\n      }));\n      this.setState({ hiddenSeries: newHiddenSeries, toggledSeries }, () =>\n        onHiddenSeriesChanged ? onHiddenSeriesChanged(newHiddenSeries) : undefined\n      );\n      return;\n    }\n\n    // Toggling series with out key toggles all the series but the clicked one\n    const allSeriesLabels = series.map(series => series.label);\n    const newHiddenSeries =\n      hiddenSeries.length + 1 === allSeriesLabels.length ? [] : difference(allSeriesLabels, [label]);\n    const toggledSeries = series.map(series => ({\n      ...series,\n      isVisible: newHiddenSeries.indexOf(series.label) === -1,\n    }));\n\n    this.setState({ hiddenSeries: newHiddenSeries, toggledSeries }, () =>\n      onHiddenSeriesChanged ? onHiddenSeriesChanged(newHiddenSeries) : undefined\n    );\n  }\n\n  render() {\n    const { children } = this.props;\n    const { toggledSeries } = this.state;\n\n    return children({\n      onSeriesToggle: this.onSeriesToggle,\n      toggledSeries,\n    });\n  }\n}\n","import React, { FunctionComponent, useContext, useState } from 'react';\nimport { css, cx } from 'emotion';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { Icon } from '../Icon/Icon';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  collapse: css`\n    label: collapse;\n    margin-bottom: ${theme.spacing.sm};\n  `,\n  collapseBody: css`\n    label: collapse__body;\n    padding: ${theme.panelPadding}px;\n  `,\n  loader: css`\n    label: collapse__loader;\n    height: 2px;\n    position: relative;\n    overflow: hidden;\n    background: none;\n    margin: ${theme.spacing.xs};\n  `,\n  loaderActive: css`\n    label: collapse__loader_active;\n    &:after {\n      content: ' ';\n      display: block;\n      width: 25%;\n      top: 0;\n      top: -50%;\n      height: 250%;\n      position: absolute;\n      animation: loader 2s cubic-bezier(0.17, 0.67, 0.83, 0.67) 500ms;\n      animation-iteration-count: 100;\n      left: -25%;\n      background: ${theme.palette.blue85};\n    }\n    @keyframes loader {\n      from {\n        left: -25%;\n        opacity: 0.1;\n      }\n      to {\n        left: 100%;\n        opacity: 1;\n      }\n    }\n  `,\n  header: css`\n    label: collapse__header;\n    padding: ${theme.spacing.sm} ${theme.spacing.md};\n    display: flex;\n    cursor: inherit;\n    transition: all 0.1s linear;\n    cursor: pointer;\n  `,\n  headerCollapsed: css`\n    label: collapse__header--collapsed;\n    cursor: pointer;\n    padding: ${theme.spacing.sm} ${theme.spacing.md};\n  `,\n  headerButtons: css`\n    label: collapse__header-buttons;\n    margin-right: ${theme.spacing.sm};\n    margin-top: ${theme.spacing.xxs};\n    font-size: ${theme.typography.size.lg};\n    line-height: ${theme.typography.heading.h6};\n    display: inherit;\n  `,\n  headerButtonsCollapsed: css`\n    label: collapse__header-buttons--collapsed;\n    display: none;\n  `,\n  headerLabel: css`\n    label: collapse__header-label;\n    font-weight: ${theme.typography.weight.semibold};\n    margin-right: ${theme.spacing.sm};\n    font-size: ${theme.typography.heading.h6};\n  `,\n}));\n\ninterface Props {\n  isOpen?: boolean;\n  label: string;\n  loading?: boolean;\n  collapsible?: boolean;\n  onToggle?: (isOpen: boolean) => void;\n}\n\nexport const ControlledCollapse: FunctionComponent<Props> = ({ isOpen, onToggle, ...otherProps }) => {\n  const [open, setOpen] = useState(isOpen);\n  return (\n    <Collapse\n      isOpen={open}\n      {...otherProps}\n      onToggle={() => {\n        setOpen(!open);\n        if (onToggle) {\n          onToggle(!open);\n        }\n      }}\n    />\n  );\n};\n\nexport const Collapse: FunctionComponent<Props> = ({ isOpen, label, loading, collapsible, onToggle, children }) => {\n  const theme = useContext(ThemeContext);\n  const style = getStyles(theme);\n  const onClickToggle = () => {\n    if (onToggle) {\n      onToggle(!isOpen);\n    }\n  };\n\n  const panelClass = cx([style.collapse, 'panel-container']);\n  const loaderClass = loading ? cx([style.loader, style.loaderActive]) : cx([style.loader]);\n  const headerClass = collapsible ? cx([style.header]) : cx([style.headerCollapsed]);\n  const headerButtonsClass = collapsible ? cx([style.headerButtons]) : cx([style.headerButtonsCollapsed]);\n\n  return (\n    <div className={panelClass}>\n      <div className={headerClass} onClick={onClickToggle}>\n        <div className={headerButtonsClass}>\n          <Icon name={isOpen ? 'angle-up' : 'angle-down'} />\n        </div>\n        <div className={cx([style.headerLabel])}>{label}</div>\n      </div>\n      {isOpen && (\n        <div className={cx([style.collapseBody])}>\n          <div className={loaderClass} />\n          {children}\n        </div>\n      )}\n    </div>\n  );\n};\n\nCollapse.displayName = 'Collapse';\n","import React, { FunctionComponent } from 'react';\nimport { css, cx } from 'emotion';\nimport { Labels } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { Themeable } from '../../types/theme';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\nimport { withTheme } from '../../themes/ThemeContext';\n\n// Levels are already encoded in color, filename is a Loki-ism\nconst HIDDEN_LABELS = ['level', 'lvl', 'filename'];\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    logsLabels: css`\n      display: flex;\n      flex-wrap: wrap;\n      font-size: ${theme.typography.size.xs};\n    `,\n    logsLabel: css`\n      label: logs-label;\n      display: flex;\n      padding: 0 2px;\n      background-color: ${selectThemeVariant({ light: theme.palette.gray5, dark: theme.palette.dark6 }, theme.type)};\n      border-radius: ${theme.border.radius};\n      margin: 1px 4px 0 0;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      overflow: hidden;\n    `,\n    logsLabelValue: css`\n      label: logs-label__value;\n      display: inline-block;\n      max-width: 20em;\n      text-overflow: ellipsis;\n      overflow: hidden;\n    `,\n  };\n});\n\ninterface Props extends Themeable {\n  labels: Labels;\n}\n\nexport const UnThemedLogLabels: FunctionComponent<Props> = ({ labels, theme }) => {\n  const styles = getStyles(theme);\n  const displayLabels = Object.keys(labels).filter(label => !label.startsWith('_') && !HIDDEN_LABELS.includes(label));\n\n  if (displayLabels.length === 0) {\n    return (\n      <span className={cx([styles.logsLabels])}>\n        <span className={cx([styles.logsLabel])}>(no unique labels)</span>\n      </span>\n    );\n  }\n\n  return (\n    <span className={cx([styles.logsLabels])}>\n      {displayLabels.map(label => {\n        const value = labels[label];\n        const tooltip = `${label}: ${value}`;\n        return (\n          <span key={label} className={cx([styles.logsLabel])}>\n            <span className={cx([styles.logsLabelValue])} title={tooltip}>\n              {value}\n            </span>\n          </span>\n        );\n      })}\n    </span>\n  );\n};\n\nexport const LogLabels = withTheme(UnThemedLogLabels);\nLogLabels.displayName = 'LogLabels';\n","import { css } from 'emotion';\nimport { LogLevel } from '@grafana/data';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\nimport { stylesFactory } from '../../themes';\n\nexport const getLogRowStyles = stylesFactory((theme: GrafanaTheme, logLevel?: LogLevel) => {\n  let logColor = selectThemeVariant({ light: theme.palette.gray5, dark: theme.palette.gray2 }, theme.type);\n  const borderColor = selectThemeVariant({ light: theme.palette.gray5, dark: theme.palette.gray2 }, theme.type);\n  const bgColor = selectThemeVariant({ light: theme.palette.gray5, dark: theme.palette.dark4 }, theme.type);\n  const context = css`\n    label: context;\n    visibility: hidden;\n    white-space: nowrap;\n    position: relative;\n  `;\n\n  switch (logLevel) {\n    case LogLevel.crit:\n    case LogLevel.critical:\n      logColor = '#705da0';\n      break;\n    case LogLevel.error:\n    case LogLevel.err:\n      logColor = '#e24d42';\n      break;\n    case LogLevel.warning:\n    case LogLevel.warn:\n      logColor = theme.palette.yellow;\n      break;\n    case LogLevel.info:\n      logColor = '#7eb26d';\n      break;\n    case LogLevel.debug:\n      logColor = '#1f78c1';\n      break;\n    case LogLevel.trace:\n      logColor = '#6ed0e0';\n      break;\n  }\n\n  return {\n    logsRowMatchHighLight: css`\n      label: logs-row__match-highlight;\n      background: inherit;\n      padding: inherit;\n      color: ${theme.palette.yellow};\n      background-color: rgba(${theme.palette.yellow}, 0.1);\n    `,\n    logsRowMatchHighLightPreview: css`\n      label: logs-row__match-highlight--preview;\n      background-color: rgba(${theme.palette.yellow}, 0.2);\n      border-bottom-style: dotted;\n    `,\n    logsRowsTable: css`\n      label: logs-rows;\n      font-family: ${theme.typography.fontFamily.monospace};\n      font-size: ${theme.typography.size.sm};\n      width: 100%;\n    `,\n    logsRowsHorizontalScroll: css`\n      label: logs-rows__horizontal-scroll;\n      overflow: scroll;\n    `,\n    context: context,\n    logsRow: css`\n      label: logs-row;\n      width: 100%;\n      cursor: pointer;\n      vertical-align: top;\n      &:hover {\n        .${context} {\n          visibility: visible;\n          z-index: 1;\n          margin-left: 10px;\n          text-decoration: underline;\n          &:hover {\n            color: ${theme.palette.yellow};\n          }\n        }\n      }\n      td:last-child {\n        width: 100%;\n      }\n\n      > td {\n        padding-right: ${theme.spacing.sm};\n        border-top: ${theme.border.width.sm} solid transparent;\n        border-bottom: ${theme.border.width.sm} solid transparent;\n        height: 100%;\n      }\n\n      &:hover {\n        background: ${theme.colors.bodyBg};\n      }\n    `,\n    logsRowDuplicates: css`\n      label: logs-row__duplicates;\n      text-align: right;\n      width: 4em;\n      cursor: default;\n    `,\n    logsRowLevel: css`\n      label: logs-row__level;\n      position: relative;\n      max-width: 10px;\n      cursor: default;\n      &::after {\n        content: '';\n        display: block;\n        position: absolute;\n        top: 1px;\n        bottom: 1px;\n        width: 3px;\n        background-color: ${logColor};\n      }\n    `,\n    logsRowToggleDetails: css`\n      label: logs-row-toggle-details__level;\n      position: relative;\n      font-size: 9px;\n      padding-top: 5px;\n      max-width: 15px;\n    `,\n    logsRowLocalTime: css`\n      label: logs-row__localtime;\n      white-space: nowrap;\n      max-width: 12.5em;\n    `,\n    logsRowLabels: css`\n      label: logs-row__labels;\n      white-space: nowrap;\n      max-width: 22em;\n    `,\n    logsRowMessage: css`\n      label: logs-row__message;\n      white-space: pre-wrap;\n      word-break: break-all;\n    `,\n    //Log details sepcific CSS\n    logDetailsContainer: css`\n      label: logs-row-details-table;\n      border: 1px solid ${borderColor};\n      padding: 0 ${theme.spacing.sm} ${theme.spacing.sm};\n      border-radius: 3px;\n      margin: 20px 8px 20px 16px;\n      cursor: default;\n    `,\n    logDetailsTable: css`\n      label: logs-row-details-table;\n      line-height: 18px;\n      width: 100%;\n      td:last-child {\n        width: 100%;\n      }\n    `,\n    logsDetailsIcon: css`\n      label: logs-row-details__icon;\n      position: relative;\n      color: ${theme.palette.gray3};\n      padding-top: 6px;\n      padding-left: 6px;\n    `,\n    logDetailsLabel: css`\n      label: logs-row-details__label;\n      max-width: 30em;\n      min-width: 20em;\n      padding: 0 ${theme.spacing.sm};\n      overflow-wrap: break-word;\n    `,\n    logDetailsHeading: css`\n      label: logs-row-details__heading;\n      font-weight: ${theme.typography.weight.bold};\n      padding: ${theme.spacing.sm} 0 ${theme.spacing.xs};\n    `,\n    logDetailsValue: css`\n      label: logs-row-details__row;\n      position: relative;\n      vertical-align: middle;\n      cursor: default;\n      &:hover {\n        background-color: ${bgColor};\n      }\n    `,\n  };\n});\n","import { LogRowModel, toDataFrame, Field, FieldCache } from '@grafana/data';\nimport React, { useState, useEffect } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { DataQueryResponse, DataQueryError } from '@grafana/data';\n\nexport interface RowContextOptions {\n  direction?: 'BACKWARD' | 'FORWARD';\n  limit?: number;\n}\n\nexport interface LogRowContextRows {\n  before?: string[];\n  after?: string[];\n}\nexport interface LogRowContextQueryErrors {\n  before?: string;\n  after?: string;\n}\n\nexport interface HasMoreContextRows {\n  before: boolean;\n  after: boolean;\n}\n\ninterface ResultType {\n  data: string[][];\n  errors: string[];\n}\n\ninterface LogRowContextProviderProps {\n  row: LogRowModel;\n  getRowContext: (row: LogRowModel, options?: RowContextOptions) => Promise<DataQueryResponse>;\n  children: (props: {\n    result: LogRowContextRows;\n    errors: LogRowContextQueryErrors;\n    hasMoreContextRows: HasMoreContextRows;\n    updateLimit: () => void;\n    limit: number;\n  }) => JSX.Element;\n}\n\nexport const getRowContexts = async (\n  getRowContext: (row: LogRowModel, options?: RowContextOptions) => Promise<DataQueryResponse>,\n  row: LogRowModel,\n  limit: number\n) => {\n  const promises = [\n    getRowContext(row, {\n      limit,\n    }),\n    getRowContext(row, {\n      // The start time is inclusive so we will get the one row we are using as context entry\n      limit: limit + 1,\n      direction: 'FORWARD',\n    }),\n  ];\n\n  const results: Array<DataQueryResponse | DataQueryError> = await Promise.all(promises.map(p => p.catch(e => e)));\n\n  return {\n    data: results.map(result => {\n      const dataResult: DataQueryResponse = result as DataQueryResponse;\n      if (!dataResult.data) {\n        return [];\n      }\n\n      const data: any[] = [];\n      for (let index = 0; index < dataResult.data.length; index++) {\n        const dataFrame = toDataFrame(dataResult.data[index]);\n        const fieldCache = new FieldCache(dataFrame);\n        const timestampField: Field<string> = fieldCache.getFieldByName('ts')!;\n        const idField: Field<string> | undefined = fieldCache.getFieldByName('id');\n\n        for (let fieldIndex = 0; fieldIndex < timestampField.values.length; fieldIndex++) {\n          // TODO: this filtering is datasource dependant so it will make sense to move it there so the API is\n          //  to return correct list of lines handling inclusive ranges or how to filter the correct line on the\n          //  datasource.\n\n          // Filter out the row that is the one used as a focal point for the context as we will get it in one of the\n          // requests.\n          if (idField) {\n            // For Loki this means we filter only the one row. Issue is we could have other rows logged at the same\n            // ns which came before but they come in the response that search for logs after. This means right now\n            // we will show those as if they came after. This is not strictly correct but seems better than losing them\n            // and making this correct would mean quite a bit of complexity to shuffle things around and messing up\n            //counts.\n            if (idField.values.get(fieldIndex) === row.uid) {\n              continue;\n            }\n          } else {\n            // Fallback to timestamp. This should not happen right now as this feature is implemented only for loki\n            // and that has ID. Later this branch could be used in other DS but mind that this could also filter out\n            // logs which were logged in the same timestamp and that can be a problem depending on the precision.\n            if (parseInt(timestampField.values.get(fieldIndex), 10) === row.timeEpochMs) {\n              continue;\n            }\n          }\n\n          const lineField: Field<string> = dataFrame.fields.filter(field => field.name === 'line')[0];\n          const line = lineField.values.get(fieldIndex); // assuming that both fields have same length\n\n          data.push(line);\n        }\n      }\n\n      return data;\n    }),\n    errors: results.map(result => {\n      const errorResult: DataQueryError = result as DataQueryError;\n      if (!errorResult.message) {\n        return '';\n      }\n\n      return errorResult.message;\n    }),\n  };\n};\n\nexport const LogRowContextProvider: React.FunctionComponent<LogRowContextProviderProps> = ({\n  getRowContext,\n  row,\n  children,\n}) => {\n  // React Hook that creates a number state value called limit to component state and a setter function called setLimit\n  // The intial value for limit is 10\n  // Used for the number of rows to retrieve from backend from a specific point in time\n  const [limit, setLimit] = useState(10);\n\n  // React Hook that creates an object state value called result to component state and a setter function called setResult\n  // The intial value for result is null\n  // Used for sorting the response from backend\n  const [result, setResult] = useState<ResultType>((null as any) as ResultType);\n\n  // React Hook that creates an object state value called hasMoreContextRows to component state and a setter function called setHasMoreContextRows\n  // The intial value for hasMoreContextRows is {before: true, after: true}\n  // Used for indicating in UI if there are more rows to load in a given direction\n  const [hasMoreContextRows, setHasMoreContextRows] = useState({\n    before: true,\n    after: true,\n  });\n\n  // React Hook that resolves two promises every time the limit prop changes\n  // First promise fetches limit number of rows backwards in time from a specific point in time\n  // Second promise fetches limit number of rows forwards in time from a specific point in time\n  const { value } = useAsync(async () => {\n    return await getRowContexts(getRowContext, row, limit); // Moved it to a separate function for debugging purposes\n  }, [limit]);\n\n  // React Hook that performs a side effect every time the value (from useAsync hook) prop changes\n  // The side effect changes the result state with the response from the useAsync hook\n  // The side effect changes the hasMoreContextRows state if there are more context rows before or after the current result\n  useEffect(() => {\n    if (value) {\n      setResult((currentResult: any) => {\n        let hasMoreLogsBefore = true,\n          hasMoreLogsAfter = true;\n\n        const currentResultBefore = currentResult?.data[0];\n        const currentResultAfter = currentResult?.data[1];\n        const valueBefore = value.data[0];\n        const valueAfter = value.data[1];\n\n        // checks if there are more log rows in a given direction\n        // if after fetching additional rows the length of result is the same,\n        // we can assume there are no logs in that direction within a given time range\n        if (currentResult && (!valueBefore || currentResultBefore.length === valueBefore.length)) {\n          hasMoreLogsBefore = false;\n        }\n\n        if (currentResult && (!valueAfter || currentResultAfter.length === valueAfter.length)) {\n          hasMoreLogsAfter = false;\n        }\n\n        setHasMoreContextRows({\n          before: hasMoreLogsBefore,\n          after: hasMoreLogsAfter,\n        });\n\n        return value;\n      });\n    }\n  }, [value]);\n\n  return children({\n    result: {\n      before: result ? result.data[0] : [],\n      after: result ? result.data[1] : [],\n    },\n    errors: {\n      before: result ? result.errors[0] : undefined,\n      after: result ? result.errors[1] : undefined,\n    },\n    hasMoreContextRows,\n    updateLimit: () => setLimit(limit + 10),\n    limit,\n  });\n};\n","import React, { FunctionComponent, useContext } from 'react';\nimport { css, cx } from 'emotion';\n\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { GrafanaTheme } from '@grafana/data';\n\nconst getStyles = (theme: GrafanaTheme) => ({\n  logsStatsRow: css`\n    label: logs-stats-row;\n    margin: ${parseInt(theme.spacing.d, 10) / 1.75}px 0;\n  `,\n  logsStatsRowActive: css`\n    label: logs-stats-row--active;\n    color: ${theme.colors.textBlue};\n    position: relative;\n  `,\n  logsStatsRowLabel: css`\n    label: logs-stats-row__label;\n    display: flex;\n    margin-bottom: 1px;\n  `,\n  logsStatsRowValue: css`\n    label: logs-stats-row__value;\n    flex: 1;\n    text-overflow: ellipsis;\n    overflow: hidden;\n  `,\n  logsStatsRowCount: css`\n    label: logs-stats-row__count;\n    text-align: right;\n    margin-left: 0.5em;\n  `,\n  logsStatsRowPercent: css`\n    label: logs-stats-row__percent;\n    text-align: right;\n    margin-left: 0.5em;\n    width: 3em;\n  `,\n  logsStatsRowBar: css`\n    label: logs-stats-row__bar;\n    height: 4px;\n    overflow: hidden;\n    background: ${theme.colors.textFaint};\n  `,\n  logsStatsRowInnerBar: css`\n    label: logs-stats-row__innerbar;\n    height: 4px;\n    overflow: hidden;\n    background: ${theme.colors.bgBlue1};\n  `,\n});\n\nexport interface Props {\n  active?: boolean;\n  count: number;\n  proportion: number;\n  value?: string;\n}\n\nexport const LogLabelStatsRow: FunctionComponent<Props> = ({ active, count, proportion, value }) => {\n  const theme = useContext(ThemeContext);\n  const style = getStyles(theme);\n  const percent = `${Math.round(proportion * 100)}%`;\n  const barStyle = { width: percent };\n  const className = active ? cx([style.logsStatsRow, style.logsStatsRowActive]) : cx([style.logsStatsRow]);\n\n  return (\n    <div className={className}>\n      <div className={cx([style.logsStatsRowLabel])}>\n        <div className={cx([style.logsStatsRowValue])} title={value}>\n          {value}\n        </div>\n        <div className={cx([style.logsStatsRowCount])}>{count}</div>\n        <div className={cx([style.logsStatsRowPercent])}>{percent}</div>\n      </div>\n      <div className={cx([style.logsStatsRowBar])}>\n        <div className={cx([style.logsStatsRowInnerBar])} style={barStyle} />\n      </div>\n    </div>\n  );\n};\n\nLogLabelStatsRow.displayName = 'LogLabelStatsRow';\n","import React, { PureComponent } from 'react';\nimport { css } from 'emotion';\nimport { LogLabelStatsModel, GrafanaTheme } from '@grafana/data';\n\nimport { Themeable } from '../../types/theme';\nimport { stylesFactory } from '../../themes';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\nimport { withTheme } from '../../themes/index';\n\n//Components\nimport { LogLabelStatsRow } from './LogLabelStatsRow';\n\nconst STATS_ROW_LIMIT = 5;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const borderColor = selectThemeVariant(\n    {\n      light: theme.palette.gray5,\n      dark: theme.palette.dark9,\n    },\n    theme.type\n  );\n  return {\n    logsStats: css`\n      label: logs-stats;\n      column-span: 2;\n      background: inherit;\n      color: ${theme.colors.text};\n      word-break: break-all;\n    `,\n    logsStatsHeader: css`\n      label: logs-stats__header;\n      border-bottom: 1px solid ${borderColor};\n      display: flex;\n    `,\n    logsStatsTitle: css`\n      label: logs-stats__title;\n      font-weight: ${theme.typography.weight.semibold};\n      padding-right: ${theme.spacing.d};\n      display: inline-block;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n      flex-grow: 1;\n    `,\n    logsStatsClose: css`\n      label: logs-stats__close;\n      cursor: pointer;\n    `,\n    logsStatsBody: css`\n      label: logs-stats__body;\n      padding: 5px 0;\n    `,\n  };\n});\n\ninterface Props extends Themeable {\n  stats: LogLabelStatsModel[];\n  label: string;\n  value: string;\n  rowCount: number;\n  isLabel?: boolean;\n}\n\nclass UnThemedLogLabelStats extends PureComponent<Props> {\n  render() {\n    const { label, rowCount, stats, value, theme, isLabel } = this.props;\n    const style = getStyles(theme);\n    const topRows = stats.slice(0, STATS_ROW_LIMIT);\n    let activeRow = topRows.find(row => row.value === value);\n    let otherRows = stats.slice(STATS_ROW_LIMIT);\n    const insertActiveRow = !activeRow;\n\n    // Remove active row from other to show extra\n    if (insertActiveRow) {\n      activeRow = otherRows.find(row => row.value === value);\n      otherRows = otherRows.filter(row => row.value !== value);\n    }\n\n    const otherCount = otherRows.reduce((sum, row) => sum + row.count, 0);\n    const topCount = topRows.reduce((sum, row) => sum + row.count, 0);\n    const total = topCount + otherCount;\n    const otherProportion = otherCount / total;\n\n    return (\n      <td className={style.logsStats}>\n        <div className={style.logsStatsHeader}>\n          <div className={style.logsStatsTitle}>\n            {label}: {total} of {rowCount} rows have that {isLabel ? 'label' : 'field'}\n          </div>\n        </div>\n        <div className={style.logsStatsBody}>\n          {topRows.map(stat => (\n            <LogLabelStatsRow key={stat.value} {...stat} active={stat.value === value} />\n          ))}\n          {insertActiveRow && activeRow && <LogLabelStatsRow key={activeRow.value} {...activeRow} active />}\n          {otherCount > 0 && (\n            <LogLabelStatsRow key=\"__OTHERS__\" count={otherCount} value=\"Other\" proportion={otherProportion} />\n          )}\n        </div>\n      </td>\n    );\n  }\n}\n\nexport const LogLabelStats = withTheme(UnThemedLogLabelStats);\nLogLabelStats.displayName = 'LogLabelStats';\n","import React, { PureComponent } from 'react';\nimport { css, cx } from 'emotion';\nimport { Field, LinkModel, LogLabelStatsModel, GrafanaTheme } from '@grafana/data';\n\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\nimport { stylesFactory } from '../../themes/stylesFactory';\n\n//Components\nimport { LogLabelStats } from './LogLabelStats';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Tag } from '..';\n\nexport interface Props extends Themeable {\n  parsedValue: string;\n  parsedKey: string;\n  isLabel?: boolean;\n  onClickFilterLabel?: (key: string, value: string) => void;\n  onClickFilterOutLabel?: (key: string, value: string) => void;\n  links?: Array<LinkModel<Field>>;\n  getStats: () => LogLabelStatsModel[] | null;\n}\n\ninterface State {\n  showFieldsStats: boolean;\n  fieldCount: number;\n  fieldStats: LogLabelStatsModel[] | null;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    noHoverBackground: css`\n      label: noHoverBackground;\n      :hover {\n        background-color: transparent;\n      }\n    `,\n    hoverCursor: css`\n      label: hoverCursor;\n      cursor: pointer;\n    `,\n    wordBreakAll: css`\n      label: wordBreakAll;\n      word-break: break-all;\n    `,\n  };\n});\n\nclass UnThemedLogDetailsRow extends PureComponent<Props, State> {\n  state: State = {\n    showFieldsStats: false,\n    fieldCount: 0,\n    fieldStats: null,\n  };\n\n  filterLabel = () => {\n    const { onClickFilterLabel, parsedKey, parsedValue } = this.props;\n    if (onClickFilterLabel) {\n      onClickFilterLabel(parsedKey, parsedValue);\n    }\n  };\n\n  filterOutLabel = () => {\n    const { onClickFilterOutLabel, parsedKey, parsedValue } = this.props;\n    if (onClickFilterOutLabel) {\n      onClickFilterOutLabel(parsedKey, parsedValue);\n    }\n  };\n\n  showStats = () => {\n    const { showFieldsStats } = this.state;\n    if (!showFieldsStats) {\n      const fieldStats = this.props.getStats();\n      const fieldCount = fieldStats ? fieldStats.reduce((sum, stat) => sum + stat.count, 0) : 0;\n      this.setState({ fieldStats, fieldCount });\n    }\n    this.toggleFieldsStats();\n  };\n\n  toggleFieldsStats() {\n    this.setState(state => {\n      return {\n        showFieldsStats: !state.showFieldsStats,\n      };\n    });\n  }\n\n  render() {\n    const { theme, parsedKey, parsedValue, isLabel, links } = this.props;\n    const { showFieldsStats, fieldStats, fieldCount } = this.state;\n    const styles = getStyles(theme);\n    const style = getLogRowStyles(theme);\n    return (\n      <tr className={cx(style.logDetailsValue, { [styles.noHoverBackground]: showFieldsStats })}>\n        {/* Action buttons - show stats/filter results */}\n        <td className={style.logsDetailsIcon} colSpan={isLabel ? undefined : 3}>\n          <IconButton name=\"signal\" title={'Ad-hoc statistics'} onClick={this.showStats} />\n        </td>\n\n        {isLabel && (\n          <>\n            <td className={style.logsDetailsIcon}>\n              <IconButton name=\"search-plus\" title=\"Filter for value\" onClick={this.filterLabel} />\n            </td>\n            <td className={style.logsDetailsIcon}>\n              <IconButton name=\"search-minus\" title=\"Filter out value\" onClick={this.filterOutLabel} />\n            </td>\n          </>\n        )}\n\n        {/* Key - value columns */}\n        <td className={style.logDetailsLabel}>{parsedKey}</td>\n        <td className={styles.wordBreakAll}>\n          {parsedValue}\n          {links &&\n            links.map(link => {\n              return (\n                <>\n                  &nbsp;\n                  <FieldLink link={link} />\n                </>\n              );\n            })}\n          {showFieldsStats && (\n            <LogLabelStats\n              stats={fieldStats!}\n              label={parsedKey}\n              value={parsedValue}\n              rowCount={fieldCount}\n              isLabel={isLabel}\n            />\n          )}\n        </td>\n      </tr>\n    );\n  }\n}\n\nconst getLinkStyles = stylesFactory(() => {\n  return {\n    tag: css`\n      margin-left: 6px;\n      font-size: 11px;\n      padding: 2px 6px;\n    `,\n  };\n});\n\ntype FieldLinkProps = {\n  link: LinkModel<Field>;\n};\nfunction FieldLink({ link }: FieldLinkProps) {\n  const styles = getLinkStyles();\n  return (\n    <a\n      href={link.href}\n      target={'_blank'}\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      <Tag name={link.title} className={styles.tag} colorIndex={6} />\n    </a>\n  );\n}\n\nexport const LogDetailsRow = withTheme(UnThemedLogDetailsRow);\nLogDetailsRow.displayName = 'LogDetailsRow';\n","import React, { PureComponent } from 'react';\nimport memoizeOne from 'memoize-one';\nimport { css, cx } from 'emotion';\nimport {\n  calculateFieldStats,\n  calculateLogsLabelStats,\n  calculateStats,\n  Field,\n  getParser,\n  LinkModel,\n  LogRowModel,\n  GrafanaTheme,\n} from '@grafana/data';\n\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\n\n//Components\nimport { LogDetailsRow } from './LogDetailsRow';\n\ntype FieldDef = {\n  key: string;\n  value: string;\n  links?: Array<LinkModel<Field>>;\n  fieldIndex?: number;\n};\n\nexport interface Props extends Themeable {\n  row: LogRowModel;\n  showDuplicates: boolean;\n  getRows: () => LogRowModel[];\n  className?: string;\n  onMouseEnter?: () => void;\n  onMouseLeave?: () => void;\n  onClickFilterLabel?: (key: string, value: string) => void;\n  onClickFilterOutLabel?: (key: string, value: string) => void;\n  getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const bgColor = selectThemeVariant({ light: theme.palette.gray7, dark: theme.palette.dark2 }, theme.type);\n  return {\n    hoverBackground: css`\n      label: hoverBackground;\n      background-color: ${bgColor};\n    `,\n    logsRowLevelDetails: css`\n      label: logs-row__level_details;\n      &::after {\n        top: -3px;\n      }\n    `,\n    logDetailsDefaultCursor: css`\n      label: logDetailsDefaultCursor;\n      cursor: default;\n    `,\n  };\n});\n\nclass UnThemedLogDetails extends PureComponent<Props> {\n  getParser = memoizeOne(getParser);\n\n  parseMessage = memoizeOne((rowEntry): FieldDef[] => {\n    const parser = this.getParser(rowEntry);\n    if (!parser) {\n      return [];\n    }\n    // Use parser to highlight detected fields\n    const parsedFields = parser.getFields(rowEntry);\n    const fields = parsedFields.map(field => {\n      const key = parser.getLabelFromField(field);\n      const value = parser.getValueFromField(field);\n      return { key, value };\n    });\n\n    return fields;\n  });\n\n  getDerivedFields = memoizeOne((row: LogRowModel): FieldDef[] => {\n    return (\n      row.dataFrame.fields\n        .map((field, index) => ({ ...field, index }))\n        // Remove Id which we use for react key and entry field which we are showing as the log message. Also remove hidden fields.\n        .filter(\n          (field, index) => !('id' === field.name || row.entryFieldIndex === index || field.config.custom?.hidden)\n        )\n        // Filter out fields without values. For example in elastic the fields are parsed from the document which can\n        // have different structure per row and so the dataframe is pretty sparse.\n        .filter(field => {\n          const value = field.values.get(row.rowIndex);\n          // Not sure exactly what will be the empty value here. And we want to keep 0 as some values can be non\n          // string.\n          return value !== null && value !== undefined;\n        })\n        .map(field => {\n          const { getFieldLinks } = this.props;\n          const links = getFieldLinks ? getFieldLinks(field, row.rowIndex) : [];\n          return {\n            key: field.name,\n            value: field.values.get(row.rowIndex).toString(),\n            links: links,\n            fieldIndex: field.index,\n          };\n        })\n    );\n  });\n\n  /**\n   * Returns all fields for log row which consists of fields we parse from the message itself and any derived fields\n   * setup in data source config.\n   */\n  getAllFields = memoizeOne((row: LogRowModel) => {\n    const fields = this.parseMessage(row.entry);\n    const derivedFields = this.getDerivedFields(row);\n    const fieldsMap = [...derivedFields, ...fields].reduce((acc, field) => {\n      // Strip enclosing quotes for hashing. When values are parsed from log line the quotes are kept, but if same\n      // value is in the dataFrame it will be without the quotes. We treat them here as the same value.\n      const value = field.value.replace(/(^\")|(\"$)/g, '');\n      const fieldHash = `${field.key}=${value}`;\n      if (acc[fieldHash]) {\n        acc[fieldHash].links = [...(acc[fieldHash].links || []), ...(field.links || [])];\n      } else {\n        acc[fieldHash] = field;\n      }\n      return acc;\n    }, {} as { [key: string]: FieldDef });\n\n    const allFields = Object.values(fieldsMap);\n    allFields.sort(sortFieldsLinkFirst);\n\n    return allFields;\n  });\n\n  getStatsForParsedField = (key: string) => {\n    const matcher = this.getParser(this.props.row.entry)!.buildMatcher(key);\n    return calculateFieldStats(this.props.getRows(), matcher);\n  };\n\n  render() {\n    const {\n      row,\n      theme,\n      onClickFilterOutLabel,\n      onClickFilterLabel,\n      getRows,\n      showDuplicates,\n      className,\n      onMouseEnter,\n      onMouseLeave,\n    } = this.props;\n    const style = getLogRowStyles(theme, row.logLevel);\n    const styles = getStyles(theme);\n    const labels = row.labels ? row.labels : {};\n    const labelsAvailable = Object.keys(labels).length > 0;\n    const fields = this.getAllFields(row);\n    const parsedFieldsAvailable = fields && fields.length > 0;\n\n    return (\n      <tr\n        className={cx(className, styles.logDetailsDefaultCursor)}\n        onMouseEnter={onMouseEnter}\n        onMouseLeave={onMouseLeave}\n      >\n        {showDuplicates && <td />}\n        <td className={cx(style.logsRowLevel, styles.logsRowLevelDetails)} />\n        <td colSpan={4}>\n          <div className={style.logDetailsContainer}>\n            <table className={style.logDetailsTable}>\n              <tbody>\n                {labelsAvailable && (\n                  <tr>\n                    <td colSpan={5} className={style.logDetailsHeading} aria-label=\"Log Labels\">\n                      Log Labels:\n                    </td>\n                  </tr>\n                )}\n                {Object.keys(labels).map(key => {\n                  const value = labels[key];\n                  return (\n                    <LogDetailsRow\n                      key={`${key}=${value}`}\n                      parsedKey={key}\n                      parsedValue={value}\n                      isLabel={true}\n                      getStats={() => calculateLogsLabelStats(getRows(), key)}\n                      onClickFilterOutLabel={onClickFilterOutLabel}\n                      onClickFilterLabel={onClickFilterLabel}\n                    />\n                  );\n                })}\n\n                {parsedFieldsAvailable && (\n                  <tr>\n                    <td colSpan={5} className={style.logDetailsHeading} aria-label=\"Parsed Fields\">\n                      Parsed Fields:\n                    </td>\n                  </tr>\n                )}\n                {fields.map(field => {\n                  const { key, value, links, fieldIndex } = field;\n                  return (\n                    <LogDetailsRow\n                      key={`${key}=${value}`}\n                      parsedKey={key}\n                      parsedValue={value}\n                      links={links}\n                      getStats={() =>\n                        fieldIndex === undefined\n                          ? this.getStatsForParsedField(key)\n                          : calculateStats(row.dataFrame.fields[fieldIndex].values.toArray())\n                      }\n                    />\n                  );\n                })}\n                {!parsedFieldsAvailable && !labelsAvailable && (\n                  <tr>\n                    <td colSpan={5} aria-label=\"No details\">\n                      No details available\n                    </td>\n                  </tr>\n                )}\n              </tbody>\n            </table>\n          </div>\n        </td>\n      </tr>\n    );\n  }\n}\n\nfunction sortFieldsLinkFirst(fieldA: FieldDef, fieldB: FieldDef) {\n  if (fieldA.links?.length && !fieldB.links?.length) {\n    return -1;\n  }\n  if (!fieldA.links?.length && fieldB.links?.length) {\n    return 1;\n  }\n  return fieldA.key > fieldB.key ? 1 : fieldA.key < fieldB.key ? -1 : 0;\n}\n\nexport const LogDetails = withTheme(UnThemedLogDetails);\nLogDetails.displayName = 'LogDetails';\n","import React, { useContext, useRef, useState, useLayoutEffect } from 'react';\nimport { LogRowModel } from '@grafana/data';\nimport { css, cx } from 'emotion';\n\nimport { Alert } from '../Alert/Alert';\nimport { LogRowContextRows, LogRowContextQueryErrors, HasMoreContextRows } from './LogRowContextProvider';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\nimport { DataQueryError } from '@grafana/data';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { List } from '../List/List';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\n\ninterface LogRowContextProps {\n  row: LogRowModel;\n  context: LogRowContextRows;\n  errors?: LogRowContextQueryErrors;\n  hasMoreContextRows?: HasMoreContextRows;\n  onOutsideClick: () => void;\n  onLoadMoreContext: () => void;\n}\n\nconst getLogRowContextStyles = (theme: GrafanaTheme) => {\n  const gradientTop = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.dark1,\n    },\n    theme.type\n  );\n  const gradientBottom = selectThemeVariant(\n    {\n      light: theme.palette.gray7,\n      dark: theme.palette.dark2,\n    },\n    theme.type\n  );\n\n  const boxShadowColor = selectThemeVariant(\n    {\n      light: theme.palette.gray5,\n      dark: theme.palette.black,\n    },\n    theme.type\n  );\n  const borderColor = selectThemeVariant(\n    {\n      light: theme.palette.gray5,\n      dark: theme.palette.dark9,\n    },\n    theme.type\n  );\n\n  return {\n    commonStyles: css`\n      position: absolute;\n      width: calc(100% + 20px);\n      left: -10px;\n      height: 250px;\n      z-index: 2;\n      overflow: hidden;\n      background: ${theme.colors.bodyBg};\n      background: linear-gradient(180deg, ${gradientTop} 0%, ${gradientBottom} 104.25%);\n      box-shadow: 0px 2px 4px ${boxShadowColor}, 0px 0px 2px ${boxShadowColor};\n      border: 1px solid ${borderColor};\n      border-radius: ${theme.border.radius.md};\n    `,\n    header: css`\n      height: 30px;\n      padding: 0 10px;\n      display: flex;\n      align-items: center;\n      background: ${borderColor};\n    `,\n    logs: css`\n      height: 220px;\n      padding: 10px;\n    `,\n  };\n};\n\ninterface LogRowContextGroupHeaderProps {\n  row: LogRowModel;\n  rows: Array<string | DataQueryError>;\n  onLoadMoreContext: () => void;\n  shouldScrollToBottom?: boolean;\n  canLoadMoreRows?: boolean;\n}\ninterface LogRowContextGroupProps extends LogRowContextGroupHeaderProps {\n  rows: Array<string | DataQueryError>;\n  className: string;\n  error?: string;\n}\n\nconst LogRowContextGroupHeader: React.FunctionComponent<LogRowContextGroupHeaderProps> = ({\n  row,\n  rows,\n  onLoadMoreContext,\n  canLoadMoreRows,\n}) => {\n  const theme = useContext(ThemeContext);\n  const { header } = getLogRowContextStyles(theme);\n\n  const onClickLoadMore = (event: React.SyntheticEvent) => {\n    event.stopPropagation();\n    onLoadMoreContext();\n  };\n\n  return (\n    <div className={header}>\n      <span\n        className={css`\n          opacity: 0.6;\n        `}\n      >\n        Found {rows.length} rows.\n      </span>\n      {(rows.length >= 10 || (rows.length > 10 && rows.length % 10 !== 0)) && canLoadMoreRows && (\n        <span\n          className={css`\n            margin-left: 10px;\n            &:hover {\n              text-decoration: underline;\n              cursor: pointer;\n            }\n          `}\n          onClick={onClickLoadMore}\n        >\n          Load 10 more\n        </span>\n      )}\n    </div>\n  );\n};\n\nconst LogRowContextGroup: React.FunctionComponent<LogRowContextGroupProps> = ({\n  row,\n  rows,\n  error,\n  className,\n  shouldScrollToBottom,\n  canLoadMoreRows,\n  onLoadMoreContext,\n}) => {\n  const theme = useContext(ThemeContext);\n  const { commonStyles, logs } = getLogRowContextStyles(theme);\n  const [scrollTop, setScrollTop] = useState(0);\n  const listContainerRef = useRef<HTMLDivElement>() as React.RefObject<HTMLDivElement>;\n\n  useLayoutEffect(() => {\n    if (shouldScrollToBottom && listContainerRef.current) {\n      setScrollTop(listContainerRef.current.offsetHeight);\n    }\n  });\n\n  const headerProps = {\n    row,\n    rows,\n    onLoadMoreContext,\n    canLoadMoreRows,\n  };\n\n  return (\n    <div className={cx(className, commonStyles)}>\n      {/* When displaying \"after\" context */}\n      {shouldScrollToBottom && !error && <LogRowContextGroupHeader {...headerProps} />}\n      <div className={logs}>\n        <CustomScrollbar autoHide scrollTop={scrollTop}>\n          <div ref={listContainerRef}>\n            {!error && (\n              <List\n                items={rows}\n                renderItem={item => {\n                  return (\n                    <div\n                      className={css`\n                        padding: 5px 0;\n                      `}\n                    >\n                      {item}\n                    </div>\n                  );\n                }}\n              />\n            )}\n            {error && <Alert title={error} />}\n          </div>\n        </CustomScrollbar>\n      </div>\n      {/* When displaying \"before\" context */}\n      {!shouldScrollToBottom && !error && <LogRowContextGroupHeader {...headerProps} />}\n    </div>\n  );\n};\n\nexport const LogRowContext: React.FunctionComponent<LogRowContextProps> = ({\n  row,\n  context,\n  errors,\n  onOutsideClick,\n  onLoadMoreContext,\n  hasMoreContextRows,\n}) => {\n  return (\n    <ClickOutsideWrapper onClick={onOutsideClick}>\n      <div>\n        {context.after && (\n          <LogRowContextGroup\n            rows={context.after}\n            error={errors && errors.after}\n            row={row}\n            className={css`\n              top: -250px;\n            `}\n            shouldScrollToBottom\n            canLoadMoreRows={hasMoreContextRows ? hasMoreContextRows.after : false}\n            onLoadMoreContext={onLoadMoreContext}\n          />\n        )}\n\n        {context.before && (\n          <LogRowContextGroup\n            onLoadMoreContext={onLoadMoreContext}\n            canLoadMoreRows={hasMoreContextRows ? hasMoreContextRows.before : false}\n            row={row}\n            rows={context.before}\n            error={errors && errors.before}\n            className={css`\n              top: 100%;\n            `}\n          />\n        )}\n      </div>\n    </ClickOutsideWrapper>\n  );\n};\n","import React, { PureComponent } from 'react';\nimport ansicolor from '../../utils/ansicolor';\n\ninterface Style {\n  [key: string]: string;\n}\n\ninterface ParsedChunk {\n  style: Style;\n  text: string;\n}\n\nfunction convertCSSToStyle(css: string): Style {\n  return css.split(/;\\s*/).reduce((accumulated, line) => {\n    const match = line.match(/([^:\\s]+)\\s*:\\s*(.+)/);\n\n    if (match && match[1] && match[2]) {\n      const key = match[1].replace(/-([a-z])/g, (_, character) => character.toUpperCase());\n      // @ts-ignore\n      accumulated[key] = match[2];\n    }\n\n    return accumulated;\n  }, {});\n}\n\ninterface Props {\n  value: string;\n}\n\ninterface State {\n  chunks: ParsedChunk[];\n  prevValue: string;\n}\n\nexport class LogMessageAnsi extends PureComponent<Props, State> {\n  state: State = {\n    chunks: [],\n    prevValue: '',\n  };\n\n  static getDerivedStateFromProps(props: Props, state: State) {\n    if (props.value === state.prevValue) {\n      return null;\n    }\n\n    const parsed = ansicolor.parse(props.value);\n\n    return {\n      chunks: parsed.spans.map(span => {\n        return span.css\n          ? {\n              style: convertCSSToStyle(span.css),\n              text: span.text,\n            }\n          : { text: span.text };\n      }),\n      prevValue: props.value,\n    };\n  }\n\n  render() {\n    const { chunks } = this.state;\n\n    return chunks.map((chunk, index) =>\n      chunk.style ? (\n        <span key={index} style={chunk.style}>\n          {chunk.text}\n        </span>\n      ) : (\n        chunk.text\n      )\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport _ from 'lodash';\nimport tinycolor from 'tinycolor2';\nimport { css, cx } from 'emotion';\nimport { LogRowModel, findHighlightChunksInText, GrafanaTheme } from '@grafana/data';\n\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\nimport { LogRowContextQueryErrors, HasMoreContextRows, LogRowContextRows } from './LogRowContextProvider';\nimport { selectThemeVariant } from '../../index';\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\nimport { stylesFactory } from '../../themes/stylesFactory';\n\n//Components\nimport { LogRowContext } from './LogRowContext';\nimport { LogMessageAnsi } from './LogMessageAnsi';\n\ninterface Props extends Themeable {\n  row: LogRowModel;\n  hasMoreContextRows?: HasMoreContextRows;\n  contextIsOpen: boolean;\n  wrapLogMessage: boolean;\n  errors?: LogRowContextQueryErrors;\n  context?: LogRowContextRows;\n  showContextToggle?: (row?: LogRowModel) => boolean;\n  highlighterExpressions?: string[];\n  getRows: () => LogRowModel[];\n  onToggleContext: () => void;\n  updateLimit?: () => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const outlineColor = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.black,\n    },\n    theme.type\n  );\n\n  return {\n    positionRelative: css`\n      label: positionRelative;\n      position: relative;\n    `,\n    rowWithContext: css`\n      label: rowWithContext;\n      z-index: 1;\n      outline: 9999px solid\n        ${tinycolor(outlineColor as tinycolor.ColorInput)\n          .setAlpha(0.7)\n          .toRgbString()};\n    `,\n    horizontalScroll: css`\n      label: verticalScroll;\n      white-space: nowrap;\n    `,\n  };\n});\n\nclass UnThemedLogRowMessage extends PureComponent<Props> {\n  onContextToggle = (e: React.SyntheticEvent<HTMLElement>) => {\n    e.stopPropagation();\n    this.props.onToggleContext();\n  };\n\n  render() {\n    const {\n      highlighterExpressions,\n      row,\n      theme,\n      errors,\n      hasMoreContextRows,\n      updateLimit,\n      context,\n      contextIsOpen,\n      showContextToggle,\n      wrapLogMessage,\n      onToggleContext,\n    } = this.props;\n\n    const style = getLogRowStyles(theme, row.logLevel);\n    const { entry, hasAnsi, raw } = row;\n\n    const previewHighlights = highlighterExpressions && !_.isEqual(highlighterExpressions, row.searchWords);\n    const highlights = previewHighlights ? highlighterExpressions : row.searchWords;\n    const needsHighlighter = highlights && highlights.length > 0 && highlights[0] && highlights[0].length > 0;\n    const highlightClassName = previewHighlights\n      ? cx([style.logsRowMatchHighLight, style.logsRowMatchHighLightPreview])\n      : cx([style.logsRowMatchHighLight]);\n    const styles = getStyles(theme);\n\n    return (\n      <td className={style.logsRowMessage}>\n        <div className={cx(styles.positionRelative, { [styles.horizontalScroll]: !wrapLogMessage })}>\n          {contextIsOpen && context && (\n            <LogRowContext\n              row={row}\n              context={context}\n              errors={errors}\n              hasMoreContextRows={hasMoreContextRows}\n              onOutsideClick={onToggleContext}\n              onLoadMoreContext={() => {\n                if (updateLimit) {\n                  updateLimit();\n                }\n              }}\n            />\n          )}\n          <span className={cx(styles.positionRelative, { [styles.rowWithContext]: contextIsOpen })}>\n            {needsHighlighter ? (\n              <Highlighter\n                textToHighlight={entry}\n                searchWords={highlights}\n                findChunks={findHighlightChunksInText}\n                highlightClassName={highlightClassName}\n              />\n            ) : hasAnsi ? (\n              <LogMessageAnsi value={raw} />\n            ) : (\n              entry\n            )}\n          </span>\n          {showContextToggle?.(row) && (\n            <span onClick={this.onContextToggle} className={cx(style.context)}>\n              {contextIsOpen ? 'Hide' : 'Show'} context\n            </span>\n          )}\n        </div>\n      </td>\n    );\n  }\n}\n\nexport const LogRowMessage = withTheme(UnThemedLogRowMessage);\nLogRowMessage.displayName = 'LogRowMessage';\n","import React, { PureComponent } from 'react';\nimport {\n  Field,\n  LinkModel,\n  LogRowModel,\n  TimeZone,\n  DataQueryResponse,\n  GrafanaTheme,\n  dateTimeFormat,\n} from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\nimport { cx, css } from 'emotion';\n\nimport {\n  LogRowContextRows,\n  LogRowContextQueryErrors,\n  HasMoreContextRows,\n  LogRowContextProvider,\n  RowContextOptions,\n} from './LogRowContextProvider';\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { selectThemeVariant } from '../../themes/selectThemeVariant';\n\n//Components\nimport { LogDetails } from './LogDetails';\nimport { LogRowMessage } from './LogRowMessage';\nimport { LogLabels } from './LogLabels';\n\ninterface Props extends Themeable {\n  highlighterExpressions?: string[];\n  row: LogRowModel;\n  showDuplicates: boolean;\n  showLabels: boolean;\n  showTime: boolean;\n  wrapLogMessage: boolean;\n  timeZone: TimeZone;\n  allowDetails?: boolean;\n  getRows: () => LogRowModel[];\n  onClickFilterLabel?: (key: string, value: string) => void;\n  onClickFilterOutLabel?: (key: string, value: string) => void;\n  onContextClick?: () => void;\n  getRowContext: (row: LogRowModel, options?: RowContextOptions) => Promise<DataQueryResponse>;\n  getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n  showContextToggle?: (row?: LogRowModel) => boolean;\n}\n\ninterface State {\n  showContext: boolean;\n  showDetails: boolean;\n  hasHoverBackground: boolean;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const bgColor = selectThemeVariant({ light: theme.palette.gray7, dark: theme.palette.dark2 }, theme.type);\n  return {\n    topVerticalAlign: css`\n      label: topVerticalAlign;\n      vertical-align: top;\n      margin-top: -${theme.spacing.xs};\n      margin-left: -${theme.spacing.xxs};\n    `,\n    hoverBackground: css`\n      label: hoverBackground;\n      background-color: ${bgColor};\n    `,\n  };\n});\n/**\n * Renders a log line.\n *\n * When user hovers over it for a certain time, it lazily parses the log line.\n * Once a parser is found, it will determine fields, that will be highlighted.\n * When the user requests stats for a field, they will be calculated and rendered below the row.\n */\nclass UnThemedLogRow extends PureComponent<Props, State> {\n  state: State = {\n    showContext: false,\n    showDetails: false,\n    hasHoverBackground: false,\n  };\n\n  toggleContext = () => {\n    this.setState(state => {\n      return {\n        showContext: !state.showContext,\n      };\n    });\n  };\n\n  /**\n   * We are using onMouse events to change background of Log Details Table to hover-state-background when\n   * hovered over Log Row and vice versa. This can't be done with css because we use 2 separate table rows without common parent element.\n   */\n  addHoverBackground = () => {\n    this.setState({\n      hasHoverBackground: true,\n    });\n  };\n\n  clearHoverBackground = () => {\n    this.setState({\n      hasHoverBackground: false,\n    });\n  };\n\n  toggleDetails = () => {\n    if (this.props.allowDetails) {\n      return;\n    }\n    this.setState(state => {\n      return {\n        showDetails: !state.showDetails,\n      };\n    });\n  };\n\n  renderLogRow(\n    context?: LogRowContextRows,\n    errors?: LogRowContextQueryErrors,\n    hasMoreContextRows?: HasMoreContextRows,\n    updateLimit?: () => void\n  ) {\n    const {\n      getRows,\n      onClickFilterLabel,\n      onClickFilterOutLabel,\n      highlighterExpressions,\n      allowDetails,\n      row,\n      showDuplicates,\n      timeZone,\n      showContextToggle,\n      showLabels,\n      showTime,\n      wrapLogMessage,\n      theme,\n      getFieldLinks,\n    } = this.props;\n    const { showDetails, showContext, hasHoverBackground } = this.state;\n    const style = getLogRowStyles(theme, row.logLevel);\n    const styles = getStyles(theme);\n    const hoverBackground = cx(style.logsRow, { [styles.hoverBackground]: hasHoverBackground });\n\n    return (\n      <>\n        <tr\n          className={hoverBackground}\n          onMouseEnter={this.addHoverBackground}\n          onMouseLeave={this.clearHoverBackground}\n          onClick={this.toggleDetails}\n        >\n          {showDuplicates && (\n            <td className={style.logsRowDuplicates}>\n              {row.duplicates && row.duplicates > 0 ? `${row.duplicates + 1}x` : null}\n            </td>\n          )}\n          <td className={style.logsRowLevel} />\n          {!allowDetails && (\n            <td title={showDetails ? 'Hide log details' : 'See log details'} className={style.logsRowToggleDetails}>\n              <Icon className={styles.topVerticalAlign} name={showDetails ? 'angle-down' : 'angle-right'} />\n            </td>\n          )}\n          {showTime && <td className={style.logsRowLocalTime}>{dateTimeFormat(row.timeEpochMs, { timeZone })}</td>}\n          {showLabels && row.uniqueLabels && (\n            <td className={style.logsRowLabels}>\n              <LogLabels labels={row.uniqueLabels} />\n            </td>\n          )}\n          <LogRowMessage\n            highlighterExpressions={highlighterExpressions}\n            row={row}\n            getRows={getRows}\n            errors={errors}\n            hasMoreContextRows={hasMoreContextRows}\n            updateLimit={updateLimit}\n            context={context}\n            contextIsOpen={showContext}\n            showContextToggle={showContextToggle}\n            wrapLogMessage={wrapLogMessage}\n            onToggleContext={this.toggleContext}\n          />\n        </tr>\n        {this.state.showDetails && (\n          <LogDetails\n            className={hoverBackground}\n            onMouseEnter={this.addHoverBackground}\n            onMouseLeave={this.clearHoverBackground}\n            showDuplicates={showDuplicates}\n            getFieldLinks={getFieldLinks}\n            onClickFilterLabel={onClickFilterLabel}\n            onClickFilterOutLabel={onClickFilterOutLabel}\n            getRows={getRows}\n            row={row}\n          />\n        )}\n      </>\n    );\n  }\n\n  render() {\n    const { showContext } = this.state;\n\n    if (showContext) {\n      return (\n        <>\n          <LogRowContextProvider row={this.props.row} getRowContext={this.props.getRowContext}>\n            {({ result, errors, hasMoreContextRows, updateLimit }) => {\n              return <>{this.renderLogRow(result, errors, hasMoreContextRows, updateLimit)}</>;\n            }}\n          </LogRowContextProvider>\n        </>\n      );\n    }\n\n    return this.renderLogRow();\n  }\n}\n\nexport const LogRow = withTheme(UnThemedLogRow);\nLogRow.displayName = 'LogRow';\n","import React, { PureComponent } from 'react';\nimport memoizeOne from 'memoize-one';\nimport { TimeZone, LogsDedupStrategy, LogRowModel, Field, LinkModel } from '@grafana/data';\n\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\nimport { LogRow } from './LogRow';\nimport { RowContextOptions } from './LogRowContextProvider';\n\nexport const PREVIEW_LIMIT = 100;\nexport const RENDER_LIMIT = 500;\n\nexport interface Props extends Themeable {\n  logRows?: LogRowModel[];\n  deduplicatedRows?: LogRowModel[];\n  dedupStrategy: LogsDedupStrategy;\n  highlighterExpressions?: string[];\n  showContextToggle?: (row?: LogRowModel) => boolean;\n  showLabels: boolean;\n  showTime: boolean;\n  wrapLogMessage: boolean;\n  timeZone: TimeZone;\n  rowLimit?: number;\n  allowDetails?: boolean;\n  previewLimit?: number;\n  // Passed to fix problems with inactive scrolling in Logs Panel\n  // Can be removed when we unify scrolling for Panel and Explore\n  disableCustomHorizontalScroll?: boolean;\n  onClickFilterLabel?: (key: string, value: string) => void;\n  onClickFilterOutLabel?: (key: string, value: string) => void;\n  getRowContext?: (row: LogRowModel, options?: RowContextOptions) => Promise<any>;\n  getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n}\n\ninterface State {\n  renderAll: boolean;\n}\n\nclass UnThemedLogRows extends PureComponent<Props, State> {\n  renderAllTimer: number | null = null;\n\n  static defaultProps = {\n    previewLimit: PREVIEW_LIMIT,\n    rowLimit: RENDER_LIMIT,\n  };\n\n  state: State = {\n    renderAll: false,\n  };\n\n  componentDidMount() {\n    // Staged rendering\n    const { logRows, previewLimit } = this.props;\n    const rowCount = logRows ? logRows.length : 0;\n    // Render all right away if not too far over the limit\n    const renderAll = rowCount <= previewLimit! * 2;\n    if (renderAll) {\n      this.setState({ renderAll });\n    } else {\n      this.renderAllTimer = window.setTimeout(() => this.setState({ renderAll: true }), 2000);\n    }\n  }\n\n  componentWillUnmount() {\n    if (this.renderAllTimer) {\n      clearTimeout(this.renderAllTimer);\n    }\n  }\n\n  makeGetRows = memoizeOne((processedRows: LogRowModel[]) => {\n    return () => processedRows;\n  });\n\n  render() {\n    const {\n      dedupStrategy,\n      showContextToggle,\n      showLabels,\n      showTime,\n      wrapLogMessage,\n      logRows,\n      deduplicatedRows,\n      highlighterExpressions,\n      timeZone,\n      onClickFilterLabel,\n      onClickFilterOutLabel,\n      rowLimit,\n      theme,\n      allowDetails,\n      previewLimit,\n      getFieldLinks,\n      disableCustomHorizontalScroll,\n    } = this.props;\n    const { renderAll } = this.state;\n    const { logsRowsTable, logsRowsHorizontalScroll } = getLogRowStyles(theme);\n    const dedupedRows = deduplicatedRows ? deduplicatedRows : logRows;\n    const hasData = logRows && logRows.length > 0;\n    const dedupCount = dedupedRows\n      ? dedupedRows.reduce((sum, row) => (row.duplicates ? sum + row.duplicates : sum), 0)\n      : 0;\n    const showDuplicates = dedupStrategy !== LogsDedupStrategy.none && dedupCount > 0;\n\n    // For horizontal scrolling we can't use CustomScrollbar as it causes the problem with logs context - it is not visible\n    // for top log rows. Therefore we use CustomScrollbar only in LogsPanel and for Explore, we use custom css styling.\n    const horizontalScrollWindow = wrapLogMessage && !disableCustomHorizontalScroll ? '' : logsRowsHorizontalScroll;\n\n    // Staged rendering\n    const processedRows = dedupedRows ? dedupedRows : [];\n    const firstRows = processedRows.slice(0, previewLimit!);\n    const rowCount = Math.min(processedRows.length, rowLimit!);\n    const lastRows = processedRows.slice(previewLimit!, rowCount);\n\n    // React profiler becomes unusable if we pass all rows to all rows and their labels, using getter instead\n    const getRows = this.makeGetRows(processedRows);\n    const getRowContext = this.props.getRowContext ? this.props.getRowContext : () => Promise.resolve([]);\n\n    return (\n      <div className={horizontalScrollWindow}>\n        <table className={logsRowsTable}>\n          <tbody>\n            {hasData &&\n              firstRows.map((row, index) => (\n                <LogRow\n                  key={row.uid}\n                  getRows={getRows}\n                  getRowContext={getRowContext}\n                  highlighterExpressions={highlighterExpressions}\n                  row={row}\n                  showContextToggle={showContextToggle}\n                  showDuplicates={showDuplicates}\n                  showLabels={showLabels}\n                  showTime={showTime}\n                  wrapLogMessage={wrapLogMessage}\n                  timeZone={timeZone}\n                  allowDetails={allowDetails}\n                  onClickFilterLabel={onClickFilterLabel}\n                  onClickFilterOutLabel={onClickFilterOutLabel}\n                  getFieldLinks={getFieldLinks}\n                />\n              ))}\n            {hasData &&\n              renderAll &&\n              lastRows.map((row, index) => (\n                <LogRow\n                  key={row.uid}\n                  getRows={getRows}\n                  getRowContext={getRowContext}\n                  row={row}\n                  showContextToggle={showContextToggle}\n                  showDuplicates={showDuplicates}\n                  showLabels={showLabels}\n                  showTime={showTime}\n                  wrapLogMessage={wrapLogMessage}\n                  timeZone={timeZone}\n                  allowDetails={allowDetails}\n                  onClickFilterLabel={onClickFilterLabel}\n                  onClickFilterOutLabel={onClickFilterOutLabel}\n                  getFieldLinks={getFieldLinks}\n                />\n              ))}\n            {hasData && !renderAll && (\n              <tr>\n                <td colSpan={5}>Rendering {rowCount - previewLimit!} rows...</td>\n              </tr>\n            )}\n          </tbody>\n        </table>\n      </div>\n    );\n  }\n}\n\nexport const LogRows = withTheme(UnThemedLogRows);\nLogRows.displayName = 'LogsRows';\n","import React, { FC, ReactNode, PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\ninterface ToggleButtonGroupProps {\n  label?: string;\n  children: JSX.Element[];\n  transparent?: boolean;\n  width?: number;\n}\n\nexport class ToggleButtonGroup extends PureComponent<ToggleButtonGroupProps> {\n  render() {\n    const { children, label, transparent, width } = this.props;\n    const labelClasses = classNames('gf-form-label', {\n      'gf-form-label--transparent': transparent,\n      [`width-${width}`]: width,\n    });\n    const buttonGroupClasses = classNames('toggle-button-group', {\n      'toggle-button-group--transparent': transparent,\n      'toggle-button-group--padded': width, // Add extra padding to compensate for buttons border\n    });\n\n    return (\n      <div className=\"gf-form gf-form--align-center\">\n        {label && <label className={labelClasses}>{label}</label>}\n        <div className={buttonGroupClasses}>{children}</div>\n      </div>\n    );\n  }\n}\n\ninterface ToggleButtonProps {\n  onChange?: (value: any) => void;\n  selected?: boolean;\n  value: any;\n  className?: string;\n  children: ReactNode;\n  tooltip?: string;\n}\n\nexport const ToggleButton: FC<ToggleButtonProps> = ({\n  children,\n  selected,\n  className = '',\n  value = null,\n  tooltip,\n  onChange,\n}) => {\n  const onClick = (event: React.SyntheticEvent) => {\n    event.stopPropagation();\n    if (!selected && onChange) {\n      onChange(value);\n    }\n  };\n\n  const btnClassName = `btn ${className}${selected ? ' active' : ''}`;\n  const button = (\n    <button className={btnClassName} onClick={onClick}>\n      <span>{children}</span>\n    </button>\n  );\n\n  if (tooltip) {\n    return (\n      <Tooltip content={tooltip} placement=\"bottom\">\n        {button}\n      </Tooltip>\n    );\n  } else {\n    return button;\n  }\n};\n","import cloneDeep from 'lodash/cloneDeep';\nimport omit from 'lodash/omit';\n\nimport {\n  fieldReducers,\n  Threshold,\n  sortThresholds,\n  FieldConfig,\n  ReducerID,\n  ValueMapping,\n  MappingType,\n  VizOrientation,\n  PanelModel,\n  ReduceDataOptions,\n  ThresholdsMode,\n  ThresholdsConfig,\n  validateFieldConfig,\n  FieldColorMode,\n} from '@grafana/data';\n\nexport interface SingleStatBaseOptions {\n  reduceOptions: ReduceDataOptions;\n  orientation: VizOrientation;\n}\n\nconst optionsToKeep = ['reduceOptions', 'orientation'];\n\nexport function sharedSingleStatPanelChangedHandler(\n  panel: PanelModel<Partial<SingleStatBaseOptions>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) {\n  let options = panel.options;\n\n  panel.fieldConfig = panel.fieldConfig || {\n    defaults: {},\n    overrides: [],\n  };\n\n  // Migrating from angular singlestat\n  if (prevPluginId === 'singlestat' && prevOptions.angular) {\n    return migrateFromAngularSinglestat(panel, prevOptions);\n  }\n\n  for (const k of optionsToKeep) {\n    if (prevOptions.hasOwnProperty(k)) {\n      options[k] = cloneDeep(prevOptions[k]);\n    }\n  }\n\n  return options;\n}\n\nfunction migrateFromAngularSinglestat(panel: PanelModel<Partial<SingleStatBaseOptions>> | any, prevOptions: any) {\n  const prevPanel = prevOptions.angular;\n  const reducer = fieldReducers.getIfExists(prevPanel.valueName);\n  const options = {\n    fieldOptions: {\n      calcs: [reducer ? reducer.id : ReducerID.mean],\n    },\n    orientation: VizOrientation.Horizontal,\n  } as any;\n\n  const defaults: FieldConfig = {};\n\n  if (prevPanel.format) {\n    defaults.unit = prevPanel.format;\n  }\n\n  if (prevPanel.nullPointMode) {\n    defaults.nullValueMode = prevPanel.nullPointMode;\n  }\n\n  if (prevPanel.nullText) {\n    defaults.noValue = prevPanel.nullText;\n  }\n\n  if (prevPanel.decimals || prevPanel.decimals === 0) {\n    defaults.decimals = prevPanel.decimals;\n  }\n\n  // Convert thresholds and color values\n  if (prevPanel.thresholds && prevPanel.colors) {\n    const levels = prevPanel.thresholds.split(',').map((strVale: string) => {\n      return Number(strVale.trim());\n    });\n\n    // One more color than threshold\n    const thresholds: Threshold[] = [];\n    for (const color of prevPanel.colors) {\n      const idx = thresholds.length - 1;\n      if (idx >= 0) {\n        thresholds.push({ value: levels[idx], color });\n      } else {\n        thresholds.push({ value: -Infinity, color });\n      }\n    }\n\n    defaults.thresholds = {\n      mode: ThresholdsMode.Absolute,\n      steps: thresholds,\n    };\n  }\n\n  // Convert value mappings\n  const mappings = convertOldAngularValueMapping(prevPanel);\n  if (mappings && mappings.length) {\n    defaults.mappings = mappings;\n  }\n\n  if (prevPanel.gauge && prevPanel.gauge.show) {\n    defaults.min = prevPanel.gauge.minValue;\n    defaults.max = prevPanel.gauge.maxValue;\n  }\n\n  panel.fieldConfig.defaults = defaults;\n\n  return options;\n}\n\nexport function sharedSingleStatMigrationHandler(panel: PanelModel<SingleStatBaseOptions>): SingleStatBaseOptions {\n  if (!panel.options) {\n    // This happens on the first load or when migrating from angular\n    return {} as any;\n  }\n\n  const previousVersion = parseFloat(panel.pluginVersion || '6.1');\n  let options = panel.options as any;\n\n  if (previousVersion < 6.2) {\n    options = migrateFromValueOptions(options);\n  }\n\n  if (previousVersion < 6.3) {\n    options = moveThresholdsAndMappingsToField(options);\n  }\n\n  const { fieldOptions } = options;\n\n  if (previousVersion < 6.6 && fieldOptions) {\n    // discard the old `override` options and enter an empty array\n    if (fieldOptions && fieldOptions.override) {\n      const { override, ...rest } = options.fieldOptions;\n      options = {\n        ...options,\n        fieldOptions: {\n          ...rest,\n          overrides: [],\n        },\n      };\n    }\n\n    // Move thresholds to steps\n    let thresholds = fieldOptions?.defaults?.thresholds;\n    if (thresholds) {\n      delete fieldOptions.defaults.thresholds;\n    } else {\n      thresholds = fieldOptions?.thresholds;\n      delete fieldOptions.thresholds;\n    }\n\n    if (thresholds) {\n      fieldOptions.defaults.thresholds = {\n        mode: ThresholdsMode.Absolute,\n        steps: thresholds,\n      };\n    }\n\n    // Migrate color from simple string to a mode\n    const { defaults } = fieldOptions;\n    if (defaults.color && typeof defaults.color === 'string') {\n      defaults.color = {\n        mode: FieldColorMode.Fixed,\n        fixedColor: defaults.color,\n      };\n    }\n\n    validateFieldConfig(defaults);\n  }\n\n  if (previousVersion < 7.0) {\n    panel.fieldConfig = panel.fieldConfig || { defaults: {}, overrides: [] };\n    panel.fieldConfig = {\n      defaults:\n        fieldOptions && fieldOptions.defaults\n          ? { ...panel.fieldConfig.defaults, ...fieldOptions.defaults }\n          : panel.fieldConfig.defaults,\n      overrides:\n        fieldOptions && fieldOptions.overrides\n          ? [...panel.fieldConfig.overrides, ...fieldOptions.overrides]\n          : panel.fieldConfig.overrides,\n    };\n\n    if (fieldOptions) {\n      options.reduceOptions = {\n        values: fieldOptions.values,\n        limit: fieldOptions.limit,\n        calcs: fieldOptions.calcs,\n      };\n    }\n\n    delete options.fieldOptions;\n  }\n\n  if (previousVersion < 7.1) {\n    // move title to displayName\n    const oldTitle = (panel.fieldConfig.defaults as any).title;\n    if (oldTitle !== undefined && oldTitle !== null) {\n      panel.fieldConfig.defaults.displayName = oldTitle;\n      delete (panel.fieldConfig.defaults as any).title;\n    }\n  }\n\n  return options as SingleStatBaseOptions;\n}\n\nexport function moveThresholdsAndMappingsToField(old: any) {\n  const { fieldOptions } = old;\n\n  if (!fieldOptions) {\n    return old;\n  }\n\n  const { mappings, ...rest } = old.fieldOptions;\n\n  let thresholds: ThresholdsConfig | undefined = undefined;\n  if (old.thresholds) {\n    thresholds = {\n      mode: ThresholdsMode.Absolute,\n      steps: migrateOldThresholds(old.thresholds)!,\n    };\n  }\n\n  return {\n    ...old,\n    fieldOptions: {\n      ...rest,\n      defaults: {\n        ...fieldOptions.defaults,\n        mappings,\n        thresholds,\n      },\n    },\n  };\n}\n\n/*\n * Moves valueMappings and thresholds from root to new fieldOptions object\n * Renames valueOptions to to defaults and moves it under fieldOptions\n */\nexport function migrateFromValueOptions(old: any) {\n  const { valueOptions } = old;\n  if (!valueOptions) {\n    return old;\n  }\n\n  const fieldOptions: any = {};\n  const fieldDefaults: any = {};\n\n  fieldOptions.mappings = old.valueMappings;\n  fieldOptions.thresholds = old.thresholds;\n  fieldOptions.defaults = fieldDefaults;\n\n  fieldDefaults.unit = valueOptions.unit;\n  fieldDefaults.decimals = valueOptions.decimals;\n\n  // Make sure the stats have a valid name\n  if (valueOptions.stat) {\n    const reducer = fieldReducers.get(valueOptions.stat);\n    if (reducer) {\n      fieldOptions.calcs = [reducer.id];\n    }\n  }\n\n  fieldDefaults.min = old.minValue;\n  fieldDefaults.max = old.maxValue;\n\n  const newOptions = {\n    ...old,\n    fieldOptions,\n  };\n\n  return omit(newOptions, 'valueMappings', 'thresholds', 'valueOptions', 'minValue', 'maxValue');\n}\n\nexport function migrateOldThresholds(thresholds?: any[]): Threshold[] | undefined {\n  if (!thresholds || !thresholds.length) {\n    return undefined;\n  }\n  const copy = thresholds.map(t => {\n    return {\n      // Drops 'index'\n      value: t.value === null ? -Infinity : t.value,\n      color: t.color,\n    };\n  });\n  sortThresholds(copy);\n  copy[0].value = -Infinity;\n  return copy;\n}\n\n/**\n * Convert the angular single stat mapping to new react style\n */\nexport function convertOldAngularValueMapping(panel: any): ValueMapping[] {\n  const mappings: ValueMapping[] = [];\n\n  // Guess the right type based on options\n  let mappingType = panel.mappingType;\n  if (!panel.mappingType) {\n    if (panel.valueMaps && panel.valueMaps.length) {\n      mappingType = 1;\n    } else if (panel.rangeMaps && panel.rangeMaps.length) {\n      mappingType = 2;\n    }\n  }\n\n  // check value to text mappings if its enabled\n  if (mappingType === 1) {\n    for (let i = 0; i < panel.valueMaps.length; i++) {\n      const map = panel.valueMaps[i];\n      mappings.push({\n        ...map,\n        id: i, // used for order\n        type: MappingType.ValueToText,\n      });\n    }\n  } else if (mappingType === 2) {\n    for (let i = 0; i < panel.rangeMaps.length; i++) {\n      const map = panel.rangeMaps[i];\n      mappings.push({\n        ...map,\n        id: i, // used for order\n        type: MappingType.RangeToText,\n      });\n    }\n  }\n\n  return mappings;\n}\n","import React from 'react';\nimport { Themeable } from '../../types/theme';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { stylesFactory } from '../../themes';\n\nexport interface CallToActionCardProps extends Themeable {\n  message?: string | JSX.Element;\n  callToActionElement: JSX.Element;\n  footer?: string | JSX.Element;\n  className?: string;\n}\n\nconst getCallToActionCardStyles = stylesFactory((theme: GrafanaTheme) => ({\n  wrapper: css`\n    label: call-to-action-card;\n    padding: ${theme.spacing.lg};\n    background: ${theme.colors.bg2};\n    border-radius: ${theme.border.radius.md};\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n  `,\n  message: css`\n    margin-bottom: ${theme.spacing.lg};\n    font-style: italic;\n  `,\n  footer: css`\n    margin-top: ${theme.spacing.lg};\n  `,\n}));\n\nexport const CallToActionCard: React.FunctionComponent<CallToActionCardProps> = ({\n  message,\n  callToActionElement,\n  footer,\n  theme,\n  className,\n}) => {\n  const css = getCallToActionCardStyles(theme);\n\n  return (\n    <div className={cx([css.wrapper, className])}>\n      {message && <div className={css.message}>{message}</div>}\n      {callToActionElement}\n      {footer && <div className={css.footer}>{footer}</div>}\n    </div>\n  );\n};\n","import React, { useState } from 'react';\nimport { ContextMenu, ContextMenuGroup } from '../ContextMenu/ContextMenu';\n\ninterface WithContextMenuProps {\n  children: (props: { openMenu: React.MouseEventHandler<HTMLElement> }) => JSX.Element;\n  getContextMenuItems: () => ContextMenuGroup[];\n}\n\nexport const WithContextMenu: React.FC<WithContextMenuProps> = ({ children, getContextMenuItems }) => {\n  const [isMenuOpen, setIsMenuOpen] = useState(false);\n  const [menuPosition, setMenuPositon] = useState({ x: 0, y: 0 });\n\n  return (\n    <>\n      {children({\n        openMenu: e => {\n          setIsMenuOpen(true);\n          setMenuPositon({\n            x: e.pageX,\n            y: e.pageY,\n          });\n        },\n      })}\n\n      {isMenuOpen && (\n        <ContextMenu\n          onClose={() => setIsMenuOpen(false)}\n          x={menuPosition.x}\n          y={menuPosition.y}\n          items={getContextMenuItems()}\n        />\n      )}\n    </>\n  );\n};\n","import React from 'react';\nimport { WithContextMenu } from '../ContextMenu/WithContextMenu';\nimport { LinkModel } from '@grafana/data';\nimport { linkModelToContextMenuItems } from '../../utils/dataLinks';\nimport { css } from 'emotion';\n\ninterface DataLinksContextMenuProps {\n  children: (props: DataLinksContextMenuApi) => JSX.Element;\n  links: () => LinkModel[];\n}\n\nexport interface DataLinksContextMenuApi {\n  openMenu?: React.MouseEventHandler<HTMLElement>;\n  targetClassName?: string;\n}\n\nexport const DataLinksContextMenu: React.FC<DataLinksContextMenuProps> = ({ children, links }) => {\n  const getDataLinksContextMenuItems = () => {\n    return [{ items: linkModelToContextMenuItems(links), label: 'Data links' }];\n  };\n\n  // Use this class name (exposed via render prop) to add context menu indicator to the click target of the visualization\n  const targetClassName = css`\n    cursor: context-menu;\n  `;\n\n  return (\n    <WithContextMenu getContextMenuItems={getDataLinksContextMenuItems}>\n      {({ openMenu }) => {\n        return children({ openMenu, targetClassName });\n      }}\n    </WithContextMenu>\n  );\n};\n","export default __webpack_public_path__ + \"static/img/panelArt_dark.f37f2c21.svg\";","export default __webpack_public_path__ + \"static/img/panelArt_light.c5c6c081.svg\";","import React from 'react';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { IconButton } from '../IconButton/IconButton';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport panelArtDark from './panelArt_dark.svg';\nimport panelArtLight from './panelArt_light.svg';\n\nexport interface InfoBoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n  children: React.ReactNode;\n  title?: string | JSX.Element;\n  url?: string;\n  urlTitle?: string;\n  branded?: boolean;\n  onDismiss?: () => void;\n}\n\n/**\n * This is a simple InfoBox component, the api is not considered stable yet and will likely see breaking changes\n * in future minor releases.\n * @Alpha\n */\nexport const InfoBox = React.memo(\n  React.forwardRef<HTMLDivElement, InfoBoxProps>(\n    ({ title, className, children, branded, url, urlTitle, onDismiss, ...otherProps }, ref) => {\n      const theme = useTheme();\n      const styles = getInfoBoxStyles(theme);\n      const wrapperClassName = branded ? cx(styles.wrapperBranded, className) : cx(styles.wrapper, className);\n\n      return (\n        <div className={wrapperClassName} {...otherProps} ref={ref}>\n          <div>\n            <HorizontalGroup justify={'space-between'} align={'flex-start'}>\n              <div>{typeof title === 'string' ? <h4>{title}</h4> : title}</div>\n              {onDismiss && <IconButton name={'times'} onClick={onDismiss} />}\n            </HorizontalGroup>\n          </div>\n          <div>{children}</div>\n          {url && (\n            <a href={url} className={styles.docsLink} target=\"_blank\">\n              <Icon name=\"book\" /> {urlTitle || 'Read more'}\n            </a>\n          )}\n        </div>\n      );\n    }\n  )\n);\n\nconst getInfoBoxStyles = stylesFactory((theme: GrafanaTheme) => ({\n  wrapper: css`\n    position: relative;\n    padding: ${theme.spacing.md};\n    background-color: ${theme.colors.bg2};\n    border-top: 3px solid ${theme.palette.blue80};\n    margin-bottom: ${theme.spacing.md};\n    flex-grow: 1;\n\n    ul {\n      padding-left: ${theme.spacing.lg};\n    }\n\n    code {\n      @include font-family-monospace();\n      font-size: ${theme.typography.size.sm};\n      background-color: ${theme.colors.bg1};\n      color: ${theme.colors.text};\n      border: 1px solid ${theme.colors.border2};\n      border-radius: 4px;\n    }\n\n    p:last-child {\n      margin-bottom: 0;\n    }\n\n    &--max-lg {\n      max-width: ${theme.breakpoints.lg};\n    }\n  `,\n  wrapperBranded: css`\n    padding: ${theme.spacing.md};\n    border-radius: ${theme.border.radius.md};\n    position: relative;\n    box-shadow: 0 0 30px 10px rgba(0, 0, 0, ${theme.isLight ? 0.05 : 0.2});\n    z-index: 0;\n\n    &:before {\n      content: '';\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background-image: url(${theme.isLight ? panelArtLight : panelArtDark});\n      border-radius: ${theme.border.radius.md};\n      background-position: 50% 50%;\n      background-size: cover;\n      filter: saturate(80%);\n      z-index: -1;\n    }\n\n    p:last-child {\n      margin-bottom: 0;\n    }\n  `,\n  docsLink: css`\n    display: inline-block;\n    margin-top: ${theme.spacing.lg};\n    font-size: ${theme.typography.size.sm};\n  `,\n}));\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { IconName } from '../../types';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { getColorFromHexRgbOrName, GrafanaTheme } from '@grafana/data';\nimport tinycolor from 'tinycolor2';\nimport { css } from 'emotion';\nimport { HorizontalGroup } from '..';\n\nexport type BadgeColor = 'blue' | 'red' | 'green' | 'orange' | 'purple';\n\nexport interface BadgeProps {\n  text: string;\n  color: BadgeColor;\n  icon?: IconName;\n  tooltip?: string;\n}\n\nexport const Badge = React.memo<BadgeProps>(({ icon, color, text, tooltip }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme, color);\n  const badge = (\n    <div className={styles.wrapper}>\n      <HorizontalGroup align=\"center\" spacing=\"xs\">\n        {icon && <Icon name={icon} size=\"sm\" />}\n        <span>{text}</span>\n      </HorizontalGroup>\n    </div>\n  );\n\n  return tooltip ? (\n    <Tooltip content={tooltip} placement=\"auto\">\n      {badge}\n    </Tooltip>\n  ) : (\n    badge\n  );\n});\n\nBadge.displayName = 'Badge';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, color: BadgeColor) => {\n  let sourceColor = getColorFromHexRgbOrName(color);\n  let borderColor = '';\n  let bgColor = '';\n  let textColor = '';\n\n  if (theme.isDark) {\n    bgColor = tinycolor(sourceColor)\n      .darken(38)\n      .toString();\n    borderColor = tinycolor(sourceColor)\n      .darken(25)\n      .toString();\n    textColor = tinycolor(sourceColor)\n      .lighten(45)\n      .toString();\n  } else {\n    bgColor = tinycolor(sourceColor)\n      .lighten(30)\n      .toString();\n    borderColor = tinycolor(sourceColor)\n      .lighten(15)\n      .toString();\n    textColor = tinycolor(sourceColor)\n      .darken(40)\n      .toString();\n  }\n\n  return {\n    wrapper: css`\n      font-size: ${theme.typography.size.sm};\n      display: inline-flex;\n      padding: 1px 4px;\n      border-radius: 3px;\n      margin-top: 6px;\n      background: ${bgColor};\n      border: 1px solid ${borderColor};\n      color: ${textColor};\n\n      > span {\n        position: relative;\n        top: 1px;\n        margin-left: 2px;\n      }\n    `,\n  };\n});\n","import React from 'react';\nimport { InfoBox, InfoBoxProps } from './InfoBox';\nimport { FeatureState, GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Badge, BadgeProps } from '../Badge/Badge';\nimport { css } from 'emotion';\n\ninterface FeatureInfoBox extends Omit<InfoBoxProps, 'branded' | 'title' | 'urlTitle'> {\n  title: string;\n  featureState?: FeatureState;\n}\n\nexport const FeatureInfoBox = React.memo(\n  React.forwardRef<HTMLDivElement, FeatureInfoBox>(({ title, featureState, ...otherProps }, ref) => {\n    const theme = useTheme();\n    const styles = getFeatureInfoBoxStyles(theme);\n\n    const titleEl = featureState ? (\n      <>\n        <div className={styles.badge}>\n          <FeatureBadge featureState={featureState} />\n        </div>\n        <h3>{title}</h3>\n      </>\n    ) : (\n      <h3>{title}</h3>\n    );\n    return <InfoBox branded title={titleEl} urlTitle=\"Read documentation\" {...otherProps} />;\n  })\n);\n\nconst getFeatureInfoBoxStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    badge: css`\n      margin-bottom: ${theme.spacing.sm};\n    `,\n  };\n});\n\ninterface FeatureBadgeProps {\n  featureState: FeatureState;\n}\n\nexport const FeatureBadge: React.FC<FeatureBadgeProps> = ({ featureState }) => {\n  const display = getPanelStateBadgeDisplayModel(featureState);\n  return <Badge text={display.text} color={display.color} icon={display.icon} />;\n};\n\nfunction getPanelStateBadgeDisplayModel(featureState: FeatureState): BadgeProps {\n  switch (featureState) {\n    case FeatureState.alpha:\n      return {\n        text: 'Alpha',\n        icon: 'exclamation-triangle',\n        color: 'orange',\n      };\n  }\n\n  return {\n    text: 'Beta',\n    icon: 'rocket',\n    color: 'blue',\n  };\n}\n","import React, { FunctionComponent } from 'react';\nimport { ErrorBoundaryApi } from './ErrorBoundary';\nimport { stylesFactory } from '../../themes';\nimport { css } from 'emotion';\n\nconst getStyles = stylesFactory(() => {\n  return css`\n    width: 500px;\n    margin: 64px auto;\n  `;\n});\n\nexport interface Props extends ErrorBoundaryApi {\n  title: string;\n}\n\nexport const ErrorWithStack: FunctionComponent<Props> = ({ error, errorInfo, title }) => (\n  <div className={getStyles()}>\n    <h2>{title}</h2>\n    <details style={{ whiteSpace: 'pre-wrap' }}>\n      {error && error.toString()}\n      <br />\n      {errorInfo && errorInfo.componentStack}\n    </details>\n  </div>\n);\n\nErrorWithStack.displayName = 'ErrorWithStack';\n","import React, { PureComponent, ReactNode } from 'react';\nimport { Alert } from '../Alert/Alert';\nimport { ErrorWithStack } from './ErrorWithStack';\n\nexport interface ErrorInfo {\n  componentStack: string;\n}\n\nexport interface ErrorBoundaryApi {\n  error: Error | null;\n  errorInfo: ErrorInfo | null;\n}\n\ninterface Props {\n  children: (r: ErrorBoundaryApi) => ReactNode;\n}\n\ninterface State {\n  error: Error | null;\n  errorInfo: ErrorInfo | null;\n}\n\nexport class ErrorBoundary extends PureComponent<Props, State> {\n  readonly state: State = {\n    error: null,\n    errorInfo: null,\n  };\n\n  componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n    this.setState({\n      error: error,\n      errorInfo: errorInfo,\n    });\n  }\n\n  render() {\n    const { children } = this.props;\n    const { error, errorInfo } = this.state;\n\n    return children({\n      error,\n      errorInfo,\n    });\n  }\n}\n\ninterface WithAlertBoxProps {\n  title?: string;\n  children: ReactNode;\n  style?: 'page' | 'alertbox';\n}\n\nexport class ErrorBoundaryAlert extends PureComponent<WithAlertBoxProps> {\n  static defaultProps: Partial<WithAlertBoxProps> = {\n    title: 'An unexpected error happened',\n    style: 'alertbox',\n  };\n\n  render() {\n    const { title, children, style } = this.props;\n\n    return (\n      <ErrorBoundary>\n        {({ error, errorInfo }) => {\n          if (!errorInfo) {\n            return children;\n          }\n\n          if (style === 'alertbox') {\n            return (\n              <Alert title={title || ''}>\n                <details style={{ whiteSpace: 'pre-wrap' }}>\n                  {error && error.toString()}\n                  <br />\n                  {errorInfo.componentStack}\n                </details>\n              </Alert>\n            );\n          }\n\n          return <ErrorWithStack title={title || ''} error={error} errorInfo={errorInfo} />;\n        }}\n      </ErrorBoundary>\n    );\n  }\n}\n","import React, { FC, useContext } from 'react';\nimport { css, cx } from 'emotion';\nimport { ThemeContext } from '../../index';\nimport { PluginState } from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\n\ninterface Props {\n  state?: PluginState;\n  text?: string;\n  className?: string;\n}\n\nexport const AlphaNotice: FC<Props> = ({ state, text, className }) => {\n  const tooltipContent = text || 'This feature is a work in progress and updates may include breaking changes';\n  const theme = useContext(ThemeContext);\n\n  const styles = cx(\n    className,\n    css`\n      background: linear-gradient(to bottom, ${theme.palette.blue85}, ${theme.palette.blue77});\n      color: ${theme.palette.gray7};\n      white-space: nowrap;\n      border-radius: 3px;\n      text-shadow: none;\n      font-size: 13px;\n      padding: 4px 8px;\n      cursor: help;\n      display: inline-block;\n    `\n  );\n\n  return (\n    <div className={styles} title={tooltipContent}>\n      <Icon name=\"exclamation-triangle\" /> {state}\n    </div>\n  );\n};\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { FormLabel } from '../FormLabel/FormLabel';\nimport { PopoverContent } from '../Tooltip/Tooltip';\nimport { cx } from 'emotion';\n\nexport interface Props extends InputHTMLAttributes<HTMLInputElement> {\n  label: string;\n  tooltip?: PopoverContent;\n  labelWidth?: number;\n  // If null no width will be specified not even default one\n  inputWidth?: number | null;\n  inputEl?: React.ReactNode;\n}\n\nconst defaultProps = {\n  labelWidth: 6,\n  inputWidth: 12,\n};\n\n/**\n * Default form field including label used in Grafana UI. Default input element is simple <input />. You can also pass\n * custom inputEl if required in which case inputWidth and inputProps are ignored.\n */\nexport const FormField: FunctionComponent<Props> = ({\n  label,\n  tooltip,\n  labelWidth,\n  inputWidth,\n  inputEl,\n  className,\n  ...inputProps\n}) => {\n  return (\n    <div className={cx('form-field', className)}>\n      <FormLabel width={labelWidth} tooltip={tooltip}>\n        {label}\n      </FormLabel>\n      {inputEl || (\n        <input type=\"text\" className={`gf-form-input ${inputWidth ? `width-${inputWidth}` : ''}`} {...inputProps} />\n      )}\n    </div>\n  );\n};\n\nFormField.displayName = 'FormField';\nFormField.defaultProps = defaultProps;\n","import omit from 'lodash/omit';\nimport React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { FormField } from '../FormField/FormField';\nimport { Button } from '../Button/Button';\nimport { css, cx } from 'emotion';\n\nexport interface Props extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onReset'> {\n  // Function to use when reset is clicked. Means you have to reset the input value yourself as this is  uncontrolled\n  // component (or do something else if required).\n  onReset: (event: React.SyntheticEvent<HTMLButtonElement>) => void;\n  isConfigured: boolean;\n\n  label?: string;\n  tooltip?: string;\n  labelWidth?: number;\n  inputWidth?: number;\n  // Placeholder of the input field when in non configured state.\n  placeholder?: string;\n}\n\nconst getSecretFormFieldStyles = () => {\n  return {\n    noRadiusInput: css`\n      border-bottom-right-radius: 0 !important;\n      border-top-right-radius: 0 !important;\n    `,\n    noRadiusButton: css`\n      border-bottom-left-radius: 0 !important;\n      border-top-left-radius: 0 !important;\n    `,\n  };\n};\n/**\n * Form field that has 2 states configured and not configured. If configured it will not show its contents and adds\n * a reset button that will clear the input and makes it accessible. In non configured state it behaves like normal\n * form field. This is used for passwords or anything that is encrypted on the server and is later returned encrypted\n * to the user (like datasource passwords).\n */\nexport const SecretFormField: FunctionComponent<Props> = ({\n  label = 'Password',\n  labelWidth,\n  inputWidth = 12,\n  onReset,\n  isConfigured,\n  tooltip,\n  placeholder = 'Password',\n  ...inputProps\n}: Props) => {\n  const styles = getSecretFormFieldStyles();\n  return (\n    <FormField\n      label={label!}\n      tooltip={tooltip!}\n      labelWidth={labelWidth}\n      inputEl={\n        isConfigured ? (\n          <>\n            <input\n              type=\"text\"\n              className={cx(`gf-form-input width-${inputWidth! - 2}`, styles.noRadiusInput)}\n              disabled={true}\n              value=\"configured\"\n              {...omit(inputProps, 'value')}\n            />\n            <Button onClick={onReset} variant=\"secondary\">\n              Reset\n            </Button>\n          </>\n        ) : (\n          <input\n            type=\"password\"\n            className={`gf-form-input width-${inputWidth}`}\n            placeholder={placeholder}\n            {...inputProps}\n          />\n        )\n      }\n    />\n  );\n};\n\nSecretFormField.displayName = 'SecretFormField';\n","import React from 'react';\nimport { HttpSettingsProps } from './types';\nimport { FormField } from '../FormField/FormField';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\n\nexport const BasicAuthSettings: React.FC<HttpSettingsProps> = ({ dataSourceConfig, onChange }) => {\n  const password = dataSourceConfig.secureJsonData ? dataSourceConfig.secureJsonData.basicAuthPassword : '';\n\n  const onPasswordReset = () => {\n    onChange({\n      ...dataSourceConfig,\n      basicAuthPassword: '',\n      secureJsonData: {\n        ...dataSourceConfig.secureJsonData,\n        basicAuthPassword: '',\n      },\n      secureJsonFields: {\n        ...dataSourceConfig.secureJsonFields,\n        basicAuthPassword: false,\n      },\n    });\n  };\n\n  const onPasswordChange = (event: React.SyntheticEvent<HTMLInputElement>) => {\n    onChange({\n      ...dataSourceConfig,\n      secureJsonData: {\n        ...dataSourceConfig.secureJsonData,\n        basicAuthPassword: event.currentTarget.value,\n      },\n    });\n  };\n\n  return (\n    <>\n      <div className=\"gf-form\">\n        <FormField\n          label=\"User\"\n          labelWidth={10}\n          inputWidth={18}\n          placeholder=\"user\"\n          value={dataSourceConfig.basicAuthUser}\n          onChange={event => onChange({ ...dataSourceConfig, basicAuthUser: event.currentTarget.value })}\n        />\n      </div>\n      <div className=\"gf-form\">\n        <SecretFormField\n          isConfigured={\n            !!dataSourceConfig.basicAuthPassword ||\n            !!(dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.basicAuthPassword)\n          }\n          value={password || ''}\n          inputWidth={18}\n          labelWidth={10}\n          onReset={onPasswordReset}\n          onChange={onPasswordChange}\n        />\n      </div>\n    </>\n  );\n};\n","import React from 'react';\nimport { HttpSettingsBaseProps } from './types';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\n\nexport const HttpProxySettings: React.FC<HttpSettingsBaseProps> = ({ dataSourceConfig, onChange }) => {\n  return (\n    <>\n      <div className=\"gf-form-inline\">\n        <Switch\n          label=\"TLS Client Auth\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.tlsAuth || false}\n          onChange={event => onChange({ ...dataSourceConfig.jsonData, tlsAuth: event!.currentTarget.checked })}\n        />\n\n        <Switch\n          label=\"With CA Cert\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.tlsAuthWithCACert || false}\n          onChange={event =>\n            onChange({ ...dataSourceConfig.jsonData, tlsAuthWithCACert: event!.currentTarget.checked })\n          }\n          tooltip=\"Needed for verifying self-signed TLS Certs\"\n        />\n      </div>\n      <div className=\"gf-form-inline\">\n        <Switch\n          label=\"Skip TLS Verify\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.tlsSkipVerify || false}\n          onChange={event => onChange({ ...dataSourceConfig.jsonData, tlsSkipVerify: event!.currentTarget.checked })}\n        />\n      </div>\n      <div className=\"gf-form-inline\">\n        <Switch\n          label=\"Forward OAuth Identity\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.oauthPassThru || false}\n          onChange={event => onChange({ ...dataSourceConfig.jsonData, oauthPassThru: event!.currentTarget.checked })}\n          tooltip=\"Forward the user's upstream OAuth identity to the data source (Their access token gets passed along).\"\n        />\n      </div>\n    </>\n  );\n};\n","import React, { ChangeEvent, MouseEvent, FC } from 'react';\n\ninterface Props {\n  label: string;\n  hasCert: boolean;\n  placeholder: string;\n\n  onChange: (event: ChangeEvent<HTMLTextAreaElement>) => void;\n  onClick: (event: MouseEvent<HTMLAnchorElement>) => void;\n}\n\nexport const CertificationKey: FC<Props> = ({ hasCert, label, onChange, onClick, placeholder }) => {\n  return (\n    <div className=\"gf-form-inline\">\n      <div className=\"gf-form gf-form--v-stretch\">\n        <label className=\"gf-form-label width-7\">{label}</label>\n      </div>\n      {!hasCert && (\n        <div className=\"gf-form gf-form--grow\">\n          <textarea\n            rows={7}\n            className=\"gf-form-input gf-form-textarea\"\n            onChange={onChange}\n            placeholder={placeholder}\n            required\n          />\n        </div>\n      )}\n\n      {hasCert && (\n        <div className=\"gf-form\">\n          <input type=\"text\" className=\"gf-form-input max-width-12\" disabled value=\"configured\" />\n          <a className=\"btn btn-secondary gf-form-btn\" onClick={onClick}>\n            reset\n          </a>\n        </div>\n      )}\n    </div>\n  );\n};\n","import React from 'react';\nimport { KeyValue } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\nimport { CertificationKey } from './CertificationKey';\nimport { HttpSettingsBaseProps } from './types';\n\nexport const TLSAuthSettings: React.FC<HttpSettingsBaseProps> = ({ dataSourceConfig, onChange }) => {\n  const hasTLSCACert = dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.tlsCACert;\n  const hasTLSClientCert = dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.tlsClientCert;\n  const hasTLSClientKey = dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.tlsClientKey;\n\n  const onResetClickFactory = (field: string) => (event: React.MouseEvent<HTMLAnchorElement>) => {\n    event.preventDefault();\n    const newSecureJsonFields: KeyValue<boolean> = { ...dataSourceConfig.secureJsonFields };\n    newSecureJsonFields[field] = false;\n    onChange({\n      ...dataSourceConfig,\n      secureJsonFields: newSecureJsonFields,\n    });\n  };\n\n  const onCertificateChangeFactory = (field: string) => (event: React.SyntheticEvent<HTMLTextAreaElement>) => {\n    const newSecureJsonData = { ...dataSourceConfig.secureJsonData };\n    newSecureJsonData[field] = event.currentTarget.value;\n\n    onChange({\n      ...dataSourceConfig,\n      secureJsonData: newSecureJsonData,\n    });\n  };\n\n  return (\n    <div className=\"gf-form-group\">\n      <div\n        className={cx(\n          'gf-form',\n          css`\n            align-items: baseline;\n          `\n        )}\n      >\n        <h6>TLS Auth Details</h6>\n        <Tooltip\n          placement=\"right-end\"\n          content=\"TLS Certs are encrypted and stored in the Grafana database.\"\n          theme=\"info\"\n        >\n          <div className=\"gf-form-help-icon gf-form-help-icon--right-normal\">\n            <Icon name=\"info-circle\" size=\"xs\" style={{ marginLeft: '10px' }} />\n          </div>\n        </Tooltip>\n      </div>\n      <div>\n        {dataSourceConfig.jsonData.tlsAuthWithCACert && (\n          <CertificationKey\n            hasCert={!!hasTLSCACert}\n            onChange={onCertificateChangeFactory('tlsCACert')}\n            placeholder=\"Begins with -----BEGIN CERTIFICATE-----\"\n            label=\"CA Cert\"\n            onClick={onResetClickFactory('tlsCACert')}\n          />\n        )}\n\n        {dataSourceConfig.jsonData.tlsAuth && (\n          <>\n            <CertificationKey\n              hasCert={!!hasTLSClientCert}\n              label=\"Client Cert\"\n              onChange={onCertificateChangeFactory('tlsClientCert')}\n              placeholder=\"Begins with -----BEGIN CERTIFICATE-----\"\n              onClick={onResetClickFactory('tlsClientCert')}\n            />\n\n            <CertificationKey\n              hasCert={!!hasTLSClientKey}\n              label=\"Client Key\"\n              placeholder=\"Begins with -----BEGIN RSA PRIVATE KEY-----\"\n              onChange={onCertificateChangeFactory('tlsClientKey')}\n              onClick={onResetClickFactory('tlsClientKey')}\n            />\n          </>\n        )}\n      </div>\n    </div>\n  );\n};\n","import React, { PureComponent } from 'react';\nimport { css } from 'emotion';\nimport uniqueId from 'lodash/uniqueId';\nimport { DataSourceSettings } from '@grafana/data';\nimport { Button } from '../Button';\nimport { FormField } from '../FormField/FormField';\nimport { Icon } from '../Icon/Icon';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\nimport { stylesFactory } from '../../themes';\n\nexport interface CustomHeader {\n  id: string;\n  name: string;\n  value: string;\n  configured: boolean;\n}\n\nexport type CustomHeaders = CustomHeader[];\n\nexport interface Props {\n  dataSourceConfig: DataSourceSettings<any, any>;\n  onChange: (config: DataSourceSettings) => void;\n}\n\nexport interface State {\n  headers: CustomHeaders;\n}\n\ninterface CustomHeaderRowProps {\n  header: CustomHeader;\n  onReset: (id: string) => void;\n  onRemove: (id: string) => void;\n  onChange: (value: CustomHeader) => void;\n  onBlur: () => void;\n}\n\nconst getCustomHeaderRowStyles = stylesFactory(() => {\n  return {\n    layout: css`\n      display: flex;\n      align-items: center;\n      margin-bottom: 4px;\n      > * {\n        margin-left: 4px;\n        margin-bottom: 0;\n        height: 100%;\n        &:first-child,\n        &:last-child {\n          margin-left: 0;\n        }\n      }\n    `,\n  };\n});\nconst CustomHeaderRow: React.FC<CustomHeaderRowProps> = ({ header, onBlur, onChange, onRemove, onReset }) => {\n  const styles = getCustomHeaderRowStyles();\n  return (\n    <div className={styles.layout}>\n      <FormField\n        label=\"Header\"\n        name=\"name\"\n        placeholder=\"X-Custom-Header\"\n        labelWidth={5}\n        value={header.name || ''}\n        onChange={e => onChange({ ...header, name: e.target.value })}\n        onBlur={onBlur}\n      />\n      <SecretFormField\n        label=\"Value\"\n        name=\"value\"\n        isConfigured={header.configured}\n        value={header.value}\n        labelWidth={5}\n        inputWidth={header.configured ? 11 : 12}\n        placeholder=\"Header Value\"\n        onReset={() => onReset(header.id)}\n        onChange={e => onChange({ ...header, value: e.target.value })}\n        onBlur={onBlur}\n      />\n      <Button variant=\"secondary\" size=\"xs\" onClick={_e => onRemove(header.id)}>\n        <Icon name=\"trash-alt\" />\n      </Button>\n    </div>\n  );\n};\n\nCustomHeaderRow.displayName = 'CustomHeaderRow';\n\nexport class CustomHeadersSettings extends PureComponent<Props, State> {\n  state: State = {\n    headers: [],\n  };\n\n  constructor(props: Props) {\n    super(props);\n    const { jsonData, secureJsonData, secureJsonFields } = this.props.dataSourceConfig;\n    this.state = {\n      headers: Object.keys(jsonData)\n        .sort()\n        .filter(key => key.startsWith('httpHeaderName'))\n        .map((key, index) => {\n          return {\n            id: uniqueId(),\n            name: jsonData[key],\n            value: secureJsonData !== undefined ? secureJsonData[key] : '',\n            configured: (secureJsonFields && secureJsonFields[`httpHeaderValue${index + 1}`]) || false,\n          };\n        }),\n    };\n  }\n\n  updateSettings = () => {\n    const { headers } = this.state;\n    const { jsonData } = this.props.dataSourceConfig;\n    const secureJsonData = this.props.dataSourceConfig.secureJsonData || {};\n    for (const [index, header] of headers.entries()) {\n      jsonData[`httpHeaderName${index + 1}`] = header.name;\n      if (!header.configured) {\n        secureJsonData[`httpHeaderValue${index + 1}`] = header.value;\n      }\n      Object.keys(jsonData)\n        .filter(\n          key =>\n            key.startsWith('httpHeaderName') && parseInt(key.substring('httpHeaderName'.length), 10) > headers.length\n        )\n        .forEach(key => {\n          delete jsonData[key];\n        });\n    }\n\n    this.props.onChange({\n      ...this.props.dataSourceConfig,\n      jsonData,\n      secureJsonData,\n    });\n  };\n\n  onHeaderAdd = () => {\n    this.setState(prevState => {\n      return { headers: [...prevState.headers, { id: uniqueId(), name: '', value: '', configured: false }] };\n    }, this.updateSettings);\n  };\n\n  onHeaderChange = (headerIndex: number, value: CustomHeader) => {\n    this.setState(({ headers }) => {\n      return {\n        headers: headers.map((item, index) => {\n          if (headerIndex !== index) {\n            return item;\n          }\n          return { ...value };\n        }),\n      };\n    });\n  };\n\n  onHeaderReset = (headerId: string) => {\n    this.setState(({ headers }) => {\n      return {\n        headers: headers.map((h, i) => {\n          if (h.id !== headerId) {\n            return h;\n          }\n          return {\n            ...h,\n            value: '',\n            configured: false,\n          };\n        }),\n      };\n    });\n  };\n\n  onHeaderRemove = (headerId: string) => {\n    this.setState(\n      ({ headers }) => ({\n        headers: headers.filter(h => h.id !== headerId),\n      }),\n      this.updateSettings\n    );\n  };\n\n  render() {\n    const { headers } = this.state;\n    return (\n      <div className={'gf-form-group'}>\n        <div className=\"gf-form\">\n          <h6>Custom HTTP Headers</h6>\n        </div>\n        <div>\n          {headers.map((header, i) => (\n            <CustomHeaderRow\n              key={header.id}\n              header={header}\n              onChange={h => {\n                this.onHeaderChange(i, h);\n              }}\n              onBlur={this.updateSettings}\n              onRemove={this.onHeaderRemove}\n              onReset={this.onHeaderReset}\n            />\n          ))}\n        </div>\n        <div className=\"gf-form\">\n          <Button\n            variant=\"secondary\"\n            icon=\"plus\"\n            onClick={e => {\n              this.onHeaderAdd();\n            }}\n          >\n            Add header\n          </Button>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default CustomHeadersSettings;\n","import React, { useState, useCallback } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { useTheme } from '../../themes';\nimport { BasicAuthSettings } from './BasicAuthSettings';\nimport { HttpProxySettings } from './HttpProxySettings';\nimport { TLSAuthSettings } from './TLSAuthSettings';\nimport { DataSourceSettings } from '@grafana/data';\nimport { HttpSettingsProps } from './types';\nimport { CustomHeadersSettings } from './CustomHeadersSettings';\nimport { Select } from '../Forms/Legacy/Select/Select';\nimport { Input } from '../Forms/Legacy/Input/Input';\nimport { Icon } from '../Icon/Icon';\nimport { FormField } from '../FormField/FormField';\nimport { FormLabel } from '../FormLabel/FormLabel';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\nimport { TagsInput } from '../TagsInput/TagsInput';\n\nconst ACCESS_OPTIONS: Array<SelectableValue<string>> = [\n  {\n    label: 'Server (default)',\n    value: 'proxy',\n  },\n  {\n    label: 'Browser',\n    value: 'direct',\n  },\n];\n\nconst DEFAULT_ACCESS_OPTION = {\n  label: 'Server (default)',\n  value: 'proxy',\n};\n\nconst HttpAccessHelp = () => (\n  <div className=\"grafana-info-box m-t-2\">\n    <p>\n      Access mode controls how requests to the data source will be handled.\n      <strong>\n        <i>Server</i>\n      </strong>{' '}\n      should be the preferred way if nothing else stated.\n    </p>\n    <div className=\"alert-title\">Server access mode (Default):</div>\n    <p>\n      All requests will be made from the browser to Grafana backend/server which in turn will forward the requests to\n      the data source and by that circumvent possible Cross-Origin Resource Sharing (CORS) requirements. The URL needs\n      to be accessible from the grafana backend/server if you select this access mode.\n    </p>\n    <div className=\"alert-title\">Browser access mode:</div>\n    <p>\n      All requests will be made from the browser directly to the data source and may be subject to Cross-Origin Resource\n      Sharing (CORS) requirements. The URL needs to be accessible from the browser if you select this access mode.\n    </p>\n  </div>\n);\n\nexport const DataSourceHttpSettings: React.FC<HttpSettingsProps> = props => {\n  const { defaultUrl, dataSourceConfig, onChange, showAccessOptions } = props;\n  let urlTooltip;\n  const [isAccessHelpVisible, setIsAccessHelpVisible] = useState(false);\n  const theme = useTheme();\n\n  const onSettingsChange = useCallback(\n    (change: Partial<DataSourceSettings<any, any>>) => {\n      onChange({\n        ...dataSourceConfig,\n        ...change,\n      });\n    },\n    [dataSourceConfig]\n  );\n\n  switch (dataSourceConfig.access) {\n    case 'direct':\n      urlTooltip = (\n        <>\n          Your access method is <em>Browser</em>, this means the URL needs to be accessible from the browser.\n        </>\n      );\n      break;\n    case 'proxy':\n      urlTooltip = (\n        <>\n          Your access method is <em>Server</em>, this means the URL needs to be accessible from the grafana\n          backend/server.\n        </>\n      );\n      break;\n    default:\n      urlTooltip = 'Specify a complete HTTP URL (for example http://your_server:8080)';\n  }\n\n  const accessSelect = (\n    <Select\n      width={20}\n      options={ACCESS_OPTIONS}\n      value={ACCESS_OPTIONS.filter(o => o.value === dataSourceConfig.access)[0] || DEFAULT_ACCESS_OPTION}\n      onChange={selectedValue => onSettingsChange({ access: selectedValue.value })}\n    />\n  );\n\n  const isValidUrl = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/.test(\n    dataSourceConfig.url\n  );\n\n  const notValidStyle = css`\n    box-shadow: inset 0 0px 5px ${theme.palette.red};\n  `;\n\n  const inputStyle = cx({ [`width-20`]: true, [notValidStyle]: !isValidUrl });\n\n  const urlInput = (\n    <Input\n      className={inputStyle}\n      placeholder={defaultUrl}\n      value={dataSourceConfig.url}\n      onChange={event => onSettingsChange({ url: event.currentTarget.value })}\n    />\n  );\n\n  return (\n    <div className=\"gf-form-group\">\n      <>\n        <h3 className=\"page-heading\">HTTP</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <FormField label=\"URL\" labelWidth={11} tooltip={urlTooltip} inputEl={urlInput} />\n          </div>\n\n          {showAccessOptions && (\n            <>\n              <div className=\"gf-form-inline\">\n                <div className=\"gf-form\">\n                  <FormField label=\"Access\" labelWidth={11} inputWidth={20} inputEl={accessSelect} />\n                </div>\n                <div className=\"gf-form\">\n                  <label\n                    className=\"gf-form-label query-keyword pointer\"\n                    onClick={() => setIsAccessHelpVisible(isVisible => !isVisible)}\n                  >\n                    Help&nbsp;\n                    <Icon name={isAccessHelpVisible ? 'angle-down' : 'angle-right'} style={{ marginBottom: 0 }} />\n                  </label>\n                </div>\n              </div>\n              {isAccessHelpVisible && <HttpAccessHelp />}\n            </>\n          )}\n          {dataSourceConfig.access === 'proxy' && (\n            <div className=\"gf-form\">\n              <FormLabel\n                width={11}\n                tooltip=\"Grafana Proxy deletes forwarded cookies by default. Specify cookies by name that should be forwarded to the data source.\"\n              >\n                Whitelisted Cookies\n              </FormLabel>\n              <TagsInput\n                tags={dataSourceConfig.jsonData.keepCookies}\n                onChange={cookies =>\n                  onSettingsChange({ jsonData: { ...dataSourceConfig.jsonData, keepCookies: cookies } })\n                }\n                width={20}\n              />\n            </div>\n          )}\n        </div>\n      </>\n\n      <>\n        <h3 className=\"page-heading\">Auth</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form-inline\">\n            <Switch\n              label=\"Basic auth\"\n              labelClass=\"width-13\"\n              checked={dataSourceConfig.basicAuth}\n              onChange={event => {\n                onSettingsChange({ basicAuth: event!.currentTarget.checked });\n              }}\n            />\n            <Switch\n              label=\"With Credentials\"\n              labelClass=\"width-13\"\n              checked={dataSourceConfig.withCredentials}\n              onChange={event => {\n                onSettingsChange({ withCredentials: event!.currentTarget.checked });\n              }}\n              tooltip=\"Whether credentials such as cookies or auth headers should be sent with cross-site requests.\"\n            />\n          </div>\n\n          {dataSourceConfig.access === 'proxy' && (\n            <HttpProxySettings\n              dataSourceConfig={dataSourceConfig}\n              onChange={jsonData => onSettingsChange({ jsonData })}\n            />\n          )}\n        </div>\n        {dataSourceConfig.basicAuth && (\n          <>\n            <h6>Basic Auth Details</h6>\n            <div className=\"gf-form-group\">\n              <BasicAuthSettings {...props} />\n            </div>\n          </>\n        )}\n\n        {(dataSourceConfig.jsonData.tlsAuth || dataSourceConfig.jsonData.tlsAuthWithCACert) && (\n          <TLSAuthSettings dataSourceConfig={dataSourceConfig} onChange={onChange} />\n        )}\n\n        <CustomHeadersSettings dataSourceConfig={dataSourceConfig} onChange={onChange} />\n      </>\n    </div>\n  );\n};\n","import React from 'react';\nimport { cx } from 'emotion';\nimport _ from 'lodash';\nimport { SelectableValue } from '@grafana/data';\nimport { SegmentSelect, useExpandableLabel, SegmentProps } from './';\n\nexport interface SegmentSyncProps<T> extends SegmentProps<T> {\n  value?: T | SelectableValue<T>;\n  onChange: (item: SelectableValue<T>) => void;\n  options: Array<SelectableValue<T>>;\n}\n\nexport function Segment<T>({\n  options,\n  value,\n  onChange,\n  Component,\n  className,\n  allowCustomValue,\n  placeholder,\n}: React.PropsWithChildren<SegmentSyncProps<T>>) {\n  const [Label, width, expanded, setExpanded] = useExpandableLabel(false);\n\n  if (!expanded) {\n    const label = _.isObject(value) ? value.label : value;\n    return (\n      <Label\n        Component={\n          Component || (\n            <a className={cx('gf-form-label', 'query-part', !value && placeholder && 'query-placeholder', className)}>\n              {label || placeholder}\n            </a>\n          )\n        }\n      />\n    );\n  }\n\n  return (\n    <SegmentSelect\n      value={value && !_.isObject(value) ? { value } : value}\n      options={options}\n      width={width}\n      onClickOutside={() => setExpanded(false)}\n      allowCustomValue={allowCustomValue}\n      onChange={item => {\n        setExpanded(false);\n        onChange(item);\n      }}\n    />\n  );\n}\n","import React, { useRef } from 'react';\nimport { css, cx } from 'emotion';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '../Forms/Legacy/Select/Select';\n\nexport interface Props<T> {\n  value?: SelectableValue<T>;\n  options: Array<SelectableValue<T>>;\n  onChange: (item: SelectableValue<T>) => void;\n  onClickOutside: () => void;\n  width: number;\n  noOptionsMessage?: string;\n  allowCustomValue?: boolean;\n}\n\nexport function SegmentSelect<T>({\n  value,\n  options = [],\n  onChange,\n  onClickOutside,\n  width,\n  noOptionsMessage = '',\n  allowCustomValue = false,\n}: React.PropsWithChildren<Props<T>>) {\n  const ref = useRef<HTMLDivElement>(null);\n\n  useClickAway(ref, () => {\n    if (ref && ref.current) {\n      // https://github.com/JedWatson/react-select/issues/188#issuecomment-279240292\n      // Unfortunately there's no other way of retrieving the (not yet) created new option\n      const input = ref.current.querySelector('input[id^=\"react-select-\"]') as HTMLInputElement;\n      if (input && input.value) {\n        onChange({ value: input.value as any, label: input.value });\n      } else {\n        onClickOutside();\n      }\n    }\n  });\n\n  return (\n    <div ref={ref}>\n      <Select\n        className={cx(\n          css`\n            width: ${width > 120 ? width : 120}px;\n          `\n        )}\n        noOptionsMessage={() => noOptionsMessage}\n        placeholder=\"\"\n        autoFocus={true}\n        isOpen={true}\n        onChange={onChange}\n        options={options}\n        value={value}\n        allowCustomValue={allowCustomValue}\n      />\n    </div>\n  );\n}\n","import React, { useState } from 'react';\nimport { cx } from 'emotion';\nimport _ from 'lodash';\nimport { SegmentSelect } from './SegmentSelect';\nimport { SelectableValue } from '@grafana/data';\nimport { useExpandableLabel, SegmentProps } from '.';\n\nexport interface SegmentAsyncProps<T> extends SegmentProps<T> {\n  value?: T | SelectableValue<T>;\n  loadOptions: (query?: string) => Promise<Array<SelectableValue<T>>>;\n  onChange: (item: SelectableValue<T>) => void;\n}\n\nexport function SegmentAsync<T>({\n  value,\n  onChange,\n  loadOptions,\n  Component,\n  className,\n  allowCustomValue,\n  placeholder,\n}: React.PropsWithChildren<SegmentAsyncProps<T>>) {\n  const [selectPlaceholder, setSelectPlaceholder] = useState<string>('');\n  const [loadedOptions, setLoadedOptions] = useState<Array<SelectableValue<T>>>([]);\n  const [Label, width, expanded, setExpanded] = useExpandableLabel(false);\n\n  if (!expanded) {\n    const label = _.isObject(value) ? value.label : value;\n    return (\n      <Label\n        onClick={async () => {\n          setSelectPlaceholder('Loading options...');\n          const opts = await loadOptions();\n          setLoadedOptions(opts);\n          setSelectPlaceholder(opts.length ? '' : 'No options found');\n        }}\n        Component={\n          Component || (\n            <a className={cx('gf-form-label', 'query-part', !value && placeholder && 'query-placeholder', className)}>\n              {label || placeholder}\n            </a>\n          )\n        }\n      />\n    );\n  }\n\n  return (\n    <SegmentSelect\n      value={value && !_.isObject(value) ? { value } : value}\n      options={loadedOptions}\n      width={width}\n      noOptionsMessage={selectPlaceholder}\n      allowCustomValue={allowCustomValue}\n      onClickOutside={() => {\n        setSelectPlaceholder('');\n        setLoadedOptions([]);\n        setExpanded(false);\n      }}\n      onChange={item => {\n        setSelectPlaceholder('');\n        setLoadedOptions([]);\n        setExpanded(false);\n        onChange(item);\n      }}\n    />\n  );\n}\n","import React, { useRef, useState } from 'react';\nimport { cx, css } from 'emotion';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport { measureText } from '../../utils/measureText';\nimport { useExpandableLabel, SegmentProps } from '.';\n\nexport interface SegmentInputProps<T> extends SegmentProps<T> {\n  value: string | number;\n  onChange: (text: string | number) => void;\n  autofocus?: boolean;\n}\n\nconst FONT_SIZE = 14;\n\nexport function SegmentInput<T>({\n  value: initialValue,\n  onChange,\n  Component,\n  className,\n  placeholder,\n  autofocus = false,\n}: React.PropsWithChildren<SegmentInputProps<T>>) {\n  const ref = useRef<HTMLInputElement>(null);\n  const [value, setValue] = useState<number | string>(initialValue);\n  const [inputWidth, setInputWidth] = useState<number>(measureText((initialValue || '').toString(), FONT_SIZE).width);\n  const [Label, , expanded, setExpanded] = useExpandableLabel(autofocus);\n\n  useClickAway(ref, () => {\n    setExpanded(false);\n    onChange(value);\n  });\n\n  if (!expanded) {\n    return (\n      <Label\n        Component={\n          Component || (\n            <a className={cx('gf-form-label', 'query-part', !value && placeholder && 'query-placeholder', className)}>\n              {initialValue || placeholder}\n            </a>\n          )\n        }\n      />\n    );\n  }\n\n  const inputWidthStyle = css`\n    width: ${Math.max(inputWidth + 20, 32)}px;\n  `;\n\n  return (\n    <input\n      ref={ref}\n      autoFocus\n      className={cx(`gf-form gf-form-input`, inputWidthStyle)}\n      value={value}\n      onChange={item => {\n        const { width } = measureText(item.target.value, FONT_SIZE);\n        setInputWidth(width);\n        setValue(item.target.value);\n      }}\n      onBlur={() => {\n        setExpanded(false);\n        onChange(value);\n      }}\n      onKeyDown={e => {\n        if ([13, 27].includes(e.keyCode)) {\n          setExpanded(false);\n          onChange(value);\n        }\n      }}\n    />\n  );\n}\n","import React, { useState, useRef, ReactElement } from 'react';\n\nexport const useExpandableLabel = (initialExpanded: boolean) => {\n  const ref = useRef<HTMLDivElement>(null);\n  const [expanded, setExpanded] = useState(initialExpanded);\n  const [width, setWidth] = useState();\n  const Label = ({ Component, onClick }: { Component: ReactElement; onClick: () => void }) => (\n    <div\n      className=\"gf-form\"\n      ref={ref}\n      onClick={() => {\n        setExpanded(true);\n        if (ref && ref.current) {\n          setWidth(ref.current.clientWidth * 1.25);\n        }\n        if (onClick) {\n          onClick();\n        }\n      }}\n    >\n      {Component}\n    </div>\n  );\n\n  return [Label, width, expanded, setExpanded];\n};\n","import { Tooltip } from './Tooltip';\n\nconst Chart = {\n  Tooltip,\n};\n\nexport default Chart;\n","import React, { CSSProperties, FC, ReactNode, useState } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport RcDrawer from 'rc-drawer';\nimport { css } from 'emotion';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport CustomScrollbar from '../CustomScrollbar/CustomScrollbar';\nimport { IconButton } from '../IconButton/IconButton';\nimport { stylesFactory, useTheme } from '../../themes';\n\nexport interface Props {\n  children: ReactNode;\n  /** Title shown at the top of the drawer */\n  title?: ReactNode;\n  /** Subtitle shown below the title */\n  subtitle?: ReactNode;\n  /** Should the Drawer be closable by clicking on the mask, defaults to true */\n  closeOnMaskClick?: boolean;\n  /** Render the drawer inside a container on the page */\n  inline?: boolean;\n  /** Either a number in px or a string with unit postfix */\n  width?: number | string;\n  /** Should the Drawer be expandable to full width */\n  expandable?: boolean;\n\n  /** Set to true if the component rendered within in drawer content has its own scroll */\n  scrollableContent?: boolean;\n\n  onClose: () => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, scollableContent: boolean) => {\n  return {\n    drawer: css`\n      .drawer-content {\n        background-color: ${theme.colors.bodyBg};\n        display: flex;\n        flex-direction: column;\n        overflow: hidden;\n      }\n      z-index: ${theme.zIndex.dropdown};\n    `,\n    header: css`\n      background-color: ${theme.colors.bg2};\n      z-index: 1;\n      flex-grow: 0;\n      padding-top: ${theme.spacing.xs};\n    `,\n    actions: css`\n      display: flex;\n      align-items: baseline;\n      justify-content: flex-end;\n    `,\n    titleWrapper: css`\n      margin-bottom: ${theme.spacing.lg};\n      padding: 0 ${theme.spacing.sm} 0 ${theme.spacing.lg};\n    `,\n    titleSpacing: css`\n      margin-bottom: ${theme.spacing.md};\n    `,\n    content: css`\n      padding: ${theme.spacing.md};\n      flex-grow: 1;\n      overflow: ${!scollableContent ? 'hidden' : 'auto'};\n      z-index: 0;\n      height: 100%;\n    `,\n  };\n});\n\nexport const Drawer: FC<Props> = ({\n  children,\n  inline = false,\n  onClose,\n  closeOnMaskClick = true,\n  scrollableContent = false,\n  title,\n  subtitle,\n  width = '40%',\n  expandable = false,\n}) => {\n  const theme = useTheme();\n  const drawerStyles = getStyles(theme, scrollableContent);\n  const [isExpanded, setIsExpanded] = useState(false);\n  const currentWidth = isExpanded ? '100%' : width;\n\n  return (\n    <RcDrawer\n      level={null}\n      handler={false}\n      open={true}\n      onClose={onClose}\n      maskClosable={closeOnMaskClick}\n      placement=\"right\"\n      width={currentWidth}\n      getContainer={inline ? false : 'body'}\n      style={{ position: `${inline && 'absolute'}` } as CSSProperties}\n      className={drawerStyles.drawer}\n      aria-label={\n        typeof title === 'string'\n          ? selectors.components.Drawer.General.title(title)\n          : selectors.components.Drawer.General.title('no title')\n      }\n    >\n      {typeof title === 'string' && (\n        <div className={drawerStyles.header}>\n          <div className={drawerStyles.actions}>\n            {expandable && !isExpanded && (\n              <IconButton\n                name=\"angle-left\"\n                size=\"xl\"\n                onClick={() => setIsExpanded(true)}\n                surface=\"header\"\n                aria-label={selectors.components.Drawer.General.expand}\n              />\n            )}\n            {expandable && isExpanded && (\n              <IconButton\n                name=\"angle-right\"\n                size=\"xl\"\n                onClick={() => setIsExpanded(false)}\n                surface=\"header\"\n                aria-label={selectors.components.Drawer.General.contract}\n              />\n            )}\n            <IconButton\n              name=\"times\"\n              size=\"xl\"\n              onClick={onClose}\n              surface=\"header\"\n              aria-label={selectors.components.Drawer.General.close}\n            />\n          </div>\n          <div className={drawerStyles.titleWrapper}>\n            <h3>{title}</h3>\n            {typeof subtitle === 'string' && <div className=\"muted\">{subtitle}</div>}\n            {typeof subtitle !== 'string' && subtitle}\n          </div>\n        </div>\n      )}\n      {typeof title !== 'string' && title}\n      <div className={drawerStyles.content}>\n        {!scrollableContent ? children : <CustomScrollbar>{children}</CustomScrollbar>}\n      </div>\n    </RcDrawer>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { Range, createSliderWithTooltip } from 'rc-slider';\nimport { cx, css } from 'emotion';\nimport { Global, css as cssCore } from '@emotion/core';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { Orientation } from '../../types/orientation';\n\nexport interface Props {\n  min: number;\n  max: number;\n  orientation?: Orientation;\n  /** Set current positions of handle(s). If only 1 value supplied, only 1 handle displayed. */\n  value?: number[];\n  reverse?: boolean;\n  tooltipAlwaysVisible?: boolean;\n  formatTooltipResult?: (value: number) => number | string;\n  onChange?: (values: number[]) => void;\n  onAfterChange?: (values: number[]) => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, isHorizontal: boolean) => {\n  const trackColor = theme.isLight ? theme.palette.gray5 : theme.palette.dark6;\n  const container = isHorizontal\n    ? css`\n        width: 100%;\n        margin: ${theme.spacing.lg} ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.sm};\n      `\n    : css`\n        height: 100%;\n        margin: ${theme.spacing.sm} ${theme.spacing.lg} ${theme.spacing.sm} ${theme.spacing.sm};\n      `;\n\n  return {\n    container,\n    slider: css`\n      .rc-slider-vertical .rc-slider-handle {\n        margin-top: -10px;\n      }\n      .rc-slider-handle {\n        border: solid 2px ${theme.palette.blue77};\n        background-color: ${theme.palette.blue77};\n      }\n      .rc-slider-handle:hover {\n        border-color: ${theme.palette.blue77};\n      }\n      .rc-slider-handle:focus {\n        border-color: ${theme.palette.blue77};\n        box-shadow: none;\n      }\n      .rc-slider-handle:active {\n        border-color: ${theme.palette.blue77};\n        box-shadow: none;\n      }\n      .rc-slider-handle-click-focused:focus {\n        border-color: ${theme.palette.blue77};\n      }\n      .rc-slider-dot-active {\n        border-color: ${theme.palette.blue77};\n      }\n      .rc-slider-track {\n        background-color: ${theme.palette.blue77};\n      }\n      .rc-slider-rail {\n        background-color: ${trackColor};\n        border: 1px solid ${trackColor};\n      }\n    `,\n    /** Global component from @emotion/core doesn't accept computed classname string returned from css from emotion.\n     * It accepts object containing the computed name and flattened styles returned from css from @emotion/core\n     * */\n    tooltip: cssCore`\n    body {\n      .rc-slider-tooltip {\n        cursor: grab;\n        user-select: none;\n        z-index: ${theme.zIndex.tooltip};\n      }\n\n      .rc-slider-tooltip-inner {\n        color: ${theme.colors.text};\n        background-color: transparent !important;\n        border-radius: 0;\n        box-shadow: none;\n      }\n\n      .rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow {\n        display: none;\n      }\n\n      .rc-slider-tooltip-placement-top {\n        padding: 0;\n      }\n    }\n  `,\n  };\n});\n\nexport const Slider: FunctionComponent<Props> = ({\n  min,\n  max,\n  onChange,\n  onAfterChange,\n  orientation = 'horizontal',\n  reverse,\n  formatTooltipResult,\n  value,\n  tooltipAlwaysVisible = true,\n}) => {\n  const isHorizontal = orientation === 'horizontal';\n  const theme = useTheme();\n  const styles = getStyles(theme, isHorizontal);\n  const RangeWithTooltip = createSliderWithTooltip(Range);\n  return (\n    <div className={cx(styles.container, styles.slider)}>\n      {/** Slider tooltip's parent component is body and therefore we need Global component to do css overrides for it. */}\n      <Global styles={styles.tooltip} />\n      <RangeWithTooltip\n        tipProps={{\n          visible: tooltipAlwaysVisible,\n          placement: isHorizontal ? 'top' : 'right',\n        }}\n        min={min}\n        max={max}\n        defaultValue={value || [min, max]}\n        tipFormatter={(value: number) => (formatTooltipResult ? formatTooltipResult(value) : value)}\n        onChange={onChange}\n        onAfterChange={onAfterChange}\n        vertical={!isHorizontal}\n        reverse={reverse}\n      />\n    </div>\n  );\n};\n\nSlider.displayName = 'Slider';\n","import React, { HTMLProps } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { getFocusStyle, sharedInputStyle } from '../Forms/commonStyles';\n\nexport interface Props extends Omit<HTMLProps<HTMLTextAreaElement>, 'size'> {\n  /** Show an invalid state around the input */\n  invalid?: boolean;\n}\n\nexport const TextArea = React.forwardRef<HTMLTextAreaElement, Props>(({ invalid, className, ...props }, ref) => {\n  const theme = useTheme();\n  const styles = getTextAreaStyle(theme, invalid);\n\n  return <textarea {...props} className={cx(styles.textarea, className)} ref={ref} />;\n});\n\nconst getTextAreaStyle = stylesFactory((theme: GrafanaTheme, invalid = false) => {\n  return {\n    textarea: cx(\n      sharedInputStyle(theme),\n      getFocusStyle(theme),\n      css`\n        border-radius: ${theme.border.radius.sm};\n        padding: ${theme.spacing.formSpacingBase / 4}px ${theme.spacing.formSpacingBase}px;\n        width: 100%;\n        border-color: ${invalid ? theme.palette.redBase : theme.colors.formInputBorder};\n      `\n    ),\n  };\n});\n","import React, { useCallback } from 'react';\nimport { FieldConfigEditorProps, StringFieldConfigSettings } from '@grafana/data';\nimport { Input } from '../Input/Input';\nimport { TextArea } from '../TextArea/TextArea';\n\nexport const StringValueEditor: React.FC<FieldConfigEditorProps<string, StringFieldConfigSettings>> = ({\n  value,\n  onChange,\n  item,\n}) => {\n  const Component = item.settings?.useTextarea ? TextArea : Input;\n\n  const onValueChange = useCallback(\n    (e: React.SyntheticEvent) => {\n      if (e.hasOwnProperty('key')) {\n        // handling keyboard event\n        const evt = e as React.KeyboardEvent<HTMLInputElement>;\n        if (evt.key === 'Enter' && !item.settings?.useTextarea) {\n          onChange(evt.currentTarget.value.trim() === '' ? undefined : evt.currentTarget.value);\n        }\n      } else {\n        // handling form event\n        const evt = e as React.FormEvent<HTMLInputElement>;\n        onChange(evt.currentTarget.value.trim() === '' ? undefined : evt.currentTarget.value);\n      }\n    },\n    [onChange]\n  );\n\n  return (\n    <Component\n      placeholder={item.settings?.placeholder}\n      defaultValue={value || ''}\n      rows={item.settings?.useTextarea && item.settings.rows}\n      onBlur={onValueChange}\n      onKeyDown={onValueChange}\n    />\n  );\n};\n","import React, { useCallback } from 'react';\nimport {\n  FieldConfigEditorProps,\n  toIntegerOrUndefined,\n  toFloatOrUndefined,\n  NumberFieldConfigSettings,\n} from '@grafana/data';\nimport { Input } from '../Input/Input';\n\nexport const NumberValueEditor: React.FC<FieldConfigEditorProps<number, NumberFieldConfigSettings>> = ({\n  value,\n  onChange,\n  item,\n}) => {\n  const { settings } = item;\n\n  const onValueChange = useCallback(\n    (e: React.SyntheticEvent) => {\n      if (e.hasOwnProperty('key')) {\n        // handling keyboard event\n        const evt = e as React.KeyboardEvent<HTMLInputElement>;\n        if (evt.key === 'Enter') {\n          onChange(\n            settings?.integer\n              ? toIntegerOrUndefined(evt.currentTarget.value)\n              : toFloatOrUndefined(evt.currentTarget.value)\n          );\n        }\n      } else {\n        // handling form event\n        const evt = e as React.FormEvent<HTMLInputElement>;\n        onChange(\n          settings?.integer\n            ? toIntegerOrUndefined(evt.currentTarget.value)\n            : toFloatOrUndefined(evt.currentTarget.value)\n        );\n      }\n    },\n    [onChange]\n  );\n\n  const defaultValue = value === undefined || value === null || isNaN(value) ? '' : value.toString();\n  return (\n    <Input\n      defaultValue={defaultValue}\n      min={settings?.min}\n      max={settings?.max}\n      type=\"number\"\n      step={settings?.step}\n      placeholder={settings?.placeholder}\n      onBlur={onValueChange}\n      onKeyDown={onValueChange}\n    />\n  );\n};\n","import React from 'react';\nimport { FieldConfigEditorProps, SelectFieldConfigSettings, SelectableValue } from '@grafana/data';\nimport { Select } from '../Select/Select';\n\ninterface State<T> {\n  isLoading: boolean;\n  options: Array<SelectableValue<T>>;\n}\n\ntype Props<T> = FieldConfigEditorProps<T, SelectFieldConfigSettings<T>>;\n\nexport class SelectValueEditor<T> extends React.PureComponent<Props<T>, State<T>> {\n  state: State<T> = {\n    isLoading: true,\n    options: [],\n  };\n\n  componentDidMount() {\n    this.updateOptions();\n  }\n\n  componentDidUpdate(oldProps: Props<T>) {\n    const old = oldProps.item?.settings;\n    const now = this.props.item?.settings;\n    if (old !== now) {\n      this.updateOptions();\n    } else if (now.getOptions) {\n      const old = oldProps.context?.data;\n      const now = this.props.context?.data;\n      if (old !== now) {\n        this.updateOptions();\n      }\n    }\n  }\n\n  updateOptions = async () => {\n    const { item } = this.props;\n    const { settings } = item;\n    let options: Array<SelectableValue<T>> = item.settings?.options || [];\n    if (settings?.getOptions) {\n      options = await settings.getOptions(this.props.context);\n    }\n    if (this.state.options !== options) {\n      this.setState({\n        isLoading: false,\n        options,\n      });\n    }\n  };\n\n  render() {\n    const { options, isLoading } = this.state;\n    const { value, onChange, item } = this.props;\n\n    const { settings } = item;\n    const { allowCustomValue } = settings;\n    let current = options.find(v => v.value === value);\n    if (!current && value) {\n      current = {\n        label: `${value}`,\n        value,\n      };\n    }\n    return (\n      <Select<T>\n        isLoading={isLoading}\n        value={current}\n        defaultValue={value}\n        allowCustomValue={allowCustomValue}\n        onChange={e => onChange(e.value)}\n        options={options}\n      />\n    );\n  }\n}\n","import React from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\nimport { selectThemeVariant, stylesFactory, useTheme } from '../../themes';\nimport { Label } from '../Forms/Label';\nimport { Icon } from '../Icon/Icon';\n\ninterface FieldConfigItemHeaderTitleProps {\n  title: string;\n  description?: string;\n  transparent?: boolean;\n  onRemove: () => void;\n}\n\nexport const FieldConfigItemHeaderTitle: React.FC<FieldConfigItemHeaderTitleProps> = ({\n  title,\n  description,\n  onRemove,\n  children,\n  transparent,\n}) => {\n  const theme = useTheme();\n  const styles = getFieldConfigItemHeaderTitleStyles(theme);\n  return (\n    <div className={!transparent ? styles.headerWrapper : ''}>\n      <div className={styles.header}>\n        <Label description={description}>{title}</Label>\n        <div className={styles.remove} onClick={() => onRemove()} aria-label=\"FieldConfigItemHeaderTitle remove button\">\n          <Icon name=\"trash-alt\" />\n        </div>\n      </div>\n      {children}\n    </div>\n  );\n};\n\nconst getFieldConfigItemHeaderTitleStyles = stylesFactory((theme: GrafanaTheme) => {\n  const headerBg = selectThemeVariant(\n    {\n      light: theme.palette.white,\n      dark: theme.palette.dark1,\n    },\n    theme.type\n  );\n\n  return {\n    headerWrapper: css`\n      background: ${headerBg};\n      padding: ${theme.spacing.xs} 0;\n    `,\n    header: css`\n      display: flex;\n      justify-content: space-between;\n      padding: ${theme.spacing.xs} ${theme.spacing.xs} 0 ${theme.spacing.xs};\n    `,\n    remove: css`\n      flex-grow: 0;\n      flex-shrink: 0;\n      cursor: pointer;\n      color: ${theme.palette.red88};\n    `,\n  };\n});\n","import React, { useEffect } from 'react';\nimport { useForm, Mode, OnSubmit, DeepPartial } from 'react-hook-form';\nimport { FormAPI } from '../../types';\nimport { css } from 'emotion';\n\ninterface FormProps<T> {\n  validateOn?: Mode;\n  validateOnMount?: boolean;\n  validateFieldsOnMount?: string[];\n  defaultValues?: DeepPartial<T>;\n  onSubmit: OnSubmit<T>;\n  children: (api: FormAPI<T>) => React.ReactNode;\n  /** Sets max-width for container. Use it instead of setting individual widths on inputs.*/\n  maxWidth?: number;\n}\n\nexport function Form<T>({\n  defaultValues,\n  onSubmit,\n  validateOnMount = false,\n  validateFieldsOnMount,\n  children,\n  validateOn = 'onSubmit',\n  maxWidth = 400,\n}: FormProps<T>) {\n  const { handleSubmit, register, errors, control, triggerValidation, getValues, formState } = useForm<T>({\n    mode: validateOn,\n    defaultValues,\n  });\n\n  useEffect(() => {\n    if (validateOnMount) {\n      triggerValidation(validateFieldsOnMount);\n    }\n  }, []);\n\n  return (\n    <form\n      className={css`\n        max-width: ${maxWidth}px;\n        width: 100%;\n      `}\n      onSubmit={handleSubmit(onSubmit)}\n    >\n      {children({ register, errors, control, getValues, formState })}\n    </form>\n  );\n}\n","import React, { useState } from 'react';\nimport { IconName } from '../../types';\nimport { SelectableValue } from '@grafana/data';\nimport { Button, ButtonVariant } from '../Button';\nimport { Select } from '../Select/Select';\nimport { FullWidthButtonContainer } from '../Button/FullWidthButtonContainer';\nimport { ComponentSize } from '../../types/size';\n\ninterface ValuePickerProps<T> {\n  /** Label to display on the picker button */\n  label: string;\n  /** Icon to display on the picker button */\n  icon?: IconName;\n  /** ValuePicker options  */\n  options: Array<SelectableValue<T>>;\n  onChange: (value: SelectableValue<T>) => void;\n  variant?: ButtonVariant;\n  size?: ComponentSize;\n  isFullWidth?: boolean;\n  menuPlacement?: 'auto' | 'bottom' | 'top';\n}\n\nexport function ValuePicker<T>({\n  label,\n  icon,\n  options,\n  onChange,\n  variant,\n  size = 'sm',\n  isFullWidth = true,\n  menuPlacement,\n}: ValuePickerProps<T>) {\n  const [isPicking, setIsPicking] = useState(false);\n\n  const buttonEl = (\n    <Button size={size || 'sm'} icon={icon || 'plus'} onClick={() => setIsPicking(true)} variant={variant}>\n      {label}\n    </Button>\n  );\n  return (\n    <>\n      {!isPicking && (isFullWidth ? <FullWidthButtonContainer>{buttonEl}</FullWidthButtonContainer> : buttonEl)}\n\n      {isPicking && (\n        <Select\n          placeholder={label}\n          options={options}\n          isOpen\n          onCloseMenu={() => setIsPicking(false)}\n          autoFocus={true}\n          onChange={value => {\n            setIsPicking(false);\n            onChange(value);\n          }}\n          menuPlacement={menuPlacement}\n        />\n      )}\n    </>\n  );\n}\n","import React, { memo, useMemo, useCallback } from 'react';\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { FieldMatcherID, fieldMatchers, getFieldDisplayName, SelectableValue, DataFrame } from '@grafana/data';\nimport { Select } from '../Select/Select';\n\nexport const FieldNameMatcherEditor = memo<MatcherUIProps<string>>(props => {\n  const { data, options } = props;\n  const names = useFieldDisplayNames(data);\n  const selectOptions = useSelectOptions(names);\n\n  const onChange = useCallback(\n    (selection: SelectableValue<string>) => {\n      if (!selection.value || !names.has(selection.value)) {\n        return;\n      }\n      return props.onChange(selection.value);\n    },\n    [names, props.onChange]\n  );\n\n  const selectedOption = selectOptions.find(v => v.value === options);\n  return <Select value={selectedOption} options={selectOptions} onChange={onChange} />;\n});\n\nexport const fieldNameMatcherItem: FieldMatcherUIRegistryItem<string> = {\n  id: FieldMatcherID.byName,\n  component: FieldNameMatcherEditor,\n  matcher: fieldMatchers.get(FieldMatcherID.byName),\n  name: 'Filter by field',\n  description: 'Set properties for fields matching the name',\n};\n\nconst useFieldDisplayNames = (data: DataFrame[]): Set<string> => {\n  return useMemo(() => {\n    const names: Set<string> = new Set();\n\n    for (const frame of data) {\n      for (const field of frame.fields) {\n        names.add(getFieldDisplayName(field, frame, data));\n      }\n    }\n\n    return names;\n  }, [data]);\n};\n\nconst useSelectOptions = (displayNames: Set<string>): Array<SelectableValue<string>> => {\n  return useMemo(() => {\n    return Array.from(displayNames).map(n => ({\n      value: n,\n      label: n,\n    }));\n  }, [displayNames]);\n};\n","import { Registry } from '@grafana/data';\nimport { fieldNameMatcherItem } from './FieldNameMatcherEditor';\nimport { FieldMatcherUIRegistryItem } from './types';\n\nexport const fieldMatchersUI = new Registry<FieldMatcherUIRegistryItem<any>>(() => {\n  return [fieldNameMatcherItem];\n});\n","import React, { ReactNode } from 'react';\nimport { useTheme, stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\n\nexport interface LabelProps extends React.HTMLAttributes<HTMLLegendElement> {\n  children: string | ReactNode;\n  description?: string;\n}\n\nexport const getLegendStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    legend: css`\n      font-size: ${theme.typography.heading.h3};\n      font-weight: ${theme.typography.weight.regular};\n      margin: 0 0 ${theme.spacing.md} 0;\n    `,\n  };\n});\n\nexport const Legend: React.FC<LabelProps> = ({ children, className, ...legendProps }) => {\n  const theme = useTheme();\n  const styles = getLegendStyles(theme);\n\n  return (\n    <legend className={cx(styles.legend, className)} {...legendProps}>\n      {children}\n    </legend>\n  );\n};\n","import React, { HTMLProps, useCallback } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { getLabelStyles } from './Label';\nimport { useTheme, stylesFactory } from '../../themes';\nimport { css, cx } from 'emotion';\nimport { focusCss } from '../../themes/mixins';\n\nexport interface CheckboxProps extends Omit<HTMLProps<HTMLInputElement>, 'value'> {\n  label?: string;\n  description?: string;\n  value?: boolean;\n}\n\nexport const getCheckboxStyles = stylesFactory((theme: GrafanaTheme) => {\n  const labelStyles = getLabelStyles(theme);\n  const checkboxSize = '16px';\n  return {\n    label: cx(\n      labelStyles.label,\n      css`\n        padding-left: ${theme.spacing.formSpacingBase}px;\n        white-space: nowrap;\n      `\n    ),\n    description: cx(\n      labelStyles.description,\n      css`\n        padding-left: ${theme.spacing.formSpacingBase}px;\n      `\n    ),\n    wrapper: css`\n      position: relative;\n      padding-left: ${checkboxSize};\n      vertical-align: middle;\n    `,\n    input: css`\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      opacity: 0;\n      &:focus + span {\n        ${focusCss(theme)}\n      }\n\n      /**\n       * Using adjacent sibling selector to style checked state.\n       * Primarily to limit the classes necessary to use when these classes will be used\n       * for angular components styling\n       * */\n      &:checked + span {\n        background: blue;\n        background: ${theme.colors.formCheckboxBgChecked};\n        border: none;\n\n        &:hover {\n          background: ${theme.colors.formCheckboxBgCheckedHover};\n        }\n\n        &:after {\n          content: '';\n          position: absolute;\n          left: 5px;\n          top: 1px;\n          width: 6px;\n          height: 12px;\n          border: solid ${theme.colors.formCheckboxCheckmark};\n          border-width: 0 3px 3px 0;\n          transform: rotate(45deg);\n        }\n      }\n    `,\n    checkmark: css`\n      display: inline-block;\n      width: ${checkboxSize};\n      height: ${checkboxSize};\n      border-radius: ${theme.border.radius.sm};\n      margin-right: ${theme.spacing.formSpacingBase}px;\n      background: ${theme.colors.formInputBg};\n      border: 1px solid ${theme.colors.formInputBorder};\n      position: absolute;\n      top: 1px;\n      left: 0;\n\n      &:hover {\n        cursor: pointer;\n        border-color: ${theme.colors.formInputBorderHover};\n      }\n    `,\n  };\n});\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n  ({ label, description, value, onChange, disabled, ...inputProps }, ref) => {\n    const theme = useTheme();\n    const handleOnChange = useCallback(\n      (e: React.ChangeEvent<HTMLInputElement>) => {\n        if (onChange) {\n          onChange(e);\n        }\n      },\n      [onChange]\n    );\n    const styles = getCheckboxStyles(theme);\n\n    return (\n      <label className={styles.wrapper}>\n        <input\n          type=\"checkbox\"\n          className={styles.input}\n          checked={value}\n          disabled={disabled}\n          onChange={handleOnChange}\n          {...inputProps}\n          ref={ref}\n        />\n        <span className={styles.checkmark} />\n        {label && <span className={styles.label}>{label}</span>}\n        {description && (\n          <>\n            <br />\n            <span className={styles.description}>{description}</span>\n          </>\n        )}\n      </label>\n    );\n  }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import { stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { getLabelStyles } from './Label';\nimport { getLegendStyles } from './Legend';\nimport { getFieldValidationMessageStyles } from './FieldValidationMessage';\nimport { getButtonStyles, ButtonVariant } from '../Button';\nimport { ComponentSize } from '../../types/size';\nimport { getInputStyles } from '../Input/Input';\nimport { getSwitchStyles } from '../Switch/Switch';\nimport { getCheckboxStyles } from './Checkbox';\n\nexport const getFormStyles = stylesFactory(\n  (theme: GrafanaTheme, options: { variant: ButtonVariant; size: ComponentSize; invalid: boolean }) => {\n    return {\n      label: getLabelStyles(theme),\n      legend: getLegendStyles(theme),\n      fieldValidationMessage: getFieldValidationMessageStyles(theme),\n      button: getButtonStyles({\n        theme,\n        variant: options.variant,\n        size: options.size,\n        hasIcon: false,\n        hasText: true,\n      }),\n      input: getInputStyles({ theme, invalid: options.invalid }),\n      switch: getSwitchStyles(theme),\n      checkbox: getCheckboxStyles(theme),\n    };\n  }\n);\n","import React from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { Button, ButtonVariant, ButtonProps } from '../Button';\nimport { ComponentSize } from '../../types/size';\nimport { SelectCommonProps, CustomControlProps } from './types';\nimport { SelectBase } from './SelectBase';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\n\ninterface ButtonSelectProps<T> extends Omit<SelectCommonProps<T>, 'renderControl' | 'size' | 'prefix'> {\n  icon?: IconName;\n  variant?: ButtonVariant;\n  size?: ComponentSize;\n}\n\ninterface SelectButtonProps extends Omit<ButtonProps, 'icon'> {\n  icon?: IconName;\n  isOpen?: boolean;\n}\n\nconst SelectButton = React.forwardRef<HTMLButtonElement, SelectButtonProps>(\n  ({ icon, children, isOpen, ...buttonProps }, ref) => {\n    const getStyles = stylesFactory((theme: GrafanaTheme) => ({\n      wrapper: css`\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        max-width: 200px;\n        text-overflow: ellipsis;\n      `,\n      iconWrap: css`\n        padding: 0 15px 0 0;\n      `,\n      caretWrap: css`\n        padding-left: ${theme.spacing.sm};\n        margin-left: ${theme.spacing.sm};\n        margin-right: -${theme.spacing.sm};\n        height: 100%;\n      `,\n    }));\n    const styles = getStyles(useTheme());\n    return (\n      <Button {...buttonProps} ref={ref} icon={icon}>\n        <span className={styles.wrapper}>\n          <span>{children}</span>\n          <span className={styles.caretWrap}>\n            <Icon name={isOpen ? 'angle-up' : 'angle-down'} />\n          </span>\n        </span>\n      </Button>\n    );\n  }\n);\n\nexport function ButtonSelect<T>({\n  placeholder,\n  icon,\n  variant = 'primary',\n  size = 'md',\n  className,\n  disabled,\n  ...selectProps\n}: ButtonSelectProps<T>) {\n  const buttonProps = {\n    icon,\n    variant,\n    size,\n    className,\n    disabled,\n  };\n\n  return (\n    <SelectBase\n      {...selectProps}\n      renderControl={React.forwardRef<any, CustomControlProps<T>>(({ onBlur, onClick, value, isOpen }, ref) => {\n        return (\n          <SelectButton {...buttonProps} ref={ref} onBlur={onBlur} onClick={onClick} isOpen={isOpen}>\n            {value ? value.label : placeholder}\n          </SelectButton>\n        );\n      })}\n    />\n  );\n}\n","export { Icon } from './Icon/Icon';\nexport { IconButton } from './IconButton/IconButton';\nexport { ConfirmButton } from './ConfirmButton/ConfirmButton';\nexport { DeleteButton } from './ConfirmButton/DeleteButton';\nexport { Tooltip, PopoverContent } from './Tooltip/Tooltip';\nexport { PopoverController } from './Tooltip/PopoverController';\nexport { Popover } from './Tooltip/Popover';\nexport { Portal } from './Portal/Portal';\nexport { CustomScrollbar } from './CustomScrollbar/CustomScrollbar';\n\nexport { ClipboardButton } from './ClipboardButton/ClipboardButton';\nexport { Cascader, CascaderOption } from './Cascader/Cascader';\nexport { ButtonCascader } from './ButtonCascader/ButtonCascader';\n\nexport { LoadingPlaceholder } from './LoadingPlaceholder/LoadingPlaceholder';\nexport { ColorPicker, SeriesColorPicker } from './ColorPicker/ColorPicker';\nexport { SeriesColorPickerPopover, SeriesColorPickerPopoverWithTheme } from './ColorPicker/SeriesColorPickerPopover';\nexport { PanelOptionsGroup } from './PanelOptionsGroup/PanelOptionsGroup';\nexport { PanelOptionsGrid } from './PanelOptionsGrid/PanelOptionsGrid';\nexport { EmptySearchResult } from './EmptySearchResult/EmptySearchResult';\nexport { PieChart, PieChartType } from './PieChart/PieChart';\nexport { UnitPicker } from './UnitPicker/UnitPicker';\nexport { StatsPicker } from './StatsPicker/StatsPicker';\nexport { RefreshPicker } from './RefreshPicker/RefreshPicker';\nexport { TimeRangePicker } from './TimePicker/TimeRangePicker';\nexport { TimeOfDayPicker } from './TimePicker/TimeOfDayPicker';\nexport { List } from './List/List';\nexport { TagsInput } from './TagsInput/TagsInput';\nexport { Pagination } from './Pagination/Pagination';\nexport { Tag } from './Tags/Tag';\nexport { TagList } from './Tags/TagList';\nexport { FilterPill } from './FilterPill/FilterPill';\n\nexport { ConfirmModal } from './ConfirmModal/ConfirmModal';\nexport { QueryField } from './QueryField/QueryField';\n\n// TODO: namespace\nexport { Modal } from './Modal/Modal';\nexport { ModalHeader } from './Modal/ModalHeader';\nexport { ModalTabsHeader } from './Modal/ModalTabsHeader';\nexport { ModalTabContent } from './Modal/ModalTabContent';\nexport { ModalsProvider, ModalRoot, ModalsController } from './Modal/ModalsContext';\n\n// Renderless\nexport { SetInterval } from './SetInterval/SetInterval';\n\nexport { Table } from './Table/Table';\nexport { TableCellDisplayMode, TableSortByFieldState } from './Table/types';\nexport { TableInputCSV } from './TableInputCSV/TableInputCSV';\nexport { TabsBar } from './Tabs/TabsBar';\nexport { Tab } from './Tabs/Tab';\nexport { TabContent } from './Tabs/TabContent';\nexport { Counter } from './Tabs/Counter';\n\n// Visualizations\nexport {\n  BigValue,\n  BigValueColorMode,\n  BigValueSparkline,\n  BigValueGraphMode,\n  BigValueJustifyMode,\n} from './BigValue/BigValue';\n\nexport { Gauge } from './Gauge/Gauge';\nexport { Graph } from './Graph/Graph';\nexport { GraphLegend } from './Graph/GraphLegend';\nexport { GraphWithLegend } from './Graph/GraphWithLegend';\nexport { GraphContextMenu } from './Graph/GraphContextMenu';\nexport { BarGauge, BarGaugeDisplayMode } from './BarGauge/BarGauge';\nexport { GraphTooltipOptions } from './Graph/GraphTooltip/types';\nexport { VizRepeater, VizRepeaterRenderValueProps } from './VizRepeater/VizRepeater';\nexport { graphTimeFormat, graphTickFormatter } from './Graph/utils';\n\nexport {\n  LegendOptions,\n  LegendBasicOptions,\n  LegendRenderOptions,\n  LegendList,\n  LegendTable,\n  LegendItem,\n  LegendPlacement,\n  LegendDisplayMode,\n} from './Legend/Legend';\n\nexport { Alert, AlertVariant } from './Alert/Alert';\nexport { GraphSeriesToggler, GraphSeriesTogglerAPI } from './Graph/GraphSeriesToggler';\nexport { Collapse, ControlledCollapse } from './Collapse/Collapse';\nexport { LogLabels } from './Logs/LogLabels';\nexport { LogRows } from './Logs/LogRows';\nexport { getLogRowStyles } from './Logs/getLogRowStyles';\nexport { ToggleButtonGroup, ToggleButton } from './ToggleButtonGroup/ToggleButtonGroup';\n// Panel editors\nexport { FullWidthButtonContainer } from './Button/FullWidthButtonContainer';\nexport { ClickOutsideWrapper } from './ClickOutsideWrapper/ClickOutsideWrapper';\nexport * from './SingleStatShared/index';\nexport { CallToActionCard } from './CallToActionCard/CallToActionCard';\nexport { ContextMenu, ContextMenuItem, ContextMenuGroup, ContextMenuProps } from './ContextMenu/ContextMenu';\nexport { DataLinksInlineEditor } from './DataLinks/DataLinksInlineEditor/DataLinksInlineEditor';\nexport { DataLinkInput } from './DataLinks/DataLinkInput';\nexport { DataLinksContextMenu } from './DataLinks/DataLinksContextMenu';\nexport { SeriesIcon } from './Legend/SeriesIcon';\nexport { InfoBox } from './InfoBox/InfoBox';\nexport { FeatureInfoBox } from './InfoBox/FeatureInfoBox';\n\nexport { JSONFormatter } from './JSONFormatter/JSONFormatter';\nexport { JsonExplorer } from './JSONFormatter/json_explorer/json_explorer';\nexport { ErrorBoundary, ErrorBoundaryAlert } from './ErrorBoundary/ErrorBoundary';\nexport { ErrorWithStack } from './ErrorBoundary/ErrorWithStack';\nexport { AlphaNotice } from './AlphaNotice/AlphaNotice';\nexport { DataSourceHttpSettings } from './DataSourceSettings/DataSourceHttpSettings';\nexport { Spinner } from './Spinner/Spinner';\nexport { FadeTransition } from './transitions/FadeTransition';\nexport { SlideOutTransition } from './transitions/SlideOutTransition';\nexport { Segment, SegmentAsync, SegmentInput, SegmentSelect } from './Segment/';\nexport { default as Chart } from './Chart';\nexport { Drawer } from './Drawer/Drawer';\nexport { Slider } from './Slider/Slider';\n\n// TODO: namespace!!\nexport { StringValueEditor } from './OptionsUI/string';\nexport { NumberValueEditor } from './OptionsUI/number';\nexport { SelectValueEditor } from './OptionsUI/select';\nexport { FieldConfigItemHeaderTitle } from './FieldConfigs/FieldConfigItemHeaderTitle';\n\n// Next-gen forms\nexport { Form } from './Forms/Form';\nexport { InputControl } from './InputControl';\nexport * from './Button';\nexport { ValuePicker } from './ValuePicker/ValuePicker';\nexport { fieldMatchersUI } from './MatchersUI/fieldMatchersUI';\nexport { getFormStyles } from './Forms/getFormStyles';\n\nexport { Label } from './Forms/Label';\nexport { Field } from './Forms/Field';\nexport { Legend } from './Forms/Legend';\n\nexport { default as resetSelectStyles } from './Select/resetSelectStyles';\nexport * from './Select/Select';\nexport { ButtonSelect } from './Select/ButtonSelect';\n\nexport { HorizontalGroup, VerticalGroup, Container } from './Layout/Layout';\nexport { Badge, BadgeColor, BadgeProps } from './Badge/Badge';\nexport { RadioButtonGroup } from './Forms/RadioButtonGroup/RadioButtonGroup';\n\nexport { Input } from './Input/Input';\nexport { FormInputSize } from './Forms/types';\n\nexport { Switch } from './Switch/Switch';\nexport { Checkbox } from './Forms/Checkbox';\n\nexport { TextArea } from './TextArea/TextArea';\n\n// Legacy forms\n\n// Export this until we've figured out a good approach to inline form styles.\nexport { FormLabel as InlineFormLabel } from './FormLabel/FormLabel';\n\n// Select\nimport { Select, AsyncSelect } from './Forms/Legacy/Select/Select';\nimport { IndicatorsContainer } from './Forms/Legacy/Select/IndicatorsContainer';\nimport { NoOptionsMessage } from './Forms/Legacy/Select/NoOptionsMessage';\nimport { ButtonSelect } from './Forms/Legacy/Select/ButtonSelect';\n\n//Input\nimport { Input, LegacyInputStatus } from './Forms/Legacy/Input/Input';\nimport { FormField } from './FormField/FormField';\nimport { SecretFormField } from './SecretFormField/SecretFormField';\n\nimport { Switch } from './Forms/Legacy/Switch/Switch';\n\nconst LegacyForms = {\n  SecretFormField,\n  FormField,\n  Select,\n  AsyncSelect,\n  IndicatorsContainer,\n  NoOptionsMessage,\n  ButtonSelect,\n  Input,\n  Switch,\n};\nexport { LegacyForms, LegacyInputStatus };\n","import map from 'lodash/map';\nimport sortBy from 'lodash/sortBy';\nimport flattenDeep from 'lodash/flattenDeep';\nimport chunk from 'lodash/chunk';\nimport zip from 'lodash/zip';\nimport tinycolor from 'tinycolor2';\n\nexport const PALETTE_ROWS = 4;\nexport const PALETTE_COLUMNS = 14;\nexport const DEFAULT_ANNOTATION_COLOR = 'rgba(0, 211, 255, 1)';\nexport const OK_COLOR = 'rgba(11, 237, 50, 1)';\nexport const ALERTING_COLOR = 'rgba(237, 46, 24, 1)';\nexport const NO_DATA_COLOR = 'rgba(150, 150, 150, 1)';\nexport const PENDING_COLOR = 'rgba(247, 149, 32, 1)';\nexport const REGION_FILL_ALPHA = 0.09;\nexport const colors = [\n  '#7EB26D', // 0: pale green\n  '#EAB839', // 1: mustard\n  '#6ED0E0', // 2: light blue\n  '#EF843C', // 3: orange\n  '#E24D42', // 4: red\n  '#1F78C1', // 5: ocean\n  '#BA43A9', // 6: purple\n  '#705DA0', // 7: violet\n  '#508642', // 8: dark green\n  '#CCA300', // 9: dark sand\n  '#447EBC',\n  '#C15C17',\n  '#890F02',\n  '#0A437C',\n  '#6D1F62',\n  '#584477',\n  '#B7DBAB',\n  '#F4D598',\n  '#70DBED',\n  '#F9BA8F',\n  '#F29191',\n  '#82B5D8',\n  '#E5A8E2',\n  '#AEA2E0',\n  '#629E51',\n  '#E5AC0E',\n  '#64B0C8',\n  '#E0752D',\n  '#BF1B00',\n  '#0A50A1',\n  '#962D82',\n  '#614D93',\n  '#9AC48A',\n  '#F2C96D',\n  '#65C5DB',\n  '#F9934E',\n  '#EA6460',\n  '#5195CE',\n  '#D683CE',\n  '#806EB7',\n  '#3F6833',\n  '#967302',\n  '#2F575E',\n  '#99440A',\n  '#58140C',\n  '#052B51',\n  '#511749',\n  '#3F2B5B',\n  '#E0F9D7',\n  '#FCEACA',\n  '#CFFAFF',\n  '#F9E2D2',\n  '#FCE2DE',\n  '#BADFF4',\n  '#F9D9F9',\n  '#DEDAF7',\n];\n\nfunction sortColorsByHue(hexColors: string[]) {\n  const hslColors = map(hexColors, hexToHsl);\n\n  const sortedHSLColors = sortBy(hslColors, ['h']);\n  const chunkedHSLColors = chunk(sortedHSLColors, PALETTE_ROWS);\n  const sortedChunkedHSLColors = map(chunkedHSLColors, chunk => {\n    return sortBy(chunk, 'l');\n  });\n  const flattenedZippedSortedChunkedHSLColors = flattenDeep(zip(...sortedChunkedHSLColors));\n\n  return map(flattenedZippedSortedChunkedHSLColors, hslToHex);\n}\n\nfunction hexToHsl(color: string) {\n  return tinycolor(color).toHsl();\n}\n\nfunction hslToHex(color: any) {\n  return tinycolor(color).toHexString();\n}\n\nexport let sortedColors = sortColorsByHue(colors);\n","import { ValidationRule, ValidationEvents } from '../types/input';\n\nexport enum EventsWithValidation {\n  onBlur = 'onBlur',\n  onFocus = 'onFocus',\n  onChange = 'onChange',\n}\n\nexport const validate = (value: string, validationRules: ValidationRule[]) => {\n  const errors = validationRules.reduce((acc, currRule) => {\n    if (!currRule.rule(value)) {\n      return acc.concat(currRule.errorMessage);\n    }\n    return acc;\n  }, [] as string[]);\n  return errors.length > 0 ? errors : null;\n};\n\nexport const hasValidationEvent = (event: EventsWithValidation, validationEvents: ValidationEvents | undefined) => {\n  return validationEvents && validationEvents[event];\n};\n\nexport const regexValidation = (pattern: string | RegExp, errorMessage?: string): ValidationRule => {\n  return {\n    rule: (valueToValidate: string) => {\n      return !!valueToValidate.match(pattern);\n    },\n    errorMessage: errorMessage || 'Value is not valid',\n  };\n};\n","const TAG_COLORS = [\n  '#D32D20',\n  '#1E72B8',\n  '#B240A2',\n  '#705DA0',\n  '#466803',\n  '#497A3C',\n  '#3D71AA',\n  '#B15415',\n  '#890F02',\n  '#6E6E6E',\n  '#0A437C',\n  '#6D1F62',\n  '#584477',\n  '#4C7A3F',\n  '#2F4F4F',\n  '#BF1B00',\n  '#7662B1',\n  '#8A2EB8',\n  '#517A00',\n  '#000000',\n  '#3F6833',\n  '#2F575E',\n  '#99440A',\n  '#AE561A',\n  '#0E4AB4',\n  '#58140C',\n  '#052B51',\n  '#511749',\n  '#3F2B5B',\n];\n\nconst TAG_BORDER_COLORS = [\n  '#FF7368',\n  '#459EE7',\n  '#E069CF',\n  '#9683C6',\n  '#6C8E29',\n  '#76AC68',\n  '#6AA4E2',\n  '#E7823D',\n  '#AF3528',\n  '#9B9B9B',\n  '#3069A2',\n  '#934588',\n  '#7E6A9D',\n  '#88C477',\n  '#557575',\n  '#E54126',\n  '#A694DD',\n  '#B054DE',\n  '#8FC426',\n  '#262626',\n  '#658E59',\n  '#557D84',\n  '#BF6A30',\n  '#FF9B53',\n  '#3470DA',\n  '#7E3A32',\n  '#2B5177',\n  '#773D6F',\n  '#655181',\n];\n\n/**\n * Returns tag badge background and border colors based on hashed tag name.\n * @param name tag name\n */\nexport function getTagColorsFromName(name = ''): { color: string; borderColor: string } {\n  const hash = djb2(name.toLowerCase());\n  const index = Math.abs(hash % TAG_COLORS.length);\n  return getTagColor(index);\n}\n\nexport function getTagColor(index: number): { color: string; borderColor: string } {\n  return { color: TAG_COLORS[index], borderColor: TAG_BORDER_COLORS[index] };\n}\n\nfunction djb2(str: string) {\n  let hash = 5381;\n  for (let i = 0; i < str.length; i++) {\n    hash = (hash << 5) + hash + str.charCodeAt(i); /* hash * 33 + c */\n  }\n  return hash;\n}\n\nexport default {\n  getTagColorsFromName,\n};\n","// Slightly modified, but without dependancies:\n// https://raw.githubusercontent.com/malte-wessel/react-custom-scrollbars/master/src/utils/getScrollbarWidth.js\nlet scrollbarWidth: number | null = null;\n\nexport function getScrollbarWidth() {\n  if (scrollbarWidth !== null) {\n    return scrollbarWidth;\n  }\n\n  if (typeof document !== 'undefined') {\n    const div = document.createElement('div');\n    const newStyles = {\n      width: '100px',\n      height: '100px',\n      position: 'absolute',\n      top: '-9999px',\n      overflow: 'scroll',\n      MsOverflowStyle: 'scrollbar',\n    };\n\n    Object.keys(newStyles).map(style => {\n      // @ts-ignore\n      div.style[style] = newStyles[style];\n    });\n\n    document.body.appendChild(div);\n    scrollbarWidth = div.offsetWidth - div.clientWidth;\n    document.body.removeChild(div);\n  } else {\n    scrollbarWidth = 0;\n  }\n  return scrollbarWidth || 0;\n}\n","// Node.closest() polyfill\nif ('Element' in window && !Element.prototype.closest) {\n  Element.prototype.closest = function(this: any, s: string) {\n    const matches = (this.document || this.ownerDocument).querySelectorAll(s);\n    let el = this;\n    let i;\n    // eslint-disable-next-line\n    do {\n      i = matches.length;\n      // eslint-disable-next-line\n      while (--i >= 0 && matches.item(i) !== el) {}\n      el = el.parentElement;\n    } while (i < 0 && el);\n    return el;\n  };\n}\n\nexport function getPreviousCousin(node: any, selector: string) {\n  let sibling = node.parentElement.previousSibling;\n  let el;\n  while (sibling) {\n    el = sibling.querySelector(selector);\n    if (el) {\n      return el;\n    }\n    sibling = sibling.previousSibling;\n  }\n  return undefined;\n}\n\nexport function getNextCharacter(global?: any) {\n  const selection = (global || window).getSelection();\n  if (!selection || !selection.anchorNode) {\n    return null;\n  }\n\n  const range = selection.getRangeAt(0);\n  const text = selection.anchorNode.textContent;\n  const offset = range.startOffset;\n  return text!.substr(offset, 1);\n}\n","import React from 'react';\n\n/**\n * Given react node or function returns element accordingly\n *\n * @param itemToRender\n * @param props props to be passed to the function if item provided as such\n */\nexport function renderOrCallToRender<TProps = any>(\n  itemToRender: ((props?: TProps) => React.ReactNode) | React.ReactNode,\n  props?: TProps\n): React.ReactNode {\n  if (React.isValidElement(itemToRender) || typeof itemToRender === 'string' || typeof itemToRender === 'number') {\n    return itemToRender;\n  }\n\n  if (typeof itemToRender === 'function') {\n    return itemToRender(props);\n  }\n\n  throw new Error(`${itemToRender} is not a React element nor a function that returns React element`);\n}\n","export * from './colors';\nexport * from './validate';\nexport * from './slate';\nexport * from './dataLinks';\nexport * from './tags';\nexport * from './scrollbar';\nexport * from './measureText';\nexport { default as ansicolor } from './ansicolor';\n\nimport * as DOMUtil from './dom'; // includes Element.closest polyfil\nexport { DOMUtil };\nexport { renderOrCallToRender } from './renderOrCallToRender';\n","import xss from 'xss';\nimport { sanitizeUrl as braintreeSanitizeUrl } from '@braintree/sanitize-url';\n\nconst XSSWL = Object.keys(xss.whiteList).reduce((acc, element) => {\n  // @ts-ignore\n  acc[element] = xss.whiteList[element].concat(['class', 'style']);\n  return acc;\n}, {});\n\nconst sanitizeXSS = new xss.FilterXSS({\n  whiteList: XSSWL,\n});\n\n/**\n * Returns string safe from XSS attacks.\n *\n * Even though we allow the style-attribute, there's still default filtering applied to it\n * Info: https://github.com/leizongmin/js-xss#customize-css-filter\n * Whitelist: https://github.com/leizongmin/js-css-filter/blob/master/lib/default.js\n */\nexport function sanitize(unsanitizedString: string): string {\n  try {\n    return sanitizeXSS.process(unsanitizedString);\n  } catch (error) {\n    console.log('String could not be sanitized', unsanitizedString);\n    return unsanitizedString;\n  }\n}\n\nexport function sanitizeUrl(url: string): string {\n  return braintreeSanitizeUrl(url);\n}\n\nexport function hasAnsiCodes(input: string): boolean {\n  return /\\u001b\\[\\d{1,2}m/.test(input);\n}\n\nexport function escapeHtml(str: string): string {\n  return String(str)\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;');\n}\n","import { useEffect } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport { AppEvents, locationUtil } from '@grafana/data';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { SaveDashboardOptions } from './types';\nimport { CoreEvents, StoreState } from 'app/types';\nimport appEvents from 'app/core/app_events';\nimport { updateLocation } from 'app/core/reducers/location';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\n\nconst saveDashboard = async (saveModel: any, options: SaveDashboardOptions, dashboard: DashboardModel) => {\n  const folderId = options.folderId >= 0 ? options.folderId : dashboard.meta.folderId || saveModel.folderId;\n  return await getBackendSrv().saveDashboard(saveModel, { ...options, folderId });\n};\n\nexport const useDashboardSave = (dashboard: DashboardModel) => {\n  const location = useSelector((state: StoreState) => state.location);\n  const dispatch = useDispatch();\n  const [state, onDashboardSave] = useAsyncFn(\n    async (clone: any, options: SaveDashboardOptions, dashboard: DashboardModel) =>\n      await saveDashboard(clone, options, dashboard),\n    []\n  );\n\n  useEffect(() => {\n    if (state.value) {\n      dashboard.version = state.value.version;\n\n      // important that these happen before location redirect below\n      appEvents.emit(CoreEvents.dashboardSaved, dashboard);\n      appEvents.emit(AppEvents.alertSuccess, ['Dashboard saved']);\n\n      const newUrl = locationUtil.stripBaseFromUrl(state.value.url);\n      const currentPath = location.path;\n\n      if (newUrl !== currentPath) {\n        dispatch(\n          updateLocation({\n            path: newUrl,\n            replace: true,\n            query: {},\n          })\n        );\n      }\n    }\n  }, [state]);\n\n  return { state, onDashboardSave };\n};\n","import { ValueMapping, MappingType, ValueMap, RangeMap } from '../types';\n\ntype TimeSeriesValue = string | number | null;\n\nconst addValueToTextMappingText = (\n  allValueMappings: ValueMapping[],\n  valueToTextMapping: ValueMap,\n  value: TimeSeriesValue\n) => {\n  if (valueToTextMapping.value === undefined) {\n    return allValueMappings;\n  }\n\n  if (value === null && isNullValueMap(valueToTextMapping)) {\n    return allValueMappings.concat(valueToTextMapping);\n  }\n\n  const valueAsNumber = parseFloat(value as string);\n  const valueToTextMappingAsNumber = parseFloat(valueToTextMapping.value as string);\n\n  if (isNaN(valueAsNumber) || isNaN(valueToTextMappingAsNumber)) {\n    return allValueMappings;\n  }\n\n  if (valueAsNumber !== valueToTextMappingAsNumber) {\n    return allValueMappings;\n  }\n\n  return allValueMappings.concat(valueToTextMapping);\n};\n\nconst addRangeToTextMappingText = (\n  allValueMappings: ValueMapping[],\n  rangeToTextMapping: RangeMap,\n  value: TimeSeriesValue\n) => {\n  if (rangeToTextMapping.from === undefined || rangeToTextMapping.to === undefined || value === undefined) {\n    return allValueMappings;\n  }\n\n  if (\n    value === null &&\n    rangeToTextMapping.from &&\n    rangeToTextMapping.to &&\n    rangeToTextMapping.from.toLowerCase() === 'null' &&\n    rangeToTextMapping.to.toLowerCase() === 'null'\n  ) {\n    return allValueMappings.concat(rangeToTextMapping);\n  }\n\n  const valueAsNumber = parseFloat(value as string);\n  const fromAsNumber = parseFloat(rangeToTextMapping.from as string);\n  const toAsNumber = parseFloat(rangeToTextMapping.to as string);\n\n  if (isNaN(valueAsNumber) || isNaN(fromAsNumber) || isNaN(toAsNumber)) {\n    return allValueMappings;\n  }\n\n  if (valueAsNumber >= fromAsNumber && valueAsNumber <= toAsNumber) {\n    return allValueMappings.concat(rangeToTextMapping);\n  }\n\n  return allValueMappings;\n};\n\nconst getAllFormattedValueMappings = (valueMappings: ValueMapping[], value: TimeSeriesValue) => {\n  const allFormattedValueMappings = valueMappings.reduce((allValueMappings, valueMapping) => {\n    if (valueMapping.type === MappingType.ValueToText) {\n      allValueMappings = addValueToTextMappingText(allValueMappings, valueMapping as ValueMap, value);\n    } else if (valueMapping.type === MappingType.RangeToText) {\n      allValueMappings = addRangeToTextMappingText(allValueMappings, valueMapping as RangeMap, value);\n    }\n\n    return allValueMappings;\n  }, [] as ValueMapping[]);\n\n  allFormattedValueMappings.sort((t1, t2) => {\n    return t1.id - t2.id;\n  });\n\n  return allFormattedValueMappings;\n};\n\nexport const getMappedValue = (valueMappings: ValueMapping[], value: TimeSeriesValue): ValueMapping => {\n  return getAllFormattedValueMappings(valueMappings, value)[0];\n};\n\nconst isNullValueMap = (mapping: ValueMap): boolean => {\n  if (!mapping || !mapping.value) {\n    return false;\n  }\n  return mapping.value.toLowerCase() === 'null';\n};\n","import { stylesFactory } from '../../themes/stylesFactory';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\n\nexport const getSelectStyles = stylesFactory((theme: GrafanaTheme) => {\n  const bgColor = theme.colors.formInputBg;\n  const menuShadowColor = theme.colors.dropdownShadow;\n  const optionBgHover = theme.colors.dropdownOptionHoverBg;\n  const multiValueContainerBg = theme.colors.bg2;\n  const multiValueColor = theme.colors.text;\n\n  return {\n    menu: css`\n      background: ${bgColor};\n      box-shadow: 0px 4px 4px ${menuShadowColor};\n      position: relative;\n      min-width: 100%;\n      z-index: 1;\n    `,\n    option: css`\n      padding: 8px;\n      display: flex;\n      align-items: center;\n      flex-direction: row;\n      flex-shrink: 0;\n      white-space: nowrap;\n      cursor: pointer;\n      border-left: 2px solid transparent;\n      &:hover {\n        background: ${optionBgHover};\n      }\n    `,\n    optionImage: css`\n      width: 16px;\n      margin-right: 10px;\n    `,\n    optionDescription: css`\n      font-weight: normal;\n      font-size: ${theme.typography.size.sm};\n      color: ${theme.colors.textWeak};\n      white-space: normal;\n    `,\n    optionBody: css`\n      display: flex;\n      font-weight: ${theme.typography.weight.semibold};\n      flex-direction: column;\n      flex-grow: 1;\n    `,\n    optionFocused: css`\n      background: ${optionBgHover};\n      border-image: linear-gradient(#f05a28 30%, #fbca0a 99%);\n      border-image-slice: 1;\n      border-style: solid;\n      border-top: 0;\n      border-right: 0;\n      border-bottom: 0;\n      border-left-width: 2px;\n    `,\n    singleValue: css`\n      color: ${theme.colors.formInputText};\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      box-sizing: border-box;\n      max-width: 100%;\n    `,\n    valueContainer: css`\n      align-items: center;\n      display: flex;\n      position: relative;\n      box-sizing: border-box;\n      flex: 1 1 0%;\n      outline: none;\n      overflow: hidden;\n    `,\n    valueContainerMulti: css`\n      flex-wrap: wrap;\n    `,\n    loadingMessage: css`\n      padding: ${theme.spacing.sm};\n      text-align: center;\n      width: 100%;\n    `,\n    multiValueContainer: css`\n      display: flex;\n      align-items: center;\n      line-height: 1;\n      background: ${multiValueContainerBg};\n      border-radius: ${theme.border.radius.sm};\n      margin: 0 ${theme.spacing.sm} 0 0;\n      padding: ${theme.spacing.xxs} 0 ${theme.spacing.xxs} ${theme.spacing.sm};\n      color: ${multiValueColor};\n      font-size: ${theme.typography.size.sm};\n    `,\n    multiValueRemove: css`\n      margin: 0 ${theme.spacing.xs};\n    `,\n  };\n});\n","import React from 'react';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { getSelectStyles } from './getSelectStyles';\nimport { cx } from 'emotion';\nimport { SelectableValue } from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\n\ninterface SelectMenuProps {\n  maxHeight: number;\n  innerRef: React.Ref<any>;\n  innerProps: {};\n}\n\nexport const SelectMenu = React.forwardRef<HTMLDivElement, React.PropsWithChildren<SelectMenuProps>>((props, ref) => {\n  const theme = useTheme();\n  const styles = getSelectStyles(theme);\n  const { children, maxHeight, innerRef, innerProps } = props;\n\n  return (\n    <div {...innerProps} className={styles.menu} ref={innerRef} style={{ maxHeight }} aria-label=\"Select options menu\">\n      <CustomScrollbar autoHide={false} autoHeightMax=\"inherit\" hideHorizontalTrack>\n        {children}\n      </CustomScrollbar>\n    </div>\n  );\n});\n\nSelectMenu.displayName = 'SelectMenu';\n\ninterface SelectMenuOptionProps<T> {\n  isDisabled: boolean;\n  isFocused: boolean;\n  isSelected: boolean;\n  innerProps: any;\n  renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n  data: SelectableValue<T>;\n}\n\nexport const SelectMenuOptions = React.forwardRef<HTMLDivElement, React.PropsWithChildren<SelectMenuOptionProps<any>>>(\n  (props, ref) => {\n    const theme = useTheme();\n    const styles = getSelectStyles(theme);\n    const { children, innerProps, data, renderOptionLabel, isSelected, isFocused } = props;\n\n    return (\n      <div\n        ref={ref}\n        className={cx(styles.option, isFocused && styles.optionFocused)}\n        {...innerProps}\n        aria-label=\"Select option\"\n      >\n        {data.imgUrl && <img className={styles.optionImage} src={data.imgUrl} />}\n        <div className={styles.optionBody}>\n          <span>{renderOptionLabel ? renderOptionLabel(data) : children}</span>\n          {data.description && <div className={styles.optionDescription}>{data.description}</div>}\n        </div>\n        {isSelected && (\n          <span>\n            <Icon name=\"check\" />\n          </span>\n        )}\n      </div>\n    );\n  }\n);\n","import React from 'react';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { getInputStyles } from '../Input/Input';\nimport { cx, css } from 'emotion';\n\nexport const IndicatorsContainer = React.forwardRef<HTMLDivElement, React.PropsWithChildren<any>>((props, ref) => {\n  const { children } = props;\n  const theme = useTheme();\n  const styles = getInputStyles({ theme, invalid: false });\n\n  return (\n    <div\n      className={cx(\n        styles.suffix,\n        css`\n          position: relative;\n        `\n      )}\n      ref={ref}\n    >\n      {children}\n    </div>\n  );\n});\n","import React, { ReactNode } from 'react';\nimport { cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { withTheme } from '../../themes/ThemeContext';\nimport { getSelectStyles } from './getSelectStyles';\n\nclass UnthemedValueContainer extends React.Component<any & { theme: GrafanaTheme }> {\n  render() {\n    const { children } = this.props;\n    const { selectProps } = this.props;\n\n    if (\n      selectProps &&\n      Array.isArray(children) &&\n      Array.isArray(children[0]) &&\n      selectProps.maxVisibleValues !== undefined &&\n      !(selectProps.showAllSelectedWhenOpen && selectProps.menuIsOpen)\n    ) {\n      const [valueChildren, ...otherChildren] = children;\n      const truncatedValues = valueChildren.slice(0, selectProps.maxVisibleValues);\n\n      return this.renderContainer([truncatedValues, ...otherChildren]);\n    }\n\n    return this.renderContainer(children);\n  }\n\n  renderContainer(children?: ReactNode) {\n    const { isMulti, theme } = this.props;\n    const styles = getSelectStyles(theme);\n    const className = cx(styles.valueContainer, isMulti && styles.valueContainerMulti);\n    return <div className={className}>{children}</div>;\n  }\n}\n\nexport const ValueContainer = withTheme(UnthemedValueContainer);\n","import React from 'react';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { sharedInputStyle } from '../Forms/commonStyles';\nimport { getInputStyles } from '../Input/Input';\nimport { css, cx } from 'emotion';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { focusCss } from '../../themes/mixins';\n\ninterface InputControlProps {\n  /** Show an icon as a prefix in the input */\n  prefix?: JSX.Element | string | null;\n  focused: boolean;\n  invalid: boolean;\n  disabled: boolean;\n  innerProps: any;\n}\n\nconst getInputControlStyles = stylesFactory(\n  (theme: GrafanaTheme, invalid: boolean, focused: boolean, disabled: boolean, withPrefix: boolean) => {\n    const styles = getInputStyles({ theme, invalid });\n\n    return {\n      wrapper: cx(\n        styles.wrapper,\n        sharedInputStyle(theme, invalid),\n        focused &&\n          css`\n            ${focusCss(theme)}\n          `,\n        disabled && styles.inputDisabled,\n        css`\n          min-height: 32px;\n          height: auto;\n          flex-direction: row;\n          padding-right: 0;\n          max-width: 100%;\n          align-items: center;\n          cursor: default;\n          display: flex;\n          flex-wrap: wrap;\n          justify-content: space-between;\n          position: relative;\n          box-sizing: border-box;\n        `,\n        withPrefix &&\n          css`\n            padding-left: 0;\n          `\n      ),\n      prefix: cx(\n        styles.prefix,\n        css`\n          position: relative;\n        `\n      ),\n    };\n  }\n);\n\nexport const InputControl = React.forwardRef<HTMLDivElement, React.PropsWithChildren<InputControlProps>>(\n  function InputControl({ focused, invalid, disabled, children, innerProps, prefix, ...otherProps }, ref) {\n    const theme = useTheme();\n    const styles = getInputControlStyles(theme, invalid, focused, disabled, !!prefix);\n    return (\n      <div className={styles.wrapper} {...innerProps} ref={ref}>\n        {prefix && <div className={cx(styles.prefix)}>{prefix}</div>}\n        {children}\n      </div>\n    );\n  }\n);\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\n\ninterface DropdownIndicatorProps {\n  isOpen: boolean;\n}\n\nexport const DropdownIndicator: React.FC<DropdownIndicatorProps> = ({ isOpen }) => {\n  const icon = isOpen ? 'angle-up' : 'angle-down';\n  return <Icon name={icon} />;\n};\n","import React from 'react';\nimport { useTheme } from '../../themes';\nimport { getSelectStyles } from './getSelectStyles';\nimport { Icon } from '../Icon/Icon';\n\ninterface MultiValueContainerProps {\n  innerProps: any;\n}\n\nexport const MultiValueContainer: React.FC<MultiValueContainerProps> = ({ innerProps, children }) => {\n  const theme = useTheme();\n  const styles = getSelectStyles(theme);\n\n  return (\n    <div {...innerProps} className={styles.multiValueContainer}>\n      {children}\n    </div>\n  );\n};\n\nexport type MultiValueRemoveProps = {\n  innerProps: any;\n};\n\nexport const MultiValueRemove: React.FC<MultiValueRemoveProps> = ({ children, innerProps }) => {\n  const theme = useTheme();\n  const styles = getSelectStyles(theme);\n  return (\n    <div {...innerProps} className={styles.multiValueRemove}>\n      <Icon name=\"times\" size=\"sm\" />\n    </div>\n  );\n};\n","import { SelectableValue } from '@grafana/data';\nimport { SelectOptions } from './types';\n\n/**\n * Normalize the value format to SelectableValue[] | []. Only used for single select\n */\nexport const cleanValue = (value: any, options: SelectOptions): SelectableValue[] | [] => {\n  if (Array.isArray(value)) {\n    return value.filter(Boolean);\n  }\n  if (typeof value === 'object' && value !== null) {\n    return [value];\n  }\n  if (typeof value === 'string' || typeof value === 'number') {\n    const selectedValue = findSelectedValue(value, options);\n    if (selectedValue) {\n      return [selectedValue];\n    }\n  }\n  return [];\n};\n\n/**\n * Find the label for a string|number value inside array of options or optgroups\n */\nexport const findSelectedValue = (value: string | number, options: SelectOptions): SelectableValue | null => {\n  for (const option of options) {\n    if ('options' in option) {\n      let found = findSelectedValue(value, option.options);\n      if (found) {\n        return found;\n      }\n    } else if ('value' in option && option.value === value) {\n      return option;\n    }\n  }\n\n  return null;\n};\n","import React, { useCallback } from 'react';\n// @ts-ignore\nimport { default as ReactSelect } from '@torkelo/react-select';\n// @ts-ignore\nimport Creatable from '@torkelo/react-select/creatable';\n// @ts-ignore\nimport { default as ReactAsyncSelect } from '@torkelo/react-select/async';\n// @ts-ignore\nimport { default as AsyncCreatable } from '@torkelo/react-select/async-creatable';\n\nimport { Icon } from '../Icon/Icon';\nimport { css, cx } from 'emotion';\nimport resetSelectStyles from './resetSelectStyles';\nimport { SelectMenu, SelectMenuOptions } from './SelectMenu';\nimport { IndicatorsContainer } from './IndicatorsContainer';\nimport { ValueContainer } from './ValueContainer';\nimport { InputControl } from './InputControl';\nimport { DropdownIndicator } from './DropdownIndicator';\nimport { SelectOptionGroup } from './SelectOptionGroup';\nimport { SingleValue } from './SingleValue';\nimport { MultiValueContainer, MultiValueRemove } from './MultiValue';\nimport { useTheme } from '../../themes';\nimport { getSelectStyles } from './getSelectStyles';\nimport { cleanValue } from './utils';\nimport { SelectBaseProps, SelectValue } from './types';\n\ninterface ExtraValuesIndicatorProps {\n  maxVisibleValues?: number | undefined;\n  selectedValuesCount: number;\n  menuIsOpen: boolean;\n  showAllSelectedWhenOpen: boolean;\n}\n\nconst renderExtraValuesIndicator = (props: ExtraValuesIndicatorProps) => {\n  const { maxVisibleValues, selectedValuesCount, menuIsOpen, showAllSelectedWhenOpen } = props;\n\n  if (\n    maxVisibleValues !== undefined &&\n    selectedValuesCount > maxVisibleValues &&\n    !(showAllSelectedWhenOpen && menuIsOpen)\n  ) {\n    return (\n      <span key=\"excess-values\" id=\"excess-values\">\n        (+{selectedValuesCount - maxVisibleValues})\n      </span>\n    );\n  }\n\n  return null;\n};\n\nconst CustomControl = (props: any) => {\n  const {\n    children,\n    innerProps,\n    selectProps: { menuIsOpen, onMenuClose, onMenuOpen },\n    isFocused,\n    isMulti,\n    getValue,\n    innerRef,\n  } = props;\n  const selectProps = props.selectProps as SelectBaseProps<any>;\n\n  if (selectProps.renderControl) {\n    return React.createElement(selectProps.renderControl, {\n      isOpen: menuIsOpen,\n      value: isMulti ? getValue() : getValue()[0],\n      ref: innerRef,\n      onClick: menuIsOpen ? onMenuClose : onMenuOpen,\n      onBlur: onMenuClose,\n      disabled: !!selectProps.disabled,\n      invalid: !!selectProps.invalid,\n    });\n  }\n\n  return (\n    <InputControl\n      ref={innerRef}\n      innerProps={innerProps}\n      prefix={selectProps.prefix}\n      focused={isFocused}\n      invalid={!!selectProps.invalid}\n      disabled={!!selectProps.disabled}\n    >\n      {children}\n    </InputControl>\n  );\n};\n\nexport function SelectBase<T>({\n  allowCustomValue = false,\n  autoFocus = false,\n  backspaceRemovesValue = true,\n  cacheOptions,\n  className,\n  closeMenuOnSelect = true,\n  components,\n  defaultOptions,\n  defaultValue,\n  disabled = false,\n  filterOption,\n  formatCreateLabel,\n  getOptionLabel,\n  getOptionValue,\n  inputValue,\n  invalid,\n  isClearable = false,\n  isLoading = false,\n  isMulti = false,\n  isOpen,\n  isOptionDisabled,\n  isSearchable = true,\n  loadOptions,\n  loadingMessage = 'Loading options...',\n  maxMenuHeight = 300,\n  maxVisibleValues,\n  menuPlacement = 'auto',\n  menuPosition,\n  noOptionsMessage = 'No options found',\n  onBlur,\n  onChange,\n  onCloseMenu,\n  onCreateOption,\n  onInputChange,\n  onKeyDown,\n  onOpenMenu,\n  openMenuOnFocus = false,\n  options = [],\n  placeholder = 'Choose',\n  prefix,\n  renderControl,\n  showAllSelectedWhenOpen = true,\n  tabSelectsValue = true,\n  value,\n  width,\n}: SelectBaseProps<T>) {\n  const theme = useTheme();\n  const styles = getSelectStyles(theme);\n  const onChangeWithEmpty = useCallback(\n    (value: SelectValue<T>) => {\n      if (isMulti && (value === undefined || value === null)) {\n        return onChange([]);\n      }\n      onChange(value);\n    },\n    [isMulti, value, onChange]\n  );\n  let ReactSelectComponent: ReactSelect | Creatable = ReactSelect;\n  const creatableProps: any = {};\n  let asyncSelectProps: any = {};\n  let selectedValue = [];\n  if (isMulti && loadOptions) {\n    selectedValue = value as any;\n  } else {\n    // If option is passed as a plain value (value property from SelectableValue property)\n    // we are selecting the corresponding value from the options\n    if (isMulti && value && Array.isArray(value) && !loadOptions) {\n      // @ts-ignore\n      selectedValue = value.map(v => {\n        return options.filter(o => {\n          return v === o.value || o.value === v.value;\n        })[0];\n      });\n    } else if (loadOptions) {\n      const hasValue = defaultValue || value;\n      selectedValue = hasValue ? [hasValue] : [];\n    } else {\n      selectedValue = cleanValue(value, options);\n    }\n  }\n\n  const commonSelectProps = {\n    autoFocus,\n    backspaceRemovesValue,\n    captureMenuScroll: false,\n    closeMenuOnSelect,\n    defaultValue,\n    // Also passing disabled, as this is the new Select API, and I want to use this prop instead of react-select's one\n    disabled,\n    filterOption,\n    getOptionLabel,\n    getOptionValue,\n    inputValue,\n    invalid,\n    isClearable,\n    // Passing isDisabled as react-select accepts this prop\n    isDisabled: disabled,\n    isLoading,\n    isMulti,\n    isOptionDisabled,\n    isSearchable,\n    maxMenuHeight,\n    maxVisibleValues,\n    menuIsOpen: isOpen,\n    menuPlacement,\n    menuPosition,\n    menuShouldScrollIntoView: false,\n    onBlur,\n    onChange: onChangeWithEmpty,\n    onInputChange,\n    onKeyDown,\n    onMenuClose: onCloseMenu,\n    onMenuOpen: onOpenMenu,\n    openMenuOnFocus,\n    options,\n    placeholder,\n    prefix,\n    renderControl,\n    showAllSelectedWhenOpen,\n    tabSelectsValue,\n    value: isMulti ? selectedValue : selectedValue[0],\n  };\n\n  if (allowCustomValue) {\n    ReactSelectComponent = Creatable;\n    creatableProps.formatCreateLabel = formatCreateLabel ?? ((input: string) => `Create: ${input}`);\n    creatableProps.onCreateOption = onCreateOption;\n  }\n\n  // Instead of having AsyncSelect, as a separate component we render ReactAsyncSelect\n  if (loadOptions) {\n    ReactSelectComponent = allowCustomValue ? AsyncCreatable : ReactAsyncSelect;\n    asyncSelectProps = {\n      loadOptions,\n      cacheOptions,\n      defaultOptions,\n    };\n  }\n\n  return (\n    <>\n      <ReactSelectComponent\n        components={{\n          MenuList: SelectMenu,\n          Group: SelectOptionGroup,\n          ValueContainer,\n          Placeholder: (props: any) => (\n            <div\n              {...props.innerProps}\n              className={cx(\n                css(props.getStyles('placeholder', props)),\n                css`\n                  display: inline-block;\n                  color: ${theme.colors.formInputPlaceholderText};\n                  position: absolute;\n                  top: 50%;\n                  transform: translateY(-50%);\n                  box-sizing: border-box;\n                  line-height: 1;\n                `\n              )}\n            >\n              {props.children}\n            </div>\n          ),\n          IndicatorsContainer: (props: any) => {\n            const { selectProps } = props;\n            const { value, showAllSelectedWhenOpen, maxVisibleValues, menuIsOpen } = selectProps;\n\n            if (maxVisibleValues !== undefined) {\n              const selectedValuesCount = value.length;\n              const indicatorChildren = [...props.children];\n              indicatorChildren.splice(\n                -1,\n                0,\n                renderExtraValuesIndicator({\n                  maxVisibleValues,\n                  selectedValuesCount,\n                  showAllSelectedWhenOpen,\n                  menuIsOpen,\n                })\n              );\n              return <IndicatorsContainer {...props} children={indicatorChildren} />;\n            }\n\n            return <IndicatorsContainer {...props} />;\n          },\n          IndicatorSeparator: () => <></>,\n          Control: CustomControl,\n          Option: SelectMenuOptions,\n          ClearIndicator: (props: any) => {\n            const { clearValue } = props;\n            return (\n              <Icon\n                name=\"times\"\n                onMouseDown={e => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  clearValue();\n                }}\n              />\n            );\n          },\n          LoadingIndicator: (props: any) => {\n            return <Icon className=\"fa-spin\" name=\"fa fa-spinner\" />;\n          },\n          LoadingMessage: (props: any) => {\n            return <div className={styles.loadingMessage}>{loadingMessage}</div>;\n          },\n          NoOptionsMessage: (props: any) => {\n            return (\n              <div className={styles.loadingMessage} aria-label=\"No options provided\">\n                {noOptionsMessage}\n              </div>\n            );\n          },\n          DropdownIndicator: (props: any) => <DropdownIndicator isOpen={props.selectProps.menuIsOpen} />,\n          SingleValue: SingleValue,\n          MultiValueContainer: MultiValueContainer,\n          MultiValueRemove: MultiValueRemove,\n          ...components,\n        }}\n        styles={{\n          ...resetSelectStyles(),\n          menuPortal: ({ position, width }: any) => ({\n            position,\n            width,\n            zIndex: theme.zIndex.dropdown,\n          }),\n          //These are required for the menu positioning to function\n          menu: ({ top, bottom, position }: any) => ({\n            top,\n            bottom,\n            position,\n            marginBottom: !!bottom ? '10px' : '0',\n            minWidth: '100%',\n            zIndex: theme.zIndex.dropdown,\n          }),\n          container: () => ({\n            position: 'relative',\n            width: width ? `${8 * width}px` : '100%',\n          }),\n          option: (provided: any, state: any) => ({\n            ...provided,\n            opacity: state.isDisabled ? 0.5 : 1,\n          }),\n        }}\n        className={className}\n        {...commonSelectProps}\n        {...creatableProps}\n        {...asyncSelectProps}\n      />\n    </>\n  );\n}\n","var path = 'public/app/features/panel/panellinks/module.html';\nvar html = \"<div class=editor-row>\\n  <div class=gf-form-group ng-repeat=\\\"link in panel.links\\\">\\n    <div class=section>\\n      <div class=\\\"gf-form max-width-25\\\">\\n        <span class=\\\"gf-form-label width-7\\\">Type</span>\\n        <div class=\\\"gf-form-select-wrapper gf-form--grow\\\">\\n          <select class=gf-form-input ng-model=link.type ng-options=\\\"f for f in ['dashboard','absolute']\\\"></select>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"gf-form max-width-25\\\">\\n        <span class=\\\"gf-form-label width-7\\\" ng-show=\\\"link.type === 'dashboard'\\\">Dashboard</span>\\n        <input ng-show=\\\"link.type === 'dashboard'\\\" type=text ng-model=link.dashboard bs-typeahead=searchDashboards class=gf-form-input ng-blur=dashboardChanged(link) />\\n\\n        <span class=\\\"gf-form-label width-7\\\" ng-show=\\\"link.type === 'absolute'\\\">Url</span>\\n        <input ng-show=\\\"link.type === 'absolute'\\\" type=text ng-model=link.url class=\\\"gf-form-input max-width-14\\\"/>\\n      </div>\\n\\n      <div class=\\\"gf-form max-width-25\\\">\\n        <div class=\\\"gf-form-label width-7\\\">Title</div>\\n        <input type=text ng-model=link.title class=gf-form-input />\\n      </div>\\n    </div>\\n\\n    <div class=section>\\n      <div class=gf-form>\\n        <span class=\\\"gf-form-label width-10\\\">Url params</span>\\n        <input type=text ng-model=link.params class=\\\"gf-form-input width-10\\\"/>\\n      </div>\\n\\n      <gf-form-switch class=gf-form label-class=width-10 label=\\\"Include time range\\\" checked=link.keepTime></gf-form-switch>\\n      <gf-form-switch class=gf-form label-class=width-10 label=\\\"Include variables\\\" checked=link.includeVars></gf-form-switch>\\n      <gf-form-switch class=gf-form label-class=width-10 label=\\\"Open in new tab \\\" checked=link.targetBlank></gf-form-switch>\\n    </div>\\n\\n    <div class=section>\\n      <div class=gf-form>\\n        <button class=\\\"btn btn-inverse gf-form-btn\\\" ng-click=deleteLink(link)>\\n          <icon name=trash-alt></icon> Remove Link\\n        </button>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\\n<div class=editor-row>\\n  <button class=\\\"btn btn-inverse\\\" ng-click=addLink()><icon name=\\\"'plus'\\\"></icon> Add link</button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import _ from 'lodash';\nimport { DataQuery } from '@grafana/data';\n\nexport const getNextRefIdChar = (queries: DataQuery[]): string | undefined => {\n  const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n  return _.find(letters, refId => {\n    return _.every(queries, other => {\n      return other.refId !== refId;\n    });\n  });\n};\n\nexport function addQuery(queries: DataQuery[], query?: Partial<DataQuery>): DataQuery[] {\n  const q = query || {};\n  q.refId = getNextRefIdChar(queries);\n  return [...queries, q as DataQuery];\n}\n","var path = 'public/app/plugins/datasource/elasticsearch/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl can-collapse=true>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Query</label>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.target.query spellcheck=false placeholder=\\\"Lucene query\\\" ng-blur=ctrl.refresh()>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Alias</label>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.target.alias spellcheck=false placeholder=\\\"alias patterns\\\" ng-blur=ctrl.refresh()>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div ng-repeat=\\\"agg in ctrl.target.metrics\\\">\\n\\t\\t<elastic-metric-agg target=ctrl.target index=$index get-fields=ctrl.getFields($fieldType) on-change=ctrl.queryUpdated() es-version=ctrl.esVersion>\\n\\t\\t</elastic-metric-agg>\\n\\t</div>\\n\\n\\t<div ng-repeat=\\\"agg in ctrl.target.bucketAggs\\\">\\n\\t\\t<elastic-bucket-agg target=ctrl.target index=$index get-fields=ctrl.getFields($fieldType) on-change=ctrl.queryUpdated()>\\n\\t\\t</elastic-bucket-agg>\\n\\t</div>\\n\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { PureComponent } from 'react';\nimport ReactDOM from 'react-dom';\n\nexport interface Props {\n  /**\n   *  When clicking outside of current element\n   */\n  onClick: () => void;\n  /**\n   *  Runs the 'onClick' function when pressing a key outside of the current element. Defaults to true.\n   */\n  includeButtonPress: boolean;\n}\n\ninterface State {\n  hasEventListener: boolean;\n}\n\nexport class ClickOutsideWrapper extends PureComponent<Props, State> {\n  static defaultProps = {\n    includeButtonPress: true,\n  };\n  state = {\n    hasEventListener: false,\n  };\n\n  componentDidMount() {\n    window.addEventListener('click', this.onOutsideClick, false);\n    if (this.props.includeButtonPress) {\n      // Use keyup since keydown already has an eventlistener on window\n      window.addEventListener('keyup', this.onOutsideClick, false);\n    }\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('click', this.onOutsideClick, false);\n    if (this.props.includeButtonPress) {\n      window.addEventListener('keyup', this.onOutsideClick, false);\n    }\n  }\n\n  onOutsideClick = (event: any) => {\n    const domNode = ReactDOM.findDOMNode(this) as Element;\n\n    if (!domNode || !domNode.contains(event.target)) {\n      this.props.onClick();\n    }\n  };\n\n  render() {\n    return this.props.children;\n  }\n}\n","import React, { FunctionComponent } from 'react';\nimport { SelectableStrings } from '../types';\nimport { SelectableValue } from '@grafana/data';\nimport { Segment, Icon } from '@grafana/ui';\n\nexport interface Props {\n  values: string[];\n  onChange: (values: string[]) => void;\n  variableOptionGroup: SelectableValue<string>;\n  stats: SelectableStrings;\n}\n\nconst removeText = '-- remove stat --';\nconst removeOption: SelectableValue<string> = { label: removeText, value: removeText };\n\nexport const Stats: FunctionComponent<Props> = ({ stats, values, onChange, variableOptionGroup }) => (\n  <>\n    {values &&\n      values.map((value, index) => (\n        <Segment\n          allowCustomValue\n          key={value + index}\n          value={value}\n          options={[removeOption, ...stats, variableOptionGroup]}\n          onChange={({ value }) =>\n            onChange(\n              value === removeText\n                ? values.filter((_, i) => i !== index)\n                : values.map((v, i) => (i === index ? value : v))\n            )\n          }\n        />\n      ))}\n    <Segment\n      Component={\n        <a className=\"gf-form-label query-part\">\n          <Icon name=\"plus\" />\n        </a>\n      }\n      allowCustomValue\n      onChange={({ value }) => onChange([...values, value])}\n      options={[...stats.filter(({ value }) => !values.includes(value)), variableOptionGroup]}\n    />\n  </>\n);\n","import React, { FunctionComponent, Fragment, useState, useEffect } from 'react';\nimport isEqual from 'lodash/isEqual';\nimport { SelectableValue } from '@grafana/data';\nimport { SegmentAsync, Icon } from '@grafana/ui';\nimport { SelectableStrings } from '../types';\n\nexport interface Props {\n  dimensions: { [key: string]: string | string[] };\n  onChange: (dimensions: { [key: string]: string }) => void;\n  loadValues: (key: string) => Promise<SelectableStrings>;\n  loadKeys: () => Promise<SelectableStrings>;\n}\n\nconst removeText = '-- remove dimension --';\nconst removeOption: SelectableValue<string> = { label: removeText, value: removeText };\n\n// The idea of this component is that is should only trigger the onChange event in the case\n// there is a complete dimension object. E.g, when a new key is added is doesn't have a value.\n// That should not trigger onChange.\nexport const Dimensions: FunctionComponent<Props> = ({ dimensions, loadValues, loadKeys, onChange }) => {\n  const [data, setData] = useState(dimensions);\n\n  useEffect(() => {\n    const completeDimensions = Object.entries(data).reduce(\n      (res, [key, value]) => (value ? { ...res, [key]: value } : res),\n      {}\n    );\n    if (!isEqual(completeDimensions, dimensions)) {\n      onChange(completeDimensions);\n    }\n  }, [data]);\n\n  const excludeUsedKeys = (options: SelectableStrings) => {\n    return options.filter(({ value }) => !Object.keys(data).includes(value));\n  };\n\n  return (\n    <>\n      {Object.entries(data).map(([key, value], index) => (\n        <Fragment key={index}>\n          <SegmentAsync\n            allowCustomValue\n            value={key}\n            loadOptions={() => loadKeys().then(keys => [removeOption, ...excludeUsedKeys(keys)])}\n            onChange={({ value: newKey }) => {\n              const { [key]: value, ...newDimensions } = data;\n              if (newKey === removeText) {\n                setData({ ...newDimensions });\n              } else {\n                setData({ ...newDimensions, [newKey]: '' });\n              }\n            }}\n          />\n          <label className=\"gf-form-label query-segment-operator\">=</label>\n          <SegmentAsync\n            allowCustomValue\n            value={value}\n            placeholder=\"select dimension value\"\n            loadOptions={() => loadValues(key)}\n            onChange={({ value: newValue }) => setData({ ...data, [key]: newValue })}\n          />\n          {Object.values(data).length > 1 && index + 1 !== Object.values(data).length && (\n            <label className=\"gf-form-label query-keyword\">AND</label>\n          )}\n        </Fragment>\n      ))}\n      {Object.values(data).every(v => v) && (\n        <SegmentAsync\n          allowCustomValue\n          Component={\n            <a className=\"gf-form-label query-part\">\n              <Icon name=\"plus\" />\n            </a>\n          }\n          loadOptions={() => loadKeys().then(excludeUsedKeys)}\n          onChange={({ value: newKey }) => setData({ ...data, [newKey]: '' })}\n        />\n      )}\n    </>\n  );\n};\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes<HTMLInputElement> {\n  label: string;\n  tooltip?: string;\n  children?: React.ReactNode;\n}\n\nexport const QueryField: FunctionComponent<Partial<Props>> = ({ label, tooltip, children }) => (\n  <>\n    <InlineFormLabel width={8} className=\"query-keyword\" tooltip={tooltip}>\n      {label}\n    </InlineFormLabel>\n    {children}\n  </>\n);\n\nexport const QueryInlineField: FunctionComponent<Props> = ({ ...props }) => {\n  return (\n    <div className={'gf-form-inline'}>\n      <QueryField {...props} />\n      <div className=\"gf-form gf-form--grow\">\n        <div className=\"gf-form-label gf-form-label--grow\" />\n      </div>\n    </div>\n  );\n};\n","import React, { FunctionComponent, useState } from 'react';\nimport { debounce } from 'lodash';\nimport { LegacyForms } from '@grafana/ui';\nconst { Input } = LegacyForms;\n\nexport interface Props {\n  onChange: (alias: any) => void;\n  value: string;\n}\n\nexport const Alias: FunctionComponent<Props> = ({ value = '', onChange }) => {\n  const [alias, setAlias] = useState(value);\n\n  const propagateOnChange = debounce(onChange, 1500);\n\n  onChange = (e: any) => {\n    setAlias(e.target.value);\n    propagateOnChange(e.target.value);\n  };\n\n  return <Input type=\"text\" className=\"gf-form-input width-16\" value={alias} onChange={onChange} />;\n};\n","import React, { useState, useEffect } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Segment, SegmentAsync } from '@grafana/ui';\nimport { CloudWatchQuery, SelectableStrings, CloudWatchMetricsQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { Stats, Dimensions, QueryInlineField } from '.';\n\nexport type Props = {\n  query: CloudWatchQuery;\n  datasource: CloudWatchDatasource;\n  onRunQuery?: () => void;\n  onChange: (value: CloudWatchQuery) => void;\n};\n\ninterface State {\n  regions: SelectableStrings;\n  namespaces: SelectableStrings;\n  metricNames: SelectableStrings;\n  variableOptionGroup: SelectableValue<string>;\n  showMeta: boolean;\n}\n\nexport function MetricsQueryFieldsEditor({\n  query,\n  datasource,\n  onChange,\n  onRunQuery = () => {},\n}: React.PropsWithChildren<Props>) {\n  const metricsQuery = query as CloudWatchMetricsQuery;\n\n  const [state, setState] = useState<State>({\n    regions: [],\n    namespaces: [],\n    metricNames: [],\n    variableOptionGroup: {},\n    showMeta: false,\n  });\n\n  useEffect(() => {\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      options: datasource.variables.map(toOption),\n    };\n\n    Promise.all([datasource.metricFindQuery('regions()'), datasource.metricFindQuery('namespaces()')]).then(\n      ([regions, namespaces]) => {\n        setState({\n          ...state,\n          regions: [...regions, variableOptionGroup],\n          namespaces: [...namespaces, variableOptionGroup],\n          variableOptionGroup,\n        });\n      }\n    );\n  }, []);\n\n  const loadMetricNames = async () => {\n    const { namespace, region } = query;\n    return datasource.metricFindQuery(`metrics(${namespace},${region})`).then(appendTemplateVariables);\n  };\n\n  const appendTemplateVariables = (values: SelectableValue[]) => [\n    ...values,\n    { label: 'Template Variables', options: datasource.variables.map(toOption) },\n  ];\n\n  const toOption = (value: any) => ({ label: value, value });\n\n  const onQueryChange = (query: CloudWatchQuery) => {\n    onChange(query);\n    onRunQuery();\n  };\n\n  // Load dimension values based on current selected dimensions.\n  // Remove the new dimension key and all dimensions that has a wildcard as selected value\n  const loadDimensionValues = (newKey: string) => {\n    const { [newKey]: value, ...dim } = metricsQuery.dimensions;\n    const newDimensions = Object.entries(dim).reduce(\n      (result, [key, value]) => (value === '*' ? result : { ...result, [key]: value }),\n      {}\n    );\n    return datasource\n      .getDimensionValues(query.region, query.namespace, metricsQuery.metricName, newKey, newDimensions)\n      .then(values => (values.length ? [{ value: '*', text: '*', label: '*' }, ...values] : values))\n      .then(appendTemplateVariables);\n  };\n\n  const { regions, namespaces, variableOptionGroup } = state;\n  return (\n    <>\n      <QueryInlineField label=\"Region\">\n        <Segment\n          value={query.region}\n          placeholder=\"Select region\"\n          options={regions}\n          allowCustomValue\n          onChange={({ value: region }) => onQueryChange({ ...query, region })}\n        />\n      </QueryInlineField>\n\n      {query.expression.length === 0 && (\n        <>\n          <QueryInlineField label=\"Namespace\">\n            <Segment\n              value={query.namespace}\n              placeholder=\"Select namespace\"\n              allowCustomValue\n              options={namespaces}\n              onChange={({ value: namespace }) => onQueryChange({ ...query, namespace })}\n            />\n          </QueryInlineField>\n\n          <QueryInlineField label=\"Metric Name\">\n            <SegmentAsync\n              value={metricsQuery.metricName}\n              placeholder=\"Select metric name\"\n              allowCustomValue\n              loadOptions={loadMetricNames}\n              onChange={({ value: metricName }) => onQueryChange({ ...metricsQuery, metricName })}\n            />\n          </QueryInlineField>\n\n          <QueryInlineField label=\"Stats\">\n            <Stats\n              stats={datasource.standardStatistics.map(toOption)}\n              values={metricsQuery.statistics}\n              onChange={statistics => onQueryChange({ ...metricsQuery, statistics })}\n              variableOptionGroup={variableOptionGroup}\n            />\n          </QueryInlineField>\n\n          <QueryInlineField label=\"Dimensions\">\n            <Dimensions\n              dimensions={metricsQuery.dimensions}\n              onChange={dimensions => onQueryChange({ ...metricsQuery, dimensions })}\n              loadKeys={() => datasource.getDimensionKeys(query.namespace, query.region).then(appendTemplateVariables)}\n              loadValues={loadDimensionValues}\n            />\n          </QueryInlineField>\n        </>\n      )}\n    </>\n  );\n}\n","export { Stats } from './Stats';\nexport { Dimensions } from './Dimensions';\nexport { QueryInlineField, QueryField } from './Forms';\nexport { Alias } from './Alias';\nexport { MetricsQueryFieldsEditor } from './MetricsQueryFieldsEditor';\nexport { PanelQueryEditor } from './PanelQueryEditor';\nexport { CloudWatchLogsQueryEditor } from './LogsQueryEditor';\n","import { assignModelProperties } from 'app/core/utils/model_utils';\nimport { Deferred } from '../../core/utils/deferred';\nimport { VariableModel as BaseVariableModel } from '@grafana/data';\n\nexport enum VariableRefresh {\n  never,\n  onDashboardLoad,\n  onTimeRangeChanged,\n}\n\nexport enum VariableHide {\n  dontHide,\n  hideLabel,\n  hideVariable,\n}\n\nexport enum VariableSort {\n  disabled,\n  alphabeticalAsc,\n  alphabeticalDesc,\n  numericalAsc,\n  numericalDesc,\n  alphabeticalCaseInsensitiveAsc,\n  alphabeticalCaseInsensitiveDesc,\n}\n\nexport interface VariableTag {\n  selected: boolean;\n  text: string | string[];\n  values?: any[];\n  valuesText?: string;\n}\n\nexport interface VariableOption {\n  selected: boolean;\n  text: string | string[];\n  value: string | string[];\n  isNone?: boolean;\n  tags?: VariableTag[];\n}\n\nexport interface AdHocVariableFilter {\n  key: string;\n  operator: string;\n  value: string;\n  condition: string;\n}\n\nexport interface AdHocVariableModel extends VariableModel {\n  datasource: string | null;\n  filters: AdHocVariableFilter[];\n}\n\nexport interface IntervalVariableModel extends VariableWithOptions {\n  auto: boolean;\n  auto_min: string;\n  auto_count: number;\n  refresh: VariableRefresh;\n}\n\nexport interface CustomVariableModel extends VariableWithMultiSupport {}\n\nexport interface DataSourceVariableModel extends VariableWithMultiSupport {\n  regex: string;\n  refresh: VariableRefresh;\n}\n\nexport interface QueryVariableModel extends DataSourceVariableModel {\n  datasource: string | null;\n  definition: string;\n  sort: VariableSort;\n  tags: VariableTag[];\n  tagsQuery: string;\n  tagValuesQuery: string;\n  useTags: boolean;\n  queryValue?: string;\n}\n\nexport interface TextBoxVariableModel extends VariableWithOptions {}\n\nexport interface ConstantVariableModel extends VariableWithOptions {}\n\nexport interface VariableWithMultiSupport extends VariableWithOptions {\n  multi: boolean;\n  includeAll: boolean;\n  allValue?: string | null;\n}\n\nexport interface VariableWithOptions extends VariableModel {\n  current: VariableOption;\n  options: VariableOption[];\n  query: string;\n}\n\nexport interface VariableModel extends BaseVariableModel {\n  id?: string; // only exists for variables in redux state\n  global?: boolean; // only exists for variables in redux state\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  index?: number;\n  initLock?: Deferred | null;\n}\n\nexport interface VariableActions {\n  setValue(option: any): any;\n  updateOptions(searchFilter?: string): any;\n  dependsOn(variable: any): any;\n  setValueFromUrl(urlValue: any): any;\n  getValueForUrl(): any;\n  getSaveModel(): any;\n}\n\nexport type CtorType = new (...args: any[]) => {};\n\nexport interface VariableTypes {\n  [key: string]: {\n    name: string;\n    ctor: CtorType;\n    description: string;\n    supportsMulti?: boolean;\n  };\n}\n\nexport let variableTypes: VariableTypes = {};\nexport { assignModelProperties };\n","import React, { HTMLProps } from 'react';\nimport { css, cx } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '../../themes';\n\nenum Orientation {\n  Horizontal,\n  Vertical,\n}\ntype Spacing = 'none' | 'xs' | 'sm' | 'md' | 'lg';\ntype Justify = 'flex-start' | 'flex-end' | 'space-between' | 'center';\ntype Align = 'normal' | 'flex-start' | 'flex-end' | 'center';\n\nexport interface LayoutProps extends Omit<HTMLProps<HTMLDivElement>, 'align' | 'children' | 'wrap'> {\n  children: React.ReactNode[] | React.ReactNode;\n  orientation?: Orientation;\n  spacing?: Spacing;\n  justify?: Justify;\n  align?: Align;\n  width?: string;\n  wrap?: boolean;\n}\n\nexport interface ContainerProps {\n  padding?: Spacing;\n  margin?: Spacing;\n  grow?: number;\n  shrink?: number;\n}\n\nexport const Layout: React.FC<LayoutProps> = ({\n  children,\n  orientation = Orientation.Horizontal,\n  spacing = 'sm',\n  justify = 'flex-start',\n  align = 'normal',\n  wrap = false,\n  width = '100%',\n  ...rest\n}) => {\n  const theme = useTheme();\n  const styles = getStyles(theme, orientation, spacing, justify, align, wrap);\n  return (\n    <div className={styles.layout} style={{ width }} {...rest}>\n      {React.Children.toArray(children)\n        .filter(Boolean)\n        .map((child, index) => {\n          return (\n            <div className={styles.childWrapper} key={index}>\n              {child}\n            </div>\n          );\n        })}\n    </div>\n  );\n};\n\nexport const HorizontalGroup: React.FC<Omit<LayoutProps, 'orientation'>> = ({\n  children,\n  spacing,\n  justify,\n  align = 'center',\n  wrap,\n  width,\n}) => (\n  <Layout\n    spacing={spacing}\n    justify={justify}\n    orientation={Orientation.Horizontal}\n    align={align}\n    width={width}\n    wrap={wrap}\n  >\n    {children}\n  </Layout>\n);\nexport const VerticalGroup: React.FC<Omit<LayoutProps, 'orientation' | 'wrap'>> = ({\n  children,\n  spacing,\n  justify,\n  align,\n  width,\n}) => (\n  <Layout spacing={spacing} justify={justify} orientation={Orientation.Vertical} align={align} width={width}>\n    {children}\n  </Layout>\n);\n\nexport const Container: React.FC<ContainerProps> = ({ children, padding, margin, grow, shrink }) => {\n  const theme = useTheme();\n  const styles = getContainerStyles(theme, padding, margin);\n  return (\n    <div\n      className={cx(\n        styles.wrapper,\n        grow !== undefined &&\n          css`\n            flex-grow: ${grow};\n          `,\n        shrink !== undefined &&\n          css`\n            flex-shrink: ${shrink};\n          `\n      )}\n    >\n      {children}\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory(\n  (theme: GrafanaTheme, orientation: Orientation, spacing: Spacing, justify: Justify, align, wrap) => {\n    const finalSpacing = spacing !== 'none' ? theme.spacing[spacing] : 0;\n    // compensate for last row margin when wrapped, horizontal layout\n    const marginCompensation =\n      (orientation === Orientation.Horizontal && !wrap) || orientation === Orientation.Vertical\n        ? 0\n        : `-${finalSpacing}`;\n\n    return {\n      layout: css`\n        display: flex;\n        flex-direction: ${orientation === Orientation.Vertical ? 'column' : 'row'};\n        flex-wrap: ${wrap ? 'wrap' : 'nowrap'};\n        justify-content: ${justify};\n        align-items: ${align};\n        height: 100%;\n        max-width: 100%;\n        // compensate for last row margin when wrapped, horizontal layout\n        margin-bottom: ${marginCompensation};\n      `,\n      childWrapper: css`\n        margin-bottom: ${orientation === Orientation.Horizontal && !wrap ? 0 : finalSpacing};\n        margin-right: ${orientation === Orientation.Horizontal ? finalSpacing : 0};\n        display: flex;\n        align-items: ${align};\n\n        &:last-child {\n          margin-bottom: ${orientation === Orientation.Vertical && 0};\n          margin-right: ${orientation === Orientation.Horizontal && 0};\n        }\n      `,\n    };\n  }\n);\n\nconst getContainerStyles = stylesFactory((theme: GrafanaTheme, padding?: Spacing, margin?: Spacing) => {\n  const paddingSize = (padding && padding !== 'none' && theme.spacing[padding]) || 0;\n  const marginSize = (margin && margin !== 'none' && theme.spacing[margin]) || 0;\n  return {\n    wrapper: css`\n      margin: ${marginSize};\n      padding: ${paddingSize};\n    `,\n  };\n});\n","import { Grammar } from 'prismjs';\nimport { CompletionItem } from '@grafana/ui';\n\nexport const QUERY_COMMANDS: CompletionItem[] = [\n  {\n    label: 'fields',\n    documentation: 'Retrieves the specified fields from log events',\n  },\n  { label: 'display', documentation: 'Specifies which fields to display in the query results' },\n  {\n    label: 'filter',\n    documentation: 'Filters the results of a query based on one or more conditions',\n  },\n  {\n    label: 'stats',\n    documentation: 'Calculates aggregate statistics based on the values of log fields',\n  },\n  { label: 'sort', documentation: 'Sorts the retrieved log events' },\n  { label: 'limit', documentation: 'Specifies the number of log events returned by the query' },\n  {\n    label: 'parse',\n    documentation:\n      'Extracts data from a log field, creating one or more ephemeral fields that you can process further in the query',\n  },\n];\n\nexport const COMPARISON_OPERATORS = ['=', '!=', '<', '<=', '>', '>='];\nexport const ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '^', '%'];\n\nexport const NUMERIC_OPERATORS = [\n  {\n    label: 'abs',\n    detail: 'abs(a)',\n    documentation: 'Absolute value.',\n  },\n  {\n    label: 'ceil',\n    detail: 'ceil(a)',\n    documentation: 'Round to ceiling (the smallest integer that is greater than the value of a).',\n  },\n  {\n    label: 'floor',\n    detail: 'floor(a)',\n    documentation: 'Round to floor (the largest integer that is smaller than the value of a).',\n  },\n  {\n    label: 'greatest',\n    detail: 'greatest(a,b, ... z)',\n    documentation: 'Returns the largest value.',\n  },\n  {\n    label: 'least',\n    detail: 'least(a, b, ... z)',\n    documentation: 'Returns the smallest value.',\n  },\n  {\n    label: 'log',\n    detail: 'log(a)',\n    documentation: 'Natural logarithm.',\n  },\n  {\n    label: 'sqrt',\n    detail: 'sqrt(a)',\n    documentation: 'Square root.',\n  },\n];\n\nexport const GENERAL_FUNCTIONS = [\n  {\n    label: 'ispresent',\n    detail: 'ispresent(fieldname)',\n    documentation: 'Returns true if the field exists.',\n  },\n  {\n    label: 'coalesce',\n    detail: 'coalesce(fieldname1, fieldname2, ... fieldnamex)',\n    documentation: 'Returns the first non-null value from the list.',\n  },\n];\n\nexport const STRING_FUNCTIONS = [\n  {\n    label: 'isempty',\n    detail: 'isempty(fieldname)',\n    documentation: 'Returns true if the field is missing or is an empty string.',\n  },\n  {\n    label: 'isblank',\n    detail: 'isblank(fieldname)',\n    documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n  },\n  {\n    label: 'concat',\n    detail: 'concat(string1, string2, ... stringz)',\n    documentation: 'Concatenates the strings.',\n  },\n  {\n    label: 'ltrim',\n    detail: 'ltrim(string) or ltrim(string1, string2)',\n    documentation:\n      'Remove white space from the left of the string. If the function has a second string argument, it removes the characters of string2 from the left of string1.',\n  },\n  {\n    label: 'rtrim',\n    detail: 'rtrim(string) or rtrim(string1, string2)',\n    documentation:\n      'Remove white space from the right of the string. If the function has a second string argument, it removes the characters of string2 from the right of string1.',\n  },\n  {\n    label: 'trim',\n    detail: 'trim(string) or trim(string1, string2)',\n    documentation:\n      'Remove white space from both ends of the string. If the function has a second string argument, it removes the characters of string2 from both sides of string1.',\n  },\n  {\n    label: 'strlen',\n    detail: 'strlen(string)',\n    documentation: 'Returns the length of the string in Unicode code points.',\n  },\n  {\n    label: 'toupper',\n    detail: 'toupper(string)',\n    documentation: 'Converts the string to uppercase.',\n  },\n  {\n    label: 'tolower',\n    detail: 'tolower(string)',\n    documentation: 'Converts the string to lowercase.',\n  },\n  {\n    label: 'substr',\n    detail: 'substr(string1, x), or substr(string1, x, y)',\n    documentation:\n      'Returns a substring from the index specified by the number argument to the end of the string. If the function has a second number argument, it contains the length of the substring to be retrieved.',\n  },\n  {\n    label: 'replace',\n    detail: 'replace(string1, string2, string3)',\n    documentation: 'Replaces all instances of string2 in string1 with string3.',\n  },\n  {\n    label: 'strcontains',\n    detail: 'strcontains(string1, string2)',\n    documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n  },\n];\n\nexport const DATETIME_FUNCTIONS = [\n  {\n    label: 'bin',\n    detail: 'bin(period)',\n    documentation: 'Rounds the value of @timestamp to the given period and then truncates.',\n  },\n  {\n    label: 'datefloor',\n    detail: 'datefloor(a, period)',\n    documentation: 'Truncates the timestamp to the given period.',\n  },\n  {\n    label: 'dateceil',\n    detail: 'dateceil(a, period)',\n    documentation: 'Rounds up the timestamp to the given period and then truncates.',\n  },\n  {\n    label: 'fromMillis',\n    detail: 'fromMillis(fieldname)',\n    documentation:\n      'Interprets the input field as the number of milliseconds since the Unix epoch and converts it to a timestamp.',\n  },\n  {\n    label: 'toMillis',\n    detail: 'toMillis(fieldname)',\n    documentation:\n      'Converts the timestamp found in the named field into a number representing the milliseconds since the Unix epoch.',\n  },\n];\n\nexport const IP_FUNCTIONS = [\n  {\n    label: 'isValidIp',\n    detail: 'isValidIp(fieldname)',\n    documentation: 'Returns true if the field is a valid v4 or v6 IP address.',\n  },\n  {\n    label: 'isValidIpV4',\n    detail: 'isValidIpV4(fieldname)',\n    documentation: 'Returns true if the field is a valid v4 IP address.',\n  },\n  {\n    label: 'isValidIpV6',\n    detail: 'isValidIpV6(fieldname)',\n    documentation: 'Returns true if the field is a valid v6 IP address.',\n  },\n  {\n    label: 'isIpInSubnet',\n    detail: 'isIpInSubnet(fieldname, string)',\n    documentation: 'Returns true if the field is a valid v4 or v6 IP address within the specified v4 or v6 subnet.',\n  },\n  {\n    label: 'isIpv4InSubnet',\n    detail: 'isIpv4InSubnet(fieldname, string)',\n    documentation: 'Returns true if the field is a valid v4 IP address within the specified v4 subnet.',\n  },\n  {\n    label: 'isIpv6InSubnet',\n    detail: 'isIpv6InSubnet(fieldname, string)',\n    documentation: 'Returns true if the field is a valid v6 IP address within the specified v6 subnet.',\n  },\n];\n\nexport const BOOLEAN_FUNCTIONS = [\n  {\n    label: 'ispresent',\n    detail: 'ispresent(fieldname)',\n    documentation: 'Returns true if the field exists.',\n  },\n  {\n    label: 'isempty',\n    detail: 'isempty(fieldname)',\n    documentation: 'Returns true if the field is missing or is an empty string.',\n  },\n  {\n    label: 'isblank',\n    detail: 'isblank(fieldname)',\n    documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n  },\n  {\n    label: 'strcontains',\n    detail: 'strcontains(string1, string2)',\n    documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n  },\n  ...IP_FUNCTIONS,\n];\n\nexport const AGGREGATION_FUNCTIONS_STATS = [\n  {\n    label: 'avg',\n    detail: 'avg(NumericFieldname)',\n    documentation: 'The average of the values in the specified field.',\n  },\n  {\n    label: 'count',\n    detail: 'count(fieldname) or count(*)',\n    documentation: 'Counts the log records.',\n  },\n  {\n    label: 'count_distinct',\n    detail: 'count_distinct(fieldname)',\n    documentation: 'Returns the number of unique values for the field.',\n  },\n  {\n    label: 'max',\n    detail: 'max(fieldname)',\n    documentation: 'The maximum of the values for this log field in the queried logs.',\n  },\n  {\n    label: 'min',\n    detail: 'min(fieldname)',\n    documentation: 'The minimum of the values for this log field in the queried logs.',\n  },\n  {\n    label: 'pct',\n    detail: 'pct(fieldname, value)',\n    documentation: 'A percentile indicates the relative standing of a value in a datas.',\n  },\n  {\n    label: 'stddev',\n    detail: 'stddev(NumericFieldname)',\n    documentation: 'The standard deviation of the values in the specified field.',\n  },\n  {\n    label: 'sum',\n    detail: 'sum(NumericFieldname)',\n    documentation: 'The sum of the values in the specified field.',\n  },\n];\n\nexport const NON_AGGREGATION_FUNCS_STATS = [\n  {\n    label: 'earliest',\n    detail: 'earliest(fieldname)',\n    documentation:\n      'Returns the value of fieldName from the log event that has the earliest time stamp in the queried logs.',\n  },\n  {\n    label: 'latest',\n    detail: 'latest(fieldname)',\n    documentation:\n      'Returns the value of fieldName from the log event that has the latest time stamp in the queried logs.',\n  },\n  {\n    label: 'sortsFirst',\n    detail: 'sortsFirst(fieldname)',\n    documentation: 'Returns the value of fieldName that sorts first in the queried logs.',\n  },\n  {\n    label: 'sortsLast',\n    detail: 'sortsLast(fieldname)',\n    documentation: 'Returns the value of fieldName that sorts last in the queried logs.',\n  },\n];\n\nexport const STATS_FUNCS = [...AGGREGATION_FUNCTIONS_STATS, ...NON_AGGREGATION_FUNCS_STATS];\n\nexport const KEYWORDS = ['as', 'like', 'by', 'in', 'desc', 'asc'];\nexport const FIELD_AND_FILTER_FUNCTIONS = [\n  ...NUMERIC_OPERATORS,\n  ...GENERAL_FUNCTIONS,\n  ...STRING_FUNCTIONS,\n  ...DATETIME_FUNCTIONS,\n  ...IP_FUNCTIONS,\n];\n\nexport const FUNCTIONS = [...FIELD_AND_FILTER_FUNCTIONS, ...STATS_FUNCS];\n\nconst tokenizer: Grammar = {\n  comment: {\n    pattern: /^#.*/,\n    greedy: true,\n  },\n  backticks: {\n    pattern: /`.*?`/,\n    alias: 'string',\n    greedy: true,\n  },\n  quote: {\n    pattern: /\".*?\"/,\n    alias: 'string',\n    greedy: true,\n  },\n  regex: {\n    pattern: /\\/.*?\\/(?=\\||\\s*$|,)/,\n    greedy: true,\n  },\n  'query-command': {\n    pattern: new RegExp(`\\\\b(?:${QUERY_COMMANDS.map(command => command.label).join('|')})\\\\b`, 'i'),\n    alias: 'function',\n  },\n  function: {\n    pattern: new RegExp(`\\\\b(?:${FUNCTIONS.map(f => f.label).join('|')})\\\\b`, 'i'),\n  },\n  keyword: {\n    pattern: new RegExp(`(\\\\s+)(${KEYWORDS.join('|')})(?=\\\\s+)`, 'i'),\n    lookbehind: true,\n  },\n  // 'log-group-name': {\n  //   pattern: /[\\.\\-_/#A-Za-z0-9]+/,\n  // },\n  'field-name': {\n    pattern: /(@?[_a-zA-Z]+[_.0-9a-zA-Z]*)|(`((\\\\`)|([^`]))*?`)/,\n    greedy: true,\n  },\n  number: /\\b-?\\d+((\\.\\d*)?([eE][+-]?\\d+)?)?\\b/,\n  'command-separator': {\n    pattern: /\\|/,\n    alias: 'punctuation',\n  },\n  'comparison-operator': {\n    pattern: /([<>]=?)|(!?=)/,\n  },\n  punctuation: /[{}()`,.]/,\n  whitespace: /\\s+/,\n};\n\nexport default tokenizer;\n","var path = 'public/app/plugins/panel/graph/tab_drilldown_links.html';\nvar html = \"<drilldown-links-editor links=ctrl.panel.options.dataLinks suggestions=ctrl.linkVariableSuggestions on-change=ctrl.onDataLinksChange></drilldown-links-editor>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/features/dashboard/components/SubMenu/template.html';\nvar html = \"<div class=submenu-controls ng-hide=\\\"ctrl.submenuEnabled === false\\\">\\n  <div ng-repeat=\\\"variable in ctrl.variables\\\" ng-hide=\\\"variable.hide === 2\\\" class=\\\"submenu-item gf-form-inline\\\" aria-label={{::ctrl.selectors.submenuItem}}>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label template-variable\\\" ng-hide=\\\"variable.hide === 1\\\" aria-label=\\\"{{ctrl.selectors.submenuItemLabels(variable.label || variable.name)}}\\\">{{variable.label || variable.name}}</label>\\n      <value-select-dropdown ng-if=\\\"variable.type !== 'adhoc' && variable.type !== 'textbox'\\\" dashboard=ctrl.dashboard variable=variable on-updated=ctrl.variableUpdated(variable)></value-select-dropdown>\\n      <input type=text ng-if=\\\"variable.type === 'textbox'\\\" ng-model=variable.query class=\\\"gf-form-input width-12\\\" ng-blur=\\\"variable.current.value != variable.query && variable.updateOptions() && ctrl.variableUpdated(variable);\\\" ng-keydown=\\\"$event.keyCode === 13 && variable.current.value != variable.query && variable.updateOptions() && ctrl.variableUpdated(variable);\\\"/>\\n    </div>\\n    <ad-hoc-filters ng-if=\\\"variable.type === 'adhoc'\\\" variable=variable dashboard=ctrl.dashboard></ad-hoc-filters>\\n  </div>\\n\\n  <div ng-if=\\\"ctrl.dashboard.annotations.list.length > 0\\\">\\n    <div ng-repeat=\\\"annotation in ctrl.dashboard.annotations.list\\\" ng-hide=annotation.hide class=submenu-item ng-class=\\\"{'annotation-disabled': !annotation.enable}\\\">\\n      <gf-form-switch class=gf-form label={{annotation.name}} checked=annotation.enable on-change=ctrl.annotationStateChanged()></gf-form-switch>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\"></div>\\n\\n  <div ng-if=\\\"ctrl.dashboard.links.length > 0\\\">\\n    <dash-links-container links=ctrl.dashboard.links dashboard=ctrl.dashboard class=gf-form-inline></dash-links-container>\\n  </div>\\n\\n  <div class=clearfix></div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/panel/table-old/column_options.html';\nvar html = \"<div class=edit-tab-content ng-repeat=\\\"style in editor.panel.styles\\\">\\n  <div class=gf-form-group>\\n    <h5 class=section-heading>Options</h5>\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <label class=\\\"gf-form-label width-8\\\">Name pattern</label>\\n        <input type=text placeholder=\\\"Name or regex\\\" class=\\\"gf-form-input max-width-15\\\" ng-model=style.pattern bs-tooltip=\\\"'Specify regex using /my.*regex/ syntax'\\\" bs-typeahead=editor.getColumnNames ng-blur=editor.render() data-min-length=0 data-items=100 ng-model-onblur data-placement=right />\\n      </div>\\n    </div>\\n    <div class=\\\"gf-form gf-form--grow\\\" ng-if=\\\"style.type !== 'hidden'\\\">\\n      <label class=\\\"gf-form-label width-8\\\">Column Header</label>\\n      <input type=text class=\\\"gf-form-input max-width-15\\\" ng-model=style.alias ng-change=editor.render() ng-model-onblur placeholder=\\\"Override header label\\\"/>\\n    </div>\\n    <gf-form-switch class=gf-form label-class=width-8 label=\\\"Render value as link\\\" checked=style.link on-change=editor.render()></gf-form-switch>\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h5 class=section-heading>Type</h5>\\n\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <label class=\\\"gf-form-label width-8\\\">Type</label>\\n      <div class=\\\"gf-form-select-wrapper width-16\\\">\\n        <select class=gf-form-input ng-model=style.type ng-options=\\\"c.value as c.text for c in editor.columnTypes\\\" ng-change=editor.render()></select>\\n      </div>\\n    </div>\\n    <div class=\\\"gf-form gf-form--grow\\\" ng-if=\\\"style.type === 'date'\\\">\\n      <label class=\\\"gf-form-label width-8\\\">Date Format</label>\\n      <gf-form-dropdown model=style.dateFormat css-class=\\\"gf-form-input width-16\\\" lookup-text=true get-options=editor.dateFormats on-change=editor.render() allow-custom=true>\\n      </gf-form-dropdown>\\n    </div>\\n\\n    <div ng-if=\\\"style.type === 'string'\\\">\\n      <gf-form-switch class=gf-form label-class=width-8 ng-if=\\\"style.type === 'string'\\\" label=\\\"Sanitize HTML\\\" checked=style.sanitize on-change=editor.render()></gf-form-switch>\\n    </div>\\n\\n    <div ng-if=\\\"style.type !== 'hidden'\\\">\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <label class=\\\"gf-form-label width-8\\\">Align</label>\\n        <gf-form-dropdown model=style.align css-class=gf-form-input lookup-text=true get-options=editor.alignTypes allow-custom=false on-change=editor.render() allow-custom=false />\\n      </div>\\n    </div>\\n\\n    <div ng-if=\\\"style.type === 'string'\\\">\\n      <gf-form-switch class=gf-form label-class=width-10 ng-if=\\\"style.type === 'string'\\\" label=\\\"Preserve Formatting\\\" checked=style.preserveFormat on-change=editor.render()></gf-form-switch>\\n    </div>\\n\\n    <div ng-if=\\\"style.type === 'number'\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-8\\\">Unit</label>\\n        <unit-picker onchange=editor.setUnitFormat(style) value=style.unit width=16></unit-picker>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-8\\\">Decimals</label>\\n        <input type=number class=\\\"gf-form-input width-4\\\" data-placement=right ng-model=style.decimals ng-change=editor.render() ng-model-onblur/>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group ng-if=\\\"style.type === 'string'\\\">\\n    <h5 class=section-heading>Value Mappings</h5>\\n    <div class=editor-row>\\n      <div class=gf-form-group>\\n        <div class=gf-form>\\n          <span class=gf-form-label>\\n            Type\\n          </span>\\n          <div class=gf-form-select-wrapper>\\n            <select class=gf-form-input ng-model=style.mappingType ng-options=\\\"c.value as c.text for c in editor.mappingTypes\\\" ng-change=editor.render()></select>\\n          </div>\\n        </div>\\n        <div class=gf-form-group ng-if=\\\"style.mappingType==1\\\">\\n          <div class=gf-form ng-repeat=\\\"map in style.valueMaps\\\">\\n            <span class=gf-form-label>\\n              <icon name=\\\"'times'\\\" ng-click=\\\"editor.removeValueMap(style, $index)\\\"></icon>\\n            </span>\\n            <input type=text class=\\\"gf-form-input max-width-6\\\" ng-model=map.value placeholder=Value ng-blur=editor.render() />\\n            <label class=gf-form-label>\\n              <icon name=\\\"'arrow-right'\\\"></icon>\\n            </label>\\n            <input type=text class=\\\"gf-form-input max-width-8\\\" ng-model=map.text placeholder=Text ng-blur=editor.render() />\\n          </div>\\n          <div class=gf-form>\\n            <label class=gf-form-label>\\n              <a class=pointer ng-click=editor.addValueMap(style)><icon name=\\\"'plus'\\\"></icon></a>\\n            </label>\\n          </div>\\n        </div>\\n        <div class=gf-form-group ng-if=\\\"style.mappingType==2\\\">\\n          <div class=gf-form ng-repeat=\\\"rangeMap in style.rangeMaps\\\">\\n            <span class=gf-form-label>\\n              <icon name=\\\"'times'\\\" ng-click=\\\"editor.removeRangeMap(style, $index)\\\"></icon>\\n            </span>\\n            <span class=gf-form-label>From</span>\\n            <input type=text ng-model=rangeMap.from class=\\\"gf-form-input max-width-6\\\" ng-blur=editor.render() />\\n            <span class=gf-form-label>To</span>\\n            <input type=text ng-model=rangeMap.to class=\\\"gf-form-input max-width-6\\\" ng-blur=editor.render() />\\n            <span class=gf-form-label>Text</span>\\n            <input type=text ng-model=rangeMap.text class=\\\"gf-form-input max-width-8\\\" ng-blur=editor.render() />\\n          </div>\\n          <div class=gf-form>\\n            <label class=gf-form-label>\\n              <a class=pointer ng-click=editor.addRangeMap(style)><icon name=\\\"'plus'\\\"></icon></a>\\n            </label>\\n          </div>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group ng-if=\\\"['number', 'string'].indexOf(style.type) !== -1\\\">\\n    <h5 class=section-heading>Thresholds</h5>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Thresholds\\n        <tip>Comma separated values</tip>\\n      </label>\\n      <input type=text class=\\\"gf-form-input width-10\\\" ng-model=style.thresholds placeholder=50,80 ng-blur=editor.render() array-join/>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Color Mode</label>\\n      <div class=\\\"gf-form-select-wrapper width-10\\\">\\n        <select class=gf-form-input ng-model=style.colorMode ng-options=\\\"c.value as c.text for c in editor.colorModes\\\" ng-change=editor.render()></select>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Colors</label>\\n      <span class=gf-form-label>\\n        <color-picker color=style.colors[0] onchange=editor.onColorChange(style,0)></color-picker>\\n      </span>\\n      <span class=gf-form-label>\\n        <color-picker color=style.colors[1] onchange=editor.onColorChange(style,1)></color-picker>\\n      </span>\\n      <span class=gf-form-label>\\n        <color-picker color=style.colors[2] onchange=editor.onColorChange(style,2)></color-picker>\\n      </span>\\n      <div class=gf-form-label>\\n        <a class=pointer ng-click=editor.invertColorOrder($index)>Invert</a>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\" ng-if=style.link>\\n    <h5 class=section-heading>Link</h5>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-9\\\">\\n        Url\\n        <info-popover mode=right-normal>\\n          <p>Specify an URL (relative or absolute)</p>\\n          <span>\\n            Use special variables to specify cell values:\\n            <br/>\\n            <em>${__cell}</em> refers to current cell value\\n            <br/>\\n            <em>${__cell_n}</em> refers to Nth column value in current row. Column indexes are started from 0. For\\n            instance, <em>${__cell_1}</em> refers to second column's value.\\n            <br/>\\n            <em>${__cell:raw}</em> disables all encoding. Useful if the value is a complete URL. By default values are\\n            URI encoded.\\n          </span>\\n        </info-popover>\\n      </label>\\n      <input type=text class=\\\"gf-form-input width-29\\\" ng-model=style.linkUrl ng-blur=editor.render() ng-model-onblur data-placement=right />\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-9\\\">\\n        Tooltip\\n        <info-popover mode=right-normal>\\n          <p>Specify text for link tooltip.</p>\\n          <span>\\n            This title appears when user hovers pointer over the cell with link. Use the same variables as for URL.\\n          </span>\\n        </info-popover>\\n      </label>\\n      <input type=text class=\\\"gf-form-input width-29\\\" ng-model=style.linkTooltip ng-blur=editor.render() ng-model-onblur data-placement=right />\\n    </div>\\n    <gf-form-switch class=gf-form label-class=width-9 label=\\\"Open in new tab\\\" checked=style.linkTargetBlank></gf-form-switch>\\n  </div>\\n\\n  <div class=clearfix></div>\\n  <div class=gf-form-group>\\n    <button class=\\\"btn btn-danger btn-small\\\" ng-click=editor.removeColumnStyle(style)>\\n      <icon name=\\\"'trash-alt'\\\"></icon> Remove Rule\\n    </button>\\n  </div>\\n\\n  <hr/>\\n</div>\\n\\n<button class=\\\"btn btn-inverse\\\" ng-click=editor.addColumnStyle()>\\n  <icon name=\\\"'plus'\\\"></icon>&nbsp;Add column style\\n</button>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/stackdriver/partials/annotations.editor.html';\nvar html = \"<stackdriver-annotation-query-editor target=ctrl.annotation.target on-query-change=(ctrl.onQueryChange) datasource=ctrl.datasource template-srv=ctrl.templateSrv></stackdriver-annotation-query-editor>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import coreModule from 'app/core/core_module';\nimport { backendSrv } from 'app/core/services/backend_srv';\n\nconst hitTypes = {\n  FOLDER: 'dash-folder',\n  DASHBOARD: 'dash-db',\n};\n\nexport class ValidationSrv {\n  rootName = 'general';\n\n  validateNewDashboardName(folderId: any, name: string) {\n    return this.validate(folderId, name, 'A dashboard or a folder with the same name already exists');\n  }\n\n  validateNewFolderName(name: string) {\n    return this.validate(0, name, 'A folder or dashboard in the general folder with the same name already exists');\n  }\n\n  private async validate(folderId: any, name: string, existingErrorMessage: string) {\n    name = (name || '').trim();\n    const nameLowerCased = name.toLowerCase();\n\n    if (name.length === 0) {\n      throw {\n        type: 'REQUIRED',\n        message: 'Name is required',\n      };\n    }\n\n    if (folderId === 0 && nameLowerCased === this.rootName) {\n      throw {\n        type: 'EXISTING',\n        message: 'This is a reserved name and cannot be used for a folder.',\n      };\n    }\n\n    const promises = [];\n    promises.push(backendSrv.search({ type: hitTypes.FOLDER, folderIds: [folderId], query: name }));\n    promises.push(backendSrv.search({ type: hitTypes.DASHBOARD, folderIds: [folderId], query: name }));\n\n    const res = await Promise.all(promises);\n    let hits: any[] = [];\n\n    if (res.length > 0 && res[0].length > 0) {\n      hits = res[0];\n    }\n\n    if (res.length > 1 && res[1].length > 0) {\n      hits = hits.concat(res[1]);\n    }\n\n    for (const hit of hits) {\n      if (nameLowerCased === hit.title.toLowerCase()) {\n        throw {\n          type: 'EXISTING',\n          message: existingErrorMessage,\n        };\n      }\n    }\n\n    return;\n  }\n}\n\nconst validationSrv = new ValidationSrv();\n\nexport default validationSrv;\n\ncoreModule.service('validationSrv', ValidationSrv);\n","var path = 'public/app/plugins/datasource/grafana/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl can-collapse=false>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=gf-form-label>Test data: random walk</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { useState, useCallback } from 'react';\n\nexport const useClientRect = <T extends HTMLElement>(): [{ width: number; height: number } | null, React.Ref<T>] => {\n  const [rect, setRect] = useState<{ width: number; height: number } | null>(null);\n  const ref = useCallback((node: T) => {\n    if (node !== null) {\n      setRect(node.getBoundingClientRect());\n    }\n  }, []);\n  return [rect, ref];\n};\n","import React, { HTMLProps, ReactNode } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { getFocusStyle, sharedInputStyle } from '../Forms/commonStyles';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { useClientRect } from '../../utils/useClientRect';\n\nexport interface Props extends Omit<HTMLProps<HTMLInputElement>, 'prefix' | 'size'> {\n  /** Sets the width to a multiple of 8px. Should only be used with inline forms. Setting width of the container is preferred in other cases.*/\n  width?: number;\n  /** Show an invalid state around the input */\n  invalid?: boolean;\n  /** Show an icon as a prefix in the input */\n  prefix?: ReactNode;\n  /** Show an icon as a suffix in the input */\n  suffix?: ReactNode;\n  /** Show a loading indicator as a suffix in the input */\n  loading?: boolean;\n  /** Add a component as an addon before the input  */\n  addonBefore?: ReactNode;\n  /** Add a component as an addon after the input */\n  addonAfter?: ReactNode;\n}\n\ninterface StyleDeps {\n  theme: GrafanaTheme;\n  invalid: boolean;\n  width?: number;\n}\n\nexport const getInputStyles = stylesFactory(({ theme, invalid = false, width }: StyleDeps) => {\n  const { palette, colors } = theme;\n  const borderRadius = theme.border.radius.sm;\n  const height = theme.spacing.formInputHeight;\n\n  const prefixSuffixStaticWidth = '28px';\n  const prefixSuffix = css`\n    position: absolute;\n    top: 0;\n    z-index: 1;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    flex-grow: 0;\n    flex-shrink: 0;\n    font-size: ${theme.typography.size.md};\n    height: 100%;\n    /* Min width specified for prefix/suffix classes used outside React component*/\n    min-width: ${prefixSuffixStaticWidth};\n    color: ${theme.colors.textWeak};\n  `;\n\n  return {\n    // Wraps inputWrapper and addons\n    wrapper: cx(\n      css`\n        label: input-wrapper;\n        display: flex;\n        width: ${width ? `${8 * width}px` : '100%'};\n        height: ${height}px;\n        border-radius: ${borderRadius};\n        &:hover {\n          > .prefix,\n          .suffix,\n          .input {\n            border-color: ${invalid ? palette.redBase : colors.formInputBorder};\n          }\n\n          // only show number buttons on hover\n          input[type='number'] {\n            -moz-appearance: number-input;\n            -webkit-appearance: number-input;\n            appearance: textfield;\n          }\n\n          input[type='number']::-webkit-inner-spin-button,\n          input[type='number']::-webkit-outer-spin-button {\n            -webkit-appearance: inner-spin-button !important;\n            opacity: 1;\n          }\n        }\n      `\n    ),\n    // Wraps input and prefix/suffix\n    inputWrapper: css`\n      label: input-inputWrapper;\n      position: relative;\n      flex-grow: 1;\n      /* we want input to be above addons, especially for focused state */\n      z-index: 1;\n\n      /* when input rendered with addon before only*/\n      &:not(:first-child):last-child {\n        > input {\n          border-left: none;\n          border-top-left-radius: 0;\n          border-bottom-left-radius: 0;\n        }\n      }\n\n      /* when input rendered with addon after only*/\n      &:first-child:not(:last-child) {\n        > input {\n          border-right: none;\n          border-top-right-radius: 0;\n          border-bottom-right-radius: 0;\n        }\n      }\n\n      /* when rendered with addon before and after */\n      &:not(:first-child):not(:last-child) {\n        > input {\n          border-right: none;\n          border-top-right-radius: 0;\n          border-bottom-right-radius: 0;\n          border-top-left-radius: 0;\n          border-bottom-left-radius: 0;\n        }\n      }\n\n      input {\n        /* paddings specified for classes used outside React component */\n        &:not(:first-child) {\n          padding-left: ${prefixSuffixStaticWidth};\n        }\n        &:not(:last-child) {\n          padding-right: ${prefixSuffixStaticWidth};\n        }\n        &[readonly] {\n          cursor: default;\n        }\n      }\n    `,\n\n    input: cx(\n      getFocusStyle(theme),\n      sharedInputStyle(theme, invalid),\n      css`\n        label: input-input;\n        position: relative;\n        z-index: 0;\n        flex-grow: 1;\n        border-radius: ${borderRadius};\n        height: 100%;\n        width: 100%;\n      `\n    ),\n    inputDisabled: css`\n      background-color: ${colors.formInputBgDisabled};\n      color: ${colors.formInputDisabledText};\n    `,\n    addon: css`\n      label: input-addon;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-grow: 0;\n      flex-shrink: 0;\n      position: relative;\n\n      &:first-child {\n        border-top-right-radius: 0;\n        border-bottom-right-radius: 0;\n        > :last-child {\n          border-top-right-radius: 0;\n          border-bottom-right-radius: 0;\n        }\n      }\n\n      &:last-child {\n        border-top-left-radius: 0;\n        border-bottom-left-radius: 0;\n        > :first-child {\n          border-top-left-radius: 0;\n          border-bottom-left-radius: 0;\n        }\n      }\n      > *:focus {\n        /* we want anything that has focus and is an addon to be above input */\n        z-index: 2;\n      }\n    `,\n    prefix: cx(\n      prefixSuffix,\n      css`\n        label: input-prefix;\n        padding-left: ${theme.spacing.sm};\n        padding-right: ${theme.spacing.xs};\n        border-right: none;\n        border-top-right-radius: 0;\n        border-bottom-right-radius: 0;\n      `\n    ),\n    suffix: cx(\n      prefixSuffix,\n      css`\n        label: input-suffix;\n        padding-right: ${theme.spacing.sm};\n        padding-left: ${theme.spacing.xs};\n        margin-bottom: -2px;\n        border-left: none;\n        border-top-left-radius: 0;\n        border-bottom-left-radius: 0;\n        right: 0;\n      `\n    ),\n    loadingIndicator: css`\n      & + * {\n        margin-left: ${theme.spacing.xs};\n      }\n    `,\n  };\n});\n\nexport const Input = React.forwardRef<HTMLInputElement, Props>((props, ref) => {\n  const { className, addonAfter, addonBefore, prefix, suffix, invalid, loading, width = 0, ...restProps } = props;\n  /**\n   * Prefix & suffix are positioned absolutely within inputWrapper. We use client rects below to apply correct padding to the input\n   * when prefix/suffix is larger than default (28px = 16px(icon) + 12px(left/right paddings)).\n   * Thanks to that prefix/suffix do not overflow the input element itself.\n   */\n  const [prefixRect, prefixRef] = useClientRect<HTMLDivElement>();\n  const [suffixRect, suffixRef] = useClientRect<HTMLDivElement>();\n\n  const theme = useTheme();\n  const styles = getInputStyles({ theme, invalid: !!invalid, width });\n\n  return (\n    <div className={cx(styles.wrapper, className)}>\n      {!!addonBefore && <div className={styles.addon}>{addonBefore}</div>}\n\n      <div className={styles.inputWrapper}>\n        {prefix && (\n          <div className={styles.prefix} ref={prefixRef}>\n            {prefix}\n          </div>\n        )}\n\n        <input\n          ref={ref}\n          className={styles.input}\n          {...restProps}\n          style={{\n            paddingLeft: prefixRect ? prefixRect.width : undefined,\n            paddingRight: suffixRect ? suffixRect.width : undefined,\n          }}\n        />\n\n        {(suffix || loading) && (\n          <div className={styles.suffix} ref={suffixRef}>\n            {loading && <Icon name=\"fa fa-spinner\" className={cx('fa-spin', styles.loadingIndicator)} />}\n            {suffix}\n          </div>\n        )}\n      </div>\n\n      {!!addonAfter && <div className={styles.addon}>{addonAfter}</div>}\n    </div>\n  );\n});\n\nInput.displayName = 'Input';\n","import { scaledUnits, ValueFormatter } from './valueFormats';\nimport { DecimalCount } from '../types/displayValue';\n\nexport function currency(symbol: string, asSuffix?: boolean): ValueFormatter {\n  const units = ['', 'K', 'M', 'B', 'T'];\n  const scaler = scaledUnits(1000, units);\n  return (size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    const scaled = scaler(size, decimals, scaledDecimals);\n    if (asSuffix) {\n      scaled.suffix = scaled.suffix !== undefined ? `${scaled.suffix}${symbol}` : undefined;\n    } else {\n      scaled.prefix = symbol;\n    }\n    return scaled;\n  };\n}\n\nexport function getOffsetFromSIPrefix(c: string): number {\n  switch (c) {\n    case 'f':\n      return -5;\n    case 'p':\n      return -4;\n    case 'n':\n      return -3;\n    case 'μ': // Two different unicode chars for µ\n    case 'µ':\n      return -2;\n    case 'm':\n      return -1;\n    case '':\n      return 0;\n    case 'k':\n      return 1;\n    case 'M':\n      return 2;\n    case 'G':\n      return 3;\n    case 'T':\n      return 4;\n    case 'P':\n      return 5;\n    case 'E':\n      return 6;\n    case 'Z':\n      return 7;\n    case 'Y':\n      return 8;\n  }\n  return 0;\n}\n\nexport function binarySIPrefix(unit: string, offset = 0): ValueFormatter {\n  const prefixes = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi'].slice(offset);\n  const units = prefixes.map(p => {\n    return ' ' + p + unit;\n  });\n  return scaledUnits(1024, units);\n}\n\nexport function decimalSIPrefix(unit: string, offset = 0): ValueFormatter {\n  let prefixes = ['f', 'p', 'n', 'µ', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];\n  prefixes = prefixes.slice(5 + (offset || 0));\n  const units = prefixes.map(p => {\n    return ' ' + p + unit;\n  });\n  return scaledUnits(1000, units);\n}\n","var path = 'public/app/plugins/datasource/postgres/partials/config.html';\nvar html = \"\\n<h3 class=page-heading>PostgreSQL Connection</h3>\\n\\n<div class=gf-form-group>\\n\\t<div class=\\\"gf-form max-width-30\\\">\\n\\t\\t<span class=\\\"gf-form-label width-10\\\">Host</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.url placeholder=localhost:5432 bs-typeahead=\\\"{{['localhost:5432', 'localhost:5433']}}\\\" required>\\n\\t</div>\\n\\n\\t<div class=\\\"gf-form max-width-30\\\">\\n\\t\\t<span class=\\\"gf-form-label width-10\\\">Database</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.database placeholder=\\\"database name\\\" required>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t\\t<span class=\\\"gf-form-label width-10\\\">User</span>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.current.user placeholder=user>\\n\\t\\t</div>\\n    <div class=gf-form>\\n      <secret-form-field isconfigured=ctrl.current.secureJsonFields.password value=ctrl.current.secureJsonData.password on-reset=ctrl.onPasswordReset on-change=ctrl.onPasswordChange inputwidth=9 />\\n    </div>\\n  </div>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label width-10\\\">SSL Mode</label>\\n    <div class=\\\"gf-form-select-wrapper max-width-15 gf-form-select-wrapper--has-help-icon\\\">\\n      <select class=gf-form-input ng-model=ctrl.current.jsonData.sslmode ng-options=\\\"mode for mode in ['disable', 'require', 'verify-ca', 'verify-full']\\\" ng-init=ctrl.current.jsonData.sslmode></select>\\n      <info-popover mode=right-absolute>\\n        This option determines whether or with what priority a secure SSL (TLS) TCP/IP connection will be negotiated with the server.\\n      </info-popover>\\n    </div>\\n  </div>\\n  <div class=\\\"gf-form max-width-30\\\" ng-if=\\\"ctrl.current.jsonData.sslmode != 'disable'\\\">\\n    <span class=\\\"gf-form-label width-10\\\">SSL Root Certificate</span>\\n    <input type=text class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.sslRootCertFile placeholder=\\\"SSL/TLS root cert file\\\">\\n    <info-popover mode=right-absolute>\\n      If the selected SSL mode requires a server root certificate, provide the path to the file here.\\n      Be sure that the file is readable by the user executing the grafana process.\\n    </info-popover>\\n  </div>\\n  <div class=\\\"gf-form max-width-30\\\" ng-if=\\\"ctrl.current.jsonData.sslmode != 'disable'\\\">\\n    <span class=\\\"gf-form-label width-10\\\">SSL Client Certificate</span>\\n    <input type=text class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.sslCertFile placeholder=\\\"SSL/TLS client cert file\\\">\\n    <info-popover mode=right-absolute>\\n      To authenticate with an SSL/TLS client certificate, provide the path to the file here.\\n      Be sure that the file is readable by the user executing the grafana process.\\n    </info-popover>\\n  </div>\\n  <div class=\\\"gf-form max-width-30\\\" ng-if=\\\"ctrl.current.jsonData.sslmode != 'disable'\\\">\\n    <span class=\\\"gf-form-label width-10\\\">SSL Client Key</span>\\n    <input type=text class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.sslKeyFile placeholder=\\\"SSL/TLS client key file\\\">\\n    <info-popover mode=right-absolute>\\n      To authenticate with a client SSL/TLS certificate, provide the path to the corresponding key file here.\\n      Be sure that the file is <i>only</i> readable by the user executing the grafana process.\\n    </info-popover>\\n  </div>\\n</div>\\n\\n<b>Connection limits</b>\\n\\n<div class=gf-form-group>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max open</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.maxOpenConns placeholder=unlimited>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum number of open connections to the database. If <i>Max idle connections</i> is greater than 0 and the\\n\\t\\t\\t<i>Max open connections</i> is less than <i>Max idle connections</i>, then <i>Max idle connections</i> will be\\n\\t\\t\\treduced to match the <i>Max open connections</i> limit. If set to 0, there is no limit on the number of open\\n\\t\\t\\tconnections.\\n\\t\\t</info-popover>\\n\\t</div>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max idle</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.maxIdleConns placeholder=2>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum number of connections in the idle connection pool. If <i>Max open connections</i> is greater than 0 but\\n\\t\\t\\tless than the <i>Max idle connections</i>, then the <i>Max idle connections</i> will be reduced to match the\\n\\t\\t\\t<i>Max open connections</i> limit. If set to 0, no idle connections are retained.\\n\\t\\t</info-popover>\\n\\t</div>\\n\\t<div class=\\\"gf-form max-width-15\\\">\\n\\t\\t<span class=\\\"gf-form-label width-7\\\">Max lifetime</span>\\n\\t\\t<input type=number min=0 class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.connMaxLifetime placeholder=14400>\\n\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\tThe maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused forever.\\n\\t\\t</info-popover>\\n\\t</div>\\n</div>\\n\\n<h3 class=page-heading>PostgreSQL details</h3>\\n\\n<div class=gf-form-group>\\n\\t<div class=gf-form>\\n\\t\\t<span class=\\\"gf-form-label width-9\\\">\\n\\t\\t\\tVersion\\n\\t\\t\\t<info-popover mode=right-normal position=\\\"top center\\\">\\n\\t\\t\\t\\tThis option controls what functions are available in the PostgreSQL query builder.\\n\\t\\t\\t</info-popover>\\n\\t\\t</span>\\n\\t\\t<span class=gf-form-select-wrapper>\\n\\t\\t\\t<select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.current.jsonData.postgresVersion ng-options=\\\"f.value as f.name for f in ctrl.postgresVersions\\\"></select>\\n\\t\\t</span>\\n\\t</div>\\n\\t<div class=gf-form>\\n\\t\\t<gf-form-switch class=gf-form label=TimescaleDB label-class=width-9 checked=ctrl.current.jsonData.timescaledb switch-class=max-width-6></gf-form-switch>\\n    <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=ctrl.toggleTimescaleDBHelp()>\\n      Help&nbsp;\\n      <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showTimescaleDBHelp></icon>\\n      <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showTimescaleDBHelp>&nbsp;</icon>\\n    </label>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-9\\\">Min time interval</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input width-6 gf-form-input--has-help-icon\\\" ng-model=ctrl.current.jsonData.timeInterval spellcheck=false placeholder=1m ng-pattern=/^\\\\d+(ms|[Mwdhmsy])$/ >\\n\\t\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\t\\tA lower limit for the auto group by time interval. Recommended to be set to write frequency,\\n\\t\\t\\t\\tfor example <code>1m</code> if your data is written every minute.\\n\\t\\t\\t</info-popover>\\n\\t\\t</div>\\n\\t</div>\\n<div class=\\\"grafana-info-box alert alert-info\\\" ng-show=ctrl.showTimescaleDBHelp>\\n  <div class=alert-body>\\n    <p>\\n\\t\\t\\t<a href=https://github.com/timescale/timescaledb class=pointer target=_blank>TimescaleDB</a> is a time-series database built as a PostgreSQL extension. If enabled, Grafana will use <code>time_bucket</code> in the <code>$__timeGroup</code> macro and display TimescaleDB specific aggregate functions in the query builder.\\n    </p>\\n  </div>\\n</div>\\n\\n</div>\\n\\n\\n<div class=gf-form-group>\\n\\t<div class=grafana-info-box>\\n\\t\\t<h5>User Permission</h5>\\n\\t\\t<p>\\n\\t\\t\\tThe database user should only be granted SELECT permissions on the specified database &amp; tables you want to query.\\n\\t\\t\\tGrafana does not validate that queries are safe so queries can contain any SQL statement. For example, statements\\n\\t\\t\\tlike <code>DELETE FROM user;</code> and <code>DROP TABLE user;</code> would be executed. To protect against this we\\n\\t\\t\\t<strong>Highly</strong> recommmend you create a specific PostgreSQL user with restricted permissions.\\n\\t\\t</p>\\n\\t</div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React from 'react';\nimport { useTheme, stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from 'emotion';\nimport { Icon } from '../Icon/Icon';\nimport tinycolor from 'tinycolor2';\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n  children: React.ReactNode;\n  description?: React.ReactNode;\n  category?: string[];\n}\n\nexport const getLabelStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    label: css`\n      label: Label;\n      font-size: ${theme.typography.size.sm};\n      font-weight: ${theme.typography.weight.semibold};\n      line-height: 1.25;\n      margin: ${theme.spacing.formLabelMargin};\n      padding: ${theme.spacing.formLabelPadding};\n      color: ${theme.colors.formLabel};\n      max-width: 480px;\n    `,\n    labelContent: css`\n      display: flex;\n      align-items: center;\n    `,\n    description: css`\n      label: Label-description;\n      color: ${theme.colors.formDescription};\n      font-size: ${theme.typography.size.sm};\n      font-weight: ${theme.typography.weight.regular};\n      margin-top: ${theme.spacing.xxs};\n      display: block;\n    `,\n    categories: css`\n      label: Label-categories;\n      color: ${theme.isLight\n        ? tinycolor(theme.colors.formLabel)\n            .lighten(10)\n            .toHexString()\n        : tinycolor(theme.colors.formLabel)\n            .darken(10)\n            .toHexString()};\n      display: inline-flex;\n      align-items: center;\n    `,\n    chevron: css`\n      margin: 0 ${theme.spacing.xxs};\n    `,\n  };\n});\n\nexport const Label: React.FC<LabelProps> = ({ children, description, className, category, ...labelProps }) => {\n  const theme = useTheme();\n  const styles = getLabelStyles(theme);\n  const categories = category?.map((c, i) => {\n    return (\n      <span className={styles.categories} key={`${c}/${i}`}>\n        <span>{c}</span>\n        <Icon name=\"angle-right\" className={styles.chevron} />\n      </span>\n    );\n  });\n\n  return (\n    <div className={cx(styles.label, className)}>\n      <label {...labelProps}>\n        <div className={styles.labelContent}>\n          {categories}\n          {children}\n        </div>\n        {description && <span className={styles.description}>{description}</span>}\n      </label>\n    </div>\n  );\n};\n","import React from 'react';\nimport { Button, HorizontalGroup, Input, Switch, Form, Field, InputControl } from '@grafana/ui';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { SaveDashboardFormProps } from '../types';\nimport validationSrv from 'app/features/manage-dashboards/services/ValidationSrv';\n\ninterface SaveDashboardAsFormDTO {\n  title: string;\n  $folder: { id: number; title: string };\n  copyTags: boolean;\n}\n\nconst getSaveAsDashboardClone = (dashboard: DashboardModel) => {\n  const clone: any = dashboard.getSaveModelClone();\n  clone.id = null;\n  clone.uid = '';\n  clone.title += ' Copy';\n  clone.editable = true;\n  clone.hideControls = false;\n\n  // remove alerts if source dashboard is already persisted\n  // do not want to create alert dupes\n  if (dashboard.id > 0) {\n    clone.panels.forEach((panel: PanelModel) => {\n      if (panel.type === 'graph' && panel.alert) {\n        delete panel.thresholds;\n      }\n      delete panel.alert;\n    });\n  }\n\n  delete clone.autoUpdate;\n  return clone;\n};\n\nexport const SaveDashboardAsForm: React.FC<SaveDashboardFormProps & { isNew?: boolean }> = ({\n  dashboard,\n  onSubmit,\n  onCancel,\n  onSuccess,\n}) => {\n  const defaultValues: SaveDashboardAsFormDTO = {\n    title: `${dashboard.title} Copy`,\n    $folder: {\n      id: dashboard.meta.folderId,\n      title: dashboard.meta.folderTitle,\n    },\n    copyTags: false,\n  };\n\n  const validateDashboardName = (getFormValues: () => SaveDashboardAsFormDTO) => async (dashboardName: string) => {\n    if (dashboardName && dashboardName === getFormValues().$folder.title?.trim()) {\n      return 'Dashboard name cannot be the same as folder';\n    }\n    try {\n      await validationSrv.validateNewDashboardName(getFormValues().$folder.id, dashboardName);\n      return true;\n    } catch (e) {\n      return e.message;\n    }\n  };\n\n  return (\n    <Form\n      defaultValues={defaultValues}\n      onSubmit={async (data: SaveDashboardAsFormDTO) => {\n        const clone = getSaveAsDashboardClone(dashboard);\n        clone.title = data.title;\n        if (!data.copyTags) {\n          clone.tags = [];\n        }\n\n        const result = await onSubmit(\n          clone,\n          {\n            folderId: data.$folder.id,\n          },\n          dashboard\n        );\n\n        if (result.status === 'success') {\n          onSuccess();\n        }\n      }}\n    >\n      {({ register, control, errors, getValues }) => (\n        <>\n          <Field label=\"Dashboard name\" invalid={!!errors.title} error={errors.title?.message}>\n            <Input\n              name=\"title\"\n              ref={register({\n                validate: validateDashboardName(getValues),\n              })}\n              aria-label=\"Save dashboard title field\"\n              autoFocus\n            />\n          </Field>\n          <Field label=\"Folder\">\n            <InputControl\n              as={FolderPicker}\n              control={control}\n              name=\"$folder\"\n              dashboardId={dashboard.id}\n              initialFolderId={dashboard.meta.folderId}\n              initialTitle={dashboard.meta.folderTitle}\n              enableCreateNew\n              useNewForms\n            />\n          </Field>\n          <Field label=\"Copy tags\">\n            <Switch name=\"copyTags\" ref={register} />\n          </Field>\n          <HorizontalGroup>\n            <Button type=\"submit\" aria-label=\"Save dashboard button\">\n              Save\n            </Button>\n            <Button variant=\"secondary\" onClick={onCancel}>\n              Cancel\n            </Button>\n          </HorizontalGroup>\n        </>\n      )}\n    </Form>\n  );\n};\n","import React, { useState } from 'react';\nimport { css } from 'emotion';\nimport { Modal } from '@grafana/ui';\nimport { SaveDashboardAsForm } from './forms/SaveDashboardAsForm';\nimport { SaveDashboardErrorProxy } from './SaveDashboardErrorProxy';\nimport { useDashboardSave } from './useDashboardSave';\nimport { SaveDashboardModalProps } from './types';\n\nexport const SaveDashboardAsModal: React.FC<SaveDashboardModalProps & {\n  isNew?: boolean;\n}> = ({ dashboard, onDismiss, isNew }) => {\n  const { state, onDashboardSave } = useDashboardSave(dashboard);\n  const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState();\n  return (\n    <>\n      {state.error && (\n        <SaveDashboardErrorProxy\n          error={state.error}\n          dashboard={dashboard}\n          dashboardSaveModel={dashboardSaveModelClone}\n          onDismiss={onDismiss}\n        />\n      )}\n      {!state.error && (\n        <Modal\n          isOpen={true}\n          title=\"Save dashboard as...\"\n          icon=\"copy\"\n          onDismiss={onDismiss}\n          className={css`\n            width: 500px;\n          `}\n        >\n          <SaveDashboardAsForm\n            dashboard={dashboard}\n            onCancel={onDismiss}\n            onSuccess={onDismiss}\n            onSubmit={(clone, options, dashboard) => {\n              setDashboardSaveModelClone(clone);\n              return onDashboardSave(clone, options, dashboard);\n            }}\n            isNew={isNew}\n          />\n        </Modal>\n      )}\n    </>\n  );\n};\n","import { GrafanaThemeType } from '@grafana/data';\n\ntype VariantDescriptor = { [key in GrafanaThemeType]: string | number };\n\nexport const selectThemeVariant = (variants: VariantDescriptor, currentTheme?: GrafanaThemeType) => {\n  return variants[currentTheme || GrafanaThemeType.Dark];\n};\n","import { PanelModel } from 'app/features/dashboard/state';\n\nexport class ThresholdMapper {\n  static alertToGraphThresholds(panel: PanelModel) {\n    for (let i = 0; i < panel.alert.conditions.length; i++) {\n      const condition = panel.alert.conditions[i];\n      if (condition.type !== 'query') {\n        continue;\n      }\n\n      const evaluator = condition.evaluator;\n      const thresholds: any[] = (panel.thresholds = []);\n\n      switch (evaluator.type) {\n        case 'gt': {\n          const value = evaluator.params[0];\n          thresholds.push({ value: value, op: 'gt' });\n          break;\n        }\n        case 'lt': {\n          const value = evaluator.params[0];\n          thresholds.push({ value: value, op: 'lt' });\n          break;\n        }\n        case 'outside_range': {\n          const value1 = evaluator.params[0];\n          const value2 = evaluator.params[1];\n\n          if (value1 > value2) {\n            thresholds.push({ value: value1, op: 'gt' });\n            thresholds.push({ value: value2, op: 'lt' });\n          } else {\n            thresholds.push({ value: value1, op: 'lt' });\n            thresholds.push({ value: value2, op: 'gt' });\n          }\n\n          break;\n        }\n        case 'within_range': {\n          const value1 = evaluator.params[0];\n          const value2 = evaluator.params[1];\n\n          if (value1 > value2) {\n            thresholds.push({ value: value1, op: 'lt' });\n            thresholds.push({ value: value2, op: 'gt' });\n          } else {\n            thresholds.push({ value: value1, op: 'gt' });\n            thresholds.push({ value: value2, op: 'lt' });\n          }\n          break;\n        }\n      }\n      break;\n    }\n\n    for (const t of panel.thresholds) {\n      t.fill = true;\n      t.line = true;\n      t.colorMode = 'critical';\n    }\n\n    const updated = true;\n    return updated;\n  }\n}\n","import _ from 'lodash';\nimport coreModule from 'app/core/core_module';\nimport { ThresholdMapper } from './state/ThresholdMapper';\nimport { QueryPart } from 'app/core/components/query_part/query_part';\nimport alertDef from './state/alertDef';\nimport config from 'app/core/config';\nimport appEvents from 'app/core/app_events';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { DashboardSrv } from '../dashboard/services/DashboardSrv';\nimport DatasourceSrv from '../plugins/datasource_srv';\nimport { DataQuery, DataSourceApi } from '@grafana/data';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { getDefaultCondition } from './getAlertingValidationMessage';\nimport { CoreEvents } from 'app/types';\nimport kbn from 'app/core/utils/kbn';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nexport class AlertTabCtrl {\n  panel: PanelModel;\n  panelCtrl: any;\n  subTabIndex: number;\n  conditionTypes: any;\n  alert: any;\n  conditionModels: any;\n  evalFunctions: any;\n  evalOperators: any;\n  noDataModes: any;\n  executionErrorModes: any;\n  addNotificationSegment: any;\n  notifications: any;\n  alertNotifications: any;\n  error: string;\n  appSubUrl: string;\n  alertHistory: any;\n  newAlertRuleTag: any;\n  alertingMinIntervalSecs: number;\n  alertingMinInterval: string;\n  frequencyWarning: any;\n\n  /** @ngInject */\n  constructor(\n    private $scope: any,\n    private dashboardSrv: DashboardSrv,\n    private uiSegmentSrv: any,\n    private datasourceSrv: DatasourceSrv\n  ) {\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n    this.$scope.ctrl = this;\n    this.subTabIndex = 0;\n    this.evalFunctions = alertDef.evalFunctions;\n    this.evalOperators = alertDef.evalOperators;\n    this.conditionTypes = alertDef.conditionTypes;\n    this.noDataModes = alertDef.noDataModes;\n    this.executionErrorModes = alertDef.executionErrorModes;\n    this.appSubUrl = config.appSubUrl;\n    this.panelCtrl._enableAlert = this.enable;\n    this.alertingMinIntervalSecs = config.alertingMinInterval;\n    this.alertingMinInterval = kbn.secondsToHms(config.alertingMinInterval);\n  }\n\n  $onInit() {\n    this.addNotificationSegment = this.uiSegmentSrv.newPlusButton();\n\n    // subscribe to graph threshold handle changes\n    const thresholdChangedEventHandler = this.graphThresholdChanged.bind(this);\n    this.panelCtrl.events.on(CoreEvents.thresholdChanged, thresholdChangedEventHandler);\n\n    // set panel alert edit mode\n    this.$scope.$on('$destroy', () => {\n      this.panelCtrl.events.off(CoreEvents.thresholdChanged, thresholdChangedEventHandler);\n      this.panelCtrl.editingThresholds = false;\n      this.panelCtrl.render();\n    });\n\n    // build notification model\n    this.notifications = [];\n    this.alertNotifications = [];\n    this.alertHistory = [];\n\n    return promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get('/api/alert-notifications/lookup')\n        .then((res: any) => {\n          this.notifications = res;\n\n          this.initModel();\n          this.validateModel();\n        })\n    );\n  }\n\n  getAlertHistory() {\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get(`/api/annotations?dashboardId=${this.panelCtrl.dashboard.id}&panelId=${this.panel.id}&limit=50&type=alert`)\n        .then((res: any) => {\n          this.alertHistory = _.map(res, ah => {\n            ah.time = this.dashboardSrv.getCurrent().formatDate(ah.time, 'MMM D, YYYY HH:mm:ss');\n            ah.stateModel = alertDef.getStateDisplayModel(ah.newState);\n            ah.info = alertDef.getAlertAnnotationInfo(ah);\n            return ah;\n          });\n        })\n    );\n  }\n\n  getNotificationIcon(type: string): string {\n    switch (type) {\n      case 'email':\n        return 'envelope';\n      case 'slack':\n        return 'slack';\n      case 'victorops':\n        return 'fa fa-pagelines';\n      case 'webhook':\n        return 'cube';\n      case 'pagerduty':\n        return 'fa fa-bullhorn';\n      case 'opsgenie':\n        return 'bell';\n      case 'hipchat':\n        return 'fa fa-mail-forward';\n      case 'pushover':\n        return 'mobile-android';\n      case 'kafka':\n        return 'arrow-random';\n      case 'teams':\n        return 'fa fa-windows';\n    }\n    return 'bell';\n  }\n\n  getNotifications() {\n    return Promise.resolve(\n      this.notifications.map((item: any) => {\n        return this.uiSegmentSrv.newSegment(item.name);\n      })\n    );\n  }\n\n  notificationAdded() {\n    const model: any = _.find(this.notifications, {\n      name: this.addNotificationSegment.value,\n    });\n    if (!model) {\n      return;\n    }\n\n    this.alertNotifications.push({\n      name: model.name,\n      iconClass: this.getNotificationIcon(model.type),\n      isDefault: false,\n      uid: model.uid,\n    });\n\n    // avoid duplicates using both id and uid to be backwards compatible.\n    if (!_.find(this.alert.notifications, n => n.id === model.id || n.uid === model.uid)) {\n      this.alert.notifications.push({ uid: model.uid });\n    }\n\n    // reset plus button\n    this.addNotificationSegment.value = this.uiSegmentSrv.newPlusButton().value;\n    this.addNotificationSegment.html = this.uiSegmentSrv.newPlusButton().html;\n    this.addNotificationSegment.fake = true;\n  }\n\n  removeNotification(an: any) {\n    // remove notifiers refeered to by id and uid to support notifiers added\n    // before and after we added support for uid\n    _.remove(this.alert.notifications, (n: any) => n.uid === an.uid);\n    _.remove(this.alertNotifications, (n: any) => n.uid === an.uid);\n  }\n\n  addAlertRuleTag() {\n    if (this.newAlertRuleTag.name) {\n      this.alert.alertRuleTags[this.newAlertRuleTag.name] = this.newAlertRuleTag.value;\n    }\n    this.newAlertRuleTag.name = '';\n    this.newAlertRuleTag.value = '';\n  }\n\n  removeAlertRuleTag(tagName: string) {\n    delete this.alert.alertRuleTags[tagName];\n  }\n\n  initModel() {\n    const alert = (this.alert = this.panel.alert);\n    if (!alert) {\n      return;\n    }\n\n    this.checkFrequency();\n\n    alert.conditions = alert.conditions || [];\n    if (alert.conditions.length === 0) {\n      alert.conditions.push(getDefaultCondition());\n    }\n\n    alert.noDataState = alert.noDataState || config.alertingNoDataOrNullValues;\n    alert.executionErrorState = alert.executionErrorState || config.alertingErrorOrTimeout;\n    alert.frequency = alert.frequency || '1m';\n    alert.handler = alert.handler || 1;\n    alert.notifications = alert.notifications || [];\n    alert.for = alert.for || '0m';\n    alert.alertRuleTags = alert.alertRuleTags || {};\n\n    const defaultName = this.panel.title + ' alert';\n    alert.name = alert.name || defaultName;\n\n    this.conditionModels = _.reduce(\n      alert.conditions,\n      (memo, value) => {\n        memo.push(this.buildConditionModel(value));\n        return memo;\n      },\n      []\n    );\n\n    ThresholdMapper.alertToGraphThresholds(this.panel);\n\n    for (const addedNotification of alert.notifications) {\n      // lookup notifier type by uid\n      let model: any = _.find(this.notifications, { uid: addedNotification.uid });\n\n      // fallback to using id if uid is missing\n      if (!model) {\n        model = _.find(this.notifications, { id: addedNotification.id });\n      }\n\n      if (model && model.isDefault === false) {\n        model.iconClass = this.getNotificationIcon(model.type);\n        this.alertNotifications.push(model);\n      }\n    }\n\n    for (const notification of this.notifications) {\n      if (notification.isDefault) {\n        notification.iconClass = this.getNotificationIcon(notification.type);\n        this.alertNotifications.push(notification);\n      }\n    }\n\n    this.panelCtrl.editingThresholds = true;\n    this.panelCtrl.render();\n  }\n\n  checkFrequency() {\n    if (!this.alert.frequency) {\n      return;\n    }\n\n    this.frequencyWarning = '';\n\n    try {\n      const frequencySecs = kbn.interval_to_seconds(this.alert.frequency);\n      if (frequencySecs < this.alertingMinIntervalSecs) {\n        this.frequencyWarning =\n          'A minimum evaluation interval of ' +\n          this.alertingMinInterval +\n          ' have been configured in Grafana and will be used for this alert rule. ' +\n          'Please contact the administrator to configure a lower interval.';\n      }\n    } catch (err) {\n      this.frequencyWarning = err;\n    }\n  }\n\n  graphThresholdChanged(evt: any) {\n    for (const condition of this.alert.conditions) {\n      if (condition.type === 'query') {\n        condition.evaluator.params[evt.handleIndex] = evt.threshold.value;\n        this.evaluatorParamsChanged();\n        break;\n      }\n    }\n  }\n\n  validateModel() {\n    if (!this.alert) {\n      return;\n    }\n\n    let firstTarget;\n    let foundTarget: DataQuery = null;\n\n    const promises: Array<Promise<any>> = [];\n    for (const condition of this.alert.conditions) {\n      if (condition.type !== 'query') {\n        continue;\n      }\n\n      for (const target of this.panel.targets) {\n        if (!firstTarget) {\n          firstTarget = target;\n        }\n        if (condition.query.params[0] === target.refId) {\n          foundTarget = target;\n          break;\n        }\n      }\n\n      if (!foundTarget) {\n        if (firstTarget) {\n          condition.query.params[0] = firstTarget.refId;\n          foundTarget = firstTarget;\n        } else {\n          this.error = 'Could not find any metric queries';\n          return;\n        }\n      }\n\n      const datasourceName = foundTarget.datasource || this.panel.datasource;\n      promises.push(\n        this.datasourceSrv.get(datasourceName).then(\n          (foundTarget => (ds: DataSourceApi) => {\n            if (!ds.meta.alerting) {\n              return Promise.reject('The datasource does not support alerting queries');\n            } else if (ds.targetContainsTemplate && ds.targetContainsTemplate(foundTarget)) {\n              return Promise.reject('Template variables are not supported in alert queries');\n            }\n            return Promise.resolve();\n          })(foundTarget)\n        )\n      );\n    }\n    Promise.all(promises).then(\n      () => {\n        this.error = '';\n        this.$scope.$apply();\n      },\n      e => {\n        this.error = e;\n        this.$scope.$apply();\n      }\n    );\n  }\n\n  buildConditionModel(source: any) {\n    const cm: any = { source: source, type: source.type };\n\n    cm.queryPart = new QueryPart(source.query, alertDef.alertQueryDef);\n    cm.reducerPart = alertDef.createReducerPart(source.reducer);\n    cm.evaluator = source.evaluator;\n    cm.operator = source.operator;\n\n    return cm;\n  }\n\n  handleQueryPartEvent(conditionModel: any, evt: any) {\n    switch (evt.name) {\n      case 'action-remove-part': {\n        break;\n      }\n      case 'get-part-actions': {\n        return Promise.resolve([]);\n      }\n      case 'part-param-changed': {\n        this.validateModel();\n      }\n      case 'get-param-options': {\n        const result = this.panel.targets.map(target => {\n          return this.uiSegmentSrv.newSegment({ value: target.refId });\n        });\n\n        return Promise.resolve(result);\n      }\n      default: {\n        return Promise.resolve();\n      }\n    }\n\n    return Promise.resolve();\n  }\n\n  handleReducerPartEvent(conditionModel: any, evt: any) {\n    switch (evt.name) {\n      case 'action': {\n        conditionModel.source.reducer.type = evt.action.value;\n        conditionModel.reducerPart = alertDef.createReducerPart(conditionModel.source.reducer);\n        break;\n      }\n      case 'get-part-actions': {\n        const result = [];\n        for (const type of alertDef.reducerTypes) {\n          if (type.value !== conditionModel.source.reducer.type) {\n            result.push(type);\n          }\n        }\n        return Promise.resolve(result);\n      }\n    }\n\n    return Promise.resolve();\n  }\n\n  addCondition(type: string) {\n    const condition = getDefaultCondition();\n    // add to persited model\n    this.alert.conditions.push(condition);\n    // add to view model\n    this.conditionModels.push(this.buildConditionModel(condition));\n  }\n\n  removeCondition(index: number) {\n    this.alert.conditions.splice(index, 1);\n    this.conditionModels.splice(index, 1);\n  }\n\n  delete() {\n    appEvents.emit(CoreEvents.showConfirmModal, {\n      title: 'Delete Alert',\n      text: 'Are you sure you want to delete this alert rule?',\n      text2: 'You need to save dashboard for the delete to take effect',\n      icon: 'trash-alt',\n      yesText: 'Delete',\n      onConfirm: () => {\n        delete this.panel.alert;\n        this.alert = null;\n        this.panel.thresholds = [];\n        this.conditionModels = [];\n        this.panelCtrl.alertState = null;\n        this.panelCtrl.render();\n      },\n    });\n  }\n\n  enable = () => {\n    this.panel.alert = {};\n    this.initModel();\n    this.panel.alert.for = '5m'; //default value for new alerts. for existing alerts we use 0m to avoid breaking changes\n  };\n\n  evaluatorParamsChanged() {\n    ThresholdMapper.alertToGraphThresholds(this.panel);\n    this.panelCtrl.render();\n  }\n\n  evaluatorTypeChanged(evaluator: any) {\n    // ensure params array is correct length\n    switch (evaluator.type) {\n      case 'lt':\n      case 'gt': {\n        evaluator.params = [evaluator.params[0]];\n        break;\n      }\n      case 'within_range':\n      case 'outside_range': {\n        evaluator.params = [evaluator.params[0], evaluator.params[1]];\n        break;\n      }\n      case 'no_value': {\n        evaluator.params = [];\n      }\n    }\n\n    this.evaluatorParamsChanged();\n  }\n\n  clearHistory() {\n    appEvents.emit(CoreEvents.showConfirmModal, {\n      title: 'Delete Alert History',\n      text: 'Are you sure you want to remove all history & annotations for this alert?',\n      icon: 'trash-alt',\n      yesText: 'Yes',\n      onConfirm: () => {\n        promiseToDigest(this.$scope)(\n          getBackendSrv()\n            .post('/api/annotations/mass-delete', {\n              dashboardId: this.panelCtrl.dashboard.id,\n              panelId: this.panel.id,\n            })\n            .then(() => {\n              this.alertHistory = [];\n              this.panelCtrl.refresh();\n            })\n        );\n      },\n    });\n  }\n}\n\n/** @ngInject */\nexport function alertTab() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/features/alerting/partials/alert_tab.html',\n    controller: AlertTabCtrl,\n  };\n}\n\ncoreModule.directive('alertTab', alertTab);\n","export interface PanelEditorTab {\n  id: string;\n  text: string;\n  active: boolean;\n  icon: string;\n}\n\nexport enum PanelEditorTabId {\n  Query = 'query',\n  Transform = 'transform',\n  Visualize = 'visualize',\n  Alert = 'alert',\n}\n\nexport enum DisplayMode {\n  Fill = 0,\n  Fit = 1,\n  Exact = 2,\n}\n\nexport const displayModes = [\n  { value: DisplayMode.Fill, label: 'Fill', description: 'Use all available space' },\n  { value: DisplayMode.Fit, label: 'Fit', description: 'Fit in the space keeping ratio' },\n  { value: DisplayMode.Exact, label: 'Exact', description: 'Same size as the dashboard' },\n];\n","var path = 'public/app/plugins/panel/dashlist/module.html';\nvar html = \"<div>\\n  <div class=dashlist ng-repeat=\\\"group in ctrl.groups\\\">\\n    <div class=dashlist-section ng-if=group.show>\\n      <h6 class=dashlist-section-header ng-show=ctrl.panel.headings>\\n        {{group.header}}\\n      </h6>\\n      <div class=dashlist-item ng-repeat=\\\"dash in group.list\\\">\\n        <a class=\\\"dashlist-link dashlist-link-{{dash.type}}\\\" href={{dash.url}}>\\n          <span class=dashlist-title>\\n            {{dash.title}}\\n          </span>\\n          <span class=dashlist-star ng-click=\\\"ctrl.starDashboard(dash, $event)\\\">\\n            <icon name=\\\"dash.isStarred ? 'favorite':'star'\\\" type=\\\"dash.isStarred ? 'mono':'default'\\\"></icon>\\n          </span>\\n        </a>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { FC, useState } from 'react';\nimport { css } from 'emotion';\nimport { Button, HorizontalGroup, Modal, stylesFactory, useTheme } from '@grafana/ui';\nimport { AppEvents, GrafanaTheme } from '@grafana/data';\nimport { FolderInfo } from 'app/types';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport appEvents from 'app/core/app_events';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSection, OnMoveItems } from '../types';\nimport { getCheckedDashboards } from '../utils';\n\ninterface Props {\n  onMoveItems: OnMoveItems;\n  results: DashboardSection[];\n  isOpen: boolean;\n  onDismiss: () => void;\n}\n\nexport const MoveToFolderModal: FC<Props> = ({ results, onMoveItems, isOpen, onDismiss }) => {\n  const [folder, setFolder] = useState<FolderInfo | null>(null);\n  const theme = useTheme();\n  const styles = getStyles(theme);\n  const selectedDashboards = getCheckedDashboards(results);\n\n  const moveTo = () => {\n    if (folder && selectedDashboards.length) {\n      const folderTitle = folder.title ?? 'General';\n\n      backendSrv.moveDashboards(selectedDashboards.map(d => d.uid) as string[], folder).then((result: any) => {\n        if (result.successCount > 0) {\n          const ending = result.successCount === 1 ? '' : 's';\n          const header = `Dashboard${ending} Moved`;\n          const msg = `${result.successCount} dashboard${ending} moved to ${folderTitle}`;\n          appEvents.emit(AppEvents.alertSuccess, [header, msg]);\n        }\n\n        if (result.totalCount === result.alreadyInFolderCount) {\n          appEvents.emit(AppEvents.alertError, ['Error', `Dashboard already belongs to folder ${folderTitle}`]);\n        } else {\n          onMoveItems(selectedDashboards, folder);\n        }\n\n        onDismiss();\n      });\n    }\n  };\n\n  return isOpen ? (\n    <Modal\n      className={styles.modal}\n      title=\"Choose Dashboard Folder\"\n      icon=\"folder-plus\"\n      isOpen={isOpen}\n      onDismiss={onDismiss}\n    >\n      <>\n        <div className={styles.content}>\n          <p>\n            Move the {selectedDashboards.length} selected dashboard{selectedDashboards.length === 1 ? '' : 's'} to the\n            following folder:\n          </p>\n          <FolderPicker onChange={f => setFolder(f as FolderInfo)} useNewForms />\n        </div>\n\n        <HorizontalGroup justify=\"center\">\n          <Button variant=\"primary\" onClick={moveTo}>\n            Move\n          </Button>\n          <Button variant=\"secondary\" onClick={onDismiss}>\n            Cancel\n          </Button>\n        </HorizontalGroup>\n      </>\n    </Modal>\n  ) : null;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    modal: css`\n      width: 500px;\n    `,\n    content: css`\n      margin-bottom: ${theme.spacing.lg};\n    `,\n  };\n});\n","var path = 'public/app/plugins/datasource/graphite/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl has-text-edit-mode=true>\\n\\n  <div class=gf-form ng-show=ctrl.target.textEditor>\\n    <input type=text class=gf-form-input ng-model=ctrl.target.target spellcheck=false ng-blur=ctrl.targetTextChanged()>\\n  </div>\\n\\n  <div ng-hide=ctrl.target.textEditor>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6 query-keyword\\\">Series</label>\\n      </div>\\n\\n      <div ng-if=ctrl.queryModel.seriesByTagUsed ng-repeat=\\\"tag in ctrl.queryModel.tags\\\" class=gf-form>\\n        <gf-form-dropdown model=tag.key allow-custom=true label-mode=true debounce=true placeholder=\\\"Tag key\\\" css-class=query-segment-key get-options=\\\"ctrl.getTags($index, $query)\\\" on-change=\\\"ctrl.tagChanged(tag, $index)\\\"/>\\n        <gf-form-dropdown model=tag.operator label-mode=true css-class=query-segment-operator get-options=ctrl.getTagOperators() on-change=\\\"ctrl.tagChanged(tag, $index)\\\" min-input-width=30 />\\n        <gf-form-dropdown model=tag.value allow-custom=true label-mode=true debounce=true css-class=query-segment-value placeholder=\\\"Tag value\\\" get-options=\\\"ctrl.getTagValues(tag, $index, $query)\\\" on-change=\\\"ctrl.tagChanged(tag, $index)\\\"/>\\n        <label class=\\\"gf-form-label query-keyword\\\" ng-if=ctrl.showDelimiter($index)>AND</label>\\n      </div>\\n\\n      <div ng-if=ctrl.queryModel.seriesByTagUsed ng-repeat=\\\"segment in ctrl.addTagSegments\\\" role=menuitem class=gf-form>\\n        <metric-segment segment=segment get-options=ctrl.getTagsAsSegments($query) on-change=ctrl.addNewTag(segment) debounce=true />\\n      </div>\\n\\n      <div ng-if=!ctrl.queryModel.seriesByTagUsed ng-repeat=\\\"segment in ctrl.segments\\\" role=menuitem class=gf-form>\\n        <metric-segment segment=segment get-options=\\\"ctrl.getAltSegments($index, $query)\\\" on-change=\\\"ctrl.segmentValueChanged(segment, $index)\\\"/>\\n      </div>\\n\\n      <div ng-if=ctrl.paused class=gf-form>\\n        <a ng-click=ctrl.unpause() class=\\\"gf-form-label query-part\\\"><icon name=\\\"'play'\\\"></icon></a>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6 query-keyword\\\">Functions</label>\\n      </div>\\n\\n      <div ng-repeat=\\\"func in ctrl.queryModel.functions\\\" class=gf-form>\\n        <span graphite-func-editor class=\\\"gf-form-label query-part\\\" ng-hide=func.hidden></span>\\n      </div>\\n\\n      <div class=\\\"gf-form dropdown\\\">\\n        <span graphite-add-func></span>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n  </div>\\n\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","(function ($) {\n  \"use strict\";\n\n  var defaultOptions = {\n    tagClass: function(item) {\n      return 'label label-info';\n    },\n    itemValue: function(item) {\n      return item ? item.toString() : item;\n    },\n    itemText: function(item) {\n      return this.itemValue(item);\n    },\n    freeInput: true,\n    maxTags: undefined,\n    confirmKeys: [13],\n    onTagExists: function(item, $tag) {\n      $tag.hide().fadeIn();\n    }\n  };\n\n  /**\n   * Constructor function\n   */\n  function TagsInput(element, options) {\n    this.itemsArray = [];\n\n    this.$element = $(element);\n    this.$element.hide();\n\n    this.widthClass = options.widthClass || 'width-9';\n    this.isSelect = (element.tagName === 'SELECT');\n    this.multiple = (this.isSelect && element.hasAttribute('multiple'));\n    this.objectItems = options && options.itemValue;\n    this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';\n\n    this.$container = $('<div class=\"bootstrap-tagsinput\"></div>');\n    this.$input = $('<input class=\"gf-form-input ' + this.widthClass + '\" type=\"text\" placeholder=\"' + this.placeholderText + '\"/>').appendTo(this.$container);\n\n    this.$element.after(this.$container);\n\n    this.build(options);\n  }\n\n  TagsInput.prototype = {\n    constructor: TagsInput,\n\n    /**\n     * Adds the given item as a new tag. Pass true to dontPushVal to prevent\n     * updating the elements val()\n     */\n    add: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)\n        return;\n\n      // Ignore falsey values, except false\n      if (item !== false && !item)\n        return;\n\n      // Throw an error when trying to add an object while the itemValue option was not set\n      if (typeof item === \"object\" && !self.objectItems)\n        throw(\"Can't add objects when itemValue option is not set\");\n\n      // Ignore strings only containg whitespace\n      if (item.toString().match(/^\\s*$/))\n        return;\n\n      // If SELECT but not multiple, remove current tag\n      if (self.isSelect && !self.multiple && self.itemsArray.length > 0)\n        self.remove(self.itemsArray[0]);\n\n      if (typeof item === \"string\" && this.$element[0].tagName === 'INPUT') {\n        var items = item.split(',');\n        if (items.length > 1) {\n          for (var i = 0; i < items.length; i++) {\n            this.add(items[i], true);\n          }\n\n          if (!dontPushVal)\n            self.pushVal();\n          return;\n        }\n      }\n\n      var itemValue = self.options.itemValue(item),\n          itemText = self.options.itemText(item),\n          tagClass = self.options.tagClass(item);\n\n      // Ignore items allready added\n      var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];\n      if (existing) {\n        // Invoke onTagExists\n        if (self.options.onTagExists) {\n          var $existingTag = $(\".tag\", self.$container).filter(function() { return $(this).data(\"item\") === existing; });\n          self.options.onTagExists(item, $existingTag);\n        }\n        return;\n      }\n\n      // register item in internal array and map\n      self.itemsArray.push(item);\n\n      // add a tag element\n      var $tag = $('<span class=\"tag ' + htmlEncode(tagClass) + '\">' + htmlEncode(itemText) + '<span data-role=\"remove\"></span></span>');\n      $tag.data('item', item);\n      self.findInputWrapper().before($tag);\n      $tag.after(' ');\n\n      // add <option /> if item represents a value not present in one of the <select />'s options\n      if (self.isSelect && !$('option[value=\"' + escape(itemValue) + '\"]',self.$element)[0]) {\n        var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');\n        $option.data('item', item);\n        $option.attr('value', itemValue);\n        self.$element.append($option);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Add class when reached maxTags\n      if (self.options.maxTags === self.itemsArray.length)\n        self.$container.addClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemAdded', { item: item }));\n    },\n\n    /**\n     * Removes the given item. Pass true to dontPushVal to prevent updating the\n     * elements val()\n     */\n    remove: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.objectItems) {\n        if (typeof item === \"object\")\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  self.options.itemValue(item); } )[0];\n        else\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  item; } )[0];\n      }\n\n      if (item) {\n        $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();\n        $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();\n        self.itemsArray.splice($.inArray(item, self.itemsArray), 1);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Remove class when reached maxTags\n      if (self.options.maxTags > self.itemsArray.length)\n        self.$container.removeClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemRemoved',  { item: item }));\n    },\n\n    /**\n     * Removes all items\n     */\n    removeAll: function() {\n      var self = this;\n\n      $('.tag', self.$container).remove();\n      $('option', self.$element).remove();\n\n      while(self.itemsArray.length > 0)\n        self.itemsArray.pop();\n\n      self.pushVal();\n\n      if (self.options.maxTags && !this.isEnabled())\n        this.enable();\n    },\n\n    /**\n     * Refreshes the tags so they match the text/value of their corresponding\n     * item.\n     */\n    refresh: function() {\n      var self = this;\n      $('.tag', self.$container).each(function() {\n        var $tag = $(this),\n            item = $tag.data('item'),\n            itemValue = self.options.itemValue(item),\n            itemText = self.options.itemText(item),\n            tagClass = self.options.tagClass(item);\n\n          // Update tag's class and inner text\n          $tag.attr('class', null);\n          $tag.addClass('tag ' + htmlEncode(tagClass));\n          $tag.contents().filter(function() {\n            return this.nodeType == 3;\n          })[0].nodeValue = htmlEncode(itemText);\n\n          if (self.isSelect) {\n            var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });\n            option.attr('value', itemValue);\n          }\n      });\n    },\n\n    /**\n     * Returns the items added as tags\n     */\n    items: function() {\n      return this.itemsArray;\n    },\n\n    /**\n     * Assembly value by retrieving the value of each item, and set it on the\n     * element.\n     */\n    pushVal: function() {\n      var self = this,\n          val = $.map(self.items(), function(item) {\n            return self.options.itemValue(item).toString();\n          });\n\n      self.$element.val(val, true).trigger('change');\n    },\n\n    /**\n     * Initializes the tags input behaviour on the element\n     */\n    build: function(options) {\n      var self = this;\n\n      self.options = $.extend({}, defaultOptions, options);\n      var typeahead = self.options.typeahead || {};\n\n      // When itemValue is set, freeInput should always be false\n      if (self.objectItems)\n        self.options.freeInput = false;\n\n      makeOptionItemFunction(self.options, 'itemValue');\n      makeOptionItemFunction(self.options, 'itemText');\n      makeOptionItemFunction(self.options, 'tagClass');\n\n      // for backwards compatibility, self.options.source is deprecated\n      if (self.options.source)\n        typeahead.source = self.options.source;\n\n      if (typeahead.source && $.fn.typeahead) {\n        makeOptionFunction(typeahead, 'source');\n\n        self.$input.typeahead({\n          source: function (query, process) {\n            function processItems(items) {\n              var texts = [];\n\n              for (var i = 0; i < items.length; i++) {\n                var text = self.options.itemText(items[i]);\n                map[text] = items[i];\n                texts.push(text);\n              }\n              process(texts);\n            }\n\n            this.map = {};\n            var map = this.map,\n                data = typeahead.source(query);\n\n            if ($.isFunction(data.success)) {\n              // support for Angular promises\n              data.success(processItems);\n            } else {\n              // support for functions and jquery promises\n              $.when(data)\n               .then(processItems);\n            }\n          },\n          updater: function (text) {\n            self.add(this.map[text]);\n          },\n          matcher: function (text) {\n            return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);\n          },\n          sorter: function (texts) {\n            return texts.sort();\n          },\n          highlighter: function (text) {\n            var regex = new RegExp( '(' + this.query + ')', 'gi' );\n            return text.replace( regex, \"<strong>$1</strong>\" );\n          }\n        });\n      }\n\n      self.$container.on('click', $.proxy(function(event) {\n        self.$input.focus();\n      }, self));\n\n      self.$container.on('blur', 'input', $.proxy(function(event) {\n        var $input = $(event.target);\n        self.add($input.val());\n        $input.val('');\n        event.preventDefault();\n      }, self));\n\n      self.$container.on('keydown', 'input', $.proxy(function(event) {\n        var $input = $(event.target),\n            $inputWrapper = self.findInputWrapper();\n\n        switch (event.which) {\n          // BACKSPACE\n          case 8:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var prev = $inputWrapper.prev();\n              if (prev) {\n                self.remove(prev.data('item'));\n              }\n            }\n            break;\n\n          // DELETE\n          case 46:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var next = $inputWrapper.next();\n              if (next) {\n                self.remove(next.data('item'));\n              }\n            }\n            break;\n\n          // LEFT ARROW\n          case 37:\n            // Try to move the input before the previous tag\n            var $prevTag = $inputWrapper.prev();\n            if ($input.val().length === 0 && $prevTag[0]) {\n              $prevTag.before($inputWrapper);\n              $input.focus();\n            }\n            break;\n          // RIGHT ARROW\n          case 39:\n            // Try to move the input after the next tag\n            var $nextTag = $inputWrapper.next();\n            if ($input.val().length === 0 && $nextTag[0]) {\n              $nextTag.after($inputWrapper);\n              $input.focus();\n            }\n            break;\n         default:\n            // When key corresponds one of the confirmKeys, add current input\n            // as a new tag\n            if (self.options.freeInput && $.inArray(event.which, self.options.confirmKeys) >= 0) {\n              self.add($input.val());\n              $input.val('');\n              event.preventDefault();\n            }\n        }\n\n        // Reset internal input's size\n        $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      // Remove icon clicked\n      self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {\n        self.remove($(event.target).closest('.tag').data('item'));\n        // Grafana mod, if tags input used in popover the click event will bubble up and hide popover\n        event.stopPropagation();\n      }, self));\n\n      // Only add existing value as tags when using strings as tags\n      if (self.options.itemValue === defaultOptions.itemValue) {\n        if (self.$element[0].tagName === 'INPUT') {\n            self.add(self.$element.val());\n        } else {\n          $('option', self.$element).each(function() {\n            self.add($(this).attr('value'), true);\n          });\n        }\n      }\n    },\n\n    /**\n     * Removes all tagsinput behaviour and unregsiter all event handlers\n     */\n    destroy: function() {\n      var self = this;\n\n      // Unbind events\n      self.$container.off('keypress', 'input');\n      self.$container.off('click', '[role=remove]');\n\n      self.$container.remove();\n      self.$element.removeData('tagsinput');\n      self.$element.show();\n    },\n\n    /**\n     * Sets focus on the tagsinput\n     */\n    focus: function() {\n      this.$input.focus();\n    },\n\n    /**\n     * Returns the internal input element\n     */\n    input: function() {\n      return this.$input;\n    },\n\n    /**\n     * Returns the element which is wrapped around the internal input. This\n     * is normally the $container, but typeahead.js moves the $input element.\n     */\n    findInputWrapper: function() {\n      var elt = this.$input[0],\n          container = this.$container[0];\n      while(elt && elt.parentNode !== container)\n        elt = elt.parentNode;\n\n      return $(elt);\n    }\n  };\n\n  /**\n   * Register JQuery plugin\n   */\n  $.fn.tagsinput = function(arg1, arg2) {\n    var results = [];\n\n    this.each(function() {\n      var tagsinput = $(this).data('tagsinput');\n\n      // Initialize a new tags input\n      if (!tagsinput) {\n        tagsinput = new TagsInput(this, arg1);\n        $(this).data('tagsinput', tagsinput);\n        results.push(tagsinput);\n\n        if (this.tagName === 'SELECT') {\n          $('option', $(this)).attr('selected', 'selected');\n        }\n\n        // Init tags from $(this).val()\n        $(this).val($(this).val());\n      } else {\n        // Invoke function on existing tags input\n        var retVal = tagsinput[arg1](arg2);\n        if (retVal !== undefined)\n          results.push(retVal);\n      }\n    });\n\n    if ( typeof arg1 == 'string') {\n      // Return the results from the invoked function calls\n      return results.length > 1 ? results : results[0];\n    } else {\n      return results;\n    }\n  };\n\n  $.fn.tagsinput.Constructor = TagsInput;\n\n  /**\n   * Most options support both a string or number as well as a function as\n   * option value. This function makes sure that the option with the given\n   * key in the given options is wrapped in a function\n   */\n  function makeOptionItemFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var propertyName = options[key];\n      options[key] = function(item) { return item[propertyName]; };\n    }\n  }\n  function makeOptionFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var value = options[key];\n      options[key] = function() { return value; };\n    }\n  }\n  /**\n   * HtmlEncodes the given value\n   */\n  var htmlEncodeContainer = $('<div />');\n  function htmlEncode(value) {\n    if (value) {\n      return htmlEncodeContainer.text(value).html();\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * Returns the position of the caret in the given input field\n   * http://flightschool.acylt.com/devnotes/caret-position-woes/\n   */\n  function doGetCaretPosition(oField) {\n    var iCaretPos = 0;\n    if (document.selection) {\n      oField.focus ();\n      var oSel = document.selection.createRange();\n      oSel.moveStart ('character', -oField.value.length);\n      iCaretPos = oSel.text.length;\n    } else if (oField.selectionStart || oField.selectionStart == '0') {\n      iCaretPos = oField.selectionStart;\n    }\n    return (iCaretPos);\n  }\n\n  /**\n   * Initialize tagsinput behaviour on inputs and selects which have\n   * data-role=tagsinput\n   */\n  $(function() {\n    $(\"input[data-role=tagsinput], select[multiple][data-role=tagsinput]\").tagsinput();\n  });\n})(window.jQuery);\n","export const GRID_CELL_HEIGHT = 30;\nexport const GRID_CELL_VMARGIN = 8;\nexport const GRID_COLUMN_COUNT = 24;\nexport const REPEAT_DIR_VERTICAL = 'v';\n\nexport const DEFAULT_PANEL_SPAN = 4;\nexport const DEFAULT_ROW_HEIGHT = 250;\nexport const MIN_PANEL_HEIGHT = GRID_CELL_HEIGHT * 3;\n\nexport const LS_PANEL_COPY_KEY = 'panel-copy';\n\nexport const PANEL_BORDER = 2;\n\nexport const EDIT_PANEL_ID = 23763571993;\n","import React, { FunctionComponent } from 'react';\n\nimport { ColorPickerPopover, ColorPickerProps } from './ColorPickerPopover';\nimport { PopoverContentProps } from '../Tooltip/Tooltip';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\nimport { withTheme } from '../../themes/ThemeContext';\n\nexport interface SeriesColorPickerPopoverProps extends ColorPickerProps, PopoverContentProps {\n  yaxis?: number;\n  onToggleAxis?: () => void;\n}\n\nexport const SeriesColorPickerPopover: FunctionComponent<SeriesColorPickerPopoverProps> = props => {\n  const { yaxis, onToggleAxis, color, ...colorPickerProps } = props;\n  return (\n    <ColorPickerPopover\n      {...colorPickerProps}\n      color={color || '#000000'}\n      customPickers={{\n        yaxis: {\n          name: 'Y-Axis',\n          tabComponent: () => (\n            <Switch\n              key=\"yaxisSwitch\"\n              label=\"Use right y-axis\"\n              className=\"ColorPicker__axisSwitch\"\n              labelClass=\"ColorPicker__axisSwitchLabel\"\n              checked={yaxis === 2}\n              onChange={() => {\n                if (onToggleAxis) {\n                  onToggleAxis();\n                }\n              }}\n            />\n          ),\n        },\n      }}\n    />\n  );\n};\n\ninterface AxisSelectorProps {\n  yaxis: number;\n  onToggleAxis?: () => void;\n}\n\ninterface AxisSelectorState {\n  yaxis: number;\n}\n\nexport class AxisSelector extends React.PureComponent<AxisSelectorProps, AxisSelectorState> {\n  constructor(props: AxisSelectorProps) {\n    super(props);\n    this.state = {\n      yaxis: this.props.yaxis,\n    };\n    this.onToggleAxis = this.onToggleAxis.bind(this);\n  }\n\n  onToggleAxis() {\n    this.setState({\n      yaxis: this.state.yaxis === 2 ? 1 : 2,\n    });\n\n    if (this.props.onToggleAxis) {\n      this.props.onToggleAxis();\n    }\n  }\n\n  render() {\n    const leftButtonClass = this.state.yaxis === 1 ? 'btn-primary' : 'btn-inverse';\n    const rightButtonClass = this.state.yaxis === 2 ? 'btn-primary' : 'btn-inverse';\n\n    return (\n      <div className=\"p-b-1\">\n        <label className=\"small p-r-1\">Y Axis:</label>\n        <button onClick={this.onToggleAxis} className={'btn btn-small ' + leftButtonClass}>\n          Left\n        </button>\n        <button onClick={this.onToggleAxis} className={'btn btn-small ' + rightButtonClass}>\n          Right\n        </button>\n      </div>\n    );\n  }\n}\n\n// This component is to enable SeriecColorPickerPopover usage via series-color-picker-popover directive\nexport const SeriesColorPickerPopoverWithTheme = withTheme(SeriesColorPickerPopover);\n","import { ScopedVars } from './ScopedVars';\n\n/**\n * Callback info for DataLink click events\n */\nexport interface DataLinkClickEvent<T = any> {\n  origin: T;\n  scopedVars: ScopedVars;\n  e?: any; // mouse|react event\n}\n\n/**\n * Link configuration.  The values may contain variables that need to be\n * processed before running\n */\nexport interface DataLink {\n  title: string;\n  targetBlank?: boolean;\n\n  // 3: The URL if others did not set it first\n  url: string;\n\n  // 2: If exists, use this to construct the URL\n  // Not saved in JSON/DTO\n  onBuildUrl?: (event: DataLinkClickEvent) => string;\n\n  // 1: If exists, handle click directly\n  // Not saved in JSON/DTO\n  onClick?: (event: DataLinkClickEvent) => void;\n\n  // At the moment this is used for derived fields for metadata about internal linking.\n  meta?: {\n    datasourceUid?: string;\n  };\n}\n\nexport type LinkTarget = '_blank' | '_self';\n\n/**\n * Processed Link Model.  The values are ready to use\n */\nexport interface LinkModel<T = any> {\n  href: string;\n  title: string;\n  target: LinkTarget;\n  origin: T;\n\n  // When a click callback exists, this is passed the raw mouse|react event\n  onClick?: (e: any) => void;\n}\n\n/**\n * Provides a way to produce links on demand\n *\n * TODO: ScopedVars in in GrafanaUI package!\n */\nexport interface LinkModelSupplier<T extends object> {\n  getLinks(scopedVars?: any): Array<LinkModel<T>>;\n}\n\nexport enum VariableOrigin {\n  Series = 'series',\n  Field = 'field',\n  Fields = 'fields',\n  Value = 'value',\n  BuiltIn = 'built-in',\n  Template = 'template',\n}\n\nexport interface VariableSuggestion {\n  value: string;\n  label: string;\n  documentation?: string;\n  origin: VariableOrigin;\n}\n\nexport enum VariableSuggestionsScope {\n  Values = 'values',\n}\n","import { DataQuery } from '@grafana/data';\n\nexport enum GELQueryType {\n  math = 'math',\n  reduce = 'reduce',\n  resample = 'resample',\n}\n\n/**\n * For now this is a single object to cover all the types.... would likely\n * want to split this up by type as the complexity increases\n */\nexport interface ExpressionQuery extends DataQuery {\n  type: GELQueryType;\n  reducer?: string;\n  expression?: string;\n  rule?: string;\n  downsampler?: string;\n  upsampler?: string;\n}\n","// Libraries\nimport React, { PureComponent, ChangeEvent } from 'react';\n\nimport { InlineFormLabel, LegacyForms } from '@grafana/ui';\nconst { Select, FormField } = LegacyForms;\nimport { SelectableValue, ReducerID, QueryEditorProps } from '@grafana/data';\n\n// Types\nimport { ExpressionQuery, GELQueryType } from './types';\nimport { ExpressionDatasourceApi } from './ExpressionDatasource';\n\ntype Props = QueryEditorProps<ExpressionDatasourceApi, ExpressionQuery>;\n\ninterface State {}\n\nconst gelTypes: Array<SelectableValue<GELQueryType>> = [\n  { value: GELQueryType.math, label: 'Math' },\n  { value: GELQueryType.reduce, label: 'Reduce' },\n  { value: GELQueryType.resample, label: 'Resample' },\n];\n\nconst reducerTypes: Array<SelectableValue<string>> = [\n  { value: ReducerID.min, label: 'Min', description: 'Get the minimum value' },\n  { value: ReducerID.max, label: 'Max', description: 'Get the maximum value' },\n  { value: ReducerID.mean, label: 'Mean', description: 'Get the average value' },\n  { value: ReducerID.sum, label: 'Sum', description: 'Get the sum of all values' },\n  { value: ReducerID.count, label: 'Count', description: 'Get the number of values' },\n];\n\nconst downsamplingTypes: Array<SelectableValue<string>> = [\n  { value: ReducerID.min, label: 'Min', description: 'Fill with the minimum value' },\n  { value: ReducerID.max, label: 'Max', description: 'Fill with the maximum value' },\n  { value: ReducerID.mean, label: 'Mean', description: 'Fill with the average value' },\n  { value: ReducerID.sum, label: 'Sum', description: 'Fill with the sum of all values' },\n];\n\nconst upsamplingTypes: Array<SelectableValue<string>> = [\n  { value: 'pad', label: 'pad', description: 'fill with the last known value' },\n  { value: 'backfilling', label: 'backfilling', description: 'fill with the next known value' },\n  { value: 'fillna', label: 'fillna', description: 'Fill with NaNs' },\n];\n\nexport class ExpressionQueryEditor extends PureComponent<Props, State> {\n  state = {};\n\n  onSelectGELType = (item: SelectableValue<GELQueryType>) => {\n    const { query, onChange } = this.props;\n    const q = {\n      ...query,\n      type: item.value!,\n    };\n\n    if (q.type === GELQueryType.reduce) {\n      if (!q.reducer) {\n        q.reducer = ReducerID.mean;\n      }\n      q.expression = undefined;\n    } else if (q.type === GELQueryType.resample) {\n      if (!q.downsampler) {\n        q.downsampler = ReducerID.mean;\n      }\n      if (!q.upsampler) {\n        q.upsampler = 'fillna';\n      }\n      q.reducer = undefined;\n    } else {\n      q.reducer = undefined;\n    }\n\n    onChange(q);\n  };\n\n  onSelectReducer = (item: SelectableValue<string>) => {\n    const { query, onChange } = this.props;\n    onChange({\n      ...query,\n      reducer: item.value!,\n    });\n  };\n\n  onSelectUpsampler = (item: SelectableValue<string>) => {\n    const { query, onChange } = this.props;\n    onChange({\n      ...query,\n      upsampler: item.value!,\n    });\n  };\n\n  onSelectDownsampler = (item: SelectableValue<string>) => {\n    const { query, onChange } = this.props;\n    onChange({\n      ...query,\n      downsampler: item.value!,\n    });\n  };\n\n  onRuleReducer = (item: SelectableValue<string>) => {\n    const { query, onChange } = this.props;\n    onChange({\n      ...query,\n      rule: item.value!,\n    });\n  };\n\n  onExpressionChange = (evt: ChangeEvent<any>) => {\n    const { query, onChange } = this.props;\n    onChange({\n      ...query,\n      expression: evt.target.value,\n    });\n  };\n\n  onRuleChange = (evt: ChangeEvent<any>) => {\n    const { query, onChange } = this.props;\n    onChange({\n      ...query,\n      rule: evt.target.value,\n    });\n  };\n\n  render() {\n    const { query } = this.props;\n    const selected = gelTypes.find(o => o.value === query.type);\n    const reducer = reducerTypes.find(o => o.value === query.reducer);\n    const downsampler = downsamplingTypes.find(o => o.value === query.downsampler);\n    const upsampler = upsamplingTypes.find(o => o.value === query.upsampler);\n\n    return (\n      <div>\n        <div className=\"form-field\">\n          <Select options={gelTypes} value={selected} onChange={this.onSelectGELType} />\n          {query.type === GELQueryType.reduce && (\n            <>\n              <InlineFormLabel width={5}>Function:</InlineFormLabel>\n              <Select options={reducerTypes} value={reducer} onChange={this.onSelectReducer} />\n              <FormField label=\"Fields:\" labelWidth={5} onChange={this.onExpressionChange} value={query.expression} />\n            </>\n          )}\n        </div>\n        {query.type === GELQueryType.math && (\n          <textarea value={query.expression} onChange={this.onExpressionChange} className=\"gf-form-input\" rows={2} />\n        )}\n        {query.type === GELQueryType.resample && (\n          <>\n            <div>\n              <FormField label=\"Series:\" labelWidth={5} onChange={this.onExpressionChange} value={query.expression} />\n              <FormField label=\"Rule:\" labelWidth={5} onChange={this.onRuleChange} value={query.rule} />\n            </div>\n            <div>\n              <InlineFormLabel width={12}>Downsample Function:</InlineFormLabel>\n              <Select options={downsamplingTypes} value={downsampler} onChange={this.onSelectDownsampler} />\n              <InlineFormLabel width={12}>Upsample Function:</InlineFormLabel>\n              <Select options={upsamplingTypes} value={upsampler} onChange={this.onSelectUpsampler} />\n            </div>\n          </>\n        )}\n      </div>\n    );\n  }\n}\n","import { DataSourceInstanceSettings, DataSourcePluginMeta } from '@grafana/data';\nimport { ExpressionQuery, GELQueryType } from './types';\nimport { ExpressionQueryEditor } from './ExpressionQueryEditor';\nimport { DataSourceWithBackend } from '@grafana/runtime';\n\n/**\n * This is a singleton instance that just pretends to be a DataSource\n */\nexport class ExpressionDatasourceApi extends DataSourceWithBackend<ExpressionQuery> {\n  constructor(instanceSettings: DataSourceInstanceSettings) {\n    super(instanceSettings);\n  }\n\n  getCollapsedText(query: ExpressionQuery) {\n    return `Expression: ${query.type}`;\n  }\n\n  newQuery(): ExpressionQuery {\n    return {\n      refId: '--', // Replaced with query\n      type: GELQueryType.math,\n      datasource: ExpressionDatasourceID,\n    };\n  }\n}\n\n// MATCHES the constant in DataSourceWithBackend\nexport const ExpressionDatasourceID = '__expr__';\n\nexport const expressionDatasource = new ExpressionDatasourceApi({\n  id: -100,\n  name: ExpressionDatasourceID,\n} as DataSourceInstanceSettings);\nexpressionDatasource.meta = {\n  id: ExpressionDatasourceID,\n  info: {\n    logos: {\n      small: 'public/img/icn-datasource.svg',\n      large: 'public/img/icn-datasource.svg',\n    },\n  },\n} as DataSourcePluginMeta;\nexpressionDatasource.components = {\n  QueryEditor: ExpressionQueryEditor,\n};\n","import React from 'react';\nimport { Icon } from '../../../Icon/Icon';\n\n// Ignoring because I couldn't get @types/react-select work wih Torkel's fork\n// @ts-ignore\nimport { components } from '@torkelo/react-select';\nimport { OptionProps } from 'react-select';\n\n// https://github.com/JedWatson/react-select/issues/3038\nexport interface ExtendedOptionProps extends OptionProps<any> {\n  data: {\n    description?: string;\n    imgUrl?: string;\n  };\n}\n\nexport const SelectOption = (props: ExtendedOptionProps) => {\n  const { children, isSelected, data } = props;\n\n  return (\n    <components.Option {...props}>\n      <div className=\"gf-form-select-box__desc-option\">\n        {data.imgUrl && <img className=\"gf-form-select-box__desc-option__img\" src={data.imgUrl} />}\n        <div className=\"gf-form-select-box__desc-option__body\">\n          <div>{children}</div>\n          {data.description && <div className=\"gf-form-select-box__desc-option__desc\">{data.description}</div>}\n        </div>\n        {isSelected && <Icon name=\"check\" aria-hidden=\"true\" />}\n      </div>\n    </components.Option>\n  );\n};\n\nexport default SelectOption;\n","// Libraries\nimport classNames from 'classnames';\nimport React, { PureComponent } from 'react';\n\n// Ignoring because I couldn't get @types/react-select work wih Torkel's fork\n// @ts-ignore\nimport { default as ReactSelect } from '@torkelo/react-select';\n// @ts-ignore\nimport Creatable from '@torkelo/react-select/creatable';\n// @ts-ignore\nimport { CreatableProps } from 'react-select';\n// @ts-ignore\nimport { default as ReactAsyncSelect } from '@torkelo/react-select/async';\n// @ts-ignore\nimport { components } from '@torkelo/react-select';\n\n// Components\nimport { SelectOption } from './SelectOption';\nimport { SelectOptionGroup } from '../../../Select/SelectOptionGroup';\nimport { SingleValue } from '../../../Select/SingleValue';\nimport { SelectCommonProps, SelectAsyncProps } from '../../../Select/types';\nimport IndicatorsContainer from './IndicatorsContainer';\nimport NoOptionsMessage from './NoOptionsMessage';\nimport resetSelectStyles from '../../../Select/resetSelectStyles';\nimport { CustomScrollbar } from '../../../CustomScrollbar/CustomScrollbar';\nimport { PopoverContent } from '../../../Tooltip/Tooltip';\nimport { Tooltip } from '../../../Tooltip/Tooltip';\nimport { SelectableValue } from '@grafana/data';\n\n/**\n * Changes in new selects:\n * - noOptionsMessage & loadingMessage is of string type\n * - isDisabled is renamed to disabled\n */\ntype LegacyCommonProps<T> = Omit<SelectCommonProps<T>, 'noOptionsMessage' | 'disabled' | 'value'>;\n\ninterface AsyncProps<T> extends LegacyCommonProps<T>, Omit<SelectAsyncProps<T>, 'loadingMessage'> {\n  loadingMessage?: () => string;\n  noOptionsMessage?: () => string;\n  tooltipContent?: PopoverContent;\n  isDisabled?: boolean;\n  value?: SelectableValue<T>;\n}\n\ninterface LegacySelectProps<T> extends LegacyCommonProps<T> {\n  tooltipContent?: PopoverContent;\n  noOptionsMessage?: () => string;\n  isDisabled?: boolean;\n  value?: SelectableValue<T>;\n}\n\nexport const MenuList = (props: any) => {\n  return (\n    <components.MenuList {...props}>\n      <CustomScrollbar autoHide={false} autoHeightMax=\"inherit\">\n        {props.children}\n      </CustomScrollbar>\n    </components.MenuList>\n  );\n};\nexport class Select<T> extends PureComponent<LegacySelectProps<T>> {\n  static defaultProps: Partial<LegacySelectProps<any>> = {\n    className: '',\n    isDisabled: false,\n    isSearchable: true,\n    isClearable: false,\n    isMulti: false,\n    openMenuOnFocus: false,\n    autoFocus: false,\n    isLoading: false,\n    backspaceRemovesValue: true,\n    maxMenuHeight: 300,\n    tabSelectsValue: true,\n    allowCustomValue: false,\n    components: {\n      Option: SelectOption,\n      SingleValue,\n      IndicatorsContainer,\n      MenuList,\n      Group: SelectOptionGroup,\n    },\n  };\n\n  render() {\n    const {\n      defaultValue,\n      getOptionLabel,\n      getOptionValue,\n      onChange,\n      options,\n      placeholder,\n      width,\n      value,\n      className,\n      isDisabled,\n      isLoading,\n      isSearchable,\n      isClearable,\n      backspaceRemovesValue,\n      isMulti,\n      autoFocus,\n      openMenuOnFocus,\n      onBlur,\n      maxMenuHeight,\n      noOptionsMessage,\n      isOpen,\n      components,\n      tooltipContent,\n      tabSelectsValue,\n      onCloseMenu,\n      onOpenMenu,\n      allowCustomValue,\n      formatCreateLabel,\n    } = this.props;\n\n    let widthClass = '';\n    if (width) {\n      widthClass = 'width-' + width;\n    }\n\n    let SelectComponent: ReactSelect | Creatable = ReactSelect;\n    const creatableOptions: any = {};\n\n    if (allowCustomValue) {\n      SelectComponent = Creatable;\n      creatableOptions.formatCreateLabel = formatCreateLabel ?? ((input: string) => input);\n    }\n\n    const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className);\n    const selectComponents = { ...Select.defaultProps.components, ...components };\n    return (\n      <WrapInTooltip onCloseMenu={onCloseMenu} onOpenMenu={onOpenMenu} tooltipContent={tooltipContent} isOpen={isOpen}>\n        {(onOpenMenuInternal, onCloseMenuInternal) => {\n          return (\n            <SelectComponent\n              captureMenuScroll={false}\n              classNamePrefix=\"gf-form-select-box\"\n              className={selectClassNames}\n              components={selectComponents}\n              defaultValue={defaultValue}\n              value={value}\n              getOptionLabel={getOptionLabel}\n              getOptionValue={getOptionValue}\n              menuShouldScrollIntoView={false}\n              isSearchable={isSearchable}\n              onChange={onChange}\n              options={options}\n              placeholder={placeholder || 'Choose'}\n              styles={resetSelectStyles()}\n              isDisabled={isDisabled}\n              isLoading={isLoading}\n              isClearable={isClearable}\n              autoFocus={autoFocus}\n              onBlur={onBlur}\n              openMenuOnFocus={openMenuOnFocus}\n              maxMenuHeight={maxMenuHeight}\n              noOptionsMessage={() => noOptionsMessage}\n              isMulti={isMulti}\n              backspaceRemovesValue={backspaceRemovesValue}\n              menuIsOpen={isOpen}\n              onMenuOpen={onOpenMenuInternal}\n              onMenuClose={onCloseMenuInternal}\n              tabSelectsValue={tabSelectsValue}\n              {...creatableOptions}\n            />\n          );\n        }}\n      </WrapInTooltip>\n    );\n  }\n}\n\nexport class AsyncSelect<T> extends PureComponent<AsyncProps<T>> {\n  static defaultProps: Partial<AsyncProps<any>> = {\n    className: '',\n    components: {},\n    loadingMessage: () => 'Loading...',\n    isDisabled: false,\n    isClearable: false,\n    isMulti: false,\n    isSearchable: true,\n    backspaceRemovesValue: true,\n    autoFocus: false,\n    openMenuOnFocus: false,\n    maxMenuHeight: 300,\n  };\n\n  render() {\n    const {\n      defaultValue,\n      getOptionLabel,\n      getOptionValue,\n      onChange,\n      placeholder,\n      width,\n      value,\n      className,\n      loadOptions,\n      defaultOptions,\n      isLoading,\n      loadingMessage,\n      noOptionsMessage,\n      isDisabled,\n      isSearchable,\n      isClearable,\n      backspaceRemovesValue,\n      autoFocus,\n      onBlur,\n      openMenuOnFocus,\n      maxMenuHeight,\n      isMulti,\n      tooltipContent,\n      onCloseMenu,\n      onOpenMenu,\n      isOpen,\n    } = this.props;\n\n    let widthClass = '';\n    if (width) {\n      widthClass = 'width-' + width;\n    }\n\n    const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className);\n\n    return (\n      <WrapInTooltip onCloseMenu={onCloseMenu} onOpenMenu={onOpenMenu} tooltipContent={tooltipContent} isOpen={isOpen}>\n        {(onOpenMenuInternal, onCloseMenuInternal) => {\n          return (\n            <ReactAsyncSelect\n              captureMenuScroll={false}\n              classNamePrefix=\"gf-form-select-box\"\n              className={selectClassNames}\n              components={{\n                Option: SelectOption,\n                SingleValue,\n                IndicatorsContainer,\n                NoOptionsMessage,\n              }}\n              defaultValue={defaultValue}\n              value={value}\n              getOptionLabel={getOptionLabel}\n              getOptionValue={getOptionValue}\n              menuShouldScrollIntoView={false}\n              onChange={onChange}\n              loadOptions={loadOptions}\n              isLoading={isLoading}\n              defaultOptions={defaultOptions}\n              placeholder={placeholder || 'Choose'}\n              styles={resetSelectStyles()}\n              loadingMessage={() => loadingMessage}\n              noOptionsMessage={noOptionsMessage}\n              isDisabled={isDisabled}\n              isSearchable={isSearchable}\n              isClearable={isClearable}\n              autoFocus={autoFocus}\n              onBlur={onBlur}\n              openMenuOnFocus={openMenuOnFocus}\n              maxMenuHeight={maxMenuHeight}\n              isMulti={isMulti}\n              backspaceRemovesValue={backspaceRemovesValue}\n            />\n          );\n        }}\n      </WrapInTooltip>\n    );\n  }\n}\n\nexport interface TooltipWrapperProps {\n  children: (onOpenMenu: () => void, onCloseMenu: () => void) => React.ReactNode;\n  onOpenMenu?: () => void;\n  onCloseMenu?: () => void;\n  isOpen?: boolean;\n  tooltipContent?: PopoverContent;\n}\n\nexport interface TooltipWrapperState {\n  isOpenInternal: boolean;\n}\n\nexport class WrapInTooltip extends PureComponent<TooltipWrapperProps, TooltipWrapperState> {\n  state: TooltipWrapperState = {\n    isOpenInternal: false,\n  };\n\n  onOpenMenu = () => {\n    const { onOpenMenu } = this.props;\n    if (onOpenMenu) {\n      onOpenMenu();\n    }\n    this.setState({ isOpenInternal: true });\n  };\n\n  onCloseMenu = () => {\n    const { onCloseMenu } = this.props;\n    if (onCloseMenu) {\n      onCloseMenu();\n    }\n    this.setState({ isOpenInternal: false });\n  };\n\n  render() {\n    const { children, isOpen, tooltipContent } = this.props;\n    const { isOpenInternal } = this.state;\n\n    let showTooltip: boolean | undefined = undefined;\n\n    if (isOpenInternal || isOpen) {\n      showTooltip = false;\n    }\n\n    if (tooltipContent) {\n      return (\n        <Tooltip show={showTooltip} content={tooltipContent} placement=\"bottom\">\n          <div>\n            {/* div needed for tooltip */}\n            {children(this.onOpenMenu, this.onCloseMenu)}\n          </div>\n        </Tooltip>\n      );\n    } else {\n      return <div>{children(this.onOpenMenu, this.onCloseMenu)}</div>;\n    }\n  }\n}\n\nexport default Select;\n","import React, { PureComponent } from 'react';\nimport { debounce } from 'lodash';\nimport { AsyncSelect } from '@grafana/ui';\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { selectors } from '@grafana/e2e-selectors';\nimport appEvents from '../../app_events';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { DashboardSearchHit } from 'app/features/search/types';\n\nexport interface Props {\n  onChange: ($folder: { title: string; id: number }) => void;\n  enableCreateNew?: boolean;\n  rootName?: string;\n  enableReset?: boolean;\n  dashboardId?: any;\n  initialTitle?: string;\n  initialFolderId?: number;\n  useNewForms?: boolean;\n}\n\ninterface State {\n  folder: SelectableValue<number>;\n}\n\nexport class FolderPicker extends PureComponent<Props, State> {\n  debouncedSearch: any;\n\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      folder: {},\n    };\n\n    this.debouncedSearch = debounce(this.getOptions, 300, {\n      leading: true,\n      trailing: true,\n    });\n  }\n\n  static defaultProps = {\n    rootName: 'General',\n    enableReset: false,\n    initialTitle: '',\n    enableCreateNew: false,\n    useNewForms: false,\n  };\n\n  componentDidMount = async () => {\n    await this.loadInitialValue();\n  };\n\n  getOptions = async (query: string) => {\n    const { rootName, enableReset, initialTitle } = this.props;\n    const params = {\n      query,\n      type: 'dash-folder',\n      permission: 'Edit',\n    };\n\n    // TODO: move search to BackendSrv interface\n    // @ts-ignore\n    const searchHits = (await getBackendSrv().search(params)) as DashboardSearchHit[];\n    const options: Array<SelectableValue<number>> = searchHits.map(hit => ({ label: hit.title, value: hit.id }));\n    if (contextSrv.isEditor && rootName?.toLowerCase().startsWith(query.toLowerCase())) {\n      options.unshift({ label: rootName, value: 0 });\n    }\n\n    if (enableReset && query === '' && initialTitle !== '') {\n      options.unshift({ label: initialTitle, value: undefined });\n    }\n\n    return options;\n  };\n\n  onFolderChange = (newFolder: SelectableValue<number>) => {\n    if (!newFolder) {\n      newFolder = { value: 0, label: this.props.rootName };\n    }\n\n    this.setState(\n      {\n        folder: newFolder,\n      },\n      () => this.props.onChange({ id: newFolder.value!, title: newFolder.label! })\n    );\n  };\n\n  createNewFolder = async (folderName: string) => {\n    // @ts-ignore\n    const newFolder = await getBackendSrv().createFolder({ title: folderName });\n    let folder = { value: -1, label: 'Not created' };\n    if (newFolder.id > -1) {\n      appEvents.emit(AppEvents.alertSuccess, ['Folder Created', 'OK']);\n      folder = { value: newFolder.id, label: newFolder.title };\n      await this.onFolderChange(folder);\n    } else {\n      appEvents.emit(AppEvents.alertError, ['Folder could not be created']);\n    }\n\n    return folder;\n  };\n\n  private loadInitialValue = async () => {\n    const { initialTitle, rootName, initialFolderId, enableReset, dashboardId } = this.props;\n    const resetFolder: SelectableValue<number> = { label: initialTitle, value: undefined };\n    const rootFolder: SelectableValue<number> = { label: rootName, value: 0 };\n\n    const options = await this.getOptions('');\n\n    let folder: SelectableValue<number> = { value: -1 };\n\n    if (initialFolderId !== undefined && initialFolderId !== null && initialFolderId > -1) {\n      folder = options.find(option => option.value === initialFolderId) || { value: -1 };\n    } else if (enableReset && initialTitle) {\n      folder = resetFolder;\n    }\n\n    if (folder.value === -1) {\n      if (contextSrv.isEditor) {\n        folder = rootFolder;\n      } else {\n        // We shouldn't assign a random folder without the user actively choosing it on a persisted dashboard\n        const isPersistedDashBoard = !!dashboardId;\n        if (isPersistedDashBoard) {\n          folder = resetFolder;\n        } else {\n          folder = options.length > 0 ? options[0] : resetFolder;\n        }\n      }\n    }\n\n    this.setState(\n      {\n        folder,\n      },\n      () => {\n        // if this is not the same as our initial value notify parent\n        if (folder.value !== initialFolderId) {\n          this.props.onChange({ id: folder.value!, title: folder.text });\n        }\n      }\n    );\n  };\n\n  render() {\n    const { folder } = this.state;\n    const { enableCreateNew, useNewForms } = this.props;\n\n    return (\n      <div aria-label={selectors.components.FolderPicker.container}>\n        {useNewForms && (\n          <AsyncSelect\n            loadingMessage=\"Loading folders...\"\n            defaultOptions\n            defaultValue={folder}\n            value={folder}\n            allowCustomValue={enableCreateNew}\n            loadOptions={this.debouncedSearch}\n            onChange={this.onFolderChange}\n            onCreateOption={this.createNewFolder}\n            menuPosition=\"fixed\"\n          />\n        )}\n        {!useNewForms && (\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <label className=\"gf-form-label width-7\">Folder</label>\n              <AsyncSelect\n                loadingMessage=\"Loading folders...\"\n                defaultOptions\n                defaultValue={folder}\n                value={folder}\n                className={'width-20'}\n                allowCustomValue={enableCreateNew}\n                loadOptions={this.debouncedSearch}\n                onChange={this.onFolderChange}\n                onCreateOption={this.createNewFolder}\n              />\n            </div>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n","import React from 'react';\nimport { Portal } from '../Portal/Portal';\nimport { cx } from 'emotion';\nimport { withTheme } from '../../themes';\nimport { IconName } from '../../types';\nimport { Themeable } from '../../types';\nimport { getModalStyles } from './getModalStyles';\nimport { ModalHeader } from './ModalHeader';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport interface Props extends Themeable {\n  icon?: IconName;\n  /** Title for the modal or custom header element */\n  title: string | JSX.Element;\n  className?: string;\n\n  isOpen?: boolean;\n  onDismiss?: () => void;\n\n  /** If not set will call onDismiss if that is set. */\n  onClickBackdrop?: () => void;\n}\n\nexport class UnthemedModal extends React.PureComponent<Props> {\n  onDismiss = () => {\n    if (this.props.onDismiss) {\n      this.props.onDismiss();\n    }\n  };\n\n  onClickBackdrop = () => {\n    this.onDismiss();\n  };\n\n  renderDefaultHeader(title: string) {\n    const { icon } = this.props;\n\n    return <ModalHeader icon={icon} title={title} />;\n  }\n\n  render() {\n    const { title, isOpen = false, theme, className } = this.props;\n    const styles = getModalStyles(theme);\n\n    if (!isOpen) {\n      return null;\n    }\n\n    return (\n      <Portal>\n        <div className={cx(styles.modal, className)}>\n          <div className={styles.modalHeader}>\n            {typeof title === 'string' ? this.renderDefaultHeader(title) : title}\n            <div className={styles.modalHeaderClose}>\n              <IconButton surface=\"header\" name=\"times\" size=\"lg\" onClick={this.onDismiss} />\n            </div>\n          </div>\n          <div className={styles.modalContent}>{this.props.children}</div>\n        </div>\n        <div className={styles.modalBackdrop} onClick={this.props.onClickBackdrop || this.onClickBackdrop} />\n      </Portal>\n    );\n  }\n}\n\nexport const Modal = withTheme(UnthemedModal);\n","import _ from 'lodash';\nimport { auto } from 'angular';\n\nexport class QueryCtrl {\n  target: any;\n  datasource: any;\n  panelCtrl: any;\n  panel: any;\n  hasRawMode: boolean;\n  error: string;\n  isLastQuery: boolean;\n\n  constructor(public $scope: any, public $injector: auto.IInjectorService) {\n    this.panel = this.panelCtrl.panel;\n    this.isLastQuery = _.indexOf(this.panel.targets, this.target) === this.panel.targets.length - 1;\n  }\n\n  refresh() {\n    this.panelCtrl.refresh();\n  }\n}\n","import React, { FC, memo } from 'react';\nimport { css } from 'emotion';\nimport { Checkbox, stylesFactory } from '@grafana/ui';\n\ninterface Props {\n  checked?: boolean;\n  onClick: any;\n  editable?: boolean;\n}\n\nexport const SearchCheckbox: FC<Props> = memo(({ onClick, checked = false, editable = false }) => {\n  const styles = getStyles();\n\n  return editable ? (\n    <div onClick={onClick} className={styles.wrapper}>\n      <Checkbox value={checked} />\n    </div>\n  ) : null;\n});\n\nconst getStyles = stylesFactory(() => ({\n  // Vertically align absolutely positioned checkbox element\n  wrapper: css`\n    height: 21px;\n    margin-right: 12px;\n    & > label {\n      height: 100%;\n    }\n  `,\n}));\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Organization, OrganizationState } from 'app/types';\n\nexport const initialState: OrganizationState = {\n  organization: {} as Organization,\n};\n\nconst organizationSlice = createSlice({\n  name: 'organization',\n  initialState,\n  reducers: {\n    organizationLoaded: (state, action: PayloadAction<Organization>): OrganizationState => {\n      return { ...state, organization: action.payload };\n    },\n    setOrganizationName: (state, action: PayloadAction<string>): OrganizationState => {\n      return { ...state, organization: { ...state.organization, name: action.payload } };\n    },\n  },\n});\n\nexport const { setOrganizationName, organizationLoaded } = organizationSlice.actions;\n\nexport const organizationReducer = organizationSlice.reducer;\n\nexport default {\n  organization: organizationReducer,\n};\n","import { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory } from '../../themes';\n\nexport const getModalStyles = stylesFactory((theme: GrafanaTheme) => {\n  const backdropBackground = theme.colors.bg3;\n\n  return {\n    modal: css`\n      position: fixed;\n      z-index: ${theme.zIndex.modal};\n      background: ${theme.colors.bodyBg};\n      box-shadow: 0 0 20px ${theme.colors.dropdownShadow};\n      background-clip: padding-box;\n      outline: none;\n      width: 750px;\n      max-width: 100%;\n      left: 0;\n      right: 0;\n      margin-left: auto;\n      margin-right: auto;\n      top: 10%;\n    `,\n    modalBackdrop: css`\n      position: fixed;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      z-index: ${theme.zIndex.modalBackdrop};\n      background-color: ${backdropBackground};\n      opacity: 0.7;\n    `,\n    modalHeader: css`\n      label: modalHeader;\n      background: ${theme.colors.bg2};\n      border-bottom: 1px solid ${theme.colors.pageHeaderBorder};\n      display: flex;\n      height: 42px;\n    `,\n    modalHeaderTitle: css`\n      font-size: ${theme.typography.size.lg};\n      margin: 0 ${theme.spacing.md};\n      display: flex;\n      align-items: center;\n      line-height: 42px;\n    `,\n    modalHeaderIcon: css`\n      margin-right: ${theme.spacing.md};\n      font-size: inherit;\n      &:before {\n        vertical-align: baseline;\n      }\n    `,\n    modalHeaderClose: css`\n      height: 100%;\n      display: flex;\n      align-items: center;\n      flex-grow: 1;\n      justify-content: flex-end;\n      padding-right: ${theme.spacing.sm};\n    `,\n    modalContent: css`\n      padding: calc(${theme.spacing.d} * 2);\n      overflow: auto;\n      width: 100%;\n      max-height: calc(90vh - ${theme.spacing.d} * 2);\n    `,\n  };\n});\n","const antlr4 = require('antlr4');\nconst ScrollQLLexer = require('./ScrollQLLexer').ScrollQLLexer;\nconst ScrollQLParser = require('./ScrollQLParser').ScrollQLParser;\nconst ScrollQLParserListener = require('./ScrollQLParserListener').ScrollQLParserListener;\n\nclass GroupListener extends ScrollQLParserListener {\n  groupNames: string[] = [];\n\n  enterLogStats(ctx: any) {\n    this.groupNames = [];\n    if (ctx.groups && ctx.groups.length > 0) {\n      const groups = ctx.groups;\n\n      groups.forEach((group: any) => {\n        // This code is for handling the case where a field specifier is aliased, with the alias available via\n        // the proj property. Otherwise we can just take the group text as it is.\n        const proj = group.fieldSpec?.().proj;\n        if (proj) {\n          this.groupNames.push(proj.getText());\n        } else {\n          this.groupNames.push(group.getText());\n        }\n      });\n    }\n  }\n}\n\nexport function getStatsGroups(text: string): string[] {\n  // Dummy prefix needed here for parser to function correctly\n  const dummyPrefix = 'source test start=0 end=1|';\n  const queryText = dummyPrefix + text;\n  const chars = new antlr4.InputStream(queryText);\n  const lexer = new ScrollQLLexer(chars);\n  const tokens = new antlr4.CommonTokenStream(lexer);\n  const parser = new ScrollQLParser(tokens);\n  parser.buildParseTrees = true;\n  const tree = parser.query();\n  const groupListener = new GroupListener();\n  antlr4.tree.ParseTreeWalker.DEFAULT.walk(groupListener, tree);\n  return groupListener.groupNames;\n}\n","// Libraries\nimport React, { ReactNode } from 'react';\nimport intersectionBy from 'lodash/intersectionBy';\nimport debounce from 'lodash/debounce';\nimport unionBy from 'lodash/unionBy';\n\nimport {\n  QueryField,\n  SlatePrism,\n  LegacyForms,\n  TypeaheadInput,\n  TypeaheadOutput,\n  BracesPlugin,\n  Select,\n  MultiSelect,\n} from '@grafana/ui';\nimport Plain from 'slate-plain-serializer';\n\n// Utils & Services\n// dom also includes Element polyfills\nimport { Plugin, Node, Editor, Value } from 'slate';\nimport syntax from '../syntax';\n\n// Types\nimport { ExploreQueryFieldProps, AbsoluteTimeRange, SelectableValue, ExploreMode, AppEvents } from '@grafana/data';\nimport { CloudWatchQuery, CloudWatchLogsQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport Prism, { Grammar } from 'prismjs';\nimport { CloudWatchLanguageProvider } from '../language_provider';\nimport { css } from 'emotion';\nimport { ExploreId } from 'app/types';\nimport { dispatch } from 'app/store/store';\nimport { changeModeAction } from 'app/features/explore/state/actionTypes';\nimport { appEvents } from 'app/core/core';\nimport { InputActionMeta } from '@grafana/ui/src/components/Select/types';\nimport { getStatsGroups } from '../utils/query/getStatsGroups';\n\nexport interface CloudWatchLogsQueryFieldProps extends ExploreQueryFieldProps<CloudWatchDatasource, CloudWatchQuery> {\n  absoluteRange: AbsoluteTimeRange;\n  onLabelsRefresh?: () => void;\n  ExtraFieldElement?: ReactNode;\n  syntaxLoaded: boolean;\n  syntax: Grammar;\n  exploreId: ExploreId;\n}\n\nconst containerClass = css`\n  flex-grow: 1;\n  min-height: 35px;\n`;\n\nconst rowGap = css`\n  gap: 3px;\n`;\n\ninterface State {\n  selectedLogGroups: Array<SelectableValue<string>>;\n  availableLogGroups: Array<SelectableValue<string>>;\n  loadingLogGroups: boolean;\n  regions: Array<SelectableValue<string>>;\n  selectedRegion: SelectableValue<string>;\n  invalidLogGroups: boolean;\n  hint:\n    | {\n        message: string;\n        fix: {\n          label: string;\n          action: () => void;\n        };\n      }\n    | undefined;\n}\n\nexport class CloudWatchLogsQueryField extends React.PureComponent<CloudWatchLogsQueryFieldProps, State> {\n  state: State = {\n    selectedLogGroups:\n      (this.props.query as CloudWatchLogsQuery).logGroupNames?.map(logGroup => ({\n        value: logGroup,\n        label: logGroup,\n      })) ?? [],\n    availableLogGroups: [],\n    regions: [],\n    invalidLogGroups: false,\n    selectedRegion: (this.props.query as CloudWatchLogsQuery).region\n      ? {\n          label: (this.props.query as CloudWatchLogsQuery).region,\n          value: (this.props.query as CloudWatchLogsQuery).region,\n          text: (this.props.query as CloudWatchLogsQuery).region,\n        }\n      : { label: 'default', value: 'default', text: 'default' },\n    loadingLogGroups: false,\n    hint: undefined,\n  };\n\n  plugins: Plugin[];\n\n  constructor(props: CloudWatchLogsQueryFieldProps, context: React.Context<any>) {\n    super(props, context);\n\n    Prism.languages['cloudwatch'] = syntax;\n    this.plugins = [\n      BracesPlugin(),\n      SlatePrism({\n        onlyIn: (node: Node) => node.object === 'block' && node.type === 'code_block',\n        getSyntax: (node: Node) => 'cloudwatch',\n      }),\n    ];\n  }\n\n  fetchLogGroupOptions = async (region: string, logGroupNamePrefix?: string) => {\n    try {\n      const logGroups: string[] = await this.props.datasource.describeLogGroups({\n        refId: this.props.query.refId,\n        region,\n        logGroupNamePrefix,\n      });\n\n      return logGroups.map(logGroup => ({\n        value: logGroup,\n        label: logGroup,\n      }));\n    } catch (err) {\n      appEvents.emit(AppEvents.alertError, [err]);\n      return [];\n    }\n  };\n\n  onLogGroupSearch = (searchTerm: string, region: string, actionMeta: InputActionMeta) => {\n    if (actionMeta.action !== 'input-change') {\n      return Promise.resolve();\n    }\n\n    this.setState({\n      loadingLogGroups: true,\n    });\n\n    return this.fetchLogGroupOptions(region, searchTerm)\n      .then(matchingLogGroups => {\n        this.setState(state => ({\n          availableLogGroups: unionBy(state.availableLogGroups, matchingLogGroups, 'value'),\n        }));\n      })\n      .finally(() => {\n        this.setState({\n          loadingLogGroups: false,\n        });\n      });\n  };\n\n  onLogGroupSearchDebounced = debounce(this.onLogGroupSearch, 300);\n\n  componentWillMount = () => {\n    const { datasource, query, onChange } = this.props;\n\n    this.setState({\n      loadingLogGroups: true,\n    });\n\n    this.fetchLogGroupOptions(query.region).then(logGroups => {\n      this.setState(state => {\n        const selectedLogGroups = intersectionBy(state.selectedLogGroups, logGroups, 'value');\n        if (onChange) {\n          const nextQuery = {\n            ...query,\n            logGroupNames: selectedLogGroups.map(group => group.value!),\n          };\n\n          onChange(nextQuery);\n        }\n\n        return {\n          loadingLogGroups: false,\n          availableLogGroups: logGroups,\n          selectedLogGroups,\n        };\n      });\n    });\n\n    datasource.getRegions().then(regions => {\n      this.setState({\n        regions,\n      });\n    });\n  };\n\n  onChangeQuery = (value: string) => {\n    // Send text change to parent\n    const { query, onChange } = this.props;\n    const { selectedLogGroups, selectedRegion } = this.state;\n\n    if (onChange) {\n      const nextQuery = {\n        ...query,\n        expression: value,\n        logGroupNames: selectedLogGroups?.map(logGroupName => logGroupName.value!) ?? [],\n        region: selectedRegion.value ?? 'default',\n        statsGroups: getStatsGroups(value),\n      };\n      onChange(nextQuery);\n    }\n  };\n\n  setSelectedLogGroups = (v: Array<SelectableValue<string>>) => {\n    this.setState({\n      selectedLogGroups: v,\n    });\n\n    const { onChange, query } = this.props;\n\n    if (onChange) {\n      const nextQuery = {\n        ...query,\n        logGroupNames: v.map(logGroupName => logGroupName.value!) ?? [],\n      };\n\n      onChange(nextQuery);\n    }\n  };\n\n  setSelectedRegion = async (v: SelectableValue<string>) => {\n    this.setState({\n      selectedRegion: v,\n      loadingLogGroups: true,\n    });\n\n    const logGroups = await this.fetchLogGroupOptions(v.value!);\n\n    this.setState(state => {\n      const selectedLogGroups = intersectionBy(state.selectedLogGroups, logGroups, 'value');\n\n      const { onChange, query } = this.props;\n      if (onChange) {\n        const nextQuery = {\n          ...query,\n          region: v.value ?? 'default',\n          logGroupNames: selectedLogGroups.map(group => group.value!),\n        };\n\n        onChange(nextQuery);\n      }\n      return {\n        availableLogGroups: logGroups,\n        selectedLogGroups: selectedLogGroups,\n        loadingLogGroups: false,\n      };\n    });\n  };\n\n  onTypeahead = async (typeahead: TypeaheadInput): Promise<TypeaheadOutput> => {\n    const { datasource } = this.props;\n    const { selectedLogGroups } = this.state;\n\n    if (!datasource.languageProvider) {\n      return { suggestions: [] };\n    }\n\n    const cloudwatchLanguageProvider = datasource.languageProvider as CloudWatchLanguageProvider;\n    const { history, absoluteRange } = this.props;\n    const { prefix, text, value, wrapperClasses, labelKey, editor } = typeahead;\n\n    return await cloudwatchLanguageProvider.provideCompletionItems(\n      { text, value, prefix, wrapperClasses, labelKey, editor },\n      { history, absoluteRange, logGroupNames: selectedLogGroups.map(logGroup => logGroup.value!) }\n    );\n  };\n\n  switchToMetrics = () => {\n    const { query, onChange, exploreId } = this.props;\n\n    if (onChange) {\n      const nextQuery: CloudWatchLogsQuery = {\n        ...(query as CloudWatchLogsQuery),\n        apiMode: 'Logs',\n      };\n      onChange(nextQuery);\n    }\n\n    dispatch(changeModeAction({ exploreId, mode: ExploreMode.Metrics }));\n  };\n\n  onQueryFieldClick = (_event: Event, _editor: Editor, next: () => any) => {\n    const { selectedLogGroups, loadingLogGroups } = this.state;\n\n    const queryFieldDisabled = loadingLogGroups || selectedLogGroups.length === 0;\n\n    if (queryFieldDisabled) {\n      this.setState({\n        invalidLogGroups: true,\n      });\n    }\n\n    next();\n  };\n\n  onOpenLogGroupMenu = () => {\n    this.setState({\n      invalidLogGroups: false,\n    });\n  };\n\n  /**\n   * Check if query is stats query in logs mode and shows a hint to switch to metrics mode. Needs to be done\n   * on update of the rich Value because standard onChange is not called on load for example.\n   */\n  checkForStatsQuery = debounce((value: Value) => {\n    const { datasource } = this.props;\n    // TEMP: Remove when logs/metrics unification is complete\n    if (datasource.languageProvider && this.props.exploreMode === ExploreMode.Logs) {\n      const cloudwatchLanguageProvider = datasource.languageProvider as CloudWatchLanguageProvider;\n      const queryUsesStatsCommand = cloudwatchLanguageProvider.isStatsQuery(Plain.serialize(value));\n      if (queryUsesStatsCommand) {\n        this.setState({\n          hint: {\n            message: 'You are trying to run a stats query in Logs mode. ',\n            fix: {\n              label: 'Switch to Metrics mode.',\n              action: this.switchToMetrics,\n            },\n          },\n        });\n      } else {\n        this.setState({\n          hint: undefined,\n        });\n      }\n    }\n  }, 250);\n\n  render() {\n    const { ExtraFieldElement, data, query, syntaxLoaded, datasource } = this.props;\n    const {\n      selectedLogGroups,\n      availableLogGroups,\n      regions,\n      selectedRegion,\n      loadingLogGroups,\n      hint,\n      invalidLogGroups,\n    } = this.state;\n\n    const showError = data && data.error && data.error.refId === query.refId;\n    const cleanText = datasource.languageProvider ? datasource.languageProvider.cleanText : undefined;\n\n    const MAX_LOG_GROUPS = 20;\n\n    return (\n      <>\n        <div className={`gf-form gf-form--grow flex-grow-1 ${rowGap}`}>\n          <LegacyForms.FormField\n            label=\"Region\"\n            labelWidth={4}\n            inputEl={\n              <Select\n                options={regions}\n                value={selectedRegion}\n                onChange={v => this.setSelectedRegion(v)}\n                width={18}\n                placeholder=\"Choose Region\"\n                menuPlacement=\"bottom\"\n                maxMenuHeight={500}\n              />\n            }\n          />\n\n          <LegacyForms.FormField\n            label=\"Log Groups\"\n            labelWidth={6}\n            className=\"flex-grow-1\"\n            inputEl={\n              <MultiSelect\n                options={availableLogGroups}\n                value={selectedLogGroups}\n                onChange={v => {\n                  this.setSelectedLogGroups(v);\n                }}\n                className={containerClass}\n                closeMenuOnSelect={false}\n                isClearable={true}\n                invalid={invalidLogGroups}\n                isOptionDisabled={() => selectedLogGroups.length >= MAX_LOG_GROUPS}\n                placeholder=\"Choose Log Groups\"\n                maxVisibleValues={4}\n                menuPlacement=\"bottom\"\n                noOptionsMessage=\"No log groups available\"\n                isLoading={loadingLogGroups}\n                onOpenMenu={this.onOpenLogGroupMenu}\n                onInputChange={(value, actionMeta) => {\n                  this.onLogGroupSearchDebounced(value, selectedRegion.value ?? 'default', actionMeta);\n                }}\n              />\n            }\n          />\n        </div>\n        <div className=\"gf-form-inline gf-form-inline--nowrap flex-grow-1\">\n          <div className=\"gf-form gf-form--grow flex-shrink-1\">\n            <QueryField\n              additionalPlugins={this.plugins}\n              query={query.expression}\n              onChange={this.onChangeQuery}\n              onBlur={this.props.onBlur}\n              onClick={this.onQueryFieldClick}\n              onRunQuery={this.props.onRunQuery}\n              onTypeahead={this.onTypeahead}\n              cleanText={cleanText}\n              placeholder=\"Enter a CloudWatch Logs Insights query (run with Shift+Enter)\"\n              portalOrigin=\"cloudwatch\"\n              syntaxLoaded={syntaxLoaded}\n              disabled={loadingLogGroups || selectedLogGroups.length === 0}\n              onRichValueChange={this.checkForStatsQuery}\n            />\n          </div>\n          {ExtraFieldElement}\n        </div>\n        {hint && (\n          <div className=\"query-row-break\">\n            <div className=\"text-warning\">\n              {hint.message}\n              <a className=\"text-link muted\" onClick={hint.fix.action}>\n                {hint.fix.label}\n              </a>\n            </div>\n          </div>\n        )}\n        {showError ? (\n          <div className=\"query-row-break\">\n            <div className=\"prom-query-field-info text-error\">{data?.error?.message}</div>\n          </div>\n        ) : null}\n      </>\n    );\n  }\n}\n","import { useState, useEffect } from 'react';\nimport Prism, { Grammar } from 'prismjs';\nimport { AbsoluteTimeRange } from '@grafana/data';\nimport { useRefMounted } from 'app/core/hooks/useRefMounted';\nimport { CloudWatchLanguageProvider } from './language_provider';\n\nconst PRISM_SYNTAX = 'cloudwatch';\n\n/**\n * Initialise the language provider. Returns a languageProviderInitialized boolean cause there does not seem other way\n * to know if the provider is already initialised or not. By the initialisation it modifies the provided\n * languageProvider directly.\n */\nconst useInitLanguageProvider = (languageProvider: CloudWatchLanguageProvider, absoluteRange: AbsoluteTimeRange) => {\n  const mounted = useRefMounted();\n\n  const [languageProviderInitialized, setLanguageProviderInitialized] = useState(false);\n\n  // Async\n  const initializeLanguageProvider = async () => {\n    languageProvider.initialRange = absoluteRange;\n    await languageProvider.start();\n    if (mounted.current) {\n      setLanguageProviderInitialized(true);\n    }\n  };\n\n  useEffect(() => {\n    initializeLanguageProvider();\n  }, []);\n\n  return languageProviderInitialized;\n};\n\n/**\n * Returns syntax from languageProvider and initialises global Prism syntax. Waits until languageProvider itself is\n * initialised (outside of this hook).\n */\nconst useCloudwatchSyntax = (languageProvider: CloudWatchLanguageProvider, languageProviderInitialized: boolean) => {\n  // State\n  const [syntax, setSyntax] = useState<Grammar | null>(null);\n\n  // Effects\n  useEffect(() => {\n    if (languageProviderInitialized) {\n      const syntax = languageProvider.getSyntax();\n      Prism.languages[PRISM_SYNTAX] = syntax;\n      setSyntax(syntax);\n    }\n  }, [languageProviderInitialized, languageProvider]);\n\n  return {\n    isSyntaxReady: !!syntax,\n    syntax,\n  };\n};\n\n/**\n * Initializes given language provider, exposes Loki syntax and enables loading label option values\n */\nexport const useCloudWatchSyntax = (languageProvider: CloudWatchLanguageProvider, absoluteRange: AbsoluteTimeRange) => {\n  const languageProviderInitialized = useInitLanguageProvider(languageProvider, absoluteRange);\n  const { isSyntaxReady, syntax } = useCloudwatchSyntax(languageProvider, languageProviderInitialized);\n\n  return {\n    isSyntaxReady,\n    syntax,\n  };\n};\n","import _ from 'lodash';\nimport React, { Component } from 'react';\n\nimport { CloudWatchLogsQuery } from '../types';\nimport { PanelData } from '@grafana/data';\nimport { encodeUrl, AwsUrl } from '../aws_url';\nimport { CloudWatchDatasource } from '../datasource';\n\ninterface Props {\n  query: CloudWatchLogsQuery;\n  panelData: PanelData;\n  datasource: CloudWatchDatasource;\n}\n\ninterface State {\n  href: string;\n}\n\nexport default class CloudWatchLink extends Component<Props, State> {\n  state: State = { href: '' };\n  async componentDidUpdate(prevProps: Props) {\n    if (prevProps.panelData !== this.props.panelData && this.props.panelData.request) {\n      const href = this.getExternalLink();\n      this.setState({ href });\n    }\n  }\n\n  getExternalLink(): string {\n    const { query, panelData, datasource } = this.props;\n\n    const range = panelData?.request?.range;\n\n    if (!range) {\n      return '';\n    }\n\n    const start = range.from.toISOString();\n    const end = range.to.toISOString();\n\n    const urlProps: AwsUrl = {\n      end,\n      start,\n      timeType: 'ABSOLUTE',\n      tz: 'UTC',\n      editorString: query.expression,\n      isLiveTail: false,\n      source: query.logGroupNames,\n    };\n\n    return encodeUrl(urlProps, datasource.getActualRegion(query.region));\n  }\n\n  render() {\n    const { href } = this.state;\n    return (\n      <a href={href} target=\"_blank\" rel=\"noopener\">\n        <i className=\"fa fa-share-square-o\" /> CloudWatch Logs Insights\n      </a>\n    );\n  }\n}\n","// Libraries\nimport React, { memo } from 'react';\n\n// Types\nimport { AbsoluteTimeRange, QueryEditorProps } from '@grafana/data';\nimport { FormLabel } from '@grafana/ui/src/components/FormLabel/FormLabel';\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchLogsQuery, CloudWatchQuery } from '../types';\nimport { CloudWatchLogsQueryField } from './LogsQueryField';\nimport { useCloudWatchSyntax } from '../useCloudwatchSyntax';\nimport { CloudWatchLanguageProvider } from '../language_provider';\nimport CloudWatchLink from './CloudWatchLink';\nimport { css } from 'emotion';\n\ntype Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery>;\n\nconst labelClass = css`\n  margin-left: 3px;\n  flex-grow: 0;\n`;\n\nexport const CloudWatchLogsQueryEditor = memo(function CloudWatchLogsQueryEditor(props: Props) {\n  const { query, data, datasource, onRunQuery, onChange, exploreId, exploreMode } = props;\n\n  let absolute: AbsoluteTimeRange;\n  if (data?.request?.range?.from) {\n    const { range } = data.request;\n    absolute = {\n      from: range.from.valueOf(),\n      to: range.to.valueOf(),\n    };\n  } else {\n    absolute = {\n      from: Date.now() - 10000,\n      to: Date.now(),\n    };\n  }\n\n  const { isSyntaxReady, syntax } = useCloudWatchSyntax(\n    datasource.languageProvider as CloudWatchLanguageProvider,\n    absolute\n  );\n\n  return (\n    <CloudWatchLogsQueryField\n      exploreId={exploreId}\n      exploreMode={exploreMode}\n      datasource={datasource}\n      query={query}\n      onBlur={() => {}}\n      onChange={(val: CloudWatchLogsQuery) => onChange({ ...val, queryMode: 'Logs' })}\n      onRunQuery={onRunQuery}\n      history={[]}\n      data={data}\n      absoluteRange={absolute}\n      syntaxLoaded={isSyntaxReady}\n      syntax={syntax}\n      ExtraFieldElement={\n        <FormLabel className={`gf-form-label--btn ${labelClass}`} width=\"auto\" tooltip=\"Link to Graph in AWS\">\n          <CloudWatchLink query={query as CloudWatchLogsQuery} panelData={data} datasource={datasource} />\n        </FormLabel>\n      }\n    />\n  );\n});\n\nexport default CloudWatchLogsQueryEditor;\n","import React, { FC, useCallback } from 'react';\nimport { css, cx } from 'emotion';\nimport { useLocalStorage } from 'react-use';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, Spinner, stylesFactory, useTheme } from '@grafana/ui';\nimport { DashboardSection, OnToggleChecked } from '../types';\nimport { SearchCheckbox } from './SearchCheckbox';\nimport { getSectionIcon, getSectionStorageKey } from '../utils';\n\ninterface SectionHeaderProps {\n  editable?: boolean;\n  onSectionClick: (section: DashboardSection) => void;\n  onToggleChecked?: OnToggleChecked;\n  section: DashboardSection;\n}\n\nexport const SectionHeader: FC<SectionHeaderProps> = ({\n  section,\n  onSectionClick,\n  onToggleChecked,\n  editable = false,\n}) => {\n  const theme = useTheme();\n  const styles = getSectionHeaderStyles(theme, section.selected, editable);\n  const setSectionExpanded = useLocalStorage(getSectionStorageKey(section.title), true)[1];\n\n  const onSectionExpand = () => {\n    setSectionExpanded(!section.expanded);\n    onSectionClick(section);\n  };\n\n  const onSectionChecked = useCallback(\n    (e: React.MouseEvent) => {\n      e.preventDefault();\n      e.stopPropagation();\n      if (onToggleChecked) {\n        onToggleChecked(section);\n      }\n    },\n    [section]\n  );\n\n  return (\n    <div className={styles.wrapper} onClick={onSectionExpand}>\n      <SearchCheckbox editable={editable} checked={section.checked} onClick={onSectionChecked} />\n\n      <div className={styles.icon}>\n        <Icon name={getSectionIcon(section)} />\n      </div>\n\n      <span className={styles.text}>{section.title}</span>\n      {section.url && (\n        <a href={section.url} className={styles.link}>\n          <Icon name=\"cog\" />\n        </a>\n      )}\n      {section.itemsFetching ? <Spinner /> : <Icon name={section.expanded ? 'angle-down' : 'angle-right'} />}\n    </div>\n  );\n};\n\nconst getSectionHeaderStyles = stylesFactory((theme: GrafanaTheme, selected = false, editable: boolean) => {\n  const { sm } = theme.spacing;\n  return {\n    wrapper: cx(\n      css`\n        display: flex;\n        align-items: center;\n        font-size: ${theme.typography.size.base};\n        padding: 12px;\n        color: ${theme.colors.textWeak};\n\n        &:hover,\n        &.selected {\n          color: ${theme.colors.text};\n        }\n\n        &:hover {\n          a {\n            opacity: 1;\n          }\n        }\n      `,\n      'pointer',\n      { selected }\n    ),\n    icon: css`\n      padding: 0 ${sm} 0 ${editable ? 0 : sm};\n    `,\n    text: css`\n      flex-grow: 1;\n      line-height: 24px;\n    `,\n    link: css`\n      padding: 2px 10px 0;\n      color: ${theme.colors.textWeak};\n      opacity: 0;\n      transition: opacity 150ms ease-in-out;\n    `,\n  };\n});\n","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { FixedSizeList } from 'react-window';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme, Spinner } from '@grafana/ui';\nimport { DashboardSection, OnToggleChecked, SearchLayout } from '../types';\nimport { SEARCH_ITEM_HEIGHT, SEARCH_ITEM_MARGIN } from '../constants';\nimport { SearchItem } from './SearchItem';\nimport { SectionHeader } from './SectionHeader';\n\nexport interface Props {\n  editable?: boolean;\n  loading?: boolean;\n  onTagSelected: (name: string) => any;\n  onToggleChecked?: OnToggleChecked;\n  onToggleSection: (section: DashboardSection) => void;\n  results: DashboardSection[];\n  layout?: string;\n}\n\nexport const SearchResults: FC<Props> = ({\n  editable,\n  loading,\n  onTagSelected,\n  onToggleChecked,\n  onToggleSection,\n  results,\n  layout,\n}) => {\n  const theme = useTheme();\n  const styles = getSectionStyles(theme);\n  const itemProps = { editable, onToggleChecked, onTagSelected };\n  const renderFolders = () => {\n    return (\n      <div className={styles.wrapper}>\n        {results.map(section => {\n          return (\n            <div aria-label=\"Search section\" className={styles.section} key={section.id || section.title}>\n              <SectionHeader onSectionClick={onToggleSection} {...{ onToggleChecked, editable, section }} />\n              <div aria-label=\"Search items\" className={styles.sectionItems}>\n                {section.expanded && section.items.map(item => <SearchItem key={item.id} {...itemProps} item={item} />)}\n              </div>\n            </div>\n          );\n        })}\n      </div>\n    );\n  };\n  const renderDashboards = () => {\n    const items = results[0]?.items;\n    return (\n      <div className={styles.listModeWrapper}>\n        <AutoSizer disableWidth>\n          {({ height }) => (\n            <FixedSizeList\n              aria-label=\"Search items\"\n              className={styles.wrapper}\n              innerElementType=\"ul\"\n              itemSize={SEARCH_ITEM_HEIGHT + SEARCH_ITEM_MARGIN}\n              height={height}\n              itemCount={items.length}\n              width=\"100%\"\n            >\n              {({ index, style }) => {\n                const item = items[index];\n                // The wrapper div is needed as the inner SearchItem has margin-bottom spacing\n                // And without this wrapper there is no room for that margin\n                return (\n                  <div style={style}>\n                    <SearchItem key={item.id} {...itemProps} item={item} />\n                  </div>\n                );\n              }}\n            </FixedSizeList>\n          )}\n        </AutoSizer>\n      </div>\n    );\n  };\n\n  if (loading) {\n    return <Spinner className={styles.spinner} />;\n  } else if (!results || !results.length) {\n    return <div className={styles.noResults}>No dashboards matching your query were found.</div>;\n  }\n\n  return (\n    <div className={styles.resultsContainer}>\n      {layout === SearchLayout.Folders ? renderFolders() : renderDashboards()}\n    </div>\n  );\n};\n\nconst getSectionStyles = stylesFactory((theme: GrafanaTheme) => {\n  const { md } = theme.spacing;\n\n  return {\n    wrapper: css`\n      display: flex;\n      flex-direction: column;\n    `,\n    section: css`\n      display: flex;\n      flex-direction: column;\n      background: ${theme.colors.panelBg};\n      border-bottom: solid 1px ${theme.colors.border2};\n    `,\n    sectionItems: css`\n      margin: 0 24px 0 32px;\n    `,\n    spinner: css`\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      min-height: 100px;\n    `,\n    resultsContainer: css`\n      position: relative;\n      flex-grow: 10;\n      margin-bottom: ${md};\n      background: ${theme.colors.bg1};\n      border: 1px solid ${theme.colors.border1};\n      border-radius: 3px;\n      height: 100%;\n    `,\n    noResults: css`\n      padding: ${md};\n      background: ${theme.colors.bg2};\n      font-style: italic;\n      margin-top: ${theme.spacing.md};\n    `,\n    listModeWrapper: css`\n      position: relative;\n      height: 100%;\n      padding: ${md};\n    `,\n  };\n});\n","import { Labels } from '../types/data';\n\n/**\n * Regexp to extract Prometheus-style labels\n */\nconst labelRegexp = /\\b(\\w+)(!?=~?)\"([^\"\\n]*?)\"/g;\n\n/**\n * Returns a map of label keys to value from an input selector string.\n *\n * Example: `parseLabels('{job=\"foo\", instance=\"bar\"}) // {job: \"foo\", instance: \"bar\"}`\n */\nexport function parseLabels(labels: string): Labels {\n  const labelsByKey: Labels = {};\n  labels.replace(labelRegexp, (_, key, operator, value) => {\n    labelsByKey[key] = value;\n    return '';\n  });\n  return labelsByKey;\n}\n\n/**\n * Returns a map labels that are common to the given label sets.\n */\nexport function findCommonLabels(labelsSets: Labels[]): Labels {\n  return labelsSets.reduce((acc, labels) => {\n    if (!labels) {\n      throw new Error('Need parsed labels to find common labels.');\n    }\n    if (!acc) {\n      // Initial set\n      acc = { ...labels };\n    } else {\n      // Remove incoming labels that are missing or not matching in value\n      Object.keys(labels).forEach(key => {\n        if (acc[key] === undefined || acc[key] !== labels[key]) {\n          delete acc[key];\n        }\n      });\n      // Remove common labels that are missing from incoming label set\n      Object.keys(acc).forEach(key => {\n        if (labels[key] === undefined) {\n          delete acc[key];\n        }\n      });\n    }\n    return acc;\n  }, (undefined as unknown) as Labels);\n}\n\n/**\n * Returns a map of labels that are in `labels`, but not in `commonLabels`.\n */\nexport function findUniqueLabels(labels: Labels | undefined, commonLabels: Labels): Labels {\n  const uncommonLabels: Labels = { ...labels };\n  Object.keys(commonLabels).forEach(key => {\n    delete uncommonLabels[key];\n  });\n  return uncommonLabels;\n}\n\n/**\n * Serializes the given labels to a string.\n */\nexport function formatLabels(labels: Labels, defaultValue = ''): string {\n  if (!labels || Object.keys(labels).length === 0) {\n    return defaultValue;\n  }\n  const labelKeys = Object.keys(labels).sort();\n  const cleanSelector = labelKeys.map(key => `${key}=\"${labels[key]}\"`).join(', ');\n  return ['{', cleanSelector, '}'].join('');\n}\n","import { VariableOption } from 'app/features/templating/types';\n\nexport const alignCurrentWithMulti = (current: VariableOption, value: boolean): VariableOption => {\n  if (!current) {\n    return current;\n  }\n\n  if (value && !Array.isArray(current.value)) {\n    return {\n      ...current,\n      value: convertToMulti(current.value),\n      text: convertToMulti(current.text),\n    };\n  }\n\n  if (!value && Array.isArray(current.value)) {\n    return {\n      ...current,\n      value: convertToSingle(current.value),\n      text: convertToSingle(current.text),\n    };\n  }\n\n  return current;\n};\n\nconst convertToSingle = (value: string | string[]): string => {\n  if (!Array.isArray(value)) {\n    return value;\n  }\n\n  if (value.length > 0) {\n    return value[0];\n  }\n\n  return '';\n};\n\nconst convertToMulti = (value: string | string[]): string[] => {\n  if (Array.isArray(value)) {\n    return value;\n  }\n  return [value];\n};\n","var path = 'public/app/plugins/datasource/mysql/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl has-text-edit-mode=true>\\n\\n  <div ng-if=ctrl.target.rawQuery>\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <code-editor content=ctrl.target.rawSql datasource=ctrl.datasource on-change=ctrl.panelCtrl.refresh() data-mode=sql>\\n        </code-editor>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div ng-if=!ctrl.target.rawQuery>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">FROM</label>\\n        <metric-segment segment=ctrl.tableSegment get-options=ctrl.getTableSegments() on-change=ctrl.tableChanged()></metric-segment>\\n\\n        <label class=\\\"gf-form-label query-keyword width-7\\\">Time column</label>\\n        <metric-segment segment=ctrl.timeColumnSegment get-options=ctrl.getTimeColumnSegments() on-change=ctrl.timeColumnChanged()></metric-segment>\\n\\n        <label class=\\\"gf-form-label query-keyword width-9\\\">\\n          Metric column\\n          <info-popover mode=right-normal>Column to be used as metric name for the value column.</info-popover>\\n        </label>\\n        <metric-segment segment=ctrl.metricColumnSegment get-options=ctrl.getMetricColumnSegments() on-change=ctrl.metricColumnChanged()></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n\\n    </div>\\n\\n    <div class=gf-form-inline ng-repeat=\\\"selectParts in ctrl.selectParts\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">\\n          <span ng-show=\\\"$index === 0\\\">SELECT</span>&nbsp;\\n        </label>\\n      </div>\\n\\n      <div class=gf-form ng-repeat=\\\"part in selectParts\\\">\\n        <sql-part-editor class=\\\"gf-form-label sql-part\\\" part=part handle-event=\\\"ctrl.handleSelectPartEvent(selectParts, part, $event)\\\">\\n        </sql-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=dropdown dropdown-typeahead2=ctrl.selectMenu dropdown-typeahead-on-select=\\\"ctrl.addSelectPart(selectParts, $item, $subItem)\\\" button-template-class=\\\"gf-form-label query-part\\\">\\n        </label>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">WHERE</label>\\n      </div>\\n\\n      <div class=gf-form ng-repeat=\\\"part in ctrl.whereParts\\\">\\n        <sql-part-editor class=\\\"gf-form-label sql-part\\\" part=part handle-event=\\\"ctrl.handleWherePartEvent(ctrl.whereParts, part, $event, $index)\\\">\\n        </sql-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <metric-segment segment=ctrl.whereAdd get-options=ctrl.getWhereOptions() on-change=\\\"ctrl.addWhereAction(part, $index)\\\"></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label query-keyword width-6\\\">\\n          <span>GROUP BY</span>\\n        </label>\\n\\n        <sql-part-editor ng-repeat=\\\"part in ctrl.groupParts\\\" part=part class=\\\"gf-form-label sql-part\\\" handle-event=\\\"ctrl.handleGroupPartEvent(part, $index, $event)\\\">\\n        </sql-part-editor>\\n      </div>\\n\\n      <div class=gf-form>\\n        <metric-segment segment=ctrl.groupAdd get-options=ctrl.getGroupOptions() on-change=\\\"ctrl.addGroupAction(part, $index)\\\"></metric-segment>\\n      </div>\\n\\n      <div class=\\\"gf-form gf-form--grow\\\">\\n        <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n      </div>\\n    </div>\\n\\n  </div>\\n\\n  <div class=gf-form-inline>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword\\\">Format as</label>\\n      <div class=gf-form-select-wrapper>\\n        <select class=\\\"gf-form-input gf-size-auto\\\" ng-model=ctrl.target.format ng-options=\\\"f.value as f.text for f in ctrl.formats\\\" ng-change=ctrl.refresh()></select>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=ctrl.toggleEditorMode() ng-show=\\\"ctrl.panelCtrl.panel.type !== 'table'\\\">\\n        <span ng-show=ctrl.target.rawQuery>Query Builder</span>\\n        <span ng-hide=ctrl.target.rawQuery>Edit SQL</span>\\n      </label>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=\\\"ctrl.showHelp = !ctrl.showHelp\\\">\\n        Show Help\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showHelp style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showHelp style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n    <div class=gf-form ng-show=ctrl.lastQueryMeta>\\n      <label class=\\\"gf-form-label query-keyword pointer\\\" ng-click=\\\"ctrl.showLastQuerySQL = !ctrl.showLastQuerySQL\\\">\\n        Generated SQL\\n        <icon name=\\\"'angle-down'\\\" ng-show=ctrl.showLastQuerySQL style=margin-top:3px></icon>\\n        <icon name=\\\"'angle-right'\\\" ng-hide=ctrl.showLastQuerySQL style=margin-top:3px></icon>\\n      </label>\\n    </div>\\n    <div class=\\\"gf-form gf-form--grow\\\">\\n      <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showLastQuerySQL>\\n    <pre class=gf-form-pre>{{ctrl.lastQueryMeta.sql}}</pre>\\n  </div>\\n\\n  <div class=gf-form ng-show=ctrl.showHelp>\\n    <pre class=\\\"gf-form-pre alert alert-info\\\">Time series:\\n- return column named time or time_sec (in UTC), as a unix time stamp or any sql native date data type. You can use the macros below.\\n- return column(s) with numeric datatype as values\\nOptional:\\n  - return column named <i>metric</i> to represent the series name.\\n  - If multiple value columns are returned the metric column is used as prefix.\\n  - If no column named metric is found the column name of the value column is used as series name\\n\\nResultsets of time series queries need to be sorted by time.\\n\\nTable:\\n- return any set of columns\\n\\nMacros:\\n- $__time(column) -&gt; UNIX_TIMESTAMP(column) as time_sec\\n- $__timeEpoch(column) -&gt; UNIX_TIMESTAMP(column) as time_sec\\n- $__timeFilter(column) -&gt; column BETWEEN FROM_UNIXTIME(1492750877) AND FROM_UNIXTIME(1492750877)\\n- $__unixEpochFilter(column) -&gt;  time_unix_epoch &gt; 1492750877 AND time_unix_epoch &lt; 1492750877\\n- $__unixEpochNanoFilter(column) -&gt;  column &gt;= 1494410783152415214 AND column &lt;= 1494497183142514872\\n- $__timeGroup(column,'5m'[, fillvalue]) -&gt; cast(cast(UNIX_TIMESTAMP(column)/(300) as signed)*300 as signed)\\n     by setting fillvalue grafana will fill in missing values according to the interval\\n     fillvalue can be either a literal value, NULL or previous; previous will fill in the previous seen value or NULL if none has been seen yet\\n- $__timeGroupAlias(column,'5m') -&gt; cast(cast(UNIX_TIMESTAMP(column)/(300) as signed)*300 as signed) AS \\\"time\\\"\\n- $__unixEpochGroup(column,'5m') -&gt; column DIV 300 * 300\\n- $__unixEpochGroupAlias(column,'5m') -&gt; column DIV 300 * 300 AS \\\"time\\\"\\n\\nExample of group by and order by with $__timeGroup:\\nSELECT\\n  $__timeGroupAlias(timestamp_col, '1h'),\\n  sum(value_double) as value\\nFROM yourtable\\nGROUP BY 1\\nORDER BY 1\\n\\nOr build your own conditionals using these macros which just return the values:\\n- $__timeFrom() -&gt; FROM_UNIXTIME(1492750877)\\n- $__timeTo() -&gt;  FROM_UNIXTIME(1492750877)\\n- $__unixEpochFrom() -&gt;  1492750877\\n- $__unixEpochTo() -&gt;  1492750877\\n- $__unixEpochNanoFrom() -&gt;  1494410783152415214\\n- $__unixEpochNanoTo() -&gt;  1494497183142514872\\n    </pre>\\n  </div>\\n\\n  \\n\\n  <div class=gf-form ng-show=ctrl.lastQueryError>\\n    <pre class=\\\"gf-form-pre alert alert-error\\\">{{ctrl.lastQueryError}}</pre>\\n  </div>\\n\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import store from 'app/core/store';\nimport _ from 'lodash';\nimport config from 'app/core/config';\n\nexport class ImpressionSrv {\n  constructor() {}\n\n  addDashboardImpression(dashboardId: number) {\n    const impressionsKey = this.impressionKey();\n    let impressions = [];\n    if (store.exists(impressionsKey)) {\n      impressions = JSON.parse(store.get(impressionsKey));\n      if (!_.isArray(impressions)) {\n        impressions = [];\n      }\n    }\n\n    impressions = impressions.filter(imp => {\n      return dashboardId !== imp;\n    });\n\n    impressions.unshift(dashboardId);\n\n    if (impressions.length > 50) {\n      impressions.pop();\n    }\n    store.set(impressionsKey, JSON.stringify(impressions));\n  }\n\n  getDashboardOpened() {\n    let impressions = store.get(this.impressionKey()) || '[]';\n\n    impressions = JSON.parse(impressions);\n\n    impressions = _.filter(impressions, el => {\n      return _.isNumber(el);\n    });\n\n    return impressions;\n  }\n\n  impressionKey() {\n    return 'dashboard_impressions-' + config.bootData.user.orgId;\n  }\n}\n\nconst impressionSrv = new ImpressionSrv();\nexport default impressionSrv;\n","var path = 'public/app/plugins/panel/singlestat/editor.html';\nvar html = \"<div class=editor-row>\\n\\n  <div class=grafana-info-box ng-if=ctrl.panel.gauge.show>\\n    <h5>Gauge migration</h5>\\n    <p>\\n      This panel is deprecated. Please migrate to the new Gauge panel.\\n\\n      </p><div class=gf-form-button-row>\\n        <button class=\\\"btn btn-primary\\\" ng-click=\\\"ctrl.migrateToPanel('gauge')\\\">\\n          Migrate to Gauge panel\\n        </button>       \\n      </div>\\n\\n      <br/>\\n\\n      <div ng-if=ctrl.panel.sparkline.show>\\n        <b>NOTE:</b> Sparklines are not supported in the gauge panel\\n      </div>\\n\\n      <div ng-if=ctrl.panel.prefix>\\n        <b>NOTE:</b> Prefix is no longer supported but can be done via a custom unit\\n      </div>\\n\\n      <div ng-if=ctrl.panel.postfix>\\n        <b>NOTE:</b> Postfix is no longer supported but can be done via a custom unit\\n      </div>\\n    <p></p>\\n  </div>\\n\\n  <div class=grafana-info-box ng-if=!ctrl.panel.gauge.show>\\n    <h5>Migration</h5>\\n    <p>\\n      This panel is deprecated. Please migrate to the new Stat panel.\\n\\n      </p><div class=gf-form-button-row>\\n        <button class=\\\"btn btn-primary\\\" ng-click=\\\"ctrl.migrateToPanel('stat')\\\">\\n          Migrate to Stat panel\\n        </button>       \\n      </div>\\n      \\n      <br/>\\n\\n      <div ng-if=ctrl.panel.prefix>\\n        <b>NOTE:</b> Prefix is no longer supported but can be done via a custom unit\\n      </div>\\n\\n      <div ng-if=ctrl.panel.postfix>\\n        <b>NOTE:</b> Postfix is no longer supported but can be done via a custom unit\\n      </div>      \\n    <p></p>\\n  </div>\\n\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Value</h5>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form ng-if=\\\"ctrl.fieldNames.length > 1\\\">\\n        <label class=\\\"gf-form-label width-6\\\">Field</label>\\n        <div class=\\\"gf-form-select-wrapper width-12\\\">\\n          <select class=gf-form-input ng-model=ctrl.panel.tableColumn ng-options=\\\"f for f in ctrl.fieldNames\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Show</label>\\n        <div class=\\\"gf-form-select-wrapper width-12\\\">\\n          <select class=gf-form-input ng-model=ctrl.panel.valueName ng-options=\\\"f.value as f.text for f in ctrl.valueNameOptions\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Font size</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=ctrl.panel.valueFontSize ng-options=\\\"f for f in ctrl.fontSizes\\\" ng-change=ctrl.render()></select>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Prefix</label>\\n        <input type=text class=\\\"gf-form-input width-12\\\" ng-model=ctrl.panel.prefix ng-change=ctrl.render() ng-model-onblur>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Font size</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=ctrl.panel.prefixFontSize ng-options=\\\"f for f in ctrl.fontSizes\\\" ng-change=ctrl.render() ng-disabled=!ctrl.canModifyText()></select>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Postfix</label>\\n        <input type=text class=\\\"gf-form-input width-12\\\" ng-model=ctrl.panel.postfix ng-change=ctrl.render() ng-model-onblur>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-6\\\">Font size</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=\\\"input-small gf-form-input\\\" ng-model=ctrl.panel.postfixFontSize ng-options=\\\"f for f in ctrl.fontSizes\\\" ng-change=ctrl.render() ng-disabled=!ctrl.canModifyText()></select>\\n        </div>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-6\\\">Unit</label>\\n      <unit-picker onchange=ctrl.setUnitFormat() value=ctrl.panel.format width=18 />\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-6\\\">Decimals</label>\\n      <input type=number class=\\\"gf-form-input width-18\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Override automatic decimal precision for legend and tooltips'\\\" ng-model=ctrl.panel.decimals ng-change=ctrl.refresh() ng-model-onblur>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Coloring</h5>\\n    <div class=gf-form-inline>\\n      <gf-form-switch class=gf-form label-class=width-8 label=Background checked=ctrl.panel.colorBackground on-change=ctrl.render()></gf-form-switch>\\n      <gf-form-switch class=gf-form label-class=width-6 label=Value checked=ctrl.panel.colorValue on-change=ctrl.render()></gf-form-switch>\\n    </div>\\n    <div class=gf-form-inline>\\n      <gf-form-switch class=gf-form label-class=width-8 label=Prefix checked=ctrl.panel.colorPrefix on-change=ctrl.render() ng-disabled=!ctrl.canModifyText()></gf-form-switch>\\n      <gf-form-switch class=gf-form label-class=width-6 label=Postfix checked=ctrl.panel.colorPostfix on-change=ctrl.render() ng-disabled=!ctrl.canModifyText()></gf-form-switch>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=\\\"gf-form max-width-21\\\">\\n        <label class=\\\"gf-form-label width-8\\\">Thresholds\\n          <tip>Define two threshold values&lt;br /&gt; 50,80 will produce: value &lt; 50 = Green, 50 &lt;= value &lt; 80 = Yellow, value &gt;= 80 = Red</tip>\\n        </label>\\n        <input type=text class=gf-form-input ng-model=ctrl.panel.thresholds ng-blur=ctrl.render() placeholder=50,80>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Colors</label>\\n      <span class=gf-form-label ng-repeat=\\\"color in ctrl.panel.colors track by $index\\\">\\n        <color-picker color=color onchange=ctrl.onColorChange($index)></color-picker>\\n      </span>\\n      <span class=gf-form-label>\\n        <a ng-click=ctrl.invertColorOrder()>\\n          Invert\\n        </a>\\n      </span>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Spark lines</h5>\\n    <gf-form-switch class=gf-form label-class=width-9 label=Show checked=ctrl.panel.sparkline.show on-change=ctrl.refresh()></gf-form-switch>\\n    <div ng-if=ctrl.panel.sparkline.show>\\n      <gf-form-switch class=gf-form label-class=width-9 label=\\\"Full height\\\" checked=ctrl.panel.sparkline.full on-change=ctrl.render()></gf-form-switch>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Y-Min</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right ng-model=ctrl.panel.sparkline.ymin ng-change=ctrl.render() ng-model-onblur empty-to-null>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Y-Max</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right ng-model=ctrl.panel.sparkline.ymax ng-change=ctrl.render() ng-model-onblur empty-to-null>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Line Color</label>\\n        <span class=gf-form-label>\\n          <color-picker color=ctrl.panel.sparkline.lineColor onchange=ctrl.onSparklineColorChange></color-picker>\\n        </span>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Fill Color</label>\\n        <span class=gf-form-label>\\n          <color-picker color=ctrl.panel.sparkline.fillColor onchange=ctrl.onSparklineFillChange></color-picker>\\n        </span>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\" ng-if=ctrl.panel.gauge.show>\\n    <h5 class=section-heading>Gauge</h5>\\n    <gf-form-switch class=gf-form label-class=width-10 switch-class=max-width-6 label=Show checked=ctrl.panel.gauge.show on-change=ctrl.render()></gf-form-switch>\\n    <div ng-if=ctrl.panel.gauge.show>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-10\\\">Min</label>\\n        <input type=number class=\\\"gf-form-input width-6\\\" placeholder=0 data-placement=right ng-model=ctrl.panel.gauge.minValue ng-change=ctrl.refresh() ng-model-onblur>\\n        <label class=\\\"gf-form-label alert-state-critical\\\" ng-show=ctrl.invalidGaugeRange>\\n          &nbsp; <icon name=\\\"'exclamation-triangle'\\\"></icon>\\n          Min value is bigger than max.\\n        </label>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-10\\\">Max</label>\\n        <input type=number class=\\\"gf-form-input width-6\\\" placeholder=0 data-placement=right ng-model=ctrl.panel.gauge.maxValue ng-change=ctrl.refresh() ng-model-onblur>\\n      </div>\\n      <gf-form-switch class=gf-form label-class=width-10 switch-class=max-width-6 label=\\\"Threshold labels\\\" checked=ctrl.panel.gauge.thresholdLabels on-change=ctrl.render()></gf-form-switch>\\n      <gf-form-switch class=gf-form label-class=width-10 switch-class=max-width-6 label=\\\"Threshold markers\\\" checked=ctrl.panel.gauge.thresholdMarkers on-change=ctrl.render()></gf-form-switch>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/datasource/cloudwatch/partials/query.parameter.html';\nvar html = \"<div class=gf-form-inline>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-8\\\">Region</label>\\n    <metric-segment segment=regionSegment get-options=getRegions() on-change=regionChanged()></metric-segment>\\n  </div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\">\\n    <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-inline ng-if=\\\"target.expression.length === 0\\\">\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-8\\\">Metric</label>\\n\\n    <metric-segment segment=namespaceSegment get-options=getNamespaces() on-change=namespaceChanged()>\\n    </metric-segment>\\n    <metric-segment segment=metricSegment get-options=getMetrics() on-change=metricChanged()></metric-segment>\\n  </div>\\n\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword\\\">Stats</label>\\n  </div>\\n\\n  <div class=gf-form ng-repeat=\\\"segment in statSegments\\\">\\n    <metric-segment segment=segment get-options=\\\"getStatSegments(segment, $index)\\\" on-change=\\\"statSegmentChanged(segment, $index)\\\"></metric-segment>\\n  </div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\">\\n    <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-inline ng-if=\\\"target.expression.length === 0\\\">\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-8\\\">Dimensions</label>\\n    <metric-segment ng-repeat=\\\"segment in dimSegments\\\" segment=segment get-options=\\\"getDimSegments(segment, $index)\\\" on-change=\\\"dimSegmentChanged(segment, $index)\\\"></metric-segment>\\n  </div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\">\\n    <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n  </div>\\n</div>\\n\\n<div class=gf-form-inline ng-if=\\\"target.statistics.length === 1\\\">\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-8\\\">\\n      Id\\n      <info-popover mode=\\\"right-normal \\\">Id can include numbers, letters, and underscore, and must start with a\\n        lowercase letter.</info-popover>\\n    </label>\\n    <input type=\\\"text \\\" class=gf-form-input ng-model=\\\"target.id \\\" spellcheck=false ng-pattern=/^[a-z][a-zA-Z0-9_]*$/ ng-model-onblur ng-change=\\\"onChange() \\\"/>\\n  </div>\\n  <div class=\\\"gf-form max-width-30\\\">\\n    <label class=\\\"gf-form-label query-keyword width-7\\\">Expression</label>\\n    <input type=\\\"text \\\" class=gf-form-input ng-model=\\\"target.expression\\n \\\" spellcheck=false ng-model-onblur ng-change=\\\"onChange() \\\"/>\\n  </div>\\n</div>\\n\\n<div class=gf-form-inline>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label query-keyword width-8\\\">\\n      Min period\\n      <info-popover mode=\\\"right-normal \\\">Minimum interval between points in seconds</info-popover>\\n    </label>\\n    <input type=\\\"text \\\" class=gf-form-input ng-model=\\\"target.period \\\" spellcheck=false placeholder=\\\"auto\\n \\\" ng-model-onblur ng-change=\\\"onChange() \\\"/>\\n  </div>\\n  <div class=\\\"gf-form max-width-30\\\">\\n    <label class=\\\"gf-form-label query-keyword width-7\\\">Alias</label>\\n    <input type=\\\"text \\\" class=gf-form-input ng-model=\\\"target.alias \\\" spellcheck=false ng-model-onblur ng-change=\\\"onChange() \\\"/>\\n    <info-popover mode=\\\"right-absolute \\\">\\n      Alias replacement variables:\\n      <ul ng-non-bindable>\\n        <li>{{ metric }}</li>\\n        <li>{{ stat }}</li>\\n        <li>{{ namespace }}</li>\\n        <li>{{ region }}</li>\\n        <li>{{ period }}</li>\\n        <li>{{ label }}</li>\\n        <li>{{ YOUR_DIMENSION_NAME }}</li>\\n      </ul>\\n    </info-popover>\\n  </div>\\n\\n  <div class=\\\"gf-form gf-form--grow\\\">\\n    <div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","// Libaries\nimport React, { PureComponent, FC, ReactNode } from 'react';\nimport { connect } from 'react-redux';\nimport { css } from 'emotion';\n// Utils & Services\nimport { appEvents } from 'app/core/app_events';\nimport { PlaylistSrv } from 'app/features/playlist/playlist_srv';\n// Components\nimport { DashNavButton } from './DashNavButton';\nimport { DashNavTimeControls } from './DashNavTimeControls';\nimport { Icon, ModalsController } from '@grafana/ui';\nimport { textUtil } from '@grafana/data';\nimport { BackButton } from 'app/core/components/BackButton/BackButton';\n// State\nimport { updateLocation } from 'app/core/actions';\n// Types\nimport { DashboardModel } from '../../state';\nimport { CoreEvents, StoreState } from 'app/types';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { SaveDashboardModalProxy } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardModalProxy';\n\nexport interface OwnProps {\n  dashboard: DashboardModel;\n  isFullscreen: boolean;\n  $injector: any;\n  updateLocation: typeof updateLocation;\n  onAddPanel: () => void;\n}\n\ninterface DashNavButtonModel {\n  show: (props: Props) => boolean;\n  component: FC<Partial<Props>>;\n  index?: number | 'end';\n}\n\nconst customLeftActions: DashNavButtonModel[] = [];\nconst customRightActions: DashNavButtonModel[] = [];\n\nexport function addCustomLeftAction(content: DashNavButtonModel) {\n  customLeftActions.push(content);\n}\n\nexport function addCustomRightAction(content: DashNavButtonModel) {\n  customRightActions.push(content);\n}\n\nexport interface StateProps {\n  location: any;\n}\n\ntype Props = StateProps & OwnProps;\n\nclass DashNav extends PureComponent<Props> {\n  playlistSrv: PlaylistSrv;\n\n  constructor(props: Props) {\n    super(props);\n    this.playlistSrv = this.props.$injector.get('playlistSrv');\n  }\n\n  onFolderNameClick = () => {\n    this.props.updateLocation({\n      query: { search: 'open', folder: 'current' },\n      partial: true,\n    });\n  };\n\n  onClose = () => {\n    this.props.updateLocation({\n      query: { viewPanel: null },\n      partial: true,\n    });\n  };\n\n  onToggleTVMode = () => {\n    appEvents.emit(CoreEvents.toggleKioskMode);\n  };\n\n  onOpenSettings = () => {\n    this.props.updateLocation({\n      query: { editview: 'settings' },\n      partial: true,\n    });\n  };\n\n  onStarDashboard = () => {\n    const { dashboard, $injector } = this.props;\n    const dashboardSrv = $injector.get('dashboardSrv');\n\n    dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then((newState: any) => {\n      dashboard.meta.isStarred = newState;\n      this.forceUpdate();\n    });\n  };\n\n  onPlaylistPrev = () => {\n    this.playlistSrv.prev();\n  };\n\n  onPlaylistNext = () => {\n    this.playlistSrv.next();\n  };\n\n  onPlaylistStop = () => {\n    this.playlistSrv.stop();\n    this.forceUpdate();\n  };\n\n  onDashboardNameClick = () => {\n    this.props.updateLocation({\n      query: { search: 'open' },\n      partial: true,\n    });\n  };\n\n  addCustomContent(actions: DashNavButtonModel[], buttons: ReactNode[]) {\n    actions.map((action, index) => {\n      const Component = action.component;\n      const element = <Component {...this.props} key={`button-custom-${index}`} />;\n      typeof action.index === 'number' ? buttons.splice(action.index, 0, element) : buttons.push(element);\n    });\n  }\n\n  renderLeftActionsButton() {\n    const { dashboard } = this.props;\n    const { canStar, canShare, isStarred } = dashboard.meta;\n\n    const buttons: ReactNode[] = [];\n    if (canStar) {\n      buttons.push(\n        <DashNavButton\n          tooltip=\"Mark as favorite\"\n          classSuffix=\"star\"\n          icon={isStarred ? 'favorite' : 'star'}\n          iconType={isStarred ? 'mono' : 'default'}\n          iconSize=\"lg\"\n          noBorder={true}\n          onClick={this.onStarDashboard}\n          key=\"button-star\"\n        />\n      );\n    }\n\n    if (canShare) {\n      buttons.push(\n        <ModalsController key=\"button-share\">\n          {({ showModal, hideModal }) => (\n            <DashNavButton\n              tooltip=\"Share dashboard\"\n              classSuffix=\"share\"\n              icon=\"share-alt\"\n              iconSize=\"lg\"\n              noBorder={true}\n              onClick={() => {\n                showModal(ShareModal, {\n                  dashboard,\n                  onDismiss: hideModal,\n                });\n              }}\n            />\n          )}\n        </ModalsController>\n      );\n    }\n\n    this.addCustomContent(customLeftActions, buttons);\n    return buttons;\n  }\n\n  renderDashboardTitleSearchButton() {\n    const { dashboard, isFullscreen } = this.props;\n\n    const folderSymbol = css`\n      margin-right: 0 4px;\n    `;\n    const mainIconClassName = css`\n      margin-right: 8px;\n      margin-bottom: 3px;\n    `;\n\n    const folderTitle = dashboard.meta.folderTitle;\n    const haveFolder = dashboard.meta.folderId > 0;\n\n    return (\n      <>\n        <div>\n          <div className=\"navbar-page-btn\">\n            {!isFullscreen && <Icon name=\"apps\" size=\"lg\" className={mainIconClassName} />}\n            {haveFolder && (\n              <>\n                <a className=\"navbar-page-btn__folder\" onClick={this.onFolderNameClick}>\n                  {folderTitle} <span className={folderSymbol}>/</span>\n                </a>\n              </>\n            )}\n            <a onClick={this.onDashboardNameClick}>{dashboard.title}</a>\n          </div>\n        </div>\n        <div className=\"navbar-buttons navbar-buttons--actions\">{this.renderLeftActionsButton()}</div>\n        <div className=\"navbar__spacer\" />\n      </>\n    );\n  }\n\n  renderBackButton() {\n    return (\n      <div className=\"navbar-edit\">\n        <BackButton surface=\"dashboard\" onClick={this.onClose} />\n      </div>\n    );\n  }\n\n  renderRightActionsButton() {\n    const { dashboard, onAddPanel } = this.props;\n    const { canSave, showSettings } = dashboard.meta;\n    const { snapshot } = dashboard;\n    const snapshotUrl = snapshot && snapshot.originalUrl;\n\n    const buttons: ReactNode[] = [];\n    if (canSave) {\n      buttons.push(\n        <DashNavButton\n          classSuffix=\"save\"\n          tooltip=\"Add panel\"\n          icon=\"panel-add\"\n          onClick={onAddPanel}\n          iconType=\"mono\"\n          iconSize=\"xl\"\n          key=\"button-panel-add\"\n        />\n      );\n      buttons.push(\n        <ModalsController key=\"button-save\">\n          {({ showModal, hideModal }) => (\n            <DashNavButton\n              tooltip=\"Save dashboard\"\n              classSuffix=\"save\"\n              icon=\"save\"\n              onClick={() => {\n                showModal(SaveDashboardModalProxy, {\n                  dashboard,\n                  onDismiss: hideModal,\n                });\n              }}\n            />\n          )}\n        </ModalsController>\n      );\n    }\n\n    if (snapshotUrl) {\n      buttons.push(\n        <DashNavButton\n          tooltip=\"Open original dashboard\"\n          classSuffix=\"snapshot-origin\"\n          href={textUtil.sanitizeUrl(snapshotUrl)}\n          icon=\"link\"\n          key=\"button-snapshot\"\n        />\n      );\n    }\n\n    if (showSettings) {\n      buttons.push(\n        <DashNavButton\n          tooltip=\"Dashboard settings\"\n          classSuffix=\"settings\"\n          icon=\"cog\"\n          onClick={this.onOpenSettings}\n          key=\"button-settings\"\n        />\n      );\n    }\n\n    this.addCustomContent(customRightActions, buttons);\n    return buttons;\n  }\n\n  render() {\n    const { dashboard, location, isFullscreen } = this.props;\n\n    return (\n      <div className=\"navbar\">\n        {isFullscreen && this.renderBackButton()}\n        {this.renderDashboardTitleSearchButton()}\n\n        {this.playlistSrv.isPlaying && (\n          <div className=\"navbar-buttons navbar-buttons--playlist\">\n            <DashNavButton\n              tooltip=\"Go to previous dashboard\"\n              classSuffix=\"tight\"\n              icon=\"step-backward\"\n              onClick={this.onPlaylistPrev}\n            />\n            <DashNavButton\n              tooltip=\"Stop playlist\"\n              classSuffix=\"tight\"\n              icon=\"square-shape\"\n              onClick={this.onPlaylistStop}\n            />\n            <DashNavButton\n              tooltip=\"Go to next dashboard\"\n              classSuffix=\"tight\"\n              icon=\"forward\"\n              onClick={this.onPlaylistNext}\n            />\n          </div>\n        )}\n\n        <div className=\"navbar-buttons navbar-buttons--actions\">{this.renderRightActionsButton()}</div>\n\n        <div className=\"navbar-buttons navbar-buttons--tv\">\n          <DashNavButton tooltip=\"Cycle view mode\" classSuffix=\"tv\" icon=\"monitor\" onClick={this.onToggleTVMode} />\n        </div>\n\n        {!dashboard.timepicker.hidden && (\n          <div className=\"navbar-buttons\">\n            <DashNavTimeControls dashboard={dashboard} location={location} updateLocation={updateLocation} />\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n  location: state.location,\n});\n\nconst mapDispatchToProps = {\n  updateLocation,\n};\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DashNav);\n","import DashNav from './DashNav';\nexport { DashNav };\n","import React, { PureComponent } from 'react';\nimport { dateTimeFormat } from '@grafana/data';\nimport { Icon } from '@grafana/ui';\nimport { SyncInfo } from 'app/types';\n\ninterface Props {\n  ldapSyncInfo: SyncInfo;\n}\n\ninterface State {\n  isSyncing: boolean;\n}\n\nconst format = 'dddd YYYY-MM-DD HH:mm zz';\n\nexport class LdapSyncInfo extends PureComponent<Props, State> {\n  state = {\n    isSyncing: false,\n  };\n\n  handleSyncClick = () => {\n    console.log('Bulk-sync now');\n    this.setState({ isSyncing: !this.state.isSyncing });\n  };\n\n  render() {\n    const { ldapSyncInfo } = this.props;\n    const { isSyncing } = this.state;\n    const nextSyncTime = dateTimeFormat(ldapSyncInfo.nextSync, { format });\n    const prevSyncSuccessful = ldapSyncInfo && ldapSyncInfo.prevSync;\n    const prevSyncTime = prevSyncSuccessful ? dateTimeFormat(ldapSyncInfo.prevSync!.started, { format }) : '';\n\n    return (\n      <>\n        <h3 className=\"page-heading\">\n          LDAP Synchronisation\n          <button className={`btn btn-secondary pull-right`} onClick={this.handleSyncClick} hidden={true}>\n            <span className=\"btn-title\">Bulk-sync now</span>\n            {isSyncing && <Icon name=\"fa fa-spinner\" className=\"fa-fw fa-spin run-icon\" />}\n          </button>\n        </h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <tbody>\n                <tr>\n                  <td>Active synchronisation</td>\n                  <td colSpan={2}>{ldapSyncInfo.enabled ? 'Enabled' : 'Disabled'}</td>\n                </tr>\n                <tr>\n                  <td>Scheduled</td>\n                  <td>{ldapSyncInfo.schedule}</td>\n                </tr>\n                <tr>\n                  <td>Next scheduled synchronisation</td>\n                  <td>{nextSyncTime}</td>\n                </tr>\n                <tr>\n                  <td>Last synchronisation</td>\n                  {prevSyncSuccessful && (\n                    <>\n                      <td>{prevSyncTime}</td>\n                      <td>Successful</td>\n                    </>\n                  )}\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n","var path = 'public/app/partials/confirm_modal.html';\nvar html = \"<div class=modal-body ng-cloak>\\n  <div class=modal-header>\\n    <h2 class=modal-header-title>\\n      <icon name=\\\"'{{icon}}'\\\" size=\\\"'lg'\\\"></icon>\\n      <span class=p-l-1>\\n        {{title}}\\n      </span>\\n    </h2>\\n\\n    <a class=modal-header-close ng-click=dismiss();>\\n      <icon name=\\\"'times'\\\"></icon>\\n    </a>\\n  </div>\\n\\n  <div class=\\\"modal-content text-center\\\">\\n    <div class=confirm-modal-text>\\n      {{text}}\\n      <div ng-if=\\\"text2 && text2htmlBind\\\" class=confirm-modal-text2 ng-bind-html=text2></div>\\n      <div ng-if=\\\"text2 && !text2htmlBind\\\" class=confirm-modal-text2>{{text2}}</div>\\n    </div>\\n\\n    <div class=modal-content-confirm-text ng-if=confirmText>\\n      <input type=text class=\\\"gf-form-input width-16\\\" style=display:inline-block placeholder=\\\"Type {{confirmText}} to confirm\\\" ng-model=confirmInput ng-change=updateConfirmText(confirmInput) />\\n    </div>\\n\\n    <div class=confirm-modal-buttons>\\n      <button ng-show=onAltAction type=button class=\\\"btn btn-primary\\\" ng-click=dismiss();onAltAction();>\\n        {{altActionText}}\\n      </button>\\n      <button ng-show=onConfirm type=button class=\\\"btn btn-danger\\\" ng-click=onConfirm();dismiss(); ng-disabled=!confirmTextValid give-focus=true aria-label={{selectors.delete}}>\\n        {{yesText}}\\n      </button>\\n      <button type=button class=\\\"btn btn-inverse\\\" ng-click=dismiss()>{{noText}}</button>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { StoreState } from 'app/types';\nimport { Store } from 'redux';\n\nexport let store: Store<StoreState>;\n\nexport function setStore(newStore: Store<StoreState>) {\n  store = newStore;\n}\n\nexport function getState(): StoreState {\n  if (!store || !store.getState) {\n    return {\n      templating: {\n        variables: {},\n      },\n    } as StoreState; // used by tests\n  }\n\n  return store.getState();\n}\n\nexport function dispatch(action: any) {\n  if (!store || !store.getState) {\n    return;\n  }\n\n  return store.dispatch(action);\n}\n","var path = 'public/app/features/admin/partials/stats.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\">\\n\\t<table class=\\\"filter-table form-inline\\\">\\n\\t\\t<thead>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<th>Name</th>\\n\\t\\t\\t\\t<th>Value</th>\\n\\t\\t\\t</tr>\\n\\t\\t</thead>\\n\\t\\t<tbody>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total dashboards</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.dashboards}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total users</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.users}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Active users (seen last 14 days)</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.activeUsers}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total organizations</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.orgs}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total datasources</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.datasources}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total playlists</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.playlists}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total snapshots</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.snapshots}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total dashboard tags</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.tags}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t\\t<tr>\\n\\t\\t\\t\\t<td>Total starred dashboards</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.stars}}</td>\\n\\t\\t\\t</tr>\\n      <tr>\\n\\t\\t\\t\\t<td>Total alerts</td>\\n\\t\\t\\t\\t<td>{{ctrl.stats.alerts}}</td>\\n\\t\\t\\t</tr>\\n\\t\\t</tbody>\\n\\t</table>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { PureComponent } from 'react';\nimport appEvents from 'app/core/app_events';\nimport { CoreEvents } from 'app/types';\nimport { MetricQueryEditor, QueryTypeSelector, SLOQueryEditor, Help } from './';\nimport { StackdriverQuery, MetricQuery, QueryType, SLOQuery } from '../types';\nimport { defaultQuery } from './MetricQueryEditor';\nimport { defaultQuery as defaultSLOQuery } from './SLOQueryEditor';\nimport { toOption, formatStackdriverError } from '../functions';\nimport StackdriverDatasource from '../datasource';\nimport { ExploreQueryFieldProps } from '@grafana/data';\n\nexport type Props = ExploreQueryFieldProps<StackdriverDatasource, StackdriverQuery>;\n\ninterface State {\n  lastQueryError: string;\n}\n\nexport class QueryEditor extends PureComponent<Props, State> {\n  state: State = { lastQueryError: '' };\n\n  async UNSAFE_componentWillMount() {\n    const { datasource, query } = this.props;\n\n    // Unfortunately, migrations like this need to go componentWillMount. As soon as there's\n    // migration hook for this module.ts, we can do the migrations there instead.\n    if (!this.props.query.hasOwnProperty('metricQuery')) {\n      const { hide, refId, datasource, key, queryType, maxLines, metric, ...metricQuery } = this.props.query as any;\n      this.props.query.metricQuery = metricQuery;\n    }\n\n    if (!this.props.query.hasOwnProperty('queryType')) {\n      this.props.query.queryType = QueryType.METRICS;\n    }\n\n    await datasource.ensureGCEDefaultProject();\n    if (!query.metricQuery.projectName) {\n      this.props.query.metricQuery.projectName = datasource.getDefaultProject();\n    }\n  }\n\n  componentDidMount() {\n    appEvents.on(CoreEvents.dsRequestError, this.onDataError.bind(this));\n    appEvents.on(CoreEvents.dsRequestResponse, this.onDataResponse.bind(this));\n  }\n\n  componentWillUnmount() {\n    appEvents.off(CoreEvents.dsRequestResponse, this.onDataResponse.bind(this));\n    appEvents.on(CoreEvents.dsRequestError, this.onDataError.bind(this));\n  }\n\n  onDataResponse() {\n    this.setState({ lastQueryError: '' });\n  }\n\n  onDataError(error: any) {\n    this.setState({ lastQueryError: formatStackdriverError(error) });\n  }\n\n  onQueryChange(prop: string, value: any) {\n    this.props.onChange({ ...this.props.query, [prop]: value });\n    this.props.onRunQuery();\n  }\n\n  render() {\n    const { datasource, query, onRunQuery, onChange } = this.props;\n    const metricQuery = { ...defaultQuery, projectName: datasource.getDefaultProject(), ...query.metricQuery };\n    const sloQuery = { ...defaultSLOQuery, projectName: datasource.getDefaultProject(), ...query.sloQuery };\n    const queryType = query.queryType || QueryType.METRICS;\n    const meta = this.props.data?.series.length ? this.props.data?.series[0].meta : {};\n    const usedAlignmentPeriod = meta?.alignmentPeriod as string;\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      expanded: false,\n      options: datasource.variables.map(toOption),\n    };\n\n    return (\n      <>\n        <QueryTypeSelector\n          value={queryType}\n          templateVariableOptions={variableOptionGroup.options}\n          onChange={(queryType: QueryType) => {\n            onChange({ ...query, sloQuery, queryType });\n            onRunQuery();\n          }}\n        ></QueryTypeSelector>\n\n        {queryType === QueryType.METRICS && (\n          <MetricQueryEditor\n            refId={query.refId}\n            variableOptionGroup={variableOptionGroup}\n            usedAlignmentPeriod={usedAlignmentPeriod}\n            onChange={(query: MetricQuery) => this.onQueryChange('metricQuery', query)}\n            onRunQuery={onRunQuery}\n            datasource={datasource}\n            query={metricQuery}\n          ></MetricQueryEditor>\n        )}\n\n        {queryType === QueryType.SLO && (\n          <SLOQueryEditor\n            variableOptionGroup={variableOptionGroup}\n            usedAlignmentPeriod={usedAlignmentPeriod}\n            onChange={(query: SLOQuery) => this.onQueryChange('sloQuery', query)}\n            onRunQuery={onRunQuery}\n            datasource={datasource}\n            query={sloQuery}\n          ></SLOQueryEditor>\n        )}\n        <Help rawQuery={decodeURIComponent(meta?.rawQuery ?? '')} lastQueryError={this.state.lastQueryError} />\n      </>\n    );\n  }\n}\n","import _ from 'lodash';\nimport { Column, TableData, QueryResultMeta } from '@grafana/data';\n\n/**\n * Extends the standard Column class with variables that get\n * mutated in the angular table panel.\n */\nexport interface MutableColumn extends Column {\n  title?: string;\n  sort?: boolean;\n  desc?: boolean;\n  type?: string;\n}\n\nexport default class TableModel implements TableData {\n  columns: MutableColumn[];\n  rows: any[];\n  type: string;\n  columnMap: any;\n  refId: string;\n  meta?: QueryResultMeta;\n\n  constructor(table?: any) {\n    this.columns = [];\n    this.columnMap = {};\n    this.rows = [];\n    this.type = 'table';\n\n    if (table) {\n      if (table.columns) {\n        for (const col of table.columns) {\n          this.addColumn(col);\n        }\n      }\n      if (table.rows) {\n        for (const row of table.rows) {\n          this.addRow(row);\n        }\n      }\n    }\n  }\n\n  sort(options: { col: number; desc: boolean }) {\n    if (options.col === null || this.columns.length <= options.col) {\n      return;\n    }\n\n    this.rows.sort((a, b) => {\n      a = a[options.col];\n      b = b[options.col];\n      // Sort null or undefined separately from comparable values\n      return +(a == null) - +(b == null) || +(a > b) || -(a < b);\n    });\n\n    if (options.desc) {\n      this.rows.reverse();\n    }\n\n    this.columns[options.col].sort = true;\n    this.columns[options.col].desc = options.desc;\n  }\n\n  addColumn(col: Column) {\n    if (!this.columnMap[col.text]) {\n      this.columns.push(col);\n      this.columnMap[col.text] = col;\n    }\n  }\n\n  addRow(row: any[]) {\n    this.rows.push(row);\n  }\n}\n\n// Returns true if both rows have matching non-empty fields as well as matching\n// indexes where one field is empty and the other is not\nfunction areRowsMatching(columns: Column[], row: any[], otherRow: any[]) {\n  let foundFieldToMatch = false;\n  for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {\n    if (row[columnIndex] !== undefined && otherRow[columnIndex] !== undefined) {\n      if (row[columnIndex] !== otherRow[columnIndex]) {\n        return false;\n      }\n    } else if (row[columnIndex] === undefined || otherRow[columnIndex] === undefined) {\n      foundFieldToMatch = true;\n    }\n  }\n  return foundFieldToMatch;\n}\n\nexport function mergeTablesIntoModel(dst?: TableModel, ...tables: TableModel[]): TableModel {\n  const model = dst || new TableModel();\n\n  if (arguments.length === 1) {\n    return model;\n  }\n  // Single query returns data columns and rows as is\n  if (arguments.length === 2) {\n    model.columns = tables[0].hasOwnProperty('columns') ? [...tables[0].columns] : [];\n    model.rows = tables[0].hasOwnProperty('rows') ? [...tables[0].rows] : [];\n    return model;\n  }\n\n  // Filter out any tables that are not of TableData format\n  const tableDataTables = tables.filter(table => !!table.columns);\n\n  // Track column indexes of union: name -> index\n  const columnNames: { [key: string]: any } = {};\n\n  // Union of all non-value columns\n  const columnsUnion = tableDataTables.slice().reduce((acc, series) => {\n    series.columns.forEach(col => {\n      const { text } = col;\n      if (columnNames[text] === undefined) {\n        columnNames[text] = acc.length;\n        acc.push(col);\n      }\n    });\n    return acc;\n  }, [] as MutableColumn[]);\n\n  // Map old column index to union index per series, e.g.,\n  // given columnNames {A: 0, B: 1} and\n  // data [{columns: [{ text: 'A' }]}, {columns: [{ text: 'B' }]}] => [[0], [1]]\n  const columnIndexMapper = tableDataTables.map(series => series.columns.map(col => columnNames[col.text]));\n\n  // Flatten rows of all series and adjust new column indexes\n  const flattenedRows = tableDataTables.reduce((acc, series, seriesIndex) => {\n    const mapper = columnIndexMapper[seriesIndex];\n    series.rows.forEach(row => {\n      const alteredRow: MutableColumn[] = [];\n      // Shifting entries according to index mapper\n      mapper.forEach((to, from) => {\n        alteredRow[to] = row[from];\n      });\n      acc.push(alteredRow);\n    });\n    return acc;\n  }, [] as MutableColumn[][]);\n\n  // Merge rows that have same values for columns\n  const mergedRows: { [key: string]: any } = {};\n\n  const compactedRows = flattenedRows.reduce((acc, row, rowIndex) => {\n    if (!mergedRows[rowIndex]) {\n      // Look from current row onwards\n      let offset = rowIndex + 1;\n      // More than one row can be merged into current row\n      while (offset < flattenedRows.length) {\n        // Find next row that could be merged\n        const match = _.findIndex(flattenedRows, otherRow => areRowsMatching(columnsUnion, row, otherRow), offset);\n        if (match > -1) {\n          const matchedRow = flattenedRows[match];\n          // Merge values from match into current row if there is a gap in the current row\n          for (let columnIndex = 0; columnIndex < columnsUnion.length; columnIndex++) {\n            if (row[columnIndex] === undefined && matchedRow[columnIndex] !== undefined) {\n              row[columnIndex] = matchedRow[columnIndex];\n            }\n          }\n          // Don't visit this row again\n          mergedRows[match] = matchedRow;\n          // Keep looking for more rows to merge\n          offset = match + 1;\n        } else {\n          // No match found, stop looking\n          break;\n        }\n      }\n      acc.push(row);\n    }\n    return acc;\n  }, [] as MutableColumn[][]);\n\n  model.columns = columnsUnion;\n  model.rows = compactedRows;\n  return model;\n}\n","import React, { FC } from 'react';\nimport { css, cx } from 'emotion';\nimport { useTheme } from '@grafana/ui';\n\nexport interface BrandComponentProps {\n  className?: string;\n  children?: JSX.Element | JSX.Element[];\n}\n\nconst LoginLogo: FC<BrandComponentProps> = ({ className }) => {\n  return <img className={className} src=\"public/img/grafana_icon.svg\" alt=\"Grafana\" />;\n};\n\nconst LoginBackground: FC<BrandComponentProps> = ({ className, children }) => {\n  const theme = useTheme();\n  const background = css`\n    background: url(public/img/login_background_${theme.isDark ? 'dark' : 'light'}.svg);\n    background-size: cover;\n  `;\n\n  return <div className={cx(background, className)}>{children}</div>;\n};\n\nconst MenuLogo: FC<BrandComponentProps> = ({ className }) => {\n  return <img className={className} src=\"public/img/grafana_icon.svg\" alt=\"Grafana\" />;\n};\n\nconst LoginBoxBackground = () => {\n  const theme = useTheme();\n  return css`\n    background: ${theme.isLight ? 'rgba(6, 30, 200, 0.1 )' : 'rgba(18, 28, 41, 0.65)'};\n    background-size: cover;\n  `;\n};\n\nexport class Branding {\n  static LoginLogo = LoginLogo;\n  static LoginBackground = LoginBackground;\n  static MenuLogo = MenuLogo;\n  static LoginBoxBackground = LoginBoxBackground;\n  static AppTitle = 'Grafana';\n  static LoginTitle = 'Welcome to Grafana';\n  static GetLoginSubTitle = () => {\n    const slogans = [\n      \"Don't get in the way of the data\",\n      'Your single pane of glass',\n      'Built better together',\n      'Democratising data',\n    ];\n    const count = slogans.length;\n    return slogans[Math.floor(Math.random() * count)];\n  };\n}\n","import { DataFrame } from '../types/dataFrame';\nimport { DisplayProcessor } from '../types';\nimport { FunctionalVector } from '../vector/FunctionalVector';\n\n/**\n * This abstraction will present the contents of a DataFrame as if\n * it were a well typed javascript object Vector.\n *\n * @remarks\n * The {@link DataFrameView.get} is optimized for use in a loop and will return same object.\n * See function for more details.\n *\n * @typeParam T - Type of object stored in the DataFrame.\n * @beta\n */\nexport class DataFrameView<T = any> extends FunctionalVector<T> {\n  private index = 0;\n  private obj: T;\n\n  constructor(private data: DataFrame) {\n    super();\n    const obj = ({} as unknown) as T;\n\n    for (let i = 0; i < data.fields.length; i++) {\n      const field = data.fields[i];\n      const getter = () => field.values.get(this.index);\n\n      if (!(obj as any).hasOwnProperty(field.name)) {\n        Object.defineProperty(obj, field.name, {\n          enumerable: true, // Shows up as enumerable property\n          get: getter,\n        });\n      }\n\n      Object.defineProperty(obj, i, {\n        enumerable: false, // Don't enumerate array index\n        get: getter,\n      });\n    }\n\n    this.obj = obj;\n  }\n\n  get dataFrame() {\n    return this.data;\n  }\n\n  get length() {\n    return this.data.length;\n  }\n\n  /**\n   * Helper function to return the {@link DisplayProcessor} for a given field column.\n   * @param colIndex - the field column index for the data frame.\n   */\n  getFieldDisplayProcessor(colIndex: number): DisplayProcessor | null {\n    if (!this.dataFrame || !this.dataFrame.fields) {\n      return null;\n    }\n\n    const field = this.dataFrame.fields[colIndex];\n\n    if (!field || !field.display) {\n      return null;\n    }\n\n    return field.display;\n  }\n\n  /**\n   * The contents of the object returned from this function\n   * are optimized for use in a loop. All calls return the same object\n   * but the index has changed.\n   *\n   * @example\n   * ```typescript\n   *   // `first`, `second` and `third` will all point to the same contents at index 2:\n   *   const first = view.get(0);\n   *   const second = view.get(1);\n   *   const third = view.get(2);\n   *\n   *   // If you need three different objects, consider something like:\n   *   const first = { ...view.get(0) };\n   *   const second = { ...view.get(1) };\n   *   const third = { ...view.get(2) };\n   * ```\n   * @param idx - The index of the object you currently are inspecting\n   */\n  get(idx: number) {\n    this.index = idx;\n    return this.obj;\n  }\n\n  toArray(): T[] {\n    return new Array(this.data.length)\n      .fill(0) // Needs to make a full copy\n      .map((_, i) => ({ ...this.get(i) }));\n  }\n}\n","import { Field, FieldType } from '../types/dataFrame';\nimport { guessFieldTypeFromValue } from '../dataframe/processDataFrame';\n\nexport function makeFieldParser(value: any, field: Field): (value: string) => any {\n  if (!field.type) {\n    if (field.name === 'time' || field.name === 'Time') {\n      field.type = FieldType.time;\n    } else {\n      field.type = guessFieldTypeFromValue(value);\n    }\n  }\n\n  if (field.type === FieldType.number) {\n    return (value: string) => {\n      return parseFloat(value);\n    };\n  }\n\n  // Will convert anything that starts with \"T\" to true\n  if (field.type === FieldType.boolean) {\n    return (value: string) => {\n      return !(value[0] === 'F' || value[0] === 'f' || value[0] === '0');\n    };\n  }\n\n  // Just pass the string back\n  return (value: string) => value;\n}\n","import { Field, DataFrame, DataFrameDTO, FieldDTO, FieldType } from '../types/dataFrame';\nimport { KeyValue, QueryResultMeta } from '../types/data';\nimport { guessFieldTypeFromValue, guessFieldTypeForField, toDataFrameDTO } from './processDataFrame';\nimport isArray from 'lodash/isArray';\nimport isString from 'lodash/isString';\nimport { makeFieldParser } from '../utils/fieldParser';\nimport { MutableVector, Vector } from '../types/vector';\nimport { ArrayVector } from '../vector/ArrayVector';\nimport { FunctionalVector } from '../vector/FunctionalVector';\n\nexport type MutableField<T = any> = Field<T, MutableVector<T>>;\n\ntype MutableVectorCreator = (buffer?: any[]) => MutableVector;\n\nexport const MISSING_VALUE: any = null;\n\nexport class MutableDataFrame<T = any> extends FunctionalVector<T> implements DataFrame, MutableVector<T> {\n  name?: string;\n  refId?: string;\n  meta?: QueryResultMeta;\n\n  fields: MutableField[] = [];\n  values: KeyValue<MutableVector> = {};\n\n  private first: Vector = new ArrayVector();\n  private creator: MutableVectorCreator;\n\n  constructor(source?: DataFrame | DataFrameDTO, creator?: MutableVectorCreator) {\n    super();\n\n    // This creates the underlying storage buffers\n    this.creator = creator\n      ? creator\n      : (buffer?: any[]) => {\n          return new ArrayVector(buffer);\n        };\n\n    // Copy values from\n    if (source) {\n      const { name, refId, meta, fields } = source;\n      if (name) {\n        this.name = name;\n      }\n      if (refId) {\n        this.refId = refId;\n      }\n      if (meta) {\n        this.meta = meta;\n      }\n      if (fields) {\n        for (const f of fields) {\n          this.addField(f);\n        }\n      }\n    }\n\n    // Get Length to show up if you use spread\n    Object.defineProperty(this, 'length', {\n      enumerable: true,\n      get: () => {\n        return this.first.length;\n      },\n    });\n  }\n\n  // Defined for Vector interface\n  get length() {\n    return this.first.length;\n  }\n\n  addFieldFor(value: any, name?: string): MutableField {\n    return this.addField({\n      name: name || '', // Will be filled in\n      type: guessFieldTypeFromValue(value),\n    });\n  }\n\n  addField(f: Field | FieldDTO, startLength?: number): MutableField {\n    let buffer: any[] | undefined = undefined;\n\n    if (f.values) {\n      if (isArray(f.values)) {\n        buffer = f.values as any[];\n      } else {\n        buffer = (f.values as Vector).toArray();\n      }\n    }\n\n    let type = f.type;\n\n    if (!type && ('time' === f.name || 'Time' === f.name)) {\n      type = FieldType.time;\n    } else {\n      if (!type && buffer && buffer.length) {\n        type = guessFieldTypeFromValue(buffer[0]);\n      }\n      if (!type) {\n        type = FieldType.other;\n      }\n    }\n\n    // Make sure it has a name\n    let name = f.name;\n    if (!name) {\n      if (type === FieldType.time) {\n        name = this.values['Time'] ? `Time ${this.fields.length + 1}` : 'Time';\n      } else {\n        name = `Field ${this.fields.length + 1}`;\n      }\n    }\n\n    const field: MutableField = {\n      name,\n      type,\n      config: f.config || {},\n      values: this.creator(buffer),\n      labels: f.labels,\n    };\n\n    if (type === FieldType.other) {\n      type = guessFieldTypeForField(field);\n      if (type) {\n        field.type = type;\n      }\n    }\n\n    this.fields.push(field);\n    this.first = this.fields[0].values;\n\n    // The Field Already exists\n    if (this.values[name]) {\n      console.warn(`Duplicate field names found: ${name}, only the first will be accessible`);\n    } else {\n      this.values[name] = field.values;\n    }\n\n    // Make sure the field starts with a given length\n    if (startLength) {\n      while (field.values.length < startLength) {\n        field.values.add(MISSING_VALUE);\n      }\n    } else {\n      this.validate();\n    }\n\n    return field;\n  }\n\n  validate() {\n    // Make sure all arrays are the same length\n    const length = this.fields.reduce((v: number, f) => {\n      return Math.max(v, f.values.length);\n    }, 0);\n\n    // Add empty elements until everything mastches\n    for (const field of this.fields) {\n      while (field.values.length !== length) {\n        field.values.add(MISSING_VALUE);\n      }\n    }\n  }\n\n  private addMissingFieldsFor(value: any) {\n    for (const key of Object.keys(value)) {\n      if (!this.values[key]) {\n        this.addField({\n          name: key,\n          type: guessFieldTypeFromValue(value[key]),\n        });\n      }\n    }\n  }\n\n  /**\n   * Reverse all values\n   */\n  reverse() {\n    for (const f of this.fields) {\n      f.values.reverse();\n    }\n  }\n\n  /**\n   * This will add each value to the corresponding column\n   */\n  appendRow(row: any[]) {\n    // Add any extra columns\n    for (let i = this.fields.length; i < row.length; i++) {\n      this.addField({\n        name: `Field ${i + 1}`,\n        type: guessFieldTypeFromValue(row[i]),\n      });\n    }\n\n    // The first line may change the field types\n    if (this.length < 1) {\n      for (let i = 0; i < this.fields.length; i++) {\n        const f = this.fields[i];\n        if (!f.type || f.type === FieldType.other) {\n          f.type = guessFieldTypeFromValue(row[i]);\n        }\n      }\n    }\n\n    for (let i = 0; i < this.fields.length; i++) {\n      const f = this.fields[i];\n      let v = row[i];\n      if (f.type !== FieldType.string && isString(v)) {\n        if (!f.parse) {\n          f.parse = makeFieldParser(v, f);\n        }\n        v = f.parse(v);\n      }\n      f.values.add(v);\n    }\n  }\n\n  /**\n   * Add all properties of the value as fields on the frame\n   */\n  add(value: T, addMissingFields?: boolean) {\n    if (addMissingFields) {\n      this.addMissingFieldsFor(value);\n    }\n\n    // Will add one value for every field\n    const obj = value as any;\n    for (const field of this.fields) {\n      let val = obj[field.name];\n\n      if (field.type !== FieldType.string && isString(val)) {\n        if (!field.parse) {\n          field.parse = makeFieldParser(val, field);\n        }\n        val = field.parse(val);\n      }\n\n      if (val === undefined) {\n        val = MISSING_VALUE;\n      }\n\n      field.values.add(val);\n    }\n  }\n\n  set(index: number, value: T, addMissingFields?: boolean) {\n    if (index > this.length) {\n      throw new Error('Unable ot set value beyond current length');\n    }\n\n    if (addMissingFields) {\n      this.addMissingFieldsFor(value);\n    }\n\n    const obj = (value as any) || {};\n    for (const field of this.fields) {\n      field.values.set(index, obj[field.name]);\n    }\n  }\n\n  /**\n   * Get an object with a property for each field in the DataFrame\n   */\n  get(idx: number): T {\n    const v: any = {};\n    for (const field of this.fields) {\n      v[field.name] = field.values.get(idx);\n    }\n    return v as T;\n  }\n\n  /**\n   * The simplified JSON values used in JSON.stringify()\n   */\n  toJSON() {\n    return toDataFrameDTO(this);\n  }\n}\n","var path = 'public/app/features/dashboard/components/RowOptions/template.html';\nvar html = \"<div class=modal-body>\\n\\t<div class=modal-header>\\n\\t\\t<h2 class=modal-header-title>\\n\\t\\t\\t<icon name=\\\"'copy'\\\" size=\\\"'lg'\\\"></icon>\\n\\t\\t\\t<span class=p-l-1>Row Options</span>\\n\\t\\t</h2>\\n\\n\\t\\t<a class=modal-header-close ng-click=ctrl.dismiss();>\\n\\t\\t\\t<icon name=\\\"'times'\\\"></icon>\\n\\t\\t</a>\\n\\t</div>\\n\\n\\t<form name=ctrl.saveForm ng-submit=ctrl.save() class=\\\"modal-content text-center\\\" novalidate>\\n\\t\\t<div class=section>\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Title</span>\\n\\t\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-13\\\" ng-model=ctrl.row.title>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Repeat for</span>\\n\\t\\t\\t\\t<dash-repeat-option panel=ctrl.row></dash-repeat-option>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=gf-form-button-row>\\n\\t\\t\\t\\t<button type=submit class=\\\"btn btn-primary\\\" ng-click=ctrl.update()>Update</button>\\n\\t\\t\\t\\t<button type=button class=\\\"btn btn-inverse\\\" ng-click=ctrl.dismiss()>Cancel</button>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</form>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { DashboardSection, SearchAction } from '../types';\nimport { getFlattenedSections, getLookupField, markSelected } from '../utils';\nimport {\n  FETCH_ITEMS,\n  FETCH_RESULTS,\n  TOGGLE_SECTION,\n  MOVE_SELECTION_DOWN,\n  MOVE_SELECTION_UP,\n  SEARCH_START,\n  FETCH_ITEMS_START,\n} from './actionTypes';\n\nexport interface DashboardsSearchState {\n  results: DashboardSection[];\n  loading: boolean;\n  selectedIndex: number;\n  /** Used for first time page load */\n  initialLoading: boolean;\n}\n\nexport const dashboardsSearchState: DashboardsSearchState = {\n  results: [],\n  loading: true,\n  initialLoading: true,\n  selectedIndex: 0,\n};\n\nexport const searchReducer = (state: DashboardsSearchState, action: SearchAction) => {\n  switch (action.type) {\n    case SEARCH_START:\n      if (!state.loading) {\n        return { ...state, loading: true };\n      }\n      return state;\n    case FETCH_RESULTS: {\n      const results = action.payload;\n      // Highlight the first item ('Starred' folder)\n      if (results.length > 0) {\n        results[0].selected = true;\n      }\n      return { ...state, results, loading: false, initialLoading: false };\n    }\n    case TOGGLE_SECTION: {\n      const section = action.payload;\n      const lookupField = getLookupField(section.title);\n      return {\n        ...state,\n        results: state.results.map((result: DashboardSection) => {\n          if (section[lookupField] === result[lookupField]) {\n            return { ...result, expanded: !result.expanded };\n          }\n          return result;\n        }),\n      };\n    }\n    case FETCH_ITEMS: {\n      const { section, items } = action.payload;\n      return {\n        ...state,\n        itemsFetching: false,\n        results: state.results.map((result: DashboardSection) => {\n          if (section.id === result.id) {\n            return { ...result, items, itemsFetching: false };\n          }\n          return result;\n        }),\n      };\n    }\n    case FETCH_ITEMS_START: {\n      const id = action.payload;\n      if (id) {\n        return {\n          ...state,\n          results: state.results.map(result => (result.id === id ? { ...result, itemsFetching: true } : result)),\n        };\n      }\n      return state;\n    }\n    case MOVE_SELECTION_DOWN: {\n      const flatIds = getFlattenedSections(state.results);\n      if (state.selectedIndex < flatIds.length - 1) {\n        const newIndex = state.selectedIndex + 1;\n        const selectedId = flatIds[newIndex];\n        return {\n          ...state,\n          selectedIndex: newIndex,\n          results: markSelected(state.results, selectedId),\n        };\n      }\n      return state;\n    }\n    case MOVE_SELECTION_UP:\n      if (state.selectedIndex > 0) {\n        const flatIds = getFlattenedSections(state.results);\n        const newIndex = state.selectedIndex - 1;\n        const selectedId = flatIds[newIndex];\n        return {\n          ...state,\n          selectedIndex: newIndex,\n          results: markSelected(state.results, selectedId),\n        };\n      }\n      return state;\n    default:\n      return state;\n  }\n};\n","import { getBackendSrv } from '@grafana/runtime';\nimport { PanelPlugin } from '@grafana/data';\nimport { ThunkResult } from 'app/types';\nimport { pluginDashboardsLoad, pluginDashboardsLoaded, pluginsLoaded, panelPluginLoaded } from './reducers';\nimport { importPanelPlugin } from 'app/features/plugins/plugin_loader';\n\nexport function loadPlugins(): ThunkResult<void> {\n  return async dispatch => {\n    const result = await getBackendSrv().get('api/plugins', { embedded: 0 });\n    dispatch(pluginsLoaded(result));\n  };\n}\n\nexport function loadPluginDashboards(): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    dispatch(pluginDashboardsLoad());\n    const dataSourceType = getStore().dataSources.dataSource.type;\n    const response = await getBackendSrv().get(`api/plugins/${dataSourceType}/dashboards`);\n    dispatch(pluginDashboardsLoaded(response));\n  };\n}\n\nexport function loadPanelPlugin(pluginId: string): ThunkResult<Promise<PanelPlugin>> {\n  return async (dispatch, getStore) => {\n    let plugin = getStore().plugins.panels[pluginId];\n\n    if (!plugin) {\n      plugin = await importPanelPlugin(pluginId);\n\n      // second check to protect against raise condition\n      if (!getStore().plugins.panels[pluginId]) {\n        dispatch(panelPluginLoaded(plugin));\n      }\n    }\n\n    return plugin;\n  };\n}\n","import { getDashboardSrv } from '../services/DashboardSrv';\nimport { DashboardModel } from './DashboardModel';\n\nimport { PanelData, LoadingState, DataSourceApi } from '@grafana/data';\n\nimport {\n  reportMetaAnalytics,\n  MetaAnalyticsEventName,\n  DataRequestEventPayload,\n  DashboardViewEventPayload,\n} from '@grafana/runtime';\n\nexport function emitDataRequestEvent(datasource: DataSourceApi) {\n  let done = false;\n\n  return (data: PanelData) => {\n    if (!data.request || done) {\n      return;\n    }\n\n    if (data.request.exploreMode) {\n      return;\n    }\n\n    if (data.state !== LoadingState.Done && data.state !== LoadingState.Error) {\n      return;\n    }\n\n    const eventData: DataRequestEventPayload = {\n      eventName: MetaAnalyticsEventName.DataRequest,\n      datasourceName: datasource.name,\n      datasourceId: datasource.id,\n      panelId: data.request.panelId,\n      dashboardId: data.request.dashboardId,\n      dataSize: 0,\n      duration: data.request.endTime - data.request.startTime,\n    };\n\n    // enrich with dashboard info\n    const dashboard = getDashboardSrv().getCurrent();\n    if (dashboard) {\n      eventData.dashboardId = dashboard.id;\n      eventData.dashboardName = dashboard.title;\n      eventData.dashboardUid = dashboard.uid;\n      eventData.folderName = dashboard.meta.folderTitle;\n    }\n\n    if (data.series && data.series.length > 0) {\n      // estimate size\n      eventData.dataSize = data.series.length;\n    }\n\n    if (data.error) {\n      eventData.error = data.error.message;\n    }\n\n    reportMetaAnalytics(eventData);\n\n    // this done check is to make sure we do not double emit events in case\n    // there are multiple responses with done state\n    done = true;\n  };\n}\n\nexport function emitDashboardViewEvent(dashboard: DashboardModel) {\n  const eventData: DashboardViewEventPayload = {\n    dashboardId: dashboard.id,\n    dashboardName: dashboard.title,\n    dashboardUid: dashboard.uid,\n    folderName: dashboard.meta.folderTitle,\n    eventName: MetaAnalyticsEventName.DashboardView,\n  };\n\n  reportMetaAnalytics(eventData);\n}\n","var path = 'public/app/plugins/datasource/prometheus/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n\\t<div class=gf-form>\\n\\t\\t<span class=\\\"gf-form-label width-10\\\">Search expression</span>\\n\\t\\t<input type=text class=gf-form-input ng-model=ctrl.annotation.expr placeholder=ALERTS>\\n\\t</div>\\n\\t<div class=gf-form>\\n\\t\\t<span class=\\\"gf-form-label width-10\\\">step</span>\\n\\t\\t<input type=text class=\\\"gf-form-input max-width-6\\\" ng-model=ctrl.annotation.step placeholder={{::ctrl.stepDefaultValuePlaceholder}}>\\n\\t</div>\\n</div>\\n\\n<div class=gf-form-group>\\n\\t<h5 class=section-heading>Field formats</h5>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-5\\\">Title</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-9\\\" ng-model=ctrl.annotation.titleFormat placeholder=alertname>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=\\\"gf-form-label width-5\\\">Tags</span>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-9\\\" ng-model=ctrl.annotation.tagKeys placeholder=label1,label2>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form-inline>\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-5\\\">Text</span>\\n\\t\\t\\t\\t<input type=text class=\\\"gf-form-input max-width-9\\\" ng-model=ctrl.annotation.textFormat placeholder=instance>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<h5 class=section-heading>Other options</h5>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<gf-form-switch class=gf-form label=\\\"Series value as timestamp\\\" label-class=width-14 checked=ctrl.annotation.useValueForTime tooltip=\\\"The unit of timestamp is milliseconds. If the unit of the series value is seconds, multiply its range vector by 1000.\\\">\\n\\t\\t\\t</gf-form-switch>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { DashboardSection, DashboardSectionItem, SearchAction } from '../types';\nimport { TOGGLE_ALL_CHECKED, TOGGLE_CHECKED, MOVE_ITEMS, DELETE_ITEMS } from './actionTypes';\nimport { dashboardsSearchState, DashboardsSearchState, searchReducer } from './dashboardSearch';\nimport { mergeReducers } from '../utils';\n\nexport interface ManageDashboardsState extends DashboardsSearchState {\n  allChecked: boolean;\n}\n\nexport const manageDashboardsState: ManageDashboardsState = {\n  ...dashboardsSearchState,\n  allChecked: false,\n};\n\nconst reducer = (state: ManageDashboardsState, action: SearchAction) => {\n  switch (action.type) {\n    case TOGGLE_ALL_CHECKED:\n      const newAllChecked = !state.allChecked;\n      return {\n        ...state,\n        results: state.results.map(result => {\n          return {\n            ...result,\n            checked: newAllChecked,\n            items: result.items.map(item => ({ ...item, checked: newAllChecked })),\n          };\n        }),\n        allChecked: newAllChecked,\n      };\n    case TOGGLE_CHECKED:\n      const { id } = action.payload;\n      return {\n        ...state,\n        results: state.results.map(result => {\n          if (result.id === id) {\n            return {\n              ...result,\n              checked: !result.checked,\n              items: result.items.map(item => ({ ...item, checked: !result.checked })),\n            };\n          }\n          return {\n            ...result,\n            items: result.items.map(item => (item.id === id ? { ...item, checked: !item.checked } : item)),\n          };\n        }),\n      };\n    case MOVE_ITEMS: {\n      const dashboards: DashboardSectionItem[] = action.payload.dashboards;\n      const folder: DashboardSection = action.payload.folder;\n      const uids = dashboards.map(db => db.uid);\n      return {\n        ...state,\n        results: state.results.map(result => {\n          if (folder.id === result.id) {\n            return {\n              ...result,\n              items: [...result.items, ...dashboards.map(db => ({ ...db, checked: false }))],\n              checked: false,\n            };\n          } else {\n            return { ...result, items: result.items.filter(item => !uids.includes(item.uid)) };\n          }\n        }),\n      };\n    }\n    case DELETE_ITEMS: {\n      const { folders, dashboards } = action.payload;\n      if (!folders.length && !dashboards.length) {\n        return state;\n      }\n      return {\n        ...state,\n        results: state.results.reduce((filtered, result) => {\n          if (!folders.includes(result.uid)) {\n            return [...filtered, { ...result, items: result.items.filter(item => !dashboards.includes(item.uid)) }];\n          }\n          return filtered;\n        }, []),\n      };\n    }\n    default:\n      return state;\n  }\n};\n\nexport const manageDashboardsReducer = mergeReducers([searchReducer, reducer]);\n","import { useMemo, useReducer } from 'react';\nimport { FolderDTO } from 'app/types';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { DashboardQuery, DashboardSection, OnDeleteItems, OnMoveItems, OnToggleChecked } from '../types';\nimport { DELETE_ITEMS, MOVE_ITEMS, TOGGLE_ALL_CHECKED, TOGGLE_CHECKED } from '../reducers/actionTypes';\nimport { manageDashboardsReducer, manageDashboardsState, ManageDashboardsState } from '../reducers/manageDashboards';\nimport { useSearch } from './useSearch';\n\nexport const useManageDashboards = (\n  query: DashboardQuery,\n  state: Partial<ManageDashboardsState> = {},\n  folder?: FolderDTO\n) => {\n  const reducer = useReducer(manageDashboardsReducer, {\n    ...manageDashboardsState,\n    ...state,\n  });\n\n  const {\n    state: { results, loading, initialLoading, allChecked },\n    onToggleSection,\n    dispatch,\n  } = useSearch<ManageDashboardsState>(query, reducer, {});\n\n  const onToggleChecked: OnToggleChecked = item => {\n    dispatch({ type: TOGGLE_CHECKED, payload: item });\n  };\n\n  const onToggleAllChecked = () => {\n    dispatch({ type: TOGGLE_ALL_CHECKED });\n  };\n\n  const onDeleteItems: OnDeleteItems = (folders, dashboards) => {\n    dispatch({ type: DELETE_ITEMS, payload: { folders, dashboards } });\n  };\n\n  const onMoveItems: OnMoveItems = (selectedDashboards, folder) => {\n    dispatch({ type: MOVE_ITEMS, payload: { dashboards: selectedDashboards, folder } });\n  };\n\n  const canMove = useMemo(\n    () => results.some((result: DashboardSection) => result.items && result.items.some(item => item.checked)),\n    [results]\n  );\n  const canDelete = useMemo(() => canMove || results.some((result: DashboardSection) => result.checked), [\n    canMove,\n    results,\n  ]);\n\n  const canSave = folder?.canSave;\n  const hasEditPermissionInFolders = folder ? canSave : contextSrv.hasEditPermissionInFolders;\n  const noFolders = canSave && folder?.id && results.length === 0 && !loading && !initialLoading;\n\n  return {\n    results,\n    loading,\n    initialLoading,\n    canSave,\n    allChecked,\n    hasEditPermissionInFolders,\n    canMove,\n    canDelete,\n    onToggleSection,\n    onToggleChecked,\n    onToggleAllChecked,\n    onDeleteItems,\n    onMoveItems,\n    noFolders,\n  };\n};\n","import React, { FC } from 'react';\nimport { HorizontalGroup, LinkButton } from '@grafana/ui';\n\nexport interface Props {\n  folderId?: number;\n  isEditor: boolean;\n  canEdit?: boolean;\n}\n\nexport const DashboardActions: FC<Props> = ({ folderId, isEditor, canEdit }) => {\n  const actionUrl = (type: string) => {\n    let url = `dashboard/${type}`;\n\n    if (folderId) {\n      url += `?folderId=${folderId}`;\n    }\n\n    return url;\n  };\n\n  return (\n    <HorizontalGroup spacing=\"md\" align=\"center\">\n      {canEdit && <LinkButton href={actionUrl('new')}>New Dashboard</LinkButton>}\n      {!folderId && isEditor && <LinkButton href=\"dashboards/folder/new\">New Folder</LinkButton>}\n      {canEdit && <LinkButton href={actionUrl('import')}>Import</LinkButton>}\n    </HorizontalGroup>\n  );\n};\n","import React, { FC, memo, useState } from 'react';\nimport { css } from 'emotion';\nimport { HorizontalGroup, stylesFactory, useTheme, Spinner } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { FilterInput } from 'app/core/components/FilterInput/FilterInput';\nimport { FolderDTO } from 'app/types';\nimport { useManageDashboards } from '../hooks/useManageDashboards';\nimport { SearchLayout } from '../types';\nimport { ConfirmDeleteModal } from './ConfirmDeleteModal';\nimport { MoveToFolderModal } from './MoveToFolderModal';\nimport { useSearchQuery } from '../hooks/useSearchQuery';\nimport { SearchResultsFilter } from './SearchResultsFilter';\nimport { SearchResults } from './SearchResults';\nimport { DashboardActions } from './DashboardActions';\n\nexport interface Props {\n  folder?: FolderDTO;\n}\n\nconst { isEditor } = contextSrv;\n\nexport const ManageDashboards: FC<Props> = memo(({ folder }) => {\n  const folderId = folder?.id;\n  const folderUid = folder?.uid;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n  const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n  const [isMoveModalOpen, setIsMoveModalOpen] = useState(false);\n  const defaultLayout = folderId ? SearchLayout.List : SearchLayout.Folders;\n  const queryParams = {\n    skipRecent: true,\n    skipStarred: true,\n    folderIds: folderId ? [folderId] : [],\n    layout: defaultLayout,\n  };\n  const {\n    query,\n    hasFilters,\n    onQueryChange,\n    onTagFilterChange,\n    onStarredFilterChange,\n    onTagAdd,\n    onSortChange,\n    onLayoutChange,\n  } = useSearchQuery(queryParams);\n\n  const {\n    results,\n    loading,\n    initialLoading,\n    canSave,\n    allChecked,\n    hasEditPermissionInFolders,\n    canMove,\n    canDelete,\n    onToggleSection,\n    onToggleChecked,\n    onToggleAllChecked,\n    onDeleteItems,\n    onMoveItems,\n    noFolders,\n  } = useManageDashboards(query, {}, folder);\n\n  const onMoveTo = () => {\n    setIsMoveModalOpen(true);\n  };\n\n  const onItemDelete = () => {\n    setIsDeleteModalOpen(true);\n  };\n\n  if (initialLoading) {\n    return <Spinner className={styles.spinner} />;\n  }\n\n  if (noFolders && !hasFilters) {\n    return (\n      <EmptyListCTA\n        title=\"This folder doesn't have any dashboards yet\"\n        buttonIcon=\"plus\"\n        buttonTitle=\"Create Dashboard\"\n        buttonLink={`dashboard/new?folderId=${folderId}`}\n        proTip=\"Add/move dashboards to your folder at ->\"\n        proTipLink=\"dashboards\"\n        proTipLinkTitle=\"Manage dashboards\"\n        proTipTarget=\"\"\n      />\n    );\n  }\n\n  return (\n    <div className={styles.container}>\n      <div>\n        <HorizontalGroup justify=\"space-between\">\n          <FilterInput\n            labelClassName=\"gf-form--has-input-icon\"\n            inputClassName=\"gf-form-input width-20\"\n            value={query.query}\n            onChange={onQueryChange}\n            placeholder={'Search dashboards by name'}\n          />\n          <DashboardActions isEditor={isEditor} canEdit={hasEditPermissionInFolders || canSave} folderId={folderId} />\n        </HorizontalGroup>\n      </div>\n\n      <div className={styles.results}>\n        <SearchResultsFilter\n          allChecked={allChecked}\n          canDelete={hasEditPermissionInFolders && canDelete}\n          canMove={hasEditPermissionInFolders && canMove}\n          deleteItem={onItemDelete}\n          moveTo={onMoveTo}\n          onToggleAllChecked={onToggleAllChecked}\n          onStarredFilterChange={onStarredFilterChange}\n          onSortChange={onSortChange}\n          onTagFilterChange={onTagFilterChange}\n          query={query}\n          hideLayout={!!folderUid}\n          onLayoutChange={onLayoutChange}\n          editable={hasEditPermissionInFolders}\n        />\n        <SearchResults\n          loading={loading}\n          results={results}\n          editable={hasEditPermissionInFolders}\n          onTagSelected={onTagAdd}\n          onToggleSection={onToggleSection}\n          onToggleChecked={onToggleChecked}\n          layout={query.layout}\n        />\n      </div>\n      <ConfirmDeleteModal\n        onDeleteItems={onDeleteItems}\n        results={results}\n        isOpen={isDeleteModalOpen}\n        onDismiss={() => setIsDeleteModalOpen(false)}\n      />\n      <MoveToFolderModal\n        onMoveItems={onMoveItems}\n        results={results}\n        isOpen={isMoveModalOpen}\n        onDismiss={() => setIsMoveModalOpen(false)}\n      />\n    </div>\n  );\n});\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      height: 100%;\n    `,\n    results: css`\n      display: flex;\n      flex-direction: column;\n      flex: 1;\n      height: 100%;\n      margin-top: ${theme.spacing.xl};\n    `,\n    spinner: css`\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      min-height: 200px;\n    `,\n  };\n});\n","var path = 'public/app/features/dashboard/components/DashboardSettings/template.html';\nvar html = \"<aside class=dashboard-settings__aside>\\n  <a href={{::section.url}} class=dashboard-settings__nav-item ng-class=\\\"{active: ctrl.viewId === section.id}\\\" ng-repeat=\\\"section in ctrl.sections\\\" aria-label={{ctrl.selectors.sectionItems(section.title)}}>\\n    <icon name=\\\"'{{::section.icon}}'\\\" style=margin-right:4px></icon>\\n    {{::section.title}}\\n  </a>\\n\\n  <div class=dashboard-settings__aside-actions>\\n    <div ng-show=ctrl.canSave>\\n      <save-dashboard-button getdashboard=ctrl.getDashboard aria-label=\\\"Dashboard settings aside actions Save button\\\"/>\\n    </div>\\n    <div ng-show=ctrl.canSaveAs>\\n      <save-dashboard-as-button getdashboard=ctrl.getDashboard aria-label=\\\"Dashboard settings aside actions Save as button\\\" variant=\\\"'secondary'\\\"/>\\n    </div>\\n  </div>\\n</aside>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'settings'\\\">\\n  <h3 class=dashboard-settings__header aria-label={{::ctrl.selectors.title}}>\\n    General\\n  </h3>\\n\\n  <div class=gf-form-group>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-7\\\">Name</label>\\n      <input type=text class=\\\"gf-form-input width-30\\\" ng-model=ctrl.dashboard.title>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-7\\\">Description</label>\\n      <input type=text class=\\\"gf-form-input width-30\\\" ng-model=ctrl.dashboard.description>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-7\\\">\\n        Tags\\n        <info-popover mode=right-normal>Press enter to add a tag</info-popover>\\n      </label>\\n      <bootstrap-tagsinput ng-model=ctrl.dashboard.tags tagclass=\\\"label label-tag\\\" placeholder=\\\"add tags\\\">\\n      </bootstrap-tagsinput>\\n    </div>\\n    <folder-picker initial-title=ctrl.dashboard.meta.folderTitle initial-folder-id=ctrl.dashboard.meta.folderId on-change=ctrl.onFolderChange enable-create-new=true is-valid-selection=true label-class=width-7 dashboard-id=ctrl.dashboard.id>\\n    </folder-picker>\\n    <gf-form-switch class=gf-form label=Editable tooltip=\\\"Uncheck, then save and reload to disable all dashboard editing\\\" checked=ctrl.dashboard.editable label-class=width-7>\\n    </gf-form-switch>\\n  </div>\\n\\n  <time-picker-settings getdashboard=ctrl.getDashboard ontimezonechange=ctrl.onTimeZoneChange onrefreshintervalchange=ctrl.onRefreshIntervalChange onnowdelaychange=ctrl.onNowDelayChange onhidetimepickerchange=ctrl.onHideTimePickerChange></time-picker-settings>\\n\\n  <h5 class=section-heading>Panel Options</h5>\\n  <div class=gf-form>\\n    <label class=\\\"gf-form-label width-11\\\">\\n      Graph Tooltip\\n      <info-popover mode=right-normal>\\n        Cycle between options using Shortcut: CTRL+O or CMD+O\\n      </info-popover>\\n    </label>\\n    <div class=gf-form-select-wrapper>\\n      <select ng-model=ctrl.dashboard.graphTooltip class=gf-form-input ng-options=\\\"f.value as f.text for f in [{value: 0, text: 'Default'}, {value: 1, text: 'Shared crosshair'},{value: 2, text: 'Shared Tooltip'}]\\\"></select>\\n    </div>\\n  </div>\\n  <div class=gf-form-button-row>\\n    <button class=\\\"btn btn-danger\\\" ng-click=ctrl.deleteDashboard() ng-show=ctrl.canDelete aria-label=\\\"Dashboard settings page delete dashboard button\\\">\\n      Delete Dashboard\\n    </button>\\n  </div>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'annotations'\\\" ng-include=\\\"'public/app/features/annotations/partials/editor.html'\\\">\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'templating' && ctrl.useAngularTemplating\\\" ng-include=\\\"'public/app/features/templating/partials/editor.html'\\\">\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'templating' && !ctrl.useAngularTemplating\\\">\\n  <variable-editor-container/>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'links'\\\">\\n  <dash-links-editor dashboard=ctrl.dashboard></dash-links-editor>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'versions'\\\">\\n  <gf-dashboard-history dashboard=dashboard></gf-dashboard-history>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'dashboard_json'\\\">\\n  <h3 class=dashboard-settings__header>JSON Model</h3>\\n  <div class=dashboard-settings__subheader>\\n    The JSON Model below is data structure that defines the dashboard. Including settings, panel settings & layout,\\n    queries etc.\\n  </div>\\n\\n  <div class=gf-form>\\n    <code-editor content=ctrl.json data-mode=json data-max-lines=30></code-editor>\\n  </div>\\n\\n  <div class=gf-form-button-row>\\n    <button class=\\\"btn btn-primary\\\" ng-click=ctrl.saveDashboardJson() ng-show=ctrl.canSave>\\n      Save Changes\\n    </button>\\n  </div>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'permissions'\\\">\\n  <dashboard-permissions ng-if=\\\"ctrl.dashboard && !ctrl.hasUnsavedFolderChange\\\" dashboardid=ctrl.dashboard.id backendsrv=ctrl.backendSrv folder=ctrl.getFolder() />\\n  <div ng-if=ctrl.hasUnsavedFolderChange>\\n    <h5>You have changed folder, please save to view permissions.</h5>\\n  </div>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === '404'\\\">\\n  <h3 class=dashboard-settings__header>Settings view not found</h3>\\n\\n  <div>\\n    <h5>The settings page could not be found or you do not have permission to access it</h5>\\n  </div>\\n</div>\\n\\n<div class=dashboard-settings__content ng-if=\\\"ctrl.viewId === 'make_editable'\\\">\\n  <h3 class=dashboard-settings__header>Make Editable</h3>\\n\\n  <button class=\\\"btn btn-primary\\\" ng-click=ctrl.makeEditable()>\\n    Make Editable\\n  </button>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","/**\n * A library containing the different design components of the Grafana ecosystem.\n *\n * @packageDocumentation\n */\nexport * from './components';\nexport * from './types';\nexport * from './utils';\nexport * from './themes';\nexport * from './slate-plugins';\n\n// Exposes standard editors for registries of optionsUi config and panel options UI\nexport { getStandardFieldConfigs, getStandardOptionEditors } from './utils//standardEditors';\n","// Libraries\nimport { Observable, of, timer, merge, from } from 'rxjs';\nimport { flatten, map as lodashMap, isArray, isString } from 'lodash';\nimport { map, catchError, takeUntil, mapTo, share, finalize, tap } from 'rxjs/operators';\n// Utils & Services\nimport { backendSrv } from 'app/core/services/backend_srv';\n// Types\nimport {\n  DataSourceApi,\n  DataQueryRequest,\n  PanelData,\n  DataQueryResponse,\n  DataQueryResponseData,\n  DataQueryError,\n  LoadingState,\n  dateMath,\n  toDataFrame,\n  DataFrame,\n  guessFieldTypes,\n} from '@grafana/data';\nimport { toDataQueryError } from '@grafana/runtime';\nimport { emitDataRequestEvent } from './analyticsProcessor';\nimport { ExpressionDatasourceID, expressionDatasource } from 'app/features/expressions/ExpressionDatasource';\n\ntype MapOfResponsePackets = { [str: string]: DataQueryResponse };\n\ninterface RunningQueryState {\n  packets: { [key: string]: DataQueryResponse };\n  panelData: PanelData;\n}\n\n/*\n * This function should handle composing a PanelData from multiple responses\n */\nexport function processResponsePacket(packet: DataQueryResponse, state: RunningQueryState): RunningQueryState {\n  const request = state.panelData.request;\n  const packets: MapOfResponsePackets = {\n    ...state.packets,\n  };\n\n  packets[packet.key || 'A'] = packet;\n\n  let loadingState = packet.state || LoadingState.Done;\n  let error: DataQueryError | undefined = undefined;\n\n  // Update the time range\n  const range = { ...request.range };\n  const timeRange = isString(range.raw.from)\n    ? {\n        from: dateMath.parse(range.raw.from, false),\n        to: dateMath.parse(range.raw.to, true),\n        raw: range.raw,\n      }\n    : range;\n\n  const combinedData = flatten(\n    lodashMap(packets, (packet: DataQueryResponse) => {\n      if (packet.error) {\n        loadingState = LoadingState.Error;\n        error = packet.error;\n      }\n      return packet.data;\n    })\n  );\n\n  const panelData = {\n    state: loadingState,\n    series: combinedData,\n    error,\n    request,\n    timeRange,\n  };\n\n  return { packets, panelData };\n}\n\n/**\n * This function handles the excecution of requests & and processes the single or multiple response packets into\n * a combined PanelData response.\n * It will\n *  * Merge multiple responses into a single DataFrame array based on the packet key\n *  * Will emit a loading state if no response after 50ms\n *  * Cancel any still running network requests on unsubscribe (using request.requestId)\n */\nexport function runRequest(datasource: DataSourceApi, request: DataQueryRequest): Observable<PanelData> {\n  let state: RunningQueryState = {\n    panelData: {\n      state: LoadingState.Loading,\n      series: [],\n      request: request,\n      timeRange: request.range,\n    },\n    packets: {},\n  };\n\n  // Return early if there are no queries to run\n  if (!request.targets.length) {\n    request.endTime = Date.now();\n    state.panelData.state = LoadingState.Done;\n    return of(state.panelData);\n  }\n\n  const dataObservable = callQueryMethod(datasource, request).pipe(\n    // Transform response packets into PanelData with merged results\n    map((packet: DataQueryResponse) => {\n      if (!isArray(packet.data)) {\n        throw new Error(`Expected response data to be array, got ${typeof packet.data}.`);\n      }\n\n      request.endTime = Date.now();\n\n      state = processResponsePacket(packet, state);\n\n      return state.panelData;\n    }),\n    // handle errors\n    catchError(err =>\n      of({\n        ...state.panelData,\n        state: LoadingState.Error,\n        error: toDataQueryError(err),\n      })\n    ),\n    tap(emitDataRequestEvent(datasource)),\n    // finalize is triggered when subscriber unsubscribes\n    // This makes sure any still running network requests are cancelled\n    finalize(cancelNetworkRequestsOnUnsubscribe(request)),\n    // this makes it possible to share this observable in takeUntil\n    share()\n  );\n\n  // If 50ms without a response emit a loading state\n  // mapTo will translate the timer event into state.panelData (which has state set to loading)\n  // takeUntil will cancel the timer emit when first response packet is received on the dataObservable\n  return merge(timer(200).pipe(mapTo(state.panelData), takeUntil(dataObservable)), dataObservable);\n}\n\nfunction cancelNetworkRequestsOnUnsubscribe(req: DataQueryRequest) {\n  return () => {\n    backendSrv.resolveCancelerIfExists(req.requestId);\n  };\n}\n\nexport function callQueryMethod(datasource: DataSourceApi, request: DataQueryRequest) {\n  // If any query has an expression, use the expression endpoint\n  for (const target of request.targets) {\n    if (target.datasource === ExpressionDatasourceID) {\n      return expressionDatasource.query(request);\n    }\n  }\n\n  // Otherwise it is a standard datasource request\n  const returnVal = datasource.query(request);\n  return from(returnVal);\n}\n\n/**\n * All panels will be passed tables that have our best guess at colum type set\n *\n * This is also used by PanelChrome for snapshot support\n */\nexport function getProcessedDataFrames(results?: DataQueryResponseData[]): DataFrame[] {\n  if (!isArray(results)) {\n    return [];\n  }\n\n  const dataFrames: DataFrame[] = [];\n\n  for (const result of results) {\n    const dataFrame = guessFieldTypes(toDataFrame(result));\n\n    // clear out the cached info\n    for (const field of dataFrame.fields) {\n      field.state = null;\n    }\n\n    dataFrames.push(dataFrame);\n  }\n\n  return dataFrames;\n}\n\nexport function preProcessPanelData(data: PanelData, lastResult: PanelData): PanelData {\n  const { series } = data;\n\n  //  for loading states with no data, use last result\n  if (data.state === LoadingState.Loading && series.length === 0) {\n    if (!lastResult) {\n      lastResult = data;\n    }\n\n    return { ...lastResult, state: LoadingState.Loading };\n  }\n\n  // Make sure the data frames are properly formatted\n  const STARTTIME = performance.now();\n  const processedDataFrames = getProcessedDataFrames(series);\n  const STOPTIME = performance.now();\n\n  return {\n    ...data,\n    series: processedDataFrames,\n    timings: { dataProcessingTime: STOPTIME - STARTTIME },\n  };\n}\n","/* ===================================================\n * bootstrap-transition.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#transitions\n * ===================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n   * ======================================================= */\n\n  $(function () {\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-alert.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#alerts\n * ==========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n/* ============================================================\n * bootstrap-dropdown.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#dropdowns\n * ============================================================\n * Copyright 2013 Twitter, 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\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        if ('ontouchstart' in document.documentElement) {\n          // if mobile we we use a backdrop because click events don't delegate\n          $('<div class=\"dropdown-backdrop\"/>').insertBefore($(this)).on('click', clearMenus)\n        }\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) {\n        if (e.which == 27) $parent.find(toggle).focus()\n        return $this.click()\n      }\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $('.dropdown-backdrop').remove()\n    $(toggle).each(function () {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      // grafana backport fix from bootstrap 3\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = selector && $(selector)\n\n    if (!$parent || !$parent.length) $parent = $this.parent()\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n /* DROPDOWN NO CONFLICT\n  * ==================== */\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api', clearMenus)\n    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n/* =========================================================\n * bootstrap-modal.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#modals\n * =========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element.show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :\n            that.$element.focus().trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function () {\n        var that = this\n        this.$element.hide()\n        this.backdrop(function () {\n          that.removeBackdrop()\n          that.$element.trigger('hidden')\n        })\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop && this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          this.$backdrop.click(\n            this.options.backdrop == 'static' ?\n              $.proxy(this.$element[0].focus, this.$element[0])\n            : $.proxy(this.hide, this)\n          )\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          if (!callback) return\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL NO CONFLICT\n  * ================= */\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(document).on('click.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this = $(this)\n      , href = $this.attr('href')\n      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option)\n      .one('hide', function () {\n        $this.focus()\n      })\n  })\n\n}(window.jQuery);\n/* ===========================================================\n * bootstrap-tooltip.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n        , triggers\n        , trigger\n        , i\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      triggers = this.options.trigger.split(' ')\n\n      for (i = triggers.length; i--;) {\n        trigger = triggers[i]\n        if (trigger == 'click') {\n          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n        } else if (trigger != 'manual') {\n          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'\n          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n        }\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var defaults = $.fn[this.type].defaults\n        , options = {}\n        , self\n\n      this._options && $.each(this._options, function (key, value) {\n        if (defaults[key] != value) options[key] = value\n      }, this)\n\n      self = $(e.currentTarget)[this.type](options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n        , e = $.Event('show')\n\n      if (this.hasContent() && this.enabled) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        $tip\n          .detach()\n          .css({ top: 0, left: 0, display: 'block' })\n\n        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n        pos = this.getPosition()\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n\n          // extend placements (top)\n          case 'topLeft':\n            tp = {top: pos.top - actualHeight,  left: pos.left + pos.width / 2 - (actualWidth * .10)};\n            break;\n          case 'topRight':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - (actualWidth * .90)};\n            break;\n\n          // extend placements (right)\n          case 'rightTop':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight *.10), left: pos.left + pos.width};\n            break;\n          case 'rightBottom':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight * .90), left: pos.left + pos.width};\n            break;\n\n          // extend placements (bottom)\n          case 'bottomLeft':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - (actualWidth * .10)};\n            break;\n          case 'bottomRight':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - (actualWidth * .90)};\n            break;\n\n          // extend placements (left)\n          case 'leftTop':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight *.10), left: pos.left - actualWidth};\n            break;\n          case 'leftBottom':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight * .90), left: pos.left - actualWidth};\n            break;\n\n\n        }\n\n        this.applyPlacement(tp, placement)\n        this.$element.trigger('shown')\n      }\n    }\n\n  , applyPlacement: function(offset, placement){\n      var $tip = this.tip()\n        , width = $tip[0].offsetWidth\n        , height = $tip[0].offsetHeight\n        , actualWidth\n        , actualHeight\n        , delta\n        , replace\n\n      $tip\n        .offset(offset)\n        .addClass(placement)\n        .addClass('in')\n\n      actualWidth = $tip[0].offsetWidth\n      actualHeight = $tip[0].offsetHeight\n\n      if (placement == 'top' && actualHeight != height) {\n        offset.top = offset.top + height - actualHeight\n        replace = true\n      }\n\n      if (placement == 'bottom' || placement == 'top') {\n        delta = 0\n\n        if (offset.left < 0){\n          delta = offset.left * -2\n          offset.left = 0\n          $tip.offset(offset)\n          actualWidth = $tip[0].offsetWidth\n          actualHeight = $tip[0].offsetHeight\n        }\n\n        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n      } else {\n        this.replaceArrow(actualHeight - height, actualHeight, 'top')\n      }\n\n      if (replace) $tip.offset(offset)\n    }\n\n  , replaceArrow: function(delta, dimension, position){\n      this\n        .arrow()\n        .css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n        , e = $.Event('hide')\n\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).detach()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.detach()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.detach()\n\n      this.$element.trigger('hidden')\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function () {\n      var el = this.$element[0]\n      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n        width: el.offsetWidth\n      , height: el.offsetHeight\n      }, this.$element.offset())\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , arrow: function(){\n      return this.$arrow = this.$arrow || this.tip().find(\".tooltip-arrow\")\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function (e) {\n      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this\n      self.tip().hasClass('in') ? self.hide() : self.show()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n\n /* TOOLTIP NO CONFLICT\n  * =================== */\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================\n * bootstrap-tab.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tabs\n * ========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active:last a')[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n /* TAB NO CONFLICT\n  * =============== */\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n /* TAB DATA-API\n  * ============ */\n\n  $(document).on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-typeahead.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#typeahead\n * =============================================================\n * Copyright 2013 Twitter, 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\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.source = this.options.source\n    this.$menu = $(this.options.menu)\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n    // CHANGE (rashidkpc) If nothing is selected, use existing value\n      var val = this.$menu.find('.active').attr('data-value') || this.$element.val();\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.position(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu\n        .insertAfter(this.$element)\n        .css({\n          top: pos.top + pos.height\n        , left: pos.left\n        })\n        .show()\n\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n    , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      if (!query) {\n        return item;\n      }\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      });\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      // CHANGE (rashidpc) Do not select first element by default\n      // items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('focus',    $.proxy(this.focus, this))\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if (this.eventSupported('keydown')) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))\n    },\n\n    destroy: function () {\n      this.$element.off().removeData('typeahead');\n      this.$menu.off();\n    }\n\n  , eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;')\n        isSupported = typeof this.$element[eventName] === 'function'\n      }\n      return isSupported\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      // grafana change, shift+left parenthesis\n      if (e.shiftKey && e.keyCode === 40) {\n        return;\n      }\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27,57])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup();\n      }\n\n      if(e.keyCode === 13 && typeof this.$menu.find('.active').attr('data-value') === 'undefined') {\n        // CHANGE (rashidkpc). Enter was hit, nothing was selected from typeahead, submit form\n        this.$element.submit();\n      } else {\n        e.stopPropagation()\n        e.preventDefault()\n      }\n\n  }\n\n  , focus: function (e) {\n      this.focused = true\n    }\n\n  , blur: function (e) {\n      this.focused = false\n      if (!this.mousedover && this.shown) this.hide()\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n      this.$element.focus()\n    }\n\n  , mouseenter: function (e) {\n      this.mousedover = true\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  , mouseleave: function (e) {\n      this.mousedover = false\n      if (!this.focused && this.shown) this.hide()\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  var old = $.fn.typeahead\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n /* TYPEAHEAD NO CONFLICT\n  * =================== */\n\n  $.fn.typeahead.noConflict = function () {\n    $.fn.typeahead = old\n    return this\n  }\n\n\n /* TYPEAHEAD DATA-API\n  * ================== */\n\n  $(document).on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n    var $this = $(this)\n    if ($this.data('typeahead')) return\n    $this.typeahead($this.data())\n  })\n\n}(window.jQuery);\n/* ==========================================================\n * bootstrap-affix.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#affix\n * ==========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window)\n      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n /* AFFIX NO CONFLICT\n  * ================= */\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);\n","(function($) {\n    \"use strict\";\n\n    var options = {\n        series: {\n            fillBelowTo: null\n        }\n    };\n\n    function init(plot) {\n        function findBelowSeries( series, allseries ) {\n\n            var i;\n\n            for ( i = 0; i < allseries.length; ++i ) {\n                if ( allseries[ i ].id === series.fillBelowTo ) {\n                    return allseries[ i ];\n                }\n            }\n\n            return null;\n        }\n\n        /* top and bottom doesn't actually matter for this, we're just using it to help make this easier to think about */\n        /* this is a vector cross product operation */\n        function segmentIntersection(top_left_x, top_left_y, top_right_x, top_right_y, bottom_left_x, bottom_left_y, bottom_right_x, bottom_right_y) {\n            var top_delta_x, top_delta_y, bottom_delta_x, bottom_delta_y,\n                s, t;\n\n            top_delta_x = top_right_x - top_left_x;\n            top_delta_y = top_right_y - top_left_y;\n            bottom_delta_x = bottom_right_x - bottom_left_x;\n            bottom_delta_y = bottom_right_y - bottom_left_y;\n\n            s = (\n                (-top_delta_y * (top_left_x - bottom_left_x)) + (top_delta_x * (top_left_y - bottom_left_y))\n            ) / (\n                -bottom_delta_x * top_delta_y + top_delta_x * bottom_delta_y\n            );\n\n            t = (\n                (bottom_delta_x * (top_left_y - bottom_left_y)) - (bottom_delta_y * (top_left_x - bottom_left_x))\n            ) / (\n                -bottom_delta_x * top_delta_y + top_delta_x * bottom_delta_y\n            );\n\n            // Collision detected\n            if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n                return [\n                    top_left_x + (t * top_delta_x), // X\n                    top_left_y + (t * top_delta_y) // Y\n                ];\n            }\n\n            // No collision\n            return null;\n        }\n\n        function plotDifferenceArea(plot, ctx, series) {\n            if ( series.fillBelowTo === null ) {\n                return;\n            }\n\n            var otherseries,\n\n                ps,\n                points,\n\n                otherps,\n                otherpoints,\n\n                plotOffset,\n                fillStyle;\n\n            function openPolygon(x, y) {\n                ctx.beginPath();\n                ctx.moveTo(\n                    series.xaxis.p2c(x) + plotOffset.left,\n                    series.yaxis.p2c(y) + plotOffset.top\n                );\n\n            }\n\n            function closePolygon() {\n                ctx.closePath();\n                ctx.fill();\n            }\n\n            function validateInput() {\n                if (points.length/ps !== otherpoints.length/otherps) {\n                    console.error(\"Refusing to graph inconsistent number of points\");\n                    return false;\n                }\n\n                var i;\n                for (i = 0; i < (points.length / ps); i++) {\n                    if (\n                        points[i * ps] !== null &&\n                        otherpoints[i * otherps] !== null &&\n                        points[i * ps] !== otherpoints[i * otherps]\n                    ) {\n                        console.error(\"Refusing to graph points without matching value\");\n                        return false;\n                    }\n                }\n\n                return true;\n            }\n\n            function findNextStart(start_i, end_i) {\n                console.assert(end_i > start_i, \"expects the end index to be greater than the start index\");\n\n                var start = (\n                        start_i === 0 ||\n                        points[start_i - 1] === null ||\n                        otherpoints[start_i - 1] === null\n                    ),\n                    equal = false,\n                    i,\n                    intersect;\n\n                for (i = start_i; i < end_i; i++) {\n                    // Take note of null points\n                    if (\n                        points[(i * ps) + 1] === null ||\n                        otherpoints[(i * ps) + 1] === null\n                    ) {\n                        equal = false;\n                        start = true;\n                    }\n\n                    // Take note of equal points\n                    else if (points[(i * ps) + 1] === otherpoints[(i * otherps) + 1]) {\n                        equal = true;\n                        start = false;\n                    }\n\n\n                    else if (points[(i * ps) + 1] > otherpoints[(i * otherps) + 1]) {\n                        // If we begin above the desired point\n                        if (start) {\n                            openPolygon(points[i * ps], points[(i * ps) + 1]);\n                        }\n\n                        // If an equal point preceeds this, start the polygon at that equal point\n                        else if (equal) {\n                            openPolygon(points[(i - 1) * ps], points[((i - 1) * ps) + 1]);\n                        }\n\n                        // Otherwise, find the intersection point, and start it there\n                        else {\n                            intersect = intersectionPoint(i);\n                            openPolygon(intersect[0], intersect[1]);\n                        }\n\n                        topTraversal(i, end_i);\n                        return;\n                    }\n\n                    // If we go below equal, equal at any preceeding point is irrelevant\n                    else {\n                        start = false;\n                        equal = false;\n                    }\n                }\n            }\n\n            function intersectionPoint(right_i) {\n                console.assert(right_i > 0, \"expects the second point in the series line segment\");\n\n                var i, intersect;\n\n                for (i = 1; i < (otherpoints.length/otherps); i++) {\n                    intersect = segmentIntersection(\n                        points[(right_i - 1) * ps], points[((right_i - 1) * ps) + 1],\n                        points[right_i * ps], points[(right_i * ps) + 1],\n\n                        otherpoints[(i - 1) * otherps], otherpoints[((i - 1) * otherps) + 1],\n                        otherpoints[i * otherps], otherpoints[(i * otherps) + 1]\n                    );\n\n                    if (intersect !== null) {\n                        return intersect;\n                    }\n                }\n\n                console.error(\"intersectionPoint() should only be called when an intersection happens\");\n            }\n\n            function bottomTraversal(start_i, end_i) {\n                console.assert(start_i >= end_i, \"the start should be the rightmost point, and the end should be the leftmost (excluding the equal or intersecting point)\");\n\n                var i;\n\n                for (i = start_i; i >= end_i; i--) {\n                    ctx.lineTo(\n                        otherseries.xaxis.p2c(otherpoints[i * otherps]) + plotOffset.left,\n                        otherseries.yaxis.p2c(otherpoints[(i * otherps) + 1]) + plotOffset.top\n                    );\n                }\n\n                closePolygon();\n            }\n\n            function topTraversal(start_i, end_i) {\n                console.assert(start_i <= end_i, \"the start should be the rightmost point, and the end should be the leftmost (excluding the equal or intersecting point)\");\n\n                var i,\n                    intersect;\n\n                for (i = start_i; i < end_i; i++) {\n                    if (points[(i * ps) + 1] === null && i > start_i) {\n                        bottomTraversal(i - 1, start_i);\n                        findNextStart(i, end_i);\n                        return;\n                    }\n\n                    else if (points[(i * ps) + 1] === otherpoints[(i * otherps) + 1]) {\n                        bottomTraversal(i, start_i);\n                        findNextStart(i, end_i);\n                        return;\n                    }\n\n                    else if (points[(i * ps) + 1] < otherpoints[(i * otherps) + 1]) {\n                        intersect = intersectionPoint(i);\n                        ctx.lineTo(\n                            series.xaxis.p2c(intersect[0]) + plotOffset.left,\n                            series.yaxis.p2c(intersect[1]) + plotOffset.top\n                        );\n                        bottomTraversal(i, start_i);\n                        findNextStart(i, end_i);\n                        return;\n\n                    }\n\n                    else {\n                        ctx.lineTo(\n                            series.xaxis.p2c(points[i * ps]) + plotOffset.left,\n                            series.yaxis.p2c(points[(i * ps) + 1]) + plotOffset.top\n                        );\n                    }\n                }\n\n                bottomTraversal(end_i, start_i);\n            }\n\n\n            // Begin processing\n\n            otherseries = findBelowSeries( series, plot.getData() );\n\n            if ( !otherseries ) {\n                return;\n            }\n\n            ps = series.datapoints.pointsize;\n            points = series.datapoints.points;\n            otherps = otherseries.datapoints.pointsize;\n            otherpoints = otherseries.datapoints.points;\n            plotOffset = plot.getPlotOffset();\n\n            if (!validateInput()) {\n                return;\n            }\n\n\n            // Flot's getFillStyle() should probably be exposed somewhere\n            fillStyle = $.color.parse(series.color);\n            fillStyle.a = 0.4;\n            fillStyle.normalize();\n            ctx.fillStyle = fillStyle.toString();\n\n\n            // Begin recursive bi-directional traversal\n            findNextStart(0, points.length/ps);\n        }\n\n        plot.hooks.drawSeries.push(plotDifferenceArea);\n    }\n\n    $.plot.plugins.push({\n        init: init,\n        options: options,\n        name: \"fillbelow\",\n        version: \"0.1.0\"\n    });\n\n})(jQuery);\n","export type MutateStateFunc<S> = (state: S) => S;\n\nexport const applyStateChanges = <S>(state: S, ...args: Array<MutateStateFunc<S>>): S => {\n  return args.reduce((all, cur) => {\n    return cur(all);\n  }, state);\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { cloneDeep, isString, trim } from 'lodash';\nimport { VariableOption, VariableTag, VariableWithMultiSupport } from '../../../templating/types';\nimport { ALL_VARIABLE_VALUE } from '../../state/types';\nimport { isQuery } from '../../guard';\nimport { applyStateChanges } from '../../../../core/utils/applyStateChanges';\nimport { containsSearchFilter } from '../../../templating/utils';\n\nexport interface ToggleOption {\n  option: VariableOption;\n  forceSelect: boolean;\n  clearOthers: boolean;\n}\n\nexport interface OptionsPickerState {\n  id: string;\n  selectedValues: VariableOption[];\n  selectedTags: VariableTag[];\n  queryValue: string | null;\n  highlightIndex: number;\n  tags: VariableTag[];\n  options: VariableOption[];\n  multi: boolean;\n}\n\nexport const initialState: OptionsPickerState = {\n  id: '',\n  highlightIndex: -1,\n  queryValue: null,\n  selectedTags: [],\n  selectedValues: [],\n  tags: [],\n  options: [],\n  multi: false,\n};\n\nexport const OPTIONS_LIMIT = 1000;\n\nconst getTags = (model: VariableWithMultiSupport) => {\n  if (isQuery(model) && Array.isArray(model.tags)) {\n    return cloneDeep(model.tags);\n  }\n  return [];\n};\n\nconst optionsToRecord = (options: VariableOption[]): Record<string, VariableOption> => {\n  if (!Array.isArray(options)) {\n    return {};\n  }\n\n  return options.reduce((all: Record<string, VariableOption>, option) => {\n    if (isString(option.value)) {\n      all[option.value] = option;\n    }\n    return all;\n  }, {});\n};\n\nconst updateOptions = (state: OptionsPickerState): OptionsPickerState => {\n  if (!Array.isArray(state.options)) {\n    state.options = [];\n    return state;\n  }\n\n  const selectedOptions = optionsToRecord(state.selectedValues);\n  state.selectedValues = Object.values(selectedOptions);\n\n  state.options = state.options.map(option => {\n    if (!isString(option.value)) {\n      return option;\n    }\n\n    const selected = !!selectedOptions[option.value];\n\n    if (option.selected === selected) {\n      return option;\n    }\n\n    return { ...option, selected };\n  });\n  return state;\n};\n\nconst applyLimit = (options: VariableOption[]): VariableOption[] => {\n  if (!Array.isArray(options)) {\n    return [];\n  }\n  if (options.length <= OPTIONS_LIMIT) {\n    return options;\n  }\n  return options.slice(0, OPTIONS_LIMIT);\n};\n\nconst updateDefaultSelection = (state: OptionsPickerState): OptionsPickerState => {\n  const { options, selectedValues } = state;\n\n  if (options.length === 0 || selectedValues.length > 0) {\n    return state;\n  }\n\n  if (!options[0] || options[0].value !== ALL_VARIABLE_VALUE) {\n    return state;\n  }\n\n  state.selectedValues = [{ ...options[0], selected: true }];\n  return state;\n};\n\nconst updateAllSelection = (state: OptionsPickerState): OptionsPickerState => {\n  const { selectedValues } = state;\n  if (selectedValues.length > 1) {\n    state.selectedValues = selectedValues.filter(option => option.value !== ALL_VARIABLE_VALUE);\n  }\n  return state;\n};\n\nconst optionsPickerSlice = createSlice({\n  name: 'templating/optionsPicker',\n  initialState,\n  reducers: {\n    showOptions: (state, action: PayloadAction<VariableWithMultiSupport>): OptionsPickerState => {\n      const { query, options, multi } = action.payload;\n\n      state.highlightIndex = -1;\n      state.options = cloneDeep(options);\n      state.tags = getTags(action.payload);\n      state.multi = multi ?? false;\n      state.id = action.payload.id!;\n      state.queryValue = '';\n\n      if (isQuery(action.payload)) {\n        const { queryValue } = action.payload;\n        const queryHasSearchFilter = containsSearchFilter(query);\n        state.queryValue = queryHasSearchFilter && queryValue ? queryValue : '';\n      }\n\n      state.selectedValues = state.options.filter(option => option.selected);\n      return applyStateChanges(state, updateDefaultSelection, updateOptions);\n    },\n    hideOptions: (state, action: PayloadAction): OptionsPickerState => {\n      return { ...initialState };\n    },\n    toggleOption: (state, action: PayloadAction<ToggleOption>): OptionsPickerState => {\n      const { option, clearOthers, forceSelect } = action.payload;\n      const { multi, selectedValues } = state;\n      const selected = !selectedValues.find(o => o.value === option.value);\n\n      if (option.value === ALL_VARIABLE_VALUE || !multi || clearOthers) {\n        if (selected || forceSelect) {\n          state.selectedValues = [{ ...option, selected: true }];\n        } else {\n          state.selectedValues = [];\n        }\n        return applyStateChanges(state, updateDefaultSelection, updateAllSelection, updateOptions);\n      }\n\n      if (forceSelect || selected) {\n        state.selectedValues.push({ ...option, selected: true });\n        return applyStateChanges(state, updateDefaultSelection, updateAllSelection, updateOptions);\n      }\n\n      state.selectedValues = selectedValues.filter(o => o.value !== option.value);\n      return applyStateChanges(state, updateDefaultSelection, updateAllSelection, updateOptions);\n    },\n    toggleTag: (state, action: PayloadAction<VariableTag>): OptionsPickerState => {\n      const tag = action.payload;\n      const values = tag.values || [];\n      const selected = !tag.selected;\n\n      state.tags = state.tags.map(t => {\n        if (t.text !== tag.text) {\n          return t;\n        }\n\n        t.selected = selected;\n        t.values = values;\n\n        if (selected) {\n          t.valuesText = values.join(' + ');\n        } else {\n          delete t.valuesText;\n        }\n\n        return t;\n      });\n\n      const availableOptions = optionsToRecord(state.options);\n\n      if (!selected) {\n        state.selectedValues = state.selectedValues.filter(\n          option => !isString(option.value) || !availableOptions[option.value]\n        );\n        return applyStateChanges(state, updateDefaultSelection, updateOptions);\n      }\n\n      const optionsFromTag = values\n        .filter(value => value !== ALL_VARIABLE_VALUE && !!availableOptions[value])\n        .map(value => ({ selected, value, text: value }));\n\n      state.selectedValues.push.apply(state.selectedValues, optionsFromTag);\n      return applyStateChanges(state, updateDefaultSelection, updateOptions);\n    },\n    moveOptionsHighlight: (state, action: PayloadAction<number>): OptionsPickerState => {\n      let nextIndex = state.highlightIndex + action.payload;\n\n      if (nextIndex < 0) {\n        nextIndex = 0;\n      } else if (nextIndex >= state.options.length) {\n        nextIndex = state.options.length - 1;\n      }\n\n      return {\n        ...state,\n        highlightIndex: nextIndex,\n      };\n    },\n    toggleAllOptions: (state, action: PayloadAction): OptionsPickerState => {\n      if (state.selectedValues.length > 0) {\n        state.selectedValues = [];\n        return applyStateChanges(state, updateOptions);\n      }\n\n      state.selectedValues = state.options.map(option => ({\n        ...option,\n        selected: true,\n      }));\n\n      return applyStateChanges(state, updateOptions);\n    },\n    updateSearchQuery: (state, action: PayloadAction<string>): OptionsPickerState => {\n      state.queryValue = action.payload;\n      return state;\n    },\n    updateOptionsAndFilter: (state, action: PayloadAction<VariableOption[]>): OptionsPickerState => {\n      const searchQuery = trim((state.queryValue ?? '').toLowerCase());\n\n      const filteredOptions = action.payload.filter(option => {\n        const text = Array.isArray(option.text) ? option.text.toString() : option.text;\n        return text.toLowerCase().indexOf(searchQuery) !== -1;\n      });\n\n      state.options = applyLimit(filteredOptions);\n      state.highlightIndex = 0;\n\n      return applyStateChanges(state, updateDefaultSelection, updateOptions);\n    },\n    updateOptionsFromSearch: (state, action: PayloadAction<VariableOption[]>): OptionsPickerState => {\n      state.options = applyLimit(action.payload);\n      state.highlightIndex = 0;\n\n      return applyStateChanges(state, updateDefaultSelection, updateOptions);\n    },\n  },\n});\n\nexport const {\n  toggleOption,\n  showOptions,\n  hideOptions,\n  toggleTag,\n  moveOptionsHighlight,\n  toggleAllOptions,\n  updateSearchQuery,\n  updateOptionsAndFilter,\n  updateOptionsFromSearch,\n} = optionsPickerSlice.actions;\n\nexport const optionsPickerReducer = optionsPickerSlice.reducer;\n","var path = 'public/app/features/playlist/partials/playlist.html';\nvar html = \"<page-header model=ctrl.navModel></page-header>\\n\\n<div class=\\\"page-container page-body\\\" ng-form=ctrl.playlistEditForm>\\n  <h3 class=page-sub-heading ng-hide=ctrl.isNew>Edit Playlist</h3>\\n  <h3 class=page-sub-heading ng-show=ctrl.isNew>New Playlist</h3>\\n\\n  <p class=playlist-description>\\n    A playlist rotates through a pre-selected list of Dashboards. A Playlist can be a great way to build situational\\n    awareness, or just show off your metrics to your team or visitors.\\n  </p>\\n\\n  <div class=gf-form-group>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-7\\\">Name</span>\\n      <input type=text required ng-model=ctrl.playlist.name class=\\\"gf-form-input max-width-21\\\"/>\\n    </div>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-7\\\">Interval</span>\\n      <input type=text required ng-model=ctrl.playlist.interval placeholder=5m class=\\\"gf-form-input max-width-21\\\"/>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h3 class=page-headering>Dashboards</h3>\\n\\n    <table class=\\\"filter-table playlist-available-list\\\">\\n      <tr ng-repeat=\\\"playlistItem in ctrl.playlistItems\\\">\\n        <td ng-if=\\\"playlistItem.type === 'dashboard_by_id'\\\">\\n          <icon name=\\\"'apps'\\\"></icon>&nbsp;&nbsp;{{playlistItem.title}}\\n        </td>\\n        <td ng-if=\\\"playlistItem.type === 'dashboard_by_tag'\\\">\\n          <a class=\\\"search-result-tag label label-tag\\\" tag-color-from-name=playlistItem.title>\\n            <icon name=\\\"'tag-alt'\\\"></icon>\\n            <span>{{playlistItem.title}}</span>\\n          </a>\\n        </td>\\n\\n        <td class=selected-playlistitem-settings>\\n          <button class=\\\"btn btn-inverse btn-small\\\" ng-hide=$first ng-click=ctrl.movePlaylistItemUp(playlistItem)>\\n            <icon name=\\\"'arrow-up'\\\"></icon>\\n          </button>\\n          <button class=\\\"btn btn-inverse btn-small\\\" ng-hide=$last ng-click=ctrl.movePlaylistItemDown(playlistItem)>\\n            <icon name=\\\"'arrow-down'\\\"></icon>\\n          </button>\\n          <button class=\\\"btn btn-inverse btn-small\\\" ng-click=ctrl.removePlaylistItem(playlistItem)>\\n            <icon name=\\\"'times'\\\"></icon>\\n          </button>\\n        </td>\\n      </tr>\\n      <tr ng-if=\\\"ctrl.playlistItems.length === 0\\\">\\n        <td><em>Playlist is empty, add dashboards below.</em></td>\\n      </tr>\\n    </table>\\n  </div>\\n\\n  <div class=gf-form-group>\\n    <h3 class=page-headering>Add dashboards</h3>\\n    <playlist-search class=playlist-search-container search-started=ctrl.searchStarted(promise)></playlist-search>\\n\\n    <div ng-if=\\\"ctrl.filteredDashboards.length > 0\\\">\\n      <table class=\\\"filter-table playlist-available-list\\\">\\n        <tr ng-repeat=\\\"playlistItem in ctrl.filteredDashboards\\\">\\n          <td>\\n            <icon name=\\\"'apps'\\\"></icon>\\n            &nbsp;&nbsp;{{playlistItem.title}}\\n            <icon name=\\\"'favorite'\\\" type=\\\"'mono'\\\" ng-show=playlistItem.isStarred></icon>\\n          </td>\\n          <td class=add-dashboard>\\n            <button class=\\\"btn btn-inverse btn-small pull-right\\\" ng-click=ctrl.addPlaylistItem(playlistItem)>\\n              <icon name=\\\"'plus'\\\"></icon>\\n              Add to playlist\\n            </button>\\n          </td>\\n        </tr>\\n      </table>\\n    </div>\\n    <div class=playlist-search-results-container ng-if=\\\"ctrl.filteredTags.length > 0;\\\">\\n      <table class=\\\"filter-table playlist-available-list\\\">\\n        <tr ng-repeat=\\\"tag in ctrl.filteredTags\\\">\\n          <td>\\n            <a class=\\\"search-result-tag label label-tag\\\" tag-color-from-name=tag.term>\\n              <icon name=\\\"'tag-alt'\\\"></icon>\\n              <span>{{tag.term}} &nbsp;({{tag.count}})</span>\\n            </a>\\n          </td>\\n          <td class=add-dashboard>\\n            <button class=\\\"btn btn-inverse btn-small pull-right\\\" ng-click=ctrl.addTagPlaylistItem(tag)>\\n              <icon name=\\\"'plus'\\\"></icon>\\n              Add to playlist\\n            </button>\\n          </td>\\n        </tr>\\n      </table>\\n    </div>\\n  </div>\\n\\n  <div class=clearfix></div>\\n\\n  <div class=gf-form-button-row>\\n    <a class=\\\"btn btn-primary\\\" ng-show=ctrl.isNew ng-disabled=\\\"ctrl.playlistEditForm.$invalid || ctrl.isPlaylistEmpty()\\\" ng-click=\\\"ctrl.savePlaylist(ctrl.playlist, ctrl.playlistItems)\\\">Create</a>\\n    <a class=\\\"btn btn-primary\\\" ng-show=!ctrl.isNew ng-disabled=\\\"ctrl.playlistEditForm.$invalid || ctrl.isPlaylistEmpty()\\\" ng-click=\\\"ctrl.savePlaylist(ctrl.playlist, ctrl.playlistItems)\\\">Save</a>\\n    <a class=btn-text ng-click=ctrl.backToList()>Cancel</a>\\n  </div>\\n</div>\\n\\n<footer/>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/panel/table-old/module.html';\nvar html = \"<div class=table-panel-container>\\n  <div class=table-panel-header-bg ng-show=ctrl.table.rows.length></div>\\n  <div class=table-panel-scroll ng-show=ctrl.table.rows.length>\\n    <table class=table-panel-table>\\n      <thead>\\n        <tr>\\n          <th ng-repeat=\\\"col in ctrl.table.columns\\\" ng-if=!col.hidden>\\n            <div class=\\\"table-panel-table-header-inner pointer\\\" ng-click=\\\"ctrl.toggleColumnSort(col, $index)\\\">\\n              {{col.title}}\\n              <span class=table-panel-table-header-controls ng-if=col.sort>\\n                <icon name=\\\"'angle-down'\\\" ng-show=col.desc></icon>\\n                <icon name=\\\"'angle-up'\\\" ng-hide=col.desc></icon>\\n              </span>\\n            </div>\\n          </th>\\n        </tr>\\n      </thead>\\n      <tbody></tbody>\\n    </table>\\n  </div>\\n</div>\\n<div class=datapoints-warning ng-show=\\\"ctrl.table.rows.length===0\\\">\\n  <span class=small> No data to show <tip>Nothing returned by data query</tip> </span>\\n</div>\\n<div class=table-panel-footer></div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import coreModule from 'app/core/core_module';\nimport config from 'app/core/config';\nimport _ from 'lodash';\nimport { NavModel } from '@grafana/data';\n\nexport class NavModelSrv {\n  navItems: any;\n\n  /** @ngInject */\n  constructor() {\n    this.navItems = config.bootData.navTree;\n  }\n\n  getCfgNode() {\n    return _.find(this.navItems, { id: 'cfg' });\n  }\n\n  getNav(...args: Array<string | number>) {\n    let children = this.navItems;\n    const nav = {\n      breadcrumbs: [],\n    } as NavModel;\n\n    for (const id of args) {\n      // if its a number then it's the index to use for main\n      if (_.isNumber(id)) {\n        nav.main = nav.breadcrumbs[id];\n        break;\n      }\n\n      const node: any = _.find(children, { id: id });\n      nav.breadcrumbs.push(node);\n      nav.node = node;\n      nav.main = node;\n      children = node.children;\n    }\n\n    if (nav.main.children) {\n      for (const item of nav.main.children) {\n        item.active = false;\n\n        if (item.url === nav.node.url) {\n          item.active = true;\n        }\n      }\n    }\n\n    return nav;\n  }\n\n  getNotFoundNav() {\n    return getNotFoundNav(); // the exported function\n  }\n}\n\nexport function getNotFoundNav(): NavModel {\n  return getWarningNav('Page not found', '404 Error');\n}\n\nexport function getWarningNav(text: string, subTitle?: string): NavModel {\n  const node = {\n    text,\n    subTitle,\n    icon: 'exclamation-triangle',\n  };\n  return {\n    breadcrumbs: [node],\n    node: node,\n    main: node,\n  };\n}\n\ncoreModule.service('navModelSrv', NavModelSrv);\n","import { parse, SearchParserResult } from 'search-query-parser';\nimport { IconName } from '@grafana/ui';\nimport { DashboardQuery, DashboardSection, DashboardSectionItem, SearchAction, UidsToDelete } from './types';\nimport { NO_ID_SECTIONS, SECTION_STORAGE_KEY } from './constants';\nimport { getDashboardSrv } from '../dashboard/services/DashboardSrv';\n\n/**\n * Check if folder has id. Only Recent and Starred folders are the ones without\n * ids so far, as they are created manually after results are fetched from API.\n * @param str\n */\nexport const hasId = (str: string) => {\n  return !NO_ID_SECTIONS.includes(str);\n};\n\n/**\n * Return ids for folders concatenated with their items ids, if section is expanded.\n * For items the id format is '{folderId}-{itemId}' to allow mapping them to their folders\n * @param sections\n */\nexport const getFlattenedSections = (sections: DashboardSection[]): string[] => {\n  return sections.flatMap(section => {\n    const id = hasId(section.title) ? String(section.id) : section.title;\n\n    if (section.expanded && section.items.length) {\n      return [id, ...section.items.map(item => `${id}-${item.id}`)];\n    }\n    return id;\n  });\n};\n\n/**\n * Get all items for currently expanded sections\n * @param sections\n */\nexport const getVisibleItems = (sections: DashboardSection[]) => {\n  return sections.flatMap(section => {\n    if (section.expanded) {\n      return section.items;\n    }\n    return [];\n  });\n};\n/**\n * Since Recent and Starred folders don't have id, title field is used as id\n * @param title - title field of the section\n */\nexport const getLookupField = (title: string) => {\n  return hasId(title) ? 'id' : 'title';\n};\n\n/**\n * Go through all the folders and items in expanded folders and toggle their selected\n * prop according to currently selected index. Used for item highlighting when navigating\n * the search results list using keyboard arrows\n * @param sections\n * @param selectedId\n */\nexport const markSelected = (sections: DashboardSection[], selectedId: string) => {\n  return sections.map((result: DashboardSection) => {\n    const lookupField = getLookupField(selectedId);\n    result = { ...result, selected: String(result[lookupField]) === selectedId };\n\n    if (result.expanded && result.items.length) {\n      return {\n        ...result,\n        items: result.items.map(item => {\n          const [sectionId, itemId] = selectedId.split('-');\n          const lookup = getLookupField(sectionId);\n          return { ...item, selected: String(item.id) === itemId && String(result[lookup]) === sectionId };\n        }),\n      };\n    }\n    return result;\n  });\n};\n\n/**\n * Find items with property 'selected' set true in a list of folders and their items.\n * Does recursive search in the items list.\n * @param sections\n */\nexport const findSelected = (sections: any): DashboardSection | DashboardSectionItem | null => {\n  let found = null;\n  for (const section of sections) {\n    if (section.expanded && section.items.length) {\n      found = findSelected(section.items);\n    }\n    if (section.selected) {\n      found = section;\n    }\n    if (found) {\n      return found;\n    }\n  }\n\n  return null;\n};\n\nexport const parseQuery = (query: string) => {\n  const parsedQuery = parse(query, {\n    keywords: ['folder'],\n  });\n\n  if (typeof parsedQuery === 'string') {\n    return {\n      text: parsedQuery,\n    } as SearchParserResult;\n  }\n\n  return parsedQuery;\n};\n\n/**\n * Merge multiple reducers into one, keeping the state structure flat (no nested\n * separate state for each reducer). If there are multiple state slices with the same\n * key, the latest reducer's state is applied.\n * Compared to Redux's combineReducers this allows multiple reducers to operate\n * on the same state or different slices of the same state. Useful when multiple\n * components have the same structure but different or extra logic when modifying it.\n * If reducers have the same action types, the action types from the rightmost reducer\n * take precedence\n * @param reducers\n */\nexport const mergeReducers = (reducers: any[]) => (prevState: any, action: SearchAction) => {\n  return reducers.reduce((nextState, reducer) => ({ ...nextState, ...reducer(nextState, action) }), prevState);\n};\n\n/**\n * Collect all the checked dashboards\n * @param sections\n */\nexport const getCheckedDashboards = (sections: DashboardSection[]): DashboardSectionItem[] => {\n  if (!sections.length) {\n    return [];\n  }\n\n  return sections.reduce((uids, section) => {\n    return section.items ? [...uids, ...section.items.filter(item => item.checked)] : uids;\n  }, []);\n};\n\n/**\n * Collect uids of all the checked dashboards\n * @param sections\n */\nexport const getCheckedDashboardsUids = (sections: DashboardSection[]) => {\n  if (!sections.length) {\n    return [];\n  }\n\n  return getCheckedDashboards(sections).map(item => item.uid);\n};\n\n/**\n * Collect uids of all checked folders and dashboards. Used for delete operation, among others\n * @param sections\n */\nexport const getCheckedUids = (sections: DashboardSection[]): UidsToDelete => {\n  const emptyResults: UidsToDelete = { folders: [], dashboards: [] };\n\n  if (!sections.length) {\n    return emptyResults;\n  }\n\n  return sections.reduce((result, section) => {\n    if (section?.id !== 0 && section.checked) {\n      return { ...result, folders: [...result.folders, section.uid] };\n    } else {\n      return { ...result, dashboards: getCheckedDashboardsUids(sections) };\n    }\n  }, emptyResults) as UidsToDelete;\n};\n\n/**\n * When search is done within a dashboard folder, add folder id to the search query\n * to narrow down the results to the folder\n * @param query\n * @param queryParsing\n */\nexport const getParsedQuery = (query: DashboardQuery, queryParsing = false) => {\n  const parsedQuery = { ...query, sort: query.sort?.value };\n  if (!queryParsing) {\n    return parsedQuery;\n  }\n\n  let folderIds: number[] = [];\n\n  if (parseQuery(query.query).folder === 'current') {\n    const { folderId } = getDashboardSrv().getCurrent().meta;\n    if (folderId) {\n      folderIds = [folderId];\n    }\n  }\n  return { ...parsedQuery, query: parseQuery(query.query).text as string, folderIds };\n};\n\n/**\n * Check if search query has filters enabled. Excludes folderId\n * @param query\n */\nexport const hasFilters = (query: DashboardQuery) => {\n  if (!query) {\n    return false;\n  }\n  return Boolean(query.query || query.tag?.length > 0 || query.starred || query.sort);\n};\n\n/**\n * Get section icon depending on expanded state. Currently works for folder icons only\n * @param section\n */\nexport const getSectionIcon = (section: DashboardSection): IconName => {\n  if (!hasId(section.title)) {\n    return section.icon as IconName;\n  }\n\n  return section.expanded ? 'folder-open' : 'folder';\n};\n\n/**\n * Get storage key for a dashboard folder by its title\n * @param title\n */\nexport const getSectionStorageKey = (title: string) => {\n  if (!title) {\n    return '';\n  }\n  return `${SECTION_STORAGE_KEY}.${title.toLowerCase()}`;\n};\n","import React, { useState } from 'react';\nimport { HorizontalGroup, Icon, renderOrCallToRender, stylesFactory, useTheme } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\nimport { useUpdateEffect } from 'react-use';\n\ninterface QueryOperationRowProps {\n  title?: ((props: { isOpen: boolean }) => React.ReactNode) | React.ReactNode;\n  headerElement?: React.ReactNode;\n  actions?:\n    | ((props: { isOpen: boolean; openRow: () => void; closeRow: () => void }) => React.ReactNode)\n    | React.ReactNode;\n  onOpen?: () => void;\n  onClose?: () => void;\n  children: React.ReactNode;\n  isOpen?: boolean;\n}\n\nexport const QueryOperationRow: React.FC<QueryOperationRowProps> = ({\n  children,\n  actions,\n  title,\n  headerElement,\n  onClose,\n  onOpen,\n  isOpen,\n}: QueryOperationRowProps) => {\n  const [isContentVisible, setIsContentVisible] = useState(isOpen !== undefined ? isOpen : true);\n  const theme = useTheme();\n  const styles = getQueryOperationRowStyles(theme);\n  useUpdateEffect(() => {\n    if (isContentVisible) {\n      if (onOpen) {\n        onOpen();\n      }\n    } else {\n      if (onClose) {\n        onClose();\n      }\n    }\n  }, [isContentVisible]);\n\n  const titleElement = title && renderOrCallToRender(title, { isOpen: isContentVisible });\n  const actionsElement =\n    actions &&\n    renderOrCallToRender(actions, {\n      isOpen: isContentVisible,\n      openRow: () => {\n        setIsContentVisible(true);\n      },\n      closeRow: () => {\n        setIsContentVisible(false);\n      },\n    });\n\n  return (\n    <div className={styles.wrapper}>\n      <div className={styles.header}>\n        <HorizontalGroup justify=\"space-between\">\n          <div\n            className={styles.titleWrapper}\n            onClick={() => {\n              setIsContentVisible(!isContentVisible);\n            }}\n            aria-label=\"Query operation row title\"\n          >\n            <Icon name={isContentVisible ? 'angle-down' : 'angle-right'} className={styles.collapseIcon} />\n            {title && <span className={styles.title}>{titleElement}</span>}\n            {headerElement}\n          </div>\n          {actions && actionsElement}\n        </HorizontalGroup>\n      </div>\n      {isContentVisible && <div className={styles.content}>{children}</div>}\n    </div>\n  );\n};\n\nconst getQueryOperationRowStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    wrapper: css`\n      margin-bottom: ${theme.spacing.md};\n    `,\n    header: css`\n      padding: 0 ${theme.spacing.sm};\n      border-radius: ${theme.border.radius.sm};\n      background: ${theme.colors.bg2};\n      height: ${theme.spacing.formInputHeight}px;\n      line-height: ${theme.spacing.formInputHeight}px;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n    `,\n    collapseIcon: css`\n      color: ${theme.colors.textWeak};\n      &:hover {\n        color: ${theme.colors.text};\n      }\n    `,\n    titleWrapper: css`\n      display: flex;\n      align-items: center;\n      cursor: pointer;\n    `,\n    title: css`\n      font-weight: ${theme.typography.weight.semibold};\n      color: ${theme.colors.textBlue};\n      margin-left: ${theme.spacing.sm};\n    `,\n    content: css`\n      margin-top: ${theme.spacing.inlineFormMargin};\n      margin-left: ${theme.spacing.lg};\n    `,\n  };\n});\n\nQueryOperationRow.displayName = 'QueryOperationRow';\n","import React from 'react';\nimport { cx, css } from 'emotion';\nimport { stylesFactory } from '../../themes';\n\nexport interface ListProps<T> {\n  items: T[];\n  renderItem: (item: T, index: number) => JSX.Element;\n  getItemKey?: (item: T) => string;\n  className?: string;\n}\n\ninterface AbstractListProps<T> extends ListProps<T> {\n  inline?: boolean;\n}\n\nconst getStyles = stylesFactory((inlineList = false) => ({\n  list: css`\n    list-style-type: none;\n    margin: 0;\n    padding: 0;\n  `,\n\n  item: css`\n    display: ${(inlineList && 'inline-block') || 'block'};\n  `,\n}));\n\nexport class AbstractList<T> extends React.PureComponent<AbstractListProps<T>> {\n  constructor(props: AbstractListProps<T>) {\n    super(props);\n  }\n\n  render() {\n    const { items, renderItem, getItemKey, className, inline } = this.props;\n    const styles = getStyles(inline);\n\n    return (\n      <ul className={cx(styles.list, className)}>\n        {items.map((item, i) => {\n          return (\n            <li className={styles.item} key={getItemKey ? getItemKey(item) : i}>\n              {renderItem(item, i)}\n            </li>\n          );\n        })}\n      </ul>\n    );\n  }\n}\n","import { NavModel, NavModelItem, NavIndex } from '@grafana/data';\n\nfunction getNotFoundModel(): NavModel {\n  const node: NavModelItem = {\n    id: 'not-found',\n    text: 'Page not found',\n    icon: 'exclamation-triangle',\n    subTitle: '404 Error',\n    url: 'not-found',\n  };\n\n  return {\n    node: node,\n    main: node,\n  };\n}\n\nexport function getNavModel(navIndex: NavIndex, id: string, fallback?: NavModel, onlyChild = false): NavModel {\n  if (navIndex[id]) {\n    const node = navIndex[id];\n\n    let main: NavModelItem;\n    if (!onlyChild && node.parentItem) {\n      main = { ...node.parentItem };\n\n      main.children =\n        main.children &&\n        main.children.map(item => {\n          return {\n            ...item,\n            active: item.url === node.url,\n          };\n        });\n    } else {\n      main = node;\n    }\n\n    return {\n      node: node,\n      main: main,\n    };\n  }\n\n  if (fallback) {\n    return fallback;\n  }\n\n  return getNotFoundModel();\n}\n\nexport const getTitleFromNavModel = (navModel: NavModel) => {\n  return `${navModel.main.text}${navModel.node.text ? ': ' + navModel.node.text : ''}`;\n};\n","import flatten from 'lodash/flatten';\nimport tinycolor from 'tinycolor2';\nimport { GrafanaThemeType } from '../types/theme';\n\ntype Hue = 'green' | 'yellow' | 'red' | 'blue' | 'orange' | 'purple';\n\nexport type Color =\n  | 'green'\n  | 'dark-green'\n  | 'semi-dark-green'\n  | 'light-green'\n  | 'super-light-green'\n  | 'yellow'\n  | 'dark-yellow'\n  | 'semi-dark-yellow'\n  | 'light-yellow'\n  | 'super-light-yellow'\n  | 'red'\n  | 'dark-red'\n  | 'semi-dark-red'\n  | 'light-red'\n  | 'super-light-red'\n  | 'blue'\n  | 'dark-blue'\n  | 'semi-dark-blue'\n  | 'light-blue'\n  | 'super-light-blue'\n  | 'orange'\n  | 'dark-orange'\n  | 'semi-dark-orange'\n  | 'light-orange'\n  | 'super-light-orange'\n  | 'purple'\n  | 'dark-purple'\n  | 'semi-dark-purple'\n  | 'light-purple'\n  | 'super-light-purple';\n\ntype ThemeVariants = {\n  dark: string;\n  light: string;\n};\n\nexport type ColorDefinition = {\n  hue: Hue;\n  isPrimary?: boolean;\n  name: Color;\n  variants: ThemeVariants;\n};\n\nlet colorsPaletteInstance: Map<Hue, ColorDefinition[]>;\n\nconst buildColorDefinition = (\n  hue: Hue,\n  name: Color,\n  [light, dark]: string[],\n  isPrimary?: boolean\n): ColorDefinition => ({\n  hue,\n  name,\n  variants: {\n    light,\n    dark,\n  },\n  isPrimary: !!isPrimary,\n});\n\nexport const getColorDefinitionByName = (name: Color): ColorDefinition => {\n  return flatten(Array.from(getNamedColorPalette().values())).filter(definition => definition.name === name)[0];\n};\n\nexport const getColorDefinition = (hex: string, theme: GrafanaThemeType): ColorDefinition | undefined => {\n  return flatten(Array.from(getNamedColorPalette().values())).filter(\n    definition => definition.variants[theme] === hex\n  )[0];\n};\n\nconst isHex = (color: string) => {\n  const hexRegex = /^((0x){0,1}|#{0,1})([0-9A-F]{8}|[0-9A-F]{6}|[0-9A-F]{3})$/gi;\n  return hexRegex.test(color);\n};\n\nexport const getColorName = (color?: string, theme?: GrafanaThemeType): Color | undefined => {\n  if (!color) {\n    return undefined;\n  }\n\n  if (color.indexOf('rgb') > -1) {\n    return undefined;\n  }\n  if (isHex(color)) {\n    const definition = getColorDefinition(color, theme || GrafanaThemeType.Dark);\n    return definition ? definition.name : undefined;\n  }\n\n  return color as Color;\n};\n\nexport const getColorByName = (colorName: string) => {\n  const definition = flatten(Array.from(getNamedColorPalette().values())).filter(\n    definition => definition.name === colorName\n  );\n  return definition.length > 0 ? definition[0] : undefined;\n};\n\nexport const getColorFromHexRgbOrName = (color: string, theme?: GrafanaThemeType): string => {\n  if (color.indexOf('rgb') > -1 || isHex(color)) {\n    return color;\n  }\n\n  const colorDefinition = getColorByName(color);\n\n  if (!colorDefinition) {\n    return new tinycolor(color).toHexString();\n  }\n\n  return theme ? colorDefinition.variants[theme] : colorDefinition.variants.dark;\n};\n\nexport const getColorForTheme = (color: ColorDefinition, theme?: GrafanaThemeType) => {\n  return theme ? color.variants[theme] : color.variants.dark;\n};\n\nconst buildNamedColorsPalette = () => {\n  const palette = new Map<Hue, ColorDefinition[]>();\n\n  const BasicGreen = buildColorDefinition('green', 'green', ['#56A64B', '#73BF69'], true);\n  const DarkGreen = buildColorDefinition('green', 'dark-green', ['#19730E', '#37872D']);\n  const SemiDarkGreen = buildColorDefinition('green', 'semi-dark-green', ['#37872D', '#56A64B']);\n  const LightGreen = buildColorDefinition('green', 'light-green', ['#73BF69', '#96D98D']);\n  const SuperLightGreen = buildColorDefinition('green', 'super-light-green', ['#96D98D', '#C8F2C2']);\n\n  const BasicYellow = buildColorDefinition('yellow', 'yellow', ['#F2CC0C', '#FADE2A'], true);\n  const DarkYellow = buildColorDefinition('yellow', 'dark-yellow', ['#CC9D00', '#E0B400']);\n  const SemiDarkYellow = buildColorDefinition('yellow', 'semi-dark-yellow', ['#E0B400', '#F2CC0C']);\n  const LightYellow = buildColorDefinition('yellow', 'light-yellow', ['#FADE2A', '#FFEE52']);\n  const SuperLightYellow = buildColorDefinition('yellow', 'super-light-yellow', ['#FFEE52', '#FFF899']);\n\n  const BasicRed = buildColorDefinition('red', 'red', ['#E02F44', '#F2495C'], true);\n  const DarkRed = buildColorDefinition('red', 'dark-red', ['#AD0317', '#C4162A']);\n  const SemiDarkRed = buildColorDefinition('red', 'semi-dark-red', ['#C4162A', '#E02F44']);\n  const LightRed = buildColorDefinition('red', 'light-red', ['#F2495C', '#FF7383']);\n  const SuperLightRed = buildColorDefinition('red', 'super-light-red', ['#FF7383', '#FFA6B0']);\n\n  const BasicBlue = buildColorDefinition('blue', 'blue', ['#3274D9', '#5794F2'], true);\n  const DarkBlue = buildColorDefinition('blue', 'dark-blue', ['#1250B0', '#1F60C4']);\n  const SemiDarkBlue = buildColorDefinition('blue', 'semi-dark-blue', ['#1F60C4', '#3274D9']);\n  const LightBlue = buildColorDefinition('blue', 'light-blue', ['#5794F2', '#8AB8FF']);\n  const SuperLightBlue = buildColorDefinition('blue', 'super-light-blue', ['#8AB8FF', '#C0D8FF']);\n\n  const BasicOrange = buildColorDefinition('orange', 'orange', ['#FF780A', '#FF9830'], true);\n  const DarkOrange = buildColorDefinition('orange', 'dark-orange', ['#E55400', '#FA6400']);\n  const SemiDarkOrange = buildColorDefinition('orange', 'semi-dark-orange', ['#FA6400', '#FF780A']);\n  const LightOrange = buildColorDefinition('orange', 'light-orange', ['#FF9830', '#FFB357']);\n  const SuperLightOrange = buildColorDefinition('orange', 'super-light-orange', ['#FFB357', '#FFCB7D']);\n\n  const BasicPurple = buildColorDefinition('purple', 'purple', ['#A352CC', '#B877D9'], true);\n  const DarkPurple = buildColorDefinition('purple', 'dark-purple', ['#7C2EA3', '#8F3BB8']);\n  const SemiDarkPurple = buildColorDefinition('purple', 'semi-dark-purple', ['#8F3BB8', '#A352CC']);\n  const LightPurple = buildColorDefinition('purple', 'light-purple', ['#B877D9', '#CA95E5']);\n  const SuperLightPurple = buildColorDefinition('purple', 'super-light-purple', ['#CA95E5', '#DEB6F2']);\n\n  const greens = [BasicGreen, DarkGreen, SemiDarkGreen, LightGreen, SuperLightGreen];\n  const yellows = [BasicYellow, DarkYellow, SemiDarkYellow, LightYellow, SuperLightYellow];\n  const reds = [BasicRed, DarkRed, SemiDarkRed, LightRed, SuperLightRed];\n  const blues = [BasicBlue, DarkBlue, SemiDarkBlue, LightBlue, SuperLightBlue];\n  const oranges = [BasicOrange, DarkOrange, SemiDarkOrange, LightOrange, SuperLightOrange];\n  const purples = [BasicPurple, DarkPurple, SemiDarkPurple, LightPurple, SuperLightPurple];\n\n  palette.set('green', greens);\n  palette.set('yellow', yellows);\n  palette.set('red', reds);\n  palette.set('blue', blues);\n  palette.set('orange', oranges);\n  palette.set('purple', purples);\n\n  return palette;\n};\n\nexport const getNamedColorPalette = () => {\n  if (colorsPaletteInstance) {\n    return colorsPaletteInstance;\n  }\n\n  colorsPaletteInstance = buildNamedColorsPalette();\n  return colorsPaletteInstance;\n};\n","// Libraries\nimport _ from 'lodash';\nimport { Unsubscribable } from 'rxjs';\n// Services & Utils\nimport {\n  DataQuery,\n  CoreApp,\n  DataQueryError,\n  DataQueryRequest,\n  DataSourceApi,\n  dateMath,\n  HistoryItem,\n  IntervalValues,\n  LogRowModel,\n  LogsDedupStrategy,\n  LogsModel,\n  RawTimeRange,\n  TimeFragment,\n  TimeRange,\n  TimeZone,\n  toUtc,\n  ExploreMode,\n  urlUtil,\n  DefaultTimeZone,\n} from '@grafana/data';\nimport store from 'app/core/store';\nimport kbn from 'app/core/utils/kbn';\nimport { getNextRefIdChar } from './query';\n// Types\nimport { RefreshPicker } from '@grafana/ui';\nimport { ExploreUrlState, QueryOptions, QueryTransaction } from 'app/types/explore';\nimport { config } from '../config';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DataSourceSrv } from '@grafana/runtime';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nexport const DEFAULT_RANGE = {\n  from: 'now-1h',\n  to: 'now',\n};\n\nexport const DEFAULT_UI_STATE = {\n  showingTable: true,\n  showingGraph: true,\n  showingLogs: true,\n  dedupStrategy: LogsDedupStrategy.none,\n};\n\nconst MAX_HISTORY_ITEMS = 100;\n\nexport const LAST_USED_DATASOURCE_KEY = 'grafana.explore.datasource';\nexport const lastUsedDatasourceKeyForOrgId = (orgId: number) => `${LAST_USED_DATASOURCE_KEY}.${orgId}`;\n\n/**\n * Returns an Explore-URL that contains a panel's queries and the dashboard time range.\n *\n * @param panelTargets The origin panel's query targets\n * @param panelDatasource The origin panel's datasource\n * @param datasourceSrv Datasource service to query other datasources in case the panel datasource is mixed\n * @param timeSrv Time service to get the current dashboard range from\n */\nexport interface GetExploreUrlArguments {\n  panel: PanelModel;\n  panelTargets: DataQuery[];\n  panelDatasource: DataSourceApi;\n  datasourceSrv: DataSourceSrv;\n  timeSrv: TimeSrv;\n}\nexport async function getExploreUrl(args: GetExploreUrlArguments): Promise<string | undefined> {\n  const { panel, panelTargets, panelDatasource, datasourceSrv, timeSrv } = args;\n  let exploreDatasource = panelDatasource;\n  let exploreTargets: DataQuery[] = panelTargets;\n  let url: string | undefined;\n\n  // Mixed datasources need to choose only one datasource\n  if (panelDatasource.meta?.id === 'mixed' && exploreTargets) {\n    // Find first explore datasource among targets\n    for (const t of exploreTargets) {\n      const datasource = await datasourceSrv.get(t.datasource || undefined);\n      if (datasource) {\n        exploreDatasource = datasource;\n        exploreTargets = panelTargets.filter(t => t.datasource === datasource.name);\n        break;\n      }\n    }\n  }\n\n  if (exploreDatasource) {\n    const range = timeSrv.timeRangeForUrl();\n    let state: Partial<ExploreUrlState> = { range };\n    if (exploreDatasource.interpolateVariablesInQueries) {\n      const scopedVars = panel.scopedVars || {};\n      state = {\n        ...state,\n        datasource: exploreDatasource.name,\n        context: 'explore',\n        queries: exploreDatasource.interpolateVariablesInQueries(exploreTargets, scopedVars),\n      };\n    } else {\n      state = {\n        ...state,\n        datasource: exploreDatasource.name,\n        context: 'explore',\n        queries: exploreTargets.map(t => ({ ...t, datasource: exploreDatasource.name })),\n      };\n    }\n\n    const exploreState = JSON.stringify({ ...state, originPanelId: panel.getSavedId() });\n    url = urlUtil.renderUrl('/explore', { left: exploreState });\n  }\n  return url;\n}\n\nexport function buildQueryTransaction(\n  queries: DataQuery[],\n  queryOptions: QueryOptions,\n  range: TimeRange,\n  scanning: boolean,\n  timeZone?: TimeZone\n): QueryTransaction {\n  const configuredQueries = queries.map(query => ({ ...query, ...queryOptions }));\n  const key = queries.reduce((combinedKey, query) => {\n    combinedKey += query.key;\n    return combinedKey;\n  }, '');\n\n  const { interval, intervalMs } = getIntervals(range, queryOptions.minInterval, queryOptions.maxDataPoints);\n\n  // Most datasource is using `panelId + query.refId` for cancellation logic.\n  // Using `format` here because it relates to the view panel that the request is for.\n  // However, some datasources don't use `panelId + query.refId`, but only `panelId`.\n  // Therefore panel id has to be unique.\n  const panelId = `${key}`;\n\n  const request: DataQueryRequest = {\n    app: CoreApp.Explore,\n    dashboardId: 0,\n    // TODO probably should be taken from preferences but does not seem to be used anyway.\n    timezone: timeZone || DefaultTimeZone,\n    startTime: Date.now(),\n    interval,\n    intervalMs,\n    // TODO: the query request expects number and we are using string here. Seems like it works so far but can create\n    // issues down the road.\n    panelId: panelId as any,\n    targets: configuredQueries, // Datasources rely on DataQueries being passed under the targets key.\n    range,\n    requestId: 'explore',\n    rangeRaw: range.raw,\n    scopedVars: {\n      __interval: { text: interval, value: interval },\n      __interval_ms: { text: intervalMs, value: intervalMs },\n    },\n    maxDataPoints: queryOptions.maxDataPoints,\n    exploreMode: queryOptions.mode,\n  };\n\n  return {\n    queries,\n    request,\n    scanning,\n    id: generateKey(), // reusing for unique ID\n    done: false,\n    latency: 0,\n  };\n}\n\nexport const clearQueryKeys: (query: DataQuery) => object = ({ key, refId, ...rest }) => rest;\n\nconst isSegment = (segment: { [key: string]: string }, ...props: string[]) =>\n  props.some(prop => segment.hasOwnProperty(prop));\n\nenum ParseUrlStateIndex {\n  RangeFrom = 0,\n  RangeTo = 1,\n  Datasource = 2,\n  SegmentsStart = 3,\n}\n\nenum ParseUiStateIndex {\n  Graph = 0,\n  Logs = 1,\n  Table = 2,\n  Strategy = 3,\n}\n\nexport const safeParseJson = (text?: string): any | undefined => {\n  if (!text) {\n    return;\n  }\n\n  try {\n    return JSON.parse(decodeURI(text));\n  } catch (error) {\n    console.error(error);\n  }\n};\n\nexport const safeStringifyValue = (value: any, space?: number) => {\n  if (!value) {\n    return '';\n  }\n\n  try {\n    return JSON.stringify(value, null, space);\n  } catch (error) {\n    console.error(error);\n  }\n\n  return '';\n};\n\nexport function parseUrlState(initial: string | undefined): ExploreUrlState {\n  const parsed = safeParseJson(initial);\n  const errorResult: any = {\n    datasource: null,\n    queries: [],\n    range: DEFAULT_RANGE,\n    ui: DEFAULT_UI_STATE,\n    mode: null,\n    originPanelId: null,\n  };\n\n  if (!parsed) {\n    return errorResult;\n  }\n\n  if (!Array.isArray(parsed)) {\n    return parsed;\n  }\n\n  if (parsed.length <= ParseUrlStateIndex.SegmentsStart) {\n    console.error('Error parsing compact URL state for Explore.');\n    return errorResult;\n  }\n\n  const range = {\n    from: parsed[ParseUrlStateIndex.RangeFrom],\n    to: parsed[ParseUrlStateIndex.RangeTo],\n  };\n  const datasource = parsed[ParseUrlStateIndex.Datasource];\n  const parsedSegments = parsed.slice(ParseUrlStateIndex.SegmentsStart);\n  const metricProperties = ['expr', 'expression', 'target', 'datasource', 'query'];\n  const queries = parsedSegments.filter(segment => isSegment(segment, ...metricProperties));\n\n  const modeObj = parsedSegments.filter(segment => isSegment(segment, 'mode'))[0];\n  const mode = modeObj ? modeObj.mode : ExploreMode.Metrics;\n\n  const uiState = parsedSegments.filter(segment => isSegment(segment, 'ui'))[0];\n  const ui = uiState\n    ? {\n        showingGraph: uiState.ui[ParseUiStateIndex.Graph],\n        showingLogs: uiState.ui[ParseUiStateIndex.Logs],\n        showingTable: uiState.ui[ParseUiStateIndex.Table],\n        dedupStrategy: uiState.ui[ParseUiStateIndex.Strategy],\n      }\n    : DEFAULT_UI_STATE;\n\n  const originPanelId = parsedSegments.filter(segment => isSegment(segment, 'originPanelId'))[0];\n  return { datasource, queries, range, ui, mode, originPanelId };\n}\n\nexport function serializeStateToUrlParam(urlState: ExploreUrlState, compact?: boolean): string {\n  if (compact) {\n    return JSON.stringify([\n      urlState.range.from,\n      urlState.range.to,\n      urlState.datasource,\n      ...urlState.queries,\n      { mode: urlState.mode },\n      {\n        ui: [\n          !!urlState.ui.showingGraph,\n          !!urlState.ui.showingLogs,\n          !!urlState.ui.showingTable,\n          urlState.ui.dedupStrategy,\n        ],\n      },\n    ]);\n  }\n  return JSON.stringify(urlState);\n}\n\nexport function generateKey(index = 0): string {\n  return `Q-${Date.now()}-${Math.random()}-${index}`;\n}\n\nexport function generateEmptyQuery(queries: DataQuery[], index = 0): DataQuery {\n  return { refId: getNextRefIdChar(queries), key: generateKey(index) };\n}\n\nexport const generateNewKeyAndAddRefIdIfMissing = (target: DataQuery, queries: DataQuery[], index = 0): DataQuery => {\n  const key = generateKey(index);\n  const refId = target.refId || getNextRefIdChar(queries);\n\n  return { ...target, refId, key };\n};\n\n/**\n * Ensure at least one target exists and that targets have the necessary keys\n */\nexport function ensureQueries(queries?: DataQuery[]): DataQuery[] {\n  if (queries && typeof queries === 'object' && queries.length > 0) {\n    const allQueries = [];\n    for (let index = 0; index < queries.length; index++) {\n      const query = queries[index];\n      const key = generateKey(index);\n      let refId = query.refId;\n      if (!refId) {\n        refId = getNextRefIdChar(allQueries);\n      }\n\n      allQueries.push({\n        ...query,\n        refId,\n        key,\n      });\n    }\n    return allQueries;\n  }\n  return [{ ...generateEmptyQuery(queries) }];\n}\n\n/**\n * A target is non-empty when it has keys (with non-empty values) other than refId, key and context.\n */\nconst validKeys = ['refId', 'key', 'context'];\nexport function hasNonEmptyQuery<TQuery extends DataQuery = any>(queries: TQuery[]): boolean {\n  return (\n    queries &&\n    queries.some((query: any) => {\n      const keys = Object.keys(query)\n        .filter(key => validKeys.indexOf(key) === -1)\n        .map(k => query[k])\n        .filter(v => v);\n      return keys.length > 0;\n    })\n  );\n}\n\n/**\n * Update the query history. Side-effect: store history in local storage\n */\nexport function updateHistory<T extends DataQuery = any>(\n  history: Array<HistoryItem<T>>,\n  datasourceId: string,\n  queries: T[]\n): Array<HistoryItem<T>> {\n  const ts = Date.now();\n  let updatedHistory = history;\n  queries.forEach(query => {\n    updatedHistory = [{ query, ts }, ...updatedHistory];\n  });\n\n  if (updatedHistory.length > MAX_HISTORY_ITEMS) {\n    updatedHistory = updatedHistory.slice(0, MAX_HISTORY_ITEMS);\n  }\n\n  // Combine all queries of a datasource type into one history\n  const historyKey = `grafana.explore.history.${datasourceId}`;\n  try {\n    store.setObject(historyKey, updatedHistory);\n    return updatedHistory;\n  } catch (error) {\n    console.error(error);\n    return history;\n  }\n}\n\nexport function clearHistory(datasourceId: string) {\n  const historyKey = `grafana.explore.history.${datasourceId}`;\n  store.delete(historyKey);\n}\n\nexport const getQueryKeys = (queries: DataQuery[], datasourceInstance: DataSourceApi): string[] => {\n  const queryKeys = queries.reduce<string[]>((newQueryKeys, query, index) => {\n    const primaryKey = datasourceInstance && datasourceInstance.name ? datasourceInstance.name : query.key;\n    return newQueryKeys.concat(`${primaryKey}-${index}`);\n  }, []);\n\n  return queryKeys;\n};\n\nexport const getTimeRange = (timeZone: TimeZone, rawRange: RawTimeRange): TimeRange => {\n  return {\n    from: dateMath.parse(rawRange.from, false, timeZone as any),\n    to: dateMath.parse(rawRange.to, true, timeZone as any),\n    raw: rawRange,\n  };\n};\n\nconst parseRawTime = (value: any): TimeFragment | null => {\n  if (value === null) {\n    return null;\n  }\n\n  if (value.indexOf('now') !== -1) {\n    return value;\n  }\n  if (value.length === 8) {\n    return toUtc(value, 'YYYYMMDD');\n  }\n  if (value.length === 15) {\n    return toUtc(value, 'YYYYMMDDTHHmmss');\n  }\n  // Backward compatibility\n  if (value.length === 19) {\n    return toUtc(value, 'YYYY-MM-DD HH:mm:ss');\n  }\n\n  if (!isNaN(value)) {\n    const epoch = parseInt(value, 10);\n    return toUtc(epoch);\n  }\n\n  return null;\n};\n\nexport const getTimeRangeFromUrl = (range: RawTimeRange, timeZone: TimeZone): TimeRange => {\n  const raw = {\n    from: parseRawTime(range.from),\n    to: parseRawTime(range.to),\n  };\n\n  return {\n    from: dateMath.parse(raw.from, false, timeZone as any),\n    to: dateMath.parse(raw.to, true, timeZone as any),\n    raw,\n  };\n};\n\nexport const getValueWithRefId = (value?: any): any => {\n  if (!value || typeof value !== 'object') {\n    return undefined;\n  }\n\n  if (value.refId) {\n    return value;\n  }\n\n  const keys = Object.keys(value);\n  for (let index = 0; index < keys.length; index++) {\n    const key = keys[index];\n    const refId = getValueWithRefId(value[key]);\n    if (refId) {\n      return refId;\n    }\n  }\n\n  return undefined;\n};\n\nexport const getFirstQueryErrorWithoutRefId = (errors?: DataQueryError[]): DataQueryError | undefined => {\n  if (!errors) {\n    return undefined;\n  }\n\n  return errors.filter(error => (error && error.refId ? false : true))[0];\n};\n\nexport const getRefIds = (value: any): string[] => {\n  if (!value) {\n    return [];\n  }\n\n  if (typeof value !== 'object') {\n    return [];\n  }\n\n  const keys = Object.keys(value);\n  const refIds = [];\n  for (let index = 0; index < keys.length; index++) {\n    const key = keys[index];\n    if (key === 'refId') {\n      refIds.push(value[key]);\n      continue;\n    }\n    refIds.push(getRefIds(value[key]));\n  }\n\n  return _.uniq(_.flatten(refIds));\n};\n\nexport const sortInAscendingOrder = (a: LogRowModel, b: LogRowModel) => {\n  // compare milliseconds\n  if (a.timeEpochMs < b.timeEpochMs) {\n    return -1;\n  }\n\n  if (a.timeEpochMs > b.timeEpochMs) {\n    return 1;\n  }\n\n  // if milliseonds are equal, compare nanoseconds\n  if (a.timeEpochNs < b.timeEpochNs) {\n    return -1;\n  }\n\n  if (a.timeEpochNs > b.timeEpochNs) {\n    return 1;\n  }\n\n  return 0;\n};\n\nconst sortInDescendingOrder = (a: LogRowModel, b: LogRowModel) => {\n  // compare milliseconds\n  if (a.timeEpochMs > b.timeEpochMs) {\n    return -1;\n  }\n\n  if (a.timeEpochMs < b.timeEpochMs) {\n    return 1;\n  }\n\n  // if milliseonds are equal, compare nanoseconds\n  if (a.timeEpochNs > b.timeEpochNs) {\n    return -1;\n  }\n\n  if (a.timeEpochNs < b.timeEpochNs) {\n    return 1;\n  }\n\n  return 0;\n};\n\nexport enum SortOrder {\n  Descending = 'Descending',\n  Ascending = 'Ascending',\n  DatasourceAZ = 'Datasource A-Z',\n  DatasourceZA = 'Datasource Z-A',\n}\n\nexport const refreshIntervalToSortOrder = (refreshInterval?: string) =>\n  RefreshPicker.isLive(refreshInterval) ? SortOrder.Ascending : SortOrder.Descending;\n\nexport const sortLogsResult = (logsResult: LogsModel | null, sortOrder: SortOrder): LogsModel => {\n  const rows = logsResult ? logsResult.rows : [];\n  sortOrder === SortOrder.Ascending ? rows.sort(sortInAscendingOrder) : rows.sort(sortInDescendingOrder);\n  const result: LogsModel = logsResult ? { ...logsResult, rows } : { hasUniqueLabels: false, rows };\n\n  return result;\n};\n\nexport const convertToWebSocketUrl = (url: string) => {\n  const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n  let backend = `${protocol}${window.location.host}${config.appSubUrl}`;\n  if (backend.endsWith('/')) {\n    backend = backend.slice(0, -1);\n  }\n  return `${backend}${url}`;\n};\n\nexport const stopQueryState = (querySubscription: Unsubscribable) => {\n  if (querySubscription) {\n    querySubscription.unsubscribe();\n  }\n};\n\nexport function getIntervals(range: TimeRange, lowLimit: string, resolution?: number): IntervalValues {\n  if (!resolution) {\n    return { interval: '1s', intervalMs: 1000 };\n  }\n\n  return kbn.calculateInterval(range, resolution, lowLimit);\n}\n\nexport function deduplicateLogRowsById(rows: LogRowModel[]) {\n  return _.uniqBy(rows, 'uid');\n}\n\nexport const getFirstNonQueryRowSpecificError = (queryErrors?: DataQueryError[]): DataQueryError | undefined => {\n  const refId = getValueWithRefId(queryErrors);\n  return refId ? undefined : getFirstQueryErrorWithoutRefId(queryErrors);\n};\n","import { cloneDeep } from 'lodash';\nimport { StoreState, ThunkResult } from 'app/types';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { changeVariableEditorExtended } from '../editor/reducer';\nimport { addVariable, changeVariableProp } from '../state/sharedReducer';\nimport { getNewVariabelIndex, getVariable } from '../state/selectors';\nimport { AddVariable, toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport {\n  AdHocVariabelFilterUpdate,\n  filterAdded,\n  filterRemoved,\n  filtersRestored,\n  filterUpdated,\n  initialAdHocVariableModelState,\n} from './reducer';\nimport { AdHocVariableFilter, AdHocVariableModel } from 'app/features/templating/types';\nimport { variableUpdated } from '../state/actions';\nimport { isAdHoc } from '../guard';\n\nexport interface AdHocTableOptions {\n  datasource: string;\n  key: string;\n  value: string;\n  operator: string;\n}\n\nconst filterTableName = 'Filters';\n\nexport const applyFilterFromTable = (options: AdHocTableOptions): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    let variable = getVariableByOptions(options, getState());\n\n    if (!variable) {\n      dispatch(createAdHocVariable(options));\n      variable = getVariableByOptions(options, getState());\n    }\n\n    const index = variable.filters.findIndex(f => f.key === options.key && f.value === options.value);\n\n    if (index === -1) {\n      const { value, key, operator } = options;\n      const filter = { value, key, operator, condition: '' };\n      return await dispatch(addFilter(variable.id!, filter));\n    }\n\n    const filter = { ...variable.filters[index], operator: options.operator };\n    return await dispatch(changeFilter(variable.id!, { index, filter }));\n  };\n};\n\nexport const changeFilter = (id: string, update: AdHocVariabelFilterUpdate): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filterUpdated(toVariablePayload(variable, update)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const removeFilter = (id: string, index: number): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filterRemoved(toVariablePayload(variable, index)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const addFilter = (id: string, filter: AdHocVariableFilter): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filterAdded(toVariablePayload(variable, filter)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const setFiltersFromUrl = (id: string, filters: AdHocVariableFilter[]): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filtersRestored(toVariablePayload(variable, filters)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const changeVariableDatasource = (datasource: string): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const { editor } = getState().templating;\n    const variable = getVariable(editor.id, getState());\n\n    const loadingText = 'Adhoc filters are applied automatically to all queries that target this datasource';\n\n    dispatch(\n      changeVariableEditorExtended({\n        propName: 'infoText',\n        propValue: loadingText,\n      })\n    );\n    dispatch(changeVariableProp(toVariablePayload(variable, { propName: 'datasource', propValue: datasource })));\n\n    const ds = await getDatasourceSrv().get(datasource);\n\n    if (!ds || !ds.getTagKeys) {\n      dispatch(\n        changeVariableEditorExtended({\n          propName: 'infoText',\n          propValue: 'This datasource does not support adhoc filters yet.',\n        })\n      );\n    }\n  };\n};\n\nexport const initAdHocVariableEditor = (): ThunkResult<void> => dispatch => {\n  const dataSources = getDatasourceSrv().getMetricSources();\n  const selectable = dataSources.reduce(\n    (all: Array<{ text: string; value: string }>, ds) => {\n      if (ds.meta.mixed || ds.value === null) {\n        return all;\n      }\n\n      all.push({\n        text: ds.name,\n        value: ds.value,\n      });\n\n      return all;\n    },\n    [{ text: '', value: '' }]\n  );\n\n  dispatch(\n    changeVariableEditorExtended({\n      propName: 'dataSources',\n      propValue: selectable,\n    })\n  );\n};\n\nconst createAdHocVariable = (options: AdHocTableOptions): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const model = {\n      ...cloneDeep(initialAdHocVariableModelState),\n      datasource: options.datasource,\n      name: filterTableName,\n      id: filterTableName,\n    };\n\n    const global = false;\n    const index = getNewVariabelIndex(getState());\n    const identifier: VariableIdentifier = { type: 'adhoc', id: model.id };\n\n    dispatch(\n      addVariable(\n        toVariablePayload<AddVariable>(identifier, { global, model, index })\n      )\n    );\n  };\n};\n\nconst getVariableByOptions = (options: AdHocTableOptions, state: StoreState): AdHocVariableModel => {\n  return Object.values(state.templating.variables).find(\n    v => isAdHoc(v) && v.datasource === options.datasource\n  ) as AdHocVariableModel;\n};\n","var path = 'public/app/plugins/panel/heatmap/partials/display_editor.html';\nvar html = \"<div class=editor-row>\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Colors</h5>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-9\\\">Mode</label>\\n      <div class=\\\"gf-form-select-wrapper width-8\\\">\\n        <select class=\\\"input-small gf-form-input\\\" ng-model=ctrl.panel.color.mode ng-options=\\\"s for s in ctrl.colorModes\\\" ng-change=ctrl.render()></select>\\n      </div>\\n    </div>\\n\\n    <div ng-show=\\\"ctrl.panel.color.mode === 'opacity'\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Color</label>\\n        <span class=gf-form-label>\\n          <color-picker color=ctrl.panel.color.cardColor onchange=ctrl.onCardColorChange></color-picker>\\n        </span>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Scale</label>\\n        <div class=\\\"gf-form-select-wrapper width-8\\\">\\n          <select class=\\\"input-small gf-form-input\\\" ng-model=ctrl.panel.color.colorScale ng-options=\\\"s for s in ctrl.opacityScales\\\" ng-change=ctrl.render()></select>\\n        </div>\\n      </div>\\n      <div class=gf-form ng-if=\\\"ctrl.panel.color.colorScale === 'sqrt'\\\">\\n        <label class=\\\"gf-form-label width-9\\\">Exponent</label>\\n        <input type=number class=\\\"gf-form-input width-8\\\" placeholder=auto data-placement=right bs-tooltip=\\\"''\\\" ng-model=ctrl.panel.color.exponent ng-change=ctrl.refresh() ng-model-onblur>\\n      </div>\\n    </div>\\n\\n    <div ng-show=\\\"ctrl.panel.color.mode === 'spectrum'\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-9\\\">Scheme</label>\\n        <div class=\\\"gf-form-select-wrapper width-8\\\">\\n          <select class=\\\"input-small gf-form-input\\\" ng-model=ctrl.panel.color.colorScheme ng-options=\\\"s.value as s.name for s in ctrl.colorSchemes\\\" ng-change=ctrl.render()></select>\\n        </div>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form>\\n      <color-legend></color-legend>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Color scale</h5>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Min</label>\\n      <input type=number ng-model=ctrl.panel.color.min class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"''\\\" ng-change=ctrl.refresh() ng-model-onblur>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Max</label>\\n      <input type=number ng-model=ctrl.panel.color.max class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"''\\\" ng-change=ctrl.refresh() ng-model-onblur>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Legend</h5>\\n    <gf-form-switch class=gf-form label-class=width-8 label=\\\"Show legend\\\" checked=ctrl.panel.legend.show on-change=ctrl.render()>\\n    </gf-form-switch>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Buckets</h5>\\n    <gf-form-switch class=gf-form label-class=width-8 label=\\\"Hide zero\\\" checked=ctrl.panel.hideZeroBuckets on-change=ctrl.render()>\\n    </gf-form-switch>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Space</label>\\n      <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"''\\\" ng-model=ctrl.panel.cards.cardPadding ng-change=ctrl.refresh() ng-model-onblur>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Round</label>\\n      <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"''\\\" ng-model=ctrl.panel.cards.cardRound ng-change=ctrl.refresh() ng-model-onblur>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Tooltip</h5>\\n    <gf-form-switch class=gf-form label-class=width-8 label=\\\"Show tooltip\\\" checked=ctrl.panel.tooltip.show on-change=ctrl.render()>\\n    </gf-form-switch>\\n    <div ng-if=ctrl.panel.tooltip.show>\\n      <gf-form-switch class=gf-form label-class=width-8 label=Histogram checked=ctrl.panel.tooltip.showHistogram on-change=ctrl.render()>\\n      </gf-form-switch>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-8\\\">Decimals</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Max decimal precision for tooltip.'\\\" ng-model=ctrl.panel.tooltipDecimals ng-change=ctrl.render() ng-model-onblur>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { FunctionComponent, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { Tooltip, PopoverContent } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\n\ninterface Props {\n  children: ReactNode;\n  className?: string;\n  htmlFor?: string;\n  isFocused?: boolean;\n  isInvalid?: boolean;\n  tooltip?: PopoverContent;\n  width?: number | 'auto';\n}\n\nexport const FormLabel: FunctionComponent<Props> = ({\n  children,\n  isFocused,\n  isInvalid,\n  className,\n  htmlFor,\n  tooltip,\n  width,\n  ...rest\n}) => {\n  const classes = classNames(className, `gf-form-label width-${width ? width : '10'}`, {\n    'gf-form-label--is-focused': isFocused,\n    'gf-form-label--is-invalid': isInvalid,\n  });\n\n  return (\n    <label className={classes} {...rest} htmlFor={htmlFor}>\n      {children}\n      {tooltip && (\n        <Tooltip placement=\"top\" content={tooltip} theme={'info'}>\n          <div className=\"gf-form-help-icon gf-form-help-icon--right-normal\">\n            <Icon name=\"info-circle\" size=\"xs\" style={{ marginLeft: '10px' }} />\n          </div>\n        </Tooltip>\n      )}\n    </label>\n  );\n};\n","import React, { PureComponent } from 'react';\n\nimport { InlineFormLabel, LegacyForms } from '@grafana/ui';\nconst { Select } = LegacyForms;\n\nimport { DashboardSearchHit, DashboardSearchItemType } from 'app/features/search/types';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { getTimeZoneGroups, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface Props {\n  resourceUri: string;\n}\n\nexport interface State {\n  homeDashboardId: number;\n  theme: string;\n  timezone: string;\n  dashboards: DashboardSearchHit[];\n}\n\nconst themes = [\n  { value: '', label: 'Default' },\n  { value: 'dark', label: 'Dark' },\n  { value: 'light', label: 'Light' },\n];\n\nconst grafanaTimeZones = [\n  { value: '', label: 'Default' },\n  { value: 'browser', label: 'Local browser time' },\n  { value: 'utc', label: 'UTC' },\n];\n\nconst timeZones = getTimeZoneGroups().reduce((tzs, group) => {\n  const options = group.options.map(tz => ({ value: tz, label: tz }));\n  tzs.push.apply(tzs, options);\n  return tzs;\n}, grafanaTimeZones);\n\nexport class SharedPreferences extends PureComponent<Props, State> {\n  backendSrv = backendSrv;\n\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      homeDashboardId: 0,\n      theme: '',\n      timezone: '',\n      dashboards: [],\n    };\n  }\n\n  async componentDidMount() {\n    const prefs = await backendSrv.get(`/api/${this.props.resourceUri}/preferences`);\n    const dashboards = await backendSrv.search({ starred: true });\n    const defaultDashboardHit: DashboardSearchHit = {\n      id: 0,\n      title: 'Default',\n      tags: [],\n      type: '' as DashboardSearchItemType,\n      uid: '',\n      uri: '',\n      url: '',\n      folderId: 0,\n      folderTitle: '',\n      folderUid: '',\n      folderUrl: '',\n      isStarred: false,\n      slug: '',\n      items: [],\n    };\n\n    if (prefs.homeDashboardId > 0 && !dashboards.find(d => d.id === prefs.homeDashboardId)) {\n      const missing = await backendSrv.search({ dashboardIds: [prefs.homeDashboardId] });\n      if (missing && missing.length > 0) {\n        dashboards.push(missing[0]);\n      }\n    }\n\n    this.setState({\n      homeDashboardId: prefs.homeDashboardId,\n      theme: prefs.theme,\n      timezone: prefs.timezone,\n      dashboards: [defaultDashboardHit, ...dashboards],\n    });\n  }\n\n  onSubmitForm = async (event: React.SyntheticEvent) => {\n    event.preventDefault();\n\n    const { homeDashboardId, theme, timezone } = this.state;\n\n    await backendSrv.put(`/api/${this.props.resourceUri}/preferences`, {\n      homeDashboardId,\n      theme,\n      timezone,\n    });\n    window.location.reload();\n  };\n\n  onThemeChanged = (theme: SelectableValue<string>) => {\n    if (!theme || typeof theme.value !== 'string') {\n      return;\n    }\n    this.setState({ theme: theme.value });\n  };\n\n  onTimeZoneChanged = (timezone: SelectableValue<string>) => {\n    if (!timezone || typeof timezone.value !== 'string') {\n      return;\n    }\n    this.setState({ timezone: timezone.value });\n  };\n\n  onHomeDashboardChanged = (dashboardId: number) => {\n    this.setState({ homeDashboardId: dashboardId });\n  };\n\n  getFullDashName = (dashboard: DashboardSearchHit) => {\n    if (typeof dashboard.folderTitle === 'undefined' || dashboard.folderTitle === '') {\n      return dashboard.title;\n    }\n    return dashboard.folderTitle + ' / ' + dashboard.title;\n  };\n\n  render() {\n    const { theme, timezone, homeDashboardId, dashboards } = this.state;\n\n    return (\n      <form className=\"section gf-form-group\" onSubmit={this.onSubmitForm}>\n        <h3 className=\"page-heading\">Preferences</h3>\n        <div className=\"gf-form\">\n          <span className=\"gf-form-label width-11\">UI Theme</span>\n          <Select\n            isSearchable={false}\n            value={themes.find(item => item.value === theme)}\n            options={themes}\n            onChange={this.onThemeChanged}\n            width={20}\n          />\n        </div>\n        <div className=\"gf-form\">\n          <InlineFormLabel\n            width={11}\n            tooltip=\"Not finding dashboard you want? Star it first, then it should appear in this select box.\"\n          >\n            Home Dashboard\n          </InlineFormLabel>\n          <Select\n            value={dashboards.find(dashboard => dashboard.id === homeDashboardId)}\n            getOptionValue={i => i.id}\n            getOptionLabel={this.getFullDashName}\n            onChange={(dashboard: DashboardSearchHit) => this.onHomeDashboardChanged(dashboard.id)}\n            options={dashboards}\n            placeholder=\"Choose default dashboard\"\n            width={20}\n          />\n        </div>\n        <div className=\"gf-form\" aria-label={selectors.components.TimeZonePicker.container}>\n          <label className=\"gf-form-label width-11\">Timezone</label>\n          <Select\n            isSearchable={true}\n            value={timeZones.find(item => item.value === timezone)}\n            onChange={this.onTimeZoneChanged}\n            options={timeZones}\n            width={20}\n          />\n        </div>\n        <div className=\"gf-form-button-row\">\n          <button type=\"submit\" className=\"btn btn-primary\">\n            Save\n          </button>\n        </div>\n      </form>\n    );\n  }\n}\n\nexport default SharedPreferences;\n","import _ from 'lodash';\n\nimport impressionSrv from 'app/core/services/impression_srv';\nimport store from 'app/core/store';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { hasFilters } from 'app/features/search/utils';\nimport { SECTION_STORAGE_KEY } from 'app/features/search/constants';\nimport { DashboardSection, DashboardSearchItemType, DashboardSearchHit, SearchLayout } from 'app/features/search/types';\nimport { backendSrv } from './backend_srv';\n\ninterface Sections {\n  [key: string]: Partial<DashboardSection>;\n}\n\nexport class SearchSrv {\n  private getRecentDashboards(sections: DashboardSection[] | any) {\n    return this.queryForRecentDashboards().then((result: any[]) => {\n      if (result.length > 0) {\n        sections['recent'] = {\n          title: 'Recent',\n          icon: 'clock-nine',\n          score: -1,\n          expanded: store.getBool(`${SECTION_STORAGE_KEY}.recent`, true),\n          items: result,\n          type: DashboardSearchItemType.DashFolder,\n        };\n      }\n    });\n  }\n\n  private queryForRecentDashboards(): Promise<DashboardSearchHit[]> {\n    const dashIds: number[] = _.take(impressionSrv.getDashboardOpened(), 30);\n    if (dashIds.length === 0) {\n      return Promise.resolve([]);\n    }\n\n    return backendSrv.search({ dashboardIds: dashIds }).then(result => {\n      return dashIds\n        .map(orderId => result.find(result => result.id === orderId))\n        .filter(hit => hit && !hit.isStarred) as DashboardSearchHit[];\n    });\n  }\n\n  private getStarred(sections: DashboardSection): Promise<any> {\n    if (!contextSrv.isSignedIn) {\n      return Promise.resolve();\n    }\n\n    return backendSrv.search({ starred: true, limit: 30 }).then(result => {\n      if (result.length > 0) {\n        (sections as any)['starred'] = {\n          title: 'Starred',\n          icon: 'star',\n          score: -2,\n          expanded: store.getBool(`${SECTION_STORAGE_KEY}.starred`, true),\n          items: result,\n          type: DashboardSearchItemType.DashFolder,\n        };\n      }\n    });\n  }\n\n  search(options: any) {\n    const sections: any = {};\n    const promises = [];\n    const query = _.clone(options);\n    const filters = hasFilters(options) || query.folderIds?.length > 0;\n\n    query.folderIds = query.folderIds || [];\n\n    if (query.layout === SearchLayout.List) {\n      return backendSrv\n        .search({ ...query, type: DashboardSearchItemType.DashDB })\n        .then(results => (results.length ? [{ title: '', items: results }] : []));\n    }\n\n    if (!filters) {\n      query.folderIds = [0];\n    }\n\n    if (!options.skipRecent && !filters) {\n      promises.push(this.getRecentDashboards(sections));\n    }\n\n    if (!options.skipStarred && !filters) {\n      promises.push(this.getStarred(sections));\n    }\n\n    promises.push(\n      backendSrv.search(query).then(results => {\n        return this.handleSearchResult(sections, results);\n      })\n    );\n\n    return Promise.all(promises).then(() => {\n      return _.sortBy(_.values(sections), 'score');\n    });\n  }\n\n  private handleSearchResult(sections: Sections, results: DashboardSearchHit[]): any {\n    if (results.length === 0) {\n      return sections;\n    }\n\n    // create folder index\n    for (const hit of results) {\n      if (hit.type === 'dash-folder') {\n        sections[hit.id] = {\n          id: hit.id,\n          uid: hit.uid,\n          title: hit.title,\n          expanded: false,\n          items: [],\n          url: hit.url,\n          icon: 'folder',\n          score: _.keys(sections).length,\n          type: hit.type,\n        };\n      }\n    }\n\n    for (const hit of results) {\n      if (hit.type === 'dash-folder') {\n        continue;\n      }\n\n      let section = sections[hit.folderId || 0];\n      if (!section) {\n        if (hit.folderId) {\n          section = {\n            id: hit.folderId,\n            uid: hit.folderUid,\n            title: hit.folderTitle,\n            url: hit.folderUrl,\n            items: [],\n            icon: 'folder-open',\n            score: _.keys(sections).length,\n            type: DashboardSearchItemType.DashFolder,\n          };\n        } else {\n          section = {\n            id: 0,\n            title: 'General',\n            items: [],\n            icon: 'folder-open',\n            score: _.keys(sections).length,\n            type: DashboardSearchItemType.DashFolder,\n          };\n        }\n        // add section\n        sections[hit.folderId || 0] = section;\n      }\n\n      section.expanded = true;\n      section.items && section.items.push(hit);\n    }\n  }\n\n  getDashboardTags() {\n    return backendSrv.get('/api/dashboards/tags');\n  }\n\n  getSortOptions() {\n    return backendSrv.get('/api/search/sorting');\n  }\n}\n","// Libaries\nimport React, { Component } from 'react';\nimport { dateMath, GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\n\n// Types\nimport { DashboardModel } from '../../state';\nimport { LocationState, CoreEvents } from 'app/types';\nimport { TimeRange } from '@grafana/data';\n\n// State\nimport { updateLocation } from 'app/core/actions';\n\n// Components\nimport { RefreshPicker, withTheme, stylesFactory, Themeable } from '@grafana/ui';\nimport { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';\n\n// Utils & Services\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { defaultIntervals } from '@grafana/ui/src/components/RefreshPicker/RefreshPicker';\nimport { appEvents } from 'app/core/core';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      position: relative;\n      display: flex;\n    `,\n  };\n});\n\nexport interface Props extends Themeable {\n  dashboard: DashboardModel;\n  updateLocation: typeof updateLocation;\n  location: LocationState;\n}\nclass UnthemedDashNavTimeControls extends Component<Props> {\n  componentDidMount() {\n    // Only reason for this is that sometimes time updates can happen via redux location changes\n    // and this happens before timeSrv has had chance to update state (as it listens to angular route-updated)\n    // This can be removed after timeSrv listens redux location\n    this.props.dashboard.on(CoreEvents.timeRangeUpdated, this.triggerForceUpdate);\n  }\n\n  componentWillUnmount() {\n    this.props.dashboard.off(CoreEvents.timeRangeUpdated, this.triggerForceUpdate);\n  }\n\n  triggerForceUpdate = () => {\n    this.forceUpdate();\n  };\n\n  get refreshParamInUrl(): string {\n    return this.props.location.query.refresh as string;\n  }\n\n  onChangeRefreshInterval = (interval: string) => {\n    getTimeSrv().setAutoRefresh(interval);\n    this.forceUpdate();\n  };\n\n  onRefresh = () => {\n    getTimeSrv().refreshDashboard();\n    return Promise.resolve();\n  };\n\n  onMoveBack = () => {\n    appEvents.emit(CoreEvents.shiftTime, -1);\n  };\n\n  onMoveForward = () => {\n    appEvents.emit(CoreEvents.shiftTime, 1);\n  };\n\n  onChangeTimePicker = (timeRange: TimeRange) => {\n    const { dashboard } = this.props;\n    const panel = dashboard.timepicker;\n    const hasDelay = panel.nowDelay && timeRange.raw.to === 'now';\n\n    const adjustedFrom = dateMath.isMathString(timeRange.raw.from) ? timeRange.raw.from : timeRange.from;\n    const adjustedTo = dateMath.isMathString(timeRange.raw.to) ? timeRange.raw.to : timeRange.to;\n    const nextRange = {\n      from: adjustedFrom,\n      to: hasDelay ? 'now-' + panel.nowDelay : adjustedTo,\n    };\n\n    getTimeSrv().setTime(nextRange);\n  };\n\n  onZoom = () => {\n    appEvents.emit(CoreEvents.zoomOut, 2);\n  };\n\n  render() {\n    const { dashboard, theme } = this.props;\n    const { refresh_intervals } = dashboard.timepicker;\n    const intervals = getTimeSrv().getValidIntervals(refresh_intervals || defaultIntervals);\n\n    const timePickerValue = getTimeSrv().timeRange();\n    const timeZone = dashboard.getTimezone();\n    const styles = getStyles(theme);\n\n    return (\n      <div className={styles.container}>\n        <TimePickerWithHistory\n          value={timePickerValue}\n          onChange={this.onChangeTimePicker}\n          timeZone={timeZone}\n          onMoveBackward={this.onMoveBack}\n          onMoveForward={this.onMoveForward}\n          onZoom={this.onZoom}\n        />\n        <RefreshPicker\n          onIntervalChanged={this.onChangeRefreshInterval}\n          onRefresh={this.onRefresh}\n          value={dashboard.refresh}\n          intervals={intervals}\n          tooltip=\"Refresh dashboard\"\n        />\n      </div>\n    );\n  }\n}\n\nexport const DashNavTimeControls = withTheme(UnthemedDashNavTimeControls);\n","export interface Threshold {\n  value: number;\n  color: string;\n  /**\n   *  Warning, Error, LowLow, Low, OK, High, HighHigh etc\n   */\n  state?: string;\n}\n\n/**\n *  Display mode\n */\nexport enum ThresholdsMode {\n  Absolute = 'absolute',\n  /**\n   *  between 0 and 1 (based on min/max)\n   */\n  Percentage = 'percentage',\n}\n\n/**\n *  Config that is passed to the ThresholdsEditor\n */\nexport interface ThresholdsConfig {\n  mode: ThresholdsMode;\n\n  /**\n   *  Must be sorted by 'value', first value is always -Infinity\n   */\n  steps: Threshold[];\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Invitee, OrgUser, UsersState } from 'app/types';\nimport config from 'app/core/config';\n\nexport const initialState: UsersState = {\n  invitees: [] as Invitee[],\n  users: [] as OrgUser[],\n  searchQuery: '',\n  canInvite: !config.externalUserMngLinkName,\n  externalUserMngInfo: config.externalUserMngInfo,\n  externalUserMngLinkName: config.externalUserMngLinkName,\n  externalUserMngLinkUrl: config.externalUserMngLinkUrl,\n  hasFetched: false,\n};\n\nconst usersSlice = createSlice({\n  name: 'users',\n  initialState,\n  reducers: {\n    usersLoaded: (state, action: PayloadAction<OrgUser[]>): UsersState => {\n      return { ...state, hasFetched: true, users: action.payload };\n    },\n    inviteesLoaded: (state, action: PayloadAction<Invitee[]>): UsersState => {\n      return { ...state, hasFetched: true, invitees: action.payload };\n    },\n    setUsersSearchQuery: (state, action: PayloadAction<string>): UsersState => {\n      return { ...state, searchQuery: action.payload };\n    },\n  },\n});\n\nexport const { inviteesLoaded, setUsersSearchQuery, usersLoaded } = usersSlice.actions;\n\nexport const usersReducer = usersSlice.reducer;\n\nexport default {\n  users: usersReducer,\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { DataSourceSelectItem } from '@grafana/data';\n\nexport enum DashboardSource {\n  Gcom = 0,\n  Json = 1,\n}\n\nexport interface ImportDashboardDTO {\n  title: string;\n  uid: string;\n  gnetId: string;\n  constants: string[];\n  dataSources: DataSourceSelectItem[];\n  folder: { id: number; title?: string };\n}\n\nexport enum InputType {\n  DataSource = 'datasource',\n  Constant = 'constant',\n}\n\nexport interface DashboardInput {\n  name: string;\n  label: string;\n  info: string;\n  value: string;\n  type: InputType;\n}\n\nexport interface DataSourceInput extends DashboardInput {\n  pluginId: string;\n  options: DataSourceSelectItem[];\n}\n\nexport interface DashboardInputs {\n  dataSources: DataSourceInput[];\n  constants: DashboardInput[];\n}\n\nexport interface ImportDashboardState {\n  meta: { updatedAt: string; orgName: string };\n  dashboard: any;\n  source: DashboardSource;\n  inputs: DashboardInputs;\n  isLoaded: boolean;\n}\n\nconst initialImportDashboardState: ImportDashboardState = {\n  meta: { updatedAt: '', orgName: '' },\n  dashboard: {},\n  source: DashboardSource.Json,\n  inputs: {} as DashboardInputs,\n  isLoaded: false,\n};\n\nconst importDashboardSlice = createSlice({\n  name: 'manageDashboards',\n  initialState: initialImportDashboardState,\n  reducers: {\n    setGcomDashboard: (state, action: PayloadAction<any>): ImportDashboardState => {\n      return {\n        ...state,\n        dashboard: {\n          ...action.payload.json,\n          id: null,\n        },\n        meta: { updatedAt: action.payload.updatedAt, orgName: action.payload.orgName },\n        source: DashboardSource.Gcom,\n        isLoaded: true,\n      };\n    },\n    setJsonDashboard: (state, action: PayloadAction<any>): ImportDashboardState => {\n      return {\n        ...state,\n        dashboard: {\n          ...action.payload,\n          id: null,\n        },\n        source: DashboardSource.Json,\n        isLoaded: true,\n      };\n    },\n    clearDashboard: (state): ImportDashboardState => {\n      return {\n        ...state,\n        dashboard: {},\n        isLoaded: false,\n      };\n    },\n    setInputs: (state, action: PayloadAction<any[]>): ImportDashboardState => ({\n      ...state,\n      inputs: {\n        dataSources: action.payload.filter(p => p.type === InputType.DataSource),\n        constants: action.payload.filter(p => p.type === InputType.Constant),\n      },\n    }),\n  },\n});\n\nexport const { clearDashboard, setInputs, setGcomDashboard, setJsonDashboard } = importDashboardSlice.actions;\n\nexport const importDashboardReducer = importDashboardSlice.reducer;\n\nexport default {\n  importDashboard: importDashboardReducer,\n};\n","import { ContextMenuItem } from '../components/ContextMenu/ContextMenu';\nimport { LinkModel } from '@grafana/data';\n\n/**\n * Delays creating links until we need to open the ContextMenu\n */\nexport const linkModelToContextMenuItems: (links: () => LinkModel[]) => ContextMenuItem[] = links => {\n  return links().map(link => {\n    return {\n      label: link.title,\n      // TODO: rename to href\n      url: link.href,\n      target: link.target,\n      icon: `${link.target === '_self' ? 'link' : 'external-link-alt'}`,\n      onClick: link.onClick,\n    };\n  });\n};\n","import React, { PureComponent } from 'react';\nimport uniqueId from 'lodash/uniqueId';\nimport { Tooltip } from '../../../Tooltip/Tooltip';\nimport * as PopperJS from 'popper.js';\n\nexport interface Props {\n  label: string;\n  checked: boolean;\n  className?: string;\n  labelClass?: string;\n  switchClass?: string;\n  tooltip?: string;\n  tooltipPlacement?: PopperJS.Placement;\n  transparent?: boolean;\n  onChange: (event: React.SyntheticEvent<HTMLInputElement>) => void;\n}\n\nexport interface State {\n  id: string;\n}\n\nexport class Switch extends PureComponent<Props, State> {\n  state = {\n    id: uniqueId(),\n  };\n\n  internalOnChange = (event: React.FormEvent<HTMLInputElement>) => {\n    event.stopPropagation();\n    this.props.onChange(event);\n  };\n\n  render() {\n    const {\n      labelClass = '',\n      switchClass = '',\n      label,\n      checked,\n      transparent,\n      className,\n      tooltip,\n      tooltipPlacement,\n    } = this.props;\n\n    const labelId = this.state.id;\n    const labelClassName = `gf-form-label ${labelClass} ${transparent ? 'gf-form-label--transparent' : ''} pointer`;\n    const switchClassName = `gf-form-switch ${switchClass} ${transparent ? 'gf-form-switch--transparent' : ''}`;\n\n    return (\n      <div className=\"gf-form-switch-container-react\">\n        <label htmlFor={labelId} className={`gf-form gf-form-switch-container ${className || ''}`}>\n          {label && (\n            <div className={labelClassName}>\n              {label}\n              {tooltip && (\n                <Tooltip placement={tooltipPlacement ? tooltipPlacement : 'auto'} content={tooltip} theme={'info'}>\n                  <div className=\"gf-form-help-icon gf-form-help-icon--right-normal\">\n                    <i className=\"fa fa-info-circle\" />\n                  </div>\n                </Tooltip>\n              )}\n            </div>\n          )}\n          <div className={switchClassName}>\n            <input id={labelId} type=\"checkbox\" checked={checked} onChange={this.internalOnChange} />\n            <span className=\"gf-form-switch__slider\" />\n          </div>\n        </label>\n      </div>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { ConfirmButton, RadioButtonGroup, Icon } from '@grafana/ui';\nimport { cx } from 'emotion';\n\ninterface Props {\n  isGrafanaAdmin: boolean;\n\n  onGrafanaAdminChange: (isGrafanaAdmin: boolean) => void;\n}\n\ninterface State {\n  isEditing: boolean;\n  currentAdminOption: string;\n}\n\nconst adminOptions = [\n  { label: 'Yes', value: 'YES' },\n  { label: 'No', value: 'NO' },\n];\n\nexport class UserPermissions extends PureComponent<Props, State> {\n  state = {\n    isEditing: false,\n    currentAdminOption: this.props.isGrafanaAdmin ? 'YES' : 'NO',\n  };\n\n  onChangeClick = () => {\n    this.setState({ isEditing: true });\n  };\n\n  onCancelClick = () => {\n    this.setState({\n      isEditing: false,\n      currentAdminOption: this.props.isGrafanaAdmin ? 'YES' : 'NO',\n    });\n  };\n\n  onGrafanaAdminChange = () => {\n    const { currentAdminOption } = this.state;\n    const newIsGrafanaAdmin = currentAdminOption === 'YES' ? true : false;\n    this.props.onGrafanaAdminChange(newIsGrafanaAdmin);\n  };\n\n  onAdminOptionSelect = (value: string) => {\n    this.setState({ currentAdminOption: value });\n  };\n\n  render() {\n    const { isGrafanaAdmin } = this.props;\n    const { isEditing, currentAdminOption } = this.state;\n    const changeButtonContainerClass = cx('pull-right');\n\n    return (\n      <>\n        <h3 className=\"page-heading\">Permissions</h3>\n        <div className=\"gf-form-group\">\n          <div className=\"gf-form\">\n            <table className=\"filter-table form-inline\">\n              <tbody>\n                <tr>\n                  <td className=\"width-16\">Grafana Admin</td>\n                  {isEditing ? (\n                    <td colSpan={2}>\n                      <RadioButtonGroup\n                        options={adminOptions}\n                        value={currentAdminOption}\n                        onChange={this.onAdminOptionSelect}\n                      />\n                    </td>\n                  ) : (\n                    <td colSpan={2}>\n                      {isGrafanaAdmin ? (\n                        <>\n                          <Icon name=\"shield\" /> Yes\n                        </>\n                      ) : (\n                        <>No</>\n                      )}\n                    </td>\n                  )}\n                  <td>\n                    <div className={changeButtonContainerClass}>\n                      <ConfirmButton\n                        className=\"pull-right\"\n                        onClick={this.onChangeClick}\n                        onConfirm={this.onGrafanaAdminChange}\n                        onCancel={this.onCancelClick}\n                        confirmText=\"Change\"\n                      >\n                        Change\n                      </ConfirmButton>\n                    </div>\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </div>\n        </div>\n      </>\n    );\n  }\n}\n","/**\n * Calculate tick step.\n * Implementation from d3-array (ticks.js)\n * https://github.com/d3/d3-array/blob/master/src/ticks.js\n * @param start Start value\n * @param stop End value\n * @param count Ticks count\n */\nexport function tickStep(start: number, stop: number, count: number): number {\n  const e10 = Math.sqrt(50),\n    e5 = Math.sqrt(10),\n    e2 = Math.sqrt(2);\n\n  const step0 = Math.abs(stop - start) / Math.max(0, count);\n  let step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10));\n  const error = step0 / step1;\n\n  if (error >= e10) {\n    step1 *= 10;\n  } else if (error >= e5) {\n    step1 *= 5;\n  } else if (error >= e2) {\n    step1 *= 2;\n  }\n\n  return stop < start ? -step1 : step1;\n}\n\nexport function getScaledDecimals(decimals: number, tickSize: number) {\n  return decimals - Math.floor(Math.log(tickSize) / Math.LN10);\n}\n\n/**\n * Calculate tick size based on min and max values, number of ticks and precision.\n * Implementation from Flot.\n * @param min           Axis minimum\n * @param max           Axis maximum\n * @param noTicks       Number of ticks\n * @param tickDecimals  Tick decimal precision\n */\nexport function getFlotTickSize(min: number, max: number, noTicks: number, tickDecimals: number) {\n  const delta = (max - min) / noTicks;\n  let dec = -Math.floor(Math.log(delta) / Math.LN10);\n  const maxDec = tickDecimals;\n\n  const magn = Math.pow(10, -dec);\n  const norm = delta / magn; // norm is between 1.0 and 10.0\n  let size;\n\n  if (norm < 1.5) {\n    size = 1;\n  } else if (norm < 3) {\n    size = 2;\n    // special case for 2.5, requires an extra decimal\n    if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\n      size = 2.5;\n      ++dec;\n    }\n  } else if (norm < 7.5) {\n    size = 5;\n  } else {\n    size = 10;\n  }\n\n  size *= magn;\n\n  return size;\n}\n\n/**\n * Calculate axis range (min and max).\n * Implementation from Flot.\n */\nexport function getFlotRange(panelMin: any, panelMax: any, datamin: number, datamax: number) {\n  const autoscaleMargin = 0.02;\n\n  let min = +(panelMin != null ? panelMin : datamin);\n  let max = +(panelMax != null ? panelMax : datamax);\n  const delta = max - min;\n\n  if (delta === 0.0) {\n    // Grafana fix: wide Y min and max using increased wideFactor\n    // when all series values are the same\n    const wideFactor = 0.25;\n    const widen = Math.abs(max === 0 ? 1 : max * wideFactor);\n\n    if (panelMin === null) {\n      min -= widen;\n    }\n    // always widen max if we couldn't widen min to ensure we\n    // don't fall into min == max which doesn't work\n    if (panelMax == null || panelMin != null) {\n      max += widen;\n    }\n  } else {\n    // consider autoscaling\n    const margin = autoscaleMargin;\n    if (margin != null) {\n      if (panelMin == null) {\n        min -= delta * margin;\n        // make sure we don't go below zero if all values\n        // are positive\n        if (min < 0 && datamin != null && datamin >= 0) {\n          min = 0;\n        }\n      }\n      if (panelMax == null) {\n        max += delta * margin;\n        if (max > 0 && datamax != null && datamax <= 0) {\n          max = 0;\n        }\n      }\n    }\n  }\n  return { min, max };\n}\n\n/**\n * Calculate tick decimals.\n * Implementation from Flot.\n */\nexport function getFlotTickDecimals(datamin: number, datamax: number, axis: { min: any; max: any }, height: number) {\n  const { min, max } = getFlotRange(axis.min, axis.max, datamin, datamax);\n  const noTicks = 0.3 * Math.sqrt(height);\n  const delta = (max - min) / noTicks;\n  const dec = -Math.floor(Math.log(delta) / Math.LN10);\n\n  const magn = Math.pow(10, -dec);\n  // norm is between 1.0 and 10.0\n  const norm = delta / magn;\n  let size;\n\n  if (norm < 1.5) {\n    size = 1;\n  } else if (norm < 3) {\n    size = 2;\n    // special case for 2.5, requires an extra decimal\n    if (norm > 2.25) {\n      size = 2.5;\n    }\n  } else if (norm < 7.5) {\n    size = 5;\n  } else {\n    size = 10;\n  }\n  size *= magn;\n\n  const tickDecimals = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1);\n  // grafana addition\n  const scaledDecimals = tickDecimals - Math.floor(Math.log(size) / Math.LN10);\n  return { tickDecimals, scaledDecimals };\n}\n\n/**\n * Format timestamp similar to Grafana graph panel.\n * @param ticks Number of ticks\n * @param min Time from (in milliseconds)\n * @param max Time to (in milliseconds)\n */\nexport function grafanaTimeFormat(ticks: number, min: number, max: number) {\n  if (min && max && ticks) {\n    const range = max - min;\n    const secPerTick = range / ticks / 1000;\n    const oneDay = 86400000;\n    const oneYear = 31536000000;\n\n    if (secPerTick <= 45) {\n      return 'HH:mm:ss';\n    }\n    if (secPerTick <= 7200 || range <= oneDay) {\n      return 'HH:mm';\n    }\n    if (secPerTick <= 80000) {\n      return 'MM/DD HH:mm';\n    }\n    if (secPerTick <= 2419200 || range <= oneYear) {\n      return 'MM/DD';\n    }\n    return 'YYYY-MM';\n  }\n\n  return 'HH:mm';\n}\n\n/**\n * Logarithm of value for arbitrary base.\n */\nexport function logp(value: number, base: number) {\n  return Math.log(value) / Math.log(base);\n}\n\n/**\n * Get decimal precision of number (3.14 => 2)\n */\nexport function getPrecision(num: number): number {\n  const str = num.toString();\n  return getStringPrecision(str);\n}\n\n/**\n * Get decimal precision of number stored as a string (\"3.14\" => 2)\n */\nexport function getStringPrecision(num: string): number {\n  if (isNaN((num as unknown) as number)) {\n    return 0;\n  }\n\n  const dotIndex = num.indexOf('.');\n  if (dotIndex === -1) {\n    return 0;\n  } else {\n    return num.length - dotIndex - 1;\n  }\n}\n","var path = 'public/app/features/panel/partials/query_editor_row.html';\nvar html = \"<div ng-transclude class=gf-form-query-content></div>\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { camelCase } from 'lodash';\nconst specialChars = ['(', '[', '{', '}', ']', ')', '|', '*', '+', '-', '.', '?', '<', '>', '#', '&', '^', '$'];\n\nexport const escapeStringForRegex = (value: string) => {\n  if (!value) {\n    return value;\n  }\n\n  return specialChars.reduce((escaped, currentChar) => escaped.replace(currentChar, '\\\\' + currentChar), value);\n};\n\nexport const unEscapeStringFromRegex = (value: string) => {\n  if (!value) {\n    return value;\n  }\n\n  return specialChars.reduce((escaped, currentChar) => escaped.replace('\\\\' + currentChar, currentChar), value);\n};\n\nexport function stringStartsAsRegEx(str: string): boolean {\n  if (!str) {\n    return false;\n  }\n\n  return str[0] === '/';\n}\n\nexport function stringToJsRegex(str: string): RegExp {\n  if (!stringStartsAsRegEx(str)) {\n    return new RegExp(`^${str}$`);\n  }\n\n  const match = str.match(new RegExp('^/(.*?)/(g?i?m?y?)$'));\n\n  if (!match) {\n    throw new Error(`'${str}' is not a valid regular expression.`);\n  }\n\n  return new RegExp(match[1], match[2]);\n}\n\nexport function stringToMs(str: string): number {\n  if (!str) {\n    return 0;\n  }\n\n  const nr = parseInt(str, 10);\n  const unit = str.substr(String(nr).length);\n  const s = 1000;\n  const m = s * 60;\n  const h = m * 60;\n  const d = h * 24;\n\n  switch (unit) {\n    case 's':\n      return nr * s;\n    case 'm':\n      return nr * m;\n    case 'h':\n      return nr * h;\n    case 'd':\n      return nr * d;\n    default:\n      if (!unit) {\n        return isNaN(nr) ? 0 : nr;\n      }\n      throw new Error('Not supported unit: ' + unit);\n  }\n}\n\nexport function toNumberString(value: number | undefined | null): string {\n  if (value !== null && value !== undefined && Number.isFinite(value as number)) {\n    return value.toString();\n  }\n  return '';\n}\n\nexport function toIntegerOrUndefined(value: string): number | undefined {\n  if (!value) {\n    return undefined;\n  }\n  const v = parseInt(value, 10);\n  return isNaN(v) ? undefined : v;\n}\n\nexport function toFloatOrUndefined(value: string): number | undefined {\n  if (!value) {\n    return undefined;\n  }\n  const v = parseFloat(value);\n  return isNaN(v) ? undefined : v;\n}\n\nexport const toPascalCase = (string: string) => {\n  const str = camelCase(string);\n  return str.charAt(0).toUpperCase() + str.substring(1);\n};\n","var path = 'public/app/features/panel/partials/panelTime.html';\nvar html = \"<div class=gf-form-group>\\n\\t<div class=gf-form>\\n\\t\\t<span class=gf-form-label>\\n\\t\\t\\t<icon name=\\\"'clock-nine'\\\"></icon>\\n\\t\\t</span>\\n\\n\\t\\t<span class=\\\"gf-form-label width-12\\\">Override relative time</span>\\n\\t\\t<span class=\\\"gf-form-label width-6\\\">Last</span>\\n\\n\\t\\t<input type=text class=\\\"gf-form-input max-width-8\\\" placeholder=1h empty-to-null ng-model=ctrl.panel.timeFrom valid-time-span ng-change=ctrl.refresh() ng-model-onblur>\\n\\t</div>\\n\\n\\t<div class=gf-form>\\n\\t\\t<span class=gf-form-label>\\n\\t\\t\\t<icon name=\\\"'clock-nine'\\\"></icon>\\n\\t\\t</span>\\n\\t\\t<span class=\\\"gf-form-label width-12\\\">Add time shift</span>\\n\\t\\t<span class=\\\"gf-form-label width-6\\\">Amount</span>\\n\\t\\t<input type=text class=\\\"gf-form-input max-width-8\\\" placeholder=1h empty-to-null ng-model=ctrl.panel.timeShift valid-time-span ng-change=ctrl.refresh() ng-model-onblur>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<span class=gf-form-label>\\n\\t\\t\\t\\t<icon name=\\\"'clock-nine'\\\"></icon>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\t\\t<gf-form-switch class=\\\"gf-form max-width-30\\\" label=\\\"Hide time override info\\\" label-class=width-12 checked=ctrl.panel.hideTimeOverride switch-class=max-width-6 on-change=ctrl.refresh()>\\n\\t\\t</gf-form-switch>\\n\\t</div>\\n</div>\\n\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React from 'react';\nimport { css } from 'emotion';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { Icon } from '../Icon/Icon';\nimport { ComponentSize } from '../../types/size';\nimport { GrafanaTheme } from '@grafana/data';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  content: css`\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    white-space: nowrap;\n    height: 100%;\n  `,\n\n  icon: css`\n    & + * {\n      margin-left: ${theme.spacing.sm};\n    }\n  `,\n}));\n\ntype Props = {\n  icon?: IconName;\n  className?: string;\n  children: React.ReactNode;\n  size?: ComponentSize;\n};\n\nexport function ButtonContent(props: Props) {\n  const { icon, children, size } = props;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  if (!children) {\n    return <span className={styles.content}>{icon && <Icon name={icon} size={size} />}</span>;\n  }\n\n  const iconElement = icon && (\n    <span className={styles.icon}>\n      <Icon name={icon} size={size} />\n    </span>\n  );\n\n  return (\n    <span className={styles.content}>\n      {iconElement}\n      <span>{children}</span>\n    </span>\n  );\n}\n","import React, { AnchorHTMLAttributes, ButtonHTMLAttributes, useContext } from 'react';\nimport { css, cx } from 'emotion';\nimport tinycolor from 'tinycolor2';\nimport { stylesFactory, ThemeContext } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { getFocusStyle, getPropertiesForButtonSize } from '../Forms/commonStyles';\nimport { GrafanaTheme } from '@grafana/data';\nimport { ButtonContent } from './ButtonContent';\nimport { ComponentSize } from '../../types/size';\n\nconst buttonVariantStyles = (from: string, to: string, textColor: string) => css`\n  background: linear-gradient(180deg, ${from} 0%, ${to} 100%);\n  color: ${textColor};\n  &:hover {\n    background: ${from};\n    color: ${textColor};\n  }\n\n  &:focus {\n    background: ${from};\n    outline: none;\n  }\n`;\n\nconst getPropertiesForVariant = (theme: GrafanaTheme, variant: ButtonVariant) => {\n  switch (variant) {\n    case 'secondary':\n      const from = theme.isLight ? theme.palette.gray7 : theme.palette.gray15;\n      const to = theme.isLight\n        ? tinycolor(from)\n            .darken(5)\n            .toString()\n        : tinycolor(from)\n            .lighten(4)\n            .toString();\n      return {\n        borderColor: theme.isLight ? theme.palette.gray85 : theme.palette.gray25,\n        background: buttonVariantStyles(from, to, theme.isLight ? theme.palette.gray25 : theme.palette.gray4),\n      };\n\n    case 'destructive':\n      return {\n        borderColor: theme.palette.redShade,\n        background: buttonVariantStyles(theme.palette.redBase, theme.palette.redShade, theme.palette.white),\n      };\n\n    case 'link':\n      return {\n        borderColor: 'transparent',\n        background: buttonVariantStyles('transparent', 'transparent', theme.colors.linkExternal),\n        variantStyles: css`\n          &:focus {\n            outline: none;\n            box-shadow: none;\n          }\n        `,\n      };\n    case 'primary':\n    default:\n      return {\n        borderColor: theme.colors.bgBlue1,\n        background: buttonVariantStyles(theme.colors.bgBlue1, theme.colors.bgBlue2, theme.palette.white),\n      };\n  }\n};\n\nexport interface StyleProps {\n  theme: GrafanaTheme;\n  size: ComponentSize;\n  variant: ButtonVariant;\n  hasIcon: boolean;\n  hasText: boolean;\n}\n\nexport const getButtonStyles = stylesFactory((props: StyleProps) => {\n  const { theme, variant } = props;\n  const { padding, fontSize, height } = getPropertiesForButtonSize(props);\n  const { background, borderColor, variantStyles } = getPropertiesForVariant(theme, variant);\n\n  return {\n    button: cx(\n      css`\n        label: button;\n        display: inline-flex;\n        align-items: center;\n        font-weight: ${theme.typography.weight.semibold};\n        font-family: ${theme.typography.fontFamily.sansSerif};\n        font-size: ${fontSize};\n        padding: ${padding};\n        height: ${height}px;\n        // Deduct border from line-height for perfect vertical centering on windows and linux\n        line-height: ${height - 2}px;\n        vertical-align: middle;\n        cursor: pointer;\n        border: 1px solid ${borderColor};\n        border-radius: ${theme.border.radius.sm};\n        ${background};\n\n        &[disabled],\n        &:disabled {\n          cursor: not-allowed;\n          opacity: 0.65;\n          box-shadow: none;\n        }\n      `,\n      getFocusStyle(theme),\n      css`\n        ${variantStyles}\n      `\n    ),\n    // used for buttons with icon only\n    iconButton: css`\n      padding-right: 0;\n    `,\n    iconWrap: css`\n      label: button-icon-wrap;\n      & + * {\n        margin-left: ${theme.spacing.sm};\n      }\n    `,\n  };\n});\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'link';\n\ntype CommonProps = {\n  size?: ComponentSize;\n  variant?: ButtonVariant;\n  icon?: IconName;\n  className?: string;\n};\n\nexport type ButtonProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ variant, icon, children, className, ...otherProps }, ref) => {\n    const theme = useContext(ThemeContext);\n    const styles = getButtonStyles({\n      theme,\n      size: otherProps.size || 'md',\n      variant: variant || 'primary',\n      hasText: children !== undefined,\n      hasIcon: icon !== undefined,\n    });\n\n    return (\n      <button className={cx(styles.button, className)} {...otherProps} ref={ref}>\n        <ButtonContent icon={icon} size={otherProps.size}>\n          {children}\n        </ButtonContent>\n      </button>\n    );\n  }\n);\n\nButton.displayName = 'Button';\n\ntype ButtonLinkProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement> & AnchorHTMLAttributes<HTMLAnchorElement>;\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(\n  ({ variant, icon, children, className, ...otherProps }, ref) => {\n    const theme = useContext(ThemeContext);\n    const styles = getButtonStyles({\n      theme,\n      size: otherProps.size || 'md',\n      variant: variant || 'primary',\n      hasText: children !== undefined,\n      hasIcon: icon !== undefined,\n    });\n\n    return (\n      <a className={cx(styles.button, className)} {...otherProps} ref={ref}>\n        <ButtonContent icon={icon} size={otherProps.size}>\n          {children}\n        </ButtonContent>\n      </a>\n    );\n  }\n);\nLinkButton.displayName = 'LinkButton';\n","import { getBackendSrv } from '@grafana/runtime';\nimport { PluginMeta } from '@grafana/data';\n\ntype PluginCache = {\n  [key: string]: PluginMeta;\n};\n\nconst pluginInfoCache: PluginCache = {};\n\nexport function getPluginSettings(pluginId: string): Promise<PluginMeta> {\n  const v = pluginInfoCache[pluginId];\n  if (v) {\n    return Promise.resolve(v);\n  }\n  return getBackendSrv()\n    .get(`/api/plugins/${pluginId}/settings`)\n    .then((settings: any) => {\n      pluginInfoCache[pluginId] = settings;\n      return settings;\n    })\n    .catch((err: any) => {\n      // err.isHandled = true;\n      return Promise.reject('Unknown Plugin');\n    });\n}\n","import coreModule from 'app/core/core_module';\nimport { appEvents } from 'app/core/app_events';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { removePanel } from '../utils/panel';\nimport { CoreEvents, DashboardMeta } from 'app/types';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { backendSrv, getBackendSrv } from 'app/core/services/backend_srv';\nimport { promiseToDigest } from '../../../core/utils/promiseToDigest';\n\nexport class DashboardSrv {\n  dashboard: DashboardModel;\n\n  /** @ngInject */\n  constructor(private $rootScope: GrafanaRootScope) {\n    appEvents.on(CoreEvents.removePanel, this.onRemovePanel);\n  }\n\n  create(dashboard: any, meta: DashboardMeta) {\n    return new DashboardModel(dashboard, meta);\n  }\n\n  setCurrent(dashboard: DashboardModel) {\n    this.dashboard = dashboard;\n  }\n\n  getCurrent(): DashboardModel {\n    return this.dashboard;\n  }\n\n  onRemovePanel = (panelId: number) => {\n    const dashboard = this.getCurrent();\n    removePanel(dashboard, dashboard.getPanelById(panelId), true);\n  };\n\n  saveJSONDashboard(json: string) {\n    const parsedJson = JSON.parse(json);\n    return getBackendSrv().saveDashboard(parsedJson, {\n      folderId: this.dashboard.meta.folderId || parsedJson.folderId,\n    });\n  }\n\n  starDashboard(dashboardId: string, isStarred: any) {\n    let promise;\n\n    if (isStarred) {\n      promise = promiseToDigest(this.$rootScope)(\n        backendSrv.delete('/api/user/stars/dashboard/' + dashboardId).then(() => {\n          return false;\n        })\n      );\n    } else {\n      promise = promiseToDigest(this.$rootScope)(\n        backendSrv.post('/api/user/stars/dashboard/' + dashboardId).then(() => {\n          return true;\n        })\n      );\n    }\n\n    return promise.then((res: boolean) => {\n      if (this.dashboard && this.dashboard.id === dashboardId) {\n        this.dashboard.meta.isStarred = res;\n      }\n      return res;\n    });\n  }\n}\n\ncoreModule.service('dashboardSrv', DashboardSrv);\n\n//\n// Code below is to export the service to react components\n//\n\nlet singletonInstance: DashboardSrv;\n\nexport function setDashboardSrv(instance: DashboardSrv) {\n  singletonInstance = instance;\n}\n\nexport function getDashboardSrv(): DashboardSrv {\n  return singletonInstance;\n}\n","import { StoreState } from '../../../types';\nimport { VariableModel } from '../../templating/types';\nimport { getState } from '../../../store/store';\nimport { NEW_VARIABLE_ID } from './types';\n\nexport const getVariable = <T extends VariableModel = VariableModel>(\n  id: string,\n  state: StoreState = getState(),\n  throwWhenMissing = true\n): T => {\n  if (!state.templating.variables[id]) {\n    if (throwWhenMissing) {\n      throw new Error(`Couldn't find variable with id:${id}`);\n    }\n    return (undefined as unknown) as T;\n  }\n\n  return state.templating.variables[id] as T;\n};\n\nexport const getFilteredVariables = (filter: (model: VariableModel) => boolean, state: StoreState = getState()) => {\n  return Object.values(state.templating.variables)\n    .filter(filter)\n    .sort((s1, s2) => s1.index! - s2.index!);\n};\n\nexport const getVariableWithName = (name: string, state: StoreState = getState()) => {\n  return getVariable(name, state, false);\n};\n\nexport const getVariables = (state: StoreState = getState(), includeNewVariable = false): VariableModel[] => {\n  return getFilteredVariables(variable => (includeNewVariable ? true : variable.id! !== NEW_VARIABLE_ID), state);\n};\n\nexport type GetVariables = typeof getVariables;\n\nexport const getNewVariabelIndex = (state: StoreState = getState()): number => {\n  return Object.values(state.templating.variables).length;\n};\n","var path = 'public/app/plugins/datasource/testdata/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl has-text-edit-mode=false>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Scenario</label>\\n\\t\\t\\t<div class=\\\"gf-form-select-wrapper width-15\\\">\\n\\t\\t\\t\\t<select class=gf-form-input ng-model=ctrl.target.scenarioId ng-options=\\\"v.id as v.name for v in ctrl.scenarioList\\\" ng-change=ctrl.scenarioChanged() aria-label={{ctrl.selectors.scenarioSelect}}></select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form gf-form gf-form--grow\\\" ng-if=ctrl.scenario.stringInput>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">String Input</label>\\n      <input type=text class=gf-form-input placeholder={{ctrl.scenario.stringInput}} ng-model=ctrl.target.stringInput ng-change=ctrl.refresh() ng-model-onblur>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Alias</label>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input width-14\\\" placeholder=optional ng-model=ctrl.target.alias ng-change=ctrl.refresh() ng-model-onblur>\\n\\t\\t</div>\\n\\t\\t<div ng-if=ctrl.showLabels class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\tLabels\\n\\t\\t\\t\\t<info-popover mode=right-normal>\\n\\t\\t\\t\\t\\tSet labels using a key=value syntax:<br/>\\n\\t\\t\\t\\t\\t{key=\\\"value\\\", key2=\\\"value\\\"}<br/>\\n\\t\\t\\t\\t\\tkey=\\\"value\\\", key2=\\\"value\\\"<br/>\\n\\t\\t\\t\\t\\tkey=value, key2=value<br/>\\n\\t\\t\\t\\t</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input gf-form--grow\\\" placeholder=\\\"key=value, key2=value2\\\" ng-model=ctrl.target.labels ng-change=ctrl.refresh() ng-model-onblur>\\n\\t\\t</div>\\n\\t\\t<div ng-if=!ctrl.showLabels class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'manual_entry'\\\">\\n\\t\\t<div class=\\\"gf-form gf-form\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">New value</label>\\n      <input type=number class=\\\"gf-form-input width-15\\\" placeholder=value ng-model=ctrl.newPointValue>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Time</label>\\n      <input type=string class=\\\"gf-form-input width-12\\\" placeholder=time ng-model=ctrl.newPointTime>\\n\\t\\t\\t<button class=\\\"btn btn-secondary gf-form-btn\\\" ng-click=ctrl.addPoint()>Add</button>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">All values</label>\\n\\t\\t\\t<gf-form-dropdown css-class=width-12 model=ctrl.selectedPoint get-options=ctrl.getPoints() on-change=ctrl.pointSelected($option)>\\n\\t\\t\\t</gf-form-dropdown>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form gf-form\\\" ng-if=\\\"ctrl.selectedPoint.value !== null\\\">\\n\\t\\t\\t<button class=\\\"btn btn-danger gf-form-btn\\\" ng-click=ctrl.deletePoint()>Delete</button>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n  <div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'random_walk'\\\">\\n    <div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Series count</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-15\\\" placeholder=1 ng-model=ctrl.target.seriesCount min=1 step=1 ng-change=ctrl.refresh() aria-label={{::ctrl.selectors.seriesCount}} />\\n\\t\\t</div>\\n    <div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Start value</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-14\\\" placeholder=auto ng-model=ctrl.target.startValue step=1 ng-change=ctrl.refresh() aria-label={{::ctrl.selectors.startValue}} />\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Spread</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-6\\\" placeholder=1 ng-model=ctrl.target.spread min=0.5 step=0.1 ng-change=ctrl.refresh() aria-label={{::ctrl.selectors.spread}} />\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Noise</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-6\\\" placeholder=0 ng-model=ctrl.target.noise min=0 step=0.1 ng-change=ctrl.refresh() aria-label={{::ctrl.selectors.noise}} />\\n\\t\\t</div>\\n    <div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Min</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-15\\\" placeholder=none ng-model=ctrl.target.min step=0.1 ng-change=ctrl.refresh() aria-label={{::ctrl.selectors.min}} />\\n\\t\\t</div>\\n    <div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Max</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-15\\\" placeholder=none ng-model=ctrl.target.max step=0.1 ng-change=ctrl.refresh() aria-label={{::ctrl.selectors.max}} />\\n\\t\\t</div>\\n  </div>\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'streaming_client'\\\">\\n\\t\\t<div class=\\\"gf-form gf-form\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Type</label>\\n\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t<select ng-model=ctrl.target.stream.type class=gf-form-input ng-options=\\\"type for type in ['signal','logs', 'fetch']\\\" ng-change=ctrl.streamChanged() />\\n\\t\\t\\t\\t\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Speed (ms)</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=value ng-model=ctrl.target.stream.speed min=10 step=10 ng-change=ctrl.streamChanged() />\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.target.stream.type === 'signal'\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Spread</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=value ng-model=ctrl.target.stream.spread min=0.5 step=0.1 ng-change=ctrl.streamChanged() />\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.target.stream.type === 'signal'\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Noise</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=value ng-model=ctrl.target.stream.noise min=0 step=0.1 ng-change=ctrl.streamChanged() />\\n\\t\\t</div>\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.target.stream.type === 'signal'\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Bands</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=bands ng-model=ctrl.target.stream.bands min=0 step=1 ng-change=ctrl.streamChanged() />\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\" ng-if=\\\"ctrl.target.stream.type === 'fetch'\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">URL</label>\\n\\t\\t\\t<input type=string class=\\\"gf-form-input gf-form-label--grow\\\" placeholder=\\\"Fetch URL\\\" ng-model=ctrl.target.stream.url ng-change=ctrl.streamChanged() ng-model-onblur/>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\" ng-if=\\\"ctrl.target.stream.type !== 'fetch'\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'logs'\\\">\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Lines</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=10 ng-model=ctrl.target.lines ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<gf-form-switch class=gf-form label=Level label-class=\\\"query-keyword width-5\\\" checked=ctrl.target.levelColumn switch-class=max-width-6 on-change=ctrl.refresh()></gf-form-switch>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'grafana_api'\\\">\\n\\t\\t<div class=\\\"gf-form gf-form\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">Endpoint</label>\\n\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t<select ng-model=ctrl.target.stringInput class=gf-form-input ng-options=\\\"type for type in ['datasources', 'search', 'annotations']\\\" ng-change=ctrl.refresh() />\\n\\t\\t\\t\\t\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'arrow'\\\">\\n\\t\\t<div class=gf-form style=width:100%>\\n\\t\\t\\t<textarea type=string class=gf-form-input rows=10 placeholder=\\\"copy base64 text data from query result\\\" ng-model=ctrl.target.stringInput ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<!-- Predictable Pulse Scenario Options Form -->\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'predictable_pulse'\\\">\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\tStep\\n\\t\\t\\t\\t<info-popover mode=right-normal>The number of seconds between datapoints.</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=60 ng-model=ctrl.target.pulseWave.timeStep ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\tOn Count\\n\\t\\t\\t\\t<info-popover mode=right-normal>The number of values within a cycle, at the start of the cycle, that should have the onValue.</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-3\\\" placeholder=3 ng-model=ctrl.target.pulseWave.onCount ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\tOff Count\\n\\t\\t\\t\\t<info-popover mode=right-normal>The number of offValues within the cycle.</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t\\t<input type=number class=\\\"gf-form-input width-3\\\" placeholder=6 ng-model=ctrl.target.pulseWave.offCount ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\tOn Value\\n\\t\\t\\t\\t<info-popover mode=right-normal>The value for \\\"on values\\\", may be a int, float, or null.</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t\\t<input type=string class=\\\"gf-form-input width-5\\\" placeholder=1 ng-model=ctrl.target.pulseWave.onValue ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\tOff Value\\n\\t\\t\\t\\t<info-popover mode=right-normal>The value for \\\"off values\\\", may be a int, float, or null.</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t\\t<input type=string class=\\\"gf-form-input width-5\\\" placeholder=1 ng-model=ctrl.target.pulseWave.offValue ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<!-- Predictable CSV Wave Scenario Options Form -->\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.scenario.id === 'predictable_csv_wave'\\\">\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-7\\\">\\n\\t\\t\\t\\t\\tStep\\n\\t\\t\\t\\t\\t<info-popover mode=right-normal>The number of seconds between datapoints.</info-popover>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t<input type=number class=\\\"gf-form-input width-5\\\" placeholder=60 ng-model=ctrl.target.csvWave.timeStep ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-10\\\">\\n\\t\\t\\t\\t\\t\\t\\tCSV Values\\n\\t\\t\\t\\t\\t\\t\\t<info-popover mode=right-normal>Comma separated values. Each value may be an int, float, or null and must not be empty. Whitespace and trailing commas are removed.</info-popover>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t<input type=string class=\\\"gf-form-input gf-form-label--grow\\\" placeholder=1,2,3,2 ng-model=ctrl.target.csvWave.valuesCSV ng-change=ctrl.refresh() ng-model-onblur/>\\n\\t\\t\\t\\t</div>\\n\\t\\t</div>\\n</query-editor-row>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/plugins/panel/graph/time_regions_form.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form-inline ng-repeat=\\\"timeRegion in ctrl.panel.timeRegions\\\">\\n    <div class=gf-form>\\n      <label class=gf-form-label>T{{$index+1}}</label>\\n    </div>\\n\\n    <div class=gf-form>\\n      <label class=gf-form-label>From</label>\\n      <div class=gf-form-select-wrapper>\\n        <select class=\\\"gf-form-input width-6\\\" ng-model=timeRegion.fromDayOfWeek ng-options=\\\"f.d as f.value for f in [{d: undefined, value: 'Any'}, {d:1, value: 'Mon'}, {d:2, value: 'Tue'}, {d:3, value: 'Wed'}, {d:4, value: 'Thu'}, {d:5, value: 'Fri'}, {d:6, value: 'Sat'}, {d:7, value: 'Sun'}]\\\" ng-change=ctrl.render()></select>\\n      </div>\\n      <input type=text ng-maxlength=5 ng-model=timeRegion.from class=\\\"gf-form-input width-5\\\" ng-change=ctrl.render() placeholder=hh:mm />\\n      <label class=gf-form-label>To</label>\\n      <div class=gf-form-select-wrapper>\\n        <select class=\\\"gf-form-input width-6\\\" ng-model=timeRegion.toDayOfWeek ng-options=\\\"f.d as f.value for f in [{d: undefined, value: 'Any'}, {d:1, value: 'Mon'}, {d:2, value: 'Tue'}, {d:3, value: 'Wed'}, {d:4, value: 'Thu'}, {d:5, value: 'Fri'}, {d:6, value: 'Sat'}, {d:7, value: 'Sun'}]\\\" ng-change=ctrl.render()></select>\\n      </div>\\n      <input type=text ng-maxlength=5 ng-model=timeRegion.to class=\\\"gf-form-input width-5\\\" ng-change=ctrl.render() placeholder=hh:mm />\\n    </div>\\n\\n    <div class=gf-form>\\n      <label class=gf-form-label>Color</label>\\n      <div class=gf-form-select-wrapper>\\n        <select class=gf-form-input ng-model=timeRegion.colorMode ng-options=\\\"f.key as f.value for f in ctrl.colorModes\\\" ng-change=ctrl.render()>\\n        </select>\\n      </div>\\n    </div>\\n\\n    <gf-form-switch class=gf-form label=Fill checked=timeRegion.fill on-change=ctrl.render()></gf-form-switch>\\n\\n    <div class=gf-form ng-if=\\\"timeRegion.fill && timeRegion.colorMode === 'custom'\\\">\\n      <label class=gf-form-label>Fill color</label>\\n      <span class=gf-form-label>\\n        <color-picker color=timeRegion.fillColor onchange=ctrl.onFillColorChange($index)></color-picker>\\n      </span>\\n    </div>\\n\\n    <gf-form-switch class=gf-form label=Line checked=timeRegion.line on-change=ctrl.render()></gf-form-switch>\\n\\n    <div class=gf-form ng-if=\\\"timeRegion.line && timeRegion.colorMode === 'custom'\\\">\\n      <label class=gf-form-label>Line color</label>\\n      <span class=gf-form-label>\\n        <color-picker color=timeRegion.lineColor onchange=ctrl.onLineColorChange($index)></color-picker>\\n      </span>\\n    </div>\\n\\n    <div class=gf-form>\\n      <label class=gf-form-label>\\n        <a class=pointer ng-click=ctrl.removeTimeRegion($index)>\\n          <icon name=\\\"'trash-alt'\\\"></icon>\\n        </a>\\n      </label>\\n    </div>\\n  </div>\\n\\n  <div class=gf-form-button-row>\\n    <button class=\\\"btn btn-inverse\\\" ng-click=ctrl.addTimeRegion()>\\n      <icon name=\\\"'plus'\\\"></icon>&nbsp;Add time region<tip>All configured time regions refers to UTC time</tip>\\n    </button>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { Vector } from '../types/vector';\nimport { vectorToArray } from './vectorToArray';\n\ninterface AppendedVectorInfo<T> {\n  start: number;\n  end: number;\n  values: Vector<T>;\n}\n\n/**\n * This may be more trouble than it is worth.  This trades some computation time for\n * RAM -- rather than allocate a new array the size of all previous arrays, this just\n * points the correct index to their original array values\n */\nexport class AppendedVectors<T = any> implements Vector<T> {\n  length = 0;\n  source: Array<AppendedVectorInfo<T>> = [];\n\n  constructor(startAt = 0) {\n    this.length = startAt;\n  }\n\n  /**\n   * Make the vector look like it is this long\n   */\n  setLength(length: number) {\n    if (length > this.length) {\n      // make the vector longer (filling with undefined)\n      this.length = length;\n    } else if (length < this.length) {\n      // make the array shorter\n      const sources: Array<AppendedVectorInfo<T>> = [];\n      for (const src of this.source) {\n        sources.push(src);\n        if (src.end > length) {\n          src.end = length;\n          break;\n        }\n      }\n      this.source = sources;\n      this.length = length;\n    }\n  }\n\n  append(v: Vector<T>): AppendedVectorInfo<T> {\n    const info = {\n      start: this.length,\n      end: this.length + v.length,\n      values: v,\n    };\n    this.length = info.end;\n    this.source.push(info);\n    return info;\n  }\n\n  get(index: number): T {\n    for (let i = 0; i < this.source.length; i++) {\n      const src = this.source[i];\n      if (index >= src.start && index < src.end) {\n        return src.values.get(index - src.start);\n      }\n    }\n    return (undefined as unknown) as T;\n  }\n\n  toArray(): T[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): T[] {\n    return vectorToArray(this);\n  }\n}\n","import { Vector } from '../types/vector';\n\nexport class ConstantVector<T = any> implements Vector<T> {\n  constructor(private value: T, private len: number) {}\n\n  get length() {\n    return this.len;\n  }\n\n  get(index: number): T {\n    return this.value;\n  }\n\n  toArray(): T[] {\n    const arr = new Array<T>(this.length);\n    return arr.fill(this.value);\n  }\n\n  toJSON(): T[] {\n    return this.toArray();\n  }\n}\n","import { Vector } from '../types/vector';\nimport { vectorToArray } from './vectorToArray';\nimport { BinaryOperation } from '../utils/binaryOperators';\n\nexport class BinaryOperationVector implements Vector<number> {\n  constructor(private left: Vector<number>, private right: Vector<number>, private operation: BinaryOperation) {}\n\n  get length(): number {\n    return this.left.length;\n  }\n\n  get(index: number): number {\n    return this.operation(this.left.get(index), this.right.get(index));\n  }\n\n  toArray(): number[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): number[] {\n    return vectorToArray(this);\n  }\n}\n","import { Vector } from '../types/vector';\nimport { DisplayProcessor } from '../types';\nimport { formattedValueToString } from '../valueFormats';\nimport { vectorToArray } from './vectorToArray';\n\nexport class FormattedVector<T = any> implements Vector<string> {\n  constructor(private source: Vector<T>, private formatter: DisplayProcessor) {}\n\n  get length() {\n    return this.source.length;\n  }\n\n  get(index: number): string {\n    const v = this.source.get(index);\n    return formattedValueToString(this.formatter(v));\n  }\n\n  toArray(): string[] {\n    return vectorToArray(this);\n  }\n\n  toJSON(): string[] {\n    return this.toArray();\n  }\n}\n","export * from './AppendedVectors';\nexport * from './ArrayVector';\nexport * from './CircularVector';\nexport * from './ConstantVector';\nexport * from './BinaryOperationVector';\nexport * from './SortedVector';\nexport * from './FormattedVector';\n\nexport { vectorator } from './FunctionalVector';\n","import { Field, DataFrame } from '../../types/dataFrame';\nimport { FieldMatcherID, FrameMatcherID } from './ids';\nimport { FieldMatcherInfo, FrameMatcherInfo, FieldMatcher } from '../../types/transformations';\nimport { stringToJsRegex } from '../../text/string';\nimport { getFieldDisplayName } from '../../field/fieldState';\n\nexport interface RegexpOrNamesMatcherOptions {\n  pattern?: string;\n  names?: string[];\n}\n\n// General Field matcher\nconst fieldNameMatcher: FieldMatcherInfo<string> = {\n  id: FieldMatcherID.byName,\n  name: 'Field Name',\n  description: 'match the field name',\n  defaultOptions: '',\n\n  get: (name: string): FieldMatcher => {\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      return getFieldDisplayName(field, frame, allFrames) === name;\n    };\n  },\n\n  getOptionsDisplayText: (name: string) => {\n    return `Field name: ${name}`;\n  },\n};\n\nconst multipleFieldNamesMatcher: FieldMatcherInfo<string[]> = {\n  id: FieldMatcherID.byNames,\n  name: 'Field Names',\n  description: 'match any of the given the field names',\n  defaultOptions: [],\n\n  get: (names: string[]): FieldMatcher => {\n    const uniqueNames = new Set<string>(names ?? []);\n\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      return uniqueNames.has(getFieldDisplayName(field, frame, allFrames));\n    };\n  },\n\n  getOptionsDisplayText: (names: string[]): string => {\n    return `Field names: ${names.join(', ')}`;\n  },\n};\n\nconst regexpFieldNameMatcher: FieldMatcherInfo<string> = {\n  id: FieldMatcherID.byRegexp,\n  name: 'Field Name by Regexp',\n  description: 'match the field name by a given regexp pattern',\n  defaultOptions: '/.*/',\n\n  get: (pattern: string): FieldMatcher => {\n    const regexp = patternToRegex(pattern);\n\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      const displayName = getFieldDisplayName(field, frame, allFrames);\n      return !!regexp && regexp.test(displayName);\n    };\n  },\n\n  getOptionsDisplayText: (pattern: string): string => {\n    return `Field name by pattern: ${pattern}`;\n  },\n};\n\nconst regexpOrMultipleNamesMatcher: FieldMatcherInfo<RegexpOrNamesMatcherOptions> = {\n  id: FieldMatcherID.byRegexpOrNames,\n  name: 'Field Name by Regexp or Names',\n  description: 'match the field name by a given regexp pattern or given names',\n  defaultOptions: {\n    pattern: '/.*/',\n    names: [],\n  },\n\n  get: (options: RegexpOrNamesMatcherOptions): FieldMatcher => {\n    const regexpMatcher = regexpFieldNameMatcher.get(options?.pattern || '');\n    const namesMatcher = multipleFieldNamesMatcher.get(options?.names ?? []);\n\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      return namesMatcher(field, frame, allFrames) || regexpMatcher(field, frame, allFrames);\n    };\n  },\n\n  getOptionsDisplayText: (options: RegexpOrNamesMatcherOptions): string => {\n    const pattern = options?.pattern ?? '';\n    const names = options?.names?.join(',') ?? '';\n    return `Field name by pattern: ${pattern} or names: ${names}`;\n  },\n};\n\nconst patternToRegex = (pattern?: string): RegExp | undefined => {\n  if (!pattern) {\n    return undefined;\n  }\n\n  try {\n    return stringToJsRegex(pattern);\n  } catch (error) {\n    console.log(error);\n    return undefined;\n  }\n};\n\n// General Frame matcher\nconst frameNameMatcher: FrameMatcherInfo<string> = {\n  id: FrameMatcherID.byName,\n  name: 'Frame Name',\n  description: 'match the frame name',\n  defaultOptions: '/.*/',\n\n  get: (pattern: string) => {\n    const regex = stringToJsRegex(pattern);\n    return (frame: DataFrame) => {\n      return regex.test(frame.name || '');\n    };\n  },\n\n  getOptionsDisplayText: (pattern: string) => {\n    return `Frame name: ${pattern}`;\n  },\n};\n\n/**\n * Registry Initalization\n */\nexport function getFieldNameMatchers(): FieldMatcherInfo[] {\n  return [fieldNameMatcher, regexpFieldNameMatcher, multipleFieldNamesMatcher, regexpOrMultipleNamesMatcher];\n}\n\nexport function getFrameNameMatchers(): FrameMatcherInfo[] {\n  return [frameNameMatcher];\n}\n","import React, { PureComponent, ReactElement } from 'react';\nimport Select from './Select';\nimport { PopoverContent } from '../../../Tooltip/Tooltip';\nimport { Icon } from '../../../Icon/Icon';\nimport { IconName } from '../../../../types';\nimport { SelectableValue } from '@grafana/data';\n\ninterface ButtonComponentProps {\n  label: ReactElement | string | undefined;\n  className: string | undefined;\n  iconClass?: string;\n}\n\nconst ButtonComponent = (buttonProps: ButtonComponentProps) => (props: any) => {\n  const { label, className, iconClass } = buttonProps;\n\n  return (\n    <div // changed to div because of FireFox on MacOs issue below\n      ref={props.innerRef}\n      className={`btn navbar-button navbar-button--tight ${className}`}\n      onClick={props.selectProps.menuIsOpen ? props.selectProps.onMenuClose : props.selectProps.onMenuOpen}\n      onBlur={props.selectProps.onMenuClose}\n      tabIndex={0} // necessary to get onBlur to work https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus\n    >\n      <div className=\"select-button\">\n        {iconClass && <Icon className={'select-button-icon'} name={iconClass as IconName} size=\"lg\" />}\n        <span className=\"select-button-value\">{label ? label : ''}</span>\n        {!props.menuIsOpen && <Icon name=\"angle-down\" style={{ marginBottom: 0 }} size=\"lg\" />}\n        {props.menuIsOpen && <Icon name=\"angle-up\" style={{ marginBottom: 0 }} size=\"lg\" />}\n      </div>\n    </div>\n  );\n};\n\nexport interface Props<T> {\n  className: string | undefined;\n  options: Array<SelectableValue<T>>;\n  value?: SelectableValue<T>;\n  label?: ReactElement | string;\n  iconClass?: string;\n  components?: any;\n  maxMenuHeight?: number;\n  onChange: (item: SelectableValue<T>) => void;\n  tooltipContent?: PopoverContent;\n  isMenuOpen?: boolean;\n  onOpenMenu?: () => void;\n  onCloseMenu?: () => void;\n  tabSelectsValue?: boolean;\n  autoFocus?: boolean;\n}\n\nexport class ButtonSelect<T> extends PureComponent<Props<T>> {\n  onChange = (item: SelectableValue<T>) => {\n    const { onChange } = this.props;\n    onChange(item);\n  };\n\n  render() {\n    const {\n      className,\n      options,\n      value,\n      label,\n      iconClass,\n      components,\n      maxMenuHeight,\n      tooltipContent,\n      isMenuOpen,\n      onOpenMenu,\n      onCloseMenu,\n      tabSelectsValue,\n      autoFocus = true,\n    } = this.props;\n    const combinedComponents = {\n      ...components,\n      Control: ButtonComponent({ label, className, iconClass }),\n    };\n\n    return (\n      <Select\n        autoFocus={autoFocus}\n        backspaceRemovesValue={false}\n        isClearable={false}\n        isSearchable={false}\n        options={options}\n        onChange={this.onChange}\n        value={value}\n        isOpen={isMenuOpen}\n        onOpenMenu={onOpenMenu}\n        onCloseMenu={onCloseMenu}\n        maxMenuHeight={maxMenuHeight}\n        components={combinedComponents}\n        className=\"gf-form-select-box-button-select\"\n        tooltipContent={tooltipContent}\n        tabSelectsValue={tabSelectsValue}\n      />\n    );\n  }\n}\n","var path = 'public/app/plugins/panel/alertlist/editor.html';\nvar html = \"<div>\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Options</h5>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-8\\\">Show</span>\\n      <div class=\\\"gf-form-select-wrapper max-width-15\\\">\\n        <select class=gf-form-input ng-model=ctrl.panel.show ng-options=\\\"f.value as f.text for f in ctrl.showOptions\\\" ng-change=ctrl.onRefresh()></select>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-8\\\">Max items</span>\\n      <input type=text class=\\\"gf-form-input max-width-15\\\" ng-model=ctrl.panel.limit ng-change=ctrl.onRefresh() />\\n    </div>\\n    <div class=gf-form ng-show=\\\"ctrl.panel.show === 'current'\\\">\\n      <span class=\\\"gf-form-label width-8\\\">Sort order</span>\\n      <div class=\\\"gf-form-select-wrapper max-width-15\\\">\\n        <select class=gf-form-input ng-model=ctrl.panel.sortOrder ng-options=\\\"f.value as f.text for f in ctrl.sortOrderOptions\\\" ng-change=ctrl.onRefresh()></select>\\n      </div>\\n    </div>\\n    <gf-form-switch class=gf-form label=\\\"Alerts from this dashboard\\\" label-class=width-18 checked=ctrl.panel.onlyAlertsOnDashboard on-change=ctrl.updateStateFilter()></gf-form-switch>\\n  </div>\\n  <div class=\\\"section gf-form-group\\\" ng-show=\\\"ctrl.panel.show === 'current'\\\">\\n    <h5 class=section-heading>Filter</h5>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-8\\\">Alert name</span>\\n      <input type=text class=\\\"gf-form-input max-width-15\\\" ng-model=ctrl.panel.nameFilter placeholder=\\\"Alert name query\\\" ng-change=ctrl.onRefresh() />\\n    </div>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-8\\\">Dashboard title</span>\\n      <input type=text class=gf-form-input placeholder=\\\"Dashboard title query\\\" ng-model=ctrl.panel.dashboardFilter ng-change=ctrl.onRefresh() ng-model-onblur>\\n    </div>\\n    <div class=gf-form>\\n      <folder-picker initial-folder-id=ctrl.panel.folderId on-change=ctrl.onFolderChange label-class=width-8 initial-title=\\\"'All'\\\" enable-reset=true>\\n      </folder-picker>\\n    </div>\\n    <div class=gf-form>\\n      <span class=\\\"gf-form-label width-8\\\">Dashboard tags</span>\\n      <bootstrap-tagsinput ng-model=ctrl.panel.dashboardTags tagclass=\\\"label label-tag\\\" placeholder=\\\"add tags\\\" on-tags-updated=ctrl.refresh()>\\n      </bootstrap-tagsinput>\\n    </div>\\n  </div>\\n  <div class=\\\"section gf-form-group\\\" ng-show=\\\"ctrl.panel.show === 'current'\\\">\\n    <h5 class=section-heading>State filter</h5>\\n    <gf-form-switch class=gf-form label=Ok label-class=width-10 checked=\\\"ctrl.stateFilter['ok']\\\" on-change=ctrl.updateStateFilter()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=Paused label-class=width-10 checked=\\\"ctrl.stateFilter['paused']\\\" on-change=ctrl.updateStateFilter()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=\\\"No data\\\" label-class=width-10 checked=\\\"ctrl.stateFilter['no_data']\\\" on-change=ctrl.updateStateFilter()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=\\\"Execution error\\\" label-class=width-10 checked=\\\"ctrl.stateFilter['execution_error']\\\" on-change=ctrl.updateStateFilter()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=Alerting label-class=width-10 checked=\\\"ctrl.stateFilter['alerting']\\\" on-change=ctrl.updateStateFilter()></gf-form-switch>\\n    <gf-form-switch class=gf-form label=Pending label-class=width-10 checked=\\\"ctrl.stateFilter['pending']\\\" on-change=ctrl.updateStateFilter()></gf-form-switch>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { DataFrame, Field, TIME_SERIES_VALUE_FIELD_NAME, FieldType, TIME_SERIES_TIME_FIELD_NAME } from '../types';\nimport { formatLabels } from '../utils/labels';\n\n/**\n * Get an appropriate display title\n */\nexport function getFrameDisplayName(frame: DataFrame, index?: number) {\n  if (frame.name) {\n    return frame.name;\n  }\n\n  // Single field with tags\n  const valuesWithLabels = frame.fields.filter(f => f.labels !== undefined);\n  if (valuesWithLabels.length === 1) {\n    return formatLabels(valuesWithLabels[0].labels!);\n  }\n\n  // list all the\n  if (index === undefined) {\n    return frame.fields\n      .filter(f => f.type !== FieldType.time)\n      .map(f => getFieldDisplayName(f, frame))\n      .join(', ');\n  }\n\n  if (frame.refId) {\n    return `Series (${frame.refId})`;\n  }\n\n  return `Series (${index})`;\n}\n\nexport function getFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: DataFrame[]): string {\n  const existingTitle = field.state?.displayName;\n\n  if (existingTitle) {\n    return existingTitle;\n  }\n\n  const displayName = calculateFieldDisplayName(field, frame, allFrames);\n  field.state = {\n    ...field.state,\n    displayName,\n  };\n\n  return displayName;\n}\n\n/**\n * Get an appropriate display name. If the 'displayName' field config is set, use that\n */\nfunction calculateFieldDisplayName(field: Field, frame?: DataFrame, allFrames?: DataFrame[]): string {\n  const hasConfigTitle = field.config?.displayName && field.config?.displayName.length;\n\n  let displayName = hasConfigTitle ? field.config!.displayName! : field.name;\n\n  if (hasConfigTitle) {\n    return displayName;\n  }\n\n  // This is an ugly exception for time field\n  // For time series we should normally treat time field with same name\n  // But in case it has a join source we should handle it as normal field\n  if (field.type === FieldType.time && !field.labels) {\n    return displayName ?? TIME_SERIES_TIME_FIELD_NAME;\n  }\n\n  let parts: string[] = [];\n  let frameNamesDiffer = false;\n\n  if (allFrames && allFrames.length > 1) {\n    for (let i = 1; i < allFrames.length; i++) {\n      const frame = allFrames[i];\n      if (frame.name !== allFrames[i - 1].name) {\n        frameNamesDiffer = true;\n        break;\n      }\n    }\n  }\n\n  let frameNameAdded = false;\n  let labelsAdded = false;\n\n  if (frameNamesDiffer && frame?.name) {\n    parts.push(frame.name);\n    frameNameAdded = true;\n  }\n\n  if (field.name && field.name !== TIME_SERIES_VALUE_FIELD_NAME) {\n    parts.push(field.name);\n  }\n\n  if (field.labels && frame) {\n    let singleLabelName = getSingleLabelName(allFrames ?? [frame]);\n\n    if (!singleLabelName) {\n      let allLabels = formatLabels(field.labels);\n      if (allLabels) {\n        parts.push(allLabels);\n        labelsAdded = true;\n      }\n    } else if (field.labels[singleLabelName]) {\n      parts.push(field.labels[singleLabelName]);\n      labelsAdded = true;\n    }\n  }\n\n  // if we have not added frame name and no labels, and field name = Value, we should add frame name\n  if (frame && !frameNameAdded && !labelsAdded && field.name === TIME_SERIES_VALUE_FIELD_NAME) {\n    if (frame.name && frame.name.length > 0) {\n      parts.push(frame.name);\n      frameNameAdded = true;\n    }\n  }\n\n  if (parts.length) {\n    displayName = parts.join(' ');\n  } else if (field.name) {\n    displayName = field.name;\n  } else {\n    displayName = TIME_SERIES_VALUE_FIELD_NAME;\n  }\n\n  return displayName;\n}\n\n/**\n * Checks all data frames and return name of label if there is only one label name in all frames\n */\nfunction getSingleLabelName(frames: DataFrame[]): string | null {\n  let singleName: string | null = null;\n\n  for (let i = 0; i < frames.length; i++) {\n    const frame = frames[i];\n\n    for (const field of frame.fields) {\n      if (!field.labels) {\n        continue;\n      }\n\n      // yes this should be in!\n      for (const labelKey in field.labels) {\n        if (singleName === null) {\n          singleName = labelKey;\n        } else if (labelKey !== singleName) {\n          return null;\n        }\n      }\n    }\n  }\n\n  return singleName;\n}\n","import React, { FC } from 'react';\nimport { css, cx } from 'emotion';\nimport { stylesFactory } from '../../themes';\n\nexport interface Props {\n  className?: string;\n}\n\nexport const FullWidthButtonContainer: FC<Props> = ({ className, children }) => {\n  const styles = getStyles();\n\n  return <div className={cx(styles, className)}>{children}</div>;\n};\n\nconst getStyles = stylesFactory(() => {\n  return css`\n    display: flex;\n\n    button {\n      flex-grow: 1;\n      justify-content: center;\n    }\n\n    > * {\n      flex-grow: 1;\n    }\n\n    label {\n      flex-grow: 1;\n      text-align: center;\n    }\n  `;\n});\n","import { DataFrame, DataTransformerInfo, Field } from '../../types';\nimport { DataTransformerID } from './ids';\nimport { MutableDataFrame } from '../../dataframe';\nimport { ArrayVector } from '../../vector';\nimport { getFieldDisplayName } from '../../field/fieldState';\n\nexport interface SeriesToColumnsOptions {\n  byField?: string;\n}\n\nconst DEFAULT_KEY_FIELD = 'Time';\n\nexport const seriesToColumnsTransformer: DataTransformerInfo<SeriesToColumnsOptions> = {\n  id: DataTransformerID.seriesToColumns,\n  name: 'Series as columns',\n  description: 'Groups series by field and returns values as columns',\n  defaultOptions: {\n    byField: DEFAULT_KEY_FIELD,\n  },\n  transformer: options => (data: DataFrame[]) => {\n    const keyFieldMatch = options.byField || DEFAULT_KEY_FIELD;\n    const allFields: FieldsToProcess[] = [];\n\n    for (let frameIndex = 0; frameIndex < data.length; frameIndex++) {\n      const frame = data[frameIndex];\n      const keyField = findKeyField(frame, keyFieldMatch);\n\n      if (!keyField) {\n        return data;\n      }\n\n      for (let fieldIndex = 0; fieldIndex < frame.fields.length; fieldIndex++) {\n        const sourceField = frame.fields[fieldIndex];\n\n        if (sourceField === keyField) {\n          continue;\n        }\n\n        let labels = sourceField.labels ?? {};\n\n        if (frame.name) {\n          labels = { ...labels, name: frame.name };\n        }\n\n        allFields.push({\n          keyField,\n          sourceField,\n          newField: {\n            ...sourceField,\n            state: null,\n            values: new ArrayVector([]),\n            labels,\n          },\n        });\n      }\n    }\n\n    // if no key fields or more than one value field\n    if (allFields.length <= 1) {\n      return data;\n    }\n\n    const resultFrame = new MutableDataFrame();\n\n    resultFrame.addField({\n      ...allFields[0].keyField,\n      values: new ArrayVector([]),\n    });\n\n    for (const item of allFields) {\n      resultFrame.addField(item.newField);\n    }\n\n    const keyFieldTitle = getFieldDisplayName(resultFrame.fields[0], resultFrame);\n    const byKeyField: { [key: string]: { [key: string]: any } } = {};\n\n    /*    \n    this loop creates a dictionary object that groups the key fields values \n    {\n      \"key field first value as string\" : {\n        \"key field name\": key field first value,\n        \"other series name\": other series value\n        \"other series n name\": other series n value\n      },\n      \"key field n value as string\" : {\n        \"key field name\": key field n value,\n        \"other series name\": other series value\n        \"other series n name\": other series n value\n      }\n    }\n    */\n\n    for (let fieldIndex = 0; fieldIndex < allFields.length; fieldIndex++) {\n      const { sourceField, keyField, newField } = allFields[fieldIndex];\n      const newFieldTitle = getFieldDisplayName(newField, resultFrame);\n\n      for (let valueIndex = 0; valueIndex < sourceField.values.length; valueIndex++) {\n        const value = sourceField.values.get(valueIndex);\n        const keyValue = keyField.values.get(valueIndex);\n\n        if (!byKeyField[keyValue]) {\n          byKeyField[keyValue] = { [newFieldTitle]: value, [keyFieldTitle]: keyValue };\n        } else {\n          byKeyField[keyValue][newFieldTitle] = value;\n        }\n      }\n    }\n\n    const keyValueStrings = Object.keys(byKeyField);\n    for (let rowIndex = 0; rowIndex < keyValueStrings.length; rowIndex++) {\n      const keyValueAsString = keyValueStrings[rowIndex];\n\n      for (let fieldIndex = 0; fieldIndex < resultFrame.fields.length; fieldIndex++) {\n        const field = resultFrame.fields[fieldIndex];\n        const otherColumnName = getFieldDisplayName(field, resultFrame);\n        const value = byKeyField[keyValueAsString][otherColumnName] ?? null;\n        field.values.add(value);\n      }\n    }\n\n    return [resultFrame];\n  },\n};\n\nfunction findKeyField(frame: DataFrame, matchTitle: string): Field | null {\n  for (let fieldIndex = 0; fieldIndex < frame.fields.length; fieldIndex++) {\n    const field = frame.fields[fieldIndex];\n\n    if (matchTitle === getFieldDisplayName(field)) {\n      return field;\n    }\n  }\n\n  return null;\n}\n\ninterface FieldsToProcess {\n  newField: Field;\n  sourceField: Field;\n  keyField: Field;\n}\n","import { AlertRule, AlertRuleDTO, AlertRulesState } from 'app/types';\nimport alertDef from './alertDef';\nimport { dateTime } from '@grafana/data';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nexport const initialState: AlertRulesState = { items: [], searchQuery: '', isLoading: false };\n\nfunction convertToAlertRule(dto: AlertRuleDTO, state: string): AlertRule {\n  const stateModel = alertDef.getStateDisplayModel(state);\n\n  const rule: AlertRule = {\n    ...dto,\n    stateText: stateModel.text,\n    stateIcon: stateModel.iconClass,\n    stateClass: stateModel.stateClass,\n    stateAge: dateTime(dto.newStateDate).fromNow(true),\n  };\n\n  if (rule.state !== 'paused') {\n    if (rule.executionError) {\n      rule.info = 'Execution Error: ' + rule.executionError;\n    }\n    if (rule.evalData && rule.evalData.noData) {\n      rule.info = 'Query returned no data';\n    }\n  }\n\n  return rule;\n}\n\nconst alertRulesSlice = createSlice({\n  name: 'alertRules',\n  initialState,\n  reducers: {\n    loadAlertRules: state => {\n      return { ...state, isLoading: true };\n    },\n    loadedAlertRules: (state, action: PayloadAction<AlertRuleDTO[]>): AlertRulesState => {\n      const alertRules: AlertRuleDTO[] = action.payload;\n\n      const alertRulesViewModel: AlertRule[] = alertRules.map(rule => {\n        return convertToAlertRule(rule, rule.state);\n      });\n\n      return { ...state, items: alertRulesViewModel, isLoading: false };\n    },\n    setSearchQuery: (state, action: PayloadAction<string>): AlertRulesState => {\n      return { ...state, searchQuery: action.payload };\n    },\n  },\n});\n\nexport const { loadAlertRules, loadedAlertRules, setSearchQuery } = alertRulesSlice.actions;\n\nexport const alertRulesReducer = alertRulesSlice.reducer;\n\nexport default {\n  alertRules: alertRulesReducer,\n};\n","import memoizeOne from 'memoize-one';\n// import { KeyValue } from '@grafana/data';\n\n/**\n *  Creates memoized version of styles creator\n * @param stylesCreator function accepting dependencies based on which styles are created\n */\nexport function stylesFactory<ResultFn extends (this: any, ...newArgs: any[]) => ReturnType<ResultFn>>(\n  stylesCreator: ResultFn\n) {\n  return memoizeOne(stylesCreator);\n}\n","import React from 'react';\nimport { Icon, getSvgSize } from '../Icon/Icon';\nimport { IconName, IconSize, IconType } from '../../types/icon';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { css, cx } from 'emotion';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { TooltipPlacement } from '../Tooltip/PopoverController';\n\nexport interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  name: IconName;\n  size?: IconSize;\n  /** Need this to change hover effect based on what surface it is on */\n  surface?: SurfaceType;\n  iconType?: IconType;\n  tooltip?: string;\n  tooltipPlacement?: TooltipPlacement;\n}\n\ntype SurfaceType = 'dashboard' | 'panel' | 'header';\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, Props>(\n  ({ name, size = 'md', surface = 'panel', iconType, tooltip, tooltipPlacement, className, ...restProps }, ref) => {\n    const theme = useTheme();\n    const styles = getStyles(theme, surface, size);\n\n    const button = (\n      <button ref={ref} {...restProps} className={cx(styles.button, className)}>\n        <Icon name={name} size={size} className={styles.icon} type={iconType} />\n      </button>\n    );\n\n    if (tooltip) {\n      return (\n        <Tooltip content={tooltip} placement={tooltipPlacement}>\n          {button}\n        </Tooltip>\n      );\n    }\n\n    return button;\n  }\n);\n\nIconButton.displayName = 'IconButton';\n\nfunction getHoverColor(theme: GrafanaTheme, surface: SurfaceType): string {\n  switch (surface) {\n    case 'dashboard':\n      return theme.isLight ? theme.palette.gray95 : theme.palette.gray15;\n    case 'panel':\n      return theme.isLight ? theme.palette.gray6 : theme.palette.gray15;\n    case 'header':\n      return theme.isLight ? theme.colors.bg3 : theme.palette.gray25;\n  }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, surface: SurfaceType, size: IconSize) => {\n  const hoverColor = getHoverColor(theme, surface);\n  const pixelSize = getSvgSize(size);\n\n  return {\n    button: css`\n      width: ${pixelSize}px;\n      height: ${pixelSize}px;\n      background: transparent;\n      border: none;\n      padding: 0;\n      margin: 0;\n      outline: none;\n      box-shadow: none;\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      position: relative;\n      z-index: 0;\n      margin-right: ${theme.spacing.xs};\n\n      &[disabled],\n      &:disabled {\n        cursor: not-allowed;\n        opacity: 0.65;\n        box-shadow: none;\n      }\n\n      &:before {\n        content: '';\n        display: block;\n        opacity: 1;\n        position: absolute;\n        transition-duration: 0.2s;\n        transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n        z-index: -1;\n        bottom: -8px;\n        left: -8px;\n        right: -8px;\n        top: -8px;\n        background: none;\n        border-radius: 50%;\n        box-sizing: border-box;\n        transform: scale(0);\n        transition-property: transform, opacity;\n      }\n\n      &:hover {\n        color: ${theme.colors.linkHover};\n\n        &:before {\n          background-color: ${hoverColor};\n          border: none;\n          box-shadow: none;\n          opacity: 1;\n          transform: scale(0.8);\n        }\n      }\n    `,\n    icon: css`\n      margin-bottom: 0;\n      vertical-align: baseline;\n      display: flex;\n    `,\n  };\n});\n","import { Field, DataFrame } from '../../types/dataFrame';\nimport { MatcherID } from './ids';\nimport { getFieldMatcher, fieldMatchers, getFrameMatchers, frameMatchers } from '../matchers';\nimport { FieldMatcherInfo, MatcherConfig, FrameMatcherInfo } from '../../types/transformations';\n\nconst anyFieldMatcher: FieldMatcherInfo<MatcherConfig[]> = {\n  id: MatcherID.anyMatch,\n  name: 'Any',\n  description: 'Any child matches (OR)',\n  excludeFromPicker: true,\n  defaultOptions: [], // empty array\n\n  get: (options: MatcherConfig[]) => {\n    const children = options.map(option => {\n      return getFieldMatcher(option);\n    });\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      for (const child of children) {\n        if (child(field, frame, allFrames)) {\n          return true;\n        }\n      }\n      return false;\n    };\n  },\n\n  getOptionsDisplayText: (options: MatcherConfig[]) => {\n    let text = '';\n    for (const sub of options) {\n      if (text.length > 0) {\n        text += ' OR ';\n      }\n      const matcher = fieldMatchers.get(sub.id);\n      text += matcher.getOptionsDisplayText ? matcher.getOptionsDisplayText(sub) : matcher.name;\n    }\n    return text;\n  },\n};\n\nconst anyFrameMatcher: FrameMatcherInfo<MatcherConfig[]> = {\n  id: MatcherID.anyMatch,\n  name: 'Any',\n  description: 'Any child matches (OR)',\n  excludeFromPicker: true,\n  defaultOptions: [], // empty array\n\n  get: (options: MatcherConfig[]) => {\n    const children = options.map(option => {\n      return getFrameMatchers(option);\n    });\n    return (frame: DataFrame) => {\n      for (const child of children) {\n        if (child(frame)) {\n          return true;\n        }\n      }\n      return false;\n    };\n  },\n\n  getOptionsDisplayText: (options: MatcherConfig[]) => {\n    let text = '';\n    for (const sub of options) {\n      if (text.length > 0) {\n        text += ' OR ';\n      }\n      const matcher = frameMatchers.get(sub.id);\n      text += matcher.getOptionsDisplayText ? matcher.getOptionsDisplayText(sub) : matcher.name;\n    }\n    return text;\n  },\n};\n\nconst allFieldsMatcher: FieldMatcherInfo<MatcherConfig[]> = {\n  id: MatcherID.allMatch,\n  name: 'All',\n  description: 'Everything matches (AND)',\n  excludeFromPicker: true,\n  defaultOptions: [], // empty array\n\n  get: (options: MatcherConfig[]) => {\n    const children = options.map(option => {\n      return getFieldMatcher(option);\n    });\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      for (const child of children) {\n        if (!child(field, frame, allFrames)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  },\n\n  getOptionsDisplayText: (options: MatcherConfig[]) => {\n    let text = '';\n    for (const sub of options) {\n      if (text.length > 0) {\n        text += ' AND ';\n      }\n      const matcher = fieldMatchers.get(sub.id); // Ugho what about frame\n      text += matcher.getOptionsDisplayText ? matcher.getOptionsDisplayText(sub) : matcher.name;\n    }\n    return text;\n  },\n};\n\nconst allFramesMatcher: FrameMatcherInfo<MatcherConfig[]> = {\n  id: MatcherID.allMatch,\n  name: 'All',\n  description: 'Everything matches (AND)',\n  excludeFromPicker: true,\n  defaultOptions: [], // empty array\n\n  get: (options: MatcherConfig[]) => {\n    const children = options.map(option => {\n      return getFrameMatchers(option);\n    });\n    return (frame: DataFrame) => {\n      for (const child of children) {\n        if (!child(frame)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  },\n\n  getOptionsDisplayText: (options: MatcherConfig[]) => {\n    let text = '';\n    for (const sub of options) {\n      if (text.length > 0) {\n        text += ' AND ';\n      }\n      const matcher = frameMatchers.get(sub.id);\n      text += matcher.getOptionsDisplayText ? matcher.getOptionsDisplayText(sub) : matcher.name;\n    }\n    return text;\n  },\n};\n\nconst notFieldMatcher: FieldMatcherInfo<MatcherConfig> = {\n  id: MatcherID.invertMatch,\n  name: 'NOT',\n  description: 'Inverts other matchers',\n  excludeFromPicker: true,\n\n  get: (option: MatcherConfig) => {\n    const check = getFieldMatcher(option);\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      return !check(field, frame, allFrames);\n    };\n  },\n\n  getOptionsDisplayText: (options: MatcherConfig) => {\n    const matcher = fieldMatchers.get(options.id);\n    const text = matcher.getOptionsDisplayText ? matcher.getOptionsDisplayText(options.options) : matcher.name;\n    return 'NOT ' + text;\n  },\n};\n\nconst notFrameMatcher: FrameMatcherInfo<MatcherConfig> = {\n  id: MatcherID.invertMatch,\n  name: 'NOT',\n  description: 'Inverts other matchers',\n  excludeFromPicker: true,\n\n  get: (option: MatcherConfig) => {\n    const check = getFrameMatchers(option);\n    return (frame: DataFrame) => {\n      return !check(frame);\n    };\n  },\n\n  getOptionsDisplayText: (options: MatcherConfig) => {\n    const matcher = frameMatchers.get(options.id);\n    const text = matcher.getOptionsDisplayText ? matcher.getOptionsDisplayText(options.options) : matcher.name;\n    return 'NOT ' + text;\n  },\n};\n\nexport const alwaysFieldMatcher = (field: Field) => {\n  return true;\n};\n\nexport const alwaysFrameMatcher = (frame: DataFrame) => {\n  return true;\n};\n\nexport const neverFieldMatcher = (field: Field) => {\n  return false;\n};\n\nexport const neverFrameMatcher = (frame: DataFrame) => {\n  return false;\n};\n\nconst alwaysFieldMatcherInfo: FieldMatcherInfo = {\n  id: MatcherID.alwaysMatch,\n  name: 'All Fields',\n  description: 'Always Match',\n\n  get: (option: any) => {\n    return alwaysFieldMatcher;\n  },\n\n  getOptionsDisplayText: (options: any) => {\n    return 'Always';\n  },\n};\n\nconst alwaysFrameMatcherInfo: FrameMatcherInfo = {\n  id: MatcherID.alwaysMatch,\n  name: 'All Frames',\n  description: 'Always Match',\n\n  get: (option: any) => {\n    return alwaysFrameMatcher;\n  },\n\n  getOptionsDisplayText: (options: any) => {\n    return 'Always';\n  },\n};\n\nconst neverFieldMatcherInfo: FieldMatcherInfo = {\n  id: MatcherID.neverMatch,\n  name: 'No Fields',\n  description: 'Never Match',\n  excludeFromPicker: true,\n\n  get: (option: any) => {\n    return neverFieldMatcher;\n  },\n\n  getOptionsDisplayText: (options: any) => {\n    return 'Never';\n  },\n};\n\nconst neverFrameMatcherInfo: FrameMatcherInfo = {\n  id: MatcherID.neverMatch,\n  name: 'No Frames',\n  description: 'Never Match',\n\n  get: (option: any) => {\n    return neverFrameMatcher;\n  },\n\n  getOptionsDisplayText: (options: any) => {\n    return 'Never';\n  },\n};\n\nexport function getFieldPredicateMatchers(): FieldMatcherInfo[] {\n  return [anyFieldMatcher, allFieldsMatcher, notFieldMatcher, alwaysFieldMatcherInfo, neverFieldMatcherInfo];\n}\n\nexport function getFramePredicateMatchers(): FrameMatcherInfo[] {\n  return [anyFrameMatcher, allFramesMatcher, notFrameMatcher, alwaysFrameMatcherInfo, neverFrameMatcherInfo];\n}\n","import React from 'react';\nimport { getTagColorsFromName, Icon } from '@grafana/ui';\n\nexport interface Props {\n  label: string;\n  removeIcon: boolean;\n  count: number;\n  onClick?: any;\n}\n\nexport class TagBadge extends React.Component<Props, any> {\n  constructor(props: Props) {\n    super(props);\n  }\n\n  render() {\n    const { label, removeIcon, count } = this.props;\n    const { color } = getTagColorsFromName(label);\n\n    const tagStyle = {\n      backgroundColor: color,\n    };\n\n    const countLabel = count !== 0 && <span className=\"tag-count-label\">{`(${count})`}</span>;\n\n    return (\n      <span className={`label label-tag`} style={tagStyle}>\n        {removeIcon && <Icon name=\"times\" />}\n        {label} {countLabel}\n      </span>\n    );\n  }\n}\n","import React from 'react';\nimport * as PopperJS from 'popper.js';\nimport { PopoverContent } from './Tooltip';\n\n// This API allows popovers to update Popper's position when e.g. popover content changes\n// updatePopperPosition is delivered to content by react-popper\n\nexport interface UsingPopperProps {\n  show?: boolean;\n  placement?: TooltipPlacement;\n  content: PopoverContent;\n  children: JSX.Element;\n}\n\nexport type TooltipPlacement =\n  | 'auto-start'\n  | 'auto'\n  | 'auto-end'\n  | 'top-start'\n  | 'top'\n  | 'top-end'\n  | 'right-start'\n  | 'right'\n  | 'right-end'\n  | 'bottom-end'\n  | 'bottom'\n  | 'bottom-start'\n  | 'left-end'\n  | 'left'\n  | 'left-start';\n\ntype PopperControllerRenderProp = (\n  showPopper: () => void,\n  hidePopper: () => void,\n  popperProps: {\n    show: boolean;\n    placement: PopperJS.Placement;\n    content: PopoverContent;\n  }\n) => JSX.Element;\n\ninterface Props {\n  placement?: PopperJS.Placement;\n  content: PopoverContent;\n  className?: string;\n  children: PopperControllerRenderProp;\n  hideAfter?: number;\n}\n\ninterface State {\n  placement: PopperJS.Placement;\n  show: boolean;\n}\n\nclass PopoverController extends React.Component<Props, State> {\n  private hideTimeout: any;\n\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      placement: this.props.placement || 'auto',\n      show: false,\n    };\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps: Props) {\n    if (nextProps.placement && nextProps.placement !== this.state.placement) {\n      this.setState((prevState: State) => {\n        return {\n          ...prevState,\n          placement: nextProps.placement || 'auto',\n        };\n      });\n    }\n  }\n\n  showPopper = () => {\n    if (this.hideTimeout) {\n      clearTimeout(this.hideTimeout);\n    }\n\n    this.setState(prevState => ({\n      ...prevState,\n      show: true,\n    }));\n  };\n\n  hidePopper = () => {\n    if (this.props.hideAfter !== 0) {\n      this.hideTimeout = setTimeout(() => {\n        this.setState(prevState => ({\n          ...prevState,\n          show: false,\n        }));\n      }, this.props.hideAfter);\n      return;\n    }\n    this.setState(prevState => ({\n      ...prevState,\n      show: false,\n    }));\n  };\n\n  render() {\n    const { children, content } = this.props;\n    const { show, placement } = this.state;\n\n    return children(this.showPopper, this.hidePopper, {\n      show,\n      placement,\n      content,\n    });\n  }\n}\n\nexport { PopoverController };\n","import React from 'react';\n\n// Ignoring because I couldn't get @types/react-select work wih Torkel's fork\n// @ts-ignore\nimport { components } from '@torkelo/react-select';\n// @ts-ignore\nimport { OptionProps } from '@torkelo/react-select/lib/components/Option';\n\nexport interface Props {\n  children: Element;\n}\n\nexport const NoOptionsMessage = (props: OptionProps<any>) => {\n  const { children } = props;\n  return (\n    <components.Option {...props}>\n      <div className=\"gf-form-select-box__desc-option\">\n        <div className=\"gf-form-select-box__desc-option__body\">{children}</div>\n      </div>\n    </components.Option>\n  );\n};\n\nexport default NoOptionsMessage;\n","import _ from 'lodash';\n\nexport default function sortByKeys(input: any): any {\n  if (_.isArray(input)) {\n    return input.map(sortByKeys);\n  }\n\n  if (_.isPlainObject(input)) {\n    const sortedObject: any = {};\n    for (const key of _.keys(input).sort()) {\n      sortedObject[key] = sortByKeys(input[key]);\n    }\n    return sortedObject;\n  }\n\n  return input;\n}\n","// Libraries\nimport _ from 'lodash';\n// Utils\nimport getFactors from 'app/core/utils/factors';\nimport kbn from 'app/core/utils/kbn';\n// Types\nimport { PanelModel } from './PanelModel';\nimport { DashboardModel } from './DashboardModel';\nimport { DataLink, DataLinkBuiltInVars, urlUtil } from '@grafana/data';\n// Constants\nimport {\n  DEFAULT_PANEL_SPAN,\n  DEFAULT_ROW_HEIGHT,\n  GRID_CELL_HEIGHT,\n  GRID_CELL_VMARGIN,\n  GRID_COLUMN_COUNT,\n  MIN_PANEL_HEIGHT,\n} from 'app/core/constants';\nimport { isMulti, isQuery } from 'app/features/variables/guard';\nimport { alignCurrentWithMulti } from 'app/features/variables/shared/multiOptions';\nimport { VariableTag } from '../../templating/types';\n\nexport class DashboardMigrator {\n  dashboard: DashboardModel;\n\n  constructor(dashboardModel: DashboardModel) {\n    this.dashboard = dashboardModel;\n  }\n\n  updateSchema(old: any) {\n    let i, j, k, n;\n    const oldVersion = this.dashboard.schemaVersion;\n    const panelUpgrades = [];\n    this.dashboard.schemaVersion = 25;\n\n    if (oldVersion === this.dashboard.schemaVersion) {\n      return;\n    }\n\n    // version 2 schema changes\n    if (oldVersion < 2) {\n      if (old.services) {\n        if (old.services.filter) {\n          this.dashboard.time = old.services.filter.time;\n          this.dashboard.templating.list = old.services.filter.list || [];\n        }\n      }\n\n      panelUpgrades.push((panel: any) => {\n        // rename panel type\n        if (panel.type === 'graphite') {\n          panel.type = 'graph';\n        }\n        if (panel.type !== 'graph') {\n          return;\n        }\n\n        if (_.isBoolean(panel.legend)) {\n          panel.legend = { show: panel.legend };\n        }\n\n        if (panel.grid) {\n          if (panel.grid.min) {\n            panel.grid.leftMin = panel.grid.min;\n            delete panel.grid.min;\n          }\n\n          if (panel.grid.max) {\n            panel.grid.leftMax = panel.grid.max;\n            delete panel.grid.max;\n          }\n        }\n\n        if (panel.y_format) {\n          if (!panel.y_formats) {\n            panel.y_formats = [];\n          }\n          panel.y_formats[0] = panel.y_format;\n          delete panel.y_format;\n        }\n\n        if (panel.y2_format) {\n          if (!panel.y_formats) {\n            panel.y_formats = [];\n          }\n          panel.y_formats[1] = panel.y2_format;\n          delete panel.y2_format;\n        }\n      });\n    }\n\n    // schema version 3 changes\n    if (oldVersion < 3) {\n      // ensure panel ids\n      let maxId = this.dashboard.getNextPanelId();\n      panelUpgrades.push((panel: any) => {\n        if (!panel.id) {\n          panel.id = maxId;\n          maxId += 1;\n        }\n      });\n    }\n\n    // schema version 4 changes\n    if (oldVersion < 4) {\n      // move aliasYAxis changes\n      panelUpgrades.push((panel: any) => {\n        if (panel.type !== 'graph') {\n          return;\n        }\n        _.each(panel.aliasYAxis, (value, key) => {\n          panel.seriesOverrides = [{ alias: key, yaxis: value }];\n        });\n        delete panel.aliasYAxis;\n      });\n    }\n\n    if (oldVersion < 6) {\n      // move pulldowns to new schema\n      const annotations: any = _.find(old.pulldowns, { type: 'annotations' });\n\n      if (annotations) {\n        this.dashboard.annotations = {\n          list: annotations.annotations || [],\n        };\n      }\n\n      // update template variables\n      for (i = 0; i < this.dashboard.templating.list.length; i++) {\n        const variable = this.dashboard.templating.list[i];\n        if (variable.datasource === void 0) {\n          variable.datasource = null;\n        }\n        if (variable.type === 'filter') {\n          variable.type = 'query';\n        }\n        if (variable.type === void 0) {\n          variable.type = 'query';\n        }\n        if (variable.allFormat === void 0) {\n          variable.allFormat = 'glob';\n        }\n      }\n    }\n\n    if (oldVersion < 7) {\n      if (old.nav && old.nav.length) {\n        this.dashboard.timepicker = old.nav[0];\n      }\n\n      // ensure query refIds\n      panelUpgrades.push((panel: any) => {\n        _.each(panel.targets, target => {\n          if (!target.refId) {\n            target.refId = panel.getNextQueryLetter && panel.getNextQueryLetter();\n          }\n        });\n      });\n    }\n\n    if (oldVersion < 8) {\n      panelUpgrades.push((panel: any) => {\n        _.each(panel.targets, target => {\n          // update old influxdb query schema\n          if (target.fields && target.tags && target.groupBy) {\n            if (target.rawQuery) {\n              delete target.fields;\n              delete target.fill;\n            } else {\n              target.select = _.map(target.fields, field => {\n                const parts = [];\n                parts.push({ type: 'field', params: [field.name] });\n                parts.push({ type: field.func, params: [] });\n                if (field.mathExpr) {\n                  parts.push({ type: 'math', params: [field.mathExpr] });\n                }\n                if (field.asExpr) {\n                  parts.push({ type: 'alias', params: [field.asExpr] });\n                }\n                return parts;\n              });\n              delete target.fields;\n              _.each(target.groupBy, part => {\n                if (part.type === 'time' && part.interval) {\n                  part.params = [part.interval];\n                  delete part.interval;\n                }\n                if (part.type === 'tag' && part.key) {\n                  part.params = [part.key];\n                  delete part.key;\n                }\n              });\n\n              if (target.fill) {\n                target.groupBy.push({ type: 'fill', params: [target.fill] });\n                delete target.fill;\n              }\n            }\n          }\n        });\n      });\n    }\n\n    // schema version 9 changes\n    if (oldVersion < 9) {\n      // move aliasYAxis changes\n      panelUpgrades.push((panel: any) => {\n        if (panel.type !== 'singlestat' && panel.thresholds !== '') {\n          return;\n        }\n\n        if (panel.thresholds) {\n          const k = panel.thresholds.split(',');\n\n          if (k.length >= 3) {\n            k.shift();\n            panel.thresholds = k.join(',');\n          }\n        }\n      });\n    }\n\n    // schema version 10 changes\n    if (oldVersion < 10) {\n      // move aliasYAxis changes\n      panelUpgrades.push((panel: any) => {\n        if (panel.type !== 'table') {\n          return;\n        }\n\n        _.each(panel.styles, style => {\n          if (style.thresholds && style.thresholds.length >= 3) {\n            const k = style.thresholds;\n            k.shift();\n            style.thresholds = k;\n          }\n        });\n      });\n    }\n\n    if (oldVersion < 12) {\n      // update template variables\n      _.each(this.dashboard.getVariables(), templateVariable => {\n        if (templateVariable.refresh) {\n          templateVariable.refresh = 1;\n        }\n        if (!templateVariable.refresh) {\n          templateVariable.refresh = 0;\n        }\n        if (templateVariable.hideVariable) {\n          templateVariable.hide = 2;\n        } else if (templateVariable.hideLabel) {\n          templateVariable.hide = 1;\n        }\n      });\n    }\n\n    if (oldVersion < 12) {\n      // update graph yaxes changes\n      panelUpgrades.push((panel: any) => {\n        if (panel.type !== 'graph') {\n          return;\n        }\n        if (!panel.grid) {\n          return;\n        }\n\n        if (!panel.yaxes) {\n          panel.yaxes = [\n            {\n              show: panel['y-axis'],\n              min: panel.grid.leftMin,\n              max: panel.grid.leftMax,\n              logBase: panel.grid.leftLogBase,\n              format: panel.y_formats[0],\n              label: panel.leftYAxisLabel,\n            },\n            {\n              show: panel['y-axis'],\n              min: panel.grid.rightMin,\n              max: panel.grid.rightMax,\n              logBase: panel.grid.rightLogBase,\n              format: panel.y_formats[1],\n              label: panel.rightYAxisLabel,\n            },\n          ];\n\n          panel.xaxis = {\n            show: panel['x-axis'],\n          };\n\n          delete panel.grid.leftMin;\n          delete panel.grid.leftMax;\n          delete panel.grid.leftLogBase;\n          delete panel.grid.rightMin;\n          delete panel.grid.rightMax;\n          delete panel.grid.rightLogBase;\n          delete panel.y_formats;\n          delete panel.leftYAxisLabel;\n          delete panel.rightYAxisLabel;\n          delete panel['y-axis'];\n          delete panel['x-axis'];\n        }\n      });\n    }\n\n    if (oldVersion < 13) {\n      // update graph yaxes changes\n      panelUpgrades.push((panel: any) => {\n        if (panel.type !== 'graph') {\n          return;\n        }\n        if (!panel.grid) {\n          return;\n        }\n\n        if (!panel.thresholds) {\n          panel.thresholds = [];\n        }\n        const t1: any = {},\n          t2: any = {};\n\n        if (panel.grid.threshold1 !== null) {\n          t1.value = panel.grid.threshold1;\n          if (panel.grid.thresholdLine) {\n            t1.line = true;\n            t1.lineColor = panel.grid.threshold1Color;\n            t1.colorMode = 'custom';\n          } else {\n            t1.fill = true;\n            t1.fillColor = panel.grid.threshold1Color;\n            t1.colorMode = 'custom';\n          }\n        }\n\n        if (panel.grid.threshold2 !== null) {\n          t2.value = panel.grid.threshold2;\n          if (panel.grid.thresholdLine) {\n            t2.line = true;\n            t2.lineColor = panel.grid.threshold2Color;\n            t2.colorMode = 'custom';\n          } else {\n            t2.fill = true;\n            t2.fillColor = panel.grid.threshold2Color;\n            t2.colorMode = 'custom';\n          }\n        }\n\n        if (_.isNumber(t1.value)) {\n          if (_.isNumber(t2.value)) {\n            if (t1.value > t2.value) {\n              t1.op = t2.op = 'lt';\n              panel.thresholds.push(t1);\n              panel.thresholds.push(t2);\n            } else {\n              t1.op = t2.op = 'gt';\n              panel.thresholds.push(t1);\n              panel.thresholds.push(t2);\n            }\n          } else {\n            t1.op = 'gt';\n            panel.thresholds.push(t1);\n          }\n        }\n\n        delete panel.grid.threshold1;\n        delete panel.grid.threshold1Color;\n        delete panel.grid.threshold2;\n        delete panel.grid.threshold2Color;\n        delete panel.grid.thresholdLine;\n      });\n    }\n\n    if (oldVersion < 14) {\n      this.dashboard.graphTooltip = old.sharedCrosshair ? 1 : 0;\n    }\n\n    if (oldVersion < 16) {\n      this.upgradeToGridLayout(old);\n    }\n\n    if (oldVersion < 17) {\n      panelUpgrades.push((panel: any) => {\n        if (panel.minSpan) {\n          const max = GRID_COLUMN_COUNT / panel.minSpan;\n          const factors = getFactors(GRID_COLUMN_COUNT);\n          // find the best match compared to factors\n          // (ie. [1,2,3,4,6,12,24] for 24 columns)\n          panel.maxPerRow =\n            factors[\n              _.findIndex(factors, o => {\n                return o > max;\n              }) - 1\n            ];\n        }\n        delete panel.minSpan;\n      });\n    }\n\n    if (oldVersion < 18) {\n      // migrate change to gauge options\n      panelUpgrades.push((panel: any) => {\n        if (panel['options-gauge']) {\n          panel.options = panel['options-gauge'];\n          panel.options.valueOptions = {\n            unit: panel.options.unit,\n            stat: panel.options.stat,\n            decimals: panel.options.decimals,\n            prefix: panel.options.prefix,\n            suffix: panel.options.suffix,\n          };\n\n          // correct order\n          if (panel.options.thresholds) {\n            panel.options.thresholds.reverse();\n          }\n\n          // this options prop was due to a bug\n          delete panel.options.options;\n          delete panel.options.unit;\n          delete panel.options.stat;\n          delete panel.options.decimals;\n          delete panel.options.prefix;\n          delete panel.options.suffix;\n          delete panel['options-gauge'];\n        }\n      });\n    }\n\n    if (oldVersion < 19) {\n      // migrate change to gauge options\n      panelUpgrades.push((panel: any) => {\n        if (panel.links && _.isArray(panel.links)) {\n          panel.links = panel.links.map(upgradePanelLink);\n        }\n      });\n    }\n\n    if (oldVersion < 20) {\n      const updateLinks = (link: DataLink) => {\n        return {\n          ...link,\n          url: updateVariablesSyntax(link.url),\n        };\n      };\n      panelUpgrades.push((panel: any) => {\n        // For graph panel\n        if (panel.options && panel.options.dataLinks && _.isArray(panel.options.dataLinks)) {\n          panel.options.dataLinks = panel.options.dataLinks.map(updateLinks);\n        }\n\n        // For panel with fieldOptions\n        if (panel.options && panel.options.fieldOptions && panel.options.fieldOptions.defaults) {\n          if (panel.options.fieldOptions.defaults.links && _.isArray(panel.options.fieldOptions.defaults.links)) {\n            panel.options.fieldOptions.defaults.links = panel.options.fieldOptions.defaults.links.map(updateLinks);\n          }\n          if (panel.options.fieldOptions.defaults.title) {\n            panel.options.fieldOptions.defaults.title = updateVariablesSyntax(\n              panel.options.fieldOptions.defaults.title\n            );\n          }\n        }\n      });\n    }\n\n    if (oldVersion < 21) {\n      const updateLinks = (link: DataLink) => {\n        return {\n          ...link,\n          url: link.url.replace(/__series.labels/g, '__field.labels'),\n        };\n      };\n      panelUpgrades.push((panel: any) => {\n        // For graph panel\n        if (panel.options && panel.options.dataLinks && _.isArray(panel.options.dataLinks)) {\n          panel.options.dataLinks = panel.options.dataLinks.map(updateLinks);\n        }\n\n        // For panel with fieldOptions\n        if (panel.options && panel.options.fieldOptions && panel.options.fieldOptions.defaults) {\n          if (panel.options.fieldOptions.defaults.links && _.isArray(panel.options.fieldOptions.defaults.links)) {\n            panel.options.fieldOptions.defaults.links = panel.options.fieldOptions.defaults.links.map(updateLinks);\n          }\n        }\n      });\n    }\n\n    if (oldVersion < 22) {\n      panelUpgrades.push((panel: any) => {\n        if (panel.type !== 'table') {\n          return;\n        }\n\n        _.each(panel.styles, style => {\n          style.align = 'auto';\n        });\n      });\n    }\n\n    if (oldVersion < 23) {\n      for (const variable of this.dashboard.templating.list) {\n        if (!isMulti(variable)) {\n          continue;\n        }\n        const { multi, current } = variable;\n        variable.current = alignCurrentWithMulti(current, multi);\n      }\n    }\n\n    if (oldVersion < 24) {\n      // 7.0\n      // - migrate existing tables to 'table-old'\n      panelUpgrades.push((panel: any) => {\n        const wasAngularTable = panel.type === 'table';\n        if (wasAngularTable && !panel.styles) {\n          return; // styles are missing so assumes default settings\n        }\n        const wasReactTable = panel.table === 'table2';\n        if (!wasAngularTable || wasReactTable) {\n          return;\n        }\n        panel.type = wasAngularTable ? 'table-old' : 'table';\n      });\n    }\n\n    if (oldVersion < 25) {\n      for (const variable of this.dashboard.templating.list) {\n        if (!isQuery(variable)) {\n          continue;\n        }\n\n        const { tags, current } = variable;\n        if (!Array.isArray(tags)) {\n          variable.tags = [];\n          continue;\n        }\n\n        const currentTags = current?.tags ?? [];\n        const currents = currentTags.reduce((all, tag) => {\n          if (tag && tag.hasOwnProperty('text') && typeof tag['text'] === 'string') {\n            all[tag.text] = tag;\n          }\n          return all;\n        }, {} as Record<string, VariableTag>);\n\n        const newTags: VariableTag[] = [];\n\n        for (const tag of tags) {\n          if (typeof tag === 'object') {\n            // new format let's assume it's correct\n            newTags.push(tag);\n            continue;\n          }\n\n          if (typeof tag !== 'string') {\n            // something that we do not support\n            continue;\n          }\n\n          const currentValue = currents[tag];\n          newTags.push({ text: tag, selected: false, ...currentValue });\n        }\n        variable.tags = newTags;\n      }\n    }\n\n    if (panelUpgrades.length === 0) {\n      return;\n    }\n\n    for (j = 0; j < this.dashboard.panels.length; j++) {\n      for (k = 0; k < panelUpgrades.length; k++) {\n        panelUpgrades[k].call(this, this.dashboard.panels[j]);\n        if (this.dashboard.panels[j].panels) {\n          for (n = 0; n < this.dashboard.panels[j].panels.length; n++) {\n            panelUpgrades[k].call(this, this.dashboard.panels[j].panels[n]);\n          }\n        }\n      }\n    }\n  }\n\n  upgradeToGridLayout(old: any) {\n    let yPos = 0;\n    const widthFactor = GRID_COLUMN_COUNT / 12;\n\n    const maxPanelId = _.max(\n      _.flattenDeep(\n        _.map(old.rows, row => {\n          return _.map(row.panels, 'id');\n        })\n      )\n    );\n    let nextRowId = maxPanelId + 1;\n\n    if (!old.rows) {\n      return;\n    }\n\n    // Add special \"row\" panels if even one row is collapsed, repeated or has visible title\n    const showRows = _.some(old.rows, row => row.collapse || row.showTitle || row.repeat);\n\n    for (const row of old.rows) {\n      if (row.repeatIteration) {\n        continue;\n      }\n\n      const height: any = row.height || DEFAULT_ROW_HEIGHT;\n      const rowGridHeight = getGridHeight(height);\n\n      const rowPanel: any = {};\n      let rowPanelModel: PanelModel;\n      if (showRows) {\n        // add special row panel\n        rowPanel.id = nextRowId;\n        rowPanel.type = 'row';\n        rowPanel.title = row.title;\n        rowPanel.collapsed = row.collapse;\n        rowPanel.repeat = row.repeat;\n        rowPanel.panels = [];\n        rowPanel.gridPos = {\n          x: 0,\n          y: yPos,\n          w: GRID_COLUMN_COUNT,\n          h: rowGridHeight,\n        };\n        rowPanelModel = new PanelModel(rowPanel);\n        nextRowId++;\n        yPos++;\n      }\n\n      const rowArea = new RowArea(rowGridHeight, GRID_COLUMN_COUNT, yPos);\n\n      for (const panel of row.panels) {\n        panel.span = panel.span || DEFAULT_PANEL_SPAN;\n        if (panel.minSpan) {\n          panel.minSpan = Math.min(GRID_COLUMN_COUNT, (GRID_COLUMN_COUNT / 12) * panel.minSpan);\n        }\n        const panelWidth = Math.floor(panel.span) * widthFactor;\n        const panelHeight = panel.height ? getGridHeight(panel.height) : rowGridHeight;\n\n        const panelPos = rowArea.getPanelPosition(panelHeight, panelWidth);\n        yPos = rowArea.yPos;\n        panel.gridPos = {\n          x: panelPos.x,\n          y: yPos + panelPos.y,\n          w: panelWidth,\n          h: panelHeight,\n        };\n        rowArea.addPanel(panel.gridPos);\n\n        delete panel.span;\n\n        if (rowPanelModel && rowPanel.collapsed) {\n          rowPanelModel.panels.push(panel);\n        } else {\n          this.dashboard.panels.push(new PanelModel(panel));\n        }\n      }\n\n      if (rowPanelModel) {\n        this.dashboard.panels.push(rowPanelModel);\n      }\n\n      if (!(rowPanelModel && rowPanel.collapsed)) {\n        yPos += rowGridHeight;\n      }\n    }\n  }\n}\n\nfunction getGridHeight(height: number | string) {\n  if (_.isString(height)) {\n    height = parseInt(height.replace('px', ''), 10);\n  }\n\n  if (height < MIN_PANEL_HEIGHT) {\n    height = MIN_PANEL_HEIGHT;\n  }\n\n  const gridHeight = Math.ceil(height / (GRID_CELL_HEIGHT + GRID_CELL_VMARGIN));\n  return gridHeight;\n}\n\n/**\n * RowArea represents dashboard row filled by panels\n * area is an array of numbers represented filled column's cells like\n *  -----------------------\n * |******** ****\n * |******** ****\n * |********\n *  -----------------------\n *  33333333 2222 00000 ...\n */\nclass RowArea {\n  area: number[];\n  yPos: number;\n  height: number;\n\n  constructor(height: number, width = GRID_COLUMN_COUNT, rowYPos = 0) {\n    this.area = new Array(width).fill(0);\n    this.yPos = rowYPos;\n    this.height = height;\n  }\n\n  reset() {\n    this.area.fill(0);\n  }\n\n  /**\n   * Update area after adding the panel.\n   */\n  addPanel(gridPos: any) {\n    for (let i = gridPos.x; i < gridPos.x + gridPos.w; i++) {\n      if (!this.area[i] || gridPos.y + gridPos.h - this.yPos > this.area[i]) {\n        this.area[i] = gridPos.y + gridPos.h - this.yPos;\n      }\n    }\n    return this.area;\n  }\n\n  /**\n   * Calculate position for the new panel in the row.\n   */\n  getPanelPosition(panelHeight: number, panelWidth: number, callOnce = false): any {\n    let startPlace, endPlace;\n    let place;\n    for (let i = this.area.length - 1; i >= 0; i--) {\n      if (this.height - this.area[i] > 0) {\n        if (endPlace === undefined) {\n          endPlace = i;\n        } else {\n          if (i < this.area.length - 1 && this.area[i] <= this.area[i + 1]) {\n            startPlace = i;\n          } else {\n            break;\n          }\n        }\n      } else {\n        break;\n      }\n    }\n\n    if (startPlace !== undefined && endPlace !== undefined && endPlace - startPlace >= panelWidth - 1) {\n      const yPos = _.max(this.area.slice(startPlace));\n      place = {\n        x: startPlace,\n        y: yPos,\n      };\n    } else if (!callOnce) {\n      // wrap to next row\n      this.yPos += this.height;\n      this.reset();\n      return this.getPanelPosition(panelHeight, panelWidth, true);\n    } else {\n      return null;\n    }\n\n    return place;\n  }\n}\n\nfunction upgradePanelLink(link: any): DataLink {\n  let url = link.url;\n\n  if (!url && link.dashboard) {\n    url = `dashboard/db/${kbn.slugifyForUrl(link.dashboard)}`;\n  }\n\n  if (!url && link.dashUri) {\n    url = `dashboard/${link.dashUri}`;\n  }\n\n  // some models are incomplete and have no dashboard or dashUri\n  if (!url) {\n    url = '/';\n  }\n\n  if (link.keepTime) {\n    url = urlUtil.appendQueryToUrl(url, `$${DataLinkBuiltInVars.keepTime}`);\n  }\n\n  if (link.includeVars) {\n    url = urlUtil.appendQueryToUrl(url, `$${DataLinkBuiltInVars.includeVars}`);\n  }\n\n  if (link.params) {\n    url = urlUtil.appendQueryToUrl(url, link.params);\n  }\n\n  return {\n    url: url,\n    title: link.title,\n    targetBlank: link.targetBlank,\n  };\n}\n\nfunction updateVariablesSyntax(text: string) {\n  const legacyVariableNamesRegex = /(__series_name)|(\\$__series_name)|(__value_time)|(__field_name)|(\\$__field_name)/g;\n\n  return text.replace(legacyVariableNamesRegex, (match, seriesName, seriesName1, valueTime, fieldName, fieldName1) => {\n    if (seriesName) {\n      return '__series.name';\n    }\n    if (seriesName1) {\n      return '${__series.name}';\n    }\n    if (valueTime) {\n      return '__value.time';\n    }\n    if (fieldName) {\n      return '__field.name';\n    }\n    if (fieldName1) {\n      return '${__field.name}';\n    }\n    return match;\n  });\n}\n","// Returns the factors of a number\n// Example getFactors(12) -> [1, 2, 3, 4, 6, 12]\nexport default function getFactors(num: number): number[] {\n  return Array.from(new Array(num + 1), (_, i) => i).filter(i => num % i === 0);\n}\n","// Libaries\nimport _ from 'lodash';\n// Constants\nimport { DEFAULT_ANNOTATION_COLOR } from '@grafana/ui';\nimport { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN, GRID_COLUMN_COUNT, REPEAT_DIR_VERTICAL } from 'app/core/constants';\n// Utils & Services\nimport { Emitter } from 'app/core/utils/emitter';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport sortByKeys from 'app/core/utils/sort_by_keys';\n// Types\nimport { GridPos, panelAdded, PanelModel, panelRemoved } from './PanelModel';\nimport { DashboardMigrator } from './DashboardMigrator';\nimport {\n  AppEvent,\n  dateTimeFormat,\n  dateTimeFormatTimeAgo,\n  DateTimeInput,\n  PanelEvents,\n  TimeRange,\n  TimeZone,\n  UrlQueryValue,\n} from '@grafana/data';\nimport { CoreEvents, DashboardMeta, KIOSK_MODE_TV } from 'app/types';\nimport { getConfig } from '../../../core/config';\nimport { GetVariables, getVariables } from 'app/features/variables/state/selectors';\nimport { variableAdapters } from 'app/features/variables/adapters';\nimport { onTimeRangeUpdated } from 'app/features/variables/state/actions';\nimport { dispatch } from '../../../store/store';\n\nexport interface CloneOptions {\n  saveVariables?: boolean;\n  saveTimerange?: boolean;\n  message?: string;\n}\n\ntype DashboardLinkType = 'link' | 'dashboards';\n\nexport interface DashboardLink {\n  icon: string;\n  title: string;\n  tooltip: string;\n  type: DashboardLinkType;\n  url: string;\n  asDropdown: boolean;\n  tags: any[];\n  searchHits?: any[];\n  targetBlank: boolean;\n}\n\nexport class DashboardModel {\n  id: any;\n  uid: string;\n  title: string;\n  autoUpdate: any;\n  description: any;\n  tags: any;\n  style: any;\n  timezone: any;\n  editable: any;\n  graphTooltip: any;\n  time: any;\n  private originalTime: any;\n  timepicker: any;\n  templating: { list: any[] };\n  private originalTemplating: any;\n  annotations: { list: any[] };\n  refresh: any;\n  snapshot: any;\n  schemaVersion: number;\n  version: number;\n  revision: number;\n  links: DashboardLink[];\n  gnetId: any;\n  panels: PanelModel[];\n  panelInEdit?: PanelModel;\n  panelInView: PanelModel;\n\n  // ------------------\n  // not persisted\n  // ------------------\n\n  // repeat process cycles\n  iteration: number;\n  meta: DashboardMeta;\n  events: Emitter;\n\n  static nonPersistedProperties: { [str: string]: boolean } = {\n    events: true,\n    meta: true,\n    panels: true, // needs special handling\n    templating: true, // needs special handling\n    originalTime: true,\n    originalTemplating: true,\n    panelInEdit: true,\n    panelInView: true,\n    getVariablesFromState: true,\n  };\n\n  constructor(data: any, meta?: DashboardMeta, private getVariablesFromState: GetVariables = getVariables) {\n    if (!data) {\n      data = {};\n    }\n\n    this.events = new Emitter();\n    this.id = data.id || null;\n    this.uid = data.uid || null;\n    this.revision = data.revision;\n    this.title = data.title || 'No Title';\n    this.autoUpdate = data.autoUpdate;\n    this.description = data.description;\n    this.tags = data.tags || [];\n    this.style = data.style || 'dark';\n    this.timezone = data.timezone || '';\n    this.editable = data.editable !== false;\n    this.graphTooltip = data.graphTooltip || 0;\n    this.time = data.time || { from: 'now-6h', to: 'now' };\n    this.timepicker = data.timepicker || {};\n    this.templating = this.ensureListExist(data.templating);\n    this.annotations = this.ensureListExist(data.annotations);\n    this.refresh = data.refresh;\n    this.snapshot = data.snapshot;\n    this.schemaVersion = data.schemaVersion || 0;\n    this.version = data.version || 0;\n    this.links = data.links || [];\n    this.gnetId = data.gnetId || null;\n    this.panels = _.map(data.panels || [], (panelData: any) => new PanelModel(panelData));\n\n    this.resetOriginalVariables(true);\n    this.resetOriginalTime();\n\n    this.initMeta(meta);\n    this.updateSchema(data);\n\n    this.addBuiltInAnnotationQuery();\n    this.sortPanelsByGridPos();\n  }\n\n  addBuiltInAnnotationQuery() {\n    let found = false;\n    for (const item of this.annotations.list) {\n      if (item.builtIn === 1) {\n        found = true;\n        break;\n      }\n    }\n\n    if (found) {\n      return;\n    }\n\n    this.annotations.list.unshift({\n      datasource: '-- Grafana --',\n      name: 'Annotations & Alerts',\n      type: 'dashboard',\n      iconColor: DEFAULT_ANNOTATION_COLOR,\n      enable: true,\n      hide: true,\n      builtIn: 1,\n    });\n  }\n\n  private initMeta(meta: DashboardMeta) {\n    meta = meta || {};\n\n    meta.canShare = meta.canShare !== false;\n    meta.canSave = meta.canSave !== false;\n    meta.canStar = meta.canStar !== false;\n    meta.canEdit = meta.canEdit !== false;\n    meta.showSettings = meta.canEdit;\n    meta.canMakeEditable = meta.canSave && !this.editable;\n\n    if (!this.editable) {\n      meta.canEdit = false;\n      meta.canDelete = false;\n      meta.canSave = false;\n    }\n\n    this.meta = meta;\n  }\n\n  // cleans meta data and other non persistent state\n  getSaveModelClone(options?: CloneOptions): DashboardModel {\n    const defaults = _.defaults(options || {}, {\n      saveVariables: true,\n      saveTimerange: true,\n    });\n\n    // make clone\n    let copy: any = {};\n    for (const property in this) {\n      if (DashboardModel.nonPersistedProperties[property] || !this.hasOwnProperty(property)) {\n        continue;\n      }\n\n      copy[property] = _.cloneDeep(this[property]);\n    }\n\n    this.updateTemplatingSaveModelClone(copy, defaults);\n\n    if (!defaults.saveTimerange) {\n      copy.time = this.originalTime;\n    }\n\n    // get panel save models\n    copy.panels = this.panels\n      .filter((panel: PanelModel) => panel.type !== 'add-panel')\n      .map((panel: PanelModel) => {\n        // If we save while editing we should include the panel in edit mode instead of the\n        // unmodified source panel\n        if (this.panelInEdit && this.panelInEdit.editSourceId === panel.id) {\n          const saveModel = this.panelInEdit.getSaveModel();\n          // while editing a panel we modify its id, need to restore it here\n          saveModel.id = this.panelInEdit.editSourceId;\n          return saveModel;\n        }\n\n        return panel.getSaveModel();\n      });\n\n    //  sort by keys\n    copy = sortByKeys(copy);\n    copy.getVariables = () => {\n      return copy.templating.list;\n    };\n\n    return copy;\n  }\n\n  private updateTemplatingSaveModelClone(\n    copy: any,\n    defaults: { saveTimerange: boolean; saveVariables: boolean } & CloneOptions\n  ) {\n    if (getConfig().featureToggles.newVariables) {\n      this.updateTemplatingSaveModel(copy, defaults);\n      return;\n    }\n    this.updateAngularTemplatingSaveModel(copy, defaults);\n  }\n\n  private updateAngularTemplatingSaveModel(\n    copy: any,\n    defaults: { saveTimerange: boolean; saveVariables: boolean } & CloneOptions\n  ) {\n    // get variable save models\n    copy.templating = {\n      list: _.map(this.templating.list, (variable: any) =>\n        variable.getSaveModel ? variable.getSaveModel() : variable\n      ),\n    };\n\n    if (!defaults.saveVariables) {\n      for (let i = 0; i < copy.templating.list.length; i++) {\n        const current = copy.templating.list[i];\n        const original: any = _.find(this.originalTemplating, { name: current.name, type: current.type });\n\n        if (!original) {\n          continue;\n        }\n\n        if (current.type === 'adhoc') {\n          copy.templating.list[i].filters = original.filters;\n        } else {\n          copy.templating.list[i].current = original.current;\n        }\n      }\n    }\n  }\n\n  private updateTemplatingSaveModel(\n    copy: any,\n    defaults: { saveTimerange: boolean; saveVariables: boolean } & CloneOptions\n  ) {\n    const originalVariables = this.originalTemplating;\n    const currentVariables = this.getVariablesFromState();\n\n    copy.templating = {\n      list: currentVariables.map(variable => variableAdapters.get(variable.type).getSaveModel(variable)),\n    };\n\n    if (!defaults.saveVariables) {\n      for (let i = 0; i < copy.templating.list.length; i++) {\n        const current = copy.templating.list[i];\n        const original: any = _.find(originalVariables, { name: current.name, type: current.type });\n\n        if (!original) {\n          continue;\n        }\n\n        if (current.type === 'adhoc') {\n          copy.templating.list[i].filters = original.filters;\n        } else {\n          copy.templating.list[i].current = original.current;\n        }\n      }\n    }\n  }\n\n  timeRangeUpdated(timeRange: TimeRange) {\n    this.events.emit(CoreEvents.timeRangeUpdated, timeRange);\n    if (getConfig().featureToggles.newVariables) {\n      dispatch(onTimeRangeUpdated(timeRange));\n    }\n  }\n\n  startRefresh() {\n    this.events.emit(PanelEvents.refresh);\n\n    if (this.panelInEdit) {\n      this.panelInEdit.refresh();\n      return;\n    }\n\n    for (const panel of this.panels) {\n      if (!this.otherPanelInFullscreen(panel)) {\n        panel.refresh();\n      }\n    }\n  }\n\n  render() {\n    this.events.emit(PanelEvents.render);\n\n    for (const panel of this.panels) {\n      panel.render();\n    }\n  }\n\n  panelInitialized(panel: PanelModel) {\n    panel.initialized();\n\n    const lastResult = panel.getQueryRunner().getLastResult();\n\n    if (!this.otherPanelInFullscreen(panel) && !lastResult) {\n      panel.refresh();\n    }\n  }\n\n  otherPanelInFullscreen(panel: PanelModel) {\n    return (this.panelInEdit || this.panelInView) && !(panel.isViewing || panel.isEditing);\n  }\n\n  initEditPanel(sourcePanel: PanelModel): PanelModel {\n    this.panelInEdit = sourcePanel.getEditClone();\n    return this.panelInEdit;\n  }\n\n  initViewPanel(panel: PanelModel) {\n    this.panelInView = panel;\n    panel.setIsViewing(true);\n  }\n\n  exitViewPanel(panel: PanelModel) {\n    this.panelInView = undefined;\n    panel.setIsViewing(false);\n  }\n\n  exitPanelEditor() {\n    this.panelInEdit.destroy();\n    this.panelInEdit = undefined;\n  }\n\n  private ensureListExist(data: any) {\n    if (!data) {\n      data = {};\n    }\n    if (!data.list) {\n      data.list = [];\n    }\n    return data;\n  }\n\n  getNextPanelId() {\n    let max = 0;\n\n    for (const panel of this.panels) {\n      if (panel.id > max) {\n        max = panel.id;\n      }\n\n      if (panel.collapsed) {\n        for (const rowPanel of panel.panels) {\n          if (rowPanel.id > max) {\n            max = rowPanel.id;\n          }\n        }\n      }\n    }\n\n    return max + 1;\n  }\n\n  forEachPanel(callback: (panel: PanelModel, index: number) => void) {\n    for (let i = 0; i < this.panels.length; i++) {\n      callback(this.panels[i], i);\n    }\n  }\n\n  getPanelById(id: number): PanelModel {\n    if (this.panelInEdit && this.panelInEdit.id === id) {\n      return this.panelInEdit;\n    }\n\n    for (const panel of this.panels) {\n      if (panel.id === id) {\n        return panel;\n      }\n    }\n    return null;\n  }\n\n  canEditPanel(panel?: PanelModel): boolean {\n    return this.meta.canEdit && panel && !panel.repeatPanelId;\n  }\n\n  canEditPanelById(id: number): boolean {\n    return this.canEditPanel(this.getPanelById(id));\n  }\n\n  addPanel(panelData: any) {\n    panelData.id = this.getNextPanelId();\n\n    const panel = new PanelModel(panelData);\n\n    this.panels.unshift(panel);\n\n    this.sortPanelsByGridPos();\n\n    this.events.emit(panelAdded, panel);\n  }\n\n  sortPanelsByGridPos() {\n    this.panels.sort((panelA, panelB) => {\n      if (panelA.gridPos.y === panelB.gridPos.y) {\n        return panelA.gridPos.x - panelB.gridPos.x;\n      } else {\n        return panelA.gridPos.y - panelB.gridPos.y;\n      }\n    });\n  }\n\n  cleanUpRepeats() {\n    if (this.isSnapshotTruthy() || !this.hasVariables()) {\n      return;\n    }\n\n    this.iteration = (this.iteration || new Date().getTime()) + 1;\n    const panelsToRemove = [];\n\n    // cleanup scopedVars\n    for (const panel of this.panels) {\n      delete panel.scopedVars;\n    }\n\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n      if ((!panel.repeat || panel.repeatedByRow) && panel.repeatPanelId && panel.repeatIteration !== this.iteration) {\n        panelsToRemove.push(panel);\n      }\n    }\n\n    // remove panels\n    _.pull(this.panels, ...panelsToRemove);\n    panelsToRemove.map(p => p.destroy());\n    this.sortPanelsByGridPos();\n    this.events.emit(CoreEvents.repeatsProcessed);\n  }\n\n  processRepeats() {\n    if (this.isSnapshotTruthy() || !this.hasVariables()) {\n      return;\n    }\n\n    this.cleanUpRepeats();\n\n    this.iteration = (this.iteration || new Date().getTime()) + 1;\n\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n      if (panel.repeat) {\n        this.repeatPanel(panel, i);\n      }\n    }\n\n    this.sortPanelsByGridPos();\n    this.events.emit(CoreEvents.repeatsProcessed);\n  }\n\n  cleanUpRowRepeats(rowPanels: PanelModel[]) {\n    const panelsToRemove = [];\n    for (let i = 0; i < rowPanels.length; i++) {\n      const panel = rowPanels[i];\n      if (!panel.repeat && panel.repeatPanelId) {\n        panelsToRemove.push(panel);\n      }\n    }\n    _.pull(rowPanels, ...panelsToRemove);\n    _.pull(this.panels, ...panelsToRemove);\n  }\n\n  processRowRepeats(row: PanelModel) {\n    if (this.isSnapshotTruthy() || !this.hasVariables()) {\n      return;\n    }\n\n    let rowPanels = row.panels;\n    if (!row.collapsed) {\n      const rowPanelIndex = _.findIndex(this.panels, (p: PanelModel) => p.id === row.id);\n      rowPanels = this.getRowPanels(rowPanelIndex);\n    }\n\n    this.cleanUpRowRepeats(rowPanels);\n\n    for (let i = 0; i < rowPanels.length; i++) {\n      const panel = rowPanels[i];\n      if (panel.repeat) {\n        const panelIndex = _.findIndex(this.panels, (p: PanelModel) => p.id === panel.id);\n        this.repeatPanel(panel, panelIndex);\n      }\n    }\n  }\n\n  getPanelRepeatClone(sourcePanel: PanelModel, valueIndex: number, sourcePanelIndex: number) {\n    // if first clone return source\n    if (valueIndex === 0) {\n      return sourcePanel;\n    }\n\n    const clone = new PanelModel(sourcePanel.getSaveModel());\n    clone.id = this.getNextPanelId();\n\n    // insert after source panel + value index\n    this.panels.splice(sourcePanelIndex + valueIndex, 0, clone);\n\n    clone.repeatIteration = this.iteration;\n    clone.repeatPanelId = sourcePanel.id;\n    clone.repeat = null;\n    return clone;\n  }\n\n  getRowRepeatClone(sourceRowPanel: PanelModel, valueIndex: number, sourcePanelIndex: number) {\n    // if first clone return source\n    if (valueIndex === 0) {\n      if (!sourceRowPanel.collapsed) {\n        const rowPanels = this.getRowPanels(sourcePanelIndex);\n        sourceRowPanel.panels = rowPanels;\n      }\n      return sourceRowPanel;\n    }\n\n    const clone = new PanelModel(sourceRowPanel.getSaveModel());\n    // for row clones we need to figure out panels under row to clone and where to insert clone\n    let rowPanels: PanelModel[], insertPos: number;\n    if (sourceRowPanel.collapsed) {\n      rowPanels = _.cloneDeep(sourceRowPanel.panels);\n      clone.panels = rowPanels;\n      // insert copied row after preceding row\n      insertPos = sourcePanelIndex + valueIndex;\n    } else {\n      rowPanels = this.getRowPanels(sourcePanelIndex);\n      clone.panels = _.map(rowPanels, (panel: PanelModel) => panel.getSaveModel());\n      // insert copied row after preceding row's panels\n      insertPos = sourcePanelIndex + (rowPanels.length + 1) * valueIndex;\n    }\n    this.panels.splice(insertPos, 0, clone);\n\n    this.updateRepeatedPanelIds(clone);\n    return clone;\n  }\n\n  repeatPanel(panel: PanelModel, panelIndex: number) {\n    const variable: any = this.getPanelRepeatVariable(panel);\n    if (!variable) {\n      return;\n    }\n\n    if (panel.type === 'row') {\n      this.repeatRow(panel, panelIndex, variable);\n      return;\n    }\n\n    const selectedOptions = this.getSelectedVariableOptions(variable);\n    const maxPerRow = panel.maxPerRow || 4;\n    let xPos = 0;\n    let yPos = panel.gridPos.y;\n\n    for (let index = 0; index < selectedOptions.length; index++) {\n      const option = selectedOptions[index];\n      let copy;\n\n      copy = this.getPanelRepeatClone(panel, index, panelIndex);\n      copy.scopedVars = copy.scopedVars || {};\n      copy.scopedVars[variable.name] = option;\n\n      if (panel.repeatDirection === REPEAT_DIR_VERTICAL) {\n        if (index > 0) {\n          yPos += copy.gridPos.h;\n        }\n        copy.gridPos.y = yPos;\n      } else {\n        // set width based on how many are selected\n        // assumed the repeated panels should take up full row width\n        copy.gridPos.w = Math.max(GRID_COLUMN_COUNT / selectedOptions.length, GRID_COLUMN_COUNT / maxPerRow);\n        copy.gridPos.x = xPos;\n        copy.gridPos.y = yPos;\n\n        xPos += copy.gridPos.w;\n\n        // handle overflow by pushing down one row\n        if (xPos + copy.gridPos.w > GRID_COLUMN_COUNT) {\n          xPos = 0;\n          yPos += copy.gridPos.h;\n        }\n      }\n    }\n\n    // Update gridPos for panels below\n    const yOffset = yPos - panel.gridPos.y;\n    if (yOffset > 0) {\n      const panelBelowIndex = panelIndex + selectedOptions.length;\n      for (let i = panelBelowIndex; i < this.panels.length; i++) {\n        this.panels[i].gridPos.y += yOffset;\n      }\n    }\n  }\n\n  repeatRow(panel: PanelModel, panelIndex: number, variable: any) {\n    const selectedOptions = this.getSelectedVariableOptions(variable);\n    let yPos = panel.gridPos.y;\n\n    function setScopedVars(panel: PanelModel, variableOption: any) {\n      panel.scopedVars = panel.scopedVars || {};\n      panel.scopedVars[variable.name] = variableOption;\n    }\n\n    for (let optionIndex = 0; optionIndex < selectedOptions.length; optionIndex++) {\n      const option = selectedOptions[optionIndex];\n      const rowCopy = this.getRowRepeatClone(panel, optionIndex, panelIndex);\n      setScopedVars(rowCopy, option);\n\n      const rowHeight = this.getRowHeight(rowCopy);\n      const rowPanels = rowCopy.panels || [];\n      let panelBelowIndex;\n\n      if (panel.collapsed) {\n        // For collapsed row just copy its panels and set scoped vars and proper IDs\n        _.each(rowPanels, (rowPanel: PanelModel, i: number) => {\n          setScopedVars(rowPanel, option);\n          if (optionIndex > 0) {\n            this.updateRepeatedPanelIds(rowPanel, true);\n          }\n        });\n        rowCopy.gridPos.y += optionIndex;\n        yPos += optionIndex;\n        panelBelowIndex = panelIndex + optionIndex + 1;\n      } else {\n        // insert after 'row' panel\n        const insertPos = panelIndex + (rowPanels.length + 1) * optionIndex + 1;\n        _.each(rowPanels, (rowPanel: PanelModel, i: number) => {\n          setScopedVars(rowPanel, option);\n          if (optionIndex > 0) {\n            const cloneRowPanel = new PanelModel(rowPanel);\n            this.updateRepeatedPanelIds(cloneRowPanel, true);\n            // For exposed row additionally set proper Y grid position and add it to dashboard panels\n            cloneRowPanel.gridPos.y += rowHeight * optionIndex;\n            this.panels.splice(insertPos + i, 0, cloneRowPanel);\n          }\n        });\n        rowCopy.panels = [];\n        rowCopy.gridPos.y += rowHeight * optionIndex;\n        yPos += rowHeight;\n        panelBelowIndex = insertPos + rowPanels.length;\n      }\n\n      // Update gridPos for panels below\n      for (let i = panelBelowIndex; i < this.panels.length; i++) {\n        this.panels[i].gridPos.y += yPos;\n      }\n    }\n  }\n\n  updateRepeatedPanelIds(panel: PanelModel, repeatedByRow?: boolean) {\n    panel.repeatPanelId = panel.id;\n    panel.id = this.getNextPanelId();\n    panel.repeatIteration = this.iteration;\n    if (repeatedByRow) {\n      panel.repeatedByRow = true;\n    } else {\n      panel.repeat = null;\n    }\n    return panel;\n  }\n\n  getSelectedVariableOptions(variable: any) {\n    let selectedOptions: any[];\n    if (variable.current.text === 'All') {\n      selectedOptions = variable.options.slice(1, variable.options.length);\n    } else {\n      selectedOptions = _.filter(variable.options, { selected: true });\n    }\n    return selectedOptions;\n  }\n\n  getRowHeight(rowPanel: PanelModel): number {\n    if (!rowPanel.panels || rowPanel.panels.length === 0) {\n      return 0;\n    }\n    const rowYPos = rowPanel.gridPos.y;\n    const positions = _.map(rowPanel.panels, 'gridPos');\n    const maxPos = _.maxBy(positions, (pos: GridPos) => {\n      return pos.y + pos.h;\n    });\n    return maxPos.y + maxPos.h - rowYPos;\n  }\n\n  removePanel(panel: PanelModel) {\n    const index = _.indexOf(this.panels, panel);\n    this.panels.splice(index, 1);\n    this.events.emit(panelRemoved, panel);\n  }\n\n  removeRow(row: PanelModel, removePanels: boolean) {\n    const needToogle = (!removePanels && row.collapsed) || (removePanels && !row.collapsed);\n\n    if (needToogle) {\n      this.toggleRow(row);\n    }\n\n    this.removePanel(row);\n  }\n\n  expandRows() {\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n\n      if (panel.type !== 'row') {\n        continue;\n      }\n\n      if (panel.collapsed) {\n        this.toggleRow(panel);\n      }\n    }\n  }\n\n  collapseRows() {\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n\n      if (panel.type !== 'row') {\n        continue;\n      }\n\n      if (!panel.collapsed) {\n        this.toggleRow(panel);\n      }\n    }\n  }\n\n  setPanelFocus(id: number) {\n    this.meta.focusPanelId = id;\n  }\n\n  updateSubmenuVisibility() {\n    this.meta.submenuEnabled = (() => {\n      if (this.links.length > 0) {\n        return true;\n      }\n\n      const visibleVars = _.filter(this.templating.list, (variable: any) => variable.hide !== 2);\n      if (visibleVars.length > 0) {\n        return true;\n      }\n\n      const visibleAnnotations = _.filter(this.annotations.list, (annotation: any) => annotation.hide !== true);\n      if (visibleAnnotations.length > 0) {\n        return true;\n      }\n\n      return false;\n    })();\n    this.events.emit(CoreEvents.submenuVisibilityChanged, this.meta.submenuEnabled);\n  }\n\n  getPanelInfoById(panelId: number) {\n    for (let i = 0; i < this.panels.length; i++) {\n      if (this.panels[i].id === panelId) {\n        return {\n          panel: this.panels[i],\n          index: i,\n        };\n      }\n    }\n\n    return null;\n  }\n\n  duplicatePanel(panel: PanelModel) {\n    const newPanel = panel.getSaveModel();\n    newPanel.id = this.getNextPanelId();\n\n    delete newPanel.repeat;\n    delete newPanel.repeatIteration;\n    delete newPanel.repeatPanelId;\n    delete newPanel.scopedVars;\n    if (newPanel.alert) {\n      delete newPanel.thresholds;\n    }\n    delete newPanel.alert;\n\n    // does it fit to the right?\n    if (panel.gridPos.x + panel.gridPos.w * 2 <= GRID_COLUMN_COUNT) {\n      newPanel.gridPos.x += panel.gridPos.w;\n    } else {\n      // add below\n      newPanel.gridPos.y += panel.gridPos.h;\n    }\n\n    this.addPanel(newPanel);\n    return newPanel;\n  }\n\n  formatDate(date: DateTimeInput, format?: string) {\n    return dateTimeFormat(date, {\n      format,\n      timeZone: this.getTimezone(),\n    });\n  }\n\n  destroy() {\n    this.events.removeAllListeners();\n    for (const panel of this.panels) {\n      panel.destroy();\n    }\n  }\n\n  toggleRow(row: PanelModel) {\n    const rowIndex = _.indexOf(this.panels, row);\n\n    if (row.collapsed) {\n      row.collapsed = false;\n      const hasRepeat = _.some(row.panels as PanelModel[], (p: PanelModel) => p.repeat);\n\n      if (row.panels.length > 0) {\n        // Use first panel to figure out if it was moved or pushed\n        const firstPanel = row.panels[0];\n        const yDiff = firstPanel.gridPos.y - (row.gridPos.y + row.gridPos.h);\n\n        // start inserting after row\n        let insertPos = rowIndex + 1;\n        // y max will represent the bottom y pos after all panels have been added\n        // needed to know home much panels below should be pushed down\n        let yMax = row.gridPos.y;\n\n        for (const panel of row.panels) {\n          // make sure y is adjusted (in case row moved while collapsed)\n          // console.log('yDiff', yDiff);\n          panel.gridPos.y -= yDiff;\n          // insert after row\n          this.panels.splice(insertPos, 0, new PanelModel(panel));\n          // update insert post and y max\n          insertPos += 1;\n          yMax = Math.max(yMax, panel.gridPos.y + panel.gridPos.h);\n        }\n\n        const pushDownAmount = yMax - row.gridPos.y - 1;\n\n        // push panels below down\n        for (let panelIndex = insertPos; panelIndex < this.panels.length; panelIndex++) {\n          this.panels[panelIndex].gridPos.y += pushDownAmount;\n        }\n\n        row.panels = [];\n\n        if (hasRepeat) {\n          this.processRowRepeats(row);\n        }\n      }\n\n      // sort panels\n      this.sortPanelsByGridPos();\n\n      // emit change event\n      this.events.emit(CoreEvents.rowExpanded);\n      return;\n    }\n\n    const rowPanels = this.getRowPanels(rowIndex);\n\n    // remove panels\n    _.pull(this.panels, ...rowPanels);\n    // save panel models inside row panel\n    row.panels = _.map(rowPanels, (panel: PanelModel) => panel.getSaveModel());\n    row.collapsed = true;\n\n    // emit change event\n    this.events.emit(CoreEvents.rowCollapsed);\n  }\n\n  /**\n   * Will return all panels after rowIndex until it encounters another row\n   */\n  getRowPanels(rowIndex: number): PanelModel[] {\n    const rowPanels = [];\n\n    for (let index = rowIndex + 1; index < this.panels.length; index++) {\n      const panel = this.panels[index];\n\n      // break when encountering another row\n      if (panel.type === 'row') {\n        break;\n      }\n\n      // this panel must belong to row\n      rowPanels.push(panel);\n    }\n\n    return rowPanels;\n  }\n\n  on<T>(event: AppEvent<T>, callback: (payload?: T) => void) {\n    this.events.on(event, callback);\n  }\n\n  off<T>(event: AppEvent<T>, callback?: (payload?: T) => void) {\n    this.events.off(event, callback);\n  }\n\n  cycleGraphTooltip() {\n    this.graphTooltip = (this.graphTooltip + 1) % 3;\n  }\n\n  sharedTooltipModeEnabled() {\n    return this.graphTooltip > 0;\n  }\n\n  sharedCrosshairModeOnly() {\n    return this.graphTooltip === 1;\n  }\n\n  getRelativeTime(date: DateTimeInput) {\n    return dateTimeFormatTimeAgo(date, {\n      timeZone: this.getTimezone(),\n    });\n  }\n\n  isSnapshot() {\n    return this.snapshot !== undefined;\n  }\n\n  getTimezone(): TimeZone {\n    return (this.timezone ? this.timezone : contextSrv?.user?.timezone) as TimeZone;\n  }\n\n  private updateSchema(old: any) {\n    const migrator = new DashboardMigrator(this);\n    migrator.updateSchema(old);\n  }\n\n  resetOriginalTime() {\n    this.originalTime = _.cloneDeep(this.time);\n  }\n\n  hasTimeChanged() {\n    return !_.isEqual(this.time, this.originalTime);\n  }\n\n  resetOriginalVariables(initial = false) {\n    if (!getConfig().featureToggles.newVariables || initial) {\n      this.originalTemplating = this.cloneVariablesFrom(this.templating.list);\n      return;\n    }\n\n    this.originalTemplating = this.cloneVariablesFrom(this.getVariablesFromState());\n  }\n\n  hasVariableValuesChanged() {\n    if (getConfig().featureToggles.newVariables) {\n      return this.hasVariablesChanged(this.originalTemplating, this.getVariablesFromState());\n    }\n\n    return this.hasVariablesChanged(this.originalTemplating, this.templating.list);\n  }\n\n  autoFitPanels(viewHeight: number, kioskMode?: UrlQueryValue) {\n    const currentGridHeight = Math.max(\n      ...this.panels.map(panel => {\n        return panel.gridPos.h + panel.gridPos.y;\n      })\n    );\n\n    const navbarHeight = 55;\n    const margin = 20;\n    const submenuHeight = 50;\n\n    let visibleHeight = viewHeight - navbarHeight - margin;\n\n    // Remove submenu height if visible\n    if (this.meta.submenuEnabled && !kioskMode) {\n      visibleHeight -= submenuHeight;\n    }\n\n    // add back navbar height\n    if (kioskMode && kioskMode !== KIOSK_MODE_TV) {\n      visibleHeight += navbarHeight;\n    }\n\n    const visibleGridHeight = Math.floor(visibleHeight / (GRID_CELL_HEIGHT + GRID_CELL_VMARGIN));\n    const scaleFactor = currentGridHeight / visibleGridHeight;\n\n    this.panels.forEach((panel, i) => {\n      panel.gridPos.y = Math.round(panel.gridPos.y / scaleFactor) || 1;\n      panel.gridPos.h = Math.round(panel.gridPos.h / scaleFactor) || 1;\n    });\n  }\n\n  templateVariableValueUpdated() {\n    this.processRepeats();\n    this.events.emit(CoreEvents.templateVariableValueUpdated);\n  }\n\n  expandParentRowFor(panelId: number) {\n    for (const panel of this.panels) {\n      if (panel.collapsed) {\n        for (const rowPanel of panel.panels) {\n          if (rowPanel.id === panelId) {\n            this.toggleRow(panel);\n            return;\n          }\n        }\n      }\n    }\n  }\n\n  toggleLegendsForAll() {\n    const panelsWithLegends = this.panels.filter(panel => {\n      return panel.legend !== undefined && panel.legend !== null;\n    });\n\n    // determine if more panels are displaying legends or not\n    const onCount = panelsWithLegends.filter(panel => panel.legend.show).length;\n    const offCount = panelsWithLegends.length - onCount;\n    const panelLegendsOn = onCount >= offCount;\n\n    for (const panel of panelsWithLegends) {\n      panel.legend.show = !panelLegendsOn;\n      panel.render();\n    }\n  }\n\n  getVariables = () => {\n    if (getConfig().featureToggles.newVariables) {\n      return this.getVariablesFromState();\n    }\n    return this.templating.list;\n  };\n\n  private getPanelRepeatVariable(panel: PanelModel) {\n    if (!getConfig().featureToggles.newVariables) {\n      return _.find(this.templating.list, { name: panel.repeat } as any);\n    }\n\n    return this.getVariablesFromState().find(variable => variable.name === panel.repeat);\n  }\n\n  private isSnapshotTruthy() {\n    return this.snapshot;\n  }\n\n  private hasVariables() {\n    if (getConfig().featureToggles.newVariables) {\n      return this.getVariablesFromState().length > 0;\n    }\n    return this.templating.list.length > 0;\n  }\n\n  private hasVariablesChanged(originalVariables: any[], currentVariables: any[]): boolean {\n    if (originalVariables.length !== currentVariables.length) {\n      return false;\n    }\n\n    const updated = _.map(currentVariables, (variable: any) => {\n      return {\n        name: variable.name,\n        type: variable.type,\n        current: _.cloneDeep(variable.current),\n        filters: _.cloneDeep(variable.filters),\n      };\n    });\n\n    return !_.isEqual(updated, originalVariables);\n  }\n\n  private cloneVariablesFrom(variables: any[]): any[] {\n    return variables.map(variable => {\n      return {\n        name: variable.name,\n        type: variable.type,\n        current: _.cloneDeep(variable.current),\n        filters: _.cloneDeep(variable.filters),\n      };\n    });\n  }\n}\n","// Generated from ScrollQLParser.g4 by ANTLR 4.8\n// jshint ignore: start\n// @ts-nocheck\nvar antlr4 = require('antlr4/index');\nvar ScrollQLParserListener = require('./ScrollQLParserListener').ScrollQLParserListener;\nvar grammarFileName = 'ScrollQLParser.g4';\n\nvar serializedATN = [\n  '\\u0003\\u608b\\ua72a\\u8133\\ub9ed\\u417c\\u3be7\\u7786\\u5964',\n  '\\u0003r\\u0244\\u0004\\u0002\\t\\u0002\\u0004\\u0003\\t\\u0003\\u0004\\u0004\\t',\n  '\\u0004\\u0004\\u0005\\t\\u0005\\u0004\\u0006\\t\\u0006\\u0004\\u0007\\t\\u0007\\u0004',\n  '\\b\\t\\b\\u0004\\t\\t\\t\\u0004\\n\\t\\n\\u0004\\u000b\\t\\u000b\\u0004\\f\\t\\f\\u0004',\n  '\\r\\t\\r\\u0004\\u000e\\t\\u000e\\u0004\\u000f\\t\\u000f\\u0004\\u0010\\t\\u0010\\u0004',\n  '\\u0011\\t\\u0011\\u0004\\u0012\\t\\u0012\\u0004\\u0013\\t\\u0013\\u0004\\u0014\\t',\n  '\\u0014\\u0004\\u0015\\t\\u0015\\u0004\\u0016\\t\\u0016\\u0004\\u0017\\t\\u0017\\u0004',\n  '\\u0018\\t\\u0018\\u0004\\u0019\\t\\u0019\\u0004\\u001a\\t\\u001a\\u0004\\u001b\\t',\n  '\\u001b\\u0004\\u001c\\t\\u001c\\u0004\\u001d\\t\\u001d\\u0004\\u001e\\t\\u001e\\u0004',\n  '\\u001f\\t\\u001f\\u0004 \\t \\u0004!\\t!\\u0004\"\\t\"\\u0004#\\t#\\u0004$\\t$\\u0004',\n  \"%\\t%\\u0004&\\t&\\u0004'\\t'\\u0004(\\t(\\u0004)\\t)\\u0004*\\t*\\u0004+\\t+\\u0004\",\n  ',\\t,\\u0004-\\t-\\u0004.\\t.\\u0004/\\t/\\u00040\\t0\\u00041\\t1\\u00042\\t2\\u0004',\n  '3\\t3\\u00044\\t4\\u00045\\t5\\u00046\\t6\\u00047\\t7\\u00048\\t8\\u00049\\t9\\u0004',\n  ':\\t:\\u0003\\u0002\\u0003\\u0002\\u0003\\u0002\\u0003\\u0003\\u0003\\u0003\\u0003',\n  '\\u0003\\u0005\\u0003{\\n\\u0003\\u0003\\u0003\\u0003\\u0003\\u0005\\u0003\\u007f',\n  '\\n\\u0003\\u0003\\u0004\\u0003\\u0004\\u0003\\u0004\\u0007\\u0004\\u0084\\n\\u0004',\n  '\\f\\u0004\\u000e\\u0004\\u0087\\u000b\\u0004\\u0003\\u0005\\u0003\\u0005\\u0003',\n  '\\u0005\\u0007\\u0005\\u008c\\n\\u0005\\f\\u0005\\u000e\\u0005\\u008f\\u000b\\u0005',\n  '\\u0003\\u0005\\u0003\\u0005\\u0005\\u0005\\u0093\\n\\u0005\\u0003\\u0005\\u0003',\n  '\\u0005\\u0007\\u0005\\u0097\\n\\u0005\\f\\u0005\\u000e\\u0005\\u009a\\u000b\\u0005',\n  '\\u0003\\u0006\\u0003\\u0006\\u0003\\u0006\\u0007\\u0006\\u009f\\n\\u0006\\f\\u0006',\n  '\\u000e\\u0006\\u00a2\\u000b\\u0006\\u0003\\u0007\\u0003\\u0007\\u0003\\u0007\\u0003',\n  '\\u0007\\u0003\\u0007\\u0003\\u0007\\u0005\\u0007\\u00aa\\n\\u0007\\u0003\\b\\u0003',\n  '\\b\\u0003\\b\\u0003\\b\\u0003\\b\\u0005\\b\\u00b1\\n\\b\\u0007\\b\\u00b3\\n\\b\\f\\b\\u000e',\n  '\\b\\u00b6\\u000b\\b\\u0003\\t\\u0003\\t\\u0003\\t\\u0003\\t\\u0003\\t\\u0003\\t\\u0003',\n  '\\t\\u0003\\t\\u0003\\t\\u0003\\n\\u0003\\n\\u0003\\n\\u0003\\n\\u0005\\n\\u00c5\\n\\n',\n  '\\u0003\\u000b\\u0003\\u000b\\u0003\\f\\u0003\\f\\u0005\\f\\u00cb\\n\\f\\u0003\\f\\u0003',\n  '\\f\\u0005\\f\\u00cf\\n\\f\\u0003\\f\\u0005\\f\\u00d2\\n\\f\\u0003\\f\\u0005\\f\\u00d5',\n  '\\n\\f\\u0003\\r\\u0003\\r\\u0005\\r\\u00d9\\n\\r\\u0003\\u000e\\u0003\\u000e\\u0003',\n  '\\u000f\\u0007\\u000f\\u00de\\n\\u000f\\f\\u000f\\u000e\\u000f\\u00e1\\u000b\\u000f',\n  '\\u0003\\u0010\\u0003\\u0010\\u0003\\u0010\\u0003\\u0010\\u0007\\u0010\\u00e7\\n',\n  '\\u0010\\f\\u0010\\u000e\\u0010\\u00ea\\u000b\\u0010\\u0003\\u0010\\u0005\\u0010',\n  '\\u00ed\\n\\u0010\\u0003\\u0010\\u0003\\u0010\\u0003\\u0010\\u0003\\u0010\\u0007',\n  '\\u0010\\u00f3\\n\\u0010\\f\\u0010\\u000e\\u0010\\u00f6\\u000b\\u0010\\u0005\\u0010',\n  '\\u00f8\\n\\u0010\\u0003\\u0011\\u0003\\u0011\\u0003\\u0011\\u0005\\u0011\\u00fd',\n  '\\n\\u0011\\u0003\\u0012\\u0003\\u0012\\u0005\\u0012\\u0101\\n\\u0012\\u0003\\u0013',\n  '\\u0003\\u0013\\u0003\\u0013\\u0003\\u0013\\u0007\\u0013\\u0107\\n\\u0013\\f\\u0013',\n  '\\u000e\\u0013\\u010a\\u000b\\u0013\\u0003\\u0013\\u0003\\u0013\\u0003\\u0013\\u0003',\n  '\\u0013\\u0007\\u0013\\u0110\\n\\u0013\\f\\u0013\\u000e\\u0013\\u0113\\u000b\\u0013',\n  '\\u0005\\u0013\\u0115\\n\\u0013\\u0003\\u0014\\u0003\\u0014\\u0003\\u0014\\u0005',\n  '\\u0014\\u011a\\n\\u0014\\u0003\\u0015\\u0003\\u0015\\u0005\\u0015\\u011e\\n\\u0015',\n  '\\u0003\\u0015\\u0003\\u0015\\u0003\\u0015\\u0003\\u0015\\u0003\\u0015\\u0007\\u0015',\n  '\\u0125\\n\\u0015\\f\\u0015\\u000e\\u0015\\u0128\\u000b\\u0015\\u0003\\u0015\\u0003',\n  '\\u0015\\u0005\\u0015\\u012c\\n\\u0015\\u0003\\u0015\\u0005\\u0015\\u012f\\n\\u0015',\n  '\\u0003\\u0016\\u0003\\u0016\\u0003\\u0016\\u0003\\u0017\\u0005\\u0017\\u0135\\n',\n  '\\u0017\\u0003\\u0017\\u0003\\u0017\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0003',\n  '\\u0018\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0005\\u0018\\u0141',\n  '\\n\\u0018\\u0003\\u0018\\u0003\\u0018\\u0005\\u0018\\u0145\\n\\u0018\\u0003\\u0018',\n  '\\u0003\\u0018\\u0003\\u0018\\u0003\\u0018\\u0007\\u0018\\u014b\\n\\u0018\\f\\u0018',\n  '\\u000e\\u0018\\u014e\\u000b\\u0018\\u0003\\u0019\\u0003\\u0019\\u0003\\u0019\\u0003',\n  '\\u0019\\u0003\\u0019\\u0005\\u0019\\u0155\\n\\u0019\\u0003\\u001a\\u0003\\u001a',\n  '\\u0003\\u001a\\u0003\\u001b\\u0003\\u001b\\u0005\\u001b\\u015c\\n\\u001b\\u0003',\n  '\\u001b\\u0003\\u001b\\u0003\\u001b\\u0007\\u001b\\u0161\\n\\u001b\\f\\u001b\\u000e',\n  '\\u001b\\u0164\\u000b\\u001b\\u0003\\u001c\\u0003\\u001c\\u0003\\u001c\\u0003\\u001c',\n  '\\u0003\\u001c\\u0005\\u001c\\u016b\\n\\u001c\\u0005\\u001c\\u016d\\n\\u001c\\u0003',\n  '\\u001d\\u0003\\u001d\\u0003\\u001d\\u0003\\u001d\\u0005\\u001d\\u0173\\n\\u001d',\n  '\\u0003\\u001e\\u0003\\u001e\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f',\n  '\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f',\n  '\\u0003\\u001f\\u0003\\u001f\\u0005\\u001f\\u0183\\n\\u001f\\u0003\\u001f\\u0003',\n  '\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003',\n  '\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003',\n  '\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0005\\u001f\\u0196\\n\\u001f',\n  '\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f',\n  '\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0005\\u001f\\u01a1\\n\\u001f\\u0003',\n  '\\u001f\\u0003\\u001f\\u0003\\u001f\\u0003\\u001f\\u0005\\u001f\\u01a7\\n\\u001f',\n  '\\u0003\\u001f\\u0003\\u001f\\u0007\\u001f\\u01ab\\n\\u001f\\f\\u001f\\u000e\\u001f',\n  '\\u01ae\\u000b\\u001f\\u0003 \\u0003 \\u0003 \\u0003 \\u0005 \\u01b4\\n \\u0003',\n  '!\\u0003!\\u0005!\\u01b8\\n!\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0003\"\\u0007',\n  '\"\\u01bf\\n\"\\f\"\\u000e\"\\u01c2\\u000b\"\\u0003\"\\u0003\"\\u0003\"\\u0003',\n  '\"\\u0003\"\\u0005\"\\u01c9\\n\"\\u0003\"\\u0003\"\\u0005\"\\u01cd\\n\"\\u0003',\n  '#\\u0003#\\u0005#\\u01d1\\n#\\u0003$\\u0003$\\u0003$\\u0003$\\u0007$\\u01d7\\n',\n  '$\\f$\\u000e$\\u01da\\u000b$\\u0003$\\u0003$\\u0003$\\u0003$\\u0005$\\u01e0\\n',\n  '$\\u0003%\\u0003%\\u0005%\\u01e4\\n%\\u0003&\\u0003&\\u0005&\\u01e8\\n&\\u0003',\n  \"'\\u0003'\\u0003'\\u0003'\\u0005'\\u01ee\\n'\\u0003(\\u0003(\\u0003(\\u0003\",\n  '(\\u0003(\\u0005(\\u01f5\\n(\\u0003)\\u0003)\\u0003*\\u0003*\\u0003*\\u0003*\\u0005',\n  '*\\u01fd\\n*\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0003+\\u0005+\\u0206',\n  '\\n+\\u0003,\\u0003,\\u0005,\\u020a\\n,\\u0003-\\u0003-\\u0005-\\u020e\\n-\\u0003',\n  '.\\u0003.\\u0005.\\u0212\\n.\\u0003/\\u0003/\\u0005/\\u0216\\n/\\u00030\\u0003',\n  '0\\u00060\\u021a\\n0\\r0\\u000e0\\u021b\\u00030\\u00030\\u00031\\u00031\\u0003',\n  '2\\u00032\\u00033\\u00033\\u00053\\u0226\\n3\\u00034\\u00034\\u00034\\u00035\\u0003',\n  '5\\u00035\\u00036\\u00036\\u00037\\u00037\\u00038\\u00038\\u00038\\u00058\\u0235',\n  '\\n8\\u00039\\u00039\\u0003:\\u0003:\\u0003:\\u0003:\\u0003:\\u0003:\\u0003:\\u0003',\n  ':\\u0003:\\u0005:\\u0242\\n:\\u0003:\\u0002\\u0004.<;\\u0002\\u0004\\u0006\\b\\n',\n  '\\f\\u000e\\u0010\\u0012\\u0014\\u0016\\u0018\\u001a\\u001c\\u001e \"$&(*,.02',\n  '468:<>@BDFHJLNPRTVXZ\\\\^`bdfhjlnpr\\u0002\\u001c\\u0003\\u0002;<\\u0005\\u0002',\n  ':<JJQQ\\u0003\\u0002\\u0010\\u0011\\u0003\\u0002\\u0014\\u0015\\u0004\\u0002\\u001e',\n  '\\u001eLL\\u0003\\u0002MO\\u0003\\u0002PQ\\u0003\\u0002SV\\u0004\\u0002\\u001f',\n  '\\u001fBC\\u0004\\u0002==^^\\u0004\\u0002>>__\\u0004\\u0002??``\\u0004\\u0002',\n  '@@aa\\u0004\\u0002DDcc\\u0004\\u0002AAdd\\u0004\\u0002::bb\\u0003\\u0002\\u0005',\n  \" \\u0003\\u0002!#\\u0003\\u0002$&\\u0003\\u0002')\\u0003\\u0002*,\\u0003\\u0002\",\n  '-.\\u0003\\u0002/0\\u0003\\u000213\\u0003\\u000246\\u0003\\u000279\\u0002\\u027b',\n  '\\u0002t\\u0003\\u0002\\u0002\\u0002\\u0004w\\u0003\\u0002\\u0002\\u0002\\u0006',\n  '\\u0080\\u0003\\u0002\\u0002\\u0002\\b\\u0088\\u0003\\u0002\\u0002\\u0002\\n\\u009b',\n  '\\u0003\\u0002\\u0002\\u0002\\f\\u00a9\\u0003\\u0002\\u0002\\u0002\\u000e\\u00ab',\n  '\\u0003\\u0002\\u0002\\u0002\\u0010\\u00b7\\u0003\\u0002\\u0002\\u0002\\u0012\\u00c4',\n  '\\u0003\\u0002\\u0002\\u0002\\u0014\\u00c6\\u0003\\u0002\\u0002\\u0002\\u0016\\u00d4',\n  '\\u0003\\u0002\\u0002\\u0002\\u0018\\u00d8\\u0003\\u0002\\u0002\\u0002\\u001a\\u00da',\n  '\\u0003\\u0002\\u0002\\u0002\\u001c\\u00df\\u0003\\u0002\\u0002\\u0002\\u001e\\u00e2',\n  '\\u0003\\u0002\\u0002\\u0002 \\u00f9\\u0003\\u0002\\u0002\\u0002\"\\u0100\\u0003',\n  '\\u0002\\u0002\\u0002$\\u0114\\u0003\\u0002\\u0002\\u0002&\\u0116\\u0003\\u0002',\n  '\\u0002\\u0002(\\u012e\\u0003\\u0002\\u0002\\u0002*\\u0130\\u0003\\u0002\\u0002',\n  '\\u0002,\\u0134\\u0003\\u0002\\u0002\\u0002.\\u0140\\u0003\\u0002\\u0002\\u0002',\n  '0\\u0154\\u0003\\u0002\\u0002\\u00022\\u0156\\u0003\\u0002\\u0002\\u00024\\u0159',\n  '\\u0003\\u0002\\u0002\\u00026\\u016c\\u0003\\u0002\\u0002\\u00028\\u0172\\u0003',\n  '\\u0002\\u0002\\u0002:\\u0174\\u0003\\u0002\\u0002\\u0002<\\u0182\\u0003\\u0002',\n  '\\u0002\\u0002>\\u01b3\\u0003\\u0002\\u0002\\u0002@\\u01b7\\u0003\\u0002\\u0002',\n  '\\u0002B\\u01cc\\u0003\\u0002\\u0002\\u0002D\\u01d0\\u0003\\u0002\\u0002\\u0002',\n  'F\\u01df\\u0003\\u0002\\u0002\\u0002H\\u01e3\\u0003\\u0002\\u0002\\u0002J\\u01e7',\n  '\\u0003\\u0002\\u0002\\u0002L\\u01ed\\u0003\\u0002\\u0002\\u0002N\\u01f4\\u0003',\n  '\\u0002\\u0002\\u0002P\\u01f6\\u0003\\u0002\\u0002\\u0002R\\u01fc\\u0003\\u0002',\n  '\\u0002\\u0002T\\u0205\\u0003\\u0002\\u0002\\u0002V\\u0209\\u0003\\u0002\\u0002',\n  '\\u0002X\\u020d\\u0003\\u0002\\u0002\\u0002Z\\u0211\\u0003\\u0002\\u0002\\u0002',\n  '\\\\\\u0215\\u0003\\u0002\\u0002\\u0002^\\u0217\\u0003\\u0002\\u0002\\u0002`\\u021f',\n  '\\u0003\\u0002\\u0002\\u0002b\\u0221\\u0003\\u0002\\u0002\\u0002d\\u0225\\u0003',\n  '\\u0002\\u0002\\u0002f\\u0227\\u0003\\u0002\\u0002\\u0002h\\u022a\\u0003\\u0002',\n  '\\u0002\\u0002j\\u022d\\u0003\\u0002\\u0002\\u0002l\\u022f\\u0003\\u0002\\u0002',\n  '\\u0002n\\u0234\\u0003\\u0002\\u0002\\u0002p\\u0236\\u0003\\u0002\\u0002\\u0002',\n  'r\\u0241\\u0003\\u0002\\u0002\\u0002tu\\u0005\\u0004\\u0003\\u0002uv\\u0007\\u0002',\n  '\\u0002\\u0003v\\u0003\\u0003\\u0002\\u0002\\u0002wz\\u0005\\b\\u0005\\u0002xy',\n  '\\u0007H\\u0002\\u0002y{\\u0005\\n\\u0006\\u0002zx\\u0003\\u0002\\u0002\\u0002',\n  'z{\\u0003\\u0002\\u0002\\u0002{~\\u0003\\u0002\\u0002\\u0002|}\\u0007I\\u0002',\n  '\\u0002}\\u007f\\u0005j6\\u0002~|\\u0003\\u0002\\u0002\\u0002~\\u007f\\u0003\\u0002',\n  '\\u0002\\u0002\\u007f\\u0005\\u0003\\u0002\\u0002\\u0002\\u0080\\u0085\\u0005j',\n  '6\\u0002\\u0081\\u0082\\u0007H\\u0002\\u0002\\u0082\\u0084\\u0005\\u000e\\b\\u0002',\n  '\\u0083\\u0081\\u0003\\u0002\\u0002\\u0002\\u0084\\u0087\\u0003\\u0002\\u0002\\u0002',\n  '\\u0085\\u0083\\u0003\\u0002\\u0002\\u0002\\u0085\\u0086\\u0003\\u0002\\u0002\\u0002',\n  '\\u0086\\u0007\\u0003\\u0002\\u0002\\u0002\\u0087\\u0085\\u0003\\u0002\\u0002\\u0002',\n  '\\u0088\\u008d\\u0005\\u0010\\t\\u0002\\u0089\\u008a\\u0007H\\u0002\\u0002\\u008a',\n  '\\u008c\\u0005\\u0010\\t\\u0002\\u008b\\u0089\\u0003\\u0002\\u0002\\u0002\\u008c',\n  '\\u008f\\u0003\\u0002\\u0002\\u0002\\u008d\\u008b\\u0003\\u0002\\u0002\\u0002\\u008d',\n  '\\u008e\\u0003\\u0002\\u0002\\u0002\\u008e\\u0092\\u0003\\u0002\\u0002\\u0002\\u008f',\n  '\\u008d\\u0003\\u0002\\u0002\\u0002\\u0090\\u0091\\u0007H\\u0002\\u0002\\u0091',\n  '\\u0093\\u0005,\\u0017\\u0002\\u0092\\u0090\\u0003\\u0002\\u0002\\u0002\\u0092',\n  '\\u0093\\u0003\\u0002\\u0002\\u0002\\u0093\\u0098\\u0003\\u0002\\u0002\\u0002\\u0094',\n  '\\u0095\\u0007H\\u0002\\u0002\\u0095\\u0097\\u0005\\f\\u0007\\u0002\\u0096\\u0094',\n  '\\u0003\\u0002\\u0002\\u0002\\u0097\\u009a\\u0003\\u0002\\u0002\\u0002\\u0098\\u0096',\n  '\\u0003\\u0002\\u0002\\u0002\\u0098\\u0099\\u0003\\u0002\\u0002\\u0002\\u0099\\t',\n  '\\u0003\\u0002\\u0002\\u0002\\u009a\\u0098\\u0003\\u0002\\u0002\\u0002\\u009b\\u00a0',\n  '\\u0005\\u001e\\u0010\\u0002\\u009c\\u009d\\u0007H\\u0002\\u0002\\u009d\\u009f',\n  '\\u0005\\f\\u0007\\u0002\\u009e\\u009c\\u0003\\u0002\\u0002\\u0002\\u009f\\u00a2',\n  '\\u0003\\u0002\\u0002\\u0002\\u00a0\\u009e\\u0003\\u0002\\u0002\\u0002\\u00a0\\u00a1',\n  '\\u0003\\u0002\\u0002\\u0002\\u00a1\\u000b\\u0003\\u0002\\u0002\\u0002\\u00a2\\u00a0',\n  '\\u0003\\u0002\\u0002\\u0002\\u00a3\\u00aa\\u0005$\\u0013\\u0002\\u00a4\\u00aa',\n  '\\u0005(\\u0015\\u0002\\u00a5\\u00aa\\u00052\\u001a\\u0002\\u00a6\\u00aa\\u0005',\n  '*\\u0016\\u0002\\u00a7\\u00aa\\u00054\\u001b\\u0002\\u00a8\\u00aa\\u00058\\u001d',\n  '\\u0002\\u00a9\\u00a3\\u0003\\u0002\\u0002\\u0002\\u00a9\\u00a4\\u0003\\u0002\\u0002',\n  '\\u0002\\u00a9\\u00a5\\u0003\\u0002\\u0002\\u0002\\u00a9\\u00a6\\u0003\\u0002\\u0002',\n  '\\u0002\\u00a9\\u00a7\\u0003\\u0002\\u0002\\u0002\\u00a9\\u00a8\\u0003\\u0002\\u0002',\n  '\\u0002\\u00aa\\r\\u0003\\u0002\\u0002\\u0002\\u00ab\\u00b4\\u0005l7\\u0002\\u00ac',\n  '\\u00ad\\u0005n8\\u0002\\u00ad\\u00ae\\u0007W\\u0002\\u0002\\u00ae\\u00b0\\u0005',\n  'V,\\u0002\\u00af\\u00b1\\u0007E\\u0002\\u0002\\u00b0\\u00af\\u0003\\u0002\\u0002',\n  '\\u0002\\u00b0\\u00b1\\u0003\\u0002\\u0002\\u0002\\u00b1\\u00b3\\u0003\\u0002\\u0002',\n  '\\u0002\\u00b2\\u00ac\\u0003\\u0002\\u0002\\u0002\\u00b3\\u00b6\\u0003\\u0002\\u0002',\n  '\\u0002\\u00b4\\u00b2\\u0003\\u0002\\u0002\\u0002\\u00b4\\u00b5\\u0003\\u0002\\u0002',\n  '\\u0002\\u00b5\\u000f\\u0003\\u0002\\u0002\\u0002\\u00b6\\u00b4\\u0003\\u0002\\u0002',\n  '\\u0002\\u00b7\\u00b8\\u0007\\u0005\\u0002\\u0002\\u00b8\\u00b9\\u0005T+\\u0002',\n  '\\u00b9\\u00ba\\u0007\\u0006\\u0002\\u0002\\u00ba\\u00bb\\u0007W\\u0002\\u0002',\n  '\\u00bb\\u00bc\\u0005\\u0012\\n\\u0002\\u00bc\\u00bd\\u0007\\u0007\\u0002\\u0002',\n  '\\u00bd\\u00be\\u0007W\\u0002\\u0002\\u00be\\u00bf\\u0005\\u0012\\n\\u0002\\u00bf',\n  '\\u0011\\u0003\\u0002\\u0002\\u0002\\u00c0\\u00c5\\u0005\\u0014\\u000b\\u0002\\u00c1',\n  '\\u00c5\\u0005\\u0016\\f\\u0002\\u00c2\\u00c5\\u0005\\u001a\\u000e\\u0002\\u00c3',\n  '\\u00c5\\u0005\\u0018\\r\\u0002\\u00c4\\u00c0\\u0003\\u0002\\u0002\\u0002\\u00c4',\n  '\\u00c1\\u0003\\u0002\\u0002\\u0002\\u00c4\\u00c2\\u0003\\u0002\\u0002\\u0002\\u00c4',\n  '\\u00c3\\u0003\\u0002\\u0002\\u0002\\u00c5\\u0013\\u0003\\u0002\\u0002\\u0002\\u00c6',\n  '\\u00c7\\u0007\\b\\u0002\\u0002\\u00c7\\u0015\\u0003\\u0002\\u0002\\u0002\\u00c8',\n  '\\u00ca\\u0007Q\\u0002\\u0002\\u00c9\\u00cb\\t\\u0002\\u0002\\u0002\\u00ca\\u00c9',\n  '\\u0003\\u0002\\u0002\\u0002\\u00ca\\u00cb\\u0003\\u0002\\u0002\\u0002\\u00cb\\u00cc',\n  '\\u0003\\u0002\\u0002\\u0002\\u00cc\\u00d5\\u0005r:\\u0002\\u00cd\\u00cf\\u0007',\n  'P\\u0002\\u0002\\u00ce\\u00cd\\u0003\\u0002\\u0002\\u0002\\u00ce\\u00cf\\u0003',\n  '\\u0002\\u0002\\u0002\\u00cf\\u00d1\\u0003\\u0002\\u0002\\u0002\\u00d0\\u00d2\\t',\n  '\\u0002\\u0002\\u0002\\u00d1\\u00d0\\u0003\\u0002\\u0002\\u0002\\u00d1\\u00d2\\u0003',\n  '\\u0002\\u0002\\u0002\\u00d2\\u00d3\\u0003\\u0002\\u0002\\u0002\\u00d3\\u00d5\\u0005',\n  'r:\\u0002\\u00d4\\u00c8\\u0003\\u0002\\u0002\\u0002\\u00d4\\u00ce\\u0003\\u0002',\n  '\\u0002\\u0002\\u00d5\\u0017\\u0003\\u0002\\u0002\\u0002\\u00d6\\u00d9\\u0005N',\n  '(\\u0002\\u00d7\\u00d9\\u0005\\u001c\\u000f\\u0002\\u00d8\\u00d6\\u0003\\u0002',\n  '\\u0002\\u0002\\u00d8\\u00d7\\u0003\\u0002\\u0002\\u0002\\u00d9\\u0019\\u0003\\u0002',\n  '\\u0002\\u0002\\u00da\\u00db\\t\\u0002\\u0002\\u0002\\u00db\\u001b\\u0003\\u0002',\n  '\\u0002\\u0002\\u00dc\\u00de\\t\\u0003\\u0002\\u0002\\u00dd\\u00dc\\u0003\\u0002',\n  '\\u0002\\u0002\\u00de\\u00e1\\u0003\\u0002\\u0002\\u0002\\u00df\\u00dd\\u0003\\u0002',\n  '\\u0002\\u0002\\u00df\\u00e0\\u0003\\u0002\\u0002\\u0002\\u00e0\\u001d\\u0003\\u0002',\n  '\\u0002\\u0002\\u00e1\\u00df\\u0003\\u0002\\u0002\\u0002\\u00e2\\u00e3\\u0007\\u000f',\n  '\\u0002\\u0002\\u00e3\\u00e8\\u0005 \\u0011\\u0002\\u00e4\\u00e5\\u0007E\\u0002',\n  '\\u0002\\u00e5\\u00e7\\u0005 \\u0011\\u0002\\u00e6\\u00e4\\u0003\\u0002\\u0002',\n  '\\u0002\\u00e7\\u00ea\\u0003\\u0002\\u0002\\u0002\\u00e8\\u00e6\\u0003\\u0002\\u0002',\n  '\\u0002\\u00e8\\u00e9\\u0003\\u0002\\u0002\\u0002\\u00e9\\u00f7\\u0003\\u0002\\u0002',\n  '\\u0002\\u00ea\\u00e8\\u0003\\u0002\\u0002\\u0002\\u00eb\\u00ed\\u0007\\u0019\\u0002',\n  '\\u0002\\u00ec\\u00eb\\u0003\\u0002\\u0002\\u0002\\u00ec\\u00ed\\u0003\\u0002\\u0002',\n  '\\u0002\\u00ed\\u00ee\\u0003\\u0002\\u0002\\u0002\\u00ee\\u00ef\\u0007\\u001a\\u0002',\n  '\\u0002\\u00ef\\u00f4\\u0005\"\\u0012\\u0002\\u00f0\\u00f1\\u0007E\\u0002\\u0002',\n  '\\u00f1\\u00f3\\u0005\"\\u0012\\u0002\\u00f2\\u00f0\\u0003\\u0002\\u0002\\u0002',\n  '\\u00f3\\u00f6\\u0003\\u0002\\u0002\\u0002\\u00f4\\u00f2\\u0003\\u0002\\u0002\\u0002',\n  '\\u00f4\\u00f5\\u0003\\u0002\\u0002\\u0002\\u00f5\\u00f8\\u0003\\u0002\\u0002\\u0002',\n  '\\u00f6\\u00f4\\u0003\\u0002\\u0002\\u0002\\u00f7\\u00ec\\u0003\\u0002\\u0002\\u0002',\n  '\\u00f7\\u00f8\\u0003\\u0002\\u0002\\u0002\\u00f8\\u001f\\u0003\\u0002\\u0002\\u0002',\n  '\\u00f9\\u00fc\\u0005:\\u001e\\u0002\\u00fa\\u00fb\\u0007\\u001b\\u0002\\u0002',\n  '\\u00fb\\u00fd\\u0005X-\\u0002\\u00fc\\u00fa\\u0003\\u0002\\u0002\\u0002\\u00fc',\n  '\\u00fd\\u0003\\u0002\\u0002\\u0002\\u00fd!\\u0003\\u0002\\u0002\\u0002\\u00fe',\n  '\\u0101\\u0005V,\\u0002\\u00ff\\u0101\\u0005&\\u0014\\u0002\\u0100\\u00fe\\u0003',\n  '\\u0002\\u0002\\u0002\\u0100\\u00ff\\u0003\\u0002\\u0002\\u0002\\u0101#\\u0003',\n  '\\u0002\\u0002\\u0002\\u0102\\u0103\\u0007\\f\\u0002\\u0002\\u0103\\u0108\\u0005',\n  '&\\u0014\\u0002\\u0104\\u0105\\u0007E\\u0002\\u0002\\u0105\\u0107\\u0005&\\u0014',\n  '\\u0002\\u0106\\u0104\\u0003\\u0002\\u0002\\u0002\\u0107\\u010a\\u0003\\u0002\\u0002',\n  '\\u0002\\u0108\\u0106\\u0003\\u0002\\u0002\\u0002\\u0108\\u0109\\u0003\\u0002\\u0002',\n  '\\u0002\\u0109\\u0115\\u0003\\u0002\\u0002\\u0002\\u010a\\u0108\\u0003\\u0002\\u0002',\n  '\\u0002\\u010b\\u010c\\u0007\\r\\u0002\\u0002\\u010c\\u0111\\u0005&\\u0014\\u0002',\n  '\\u010d\\u010e\\u0007E\\u0002\\u0002\\u010e\\u0110\\u0005&\\u0014\\u0002\\u010f',\n  '\\u010d\\u0003\\u0002\\u0002\\u0002\\u0110\\u0113\\u0003\\u0002\\u0002\\u0002\\u0111',\n  '\\u010f\\u0003\\u0002\\u0002\\u0002\\u0111\\u0112\\u0003\\u0002\\u0002\\u0002\\u0112',\n  '\\u0115\\u0003\\u0002\\u0002\\u0002\\u0113\\u0111\\u0003\\u0002\\u0002\\u0002\\u0114',\n  '\\u0102\\u0003\\u0002\\u0002\\u0002\\u0114\\u010b\\u0003\\u0002\\u0002\\u0002\\u0115',\n  '%\\u0003\\u0002\\u0002\\u0002\\u0116\\u0119\\u0005:\\u001e\\u0002\\u0117\\u0118',\n  '\\u0007\\u001b\\u0002\\u0002\\u0118\\u011a\\u0005X-\\u0002\\u0119\\u0117\\u0003',\n  \"\\u0002\\u0002\\u0002\\u0119\\u011a\\u0003\\u0002\\u0002\\u0002\\u011a'\\u0003\",\n  '\\u0002\\u0002\\u0002\\u011b\\u011d\\u0007\\n\\u0002\\u0002\\u011c\\u011e\\u0005',\n  'V,\\u0002\\u011d\\u011c\\u0003\\u0002\\u0002\\u0002\\u011d\\u011e\\u0003\\u0002',\n  '\\u0002\\u0002\\u011e\\u011f\\u0003\\u0002\\u0002\\u0002\\u011f\\u0120\\u0005L',\n  \"'\\u0002\\u0120\\u0121\\u0007\\u001b\\u0002\\u0002\\u0121\\u0126\\u0005X-\\u0002\",\n  '\\u0122\\u0123\\u0007E\\u0002\\u0002\\u0123\\u0125\\u0005X-\\u0002\\u0124\\u0122',\n  '\\u0003\\u0002\\u0002\\u0002\\u0125\\u0128\\u0003\\u0002\\u0002\\u0002\\u0126\\u0124',\n  '\\u0003\\u0002\\u0002\\u0002\\u0126\\u0127\\u0003\\u0002\\u0002\\u0002\\u0127\\u012f',\n  '\\u0003\\u0002\\u0002\\u0002\\u0128\\u0126\\u0003\\u0002\\u0002\\u0002\\u0129\\u012b',\n  '\\u0007\\n\\u0002\\u0002\\u012a\\u012c\\u0005V,\\u0002\\u012b\\u012a\\u0003\\u0002',\n  '\\u0002\\u0002\\u012b\\u012c\\u0003\\u0002\\u0002\\u0002\\u012c\\u012d\\u0003\\u0002',\n  '\\u0002\\u0002\\u012d\\u012f\\u0005P)\\u0002\\u012e\\u011b\\u0003\\u0002\\u0002',\n  '\\u0002\\u012e\\u0129\\u0003\\u0002\\u0002\\u0002\\u012f)\\u0003\\u0002\\u0002',\n  '\\u0002\\u0130\\u0131\\u0007\\u000b\\u0002\\u0002\\u0131\\u0132\\u0005.\\u0018',\n  '\\u0002\\u0132+\\u0003\\u0002\\u0002\\u0002\\u0133\\u0135\\u0007g\\u0002\\u0002',\n  '\\u0134\\u0133\\u0003\\u0002\\u0002\\u0002\\u0134\\u0135\\u0003\\u0002\\u0002\\u0002',\n  '\\u0135\\u0136\\u0003\\u0002\\u0002\\u0002\\u0136\\u0137\\u0005.\\u0018\\u0002',\n  '\\u0137-\\u0003\\u0002\\u0002\\u0002\\u0138\\u0139\\b\\u0018\\u0001\\u0002\\u0139',\n  '\\u013a\\u0007l\\u0002\\u0002\\u013a\\u0141\\u0005.\\u0018\\u0007\\u013b\\u013c',\n  '\\u0007h\\u0002\\u0002\\u013c\\u013d\\u0005.\\u0018\\u0002\\u013d\\u013e\\u0007',\n  'i\\u0002\\u0002\\u013e\\u0141\\u0003\\u0002\\u0002\\u0002\\u013f\\u0141\\u0005',\n  '0\\u0019\\u0002\\u0140\\u0138\\u0003\\u0002\\u0002\\u0002\\u0140\\u013b\\u0003',\n  '\\u0002\\u0002\\u0002\\u0140\\u013f\\u0003\\u0002\\u0002\\u0002\\u0141\\u014c\\u0003',\n  '\\u0002\\u0002\\u0002\\u0142\\u0144\\f\\u0005\\u0002\\u0002\\u0143\\u0145\\u0007',\n  'j\\u0002\\u0002\\u0144\\u0143\\u0003\\u0002\\u0002\\u0002\\u0144\\u0145\\u0003',\n  '\\u0002\\u0002\\u0002\\u0145\\u0146\\u0003\\u0002\\u0002\\u0002\\u0146\\u014b\\u0005',\n  '.\\u0018\\u0006\\u0147\\u0148\\f\\u0004\\u0002\\u0002\\u0148\\u0149\\u0007k\\u0002',\n  '\\u0002\\u0149\\u014b\\u0005.\\u0018\\u0005\\u014a\\u0142\\u0003\\u0002\\u0002',\n  '\\u0002\\u014a\\u0147\\u0003\\u0002\\u0002\\u0002\\u014b\\u014e\\u0003\\u0002\\u0002',\n  '\\u0002\\u014c\\u014a\\u0003\\u0002\\u0002\\u0002\\u014c\\u014d\\u0003\\u0002\\u0002',\n  '\\u0002\\u014d/\\u0003\\u0002\\u0002\\u0002\\u014e\\u014c\\u0003\\u0002\\u0002',\n  '\\u0002\\u014f\\u0155\\u0007q\\u0002\\u0002\\u0150\\u0155\\u0007m\\u0002\\u0002',\n  '\\u0151\\u0155\\u0007n\\u0002\\u0002\\u0152\\u0155\\u0007o\\u0002\\u0002\\u0153',\n  '\\u0155\\u0007p\\u0002\\u0002\\u0154\\u014f\\u0003\\u0002\\u0002\\u0002\\u0154',\n  '\\u0150\\u0003\\u0002\\u0002\\u0002\\u0154\\u0151\\u0003\\u0002\\u0002\\u0002\\u0154',\n  '\\u0152\\u0003\\u0002\\u0002\\u0002\\u0154\\u0153\\u0003\\u0002\\u0002\\u0002\\u0155',\n  '1\\u0003\\u0002\\u0002\\u0002\\u0156\\u0157\\u0007\\u000e\\u0002\\u0002\\u0157',\n  '\\u0158\\u0005:\\u001e\\u0002\\u01583\\u0003\\u0002\\u0002\\u0002\\u0159\\u015b',\n  '\\t\\u0004\\u0002\\u0002\\u015a\\u015c\\u0007\\u001a\\u0002\\u0002\\u015b\\u015a',\n  '\\u0003\\u0002\\u0002\\u0002\\u015b\\u015c\\u0003\\u0002\\u0002\\u0002\\u015c\\u015d',\n  '\\u0003\\u0002\\u0002\\u0002\\u015d\\u0162\\u00056\\u001c\\u0002\\u015e\\u015f',\n  '\\u0007E\\u0002\\u0002\\u015f\\u0161\\u00056\\u001c\\u0002\\u0160\\u015e\\u0003',\n  '\\u0002\\u0002\\u0002\\u0161\\u0164\\u0003\\u0002\\u0002\\u0002\\u0162\\u0160\\u0003',\n  '\\u0002\\u0002\\u0002\\u0162\\u0163\\u0003\\u0002\\u0002\\u0002\\u01635\\u0003',\n  '\\u0002\\u0002\\u0002\\u0164\\u0162\\u0003\\u0002\\u0002\\u0002\\u0165\\u0166\\u0005',\n  'V,\\u0002\\u0166\\u0167\\u0007\\u0013\\u0002\\u0002\\u0167\\u016d\\u0003\\u0002',\n  '\\u0002\\u0002\\u0168\\u016a\\u0005V,\\u0002\\u0169\\u016b\\u0007\\u0012\\u0002',\n  '\\u0002\\u016a\\u0169\\u0003\\u0002\\u0002\\u0002\\u016a\\u016b\\u0003\\u0002\\u0002',\n  '\\u0002\\u016b\\u016d\\u0003\\u0002\\u0002\\u0002\\u016c\\u0165\\u0003\\u0002\\u0002',\n  '\\u0002\\u016c\\u0168\\u0003\\u0002\\u0002\\u0002\\u016d7\\u0003\\u0002\\u0002',\n  '\\u0002\\u016e\\u016f\\t\\u0005\\u0002\\u0002\\u016f\\u0173\\u0007;\\u0002\\u0002',\n  '\\u0170\\u0171\\u0007\\u0016\\u0002\\u0002\\u0171\\u0173\\u0007;\\u0002\\u0002',\n  '\\u0172\\u016e\\u0003\\u0002\\u0002\\u0002\\u0172\\u0170\\u0003\\u0002\\u0002\\u0002',\n  '\\u01739\\u0003\\u0002\\u0002\\u0002\\u0174\\u0175\\u0005<\\u001f\\u0002\\u0175',\n  ';\\u0003\\u0002\\u0002\\u0002\\u0176\\u0177\\b\\u001f\\u0001\\u0002\\u0177\\u0178',\n  '\\u0007F\\u0002\\u0002\\u0178\\u0179\\u0005<\\u001f\\u0002\\u0179\\u017a\\u0007',\n  'G\\u0002\\u0002\\u017a\\u0183\\u0003\\u0002\\u0002\\u0002\\u017b\\u017c\\t\\u0006',\n  '\\u0002\\u0002\\u017c\\u0183\\u0005<\\u001f\\u000e\\u017d\\u017e\\u0007Q\\u0002',\n  '\\u0002\\u017e\\u0183\\u0005<\\u001f\\r\\u017f\\u0180\\u0007P\\u0002\\u0002\\u0180',\n  '\\u0183\\u0005<\\u001f\\f\\u0181\\u0183\\u0005> \\u0002\\u0182\\u0176\\u0003\\u0002',\n  '\\u0002\\u0002\\u0182\\u017b\\u0003\\u0002\\u0002\\u0002\\u0182\\u017d\\u0003\\u0002',\n  '\\u0002\\u0002\\u0182\\u017f\\u0003\\u0002\\u0002\\u0002\\u0182\\u0181\\u0003\\u0002',\n  '\\u0002\\u0002\\u0183\\u01ac\\u0003\\u0002\\u0002\\u0002\\u0184\\u0185\\f\\u000f',\n  '\\u0002\\u0002\\u0185\\u0186\\u0007K\\u0002\\u0002\\u0186\\u01ab\\u0005<\\u001f',\n  '\\u000f\\u0187\\u0188\\f\\u000b\\u0002\\u0002\\u0188\\u0189\\t\\u0007\\u0002\\u0002',\n  '\\u0189\\u01ab\\u0005<\\u001f\\f\\u018a\\u018b\\f\\n\\u0002\\u0002\\u018b\\u018c',\n  '\\t\\b\\u0002\\u0002\\u018c\\u01ab\\u0005<\\u001f\\u000b\\u018d\\u018e\\f\\t\\u0002',\n  '\\u0002\\u018e\\u018f\\t\\t\\u0002\\u0002\\u018f\\u01ab\\u0005<\\u001f\\n\\u0190',\n  '\\u0195\\f\\b\\u0002\\u0002\\u0191\\u0192\\u0007W\\u0002\\u0002\\u0192\\u0196\\u0007',\n  'W\\u0002\\u0002\\u0193\\u0196\\u0007W\\u0002\\u0002\\u0194\\u0196\\u0007X\\u0002',\n  '\\u0002\\u0195\\u0191\\u0003\\u0002\\u0002\\u0002\\u0195\\u0193\\u0003\\u0002\\u0002',\n  '\\u0002\\u0195\\u0194\\u0003\\u0002\\u0002\\u0002\\u0196\\u0197\\u0003\\u0002\\u0002',\n  '\\u0002\\u0197\\u01ab\\u0005<\\u001f\\t\\u0198\\u0199\\f\\u0005\\u0002\\u0002\\u0199',\n  '\\u019a\\u0007\\u001c\\u0002\\u0002\\u019a\\u01ab\\u0005<\\u001f\\u0006\\u019b',\n  '\\u019c\\f\\u0004\\u0002\\u0002\\u019c\\u019d\\u0007\\u001d\\u0002\\u0002\\u019d',\n  '\\u01ab\\u0005<\\u001f\\u0005\\u019e\\u01a0\\f\\u0007\\u0002\\u0002\\u019f\\u01a1',\n  '\\u0007\\u001e\\u0002\\u0002\\u01a0\\u019f\\u0003\\u0002\\u0002\\u0002\\u01a0\\u01a1',\n  '\\u0003\\u0002\\u0002\\u0002\\u01a1\\u01a2\\u0003\\u0002\\u0002\\u0002\\u01a2\\u01a3',\n  '\\t\\n\\u0002\\u0002\\u01a3\\u01ab\\u0005@!\\u0002\\u01a4\\u01a6\\f\\u0006\\u0002',\n  '\\u0002\\u01a5\\u01a7\\u0007\\u001e\\u0002\\u0002\\u01a6\\u01a5\\u0003\\u0002\\u0002',\n  '\\u0002\\u01a6\\u01a7\\u0003\\u0002\\u0002\\u0002\\u01a7\\u01a8\\u0003\\u0002\\u0002',\n  '\\u0002\\u01a8\\u01a9\\u0007\\u0018\\u0002\\u0002\\u01a9\\u01ab\\u0005F$\\u0002',\n  '\\u01aa\\u0184\\u0003\\u0002\\u0002\\u0002\\u01aa\\u0187\\u0003\\u0002\\u0002\\u0002',\n  '\\u01aa\\u018a\\u0003\\u0002\\u0002\\u0002\\u01aa\\u018d\\u0003\\u0002\\u0002\\u0002',\n  '\\u01aa\\u0190\\u0003\\u0002\\u0002\\u0002\\u01aa\\u0198\\u0003\\u0002\\u0002\\u0002',\n  '\\u01aa\\u019b\\u0003\\u0002\\u0002\\u0002\\u01aa\\u019e\\u0003\\u0002\\u0002\\u0002',\n  '\\u01aa\\u01a4\\u0003\\u0002\\u0002\\u0002\\u01ab\\u01ae\\u0003\\u0002\\u0002\\u0002',\n  '\\u01ac\\u01aa\\u0003\\u0002\\u0002\\u0002\\u01ac\\u01ad\\u0003\\u0002\\u0002\\u0002',\n  '\\u01ad=\\u0003\\u0002\\u0002\\u0002\\u01ae\\u01ac\\u0003\\u0002\\u0002\\u0002',\n  '\\u01af\\u01b4\\u0005V,\\u0002\\u01b0\\u01b4\\u0005J&\\u0002\\u01b1\\u01b4\\u0005',\n  'N(\\u0002\\u01b2\\u01b4\\u0005B\"\\u0002\\u01b3\\u01af\\u0003\\u0002\\u0002\\u0002',\n  '\\u01b3\\u01b0\\u0003\\u0002\\u0002\\u0002\\u01b3\\u01b1\\u0003\\u0002\\u0002\\u0002',\n  '\\u01b3\\u01b2\\u0003\\u0002\\u0002\\u0002\\u01b4?\\u0003\\u0002\\u0002\\u0002',\n  '\\u01b5\\u01b8\\u0005P)\\u0002\\u01b6\\u01b8\\u0005R*\\u0002\\u01b7\\u01b5\\u0003',\n  '\\u0002\\u0002\\u0002\\u01b7\\u01b6\\u0003\\u0002\\u0002\\u0002\\u01b8A\\u0003',\n  '\\u0002\\u0002\\u0002\\u01b9\\u01ba\\u0005l7\\u0002\\u01ba\\u01bb\\u0007F\\u0002',\n  '\\u0002\\u01bb\\u01c0\\u0005D#\\u0002\\u01bc\\u01bd\\u0007E\\u0002\\u0002\\u01bd',\n  '\\u01bf\\u0005D#\\u0002\\u01be\\u01bc\\u0003\\u0002\\u0002\\u0002\\u01bf\\u01c2',\n  '\\u0003\\u0002\\u0002\\u0002\\u01c0\\u01be\\u0003\\u0002\\u0002\\u0002\\u01c0\\u01c1',\n  '\\u0003\\u0002\\u0002\\u0002\\u01c1\\u01c3\\u0003\\u0002\\u0002\\u0002\\u01c2\\u01c0',\n  '\\u0003\\u0002\\u0002\\u0002\\u01c3\\u01c4\\u0007G\\u0002\\u0002\\u01c4\\u01cd',\n  '\\u0003\\u0002\\u0002\\u0002\\u01c5\\u01c6\\u0005l7\\u0002\\u01c6\\u01c8\\u0007',\n  'F\\u0002\\u0002\\u01c7\\u01c9\\u0007M\\u0002\\u0002\\u01c8\\u01c7\\u0003\\u0002',\n  '\\u0002\\u0002\\u01c8\\u01c9\\u0003\\u0002\\u0002\\u0002\\u01c9\\u01ca\\u0003\\u0002',\n  '\\u0002\\u0002\\u01ca\\u01cb\\u0007G\\u0002\\u0002\\u01cb\\u01cd\\u0003\\u0002',\n  '\\u0002\\u0002\\u01cc\\u01b9\\u0003\\u0002\\u0002\\u0002\\u01cc\\u01c5\\u0003\\u0002',\n  '\\u0002\\u0002\\u01cdC\\u0003\\u0002\\u0002\\u0002\\u01ce\\u01d1\\u0005\\u0016',\n  '\\f\\u0002\\u01cf\\u01d1\\u0005<\\u001f\\u0002\\u01d0\\u01ce\\u0003\\u0002\\u0002',\n  '\\u0002\\u01d0\\u01cf\\u0003\\u0002\\u0002\\u0002\\u01d1E\\u0003\\u0002\\u0002',\n  '\\u0002\\u01d2\\u01d3\\u0007Y\\u0002\\u0002\\u01d3\\u01d8\\u0005H%\\u0002\\u01d4',\n  '\\u01d5\\u0007E\\u0002\\u0002\\u01d5\\u01d7\\u0005H%\\u0002\\u01d6\\u01d4\\u0003',\n  '\\u0002\\u0002\\u0002\\u01d7\\u01da\\u0003\\u0002\\u0002\\u0002\\u01d8\\u01d6\\u0003',\n  '\\u0002\\u0002\\u0002\\u01d8\\u01d9\\u0003\\u0002\\u0002\\u0002\\u01d9\\u01db\\u0003',\n  '\\u0002\\u0002\\u0002\\u01da\\u01d8\\u0003\\u0002\\u0002\\u0002\\u01db\\u01dc\\u0007',\n  'Z\\u0002\\u0002\\u01dc\\u01e0\\u0003\\u0002\\u0002\\u0002\\u01dd\\u01de\\u0007',\n  'Y\\u0002\\u0002\\u01de\\u01e0\\u0007Z\\u0002\\u0002\\u01df\\u01d2\\u0003\\u0002',\n  '\\u0002\\u0002\\u01df\\u01dd\\u0003\\u0002\\u0002\\u0002\\u01e0G\\u0003\\u0002',\n  \"\\u0002\\u0002\\u01e1\\u01e4\\u0005L'\\u0002\\u01e2\\u01e4\\u0005J&\\u0002\\u01e3\",\n  '\\u01e1\\u0003\\u0002\\u0002\\u0002\\u01e3\\u01e2\\u0003\\u0002\\u0002\\u0002\\u01e4',\n  'I\\u0003\\u0002\\u0002\\u0002\\u01e5\\u01e8\\u0007<\\u0002\\u0002\\u01e6\\u01e8',\n  '\\u0007;\\u0002\\u0002\\u01e7\\u01e5\\u0003\\u0002\\u0002\\u0002\\u01e7\\u01e6',\n  '\\u0003\\u0002\\u0002\\u0002\\u01e8K\\u0003\\u0002\\u0002\\u0002\\u01e9\\u01ee',\n  '\\t\\u000b\\u0002\\u0002\\u01ea\\u01ee\\t\\f\\u0002\\u0002\\u01eb\\u01ee\\t\\r\\u0002',\n  '\\u0002\\u01ec\\u01ee\\t\\u000e\\u0002\\u0002\\u01ed\\u01e9\\u0003\\u0002\\u0002',\n  '\\u0002\\u01ed\\u01ea\\u0003\\u0002\\u0002\\u0002\\u01ed\\u01eb\\u0003\\u0002\\u0002',\n  '\\u0002\\u01ed\\u01ec\\u0003\\u0002\\u0002\\u0002\\u01eeM\\u0003\\u0002\\u0002',\n  '\\u0002\\u01ef\\u01f5\\t\\u000b\\u0002\\u0002\\u01f0\\u01f5\\t\\f\\u0002\\u0002\\u01f1',\n  '\\u01f5\\t\\r\\u0002\\u0002\\u01f2\\u01f5\\t\\u000e\\u0002\\u0002\\u01f3\\u01f5\\u0007',\n  ':\\u0002\\u0002\\u01f4\\u01ef\\u0003\\u0002\\u0002\\u0002\\u01f4\\u01f0\\u0003',\n  '\\u0002\\u0002\\u0002\\u01f4\\u01f1\\u0003\\u0002\\u0002\\u0002\\u01f4\\u01f2\\u0003',\n  '\\u0002\\u0002\\u0002\\u01f4\\u01f3\\u0003\\u0002\\u0002\\u0002\\u01f5O\\u0003',\n  '\\u0002\\u0002\\u0002\\u01f6\\u01f7\\u0007]\\u0002\\u0002\\u01f7Q\\u0003\\u0002',\n  '\\u0002\\u0002\\u01f8\\u01fd\\u0007^\\u0002\\u0002\\u01f9\\u01fd\\u0007_\\u0002',\n  '\\u0002\\u01fa\\u01fd\\u0007`\\u0002\\u0002\\u01fb\\u01fd\\u0007a\\u0002\\u0002',\n  '\\u01fc\\u01f8\\u0003\\u0002\\u0002\\u0002\\u01fc\\u01f9\\u0003\\u0002\\u0002\\u0002',\n  '\\u01fc\\u01fa\\u0003\\u0002\\u0002\\u0002\\u01fc\\u01fb\\u0003\\u0002\\u0002\\u0002',\n  '\\u01fdS\\u0003\\u0002\\u0002\\u0002\\u01fe\\u0206\\u0007:\\u0002\\u0002\\u01ff',\n  '\\u0206\\u0005p9\\u0002\\u0200\\u0206\\u0005r:\\u0002\\u0201\\u0206\\t\\u000b\\u0002',\n  '\\u0002\\u0202\\u0206\\t\\f\\u0002\\u0002\\u0203\\u0206\\t\\r\\u0002\\u0002\\u0204',\n  '\\u0206\\t\\u000e\\u0002\\u0002\\u0205\\u01fe\\u0003\\u0002\\u0002\\u0002\\u0205',\n  '\\u01ff\\u0003\\u0002\\u0002\\u0002\\u0205\\u0200\\u0003\\u0002\\u0002\\u0002\\u0205',\n  '\\u0201\\u0003\\u0002\\u0002\\u0002\\u0205\\u0202\\u0003\\u0002\\u0002\\u0002\\u0205',\n  '\\u0203\\u0003\\u0002\\u0002\\u0002\\u0205\\u0204\\u0003\\u0002\\u0002\\u0002\\u0206',\n  'U\\u0003\\u0002\\u0002\\u0002\\u0207\\u020a\\u0005Z.\\u0002\\u0208\\u020a\\u0005',\n  'd3\\u0002\\u0209\\u0207\\u0003\\u0002\\u0002\\u0002\\u0209\\u0208\\u0003\\u0002',\n  '\\u0002\\u0002\\u020aW\\u0003\\u0002\\u0002\\u0002\\u020b\\u020e\\u0005Z.\\u0002',\n  '\\u020c\\u020e\\u0005d3\\u0002\\u020d\\u020b\\u0003\\u0002\\u0002\\u0002\\u020d',\n  '\\u020c\\u0003\\u0002\\u0002\\u0002\\u020eY\\u0003\\u0002\\u0002\\u0002\\u020f',\n  '\\u0212\\u0005\\\\/\\u0002\\u0210\\u0212\\u0005b2\\u0002\\u0211\\u020f\\u0003\\u0002',\n  '\\u0002\\u0002\\u0211\\u0210\\u0003\\u0002\\u0002\\u0002\\u0212[\\u0003\\u0002',\n  '\\u0002\\u0002\\u0213\\u0216\\u0005`1\\u0002\\u0214\\u0216\\u0005^0\\u0002\\u0215',\n  '\\u0213\\u0003\\u0002\\u0002\\u0002\\u0215\\u0214\\u0003\\u0002\\u0002\\u0002\\u0216',\n  ']\\u0003\\u0002\\u0002\\u0002\\u0217\\u0219\\t\\u000f\\u0002\\u0002\\u0218\\u021a',\n  '\\t\\u000f\\u0002\\u0002\\u0219\\u0218\\u0003\\u0002\\u0002\\u0002\\u021a\\u021b',\n  '\\u0003\\u0002\\u0002\\u0002\\u021b\\u0219\\u0003\\u0002\\u0002\\u0002\\u021b\\u021c',\n  '\\u0003\\u0002\\u0002\\u0002\\u021c\\u021d\\u0003\\u0002\\u0002\\u0002\\u021d\\u021e',\n  '\\u0005n8\\u0002\\u021e_\\u0003\\u0002\\u0002\\u0002\\u021f\\u0220\\u0005n8\\u0002',\n  '\\u0220a\\u0003\\u0002\\u0002\\u0002\\u0221\\u0222\\t\\u0010\\u0002\\u0002\\u0222',\n  'c\\u0003\\u0002\\u0002\\u0002\\u0223\\u0226\\u0005f4\\u0002\\u0224\\u0226\\u0005',\n  'h5\\u0002\\u0225\\u0223\\u0003\\u0002\\u0002\\u0002\\u0225\\u0224\\u0003\\u0002',\n  '\\u0002\\u0002\\u0226e\\u0003\\u0002\\u0002\\u0002\\u0227\\u0228\\t\\u000f\\u0002',\n  '\\u0002\\u0228\\u0229\\u0005n8\\u0002\\u0229g\\u0003\\u0002\\u0002\\u0002\\u022a',\n  '\\u022b\\t\\u000f\\u0002\\u0002\\u022b\\u022c\\t\\u0010\\u0002\\u0002\\u022ci\\u0003',\n  '\\u0002\\u0002\\u0002\\u022d\\u022e\\u0005n8\\u0002\\u022ek\\u0003\\u0002\\u0002',\n  '\\u0002\\u022f\\u0230\\u0005n8\\u0002\\u0230m\\u0003\\u0002\\u0002\\u0002\\u0231',\n  '\\u0235\\t\\u0011\\u0002\\u0002\\u0232\\u0235\\u0005p9\\u0002\\u0233\\u0235\\u0005',\n  'r:\\u0002\\u0234\\u0231\\u0003\\u0002\\u0002\\u0002\\u0234\\u0232\\u0003\\u0002',\n  '\\u0002\\u0002\\u0234\\u0233\\u0003\\u0002\\u0002\\u0002\\u0235o\\u0003\\u0002',\n  '\\u0002\\u0002\\u0236\\u0237\\t\\u0012\\u0002\\u0002\\u0237q\\u0003\\u0002\\u0002',\n  '\\u0002\\u0238\\u0242\\t\\u0013\\u0002\\u0002\\u0239\\u0242\\t\\u0014\\u0002\\u0002',\n  '\\u023a\\u0242\\t\\u0015\\u0002\\u0002\\u023b\\u0242\\t\\u0016\\u0002\\u0002\\u023c',\n  '\\u0242\\t\\u0017\\u0002\\u0002\\u023d\\u0242\\t\\u0018\\u0002\\u0002\\u023e\\u0242',\n  '\\t\\u0019\\u0002\\u0002\\u023f\\u0242\\t\\u001a\\u0002\\u0002\\u0240\\u0242\\t\\u001b',\n  '\\u0002\\u0002\\u0241\\u0238\\u0003\\u0002\\u0002\\u0002\\u0241\\u0239\\u0003\\u0002',\n  '\\u0002\\u0002\\u0241\\u023a\\u0003\\u0002\\u0002\\u0002\\u0241\\u023b\\u0003\\u0002',\n  '\\u0002\\u0002\\u0241\\u023c\\u0003\\u0002\\u0002\\u0002\\u0241\\u023d\\u0003\\u0002',\n  '\\u0002\\u0002\\u0241\\u023e\\u0003\\u0002\\u0002\\u0002\\u0241\\u023f\\u0003\\u0002',\n  '\\u0002\\u0002\\u0241\\u0240\\u0003\\u0002\\u0002\\u0002\\u0242s\\u0003\\u0002',\n  '\\u0002\\u0002Hz~\\u0085\\u008d\\u0092\\u0098\\u00a0\\u00a9\\u00b0\\u00b4\\u00c4',\n  '\\u00ca\\u00ce\\u00d1\\u00d4\\u00d8\\u00df\\u00e8\\u00ec\\u00f4\\u00f7\\u00fc\\u0100',\n  '\\u0108\\u0111\\u0114\\u0119\\u011d\\u0126\\u012b\\u012e\\u0134\\u0140\\u0144\\u014a',\n  '\\u014c\\u0154\\u015b\\u0162\\u016a\\u016c\\u0172\\u0182\\u0195\\u01a0\\u01a6\\u01aa',\n  '\\u01ac\\u01b3\\u01b7\\u01c0\\u01c8\\u01cc\\u01d0\\u01d8\\u01df\\u01e3\\u01e7\\u01ed',\n  '\\u01f4\\u01fc\\u0205\\u0209\\u020d\\u0211\\u0215\\u021b\\u0225\\u0234\\u0241',\n].join('');\n\nvar atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);\n\nvar decisionsToDFA = atn.decisionToState.map(function(ds, index) {\n  return new antlr4.dfa.DFA(ds, index);\n});\n\nvar sharedContextCache = new antlr4.PredictionContextCache();\n\nvar literalNames = [\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  \"'=~'\",\n  \"'~='\",\n  null,\n  null,\n  null,\n  null,\n  null,\n  \"'|>'\",\n  \"':'\",\n  \"'^'\",\n  \"'!'\",\n  \"'*'\",\n  \"'/'\",\n  \"'%'\",\n  \"'+'\",\n  \"'-'\",\n  \"'~'\",\n  \"'<'\",\n  \"'>'\",\n  \"'<='\",\n  \"'>='\",\n  \"'='\",\n  \"'!='\",\n  \"'['\",\n  \"']'\",\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  null,\n  \"'|'\",\n];\n\nvar symbolicNames = [\n  null,\n  'WS',\n  'COMMENT',\n  'K_SOURCE',\n  'K_START',\n  'K_END',\n  'K_NOW',\n  'K_LIVE',\n  'K_PARSE',\n  'K_SEARCH',\n  'K_FIELDS',\n  'K_DISPLAY',\n  'K_FILTER',\n  'K_STATS',\n  'K_SORT',\n  'K_ORDER',\n  'K_ASC',\n  'K_DESC',\n  'K_HEAD',\n  'K_LIMIT',\n  'K_TAIL',\n  'K_REGEX',\n  'K_IN',\n  'K_GROUP',\n  'K_BY',\n  'K_AS',\n  'K_AND',\n  'K_OR',\n  'K_NOT',\n  'K_LIKE',\n  'K_MATCHES',\n  'K_TU_MS',\n  'K_TU_MSEC',\n  'K_TU_MSECOND',\n  'K_TU_S',\n  'K_TU_SEC',\n  'K_TU_SECOND',\n  'K_TU_M',\n  'K_TU_MIN',\n  'K_TU_MINUTE',\n  'K_TU_H',\n  'K_TU_HR',\n  'K_TU_HOUR',\n  'K_TU_D',\n  'K_TU_DAY',\n  'K_TU_W',\n  'K_TU_WEEK',\n  'K_TU_MO',\n  'K_TU_MON',\n  'K_TU_MONTH',\n  'K_TU_Q',\n  'K_TU_QTR',\n  'K_TU_QUARTER',\n  'K_TU_Y',\n  'K_TU_YR',\n  'K_TU_YEAR',\n  'RAW_ID',\n  'LIT_INTEGER',\n  'LIT_NUMBER',\n  'SDQUOTED_STRING',\n  'SSQUOTED_STRING',\n  'CDQUOTED_STRING',\n  'CSQUOTED_STRING',\n  'QUOTED_IDENT',\n  'SYM_EQTILDE',\n  'SYM_TILDEEQ',\n  'SYM_AT',\n  'SYM_COMMA',\n  'SYM_LPAREN',\n  'SYM_RPAREN',\n  'SYM_PIPE',\n  'SYM_WRITE',\n  'SYM_COLON',\n  'SYM_CARET',\n  'SYM_NOT',\n  'SYM_MUL',\n  'SYM_DIV',\n  'SYM_MOD',\n  'SYM_PLUS',\n  'SYM_MINUS',\n  'SYM_TILDE',\n  'SYM_LT',\n  'SYM_GT',\n  'SYM_LTEQ',\n  'SYM_GTEQ',\n  'SYM_EQ',\n  'SYM_NEQ',\n  'SYM_LBRACKET',\n  'SYM_RBRACKET',\n  'REGEX_WS',\n  'REGEX_COMMENT',\n  'REGEX',\n  'RE_SDQUOTED_STRING',\n  'RE_SSQUOTED_STRING',\n  'RE_CDQUOTED_STRING',\n  'RE_CSQUOTED_STRING',\n  'RE_RAW_ID',\n  'RE_SYM_AT',\n  'RE_QUOTED_IDENT',\n  'SE_WS',\n  'SE_COMMENT',\n  'SE_K_SEARCH',\n  'SE_SYM_LPAREN',\n  'SE_SYM_RPAREN',\n  'SE_K_AND',\n  'SE_K_OR',\n  'SE_K_NOT',\n  'SE_SDQUOTED_STRING',\n  'SE_SSQUOTED_STRING',\n  'SE_CDQUOTED_STRING',\n  'SE_CSQUOTED_STRING',\n  'SE_UNQUOTED_STRING',\n  'SE_PIPE',\n];\n\nvar ruleNames = [\n  'query',\n  'logQuery',\n  'logAesthetic',\n  'logSourceStage',\n  'logStatsStage',\n  'logOp',\n  'logAestheticOp',\n  'logSource',\n  'timeExpr',\n  'nowTimeExpr',\n  'relativeTimeExpr',\n  'iso8601TimeExpr',\n  'epochTimeExpr',\n  'bareSpaceDelimited',\n  'logStats',\n  'statsExpr',\n  'statsGroupField',\n  'logOpFields',\n  'fieldSpec',\n  'logOpParse',\n  'logOpSearch',\n  'implicitLogOpSearch',\n  'searchExpr',\n  'searchTerm',\n  'logOpFilter',\n  'logOpSort',\n  'sortExpr',\n  'logOpLimit',\n  'expressionRoot',\n  'expression',\n  'term',\n  'likeTerm',\n  'func',\n  'functionArg',\n  'array',\n  'arrayElem',\n  'number',\n  'string',\n  'stringOrBareString',\n  'regex',\n  'regexString',\n  'logId',\n  'fieldId',\n  'aliasId',\n  'userId',\n  'unquotedUserId',\n  'unquotedUserAtId',\n  'unquotedUserBareId',\n  'quotedUserId',\n  'systemId',\n  'unquotedSystemId',\n  'quotedSystemId',\n  'resultId',\n  'functionId',\n  'rawId',\n  'keywords',\n  'timeUnitKeywords',\n];\n\nfunction ScrollQLParser(input) {\n  antlr4.Parser.call(this, input);\n  this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache);\n  this.ruleNames = ruleNames;\n  this.literalNames = literalNames;\n  this.symbolicNames = symbolicNames;\n  return this;\n}\n\nScrollQLParser.prototype = Object.create(antlr4.Parser.prototype);\nScrollQLParser.prototype.constructor = ScrollQLParser;\n\nObject.defineProperty(ScrollQLParser.prototype, 'atn', {\n  get: function() {\n    return atn;\n  },\n});\n\nScrollQLParser.EOF = antlr4.Token.EOF;\nScrollQLParser.WS = 1;\nScrollQLParser.COMMENT = 2;\nScrollQLParser.K_SOURCE = 3;\nScrollQLParser.K_START = 4;\nScrollQLParser.K_END = 5;\nScrollQLParser.K_NOW = 6;\nScrollQLParser.K_LIVE = 7;\nScrollQLParser.K_PARSE = 8;\nScrollQLParser.K_SEARCH = 9;\nScrollQLParser.K_FIELDS = 10;\nScrollQLParser.K_DISPLAY = 11;\nScrollQLParser.K_FILTER = 12;\nScrollQLParser.K_STATS = 13;\nScrollQLParser.K_SORT = 14;\nScrollQLParser.K_ORDER = 15;\nScrollQLParser.K_ASC = 16;\nScrollQLParser.K_DESC = 17;\nScrollQLParser.K_HEAD = 18;\nScrollQLParser.K_LIMIT = 19;\nScrollQLParser.K_TAIL = 20;\nScrollQLParser.K_REGEX = 21;\nScrollQLParser.K_IN = 22;\nScrollQLParser.K_GROUP = 23;\nScrollQLParser.K_BY = 24;\nScrollQLParser.K_AS = 25;\nScrollQLParser.K_AND = 26;\nScrollQLParser.K_OR = 27;\nScrollQLParser.K_NOT = 28;\nScrollQLParser.K_LIKE = 29;\nScrollQLParser.K_MATCHES = 30;\nScrollQLParser.K_TU_MS = 31;\nScrollQLParser.K_TU_MSEC = 32;\nScrollQLParser.K_TU_MSECOND = 33;\nScrollQLParser.K_TU_S = 34;\nScrollQLParser.K_TU_SEC = 35;\nScrollQLParser.K_TU_SECOND = 36;\nScrollQLParser.K_TU_M = 37;\nScrollQLParser.K_TU_MIN = 38;\nScrollQLParser.K_TU_MINUTE = 39;\nScrollQLParser.K_TU_H = 40;\nScrollQLParser.K_TU_HR = 41;\nScrollQLParser.K_TU_HOUR = 42;\nScrollQLParser.K_TU_D = 43;\nScrollQLParser.K_TU_DAY = 44;\nScrollQLParser.K_TU_W = 45;\nScrollQLParser.K_TU_WEEK = 46;\nScrollQLParser.K_TU_MO = 47;\nScrollQLParser.K_TU_MON = 48;\nScrollQLParser.K_TU_MONTH = 49;\nScrollQLParser.K_TU_Q = 50;\nScrollQLParser.K_TU_QTR = 51;\nScrollQLParser.K_TU_QUARTER = 52;\nScrollQLParser.K_TU_Y = 53;\nScrollQLParser.K_TU_YR = 54;\nScrollQLParser.K_TU_YEAR = 55;\nScrollQLParser.RAW_ID = 56;\nScrollQLParser.LIT_INTEGER = 57;\nScrollQLParser.LIT_NUMBER = 58;\nScrollQLParser.SDQUOTED_STRING = 59;\nScrollQLParser.SSQUOTED_STRING = 60;\nScrollQLParser.CDQUOTED_STRING = 61;\nScrollQLParser.CSQUOTED_STRING = 62;\nScrollQLParser.QUOTED_IDENT = 63;\nScrollQLParser.SYM_EQTILDE = 64;\nScrollQLParser.SYM_TILDEEQ = 65;\nScrollQLParser.SYM_AT = 66;\nScrollQLParser.SYM_COMMA = 67;\nScrollQLParser.SYM_LPAREN = 68;\nScrollQLParser.SYM_RPAREN = 69;\nScrollQLParser.SYM_PIPE = 70;\nScrollQLParser.SYM_WRITE = 71;\nScrollQLParser.SYM_COLON = 72;\nScrollQLParser.SYM_CARET = 73;\nScrollQLParser.SYM_NOT = 74;\nScrollQLParser.SYM_MUL = 75;\nScrollQLParser.SYM_DIV = 76;\nScrollQLParser.SYM_MOD = 77;\nScrollQLParser.SYM_PLUS = 78;\nScrollQLParser.SYM_MINUS = 79;\nScrollQLParser.SYM_TILDE = 80;\nScrollQLParser.SYM_LT = 81;\nScrollQLParser.SYM_GT = 82;\nScrollQLParser.SYM_LTEQ = 83;\nScrollQLParser.SYM_GTEQ = 84;\nScrollQLParser.SYM_EQ = 85;\nScrollQLParser.SYM_NEQ = 86;\nScrollQLParser.SYM_LBRACKET = 87;\nScrollQLParser.SYM_RBRACKET = 88;\nScrollQLParser.REGEX_WS = 89;\nScrollQLParser.REGEX_COMMENT = 90;\nScrollQLParser.REGEX = 91;\nScrollQLParser.RE_SDQUOTED_STRING = 92;\nScrollQLParser.RE_SSQUOTED_STRING = 93;\nScrollQLParser.RE_CDQUOTED_STRING = 94;\nScrollQLParser.RE_CSQUOTED_STRING = 95;\nScrollQLParser.RE_RAW_ID = 96;\nScrollQLParser.RE_SYM_AT = 97;\nScrollQLParser.RE_QUOTED_IDENT = 98;\nScrollQLParser.SE_WS = 99;\nScrollQLParser.SE_COMMENT = 100;\nScrollQLParser.SE_K_SEARCH = 101;\nScrollQLParser.SE_SYM_LPAREN = 102;\nScrollQLParser.SE_SYM_RPAREN = 103;\nScrollQLParser.SE_K_AND = 104;\nScrollQLParser.SE_K_OR = 105;\nScrollQLParser.SE_K_NOT = 106;\nScrollQLParser.SE_SDQUOTED_STRING = 107;\nScrollQLParser.SE_SSQUOTED_STRING = 108;\nScrollQLParser.SE_CDQUOTED_STRING = 109;\nScrollQLParser.SE_CSQUOTED_STRING = 110;\nScrollQLParser.SE_UNQUOTED_STRING = 111;\nScrollQLParser.SE_PIPE = 112;\n\nScrollQLParser.RULE_query = 0;\nScrollQLParser.RULE_logQuery = 1;\nScrollQLParser.RULE_logAesthetic = 2;\nScrollQLParser.RULE_logSourceStage = 3;\nScrollQLParser.RULE_logStatsStage = 4;\nScrollQLParser.RULE_logOp = 5;\nScrollQLParser.RULE_logAestheticOp = 6;\nScrollQLParser.RULE_logSource = 7;\nScrollQLParser.RULE_timeExpr = 8;\nScrollQLParser.RULE_nowTimeExpr = 9;\nScrollQLParser.RULE_relativeTimeExpr = 10;\nScrollQLParser.RULE_iso8601TimeExpr = 11;\nScrollQLParser.RULE_epochTimeExpr = 12;\nScrollQLParser.RULE_bareSpaceDelimited = 13;\nScrollQLParser.RULE_logStats = 14;\nScrollQLParser.RULE_statsExpr = 15;\nScrollQLParser.RULE_statsGroupField = 16;\nScrollQLParser.RULE_logOpFields = 17;\nScrollQLParser.RULE_fieldSpec = 18;\nScrollQLParser.RULE_logOpParse = 19;\nScrollQLParser.RULE_logOpSearch = 20;\nScrollQLParser.RULE_implicitLogOpSearch = 21;\nScrollQLParser.RULE_searchExpr = 22;\nScrollQLParser.RULE_searchTerm = 23;\nScrollQLParser.RULE_logOpFilter = 24;\nScrollQLParser.RULE_logOpSort = 25;\nScrollQLParser.RULE_sortExpr = 26;\nScrollQLParser.RULE_logOpLimit = 27;\nScrollQLParser.RULE_expressionRoot = 28;\nScrollQLParser.RULE_expression = 29;\nScrollQLParser.RULE_term = 30;\nScrollQLParser.RULE_likeTerm = 31;\nScrollQLParser.RULE_func = 32;\nScrollQLParser.RULE_functionArg = 33;\nScrollQLParser.RULE_array = 34;\nScrollQLParser.RULE_arrayElem = 35;\nScrollQLParser.RULE_number = 36;\nScrollQLParser.RULE_string = 37;\nScrollQLParser.RULE_stringOrBareString = 38;\nScrollQLParser.RULE_regex = 39;\nScrollQLParser.RULE_regexString = 40;\nScrollQLParser.RULE_logId = 41;\nScrollQLParser.RULE_fieldId = 42;\nScrollQLParser.RULE_aliasId = 43;\nScrollQLParser.RULE_userId = 44;\nScrollQLParser.RULE_unquotedUserId = 45;\nScrollQLParser.RULE_unquotedUserAtId = 46;\nScrollQLParser.RULE_unquotedUserBareId = 47;\nScrollQLParser.RULE_quotedUserId = 48;\nScrollQLParser.RULE_systemId = 49;\nScrollQLParser.RULE_unquotedSystemId = 50;\nScrollQLParser.RULE_quotedSystemId = 51;\nScrollQLParser.RULE_resultId = 52;\nScrollQLParser.RULE_functionId = 53;\nScrollQLParser.RULE_rawId = 54;\nScrollQLParser.RULE_keywords = 55;\nScrollQLParser.RULE_timeUnitKeywords = 56;\n\nfunction QueryContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_query;\n  return this;\n}\n\nQueryContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQueryContext.prototype.constructor = QueryContext;\n\nQueryContext.prototype.logQuery = function() {\n  return this.getTypedRuleContext(LogQueryContext, 0);\n};\n\nQueryContext.prototype.EOF = function() {\n  return this.getToken(ScrollQLParser.EOF, 0);\n};\n\nQueryContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterQuery(this);\n  }\n};\n\nQueryContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitQuery(this);\n  }\n};\n\nScrollQLParser.QueryContext = QueryContext;\n\nScrollQLParser.prototype.query = function() {\n  var localctx = new QueryContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 0, ScrollQLParser.RULE_query);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 114;\n    this.logQuery();\n    this.state = 115;\n    this.match(ScrollQLParser.EOF);\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogQueryContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logQuery;\n  this.result = null; // ResultIdContext\n  return this;\n}\n\nLogQueryContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogQueryContext.prototype.constructor = LogQueryContext;\n\nLogQueryContext.prototype.logSourceStage = function() {\n  return this.getTypedRuleContext(LogSourceStageContext, 0);\n};\n\nLogQueryContext.prototype.SYM_PIPE = function() {\n  return this.getToken(ScrollQLParser.SYM_PIPE, 0);\n};\n\nLogQueryContext.prototype.logStatsStage = function() {\n  return this.getTypedRuleContext(LogStatsStageContext, 0);\n};\n\nLogQueryContext.prototype.SYM_WRITE = function() {\n  return this.getToken(ScrollQLParser.SYM_WRITE, 0);\n};\n\nLogQueryContext.prototype.resultId = function() {\n  return this.getTypedRuleContext(ResultIdContext, 0);\n};\n\nLogQueryContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogQuery(this);\n  }\n};\n\nLogQueryContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogQuery(this);\n  }\n};\n\nScrollQLParser.LogQueryContext = LogQueryContext;\n\nScrollQLParser.prototype.logQuery = function() {\n  var localctx = new LogQueryContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 2, ScrollQLParser.RULE_logQuery);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 117;\n    this.logSourceStage();\n    this.state = 120;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    if (_la === ScrollQLParser.SYM_PIPE) {\n      this.state = 118;\n      this.match(ScrollQLParser.SYM_PIPE);\n      this.state = 119;\n      this.logStatsStage();\n    }\n\n    this.state = 124;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    if (_la === ScrollQLParser.SYM_WRITE) {\n      this.state = 122;\n      this.match(ScrollQLParser.SYM_WRITE);\n      this.state = 123;\n      localctx.result = this.resultId();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogAestheticContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logAesthetic;\n  this.result = null; // ResultIdContext\n  this._logAestheticOp = null; // LogAestheticOpContext\n  this.aes = []; // of LogAestheticOpContexts\n  return this;\n}\n\nLogAestheticContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogAestheticContext.prototype.constructor = LogAestheticContext;\n\nLogAestheticContext.prototype.resultId = function() {\n  return this.getTypedRuleContext(ResultIdContext, 0);\n};\n\nLogAestheticContext.prototype.SYM_PIPE = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_PIPE);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_PIPE, i);\n  }\n};\n\nLogAestheticContext.prototype.logAestheticOp = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(LogAestheticOpContext);\n  } else {\n    return this.getTypedRuleContext(LogAestheticOpContext, i);\n  }\n};\n\nLogAestheticContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogAesthetic(this);\n  }\n};\n\nLogAestheticContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogAesthetic(this);\n  }\n};\n\nScrollQLParser.LogAestheticContext = LogAestheticContext;\n\nScrollQLParser.prototype.logAesthetic = function() {\n  var localctx = new LogAestheticContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 4, ScrollQLParser.RULE_logAesthetic);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 126;\n    localctx.result = this.resultId();\n    this.state = 131;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    while (_la === ScrollQLParser.SYM_PIPE) {\n      this.state = 127;\n      this.match(ScrollQLParser.SYM_PIPE);\n      this.state = 128;\n      localctx._logAestheticOp = this.logAestheticOp();\n      localctx.aes.push(localctx._logAestheticOp);\n      this.state = 133;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogSourceStageContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logSourceStage;\n  this._logSource = null; // LogSourceContext\n  this.source = []; // of LogSourceContexts\n  return this;\n}\n\nLogSourceStageContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogSourceStageContext.prototype.constructor = LogSourceStageContext;\n\nLogSourceStageContext.prototype.logSource = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(LogSourceContext);\n  } else {\n    return this.getTypedRuleContext(LogSourceContext, i);\n  }\n};\n\nLogSourceStageContext.prototype.SYM_PIPE = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_PIPE);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_PIPE, i);\n  }\n};\n\nLogSourceStageContext.prototype.implicitLogOpSearch = function() {\n  return this.getTypedRuleContext(ImplicitLogOpSearchContext, 0);\n};\n\nLogSourceStageContext.prototype.logOp = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(LogOpContext);\n  } else {\n    return this.getTypedRuleContext(LogOpContext, i);\n  }\n};\n\nLogSourceStageContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogSourceStage(this);\n  }\n};\n\nLogSourceStageContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogSourceStage(this);\n  }\n};\n\nScrollQLParser.LogSourceStageContext = LogSourceStageContext;\n\nScrollQLParser.prototype.logSourceStage = function() {\n  var localctx = new LogSourceStageContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 6, ScrollQLParser.RULE_logSourceStage);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 134;\n    localctx._logSource = this.logSource();\n    localctx.source.push(localctx._logSource);\n    this.state = 139;\n    this._errHandler.sync(this);\n    var _alt = this._interp.adaptivePredict(this._input, 3, this._ctx);\n    while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n      if (_alt === 1) {\n        this.state = 135;\n        this.match(ScrollQLParser.SYM_PIPE);\n        this.state = 136;\n        localctx._logSource = this.logSource();\n        localctx.source.push(localctx._logSource);\n      }\n      this.state = 141;\n      this._errHandler.sync(this);\n      _alt = this._interp.adaptivePredict(this._input, 3, this._ctx);\n    }\n\n    this.state = 144;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 4, this._ctx);\n    if (la_ === 1) {\n      this.state = 142;\n      this.match(ScrollQLParser.SYM_PIPE);\n      this.state = 143;\n      this.implicitLogOpSearch();\n    }\n    this.state = 150;\n    this._errHandler.sync(this);\n    var _alt = this._interp.adaptivePredict(this._input, 5, this._ctx);\n    while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n      if (_alt === 1) {\n        this.state = 146;\n        this.match(ScrollQLParser.SYM_PIPE);\n        this.state = 147;\n        this.logOp();\n      }\n      this.state = 152;\n      this._errHandler.sync(this);\n      _alt = this._interp.adaptivePredict(this._input, 5, this._ctx);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogStatsStageContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logStatsStage;\n  this.stats = null; // LogStatsContext\n  return this;\n}\n\nLogStatsStageContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogStatsStageContext.prototype.constructor = LogStatsStageContext;\n\nLogStatsStageContext.prototype.logStats = function() {\n  return this.getTypedRuleContext(LogStatsContext, 0);\n};\n\nLogStatsStageContext.prototype.SYM_PIPE = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_PIPE);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_PIPE, i);\n  }\n};\n\nLogStatsStageContext.prototype.logOp = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(LogOpContext);\n  } else {\n    return this.getTypedRuleContext(LogOpContext, i);\n  }\n};\n\nLogStatsStageContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogStatsStage(this);\n  }\n};\n\nLogStatsStageContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogStatsStage(this);\n  }\n};\n\nScrollQLParser.LogStatsStageContext = LogStatsStageContext;\n\nScrollQLParser.prototype.logStatsStage = function() {\n  var localctx = new LogStatsStageContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 8, ScrollQLParser.RULE_logStatsStage);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 153;\n    localctx.stats = this.logStats();\n    this.state = 158;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    while (_la === ScrollQLParser.SYM_PIPE) {\n      this.state = 154;\n      this.match(ScrollQLParser.SYM_PIPE);\n      this.state = 155;\n      this.logOp();\n      this.state = 160;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOp;\n  return this;\n}\n\nLogOpContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpContext.prototype.constructor = LogOpContext;\n\nLogOpContext.prototype.logOpFields = function() {\n  return this.getTypedRuleContext(LogOpFieldsContext, 0);\n};\n\nLogOpContext.prototype.logOpParse = function() {\n  return this.getTypedRuleContext(LogOpParseContext, 0);\n};\n\nLogOpContext.prototype.logOpFilter = function() {\n  return this.getTypedRuleContext(LogOpFilterContext, 0);\n};\n\nLogOpContext.prototype.logOpSearch = function() {\n  return this.getTypedRuleContext(LogOpSearchContext, 0);\n};\n\nLogOpContext.prototype.logOpSort = function() {\n  return this.getTypedRuleContext(LogOpSortContext, 0);\n};\n\nLogOpContext.prototype.logOpLimit = function() {\n  return this.getTypedRuleContext(LogOpLimitContext, 0);\n};\n\nLogOpContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOp(this);\n  }\n};\n\nLogOpContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOp(this);\n  }\n};\n\nScrollQLParser.LogOpContext = LogOpContext;\n\nScrollQLParser.prototype.logOp = function() {\n  var localctx = new LogOpContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 10, ScrollQLParser.RULE_logOp);\n  try {\n    this.state = 167;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.K_FIELDS:\n      case ScrollQLParser.K_DISPLAY:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 161;\n        this.logOpFields();\n        break;\n      case ScrollQLParser.K_PARSE:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 162;\n        this.logOpParse();\n        break;\n      case ScrollQLParser.K_FILTER:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 163;\n        this.logOpFilter();\n        break;\n      case ScrollQLParser.K_SEARCH:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 164;\n        this.logOpSearch();\n        break;\n      case ScrollQLParser.K_SORT:\n      case ScrollQLParser.K_ORDER:\n        this.enterOuterAlt(localctx, 5);\n        this.state = 165;\n        this.logOpSort();\n        break;\n      case ScrollQLParser.K_HEAD:\n      case ScrollQLParser.K_LIMIT:\n      case ScrollQLParser.K_TAIL:\n        this.enterOuterAlt(localctx, 6);\n        this.state = 166;\n        this.logOpLimit();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogAestheticOpContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logAestheticOp;\n  this.aesFun = null; // FunctionIdContext\n  this._rawId = null; // RawIdContext\n  this.params = []; // of RawIdContexts\n  this._fieldId = null; // FieldIdContext\n  this.vals = []; // of FieldIdContexts\n  return this;\n}\n\nLogAestheticOpContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogAestheticOpContext.prototype.constructor = LogAestheticOpContext;\n\nLogAestheticOpContext.prototype.functionId = function() {\n  return this.getTypedRuleContext(FunctionIdContext, 0);\n};\n\nLogAestheticOpContext.prototype.SYM_EQ = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_EQ);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_EQ, i);\n  }\n};\n\nLogAestheticOpContext.prototype.rawId = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(RawIdContext);\n  } else {\n    return this.getTypedRuleContext(RawIdContext, i);\n  }\n};\n\nLogAestheticOpContext.prototype.fieldId = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(FieldIdContext);\n  } else {\n    return this.getTypedRuleContext(FieldIdContext, i);\n  }\n};\n\nLogAestheticOpContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nLogAestheticOpContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogAestheticOp(this);\n  }\n};\n\nLogAestheticOpContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogAestheticOp(this);\n  }\n};\n\nScrollQLParser.LogAestheticOpContext = LogAestheticOpContext;\n\nScrollQLParser.prototype.logAestheticOp = function() {\n  var localctx = new LogAestheticOpContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 12, ScrollQLParser.RULE_logAestheticOp);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 169;\n    localctx.aesFun = this.functionId();\n    this.state = 178;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    while (\n      ((_la & ~0x1f) == 0 &&\n        ((1 << _la) &\n          ((1 << ScrollQLParser.K_SOURCE) |\n            (1 << ScrollQLParser.K_START) |\n            (1 << ScrollQLParser.K_END) |\n            (1 << ScrollQLParser.K_NOW) |\n            (1 << ScrollQLParser.K_LIVE) |\n            (1 << ScrollQLParser.K_PARSE) |\n            (1 << ScrollQLParser.K_SEARCH) |\n            (1 << ScrollQLParser.K_FIELDS) |\n            (1 << ScrollQLParser.K_DISPLAY) |\n            (1 << ScrollQLParser.K_FILTER) |\n            (1 << ScrollQLParser.K_STATS) |\n            (1 << ScrollQLParser.K_SORT) |\n            (1 << ScrollQLParser.K_ORDER) |\n            (1 << ScrollQLParser.K_ASC) |\n            (1 << ScrollQLParser.K_DESC) |\n            (1 << ScrollQLParser.K_HEAD) |\n            (1 << ScrollQLParser.K_LIMIT) |\n            (1 << ScrollQLParser.K_TAIL) |\n            (1 << ScrollQLParser.K_REGEX) |\n            (1 << ScrollQLParser.K_IN) |\n            (1 << ScrollQLParser.K_GROUP) |\n            (1 << ScrollQLParser.K_BY) |\n            (1 << ScrollQLParser.K_AS) |\n            (1 << ScrollQLParser.K_AND) |\n            (1 << ScrollQLParser.K_OR) |\n            (1 << ScrollQLParser.K_NOT) |\n            (1 << ScrollQLParser.K_LIKE) |\n            (1 << ScrollQLParser.K_MATCHES) |\n            (1 << ScrollQLParser.K_TU_MS))) !==\n          0) ||\n      (((_la - 32) & ~0x1f) == 0 &&\n        ((1 << (_la - 32)) &\n          ((1 << (ScrollQLParser.K_TU_MSEC - 32)) |\n            (1 << (ScrollQLParser.K_TU_MSECOND - 32)) |\n            (1 << (ScrollQLParser.K_TU_S - 32)) |\n            (1 << (ScrollQLParser.K_TU_SEC - 32)) |\n            (1 << (ScrollQLParser.K_TU_SECOND - 32)) |\n            (1 << (ScrollQLParser.K_TU_M - 32)) |\n            (1 << (ScrollQLParser.K_TU_MIN - 32)) |\n            (1 << (ScrollQLParser.K_TU_MINUTE - 32)) |\n            (1 << (ScrollQLParser.K_TU_H - 32)) |\n            (1 << (ScrollQLParser.K_TU_HR - 32)) |\n            (1 << (ScrollQLParser.K_TU_HOUR - 32)) |\n            (1 << (ScrollQLParser.K_TU_D - 32)) |\n            (1 << (ScrollQLParser.K_TU_DAY - 32)) |\n            (1 << (ScrollQLParser.K_TU_W - 32)) |\n            (1 << (ScrollQLParser.K_TU_WEEK - 32)) |\n            (1 << (ScrollQLParser.K_TU_MO - 32)) |\n            (1 << (ScrollQLParser.K_TU_MON - 32)) |\n            (1 << (ScrollQLParser.K_TU_MONTH - 32)) |\n            (1 << (ScrollQLParser.K_TU_Q - 32)) |\n            (1 << (ScrollQLParser.K_TU_QTR - 32)) |\n            (1 << (ScrollQLParser.K_TU_QUARTER - 32)) |\n            (1 << (ScrollQLParser.K_TU_Y - 32)) |\n            (1 << (ScrollQLParser.K_TU_YR - 32)) |\n            (1 << (ScrollQLParser.K_TU_YEAR - 32)) |\n            (1 << (ScrollQLParser.RAW_ID - 32)))) !==\n          0) ||\n      _la === ScrollQLParser.RE_RAW_ID\n    ) {\n      this.state = 170;\n      localctx._rawId = this.rawId();\n      localctx.params.push(localctx._rawId);\n      this.state = 171;\n      this.match(ScrollQLParser.SYM_EQ);\n      this.state = 172;\n      localctx._fieldId = this.fieldId();\n      localctx.vals.push(localctx._fieldId);\n      this.state = 174;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n      if (_la === ScrollQLParser.SYM_COMMA) {\n        this.state = 173;\n        this.match(ScrollQLParser.SYM_COMMA);\n      }\n\n      this.state = 180;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogSourceContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logSource;\n  this.source = null; // LogIdContext\n  this.start = null; // TimeExprContext\n  this.end = null; // TimeExprContext\n  return this;\n}\n\nLogSourceContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogSourceContext.prototype.constructor = LogSourceContext;\n\nLogSourceContext.prototype.K_SOURCE = function() {\n  return this.getToken(ScrollQLParser.K_SOURCE, 0);\n};\n\nLogSourceContext.prototype.K_START = function() {\n  return this.getToken(ScrollQLParser.K_START, 0);\n};\n\nLogSourceContext.prototype.SYM_EQ = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_EQ);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_EQ, i);\n  }\n};\n\nLogSourceContext.prototype.K_END = function() {\n  return this.getToken(ScrollQLParser.K_END, 0);\n};\n\nLogSourceContext.prototype.logId = function() {\n  return this.getTypedRuleContext(LogIdContext, 0);\n};\n\nLogSourceContext.prototype.timeExpr = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(TimeExprContext);\n  } else {\n    return this.getTypedRuleContext(TimeExprContext, i);\n  }\n};\n\nLogSourceContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogSource(this);\n  }\n};\n\nLogSourceContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogSource(this);\n  }\n};\n\nScrollQLParser.LogSourceContext = LogSourceContext;\n\nScrollQLParser.prototype.logSource = function() {\n  var localctx = new LogSourceContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 14, ScrollQLParser.RULE_logSource);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 181;\n    this.match(ScrollQLParser.K_SOURCE);\n    this.state = 182;\n    localctx.source = this.logId();\n    this.state = 183;\n    this.match(ScrollQLParser.K_START);\n    this.state = 184;\n    this.match(ScrollQLParser.SYM_EQ);\n    this.state = 185;\n    localctx.start = this.timeExpr();\n    this.state = 186;\n    this.match(ScrollQLParser.K_END);\n    this.state = 187;\n    this.match(ScrollQLParser.SYM_EQ);\n    this.state = 188;\n    localctx.end = this.timeExpr();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction TimeExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_timeExpr;\n  return this;\n}\n\nTimeExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nTimeExprContext.prototype.constructor = TimeExprContext;\n\nTimeExprContext.prototype.nowTimeExpr = function() {\n  return this.getTypedRuleContext(NowTimeExprContext, 0);\n};\n\nTimeExprContext.prototype.relativeTimeExpr = function() {\n  return this.getTypedRuleContext(RelativeTimeExprContext, 0);\n};\n\nTimeExprContext.prototype.epochTimeExpr = function() {\n  return this.getTypedRuleContext(EpochTimeExprContext, 0);\n};\n\nTimeExprContext.prototype.iso8601TimeExpr = function() {\n  return this.getTypedRuleContext(Iso8601TimeExprContext, 0);\n};\n\nTimeExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeExpr(this);\n  }\n};\n\nTimeExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeExpr(this);\n  }\n};\n\nScrollQLParser.TimeExprContext = TimeExprContext;\n\nScrollQLParser.prototype.timeExpr = function() {\n  var localctx = new TimeExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 16, ScrollQLParser.RULE_timeExpr);\n  try {\n    this.state = 194;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 10, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 190;\n        this.nowTimeExpr();\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 191;\n        this.relativeTimeExpr();\n        break;\n\n      case 3:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 192;\n        this.epochTimeExpr();\n        break;\n\n      case 4:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 193;\n        this.iso8601TimeExpr();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction NowTimeExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_nowTimeExpr;\n  return this;\n}\n\nNowTimeExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNowTimeExprContext.prototype.constructor = NowTimeExprContext;\n\nNowTimeExprContext.prototype.K_NOW = function() {\n  return this.getToken(ScrollQLParser.K_NOW, 0);\n};\n\nNowTimeExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterNowTimeExpr(this);\n  }\n};\n\nNowTimeExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitNowTimeExpr(this);\n  }\n};\n\nScrollQLParser.NowTimeExprContext = NowTimeExprContext;\n\nScrollQLParser.prototype.nowTimeExpr = function() {\n  var localctx = new NowTimeExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 18, ScrollQLParser.RULE_nowTimeExpr);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 196;\n    this.match(ScrollQLParser.K_NOW);\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction RelativeTimeExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_relativeTimeExpr;\n  return this;\n}\n\nRelativeTimeExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nRelativeTimeExprContext.prototype.constructor = RelativeTimeExprContext;\n\nRelativeTimeExprContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction PosRelativeTimeExprContext(parser, ctx) {\n  RelativeTimeExprContext.call(this, parser);\n  this.num = null; // Token;\n  RelativeTimeExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nPosRelativeTimeExprContext.prototype = Object.create(RelativeTimeExprContext.prototype);\nPosRelativeTimeExprContext.prototype.constructor = PosRelativeTimeExprContext;\n\nScrollQLParser.PosRelativeTimeExprContext = PosRelativeTimeExprContext;\n\nPosRelativeTimeExprContext.prototype.timeUnitKeywords = function() {\n  return this.getTypedRuleContext(TimeUnitKeywordsContext, 0);\n};\n\nPosRelativeTimeExprContext.prototype.SYM_PLUS = function() {\n  return this.getToken(ScrollQLParser.SYM_PLUS, 0);\n};\n\nPosRelativeTimeExprContext.prototype.LIT_INTEGER = function() {\n  return this.getToken(ScrollQLParser.LIT_INTEGER, 0);\n};\n\nPosRelativeTimeExprContext.prototype.LIT_NUMBER = function() {\n  return this.getToken(ScrollQLParser.LIT_NUMBER, 0);\n};\nPosRelativeTimeExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterPosRelativeTimeExpr(this);\n  }\n};\n\nPosRelativeTimeExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitPosRelativeTimeExpr(this);\n  }\n};\n\nfunction NegRelativeTimeExprContext(parser, ctx) {\n  RelativeTimeExprContext.call(this, parser);\n  this.num = null; // Token;\n  RelativeTimeExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nNegRelativeTimeExprContext.prototype = Object.create(RelativeTimeExprContext.prototype);\nNegRelativeTimeExprContext.prototype.constructor = NegRelativeTimeExprContext;\n\nScrollQLParser.NegRelativeTimeExprContext = NegRelativeTimeExprContext;\n\nNegRelativeTimeExprContext.prototype.SYM_MINUS = function() {\n  return this.getToken(ScrollQLParser.SYM_MINUS, 0);\n};\n\nNegRelativeTimeExprContext.prototype.timeUnitKeywords = function() {\n  return this.getTypedRuleContext(TimeUnitKeywordsContext, 0);\n};\n\nNegRelativeTimeExprContext.prototype.LIT_INTEGER = function() {\n  return this.getToken(ScrollQLParser.LIT_INTEGER, 0);\n};\n\nNegRelativeTimeExprContext.prototype.LIT_NUMBER = function() {\n  return this.getToken(ScrollQLParser.LIT_NUMBER, 0);\n};\nNegRelativeTimeExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterNegRelativeTimeExpr(this);\n  }\n};\n\nNegRelativeTimeExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitNegRelativeTimeExpr(this);\n  }\n};\n\nScrollQLParser.RelativeTimeExprContext = RelativeTimeExprContext;\n\nScrollQLParser.prototype.relativeTimeExpr = function() {\n  var localctx = new RelativeTimeExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 20, ScrollQLParser.RULE_relativeTimeExpr);\n  var _la = 0; // Token type\n  try {\n    this.state = 210;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.SYM_MINUS:\n        localctx = new NegRelativeTimeExprContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 198;\n        this.match(ScrollQLParser.SYM_MINUS);\n        this.state = 200;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (_la === ScrollQLParser.LIT_INTEGER || _la === ScrollQLParser.LIT_NUMBER) {\n          this.state = 199;\n          localctx.num = this._input.LT(1);\n          _la = this._input.LA(1);\n          if (!(_la === ScrollQLParser.LIT_INTEGER || _la === ScrollQLParser.LIT_NUMBER)) {\n            localctx.num = this._errHandler.recoverInline(this);\n          } else {\n            this._errHandler.reportMatch(this);\n            this.consume();\n          }\n        }\n\n        this.state = 202;\n        this.timeUnitKeywords();\n        break;\n      case ScrollQLParser.K_TU_MS:\n      case ScrollQLParser.K_TU_MSEC:\n      case ScrollQLParser.K_TU_MSECOND:\n      case ScrollQLParser.K_TU_S:\n      case ScrollQLParser.K_TU_SEC:\n      case ScrollQLParser.K_TU_SECOND:\n      case ScrollQLParser.K_TU_M:\n      case ScrollQLParser.K_TU_MIN:\n      case ScrollQLParser.K_TU_MINUTE:\n      case ScrollQLParser.K_TU_H:\n      case ScrollQLParser.K_TU_HR:\n      case ScrollQLParser.K_TU_HOUR:\n      case ScrollQLParser.K_TU_D:\n      case ScrollQLParser.K_TU_DAY:\n      case ScrollQLParser.K_TU_W:\n      case ScrollQLParser.K_TU_WEEK:\n      case ScrollQLParser.K_TU_MO:\n      case ScrollQLParser.K_TU_MON:\n      case ScrollQLParser.K_TU_MONTH:\n      case ScrollQLParser.K_TU_Q:\n      case ScrollQLParser.K_TU_QTR:\n      case ScrollQLParser.K_TU_QUARTER:\n      case ScrollQLParser.K_TU_Y:\n      case ScrollQLParser.K_TU_YR:\n      case ScrollQLParser.K_TU_YEAR:\n      case ScrollQLParser.LIT_INTEGER:\n      case ScrollQLParser.LIT_NUMBER:\n      case ScrollQLParser.SYM_PLUS:\n        localctx = new PosRelativeTimeExprContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 204;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (_la === ScrollQLParser.SYM_PLUS) {\n          this.state = 203;\n          this.match(ScrollQLParser.SYM_PLUS);\n        }\n\n        this.state = 207;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (_la === ScrollQLParser.LIT_INTEGER || _la === ScrollQLParser.LIT_NUMBER) {\n          this.state = 206;\n          localctx.num = this._input.LT(1);\n          _la = this._input.LA(1);\n          if (!(_la === ScrollQLParser.LIT_INTEGER || _la === ScrollQLParser.LIT_NUMBER)) {\n            localctx.num = this._errHandler.recoverInline(this);\n          } else {\n            this._errHandler.reportMatch(this);\n            this.consume();\n          }\n        }\n\n        this.state = 209;\n        this.timeUnitKeywords();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction Iso8601TimeExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_iso8601TimeExpr;\n  this.datetime = null; // StringOrBareStringContext\n  this.uqdatetime = null; // BareSpaceDelimitedContext\n  return this;\n}\n\nIso8601TimeExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nIso8601TimeExprContext.prototype.constructor = Iso8601TimeExprContext;\n\nIso8601TimeExprContext.prototype.stringOrBareString = function() {\n  return this.getTypedRuleContext(StringOrBareStringContext, 0);\n};\n\nIso8601TimeExprContext.prototype.bareSpaceDelimited = function() {\n  return this.getTypedRuleContext(BareSpaceDelimitedContext, 0);\n};\n\nIso8601TimeExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterIso8601TimeExpr(this);\n  }\n};\n\nIso8601TimeExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitIso8601TimeExpr(this);\n  }\n};\n\nScrollQLParser.Iso8601TimeExprContext = Iso8601TimeExprContext;\n\nScrollQLParser.prototype.iso8601TimeExpr = function() {\n  var localctx = new Iso8601TimeExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 22, ScrollQLParser.RULE_iso8601TimeExpr);\n  try {\n    this.state = 214;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 15, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 212;\n        localctx.datetime = this.stringOrBareString();\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 213;\n        localctx.uqdatetime = this.bareSpaceDelimited();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction EpochTimeExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_epochTimeExpr;\n  this.num = null; // Token\n  return this;\n}\n\nEpochTimeExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nEpochTimeExprContext.prototype.constructor = EpochTimeExprContext;\n\nEpochTimeExprContext.prototype.LIT_INTEGER = function() {\n  return this.getToken(ScrollQLParser.LIT_INTEGER, 0);\n};\n\nEpochTimeExprContext.prototype.LIT_NUMBER = function() {\n  return this.getToken(ScrollQLParser.LIT_NUMBER, 0);\n};\n\nEpochTimeExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterEpochTimeExpr(this);\n  }\n};\n\nEpochTimeExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitEpochTimeExpr(this);\n  }\n};\n\nScrollQLParser.EpochTimeExprContext = EpochTimeExprContext;\n\nScrollQLParser.prototype.epochTimeExpr = function() {\n  var localctx = new EpochTimeExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 24, ScrollQLParser.RULE_epochTimeExpr);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 216;\n    localctx.num = this._input.LT(1);\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.LIT_INTEGER || _la === ScrollQLParser.LIT_NUMBER)) {\n      localctx.num = this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction BareSpaceDelimitedContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_bareSpaceDelimited;\n  return this;\n}\n\nBareSpaceDelimitedContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nBareSpaceDelimitedContext.prototype.constructor = BareSpaceDelimitedContext;\n\nBareSpaceDelimitedContext.prototype.SYM_MINUS = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_MINUS);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_MINUS, i);\n  }\n};\n\nBareSpaceDelimitedContext.prototype.LIT_INTEGER = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.LIT_INTEGER);\n  } else {\n    return this.getToken(ScrollQLParser.LIT_INTEGER, i);\n  }\n};\n\nBareSpaceDelimitedContext.prototype.LIT_NUMBER = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.LIT_NUMBER);\n  } else {\n    return this.getToken(ScrollQLParser.LIT_NUMBER, i);\n  }\n};\n\nBareSpaceDelimitedContext.prototype.SYM_COLON = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COLON);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COLON, i);\n  }\n};\n\nBareSpaceDelimitedContext.prototype.RAW_ID = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.RAW_ID);\n  } else {\n    return this.getToken(ScrollQLParser.RAW_ID, i);\n  }\n};\n\nBareSpaceDelimitedContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterBareSpaceDelimited(this);\n  }\n};\n\nBareSpaceDelimitedContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitBareSpaceDelimited(this);\n  }\n};\n\nScrollQLParser.BareSpaceDelimitedContext = BareSpaceDelimitedContext;\n\nScrollQLParser.prototype.bareSpaceDelimited = function() {\n  var localctx = new BareSpaceDelimitedContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 26, ScrollQLParser.RULE_bareSpaceDelimited);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 221;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    while (\n      ((_la - 56) & ~0x1f) == 0 &&\n      ((1 << (_la - 56)) &\n        ((1 << (ScrollQLParser.RAW_ID - 56)) |\n          (1 << (ScrollQLParser.LIT_INTEGER - 56)) |\n          (1 << (ScrollQLParser.LIT_NUMBER - 56)) |\n          (1 << (ScrollQLParser.SYM_COLON - 56)) |\n          (1 << (ScrollQLParser.SYM_MINUS - 56)))) !==\n        0\n    ) {\n      this.state = 218;\n      _la = this._input.LA(1);\n      if (\n        !(\n          ((_la - 56) & ~0x1f) == 0 &&\n          ((1 << (_la - 56)) &\n            ((1 << (ScrollQLParser.RAW_ID - 56)) |\n              (1 << (ScrollQLParser.LIT_INTEGER - 56)) |\n              (1 << (ScrollQLParser.LIT_NUMBER - 56)) |\n              (1 << (ScrollQLParser.SYM_COLON - 56)) |\n              (1 << (ScrollQLParser.SYM_MINUS - 56)))) !==\n            0\n        )\n      ) {\n        this._errHandler.recoverInline(this);\n      } else {\n        this._errHandler.reportMatch(this);\n        this.consume();\n      }\n      this.state = 223;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogStatsContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logStats;\n  this._statsExpr = null; // StatsExprContext\n  this.expr = []; // of StatsExprContexts\n  this._statsGroupField = null; // StatsGroupFieldContext\n  this.groups = []; // of StatsGroupFieldContexts\n  return this;\n}\n\nLogStatsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogStatsContext.prototype.constructor = LogStatsContext;\n\nLogStatsContext.prototype.K_STATS = function() {\n  return this.getToken(ScrollQLParser.K_STATS, 0);\n};\n\nLogStatsContext.prototype.statsExpr = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(StatsExprContext);\n  } else {\n    return this.getTypedRuleContext(StatsExprContext, i);\n  }\n};\n\nLogStatsContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nLogStatsContext.prototype.K_BY = function() {\n  return this.getToken(ScrollQLParser.K_BY, 0);\n};\n\nLogStatsContext.prototype.statsGroupField = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(StatsGroupFieldContext);\n  } else {\n    return this.getTypedRuleContext(StatsGroupFieldContext, i);\n  }\n};\n\nLogStatsContext.prototype.K_GROUP = function() {\n  return this.getToken(ScrollQLParser.K_GROUP, 0);\n};\n\nLogStatsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogStats(this);\n  }\n};\n\nLogStatsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogStats(this);\n  }\n};\n\nScrollQLParser.LogStatsContext = LogStatsContext;\n\nScrollQLParser.prototype.logStats = function() {\n  var localctx = new LogStatsContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 28, ScrollQLParser.RULE_logStats);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 224;\n    this.match(ScrollQLParser.K_STATS);\n    this.state = 225;\n    localctx._statsExpr = this.statsExpr();\n    localctx.expr.push(localctx._statsExpr);\n    this.state = 230;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    while (_la === ScrollQLParser.SYM_COMMA) {\n      this.state = 226;\n      this.match(ScrollQLParser.SYM_COMMA);\n      this.state = 227;\n      localctx._statsExpr = this.statsExpr();\n      localctx.expr.push(localctx._statsExpr);\n      this.state = 232;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    }\n    this.state = 245;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    if (_la === ScrollQLParser.K_GROUP || _la === ScrollQLParser.K_BY) {\n      this.state = 234;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n      if (_la === ScrollQLParser.K_GROUP) {\n        this.state = 233;\n        this.match(ScrollQLParser.K_GROUP);\n      }\n\n      this.state = 236;\n      this.match(ScrollQLParser.K_BY);\n      this.state = 237;\n      localctx._statsGroupField = this.statsGroupField();\n      localctx.groups.push(localctx._statsGroupField);\n      this.state = 242;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n      while (_la === ScrollQLParser.SYM_COMMA) {\n        this.state = 238;\n        this.match(ScrollQLParser.SYM_COMMA);\n        this.state = 239;\n        localctx._statsGroupField = this.statsGroupField();\n        localctx.groups.push(localctx._statsGroupField);\n        this.state = 244;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n      }\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction StatsExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_statsExpr;\n  this.expr = null; // ExpressionRootContext\n  this.proj = null; // AliasIdContext\n  return this;\n}\n\nStatsExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nStatsExprContext.prototype.constructor = StatsExprContext;\n\nStatsExprContext.prototype.expressionRoot = function() {\n  return this.getTypedRuleContext(ExpressionRootContext, 0);\n};\n\nStatsExprContext.prototype.K_AS = function() {\n  return this.getToken(ScrollQLParser.K_AS, 0);\n};\n\nStatsExprContext.prototype.aliasId = function() {\n  return this.getTypedRuleContext(AliasIdContext, 0);\n};\n\nStatsExprContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterStatsExpr(this);\n  }\n};\n\nStatsExprContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitStatsExpr(this);\n  }\n};\n\nScrollQLParser.StatsExprContext = StatsExprContext;\n\nScrollQLParser.prototype.statsExpr = function() {\n  var localctx = new StatsExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 30, ScrollQLParser.RULE_statsExpr);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 247;\n    localctx.expr = this.expressionRoot();\n    this.state = 250;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    if (_la === ScrollQLParser.K_AS) {\n      this.state = 248;\n      this.match(ScrollQLParser.K_AS);\n      this.state = 249;\n      localctx.proj = this.aliasId();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction StatsGroupFieldContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_statsGroupField;\n  return this;\n}\n\nStatsGroupFieldContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nStatsGroupFieldContext.prototype.constructor = StatsGroupFieldContext;\n\nStatsGroupFieldContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction StatsGroupFieldIdContext(parser, ctx) {\n  StatsGroupFieldContext.call(this, parser);\n  StatsGroupFieldContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nStatsGroupFieldIdContext.prototype = Object.create(StatsGroupFieldContext.prototype);\nStatsGroupFieldIdContext.prototype.constructor = StatsGroupFieldIdContext;\n\nScrollQLParser.StatsGroupFieldIdContext = StatsGroupFieldIdContext;\n\nStatsGroupFieldIdContext.prototype.fieldId = function() {\n  return this.getTypedRuleContext(FieldIdContext, 0);\n};\nStatsGroupFieldIdContext.prototype.enterRule = function(listener) {\n  console.log(this);\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterStatsGroupFieldId(this);\n  }\n};\n\nStatsGroupFieldIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitStatsGroupFieldId(this);\n  }\n};\n\nfunction StatsGroupFieldProjectionContext(parser, ctx) {\n  StatsGroupFieldContext.call(this, parser);\n  StatsGroupFieldContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nStatsGroupFieldProjectionContext.prototype = Object.create(StatsGroupFieldContext.prototype);\nStatsGroupFieldProjectionContext.prototype.constructor = StatsGroupFieldProjectionContext;\n\nScrollQLParser.StatsGroupFieldProjectionContext = StatsGroupFieldProjectionContext;\n\nStatsGroupFieldProjectionContext.prototype.fieldSpec = function() {\n  return this.getTypedRuleContext(FieldSpecContext, 0);\n};\nStatsGroupFieldProjectionContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterStatsGroupFieldProjection(this);\n  }\n};\n\nStatsGroupFieldProjectionContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitStatsGroupFieldProjection(this);\n  }\n};\n\nScrollQLParser.StatsGroupFieldContext = StatsGroupFieldContext;\n\nScrollQLParser.prototype.statsGroupField = function() {\n  var localctx = new StatsGroupFieldContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 32, ScrollQLParser.RULE_statsGroupField);\n  try {\n    this.state = 254;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 22, this._ctx);\n    switch (la_) {\n      case 1:\n        localctx = new StatsGroupFieldIdContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 252;\n        this.fieldId();\n        break;\n\n      case 2:\n        localctx = new StatsGroupFieldProjectionContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 253;\n        this.fieldSpec();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpFieldsContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOpFields;\n  return this;\n}\n\nLogOpFieldsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpFieldsContext.prototype.constructor = LogOpFieldsContext;\n\nLogOpFieldsContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction LogOpFieldsDisplayContext(parser, ctx) {\n  LogOpFieldsContext.call(this, parser);\n  this._fieldSpec = null; // FieldSpecContext;\n  this.fields = []; // of FieldSpecContexts;\n  LogOpFieldsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nLogOpFieldsDisplayContext.prototype = Object.create(LogOpFieldsContext.prototype);\nLogOpFieldsDisplayContext.prototype.constructor = LogOpFieldsDisplayContext;\n\nScrollQLParser.LogOpFieldsDisplayContext = LogOpFieldsDisplayContext;\n\nLogOpFieldsDisplayContext.prototype.K_DISPLAY = function() {\n  return this.getToken(ScrollQLParser.K_DISPLAY, 0);\n};\n\nLogOpFieldsDisplayContext.prototype.fieldSpec = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(FieldSpecContext);\n  } else {\n    return this.getTypedRuleContext(FieldSpecContext, i);\n  }\n};\n\nLogOpFieldsDisplayContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nLogOpFieldsDisplayContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpFieldsDisplay(this);\n  }\n};\n\nLogOpFieldsDisplayContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpFieldsDisplay(this);\n  }\n};\n\nfunction LogOpFieldsFieldsContext(parser, ctx) {\n  LogOpFieldsContext.call(this, parser);\n  this._fieldSpec = null; // FieldSpecContext;\n  this.fields = []; // of FieldSpecContexts;\n  LogOpFieldsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nLogOpFieldsFieldsContext.prototype = Object.create(LogOpFieldsContext.prototype);\nLogOpFieldsFieldsContext.prototype.constructor = LogOpFieldsFieldsContext;\n\nScrollQLParser.LogOpFieldsFieldsContext = LogOpFieldsFieldsContext;\n\nLogOpFieldsFieldsContext.prototype.K_FIELDS = function() {\n  return this.getToken(ScrollQLParser.K_FIELDS, 0);\n};\n\nLogOpFieldsFieldsContext.prototype.fieldSpec = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(FieldSpecContext);\n  } else {\n    return this.getTypedRuleContext(FieldSpecContext, i);\n  }\n};\n\nLogOpFieldsFieldsContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nLogOpFieldsFieldsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpFieldsFields(this);\n  }\n};\n\nLogOpFieldsFieldsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpFieldsFields(this);\n  }\n};\n\nScrollQLParser.LogOpFieldsContext = LogOpFieldsContext;\n\nScrollQLParser.prototype.logOpFields = function() {\n  var localctx = new LogOpFieldsContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 34, ScrollQLParser.RULE_logOpFields);\n  var _la = 0; // Token type\n  try {\n    this.state = 274;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.K_FIELDS:\n        localctx = new LogOpFieldsFieldsContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 256;\n        this.match(ScrollQLParser.K_FIELDS);\n        this.state = 257;\n        localctx._fieldSpec = this.fieldSpec();\n        localctx.fields.push(localctx._fieldSpec);\n        this.state = 262;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while (_la === ScrollQLParser.SYM_COMMA) {\n          this.state = 258;\n          this.match(ScrollQLParser.SYM_COMMA);\n          this.state = 259;\n          localctx._fieldSpec = this.fieldSpec();\n          localctx.fields.push(localctx._fieldSpec);\n          this.state = 264;\n          this._errHandler.sync(this);\n          _la = this._input.LA(1);\n        }\n        break;\n      case ScrollQLParser.K_DISPLAY:\n        localctx = new LogOpFieldsDisplayContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 265;\n        this.match(ScrollQLParser.K_DISPLAY);\n        this.state = 266;\n        localctx._fieldSpec = this.fieldSpec();\n        localctx.fields.push(localctx._fieldSpec);\n        this.state = 271;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while (_la === ScrollQLParser.SYM_COMMA) {\n          this.state = 267;\n          this.match(ScrollQLParser.SYM_COMMA);\n          this.state = 268;\n          localctx._fieldSpec = this.fieldSpec();\n          localctx.fields.push(localctx._fieldSpec);\n          this.state = 273;\n          this._errHandler.sync(this);\n          _la = this._input.LA(1);\n        }\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction FieldSpecContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_fieldSpec;\n  this.proj = null; // AliasIdContext\n  return this;\n}\n\nFieldSpecContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFieldSpecContext.prototype.constructor = FieldSpecContext;\n\nFieldSpecContext.prototype.expressionRoot = function() {\n  return this.getTypedRuleContext(ExpressionRootContext, 0);\n};\n\nFieldSpecContext.prototype.K_AS = function() {\n  return this.getToken(ScrollQLParser.K_AS, 0);\n};\n\nFieldSpecContext.prototype.aliasId = function() {\n  return this.getTypedRuleContext(AliasIdContext, 0);\n};\n\nFieldSpecContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFieldSpec(this);\n  }\n};\n\nFieldSpecContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFieldSpec(this);\n  }\n};\n\nScrollQLParser.FieldSpecContext = FieldSpecContext;\n\nScrollQLParser.prototype.fieldSpec = function() {\n  var localctx = new FieldSpecContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 36, ScrollQLParser.RULE_fieldSpec);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 276;\n    this.expressionRoot();\n    this.state = 279;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    if (_la === ScrollQLParser.K_AS) {\n      this.state = 277;\n      this.match(ScrollQLParser.K_AS);\n      this.state = 278;\n      localctx.proj = this.aliasId();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpParseContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOpParse;\n  this.field = null; // FieldIdContext\n  this.anchor = null; // StringContext\n  this._aliasId = null; // AliasIdContext\n  this.proj = []; // of AliasIdContexts\n  this.re = null; // RegexContext\n  return this;\n}\n\nLogOpParseContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpParseContext.prototype.constructor = LogOpParseContext;\n\nLogOpParseContext.prototype.K_PARSE = function() {\n  return this.getToken(ScrollQLParser.K_PARSE, 0);\n};\n\nLogOpParseContext.prototype.K_AS = function() {\n  return this.getToken(ScrollQLParser.K_AS, 0);\n};\n\nLogOpParseContext.prototype.string = function() {\n  return this.getTypedRuleContext(StringContext, 0);\n};\n\nLogOpParseContext.prototype.aliasId = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(AliasIdContext);\n  } else {\n    return this.getTypedRuleContext(AliasIdContext, i);\n  }\n};\n\nLogOpParseContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nLogOpParseContext.prototype.fieldId = function() {\n  return this.getTypedRuleContext(FieldIdContext, 0);\n};\n\nLogOpParseContext.prototype.regex = function() {\n  return this.getTypedRuleContext(RegexContext, 0);\n};\n\nLogOpParseContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpParse(this);\n  }\n};\n\nLogOpParseContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpParse(this);\n  }\n};\n\nScrollQLParser.LogOpParseContext = LogOpParseContext;\n\nScrollQLParser.prototype.logOpParse = function() {\n  var localctx = new LogOpParseContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 38, ScrollQLParser.RULE_logOpParse);\n  var _la = 0; // Token type\n  try {\n    this.state = 300;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 30, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 281;\n        this.match(ScrollQLParser.K_PARSE);\n        this.state = 283;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (\n          (((_la - 3) & ~0x1f) == 0 &&\n            ((1 << (_la - 3)) &\n              ((1 << (ScrollQLParser.K_SOURCE - 3)) |\n                (1 << (ScrollQLParser.K_START - 3)) |\n                (1 << (ScrollQLParser.K_END - 3)) |\n                (1 << (ScrollQLParser.K_NOW - 3)) |\n                (1 << (ScrollQLParser.K_LIVE - 3)) |\n                (1 << (ScrollQLParser.K_PARSE - 3)) |\n                (1 << (ScrollQLParser.K_SEARCH - 3)) |\n                (1 << (ScrollQLParser.K_FIELDS - 3)) |\n                (1 << (ScrollQLParser.K_DISPLAY - 3)) |\n                (1 << (ScrollQLParser.K_FILTER - 3)) |\n                (1 << (ScrollQLParser.K_STATS - 3)) |\n                (1 << (ScrollQLParser.K_SORT - 3)) |\n                (1 << (ScrollQLParser.K_ORDER - 3)) |\n                (1 << (ScrollQLParser.K_ASC - 3)) |\n                (1 << (ScrollQLParser.K_DESC - 3)) |\n                (1 << (ScrollQLParser.K_HEAD - 3)) |\n                (1 << (ScrollQLParser.K_LIMIT - 3)) |\n                (1 << (ScrollQLParser.K_TAIL - 3)) |\n                (1 << (ScrollQLParser.K_REGEX - 3)) |\n                (1 << (ScrollQLParser.K_IN - 3)) |\n                (1 << (ScrollQLParser.K_GROUP - 3)) |\n                (1 << (ScrollQLParser.K_BY - 3)) |\n                (1 << (ScrollQLParser.K_AS - 3)) |\n                (1 << (ScrollQLParser.K_AND - 3)) |\n                (1 << (ScrollQLParser.K_OR - 3)) |\n                (1 << (ScrollQLParser.K_NOT - 3)) |\n                (1 << (ScrollQLParser.K_LIKE - 3)) |\n                (1 << (ScrollQLParser.K_MATCHES - 3)) |\n                (1 << (ScrollQLParser.K_TU_MS - 3)) |\n                (1 << (ScrollQLParser.K_TU_MSEC - 3)) |\n                (1 << (ScrollQLParser.K_TU_MSECOND - 3)) |\n                (1 << (ScrollQLParser.K_TU_S - 3)))) !==\n              0) ||\n          (((_la - 35) & ~0x1f) == 0 &&\n            ((1 << (_la - 35)) &\n              ((1 << (ScrollQLParser.K_TU_SEC - 35)) |\n                (1 << (ScrollQLParser.K_TU_SECOND - 35)) |\n                (1 << (ScrollQLParser.K_TU_M - 35)) |\n                (1 << (ScrollQLParser.K_TU_MIN - 35)) |\n                (1 << (ScrollQLParser.K_TU_MINUTE - 35)) |\n                (1 << (ScrollQLParser.K_TU_H - 35)) |\n                (1 << (ScrollQLParser.K_TU_HR - 35)) |\n                (1 << (ScrollQLParser.K_TU_HOUR - 35)) |\n                (1 << (ScrollQLParser.K_TU_D - 35)) |\n                (1 << (ScrollQLParser.K_TU_DAY - 35)) |\n                (1 << (ScrollQLParser.K_TU_W - 35)) |\n                (1 << (ScrollQLParser.K_TU_WEEK - 35)) |\n                (1 << (ScrollQLParser.K_TU_MO - 35)) |\n                (1 << (ScrollQLParser.K_TU_MON - 35)) |\n                (1 << (ScrollQLParser.K_TU_MONTH - 35)) |\n                (1 << (ScrollQLParser.K_TU_Q - 35)) |\n                (1 << (ScrollQLParser.K_TU_QTR - 35)) |\n                (1 << (ScrollQLParser.K_TU_QUARTER - 35)) |\n                (1 << (ScrollQLParser.K_TU_Y - 35)) |\n                (1 << (ScrollQLParser.K_TU_YR - 35)) |\n                (1 << (ScrollQLParser.K_TU_YEAR - 35)) |\n                (1 << (ScrollQLParser.RAW_ID - 35)) |\n                (1 << (ScrollQLParser.QUOTED_IDENT - 35)) |\n                (1 << (ScrollQLParser.SYM_AT - 35)))) !==\n              0) ||\n          (((_la - 96) & ~0x1f) == 0 &&\n            ((1 << (_la - 96)) &\n              ((1 << (ScrollQLParser.RE_RAW_ID - 96)) |\n                (1 << (ScrollQLParser.RE_SYM_AT - 96)) |\n                (1 << (ScrollQLParser.RE_QUOTED_IDENT - 96)))) !==\n              0)\n        ) {\n          this.state = 282;\n          localctx.field = this.fieldId();\n        }\n\n        this.state = 285;\n        localctx.anchor = this.string();\n        this.state = 286;\n        this.match(ScrollQLParser.K_AS);\n        this.state = 287;\n        localctx._aliasId = this.aliasId();\n        localctx.proj.push(localctx._aliasId);\n        this.state = 292;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while (_la === ScrollQLParser.SYM_COMMA) {\n          this.state = 288;\n          this.match(ScrollQLParser.SYM_COMMA);\n          this.state = 289;\n          localctx._aliasId = this.aliasId();\n          localctx.proj.push(localctx._aliasId);\n          this.state = 294;\n          this._errHandler.sync(this);\n          _la = this._input.LA(1);\n        }\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 295;\n        this.match(ScrollQLParser.K_PARSE);\n        this.state = 297;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (\n          (((_la - 3) & ~0x1f) == 0 &&\n            ((1 << (_la - 3)) &\n              ((1 << (ScrollQLParser.K_SOURCE - 3)) |\n                (1 << (ScrollQLParser.K_START - 3)) |\n                (1 << (ScrollQLParser.K_END - 3)) |\n                (1 << (ScrollQLParser.K_NOW - 3)) |\n                (1 << (ScrollQLParser.K_LIVE - 3)) |\n                (1 << (ScrollQLParser.K_PARSE - 3)) |\n                (1 << (ScrollQLParser.K_SEARCH - 3)) |\n                (1 << (ScrollQLParser.K_FIELDS - 3)) |\n                (1 << (ScrollQLParser.K_DISPLAY - 3)) |\n                (1 << (ScrollQLParser.K_FILTER - 3)) |\n                (1 << (ScrollQLParser.K_STATS - 3)) |\n                (1 << (ScrollQLParser.K_SORT - 3)) |\n                (1 << (ScrollQLParser.K_ORDER - 3)) |\n                (1 << (ScrollQLParser.K_ASC - 3)) |\n                (1 << (ScrollQLParser.K_DESC - 3)) |\n                (1 << (ScrollQLParser.K_HEAD - 3)) |\n                (1 << (ScrollQLParser.K_LIMIT - 3)) |\n                (1 << (ScrollQLParser.K_TAIL - 3)) |\n                (1 << (ScrollQLParser.K_REGEX - 3)) |\n                (1 << (ScrollQLParser.K_IN - 3)) |\n                (1 << (ScrollQLParser.K_GROUP - 3)) |\n                (1 << (ScrollQLParser.K_BY - 3)) |\n                (1 << (ScrollQLParser.K_AS - 3)) |\n                (1 << (ScrollQLParser.K_AND - 3)) |\n                (1 << (ScrollQLParser.K_OR - 3)) |\n                (1 << (ScrollQLParser.K_NOT - 3)) |\n                (1 << (ScrollQLParser.K_LIKE - 3)) |\n                (1 << (ScrollQLParser.K_MATCHES - 3)) |\n                (1 << (ScrollQLParser.K_TU_MS - 3)) |\n                (1 << (ScrollQLParser.K_TU_MSEC - 3)) |\n                (1 << (ScrollQLParser.K_TU_MSECOND - 3)) |\n                (1 << (ScrollQLParser.K_TU_S - 3)))) !==\n              0) ||\n          (((_la - 35) & ~0x1f) == 0 &&\n            ((1 << (_la - 35)) &\n              ((1 << (ScrollQLParser.K_TU_SEC - 35)) |\n                (1 << (ScrollQLParser.K_TU_SECOND - 35)) |\n                (1 << (ScrollQLParser.K_TU_M - 35)) |\n                (1 << (ScrollQLParser.K_TU_MIN - 35)) |\n                (1 << (ScrollQLParser.K_TU_MINUTE - 35)) |\n                (1 << (ScrollQLParser.K_TU_H - 35)) |\n                (1 << (ScrollQLParser.K_TU_HR - 35)) |\n                (1 << (ScrollQLParser.K_TU_HOUR - 35)) |\n                (1 << (ScrollQLParser.K_TU_D - 35)) |\n                (1 << (ScrollQLParser.K_TU_DAY - 35)) |\n                (1 << (ScrollQLParser.K_TU_W - 35)) |\n                (1 << (ScrollQLParser.K_TU_WEEK - 35)) |\n                (1 << (ScrollQLParser.K_TU_MO - 35)) |\n                (1 << (ScrollQLParser.K_TU_MON - 35)) |\n                (1 << (ScrollQLParser.K_TU_MONTH - 35)) |\n                (1 << (ScrollQLParser.K_TU_Q - 35)) |\n                (1 << (ScrollQLParser.K_TU_QTR - 35)) |\n                (1 << (ScrollQLParser.K_TU_QUARTER - 35)) |\n                (1 << (ScrollQLParser.K_TU_Y - 35)) |\n                (1 << (ScrollQLParser.K_TU_YR - 35)) |\n                (1 << (ScrollQLParser.K_TU_YEAR - 35)) |\n                (1 << (ScrollQLParser.RAW_ID - 35)) |\n                (1 << (ScrollQLParser.QUOTED_IDENT - 35)) |\n                (1 << (ScrollQLParser.SYM_AT - 35)))) !==\n              0) ||\n          (((_la - 96) & ~0x1f) == 0 &&\n            ((1 << (_la - 96)) &\n              ((1 << (ScrollQLParser.RE_RAW_ID - 96)) |\n                (1 << (ScrollQLParser.RE_SYM_AT - 96)) |\n                (1 << (ScrollQLParser.RE_QUOTED_IDENT - 96)))) !==\n              0)\n        ) {\n          this.state = 296;\n          localctx.field = this.fieldId();\n        }\n\n        this.state = 299;\n        localctx.re = this.regex();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpSearchContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOpSearch;\n  return this;\n}\n\nLogOpSearchContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpSearchContext.prototype.constructor = LogOpSearchContext;\n\nLogOpSearchContext.prototype.K_SEARCH = function() {\n  return this.getToken(ScrollQLParser.K_SEARCH, 0);\n};\n\nLogOpSearchContext.prototype.searchExpr = function() {\n  return this.getTypedRuleContext(SearchExprContext, 0);\n};\n\nLogOpSearchContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpSearch(this);\n  }\n};\n\nLogOpSearchContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpSearch(this);\n  }\n};\n\nScrollQLParser.LogOpSearchContext = LogOpSearchContext;\n\nScrollQLParser.prototype.logOpSearch = function() {\n  var localctx = new LogOpSearchContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 40, ScrollQLParser.RULE_logOpSearch);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 302;\n    this.match(ScrollQLParser.K_SEARCH);\n    this.state = 303;\n    this.searchExpr(0);\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction ImplicitLogOpSearchContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_implicitLogOpSearch;\n  return this;\n}\n\nImplicitLogOpSearchContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nImplicitLogOpSearchContext.prototype.constructor = ImplicitLogOpSearchContext;\n\nImplicitLogOpSearchContext.prototype.searchExpr = function() {\n  return this.getTypedRuleContext(SearchExprContext, 0);\n};\n\nImplicitLogOpSearchContext.prototype.SE_K_SEARCH = function() {\n  return this.getToken(ScrollQLParser.SE_K_SEARCH, 0);\n};\n\nImplicitLogOpSearchContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterImplicitLogOpSearch(this);\n  }\n};\n\nImplicitLogOpSearchContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitImplicitLogOpSearch(this);\n  }\n};\n\nScrollQLParser.ImplicitLogOpSearchContext = ImplicitLogOpSearchContext;\n\nScrollQLParser.prototype.implicitLogOpSearch = function() {\n  var localctx = new ImplicitLogOpSearchContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 42, ScrollQLParser.RULE_implicitLogOpSearch);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 306;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    if (_la === ScrollQLParser.SE_K_SEARCH) {\n      this.state = 305;\n      this.match(ScrollQLParser.SE_K_SEARCH);\n    }\n\n    this.state = 308;\n    this.searchExpr(0);\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction SearchExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_searchExpr;\n  return this;\n}\n\nSearchExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nSearchExprContext.prototype.constructor = SearchExprContext;\n\nSearchExprContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction SearchExprTermContext(parser, ctx) {\n  SearchExprContext.call(this, parser);\n  this.t = null; // SearchTermContext;\n  SearchExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSearchExprTermContext.prototype = Object.create(SearchExprContext.prototype);\nSearchExprTermContext.prototype.constructor = SearchExprTermContext;\n\nScrollQLParser.SearchExprTermContext = SearchExprTermContext;\n\nSearchExprTermContext.prototype.searchTerm = function() {\n  return this.getTypedRuleContext(SearchTermContext, 0);\n};\nSearchExprTermContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSearchExprTerm(this);\n  }\n};\n\nSearchExprTermContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSearchExprTerm(this);\n  }\n};\n\nfunction SearchExprNotContext(parser, ctx) {\n  SearchExprContext.call(this, parser);\n  SearchExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSearchExprNotContext.prototype = Object.create(SearchExprContext.prototype);\nSearchExprNotContext.prototype.constructor = SearchExprNotContext;\n\nScrollQLParser.SearchExprNotContext = SearchExprNotContext;\n\nSearchExprNotContext.prototype.SE_K_NOT = function() {\n  return this.getToken(ScrollQLParser.SE_K_NOT, 0);\n};\n\nSearchExprNotContext.prototype.searchExpr = function() {\n  return this.getTypedRuleContext(SearchExprContext, 0);\n};\nSearchExprNotContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSearchExprNot(this);\n  }\n};\n\nSearchExprNotContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSearchExprNot(this);\n  }\n};\n\nfunction SearchExprAndContext(parser, ctx) {\n  SearchExprContext.call(this, parser);\n  SearchExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSearchExprAndContext.prototype = Object.create(SearchExprContext.prototype);\nSearchExprAndContext.prototype.constructor = SearchExprAndContext;\n\nScrollQLParser.SearchExprAndContext = SearchExprAndContext;\n\nSearchExprAndContext.prototype.searchExpr = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(SearchExprContext);\n  } else {\n    return this.getTypedRuleContext(SearchExprContext, i);\n  }\n};\n\nSearchExprAndContext.prototype.SE_K_AND = function() {\n  return this.getToken(ScrollQLParser.SE_K_AND, 0);\n};\nSearchExprAndContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSearchExprAnd(this);\n  }\n};\n\nSearchExprAndContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSearchExprAnd(this);\n  }\n};\n\nfunction SearchExprNestedContext(parser, ctx) {\n  SearchExprContext.call(this, parser);\n  SearchExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSearchExprNestedContext.prototype = Object.create(SearchExprContext.prototype);\nSearchExprNestedContext.prototype.constructor = SearchExprNestedContext;\n\nScrollQLParser.SearchExprNestedContext = SearchExprNestedContext;\n\nSearchExprNestedContext.prototype.SE_SYM_LPAREN = function() {\n  return this.getToken(ScrollQLParser.SE_SYM_LPAREN, 0);\n};\n\nSearchExprNestedContext.prototype.searchExpr = function() {\n  return this.getTypedRuleContext(SearchExprContext, 0);\n};\n\nSearchExprNestedContext.prototype.SE_SYM_RPAREN = function() {\n  return this.getToken(ScrollQLParser.SE_SYM_RPAREN, 0);\n};\nSearchExprNestedContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSearchExprNested(this);\n  }\n};\n\nSearchExprNestedContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSearchExprNested(this);\n  }\n};\n\nfunction SearchExprOrContext(parser, ctx) {\n  SearchExprContext.call(this, parser);\n  SearchExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSearchExprOrContext.prototype = Object.create(SearchExprContext.prototype);\nSearchExprOrContext.prototype.constructor = SearchExprOrContext;\n\nScrollQLParser.SearchExprOrContext = SearchExprOrContext;\n\nSearchExprOrContext.prototype.searchExpr = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(SearchExprContext);\n  } else {\n    return this.getTypedRuleContext(SearchExprContext, i);\n  }\n};\n\nSearchExprOrContext.prototype.SE_K_OR = function() {\n  return this.getToken(ScrollQLParser.SE_K_OR, 0);\n};\nSearchExprOrContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSearchExprOr(this);\n  }\n};\n\nSearchExprOrContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSearchExprOr(this);\n  }\n};\n\nScrollQLParser.prototype.searchExpr = function(_p) {\n  if (_p === undefined) {\n    _p = 0;\n  }\n  var _parentctx = this._ctx;\n  var _parentState = this.state;\n  var localctx = new SearchExprContext(this, this._ctx, _parentState);\n  var _prevctx = localctx;\n  var _startState = 44;\n  this.enterRecursionRule(localctx, 44, ScrollQLParser.RULE_searchExpr, _p);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 318;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.SE_K_NOT:\n        localctx = new SearchExprNotContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n\n        this.state = 311;\n        this.match(ScrollQLParser.SE_K_NOT);\n        this.state = 312;\n        this.searchExpr(5);\n        break;\n      case ScrollQLParser.SE_SYM_LPAREN:\n        localctx = new SearchExprNestedContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n        this.state = 313;\n        this.match(ScrollQLParser.SE_SYM_LPAREN);\n        this.state = 314;\n        this.searchExpr(0);\n        this.state = 315;\n        this.match(ScrollQLParser.SE_SYM_RPAREN);\n        break;\n      case ScrollQLParser.SE_SDQUOTED_STRING:\n      case ScrollQLParser.SE_SSQUOTED_STRING:\n      case ScrollQLParser.SE_CDQUOTED_STRING:\n      case ScrollQLParser.SE_CSQUOTED_STRING:\n      case ScrollQLParser.SE_UNQUOTED_STRING:\n        localctx = new SearchExprTermContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n        this.state = 317;\n        localctx.t = this.searchTerm();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n    this._ctx.stop = this._input.LT(-1);\n    this.state = 330;\n    this._errHandler.sync(this);\n    var _alt = this._interp.adaptivePredict(this._input, 35, this._ctx);\n    while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n      if (_alt === 1) {\n        if (this._parseListeners !== null) {\n          this.triggerExitRuleEvent();\n        }\n        _prevctx = localctx;\n        this.state = 328;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input, 34, this._ctx);\n        switch (la_) {\n          case 1:\n            localctx = new SearchExprAndContext(this, new SearchExprContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_searchExpr);\n            this.state = 320;\n            if (!this.precpred(this._ctx, 3)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 3)');\n            }\n            this.state = 322;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n            if (_la === ScrollQLParser.SE_K_AND) {\n              this.state = 321;\n              this.match(ScrollQLParser.SE_K_AND);\n            }\n\n            this.state = 324;\n            this.searchExpr(4);\n            break;\n\n          case 2:\n            localctx = new SearchExprOrContext(this, new SearchExprContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_searchExpr);\n            this.state = 325;\n            if (!this.precpred(this._ctx, 2)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 2)');\n            }\n            this.state = 326;\n            this.match(ScrollQLParser.SE_K_OR);\n            this.state = 327;\n            this.searchExpr(3);\n            break;\n        }\n      }\n      this.state = 332;\n      this._errHandler.sync(this);\n      _alt = this._interp.adaptivePredict(this._input, 35, this._ctx);\n    }\n  } catch (error) {\n    if (error instanceof antlr4.error.RecognitionException) {\n      localctx.exception = error;\n      this._errHandler.reportError(this, error);\n      this._errHandler.recover(this, error);\n    } else {\n      throw error;\n    }\n  } finally {\n    this.unrollRecursionContexts(_parentctx);\n  }\n  return localctx;\n};\n\nfunction SearchTermContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_searchTerm;\n  this.bstr = null; // Token\n  this.sdqstr = null; // Token\n  this.ssqstr = null; // Token\n  this.cdqstr = null; // Token\n  this.csqstr = null; // Token\n  return this;\n}\n\nSearchTermContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nSearchTermContext.prototype.constructor = SearchTermContext;\n\nSearchTermContext.prototype.SE_UNQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SE_UNQUOTED_STRING, 0);\n};\n\nSearchTermContext.prototype.SE_SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SE_SDQUOTED_STRING, 0);\n};\n\nSearchTermContext.prototype.SE_SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SE_SSQUOTED_STRING, 0);\n};\n\nSearchTermContext.prototype.SE_CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SE_CDQUOTED_STRING, 0);\n};\n\nSearchTermContext.prototype.SE_CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SE_CSQUOTED_STRING, 0);\n};\n\nSearchTermContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSearchTerm(this);\n  }\n};\n\nSearchTermContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSearchTerm(this);\n  }\n};\n\nScrollQLParser.SearchTermContext = SearchTermContext;\n\nScrollQLParser.prototype.searchTerm = function() {\n  var localctx = new SearchTermContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 46, ScrollQLParser.RULE_searchTerm);\n  try {\n    this.state = 338;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.SE_UNQUOTED_STRING:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 333;\n        localctx.bstr = this.match(ScrollQLParser.SE_UNQUOTED_STRING);\n        break;\n      case ScrollQLParser.SE_SDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 334;\n        localctx.sdqstr = this.match(ScrollQLParser.SE_SDQUOTED_STRING);\n        break;\n      case ScrollQLParser.SE_SSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 335;\n        localctx.ssqstr = this.match(ScrollQLParser.SE_SSQUOTED_STRING);\n        break;\n      case ScrollQLParser.SE_CDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 336;\n        localctx.cdqstr = this.match(ScrollQLParser.SE_CDQUOTED_STRING);\n        break;\n      case ScrollQLParser.SE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 5);\n        this.state = 337;\n        localctx.csqstr = this.match(ScrollQLParser.SE_CSQUOTED_STRING);\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpFilterContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOpFilter;\n  return this;\n}\n\nLogOpFilterContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpFilterContext.prototype.constructor = LogOpFilterContext;\n\nLogOpFilterContext.prototype.K_FILTER = function() {\n  return this.getToken(ScrollQLParser.K_FILTER, 0);\n};\n\nLogOpFilterContext.prototype.expressionRoot = function() {\n  return this.getTypedRuleContext(ExpressionRootContext, 0);\n};\n\nLogOpFilterContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpFilter(this);\n  }\n};\n\nLogOpFilterContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpFilter(this);\n  }\n};\n\nScrollQLParser.LogOpFilterContext = LogOpFilterContext;\n\nScrollQLParser.prototype.logOpFilter = function() {\n  var localctx = new LogOpFilterContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 48, ScrollQLParser.RULE_logOpFilter);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 340;\n    this.match(ScrollQLParser.K_FILTER);\n    this.state = 341;\n    this.expressionRoot();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpSortContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOpSort;\n  return this;\n}\n\nLogOpSortContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpSortContext.prototype.constructor = LogOpSortContext;\n\nLogOpSortContext.prototype.sortExpr = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(SortExprContext);\n  } else {\n    return this.getTypedRuleContext(SortExprContext, i);\n  }\n};\n\nLogOpSortContext.prototype.K_SORT = function() {\n  return this.getToken(ScrollQLParser.K_SORT, 0);\n};\n\nLogOpSortContext.prototype.K_ORDER = function() {\n  return this.getToken(ScrollQLParser.K_ORDER, 0);\n};\n\nLogOpSortContext.prototype.K_BY = function() {\n  return this.getToken(ScrollQLParser.K_BY, 0);\n};\n\nLogOpSortContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nLogOpSortContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpSort(this);\n  }\n};\n\nLogOpSortContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpSort(this);\n  }\n};\n\nScrollQLParser.LogOpSortContext = LogOpSortContext;\n\nScrollQLParser.prototype.logOpSort = function() {\n  var localctx = new LogOpSortContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 50, ScrollQLParser.RULE_logOpSort);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 343;\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.K_SORT || _la === ScrollQLParser.K_ORDER)) {\n      this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n    this.state = 345;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 37, this._ctx);\n    if (la_ === 1) {\n      this.state = 344;\n      this.match(ScrollQLParser.K_BY);\n    }\n    this.state = 347;\n    this.sortExpr();\n    this.state = 352;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    while (_la === ScrollQLParser.SYM_COMMA) {\n      this.state = 348;\n      this.match(ScrollQLParser.SYM_COMMA);\n      this.state = 349;\n      this.sortExpr();\n      this.state = 354;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction SortExprContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_sortExpr;\n  return this;\n}\n\nSortExprContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nSortExprContext.prototype.constructor = SortExprContext;\n\nSortExprContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction SortExprDescContext(parser, ctx) {\n  SortExprContext.call(this, parser);\n  this.did = null; // FieldIdContext;\n  SortExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSortExprDescContext.prototype = Object.create(SortExprContext.prototype);\nSortExprDescContext.prototype.constructor = SortExprDescContext;\n\nScrollQLParser.SortExprDescContext = SortExprDescContext;\n\nSortExprDescContext.prototype.K_DESC = function() {\n  return this.getToken(ScrollQLParser.K_DESC, 0);\n};\n\nSortExprDescContext.prototype.fieldId = function() {\n  return this.getTypedRuleContext(FieldIdContext, 0);\n};\nSortExprDescContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSortExprDesc(this);\n  }\n};\n\nSortExprDescContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSortExprDesc(this);\n  }\n};\n\nfunction SortExprAscContext(parser, ctx) {\n  SortExprContext.call(this, parser);\n  this.aid = null; // FieldIdContext;\n  SortExprContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nSortExprAscContext.prototype = Object.create(SortExprContext.prototype);\nSortExprAscContext.prototype.constructor = SortExprAscContext;\n\nScrollQLParser.SortExprAscContext = SortExprAscContext;\n\nSortExprAscContext.prototype.fieldId = function() {\n  return this.getTypedRuleContext(FieldIdContext, 0);\n};\n\nSortExprAscContext.prototype.K_ASC = function() {\n  return this.getToken(ScrollQLParser.K_ASC, 0);\n};\nSortExprAscContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSortExprAsc(this);\n  }\n};\n\nSortExprAscContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSortExprAsc(this);\n  }\n};\n\nScrollQLParser.SortExprContext = SortExprContext;\n\nScrollQLParser.prototype.sortExpr = function() {\n  var localctx = new SortExprContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 52, ScrollQLParser.RULE_sortExpr);\n  var _la = 0; // Token type\n  try {\n    this.state = 362;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 40, this._ctx);\n    switch (la_) {\n      case 1:\n        localctx = new SortExprDescContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 355;\n        localctx.did = this.fieldId();\n        this.state = 356;\n        this.match(ScrollQLParser.K_DESC);\n        break;\n\n      case 2:\n        localctx = new SortExprAscContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 358;\n        localctx.aid = this.fieldId();\n        this.state = 360;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (_la === ScrollQLParser.K_ASC) {\n          this.state = 359;\n          this.match(ScrollQLParser.K_ASC);\n        }\n\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogOpLimitContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logOpLimit;\n  return this;\n}\n\nLogOpLimitContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogOpLimitContext.prototype.constructor = LogOpLimitContext;\n\nLogOpLimitContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction LogOpLimitHeadContext(parser, ctx) {\n  LogOpLimitContext.call(this, parser);\n  this.n = null; // Token;\n  LogOpLimitContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nLogOpLimitHeadContext.prototype = Object.create(LogOpLimitContext.prototype);\nLogOpLimitHeadContext.prototype.constructor = LogOpLimitHeadContext;\n\nScrollQLParser.LogOpLimitHeadContext = LogOpLimitHeadContext;\n\nLogOpLimitHeadContext.prototype.K_LIMIT = function() {\n  return this.getToken(ScrollQLParser.K_LIMIT, 0);\n};\n\nLogOpLimitHeadContext.prototype.K_HEAD = function() {\n  return this.getToken(ScrollQLParser.K_HEAD, 0);\n};\n\nLogOpLimitHeadContext.prototype.LIT_INTEGER = function() {\n  return this.getToken(ScrollQLParser.LIT_INTEGER, 0);\n};\nLogOpLimitHeadContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpLimitHead(this);\n  }\n};\n\nLogOpLimitHeadContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpLimitHead(this);\n  }\n};\n\nfunction LogOpLimitTailContext(parser, ctx) {\n  LogOpLimitContext.call(this, parser);\n  this.n = null; // Token;\n  LogOpLimitContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nLogOpLimitTailContext.prototype = Object.create(LogOpLimitContext.prototype);\nLogOpLimitTailContext.prototype.constructor = LogOpLimitTailContext;\n\nScrollQLParser.LogOpLimitTailContext = LogOpLimitTailContext;\n\nLogOpLimitTailContext.prototype.K_TAIL = function() {\n  return this.getToken(ScrollQLParser.K_TAIL, 0);\n};\n\nLogOpLimitTailContext.prototype.LIT_INTEGER = function() {\n  return this.getToken(ScrollQLParser.LIT_INTEGER, 0);\n};\nLogOpLimitTailContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogOpLimitTail(this);\n  }\n};\n\nLogOpLimitTailContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogOpLimitTail(this);\n  }\n};\n\nScrollQLParser.LogOpLimitContext = LogOpLimitContext;\n\nScrollQLParser.prototype.logOpLimit = function() {\n  var localctx = new LogOpLimitContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 54, ScrollQLParser.RULE_logOpLimit);\n  var _la = 0; // Token type\n  try {\n    this.state = 368;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.K_HEAD:\n      case ScrollQLParser.K_LIMIT:\n        localctx = new LogOpLimitHeadContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 364;\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.K_HEAD || _la === ScrollQLParser.K_LIMIT)) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        this.state = 365;\n        localctx.n = this.match(ScrollQLParser.LIT_INTEGER);\n        break;\n      case ScrollQLParser.K_TAIL:\n        localctx = new LogOpLimitTailContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 366;\n        this.match(ScrollQLParser.K_TAIL);\n        this.state = 367;\n        localctx.n = this.match(ScrollQLParser.LIT_INTEGER);\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction ExpressionRootContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_expressionRoot;\n  return this;\n}\n\nExpressionRootContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nExpressionRootContext.prototype.constructor = ExpressionRootContext;\n\nExpressionRootContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\n\nExpressionRootContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionRoot(this);\n  }\n};\n\nExpressionRootContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionRoot(this);\n  }\n};\n\nScrollQLParser.ExpressionRootContext = ExpressionRootContext;\n\nScrollQLParser.prototype.expressionRoot = function() {\n  var localctx = new ExpressionRootContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 56, ScrollQLParser.RULE_expressionRoot);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 370;\n    this.expression(0);\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction ExpressionContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_expression;\n  return this;\n}\n\nExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nExpressionContext.prototype.constructor = ExpressionContext;\n\nExpressionContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction ExpressionAddSubContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.bop = null; // Token;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionAddSubContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionAddSubContext.prototype.constructor = ExpressionAddSubContext;\n\nScrollQLParser.ExpressionAddSubContext = ExpressionAddSubContext;\n\nExpressionAddSubContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\n\nExpressionAddSubContext.prototype.SYM_PLUS = function() {\n  return this.getToken(ScrollQLParser.SYM_PLUS, 0);\n};\n\nExpressionAddSubContext.prototype.SYM_MINUS = function() {\n  return this.getToken(ScrollQLParser.SYM_MINUS, 0);\n};\nExpressionAddSubContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionAddSub(this);\n  }\n};\n\nExpressionAddSubContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionAddSub(this);\n  }\n};\n\nfunction ExpressionEqContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.bop = null; // Token;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionEqContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionEqContext.prototype.constructor = ExpressionEqContext;\n\nScrollQLParser.ExpressionEqContext = ExpressionEqContext;\n\nExpressionEqContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\n\nExpressionEqContext.prototype.SYM_EQ = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_EQ);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_EQ, i);\n  }\n};\n\nExpressionEqContext.prototype.SYM_NEQ = function() {\n  return this.getToken(ScrollQLParser.SYM_NEQ, 0);\n};\nExpressionEqContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionEq(this);\n  }\n};\n\nExpressionEqContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionEq(this);\n  }\n};\n\nfunction ExpressionCompContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.bop = null; // Token;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionCompContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionCompContext.prototype.constructor = ExpressionCompContext;\n\nScrollQLParser.ExpressionCompContext = ExpressionCompContext;\n\nExpressionCompContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\n\nExpressionCompContext.prototype.SYM_LTEQ = function() {\n  return this.getToken(ScrollQLParser.SYM_LTEQ, 0);\n};\n\nExpressionCompContext.prototype.SYM_GTEQ = function() {\n  return this.getToken(ScrollQLParser.SYM_GTEQ, 0);\n};\n\nExpressionCompContext.prototype.SYM_GT = function() {\n  return this.getToken(ScrollQLParser.SYM_GT, 0);\n};\n\nExpressionCompContext.prototype.SYM_LT = function() {\n  return this.getToken(ScrollQLParser.SYM_LT, 0);\n};\nExpressionCompContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionComp(this);\n  }\n};\n\nExpressionCompContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionComp(this);\n  }\n};\n\nfunction ExpressionExpoContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionExpoContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionExpoContext.prototype.constructor = ExpressionExpoContext;\n\nScrollQLParser.ExpressionExpoContext = ExpressionExpoContext;\n\nExpressionExpoContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\n\nExpressionExpoContext.prototype.SYM_CARET = function() {\n  return this.getToken(ScrollQLParser.SYM_CARET, 0);\n};\nExpressionExpoContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionExpo(this);\n  }\n};\n\nExpressionExpoContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionExpo(this);\n  }\n};\n\nfunction ExpressionLikeContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.not = null; // Token;\n  this.rhs = null; // LikeTermContext;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionLikeContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionLikeContext.prototype.constructor = ExpressionLikeContext;\n\nScrollQLParser.ExpressionLikeContext = ExpressionLikeContext;\n\nExpressionLikeContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\n\nExpressionLikeContext.prototype.K_LIKE = function() {\n  return this.getToken(ScrollQLParser.K_LIKE, 0);\n};\n\nExpressionLikeContext.prototype.SYM_EQTILDE = function() {\n  return this.getToken(ScrollQLParser.SYM_EQTILDE, 0);\n};\n\nExpressionLikeContext.prototype.SYM_TILDEEQ = function() {\n  return this.getToken(ScrollQLParser.SYM_TILDEEQ, 0);\n};\n\nExpressionLikeContext.prototype.likeTerm = function() {\n  return this.getTypedRuleContext(LikeTermContext, 0);\n};\n\nExpressionLikeContext.prototype.K_NOT = function() {\n  return this.getToken(ScrollQLParser.K_NOT, 0);\n};\nExpressionLikeContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionLike(this);\n  }\n};\n\nExpressionLikeContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionLike(this);\n  }\n};\n\nfunction ExpressionTermContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionTermContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionTermContext.prototype.constructor = ExpressionTermContext;\n\nScrollQLParser.ExpressionTermContext = ExpressionTermContext;\n\nExpressionTermContext.prototype.term = function() {\n  return this.getTypedRuleContext(TermContext, 0);\n};\nExpressionTermContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionTerm(this);\n  }\n};\n\nExpressionTermContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionTerm(this);\n  }\n};\n\nfunction ExpressionNegContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionNegContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionNegContext.prototype.constructor = ExpressionNegContext;\n\nScrollQLParser.ExpressionNegContext = ExpressionNegContext;\n\nExpressionNegContext.prototype.SYM_MINUS = function() {\n  return this.getToken(ScrollQLParser.SYM_MINUS, 0);\n};\n\nExpressionNegContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\nExpressionNegContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionNeg(this);\n  }\n};\n\nExpressionNegContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionNeg(this);\n  }\n};\n\nfunction ExpressionNotContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionNotContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionNotContext.prototype.constructor = ExpressionNotContext;\n\nScrollQLParser.ExpressionNotContext = ExpressionNotContext;\n\nExpressionNotContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\n\nExpressionNotContext.prototype.SYM_NOT = function() {\n  return this.getToken(ScrollQLParser.SYM_NOT, 0);\n};\n\nExpressionNotContext.prototype.K_NOT = function() {\n  return this.getToken(ScrollQLParser.K_NOT, 0);\n};\nExpressionNotContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionNot(this);\n  }\n};\n\nExpressionNotContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionNot(this);\n  }\n};\n\nfunction ExpressionPosContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionPosContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionPosContext.prototype.constructor = ExpressionPosContext;\n\nScrollQLParser.ExpressionPosContext = ExpressionPosContext;\n\nExpressionPosContext.prototype.SYM_PLUS = function() {\n  return this.getToken(ScrollQLParser.SYM_PLUS, 0);\n};\n\nExpressionPosContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\nExpressionPosContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionPos(this);\n  }\n};\n\nExpressionPosContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionPos(this);\n  }\n};\n\nfunction ExpressionMulDivModContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.bop = null; // Token;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionMulDivModContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionMulDivModContext.prototype.constructor = ExpressionMulDivModContext;\n\nScrollQLParser.ExpressionMulDivModContext = ExpressionMulDivModContext;\n\nExpressionMulDivModContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\n\nExpressionMulDivModContext.prototype.SYM_MUL = function() {\n  return this.getToken(ScrollQLParser.SYM_MUL, 0);\n};\n\nExpressionMulDivModContext.prototype.SYM_DIV = function() {\n  return this.getToken(ScrollQLParser.SYM_DIV, 0);\n};\n\nExpressionMulDivModContext.prototype.SYM_MOD = function() {\n  return this.getToken(ScrollQLParser.SYM_MOD, 0);\n};\nExpressionMulDivModContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionMulDivMod(this);\n  }\n};\n\nExpressionMulDivModContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionMulDivMod(this);\n  }\n};\n\nfunction ExpressionAndContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.lhs = null; // ExpressionContext;\n  this.rhs = null; // ExpressionContext;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionAndContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionAndContext.prototype.constructor = ExpressionAndContext;\n\nScrollQLParser.ExpressionAndContext = ExpressionAndContext;\n\nExpressionAndContext.prototype.K_AND = function() {\n  return this.getToken(ScrollQLParser.K_AND, 0);\n};\n\nExpressionAndContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\nExpressionAndContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionAnd(this);\n  }\n};\n\nExpressionAndContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionAnd(this);\n  }\n};\n\nfunction ExpressionNestedContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionNestedContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionNestedContext.prototype.constructor = ExpressionNestedContext;\n\nScrollQLParser.ExpressionNestedContext = ExpressionNestedContext;\n\nExpressionNestedContext.prototype.SYM_LPAREN = function() {\n  return this.getToken(ScrollQLParser.SYM_LPAREN, 0);\n};\n\nExpressionNestedContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\n\nExpressionNestedContext.prototype.SYM_RPAREN = function() {\n  return this.getToken(ScrollQLParser.SYM_RPAREN, 0);\n};\nExpressionNestedContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionNested(this);\n  }\n};\n\nExpressionNestedContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionNested(this);\n  }\n};\n\nfunction ExpressionOrContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.lhs = null; // ExpressionContext;\n  this.rhs = null; // ExpressionContext;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionOrContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionOrContext.prototype.constructor = ExpressionOrContext;\n\nScrollQLParser.ExpressionOrContext = ExpressionOrContext;\n\nExpressionOrContext.prototype.K_OR = function() {\n  return this.getToken(ScrollQLParser.K_OR, 0);\n};\n\nExpressionOrContext.prototype.expression = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ExpressionContext);\n  } else {\n    return this.getTypedRuleContext(ExpressionContext, i);\n  }\n};\nExpressionOrContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionOr(this);\n  }\n};\n\nExpressionOrContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionOr(this);\n  }\n};\n\nfunction ExpressionInContext(parser, ctx) {\n  ExpressionContext.call(this, parser);\n  this.lhs = null; // ExpressionContext;\n  this.not = null; // Token;\n  this.rhs = null; // ArrayContext;\n  ExpressionContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nExpressionInContext.prototype = Object.create(ExpressionContext.prototype);\nExpressionInContext.prototype.constructor = ExpressionInContext;\n\nScrollQLParser.ExpressionInContext = ExpressionInContext;\n\nExpressionInContext.prototype.K_IN = function() {\n  return this.getToken(ScrollQLParser.K_IN, 0);\n};\n\nExpressionInContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\n\nExpressionInContext.prototype.array = function() {\n  return this.getTypedRuleContext(ArrayContext, 0);\n};\n\nExpressionInContext.prototype.K_NOT = function() {\n  return this.getToken(ScrollQLParser.K_NOT, 0);\n};\nExpressionInContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterExpressionIn(this);\n  }\n};\n\nExpressionInContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitExpressionIn(this);\n  }\n};\n\nScrollQLParser.prototype.expression = function(_p) {\n  if (_p === undefined) {\n    _p = 0;\n  }\n  var _parentctx = this._ctx;\n  var _parentState = this.state;\n  var localctx = new ExpressionContext(this, this._ctx, _parentState);\n  var _prevctx = localctx;\n  var _startState = 58;\n  this.enterRecursionRule(localctx, 58, ScrollQLParser.RULE_expression, _p);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 384;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 42, this._ctx);\n    switch (la_) {\n      case 1:\n        localctx = new ExpressionNestedContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n\n        this.state = 373;\n        this.match(ScrollQLParser.SYM_LPAREN);\n        this.state = 374;\n        this.expression(0);\n        this.state = 375;\n        this.match(ScrollQLParser.SYM_RPAREN);\n        break;\n\n      case 2:\n        localctx = new ExpressionNotContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n        this.state = 377;\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.K_NOT || _la === ScrollQLParser.SYM_NOT)) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        this.state = 378;\n        this.expression(12);\n        break;\n\n      case 3:\n        localctx = new ExpressionNegContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n        this.state = 379;\n        this.match(ScrollQLParser.SYM_MINUS);\n        this.state = 380;\n        this.expression(11);\n        break;\n\n      case 4:\n        localctx = new ExpressionPosContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n        this.state = 381;\n        this.match(ScrollQLParser.SYM_PLUS);\n        this.state = 382;\n        this.expression(10);\n        break;\n\n      case 5:\n        localctx = new ExpressionTermContext(this, localctx);\n        this._ctx = localctx;\n        _prevctx = localctx;\n        this.state = 383;\n        this.term();\n        break;\n    }\n    this._ctx.stop = this._input.LT(-1);\n    this.state = 426;\n    this._errHandler.sync(this);\n    var _alt = this._interp.adaptivePredict(this._input, 47, this._ctx);\n    while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) {\n      if (_alt === 1) {\n        if (this._parseListeners !== null) {\n          this.triggerExitRuleEvent();\n        }\n        _prevctx = localctx;\n        this.state = 424;\n        this._errHandler.sync(this);\n        var la_ = this._interp.adaptivePredict(this._input, 46, this._ctx);\n        switch (la_) {\n          case 1:\n            localctx = new ExpressionExpoContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 386;\n            if (!this.precpred(this._ctx, 13)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 13)');\n            }\n            this.state = 387;\n            this.match(ScrollQLParser.SYM_CARET);\n            this.state = 388;\n            this.expression(13);\n            break;\n\n          case 2:\n            localctx = new ExpressionMulDivModContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 389;\n            if (!this.precpred(this._ctx, 9)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 9)');\n            }\n            this.state = 390;\n            localctx.bop = this._input.LT(1);\n            _la = this._input.LA(1);\n            if (\n              !(\n                ((_la - 75) & ~0x1f) == 0 &&\n                ((1 << (_la - 75)) &\n                  ((1 << (ScrollQLParser.SYM_MUL - 75)) |\n                    (1 << (ScrollQLParser.SYM_DIV - 75)) |\n                    (1 << (ScrollQLParser.SYM_MOD - 75)))) !==\n                  0\n              )\n            ) {\n              localctx.bop = this._errHandler.recoverInline(this);\n            } else {\n              this._errHandler.reportMatch(this);\n              this.consume();\n            }\n            this.state = 391;\n            this.expression(10);\n            break;\n\n          case 3:\n            localctx = new ExpressionAddSubContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 392;\n            if (!this.precpred(this._ctx, 8)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 8)');\n            }\n            this.state = 393;\n            localctx.bop = this._input.LT(1);\n            _la = this._input.LA(1);\n            if (!(_la === ScrollQLParser.SYM_PLUS || _la === ScrollQLParser.SYM_MINUS)) {\n              localctx.bop = this._errHandler.recoverInline(this);\n            } else {\n              this._errHandler.reportMatch(this);\n              this.consume();\n            }\n            this.state = 394;\n            this.expression(9);\n            break;\n\n          case 4:\n            localctx = new ExpressionCompContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 395;\n            if (!this.precpred(this._ctx, 7)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 7)');\n            }\n            this.state = 396;\n            localctx.bop = this._input.LT(1);\n            _la = this._input.LA(1);\n            if (\n              !(\n                ((_la - 81) & ~0x1f) == 0 &&\n                ((1 << (_la - 81)) &\n                  ((1 << (ScrollQLParser.SYM_LT - 81)) |\n                    (1 << (ScrollQLParser.SYM_GT - 81)) |\n                    (1 << (ScrollQLParser.SYM_LTEQ - 81)) |\n                    (1 << (ScrollQLParser.SYM_GTEQ - 81)))) !==\n                  0\n              )\n            ) {\n              localctx.bop = this._errHandler.recoverInline(this);\n            } else {\n              this._errHandler.reportMatch(this);\n              this.consume();\n            }\n            this.state = 397;\n            this.expression(8);\n            break;\n\n          case 5:\n            localctx = new ExpressionEqContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 398;\n            if (!this.precpred(this._ctx, 6)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 6)');\n            }\n            this.state = 403;\n            this._errHandler.sync(this);\n            var la_ = this._interp.adaptivePredict(this._input, 43, this._ctx);\n            switch (la_) {\n              case 1:\n                this.state = 399;\n                localctx.bop = this.match(ScrollQLParser.SYM_EQ);\n                this.state = 400;\n                this.match(ScrollQLParser.SYM_EQ);\n                break;\n\n              case 2:\n                this.state = 401;\n                localctx.bop = this.match(ScrollQLParser.SYM_EQ);\n                break;\n\n              case 3:\n                this.state = 402;\n                localctx.bop = this.match(ScrollQLParser.SYM_NEQ);\n                break;\n            }\n            this.state = 405;\n            this.expression(7);\n            break;\n\n          case 6:\n            localctx = new ExpressionAndContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            localctx.lhs = _prevctx;\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 406;\n            if (!this.precpred(this._ctx, 3)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 3)');\n            }\n            this.state = 407;\n            this.match(ScrollQLParser.K_AND);\n            this.state = 408;\n            localctx.rhs = this.expression(4);\n            break;\n\n          case 7:\n            localctx = new ExpressionOrContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            localctx.lhs = _prevctx;\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 409;\n            if (!this.precpred(this._ctx, 2)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 2)');\n            }\n            this.state = 410;\n            this.match(ScrollQLParser.K_OR);\n            this.state = 411;\n            localctx.rhs = this.expression(3);\n            break;\n\n          case 8:\n            localctx = new ExpressionLikeContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 412;\n            if (!this.precpred(this._ctx, 5)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 5)');\n            }\n            this.state = 414;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n            if (_la === ScrollQLParser.K_NOT) {\n              this.state = 413;\n              localctx.not = this.match(ScrollQLParser.K_NOT);\n            }\n\n            this.state = 416;\n            _la = this._input.LA(1);\n            if (\n              !(\n                _la === ScrollQLParser.K_LIKE ||\n                _la === ScrollQLParser.SYM_EQTILDE ||\n                _la === ScrollQLParser.SYM_TILDEEQ\n              )\n            ) {\n              this._errHandler.recoverInline(this);\n            } else {\n              this._errHandler.reportMatch(this);\n              this.consume();\n            }\n            this.state = 417;\n            localctx.rhs = this.likeTerm();\n            break;\n\n          case 9:\n            localctx = new ExpressionInContext(this, new ExpressionContext(this, _parentctx, _parentState));\n            localctx.lhs = _prevctx;\n            this.pushNewRecursionContext(localctx, _startState, ScrollQLParser.RULE_expression);\n            this.state = 418;\n            if (!this.precpred(this._ctx, 4)) {\n              throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 4)');\n            }\n            this.state = 420;\n            this._errHandler.sync(this);\n            _la = this._input.LA(1);\n            if (_la === ScrollQLParser.K_NOT) {\n              this.state = 419;\n              localctx.not = this.match(ScrollQLParser.K_NOT);\n            }\n\n            this.state = 422;\n            this.match(ScrollQLParser.K_IN);\n            this.state = 423;\n            localctx.rhs = this.array();\n            break;\n        }\n      }\n      this.state = 428;\n      this._errHandler.sync(this);\n      _alt = this._interp.adaptivePredict(this._input, 47, this._ctx);\n    }\n  } catch (error) {\n    if (error instanceof antlr4.error.RecognitionException) {\n      localctx.exception = error;\n      this._errHandler.reportError(this, error);\n      this._errHandler.recover(this, error);\n    } else {\n      throw error;\n    }\n  } finally {\n    this.unrollRecursionContexts(_parentctx);\n  }\n  return localctx;\n};\n\nfunction TermContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_term;\n  return this;\n}\n\nTermContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nTermContext.prototype.constructor = TermContext;\n\nTermContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction TermStrContext(parser, ctx) {\n  TermContext.call(this, parser);\n  this.str = null; // StringOrBareStringContext;\n  TermContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTermStrContext.prototype = Object.create(TermContext.prototype);\nTermStrContext.prototype.constructor = TermStrContext;\n\nScrollQLParser.TermStrContext = TermStrContext;\n\nTermStrContext.prototype.stringOrBareString = function() {\n  return this.getTypedRuleContext(StringOrBareStringContext, 0);\n};\nTermStrContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTermStr(this);\n  }\n};\n\nTermStrContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTermStr(this);\n  }\n};\n\nfunction TermIdContext(parser, ctx) {\n  TermContext.call(this, parser);\n  this.fid = null; // FieldIdContext;\n  TermContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTermIdContext.prototype = Object.create(TermContext.prototype);\nTermIdContext.prototype.constructor = TermIdContext;\n\nScrollQLParser.TermIdContext = TermIdContext;\n\nTermIdContext.prototype.fieldId = function() {\n  return this.getTypedRuleContext(FieldIdContext, 0);\n};\nTermIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTermId(this);\n  }\n};\n\nTermIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTermId(this);\n  }\n};\n\nfunction TermFnContext(parser, ctx) {\n  TermContext.call(this, parser);\n  this.fn = null; // FuncContext;\n  TermContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTermFnContext.prototype = Object.create(TermContext.prototype);\nTermFnContext.prototype.constructor = TermFnContext;\n\nScrollQLParser.TermFnContext = TermFnContext;\n\nTermFnContext.prototype.func = function() {\n  return this.getTypedRuleContext(FuncContext, 0);\n};\nTermFnContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTermFn(this);\n  }\n};\n\nTermFnContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTermFn(this);\n  }\n};\n\nfunction TermNumContext(parser, ctx) {\n  TermContext.call(this, parser);\n  this.num = null; // NumberContext;\n  TermContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTermNumContext.prototype = Object.create(TermContext.prototype);\nTermNumContext.prototype.constructor = TermNumContext;\n\nScrollQLParser.TermNumContext = TermNumContext;\n\nTermNumContext.prototype.number = function() {\n  return this.getTypedRuleContext(NumberContext, 0);\n};\nTermNumContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTermNum(this);\n  }\n};\n\nTermNumContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTermNum(this);\n  }\n};\n\nScrollQLParser.TermContext = TermContext;\n\nScrollQLParser.prototype.term = function() {\n  var localctx = new TermContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 60, ScrollQLParser.RULE_term);\n  try {\n    this.state = 433;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 48, this._ctx);\n    switch (la_) {\n      case 1:\n        localctx = new TermIdContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 429;\n        localctx.fid = this.fieldId();\n        break;\n\n      case 2:\n        localctx = new TermNumContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 430;\n        localctx.num = this.number();\n        break;\n\n      case 3:\n        localctx = new TermStrContext(this, localctx);\n        this.enterOuterAlt(localctx, 3);\n        this.state = 431;\n        localctx.str = this.stringOrBareString();\n        break;\n\n      case 4:\n        localctx = new TermFnContext(this, localctx);\n        this.enterOuterAlt(localctx, 4);\n        this.state = 432;\n        localctx.fn = this.func();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LikeTermContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_likeTerm;\n  this.re = null; // RegexContext\n  this.str = null; // RegexStringContext\n  return this;\n}\n\nLikeTermContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLikeTermContext.prototype.constructor = LikeTermContext;\n\nLikeTermContext.prototype.regex = function() {\n  return this.getTypedRuleContext(RegexContext, 0);\n};\n\nLikeTermContext.prototype.regexString = function() {\n  return this.getTypedRuleContext(RegexStringContext, 0);\n};\n\nLikeTermContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLikeTerm(this);\n  }\n};\n\nLikeTermContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLikeTerm(this);\n  }\n};\n\nScrollQLParser.LikeTermContext = LikeTermContext;\n\nScrollQLParser.prototype.likeTerm = function() {\n  var localctx = new LikeTermContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 62, ScrollQLParser.RULE_likeTerm);\n  try {\n    this.state = 437;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.REGEX:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 435;\n        localctx.re = this.regex();\n        break;\n      case ScrollQLParser.RE_SDQUOTED_STRING:\n      case ScrollQLParser.RE_SSQUOTED_STRING:\n      case ScrollQLParser.RE_CDQUOTED_STRING:\n      case ScrollQLParser.RE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 436;\n        localctx.str = this.regexString();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction FuncContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_func;\n  return this;\n}\n\nFuncContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFuncContext.prototype.constructor = FuncContext;\n\nFuncContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction FunctionWithArgsContext(parser, ctx) {\n  FuncContext.call(this, parser);\n  this.fun = null; // FunctionIdContext;\n  this._functionArg = null; // FunctionArgContext;\n  this.Args = []; // of FunctionArgContexts;\n  FuncContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nFunctionWithArgsContext.prototype = Object.create(FuncContext.prototype);\nFunctionWithArgsContext.prototype.constructor = FunctionWithArgsContext;\n\nScrollQLParser.FunctionWithArgsContext = FunctionWithArgsContext;\n\nFunctionWithArgsContext.prototype.SYM_LPAREN = function() {\n  return this.getToken(ScrollQLParser.SYM_LPAREN, 0);\n};\n\nFunctionWithArgsContext.prototype.SYM_RPAREN = function() {\n  return this.getToken(ScrollQLParser.SYM_RPAREN, 0);\n};\n\nFunctionWithArgsContext.prototype.functionId = function() {\n  return this.getTypedRuleContext(FunctionIdContext, 0);\n};\n\nFunctionWithArgsContext.prototype.functionArg = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(FunctionArgContext);\n  } else {\n    return this.getTypedRuleContext(FunctionArgContext, i);\n  }\n};\n\nFunctionWithArgsContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nFunctionWithArgsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFunctionWithArgs(this);\n  }\n};\n\nFunctionWithArgsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFunctionWithArgs(this);\n  }\n};\n\nfunction FunctionWithNoArgsContext(parser, ctx) {\n  FuncContext.call(this, parser);\n  this.fun = null; // FunctionIdContext;\n  FuncContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nFunctionWithNoArgsContext.prototype = Object.create(FuncContext.prototype);\nFunctionWithNoArgsContext.prototype.constructor = FunctionWithNoArgsContext;\n\nScrollQLParser.FunctionWithNoArgsContext = FunctionWithNoArgsContext;\n\nFunctionWithNoArgsContext.prototype.SYM_LPAREN = function() {\n  return this.getToken(ScrollQLParser.SYM_LPAREN, 0);\n};\n\nFunctionWithNoArgsContext.prototype.SYM_RPAREN = function() {\n  return this.getToken(ScrollQLParser.SYM_RPAREN, 0);\n};\n\nFunctionWithNoArgsContext.prototype.functionId = function() {\n  return this.getTypedRuleContext(FunctionIdContext, 0);\n};\n\nFunctionWithNoArgsContext.prototype.SYM_MUL = function() {\n  return this.getToken(ScrollQLParser.SYM_MUL, 0);\n};\nFunctionWithNoArgsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFunctionWithNoArgs(this);\n  }\n};\n\nFunctionWithNoArgsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFunctionWithNoArgs(this);\n  }\n};\n\nScrollQLParser.FuncContext = FuncContext;\n\nScrollQLParser.prototype.func = function() {\n  var localctx = new FuncContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 64, ScrollQLParser.RULE_func);\n  var _la = 0; // Token type\n  try {\n    this.state = 458;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 52, this._ctx);\n    switch (la_) {\n      case 1:\n        localctx = new FunctionWithArgsContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 439;\n        localctx.fun = this.functionId();\n        this.state = 440;\n        this.match(ScrollQLParser.SYM_LPAREN);\n        this.state = 441;\n        localctx._functionArg = this.functionArg();\n        localctx.Args.push(localctx._functionArg);\n        this.state = 446;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while (_la === ScrollQLParser.SYM_COMMA) {\n          this.state = 442;\n          this.match(ScrollQLParser.SYM_COMMA);\n          this.state = 443;\n          localctx._functionArg = this.functionArg();\n          localctx.Args.push(localctx._functionArg);\n          this.state = 448;\n          this._errHandler.sync(this);\n          _la = this._input.LA(1);\n        }\n        this.state = 449;\n        this.match(ScrollQLParser.SYM_RPAREN);\n        break;\n\n      case 2:\n        localctx = new FunctionWithNoArgsContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 451;\n        localctx.fun = this.functionId();\n        this.state = 452;\n        this.match(ScrollQLParser.SYM_LPAREN);\n        this.state = 454;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        if (_la === ScrollQLParser.SYM_MUL) {\n          this.state = 453;\n          this.match(ScrollQLParser.SYM_MUL);\n        }\n\n        this.state = 456;\n        this.match(ScrollQLParser.SYM_RPAREN);\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction FunctionArgContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_functionArg;\n  return this;\n}\n\nFunctionArgContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFunctionArgContext.prototype.constructor = FunctionArgContext;\n\nFunctionArgContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction FunctionArgFieldClauseContext(parser, ctx) {\n  FunctionArgContext.call(this, parser);\n  FunctionArgContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nFunctionArgFieldClauseContext.prototype = Object.create(FunctionArgContext.prototype);\nFunctionArgFieldClauseContext.prototype.constructor = FunctionArgFieldClauseContext;\n\nScrollQLParser.FunctionArgFieldClauseContext = FunctionArgFieldClauseContext;\n\nFunctionArgFieldClauseContext.prototype.expression = function() {\n  return this.getTypedRuleContext(ExpressionContext, 0);\n};\nFunctionArgFieldClauseContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFunctionArgFieldClause(this);\n  }\n};\n\nFunctionArgFieldClauseContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFunctionArgFieldClause(this);\n  }\n};\n\nfunction FunctionArgTimePeriodContext(parser, ctx) {\n  FunctionArgContext.call(this, parser);\n  FunctionArgContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nFunctionArgTimePeriodContext.prototype = Object.create(FunctionArgContext.prototype);\nFunctionArgTimePeriodContext.prototype.constructor = FunctionArgTimePeriodContext;\n\nScrollQLParser.FunctionArgTimePeriodContext = FunctionArgTimePeriodContext;\n\nFunctionArgTimePeriodContext.prototype.relativeTimeExpr = function() {\n  return this.getTypedRuleContext(RelativeTimeExprContext, 0);\n};\nFunctionArgTimePeriodContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFunctionArgTimePeriod(this);\n  }\n};\n\nFunctionArgTimePeriodContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFunctionArgTimePeriod(this);\n  }\n};\n\nScrollQLParser.FunctionArgContext = FunctionArgContext;\n\nScrollQLParser.prototype.functionArg = function() {\n  var localctx = new FunctionArgContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 66, ScrollQLParser.RULE_functionArg);\n  try {\n    this.state = 462;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 53, this._ctx);\n    switch (la_) {\n      case 1:\n        localctx = new FunctionArgTimePeriodContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 460;\n        this.relativeTimeExpr();\n        break;\n\n      case 2:\n        localctx = new FunctionArgFieldClauseContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 461;\n        this.expression(0);\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction ArrayContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_array;\n  return this;\n}\n\nArrayContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nArrayContext.prototype.constructor = ArrayContext;\n\nArrayContext.prototype.SYM_LBRACKET = function() {\n  return this.getToken(ScrollQLParser.SYM_LBRACKET, 0);\n};\n\nArrayContext.prototype.arrayElem = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTypedRuleContexts(ArrayElemContext);\n  } else {\n    return this.getTypedRuleContext(ArrayElemContext, i);\n  }\n};\n\nArrayContext.prototype.SYM_RBRACKET = function() {\n  return this.getToken(ScrollQLParser.SYM_RBRACKET, 0);\n};\n\nArrayContext.prototype.SYM_COMMA = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_COMMA);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_COMMA, i);\n  }\n};\n\nArrayContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterArray(this);\n  }\n};\n\nArrayContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitArray(this);\n  }\n};\n\nScrollQLParser.ArrayContext = ArrayContext;\n\nScrollQLParser.prototype.array = function() {\n  var localctx = new ArrayContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 68, ScrollQLParser.RULE_array);\n  var _la = 0; // Token type\n  try {\n    this.state = 477;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 55, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 464;\n        this.match(ScrollQLParser.SYM_LBRACKET);\n        this.state = 465;\n        this.arrayElem();\n        this.state = 470;\n        this._errHandler.sync(this);\n        _la = this._input.LA(1);\n        while (_la === ScrollQLParser.SYM_COMMA) {\n          this.state = 466;\n          this.match(ScrollQLParser.SYM_COMMA);\n          this.state = 467;\n          this.arrayElem();\n          this.state = 472;\n          this._errHandler.sync(this);\n          _la = this._input.LA(1);\n        }\n        this.state = 473;\n        this.match(ScrollQLParser.SYM_RBRACKET);\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 475;\n        this.match(ScrollQLParser.SYM_LBRACKET);\n        this.state = 476;\n        this.match(ScrollQLParser.SYM_RBRACKET);\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction ArrayElemContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_arrayElem;\n  this.arrayElement = null; // StringContext\n  this.num = null; // NumberContext\n  return this;\n}\n\nArrayElemContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nArrayElemContext.prototype.constructor = ArrayElemContext;\n\nArrayElemContext.prototype.string = function() {\n  return this.getTypedRuleContext(StringContext, 0);\n};\n\nArrayElemContext.prototype.number = function() {\n  return this.getTypedRuleContext(NumberContext, 0);\n};\n\nArrayElemContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterArrayElem(this);\n  }\n};\n\nArrayElemContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitArrayElem(this);\n  }\n};\n\nScrollQLParser.ArrayElemContext = ArrayElemContext;\n\nScrollQLParser.prototype.arrayElem = function() {\n  var localctx = new ArrayElemContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 70, ScrollQLParser.RULE_arrayElem);\n  try {\n    this.state = 481;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.SDQUOTED_STRING:\n      case ScrollQLParser.SSQUOTED_STRING:\n      case ScrollQLParser.CDQUOTED_STRING:\n      case ScrollQLParser.CSQUOTED_STRING:\n      case ScrollQLParser.RE_SDQUOTED_STRING:\n      case ScrollQLParser.RE_SSQUOTED_STRING:\n      case ScrollQLParser.RE_CDQUOTED_STRING:\n      case ScrollQLParser.RE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 479;\n        localctx.arrayElement = this.string();\n        break;\n      case ScrollQLParser.LIT_INTEGER:\n      case ScrollQLParser.LIT_NUMBER:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 480;\n        localctx.num = this.number();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction NumberContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_number;\n  this.numF = null; // Token\n  this.numI = null; // Token\n  return this;\n}\n\nNumberContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nNumberContext.prototype.constructor = NumberContext;\n\nNumberContext.prototype.LIT_NUMBER = function() {\n  return this.getToken(ScrollQLParser.LIT_NUMBER, 0);\n};\n\nNumberContext.prototype.LIT_INTEGER = function() {\n  return this.getToken(ScrollQLParser.LIT_INTEGER, 0);\n};\n\nNumberContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterNumber(this);\n  }\n};\n\nNumberContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitNumber(this);\n  }\n};\n\nScrollQLParser.NumberContext = NumberContext;\n\nScrollQLParser.prototype.number = function() {\n  var localctx = new NumberContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 72, ScrollQLParser.RULE_number);\n  try {\n    this.state = 485;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.LIT_NUMBER:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 483;\n        localctx.numF = this.match(ScrollQLParser.LIT_NUMBER);\n        break;\n      case ScrollQLParser.LIT_INTEGER:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 484;\n        localctx.numI = this.match(ScrollQLParser.LIT_INTEGER);\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction StringContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_string;\n  this.sdqstr = null; // Token\n  this.ssqstr = null; // Token\n  this.cdqstr = null; // Token\n  this.csqstr = null; // Token\n  return this;\n}\n\nStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nStringContext.prototype.constructor = StringContext;\n\nStringContext.prototype.SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SDQUOTED_STRING, 0);\n};\n\nStringContext.prototype.RE_SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SDQUOTED_STRING, 0);\n};\n\nStringContext.prototype.SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SSQUOTED_STRING, 0);\n};\n\nStringContext.prototype.RE_SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SSQUOTED_STRING, 0);\n};\n\nStringContext.prototype.CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.CDQUOTED_STRING, 0);\n};\n\nStringContext.prototype.RE_CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CDQUOTED_STRING, 0);\n};\n\nStringContext.prototype.CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.CSQUOTED_STRING, 0);\n};\n\nStringContext.prototype.RE_CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CSQUOTED_STRING, 0);\n};\n\nStringContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterString(this);\n  }\n};\n\nStringContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitString(this);\n  }\n};\n\nScrollQLParser.StringContext = StringContext;\n\nScrollQLParser.prototype.string = function() {\n  var localctx = new StringContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 74, ScrollQLParser.RULE_string);\n  var _la = 0; // Token type\n  try {\n    this.state = 491;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.SDQUOTED_STRING:\n      case ScrollQLParser.RE_SDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 487;\n        localctx.sdqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.SDQUOTED_STRING || _la === ScrollQLParser.RE_SDQUOTED_STRING)) {\n          localctx.sdqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.SSQUOTED_STRING:\n      case ScrollQLParser.RE_SSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 488;\n        localctx.ssqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.SSQUOTED_STRING || _la === ScrollQLParser.RE_SSQUOTED_STRING)) {\n          localctx.ssqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.CDQUOTED_STRING:\n      case ScrollQLParser.RE_CDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 489;\n        localctx.cdqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.CDQUOTED_STRING || _la === ScrollQLParser.RE_CDQUOTED_STRING)) {\n          localctx.cdqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.CSQUOTED_STRING:\n      case ScrollQLParser.RE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 490;\n        localctx.csqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.CSQUOTED_STRING || _la === ScrollQLParser.RE_CSQUOTED_STRING)) {\n          localctx.csqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction StringOrBareStringContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_stringOrBareString;\n  this.sdqstr = null; // Token\n  this.ssqstr = null; // Token\n  this.cdqstr = null; // Token\n  this.csqstr = null; // Token\n  this.bstr = null; // Token\n  return this;\n}\n\nStringOrBareStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nStringOrBareStringContext.prototype.constructor = StringOrBareStringContext;\n\nStringOrBareStringContext.prototype.SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SDQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.RE_SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SDQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SSQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.RE_SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SSQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.CDQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.RE_CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CDQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.CSQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.RE_CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CSQUOTED_STRING, 0);\n};\n\nStringOrBareStringContext.prototype.RAW_ID = function() {\n  return this.getToken(ScrollQLParser.RAW_ID, 0);\n};\n\nStringOrBareStringContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterStringOrBareString(this);\n  }\n};\n\nStringOrBareStringContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitStringOrBareString(this);\n  }\n};\n\nScrollQLParser.StringOrBareStringContext = StringOrBareStringContext;\n\nScrollQLParser.prototype.stringOrBareString = function() {\n  var localctx = new StringOrBareStringContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 76, ScrollQLParser.RULE_stringOrBareString);\n  var _la = 0; // Token type\n  try {\n    this.state = 498;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.SDQUOTED_STRING:\n      case ScrollQLParser.RE_SDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 493;\n        localctx.sdqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.SDQUOTED_STRING || _la === ScrollQLParser.RE_SDQUOTED_STRING)) {\n          localctx.sdqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.SSQUOTED_STRING:\n      case ScrollQLParser.RE_SSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 494;\n        localctx.ssqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.SSQUOTED_STRING || _la === ScrollQLParser.RE_SSQUOTED_STRING)) {\n          localctx.ssqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.CDQUOTED_STRING:\n      case ScrollQLParser.RE_CDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 495;\n        localctx.cdqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.CDQUOTED_STRING || _la === ScrollQLParser.RE_CDQUOTED_STRING)) {\n          localctx.cdqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.CSQUOTED_STRING:\n      case ScrollQLParser.RE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 496;\n        localctx.csqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.CSQUOTED_STRING || _la === ScrollQLParser.RE_CSQUOTED_STRING)) {\n          localctx.csqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.RAW_ID:\n        this.enterOuterAlt(localctx, 5);\n        this.state = 497;\n        localctx.bstr = this.match(ScrollQLParser.RAW_ID);\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction RegexContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_regex;\n  return this;\n}\n\nRegexContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nRegexContext.prototype.constructor = RegexContext;\n\nRegexContext.prototype.REGEX = function() {\n  return this.getToken(ScrollQLParser.REGEX, 0);\n};\n\nRegexContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterRegex(this);\n  }\n};\n\nRegexContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitRegex(this);\n  }\n};\n\nScrollQLParser.RegexContext = RegexContext;\n\nScrollQLParser.prototype.regex = function() {\n  var localctx = new RegexContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 78, ScrollQLParser.RULE_regex);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 500;\n    this.match(ScrollQLParser.REGEX);\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction RegexStringContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_regexString;\n  this.sdqstr = null; // Token\n  this.ssqstr = null; // Token\n  this.cdqstr = null; // Token\n  this.csqstr = null; // Token\n  return this;\n}\n\nRegexStringContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nRegexStringContext.prototype.constructor = RegexStringContext;\n\nRegexStringContext.prototype.RE_SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SDQUOTED_STRING, 0);\n};\n\nRegexStringContext.prototype.RE_SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SSQUOTED_STRING, 0);\n};\n\nRegexStringContext.prototype.RE_CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CDQUOTED_STRING, 0);\n};\n\nRegexStringContext.prototype.RE_CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CSQUOTED_STRING, 0);\n};\n\nRegexStringContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterRegexString(this);\n  }\n};\n\nRegexStringContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitRegexString(this);\n  }\n};\n\nScrollQLParser.RegexStringContext = RegexStringContext;\n\nScrollQLParser.prototype.regexString = function() {\n  var localctx = new RegexStringContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 80, ScrollQLParser.RULE_regexString);\n  try {\n    this.state = 506;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.RE_SDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 502;\n        localctx.sdqstr = this.match(ScrollQLParser.RE_SDQUOTED_STRING);\n        break;\n      case ScrollQLParser.RE_SSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 503;\n        localctx.ssqstr = this.match(ScrollQLParser.RE_SSQUOTED_STRING);\n        break;\n      case ScrollQLParser.RE_CDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 504;\n        localctx.cdqstr = this.match(ScrollQLParser.RE_CDQUOTED_STRING);\n        break;\n      case ScrollQLParser.RE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 505;\n        localctx.csqstr = this.match(ScrollQLParser.RE_CSQUOTED_STRING);\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction LogIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_logId;\n  this.raw = null; // Token\n  this.keyw = null; // KeywordsContext\n  this.keywt = null; // TimeUnitKeywordsContext\n  this.sdqstr = null; // Token\n  this.ssqstr = null; // Token\n  this.cdqstr = null; // Token\n  this.csqstr = null; // Token\n  return this;\n}\n\nLogIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nLogIdContext.prototype.constructor = LogIdContext;\n\nLogIdContext.prototype.RAW_ID = function() {\n  return this.getToken(ScrollQLParser.RAW_ID, 0);\n};\n\nLogIdContext.prototype.keywords = function() {\n  return this.getTypedRuleContext(KeywordsContext, 0);\n};\n\nLogIdContext.prototype.timeUnitKeywords = function() {\n  return this.getTypedRuleContext(TimeUnitKeywordsContext, 0);\n};\n\nLogIdContext.prototype.SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SDQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.RE_SDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SDQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.SSQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.RE_SSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_SSQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.CDQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.RE_CDQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CDQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.CSQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.RE_CSQUOTED_STRING = function() {\n  return this.getToken(ScrollQLParser.RE_CSQUOTED_STRING, 0);\n};\n\nLogIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterLogId(this);\n  }\n};\n\nLogIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitLogId(this);\n  }\n};\n\nScrollQLParser.LogIdContext = LogIdContext;\n\nScrollQLParser.prototype.logId = function() {\n  var localctx = new LogIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 82, ScrollQLParser.RULE_logId);\n  var _la = 0; // Token type\n  try {\n    this.state = 515;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.RAW_ID:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 508;\n        localctx.raw = this.match(ScrollQLParser.RAW_ID);\n        break;\n      case ScrollQLParser.K_SOURCE:\n      case ScrollQLParser.K_START:\n      case ScrollQLParser.K_END:\n      case ScrollQLParser.K_NOW:\n      case ScrollQLParser.K_LIVE:\n      case ScrollQLParser.K_PARSE:\n      case ScrollQLParser.K_SEARCH:\n      case ScrollQLParser.K_FIELDS:\n      case ScrollQLParser.K_DISPLAY:\n      case ScrollQLParser.K_FILTER:\n      case ScrollQLParser.K_STATS:\n      case ScrollQLParser.K_SORT:\n      case ScrollQLParser.K_ORDER:\n      case ScrollQLParser.K_ASC:\n      case ScrollQLParser.K_DESC:\n      case ScrollQLParser.K_HEAD:\n      case ScrollQLParser.K_LIMIT:\n      case ScrollQLParser.K_TAIL:\n      case ScrollQLParser.K_REGEX:\n      case ScrollQLParser.K_IN:\n      case ScrollQLParser.K_GROUP:\n      case ScrollQLParser.K_BY:\n      case ScrollQLParser.K_AS:\n      case ScrollQLParser.K_AND:\n      case ScrollQLParser.K_OR:\n      case ScrollQLParser.K_NOT:\n      case ScrollQLParser.K_LIKE:\n      case ScrollQLParser.K_MATCHES:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 509;\n        localctx.keyw = this.keywords();\n        break;\n      case ScrollQLParser.K_TU_MS:\n      case ScrollQLParser.K_TU_MSEC:\n      case ScrollQLParser.K_TU_MSECOND:\n      case ScrollQLParser.K_TU_S:\n      case ScrollQLParser.K_TU_SEC:\n      case ScrollQLParser.K_TU_SECOND:\n      case ScrollQLParser.K_TU_M:\n      case ScrollQLParser.K_TU_MIN:\n      case ScrollQLParser.K_TU_MINUTE:\n      case ScrollQLParser.K_TU_H:\n      case ScrollQLParser.K_TU_HR:\n      case ScrollQLParser.K_TU_HOUR:\n      case ScrollQLParser.K_TU_D:\n      case ScrollQLParser.K_TU_DAY:\n      case ScrollQLParser.K_TU_W:\n      case ScrollQLParser.K_TU_WEEK:\n      case ScrollQLParser.K_TU_MO:\n      case ScrollQLParser.K_TU_MON:\n      case ScrollQLParser.K_TU_MONTH:\n      case ScrollQLParser.K_TU_Q:\n      case ScrollQLParser.K_TU_QTR:\n      case ScrollQLParser.K_TU_QUARTER:\n      case ScrollQLParser.K_TU_Y:\n      case ScrollQLParser.K_TU_YR:\n      case ScrollQLParser.K_TU_YEAR:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 510;\n        localctx.keywt = this.timeUnitKeywords();\n        break;\n      case ScrollQLParser.SDQUOTED_STRING:\n      case ScrollQLParser.RE_SDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 4);\n        this.state = 511;\n        localctx.sdqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.SDQUOTED_STRING || _la === ScrollQLParser.RE_SDQUOTED_STRING)) {\n          localctx.sdqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.SSQUOTED_STRING:\n      case ScrollQLParser.RE_SSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 5);\n        this.state = 512;\n        localctx.ssqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.SSQUOTED_STRING || _la === ScrollQLParser.RE_SSQUOTED_STRING)) {\n          localctx.ssqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.CDQUOTED_STRING:\n      case ScrollQLParser.RE_CDQUOTED_STRING:\n        this.enterOuterAlt(localctx, 6);\n        this.state = 513;\n        localctx.cdqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.CDQUOTED_STRING || _la === ScrollQLParser.RE_CDQUOTED_STRING)) {\n          localctx.cdqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.CSQUOTED_STRING:\n      case ScrollQLParser.RE_CSQUOTED_STRING:\n        this.enterOuterAlt(localctx, 7);\n        this.state = 514;\n        localctx.csqstr = this._input.LT(1);\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.CSQUOTED_STRING || _la === ScrollQLParser.RE_CSQUOTED_STRING)) {\n          localctx.csqstr = this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction FieldIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_fieldId;\n  this.uid = null; // UserIdContext\n  this.sid = null; // SystemIdContext\n  return this;\n}\n\nFieldIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFieldIdContext.prototype.constructor = FieldIdContext;\n\nFieldIdContext.prototype.userId = function() {\n  return this.getTypedRuleContext(UserIdContext, 0);\n};\n\nFieldIdContext.prototype.systemId = function() {\n  return this.getTypedRuleContext(SystemIdContext, 0);\n};\n\nFieldIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFieldId(this);\n  }\n};\n\nFieldIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFieldId(this);\n  }\n};\n\nScrollQLParser.FieldIdContext = FieldIdContext;\n\nScrollQLParser.prototype.fieldId = function() {\n  var localctx = new FieldIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 84, ScrollQLParser.RULE_fieldId);\n  try {\n    this.state = 519;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 62, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 517;\n        localctx.uid = this.userId();\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 518;\n        localctx.sid = this.systemId();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction AliasIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_aliasId;\n  this.uid = null; // UserIdContext\n  this.sid = null; // SystemIdContext\n  return this;\n}\n\nAliasIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nAliasIdContext.prototype.constructor = AliasIdContext;\n\nAliasIdContext.prototype.userId = function() {\n  return this.getTypedRuleContext(UserIdContext, 0);\n};\n\nAliasIdContext.prototype.systemId = function() {\n  return this.getTypedRuleContext(SystemIdContext, 0);\n};\n\nAliasIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterAliasId(this);\n  }\n};\n\nAliasIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitAliasId(this);\n  }\n};\n\nScrollQLParser.AliasIdContext = AliasIdContext;\n\nScrollQLParser.prototype.aliasId = function() {\n  var localctx = new AliasIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 86, ScrollQLParser.RULE_aliasId);\n  try {\n    this.state = 523;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 63, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 521;\n        localctx.uid = this.userId();\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 522;\n        localctx.sid = this.systemId();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction UserIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_userId;\n  this.usid = null; // UnquotedUserIdContext\n  this.qsid = null; // QuotedUserIdContext\n  return this;\n}\n\nUserIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nUserIdContext.prototype.constructor = UserIdContext;\n\nUserIdContext.prototype.unquotedUserId = function() {\n  return this.getTypedRuleContext(UnquotedUserIdContext, 0);\n};\n\nUserIdContext.prototype.quotedUserId = function() {\n  return this.getTypedRuleContext(QuotedUserIdContext, 0);\n};\n\nUserIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterUserId(this);\n  }\n};\n\nUserIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitUserId(this);\n  }\n};\n\nScrollQLParser.UserIdContext = UserIdContext;\n\nScrollQLParser.prototype.userId = function() {\n  var localctx = new UserIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 88, ScrollQLParser.RULE_userId);\n  try {\n    this.state = 527;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.K_SOURCE:\n      case ScrollQLParser.K_START:\n      case ScrollQLParser.K_END:\n      case ScrollQLParser.K_NOW:\n      case ScrollQLParser.K_LIVE:\n      case ScrollQLParser.K_PARSE:\n      case ScrollQLParser.K_SEARCH:\n      case ScrollQLParser.K_FIELDS:\n      case ScrollQLParser.K_DISPLAY:\n      case ScrollQLParser.K_FILTER:\n      case ScrollQLParser.K_STATS:\n      case ScrollQLParser.K_SORT:\n      case ScrollQLParser.K_ORDER:\n      case ScrollQLParser.K_ASC:\n      case ScrollQLParser.K_DESC:\n      case ScrollQLParser.K_HEAD:\n      case ScrollQLParser.K_LIMIT:\n      case ScrollQLParser.K_TAIL:\n      case ScrollQLParser.K_REGEX:\n      case ScrollQLParser.K_IN:\n      case ScrollQLParser.K_GROUP:\n      case ScrollQLParser.K_BY:\n      case ScrollQLParser.K_AS:\n      case ScrollQLParser.K_AND:\n      case ScrollQLParser.K_OR:\n      case ScrollQLParser.K_NOT:\n      case ScrollQLParser.K_LIKE:\n      case ScrollQLParser.K_MATCHES:\n      case ScrollQLParser.K_TU_MS:\n      case ScrollQLParser.K_TU_MSEC:\n      case ScrollQLParser.K_TU_MSECOND:\n      case ScrollQLParser.K_TU_S:\n      case ScrollQLParser.K_TU_SEC:\n      case ScrollQLParser.K_TU_SECOND:\n      case ScrollQLParser.K_TU_M:\n      case ScrollQLParser.K_TU_MIN:\n      case ScrollQLParser.K_TU_MINUTE:\n      case ScrollQLParser.K_TU_H:\n      case ScrollQLParser.K_TU_HR:\n      case ScrollQLParser.K_TU_HOUR:\n      case ScrollQLParser.K_TU_D:\n      case ScrollQLParser.K_TU_DAY:\n      case ScrollQLParser.K_TU_W:\n      case ScrollQLParser.K_TU_WEEK:\n      case ScrollQLParser.K_TU_MO:\n      case ScrollQLParser.K_TU_MON:\n      case ScrollQLParser.K_TU_MONTH:\n      case ScrollQLParser.K_TU_Q:\n      case ScrollQLParser.K_TU_QTR:\n      case ScrollQLParser.K_TU_QUARTER:\n      case ScrollQLParser.K_TU_Y:\n      case ScrollQLParser.K_TU_YR:\n      case ScrollQLParser.K_TU_YEAR:\n      case ScrollQLParser.RAW_ID:\n      case ScrollQLParser.SYM_AT:\n      case ScrollQLParser.RE_RAW_ID:\n      case ScrollQLParser.RE_SYM_AT:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 525;\n        localctx.usid = this.unquotedUserId();\n        break;\n      case ScrollQLParser.QUOTED_IDENT:\n      case ScrollQLParser.RE_QUOTED_IDENT:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 526;\n        localctx.qsid = this.quotedUserId();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction UnquotedUserIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_unquotedUserId;\n  this.uubid = null; // UnquotedUserBareIdContext\n  this.uuaid = null; // UnquotedUserAtIdContext\n  return this;\n}\n\nUnquotedUserIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nUnquotedUserIdContext.prototype.constructor = UnquotedUserIdContext;\n\nUnquotedUserIdContext.prototype.unquotedUserBareId = function() {\n  return this.getTypedRuleContext(UnquotedUserBareIdContext, 0);\n};\n\nUnquotedUserIdContext.prototype.unquotedUserAtId = function() {\n  return this.getTypedRuleContext(UnquotedUserAtIdContext, 0);\n};\n\nUnquotedUserIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterUnquotedUserId(this);\n  }\n};\n\nUnquotedUserIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitUnquotedUserId(this);\n  }\n};\n\nScrollQLParser.UnquotedUserIdContext = UnquotedUserIdContext;\n\nScrollQLParser.prototype.unquotedUserId = function() {\n  var localctx = new UnquotedUserIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 90, ScrollQLParser.RULE_unquotedUserId);\n  try {\n    this.state = 531;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.K_SOURCE:\n      case ScrollQLParser.K_START:\n      case ScrollQLParser.K_END:\n      case ScrollQLParser.K_NOW:\n      case ScrollQLParser.K_LIVE:\n      case ScrollQLParser.K_PARSE:\n      case ScrollQLParser.K_SEARCH:\n      case ScrollQLParser.K_FIELDS:\n      case ScrollQLParser.K_DISPLAY:\n      case ScrollQLParser.K_FILTER:\n      case ScrollQLParser.K_STATS:\n      case ScrollQLParser.K_SORT:\n      case ScrollQLParser.K_ORDER:\n      case ScrollQLParser.K_ASC:\n      case ScrollQLParser.K_DESC:\n      case ScrollQLParser.K_HEAD:\n      case ScrollQLParser.K_LIMIT:\n      case ScrollQLParser.K_TAIL:\n      case ScrollQLParser.K_REGEX:\n      case ScrollQLParser.K_IN:\n      case ScrollQLParser.K_GROUP:\n      case ScrollQLParser.K_BY:\n      case ScrollQLParser.K_AS:\n      case ScrollQLParser.K_AND:\n      case ScrollQLParser.K_OR:\n      case ScrollQLParser.K_NOT:\n      case ScrollQLParser.K_LIKE:\n      case ScrollQLParser.K_MATCHES:\n      case ScrollQLParser.K_TU_MS:\n      case ScrollQLParser.K_TU_MSEC:\n      case ScrollQLParser.K_TU_MSECOND:\n      case ScrollQLParser.K_TU_S:\n      case ScrollQLParser.K_TU_SEC:\n      case ScrollQLParser.K_TU_SECOND:\n      case ScrollQLParser.K_TU_M:\n      case ScrollQLParser.K_TU_MIN:\n      case ScrollQLParser.K_TU_MINUTE:\n      case ScrollQLParser.K_TU_H:\n      case ScrollQLParser.K_TU_HR:\n      case ScrollQLParser.K_TU_HOUR:\n      case ScrollQLParser.K_TU_D:\n      case ScrollQLParser.K_TU_DAY:\n      case ScrollQLParser.K_TU_W:\n      case ScrollQLParser.K_TU_WEEK:\n      case ScrollQLParser.K_TU_MO:\n      case ScrollQLParser.K_TU_MON:\n      case ScrollQLParser.K_TU_MONTH:\n      case ScrollQLParser.K_TU_Q:\n      case ScrollQLParser.K_TU_QTR:\n      case ScrollQLParser.K_TU_QUARTER:\n      case ScrollQLParser.K_TU_Y:\n      case ScrollQLParser.K_TU_YR:\n      case ScrollQLParser.K_TU_YEAR:\n      case ScrollQLParser.RAW_ID:\n      case ScrollQLParser.RE_RAW_ID:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 529;\n        localctx.uubid = this.unquotedUserBareId();\n        break;\n      case ScrollQLParser.SYM_AT:\n      case ScrollQLParser.RE_SYM_AT:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 530;\n        localctx.uuaid = this.unquotedUserAtId();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction UnquotedUserAtIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_unquotedUserAtId;\n  return this;\n}\n\nUnquotedUserAtIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nUnquotedUserAtIdContext.prototype.constructor = UnquotedUserAtIdContext;\n\nUnquotedUserAtIdContext.prototype.rawId = function() {\n  return this.getTypedRuleContext(RawIdContext, 0);\n};\n\nUnquotedUserAtIdContext.prototype.SYM_AT = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.SYM_AT);\n  } else {\n    return this.getToken(ScrollQLParser.SYM_AT, i);\n  }\n};\n\nUnquotedUserAtIdContext.prototype.RE_SYM_AT = function(i) {\n  if (i === undefined) {\n    i = null;\n  }\n  if (i === null) {\n    return this.getTokens(ScrollQLParser.RE_SYM_AT);\n  } else {\n    return this.getToken(ScrollQLParser.RE_SYM_AT, i);\n  }\n};\n\nUnquotedUserAtIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterUnquotedUserAtId(this);\n  }\n};\n\nUnquotedUserAtIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitUnquotedUserAtId(this);\n  }\n};\n\nScrollQLParser.UnquotedUserAtIdContext = UnquotedUserAtIdContext;\n\nScrollQLParser.prototype.unquotedUserAtId = function() {\n  var localctx = new UnquotedUserAtIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 92, ScrollQLParser.RULE_unquotedUserAtId);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 533;\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.SYM_AT || _la === ScrollQLParser.RE_SYM_AT)) {\n      this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n    this.state = 535;\n    this._errHandler.sync(this);\n    _la = this._input.LA(1);\n    do {\n      this.state = 534;\n      _la = this._input.LA(1);\n      if (!(_la === ScrollQLParser.SYM_AT || _la === ScrollQLParser.RE_SYM_AT)) {\n        this._errHandler.recoverInline(this);\n      } else {\n        this._errHandler.reportMatch(this);\n        this.consume();\n      }\n      this.state = 537;\n      this._errHandler.sync(this);\n      _la = this._input.LA(1);\n    } while (_la === ScrollQLParser.SYM_AT || _la === ScrollQLParser.RE_SYM_AT);\n    this.state = 539;\n    this.rawId();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction UnquotedUserBareIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_unquotedUserBareId;\n  this.uid = null; // RawIdContext\n  return this;\n}\n\nUnquotedUserBareIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nUnquotedUserBareIdContext.prototype.constructor = UnquotedUserBareIdContext;\n\nUnquotedUserBareIdContext.prototype.rawId = function() {\n  return this.getTypedRuleContext(RawIdContext, 0);\n};\n\nUnquotedUserBareIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterUnquotedUserBareId(this);\n  }\n};\n\nUnquotedUserBareIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitUnquotedUserBareId(this);\n  }\n};\n\nScrollQLParser.UnquotedUserBareIdContext = UnquotedUserBareIdContext;\n\nScrollQLParser.prototype.unquotedUserBareId = function() {\n  var localctx = new UnquotedUserBareIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 94, ScrollQLParser.RULE_unquotedUserBareId);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 541;\n    localctx.uid = this.rawId();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction QuotedUserIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_quotedUserId;\n  this.qid = null; // Token\n  return this;\n}\n\nQuotedUserIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQuotedUserIdContext.prototype.constructor = QuotedUserIdContext;\n\nQuotedUserIdContext.prototype.QUOTED_IDENT = function() {\n  return this.getToken(ScrollQLParser.QUOTED_IDENT, 0);\n};\n\nQuotedUserIdContext.prototype.RE_QUOTED_IDENT = function() {\n  return this.getToken(ScrollQLParser.RE_QUOTED_IDENT, 0);\n};\n\nQuotedUserIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterQuotedUserId(this);\n  }\n};\n\nQuotedUserIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitQuotedUserId(this);\n  }\n};\n\nScrollQLParser.QuotedUserIdContext = QuotedUserIdContext;\n\nScrollQLParser.prototype.quotedUserId = function() {\n  var localctx = new QuotedUserIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 96, ScrollQLParser.RULE_quotedUserId);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 543;\n    localctx.qid = this._input.LT(1);\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.QUOTED_IDENT || _la === ScrollQLParser.RE_QUOTED_IDENT)) {\n      localctx.qid = this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction SystemIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_systemId;\n  this.usid = null; // UnquotedSystemIdContext\n  this.qsid = null; // QuotedSystemIdContext\n  return this;\n}\n\nSystemIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nSystemIdContext.prototype.constructor = SystemIdContext;\n\nSystemIdContext.prototype.unquotedSystemId = function() {\n  return this.getTypedRuleContext(UnquotedSystemIdContext, 0);\n};\n\nSystemIdContext.prototype.quotedSystemId = function() {\n  return this.getTypedRuleContext(QuotedSystemIdContext, 0);\n};\n\nSystemIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterSystemId(this);\n  }\n};\n\nSystemIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitSystemId(this);\n  }\n};\n\nScrollQLParser.SystemIdContext = SystemIdContext;\n\nScrollQLParser.prototype.systemId = function() {\n  var localctx = new SystemIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 98, ScrollQLParser.RULE_systemId);\n  try {\n    this.state = 547;\n    this._errHandler.sync(this);\n    var la_ = this._interp.adaptivePredict(this._input, 67, this._ctx);\n    switch (la_) {\n      case 1:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 545;\n        localctx.usid = this.unquotedSystemId();\n        break;\n\n      case 2:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 546;\n        localctx.qsid = this.quotedSystemId();\n        break;\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction UnquotedSystemIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_unquotedSystemId;\n  this.udid = null; // RawIdContext\n  return this;\n}\n\nUnquotedSystemIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nUnquotedSystemIdContext.prototype.constructor = UnquotedSystemIdContext;\n\nUnquotedSystemIdContext.prototype.SYM_AT = function() {\n  return this.getToken(ScrollQLParser.SYM_AT, 0);\n};\n\nUnquotedSystemIdContext.prototype.RE_SYM_AT = function() {\n  return this.getToken(ScrollQLParser.RE_SYM_AT, 0);\n};\n\nUnquotedSystemIdContext.prototype.rawId = function() {\n  return this.getTypedRuleContext(RawIdContext, 0);\n};\n\nUnquotedSystemIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterUnquotedSystemId(this);\n  }\n};\n\nUnquotedSystemIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitUnquotedSystemId(this);\n  }\n};\n\nScrollQLParser.UnquotedSystemIdContext = UnquotedSystemIdContext;\n\nScrollQLParser.prototype.unquotedSystemId = function() {\n  var localctx = new UnquotedSystemIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 100, ScrollQLParser.RULE_unquotedSystemId);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 549;\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.SYM_AT || _la === ScrollQLParser.RE_SYM_AT)) {\n      this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n    this.state = 550;\n    localctx.udid = this.rawId();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction QuotedSystemIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_quotedSystemId;\n  this.qid = null; // Token\n  return this;\n}\n\nQuotedSystemIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nQuotedSystemIdContext.prototype.constructor = QuotedSystemIdContext;\n\nQuotedSystemIdContext.prototype.SYM_AT = function() {\n  return this.getToken(ScrollQLParser.SYM_AT, 0);\n};\n\nQuotedSystemIdContext.prototype.RE_SYM_AT = function() {\n  return this.getToken(ScrollQLParser.RE_SYM_AT, 0);\n};\n\nQuotedSystemIdContext.prototype.QUOTED_IDENT = function() {\n  return this.getToken(ScrollQLParser.QUOTED_IDENT, 0);\n};\n\nQuotedSystemIdContext.prototype.RE_QUOTED_IDENT = function() {\n  return this.getToken(ScrollQLParser.RE_QUOTED_IDENT, 0);\n};\n\nQuotedSystemIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterQuotedSystemId(this);\n  }\n};\n\nQuotedSystemIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitQuotedSystemId(this);\n  }\n};\n\nScrollQLParser.QuotedSystemIdContext = QuotedSystemIdContext;\n\nScrollQLParser.prototype.quotedSystemId = function() {\n  var localctx = new QuotedSystemIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 102, ScrollQLParser.RULE_quotedSystemId);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 552;\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.SYM_AT || _la === ScrollQLParser.RE_SYM_AT)) {\n      this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n    this.state = 553;\n    localctx.qid = this._input.LT(1);\n    _la = this._input.LA(1);\n    if (!(_la === ScrollQLParser.QUOTED_IDENT || _la === ScrollQLParser.RE_QUOTED_IDENT)) {\n      localctx.qid = this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction ResultIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_resultId;\n  return this;\n}\n\nResultIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nResultIdContext.prototype.constructor = ResultIdContext;\n\nResultIdContext.prototype.rawId = function() {\n  return this.getTypedRuleContext(RawIdContext, 0);\n};\n\nResultIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterResultId(this);\n  }\n};\n\nResultIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitResultId(this);\n  }\n};\n\nScrollQLParser.ResultIdContext = ResultIdContext;\n\nScrollQLParser.prototype.resultId = function() {\n  var localctx = new ResultIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 104, ScrollQLParser.RULE_resultId);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 555;\n    this.rawId();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction FunctionIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_functionId;\n  return this;\n}\n\nFunctionIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nFunctionIdContext.prototype.constructor = FunctionIdContext;\n\nFunctionIdContext.prototype.rawId = function() {\n  return this.getTypedRuleContext(RawIdContext, 0);\n};\n\nFunctionIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterFunctionId(this);\n  }\n};\n\nFunctionIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitFunctionId(this);\n  }\n};\n\nScrollQLParser.FunctionIdContext = FunctionIdContext;\n\nScrollQLParser.prototype.functionId = function() {\n  var localctx = new FunctionIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 106, ScrollQLParser.RULE_functionId);\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 557;\n    this.rawId();\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction RawIdContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_rawId;\n  return this;\n}\n\nRawIdContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nRawIdContext.prototype.constructor = RawIdContext;\n\nRawIdContext.prototype.RAW_ID = function() {\n  return this.getToken(ScrollQLParser.RAW_ID, 0);\n};\n\nRawIdContext.prototype.RE_RAW_ID = function() {\n  return this.getToken(ScrollQLParser.RE_RAW_ID, 0);\n};\n\nRawIdContext.prototype.keywords = function() {\n  return this.getTypedRuleContext(KeywordsContext, 0);\n};\n\nRawIdContext.prototype.timeUnitKeywords = function() {\n  return this.getTypedRuleContext(TimeUnitKeywordsContext, 0);\n};\n\nRawIdContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterRawId(this);\n  }\n};\n\nRawIdContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitRawId(this);\n  }\n};\n\nScrollQLParser.RawIdContext = RawIdContext;\n\nScrollQLParser.prototype.rawId = function() {\n  var localctx = new RawIdContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 108, ScrollQLParser.RULE_rawId);\n  var _la = 0; // Token type\n  try {\n    this.state = 562;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.RAW_ID:\n      case ScrollQLParser.RE_RAW_ID:\n        this.enterOuterAlt(localctx, 1);\n        this.state = 559;\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.RAW_ID || _la === ScrollQLParser.RE_RAW_ID)) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_SOURCE:\n      case ScrollQLParser.K_START:\n      case ScrollQLParser.K_END:\n      case ScrollQLParser.K_NOW:\n      case ScrollQLParser.K_LIVE:\n      case ScrollQLParser.K_PARSE:\n      case ScrollQLParser.K_SEARCH:\n      case ScrollQLParser.K_FIELDS:\n      case ScrollQLParser.K_DISPLAY:\n      case ScrollQLParser.K_FILTER:\n      case ScrollQLParser.K_STATS:\n      case ScrollQLParser.K_SORT:\n      case ScrollQLParser.K_ORDER:\n      case ScrollQLParser.K_ASC:\n      case ScrollQLParser.K_DESC:\n      case ScrollQLParser.K_HEAD:\n      case ScrollQLParser.K_LIMIT:\n      case ScrollQLParser.K_TAIL:\n      case ScrollQLParser.K_REGEX:\n      case ScrollQLParser.K_IN:\n      case ScrollQLParser.K_GROUP:\n      case ScrollQLParser.K_BY:\n      case ScrollQLParser.K_AS:\n      case ScrollQLParser.K_AND:\n      case ScrollQLParser.K_OR:\n      case ScrollQLParser.K_NOT:\n      case ScrollQLParser.K_LIKE:\n      case ScrollQLParser.K_MATCHES:\n        this.enterOuterAlt(localctx, 2);\n        this.state = 560;\n        this.keywords();\n        break;\n      case ScrollQLParser.K_TU_MS:\n      case ScrollQLParser.K_TU_MSEC:\n      case ScrollQLParser.K_TU_MSECOND:\n      case ScrollQLParser.K_TU_S:\n      case ScrollQLParser.K_TU_SEC:\n      case ScrollQLParser.K_TU_SECOND:\n      case ScrollQLParser.K_TU_M:\n      case ScrollQLParser.K_TU_MIN:\n      case ScrollQLParser.K_TU_MINUTE:\n      case ScrollQLParser.K_TU_H:\n      case ScrollQLParser.K_TU_HR:\n      case ScrollQLParser.K_TU_HOUR:\n      case ScrollQLParser.K_TU_D:\n      case ScrollQLParser.K_TU_DAY:\n      case ScrollQLParser.K_TU_W:\n      case ScrollQLParser.K_TU_WEEK:\n      case ScrollQLParser.K_TU_MO:\n      case ScrollQLParser.K_TU_MON:\n      case ScrollQLParser.K_TU_MONTH:\n      case ScrollQLParser.K_TU_Q:\n      case ScrollQLParser.K_TU_QTR:\n      case ScrollQLParser.K_TU_QUARTER:\n      case ScrollQLParser.K_TU_Y:\n      case ScrollQLParser.K_TU_YR:\n      case ScrollQLParser.K_TU_YEAR:\n        this.enterOuterAlt(localctx, 3);\n        this.state = 561;\n        this.timeUnitKeywords();\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction KeywordsContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_keywords;\n  return this;\n}\n\nKeywordsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nKeywordsContext.prototype.constructor = KeywordsContext;\n\nKeywordsContext.prototype.K_SOURCE = function() {\n  return this.getToken(ScrollQLParser.K_SOURCE, 0);\n};\n\nKeywordsContext.prototype.K_START = function() {\n  return this.getToken(ScrollQLParser.K_START, 0);\n};\n\nKeywordsContext.prototype.K_END = function() {\n  return this.getToken(ScrollQLParser.K_END, 0);\n};\n\nKeywordsContext.prototype.K_NOW = function() {\n  return this.getToken(ScrollQLParser.K_NOW, 0);\n};\n\nKeywordsContext.prototype.K_LIVE = function() {\n  return this.getToken(ScrollQLParser.K_LIVE, 0);\n};\n\nKeywordsContext.prototype.K_PARSE = function() {\n  return this.getToken(ScrollQLParser.K_PARSE, 0);\n};\n\nKeywordsContext.prototype.K_SEARCH = function() {\n  return this.getToken(ScrollQLParser.K_SEARCH, 0);\n};\n\nKeywordsContext.prototype.K_FIELDS = function() {\n  return this.getToken(ScrollQLParser.K_FIELDS, 0);\n};\n\nKeywordsContext.prototype.K_DISPLAY = function() {\n  return this.getToken(ScrollQLParser.K_DISPLAY, 0);\n};\n\nKeywordsContext.prototype.K_FILTER = function() {\n  return this.getToken(ScrollQLParser.K_FILTER, 0);\n};\n\nKeywordsContext.prototype.K_STATS = function() {\n  return this.getToken(ScrollQLParser.K_STATS, 0);\n};\n\nKeywordsContext.prototype.K_GROUP = function() {\n  return this.getToken(ScrollQLParser.K_GROUP, 0);\n};\n\nKeywordsContext.prototype.K_BY = function() {\n  return this.getToken(ScrollQLParser.K_BY, 0);\n};\n\nKeywordsContext.prototype.K_AS = function() {\n  return this.getToken(ScrollQLParser.K_AS, 0);\n};\n\nKeywordsContext.prototype.K_SORT = function() {\n  return this.getToken(ScrollQLParser.K_SORT, 0);\n};\n\nKeywordsContext.prototype.K_ORDER = function() {\n  return this.getToken(ScrollQLParser.K_ORDER, 0);\n};\n\nKeywordsContext.prototype.K_ASC = function() {\n  return this.getToken(ScrollQLParser.K_ASC, 0);\n};\n\nKeywordsContext.prototype.K_DESC = function() {\n  return this.getToken(ScrollQLParser.K_DESC, 0);\n};\n\nKeywordsContext.prototype.K_HEAD = function() {\n  return this.getToken(ScrollQLParser.K_HEAD, 0);\n};\n\nKeywordsContext.prototype.K_TAIL = function() {\n  return this.getToken(ScrollQLParser.K_TAIL, 0);\n};\n\nKeywordsContext.prototype.K_LIMIT = function() {\n  return this.getToken(ScrollQLParser.K_LIMIT, 0);\n};\n\nKeywordsContext.prototype.K_AND = function() {\n  return this.getToken(ScrollQLParser.K_AND, 0);\n};\n\nKeywordsContext.prototype.K_OR = function() {\n  return this.getToken(ScrollQLParser.K_OR, 0);\n};\n\nKeywordsContext.prototype.K_NOT = function() {\n  return this.getToken(ScrollQLParser.K_NOT, 0);\n};\n\nKeywordsContext.prototype.K_LIKE = function() {\n  return this.getToken(ScrollQLParser.K_LIKE, 0);\n};\n\nKeywordsContext.prototype.K_MATCHES = function() {\n  return this.getToken(ScrollQLParser.K_MATCHES, 0);\n};\n\nKeywordsContext.prototype.K_REGEX = function() {\n  return this.getToken(ScrollQLParser.K_REGEX, 0);\n};\n\nKeywordsContext.prototype.K_IN = function() {\n  return this.getToken(ScrollQLParser.K_IN, 0);\n};\n\nKeywordsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterKeywords(this);\n  }\n};\n\nKeywordsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitKeywords(this);\n  }\n};\n\nScrollQLParser.KeywordsContext = KeywordsContext;\n\nScrollQLParser.prototype.keywords = function() {\n  var localctx = new KeywordsContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 110, ScrollQLParser.RULE_keywords);\n  var _la = 0; // Token type\n  try {\n    this.enterOuterAlt(localctx, 1);\n    this.state = 564;\n    _la = this._input.LA(1);\n    if (\n      !(\n        (_la & ~0x1f) == 0 &&\n        ((1 << _la) &\n          ((1 << ScrollQLParser.K_SOURCE) |\n            (1 << ScrollQLParser.K_START) |\n            (1 << ScrollQLParser.K_END) |\n            (1 << ScrollQLParser.K_NOW) |\n            (1 << ScrollQLParser.K_LIVE) |\n            (1 << ScrollQLParser.K_PARSE) |\n            (1 << ScrollQLParser.K_SEARCH) |\n            (1 << ScrollQLParser.K_FIELDS) |\n            (1 << ScrollQLParser.K_DISPLAY) |\n            (1 << ScrollQLParser.K_FILTER) |\n            (1 << ScrollQLParser.K_STATS) |\n            (1 << ScrollQLParser.K_SORT) |\n            (1 << ScrollQLParser.K_ORDER) |\n            (1 << ScrollQLParser.K_ASC) |\n            (1 << ScrollQLParser.K_DESC) |\n            (1 << ScrollQLParser.K_HEAD) |\n            (1 << ScrollQLParser.K_LIMIT) |\n            (1 << ScrollQLParser.K_TAIL) |\n            (1 << ScrollQLParser.K_REGEX) |\n            (1 << ScrollQLParser.K_IN) |\n            (1 << ScrollQLParser.K_GROUP) |\n            (1 << ScrollQLParser.K_BY) |\n            (1 << ScrollQLParser.K_AS) |\n            (1 << ScrollQLParser.K_AND) |\n            (1 << ScrollQLParser.K_OR) |\n            (1 << ScrollQLParser.K_NOT) |\n            (1 << ScrollQLParser.K_LIKE) |\n            (1 << ScrollQLParser.K_MATCHES))) !==\n          0\n      )\n    ) {\n      this._errHandler.recoverInline(this);\n    } else {\n      this._errHandler.reportMatch(this);\n      this.consume();\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nfunction TimeUnitKeywordsContext(parser, parent, invokingState) {\n  if (parent === undefined) {\n    parent = null;\n  }\n  if (invokingState === undefined || invokingState === null) {\n    invokingState = -1;\n  }\n  antlr4.ParserRuleContext.call(this, parent, invokingState);\n  this.parser = parser;\n  this.ruleIndex = ScrollQLParser.RULE_timeUnitKeywords;\n  return this;\n}\n\nTimeUnitKeywordsContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);\nTimeUnitKeywordsContext.prototype.constructor = TimeUnitKeywordsContext;\n\nTimeUnitKeywordsContext.prototype.copyFrom = function(ctx) {\n  antlr4.ParserRuleContext.prototype.copyFrom.call(this, ctx);\n};\n\nfunction TimeUnitYearsContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitYearsContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitYearsContext.prototype.constructor = TimeUnitYearsContext;\n\nScrollQLParser.TimeUnitYearsContext = TimeUnitYearsContext;\n\nTimeUnitYearsContext.prototype.K_TU_Y = function() {\n  return this.getToken(ScrollQLParser.K_TU_Y, 0);\n};\n\nTimeUnitYearsContext.prototype.K_TU_YR = function() {\n  return this.getToken(ScrollQLParser.K_TU_YR, 0);\n};\n\nTimeUnitYearsContext.prototype.K_TU_YEAR = function() {\n  return this.getToken(ScrollQLParser.K_TU_YEAR, 0);\n};\nTimeUnitYearsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitYears(this);\n  }\n};\n\nTimeUnitYearsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitYears(this);\n  }\n};\n\nfunction TimeUnitMinutesContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitMinutesContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitMinutesContext.prototype.constructor = TimeUnitMinutesContext;\n\nScrollQLParser.TimeUnitMinutesContext = TimeUnitMinutesContext;\n\nTimeUnitMinutesContext.prototype.K_TU_M = function() {\n  return this.getToken(ScrollQLParser.K_TU_M, 0);\n};\n\nTimeUnitMinutesContext.prototype.K_TU_MIN = function() {\n  return this.getToken(ScrollQLParser.K_TU_MIN, 0);\n};\n\nTimeUnitMinutesContext.prototype.K_TU_MINUTE = function() {\n  return this.getToken(ScrollQLParser.K_TU_MINUTE, 0);\n};\nTimeUnitMinutesContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitMinutes(this);\n  }\n};\n\nTimeUnitMinutesContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitMinutes(this);\n  }\n};\n\nfunction TimeUnitHoursContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitHoursContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitHoursContext.prototype.constructor = TimeUnitHoursContext;\n\nScrollQLParser.TimeUnitHoursContext = TimeUnitHoursContext;\n\nTimeUnitHoursContext.prototype.K_TU_H = function() {\n  return this.getToken(ScrollQLParser.K_TU_H, 0);\n};\n\nTimeUnitHoursContext.prototype.K_TU_HR = function() {\n  return this.getToken(ScrollQLParser.K_TU_HR, 0);\n};\n\nTimeUnitHoursContext.prototype.K_TU_HOUR = function() {\n  return this.getToken(ScrollQLParser.K_TU_HOUR, 0);\n};\nTimeUnitHoursContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitHours(this);\n  }\n};\n\nTimeUnitHoursContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitHours(this);\n  }\n};\n\nfunction TimeUnitWeeksContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitWeeksContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitWeeksContext.prototype.constructor = TimeUnitWeeksContext;\n\nScrollQLParser.TimeUnitWeeksContext = TimeUnitWeeksContext;\n\nTimeUnitWeeksContext.prototype.K_TU_W = function() {\n  return this.getToken(ScrollQLParser.K_TU_W, 0);\n};\n\nTimeUnitWeeksContext.prototype.K_TU_WEEK = function() {\n  return this.getToken(ScrollQLParser.K_TU_WEEK, 0);\n};\nTimeUnitWeeksContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitWeeks(this);\n  }\n};\n\nTimeUnitWeeksContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitWeeks(this);\n  }\n};\n\nfunction TimeUnitDaysContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitDaysContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitDaysContext.prototype.constructor = TimeUnitDaysContext;\n\nScrollQLParser.TimeUnitDaysContext = TimeUnitDaysContext;\n\nTimeUnitDaysContext.prototype.K_TU_D = function() {\n  return this.getToken(ScrollQLParser.K_TU_D, 0);\n};\n\nTimeUnitDaysContext.prototype.K_TU_DAY = function() {\n  return this.getToken(ScrollQLParser.K_TU_DAY, 0);\n};\nTimeUnitDaysContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitDays(this);\n  }\n};\n\nTimeUnitDaysContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitDays(this);\n  }\n};\n\nfunction TimeUnitMonthsContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitMonthsContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitMonthsContext.prototype.constructor = TimeUnitMonthsContext;\n\nScrollQLParser.TimeUnitMonthsContext = TimeUnitMonthsContext;\n\nTimeUnitMonthsContext.prototype.K_TU_MO = function() {\n  return this.getToken(ScrollQLParser.K_TU_MO, 0);\n};\n\nTimeUnitMonthsContext.prototype.K_TU_MON = function() {\n  return this.getToken(ScrollQLParser.K_TU_MON, 0);\n};\n\nTimeUnitMonthsContext.prototype.K_TU_MONTH = function() {\n  return this.getToken(ScrollQLParser.K_TU_MONTH, 0);\n};\nTimeUnitMonthsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitMonths(this);\n  }\n};\n\nTimeUnitMonthsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitMonths(this);\n  }\n};\n\nfunction TimeUnitQuartersContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitQuartersContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitQuartersContext.prototype.constructor = TimeUnitQuartersContext;\n\nScrollQLParser.TimeUnitQuartersContext = TimeUnitQuartersContext;\n\nTimeUnitQuartersContext.prototype.K_TU_Q = function() {\n  return this.getToken(ScrollQLParser.K_TU_Q, 0);\n};\n\nTimeUnitQuartersContext.prototype.K_TU_QTR = function() {\n  return this.getToken(ScrollQLParser.K_TU_QTR, 0);\n};\n\nTimeUnitQuartersContext.prototype.K_TU_QUARTER = function() {\n  return this.getToken(ScrollQLParser.K_TU_QUARTER, 0);\n};\nTimeUnitQuartersContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitQuarters(this);\n  }\n};\n\nTimeUnitQuartersContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitQuarters(this);\n  }\n};\n\nfunction TimeUnitMilliSecondsContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitMilliSecondsContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitMilliSecondsContext.prototype.constructor = TimeUnitMilliSecondsContext;\n\nScrollQLParser.TimeUnitMilliSecondsContext = TimeUnitMilliSecondsContext;\n\nTimeUnitMilliSecondsContext.prototype.K_TU_MS = function() {\n  return this.getToken(ScrollQLParser.K_TU_MS, 0);\n};\n\nTimeUnitMilliSecondsContext.prototype.K_TU_MSEC = function() {\n  return this.getToken(ScrollQLParser.K_TU_MSEC, 0);\n};\n\nTimeUnitMilliSecondsContext.prototype.K_TU_MSECOND = function() {\n  return this.getToken(ScrollQLParser.K_TU_MSECOND, 0);\n};\nTimeUnitMilliSecondsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitMilliSeconds(this);\n  }\n};\n\nTimeUnitMilliSecondsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitMilliSeconds(this);\n  }\n};\n\nfunction TimeUnitSecondsContext(parser, ctx) {\n  TimeUnitKeywordsContext.call(this, parser);\n  TimeUnitKeywordsContext.prototype.copyFrom.call(this, ctx);\n  return this;\n}\n\nTimeUnitSecondsContext.prototype = Object.create(TimeUnitKeywordsContext.prototype);\nTimeUnitSecondsContext.prototype.constructor = TimeUnitSecondsContext;\n\nScrollQLParser.TimeUnitSecondsContext = TimeUnitSecondsContext;\n\nTimeUnitSecondsContext.prototype.K_TU_S = function() {\n  return this.getToken(ScrollQLParser.K_TU_S, 0);\n};\n\nTimeUnitSecondsContext.prototype.K_TU_SEC = function() {\n  return this.getToken(ScrollQLParser.K_TU_SEC, 0);\n};\n\nTimeUnitSecondsContext.prototype.K_TU_SECOND = function() {\n  return this.getToken(ScrollQLParser.K_TU_SECOND, 0);\n};\nTimeUnitSecondsContext.prototype.enterRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.enterTimeUnitSeconds(this);\n  }\n};\n\nTimeUnitSecondsContext.prototype.exitRule = function(listener) {\n  if (listener instanceof ScrollQLParserListener) {\n    listener.exitTimeUnitSeconds(this);\n  }\n};\n\nScrollQLParser.TimeUnitKeywordsContext = TimeUnitKeywordsContext;\n\nScrollQLParser.prototype.timeUnitKeywords = function() {\n  var localctx = new TimeUnitKeywordsContext(this, this._ctx, this.state);\n  this.enterRule(localctx, 112, ScrollQLParser.RULE_timeUnitKeywords);\n  var _la = 0; // Token type\n  try {\n    this.state = 575;\n    this._errHandler.sync(this);\n    switch (this._input.LA(1)) {\n      case ScrollQLParser.K_TU_MS:\n      case ScrollQLParser.K_TU_MSEC:\n      case ScrollQLParser.K_TU_MSECOND:\n        localctx = new TimeUnitMilliSecondsContext(this, localctx);\n        this.enterOuterAlt(localctx, 1);\n        this.state = 566;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 31) & ~0x1f) == 0 &&\n            ((1 << (_la - 31)) &\n              ((1 << (ScrollQLParser.K_TU_MS - 31)) |\n                (1 << (ScrollQLParser.K_TU_MSEC - 31)) |\n                (1 << (ScrollQLParser.K_TU_MSECOND - 31)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_S:\n      case ScrollQLParser.K_TU_SEC:\n      case ScrollQLParser.K_TU_SECOND:\n        localctx = new TimeUnitSecondsContext(this, localctx);\n        this.enterOuterAlt(localctx, 2);\n        this.state = 567;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 34) & ~0x1f) == 0 &&\n            ((1 << (_la - 34)) &\n              ((1 << (ScrollQLParser.K_TU_S - 34)) |\n                (1 << (ScrollQLParser.K_TU_SEC - 34)) |\n                (1 << (ScrollQLParser.K_TU_SECOND - 34)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_M:\n      case ScrollQLParser.K_TU_MIN:\n      case ScrollQLParser.K_TU_MINUTE:\n        localctx = new TimeUnitMinutesContext(this, localctx);\n        this.enterOuterAlt(localctx, 3);\n        this.state = 568;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 37) & ~0x1f) == 0 &&\n            ((1 << (_la - 37)) &\n              ((1 << (ScrollQLParser.K_TU_M - 37)) |\n                (1 << (ScrollQLParser.K_TU_MIN - 37)) |\n                (1 << (ScrollQLParser.K_TU_MINUTE - 37)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_H:\n      case ScrollQLParser.K_TU_HR:\n      case ScrollQLParser.K_TU_HOUR:\n        localctx = new TimeUnitHoursContext(this, localctx);\n        this.enterOuterAlt(localctx, 4);\n        this.state = 569;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 40) & ~0x1f) == 0 &&\n            ((1 << (_la - 40)) &\n              ((1 << (ScrollQLParser.K_TU_H - 40)) |\n                (1 << (ScrollQLParser.K_TU_HR - 40)) |\n                (1 << (ScrollQLParser.K_TU_HOUR - 40)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_D:\n      case ScrollQLParser.K_TU_DAY:\n        localctx = new TimeUnitDaysContext(this, localctx);\n        this.enterOuterAlt(localctx, 5);\n        this.state = 570;\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.K_TU_D || _la === ScrollQLParser.K_TU_DAY)) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_W:\n      case ScrollQLParser.K_TU_WEEK:\n        localctx = new TimeUnitWeeksContext(this, localctx);\n        this.enterOuterAlt(localctx, 6);\n        this.state = 571;\n        _la = this._input.LA(1);\n        if (!(_la === ScrollQLParser.K_TU_W || _la === ScrollQLParser.K_TU_WEEK)) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_MO:\n      case ScrollQLParser.K_TU_MON:\n      case ScrollQLParser.K_TU_MONTH:\n        localctx = new TimeUnitMonthsContext(this, localctx);\n        this.enterOuterAlt(localctx, 7);\n        this.state = 572;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 47) & ~0x1f) == 0 &&\n            ((1 << (_la - 47)) &\n              ((1 << (ScrollQLParser.K_TU_MO - 47)) |\n                (1 << (ScrollQLParser.K_TU_MON - 47)) |\n                (1 << (ScrollQLParser.K_TU_MONTH - 47)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_Q:\n      case ScrollQLParser.K_TU_QTR:\n      case ScrollQLParser.K_TU_QUARTER:\n        localctx = new TimeUnitQuartersContext(this, localctx);\n        this.enterOuterAlt(localctx, 8);\n        this.state = 573;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 50) & ~0x1f) == 0 &&\n            ((1 << (_la - 50)) &\n              ((1 << (ScrollQLParser.K_TU_Q - 50)) |\n                (1 << (ScrollQLParser.K_TU_QTR - 50)) |\n                (1 << (ScrollQLParser.K_TU_QUARTER - 50)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      case ScrollQLParser.K_TU_Y:\n      case ScrollQLParser.K_TU_YR:\n      case ScrollQLParser.K_TU_YEAR:\n        localctx = new TimeUnitYearsContext(this, localctx);\n        this.enterOuterAlt(localctx, 9);\n        this.state = 574;\n        _la = this._input.LA(1);\n        if (\n          !(\n            ((_la - 53) & ~0x1f) == 0 &&\n            ((1 << (_la - 53)) &\n              ((1 << (ScrollQLParser.K_TU_Y - 53)) |\n                (1 << (ScrollQLParser.K_TU_YR - 53)) |\n                (1 << (ScrollQLParser.K_TU_YEAR - 53)))) !==\n              0\n          )\n        ) {\n          this._errHandler.recoverInline(this);\n        } else {\n          this._errHandler.reportMatch(this);\n          this.consume();\n        }\n        break;\n      default:\n        throw new antlr4.error.NoViableAltException(this);\n    }\n  } catch (re) {\n    if (re instanceof antlr4.error.RecognitionException) {\n      localctx.exception = re;\n      this._errHandler.reportError(this, re);\n      this._errHandler.recover(this, re);\n    } else {\n      throw re;\n    }\n  } finally {\n    this.exitRule();\n  }\n  return localctx;\n};\n\nScrollQLParser.prototype.sempred = function(localctx, ruleIndex, predIndex) {\n  switch (ruleIndex) {\n    case 22:\n      return this.searchExpr_sempred(localctx, predIndex);\n    case 29:\n      return this.expression_sempred(localctx, predIndex);\n    default:\n      throw 'No predicate with index:' + ruleIndex;\n  }\n};\n\nScrollQLParser.prototype.searchExpr_sempred = function(localctx, predIndex) {\n  switch (predIndex) {\n    case 0:\n      return this.precpred(this._ctx, 3);\n    case 1:\n      return this.precpred(this._ctx, 2);\n    default:\n      throw 'No predicate with index:' + predIndex;\n  }\n};\n\nScrollQLParser.prototype.expression_sempred = function(localctx, predIndex) {\n  switch (predIndex) {\n    case 2:\n      return this.precpred(this._ctx, 13);\n    case 3:\n      return this.precpred(this._ctx, 9);\n    case 4:\n      return this.precpred(this._ctx, 8);\n    case 5:\n      return this.precpred(this._ctx, 7);\n    case 6:\n      return this.precpred(this._ctx, 6);\n    case 7:\n      return this.precpred(this._ctx, 3);\n    case 8:\n      return this.precpred(this._ctx, 2);\n    case 9:\n      return this.precpred(this._ctx, 5);\n    case 10:\n      return this.precpred(this._ctx, 4);\n    default:\n      throw 'No predicate with index:' + predIndex;\n  }\n};\n\nexports.ScrollQLParser = ScrollQLParser;\n","var path = 'public/app/plugins/datasource/opentsdb/partials/annotations.editor.html';\nvar html = \"<div class=gf-form-group>\\n  <div class=gf-form>\\n    <span class=\\\"gf-form-label width-13\\\">OpenTSDB metrics query</span>\\n    <input type=text class=gf-form-input ng-model=ctrl.annotation.target placeholder=events.eventname>\\n  </div>\\n  <gf-form-switch class=gf-form label=\\\"Show Global Annotations?\\\" checked=ctrl.annotation.isGlobal switch-class=max-width-6 label-class=width-13></gf-form-switch>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { IconButton, IconName, stylesFactory, useTheme } from '@grafana/ui';\nimport React from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\ninterface QueryOperationActionProps {\n  icon: IconName;\n  title?: string;\n  onClick: (e: React.MouseEvent) => void;\n  disabled?: boolean;\n}\n\nexport const QueryOperationAction: React.FC<QueryOperationActionProps> = ({ icon, disabled, title, ...otherProps }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  const onClick = (e: React.MouseEvent) => {\n    if (!disabled) {\n      otherProps.onClick(e);\n    }\n  };\n  return (\n    <IconButton\n      name={icon}\n      title={title}\n      className={styles.icon}\n      disabled={!!disabled}\n      onClick={onClick}\n      surface=\"header\"\n      aria-label={selectors.components.QueryEditorRow.actionButton(title)}\n    />\n  );\n};\n\nQueryOperationAction.displayName = 'QueryOperationAction';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    icon: css`\n      color: ${theme.colors.textWeak};\n    `,\n  };\n});\n","import { updateLocation } from 'app/core/actions';\nimport config from 'app/core/config';\nimport { dateTimeFormat, dateTimeFormatTimeAgo } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { ThunkResult, LdapUser, UserSession, UserDTO } from 'app/types';\n\nimport {\n  userAdminPageLoadedAction,\n  userProfileLoadedAction,\n  userOrgsLoadedAction,\n  userSessionsLoadedAction,\n  userAdminPageFailedAction,\n  ldapConnectionInfoLoadedAction,\n  ldapSyncStatusLoadedAction,\n  userMappingInfoLoadedAction,\n  userMappingInfoFailedAction,\n  clearUserMappingInfoAction,\n  clearUserErrorAction,\n  ldapFailedAction,\n  usersFetched,\n  queryChanged,\n  pageChanged,\n} from './reducers';\nimport { debounce } from 'lodash';\n\n// UserAdminPage\n\nexport function loadAdminUserPage(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    try {\n      dispatch(userAdminPageLoadedAction(false));\n      await dispatch(loadUserProfile(userId));\n      await dispatch(loadUserOrgs(userId));\n      await dispatch(loadUserSessions(userId));\n      if (config.ldapEnabled && config.licenseInfo.hasLicense) {\n        await dispatch(loadLdapSyncStatus());\n      }\n      dispatch(userAdminPageLoadedAction(true));\n    } catch (error) {\n      console.log(error);\n      error.isHandled = true;\n      const userError = {\n        title: error.data.message,\n        body: error.data.error,\n      };\n      dispatch(userAdminPageFailedAction(userError));\n    }\n  };\n}\n\nexport function loadUserProfile(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    const user = await getBackendSrv().get(`/api/users/${userId}`);\n    dispatch(userProfileLoadedAction(user));\n  };\n}\n\nexport function updateUser(user: UserDTO): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().put(`/api/users/${user.id}`, user);\n    dispatch(loadAdminUserPage(user.id));\n  };\n}\n\nexport function setUserPassword(userId: number, password: string): ThunkResult<void> {\n  return async dispatch => {\n    const payload = { password };\n    await getBackendSrv().put(`/api/admin/users/${userId}/password`, payload);\n    dispatch(loadAdminUserPage(userId));\n  };\n}\n\nexport function disableUser(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().post(`/api/admin/users/${userId}/disable`);\n    // dispatch(loadAdminUserPage(userId));\n    dispatch(updateLocation({ path: '/admin/users' }));\n  };\n}\n\nexport function enableUser(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().post(`/api/admin/users/${userId}/enable`);\n    dispatch(loadAdminUserPage(userId));\n  };\n}\n\nexport function deleteUser(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().delete(`/api/admin/users/${userId}`);\n    dispatch(updateLocation({ path: '/admin/users' }));\n  };\n}\n\nexport function updateUserPermissions(userId: number, isGrafanaAdmin: boolean): ThunkResult<void> {\n  return async dispatch => {\n    const payload = { isGrafanaAdmin };\n    await getBackendSrv().put(`/api/admin/users/${userId}/permissions`, payload);\n    dispatch(loadAdminUserPage(userId));\n  };\n}\n\nexport function loadUserOrgs(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    const orgs = await getBackendSrv().get(`/api/users/${userId}/orgs`);\n    dispatch(userOrgsLoadedAction(orgs));\n  };\n}\n\nexport function addOrgUser(user: UserDTO, orgId: number, role: string): ThunkResult<void> {\n  return async dispatch => {\n    const payload = {\n      loginOrEmail: user.login,\n      role: role,\n    };\n    await getBackendSrv().post(`/api/orgs/${orgId}/users/`, payload);\n    dispatch(loadAdminUserPage(user.id));\n  };\n}\n\nexport function updateOrgUserRole(userId: number, orgId: number, role: string): ThunkResult<void> {\n  return async dispatch => {\n    const payload = { role };\n    await getBackendSrv().patch(`/api/orgs/${orgId}/users/${userId}`, payload);\n    dispatch(loadAdminUserPage(userId));\n  };\n}\n\nexport function deleteOrgUser(userId: number, orgId: number): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().delete(`/api/orgs/${orgId}/users/${userId}`);\n    dispatch(loadAdminUserPage(userId));\n  };\n}\n\nexport function loadUserSessions(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    const tokens = await getBackendSrv().get(`/api/admin/users/${userId}/auth-tokens`);\n    tokens.reverse();\n    const sessions = tokens.map((session: UserSession) => {\n      return {\n        id: session.id,\n        isActive: session.isActive,\n        seenAt: dateTimeFormatTimeAgo(session.seenAt),\n        createdAt: dateTimeFormat(session.createdAt, { format: 'MMMM DD, YYYY' }),\n        clientIp: session.clientIp,\n        browser: session.browser,\n        browserVersion: session.browserVersion,\n        os: session.os,\n        osVersion: session.osVersion,\n        device: session.device,\n      };\n    });\n    dispatch(userSessionsLoadedAction(sessions));\n  };\n}\n\nexport function revokeSession(tokenId: number, userId: number): ThunkResult<void> {\n  return async dispatch => {\n    const payload = { authTokenId: tokenId };\n    await getBackendSrv().post(`/api/admin/users/${userId}/revoke-auth-token`, payload);\n    dispatch(loadUserSessions(userId));\n  };\n}\n\nexport function revokeAllSessions(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().post(`/api/admin/users/${userId}/logout`);\n    dispatch(loadUserSessions(userId));\n  };\n}\n\n// LDAP user actions\n\nexport function loadLdapSyncStatus(): ThunkResult<void> {\n  return async dispatch => {\n    // Available only in enterprise\n    if (config.licenseInfo.hasLicense) {\n      const syncStatus = await getBackendSrv().get(`/api/admin/ldap-sync-status`);\n      dispatch(ldapSyncStatusLoadedAction(syncStatus));\n    }\n  };\n}\n\nexport function syncLdapUser(userId: number): ThunkResult<void> {\n  return async dispatch => {\n    await getBackendSrv().post(`/api/admin/ldap/sync/${userId}`);\n    dispatch(loadAdminUserPage(userId));\n  };\n}\n\n// LDAP debug page\n\nexport function loadLdapState(): ThunkResult<void> {\n  return async dispatch => {\n    try {\n      const connectionInfo = await getBackendSrv().get(`/api/admin/ldap/status`);\n      dispatch(ldapConnectionInfoLoadedAction(connectionInfo));\n    } catch (error) {\n      error.isHandled = true;\n      const ldapError = {\n        title: error.data.message,\n        body: error.data.error,\n      };\n      dispatch(ldapFailedAction(ldapError));\n    }\n  };\n}\n\nexport function loadUserMapping(username: string): ThunkResult<void> {\n  return async dispatch => {\n    try {\n      const response = await getBackendSrv().get(`/api/admin/ldap/${username}`);\n      const { name, surname, email, login, isGrafanaAdmin, isDisabled, roles, teams } = response;\n      const userInfo: LdapUser = {\n        info: { name, surname, email, login },\n        permissions: { isGrafanaAdmin, isDisabled },\n        roles,\n        teams,\n      };\n      dispatch(userMappingInfoLoadedAction(userInfo));\n    } catch (error) {\n      error.isHandled = true;\n      const userError = {\n        title: error.data.message,\n        body: error.data.error,\n      };\n      dispatch(clearUserMappingInfoAction());\n      dispatch(userMappingInfoFailedAction(userError));\n    }\n  };\n}\n\nexport function clearUserError(): ThunkResult<void> {\n  return dispatch => {\n    dispatch(clearUserErrorAction());\n  };\n}\n\nexport function clearUserMappingInfo(): ThunkResult<void> {\n  return dispatch => {\n    dispatch(clearUserErrorAction());\n    dispatch(clearUserMappingInfoAction());\n  };\n}\n\n// UserListAdminPage\n\nexport function fetchUsers(): ThunkResult<void> {\n  return async (dispatch, getState) => {\n    try {\n      const { perPage, page, query } = getState().userListAdmin;\n      const result = await getBackendSrv().get(`/api/users/search?perpage=${perPage}&page=${page}&query=${query}`);\n      dispatch(usersFetched(result));\n    } catch (error) {\n      console.error(error);\n    }\n  };\n}\n\nconst fetchUsersWithDebounce = debounce(dispatch => dispatch(fetchUsers()), 500);\n\nexport function changeQuery(query: string): ThunkResult<void> {\n  return async dispatch => {\n    dispatch(queryChanged(query));\n    fetchUsersWithDebounce(dispatch);\n  };\n}\n\nexport function changePage(page: number): ThunkResult<void> {\n  return async dispatch => {\n    dispatch(pageChanged(page));\n    dispatch(fetchUsers());\n  };\n}\n","import { Unsubscribable } from 'rxjs';\nimport {\n  HistoryItem,\n  DataQuery,\n  DataSourceApi,\n  QueryHint,\n  PanelData,\n  DataQueryRequest,\n  RawTimeRange,\n  LogLevel,\n  TimeRange,\n  LogsModel,\n  LogsDedupStrategy,\n  AbsoluteTimeRange,\n  GraphSeriesXY,\n  DataFrame,\n  ExploreMode,\n} from '@grafana/data';\n\nimport { Emitter } from 'app/core/core';\n\nexport enum ExploreId {\n  left = 'left',\n  right = 'right',\n}\n\n/**\n * Global Explore state\n */\nexport interface ExploreState {\n  /**\n   * True if split view is active.\n   */\n  split: boolean;\n  /**\n   * True if time interval for panels are synced. Only possible with split mode.\n   */\n  syncedTimes: boolean;\n  /**\n   * Explore state of the left split (left is default in non-split view).\n   */\n  left: ExploreItemState;\n  /**\n   * Explore state of the right area in split view.\n   */\n  right: ExploreItemState;\n  /**\n   * History of all queries\n   */\n  richHistory: RichHistoryQuery[];\n}\n\nexport interface ExploreItemState {\n  /**\n   * Width used for calculating the graph interval (can't have more datapoints than pixels)\n   */\n  containerWidth: number;\n  /**\n   * Datasource instance that has been selected. Datasource-specific logic can be run on this object.\n   */\n  datasourceInstance?: DataSourceApi;\n  /**\n   * Current data source name or null if default\n   */\n  requestedDatasourceName: string | null;\n  /**\n   * True if the datasource is loading. `null` if the loading has not started yet.\n   */\n  datasourceLoading?: boolean;\n  /**\n   * True if there is no datasource to be selected.\n   */\n  datasourceMissing: boolean;\n  /**\n   * Emitter to send events to the rest of Grafana.\n   */\n  eventBridge?: Emitter;\n  /**\n   * List of timeseries to be shown in the Explore graph result viewer.\n   */\n  graphResult?: GraphSeriesXY[];\n  /**\n   * History of recent queries. Datasource-specific and initialized via localStorage.\n   */\n  history: HistoryItem[];\n  /**\n   * Queries for this Explore, e.g., set via URL. Each query will be\n   * converted to a query row.\n   */\n  queries: DataQuery[];\n  /**\n   * True if this Explore area has been initialized.\n   * Used to distinguish URL state injection versus split view state injection.\n   */\n  initialized: boolean;\n  /**\n   * Log line substrings to be highlighted as you type in a query field.\n   * Currently supports only the first query row.\n   */\n  logsHighlighterExpressions?: string[];\n  /**\n   * Log query result to be displayed in the logs result viewer.\n   */\n  logsResult?: LogsModel;\n\n  /**\n   * Time range for this Explore. Managed by the time picker and used by all query runs.\n   */\n  range: TimeRange;\n\n  absoluteRange: AbsoluteTimeRange;\n  /**\n   * True if scanning for more results is active.\n   */\n  scanning?: boolean;\n  /**\n   * Current scanning range to be shown to the user while scanning is active.\n   */\n  scanRange?: RawTimeRange;\n  /**\n   * True if graph result viewer is expanded. Query runs will contain graph queries.\n   */\n  showingGraph: boolean;\n  /**\n   * True if table result viewer is expanded. Query runs will contain table queries.\n   */\n  showingTable: boolean;\n\n  loading: boolean;\n  /**\n   * Table model that combines all query table results into a single table.\n   */\n  tableResult?: DataFrame;\n\n  /**\n   * React keys for rendering of QueryRows\n   */\n  queryKeys: string[];\n\n  /**\n   * Current logs deduplication strategy\n   */\n  dedupStrategy?: LogsDedupStrategy;\n\n  /**\n   * Currently hidden log series\n   */\n  hiddenLogLevels?: LogLevel[];\n\n  /**\n   * How often query should be refreshed\n   */\n  refreshInterval?: string;\n\n  /**\n   * Copy of the state of the URL which is in store.location.query. This is duplicated here so we can diff the two\n   * after a change to see if we need to sync url state back to redux store (like on clicking Back in browser).\n   */\n  urlState: ExploreUrlState;\n\n  /**\n   * Map of what changed between real url and local urlState so we can partially update just the things that are needed.\n   */\n  update: ExploreUpdateState;\n\n  latency: number;\n  supportedModes: ExploreMode[];\n  mode: ExploreMode;\n\n  /**\n   * If true, the view is in live tailing mode.\n   */\n  isLive: boolean;\n\n  /**\n   * If true, the live tailing view is paused.\n   */\n  isPaused: boolean;\n  urlReplaced: boolean;\n\n  querySubscription?: Unsubscribable;\n\n  queryResponse: PanelData;\n\n  /**\n   * Panel Id that is set if we come to explore from a penel. Used so we can get back to it and optionally modify the\n   * query of that panel.\n   */\n  originPanelId?: number;\n}\n\nexport interface ExploreUpdateState {\n  datasource: boolean;\n  queries: boolean;\n  range: boolean;\n  mode: boolean;\n  ui: boolean;\n}\n\nexport interface ExploreUIState {\n  showingTable: boolean;\n  showingGraph: boolean;\n  showingLogs: boolean;\n  dedupStrategy?: LogsDedupStrategy;\n}\n\nexport interface ExploreUrlState {\n  datasource: string;\n  queries: any[]; // Should be a DataQuery, but we're going to strip refIds, so typing makes less sense\n  mode: ExploreMode;\n  range: RawTimeRange;\n  ui: ExploreUIState;\n  originPanelId?: number;\n  context?: string;\n}\n\nexport interface QueryOptions {\n  minInterval: string;\n  maxDataPoints?: number;\n  liveStreaming?: boolean;\n  showingGraph?: boolean;\n  showingTable?: boolean;\n  mode?: ExploreMode;\n}\n\nexport interface QueryTransaction {\n  id: string;\n  done: boolean;\n  error?: string | JSX.Element;\n  hints?: QueryHint[];\n  latency: number;\n  request: DataQueryRequest;\n  queries: DataQuery[];\n  result?: any; // Table model / Timeseries[] / Logs\n  scanning?: boolean;\n}\n\nexport type RichHistoryQuery = {\n  ts: number;\n  datasourceName: string;\n  datasourceId: string;\n  starred: boolean;\n  comment: string;\n  queries: DataQuery[];\n  sessionName: string;\n  timeRange?: string;\n};\n","import { DataSourcePluginOptionsEditorProps, SelectableValue, KeyValue, DataSourceSettings } from '../types';\n\nexport const onUpdateDatasourceOption = (props: DataSourcePluginOptionsEditorProps, key: keyof DataSourceSettings) => (\n  event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>\n) => {\n  updateDatasourcePluginOption(props, key, event.currentTarget.value);\n};\n\nexport const onUpdateDatasourceJsonDataOption = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K\n) => (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>) => {\n  updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.value);\n};\n\nexport const onUpdateDatasourceSecureJsonDataOption = <J, S extends {} = KeyValue>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: string\n) => (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>) => {\n  updateDatasourcePluginSecureJsonDataOption(props, key, event.currentTarget.value);\n};\n\nexport const onUpdateDatasourceJsonDataOptionSelect = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K\n) => (selected: SelectableValue) => {\n  updateDatasourcePluginJsonDataOption(props, key, selected.value);\n};\n\nexport const onUpdateDatasourceJsonDataOptionChecked = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K\n) => (event: React.SyntheticEvent<HTMLInputElement>) => {\n  updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.checked);\n};\n\nexport const onUpdateDatasourceSecureJsonDataOptionSelect = <J, S extends {} = KeyValue>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: string\n) => (selected: SelectableValue) => {\n  updateDatasourcePluginSecureJsonDataOption(props, key, selected.value);\n};\n\nexport const onUpdateDatasourceResetOption = (props: DataSourcePluginOptionsEditorProps, key: string) => (\n  event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n) => {\n  updateDatasourcePluginResetOption(props, key);\n};\n\nexport function updateDatasourcePluginOption(\n  props: DataSourcePluginOptionsEditorProps,\n  key: keyof DataSourceSettings,\n  val: any\n) {\n  const config = props.options;\n\n  props.onOptionsChange({\n    ...config,\n    [key]: val,\n  });\n}\n\nexport const updateDatasourcePluginJsonDataOption = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K,\n  val: any\n) => {\n  const config = props.options;\n\n  props.onOptionsChange({\n    ...config,\n    jsonData: {\n      ...config.jsonData,\n      [key]: val,\n    },\n  });\n};\n\nexport const updateDatasourcePluginSecureJsonDataOption = <J, S extends {} = KeyValue>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: string,\n  val: any\n) => {\n  const config = props.options;\n\n  props.onOptionsChange({\n    ...config,\n    secureJsonData: {\n      ...config.secureJsonData!,\n      [key]: val,\n    },\n  });\n};\n\nexport const updateDatasourcePluginResetOption = <J, S extends {} = KeyValue>(\n  props: DataSourcePluginOptionsEditorProps,\n  key: string\n) => {\n  const config = props.options;\n\n  props.onOptionsChange({\n    ...config,\n    secureJsonData: {\n      ...config.secureJsonData,\n      [key]: '',\n    },\n    secureJsonFields: {\n      ...config.secureJsonFields,\n      [key]: false,\n    },\n  });\n};\n","// Libraries\nimport Papa, { ParseResult, ParseConfig, Parser } from 'papaparse';\nimport defaults from 'lodash/defaults';\nimport isNumber from 'lodash/isNumber';\n\n// Types\nimport { DataFrame, Field, FieldType, FieldConfig } from '../types';\nimport { guessFieldTypeFromValue } from '../dataframe/processDataFrame';\nimport { MutableDataFrame } from '../dataframe/MutableDataFrame';\nimport { getFieldDisplayName } from '../field';\n\nexport enum CSVHeaderStyle {\n  full,\n  name,\n  none,\n}\n\n// Subset of all parse options\nexport interface CSVConfig {\n  delimiter?: string; // default: \",\"\n  newline?: string; // default: \"\\r\\n\"\n  quoteChar?: string; // default: '\"'\n  encoding?: string; // default: \"\",\n  headerStyle?: CSVHeaderStyle;\n}\n\nexport interface CSVParseCallbacks {\n  /**\n   * Get a callback before any rows are processed\n   * This can return a modified table to force any\n   * Column configurations\n   */\n  onHeader: (fields: Field[]) => void;\n\n  // Called after each row is read\n  onRow: (row: any[]) => void;\n}\n\nexport interface CSVOptions {\n  config?: CSVConfig;\n  callback?: CSVParseCallbacks;\n}\n\nexport function readCSV(csv: string, options?: CSVOptions): DataFrame[] {\n  return new CSVReader(options).readCSV(csv);\n}\n\nenum ParseState {\n  Starting,\n  InHeader,\n  ReadingRows,\n}\n\nexport class CSVReader {\n  config: CSVConfig;\n  callback?: CSVParseCallbacks;\n\n  state: ParseState;\n  data: MutableDataFrame[];\n  current: MutableDataFrame;\n\n  constructor(options?: CSVOptions) {\n    if (!options) {\n      options = {};\n    }\n    this.config = options.config || {};\n    this.callback = options.callback;\n\n    this.current = new MutableDataFrame({ fields: [] });\n    this.state = ParseState.Starting;\n    this.data = [];\n  }\n\n  // PapaParse callback on each line\n  private step = (results: ParseResult, parser: Parser): void => {\n    for (let i = 0; i < results.data.length; i++) {\n      const line: string[] = results.data[i];\n      if (line.length < 1) {\n        continue;\n      }\n      const first = line[0]; // null or value, papaparse does not return ''\n      if (first) {\n        // Comment or header queue\n        if (first.startsWith('#')) {\n          // Look for special header column\n          // #{columkey}#a,b,c\n          const idx = first.indexOf('#', 2);\n          if (idx > 0) {\n            const k = first.substr(1, idx - 1);\n            const isName = 'name' === k;\n\n            // Simple object used to check if headers match\n            const headerKeys: FieldConfig = {\n              unit: '#',\n            };\n\n            // Check if it is a known/supported column\n            if (isName || headerKeys.hasOwnProperty(k)) {\n              // Starting a new table after reading rows\n              if (this.state === ParseState.ReadingRows) {\n                this.current = new MutableDataFrame({ fields: [] });\n                this.data.push(this.current);\n              }\n\n              const v = first.substr(idx + 1);\n              if (isName) {\n                this.current.addFieldFor(undefined, v);\n                for (let j = 1; j < line.length; j++) {\n                  this.current.addFieldFor(undefined, line[j]);\n                }\n              } else {\n                const { fields } = this.current;\n                for (let j = 0; j < fields.length; j++) {\n                  if (!fields[j].config) {\n                    fields[j].config = {};\n                  }\n                  const disp = fields[j].config as any; // any lets name lookup\n                  disp[k] = j === 0 ? v : line[j];\n                }\n              }\n\n              this.state = ParseState.InHeader;\n              continue;\n            }\n          } else if (this.state === ParseState.Starting) {\n            this.state = ParseState.InHeader;\n            continue;\n          }\n          // Ignore comment lines\n          continue;\n        }\n\n        if (this.state === ParseState.Starting) {\n          const type = guessFieldTypeFromValue(first);\n          if (type === FieldType.string) {\n            for (const s of line) {\n              this.current.addFieldFor(undefined, s);\n            }\n            this.state = ParseState.InHeader;\n            continue;\n          }\n          this.state = ParseState.InHeader; // fall through to read rows\n        }\n      }\n\n      // Add the current results to the data\n      if (this.state !== ParseState.ReadingRows) {\n        // anything???\n      }\n\n      this.state = ParseState.ReadingRows;\n\n      // Make sure colum structure is valid\n      if (line.length > this.current.fields.length) {\n        const { fields } = this.current;\n        for (let f = fields.length; f < line.length; f++) {\n          this.current.addFieldFor(line[f]);\n        }\n        if (this.callback) {\n          this.callback.onHeader(this.current.fields);\n        }\n      }\n\n      this.current.appendRow(line);\n      if (this.callback) {\n        // // Send the header after we guess the type\n        // if (this.series.rows.length === 0) {\n        //   this.callback.onHeader(this.series);\n        // }\n        this.callback.onRow(line);\n      }\n    }\n  };\n\n  readCSV(text: string): MutableDataFrame[] {\n    this.current = new MutableDataFrame({ fields: [] });\n    this.data = [this.current];\n\n    const papacfg = {\n      ...this.config,\n      dynamicTyping: false,\n      skipEmptyLines: true,\n      comments: false, // Keep comment lines\n      step: this.step,\n    } as ParseConfig;\n\n    Papa.parse(text, papacfg);\n\n    return this.data;\n  }\n}\n\ntype FieldWriter = (value: any) => string;\n\nfunction writeValue(value: any, config: CSVConfig): string {\n  const str = value.toString();\n  if (str.includes('\"')) {\n    // Escape the double quote characters\n    return config.quoteChar + str.replace(/\"/gi, '\"\"') + config.quoteChar;\n  }\n  if (str.includes('\\n') || str.includes(config.delimiter)) {\n    return config.quoteChar + str + config.quoteChar;\n  }\n  return str;\n}\n\nfunction makeFieldWriter(field: Field, config: CSVConfig): FieldWriter {\n  if (field.type) {\n    if (field.type === FieldType.boolean) {\n      return (value: any) => {\n        return value ? 'true' : 'false';\n      };\n    }\n\n    if (field.type === FieldType.number) {\n      return (value: any) => {\n        if (isNumber(value)) {\n          return value.toString();\n        }\n        return writeValue(value, config);\n      };\n    }\n  }\n\n  return (value: any) => writeValue(value, config);\n}\n\nfunction getHeaderLine(key: string, fields: Field[], config: CSVConfig): string {\n  const isName = 'name' === key;\n  const isType = 'type' === key;\n\n  for (const f of fields) {\n    const display = f.config;\n    if (isName || isType || (display && display.hasOwnProperty(key))) {\n      let line = '#' + key + '#';\n      for (let i = 0; i < fields.length; i++) {\n        if (i > 0) {\n          line = line + config.delimiter;\n        }\n\n        let v: any = fields[i].name;\n        if (isType) {\n          v = fields[i].type;\n        } else if (isName) {\n          // already name\n        } else {\n          v = (fields[i].config as any)[key];\n        }\n        if (v) {\n          line = line + writeValue(v, config);\n        }\n      }\n      return line + config.newline;\n    }\n  }\n  return '';\n}\n\nexport function toCSV(data: DataFrame[], config?: CSVConfig): string {\n  if (!data) {\n    return '';\n  }\n\n  let csv = '';\n  config = defaults(config, {\n    delimiter: ',',\n    newline: '\\r\\n',\n    quoteChar: '\"',\n    encoding: '',\n    headerStyle: CSVHeaderStyle.name,\n  });\n\n  for (const series of data) {\n    const { fields } = series;\n\n    // ignore frames with no fields\n    if (fields.length === 0) {\n      continue;\n    }\n\n    if (config.headerStyle === CSVHeaderStyle.full) {\n      csv =\n        csv +\n        getHeaderLine('name', fields, config) +\n        getHeaderLine('type', fields, config) +\n        getHeaderLine('unit', fields, config) +\n        getHeaderLine('dateFormat', fields, config);\n    } else if (config.headerStyle === CSVHeaderStyle.name) {\n      for (let i = 0; i < fields.length; i++) {\n        if (i > 0) {\n          csv += config.delimiter;\n        }\n        csv += `\"${getFieldDisplayName(fields[i], series).replace(/\"/g, '\"\"')}\"`;\n      }\n      csv += config.newline;\n    }\n\n    const length = fields[0].values.length;\n\n    if (length > 0) {\n      const writers = fields.map(field => makeFieldWriter(field, config!));\n      for (let i = 0; i < length; i++) {\n        for (let j = 0; j < fields.length; j++) {\n          if (j > 0) {\n            csv = csv + config.delimiter;\n          }\n\n          const v = fields[j].values.get(i);\n          if (v !== null) {\n            csv = csv + writers[j](v);\n          }\n        }\n        csv = csv + config.newline;\n      }\n    }\n    csv = csv + config.newline;\n  }\n\n  return csv;\n}\n","import { KeyValue } from '../types';\n\n// Avoid writing the warning message more than once every 10s\nconst history: KeyValue<number> = {};\n\nexport const deprecationWarning = (file: string, oldName: string, newName?: string) => {\n  let message = `[Deprecation warning] ${file}: ${oldName} is deprecated`;\n  if (newName) {\n    message += `. Use ${newName} instead`;\n  }\n  const now = Date.now();\n  const last = history[message];\n  if (!last || now - last > 10000) {\n    console.warn(message);\n    history[message] = now;\n  }\n};\n","import { countBy, chain, escapeRegExp } from 'lodash';\n\nimport { LogLevel, LogRowModel, LogLabelStatsModel, LogsParser } from '../types/logs';\nimport { DataFrame, FieldType } from '../types/index';\nimport { ArrayVector } from '../vector/ArrayVector';\n\n// This matches:\n// first a label from start of the string or first white space, then any word chars until \"=\"\n// second either an empty quotes, or anything that starts with quote and ends with unescaped quote,\n// or any non whitespace chars that do not start with qoute\nconst LOGFMT_REGEXP = /(?:^|\\s)([\\w\\(\\)\\[\\]\\{\\}]+)=(\"\"|(?:\".*?[^\\\\]\"|[^\"\\s]\\S*))/;\n\n/**\n * Returns the log level of a log line.\n * Parse the line for level words. If no level is found, it returns `LogLevel.unknown`.\n *\n * Example: `getLogLevel('WARN 1999-12-31 this is great') // LogLevel.warn`\n */\nexport function getLogLevel(line: string): LogLevel {\n  if (!line) {\n    return LogLevel.unknown;\n  }\n  let level = LogLevel.unknown;\n  let currentIndex: number | undefined = undefined;\n\n  for (const key of Object.keys(LogLevel)) {\n    const regexp = new RegExp(`\\\\b${key}\\\\b`, 'i');\n    const result = regexp.exec(line);\n\n    if (result) {\n      if (currentIndex === undefined || result.index < currentIndex) {\n        level = (LogLevel as any)[key];\n        currentIndex = result.index;\n      }\n    }\n  }\n  return level;\n}\n\nexport function getLogLevelFromKey(key: string | number): LogLevel {\n  const level = (LogLevel as any)[key.toString().toLowerCase()];\n  if (level) {\n    return level;\n  }\n\n  return LogLevel.unknown;\n}\n\nexport function addLogLevelToSeries(series: DataFrame, lineIndex: number): DataFrame {\n  const levels = new ArrayVector<LogLevel>();\n  const lines = series.fields[lineIndex];\n  for (let i = 0; i < lines.values.length; i++) {\n    const line = lines.values.get(lineIndex);\n    levels.buffer.push(getLogLevel(line));\n  }\n\n  return {\n    ...series, // Keeps Tags, RefID etc\n    fields: [\n      ...series.fields,\n      {\n        name: 'LogLevel',\n        type: FieldType.string,\n        values: levels,\n        config: {},\n      },\n    ],\n  };\n}\n\nexport const LogsParsers: { [name: string]: LogsParser } = {\n  JSON: {\n    buildMatcher: label => new RegExp(`(?:{|,)\\\\s*\"${label}\"\\\\s*:\\\\s*\"?([\\\\d\\\\.]+|[^\"]*)\"?`),\n    getFields: line => {\n      try {\n        const parsed = JSON.parse(line);\n        return Object.keys(parsed).map(key => {\n          return `\"${key}\":${JSON.stringify(parsed[key])}`;\n        });\n      } catch {}\n      return [];\n    },\n    getLabelFromField: field => (field.match(/^\"([^\"]+)\"\\s*:/) || [])[1],\n    getValueFromField: field => (field.match(/:\\s*(.*)$/) || [])[1],\n    test: line => {\n      try {\n        return JSON.parse(line);\n      } catch (error) {}\n    },\n  },\n\n  logfmt: {\n    buildMatcher: label => new RegExp(`(?:^|\\\\s)${escapeRegExp(label)}=(\"[^\"]*\"|\\\\S+)`),\n    getFields: line => {\n      const fields: string[] = [];\n      line.replace(new RegExp(LOGFMT_REGEXP, 'g'), substring => {\n        fields.push(substring.trim());\n        return '';\n      });\n      return fields;\n    },\n    getLabelFromField: field => (field.match(LOGFMT_REGEXP) || [])[1],\n    getValueFromField: field => (field.match(LOGFMT_REGEXP) || [])[2],\n    test: line => LOGFMT_REGEXP.test(line),\n  },\n};\n\nexport function calculateFieldStats(rows: LogRowModel[], extractor: RegExp): LogLabelStatsModel[] {\n  // Consider only rows that satisfy the matcher\n  const rowsWithField = rows.filter(row => extractor.test(row.entry));\n  const rowCount = rowsWithField.length;\n\n  // Get field value counts for eligible rows\n  const countsByValue = countBy(rowsWithField, r => {\n    const row: LogRowModel = r;\n    const match = row.entry.match(extractor);\n\n    return match ? match[1] : null;\n  });\n  return getSortedCounts(countsByValue, rowCount);\n}\n\nexport function calculateLogsLabelStats(rows: LogRowModel[], label: string): LogLabelStatsModel[] {\n  // Consider only rows that have the given label\n  const rowsWithLabel = rows.filter(row => row.labels[label] !== undefined);\n  const rowCount = rowsWithLabel.length;\n\n  // Get label value counts for eligible rows\n  const countsByValue = countBy(rowsWithLabel, row => (row as LogRowModel).labels[label]);\n  return getSortedCounts(countsByValue, rowCount);\n}\n\nexport function calculateStats(values: any[]): LogLabelStatsModel[] {\n  const nonEmptyValues = values.filter(value => value !== undefined && value !== null);\n  const countsByValue = countBy(nonEmptyValues);\n  return getSortedCounts(countsByValue, nonEmptyValues.length);\n}\n\nconst getSortedCounts = (countsByValue: { [value: string]: number }, rowCount: number) => {\n  return chain(countsByValue)\n    .map((count, value) => ({ count, value, proportion: count / rowCount }))\n    .sortBy('count')\n    .reverse()\n    .value();\n};\n\nexport function getParser(line: string): LogsParser | undefined {\n  let parser;\n  try {\n    if (LogsParsers.JSON.test(line)) {\n      parser = LogsParsers.JSON;\n    }\n  } catch (error) {}\n\n  if (!parser && LogsParsers.logfmt.test(line)) {\n    parser = LogsParsers.logfmt;\n  }\n\n  return parser;\n}\n","export const objRemoveUndefined = (obj: any) => {\n  return Object.keys(obj).reduce((acc: any, key) => {\n    if (obj[key] !== undefined) {\n      acc[key] = obj[key];\n    }\n    return acc;\n  }, {});\n};\n","import { Field } from '../types/dataFrame';\n\n/**\n * Returns minimal time step from series time field\n * @param timeField\n */\nexport const getSeriesTimeStep = (timeField: Field): number => {\n  let previousTime: number | undefined;\n  let minTimeStep: number | undefined;\n  let returnTimeStep = Number.MAX_VALUE;\n\n  for (let i = 0; i < timeField.values.length; i++) {\n    const currentTime = timeField.values.get(i);\n\n    if (previousTime !== undefined) {\n      const timeStep = currentTime - previousTime;\n\n      if (minTimeStep === undefined) {\n        returnTimeStep = timeStep;\n      }\n\n      if (timeStep < returnTimeStep) {\n        returnTimeStep = timeStep;\n      }\n    }\n    previousTime = currentTime;\n  }\n  return returnTimeStep;\n};\n\n/**\n * Checks if series time field has ms resolution\n * @param timeField\n */\nexport const hasMsResolution = (timeField: Field) => {\n  for (let i = 0; i < timeField.values.length; i++) {\n    const value = timeField.values.get(i);\n    if (value !== null && value !== undefined) {\n      const timestamp = value.toString();\n      if (timestamp.length === 13 && timestamp % 1000 !== 0) {\n        return true;\n      }\n    }\n  }\n  return false;\n};\n","/**\n * @preserve jquery-param (c) 2015 KNOWLEDGECODE | MIT\n */\n\n/**\n * Type to represent the value of a single query variable.\n *\n * @public\n */\nexport type UrlQueryValue = string | number | boolean | string[] | number[] | boolean[] | undefined | null;\n\n/**\n * Type to represent the values parsed from the query string.\n *\n * @public\n */\nexport type UrlQueryMap = Record<string, UrlQueryValue>;\n\nfunction renderUrl(path: string, query: UrlQueryMap | undefined): string {\n  if (query && Object.keys(query).length > 0) {\n    path += '?' + toUrlParams(query);\n  }\n  return path;\n}\n\nfunction encodeURIComponentAsAngularJS(val: string, pctEncodeSpaces?: boolean) {\n  return encodeURIComponent(val)\n    .replace(/%40/gi, '@')\n    .replace(/%3A/gi, ':')\n    .replace(/%24/g, '$')\n    .replace(/%2C/gi, ',')\n    .replace(/%3B/gi, ';')\n    .replace(/%20/g, pctEncodeSpaces ? '%20' : '+');\n}\n\nfunction toUrlParams(a: any) {\n  const s: any[] = [];\n  const rbracket = /\\[\\]$/;\n\n  const isArray = (obj: any) => {\n    return Object.prototype.toString.call(obj) === '[object Array]';\n  };\n\n  const add = (k: string, v: any) => {\n    v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;\n    if (typeof v !== 'boolean') {\n      s[s.length] = encodeURIComponentAsAngularJS(k, true) + '=' + encodeURIComponentAsAngularJS(v, true);\n    } else {\n      s[s.length] = encodeURIComponentAsAngularJS(k, true);\n    }\n  };\n\n  const buildParams = (prefix: string, obj: any) => {\n    let i, len, key;\n\n    if (prefix) {\n      if (isArray(obj)) {\n        for (i = 0, len = obj.length; i < len; i++) {\n          if (rbracket.test(prefix)) {\n            add(prefix, obj[i]);\n          } else {\n            buildParams(prefix, obj[i]);\n          }\n        }\n      } else if (obj && String(obj) === '[object Object]') {\n        for (key in obj) {\n          buildParams(prefix + '[' + key + ']', obj[key]);\n        }\n      } else {\n        add(prefix, obj);\n      }\n    } else if (isArray(obj)) {\n      for (i = 0, len = obj.length; i < len; i++) {\n        add(obj[i].name, obj[i].value);\n      }\n    } else {\n      for (key in obj) {\n        buildParams(key, obj[key]);\n      }\n    }\n    return s;\n  };\n\n  return buildParams('', a).join('&');\n}\n\nfunction appendQueryToUrl(url: string, stringToAppend: string) {\n  if (stringToAppend !== undefined && stringToAppend !== null && stringToAppend !== '') {\n    const pos = url.indexOf('?');\n    if (pos !== -1) {\n      if (url.length - pos > 1) {\n        url += '&';\n      }\n    } else {\n      url += '?';\n    }\n    url += stringToAppend;\n  }\n\n  return url;\n}\n\n/**\n * Return search part (as object) of current url\n */\nfunction getUrlSearchParams() {\n  const search = window.location.search.substring(1);\n  const searchParamsSegments = search.split('&');\n  const params: any = {};\n  for (const p of searchParamsSegments) {\n    const keyValuePair = p.split('=');\n    if (keyValuePair.length > 1) {\n      // key-value param\n      const key = decodeURIComponent(keyValuePair[0]);\n      const value = decodeURIComponent(keyValuePair[1]);\n      params[key] = value;\n    } else if (keyValuePair.length === 1) {\n      // boolean param\n      const key = decodeURIComponent(keyValuePair[0]);\n      params[key] = true;\n    }\n  }\n  return params;\n}\n\nexport const urlUtil = {\n  renderUrl,\n  toUrlParams,\n  appendQueryToUrl,\n  getUrlSearchParams,\n};\n","import { GrafanaConfig, RawTimeRange, ScopedVars } from '../types';\nimport { urlUtil } from './url';\nimport { textUtil } from '../text';\n\nlet grafanaConfig: () => GrafanaConfig;\nlet getTimeRangeUrlParams: () => RawTimeRange;\nlet getVariablesUrlParams: (params?: Record<string, any>, scopedVars?: ScopedVars) => string;\n\n/**\n *\n * @param url\n * @internal\n */\nconst stripBaseFromUrl = (url: string): string => {\n  const appSubUrl = grafanaConfig ? grafanaConfig().appSubUrl : '';\n  const stripExtraChars = appSubUrl.endsWith('/') ? 1 : 0;\n  const urlWithoutBase =\n    url.length > 0 && url.indexOf(appSubUrl) === 0 ? url.slice(appSubUrl.length - stripExtraChars) : url;\n\n  return urlWithoutBase;\n};\n\n/**\n *\n * @param url\n * @internal\n */\nconst assureBaseUrl = (url: string): string => {\n  if (url.startsWith('/')) {\n    return `${grafanaConfig ? grafanaConfig().appSubUrl : ''}${stripBaseFromUrl(url)}`;\n  }\n  return url;\n};\n\ninterface LocationUtilDependencies {\n  getConfig: () => GrafanaConfig;\n  getTimeRangeForUrl: () => RawTimeRange;\n  buildParamsFromVariables: (params: any, scopedVars?: ScopedVars) => string;\n}\n\nexport const locationUtil = {\n  /**\n   *\n   * @param getConfig\n   * @param buildParamsFromVariables\n   * @param getTimeRangeForUrl\n   * @internal\n   */\n  initialize: ({ getConfig, buildParamsFromVariables, getTimeRangeForUrl }: LocationUtilDependencies) => {\n    grafanaConfig = getConfig;\n    getTimeRangeUrlParams = getTimeRangeForUrl;\n    getVariablesUrlParams = buildParamsFromVariables;\n  },\n  stripBaseFromUrl,\n  assureBaseUrl,\n  getTimeRangeUrlParams: () => {\n    if (!getTimeRangeUrlParams) {\n      return null;\n    }\n    return urlUtil.toUrlParams(getTimeRangeUrlParams());\n  },\n  getVariablesUrlParams: (scopedVars?: ScopedVars) => {\n    if (!getVariablesUrlParams) {\n      return null;\n    }\n    const params = {};\n    getVariablesUrlParams(params, scopedVars);\n    return urlUtil.toUrlParams(params);\n  },\n  processUrl: (url: string) => {\n    return grafanaConfig().disableSanitizeHtml ? url : textUtil.sanitizeUrl(url);\n  },\n};\n","/**\n * Enumeration of documentation topics\n * @internal\n */\nexport enum DocsId {\n  Transformations,\n  FieldConfig,\n  FieldConfigOverrides,\n}\n","export const DataLinkBuiltInVars = {\n  keepTime: '__url_time_range',\n  timeRangeFrom: '__from',\n  timeRangeTo: '__to',\n  includeVars: '__all_variables',\n  seriesName: '__series.name',\n  fieldName: '__field.name',\n  valueTime: '__value.time',\n  valueNumeric: '__value.numeric',\n  valueText: '__value.text',\n  valueRaw: '__value.raw',\n  // name of the calculation represented by the value\n  valueCalc: '__value.calc',\n};\n","export * from './Registry';\nexport * from './datasource';\nexport * from './deprecationWarning';\nexport * from './csv';\nexport * from './logs';\nexport * from './labels';\nexport * from './labels';\nexport * from './object';\nexport * from './namedColorsPalette';\nexport * from './series';\nexport * from './binaryOperators';\nexport { PanelOptionsEditorBuilder, FieldConfigEditorBuilder } from './OptionsUIBuilders';\n\nexport { getMappedValue } from './valueMappings';\nexport { getFlotPairs, getFlotPairsConstant } from './flotPairs';\nexport { locationUtil } from './location';\nexport { urlUtil, UrlQueryMap, UrlQueryValue } from './url';\nexport { DataLinkBuiltInVars } from './dataLinks';\nexport { DocsId } from './docs';\n","import React from 'react';\nimport { config, GrafanaBootConfig } from '@grafana/runtime';\nimport { ThemeContext, getTheme } from '@grafana/ui';\nimport { GrafanaThemeType } from '@grafana/data';\n\nexport const ConfigContext = React.createContext<GrafanaBootConfig>(config);\nexport const ConfigConsumer = ConfigContext.Consumer;\n\nexport const provideConfig = (component: React.ComponentType<any>) => {\n  const ConfigProvider = (props: any) => (\n    <ConfigContext.Provider value={config}>{React.createElement(component, { ...props })}</ConfigContext.Provider>\n  );\n\n  return ConfigProvider;\n};\n\nexport const getCurrentThemeName = () =>\n  config.bootData.user.lightTheme ? GrafanaThemeType.Light : GrafanaThemeType.Dark;\n\nexport const getCurrentTheme = () => getTheme(getCurrentThemeName());\n\nexport const ThemeProvider = ({ children }: { children: React.ReactNode }) => {\n  return (\n    <ConfigConsumer>\n      {config => {\n        return <ThemeContext.Provider value={getCurrentTheme()}>{children}</ThemeContext.Provider>;\n      }}\n    </ConfigConsumer>\n  );\n};\n\nexport const provideTheme = (component: React.ComponentType<any>) => {\n  return provideConfig((props: any) => <ThemeProvider>{React.createElement(component, { ...props })}</ThemeProvider>);\n};\n","import merge from 'lodash/merge';\nimport { getTheme } from '@grafana/ui';\nimport {\n  DataSourceInstanceSettings,\n  GrafanaTheme,\n  GrafanaThemeType,\n  PanelPluginMeta,\n  GrafanaConfig,\n  LicenseInfo,\n  BuildInfo,\n  FeatureToggles,\n} from '@grafana/data';\n\nexport class GrafanaBootConfig implements GrafanaConfig {\n  datasources: { [str: string]: DataSourceInstanceSettings } = {};\n  panels: { [key: string]: PanelPluginMeta } = {};\n  minRefreshInterval = '';\n  appSubUrl = '';\n  windowTitlePrefix = '';\n  buildInfo: BuildInfo = {} as BuildInfo;\n  newPanelTitle = '';\n  bootData: any;\n  externalUserMngLinkUrl = '';\n  externalUserMngLinkName = '';\n  externalUserMngInfo = '';\n  allowOrgCreate = false;\n  disableLoginForm = false;\n  defaultDatasource = '';\n  alertingEnabled = false;\n  alertingErrorOrTimeout = '';\n  alertingNoDataOrNullValues = '';\n  alertingMinInterval = 1;\n  authProxyEnabled = false;\n  exploreEnabled = false;\n  ldapEnabled = false;\n  samlEnabled = false;\n  autoAssignOrg = true;\n  verifyEmailEnabled = false;\n  oauth: any;\n  disableUserSignUp = false;\n  loginHint: any;\n  passwordHint: any;\n  loginError: any;\n  navTree: any;\n  viewersCanEdit = false;\n  editorsCanAdmin = false;\n  disableSanitizeHtml = false;\n  theme: GrafanaTheme;\n  pluginsToPreload: string[] = [];\n  featureToggles: FeatureToggles = {\n    transformations: false,\n    expressions: false,\n    newEdit: false,\n    meta: false,\n    newVariables: true,\n  };\n  licenseInfo: LicenseInfo = {} as LicenseInfo;\n  rendererAvailable = false;\n\n  constructor(options: GrafanaBootConfig) {\n    this.theme = options.bootData.user.lightTheme ? getTheme(GrafanaThemeType.Light) : getTheme(GrafanaThemeType.Dark);\n\n    const defaults = {\n      datasources: {},\n      windowTitlePrefix: 'Grafana - ',\n      panels: {},\n      newPanelTitle: 'Panel Title',\n      playlist_timespan: '1m',\n      unsaved_changes_warning: true,\n      appSubUrl: '',\n      buildInfo: {\n        version: 'v1.0',\n        commit: '1',\n        env: 'production',\n        isEnterprise: false,\n      },\n      viewersCanEdit: false,\n      editorsCanAdmin: false,\n      disableSanitizeHtml: false,\n    };\n\n    merge(this, defaults, options);\n  }\n}\n\nconst bootData = (window as any).grafanaBootData || {\n  settings: {},\n  user: {},\n  navTree: [],\n};\n\nconst options = bootData.settings;\noptions.bootData = bootData;\n\n/**\n * Use this to access the {@link GrafanaBootConfig} for the current running Grafana instance.\n *\n * @public\n */\nexport const config = new GrafanaBootConfig(options);\n","import { EchoEvent, EchoEventType } from '../services/EchoSrv';\n\n/**\n * Describes the basic dashboard information that can be passed as the meta\n * analytics payload.\n *\n * @public\n */\nexport interface DashboardInfo {\n  dashboardId: number;\n  dashboardUid: string;\n  dashboardName: string;\n  folderName?: string;\n}\n\n/**\n * Describes the data request information passed as the meta analytics payload.\n *\n * @public\n */\nexport interface DataRequestInfo extends Partial<DashboardInfo> {\n  datasourceName: string;\n  datasourceId?: number;\n  panelId?: number;\n  panelName?: string;\n  duration: number;\n  error?: string;\n  dataSize?: number;\n}\n\n/**\n * The meta analytics events that can be added to the echo service.\n *\n * @public\n */\nexport enum MetaAnalyticsEventName {\n  DashboardView = 'dashboard-view',\n  DataRequest = 'data-request',\n}\n\n/**\n * Describes the payload of a dashboard view event.\n *\n * @public\n */\nexport interface DashboardViewEventPayload extends DashboardInfo {\n  eventName: MetaAnalyticsEventName.DashboardView;\n}\n\n/**\n * Describes the payload of a data request event.\n *\n * @public\n */\nexport interface DataRequestEventPayload extends DataRequestInfo {\n  eventName: MetaAnalyticsEventName.DataRequest;\n}\n\n/**\n * Describes the meta analytics payload passed with the {@link MetaAnalyticsEvent}\n *\n * @public\n */\nexport type MetaAnalyticsEventPayload = DashboardViewEventPayload | DataRequestEventPayload;\n\n/**\n * Describes meta analytics event with predefined {@link EchoEventType.MetaAnalytics} type.\n *\n * @public\n */\nexport interface MetaAnalyticsEvent extends EchoEvent<EchoEventType.MetaAnalytics, MetaAnalyticsEventPayload> {}\n","import { config } from '../config';\n\n// @ts-ignore\nimport System from 'systemjs/dist/system.js';\n\n/**\n * Option to specify a plugin css that should be applied for the dark\n * and the light theme.\n *\n * @public\n */\nexport interface PluginCssOptions {\n  light: string;\n  dark: string;\n}\n\n/**\n * @internal\n */\nexport const SystemJS = System;\n\n/**\n * Use this to load css for a Grafana plugin by specifying a {@link PluginCssOptions}\n * containing styling for the dark and the light theme.\n *\n * @param options - plugin styling for light and dark theme.\n * @public\n */\nexport function loadPluginCss(options: PluginCssOptions): Promise<any> {\n  const theme = config.bootData.user.lightTheme ? options.light : options.dark;\n  return SystemJS.import(`${theme}!css`);\n}\n","import { getEchoSrv, EchoEventType } from '../services/EchoSrv';\nimport { MetaAnalyticsEvent, MetaAnalyticsEventPayload } from '../types/analytics';\n\n/**\n * Helper function to report meta analytics to the {@link EchoSrv}.\n *\n * @public\n */\nexport const reportMetaAnalytics = (payload: MetaAnalyticsEventPayload) => {\n  getEchoSrv().addEvent<MetaAnalyticsEvent>({\n    type: EchoEventType.MetaAnalytics,\n    payload,\n  });\n};\n","import {\n  DataQueryResponse,\n  arrowTableToDataFrame,\n  base64StringToArrowTable,\n  KeyValue,\n  LoadingState,\n  DataQueryError,\n} from '@grafana/data';\n\ninterface DataResponse {\n  error?: string;\n  refId?: string;\n  dataframes?: string[];\n  // series: null,\n  // tables: null,\n}\n\n/**\n * Parse the results from `/api/ds/query\n */\nexport function toDataQueryResponse(res: any): DataQueryResponse {\n  const rsp: DataQueryResponse = { data: [], state: LoadingState.Done };\n  if (res.data?.results) {\n    const results: KeyValue = res.data.results;\n    for (const refId of Object.keys(results)) {\n      const dr = results[refId] as DataResponse;\n      if (dr) {\n        if (dr.error) {\n          if (!rsp.error) {\n            rsp.error = {\n              refId,\n              message: dr.error,\n            };\n            rsp.state = LoadingState.Error;\n          }\n        }\n\n        if (dr.dataframes) {\n          for (const b64 of dr.dataframes) {\n            try {\n              const t = base64StringToArrowTable(b64);\n              const f = arrowTableToDataFrame(t);\n              if (!f.refId) {\n                f.refId = refId;\n              }\n              rsp.data.push(f);\n            } catch (err) {\n              rsp.state = LoadingState.Error;\n              rsp.error = toDataQueryError(err);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  // When it is not an OK response, make sure the error gets added\n  if (res.status && res.status !== 200) {\n    if (rsp.state !== LoadingState.Error) {\n      rsp.state = LoadingState.Error;\n    }\n    if (!rsp.error) {\n      rsp.error = toDataQueryError(res);\n    }\n  }\n\n  return rsp;\n}\n\n/**\n * Convert an object into a DataQueryError -- if this is an HTTP response,\n * it will put the correct values in the error filds\n */\nexport function toDataQueryError(err: any): DataQueryError {\n  const error = (err || {}) as DataQueryError;\n\n  if (!error.message) {\n    if (typeof err === 'string' || err instanceof String) {\n      return { message: err } as DataQueryError;\n    }\n\n    let message = 'Query error';\n    if (error.message) {\n      message = error.message;\n    } else if (error.data && error.data.message) {\n      message = error.data.message;\n    } else if (error.data && error.data.error) {\n      message = error.data.error;\n    } else if (error.status) {\n      message = `Query error: ${error.status} ${error.statusText}`;\n    }\n    error.message = message;\n  }\n\n  return error;\n}\n","import {\n  DataSourceApi,\n  DataQueryRequest,\n  DataQueryResponse,\n  DataSourceInstanceSettings,\n  DataQuery,\n  DataSourceJsonData,\n} from '@grafana/data';\nimport { Observable, from } from 'rxjs';\nimport { config } from '..';\nimport { getBackendSrv } from '../services';\nimport { toDataQueryResponse } from './queryResponse';\n\nconst ExpressionDatasourceID = '__expr__';\n\n/**\n * Describes the current healt status of a data source plugin.\n *\n * @public\n */\nexport enum HealthStatus {\n  Unknown = 'UNKNOWN',\n  OK = 'OK',\n  Error = 'ERROR',\n}\n\n/**\n * Describes the payload returned when checking the health of a data source\n * plugin.\n *\n * @public\n */\nexport interface HealthCheckResult {\n  status: HealthStatus;\n  message: string;\n  details?: Record<string, any>;\n}\n\n/**\n * Extend this class to implement a data source plugin that is depending on the Grafana\n * backend API.\n *\n * @public\n */\nexport class DataSourceWithBackend<\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n  constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n    super(instanceSettings);\n  }\n\n  /**\n   * Ideally final -- any other implementation may not work as expected\n   */\n  query(request: DataQueryRequest): Observable<DataQueryResponse> {\n    const { targets, intervalMs, maxDataPoints, range, requestId } = request;\n    const orgId = config.bootData.user.orgId;\n    const queries = targets.map(q => {\n      if (q.datasource === ExpressionDatasourceID) {\n        return {\n          ...q,\n          datasourceId: this.id,\n          orgId,\n        };\n      }\n      const dsName = q.datasource && q.datasource !== 'default' ? q.datasource : config.defaultDatasource;\n      const ds = config.datasources[dsName];\n      if (!ds) {\n        throw new Error('Unknown Datasource: ' + q.datasource);\n      }\n      return {\n        ...this.applyTemplateVariables(q),\n        datasourceId: ds.id,\n        intervalMs,\n        maxDataPoints,\n        orgId,\n      };\n    });\n\n    const body: any = {\n      queries,\n    };\n    if (range) {\n      body.range = range;\n      body.from = range.from.valueOf().toString();\n      body.to = range.to.valueOf().toString();\n    }\n\n    const req: Promise<DataQueryResponse> = getBackendSrv()\n      .datasourceRequest({\n        url: '/api/ds/query',\n        method: 'POST',\n        data: body,\n        requestId,\n      })\n      .then((rsp: any) => {\n        return toDataQueryResponse(rsp);\n      })\n      .catch(err => {\n        err.isHandled = true; // Avoid extra popup warning\n        return toDataQueryResponse(err);\n      });\n\n    return from(req);\n  }\n\n  /**\n   * Override to apply template variables\n   *\n   * @virtual\n   */\n  applyTemplateVariables(query: DataQuery) {\n    return query;\n  }\n\n  /**\n   * Make a GET request to the datasource resource path\n   */\n  async getResource(path: string, params?: any): Promise<any> {\n    return getBackendSrv().get(`/api/datasources/${this.id}/resources/${path}`, params);\n  }\n\n  /**\n   * Send a POST request to the datasource resource path\n   */\n  async postResource(path: string, body?: any): Promise<any> {\n    return getBackendSrv().post(`/api/datasources/${this.id}/resources/${path}`, { ...body });\n  }\n\n  /**\n   * Run the datasource healthcheck\n   */\n  async callHealthCheck(): Promise<HealthCheckResult> {\n    return getBackendSrv()\n      .get(`/api/datasources/${this.id}/health`)\n      .then(v => {\n        return v as HealthCheckResult;\n      })\n      .catch(err => {\n        err.isHandled = true; // Avoid extra popup warning\n        return err.data as HealthCheckResult;\n      });\n  }\n\n  /**\n   * Checks the plugin health\n   */\n  async testDatasource(): Promise<any> {\n    return this.callHealthCheck().then(res => {\n      if (res.status === HealthStatus.OK) {\n        return {\n          status: 'success',\n          message: res.message,\n        };\n      }\n      return {\n        status: 'fail',\n        message: res.message,\n      };\n    });\n  }\n}\n","/**\n * A library containing services, configurations etc. used to interact with the Grafana engine.\n *\n * @packageDocumentation\n */\nexport * from './services';\nexport * from './config';\nexport * from './types';\nexport { loadPluginCss, SystemJS, PluginCssOptions } from './utils/plugin';\nexport { reportMetaAnalytics } from './utils/analytics';\nexport { DataSourceWithBackend, HealthCheckResult, HealthStatus } from './utils/DataSourceWithBackend';\nexport { toDataQueryError, toDataQueryResponse } from './utils/queryResponse';\n","import { TimeZone } from '../types/time';\n/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */\nimport moment, { Moment, MomentInput, DurationInputArg1 } from 'moment';\nexport interface DateTimeBuiltinFormat {\n  __momentBuiltinFormatBrand: any;\n}\nexport const ISO_8601: DateTimeBuiltinFormat = moment.ISO_8601;\nexport type DateTimeInput = Date | string | number | Array<string | number> | DateTime; // null | undefined\nexport type FormatInput = string | DateTimeBuiltinFormat | undefined;\nexport type DurationInput = string | number | DateTimeDuration;\nexport type DurationUnit =\n  | 'year'\n  | 'years'\n  | 'y'\n  | 'month'\n  | 'months'\n  | 'M'\n  | 'week'\n  | 'weeks'\n  | 'w'\n  | 'day'\n  | 'days'\n  | 'd'\n  | 'hour'\n  | 'hours'\n  | 'h'\n  | 'minute'\n  | 'minutes'\n  | 'm'\n  | 'second'\n  | 'seconds'\n  | 's'\n  | 'millisecond'\n  | 'milliseconds'\n  | 'ms'\n  | 'quarter'\n  | 'quarters'\n  | 'Q';\n\nexport interface DateTimeLocale {\n  firstDayOfWeek: () => number;\n}\n\nexport interface DateTimeDuration {\n  asHours: () => number;\n  hours: () => number;\n  minutes: () => number;\n  seconds: () => number;\n  asSeconds: () => number;\n}\n\nexport interface DateTime extends Object {\n  add: (amount?: DateTimeInput, unit?: DurationUnit) => DateTime;\n  set: (unit: DurationUnit, amount: DateTimeInput) => void;\n  diff: (amount: DateTimeInput, unit?: DurationUnit, truncate?: boolean) => number;\n  endOf: (unitOfTime: DurationUnit) => DateTime;\n  format: (formatInput?: FormatInput) => string;\n  fromNow: (withoutSuffix?: boolean) => string;\n  from: (formaInput: DateTimeInput) => string;\n  isSame: (input?: DateTimeInput, granularity?: DurationUnit) => boolean;\n  isValid: () => boolean;\n  local: () => DateTime;\n  locale: (locale: string) => DateTime;\n  startOf: (unitOfTime: DurationUnit) => DateTime;\n  subtract: (amount?: DateTimeInput, unit?: DurationUnit) => DateTime;\n  toDate: () => Date;\n  toISOString: () => string;\n  isoWeekday: (day?: number | string) => number | string;\n  valueOf: () => number;\n  unix: () => number;\n  utc: () => DateTime;\n  utcOffset: () => number;\n  hour?: () => number;\n  minute?: () => number;\n}\n\nexport const setLocale = (language: string) => {\n  moment.locale(language);\n};\n\nexport const getLocaleData = (): DateTimeLocale => {\n  return moment.localeData();\n};\n\nexport const isDateTime = (value: any): value is DateTime => {\n  return moment.isMoment(value);\n};\n\nexport const toUtc = (input?: DateTimeInput, formatInput?: FormatInput): DateTime => {\n  return moment.utc(input as MomentInput, formatInput) as DateTime;\n};\n\nexport const toDuration = (input?: DurationInput, unit?: DurationUnit): DateTimeDuration => {\n  return moment.duration(input as DurationInputArg1, unit) as DateTimeDuration;\n};\n\nexport const dateTime = (input?: DateTimeInput, formatInput?: FormatInput): DateTime => {\n  return moment(input as MomentInput, formatInput) as DateTime;\n};\n\nexport const dateTimeAsMoment = (input?: DateTimeInput) => {\n  return dateTime(input) as Moment;\n};\n\nexport const dateTimeForTimeZone = (\n  timezone?: TimeZone,\n  input?: DateTimeInput,\n  formatInput?: FormatInput\n): DateTime => {\n  if (timezone === 'utc') {\n    return toUtc(input, formatInput);\n  }\n\n  return dateTime(input, formatInput);\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { PanelModel } from '../../../state/PanelModel';\nimport { DefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\nimport { DisplayMode } from '../types';\nimport store from '../../../../../core/store';\n\nexport const PANEL_EDITOR_UI_STATE_STORAGE_KEY = 'grafana.dashboard.editor.ui';\n\nexport const DEFAULT_PANEL_EDITOR_UI_STATE: PanelEditorUIState = {\n  isPanelOptionsVisible: true,\n  rightPaneSize: 400,\n  topPaneSize: '45%',\n  mode: DisplayMode.Fill,\n};\n\nexport interface PanelEditorUIState {\n  /* Visualization options pane visibility */\n  isPanelOptionsVisible: boolean;\n  /* Pixels or percentage */\n  rightPaneSize: number | string;\n  /* Pixels or percentage */\n  topPaneSize: number | string;\n  /* Visualization size mode */\n  mode: DisplayMode;\n}\n\nexport interface PanelEditorState {\n  /* These are functions as they are mutaded later on and redux toolkit will Object.freeze state so\n   * we need to store these using functions instead */\n  getSourcePanel: () => PanelModel;\n  getPanel: () => PanelModel;\n  getData: () => PanelData;\n  initDone: boolean;\n  shouldDiscardChanges: boolean;\n  isOpen: boolean;\n  ui: PanelEditorUIState;\n}\n\nexport const initialState = (): PanelEditorState => {\n  return {\n    getPanel: () => new PanelModel({}),\n    getSourcePanel: () => new PanelModel({}),\n    getData: () => ({\n      state: LoadingState.NotStarted,\n      series: [],\n      timeRange: DefaultTimeRange,\n    }),\n    initDone: false,\n    shouldDiscardChanges: false,\n    isOpen: false,\n    ui: {\n      ...DEFAULT_PANEL_EDITOR_UI_STATE,\n      ...store.getObject(PANEL_EDITOR_UI_STATE_STORAGE_KEY, DEFAULT_PANEL_EDITOR_UI_STATE),\n    },\n  };\n};\n\ninterface InitEditorPayload {\n  panel: PanelModel;\n  sourcePanel: PanelModel;\n}\n\nconst pluginsSlice = createSlice({\n  name: 'panelEditor',\n  initialState: initialState(),\n  reducers: {\n    updateEditorInitState: (state, action: PayloadAction<InitEditorPayload>) => {\n      state.getPanel = () => action.payload.panel;\n      state.getSourcePanel = () => action.payload.sourcePanel;\n      state.initDone = true;\n      state.isOpen = true;\n      state.shouldDiscardChanges = false;\n    },\n    setEditorPanelData: (state, action: PayloadAction<PanelData>) => {\n      state.getData = () => action.payload;\n    },\n    setDiscardChanges: (state, action: PayloadAction<boolean>) => {\n      state.shouldDiscardChanges = action.payload;\n    },\n    setPanelEditorUIState: (state, action: PayloadAction<Partial<PanelEditorUIState>>) => {\n      state.ui = { ...state.ui, ...action.payload };\n    },\n    closeCompleted: state => {\n      state.isOpen = false;\n      state.initDone = false;\n    },\n  },\n});\n\nexport const {\n  updateEditorInitState,\n  setEditorPanelData,\n  setDiscardChanges,\n  closeCompleted,\n  setPanelEditorUIState,\n} = pluginsSlice.actions;\n\nexport const panelEditorReducer = pluginsSlice.reducer;\n","import React from 'react';\nimport { Segment, SegmentAsync } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '../constants';\nimport { Project, AlignmentPeriods, AliasBy, QueryInlineField } from '.';\nimport { SLOQuery } from '../types';\nimport StackdriverDatasource from '../datasource';\n\nexport interface Props {\n  usedAlignmentPeriod: string;\n  variableOptionGroup: SelectableValue<string>;\n  onChange: (query: SLOQuery) => void;\n  onRunQuery: () => void;\n  query: SLOQuery;\n  datasource: StackdriverDatasource;\n}\n\nexport const defaultQuery: SLOQuery = {\n  projectName: '',\n  alignmentPeriod: 'stackdriver-auto',\n  aliasBy: '',\n  selectorName: 'select_slo_health',\n  serviceId: '',\n  sloId: '',\n};\n\nexport function SLOQueryEditor({\n  query,\n  datasource,\n  onChange,\n  variableOptionGroup,\n  usedAlignmentPeriod,\n}: React.PropsWithChildren<Props>) {\n  return (\n    <>\n      <Project\n        templateVariableOptions={variableOptionGroup.options}\n        projectName={query.projectName}\n        datasource={datasource}\n        onChange={projectName => onChange({ ...query, projectName })}\n      />\n      <QueryInlineField label=\"Service\">\n        <SegmentAsync\n          allowCustomValue\n          value={query?.serviceId}\n          placeholder=\"Select service\"\n          loadOptions={() =>\n            datasource.getSLOServices(query.projectName).then(services => [\n              {\n                label: 'Template Variables',\n                options: variableOptionGroup.options,\n              },\n              ...services,\n            ])\n          }\n          onChange={({ value: serviceId = '' }) => onChange({ ...query, serviceId, sloId: '' })}\n        />\n      </QueryInlineField>\n\n      <QueryInlineField label=\"SLO\">\n        <SegmentAsync\n          allowCustomValue\n          value={query?.sloId}\n          placeholder=\"Select SLO\"\n          loadOptions={() =>\n            datasource.getServiceLevelObjectives(query.projectName, query.serviceId).then(sloIds => [\n              {\n                label: 'Template Variables',\n                options: variableOptionGroup.options,\n              },\n              ...sloIds,\n            ])\n          }\n          onChange={async ({ value: sloId = '' }) => {\n            const slos = await datasource.getServiceLevelObjectives(query.projectName, query.serviceId);\n            const slo = slos.find(({ value }) => value === datasource.templateSrv.replace(sloId));\n            onChange({ ...query, sloId, goal: slo?.goal });\n          }}\n        />\n      </QueryInlineField>\n\n      <QueryInlineField label=\"Selector\">\n        <Segment\n          allowCustomValue\n          value={[...selectors, ...variableOptionGroup.options].find(s => s.value === query?.selectorName ?? '')}\n          options={[\n            {\n              label: 'Template Variables',\n              options: variableOptionGroup.options,\n            },\n            ...selectors,\n          ]}\n          onChange={({ value: selectorName }) => onChange({ ...query, selectorName })}\n        />\n      </QueryInlineField>\n\n      <AlignmentPeriods\n        templateSrv={datasource.templateSrv}\n        templateVariableOptions={variableOptionGroup.options}\n        alignmentPeriod={query.alignmentPeriod || ''}\n        perSeriesAligner={query.selectorName === 'select_slo_health' ? 'ALIGN_MEAN' : 'ALIGN_NEXT_OLDER'}\n        usedAlignmentPeriod={usedAlignmentPeriod}\n        onChange={alignmentPeriod => onChange({ ...query, alignmentPeriod })}\n      />\n      <AliasBy value={query.aliasBy} onChange={aliasBy => onChange({ ...query, aliasBy })} />\n    </>\n  );\n}\n","import React, { PureComponent, ReactNode } from 'react';\nimport ClipboardJS from 'clipboard';\n\ninterface Props {\n  text: () => string;\n  elType?: string | React.RefForwardingComponent<any, any>;\n  onSuccess?: (evt: any) => void;\n  onError?: (evt: any) => void;\n  className?: string;\n  children?: ReactNode;\n}\n\nexport class CopyToClipboard extends PureComponent<Props> {\n  clipboardjs?: ClipboardJS;\n  myRef: any;\n\n  constructor(props: Props) {\n    super(props);\n    this.myRef = React.createRef();\n  }\n\n  componentDidMount() {\n    this.initClipboardJS();\n  }\n\n  componentDidUpdate() {\n    if (this.clipboardjs) {\n      this.clipboardjs.destroy();\n    }\n    this.initClipboardJS();\n  }\n\n  initClipboardJS = () => {\n    const { text, onSuccess, onError } = this.props;\n\n    this.clipboardjs = new ClipboardJS(this.myRef.current, {\n      text: text,\n    });\n\n    if (onSuccess) {\n      this.clipboardjs.on('success', evt => {\n        evt.clearSelection();\n        onSuccess(evt);\n      });\n    }\n\n    if (onError) {\n      this.clipboardjs.on('error', evt => {\n        console.error('Action:', evt.action);\n        console.error('Trigger:', evt.trigger);\n        onError(evt);\n      });\n    }\n  };\n\n  componentWillUnmount() {\n    if (this.clipboardjs) {\n      this.clipboardjs.destroy();\n    }\n  }\n\n  getElementType = () => {\n    return this.props.elType || 'button';\n  };\n\n  render() {\n    const { elType, text, children, onError, onSuccess, ...restProps } = this.props;\n\n    return React.createElement(\n      this.getElementType(),\n      {\n        ref: this.myRef,\n        ...restProps,\n      },\n      this.props.children\n    );\n  }\n}\n","import angular from 'angular';\n\nconst coreModule = angular.module('grafana.core', ['ngRoute']);\n\n// legacy modules\nconst angularModules = [\n  coreModule,\n  angular.module('grafana.controllers', []),\n  angular.module('grafana.directives', []),\n  angular.module('grafana.factories', []),\n  angular.module('grafana.services', []),\n  angular.module('grafana.filters', []),\n  angular.module('grafana.routes', []),\n];\n\nexport { angularModules, coreModule };\n\nexport default coreModule;\n","import { DataQuery, DataSourceJsonData } from '@grafana/data';\n\nexport enum AuthType {\n  JWT = 'jwt',\n  GCE = 'gce',\n}\n\nexport const authTypes = [\n  { value: 'Google JWT File', key: AuthType.JWT },\n  { value: 'GCE Default Service Account', key: AuthType.GCE },\n];\n\nexport enum MetricFindQueryTypes {\n  Projects = 'projects',\n  Services = 'services',\n  DefaultProject = 'defaultProject',\n  MetricTypes = 'metricTypes',\n  LabelKeys = 'labelKeys',\n  LabelValues = 'labelValues',\n  ResourceTypes = 'resourceTypes',\n  Aggregations = 'aggregations',\n  Aligners = 'aligners',\n  AlignmentPeriods = 'alignmentPeriods',\n  Selectors = 'selectors',\n  SLOServices = 'sloServices',\n  SLO = 'slo',\n}\n\nexport interface VariableQueryData {\n  selectedQueryType: string;\n  metricDescriptors: MetricDescriptor[];\n  selectedService: string;\n  selectedMetricType: string;\n  selectedSLOService: string;\n  labels: string[];\n  labelKey: string;\n  metricTypes: Array<{ value: string; name: string }>;\n  services: Array<{ value: string; name: string }>;\n  projects: Array<{ value: string; name: string }>;\n  sloServices: Array<{ value: string; name: string }>;\n  projectName: string;\n}\n\nexport enum QueryType {\n  METRICS = 'metrics',\n  SLO = 'slo',\n}\n\nexport const queryTypes = [\n  { label: 'Metrics', value: QueryType.METRICS },\n  { label: 'Service Level Objectives (SLO)', value: QueryType.SLO },\n];\n\nexport interface MetricQuery {\n  projectName: string;\n  unit?: string;\n  metricType: string;\n  crossSeriesReducer: string;\n  alignmentPeriod?: string;\n  perSeriesAligner?: string;\n  groupBys?: string[];\n  filters?: string[];\n  aliasBy?: string;\n  metricKind?: string;\n  valueType?: string;\n  view?: string;\n}\n\nexport interface SLOQuery {\n  projectName: string;\n  alignmentPeriod?: string;\n  perSeriesAligner?: string;\n  aliasBy?: string;\n  selectorName: string;\n  serviceId: string;\n  sloId: string;\n  goal?: number;\n}\n\nexport interface StackdriverQuery extends DataQuery {\n  datasourceId?: number; // Should not be necessary anymore\n  queryType: QueryType;\n  metricQuery: MetricQuery;\n  sloQuery?: SLOQuery;\n}\n\nexport interface StackdriverOptions extends DataSourceJsonData {\n  defaultProject?: string;\n  gceDefaultProject?: string;\n  authenticationType?: string;\n}\n\nexport interface AnnotationTarget {\n  projectName: string;\n  metricType: string;\n  refId: string;\n  filters: string[];\n  metricKind: string;\n  valueType: string;\n  title: string;\n  text: string;\n}\n\nexport interface QueryMeta {\n  alignmentPeriod: string;\n  rawQuery: string;\n  rawQueryString: string;\n  metricLabels: { [key: string]: string[] };\n  resourceLabels: { [key: string]: string[] };\n  resourceTypes: string[];\n}\n\nexport interface MetricDescriptor {\n  valueType: string;\n  metricKind: string;\n  type: string;\n  unit: string;\n  service: string;\n  serviceShortName: string;\n  displayName: string;\n  description: string;\n}\n\nexport interface Segment {\n  type: string;\n  value: string;\n}\n\nexport interface Filter {\n  key: string;\n  operator: string;\n  value: string;\n  condition?: string;\n}\n","import config from '../../core/config';\nimport _ from 'lodash';\nimport coreModule from 'app/core/core_module';\nimport kbn from '../utils/kbn';\n\nexport class User {\n  id: number;\n  isGrafanaAdmin: any;\n  isSignedIn: any;\n  orgRole: any;\n  orgId: number;\n  orgName: string;\n  login: string;\n  orgCount: number;\n  timezone: string;\n  helpFlags1: number;\n  lightTheme: boolean;\n  hasEditPermissionInFolders: boolean;\n\n  constructor() {\n    if (config.bootData.user) {\n      _.extend(this, config.bootData.user);\n    }\n  }\n}\n\nexport class ContextSrv {\n  pinned: any;\n  version: any;\n  user: User;\n  isSignedIn: any;\n  isGrafanaAdmin: any;\n  isEditor: any;\n  sidemenuSmallBreakpoint = false;\n  hasEditPermissionInFolders: boolean;\n  minRefreshInterval: string;\n\n  constructor() {\n    if (!config.bootData) {\n      config.bootData = { user: {}, settings: {} };\n    }\n\n    this.user = new User();\n    this.isSignedIn = this.user.isSignedIn;\n    this.isGrafanaAdmin = this.user.isGrafanaAdmin;\n    this.isEditor = this.hasRole('Editor') || this.hasRole('Admin');\n    this.hasEditPermissionInFolders = this.user.hasEditPermissionInFolders;\n    this.minRefreshInterval = config.minRefreshInterval;\n  }\n\n  hasRole(role: string) {\n    return this.user.orgRole === role;\n  }\n\n  isGrafanaVisible() {\n    return !!(document.visibilityState === undefined || document.visibilityState === 'visible');\n  }\n\n  // checks whether the passed interval is longer than the configured minimum refresh rate\n  isAllowedInterval(interval: string) {\n    if (!config.minRefreshInterval) {\n      return true;\n    }\n    return kbn.interval_to_ms(interval) >= kbn.interval_to_ms(config.minRefreshInterval);\n  }\n\n  getValidInterval(interval: string) {\n    if (!this.isAllowedInterval(interval)) {\n      return config.minRefreshInterval;\n    }\n    return interval;\n  }\n\n  hasAccessToExplore() {\n    return (this.isEditor || config.viewersCanEdit) && config.exploreEnabled;\n  }\n}\n\nconst contextSrv = new ContextSrv();\nexport { contextSrv };\n\ncoreModule.factory('contextSrv', () => {\n  return contextSrv;\n});\n","import React, { PureComponent } from 'react';\nimport * as PopperJS from 'popper.js';\nimport { Manager, Popper as ReactPopper, PopperArrowProps } from 'react-popper';\nimport { Portal } from '../Portal/Portal';\nimport Transition from 'react-transition-group/Transition';\nimport { PopoverContent } from './Tooltip';\n\nconst defaultTransitionStyles = {\n  transition: 'opacity 200ms linear',\n  opacity: 0,\n};\n\nconst transitionStyles: { [key: string]: object } = {\n  exited: { opacity: 0 },\n  entering: { opacity: 0 },\n  entered: { opacity: 1, transitionDelay: '0s' },\n  exiting: { opacity: 0, transitionDelay: '500ms' },\n};\n\nexport type RenderPopperArrowFn = (props: { arrowProps: PopperArrowProps; placement: string }) => JSX.Element;\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n  show: boolean;\n  placement?: PopperJS.Placement;\n  content: PopoverContent;\n  referenceElement: PopperJS.ReferenceObject;\n  wrapperClassName?: string;\n  renderArrow?: RenderPopperArrowFn;\n  eventsEnabled?: boolean;\n}\n\nclass Popover extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\n    eventsEnabled: true,\n  };\n\n  render() {\n    const {\n      content,\n      show,\n      placement,\n      onMouseEnter,\n      onMouseLeave,\n      className,\n      wrapperClassName,\n      renderArrow,\n      referenceElement,\n      eventsEnabled,\n    } = this.props;\n\n    return (\n      <Manager>\n        <Transition in={show} timeout={100} mountOnEnter={true} unmountOnExit={true}>\n          {transitionState => {\n            return (\n              <Portal>\n                <ReactPopper\n                  placement={placement}\n                  referenceElement={referenceElement}\n                  eventsEnabled={eventsEnabled}\n                  // TODO: move modifiers config to popper controller\n                  modifiers={{ preventOverflow: { enabled: true, boundariesElement: 'window' } }}\n                >\n                  {({ ref, style, placement, arrowProps, scheduleUpdate }) => {\n                    return (\n                      <div\n                        onMouseEnter={onMouseEnter}\n                        onMouseLeave={onMouseLeave}\n                        ref={ref}\n                        style={{\n                          ...style,\n                          ...defaultTransitionStyles,\n                          ...transitionStyles[transitionState],\n                        }}\n                        data-placement={placement}\n                        className={`${wrapperClassName}`}\n                      >\n                        <div className={className}>\n                          {typeof content === 'string' && content}\n                          {React.isValidElement(content) && React.cloneElement(content)}\n                          {typeof content === 'function' &&\n                            content({\n                              updatePopperPosition: scheduleUpdate,\n                            })}\n                          {renderArrow &&\n                            renderArrow({\n                              arrowProps,\n                              placement,\n                            })}\n                        </div>\n                      </div>\n                    );\n                  }}\n                </ReactPopper>\n              </Portal>\n            );\n          }}\n        </Transition>\n      </Manager>\n    );\n  }\n}\n\nexport { Popover };\n","import _ from 'lodash';\n\nexport function getMessageFromError(err: string | (Error & { data?: any; statusText?: string })): string {\n  if (err && !_.isString(err)) {\n    if (err.message) {\n      return err.message;\n    } else if (err.data && err.data.message) {\n      return err.data.message;\n    } else if (err.statusText) {\n      return err.statusText;\n    } else {\n      return JSON.stringify(err);\n    }\n  }\n\n  return err as string;\n}\n","var map = {\n\t\"./features/admin/partials/admin_home.html\": \"1duI\",\n\t\"./features/admin/partials/edit_org.html\": \"1yDb\",\n\t\"./features/admin/partials/edit_user.html\": \"QH30\",\n\t\"./features/admin/partials/stats.html\": \"iSop\",\n\t\"./features/admin/partials/styleguide.html\": \"6rcN\",\n\t\"./features/alerting/partials/alert_howto.html\": \"wvI5\",\n\t\"./features/alerting/partials/alert_tab.html\": \"0LRa\",\n\t\"./features/alerting/partials/notification_edit.html\": \"WNR3\",\n\t\"./features/annotations/partials/editor.html\": \"RyIb\",\n\t\"./features/annotations/partials/event_editor.html\": \"vk65\",\n\t\"./features/dashboard/components/DashLinks/editor.html\": \"HPUJ\",\n\t\"./features/dashboard/components/DashboardSettings/template.html\": \"jvip\",\n\t\"./features/dashboard/components/RowOptions/template.html\": \"iyz2\",\n\t\"./features/dashboard/components/SubMenu/template.html\": \"coz7\",\n\t\"./features/dashboard/components/VersionHistory/template.html\": \"wxmp\",\n\t\"./features/datasources/partials/http_settings.html\": \"11hs\",\n\t\"./features/datasources/partials/http_settings_next.html\": \"WtGe\",\n\t\"./features/datasources/partials/tls_auth_settings.html\": \"/2Ru\",\n\t\"./features/org/partials/select_org.html\": \"QBcC\",\n\t\"./features/panel/panellinks/module.html\": \"bDa/\",\n\t\"./features/panel/partials/general_tab.html\": \"XrM5\",\n\t\"./features/panel/partials/panelTime.html\": \"oZti\",\n\t\"./features/panel/partials/query_editor_row.html\": \"oEL2\",\n\t\"./features/playlist/partials/playlist.html\": \"krwA\",\n\t\"./features/playlist/partials/playlist_search.html\": \"4x4p\",\n\t\"./features/playlist/partials/playlists.html\": \"M76c\",\n\t\"./features/plugins/partials/plugin_page.html\": \"0+gp\",\n\t\"./features/plugins/partials/update_instructions.html\": \"X4jf\",\n\t\"./features/profile/partials/profile.html\": \"Uw6O\",\n\t\"./features/templating/partials/editor.html\": \"6V0m\",\n\t\"./partials/confirm_modal.html\": \"iKVC\",\n\t\"./partials/edit_json.html\": \"Ukuu\",\n\t\"./partials/error.html\": \"UkAP\",\n\t\"./partials/modal.html\": \"/YHu\",\n\t\"./partials/reset_password.html\": \"YRnh\",\n\t\"./partials/signup_invited.html\": \"7teh\",\n\t\"./partials/valueSelectDropdown.html\": \"0bcw\",\n\t\"./plugins/datasource/cloudwatch/partials/annotations.editor.html\": \"E1lu\",\n\t\"./plugins/datasource/cloudwatch/partials/query.parameter.html\": \"hSYD\",\n\t\"./plugins/datasource/elasticsearch/partials/annotations.editor.html\": \"LzuI\",\n\t\"./plugins/datasource/elasticsearch/partials/bucket_agg.html\": \"NhjT\",\n\t\"./plugins/datasource/elasticsearch/partials/metric_agg.html\": \"Pfkp\",\n\t\"./plugins/datasource/elasticsearch/partials/pipeline_variables.html\": \"VKbU\",\n\t\"./plugins/datasource/elasticsearch/partials/query.editor.html\": \"bR/a\",\n\t\"./plugins/datasource/grafana-azure-monitor-datasource/partials/annotations.editor.html\": \"Qinm\",\n\t\"./plugins/datasource/grafana-azure-monitor-datasource/partials/query.editor.html\": \"ADUO\",\n\t\"./plugins/datasource/grafana/partials/annotations.editor.html\": \"/8l8\",\n\t\"./plugins/datasource/grafana/partials/query.editor.html\": \"dQag\",\n\t\"./plugins/datasource/graphite/partials/annotations.editor.html\": \"2rVl\",\n\t\"./plugins/datasource/graphite/partials/query.editor.html\": \"ePCq\",\n\t\"./plugins/datasource/influxdb/partials/annotations.editor.html\": \"Szrz\",\n\t\"./plugins/datasource/influxdb/partials/query.editor.html\": \"/HFP\",\n\t\"./plugins/datasource/loki/partials/annotations.editor.html\": \"3CYn\",\n\t\"./plugins/datasource/mssql/partials/annotations.editor.html\": \"PQb9\",\n\t\"./plugins/datasource/mssql/partials/config.html\": \"1kYe\",\n\t\"./plugins/datasource/mssql/partials/query.editor.html\": \"U1ax\",\n\t\"./plugins/datasource/mysql/partials/annotations.editor.html\": \"9RCP\",\n\t\"./plugins/datasource/mysql/partials/config.html\": \"7ym3\",\n\t\"./plugins/datasource/mysql/partials/query.editor.html\": \"gw38\",\n\t\"./plugins/datasource/opentsdb/partials/annotations.editor.html\": \"s+LN\",\n\t\"./plugins/datasource/opentsdb/partials/query.editor.html\": \"vhkK\",\n\t\"./plugins/datasource/postgres/partials/annotations.editor.html\": \"I+An\",\n\t\"./plugins/datasource/postgres/partials/config.html\": \"diqK\",\n\t\"./plugins/datasource/postgres/partials/query.editor.html\": \"HmKx\",\n\t\"./plugins/datasource/prometheus/partials/annotations.editor.html\": \"jaLZ\",\n\t\"./plugins/datasource/stackdriver/partials/annotations.editor.html\": \"cytP\",\n\t\"./plugins/datasource/stackdriver/partials/config.html\": \"OEPh\",\n\t\"./plugins/datasource/testdata/partials/query.editor.html\": \"pCo/\",\n\t\"./plugins/panel/alertlist/editor.html\": \"phJb\",\n\t\"./plugins/panel/alertlist/module.html\": \"0ZQg\",\n\t\"./plugins/panel/dashlist/editor.html\": \"QqjE\",\n\t\"./plugins/panel/dashlist/module.html\": \"eNSq\",\n\t\"./plugins/panel/graph/axes_editor.html\": \"ZG7E\",\n\t\"./plugins/panel/graph/tab_display.html\": \"Lmi3\",\n\t\"./plugins/panel/graph/tab_drilldown_links.html\": \"cZsJ\",\n\t\"./plugins/panel/graph/tab_legend.html\": \"/XDc\",\n\t\"./plugins/panel/graph/tab_series_overrides.html\": \"8Hts\",\n\t\"./plugins/panel/graph/tab_thresholds.html\": \"HCwt\",\n\t\"./plugins/panel/graph/tab_time_regions.html\": \"TcCK\",\n\t\"./plugins/panel/graph/thresholds_form.html\": \"zJCM\",\n\t\"./plugins/panel/graph/time_regions_form.html\": \"pDgv\",\n\t\"./plugins/panel/heatmap/module.html\": \"NoBN\",\n\t\"./plugins/panel/heatmap/partials/axes_editor.html\": \"vInx\",\n\t\"./plugins/panel/heatmap/partials/display_editor.html\": \"mCU5\",\n\t\"./plugins/panel/pluginlist/module.html\": \"UJAu\",\n\t\"./plugins/panel/singlestat/editor.html\": \"hE9y\",\n\t\"./plugins/panel/singlestat/mappings.html\": \"2euF\",\n\t\"./plugins/panel/singlestat/module.html\": \"8iRp\",\n\t\"./plugins/panel/table-old/column_options.html\": \"cu9u\",\n\t\"./plugins/panel/table-old/editor.html\": \"KVWU\",\n\t\"./plugins/panel/table-old/module.html\": \"lEy4\",\n\t\"./plugins/panel/text/editor.html\": \"9CCn\",\n\t\"./plugins/panel/text/module.html\": \"/Dwp\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"vFKA\";","var path = 'public/app/plugins/panel/heatmap/partials/axes_editor.html';\nvar html = \"<div class=editor-row>\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Y Axis</h5>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Unit</label>\\n      <div class=\\\"gf-form-dropdown-typeahead width-12\\\" ng-model=ctrl.panel.yAxis.format dropdown-typeahead2=editor.unitFormats dropdown-typeahead-on-select=editor.setUnitFormat($subItem)>\\n      </div>\\n    </div>\\n    <div ng-if=\\\"ctrl.panel.dataFormat == 'timeseries'\\\">\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-8\\\">Scale</label>\\n        <div class=\\\"gf-form-select-wrapper width-12\\\">\\n          <select class=gf-form-input ng-model=ctrl.panel.yAxis.logBase ng-options=\\\"v as k for (k, v) in editor.logScales\\\" ng-change=ctrl.refresh()></select>\\n        </div>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-8\\\">Y-Min</label>\\n        <input type=text class=\\\"gf-form-input width-12\\\" placeholder=auto empty-to-null ng-model=ctrl.panel.yAxis.min ng-change=ctrl.render() ng-model-onblur>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-8\\\">Y-Max</label>\\n        <input type=text class=\\\"gf-form-input width-12\\\" placeholder=auto empty-to-null ng-model=ctrl.panel.yAxis.max ng-change=ctrl.render() ng-model-onblur>\\n      </div>\\n    </div>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-8\\\">Decimals</label>\\n      <input type=number class=\\\"gf-form-input width-12\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Override automatic decimal precision for axis.'\\\" ng-model=ctrl.panel.yAxis.decimals ng-change=ctrl.render() ng-model-onblur>\\n    </div>\\n    <div class=gf-form ng-if=\\\"ctrl.panel.dataFormat == 'tsbuckets'\\\">\\n      <label class=\\\"gf-form-label width-8\\\">Bucket bound</label>\\n      <div class=\\\"gf-form-select-wrapper max-width-12\\\">\\n        <select class=gf-form-input ng-model=ctrl.panel.yBucketBound ng-options=\\\"v as k for (k, v) in editor.yBucketBoundModes\\\" ng-change=ctrl.render() data-placement=right bs-tooltip=\\\"'Use series label as an upper or lower bucket bound.'\\\">\\n        </select>\\n      </div>\\n    </div>\\n    <gf-form-switch ng-if=\\\"ctrl.panel.dataFormat == 'tsbuckets'\\\" class=gf-form label-class=width-8 label=\\\"Reverse order\\\" checked=ctrl.panel.reverseYBuckets on-change=ctrl.refresh()>\\n    </gf-form-switch>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\" ng-if=\\\"ctrl.panel.dataFormat == 'timeseries'\\\">\\n    <h5 class=section-heading>Buckets</h5>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-5\\\">Y Axis</label>\\n      </div>\\n      <div class=gf-form ng-show=\\\"ctrl.panel.yAxis.logBase === 1\\\">\\n        <label class=\\\"gf-form-label width-5\\\">Buckets</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Number of buckets for Y axis.'\\\" ng-model=ctrl.panel.yBucketNumber ng-change=ctrl.refresh() ng-model-onblur>\\n      </div>\\n      <div class=gf-form ng-show=\\\"ctrl.panel.yAxis.logBase === 1\\\">\\n        <label class=\\\"gf-form-label width-4\\\">Size</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Size of bucket. Has priority over Buckets option.'\\\" ng-model=ctrl.panel.yBucketSize ng-change=ctrl.refresh() ng-model-onblur>\\n      </div>\\n      <div class=gf-form ng-show=\\\"ctrl.panel.yAxis.logBase !== 1\\\">\\n        <label class=\\\"gf-form-label width-10\\\">Split Factor</label>\\n        <input type=number class=\\\"gf-form-input width-9\\\" placeholder=1 data-placement=right bs-tooltip=\\\"'For log scales only. By default Y values is splitted by integer powers of log base (1, 2, 4, 8, 16, ... for log2). This option allows to split each default bucket into specified number of buckets.'\\\" ng-model=ctrl.panel.yAxis.splitFactor ng-change=ctrl.refresh() ng-model-onblur>\\n        \\n      </div>\\n    </div>\\n    <div class=gf-form-inline>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-5\\\">X Axis</label>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-5\\\">Buckets</label>\\n        <input type=number class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Number of buckets for X axis.'\\\" ng-model=ctrl.panel.xBucketNumber ng-change=ctrl.refresh() ng-model-onblur>\\n      </div>\\n      <div class=gf-form>\\n        <label class=\\\"gf-form-label width-4\\\">Size</label>\\n        <input type=text class=\\\"gf-form-input width-5\\\" placeholder=auto data-placement=right bs-tooltip=\\\"'Size of bucket. Number or interval (10s, 5m, 1h, etc). Supported intervals: ms, s, m, h, d, w, M, y. Has priority over Buckets option.'\\\" ng-model=ctrl.panel.xBucketSize ng-change=ctrl.refresh() ng-model-onblur>\\n      </div>\\n    </div>\\n  </div>\\n\\n  <div class=\\\"section gf-form-group\\\">\\n    <h5 class=section-heading>Data format</h5>\\n    <div class=gf-form>\\n      <label class=\\\"gf-form-label width-5\\\">Format</label>\\n      <div class=\\\"gf-form-select-wrapper max-width-15\\\">\\n        <select class=gf-form-input ng-model=ctrl.panel.dataFormat ng-options=\\\"v as k for (k, v) in editor.dataFormats\\\" ng-change=ctrl.render() data-placement=right bs-tooltip=\\\"'Time series: create heatmap from regular time series. <br>Time series buckets: use histogram data returned from data source. Each series represents bucket which upper/lower bound is a series label.'\\\">\\n        </select>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","/*\n * jQuery.flot.dashes\n *\n * options = {\n *   series: {\n *     dashes: {\n *\n *       // show\n *       // default: false\n *       // Whether to show dashes for the series.\n *       show: <boolean>,\n *\n *       // lineWidth\n *       // default: 2\n *       // The width of the dashed line in pixels.\n *       lineWidth: <number>,\n *\n *       // dashLength\n *       // default: 10\n *       // Controls the length of the individual dashes and the amount of\n *       // space between them.\n *       // If this is a number, the dashes and spaces will have that length.\n *       // If this is an array, it is read as [ dashLength, spaceLength ]\n *       dashLength: <number> or <array[2]>\n *     }\n *   }\n * }\n */\n(function($){\n\n  function init(plot) {\n\n    plot.hooks.processDatapoints.push(function(plot, series, datapoints) {\n\n      if (!series.dashes.show) return;\n\n      plot.hooks.draw.push(function(plot, ctx) {\n\n        var plotOffset = plot.getPlotOffset(),\n          axisx = series.xaxis,\n          axisy = series.yaxis;\n\n        function plotDashes(xoffset, yoffset) {\n\n          var points = datapoints.points,\n            ps = datapoints.pointsize,\n            prevx = null,\n            prevy = null,\n            dashRemainder = 0,\n            dashOn = true,\n            dashOnLength,\n            dashOffLength;\n\n          if (series.dashes.dashLength[0]) {\n            dashOnLength = series.dashes.dashLength[0];\n            if (series.dashes.dashLength[1]) {\n              dashOffLength = series.dashes.dashLength[1];\n            } else {\n              dashOffLength = dashOnLength;\n            }\n          } else {\n            dashOffLength = dashOnLength = series.dashes.dashLength;\n          }\n\n          ctx.beginPath();\n\n          for (var i = ps; i < points.length; i += ps) {\n\n            var x1 = points[i - ps],\n              y1 = points[i - ps + 1],\n              x2 = points[i],\n              y2 = points[i + 1];\n\n            if (x1 == null || x2 == null) continue;\n\n            // clip with ymin\n            if (y1 <= y2 && y1 < axisy.min) {\n              if (y2 < axisy.min) continue;   // line segment is outside\n              // compute new intersection point\n              x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n              y1 = axisy.min;\n            } else if (y2 <= y1 && y2 < axisy.min) {\n              if (y1 < axisy.min) continue;\n              x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n              y2 = axisy.min;\n            }\n\n            // clip with ymax\n            if (y1 >= y2 && y1 > axisy.max) {\n              if (y2 > axisy.max) continue;\n              x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n              y1 = axisy.max;\n            } else if (y2 >= y1 && y2 > axisy.max) {\n              if (y1 > axisy.max) continue;\n              x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n              y2 = axisy.max;\n            }\n\n            // clip with xmin\n            if (x1 <= x2 && x1 < axisx.min) {\n              if (x2 < axisx.min) continue;\n              y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n              x1 = axisx.min;\n            } else if (x2 <= x1 && x2 < axisx.min) {\n              if (x1 < axisx.min) continue;\n              y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n              x2 = axisx.min;\n            }\n\n            // clip with xmax\n            if (x1 >= x2 && x1 > axisx.max) {\n              if (x2 > axisx.max) continue;\n              y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n              x1 = axisx.max;\n            } else if (x2 >= x1 && x2 > axisx.max) {\n              if (x1 > axisx.max) continue;\n              y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n              x2 = axisx.max;\n            }\n\n            if (x1 != prevx || y1 != prevy) {\n              ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n            }\n\n            var ax1 = axisx.p2c(x1) + xoffset,\n              ay1 = axisy.p2c(y1) + yoffset,\n              ax2 = axisx.p2c(x2) + xoffset,\n              ay2 = axisy.p2c(y2) + yoffset,\n              dashOffset;\n\n            function lineSegmentOffset(segmentLength) {\n\n              var c = Math.sqrt(Math.pow(ax2 - ax1, 2) + Math.pow(ay2 - ay1, 2));\n\n              if (c <= segmentLength) {\n                return {\n                  deltaX: ax2 - ax1,\n                  deltaY: ay2 - ay1,\n                  distance: c,\n                  remainder: segmentLength - c\n                }\n              } else {\n                var xsign = ax2 > ax1 ? 1 : -1,\n                  ysign = ay2 > ay1 ? 1 : -1;\n                return {\n                  deltaX: xsign * Math.sqrt(Math.pow(segmentLength, 2) / (1 + Math.pow((ay2 - ay1)/(ax2 - ax1), 2))),\n                  deltaY: ysign * Math.sqrt(Math.pow(segmentLength, 2) - Math.pow(segmentLength, 2) / (1 + Math.pow((ay2 - ay1)/(ax2 - ax1), 2))),\n                  distance: segmentLength,\n                  remainder: 0\n                };\n              }\n            }\n            //-end lineSegmentOffset\n\n            do {\n\n              dashOffset = lineSegmentOffset(\n                dashRemainder > 0 ? dashRemainder :\n                  dashOn ? dashOnLength : dashOffLength);\n\n              if (dashOffset.deltaX != 0 || dashOffset.deltaY != 0) {\n                if (dashOn) {\n                  ctx.lineTo(ax1 + dashOffset.deltaX, ay1 + dashOffset.deltaY);\n                } else {\n                  ctx.moveTo(ax1 + dashOffset.deltaX, ay1 + dashOffset.deltaY);\n                }\n              }\n\n              dashOn = !dashOn;\n              dashRemainder = dashOffset.remainder;\n              ax1 += dashOffset.deltaX;\n              ay1 += dashOffset.deltaY;\n\n            } while (dashOffset.distance > 0);\n\n            prevx = x2;\n            prevy = y2;\n          }\n\n          ctx.stroke();\n        }\n        //-end plotDashes\n\n        ctx.save();\n        ctx.translate(plotOffset.left, plotOffset.top);\n        ctx.lineJoin = 'round';\n\n        var lw = series.dashes.lineWidth,\n          sw = series.shadowSize;\n\n        // FIXME: consider another form of shadow when filling is turned on\n        if (lw > 0 && sw > 0) {\n          // draw shadow as a thick and thin line with transparency\n          ctx.lineWidth = sw;\n          ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n          // position shadow at angle from the mid of line\n          var angle = Math.PI/18;\n          plotDashes(Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2));\n          ctx.lineWidth = sw/2;\n          plotDashes(Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4));\n        }\n\n        ctx.lineWidth = lw;\n        ctx.strokeStyle = series.color;\n\n        if (lw > 0) {\n          plotDashes(0, 0);\n        }\n\n        ctx.restore();\n\n      });\n      //-end draw hook\n\n    });\n    //-end processDatapoints hook\n\n  }\n  //-end init\n\n  $.plot.plugins.push({\n    init: init,\n    options: {\n      series: {\n        dashes: {\n          show: false,\n          lineWidth: 2,\n          dashLength: 10\n        }\n      }\n    },\n    name: 'dashes',\n    version: '0.1'\n  });\n\n})(jQuery)\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { AppNotification, AppNotificationsState } from 'app/types/';\n\nexport const initialState: AppNotificationsState = {\n  appNotifications: [] as AppNotification[],\n};\n\nconst appNotificationsSlice = createSlice({\n  name: 'appNotifications',\n  initialState,\n  reducers: {\n    notifyApp: (state, action: PayloadAction<AppNotification>): AppNotificationsState => ({\n      ...state,\n      appNotifications: state.appNotifications.concat([action.payload]),\n    }),\n    clearAppNotification: (state, action: PayloadAction<number>): AppNotificationsState => ({\n      ...state,\n      appNotifications: state.appNotifications.filter(appNotification => appNotification.id !== action.payload),\n    }),\n  },\n});\n\nexport const { notifyApp, clearAppNotification } = appNotificationsSlice.actions;\n\nexport const appNotificationsReducer = appNotificationsSlice.reducer;\n","var path = 'public/app/plugins/datasource/opentsdb/partials/query.editor.html';\nvar html = \"<query-editor-row query-ctrl=ctrl can-collapse=false>\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form max-width-25\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-8\\\">\\n\\t\\t\\t\\tMetric\\n\\t\\t\\t\\t<label class=gf-form-label bs-tooltip=ctrl.errors.metric style=color:#e5bd1c ng-show=ctrl.errors.metric>\\n\\t\\t\\t\\t\\t<icon name=\\\"'exclamation-triangle'\\\"></icon>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</label>\\n\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.target.metric spellcheck=false bs-typeahead=ctrl.suggestMetrics placeholder=\\\"metric name\\\" data-min-length=0 data-items=100 ng-blur=ctrl.targetBlur()>\\n\\t\\t\\t\\n\\t\\t</div>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">\\n\\t\\t\\t\\tAggregator\\n\\t\\t\\t\\t<a bs-tooltip=ctrl.errors.aggregator style=color:#e5bd1c ng-show=ctrl.errors.aggregator>\\n\\t\\t\\t\\t\\t<icon name=\\\"'exclamation-triangle'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</label>\\n\\t\\t\\t<div class=\\\"gf-form-select-wrapper max-width-15\\\">\\n\\t\\t\\t\\t<select ng-model=ctrl.target.aggregator class=gf-form-input ng-options=\\\"agg for agg in ctrl.aggregators\\\" ng-change=ctrl.targetBlur()>\\n\\t\\t \\t </select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t\\t<div class=\\\"gf-form max-width-20\\\">\\n\\t\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-6\\\">\\n\\t\\t\\t\\t\\tAlias:\\n\\t\\t\\t\\t\\t<info-popover mode=right-normal>\\n\\t\\t\\t\\t\\t\\tUse patterns like $tag_tagname to replace part of the alias for a tag value\\n\\t\\t\\t\\t\\t</info-popover>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t<input type=text class=gf-form-input ng-model=ctrl.target.alias spellcheck=false placeholder=\\\"series alias\\\" data-min-length=0 data-items=100 ng-blur=ctrl.targetBlur()>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=\\\"gf-form max-width-25\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-8\\\">Down sample</label>\\n\\t\\t\\t<input type=text class=\\\"gf-form-input gf-form-input--has-help-icon\\\" ng-model=ctrl.target.downsampleInterval ng-model-onblur ng-change=ctrl.targetBlur() placeholder=interval>\\n\\t\\t\\t<info-popover mode=right-absolute>\\n\\t\\t\\t\\tblank for auto, or for example <code>1m</code>\\n\\t\\t\\t</info-popover>\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Aggregator</label>\\n\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t<select ng-model=ctrl.target.downsampleAggregator class=gf-form-input ng-options=\\\"agg for agg in ctrl.aggregators\\\" ng-change=ctrl.targetBlur()>\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.tsdbVersion >= 2\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-6\\\">Fill</label>\\n\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t<select ng-model=ctrl.target.downsampleFillPolicy class=gf-form-input ng-options=\\\"agg for agg in ctrl.fillPolicies\\\" ng-change=ctrl.targetBlur()>\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<gf-form-switch class=gf-form label=\\\"Disable downsampling\\\" label-class=query-keyword checked=ctrl.target.disableDownsampling on-change=ctrl.targetBlur()>\\n\\t\\t</gf-form-switch>\\n\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline ng-if=\\\"ctrl.tsdbVersion >= 2\\\">\\n\\t\\t<div class=gf-form>\\n\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-8\\\">\\n\\t\\t\\t\\tFilters\\n\\t\\t\\t\\t<info-popover mode=right-normal>\\n\\t\\t\\t\\t\\tFilters does not work with tags, either of the two will work but not both.\\n\\t\\t\\t\\t</info-popover>\\n\\t\\t\\t</label>\\n\\n\\t\\t\\t<div ng-repeat=\\\"fil in ctrl.target.filters track by $index\\\" class=gf-form-label>\\n\\t\\t\\t\\t{{fil.tagk}}&nbsp;=&nbsp;{{fil.type}}&#40;{{fil.filter}}&#41;&nbsp;&#44&nbsp;groupBy&nbsp;=&nbsp;{{fil.groupBy}}\\n\\t\\t\\t\\t<a ng-click=\\\"ctrl.editFilter(fil, $index)\\\">\\n\\t\\t\\t\\t\\t<icon name=\\\"'pen'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t\\t<a ng-click=ctrl.removeFilter($index)>\\n\\t\\t\\t\\t\\t<icon name=\\\"'times'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</div>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\" ng-hide=ctrl.addFilterMode>\\n\\t\\t\\t\\t<a ng-click=ctrl.addFilter()>\\n\\t\\t\\t\\t\\t<icon name=\\\"'plus'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</label>\\n \\t\\t</div>\\n\\n\\t\\t<div class=gf-form-inline ng-show=ctrl.addFilterMode>\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<input type=text class=gf-form-input spellcheck=false bs-typeahead=ctrl.suggestTagKeys data-min-length=0 data-items=100 ng-model=ctrl.target.currentFilterKey placeholder=key>\\n\\t\\t\\t\\t\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Type</label>\\n\\t\\t\\t\\t<div class=gf-form-select-wrapper>\\n\\t\\t\\t\\t\\t<select ng-model=ctrl.target.currentFilterType class=gf-form-input ng-options=\\\"filType for filType in ctrl.filterTypes\\\">\\n\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<input type=text class=gf-form-input spellcheck=false bs-typeahead=ctrl.suggestTagValues data-min-length=0 data-items=100 ng-model=ctrl.target.currentFilterValue placeholder=filter>\\n\\t\\t\\t\\t\\n\\t\\t\\t</div>\\n\\n      <gf-form-switch class=gf-form label=\\\"Group by\\\" label-class=query-keyword checked=ctrl.target.currentFilterGroupBy on-change=ctrl.targetBlur()>\\n\\t\\t\\t</gf-form-switch>\\n\\n\\t\\t\\t<div class=gf-form ng-show=ctrl.addFilterMode>\\n\\t\\t\\t\\t<label class=gf-form-label ng-show=ctrl.errors.filters>\\n\\t\\t\\t\\t\\t<a bs-tooltip=ctrl.errors.filters style=color:#e5bd1c>\\n\\t\\t\\t\\t\\t\\t<icon name=\\\"'exclamation-triangle'\\\"></icon>\\n\\t\\t\\t\\t\\t</a>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t<label class=gf-form-label>\\n\\t\\t\\t\\t\\t<a ng-click=ctrl.addFilter() ng-hide=ctrl.errors.filters>add filter</a>\\n\\t\\t\\t\\t\\t<a ng-click=ctrl.closeAddFilterMode()>\\n\\t\\t\\t\\t\\t\\t<icon name=\\\"'times'\\\"></icon>\\n\\t\\t\\t\\t\\t</a>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<div class=gf-form>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword width-8\\\">\\n\\t\\t\\t\\tTags\\n\\t\\t\\t\\t<info-popover mode=right-normal ng-if=\\\"ctrl.tsdbVersion >= 2\\\">\\n\\t\\t\\t\\t\\tPlease use filters, tags are deprecated in opentsdb 2.2\\n\\t\\t\\t\\t</info-popover>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form ng-repeat=\\\"(key, value) in ctrl.target.tags track by $index\\\" class=gf-form>\\n\\t\\t\\t<label class=gf-form-label>\\n\\t\\t\\t\\t{{key}}&nbsp;=&nbsp;{{value}}\\n\\t\\t\\t\\t<a ng-click=\\\"ctrl.editTag(key, value)\\\">\\n\\t\\t\\t\\t\\t<icon name=\\\"'pen'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t\\t<a ng-click=ctrl.removeTag(key)>\\n\\t\\t\\t\\t\\t<icon name=\\\"'times'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form ng-hide=ctrl.addTagMode>\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">\\n\\t\\t\\t\\t<a ng-click=ctrl.addTag()><icon name=\\\"'plus'\\\"></icon></a>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form ng-show=ctrl.addTagMode>\\n\\t\\t\\t<input type=text class=gf-form-input spellcheck=false bs-typeahead=ctrl.suggestTagKeys data-min-length=0 data-items=100 ng-model=ctrl.target.currentTagKey placeholder=key>\\n\\t\\t\\t\\n\\n\\t\\t\\t<input type=text class=gf-form-input spellcheck=false bs-typeahead=ctrl.suggestTagValues data-min-length=0 data-items=100 ng-model=ctrl.target.currentTagValue placeholder=value>\\n\\t\\t\\t\\n\\n\\t\\t\\t<label class=gf-form-label ng-show=ctrl.errors.tags>\\n\\t\\t\\t\\t<a bs-tooltip=ctrl.errors.tags style=color:#e5bd1c>\\n\\t\\t\\t\\t\\t<icon name=\\\"'exclamation-triangle'\\\"></icon>\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</label>\\n\\t\\t\\t<label class=gf-form-label>\\n\\t\\t\\t\\t<a ng-click=ctrl.addTag() ng-hide=ctrl.errors.tags>add tag</a>\\n\\t\\t\\t\\t<a ng-click=ctrl.closeAddTagMode()><icon name=\\\"'times'\\\" size=\\\"'sm'\\\"></icon></a>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=gf-form-inline>\\n\\t\\t<gf-form-switch class=gf-form label=Rate label-class=\\\"width-8 query-keyword\\\" checked=ctrl.target.shouldComputeRate on-change=ctrl.targetBlur()>\\n\\t\\t</gf-form-switch>\\n\\n\\t\\t<gf-form-switch ng-hide=!ctrl.target.shouldComputeRate class=gf-form label=Counter label-class=query-keyword checked=ctrl.target.isCounter on-change=ctrl.targetBlur()>\\n\\t\\t</gf-form-switch>\\n\\n\\n\\t\\t<div class=gf-form ng-hide=\\\"!ctrl.target.isCounter || !ctrl.target.shouldComputeRate\\\">\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Counter Max</label>\\n\\t\\t\\t<input type=text class=gf-form-input ng-disabled=!ctrl.target.shouldComputeRate ng-model=ctrl.target.counterMax spellcheck=false placeholder=\\\"max value\\\" ng-model-onblur ng-blur=ctrl.targetBlur()>\\n\\t\\t\\t\\n\\n\\t\\t\\t<label class=\\\"gf-form-label query-keyword\\\">Reset Value</label>\\n\\t\\t\\t<input type=text class=\\\"tight-form-input input-small\\\" ng-disabled=!ctrl.target.shouldComputeRate ng-model=ctrl.target.counterResetValue spellcheck=false placeholder=\\\"reset value\\\" ng-model-onblur ng-blur=ctrl.targetBlur()>\\n\\t\\t\\t\\n\\t\\t</div>\\n\\n\\t\\t<div class=gf-form ng-if=\\\"ctrl.tsdbVersion > 2\\\">\\n\\t\\t\\t<gf-form-switch class=gf-form label=\\\"Explicit tags\\\" label-class=\\\"width-8 query-keyword\\\" checked=ctrl.target.explicitTags on-change=ctrl.targetBlur()>\\n\\t\\t\\t</gf-form-switch>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"gf-form gf-form--grow\\\">\\n\\t\\t\\t<div class=\\\"gf-form-label gf-form-label--grow\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n</query-editor-row>\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { eventFactory } from './utils';\n\nexport interface AppEvent<T> {\n  readonly name: string;\n  payload?: T;\n}\n\nexport type AlertPayload = [string, string?];\nexport type AlertErrorPayload = [string, (string | Error)?];\n\nexport const alertSuccess = eventFactory<AlertPayload>('alert-success');\nexport const alertWarning = eventFactory<AlertPayload>('alert-warning');\nexport const alertError = eventFactory<AlertErrorPayload>('alert-error');\n","var path = 'public/app/features/annotations/partials/event_editor.html';\nvar html = \"\\n<div class=graph-annotation>\\n\\t<div class=graph-annotation__header>\\n\\t\\t<div class=graph-annotation__user bs-tooltip=\\\"'Created by {{ctrl.login}}'\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=graph-annotation__title>\\n\\t\\t\\t<span ng-if=!ctrl.event.id>Add Annotation</span>\\n\\t\\t\\t<span ng-if=ctrl.event.id>Edit Annotation</span>\\n\\t\\t</div>\\n\\n    <div class=graph-annotation__time>{{ctrl.timeFormated}}</div>\\n\\t</div>\\n\\n\\t<form name=ctrl.form class=\\\"graph-annotation__body text-center\\\">\\n\\t\\t<div style=display:inline-block>\\n\\t\\t\\t<div class=\\\"gf-form gf-form--v-stretch\\\">\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Description</span>\\n\\t\\t\\t\\t<textarea class=\\\"gf-form-input width-20\\\" rows=2 ng-model=ctrl.event.text placeholder=Description></textarea>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=gf-form>\\n\\t\\t\\t\\t<span class=\\\"gf-form-label width-7\\\">Tags</span>\\n\\t\\t\\t\\t<bootstrap-tagsinput ng-model=ctrl.event.tags tagclass=\\\"label label-tag\\\" placeholder=\\\"add tags\\\">\\n\\t\\t\\t\\t</bootstrap-tagsinput>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=gf-form-button-row>\\n\\t\\t\\t\\t<button type=submit class=\\\"btn btn-primary\\\" ng-click=ctrl.save()>Save</button>\\n\\t\\t\\t\\t<button ng-if=ctrl.event.id type=submit class=\\\"btn btn-danger\\\" ng-click=ctrl.delete()>Delete</button>\\n\\t\\t\\t\\t<a class=btn-text ng-click=ctrl.close();>Cancel</a>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</form>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { Component } from 'react';\nimport isNil from 'lodash/isNil';\nimport classNames from 'classnames';\nimport Scrollbars from 'react-custom-scrollbars';\n\ninterface Props {\n  className?: string;\n  autoHide?: boolean;\n  autoHideTimeout?: number;\n  autoHideDuration?: number;\n  autoHeightMax?: string;\n  hideTracksWhenNotNeeded?: boolean;\n  hideHorizontalTrack?: boolean;\n  hideVerticalTrack?: boolean;\n  scrollTop?: number;\n  setScrollTop: (event: any) => void;\n  autoHeightMin?: number | string;\n  updateAfterMountMs?: number;\n}\n\n/**\n * Wraps component into <Scrollbars> component from `react-custom-scrollbars`\n */\nexport class CustomScrollbar extends Component<Props> {\n  static defaultProps: Partial<Props> = {\n    autoHide: false,\n    autoHideTimeout: 200,\n    autoHideDuration: 200,\n    setScrollTop: () => {},\n    hideTracksWhenNotNeeded: false,\n    autoHeightMin: '0',\n    autoHeightMax: '100%',\n  };\n\n  private ref: React.RefObject<Scrollbars>;\n\n  constructor(props: Props) {\n    super(props);\n    this.ref = React.createRef<Scrollbars>();\n  }\n\n  updateScroll() {\n    const ref = this.ref.current;\n    const { scrollTop } = this.props;\n\n    if (ref && !isNil(scrollTop)) {\n      ref.scrollTop(scrollTop);\n    }\n  }\n\n  componentDidMount() {\n    this.updateScroll();\n\n    // this logic is to make scrollbar visible when content is added body after mount\n    if (this.props.updateAfterMountMs) {\n      setTimeout(() => this.updateAfterMount(), this.props.updateAfterMountMs);\n    }\n  }\n\n  updateAfterMount() {\n    if (this.ref && this.ref.current) {\n      const scrollbar = this.ref.current as any;\n      if (scrollbar.update) {\n        scrollbar.update();\n      }\n    }\n  }\n\n  componentDidUpdate() {\n    this.updateScroll();\n  }\n\n  renderTrack = (track: 'track-vertical' | 'track-horizontal', hideTrack: boolean | undefined, passedProps: any) => {\n    if (passedProps.style && hideTrack) {\n      passedProps.style.display = 'none';\n    }\n\n    return <div {...passedProps} className={track} />;\n  };\n\n  renderThumb = (thumb: 'thumb-horizontal' | 'thumb-vertical', passedProps: any) => {\n    return <div {...passedProps} className={thumb} />;\n  };\n\n  renderTrackHorizontal = (passedProps: any) => {\n    return this.renderTrack('track-horizontal', this.props.hideHorizontalTrack, passedProps);\n  };\n\n  renderTrackVertical = (passedProps: any) => {\n    return this.renderTrack('track-vertical', this.props.hideVerticalTrack, passedProps);\n  };\n\n  renderThumbHorizontal = (passedProps: any) => {\n    return this.renderThumb('thumb-horizontal', passedProps);\n  };\n\n  renderThumbVertical = (passedProps: any) => {\n    return this.renderThumb('thumb-vertical', passedProps);\n  };\n\n  renderView = (passedProps: any) => {\n    return <div {...passedProps} className=\"view\" />;\n  };\n\n  render() {\n    const {\n      className,\n      children,\n      autoHeightMax,\n      autoHeightMin,\n      setScrollTop,\n      autoHide,\n      autoHideTimeout,\n      hideTracksWhenNotNeeded,\n    } = this.props;\n\n    return (\n      <Scrollbars\n        ref={this.ref}\n        className={classNames('custom-scrollbar', className)}\n        onScroll={setScrollTop}\n        autoHeight={true}\n        autoHide={autoHide}\n        autoHideTimeout={autoHideTimeout}\n        hideTracksWhenNotNeeded={hideTracksWhenNotNeeded}\n        // These autoHeightMin & autoHeightMax options affect firefox and chrome differently.\n        // Before these where set to inherit but that caused problems with cut of legends in firefox\n        autoHeightMax={autoHeightMax}\n        autoHeightMin={autoHeightMin}\n        renderTrackHorizontal={this.renderTrackHorizontal}\n        renderTrackVertical={this.renderTrackVertical}\n        renderThumbHorizontal={this.renderThumbHorizontal}\n        renderThumbVertical={this.renderThumbVertical}\n        renderView={this.renderView}\n      >\n        {children}\n      </Scrollbars>\n    );\n  }\n}\n\nexport default CustomScrollbar;\n","import { FormContextValues } from 'react-hook-form';\nexport { OnSubmit as FormsOnSubmit, FieldErrors as FormFieldErrors } from 'react-hook-form';\n\nexport type FormAPI<T> = Pick<FormContextValues<T>, 'register' | 'errors' | 'control' | 'formState' | 'getValues'>;\n","// Copyright (c) 2014, Hugh Kennedy\n// Based on code from https://github.com/hughsk/flat/blob/master/index.js\n//\nexport default function flatten(target: object, opts?: { delimiter?: any; maxDepth?: any; safe?: any }): any {\n  opts = opts || {};\n\n  const delimiter = opts.delimiter || '.';\n  let maxDepth = opts.maxDepth || 3;\n  let currentDepth = 1;\n  const output: any = {};\n\n  function step(object: any, prev: string | null) {\n    Object.keys(object).forEach(key => {\n      const value = object[key];\n      const isarray = opts?.safe && Array.isArray(value);\n      const type = Object.prototype.toString.call(value);\n      const isobject = type === '[object Object]';\n\n      const newKey = prev ? prev + delimiter + key : key;\n\n      if (!opts?.maxDepth) {\n        maxDepth = currentDepth + 1;\n      }\n\n      if (!isarray && isobject && Object.keys(value).length && currentDepth < maxDepth) {\n        ++currentDepth;\n        return step(value, newKey);\n      }\n\n      output[newKey] = value;\n    });\n  }\n\n  step(target, null);\n\n  return output;\n}\n","import React, { PureComponent } from 'react';\nimport { Cascader, CascaderOption } from '../Cascader/Cascader';\nimport { getValueFormats, SelectableValue } from '@grafana/data';\n\ninterface Props {\n  onChange: (item?: string) => void;\n  value?: string;\n  width?: number;\n}\n\nfunction formatCreateLabel(input: string) {\n  return `Custom unit: ${input}`;\n}\n\nexport class UnitPicker extends PureComponent<Props> {\n  onChange = (value: SelectableValue<string>) => {\n    this.props.onChange(value.value);\n  };\n\n  render() {\n    const { value, width } = this.props;\n\n    // Set the current selection\n    let current: SelectableValue<string> | undefined = undefined;\n\n    // All units\n    const unitGroups = getValueFormats();\n\n    // Need to transform the data structure to work well with Select\n    const groupOptions = unitGroups.map(group => {\n      const options = group.submenu.map(unit => {\n        const sel = {\n          label: unit.text,\n          value: unit.value,\n        };\n        if (unit.value === value) {\n          current = sel;\n        }\n        return sel;\n      });\n\n      return {\n        label: group.text,\n        value: group.text,\n        items: options,\n      };\n    });\n\n    // Show the custom unit\n    if (value && !current) {\n      current = { value, label: value };\n    }\n\n    return (\n      <Cascader\n        width={width}\n        initialValue={current && current.label}\n        allowCustomValue\n        formatCreateLabel={formatCreateLabel}\n        options={groupOptions as CascaderOption[]}\n        placeholder=\"Choose\"\n        onSelect={this.props.onChange}\n      />\n    );\n  }\n}\n","import React, { Component } from 'react';\nimport _ from 'lodash';\nimport { LegacyForms } from '@grafana/ui';\nimport { debounce } from 'lodash';\nimport { getBackendSrv } from '@grafana/runtime';\nconst { AsyncSelect } = LegacyForms;\n\nexport interface Team {\n  id: number;\n  label: string;\n  name: string;\n  avatarUrl: string;\n}\n\nexport interface Props {\n  onSelected: (team: Team) => void;\n  className?: string;\n}\n\nexport interface State {\n  isLoading: boolean;\n}\n\nexport class TeamPicker extends Component<Props, State> {\n  debouncedSearch: any;\n\n  constructor(props: Props) {\n    super(props);\n    this.state = { isLoading: false };\n    this.search = this.search.bind(this);\n\n    this.debouncedSearch = debounce(this.search, 300, {\n      leading: true,\n      trailing: true,\n    });\n  }\n\n  search(query?: string) {\n    this.setState({ isLoading: true });\n\n    if (_.isNil(query)) {\n      query = '';\n    }\n\n    return getBackendSrv()\n      .get(`/api/teams/search?perpage=100&page=1&query=${query}`)\n      .then((result: any) => {\n        const teams = result.teams.map((team: any) => {\n          return {\n            id: team.id,\n            value: team.id,\n            label: team.name,\n            name: team.name,\n            imgUrl: team.avatarUrl,\n          };\n        });\n\n        this.setState({ isLoading: false });\n        return teams;\n      });\n  }\n\n  render() {\n    const { onSelected, className } = this.props;\n    const { isLoading } = this.state;\n    return (\n      <div className=\"user-picker\">\n        <AsyncSelect\n          isLoading={isLoading}\n          defaultOptions={true}\n          loadOptions={this.debouncedSearch}\n          onChange={onSelected}\n          className={className}\n          placeholder=\"Select a team\"\n          noOptionsMessage={() => 'No teams found'}\n        />\n      </div>\n    );\n  }\n}\n","import React, { Component } from 'react';\nimport { UserPicker } from 'app/core/components/Select/UserPicker';\nimport { TeamPicker, Team } from 'app/core/components/Select/TeamPicker';\nimport { LegacyForms, Icon } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { User } from 'app/types';\nimport {\n  dashboardPermissionLevels,\n  dashboardAclTargets,\n  AclTarget,\n  PermissionLevel,\n  NewDashboardAclItem,\n  OrgRole,\n} from 'app/types/acl';\nconst { Select } = LegacyForms;\n\nexport interface Props {\n  onAddPermission: (item: NewDashboardAclItem) => void;\n  onCancel: () => void;\n}\n\nclass AddPermissions extends Component<Props, NewDashboardAclItem> {\n  static defaultProps = {\n    showPermissionLevels: true,\n  };\n\n  constructor(props: Props) {\n    super(props);\n    this.state = this.getCleanState();\n  }\n\n  getCleanState() {\n    return {\n      userId: 0,\n      teamId: 0,\n      type: AclTarget.Team,\n      permission: PermissionLevel.View,\n    };\n  }\n\n  onTypeChanged = (evt: any) => {\n    const type = evt.target.value as AclTarget;\n\n    switch (type) {\n      case AclTarget.User:\n      case AclTarget.Team:\n        this.setState({ type: type, userId: 0, teamId: 0, role: undefined });\n        break;\n      case AclTarget.Editor:\n        this.setState({ type: type, userId: 0, teamId: 0, role: OrgRole.Editor });\n        break;\n      case AclTarget.Viewer:\n        this.setState({ type: type, userId: 0, teamId: 0, role: OrgRole.Viewer });\n        break;\n    }\n  };\n\n  onUserSelected = (user: User) => {\n    this.setState({ userId: user && !Array.isArray(user) ? user.id : 0 });\n  };\n\n  onTeamSelected = (team: Team) => {\n    this.setState({ teamId: team && !Array.isArray(team) ? team.id : 0 });\n  };\n\n  onPermissionChanged = (permission: SelectableValue<PermissionLevel>) => {\n    this.setState({ permission: permission.value! });\n  };\n\n  onSubmit = async (evt: React.SyntheticEvent) => {\n    evt.preventDefault();\n    await this.props.onAddPermission(this.state);\n    this.setState(this.getCleanState());\n  };\n\n  isValid() {\n    switch (this.state.type) {\n      case AclTarget.Team:\n        return this.state.teamId > 0;\n      case AclTarget.User:\n        return this.state.userId > 0;\n    }\n    return true;\n  }\n\n  render() {\n    const { onCancel } = this.props;\n    const newItem = this.state;\n    const pickerClassName = 'min-width-20';\n    const isValid = this.isValid();\n    return (\n      <div className=\"gf-form-inline cta-form\">\n        <button className=\"cta-form__close btn btn-transparent\" onClick={onCancel}>\n          <Icon name=\"times\" />\n        </button>\n        <form name=\"addPermission\" onSubmit={this.onSubmit}>\n          <h5>Add Permission For</h5>\n          <div className=\"gf-form-inline\">\n            <div className=\"gf-form\">\n              <div className=\"gf-form-select-wrapper\">\n                <select className=\"gf-form-input gf-size-auto\" value={newItem.type} onChange={this.onTypeChanged}>\n                  {dashboardAclTargets.map((option, idx) => {\n                    return (\n                      <option key={idx} value={option.value}>\n                        {option.text}\n                      </option>\n                    );\n                  })}\n                </select>\n              </div>\n            </div>\n\n            {newItem.type === AclTarget.User ? (\n              <div className=\"gf-form\">\n                <UserPicker onSelected={this.onUserSelected} className={pickerClassName} />\n              </div>\n            ) : null}\n\n            {newItem.type === AclTarget.Team ? (\n              <div className=\"gf-form\">\n                <TeamPicker onSelected={this.onTeamSelected} className={pickerClassName} />\n              </div>\n            ) : null}\n\n            <div className=\"gf-form\">\n              <Select\n                isSearchable={false}\n                options={dashboardPermissionLevels}\n                onChange={this.onPermissionChanged}\n                className=\"gf-form-select-box__control--menu-right\"\n              />\n            </div>\n\n            <div className=\"gf-form\">\n              <button data-save-permission className=\"btn btn-primary\" type=\"submit\" disabled={!isValid}>\n                Save\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    );\n  }\n}\n\nexport default AddPermissions;\n","var path = 'public/app/features/alerting/partials/alert_howto.html';\nvar html = \"<div class=modal-body>\\n\\t<div class=modal-header>\\n\\t\\t<h2 class=modal-header-title>\\n\\t\\t\\t<icon name=\\\"'info-circle'\\\"></icon>\\n\\t\\t\\t<span class=p-l-1>Adding an Alert</span>\\n\\t\\t</h2>\\n\\n\\t\\t<a class=modal-header-close ng-click=dismiss();>\\n\\t\\t\\t<icon name=\\\"'times'\\\"></icon>\\n\\t\\t</a>\\n\\t</div>\\n\\n\\n\\t<div class=modal-content>\\n\\t\\t<div class=text-center>\\n\\t\\t\\t<img src=public/img/alert_howto_new.png>\\n\\t\\t</div>\\n\\t\\t<p class=\\\"p-a-2 text-center offset-lg-1 col-lg-10\\\">\\n\\t\\t\\tAlerts are added and configured in the <strong>Alert Tab</strong> of any dashboard\\n\\t\\t\\tgraph panel, letting you build and visualize an alert using existing queries.\\n\\t\\t\\t<br> <br>\\n\\t\\t\\tTo persist your alert rule changes remember to save the dashboard.\\n\\t\\t\\t<br>\\n\\t\\t\\t<br>\\n\\t\\t</p>\\n\\t</div>\\n\\n</div>\\n\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","var path = 'public/app/features/dashboard/components/VersionHistory/template.html';\nvar html = \"<h3 class=dashboard-settings__header>\\n  <a ng-click=\\\"ctrl.switchMode('list')\\\">Versions</a>\\n  <span ng-show=\\\"ctrl.mode === 'compare'\\\">\\n    <icon name=\\\"'angle-right'\\\"></icon> Comparing {{ctrl.baseInfo.version}}\\n    <icon name=\\\"'arrows-h'\\\"></icon>\\n    {{ctrl.newInfo.version}}\\n    <cite class=muted ng-if=ctrl.isNewLatest>(Latest)</cite>\\n  </span>\\n</h3>\\n\\n<div ng-if=\\\"ctrl.mode === 'list'\\\">\\n  <div ng-if=ctrl.loading>\\n    <icon name=\\\"'fa fa-spinner'\\\" class=fa-spin></icon>\\n    <em>Fetching history list&hellip;</em>\\n  </div>\\n\\n  <div ng-if=!ctrl.loading>\\n    <div class=gf-form-group>\\n      <table class=filter-table>\\n        <thead>\\n          <tr>\\n            <th class=width-4></th>\\n            <th class=width-4>Version</th>\\n            <th class=width-14>Date</th>\\n            <th class=width-10>Updated By</th>\\n            <th>Notes</th>\\n            <th></th>\\n          </tr>\\n        </thead>\\n        <tbody>\\n          <tr ng-repeat=\\\"revision in ctrl.revisions\\\">\\n            <td class=filter-table__switch-cell bs-tooltip=\\\"!revision.checked && ctrl.canCompare ? 'You can only compare 2 versions at a time' : ''\\\" data-placement=right>\\n              <gf-form-checkbox switch-class=gf-form-switch--table-cell checked=revision.checked on-change=ctrl.revisionSelectionChanged() ng-disabled=\\\"!revision.checked && ctrl.canCompare\\\">\\n              </gf-form-checkbox>\\n            </td>\\n            <td class=text-center>{{revision.version}}</td>\\n            <td>{{revision.createdDateString}}</td>\\n            <td>{{revision.createdBy}}</td>\\n            <td>{{revision.message}}</td>\\n            <td class=text-right>\\n              <a class=\\\"btn btn-inverse btn-small\\\" ng-show=\\\"revision.version !== ctrl.dashboard.version\\\" ng-click=ctrl.restore(revision.version)>\\n                <icon name=\\\"'history'\\\" size=\\\"'xs'\\\" style=margin-bottom:2px></icon>&nbsp;&nbsp;Restore\\n              </a>\\n              <a class=\\\"label label-tag\\\" ng-show=\\\"revision.version === ctrl.dashboard.version\\\">\\n                Latest\\n              </a>\\n            </td>\\n          </tr>\\n        </tbody>\\n      </table>\\n\\n      <div ng-if=ctrl.appending>\\n        <icon name=\\\"'fa fa-spinner'\\\" class=fa-spin></icon>\\n        <em>Fetching more entries&hellip;</em>\\n      </div>\\n\\n      <div class=gf-form-group>\\n        <div class=gf-form-button-row>\\n          <button type=button class=\\\"btn gf-form-button btn-inverse\\\" ng-if=\\\"ctrl.revisions.length >= ctrl.limit\\\" ng-click=ctrl.addToLog() ng-disabled=ctrl.isLastPage()>\\n            Show more versions\\n          </button>\\n          <button type=button class=\\\"btn btn-primary\\\" ng-if=\\\"ctrl.revisions.length > 1\\\" ng-disabled=!ctrl.canCompare ng-click=ctrl.getDiff(ctrl.diff) bs-tooltip=\\\"ctrl.canCompare ? '' : 'Select 2 versions to start comparing'\\\" data-placement=bottom>\\n            <icon name=\\\"'code-branch'\\\"></icon>&nbsp;&nbsp;Compare versions\\n          </button>\\n        </div>\\n      </div>\\n    </div>\\n  </div>\\n</div>\\n\\n<div ng-if=\\\"ctrl.mode === 'compare'\\\">\\n  <div ng-if=ctrl.loading>\\n    <icon name=\\\"'fa fa-spinner'\\\" class=fa-spin></icon>\\n    <em>Fetching changes&hellip;</em>\\n  </div>\\n\\n  <div ng-if=!ctrl.loading>\\n    <button type=button class=\\\"btn btn-danger pull-right\\\" ng-click=ctrl.restore(ctrl.baseInfo.version) ng-if=ctrl.isNewLatest>\\n      <icon name=\\\"'history'\\\"></icon>&nbsp;&nbsp;Restore to version {{ctrl.baseInfo.version}}\\n    </button>\\n    <section>\\n      <p class=\\\"small muted\\\">\\n        <strong>Version {{ctrl.newInfo.version}}</strong> updated by\\n        <span>{{ctrl.newInfo.createdBy}} </span>\\n        <span>{{ctrl.newInfo.ageString}}</span>\\n        <span> - {{ctrl.newInfo.message}}</span>\\n      </p>\\n      <p class=\\\"small muted\\\">\\n        <strong>Version {{ctrl.baseInfo.version}}</strong> updated by\\n        <span>{{ctrl.baseInfo.createdBy}} </span>\\n        <span>{{ctrl.baseInfo.ageString}}</span>\\n        <span> - {{ctrl.baseInfo.message}}</span>\\n      </p>\\n    </section>\\n\\n    <div id=delta diff-delta>\\n      <div class=delta-basic compile=ctrl.delta.basic></div>\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button class=\\\"btn btn-secondary\\\" ng-click=\\\"ctrl.getDiff('json')\\\">View JSON Diff</button>\\n    </div>\\n\\n    <div class=delta-html ng-show=\\\"ctrl.diff === 'json'\\\" compile=ctrl.delta.json></div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import React, { useEffect } from 'react';\nimport { Button, ConfirmModal, HorizontalGroup, Modal, stylesFactory, useTheme } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from 'emotion';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { useDashboardSave } from './useDashboardSave';\nimport { SaveDashboardModalProps } from './types';\nimport { SaveDashboardAsButton } from './SaveDashboardButton';\n\ninterface SaveDashboardErrorProxyProps {\n  /** original dashboard */\n  dashboard: DashboardModel;\n  /** dashboard save model with applied modifications, i.e. title */\n  dashboardSaveModel: any;\n  error: any;\n  onDismiss: () => void;\n}\n\nexport const SaveDashboardErrorProxy: React.FC<SaveDashboardErrorProxyProps> = ({\n  dashboard,\n  dashboardSaveModel,\n  error,\n  onDismiss,\n}) => {\n  const { onDashboardSave } = useDashboardSave(dashboard);\n\n  useEffect(() => {\n    if (error.data && isHandledError(error.data.status)) {\n      error.isHandled = true;\n    }\n  }, []);\n\n  return (\n    <>\n      {error.data && error.data.status === 'version-mismatch' && (\n        <ConfirmModal\n          isOpen={true}\n          title=\"Conflict\"\n          body={\n            <div>\n              Someone else has updated this dashboard <br /> <small>Would you still like to save this dashboard?</small>\n            </div>\n          }\n          confirmText=\"Save & Overwrite\"\n          onConfirm={async () => {\n            await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);\n            onDismiss();\n          }}\n          onDismiss={onDismiss}\n        />\n      )}\n      {error.data && error.data.status === 'name-exists' && (\n        <ConfirmModal\n          isOpen={true}\n          title=\"Conflict\"\n          body={\n            <div>\n              A dashboard with the same name in selected folder already exists. <br />\n              <small>Would you still like to save this dashboard?</small>\n            </div>\n          }\n          confirmText=\"Save & Overwrite\"\n          onConfirm={async () => {\n            await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);\n            onDismiss();\n          }}\n          onDismiss={onDismiss}\n        />\n      )}\n      {error.data && error.data.status === 'plugin-dashboard' && (\n        <ConfirmPluginDashboardSaveModal dashboard={dashboard} onDismiss={onDismiss} />\n      )}\n    </>\n  );\n};\n\nconst ConfirmPluginDashboardSaveModal: React.FC<SaveDashboardModalProps> = ({ onDismiss, dashboard }) => {\n  const theme = useTheme();\n  const { onDashboardSave } = useDashboardSave(dashboard);\n  const styles = getConfirmPluginDashboardSaveModalStyles(theme);\n\n  return (\n    <Modal className={styles.modal} title=\"Plugin Dashboard\" icon=\"copy\" isOpen={true} onDismiss={onDismiss}>\n      <div className={styles.modalContent}>\n        <div className={styles.modalText}>\n          Your changes will be lost when you update the plugin.\n          <br /> <small>Use Save As to create custom version.</small>\n        </div>\n        <HorizontalGroup justify=\"center\">\n          <SaveDashboardAsButton dashboard={dashboard} onSaveSuccess={onDismiss} />\n          <Button\n            variant=\"destructive\"\n            onClick={async () => {\n              await onDashboardSave(dashboard.getSaveModelClone(), { overwrite: true }, dashboard);\n              onDismiss();\n            }}\n          >\n            Overwrite\n          </Button>\n          <Button variant=\"secondary\" onClick={onDismiss}>\n            Cancel\n          </Button>\n        </HorizontalGroup>\n      </div>\n    </Modal>\n  );\n};\n\nconst isHandledError = (errorStatus: string) => {\n  switch (errorStatus) {\n    case 'version-mismatch':\n    case 'name-exists':\n    case 'plugin-dashboard':\n      return true;\n\n    default:\n      return false;\n  }\n};\n\nconst getConfirmPluginDashboardSaveModalStyles = stylesFactory((theme: GrafanaTheme) => ({\n  modal: css`\n    width: 500px;\n  `,\n  modalContent: css`\n    text-align: center;\n  `,\n  modalText: css`\n    font-size: ${theme.typography.heading.h4};\n    color: ${theme.colors.link};\n    margin-bottom: calc(${theme.spacing.d} * 2);\n    padding-top: ${theme.spacing.d};\n  `,\n  modalButtonRow: css`\n    margin-bottom: 14px;\n    a,\n    button {\n      margin-right: ${theme.spacing.d};\n    }\n  `,\n}));\n","import { eventFactory, TimeRange } from '@grafana/data';\nimport { DashboardModel } from 'app/features/dashboard/state';\n\n/**\n * Event Payloads\n */\n\nexport interface ShowDashSearchPayload {\n  query?: string;\n}\n\nexport interface LocationChangePayload {\n  href: string;\n}\n\nexport interface ShowModalPayload {\n  model?: any;\n  modalClass?: string;\n  src?: string;\n  templateHtml?: string;\n  backdrop?: any;\n  scope?: any;\n}\n\nexport interface ShowModalReactPayload {\n  component: React.ComponentType;\n  props?: any;\n}\n\nexport interface ShowConfirmModalPayload {\n  title?: string;\n  text?: string;\n  text2?: string;\n  text2htmlBind?: boolean;\n  confirmText?: string;\n  altActionText?: string;\n  yesText?: string;\n  noText?: string;\n  icon?: string;\n\n  onConfirm?: () => void;\n  onAltAction?: () => void;\n}\n\nexport interface DataSourceResponse<T> {\n  data: T;\n  readonly status: number;\n  readonly statusText: string;\n  readonly ok: boolean;\n  readonly headers: Headers;\n  readonly redirected: boolean;\n  readonly type: ResponseType;\n  readonly url: string;\n  readonly config: any;\n}\n\ntype DataSourceResponsePayload = DataSourceResponse<any>;\n\nexport interface SaveDashboardPayload {\n  overwrite?: boolean;\n  folderId?: number;\n  makeEditable?: boolean;\n}\n\nexport interface GraphHoverPayload {\n  pos: any;\n  panel: {\n    id: number;\n  };\n}\n\nexport interface ToggleKioskModePayload {\n  exit?: boolean;\n}\n\nexport interface GraphClickedPayload {\n  pos: any;\n  panel: any;\n  item: any;\n}\n\nexport interface ThresholdChangedPayload {\n  threshold: any;\n  handleIndex: any;\n}\n\nexport interface DashScrollPayload {\n  restore?: boolean;\n  animate?: boolean;\n  pos?: number;\n}\n\n/**\n * Events\n */\n\nexport const showDashSearch = eventFactory<ShowDashSearchPayload>('show-dash-search');\nexport const hideDashSearch = eventFactory('hide-dash-search');\nexport const hideDashEditor = eventFactory('hide-dash-editor');\nexport const dashScroll = eventFactory<DashScrollPayload>('dash-scroll');\nexport const dashLinksUpdated = eventFactory('dash-links-updated');\nexport const saveDashboard = eventFactory<SaveDashboardPayload>('save-dashboard');\nexport const dashboardFetchStart = eventFactory('dashboard-fetch-start');\nexport const dashboardSaved = eventFactory<DashboardModel>('dashboard-saved');\nexport const removePanel = eventFactory<number>('remove-panel');\n\nexport const searchQuery = eventFactory('search-query');\n\nexport const locationChange = eventFactory<LocationChangePayload>('location-change');\n\nexport const timepickerOpen = eventFactory('timepickerOpen');\nexport const timepickerClosed = eventFactory('timepickerClosed');\n\nexport const showModal = eventFactory<ShowModalPayload>('show-modal');\nexport const showConfirmModal = eventFactory<ShowConfirmModalPayload>('confirm-modal');\nexport const hideModal = eventFactory('hide-modal');\nexport const showModalReact = eventFactory<ShowModalReactPayload>('show-modal-react');\n\nexport const dsRequestResponse = eventFactory<DataSourceResponsePayload>('ds-request-response');\nexport const dsRequestError = eventFactory<any>('ds-request-error');\n\nexport const graphHover = eventFactory<GraphHoverPayload>('graph-hover');\nexport const graphHoverClear = eventFactory('graph-hover-clear');\n\nexport const toggleSidemenuMobile = eventFactory('toggle-sidemenu-mobile');\nexport const toggleSidemenuHidden = eventFactory('toggle-sidemenu-hidden');\n\nexport const playlistStarted = eventFactory('playlist-started');\nexport const playlistStopped = eventFactory('playlist-stopped');\n\nexport const toggleKioskMode = eventFactory<ToggleKioskModePayload>('toggle-kiosk-mode');\nexport const toggleViewMode = eventFactory('toggle-view-mode');\n\nexport const timeRangeUpdated = eventFactory<TimeRange>('time-range-updated');\n\nexport const repeatsProcessed = eventFactory('repeats-processed');\nexport const rowExpanded = eventFactory('row-expanded');\nexport const rowCollapsed = eventFactory('row-collapsed');\nexport const templateVariableValueUpdated = eventFactory('template-variable-value-updated');\nexport const submenuVisibilityChanged = eventFactory<boolean>('submenu-visibility-changed');\n\nexport const graphClicked = eventFactory<GraphClickedPayload>('graph-click');\n\nexport const thresholdChanged = eventFactory<ThresholdChangedPayload>('threshold-changed');\n\nexport const zoomOut = eventFactory<number>('zoom-out');\n\nexport const shiftTime = eventFactory<number>('shift-time');\n\nexport const elasticQueryUpdated = eventFactory('elastic-query-updated');\n\nexport const layoutModeChanged = eventFactory<string>('layout-mode-changed');\n\nexport const jsonDiffReady = eventFactory('json-diff-ready');\n\nexport const closeTimepicker = eventFactory('closeTimepicker');\n\nexport const routeUpdated = eventFactory('$routeUpdate');\n","import { Field, FieldType, DataFrame } from '../../types/dataFrame';\nimport { FieldMatcherID } from './ids';\nimport { FieldMatcherInfo } from '../../types/transformations';\n\n// General Field matcher\nconst fieldTypeMatcher: FieldMatcherInfo<FieldType> = {\n  id: FieldMatcherID.byType,\n  name: 'Field Type',\n  description: 'match based on the field type',\n  defaultOptions: FieldType.number,\n\n  get: (type: FieldType) => {\n    return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n      return type === field.type;\n    };\n  },\n\n  getOptionsDisplayText: (type: FieldType) => {\n    return `Field type: ${type}`;\n  },\n};\n\n// Numeric Field matcher\n// This gets its own entry so it shows up in the dropdown\nconst numericMatcher: FieldMatcherInfo = {\n  id: FieldMatcherID.numeric,\n  name: 'Numeric Fields',\n  description: 'Fields with type number',\n\n  get: () => {\n    return fieldTypeMatcher.get(FieldType.number);\n  },\n\n  getOptionsDisplayText: () => {\n    return 'Numeric Fields';\n  },\n};\n\n// Time Field matcher\nconst timeMatcher: FieldMatcherInfo = {\n  id: FieldMatcherID.time,\n  name: 'Time Fields',\n  description: 'Fields with type time',\n\n  get: () => {\n    return fieldTypeMatcher.get(FieldType.time);\n  },\n\n  getOptionsDisplayText: () => {\n    return 'Time Fields';\n  },\n};\n\n/**\n * Registry Initalization\n */\nexport function getFieldTypeMatchers(): FieldMatcherInfo[] {\n  return [fieldTypeMatcher, numericMatcher, timeMatcher];\n}\n","import { DataFrame } from '../../types/dataFrame';\nimport { FrameMatcherID } from './ids';\nimport { FrameMatcherInfo } from '../../types/transformations';\nimport { stringToJsRegex } from '../../text';\n\n// General Field matcher\nconst refIdMacher: FrameMatcherInfo<string> = {\n  id: FrameMatcherID.byRefId,\n  name: 'Query refId',\n  description: 'match the refId',\n  defaultOptions: 'A',\n\n  get: (pattern: string) => {\n    const regex = stringToJsRegex(pattern);\n    return (frame: DataFrame) => {\n      return regex.test(frame.refId || '');\n    };\n  },\n\n  getOptionsDisplayText: (pattern: string) => {\n    return `RefID: ${pattern}`;\n  },\n};\n\nexport function getRefIdMatchers(): FrameMatcherInfo[] {\n  return [refIdMacher];\n}\n","// Load the Buildtin matchers\nimport { getFieldPredicateMatchers, getFramePredicateMatchers } from './matchers/predicates';\nimport { getFieldNameMatchers, getFrameNameMatchers } from './matchers/nameMatcher';\nimport { getFieldTypeMatchers } from './matchers/fieldTypeMatcher';\nimport { getRefIdMatchers } from './matchers/refIdMatcher';\nimport {\n  FieldMatcherInfo,\n  MatcherConfig,\n  FrameMatcherInfo,\n  FieldMatcher,\n  FrameMatcher,\n} from '../types/transformations';\nimport { Registry } from '../utils/Registry';\n\nexport const fieldMatchers = new Registry<FieldMatcherInfo>(() => {\n  return [\n    ...getFieldPredicateMatchers(), // Predicates\n    ...getFieldTypeMatchers(), // by type\n    ...getFieldNameMatchers(), // by name\n  ];\n});\n\nexport const frameMatchers = new Registry<FrameMatcherInfo>(() => {\n  return [\n    ...getFramePredicateMatchers(), // Predicates\n    ...getFrameNameMatchers(), // by name\n    ...getRefIdMatchers(), // by query refId\n  ];\n});\n\nexport function getFieldMatcher(config: MatcherConfig): FieldMatcher {\n  const info = fieldMatchers.get(config.id);\n  if (!info) {\n    throw new Error('Unknown Matcher: ' + config.id);\n  }\n  return info.get(config.options);\n}\n\nexport function getFrameMatchers(config: MatcherConfig): FrameMatcher {\n  const info = frameMatchers.get(config.id);\n  if (!info) {\n    throw new Error('Unknown Matcher: ' + config.id);\n  }\n  return info.get(config.options);\n}\n","(function ($) {\n    var options = {\n        series: {\n            stackpercent: null\n        } // or number/string\n    };\n\n    function init(plot) {\n\n        // will be built up dynamically as a hash from x-value, or y-value if horizontal\n        var stackBases = {};\n        var processed = false;\n        var stackSums = {};\n\n        //set percentage for stacked chart\n        function processRawData(plot, series, data, datapoints) {\n            if (!processed) {\n                processed = true;\n                stackSums = getStackSums(plot.getData());\n            }\n\t\t\tif (series.stackpercent == true) {\n\t\t\t\tvar num = data.length;\n\t\t\t\tseries.percents = [];\n\t\t\t\tvar key_idx = 0;\n\t\t\t\tvar value_idx = 1;\n\t\t\t\tif (series.bars && series.bars.horizontal && series.bars.horizontal === true) {\n\t\t\t\t\tkey_idx = 1;\n\t\t\t\t\tvalue_idx = 0;\n\t\t\t\t}\n\t\t\t\tfor (var j = 0; j < num; j++) {\n\t\t\t\t\tvar sum = stackSums[data[j][key_idx] + \"\"];\n\t\t\t\t\tif (sum > 0) {\n\t\t\t\t\t\tseries.percents.push(data[j][value_idx] * 100 / sum);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tseries.percents.push(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n        }\n\n        //calculate summary\n        function getStackSums(_data) {\n            var data_len = _data.length;\n            var sums = {};\n            if (data_len > 0) {\n                //caculate summary\n                for (var i = 0; i < data_len; i++) {\n                    if (_data[i].stackpercent) {\n\t\t\t\t\t\tvar key_idx = 0;\n\t\t\t\t\t\tvar value_idx = 1;\n\t\t\t\t\t\tif (_data[i].bars && _data[i].bars.horizontal && _data[i].bars.horizontal === true) {\n\t\t\t\t\t\t\tkey_idx = 1;\n\t\t\t\t\t\t\tvalue_idx = 0;\n\t\t\t\t\t\t}\n                        var num = _data[i].data.length;\n                        for (var j = 0; j < num; j++) {\n                            var value = 0;\n                            if (_data[i].data[j][1] != null) {\n                                value = _data[i].data[j][value_idx];\n                            }\n                            if (sums[_data[i].data[j][key_idx] + \"\"]) {\n                                sums[_data[i].data[j][key_idx] + \"\"] += value;\n                            } else {\n                                sums[_data[i].data[j][key_idx] + \"\"] = value;\n                            }\n\n                        }\n                    }\n                }\n            }\n            return sums;\n        }\n\n        function stackData(plot, s, datapoints) {\n            if (!s.stackpercent) return;\n            if (!processed) {\n                stackSums = getStackSums(plot.getData());\n            }\n            var newPoints = [];\n\n\n\t\t\tvar key_idx = 0;\n\t\t\tvar value_idx = 1;\n\t\t\tif (s.bars && s.bars.horizontal && s.bars.horizontal === true) {\n\t\t\t\tkey_idx = 1;\n\t\t\t\tvalue_idx = 0;\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < datapoints.points.length; i += 3) {\n\t\t\t\t// note that the values need to be turned into absolute y-values.\n\t\t\t\t// in other words, if you were to stack (x, y1), (x, y2), and (x, y3),\n\t\t\t\t// (each from different series, which is where stackBases comes in),\n\t\t\t\t// you'd want the new points to be (x, y1, 0), (x, y1+y2, y1), (x, y1+y2+y3, y1+y2)\n\t\t\t\t// generally, (x, thisValue + (base up to this point), + (base up to this point))\n\t\t\t\tif (!stackBases[datapoints.points[i + key_idx]]) {\n\t\t\t\t\tstackBases[datapoints.points[i + key_idx]] = 0;\n\t\t\t\t}\n\t\t\t\tnewPoints[i + key_idx] = datapoints.points[i + key_idx];\n\t\t\t\tnewPoints[i + value_idx] = datapoints.points[i + value_idx] + stackBases[datapoints.points[i + key_idx]];\n\t\t\t\tnewPoints[i + 2] = stackBases[datapoints.points[i + key_idx]];\n\t\t\t\tstackBases[datapoints.points[i + key_idx]] += datapoints.points[i + value_idx];\n\t\t\t\t// change points to percentage values\n\t\t\t\t// you may need to set yaxis:{ max = 100 }\n\t\t\t\tif ( stackSums[newPoints[i+key_idx]+\"\"] > 0 ){\n\t\t\t\t\tnewPoints[i + value_idx] = newPoints[i + value_idx] * 100 / stackSums[newPoints[i + key_idx] + \"\"];\n\t\t\t\t\tnewPoints[i + 2] = newPoints[i + 2] * 100 / stackSums[newPoints[i + key_idx] + \"\"];\n\t\t\t\t} else {\n\t\t\t\t\tnewPoints[i + value_idx] = 0;\n\t\t\t\t\tnewPoints[i + 2] = 0;\n\t\t\t\t}\n\t\t\t}\n\n            datapoints.points = newPoints;\n        }\n\n\t\tplot.hooks.processRawData.push(processRawData);\n        plot.hooks.processDatapoints.push(stackData);\n    }\n\n    $.plot.plugins.push({\n        init: init,\n        options: options,\n        name: 'stackpercent',\n        version: '0.1'\n    });\n})(jQuery);\n","import { ComponentType } from 'react';\nimport { RegistryItem, Registry } from '../utils/Registry';\nimport { NumberFieldConfigSettings, SelectFieldConfigSettings, StringFieldConfigSettings } from '../field';\n\n/**\n * Option editor registry item\n */\nexport interface OptionsEditorItem<TOptions, TSettings, TEditorProps, TValue> extends RegistryItem {\n  /**\n   * Path of the options property to control.\n   *\n   * @example\n   * Given options object of a type:\n   * ```ts\n   * interface CustomOptions {\n   *   a: {\n   *     b: string;\n   *   }\n   * }\n   * ```\n   *\n   * path can be either 'a' or 'a.b'.\n   */\n  path: (keyof TOptions & string) | string;\n  /**\n   * React component used to edit the options property\n   */\n  editor: ComponentType<TEditorProps>;\n  /**\n   * Custom settings of the editor.\n   */\n  settings?: TSettings;\n  /**\n   * Array of strings representing category of the options property.\n   */\n  category?: string[];\n  defaultValue?: TValue;\n  /**\n   * Function that enables configuration of when option editor should be shown based on current options properties.\n   *\n   * @param currentConfig Current options values\n   */\n  showIf?: (currentConfig: TOptions) => boolean | undefined;\n  /**\n   * Function that returns number of items if given option represents a collection, i.e. array of items.\n   * @param value\n   */\n  getItemsCount?: (value?: TValue) => number;\n}\n\n/**\n * Configuration of option editor registry item\n */\ninterface OptionEditorConfig<TOptions, TSettings, TValue = any> {\n  id: keyof TOptions & string;\n  name: string;\n  description?: string;\n  settings?: TSettings;\n  defaultValue?: TValue;\n}\n\n/**\n * Describes an API for option editors UI builder\n */\nexport interface OptionsUIRegistryBuilderAPI<\n  TOptions,\n  TEditorProps,\n  T extends OptionsEditorItem<TOptions, any, TEditorProps, any>\n> {\n  addNumberInput?<TSettings extends NumberFieldConfigSettings = NumberFieldConfigSettings>(\n    config: OptionEditorConfig<TOptions, TSettings, number>\n  ): this;\n\n  addTextInput?<TSettings extends StringFieldConfigSettings = StringFieldConfigSettings>(\n    config: OptionEditorConfig<TOptions, TSettings, string>\n  ): this;\n\n  addSelect?<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n    config: OptionEditorConfig<TOptions, TSettings, TOption>\n  ): this;\n\n  addRadio?<TOption, TSettings extends SelectFieldConfigSettings<TOption> = SelectFieldConfigSettings<TOption>>(\n    config: OptionEditorConfig<TOptions, TSettings, TOption>\n  ): this;\n\n  addBooleanSwitch?<TSettings = any>(config: OptionEditorConfig<TOptions, TSettings, boolean>): this;\n\n  addUnitPicker?<TSettings = any>(config: OptionEditorConfig<TOptions, TSettings, string>): this;\n\n  addColorPicker?<TSettings = any>(config: OptionEditorConfig<TOptions, TSettings, string>): this;\n\n  /**\n   * Enables custom editor definition\n   * @param config\n   */\n  addCustomEditor<TSettings, TValue>(config: OptionsEditorItem<TOptions, TSettings, TEditorProps, TValue>): this;\n\n  /**\n   * Returns registry of option editors\n   */\n  getRegistry: () => Registry<T>;\n}\n\nexport abstract class OptionsUIRegistryBuilder<\n  TOptions,\n  TEditorProps,\n  T extends OptionsEditorItem<TOptions, any, TEditorProps, any>\n> implements OptionsUIRegistryBuilderAPI<TOptions, TEditorProps, T> {\n  private properties: T[] = [];\n\n  addCustomEditor<TSettings, TValue>(config: T & OptionsEditorItem<TOptions, TSettings, TEditorProps, TValue>): this {\n    this.properties.push(config);\n    return this;\n  }\n\n  getRegistry() {\n    return new Registry(() => {\n      return this.properties;\n    });\n  }\n}\n","import { FieldConfigEditorProps, FieldConfigPropertyItem, FieldConfigEditorConfig } from '../types/fieldOverrides';\nimport { OptionsUIRegistryBuilder } from '../types/OptionsUIRegistryBuilder';\nimport { FieldType } from '../types/dataFrame';\nimport { PanelOptionsEditorConfig, PanelOptionsEditorItem } from '../types/panel';\nimport {\n  numberOverrideProcessor,\n  selectOverrideProcessor,\n  stringOverrideProcessor,\n  booleanOverrideProcessor,\n  standardEditorsRegistry,\n  SelectFieldConfigSettings,\n  StandardEditorProps,\n  StringFieldConfigSettings,\n  NumberFieldConfigSettings,\n  ColorFieldConfigSettings,\n  identityOverrideProcessor,\n  UnitFieldConfigSettings,\n  unitOverrideProcessor,\n} from '../field';\n\n/**\n * Fluent API for declarative creation of field config option editors\n */\nexport class FieldConfigEditorBuilder<TOptions> extends OptionsUIRegistryBuilder<\n  TOptions,\n  FieldConfigEditorProps<any, any>,\n  FieldConfigPropertyItem<TOptions>\n> {\n  addNumberInput<TSettings>(config: FieldConfigEditorConfig<TOptions, TSettings & NumberFieldConfigSettings, number>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      override: standardEditorsRegistry.get('number').editor as any,\n      editor: standardEditorsRegistry.get('number').editor as any,\n      process: numberOverrideProcessor,\n      shouldApply: config.shouldApply ? config.shouldApply : field => field.type === FieldType.number,\n      settings: config.settings || {},\n    });\n  }\n\n  addTextInput<TSettings>(config: FieldConfigEditorConfig<TOptions, TSettings & StringFieldConfigSettings, string>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      override: standardEditorsRegistry.get('text').editor as any,\n      editor: standardEditorsRegistry.get('text').editor as any,\n      process: stringOverrideProcessor,\n      shouldApply: config.shouldApply ? config.shouldApply : field => field.type === FieldType.string,\n      settings: config.settings || {},\n    });\n  }\n\n  addSelect<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n    config: FieldConfigEditorConfig<TOptions, TSettings, TOption>\n  ) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      override: standardEditorsRegistry.get('select').editor as any,\n      editor: standardEditorsRegistry.get('select').editor as any,\n      process: selectOverrideProcessor,\n      // ???\n      shouldApply: config.shouldApply ? config.shouldApply : () => true,\n      settings: config.settings || { options: [] },\n    });\n  }\n\n  addRadio<TOption, TSettings = any>(config: FieldConfigEditorConfig<TOptions, TSettings, TOption>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      override: standardEditorsRegistry.get('radio').editor as any,\n      editor: standardEditorsRegistry.get('radio').editor as any,\n      process: selectOverrideProcessor,\n      // ???\n      shouldApply: config.shouldApply ? config.shouldApply : () => true,\n      settings: config.settings || { options: [] },\n    });\n  }\n\n  addBooleanSwitch<TSettings = any>(config: FieldConfigEditorConfig<TOptions, TSettings, boolean>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('boolean').editor as any,\n      override: standardEditorsRegistry.get('boolean').editor as any,\n      process: booleanOverrideProcessor,\n      shouldApply: config.shouldApply ? config.shouldApply : () => true,\n      settings: config.settings || {},\n    });\n  }\n\n  addColorPicker<TSettings = any>(\n    config: FieldConfigEditorConfig<TOptions, TSettings & ColorFieldConfigSettings, string>\n  ) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('color').editor as any,\n      override: standardEditorsRegistry.get('color').editor as any,\n      process: identityOverrideProcessor,\n      shouldApply: config.shouldApply ? config.shouldApply : () => true,\n      settings: config.settings || {},\n    });\n  }\n\n  addUnitPicker<TSettings = any>(\n    config: FieldConfigEditorConfig<TOptions, TSettings & UnitFieldConfigSettings, string>\n  ) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('unit').editor as any,\n      override: standardEditorsRegistry.get('unit').editor as any,\n      process: unitOverrideProcessor,\n      shouldApply: config.shouldApply ? config.shouldApply : () => true,\n      settings: config.settings || {},\n    });\n  }\n}\n\n/**\n * Fluent API for declarative creation of panel options\n */\nexport class PanelOptionsEditorBuilder<TOptions> extends OptionsUIRegistryBuilder<\n  TOptions,\n  StandardEditorProps,\n  PanelOptionsEditorItem<TOptions>\n> {\n  addNumberInput<TSettings>(config: PanelOptionsEditorConfig<TOptions, TSettings & NumberFieldConfigSettings, number>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('number').editor as any,\n    });\n  }\n\n  addTextInput<TSettings>(config: PanelOptionsEditorConfig<TOptions, TSettings & StringFieldConfigSettings, string>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('text').editor as any,\n    });\n  }\n\n  addSelect<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n    config: PanelOptionsEditorConfig<TOptions, TSettings, TOption>\n  ) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('select').editor as any,\n    });\n  }\n\n  addRadio<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n    config: PanelOptionsEditorConfig<TOptions, TSettings, TOption>\n  ) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('radio').editor as any,\n    });\n  }\n\n  addBooleanSwitch<TSettings = any>(config: PanelOptionsEditorConfig<TOptions, TSettings, boolean>) {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('boolean').editor as any,\n    });\n  }\n\n  addColorPicker<TSettings = any>(\n    config: PanelOptionsEditorConfig<TOptions, TSettings & ColorFieldConfigSettings, string>\n  ): this {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('color').editor as any,\n      settings: config.settings || {},\n    });\n  }\n\n  addUnitPicker<TSettings = any>(\n    config: PanelOptionsEditorConfig<TOptions, TSettings & UnitFieldConfigSettings, string>\n  ): this {\n    return this.addCustomEditor({\n      ...config,\n      id: config.path,\n      editor: standardEditorsRegistry.get('unit').editor as any,\n    });\n  }\n}\n","import angular from 'angular';\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/core/core_module';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport DatasourceSrv from '../plugins/datasource_srv';\nimport appEvents from 'app/core/app_events';\nimport { AppEvents } from '@grafana/data';\n\nexport class AnnotationsEditorCtrl {\n  mode: any;\n  datasources: any;\n  annotations: any;\n  currentAnnotation: any;\n  currentDatasource: any;\n  currentIsNew: any;\n  dashboard: DashboardModel;\n\n  annotationDefaults: any = {\n    name: '',\n    datasource: null,\n    iconColor: 'rgba(255, 96, 96, 1)',\n    enable: true,\n    showIn: 0,\n    hide: false,\n  };\n\n  emptyListCta = {\n    title: 'There are no custom annotation queries added yet',\n    buttonIcon: 'comment-alt',\n    buttonTitle: 'Add Annotation Query',\n    infoBox: {\n      __html: `<p>Annotations provide a way to integrate event data into your graphs. They are visualized as vertical lines\n    and icons on all graph panels. When you hover over an annotation icon you can get event text &amp; tags for\n    the event. You can add annotation events directly from grafana by holding CTRL or CMD + click on graph (or\n    drag region). These will be stored in Grafana's annotation database.\n  </p>\n  Checkout the\n  <a class='external-link' target='_blank' href='http://docs.grafana.org/reference/annotations/'\n    >Annotations documentation</a\n  >\n  for more information.`,\n    },\n    infoBoxTitle: 'What are annotations?',\n  };\n\n  showOptions: any = [\n    { text: 'All Panels', value: 0 },\n    { text: 'Specific Panels', value: 1 },\n  ];\n\n  /** @ngInject */\n  constructor(private $scope: any, private datasourceSrv: DatasourceSrv) {\n    $scope.ctrl = this;\n\n    this.dashboard = $scope.dashboard;\n    this.mode = 'list';\n    this.datasources = datasourceSrv.getAnnotationSources();\n    this.annotations = this.dashboard.annotations.list;\n    this.reset();\n\n    this.onColorChange = this.onColorChange.bind(this);\n  }\n\n  async datasourceChanged() {\n    const newDatasource = await this.datasourceSrv.get(this.currentAnnotation.datasource);\n    this.$scope.$apply(() => {\n      this.currentDatasource = newDatasource;\n    });\n  }\n\n  edit(annotation: any) {\n    this.currentAnnotation = annotation;\n    this.currentAnnotation.showIn = this.currentAnnotation.showIn || 0;\n    this.currentIsNew = false;\n    this.datasourceChanged();\n    this.mode = 'edit';\n    $('.tooltip.in').remove();\n  }\n\n  reset() {\n    this.currentAnnotation = angular.copy(this.annotationDefaults);\n    this.currentAnnotation.datasource = this.datasources[0].name;\n    this.currentIsNew = true;\n    this.datasourceChanged();\n  }\n\n  update() {\n    this.reset();\n    this.mode = 'list';\n  }\n\n  setupNew = () => {\n    this.mode = 'new';\n    this.reset();\n  };\n\n  backToList() {\n    this.mode = 'list';\n  }\n\n  move(index: number, dir: number) {\n    // @ts-ignore\n    _.move(this.annotations, index, index + dir);\n  }\n\n  add() {\n    const sameName: any = _.find(this.annotations, { name: this.currentAnnotation.name });\n    if (sameName) {\n      appEvents.emit(AppEvents.alertWarning, ['Validation', 'Annotations with the same name already exists']);\n      return;\n    }\n    this.annotations.push(this.currentAnnotation);\n    this.reset();\n    this.mode = 'list';\n    this.dashboard.updateSubmenuVisibility();\n  }\n\n  removeAnnotation(annotation: any) {\n    const index = _.indexOf(this.annotations, annotation);\n    this.annotations.splice(index, 1);\n    this.dashboard.updateSubmenuVisibility();\n  }\n\n  onColorChange(newColor: string) {\n    this.currentAnnotation.iconColor = newColor;\n  }\n}\n\ncoreModule.controller('AnnotationsEditorCtrl', AnnotationsEditorCtrl);\n","import _ from 'lodash';\n\nexport function dedupAnnotations(annotations: any) {\n  let dedup = [];\n\n  // Split events by annotationId property existence\n  const events = _.partition(annotations, 'id');\n\n  const eventsById = _.groupBy(events[0], 'id');\n  dedup = _.map(eventsById, eventGroup => {\n    if (eventGroup.length > 1 && !_.every(eventGroup, isPanelAlert)) {\n      // Get first non-panel alert\n      return _.find(eventGroup, event => {\n        return event.eventType !== 'panel-alert';\n      });\n    } else {\n      return _.head(eventGroup);\n    }\n  });\n\n  dedup = _.concat(dedup, events[1]);\n  return dedup;\n}\n\nfunction isPanelAlert(event: { eventType: string }) {\n  return event.eventType === 'panel-alert';\n}\n","// Libaries\nimport flattenDeep from 'lodash/flattenDeep';\nimport cloneDeep from 'lodash/cloneDeep';\n// Components\nimport './editor_ctrl';\nimport coreModule from 'app/core/core_module';\n// Utils & Services\nimport { dedupAnnotations } from './events_processing';\n// Types\nimport { DashboardModel, PanelModel } from '../dashboard/state';\nimport { AnnotationEvent, AppEvents, DataSourceApi, PanelEvents, TimeRange } from '@grafana/data';\nimport { getBackendSrv, getDataSourceSrv } from '@grafana/runtime';\nimport { appEvents } from 'app/core/core';\nimport { getTimeSrv } from '../dashboard/services/TimeSrv';\n\nexport class AnnotationsSrv {\n  globalAnnotationsPromise: any;\n  alertStatesPromise: any;\n  datasourcePromises: any;\n\n  init(dashboard: DashboardModel) {\n    // always clearPromiseCaches when loading new dashboard\n    this.clearPromiseCaches();\n    // clear promises on refresh events\n    dashboard.on(PanelEvents.refresh, this.clearPromiseCaches.bind(this));\n  }\n\n  clearPromiseCaches() {\n    this.globalAnnotationsPromise = null;\n    this.alertStatesPromise = null;\n    this.datasourcePromises = null;\n  }\n\n  getAnnotations(options: { dashboard: DashboardModel; panel: PanelModel; range: TimeRange }) {\n    return Promise.all([this.getGlobalAnnotations(options), this.getAlertStates(options)])\n      .then(results => {\n        // combine the annotations and flatten results\n        let annotations: AnnotationEvent[] = flattenDeep(results[0]);\n        // when in edit mode we need to use this function to get the saved id\n        let panelFilterId = options.panel.getSavedId();\n\n        // filter out annotations that do not belong to requesting panel\n        annotations = annotations.filter(item => {\n          // if event has panel id and query is of type dashboard then panel and requesting panel id must match\n          if (item.panelId && item.source.type === 'dashboard') {\n            return item.panelId === panelFilterId;\n          }\n          return true;\n        });\n\n        annotations = dedupAnnotations(annotations);\n\n        // look for alert state for this panel\n        const alertState: any = results[1].find((res: any) => res.panelId === panelFilterId);\n\n        return {\n          annotations: annotations,\n          alertState: alertState,\n        };\n      })\n      .catch(err => {\n        if (!err.message && err.data && err.data.message) {\n          err.message = err.data.message;\n        }\n        console.log('AnnotationSrv.query error', err);\n        appEvents.emit(AppEvents.alertError, ['Annotation Query Failed', err.message || err]);\n        return [];\n      });\n  }\n\n  getAlertStates(options: any) {\n    if (!options.dashboard.id) {\n      return Promise.resolve([]);\n    }\n\n    // ignore if no alerts\n    if (options.panel && !options.panel.alert) {\n      return Promise.resolve([]);\n    }\n\n    if (options.range.raw.to !== 'now') {\n      return Promise.resolve([]);\n    }\n\n    if (this.alertStatesPromise) {\n      return this.alertStatesPromise;\n    }\n\n    this.alertStatesPromise = getBackendSrv().get(\n      '/api/alerts/states-for-dashboard',\n      {\n        dashboardId: options.dashboard.id,\n      },\n      `get-alert-states-${options.dashboard.id}`\n    );\n\n    return this.alertStatesPromise;\n  }\n\n  getGlobalAnnotations(options: { dashboard: DashboardModel; panel: PanelModel; range: TimeRange }) {\n    const dashboard = options.dashboard;\n\n    if (this.globalAnnotationsPromise) {\n      return this.globalAnnotationsPromise;\n    }\n\n    const range = getTimeSrv().timeRange();\n    const promises = [];\n    const dsPromises = [];\n\n    for (const annotation of dashboard.annotations.list) {\n      if (!annotation.enable) {\n        continue;\n      }\n\n      if (annotation.snapshotData) {\n        return this.translateQueryResult(annotation, annotation.snapshotData);\n      }\n      const datasourcePromise = getDataSourceSrv().get(annotation.datasource);\n      dsPromises.push(datasourcePromise);\n      promises.push(\n        datasourcePromise\n          .then((datasource: DataSourceApi) => {\n            // issue query against data source\n            return datasource.annotationQuery({\n              range,\n              rangeRaw: range.raw,\n              annotation: annotation,\n              dashboard: dashboard,\n            });\n          })\n          .then(results => {\n            // store response in annotation object if this is a snapshot call\n            if (dashboard.snapshot) {\n              annotation.snapshotData = cloneDeep(results);\n            }\n            // translate result\n            return this.translateQueryResult(annotation, results);\n          })\n      );\n    }\n    this.datasourcePromises = Promise.all(dsPromises);\n    this.globalAnnotationsPromise = Promise.all(promises);\n    return this.globalAnnotationsPromise;\n  }\n\n  saveAnnotationEvent(annotation: AnnotationEvent) {\n    this.globalAnnotationsPromise = null;\n    return getBackendSrv().post('/api/annotations', annotation);\n  }\n\n  updateAnnotationEvent(annotation: AnnotationEvent) {\n    this.globalAnnotationsPromise = null;\n    return getBackendSrv().put(`/api/annotations/${annotation.id}`, annotation);\n  }\n\n  deleteAnnotationEvent(annotation: AnnotationEvent) {\n    this.globalAnnotationsPromise = null;\n    const deleteUrl = `/api/annotations/${annotation.id}`;\n\n    return getBackendSrv().delete(deleteUrl);\n  }\n\n  translateQueryResult(annotation: any, results: any) {\n    // if annotation has snapshotData\n    // make clone and remove it\n    if (annotation.snapshotData) {\n      annotation = cloneDeep(annotation);\n      delete annotation.snapshotData;\n    }\n\n    for (const item of results) {\n      item.source = annotation;\n      item.isRegion = item.timeEnd && item.time !== item.timeEnd;\n    }\n\n    return results;\n  }\n}\n\ncoreModule.service('annotationsSrv', AnnotationsSrv);\n","import _ from 'lodash';\nimport { coreModule } from 'app/core/core';\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationEvent } from '@grafana/data';\nimport { dateTime } from '@grafana/data';\nimport { AnnotationsSrv } from './all';\n\nexport class EventEditorCtrl {\n  panelCtrl: MetricsPanelCtrl;\n  event: AnnotationEvent;\n  timeRange: { from: number; to: number };\n  form: any;\n  close: any;\n  timeFormated: string;\n\n  /** @ngInject */\n  constructor(private annotationsSrv: AnnotationsSrv) {\n    this.event.panelId = this.panelCtrl.panel.id;\n    this.event.dashboardId = this.panelCtrl.dashboard.id;\n\n    // Annotations query returns time as Unix timestamp in milliseconds\n    this.event.time = tryEpochToMoment(this.event.time);\n    if (this.event.isRegion) {\n      this.event.timeEnd = tryEpochToMoment(this.event.timeEnd);\n    }\n\n    this.timeFormated = this.panelCtrl.dashboard.formatDate(this.event.time);\n  }\n\n  save() {\n    if (!this.form.$valid) {\n      return;\n    }\n\n    const saveModel = _.cloneDeep(this.event);\n    saveModel.time = saveModel.time.valueOf();\n    saveModel.timeEnd = 0;\n\n    if (saveModel.isRegion) {\n      saveModel.timeEnd = this.event.timeEnd.valueOf();\n\n      if (saveModel.timeEnd < saveModel.time) {\n        console.log('invalid time');\n        return;\n      }\n    }\n\n    if (saveModel.id) {\n      this.annotationsSrv\n        .updateAnnotationEvent(saveModel)\n        .then(() => {\n          this.panelCtrl.refresh();\n          this.close();\n        })\n        .catch(() => {\n          this.panelCtrl.refresh();\n          this.close();\n        });\n    } else {\n      this.annotationsSrv\n        .saveAnnotationEvent(saveModel)\n        .then(() => {\n          this.panelCtrl.refresh();\n          this.close();\n        })\n        .catch(() => {\n          this.panelCtrl.refresh();\n          this.close();\n        });\n    }\n  }\n\n  delete() {\n    return this.annotationsSrv\n      .deleteAnnotationEvent(this.event)\n      .then(() => {\n        this.panelCtrl.refresh();\n        this.close();\n      })\n      .catch(() => {\n        this.panelCtrl.refresh();\n        this.close();\n      });\n  }\n}\n\nfunction tryEpochToMoment(timestamp: any) {\n  if (timestamp && _.isNumber(timestamp)) {\n    const epoch = Number(timestamp);\n    return dateTime(epoch);\n  } else {\n    return timestamp;\n  }\n}\n\nexport function eventEditor() {\n  return {\n    restrict: 'E',\n    controller: EventEditorCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    templateUrl: 'public/app/features/annotations/partials/event_editor.html',\n    scope: {\n      panelCtrl: '=',\n      event: '=',\n      close: '&',\n    },\n  };\n}\n\ncoreModule.directive('eventEditor', eventEditor);\n","import _ from 'lodash';\nimport tinycolor from 'tinycolor2';\nimport {\n  OK_COLOR,\n  ALERTING_COLOR,\n  NO_DATA_COLOR,\n  PENDING_COLOR,\n  DEFAULT_ANNOTATION_COLOR,\n  REGION_FILL_ALPHA,\n} from '@grafana/ui';\n\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { AnnotationEvent } from '@grafana/data';\n\nexport class EventManager {\n  event: AnnotationEvent;\n  editorOpen: boolean;\n\n  constructor(private panelCtrl: MetricsPanelCtrl) {}\n\n  editorClosed() {\n    this.event = null;\n    this.editorOpen = false;\n    this.panelCtrl.render();\n  }\n\n  editorOpened() {\n    this.editorOpen = true;\n  }\n\n  updateTime(range: { from: any; to: any }) {\n    if (!this.event) {\n      this.event = {};\n      this.event.dashboardId = this.panelCtrl.dashboard.id;\n      this.event.panelId = this.panelCtrl.panel.id;\n    }\n\n    // update time\n    this.event.time = range.from;\n    this.event.isRegion = false;\n\n    if (range.to) {\n      this.event.timeEnd = range.to;\n      this.event.isRegion = true;\n    }\n\n    this.panelCtrl.render();\n  }\n\n  editEvent(event: AnnotationEvent, elem?: any) {\n    this.event = event;\n    this.panelCtrl.render();\n  }\n\n  addFlotEvents(annotations: any, flotOptions: any) {\n    if (!this.event && annotations.length === 0) {\n      return;\n    }\n\n    const types: any = {\n      $__alerting: {\n        color: ALERTING_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__ok: {\n        color: OK_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__no_data: {\n        color: NO_DATA_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__pending: {\n        color: PENDING_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__editing: {\n        color: DEFAULT_ANNOTATION_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n    };\n\n    if (this.event) {\n      if (this.event.isRegion) {\n        annotations = [\n          {\n            isRegion: true,\n            min: this.event.time,\n            timeEnd: this.event.timeEnd,\n            text: this.event.text,\n            eventType: '$__editing',\n            editModel: this.event,\n          },\n        ];\n      } else {\n        annotations = [\n          {\n            min: this.event.time,\n            text: this.event.text,\n            editModel: this.event,\n            eventType: '$__editing',\n          },\n        ];\n      }\n    } else {\n      // annotations from query\n      for (let i = 0; i < annotations.length; i++) {\n        const item = annotations[i];\n\n        // add properties used by jquery flot events\n        item.min = item.time;\n        item.max = item.time;\n        item.eventType = item.source.name;\n\n        if (item.newState) {\n          item.eventType = '$__' + item.newState;\n          continue;\n        }\n\n        if (!types[item.source.name]) {\n          types[item.source.name] = {\n            color: item.source.iconColor,\n            position: 'BOTTOM',\n            markerSize: 5,\n          };\n        }\n      }\n    }\n\n    const regions = getRegions(annotations);\n    addRegionMarking(regions, flotOptions);\n\n    const eventSectionHeight = 20;\n    const eventSectionMargin = 7;\n    flotOptions.grid.eventSectionHeight = eventSectionMargin;\n    flotOptions.xaxis.eventSectionHeight = eventSectionHeight;\n\n    flotOptions.events = {\n      levels: _.keys(types).length + 1,\n      data: annotations,\n      types: types,\n      manager: this,\n    };\n  }\n}\n\nfunction getRegions(events: AnnotationEvent[]) {\n  return _.filter(events, 'isRegion');\n}\n\nfunction addRegionMarking(regions: any[], flotOptions: { grid: { markings: any } }) {\n  const markings = flotOptions.grid.markings;\n  const defaultColor = DEFAULT_ANNOTATION_COLOR;\n  let fillColor;\n\n  _.each(regions, region => {\n    if (region.source) {\n      fillColor = region.source.iconColor || defaultColor;\n    } else {\n      fillColor = defaultColor;\n    }\n\n    fillColor = addAlphaToRGB(fillColor, REGION_FILL_ALPHA);\n    markings.push({\n      xaxis: { from: region.min, to: region.timeEnd },\n      color: fillColor,\n    });\n  });\n}\n\nfunction addAlphaToRGB(colorString: string, alpha: number): string {\n  const color = tinycolor(colorString);\n  if (color.isValid()) {\n    color.setAlpha(alpha);\n    return color.toRgbString();\n  } else {\n    return colorString;\n  }\n}\n","import _ from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/core/core_module';\nimport alertDef from '../alerting/state/alertDef';\nimport { DashboardSrv } from '../dashboard/services/DashboardSrv';\nimport { ContextSrv } from 'app/core/services/context_srv';\n\n/** @ngInject */\nexport function annotationTooltipDirective(\n  $sanitize: any,\n  dashboardSrv: DashboardSrv,\n  contextSrv: ContextSrv,\n  $compile: any\n) {\n  function sanitizeString(str: string) {\n    try {\n      return $sanitize(str);\n    } catch (err) {\n      console.log('Could not sanitize annotation string, html escaping instead');\n      return _.escape(str);\n    }\n  }\n\n  return {\n    restrict: 'E',\n    scope: {\n      event: '=',\n      onEdit: '&',\n    },\n    link: (scope: any, element: JQuery) => {\n      const event = scope.event;\n      let title = event.title;\n      let text = event.text;\n      const dashboard = dashboardSrv.getCurrent();\n\n      let tooltip = '<div class=\"graph-annotation\">';\n      let titleStateClass = '';\n\n      if (event.alertId) {\n        const stateModel = alertDef.getStateDisplayModel(event.newState);\n        titleStateClass = stateModel.stateClass;\n        title = `<i class=\"${stateModel.iconClass}\"></i> ${stateModel.text}`;\n        text = alertDef.getAlertAnnotationInfo(event);\n        if (event.text) {\n          text = text + '<br />' + event.text;\n        }\n      } else if (title) {\n        text = title + '<br />' + (_.isString(text) ? text : '');\n        title = '';\n      }\n\n      let header = `<div class=\"graph-annotation__header\">`;\n      if (event.login) {\n        header += `<div class=\"graph-annotation__user\" bs-tooltip=\"'Created by ${event.login}'\"><img src=\"${event.avatarUrl}\" /></div>`;\n      }\n      header += `\n          <span class=\"graph-annotation__title ${titleStateClass}\">${sanitizeString(title)}</span>\n          <span class=\"graph-annotation__time\">${dashboard.formatDate(event.min)}</span>\n      `;\n\n      // Show edit icon only for users with at least Editor role\n      if (event.id && dashboard.meta.canEdit) {\n        header += `\n          <span class=\"pointer graph-annotation__edit-icon\" ng-click=\"onEdit()\">\n            <i class=\"fa fa-pencil-square\"></i>\n          </span>\n        `;\n      }\n\n      header += `</div>`;\n      tooltip += header;\n      tooltip += '<div class=\"graph-annotation__body\">';\n\n      if (text) {\n        tooltip += '<div ng-non-bindable>' + sanitizeString(text.replace(/\\n/g, '<br>')) + '</div>';\n      }\n\n      const tags = event.tags;\n\n      if (tags && tags.length) {\n        scope.tags = tags;\n        tooltip +=\n          '<span class=\"label label-tag small\" ng-repeat=\"tag in tags\" tag-color-from-name=\"tag\">{{tag}}</span><br/>';\n      }\n\n      tooltip += '</div>';\n      tooltip += '</div>';\n\n      const $tooltip = $(tooltip);\n      $tooltip.appendTo(element);\n\n      $compile(element.contents())(scope);\n    },\n  };\n}\n\ncoreModule.directive('annotationTooltip', annotationTooltipDirective);\n","import { AnnotationsSrv } from './annotations_srv';\nimport { eventEditor } from './event_editor';\nimport { EventManager } from './event_manager';\nimport { annotationTooltipDirective } from './annotation_tooltip';\nexport { AnnotationsSrv, eventEditor, EventManager, annotationTooltipDirective };\n","// Libraries\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\n\n// Utils and services\nimport coreModule from 'app/core/core_module';\nimport { store } from 'app/store/store';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { provideTheme } from 'app/core/utils/ConfigProvider';\nimport { ErrorBoundaryAlert, ModalRoot, ModalsProvider } from '@grafana/ui';\nimport { GrafanaRootScope } from './GrafanaCtrl';\n\nexport function WrapInProvider(store: any, Component: any, props: any) {\n  return (\n    <Provider store={store}>\n      <ErrorBoundaryAlert style=\"page\">\n        <Component {...props} />\n      </ErrorBoundaryAlert>\n    </Provider>\n  );\n}\n\nexport const provideModalsContext = (component: any) => {\n  return (props: any) => (\n    <ModalsProvider>\n      <>\n        {React.createElement(component, { ...props })}\n        <ModalRoot />\n      </>\n    </ModalsProvider>\n  );\n};\n\n/** @ngInject */\nexport function reactContainer(\n  $route: any,\n  $location: any,\n  $injector: any,\n  $rootScope: GrafanaRootScope,\n  contextSrv: ContextSrv\n) {\n  return {\n    restrict: 'E',\n    template: '',\n    link(scope: any, elem: JQuery) {\n      // Check permissions for this component\n      const roles: string[] = $route.current.locals.roles;\n      if (roles && roles.length) {\n        if (!roles.some(r => contextSrv.hasRole(r))) {\n          $location.url('/');\n        }\n      }\n\n      let { component } = $route.current.locals;\n      // Dynamic imports return whole module, need to extract default export\n      if (component.default) {\n        component = component.default;\n      }\n\n      const props = {\n        $injector: $injector,\n        $rootScope: $rootScope,\n        $scope: scope,\n        $contextSrv: contextSrv,\n        routeInfo: $route.current.$$route.routeInfo,\n      };\n\n      document.body.classList.add('is-react');\n\n      ReactDOM.render(WrapInProvider(store, provideTheme(provideModalsContext(component)), props), elem[0]);\n\n      scope.$on('$destroy', () => {\n        document.body.classList.remove('is-react');\n        ReactDOM.unmountComponentAtNode(elem[0]);\n      });\n    },\n  };\n}\n\ncoreModule.directive('reactContainer', reactContainer);\n","import isString from 'lodash/isString';\nimport { ScopedVars } from '@grafana/data';\n\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+)                          $var1\n * \\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\]    [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?}             ${var3} or ${var3:fmt3}\n */\nexport const variableRegex = /\\$(\\w+)|\\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::(\\w+))?}/g;\n\n// Helper function since lastIndex is not reset\nexport const variableRegexExec = (variableString: string) => {\n  variableRegex.lastIndex = 0;\n  return variableRegex.exec(variableString);\n};\n\nexport const SEARCH_FILTER_VARIABLE = '__searchFilter';\n\nexport const containsSearchFilter = (query: string | unknown): boolean =>\n  query && typeof query === 'string' ? query.indexOf(SEARCH_FILTER_VARIABLE) !== -1 : false;\n\nexport const getSearchFilterScopedVar = (args: {\n  query: string;\n  wildcardChar: string;\n  options: { searchFilter?: string };\n}): ScopedVars => {\n  const { query, wildcardChar } = args;\n  if (!containsSearchFilter(query)) {\n    return {};\n  }\n\n  let { options } = args;\n\n  options = options || { searchFilter: '' };\n  const value = options.searchFilter ? `${options.searchFilter}${wildcardChar}` : `${wildcardChar}`;\n\n  return {\n    __searchFilter: {\n      value,\n      text: '',\n    },\n  };\n};\n\nexport function containsVariable(...args: any[]) {\n  const variableName = args[args.length - 1];\n  args[0] = isString(args[0]) ? args[0] : Object['values'](args[0]).join(' ');\n  const variableString = args.slice(0, -1).join(' ');\n  const matches = variableString.match(variableRegex);\n  const isMatchingVariable =\n    matches !== null\n      ? matches.find(match => {\n          const varMatch = variableRegexExec(match);\n          return varMatch !== null && varMatch.indexOf(variableName) > -1;\n        })\n      : false;\n\n  return !!isMatchingVariable;\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { PluginMeta, PanelPlugin } from '@grafana/data';\nimport { PluginsState } from 'app/types';\nimport { PluginDashboard } from '../../../types/plugins';\n\nexport const initialState: PluginsState = {\n  plugins: [],\n  searchQuery: '',\n  hasFetched: false,\n  dashboards: [],\n  isLoadingPluginDashboards: false,\n  panels: {},\n};\n\nconst pluginsSlice = createSlice({\n  name: 'plugins',\n  initialState,\n  reducers: {\n    pluginsLoaded: (state, action: PayloadAction<PluginMeta[]>) => {\n      state.hasFetched = true;\n      state.plugins = action.payload;\n    },\n    setPluginsSearchQuery: (state, action: PayloadAction<string>) => {\n      state.searchQuery = action.payload;\n    },\n    pluginDashboardsLoad: (state, action: PayloadAction<undefined>) => {\n      state.isLoadingPluginDashboards = true;\n      state.dashboards = [];\n    },\n    pluginDashboardsLoaded: (state, action: PayloadAction<PluginDashboard[]>) => {\n      state.isLoadingPluginDashboards = false;\n      state.dashboards = action.payload;\n    },\n    panelPluginLoaded: (state, action: PayloadAction<PanelPlugin>) => {\n      state.panels[action.payload.meta!.id] = action.payload;\n    },\n  },\n});\n\nexport const {\n  pluginsLoaded,\n  pluginDashboardsLoad,\n  pluginDashboardsLoaded,\n  setPluginsSearchQuery,\n  panelPluginLoaded,\n} = pluginsSlice.actions;\n\nexport const pluginsReducer = pluginsSlice.reducer;\n\nexport default {\n  plugins: pluginsReducer,\n};\n","import React, { Component, createRef } from 'react';\nimport omit from 'lodash/omit';\nimport { PopoverController } from '../Tooltip/PopoverController';\nimport { Popover } from '../Tooltip/Popover';\nimport { ColorPickerPopover, ColorPickerProps, ColorPickerChangeHandler } from './ColorPickerPopover';\nimport { getColorFromHexRgbOrName } from '@grafana/data';\nimport { SeriesColorPickerPopover } from './SeriesColorPickerPopover';\n\nimport { withTheme } from '../../themes/ThemeContext';\nimport { ColorPickerTrigger } from './ColorPickerTrigger';\n\n/**\n * If you need custom trigger for the color picker you can do that with a render prop pattern and supply a function\n * as a child. You will get show/hide function which you can map to desired interaction (like onClick or onMouseLeave)\n * and a ref which needs to be passed to an HTMLElement for correct positioning. If you want to use class or functional\n * component as a custom trigger you will need to forward the reference to first HTMLElement child.\n */\ntype ColorPickerTriggerRenderer = (props: {\n  // This should be a React.RefObject<HTMLElement> but due to how object refs are defined you cannot downcast from that\n  // to a specific type like React.RefObject<HTMLDivElement> even though it would be fine in runtime.\n  ref: React.RefObject<any>;\n  showColorPicker: () => void;\n  hideColorPicker: () => void;\n}) => React.ReactNode;\n\nexport const colorPickerFactory = <T extends ColorPickerProps>(\n  popover: React.ComponentType<T>,\n  displayName = 'ColorPicker'\n) => {\n  return class ColorPicker extends Component<T & { children?: ColorPickerTriggerRenderer }, any> {\n    static displayName = displayName;\n    pickerTriggerRef = createRef<any>();\n\n    onColorChange = (color: string) => {\n      const { onColorChange, onChange } = this.props;\n      const changeHandler = (onColorChange || onChange) as ColorPickerChangeHandler;\n\n      return changeHandler(color);\n    };\n\n    render() {\n      const { theme, children } = this.props;\n      const popoverElement = React.createElement(popover, {\n        ...omit(this.props, 'children'),\n        onChange: this.onColorChange,\n      });\n\n      return (\n        <PopoverController content={popoverElement} hideAfter={300}>\n          {(showPopper, hidePopper, popperProps) => {\n            return (\n              <>\n                {this.pickerTriggerRef.current && (\n                  <Popover\n                    {...popperProps}\n                    referenceElement={this.pickerTriggerRef.current}\n                    wrapperClassName=\"ColorPicker\"\n                    onMouseLeave={hidePopper}\n                    onMouseEnter={showPopper}\n                  />\n                )}\n\n                {children ? (\n                  // Children have a bit weird type due to intersection used in the definition so we need to cast here,\n                  // but the definition is correct and should not allow to pass a children that does not conform to\n                  // ColorPickerTriggerRenderer type.\n                  (children as ColorPickerTriggerRenderer)({\n                    ref: this.pickerTriggerRef,\n                    showColorPicker: showPopper,\n                    hideColorPicker: hidePopper,\n                  })\n                ) : (\n                  <ColorPickerTrigger\n                    ref={this.pickerTriggerRef}\n                    onClick={showPopper}\n                    onMouseLeave={hidePopper}\n                    color={getColorFromHexRgbOrName(this.props.color || '#000000', theme.type)}\n                  />\n                )}\n              </>\n            );\n          }}\n        </PopoverController>\n      );\n    }\n  };\n};\n\nexport const ColorPicker = withTheme(colorPickerFactory(ColorPickerPopover, 'ColorPicker'));\nexport const SeriesColorPicker = withTheme(colorPickerFactory(SeriesColorPickerPopover, 'SeriesColorPicker'));\n","import { GrafanaTheme } from '@grafana/data';\nimport { selectThemeVariant } from '../../../themes/selectThemeVariant';\n\nexport const getThemeColors = (theme: GrafanaTheme) => {\n  return {\n    border: theme.colors.border1,\n    background: theme.colors.bodyBg,\n    shadow: theme.colors.dropdownShadow,\n    formBackground: selectThemeVariant(\n      {\n        dark: theme.palette.gray15,\n        light: theme.palette.gray98,\n      },\n      theme.type\n    ),\n  };\n};\n","import React, { memo, PropsWithChildren } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useTheme, stylesFactory } from '../../../themes';\n\nconst getStyle = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    text: css`\n      font-size: ${theme.typography.size.md};\n      font-weight: ${theme.typography.weight.semibold};\n      color: ${theme.colors.formLabel};\n    `,\n  };\n});\n\nexport const TimePickerTitle = memo<PropsWithChildren<{}>>(({ children }) => {\n  const theme = useTheme();\n  const styles = getStyle(theme);\n\n  return <span className={styles.text}>{children}</span>;\n});\n","import React, { memo, useState, useEffect, useCallback } from 'react';\nimport { css } from 'emotion';\nimport Calendar from 'react-calendar/dist/entry.nostyle';\nimport { GrafanaTheme, DateTime, TimeZone, dateTimeParse } from '@grafana/data';\nimport { useTheme, stylesFactory } from '../../../themes';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { Button } from '../../Button';\nimport { Icon } from '../../Icon/Icon';\nimport { Portal } from '../../Portal/Portal';\nimport { getThemeColors } from './colors';\nimport { ClickOutsideWrapper } from '../../ClickOutsideWrapper/ClickOutsideWrapper';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    container: css`\n      top: 0;\n      position: absolute;\n      right: 546px;\n      box-shadow: 0px 0px 20px ${colors.shadow};\n      background-color: ${colors.background};\n      z-index: -1;\n\n      &:after {\n        display: block;\n        background-color: ${colors.background};\n        width: 19px;\n        height: 381px;\n        content: ' ';\n        position: absolute;\n        top: 0;\n        right: -19px;\n        border-left: 1px solid ${colors.border};\n      }\n    `,\n    modal: css`\n      position: fixed;\n      top: 20%;\n      width: 100%;\n      z-index: ${theme.zIndex.modal};\n    `,\n    content: css`\n      margin: 0 auto;\n      width: 268px;\n    `,\n    backdrop: css`\n      position: fixed;\n      top: 0;\n      right: 0;\n      bottom: 0;\n      left: 0;\n      background: #202226;\n      opacity: 0.7;\n      z-index: ${theme.zIndex.modalBackdrop};\n      text-align: center;\n    `,\n  };\n});\n\nconst getFooterStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    container: css`\n      background-color: ${colors.background};\n      display: flex;\n      justify-content: center;\n      padding: 10px;\n      align-items: stretch;\n    `,\n    apply: css`\n      margin-right: 4px;\n      width: 100%;\n      justify-content: center;\n    `,\n  };\n});\n\nconst getBodyStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    title: css`\n      color: ${theme.colors.text};\n      background-color: ${colors.background};\n      font-size: ${theme.typography.size.md};\n      border: 1px solid transparent;\n\n      &:hover {\n        position: relative;\n      }\n    `,\n    body: css`\n      z-index: ${theme.zIndex.modal};\n      background-color: ${colors.background};\n      width: 268px;\n\n      .react-calendar__navigation__label,\n      .react-calendar__navigation__arrow,\n      .react-calendar__navigation {\n        padding-top: 4px;\n        background-color: inherit;\n        color: ${theme.colors.text};\n        border: 0;\n        font-weight: ${theme.typography.weight.semibold};\n      }\n\n      .react-calendar__month-view__weekdays {\n        background-color: inherit;\n        text-align: center;\n        color: ${theme.palette.blue77};\n\n        abbr {\n          border: 0;\n          text-decoration: none;\n          cursor: default;\n          display: block;\n          padding: 4px 0 4px 0;\n        }\n      }\n\n      .react-calendar__month-view__days {\n        background-color: inherit;\n      }\n\n      .react-calendar__tile,\n      .react-calendar__tile--now {\n        margin-bottom: 4px;\n        background-color: inherit;\n        height: 26px;\n      }\n\n      .react-calendar__navigation__label,\n      .react-calendar__navigation > button:focus,\n      .time-picker-calendar-tile:focus {\n        outline: 0;\n      }\n\n      .react-calendar__tile--active,\n      .react-calendar__tile--active:hover {\n        color: ${theme.palette.white};\n        font-weight: ${theme.typography.weight.semibold};\n        background: ${theme.palette.blue95};\n        box-shadow: none;\n        border: 0px;\n      }\n\n      .react-calendar__tile--rangeEnd,\n      .react-calendar__tile--rangeStart {\n        padding: 0;\n        border: 0px;\n        color: ${theme.palette.white};\n        font-weight: ${theme.typography.weight.semibold};\n        background: ${theme.palette.blue95};\n\n        abbr {\n          background-color: ${theme.palette.blue77};\n          border-radius: 100px;\n          display: block;\n          padding-top: 2px;\n          height: 26px;\n        }\n      }\n\n      .react-calendar__tile--rangeStart {\n        border-top-left-radius: 20px;\n        border-bottom-left-radius: 20px;\n      }\n\n      .react-calendar__tile--rangeEnd {\n        border-top-right-radius: 20px;\n        border-bottom-right-radius: 20px;\n      }\n    `,\n  };\n});\n\nconst getHeaderStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    container: css`\n      background-color: ${colors.background};\n      display: flex;\n      justify-content: space-between;\n      padding: 7px;\n    `,\n  };\n});\n\ninterface Props {\n  isOpen: boolean;\n  from: DateTime;\n  to: DateTime;\n  onClose: () => void;\n  onApply: () => void;\n  onChange: (from: DateTime, to: DateTime) => void;\n  isFullscreen: boolean;\n  timeZone?: TimeZone;\n}\n\nconst stopPropagation = (event: React.MouseEvent<HTMLDivElement>) => event.stopPropagation();\n\nexport const TimePickerCalendar = memo<Props>(props => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n  const { isOpen, isFullscreen } = props;\n\n  if (!isOpen) {\n    return null;\n  }\n\n  if (isFullscreen) {\n    return (\n      <ClickOutsideWrapper onClick={props.onClose}>\n        <div className={styles.container} onClick={stopPropagation}>\n          <Body {...props} />\n        </div>\n      </ClickOutsideWrapper>\n    );\n  }\n\n  return (\n    <Portal>\n      <div className={styles.modal} onClick={stopPropagation}>\n        <div className={styles.content}>\n          <Header {...props} />\n          <Body {...props} />\n          <Footer {...props} />\n        </div>\n      </div>\n      <div className={styles.backdrop} onClick={stopPropagation} />\n    </Portal>\n  );\n});\n\nconst Header = memo<Props>(({ onClose }) => {\n  const theme = useTheme();\n  const styles = getHeaderStyles(theme);\n\n  return (\n    <div className={styles.container}>\n      <TimePickerTitle>Select a time range</TimePickerTitle>\n      <Icon name=\"times\" onClick={onClose} />\n    </div>\n  );\n});\n\nconst Body = memo<Props>(({ onChange, from, to, timeZone }) => {\n  const [value, setValue] = useState<Date[]>();\n  const theme = useTheme();\n  const onCalendarChange = useOnCalendarChange(onChange, timeZone);\n  const styles = getBodyStyles(theme);\n\n  useEffect(() => {\n    setValue(inputToValue(from, to));\n  }, []);\n\n  return (\n    <Calendar\n      selectRange={true}\n      next2Label={null}\n      prev2Label={null}\n      className={styles.body}\n      tileClassName={styles.title}\n      value={value}\n      nextLabel={<Icon name=\"angle-right\" />}\n      prevLabel={<Icon name=\"angle-left\" />}\n      onChange={onCalendarChange}\n      locale=\"en\"\n    />\n  );\n});\n\nconst Footer = memo<Props>(({ onClose, onApply }) => {\n  const theme = useTheme();\n  const styles = getFooterStyles(theme);\n\n  return (\n    <div className={styles.container}>\n      <Button className={styles.apply} onClick={onApply}>\n        Apply time range\n      </Button>\n      <Button variant=\"secondary\" onClick={onClose}>\n        Cancel\n      </Button>\n    </div>\n  );\n});\n\nfunction inputToValue(from: DateTime, to: DateTime): Date[] {\n  const fromAsDate = from.toDate();\n  const toAsDate = to.toDate();\n\n  if (fromAsDate > toAsDate) {\n    return [toAsDate, fromAsDate];\n  }\n  return [fromAsDate, toAsDate];\n}\n\nfunction useOnCalendarChange(onChange: (from: DateTime, to: DateTime) => void, timeZone?: TimeZone) {\n  return useCallback(\n    (value: Date | Date[]) => {\n      if (!Array.isArray(value)) {\n        return console.error('onCalendarChange: should be run in selectRange={true}');\n      }\n\n      const from = dateTimeParse(dateInfo(value[0]), { timeZone });\n      const to = dateTimeParse(dateInfo(value[1]), { timeZone });\n\n      onChange(from, to);\n    },\n    [onChange]\n  );\n}\n\nfunction dateInfo(date: Date): number[] {\n  return [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()];\n}\n","import React, { FormEvent, useState, useCallback } from 'react';\nimport {\n  TimeZone,\n  isDateTime,\n  TimeRange,\n  DateTime,\n  dateMath,\n  dateTimeFormat,\n  dateTimeParse,\n  rangeUtil,\n  RawTimeRange,\n} from '@grafana/data';\nimport { TimePickerCalendar } from './TimePickerCalendar';\nimport { Field } from '../../Forms/Field';\nimport { Input } from '../../Input/Input';\nimport { Button } from '../../Button';\n\ninterface Props {\n  isFullscreen: boolean;\n  value: TimeRange;\n  onApply: (range: TimeRange) => void;\n  timeZone?: TimeZone;\n  roundup?: boolean;\n}\n\ninterface InputState {\n  value: string;\n  invalid: boolean;\n}\n\nconst errorMessage = 'Please enter a past date or \"now\"';\n\nexport const TimeRangeForm: React.FC<Props> = props => {\n  const { value, isFullscreen = false, timeZone, roundup } = props;\n\n  const [from, setFrom] = useState<InputState>(valueToState(value.raw.from, false, timeZone));\n  const [to, setTo] = useState<InputState>(valueToState(value.raw.to, true, timeZone));\n  const [isOpen, setOpen] = useState(false);\n\n  const onOpen = useCallback(\n    (event: FormEvent<HTMLElement>) => {\n      event.preventDefault();\n      setOpen(true);\n    },\n    [setOpen]\n  );\n\n  const onFocus = useCallback(\n    (event: FormEvent<HTMLElement>) => {\n      if (!isFullscreen) {\n        return;\n      }\n      onOpen(event);\n    },\n    [isFullscreen, onOpen]\n  );\n\n  const onApply = useCallback(() => {\n    if (to.invalid || from.invalid) {\n      return;\n    }\n\n    const raw: RawTimeRange = { from: from.value, to: to.value };\n    const timeRange = rangeUtil.convertRawToRange(raw, timeZone);\n\n    props.onApply(timeRange);\n  }, [from, to, roundup, timeZone]);\n\n  const onChange = useCallback(\n    (from: DateTime, to: DateTime) => {\n      setFrom(valueToState(from, false, timeZone));\n      setTo(valueToState(to, true, timeZone));\n    },\n    [timeZone]\n  );\n\n  const icon = isFullscreen ? null : <Button icon=\"calendar-alt\" variant=\"secondary\" onClick={onOpen} />;\n\n  return (\n    <>\n      <Field label=\"From\" invalid={from.invalid} error={errorMessage}>\n        <Input\n          onClick={event => event.stopPropagation()}\n          onFocus={onFocus}\n          onChange={event => setFrom(eventToState(event, false, timeZone))}\n          addonAfter={icon}\n          value={from.value}\n        />\n      </Field>\n      <Field label=\"To\" invalid={to.invalid} error={errorMessage}>\n        <Input\n          onClick={event => event.stopPropagation()}\n          onFocus={onFocus}\n          onChange={event => setTo(eventToState(event, true, timeZone))}\n          addonAfter={icon}\n          value={to.value}\n        />\n      </Field>\n      <Button onClick={onApply}>Apply time range</Button>\n\n      <TimePickerCalendar\n        isFullscreen={isFullscreen}\n        isOpen={isOpen}\n        from={dateTimeParse(from.value, { timeZone })}\n        to={dateTimeParse(to.value, { timeZone })}\n        onApply={onApply}\n        onClose={() => setOpen(false)}\n        onChange={onChange}\n        timeZone={timeZone}\n      />\n    </>\n  );\n};\n\nfunction eventToState(event: FormEvent<HTMLInputElement>, roundup?: boolean, timeZone?: TimeZone): InputState {\n  return valueToState(event.currentTarget.value, roundup, timeZone);\n}\n\nfunction valueToState(raw: DateTime | string, roundup?: boolean, timeZone?: TimeZone): InputState {\n  const value = valueAsString(raw, timeZone);\n  const invalid = !isValid(value, roundup, timeZone);\n  return { value, invalid };\n}\n\nfunction valueAsString(value: DateTime | string, timeZone?: TimeZone): string {\n  if (isDateTime(value)) {\n    return dateTimeFormat(value, { timeZone });\n  }\n  return value;\n}\n\nfunction isValid(value: string, roundUp?: boolean, timeZone?: TimeZone): boolean {\n  if (isDateTime(value)) {\n    return value.isValid();\n  }\n\n  if (dateMath.isMathString(value)) {\n    return dateMath.isValid(value);\n  }\n\n  const parsed = dateTimeParse(value, { roundUp, timeZone });\n  return parsed.isValid();\n}\n","import React, { memo } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme, TimeOption } from '@grafana/data';\nimport { useTheme, stylesFactory, selectThemeVariant } from '../../../themes';\nimport { Icon } from '../../Icon/Icon';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const background = selectThemeVariant(\n    {\n      light: theme.palette.gray7,\n      dark: theme.palette.dark3,\n    },\n    theme.type\n  );\n\n  return {\n    container: css`\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 7px 9px 7px 9px;\n      border-left: 2px solid rgba(255, 255, 255, 0);\n\n      &:hover {\n        background: ${background};\n        border-image: linear-gradient(#f05a28 30%, #fbca0a 99%);\n        border-image-slice: 1;\n        border-style: solid;\n        border-top: 0;\n        border-right: 0;\n        border-bottom: 0;\n        border-left-width: 2px;\n        cursor: pointer;\n      }\n    `,\n  };\n});\n\ninterface Props {\n  value: TimeOption;\n  selected?: boolean;\n  onSelect: (option: TimeOption) => void;\n}\n\nexport const TimeRangeOption = memo<Props>(({ value, onSelect, selected = false }) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.container} onClick={() => onSelect(value)} tabIndex={-1}>\n      <span>{value.display}</span>\n      {selected ? <Icon name=\"check\" /> : null}\n    </div>\n  );\n});\n","import React, { ReactNode } from 'react';\nimport { css } from 'emotion';\nimport { TimeOption, TimeZone } from '@grafana/data';\nimport { TimeRange } from '@grafana/data';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeOption } from './TimeRangeOption';\nimport { mapOptionToTimeRange } from './mapper';\nimport { stylesFactory } from '../../../themes';\n\nconst getStyles = stylesFactory(() => {\n  return {\n    title: css`\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: 8px 16px 5px 9px;\n    `,\n  };\n});\n\nconst getOptionsStyles = stylesFactory(() => {\n  return {\n    grow: css`\n      flex-grow: 1;\n      align-items: flex-start;\n    `,\n  };\n});\n\ninterface Props {\n  title?: string;\n  options: TimeOption[];\n  value?: TimeRange;\n  onSelect: (option: TimeRange) => void;\n  placeholderEmpty?: ReactNode;\n  timeZone?: TimeZone;\n}\n\nexport const TimeRangeList: React.FC<Props> = props => {\n  const styles = getStyles();\n  const { title, options, placeholderEmpty } = props;\n\n  if (typeof placeholderEmpty !== 'undefined' && options.length <= 0) {\n    return <>{placeholderEmpty}</>;\n  }\n\n  if (!title) {\n    return <Options {...props} />;\n  }\n\n  return (\n    <>\n      <div className={styles.title}>\n        <TimePickerTitle>{title}</TimePickerTitle>\n      </div>\n      <Options {...props} />\n    </>\n  );\n};\n\nconst Options: React.FC<Props> = ({ options, value, onSelect, timeZone }) => {\n  const styles = getOptionsStyles();\n\n  return (\n    <>\n      <div>\n        {options.map((option, index) => (\n          <TimeRangeOption\n            key={keyForOption(option, index)}\n            value={option}\n            selected={isEqual(option, value)}\n            onSelect={option => onSelect(mapOptionToTimeRange(option, timeZone))}\n          />\n        ))}\n      </div>\n      <div className={styles.grow}></div>\n    </>\n  );\n};\n\nfunction keyForOption(option: TimeOption, index: number): string {\n  return `${option.from}-${option.to}-${index}`;\n}\n\nfunction isEqual(x: TimeOption, y?: TimeRange): boolean {\n  if (!y || !x) {\n    return false;\n  }\n  return y.raw.from === x.from && y.raw.to === x.to;\n}\n","import { TimeOption, TimeRange, TimeZone, rangeUtil, dateTimeFormat, dateTimeFormatISO } from '@grafana/data';\n\nexport const mapOptionToTimeRange = (option: TimeOption, timeZone?: TimeZone): TimeRange => {\n  return rangeUtil.convertRawToRange({ from: option.from, to: option.to }, timeZone);\n};\n\nexport const mapRangeToTimeOption = (range: TimeRange, timeZone?: TimeZone): TimeOption => {\n  const from = dateTimeFormat(range.from, { timeZone });\n  const to = dateTimeFormat(range.to, { timeZone });\n\n  return {\n    from: dateTimeFormatISO(range.from, { timeZone }),\n    to: dateTimeFormatISO(range.to, { timeZone }),\n    section: 3,\n    display: `${from} to ${to}`,\n  };\n};\n","import { GrafanaTheme, isDateTime, TimeOption, TimeRange, TimeZone } from '@grafana/data';\nimport { css } from 'emotion';\nimport React, { memo, useState } from 'react';\nimport { useMedia } from 'react-use';\nimport { stylesFactory, useTheme } from '../../../themes';\nimport { CustomScrollbar } from '../../CustomScrollbar/CustomScrollbar';\nimport { Icon } from '../../Icon/Icon';\nimport { getThemeColors } from './colors';\nimport { mapRangeToTimeOption } from './mapper';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeForm } from './TimeRangeForm';\nimport { TimeRangeList } from './TimeRangeList';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    container: css`\n      display: flex;\n      background: ${colors.background};\n      box-shadow: 0px 0px 20px ${colors.shadow};\n      position: absolute;\n      z-index: ${theme.zIndex.modal};\n      width: 546px;\n      height: 381px;\n      top: 116%;\n      margin-left: -322px;\n\n      @media only screen and (max-width: ${theme.breakpoints.lg}) {\n        width: 218px;\n        margin-left: 6px;\n      }\n\n      @media only screen and (max-width: ${theme.breakpoints.sm}) {\n        width: 264px;\n        margin-left: -100px;\n      }\n    `,\n    leftSide: css`\n      display: flex;\n      flex-direction: column;\n      border-right: 1px solid ${colors.border};\n      width: 60%;\n      overflow: hidden;\n\n      @media only screen and (max-width: ${theme.breakpoints.lg}) {\n        display: none;\n      }\n    `,\n    rightSide: css`\n      width: 40% !important;\n\n      @media only screen and (max-width: ${theme.breakpoints.lg}) {\n        width: 100% !important;\n      }\n    `,\n    spacing: css`\n      margin-top: 16px;\n    `,\n  };\n});\n\nconst getNarrowScreenStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    header: css`\n      display: flex;\n      flex-direction: row;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1px solid ${colors.border};\n      padding: 7px 9px 7px 9px;\n    `,\n    body: css`\n      border-bottom: 1px solid ${colors.border};\n      background: ${colors.formBackground};\n      box-shadow: inset 0px 2px 2px ${colors.shadow};\n    `,\n    form: css`\n      padding: 7px 9px 7px 9px;\n    `,\n  };\n});\n\nconst getFullScreenStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      padding-top: 9px;\n      padding-left: 11px;\n      padding-right: 20%;\n    `,\n    title: css`\n      margin-bottom: 11px;\n    `,\n    recent: css`\n      flex-grow: 1;\n      display: flex;\n      flex-direction: column;\n      justify-content: flex-end;\n    `,\n  };\n});\n\nconst getEmptyListStyles = stylesFactory((theme: GrafanaTheme) => {\n  const colors = getThemeColors(theme);\n\n  return {\n    container: css`\n      background-color: ${colors.formBackground};\n      padding: 12px;\n      margin: 12px;\n\n      a,\n      span {\n        font-size: 13px;\n      }\n    `,\n    link: css`\n      color: ${theme.colors.linkExternal};\n    `,\n  };\n});\n\ninterface Props {\n  value: TimeRange;\n  onChange: (timeRange: TimeRange) => void;\n  timeZone?: TimeZone;\n  quickOptions?: TimeOption[];\n  otherOptions?: TimeOption[];\n  history?: TimeRange[];\n}\n\ninterface PropsWithScreenSize extends Props {\n  isFullscreen: boolean;\n}\n\ninterface FormProps extends Omit<Props, 'history'> {\n  visible: boolean;\n  historyOptions?: TimeOption[];\n}\n\nexport const TimePickerContentWithScreenSize: React.FC<PropsWithScreenSize> = props => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n  const historyOptions = mapToHistoryOptions(props.history, props.timeZone);\n  const { quickOptions = [], otherOptions = [], isFullscreen } = props;\n\n  return (\n    <div className={styles.container}>\n      <div className={styles.leftSide}>\n        <FullScreenForm {...props} visible={isFullscreen} historyOptions={historyOptions} />\n      </div>\n      <CustomScrollbar className={styles.rightSide}>\n        <NarrowScreenForm {...props} visible={!isFullscreen} historyOptions={historyOptions} />\n        <TimeRangeList\n          title=\"Relative time ranges\"\n          options={quickOptions}\n          onSelect={props.onChange}\n          value={props.value}\n          timeZone={props.timeZone}\n        />\n        <div className={styles.spacing} />\n        <TimeRangeList\n          title=\"Other quick ranges\"\n          options={otherOptions}\n          onSelect={props.onChange}\n          value={props.value}\n          timeZone={props.timeZone}\n        />\n      </CustomScrollbar>\n    </div>\n  );\n};\n\nexport const TimePickerContent: React.FC<Props> = props => {\n  const theme = useTheme();\n  const isFullscreen = useMedia(`(min-width: ${theme.breakpoints.lg})`);\n\n  return <TimePickerContentWithScreenSize {...props} isFullscreen={isFullscreen} />;\n};\n\nconst NarrowScreenForm: React.FC<FormProps> = props => {\n  if (!props.visible) {\n    return null;\n  }\n\n  const theme = useTheme();\n  const styles = getNarrowScreenStyles(theme);\n  const isAbsolute = isDateTime(props.value.raw.from) || isDateTime(props.value.raw.to);\n  const [collapsed, setCollapsed] = useState(isAbsolute);\n\n  return (\n    <>\n      <div className={styles.header} onClick={() => setCollapsed(!collapsed)}>\n        <TimePickerTitle>Absolute time range</TimePickerTitle>\n        {<Icon name={collapsed ? 'angle-up' : 'angle-down'} />}\n      </div>\n      {collapsed && (\n        <div className={styles.body}>\n          <div className={styles.form}>\n            <TimeRangeForm\n              value={props.value}\n              onApply={props.onChange}\n              timeZone={props.timeZone}\n              isFullscreen={false}\n            />\n          </div>\n          <TimeRangeList\n            title=\"Recently used absolute ranges\"\n            options={props.historyOptions || []}\n            onSelect={props.onChange}\n            value={props.value}\n            placeholderEmpty={null}\n            timeZone={props.timeZone}\n          />\n        </div>\n      )}\n    </>\n  );\n};\n\nconst FullScreenForm: React.FC<FormProps> = props => {\n  if (!props.visible) {\n    return null;\n  }\n\n  const theme = useTheme();\n  const styles = getFullScreenStyles(theme);\n\n  return (\n    <>\n      <div className={styles.container}>\n        <div className={styles.title}>\n          <TimePickerTitle>Absolute time range</TimePickerTitle>\n        </div>\n        <TimeRangeForm value={props.value} timeZone={props.timeZone} onApply={props.onChange} isFullscreen={true} />\n      </div>\n      <div className={styles.recent}>\n        <TimeRangeList\n          title=\"Recently used absolute ranges\"\n          options={props.historyOptions || []}\n          onSelect={props.onChange}\n          value={props.value}\n          placeholderEmpty={<EmptyRecentList />}\n          timeZone={props.timeZone}\n        />\n      </div>\n    </>\n  );\n};\n\nconst EmptyRecentList = memo(() => {\n  const theme = useTheme();\n  const styles = getEmptyListStyles(theme);\n\n  return (\n    <div className={styles.container}>\n      <div>\n        <span>\n          It looks like you haven't used this timer picker before. As soon as you enter some time intervals, recently\n          used intervals will appear here.\n        </span>\n      </div>\n      <div>\n        <a\n          className={styles.link}\n          href=\"https://grafana.com/docs/grafana/latest/dashboards/time-range-controls\"\n          target=\"_new\"\n        >\n          Read the documentation\n        </a>\n        <span> to find out more about how to enter custom time ranges.</span>\n      </div>\n    </div>\n  );\n});\n\nfunction mapToHistoryOptions(ranges?: TimeRange[], timeZone?: TimeZone): TimeOption[] {\n  if (!Array.isArray(ranges) || ranges.length === 0) {\n    return [];\n  }\n  return ranges.slice(ranges.length - 4).map(range => mapRangeToTimeOption(range, timeZone));\n}\n","// Libraries\nimport React, { PureComponent, memo, FormEvent } from 'react';\nimport { css, cx } from 'emotion';\n\n// Components\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\nimport { TimePickerContent } from './TimePickerContent/TimePickerContent';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\n\n// Utils & Services\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { withTheme, useTheme } from '../../themes/ThemeContext';\n\n// Types\nimport { isDateTime, rangeUtil, GrafanaTheme, dateTimeFormat, timeZoneFormatUserFriendly } from '@grafana/data';\nimport { TimeRange, TimeOption, TimeZone, dateMath } from '@grafana/data';\nimport { Themeable } from '../../types';\n\nconst quickOptions: TimeOption[] = [\n  { from: 'now-5m', to: 'now', display: 'Last 5 minutes', section: 3 },\n  { from: 'now-15m', to: 'now', display: 'Last 15 minutes', section: 3 },\n  { from: 'now-30m', to: 'now', display: 'Last 30 minutes', section: 3 },\n  { from: 'now-1h', to: 'now', display: 'Last 1 hour', section: 3 },\n  { from: 'now-3h', to: 'now', display: 'Last 3 hours', section: 3 },\n  { from: 'now-6h', to: 'now', display: 'Last 6 hours', section: 3 },\n  { from: 'now-12h', to: 'now', display: 'Last 12 hours', section: 3 },\n  { from: 'now-24h', to: 'now', display: 'Last 24 hours', section: 3 },\n  { from: 'now-2d', to: 'now', display: 'Last 2 days', section: 3 },\n  { from: 'now-7d', to: 'now', display: 'Last 7 days', section: 3 },\n  { from: 'now-30d', to: 'now', display: 'Last 30 days', section: 3 },\n  { from: 'now-90d', to: 'now', display: 'Last 90 days', section: 3 },\n  { from: 'now-6M', to: 'now', display: 'Last 6 months', section: 3 },\n  { from: 'now-1y', to: 'now', display: 'Last 1 year', section: 3 },\n  { from: 'now-2y', to: 'now', display: 'Last 2 years', section: 3 },\n  { from: 'now-5y', to: 'now', display: 'Last 5 years', section: 3 },\n];\n\nconst otherOptions: TimeOption[] = [\n  { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday', section: 3 },\n  { from: 'now-2d/d', to: 'now-2d/d', display: 'Day before yesterday', section: 3 },\n  { from: 'now-7d/d', to: 'now-7d/d', display: 'This day last week', section: 3 },\n  { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week', section: 3 },\n  { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month', section: 3 },\n  { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year', section: 3 },\n  { from: 'now/d', to: 'now/d', display: 'Today', section: 3 },\n  { from: 'now/d', to: 'now', display: 'Today so far', section: 3 },\n  { from: 'now/w', to: 'now/w', display: 'This week', section: 3 },\n  { from: 'now/w', to: 'now', display: 'This week so far', section: 3 },\n  { from: 'now/M', to: 'now/M', display: 'This month', section: 3 },\n  { from: 'now/M', to: 'now', display: 'This month so far', section: 3 },\n  { from: 'now/y', to: 'now/y', display: 'This year', section: 3 },\n  { from: 'now/y', to: 'now', display: 'This year so far', section: 3 },\n];\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      position: relative;\n      display: flex;\n      flex-flow: column nowrap;\n    `,\n    buttons: css`\n      display: flex;\n    `,\n    caretIcon: css`\n      margin-left: ${theme.spacing.xs};\n    `,\n    clockIcon: css`\n      margin-left: ${theme.spacing.xs};\n      margin-right: ${theme.spacing.xs};\n    `,\n    noRightBorderStyle: css`\n      label: noRightBorderStyle;\n      border-right: 0;\n    `,\n  };\n});\n\nconst getLabelStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      display: inline-block;\n    `,\n    utc: css`\n      color: ${theme.palette.orange};\n      font-size: 75%;\n      padding: 3px;\n      font-weight: ${theme.typography.weight.semibold};\n    `,\n  };\n});\n\nexport interface Props extends Themeable {\n  hideText?: boolean;\n  value: TimeRange;\n  timeZone?: TimeZone;\n  timeSyncButton?: JSX.Element;\n  isSynced?: boolean;\n  onChange: (timeRange: TimeRange) => void;\n  onMoveBackward: () => void;\n  onMoveForward: () => void;\n  onZoom: () => void;\n  history?: TimeRange[];\n}\n\nexport interface State {\n  isOpen: boolean;\n}\n\nexport class UnthemedTimeRangePicker extends PureComponent<Props, State> {\n  state: State = {\n    isOpen: false,\n  };\n\n  onChange = (timeRange: TimeRange) => {\n    this.props.onChange(timeRange);\n    this.setState({ isOpen: false });\n  };\n\n  onOpen = (event: FormEvent<HTMLButtonElement>) => {\n    const { isOpen } = this.state;\n    event.stopPropagation();\n    this.setState({ isOpen: !isOpen });\n  };\n\n  onClose = () => {\n    this.setState({ isOpen: false });\n  };\n\n  render() {\n    const {\n      value,\n      onMoveBackward,\n      onMoveForward,\n      onZoom,\n      timeZone,\n      timeSyncButton,\n      isSynced,\n      theme,\n      history,\n    } = this.props;\n\n    const { isOpen } = this.state;\n    const styles = getStyles(theme);\n    const hasAbsolute = isDateTime(value.raw.from) || isDateTime(value.raw.to);\n    const syncedTimePicker = timeSyncButton && isSynced;\n    const timePickerIconClass = cx({ ['icon-brand-gradient']: syncedTimePicker });\n    const timePickerButtonClass = cx('btn navbar-button navbar-button--tight', {\n      [`btn--radius-right-0 ${styles.noRightBorderStyle}`]: !!timeSyncButton,\n      [`explore-active-button`]: syncedTimePicker,\n    });\n\n    return (\n      <div className={styles.container}>\n        <div className={styles.buttons}>\n          {hasAbsolute && (\n            <button className=\"btn navbar-button navbar-button--tight\" onClick={onMoveBackward}>\n              <Icon name=\"angle-left\" size=\"lg\" />\n            </button>\n          )}\n          <div>\n            <Tooltip content={<TimePickerTooltip timeRange={value} timeZone={timeZone} />} placement=\"bottom\">\n              <button aria-label=\"TimePicker Open Button\" className={timePickerButtonClass} onClick={this.onOpen}>\n                <Icon name=\"clock-nine\" className={cx(styles.clockIcon, timePickerIconClass)} size=\"lg\" />\n                <TimePickerButtonLabel {...this.props} />\n                <span className={styles.caretIcon}>{<Icon name={isOpen ? 'angle-up' : 'angle-down'} size=\"lg\" />}</span>\n              </button>\n            </Tooltip>\n            {isOpen && (\n              <ClickOutsideWrapper onClick={this.onClose}>\n                <TimePickerContent\n                  timeZone={timeZone}\n                  value={value}\n                  onChange={this.onChange}\n                  otherOptions={otherOptions}\n                  quickOptions={quickOptions}\n                  history={history}\n                />\n              </ClickOutsideWrapper>\n            )}\n          </div>\n\n          {timeSyncButton}\n\n          {hasAbsolute && (\n            <button className=\"btn navbar-button navbar-button--tight\" onClick={onMoveForward}>\n              <Icon name=\"angle-right\" size=\"lg\" />\n            </button>\n          )}\n\n          <Tooltip content={ZoomOutTooltip} placement=\"bottom\">\n            <button className=\"btn navbar-button navbar-button--zoom\" onClick={onZoom}>\n              <Icon name=\"search-minus\" size=\"lg\" />\n            </button>\n          </Tooltip>\n        </div>\n      </div>\n    );\n  }\n}\n\nconst ZoomOutTooltip = () => (\n  <>\n    Time range zoom out <br /> CTRL+Z\n  </>\n);\n\nconst TimePickerTooltip = ({ timeRange, timeZone }: { timeRange: TimeRange; timeZone?: TimeZone }) => {\n  const theme = useTheme();\n  const styles = getLabelStyles(theme);\n\n  return (\n    <>\n      {dateTimeFormat(timeRange.from, { timeZone })}\n      <div className=\"text-center\">to</div>\n      {dateTimeFormat(timeRange.to, { timeZone })}\n      <div className=\"text-center\">\n        <span className={styles.utc}>{timeZoneFormatUserFriendly(timeZone)}</span>\n      </div>\n    </>\n  );\n};\n\nconst TimePickerButtonLabel = memo<Props>(({ hideText, value, timeZone }) => {\n  const theme = useTheme();\n  const styles = getLabelStyles(theme);\n\n  if (hideText) {\n    return null;\n  }\n\n  return (\n    <span className={styles.container}>\n      <span>{formattedRange(value, timeZone)}</span>\n      <span className={styles.utc}>{rangeUtil.describeTimeRangeAbbrevation(value, timeZone)}</span>\n    </span>\n  );\n});\n\nconst formattedRange = (value: TimeRange, timeZone?: TimeZone) => {\n  const adjustedTimeRange = {\n    to: dateMath.isMathString(value.raw.to) ? value.raw.to : value.to,\n    from: dateMath.isMathString(value.raw.from) ? value.raw.from : value.from,\n  };\n  return rangeUtil.describeTimeRange(adjustedTimeRange, timeZone);\n};\n\nexport const TimeRangePicker = withTheme(UnthemedTimeRangePicker);\n","import { DisplayValue } from '@grafana/data';\n\nimport { LegendList } from './LegendList';\nimport { LegendTable } from './LegendTable';\nimport tinycolor from 'tinycolor2';\n\nexport const generateLegendItems = (numberOfSeries: number, statsToDisplay?: DisplayValue[]): LegendItem[] => {\n  const alphabet = 'abcdefghijklmnopqrstuvwxyz'.split('');\n\n  return [...new Array(numberOfSeries)].map((item, i) => {\n    return {\n      label: `${alphabet[i].toUpperCase()}-series`,\n      color: tinycolor.fromRatio({ h: i / alphabet.length, s: 1, v: 1 }).toHexString(),\n      isVisible: true,\n      yAxis: 1,\n      displayValues: statsToDisplay || [],\n    };\n  });\n};\n\nexport enum LegendDisplayMode {\n  List = 'list',\n  Table = 'table',\n}\nexport interface LegendBasicOptions {\n  isVisible: boolean;\n  asTable: boolean;\n}\n\nexport interface LegendRenderOptions {\n  placement: LegendPlacement;\n  hideEmpty?: boolean;\n  hideZero?: boolean;\n}\n\nexport type LegendPlacement = 'under' | 'right' | 'over'; // Over used by piechart\n\nexport interface LegendOptions extends LegendBasicOptions, LegendRenderOptions {}\n\nexport interface LegendItem {\n  label: string;\n  color: string;\n  isVisible: boolean;\n  yAxis: number;\n  displayValues?: DisplayValue[];\n}\n\nexport interface LegendComponentProps {\n  className?: string;\n  items: LegendItem[];\n  placement: LegendPlacement;\n  // Function to render given item\n  itemRenderer?: (item: LegendItem, index: number) => JSX.Element;\n}\n\nexport interface LegendProps extends LegendComponentProps {}\n\nexport { LegendList, LegendTable };\n","import { useRef, useEffect } from 'react';\n\nexport const useRefMounted = () => {\n  const refMounted = useRef(false);\n  useEffect(() => {\n    refMounted.current = true;\n    return () => {\n      refMounted.current = false;\n    };\n  });\n  return refMounted;\n};\n","import React, { PureComponent } from 'react';\nimport { hot } from 'react-hot-loader';\nimport { connect } from 'react-redux';\nimport { NavModel } from '@grafana/data';\nimport { Alert, LegacyForms } from '@grafana/ui';\nconst { FormField } = LegacyForms;\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport config from 'app/core/config';\nimport Page from 'app/core/components/Page/Page';\nimport { LdapConnectionStatus } from './LdapConnectionStatus';\nimport { LdapSyncInfo } from './LdapSyncInfo';\nimport { LdapUserInfo } from './LdapUserInfo';\nimport { AppNotificationSeverity, LdapError, LdapUser, StoreState, SyncInfo, LdapConnectionInfo } from 'app/types';\nimport {\n  loadLdapState,\n  loadLdapSyncStatus,\n  loadUserMapping,\n  clearUserError,\n  clearUserMappingInfo,\n} from '../state/actions';\n\ninterface Props {\n  navModel: NavModel;\n  ldapConnectionInfo: LdapConnectionInfo;\n  ldapUser: LdapUser;\n  ldapSyncInfo: SyncInfo;\n  ldapError: LdapError;\n  userError?: LdapError;\n  username?: string;\n\n  loadLdapState: typeof loadLdapState;\n  loadLdapSyncStatus: typeof loadLdapSyncStatus;\n  loadUserMapping: typeof loadUserMapping;\n  clearUserError: typeof clearUserError;\n  clearUserMappingInfo: typeof clearUserMappingInfo;\n}\n\ninterface State {\n  isLoading: boolean;\n}\n\nexport class LdapPage extends PureComponent<Props, State> {\n  state = {\n    isLoading: true,\n  };\n\n  async componentDidMount() {\n    const { username, clearUserMappingInfo, loadUserMapping } = this.props;\n    await clearUserMappingInfo();\n    await this.fetchLDAPStatus();\n    if (username) {\n      await loadUserMapping(username);\n    }\n    this.setState({ isLoading: false });\n  }\n\n  async fetchLDAPStatus() {\n    const { loadLdapState, loadLdapSyncStatus } = this.props;\n    return Promise.all([loadLdapState(), loadLdapSyncStatus()]);\n  }\n\n  async fetchUserMapping(username: string) {\n    const { loadUserMapping } = this.props;\n    return await loadUserMapping(username);\n  }\n\n  search = (event: any) => {\n    event.preventDefault();\n    const username = event.target.elements['username'].value;\n    if (username) {\n      this.fetchUserMapping(username);\n    }\n  };\n\n  onClearUserError = () => {\n    this.props.clearUserError();\n  };\n\n  render() {\n    const { ldapUser, userError, ldapError, ldapSyncInfo, ldapConnectionInfo, navModel, username } = this.props;\n    const { isLoading } = this.state;\n\n    return (\n      <Page navModel={navModel}>\n        <Page.Contents isLoading={isLoading}>\n          <>\n            {ldapError && ldapError.title && (\n              <div className=\"gf-form-group\">\n                <Alert title={ldapError.title} severity={AppNotificationSeverity.Error} children={ldapError.body} />\n              </div>\n            )}\n\n            <LdapConnectionStatus ldapConnectionInfo={ldapConnectionInfo} />\n\n            {config.licenseInfo.hasLicense && ldapSyncInfo && <LdapSyncInfo ldapSyncInfo={ldapSyncInfo} />}\n\n            <h3 className=\"page-heading\">Test user mapping</h3>\n            <div className=\"gf-form-group\">\n              <form onSubmit={this.search} className=\"gf-form-inline\">\n                <FormField\n                  label=\"Username\"\n                  labelWidth={8}\n                  inputWidth={30}\n                  type=\"text\"\n                  id=\"username\"\n                  name=\"username\"\n                  defaultValue={username}\n                />\n                <button type=\"submit\" className=\"btn btn-primary\">\n                  Run\n                </button>\n              </form>\n            </div>\n            {userError && userError.title && (\n              <div className=\"gf-form-group\">\n                <Alert\n                  title={userError.title}\n                  severity={AppNotificationSeverity.Error}\n                  children={userError.body}\n                  onRemove={this.onClearUserError}\n                />\n              </div>\n            )}\n            {ldapUser && <LdapUserInfo ldapUser={ldapUser} showAttributeMapping={true} />}\n          </>\n        </Page.Contents>\n      </Page>\n    );\n  }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n  navModel: getNavModel(state.navIndex, 'ldap'),\n  username: state.location.routeParams.user,\n  ldapConnectionInfo: state.ldap.connectionInfo,\n  ldapUser: state.ldap.user,\n  ldapSyncInfo: state.ldap.syncInfo,\n  userError: state.ldap.userError,\n  ldapError: state.ldap.ldapError,\n});\n\nconst mapDispatchToProps = {\n  loadLdapState,\n  loadLdapSyncStatus,\n  loadUserMapping,\n  clearUserError,\n  clearUserMappingInfo,\n};\n\nexport default hot(module)(connect(mapStateToProps, mapDispatchToProps)(LdapPage));\n","var path = 'public/app/plugins/panel/graph/thresholds_form.html';\nvar html = \"<div class=gf-form-group>\\n  <p class=muted ng-show=ctrl.disabled>\\n    Visual thresholds options <strong>disabled.</strong> Visit the Alert tab to update your thresholds.<br/>\\n    To re-enable thresholds, the alert rule must be deleted from this panel.\\n  </p>\\n  <div ng-class=\\\"{'thresholds-form-disabled': ctrl.disabled}\\\">\\n    <div class=gf-form-inline ng-repeat=\\\"threshold in ctrl.panel.thresholds\\\">\\n      <div class=gf-form>\\n        <label class=gf-form-label>T{{$index+1}}</label>\\n      </div>\\n\\n      <div class=gf-form>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=threshold.op ng-options=\\\"f for f in ['gt', 'lt']\\\" ng-change=ctrl.render() ng-disabled=ctrl.disabled></select>\\n        </div>\\n        <input type=number ng-model=threshold.value class=\\\"gf-form-input width-8\\\" ng-change=ctrl.render() placeholder=value ng-disabled=ctrl.disabled />\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=gf-form-label>Color</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=threshold.colorMode ng-options=\\\"f for f in ['custom', 'critical', 'warning', 'ok']\\\" ng-change=ctrl.onThresholdTypeChange($index) ng-disabled=ctrl.disabled>\\n          </select>\\n        </div>\\n      </div>\\n\\n      <gf-form-switch class=gf-form label=Fill checked=threshold.fill on-change=ctrl.render() ng-disabled=ctrl.disabled></gf-form-switch>\\n\\n      <div class=gf-form ng-if=\\\"threshold.fill && threshold.colorMode === 'custom'\\\">\\n        <label class=gf-form-label>Fill color</label>\\n        <span class=gf-form-label>\\n          <color-picker color=threshold.fillColor onchange=ctrl.onFillColorChange($index)></color-picker>\\n        </span>\\n      </div>\\n\\n      <gf-form-switch class=gf-form label=Line checked=threshold.line on-change=ctrl.render() ng-disabled=ctrl.disabled></gf-form-switch>\\n\\n      <div class=gf-form ng-if=\\\"threshold.line && threshold.colorMode === 'custom'\\\">\\n        <label class=gf-form-label>Line color</label>\\n        <span class=gf-form-label>\\n          <color-picker color=threshold.lineColor onchange=ctrl.onLineColorChange($index)></color-picker>\\n        </span>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=gf-form-label>Y-Axis</label>\\n        <div class=gf-form-select-wrapper>\\n          <select class=gf-form-input ng-model=threshold.yaxis ng-init=\\\"threshold.yaxis = threshold.yaxis === 'left' || threshold.yaxis === 'right' ? threshold.yaxis : 'left'\\\" ng-options=\\\"f for f in ['left', 'right']\\\" ng-change=ctrl.render() ng-disabled=ctrl.disabled>\\n          </select>\\n        </div>\\n      </div>\\n\\n      <div class=gf-form>\\n        <label class=gf-form-label>\\n          <a class=pointer ng-click=ctrl.removeThreshold($index) ng-disabled=ctrl.disabled>\\n            <icon name=\\\"'trash-alt'\\\"></icon>\\n          </a>\\n        </label>\\n      </div>\\n    </div>\\n\\n    <div class=gf-form-button-row>\\n      <button class=\\\"btn btn-inverse\\\" ng-click=ctrl.addThreshold() ng-disabled=ctrl.disabled>\\n        <icon name=\\\"'plus'\\\"></icon>&nbsp;Add threshold\\n      </button>\\n    </div>\\n  </div>\\n</div>\\n\";\nwindow.angular.module('ng').run(['$templateCache', function(c) { c.put(path, html) }]);\nmodule.exports = path;","import { createAction } from '@reduxjs/toolkit';\n\nimport { StoreState } from '../../types';\n\nexport type StateSelector<T> = (state: StoreState) => T;\n\nexport interface CleanUp<T> {\n  stateSelector: (state: StoreState) => T;\n}\n\nexport const cleanUpAction = createAction<CleanUp<{}>>('core/cleanUpState');\n","import coreModule from 'app/core/core_module';\nimport { locationUtil, UrlQueryMap } from '@grafana/data';\nimport { DashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv';\nimport { ILocationService } from 'angular';\nimport { AppEventEmitter, CoreEvents, Scope } from 'app/types';\nimport { backendSrv } from 'app/core/services/backend_srv';\n\nexport class LoadDashboardCtrl {\n  /** @ngInject */\n  constructor(\n    $scope: Scope & AppEventEmitter,\n    $routeParams: UrlQueryMap,\n    dashboardLoaderSrv: DashboardLoaderSrv,\n    $location: ILocationService,\n    $browser: any\n  ) {\n    $scope.appEvent(CoreEvents.dashboardFetchStart);\n\n    if (!$routeParams.uid && !$routeParams.slug) {\n      backendSrv.get('/api/dashboards/home').then((homeDash: { redirectUri: string; meta: any }) => {\n        if (homeDash.redirectUri) {\n          const newUrl = locationUtil.stripBaseFromUrl(homeDash.redirectUri);\n          $location.path(newUrl);\n        } else {\n          const meta = homeDash.meta;\n          meta.canSave = meta.canShare = meta.canStar = false;\n          $scope.initDashboard(homeDash, $scope);\n        }\n      });\n      return;\n    }\n\n    // if no uid, redirect to new route based on slug\n    if (!($routeParams.type === 'script' || $routeParams.type === 'snapshot') && !$routeParams.uid) {\n      // @ts-ignore\n      backendSrv.getDashboardBySlug($routeParams.slug).then(res => {\n        if (res) {\n          $location.path(locationUtil.stripBaseFromUrl(res.meta.url)).replace();\n        }\n      });\n      return;\n    }\n\n    dashboardLoaderSrv.loadDashboard($routeParams.type, $routeParams.slug, $routeParams.uid).then((result: any) => {\n      if (result.meta.url) {\n        const url = locationUtil.stripBaseFromUrl(result.meta.url);\n\n        if (url !== $location.path()) {\n          // replace url to not create additional history items and then return so that initDashboard below isn't executed multiple times.\n          $location.path(url).replace();\n          return;\n        }\n      }\n\n      result.meta.autofitpanels = $routeParams.autofitpanels;\n      result.meta.kiosk = $routeParams.kiosk;\n\n      $scope.initDashboard(result, $scope);\n    });\n  }\n}\n\nexport class NewDashboardCtrl {\n  /** @ngInject */\n  constructor($scope: any, $routeParams: UrlQueryMap) {\n    $scope.initDashboard(\n      {\n        meta: {\n          canStar: false,\n          canShare: false,\n          isNew: true,\n          folderId: Number($routeParams.folderId),\n        },\n        dashboard: {\n          title: 'New dashboard',\n          panels: [\n            {\n              type: 'add-panel',\n              gridPos: { x: 0, y: 0, w: 12, h: 9 },\n              title: 'Panel Title',\n            },\n          ],\n        },\n      },\n      $scope\n    );\n  }\n}\n\ncoreModule.controller('LoadDashboardCtrl', LoadDashboardCtrl);\ncoreModule.controller('NewDashboardCtrl', NewDashboardCtrl);\n","import { route } from 'angular';\n\ninterface RegisterRoutesHandler {\n  ($routeProvider: route.IRouteProvider): any;\n}\n\nconst handlers: RegisterRoutesHandler[] = [];\n\nexport function applyRouteRegistrationHandlers($routeProvider: route.IRouteProvider) {\n  for (const handler of handlers) {\n    handler($routeProvider);\n  }\n}\n\nexport function addRouteRegistrationHandler(fn: RegisterRoutesHandler) {\n  handlers.push(fn);\n}\n","import React, { FC } from 'react';\nimport { LinkButton, HorizontalGroup } from '@grafana/ui';\n\nexport const UserSignup: FC<{}> = () => {\n  return (\n    <HorizontalGroup justify=\"flex-start\">\n      <LinkButton href=\"signup\" variant=\"secondary\">\n        Sign Up\n      </LinkButton>\n      <span>New to Grafana?</span>\n    </HorizontalGroup>\n  );\n};\n","import React from 'react';\nimport config from 'app/core/config';\nimport { css, cx } from 'emotion';\nimport { useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\n\nconst loginServices: () => LoginServices = () => {\n  const oauthEnabled = !!config.oauth;\n\n  return {\n    saml: {\n      enabled: config.samlEnabled,\n      name: 'SAML',\n      className: 'github',\n      icon: 'key',\n    },\n    google: {\n      enabled: oauthEnabled && config.oauth.google,\n      name: 'Google',\n    },\n    azuread: {\n      enabled: oauthEnabled && config.oauth.azuread,\n      name: 'Microsoft',\n    },\n    github: {\n      enabled: oauthEnabled && config.oauth.github,\n      name: 'GitHub',\n    },\n    gitlab: {\n      enabled: oauthEnabled && config.oauth.gitlab,\n      name: 'GitLab',\n    },\n    grafanacom: {\n      enabled: oauthEnabled && config.oauth.grafana_com,\n      name: 'Grafana.com',\n      hrefName: 'grafana_com',\n      icon: 'grafana_com',\n    },\n    okta: {\n      enabled: oauthEnabled && config.oauth.okta,\n      name: 'Okta',\n    },\n    oauth: {\n      enabled: oauthEnabled && config.oauth.generic_oauth,\n      name: oauthEnabled && config.oauth.generic_oauth ? config.oauth.generic_oauth.name : 'OAuth',\n      icon: 'sign-in',\n      hrefName: 'generic_oauth',\n    },\n  };\n};\n\nexport interface LoginService {\n  enabled: boolean;\n  name: string;\n  hrefName?: string;\n  icon?: string;\n  className?: string;\n}\n\nexport interface LoginServices {\n  [key: string]: LoginService;\n}\n\nconst getServiceStyles = (theme: GrafanaTheme) => {\n  return {\n    container: css`\n      width: 100%;\n      text-align: center;\n    `,\n    button: css`\n      color: #d8d9da;\n      margin: 0 0 ${theme.spacing.md};\n      width: 100%;\n      &:hover {\n        color: #fff;\n      }\n    `,\n    divider: {\n      base: css`\n        float: left;\n        width: 100%;\n        margin: 0 25% ${theme.spacing.md} 25%;\n        display: flex;\n        justify-content: space-between;\n        text-align: center;\n        color: ${theme.colors.text};\n      `,\n      line: css`\n        width: 100px;\n        height: 10px;\n        border-bottom: 1px solid ${theme.colors.text};\n      `,\n    },\n  };\n};\n\nconst LoginDivider = () => {\n  const styles = useStyles(getServiceStyles);\n  return (\n    <>\n      <div className={styles.divider.base}>\n        <div>\n          <div className={styles.divider.line} />\n        </div>\n        <div>\n          <span>{!config.disableLoginForm && <span>or</span>}</span>\n        </div>\n        <div>\n          <div className={styles.divider.line} />\n        </div>\n      </div>\n      <div className=\"clearfix\" />\n    </>\n  );\n};\n\nexport const LoginServiceButtons = () => {\n  const styles = useStyles(getServiceStyles);\n  const keyNames = Object.keys(loginServices());\n  const serviceElementsEnabled = keyNames.filter(key => {\n    const service: LoginService = loginServices()[key];\n    return service.enabled;\n  });\n\n  if (serviceElementsEnabled.length === 0) {\n    return null;\n  }\n\n  const serviceElements = serviceElementsEnabled.map(key => {\n    const service: LoginService = loginServices()[key];\n    return (\n      <a\n        key={key}\n        className={cx(`btn btn-medium btn-service btn-service--${service.className || key}`, styles.button)}\n        href={`login/${service.hrefName ? service.hrefName : key}`}\n        target=\"_self\"\n      >\n        <i className={`btn-service-icon fa fa-${service.icon ? service.icon : key}`} />\n        Sign in with {service.name}\n      </a>\n    );\n  });\n\n  const divider = LoginDivider();\n  return (\n    <>\n      {divider}\n      <div className={styles.container}>{serviceElements}</div>\n    </>\n  );\n};\n","import React, { FC } from 'react';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { FormModel } from './LoginCtrl';\nimport { Button, Form, Input, Field } from '@grafana/ui';\nimport { css } from 'emotion';\n\ninterface Props {\n  displayForgotPassword: boolean;\n  onSubmit: (data: FormModel) => void;\n  isLoggingIn: boolean;\n  passwordHint: string;\n  loginHint: string;\n}\n\nconst forgottenPasswordStyles = css`\n  display: inline-block;\n  margin-top: 16px;\n  float: right;\n`;\n\nconst wrapperStyles = css`\n  width: 100%;\n  padding-bottom: 16px;\n`;\n\nexport const submitButton = css`\n  justify-content: center;\n  width: 100%;\n`;\n\nexport const LoginForm: FC<Props> = ({ displayForgotPassword, onSubmit, isLoggingIn, passwordHint, loginHint }) => {\n  return (\n    <div className={wrapperStyles}>\n      <Form onSubmit={onSubmit} validateOn=\"onChange\">\n        {({ register, errors }) => (\n          <>\n            <Field label=\"Email or username\" invalid={!!errors.user} error={errors.user?.message}>\n              <Input\n                autoFocus\n                name=\"user\"\n                ref={register({ required: 'Email or username is required' })}\n                placeholder={loginHint}\n                aria-label={selectors.pages.Login.username}\n              />\n            </Field>\n            <Field label=\"Password\" invalid={!!errors.password} error={errors.password?.message}>\n              <Input\n                name=\"password\"\n                type=\"password\"\n                placeholder={passwordHint}\n                ref={register({ required: 'Password is requireed' })}\n                aria-label={selectors.pages.Login.password}\n              />\n            </Field>\n            <Button aria-label={selectors.pages.Login.submit} className={submitButton} disabled={isLoggingIn}>\n              {isLoggingIn ? 'Logging in...' : 'Log in'}\n            </Button>\n            {displayForgotPassword && (\n              <a className={forgottenPasswordStyles} href=\"user/password/send-reset-email\">\n                Forgot your password?\n              </a>\n            )}\n          </>\n        )}\n      </Form>\n    </div>\n  );\n};\n","import React, { FC, SyntheticEvent } from 'react';\nimport { Tooltip, Form, Field, Input, VerticalGroup, Button, LinkButton } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { submitButton } from './LoginForm';\ninterface Props {\n  onSubmit: (pw: string) => void;\n  onSkip: (event?: SyntheticEvent) => void;\n}\n\ninterface PasswordDTO {\n  newPassword: string;\n  confirmNew: string;\n}\n\nexport const ChangePassword: FC<Props> = ({ onSubmit, onSkip }) => {\n  const submit = (passwords: PasswordDTO) => {\n    onSubmit(passwords.newPassword);\n  };\n  return (\n    <Form onSubmit={submit}>\n      {({ errors, register, getValues }) => (\n        <>\n          <Field label=\"New password\" invalid={!!errors.newPassword} error={errors?.newPassword?.message}>\n            <Input\n              autoFocus\n              type=\"password\"\n              name=\"newPassword\"\n              ref={register({\n                required: 'New password required',\n              })}\n            />\n          </Field>\n          <Field label=\"Confirm new password\" invalid={!!errors.confirmNew} error={errors?.confirmNew?.message}>\n            <Input\n              type=\"password\"\n              name=\"confirmNew\"\n              ref={register({\n                required: 'Confirmed password is required',\n                validate: v => v === getValues().newPassword || 'Passwords must match!',\n              })}\n            />\n          </Field>\n          <VerticalGroup>\n            <Button type=\"submit\" className={submitButton}>\n              Submit\n            </Button>\n            <Tooltip\n              content=\"If you skip you will be prompted to change password next time you login.\"\n              placement=\"bottom\"\n            >\n              <LinkButton variant=\"link\" onClick={onSkip} aria-label={selectors.pages.Login.skip}>\n                Skip\n              </LinkButton>\n            </Tooltip>\n          </VerticalGroup>\n        </>\n      )}\n    </Form>\n  );\n};\n","// Libraries\nimport React, { FC } from 'react';\nimport { cx, keyframes, css } from 'emotion';\n\n// Components\nimport { UserSignup } from './UserSignup';\nimport { LoginServiceButtons } from './LoginServiceButtons';\nimport LoginCtrl from './LoginCtrl';\nimport { LoginForm } from './LoginForm';\nimport { ChangePassword } from './ChangePassword';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport { useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\n\nexport const LoginPage: FC = () => {\n  const loginStyles = useStyles(getLoginStyles);\n  return (\n    <Branding.LoginBackground className={loginStyles.container}>\n      <div className={cx(loginStyles.loginContent, Branding.LoginBoxBackground())}>\n        <div className={loginStyles.loginLogoWrapper}>\n          <Branding.LoginLogo className={loginStyles.loginLogo} />\n          <div className={loginStyles.titleWrapper}>\n            <h1 className={loginStyles.mainTitle}>{Branding.LoginTitle}</h1>\n            <h3 className={loginStyles.subTitle}>{Branding.GetLoginSubTitle()}</h3>\n          </div>\n        </div>\n        <LoginCtrl>\n          {({\n            loginHint,\n            passwordHint,\n            ldapEnabled,\n            authProxyEnabled,\n            disableLoginForm,\n            disableUserSignUp,\n            login,\n            isLoggingIn,\n            changePassword,\n            skipPasswordChange,\n            isChangingPassword,\n          }) => (\n            <div className={loginStyles.loginOuterBox}>\n              {!isChangingPassword && (\n                <div className={`${loginStyles.loginInnerBox} ${isChangingPassword ? 'hidden' : ''}`} id=\"login-view\">\n                  {!disableLoginForm && (\n                    <LoginForm\n                      displayForgotPassword={!(ldapEnabled || authProxyEnabled)}\n                      onSubmit={login}\n                      loginHint={loginHint}\n                      passwordHint={passwordHint}\n                      isLoggingIn={isLoggingIn}\n                    />\n                  )}\n\n                  <LoginServiceButtons />\n                  {!disableUserSignUp && <UserSignup />}\n                </div>\n              )}\n\n              {isChangingPassword && (\n                <div className={cx(loginStyles.loginInnerBox, loginStyles.enterAnimation)}>\n                  <ChangePassword onSubmit={changePassword} onSkip={skipPasswordChange as any} />\n                </div>\n              )}\n            </div>\n          )}\n        </LoginCtrl>\n\n        <div className=\"clearfix\" />\n      </div>\n    </Branding.LoginBackground>\n  );\n};\n\nconst flyInAnimation = keyframes`\nfrom{\n  transform: translate(-400px, 0px);\n}\n\nto{\n  transform: translate(0px, 0px);\n}`;\n\nexport const getLoginStyles = (theme: GrafanaTheme) => {\n  return {\n    container: css`\n      min-height: 100vh;\n      background-position: center;\n      background-repeat: no-repeat;\n      min-width: 100%;\n      margin-left: 0;\n      background-color: $black;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    `,\n    submitButton: css`\n      justify-content: center;\n      width: 100%;\n    `,\n    loginLogo: css`\n      width: 100%;\n      max-width: 100px;\n      margin-bottom: 15px;\n    `,\n    loginLogoWrapper: css`\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-direction: column;\n      padding: ${theme.spacing.lg};\n    `,\n    titleWrapper: css`\n      text-align: center;\n    `,\n    mainTitle: css`\n      font-size: '32px';\n    `,\n    subTitle: css`\n      font-size: ${theme.typography.size.md};\n      color: ${theme.colors.textSemiWeak};\n    `,\n    loginContent: css`\n      max-width: 550px;\n      width: 100%;\n      display: flex;\n      align-items: stretch;\n      flex-direction: column;\n      position: relative;\n      justify-content: center;\n      z-index: 1;\n      min-height: 320px;\n      border-radius: 3px;\n      padding: 20px 0;\n    `,\n    loginOuterBox: css`\n      display: flex;\n      overflow-y: hidden;\n      align-items: center;\n      justify-content: center;\n    `,\n    loginInnerBox: css`\n      padding: ${theme.spacing.xl};\n      @media (max-width: 320px) {\n        padding: ${theme.spacing.lg};\n      }\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      flex-grow: 1;\n      max-width: 415px;\n      width: 100%;\n      transform: translate(0px, 0px);\n      transition: 0.25s ease;\n    `,\n    enterAnimation: css`\n      animation: ${flyInAnimation} ease-out 0.2s;\n    `,\n  };\n};\n","import React, { FunctionComponent } from 'react';\nimport { LoadingPlaceholder } from '@grafana/ui';\n\nexport const LoadingChunkPlaceHolder: FunctionComponent = React.memo(() => (\n  <div className=\"preloader\">\n    <LoadingPlaceholder text={'Loading...'} />\n  </div>\n));\n\nLoadingChunkPlaceHolder.displayName = 'LoadingChunkPlaceHolder';\n","import React, { FunctionComponent } from 'react';\nimport { Button, stylesFactory } from '@grafana/ui';\nimport { css } from 'emotion';\n\nconst getStyles = stylesFactory(() => {\n  return css`\n    width: 508px;\n    margin: 128px auto;\n  `;\n});\n\ninterface Props {\n  error: Error | null;\n}\n\nexport const ErrorLoadingChunk: FunctionComponent<Props> = ({ error }) => (\n  <div className={getStyles()}>\n    <h2>Unable to find application file</h2>\n    <br />\n    <h2 className=\"page-heading\">Grafana has likely been updated. Please try reloading the page.</h2>\n    <br />\n    <div className=\"gf-form-group\">\n      <Button size=\"md\" variant=\"secondary\" icon=\"repeat\" onClick={() => window.location.reload()}>\n        Reload\n      </Button>\n    </div>\n    <details style={{ whiteSpace: 'pre-wrap' }}>\n      {error && error.message ? error.message : 'Unexpected error occurred'}\n      <br />\n      {error && error.stack ? error.stack : null}\n    </details>\n  </div>\n);\n\nErrorLoadingChunk.displayName = 'ErrorLoadingChunk';\n","import React from 'react';\nimport Loadable from 'react-loadable';\nimport { LoadingChunkPlaceHolder } from './LoadingChunkPlaceHolder';\nimport { ErrorLoadingChunk } from './ErrorLoadingChunk';\n\nexport const loadComponentHandler = (props: { error: Error; pastDelay: boolean }) => {\n  const { error, pastDelay } = props;\n\n  if (error) {\n    return <ErrorLoadingChunk error={error} />;\n  }\n\n  if (pastDelay) {\n    return <LoadingChunkPlaceHolder />;\n  }\n\n  return null;\n};\n\nexport const SafeDynamicImport = (importStatement: Promise<any>) => ({ ...props }) => {\n  const LoadableComponent = Loadable({\n    loader: () => importStatement,\n    loading: loadComponentHandler,\n  });\n\n  return <LoadableComponent {...props} />;\n};\n","import './dashboard_loaders';\nimport './ReactContainer';\nimport { applyRouteRegistrationHandlers } from './registry';\n// Pages\nimport LdapPage from 'app/features/admin/ldap/LdapPage';\nimport UserAdminPage from 'app/features/admin/UserAdminPage';\nimport SignupPage from 'app/features/profile/SignupPage';\nimport { LoginPage } from 'app/core/components/Login/LoginPage';\n\nimport config from 'app/core/config';\nimport { ILocationProvider, route } from 'angular';\n// Types\nimport { DashboardRouteInfo } from 'app/types';\nimport { SafeDynamicImport } from '../core/components/DynamicImports/SafeDynamicImport';\n\n/** @ngInject */\nexport function setupAngularRoutes($routeProvider: route.IRouteProvider, $locationProvider: ILocationProvider) {\n  $locationProvider.html5Mode(true);\n\n  // Routes here are guarded both here and server side for react-container routes or just on the server for angular\n  // ones. That means angular ones could be navigated to in case there is a client side link some where.\n\n  const importDashboardPage = () =>\n    SafeDynamicImport(import(/* webpackChunkName: \"DashboardPage\" */ '../features/dashboard/containers/DashboardPage'));\n\n  $routeProvider\n    .when('/', {\n      template: '<react-container />',\n      //@ts-ignore\n      pageClass: 'page-dashboard',\n      routeInfo: DashboardRouteInfo.Home,\n      reloadOnSearch: false,\n      resolve: {\n        component: importDashboardPage,\n      },\n    })\n    .when('/d/:uid/:slug', {\n      template: '<react-container />',\n      pageClass: 'page-dashboard',\n      routeInfo: DashboardRouteInfo.Normal,\n      reloadOnSearch: false,\n      resolve: {\n        component: importDashboardPage,\n      },\n    })\n    .when('/d/:uid', {\n      template: '<react-container />',\n      pageClass: 'page-dashboard',\n      reloadOnSearch: false,\n      routeInfo: DashboardRouteInfo.Normal,\n      resolve: {\n        component: importDashboardPage,\n      },\n    })\n    .when('/dashboard/:type/:slug', {\n      template: '<react-container />',\n      pageClass: 'page-dashboard',\n      routeInfo: DashboardRouteInfo.Normal,\n      reloadOnSearch: false,\n      resolve: {\n        component: importDashboardPage,\n      },\n    })\n    .when('/dashboard/new', {\n      template: '<react-container />',\n      pageClass: 'page-dashboard',\n      routeInfo: DashboardRouteInfo.New,\n      reloadOnSearch: false,\n      resolve: {\n        component: importDashboardPage,\n      },\n    })\n    .when('/d-solo/:uid/:slug', {\n      template: '<react-container />',\n      pageClass: 'dashboard-solo',\n      routeInfo: DashboardRouteInfo.Normal,\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"SoloPanelPage\" */ '../features/dashboard/containers/SoloPanelPage')\n          ),\n      },\n    })\n    .when('/d-solo/:uid', {\n      template: '<react-container />',\n      pageClass: 'dashboard-solo',\n      routeInfo: DashboardRouteInfo.Normal,\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"SoloPanelPage\" */ '../features/dashboard/containers/SoloPanelPage')\n          ),\n      },\n    })\n    .when('/dashboard-solo/:type/:slug', {\n      template: '<react-container />',\n      pageClass: 'dashboard-solo',\n      routeInfo: DashboardRouteInfo.Normal,\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"SoloPanelPage\" */ '../features/dashboard/containers/SoloPanelPage')\n          ),\n      },\n    })\n    .when('/dashboard/import', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"DashboardImport\"*/ 'app/features/manage-dashboards/DashboardImportPage')\n          ),\n      },\n    })\n    .when('/datasources', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"DataSourcesListPage\"*/ 'app/features/datasources/DataSourcesListPage')\n          ),\n      },\n    })\n    .when('/datasources/edit/:id/', {\n      template: '<react-container />',\n      reloadOnSearch: false, // for tabs\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(\n              /* webpackChunkName: \"DataSourceSettingsPage\"*/ '../features/datasources/settings/DataSourceSettingsPage'\n            )\n          ),\n      },\n    })\n    .when('/datasources/edit/:id/dashboards', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"DataSourceDashboards\"*/ 'app/features/datasources/DataSourceDashboards')\n          ),\n      },\n    })\n    .when('/datasources/new', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"NewDataSourcePage\"*/ '../features/datasources/NewDataSourcePage')\n          ),\n      },\n    })\n    .when('/dashboards', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"DashboardListPage\"*/ 'app/features/search/components/DashboardListPage')\n          ),\n      },\n    })\n    .when('/dashboards/folder/new', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"NewDashboardsFolder\"*/ 'app/features/folders/components/NewDashboardsFolder')\n          ),\n      },\n    })\n    .when('/dashboards/f/:uid/:slug/permissions', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"FolderPermissions\"*/ 'app/features/folders/FolderPermissions')\n          ),\n      },\n    })\n    .when('/dashboards/f/:uid/:slug/settings', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"FolderSettingsPage\"*/ 'app/features/folders/FolderSettingsPage')\n          ),\n      },\n    })\n    .when('/dashboards/f/:uid/:slug', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"DashboardListPage\"*/ 'app/features/search/components/DashboardListPage')\n          ),\n      },\n    })\n    .when('/dashboards/f/:uid', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"DashboardListPage\"*/ 'app/features/search/components/DashboardListPage')\n          ),\n      },\n    })\n    .when('/explore', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      pageClass: 'page-explore',\n      resolve: {\n        roles: () => (config.viewersCanEdit ? [] : ['Editor', 'Admin']),\n        component: () => SafeDynamicImport(import(/* webpackChunkName: \"explore\" */ 'app/features/explore/Wrapper')),\n      },\n    })\n    .when('/a/:pluginId/', {\n      // Someday * and will get a ReactRouter under that path!\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"AppRootPage\" */ 'app/features/plugins/AppRootPage')),\n      },\n    })\n    .when('/org', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"OrgDetailsPage\" */ '../features/org/OrgDetailsPage')),\n      },\n    })\n    .when('/org/new', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () => SafeDynamicImport(import(/* webpackChunkName: \"NewOrgPage\" */ 'app/features/org/NewOrgPage')),\n      },\n    })\n    .when('/org/users', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"UsersListPage\" */ 'app/features/users/UsersListPage')),\n      },\n    })\n    .when('/org/users/invite', {\n      template: '<react-container/>',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"UserInvitePage\" */ 'app/features/org/UserInvitePage')),\n      },\n    })\n    .when('/org/apikeys', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        roles: () => ['Editor', 'Admin'],\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"ApiKeysPage\" */ 'app/features/api-keys/ApiKeysPage')),\n      },\n    })\n    .when('/org/teams', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        roles: () => (config.editorsCanAdmin ? [] : ['Editor', 'Admin']),\n        component: () => SafeDynamicImport(import(/* webpackChunkName: \"TeamList\" */ 'app/features/teams/TeamList')),\n      },\n    })\n    .when('/org/teams/new', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        roles: () => (config.editorsCanAdmin ? [] : ['Admin']),\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"CreateTeam\" */ 'app/features/teams/CreateTeam')),\n      },\n    })\n    .when('/org/teams/edit/:id/:page?', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        roles: () => (config.editorsCanAdmin ? [] : ['Admin']),\n        component: () => SafeDynamicImport(import(/* webpackChunkName: \"TeamPages\" */ 'app/features/teams/TeamPages')),\n      },\n    })\n    .when('/profile', {\n      templateUrl: 'public/app/features/profile/partials/profile.html',\n      controller: 'ProfileCtrl',\n      controllerAs: 'ctrl',\n      reloadOnSearch: false,\n    })\n    .when('/profile/password', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webPackChunkName: \"ChangePasswordPage\" */ 'app/features/profile/ChangePasswordPage')\n          ),\n      },\n    })\n    .when('/profile/select-org', {\n      templateUrl: 'public/app/features/org/partials/select_org.html',\n      controller: 'SelectOrgCtrl',\n      reloadOnSearch: false,\n    })\n    // ADMIN\n    .when('/admin', {\n      templateUrl: 'public/app/features/admin/partials/admin_home.html',\n      controller: 'AdminHomeCtrl',\n      controllerAs: 'ctrl',\n      reloadOnSearch: false,\n    })\n    .when('/admin/settings', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"AdminSettings\" */ 'app/features/admin/AdminSettings')),\n      },\n    })\n    .when('/admin/upgrading', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () => SafeDynamicImport(import('app/features/admin/UpgradePage')),\n      },\n    })\n    .when('/admin/users', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"UserListAdminPage\" */ 'app/features/admin/UserListAdminPage')),\n      },\n    })\n    .when('/admin/users/create', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"UserCreatePage\" */ 'app/features/admin/UserCreatePage')),\n      },\n    })\n    .when('/admin/users/edit/:id', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () => UserAdminPage,\n      },\n    })\n    .when('/admin/orgs', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"AdminListOrgsPage\" */ 'app/features/admin/AdminListOrgsPage')),\n      },\n    })\n    .when('/admin/orgs/edit/:id', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"AdminEditOrgPage\" */ 'app/features/admin/AdminEditOrgPage')),\n      },\n    })\n    .when('/admin/stats', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"ServerStats\" */ 'app/features/admin/ServerStats')),\n      },\n    })\n    .when('/admin/ldap', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () => LdapPage,\n      },\n    })\n    // LOGIN / SIGNUP\n    .when('/login', {\n      template: '<react-container/>',\n      resolve: {\n        component: () => LoginPage,\n      },\n      pageClass: 'login-page sidemenu-hidden',\n    })\n    .when('/invite/:code', {\n      template: '<react-container/>',\n      pageClass: 'sidemenu-hidden',\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"SignupInvited\" */ 'app/features/users/SignupInvited')),\n      },\n    })\n    .when('/signup', {\n      template: '<react-container/>',\n      resolve: {\n        component: () => SignupPage,\n      },\n      pageClass: 'sidemenu-hidden',\n    })\n    .when('/user/password/send-reset-email', {\n      templateUrl: 'public/app/partials/reset_password.html',\n      controller: 'ResetPasswordCtrl',\n      pageClass: 'sidemenu-hidden',\n    })\n    .when('/user/password/reset', {\n      templateUrl: 'public/app/partials/reset_password.html',\n      controller: 'ResetPasswordCtrl',\n      pageClass: 'sidemenu-hidden',\n    })\n    .when('/dashboard/snapshots', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"SnapshotListPage\" */ 'app/features/manage-dashboards/SnapshotListPage')\n          ),\n      },\n    })\n    .when('/plugins', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"PluginListPage\" */ 'app/features/plugins/PluginListPage')),\n      },\n    })\n    .when('/plugins/:pluginId/', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"PluginPage\" */ '../features/plugins/PluginPage')),\n      },\n    })\n    .when('/plugins/:pluginId/page/:slug', {\n      templateUrl: 'public/app/features/plugins/partials/plugin_page.html',\n      controller: 'AppPageCtrl',\n      controllerAs: 'ctrl',\n      reloadOnSearch: false,\n    })\n    .when('/alerting', {\n      redirectTo: '/alerting/list',\n    })\n    .when('/alerting/list', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(import(/* webpackChunkName: \"AlertRuleList\" */ 'app/features/alerting/AlertRuleList')),\n      },\n    })\n    .when('/alerting/notifications', {\n      template: '<react-container />',\n      reloadOnSearch: false,\n      resolve: {\n        component: () =>\n          SafeDynamicImport(\n            import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n          ),\n      },\n    })\n    .when('/alerting/notification/new', {\n      templateUrl: 'public/app/features/alerting/partials/notification_edit.html',\n      controller: 'AlertNotificationEditCtrl',\n      controllerAs: 'ctrl',\n      reloadOnSearch: false,\n    })\n    .when('/alerting/notification/:id/edit', {\n      templateUrl: 'public/app/features/alerting/partials/notification_edit.html',\n      controller: 'AlertNotificationEditCtrl',\n      controllerAs: 'ctrl',\n      reloadOnSearch: false,\n    })\n    .otherwise({\n      templateUrl: 'public/app/partials/error.html',\n      controller: 'ErrorCtrl',\n      reloadOnSearch: false,\n    });\n\n  applyRouteRegistrationHandlers($routeProvider);\n}\n","import { EchoBackend, EchoMeta, EchoEvent, EchoSrv } from '@grafana/runtime';\nimport { contextSrv } from '../context_srv';\n\ninterface EchoConfig {\n  // How often should metrics be reported\n  flushInterval: number;\n  // Enables debug mode\n  debug: boolean;\n}\n\n/**\n * Echo is a service for collecting events from Grafana client-app\n * It collects events, distributes them across registered backend and flushes once per configured interval\n * It's up to the registered backend to decide what to do with a given type of metric\n */\nexport class Echo implements EchoSrv {\n  private config: EchoConfig = {\n    flushInterval: 10000, // By default Echo flushes every 10s\n    debug: false,\n  };\n\n  private backends: EchoBackend[] = [];\n  // meta data added to every event collected\n\n  constructor(config?: Partial<EchoConfig>) {\n    this.config = {\n      ...this.config,\n      ...config,\n    };\n    setInterval(this.flush, this.config.flushInterval);\n  }\n\n  logDebug = (...msg: any) => {\n    if (this.config.debug) {\n      // eslint-disable-next-line\n      // console.debug('ECHO:', ...msg);\n    }\n  };\n\n  flush = () => {\n    for (const backend of this.backends) {\n      backend.flush();\n    }\n  };\n\n  addBackend = (backend: EchoBackend) => {\n    this.logDebug('Adding backend', backend);\n    this.backends.push(backend);\n  };\n\n  addEvent = <T extends EchoEvent>(event: Omit<T, 'meta'>, _meta?: {}) => {\n    const meta = this.getMeta();\n    const _event = {\n      ...event,\n      meta: {\n        ...meta,\n        ..._meta,\n      },\n    };\n\n    for (const backend of this.backends) {\n      if (backend.supportedEvents.length === 0 || backend.supportedEvents.indexOf(_event.type) > -1) {\n        backend.addEvent(_event);\n      }\n    }\n\n    this.logDebug('Adding event', _event);\n  };\n\n  getMeta = (): EchoMeta => {\n    return {\n      sessionId: '',\n      userId: contextSrv.user.id,\n      userLogin: contextSrv.user.login,\n      userSignedIn: contextSrv.user.isSignedIn,\n      screenSize: {\n        width: window.innerWidth,\n        height: window.innerHeight,\n      },\n      windowSize: {\n        width: window.screen.width,\n        height: window.screen.height,\n      },\n      userAgent: window.navigator.userAgent,\n      ts: new Date().getTime(),\n      timeSinceNavigationStart: performance.now(),\n      url: window.location.href,\n    };\n  };\n}\n","import { getEchoSrv, EchoEventType } from '@grafana/runtime';\nimport { PerformanceEvent } from './backends/PerformanceBackend';\n\nexport const reportPerformance = (metric: string, value: number) => {\n  getEchoSrv().addEvent<PerformanceEvent>({\n    type: EchoEventType.Performance,\n    payload: {\n      metricName: metric,\n      duration: value,\n    },\n  });\n};\n","import { EchoBackend, EchoEvent, EchoEventType } from '@grafana/runtime';\n\nexport interface PerformanceEventPayload {\n  metricName: string;\n  duration: number;\n}\n\nexport interface PerformanceEvent extends EchoEvent<EchoEventType.Performance, PerformanceEventPayload> {}\n\nexport interface PerformanceBackendOptions {\n  url?: string;\n}\n\n/**\n * Echo's performance metrics consumer\n * Reports performance metrics to given url (TODO)\n */\nexport class PerformanceBackend implements EchoBackend<PerformanceEvent, PerformanceBackendOptions> {\n  private buffer: PerformanceEvent[] = [];\n  supportedEvents = [EchoEventType.Performance];\n\n  constructor(public options: PerformanceBackendOptions) {}\n\n  addEvent = (e: EchoEvent) => {\n    this.buffer.push(e);\n  };\n\n  flush = () => {\n    if (this.buffer.length === 0) {\n      return;\n    }\n\n    const result = {\n      metrics: this.buffer,\n    };\n\n    // Currently we don have API for sending the metrics hence loging to console in dev environment\n    if (process.env.NODE_ENV === 'development') {\n      console.log('PerformanceBackend flushing:', result);\n    }\n\n    this.buffer = [];\n\n    // TODO: Enable backend request when we have metrics API\n    // if (this.options.url) {\n    // backendSrv.post(this.options.url, result);\n    // }\n  };\n}\n","import angular from 'angular';\nimport coreModule from 'app/core/core_module';\nimport _ from 'lodash';\n\nimport {\n  AngularComponent,\n  AngularLoader as AngularLoaderInterface,\n  setAngularLoader as setAngularLoaderInterface,\n} from '@grafana/runtime';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\nexport class AngularLoader implements AngularLoaderInterface {\n  /** @ngInject */\n  constructor(private $compile: any, private $rootScope: GrafanaRootScope) {}\n\n  load(elem: any, scopeProps: any, template: string): AngularComponent {\n    const scope = this.$rootScope.$new();\n\n    _.assign(scope, scopeProps);\n\n    const compiledElem = this.$compile(template)(scope);\n    const rootNode = angular.element(elem);\n    rootNode.append(compiledElem);\n\n    return {\n      destroy: () => {\n        scope.$destroy();\n        compiledElem.remove();\n      },\n      digest: () => {\n        if (!scope.$$phase) {\n          scope.$digest();\n        }\n      },\n      getScope: () => {\n        return scope;\n      },\n    };\n  }\n}\n\nexport function setAngularLoader(v: AngularLoader) {\n  setAngularLoaderInterface(v);\n}\n\ncoreModule.service('angularLoader', AngularLoader);\n","import { createSlice } from '@reduxjs/toolkit';\nimport { ApplicationState } from 'app/types/application';\n\nexport const initialState: ApplicationState = {\n  logActions: false,\n};\n\nconst applicationSlice = createSlice({\n  name: 'application',\n  initialState,\n  reducers: {\n    toggleLogActions: state => ({ ...state, logActions: !state.logActions }),\n  },\n});\n\nexport const { toggleLogActions } = applicationSlice.actions;\nexport const applicationReducer = applicationSlice.reducer;\n","import { navIndexReducer as navIndex } from './navModel';\nimport { locationReducer as location } from './location';\nimport { appNotificationsReducer as appNotifications } from './appNotification';\nimport { applicationReducer as application } from './application';\n\nexport default {\n  navIndex,\n  location,\n  appNotifications,\n  application,\n};\n","import {\n  LogsModel,\n  GraphSeriesXY,\n  DataFrame,\n  FieldType,\n  TimeZone,\n  toDataFrame,\n  getDisplayProcessor,\n  ExploreMode,\n  PreferredVisualisationType,\n} from '@grafana/data';\nimport { ExploreItemState } from 'app/types/explore';\nimport TableModel, { mergeTablesIntoModel, MutableColumn } from 'app/core/table_model';\nimport { sortLogsResult, refreshIntervalToSortOrder } from 'app/core/utils/explore';\nimport { dataFrameToLogsModel } from 'app/core/logs_model';\nimport { getGraphSeriesModel } from 'app/plugins/panel/graph2/getGraphSeriesModel';\nimport { config } from 'app/core/config';\n\nexport class ResultProcessor {\n  constructor(\n    private state: ExploreItemState,\n    private dataFrames: DataFrame[],\n    private intervalMs: number,\n    private timeZone: TimeZone\n  ) {}\n\n  getGraphResult(): GraphSeriesXY[] | null {\n    if (this.state.mode !== ExploreMode.Metrics) {\n      return null;\n    }\n\n    const onlyTimeSeries = this.dataFrames.filter(frame => isTimeSeries(frame, this.state.datasourceInstance?.meta.id));\n    const timeSeriesToShowInGraph = onlyTimeSeries.filter(frame => shouldShowInVisualisationType(frame, 'graph'));\n\n    if (timeSeriesToShowInGraph.length === 0) {\n      return null;\n    }\n\n    return getGraphSeriesModel(\n      timeSeriesToShowInGraph,\n      this.timeZone,\n      {},\n      { showBars: false, showLines: true, showPoints: false },\n      { asTable: false, isVisible: true, placement: 'under' }\n    );\n  }\n\n  getTableResult(): DataFrame | null {\n    if (this.state.mode !== ExploreMode.Metrics) {\n      return null;\n    }\n\n    const onlyTables = this.dataFrames\n      .filter((frame: DataFrame) => shouldShowInVisualisationType(frame, 'table'))\n      .sort((frameA: DataFrame, frameB: DataFrame) => {\n        const frameARefId = frameA.refId!;\n        const frameBRefId = frameB.refId!;\n\n        if (frameARefId > frameBRefId) {\n          return 1;\n        }\n        if (frameARefId < frameBRefId) {\n          return -1;\n        }\n        return 0;\n      });\n\n    if (onlyTables.length === 0) {\n      return null;\n    }\n\n    const tables = onlyTables.map(frame => {\n      const { fields } = frame;\n      const fieldCount = fields.length;\n      const rowCount = frame.length;\n\n      const columns: MutableColumn[] = fields.map(field => ({\n        text: field.name,\n        type: field.type,\n        filterable: field.config.filterable,\n        custom: field.config.custom,\n      }));\n\n      const rows: any[][] = [];\n      for (let i = 0; i < rowCount; i++) {\n        const row: any[] = [];\n        for (let j = 0; j < fieldCount; j++) {\n          row.push(frame.fields[j].values.get(i));\n        }\n        rows.push(row);\n      }\n\n      return new TableModel({\n        columns,\n        rows,\n        meta: frame.meta,\n      });\n    });\n\n    const mergedTable = mergeTablesIntoModel(new TableModel(), ...tables);\n    const data = toDataFrame(mergedTable);\n\n    // set display processor\n    for (const field of data.fields) {\n      field.display = getDisplayProcessor({\n        field,\n        theme: config.theme,\n        timeZone: this.timeZone,\n      });\n    }\n\n    return data;\n  }\n\n  getLogsResult(): LogsModel | null {\n    if (this.state.mode !== ExploreMode.Logs) {\n      return null;\n    }\n\n    const newResults = dataFrameToLogsModel(this.dataFrames, this.intervalMs, this.timeZone);\n    const sortOrder = refreshIntervalToSortOrder(this.state.refreshInterval);\n    const sortedNewResults = sortLogsResult(newResults, sortOrder);\n    const rows = sortedNewResults.rows;\n    const series = sortedNewResults.series;\n    return { ...sortedNewResults, rows, series };\n  }\n}\n\nfunction isTimeSeries(frame: DataFrame, datasource?: string): boolean {\n  // TEMP: Temporary hack. Remove when logs/metrics unification is done\n  if (datasource && datasource === 'cloudwatch') {\n    return isTimeSeriesCloudWatch(frame);\n  }\n\n  if (frame.fields.length === 2) {\n    if (frame.fields[0].type === FieldType.time) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction shouldShowInVisualisationType(frame: DataFrame, visualisation: PreferredVisualisationType) {\n  if (frame.meta?.preferredVisualisationType && frame.meta?.preferredVisualisationType !== visualisation) {\n    return false;\n  }\n\n  return true;\n}\n\n// TEMP: Temporary hack. Remove when logs/metrics unification is done\nfunction isTimeSeriesCloudWatch(frame: DataFrame): boolean {\n  return (\n    frame.fields.some(field => field.type === FieldType.time) &&\n    frame.fields.some(field => field.type === FieldType.number)\n  );\n}\n","import _ from 'lodash';\nimport { AnyAction } from 'redux';\nimport { PayloadAction } from '@reduxjs/toolkit';\nimport {\n  DataQuery,\n  DataQueryRequest,\n  DataSourceApi,\n  DefaultTimeRange,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  TimeZone,\n  toLegacyResponseData,\n  ExploreMode,\n} from '@grafana/data';\nimport { RefreshPicker } from '@grafana/ui';\nimport { LocationUpdate } from '@grafana/runtime';\n\nimport {\n  DEFAULT_UI_STATE,\n  ensureQueries,\n  generateNewKeyAndAddRefIdIfMissing,\n  getQueryKeys,\n  parseUrlState,\n  refreshIntervalToSortOrder,\n  sortLogsResult,\n  stopQueryState,\n} from 'app/core/utils/explore';\nimport { ExploreId, ExploreItemState, ExploreState, ExploreUpdateState } from 'app/types/explore';\nimport {\n  addQueryRowAction,\n  changeLoadingStateAction,\n  changeModeAction,\n  changeQueryAction,\n  changeRangeAction,\n  changeRefreshIntervalAction,\n  changeSizeAction,\n  clearQueriesAction,\n  highlightLogsExpressionAction,\n  historyUpdatedAction,\n  richHistoryUpdatedAction,\n  initializeExploreAction,\n  loadDatasourceMissingAction,\n  loadDatasourcePendingAction,\n  loadDatasourceReadyAction,\n  modifyQueriesAction,\n  queriesImportedAction,\n  QueryEndedPayload,\n  queryStoreSubscriptionAction,\n  queryStreamUpdatedAction,\n  removeQueryRowAction,\n  resetExploreAction,\n  ResetExplorePayload,\n  scanStartAction,\n  scanStopAction,\n  setPausedStateAction,\n  setQueriesAction,\n  setUrlReplacedAction,\n  splitCloseAction,\n  SplitCloseActionPayload,\n  splitOpenAction,\n  syncTimesAction,\n  toggleGraphAction,\n  toggleLogLevelAction,\n  toggleTableAction,\n  updateDatasourceInstanceAction,\n  updateUIStateAction,\n  cancelQueriesAction,\n} from './actionTypes';\nimport { ResultProcessor } from '../utils/ResultProcessor';\nimport { updateLocation } from '../../../core/actions';\n\nexport const DEFAULT_RANGE = {\n  from: 'now-6h',\n  to: 'now',\n};\n\nexport const makeInitialUpdateState = (): ExploreUpdateState => ({\n  datasource: false,\n  queries: false,\n  range: false,\n  mode: false,\n  ui: false,\n});\n\n/**\n * Returns a fresh Explore area state\n */\nexport const makeExploreItemState = (): ExploreItemState => ({\n  containerWidth: 0,\n  datasourceInstance: null,\n  requestedDatasourceName: null,\n  datasourceLoading: null,\n  datasourceMissing: false,\n  history: [],\n  queries: [],\n  initialized: false,\n  range: {\n    from: null,\n    to: null,\n    raw: DEFAULT_RANGE,\n  },\n  absoluteRange: {\n    from: null,\n    to: null,\n  },\n  scanning: false,\n  scanRange: null,\n  showingGraph: true,\n  showingTable: true,\n  loading: false,\n  queryKeys: [],\n  urlState: null,\n  update: makeInitialUpdateState(),\n  latency: 0,\n  supportedModes: [],\n  mode: null,\n  isLive: false,\n  isPaused: false,\n  urlReplaced: false,\n  queryResponse: createEmptyQueryResponse(),\n});\n\nexport const createEmptyQueryResponse = (): PanelData => ({\n  state: LoadingState.NotStarted,\n  request: {} as DataQueryRequest<DataQuery>,\n  series: [],\n  error: null,\n  timeRange: DefaultTimeRange,\n});\n\n/**\n * Global Explore state that handles multiple Explore areas and the split state\n */\nexport const initialExploreItemState = makeExploreItemState();\nexport const initialExploreState: ExploreState = {\n  split: false,\n  syncedTimes: false,\n  left: initialExploreItemState,\n  right: initialExploreItemState,\n  richHistory: [],\n};\n\n/**\n * Reducer for an Explore area, to be used by the global Explore reducer.\n */\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because flot (Graph lib) would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const itemReducer = (state: ExploreItemState = makeExploreItemState(), action: AnyAction): ExploreItemState => {\n  if (addQueryRowAction.match(action)) {\n    const { queries } = state;\n    const { index, query } = action.payload;\n\n    // Add to queries, which will cause a new row to be rendered\n    const nextQueries = [...queries.slice(0, index + 1), { ...query }, ...queries.slice(index + 1)];\n\n    return {\n      ...state,\n      queries: nextQueries,\n      logsHighlighterExpressions: undefined,\n      queryKeys: getQueryKeys(nextQueries, state.datasourceInstance),\n    };\n  }\n\n  if (changeQueryAction.match(action)) {\n    const { queries } = state;\n    const { query, index } = action.payload;\n\n    // Override path: queries are completely reset\n    const nextQuery: DataQuery = generateNewKeyAndAddRefIdIfMissing(query, queries, index);\n    const nextQueries = [...queries];\n    nextQueries[index] = nextQuery;\n\n    return {\n      ...state,\n      queries: nextQueries,\n      queryKeys: getQueryKeys(nextQueries, state.datasourceInstance),\n    };\n  }\n\n  if (changeSizeAction.match(action)) {\n    const containerWidth = action.payload.width;\n    return { ...state, containerWidth };\n  }\n\n  if (changeModeAction.match(action)) {\n    return {\n      ...state,\n      mode: action.payload.mode,\n      graphResult: null,\n      tableResult: null,\n      logsResult: null,\n      queryResponse: createEmptyQueryResponse(),\n      loading: false,\n    };\n  }\n\n  if (changeRefreshIntervalAction.match(action)) {\n    const { refreshInterval } = action.payload;\n    const live = RefreshPicker.isLive(refreshInterval);\n    const sortOrder = refreshIntervalToSortOrder(refreshInterval);\n    const logsResult = sortLogsResult(state.logsResult, sortOrder);\n\n    if (RefreshPicker.isLive(state.refreshInterval) && !live) {\n      stopQueryState(state.querySubscription);\n    }\n\n    return {\n      ...state,\n      refreshInterval,\n      queryResponse: {\n        ...state.queryResponse,\n        state: live ? LoadingState.Streaming : LoadingState.Done,\n      },\n      isLive: live,\n      isPaused: live ? false : state.isPaused,\n      loading: live,\n      logsResult,\n    };\n  }\n\n  if (clearQueriesAction.match(action)) {\n    const queries = ensureQueries();\n    stopQueryState(state.querySubscription);\n    return {\n      ...state,\n      queries: queries.slice(),\n      graphResult: null,\n      tableResult: null,\n      logsResult: null,\n      queryKeys: getQueryKeys(queries, state.datasourceInstance),\n      queryResponse: createEmptyQueryResponse(),\n      loading: false,\n    };\n  }\n\n  if (cancelQueriesAction.match(action)) {\n    stopQueryState(state.querySubscription);\n\n    return {\n      ...state,\n      loading: false,\n    };\n  }\n\n  if (highlightLogsExpressionAction.match(action)) {\n    const { expressions } = action.payload;\n    return { ...state, logsHighlighterExpressions: expressions };\n  }\n\n  if (initializeExploreAction.match(action)) {\n    const { containerWidth, eventBridge, queries, range, mode, ui, originPanelId } = action.payload;\n    return {\n      ...state,\n      containerWidth,\n      eventBridge,\n      range,\n      mode,\n      queries,\n      initialized: true,\n      queryKeys: getQueryKeys(queries, state.datasourceInstance),\n      ...ui,\n      originPanelId,\n      update: makeInitialUpdateState(),\n    };\n  }\n\n  if (updateDatasourceInstanceAction.match(action)) {\n    const { datasourceInstance, version, mode } = action.payload;\n\n    // Custom components\n    stopQueryState(state.querySubscription);\n\n    let newMetadata = datasourceInstance.meta;\n\n    // HACK: Temporary hack for Loki datasource. Can remove when plugin.json structure is changed.\n    if (version && version.length && datasourceInstance.meta.name === 'Loki') {\n      const lokiVersionMetadata: Record<string, { metrics: boolean }> = {\n        v0: {\n          metrics: false,\n        },\n\n        v1: {\n          metrics: true,\n        },\n      };\n      newMetadata = { ...newMetadata, ...lokiVersionMetadata[version] };\n    }\n\n    const updatedDatasourceInstance = Object.assign(datasourceInstance, { meta: newMetadata });\n    const [supportedModes, newMode] = getModesForDatasource(updatedDatasourceInstance, state.mode);\n\n    return {\n      ...state,\n      datasourceInstance: updatedDatasourceInstance,\n      graphResult: null,\n      tableResult: null,\n      logsResult: null,\n      latency: 0,\n      queryResponse: createEmptyQueryResponse(),\n      loading: false,\n      queryKeys: [],\n      supportedModes,\n      mode: mode ?? newMode,\n      originPanelId: state.urlState && state.urlState.originPanelId,\n    };\n  }\n\n  if (loadDatasourceMissingAction.match(action)) {\n    return {\n      ...state,\n      datasourceMissing: true,\n      datasourceLoading: false,\n      update: makeInitialUpdateState(),\n    };\n  }\n\n  if (loadDatasourcePendingAction.match(action)) {\n    return {\n      ...state,\n      datasourceLoading: true,\n      requestedDatasourceName: action.payload.requestedDatasourceName,\n    };\n  }\n\n  if (loadDatasourceReadyAction.match(action)) {\n    const { history } = action.payload;\n    return {\n      ...state,\n      history,\n      datasourceLoading: false,\n      datasourceMissing: false,\n      logsHighlighterExpressions: undefined,\n      update: makeInitialUpdateState(),\n    };\n  }\n\n  if (modifyQueriesAction.match(action)) {\n    const { queries } = state;\n    const { modification, index, modifier } = action.payload;\n    let nextQueries: DataQuery[];\n    if (index === undefined) {\n      // Modify all queries\n      nextQueries = queries.map((query, i) => {\n        const nextQuery = modifier({ ...query }, modification);\n        return generateNewKeyAndAddRefIdIfMissing(nextQuery, queries, i);\n      });\n    } else {\n      // Modify query only at index\n      nextQueries = queries.map((query, i) => {\n        if (i === index) {\n          const nextQuery = modifier({ ...query }, modification);\n          return generateNewKeyAndAddRefIdIfMissing(nextQuery, queries, i);\n        }\n\n        return query;\n      });\n    }\n    return {\n      ...state,\n      queries: nextQueries,\n      queryKeys: getQueryKeys(nextQueries, state.datasourceInstance),\n    };\n  }\n\n  if (removeQueryRowAction.match(action)) {\n    const { queries, queryKeys } = state;\n    const { index } = action.payload;\n\n    if (queries.length <= 1) {\n      return state;\n    }\n\n    const nextQueries = [...queries.slice(0, index), ...queries.slice(index + 1)];\n    const nextQueryKeys = [...queryKeys.slice(0, index), ...queryKeys.slice(index + 1)];\n\n    return {\n      ...state,\n      queries: nextQueries,\n      logsHighlighterExpressions: undefined,\n      queryKeys: nextQueryKeys,\n    };\n  }\n\n  if (scanStartAction.match(action)) {\n    return { ...state, scanning: true };\n  }\n\n  if (scanStopAction.match(action)) {\n    return {\n      ...state,\n      scanning: false,\n      scanRange: undefined,\n      update: makeInitialUpdateState(),\n    };\n  }\n\n  if (setQueriesAction.match(action)) {\n    const { queries } = action.payload;\n    return {\n      ...state,\n      queries: queries.slice(),\n      queryKeys: getQueryKeys(queries, state.datasourceInstance),\n    };\n  }\n\n  if (updateUIStateAction.match(action)) {\n    return { ...state, ...action.payload };\n  }\n\n  if (toggleGraphAction.match(action)) {\n    const showingGraph = !state.showingGraph;\n    if (showingGraph) {\n      return { ...state, showingGraph };\n    }\n\n    return { ...state, showingGraph, graphResult: null };\n  }\n\n  if (toggleTableAction.match(action)) {\n    const showingTable = !state.showingTable;\n    if (showingTable) {\n      return { ...state, showingTable };\n    }\n\n    return { ...state, showingTable, tableResult: null };\n  }\n\n  if (queriesImportedAction.match(action)) {\n    const { queries } = action.payload;\n    return {\n      ...state,\n      queries,\n      queryKeys: getQueryKeys(queries, state.datasourceInstance),\n    };\n  }\n\n  if (toggleLogLevelAction.match(action)) {\n    const { hiddenLogLevels } = action.payload;\n    return {\n      ...state,\n      hiddenLogLevels: Array.from(hiddenLogLevels),\n    };\n  }\n\n  if (historyUpdatedAction.match(action)) {\n    return {\n      ...state,\n      history: action.payload.history,\n    };\n  }\n\n  if (setUrlReplacedAction.match(action)) {\n    return {\n      ...state,\n      urlReplaced: true,\n    };\n  }\n\n  if (changeRangeAction.match(action)) {\n    const { range, absoluteRange } = action.payload;\n    return {\n      ...state,\n      range,\n      absoluteRange,\n      update: makeInitialUpdateState(),\n    };\n  }\n\n  if (changeLoadingStateAction.match(action)) {\n    const { loadingState } = action.payload;\n    return {\n      ...state,\n      queryResponse: {\n        ...state.queryResponse,\n        state: loadingState,\n      },\n      loading: loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming,\n    };\n  }\n\n  if (setPausedStateAction.match(action)) {\n    const { isPaused } = action.payload;\n    return {\n      ...state,\n      isPaused: isPaused,\n    };\n  }\n\n  if (queryStoreSubscriptionAction.match(action)) {\n    const { querySubscription } = action.payload;\n    return {\n      ...state,\n      querySubscription,\n    };\n  }\n\n  if (queryStreamUpdatedAction.match(action)) {\n    return processQueryResponse(state, action);\n  }\n\n  return state;\n};\n\nexport const processQueryResponse = (\n  state: ExploreItemState,\n  action: PayloadAction<QueryEndedPayload>\n): ExploreItemState => {\n  const { response } = action.payload;\n  const { request, state: loadingState, series, error } = response;\n\n  if (error) {\n    if (error.cancelled) {\n      return state;\n    }\n\n    // For Angular editors\n    state.eventBridge.emit(PanelEvents.dataError, error);\n\n    return {\n      ...state,\n      loading: false,\n      queryResponse: response,\n      graphResult: null,\n      tableResult: null,\n      logsResult: null,\n      update: makeInitialUpdateState(),\n    };\n  }\n\n  const latency = request.endTime ? request.endTime - request.startTime : 0;\n  const processor = new ResultProcessor(state, series, request.intervalMs, request.timezone as TimeZone);\n  const graphResult = processor.getGraphResult();\n  const tableResult = processor.getTableResult();\n  const logsResult = processor.getLogsResult();\n\n  // Send legacy data to Angular editors\n  if (state.datasourceInstance.components.QueryCtrl) {\n    const legacy = series.map(v => toLegacyResponseData(v));\n\n    state.eventBridge.emit(PanelEvents.dataReceived, legacy);\n  }\n\n  return {\n    ...state,\n    latency,\n    queryResponse: response,\n    graphResult,\n    tableResult,\n    logsResult,\n    loading: loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming,\n    update: makeInitialUpdateState(),\n  };\n};\n\nexport const updateChildRefreshState = (\n  state: Readonly<ExploreItemState>,\n  payload: LocationUpdate,\n  exploreId: ExploreId\n): ExploreItemState => {\n  const path = payload.path || '';\n  const queryState = payload.query[exploreId] as string;\n  if (!queryState) {\n    return state;\n  }\n\n  const urlState = parseUrlState(queryState);\n  if (!state.urlState || path !== '/explore') {\n    // we only want to refresh when browser back/forward\n    return {\n      ...state,\n      urlState,\n      update: { datasource: false, queries: false, range: false, mode: false, ui: false },\n    };\n  }\n\n  const datasource = _.isEqual(urlState ? urlState.datasource : '', state.urlState.datasource) === false;\n  const queries = _.isEqual(urlState ? urlState.queries : [], state.urlState.queries) === false;\n  const range = _.isEqual(urlState ? urlState.range : DEFAULT_RANGE, state.urlState.range) === false;\n  const mode = _.isEqual(urlState ? urlState.mode : ExploreMode.Metrics, state.urlState.mode) === false;\n  const ui = _.isEqual(urlState ? urlState.ui : DEFAULT_UI_STATE, state.urlState.ui) === false;\n\n  return {\n    ...state,\n    urlState,\n    update: {\n      ...state.update,\n      datasource,\n      queries,\n      range,\n      mode,\n      ui,\n    },\n  };\n};\n\nconst getModesForDatasource = (dataSource: DataSourceApi, currentMode: ExploreMode): [ExploreMode[], ExploreMode] => {\n  const supportsGraph = dataSource.meta.metrics;\n  const supportsLogs = dataSource.meta.logs;\n  const supportsTracing = dataSource.meta.tracing;\n\n  let mode = currentMode || ExploreMode.Metrics;\n  const supportedModes: ExploreMode[] = [];\n\n  if (supportsGraph) {\n    supportedModes.push(ExploreMode.Metrics);\n  }\n\n  if (supportsLogs) {\n    supportedModes.push(ExploreMode.Logs);\n  }\n\n  if (supportsTracing) {\n    supportedModes.push(ExploreMode.Tracing);\n  }\n\n  if (supportedModes.length === 1) {\n    mode = supportedModes[0];\n  }\n\n  // HACK: Used to set Loki's default explore mode to Logs mode.\n  // A better solution would be to introduce a \"default\" or \"preferred\" mode to the datasource config\n  if (dataSource.meta.name === 'Loki' && (!currentMode || supportedModes.indexOf(currentMode) === -1)) {\n    mode = ExploreMode.Logs;\n  }\n\n  return [supportedModes, mode];\n};\n\n/**\n * Global Explore reducer that handles multiple Explore areas (left and right).\n * Actions that have an `exploreId` get routed to the ExploreItemReducer.\n */\nexport const exploreReducer = (state = initialExploreState, action: AnyAction): ExploreState => {\n  if (splitCloseAction.match(action)) {\n    const { itemId } = action.payload as SplitCloseActionPayload;\n    const targetSplit = {\n      left: itemId === ExploreId.left ? state.right : state.left,\n      right: initialExploreState.right,\n    };\n    return {\n      ...state,\n      ...targetSplit,\n      split: false,\n    };\n  }\n\n  if (splitOpenAction.match(action)) {\n    return { ...state, split: true, right: { ...action.payload.itemState } };\n  }\n\n  if (syncTimesAction.match(action)) {\n    return { ...state, syncedTimes: action.payload.syncedTimes };\n  }\n\n  if (richHistoryUpdatedAction.match(action)) {\n    return {\n      ...state,\n      richHistory: action.payload.richHistory,\n    };\n  }\n\n  if (resetExploreAction.match(action)) {\n    const payload: ResetExplorePayload = action.payload;\n    const leftState = state[ExploreId.left];\n    const rightState = state[ExploreId.right];\n    stopQueryState(leftState.querySubscription);\n    stopQueryState(rightState.querySubscription);\n\n    if (payload.force || !Number.isInteger(state.left.originPanelId)) {\n      return initialExploreState;\n    }\n\n    return {\n      ...initialExploreState,\n      left: {\n        ...initialExploreItemState,\n        queries: state.left.queries,\n        originPanelId: state.left.originPanelId,\n      },\n    };\n  }\n\n  if (updateLocation.match(action)) {\n    const payload: LocationUpdate = action.payload;\n    const { query } = payload;\n    if (!query || !query[ExploreId.left]) {\n      return state;\n    }\n\n    const split = query[ExploreId.right] ? true : false;\n    const leftState = state[ExploreId.left];\n    const rightState = state[ExploreId.right];\n\n    return {\n      ...state,\n      split,\n      [ExploreId.left]: updateChildRefreshState(leftState, payload, ExploreId.left),\n      [ExploreId.right]: updateChildRefreshState(rightState, payload, ExploreId.right),\n    };\n  }\n\n  if (action.payload) {\n    const { exploreId } = action.payload;\n    if (exploreId !== undefined) {\n      // @ts-ignore\n      const exploreItemState = state[exploreId];\n      return { ...state, [exploreId]: itemReducer(exploreItemState, action as any) };\n    }\n  }\n\n  return state;\n};\n\nexport default {\n  explore: exploreReducer,\n};\n","import { UserState } from 'app/types';\nimport config from 'app/core/config';\n\nexport const initialState: UserState = {\n  orgId: config.bootData.user.orgId,\n  timeZone: config.bootData.user.timezone,\n};\n\nexport const userReducer = (state = initialState, action: any): UserState => {\n  return state;\n};\n\nexport default {\n  user: userReducer,\n};\n","import { combineReducers } from '@reduxjs/toolkit';\nimport { optionsPickerReducer, OptionsPickerState } from '../pickers/OptionsPicker/reducer';\nimport { variableEditorReducer, VariableEditorState } from '../editor/reducer';\nimport { variablesReducer } from './variablesReducer';\nimport { VariableModel } from '../../templating/types';\n\nexport interface TemplatingState {\n  variables: Record<string, VariableModel>;\n  optionsPicker: OptionsPickerState;\n  editor: VariableEditorState;\n}\n\nexport default {\n  templating: combineReducers({\n    editor: variableEditorReducer,\n    variables: variablesReducer,\n    optionsPicker: optionsPickerReducer,\n  }),\n};\n","import { AnyAction, combineReducers } from 'redux';\nimport { CleanUp, cleanUpAction } from '../actions/cleanUp';\nimport sharedReducers from 'app/core/reducers';\nimport alertingReducers from 'app/features/alerting/state/reducers';\nimport teamsReducers from 'app/features/teams/state/reducers';\nimport apiKeysReducers from 'app/features/api-keys/state/reducers';\nimport foldersReducers from 'app/features/folders/state/reducers';\nimport dashboardReducers from 'app/features/dashboard/state/reducers';\nimport exploreReducers from 'app/features/explore/state/reducers';\nimport pluginReducers from 'app/features/plugins/state/reducers';\nimport dataSourcesReducers from 'app/features/datasources/state/reducers';\nimport usersReducers from 'app/features/users/state/reducers';\nimport userReducers from 'app/features/profile/state/reducers';\nimport organizationReducers from 'app/features/org/state/reducers';\nimport ldapReducers from 'app/features/admin/state/reducers';\nimport templatingReducers from 'app/features/variables/state/reducers';\nimport importDashboardReducers from 'app/features/manage-dashboards/state/reducers';\n\nconst rootReducers = {\n  ...sharedReducers,\n  ...alertingReducers,\n  ...teamsReducers,\n  ...apiKeysReducers,\n  ...foldersReducers,\n  ...dashboardReducers,\n  ...exploreReducers,\n  ...pluginReducers,\n  ...dataSourcesReducers,\n  ...usersReducers,\n  ...userReducers,\n  ...organizationReducers,\n  ...ldapReducers,\n  ...templatingReducers,\n  ...importDashboardReducers,\n};\n\nconst addedReducers = {};\n\nexport const addReducer = (newReducers: any) => {\n  Object.assign(addedReducers, newReducers);\n};\n\nexport const createRootReducer = () => {\n  const appReducer = combineReducers({\n    ...rootReducers,\n    ...addedReducers,\n  });\n\n  return (state: any, action: AnyAction): any => {\n    if (action.type !== cleanUpAction.type) {\n      return appReducer(state, action);\n    }\n\n    const { stateSelector } = action.payload as CleanUp<any>;\n    const stateSlice = stateSelector(state);\n    recursiveCleanState(state, stateSlice);\n\n    return appReducer(state, action);\n  };\n};\n\nexport const recursiveCleanState = (state: any, stateSlice: any): boolean => {\n  for (const stateKey in state) {\n    if (!state.hasOwnProperty(stateKey)) {\n      continue;\n    }\n\n    const slice = state[stateKey];\n    if (slice === stateSlice) {\n      state[stateKey] = undefined;\n      return true;\n    }\n\n    if (typeof slice === 'object') {\n      const cleaned = recursiveCleanState(slice, stateSlice);\n      if (cleaned) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n};\n","// Libraries\nimport _ from 'lodash';\nimport $ from 'jquery';\n// @ts-ignore\nimport Drop from 'tether-drop';\n\n// Utils and servies\nimport { colors } from '@grafana/ui';\nimport { getTemplateSrv, setBackendSrv, setDataSourceSrv, setLegacyAngularInjector } from '@grafana/runtime';\nimport config from 'app/core/config';\nimport coreModule from 'app/core/core_module';\nimport { profiler } from 'app/core/profiler';\nimport appEvents from 'app/core/app_events';\nimport { TimeSrv, setTimeSrv, getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { KeybindingSrv, setKeybindingSrv } from 'app/core/services/keybindingSrv';\nimport { AngularLoader, setAngularLoader } from 'app/core/services/AngularLoader';\nimport { configureStore } from 'app/store/configureStore';\n\nimport { LocationUpdate, setLocationSrv } from '@grafana/runtime';\nimport { updateLocation } from 'app/core/actions';\n\n// Types\nimport { KioskUrlValue, CoreEvents, AppEventEmitter, AppEventConsumer } from 'app/types';\nimport { setLinkSrv, LinkSrv } from 'app/features/panel/panellinks/link_srv';\nimport { UtilSrv } from 'app/core/services/util_srv';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { BridgeSrv } from 'app/core/services/bridge_srv';\nimport { PlaylistSrv } from 'app/features/playlist/playlist_srv';\nimport { DashboardSrv, setDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { ILocationService, ITimeoutService, IRootScopeService, IAngularEvent } from 'angular';\nimport { AppEvent, AppEvents, locationUtil } from '@grafana/data';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { auto } from 'angular';\n\nexport type GrafanaRootScope = IRootScopeService & AppEventEmitter & AppEventConsumer & { colors: string[] };\n\nexport class GrafanaCtrl {\n  /** @ngInject */\n  constructor(\n    $scope: any,\n    utilSrv: UtilSrv,\n    $rootScope: GrafanaRootScope,\n    contextSrv: ContextSrv,\n    bridgeSrv: BridgeSrv,\n    timeSrv: TimeSrv,\n    linkSrv: LinkSrv,\n    datasourceSrv: DatasourceSrv,\n    keybindingSrv: KeybindingSrv,\n    dashboardSrv: DashboardSrv,\n    angularLoader: AngularLoader,\n    $injector: auto.IInjectorService\n  ) {\n    // make angular loader service available to react components\n    setAngularLoader(angularLoader);\n    setBackendSrv(backendSrv);\n    setDataSourceSrv(datasourceSrv);\n    setTimeSrv(timeSrv);\n    setLinkSrv(linkSrv);\n    setKeybindingSrv(keybindingSrv);\n    setDashboardSrv(dashboardSrv);\n    setLegacyAngularInjector($injector);\n\n    locationUtil.initialize({\n      getConfig: () => config,\n      getTimeRangeForUrl: getTimeSrv().timeRangeForUrl,\n      // @ts-ignore\n      buildParamsFromVariables: getTemplateSrv().fillVariableValuesForUrl,\n    });\n\n    const store = configureStore();\n    setLocationSrv({\n      update: (opt: LocationUpdate) => {\n        store.dispatch(updateLocation(opt));\n      },\n    });\n\n    $scope.init = () => {\n      $scope.contextSrv = contextSrv;\n      $scope.appSubUrl = config.appSubUrl;\n      $scope._ = _;\n\n      profiler.init(config, $rootScope);\n      utilSrv.init();\n      bridgeSrv.init();\n    };\n\n    $rootScope.colors = colors;\n\n    $rootScope.onAppEvent = function<T>(\n      event: AppEvent<T> | string,\n      callback: (event: IAngularEvent, ...args: any[]) => void,\n      localScope?: any\n    ) {\n      let unbind;\n      if (typeof event === 'string') {\n        unbind = $rootScope.$on(event, callback);\n      } else {\n        unbind = $rootScope.$on(event.name, callback);\n      }\n\n      let callerScope = this;\n      if (callerScope.$id === 1 && !localScope) {\n        console.log('warning rootScope onAppEvent called without localscope');\n      }\n      if (localScope) {\n        callerScope = localScope;\n      }\n      callerScope.$on('$destroy', unbind);\n    };\n\n    $rootScope.appEvent = <T>(event: AppEvent<T> | string, payload?: T | any) => {\n      if (typeof event === 'string') {\n        $rootScope.$emit(event, payload);\n        appEvents.emit(event, payload);\n      } else {\n        $rootScope.$emit(event.name, payload);\n        appEvents.emit(event, payload);\n      }\n    };\n\n    $scope.init();\n  }\n}\n\nfunction setViewModeBodyClass(body: JQuery, mode: KioskUrlValue) {\n  body.removeClass('view-mode--tv');\n  body.removeClass('view-mode--kiosk');\n  body.removeClass('view-mode--inactive');\n\n  switch (mode) {\n    case 'tv': {\n      body.addClass('view-mode--tv');\n      break;\n    }\n    // 1 & true for legacy states\n    case '1':\n    case true: {\n      body.addClass('view-mode--kiosk');\n      break;\n    }\n  }\n}\n\n/** @ngInject */\nexport function grafanaAppDirective(\n  playlistSrv: PlaylistSrv,\n  contextSrv: ContextSrv,\n  $timeout: ITimeoutService,\n  $rootScope: IRootScopeService,\n  $location: ILocationService\n) {\n  return {\n    restrict: 'E',\n    controller: GrafanaCtrl,\n    link: (scope: IRootScopeService & AppEventEmitter, elem: JQuery) => {\n      const body = $('body');\n      // see https://github.com/zenorocha/clipboard.js/issues/155\n      $.fn.modal.Constructor.prototype.enforceFocus = () => {};\n\n      $('.preloader').remove();\n\n      appEvents.on(CoreEvents.toggleSidemenuMobile, () => {\n        body.toggleClass('sidemenu-open--xs');\n      });\n\n      appEvents.on(CoreEvents.toggleSidemenuHidden, () => {\n        body.toggleClass('sidemenu-hidden');\n      });\n\n      appEvents.on(CoreEvents.playlistStarted, () => {\n        elem.toggleClass('view-mode--playlist', true);\n      });\n\n      appEvents.on(CoreEvents.playlistStopped, () => {\n        elem.toggleClass('view-mode--playlist', false);\n      });\n\n      // tooltip removal fix\n      // manage page classes\n      let pageClass: string;\n      scope.$on('$routeChangeSuccess', (evt: any, data: any) => {\n        if (pageClass) {\n          body.removeClass(pageClass);\n        }\n\n        if (data.$$route) {\n          pageClass = data.$$route.pageClass;\n          if (pageClass) {\n            body.addClass(pageClass);\n          }\n        }\n\n        // clear body class sidemenu states\n        body.removeClass('sidemenu-open--xs');\n\n        $('#tooltip, .tooltip').remove();\n\n        // check for kiosk url param\n        setViewModeBodyClass(body, data.params.kiosk);\n\n        // close all drops\n        for (const drop of Drop.drops) {\n          drop.destroy();\n        }\n\n        appEvents.emit(CoreEvents.hideDashSearch);\n      });\n\n      // handle kiosk mode\n      appEvents.on(CoreEvents.toggleKioskMode, (options: { exit?: boolean }) => {\n        const search: { kiosk?: KioskUrlValue } = $location.search();\n\n        if (options && options.exit) {\n          search.kiosk = '1';\n        }\n\n        switch (search.kiosk) {\n          case 'tv': {\n            search.kiosk = true;\n            appEvents.emit(AppEvents.alertSuccess, ['Press ESC to exit Kiosk mode']);\n            break;\n          }\n          case '1':\n          case true: {\n            delete search.kiosk;\n            break;\n          }\n          default: {\n            search.kiosk = 'tv';\n          }\n        }\n\n        $timeout(() => $location.search(search));\n        setViewModeBodyClass(body, search.kiosk!);\n      });\n\n      // handle in active view state class\n      let lastActivity = new Date().getTime();\n      let activeUser = true;\n      const inActiveTimeLimit = 60 * 5000;\n\n      function checkForInActiveUser() {\n        if (!activeUser) {\n          return;\n        }\n        // only go to activity low mode on dashboard page\n        if (!body.hasClass('page-dashboard')) {\n          return;\n        }\n\n        if (new Date().getTime() - lastActivity > inActiveTimeLimit) {\n          activeUser = false;\n          body.addClass('view-mode--inactive');\n        }\n      }\n\n      function userActivityDetected() {\n        lastActivity = new Date().getTime();\n        if (!activeUser) {\n          activeUser = true;\n          body.removeClass('view-mode--inactive');\n        }\n      }\n\n      // mouse and keyboard is user activity\n      body.mousemove(userActivityDetected);\n      body.keydown(userActivityDetected);\n      // set useCapture = true to catch event here\n      document.addEventListener('wheel', userActivityDetected, { capture: true, passive: true });\n      // treat tab change as activity\n      document.addEventListener('visibilitychange', userActivityDetected);\n\n      // check every 2 seconds\n      setInterval(checkForInActiveUser, 2000);\n\n      appEvents.on(CoreEvents.toggleViewMode, () => {\n        lastActivity = 0;\n        checkForInActiveUser();\n      });\n\n      // handle document clicks that should hide things\n      body.click(evt => {\n        const target = $(evt.target);\n        if (target.parents().length === 0) {\n          return;\n        }\n\n        // ensure dropdown menu doesn't impact on z-index\n        body.find('.dropdown-menu-open').removeClass('dropdown-menu-open');\n\n        // for stuff that animates, slides out etc, clicking it needs to\n        // hide it right away\n        const clickAutoHide = target.closest('[data-click-hide]');\n        if (clickAutoHide.length) {\n          const clickAutoHideParent = clickAutoHide.parent();\n          clickAutoHide.detach();\n          setTimeout(() => {\n            clickAutoHideParent.append(clickAutoHide);\n          }, 100);\n        }\n\n        // hide popovers\n        const popover = elem.find('.popover');\n        if (popover.length > 0 && target.parents('.graph-legend').length === 0) {\n          popover.hide();\n        }\n      });\n    },\n  };\n}\n\ncoreModule.directive('grafanaApp', grafanaAppDirective);\n","import { configureStore as reduxConfigureStore, getDefaultMiddleware } from '@reduxjs/toolkit';\nimport { createLogger } from 'redux-logger';\nimport { ThunkMiddleware } from 'redux-thunk';\nimport { setStore } from './store';\nimport { StoreState } from 'app/types/store';\nimport { toggleLogActionsMiddleware } from 'app/core/middlewares/application';\nimport { addReducer, createRootReducer } from '../core/reducers/root';\nimport { buildInitialState } from '../core/reducers/navModel';\n\nexport function addRootReducer(reducers: any) {\n  // this is ok now because we add reducers before configureStore is called\n  // in the future if we want to add reducers during runtime\n  // we'll have to solve this in a more dynamic way\n  addReducer(reducers);\n}\n\nexport function configureStore() {\n  const logger = createLogger({\n    predicate: getState => {\n      return getState().application.logActions;\n    },\n  });\n\n  const middleware = process.env.NODE_ENV !== 'production' ? [toggleLogActionsMiddleware, logger] : [];\n\n  const reduxDefaultMiddleware = getDefaultMiddleware<StoreState>({\n    thunk: true,\n    serializableCheck: false,\n    immutableCheck: false,\n  } as any);\n\n  const store = reduxConfigureStore<StoreState>({\n    reducer: createRootReducer(),\n    middleware: [...reduxDefaultMiddleware, ...middleware] as [ThunkMiddleware<StoreState>],\n    devTools: process.env.NODE_ENV !== 'production',\n    preloadedState: {\n      navIndex: buildInitialState(),\n    },\n  });\n\n  setStore(store);\n  return store;\n}\n\n/* \nfunction getActionsToIgnoreSerializableCheckOn() {\n  return [\n    'dashboard/setPanelAngularComponent',\n    'dashboard/panelModelAndPluginReady',\n    'dashboard/dashboardInitCompleted',\n    'plugins/panelPluginLoaded',\n    'explore/initializeExplore',\n    'explore/changeRange',\n    'explore/updateDatasourceInstance',\n    'explore/queryStoreSubscription',\n    'explore/queryStreamUpdated',\n  ];\n}\n\nfunction getPathsToIgnoreMutationAndSerializableCheckOn() {\n  return [    \n    'plugins.panels',\n    'dashboard.panels',\n    'dashboard.getModel',\n    'payload.plugin',\n    'panelEditorNew.getPanel',\n    'panelEditorNew.getSourcePanel',\n    'panelEditorNew.getData',\n    'explore.left.queryResponse',\n    'explore.right.queryResponse',\n    'explore.left.datasourceInstance',\n    'explore.right.datasourceInstance',\n    'explore.left.range',\n    'explore.left.eventBridge',\n    'explore.right.eventBridge',\n    'explore.right.range',\n    'explore.left.querySubscription',\n    'explore.right.querySubscription',    \n  ];\n}\n*/\n","import _ from 'lodash';\nimport { AppEvents } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport coreModule from 'app/core/core_module';\nimport { variableTypes } from './types';\nimport appEvents from 'app/core/app_events';\nimport DatasourceSrv from '../plugins/datasource_srv';\nimport { VariableSrv } from './all';\nimport { TemplateSrv } from './template_srv';\nimport { promiseToDigest } from '../../core/utils/promiseToDigest';\n\nexport class VariableEditorCtrl {\n  /** @ngInject */\n  constructor($scope: any, datasourceSrv: DatasourceSrv, variableSrv: VariableSrv, templateSrv: TemplateSrv) {\n    $scope.variableTypes = variableTypes;\n    $scope.ctrl = {};\n    $scope.namePattern = /^(?!__).*$/;\n    $scope._ = _;\n    $scope.optionsLimit = 20;\n    $scope.emptyListCta = {\n      title: 'There are no variables yet',\n      buttonTitle: 'Add variable',\n      buttonIcon: 'gicon gicon-variable',\n      infoBox: {\n        __html: ` <p>\n      Variables enable more interactive and dynamic dashboards. Instead of hard-coding things like server or\n      sensor names in your metric queries you can use variables in their place. Variables are shown as dropdown\n      select boxes at the top of the dashboard. These dropdowns make it easy to change the data being displayed in\n      your dashboard. Check out the\n      <a class=\"external-link\" href=\"http://docs.grafana.org/reference/templating/\" target=\"_blank\">\n        Templating documentation\n      </a>\n      for more information.\n    </p>`,\n        infoBoxTitle: 'What do variables do?',\n      },\n    };\n\n    $scope.refreshOptions = [\n      { value: 0, text: 'Never' },\n      { value: 1, text: 'On Dashboard Load' },\n      { value: 2, text: 'On Time Range Change' },\n    ];\n\n    $scope.sortOptions = [\n      { value: 0, text: 'Disabled' },\n      { value: 1, text: 'Alphabetical (asc)' },\n      { value: 2, text: 'Alphabetical (desc)' },\n      { value: 3, text: 'Numerical (asc)' },\n      { value: 4, text: 'Numerical (desc)' },\n      { value: 5, text: 'Alphabetical (case-insensitive, asc)' },\n      { value: 6, text: 'Alphabetical (case-insensitive, desc)' },\n    ];\n\n    $scope.hideOptions = [\n      { value: 0, text: '' },\n      { value: 1, text: 'Label' },\n      { value: 2, text: 'Variable' },\n    ];\n\n    $scope.selectors = {\n      ...selectors.pages.Dashboard.Settings.Variables.List,\n      ...selectors.pages.Dashboard.Settings.Variables.Edit.General,\n      ...selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable,\n      ...selectors.pages.Dashboard.Settings.Variables.Edit.ConstantVariable,\n    };\n\n    $scope.init = () => {\n      $scope.mode = 'list';\n\n      $scope.variables = variableSrv.variables;\n      $scope.reset();\n\n      $scope.$watch('mode', (val: string) => {\n        if (val === 'new') {\n          $scope.reset();\n        }\n      });\n    };\n\n    $scope.setMode = (mode: any) => {\n      $scope.mode = mode;\n    };\n\n    $scope.setNewMode = () => {\n      $scope.setMode('new');\n    };\n\n    $scope.add = () => {\n      if ($scope.isValid()) {\n        variableSrv.addVariable($scope.current);\n        $scope.update();\n      }\n    };\n\n    $scope.isValid = () => {\n      if (!$scope.ctrl.form.$valid) {\n        return false;\n      }\n\n      if (!$scope.current.name.match(/^\\w+$/)) {\n        appEvents.emit(AppEvents.alertWarning, [\n          'Validation',\n          'Only word and digit characters are allowed in variable names',\n        ]);\n        return false;\n      }\n\n      const sameName: any = _.find($scope.variables, { name: $scope.current.name });\n      if (sameName && sameName !== $scope.current) {\n        appEvents.emit(AppEvents.alertWarning, ['Validation', 'Variable with the same name already exists']);\n        return false;\n      }\n\n      if (\n        $scope.current.type === 'query' &&\n        _.isString($scope.current.query) &&\n        $scope.current.query.match(new RegExp('\\\\$' + $scope.current.name + '(/| |$)'))\n      ) {\n        appEvents.emit(AppEvents.alertWarning, [\n          'Validation',\n          'Query cannot contain a reference to itself. Variable: $' + $scope.current.name,\n        ]);\n        return false;\n      }\n\n      return true;\n    };\n\n    $scope.validate = () => {\n      $scope.infoText = '';\n      if ($scope.current.type === 'adhoc' && $scope.current.datasource !== null) {\n        $scope.infoText = 'Adhoc filters are applied automatically to all queries that target this datasource';\n        promiseToDigest($scope)(\n          datasourceSrv.get($scope.current.datasource).then(ds => {\n            if (!ds.getTagKeys) {\n              $scope.infoText = 'This datasource does not support adhoc filters yet.';\n            }\n          })\n        );\n      }\n    };\n\n    $scope.runQuery = () => {\n      $scope.optionsLimit = 20;\n      return variableSrv.updateOptions($scope.current).catch((err: { data: { message: any }; message: string }) => {\n        if (err.data && err.data.message) {\n          err.message = err.data.message;\n        }\n        appEvents.emit(AppEvents.alertError, [\n          'Templating',\n          'Template variables could not be initialized: ' + err.message,\n        ]);\n      });\n    };\n\n    $scope.onQueryChange = (query: any, definition: any) => {\n      $scope.current.query = query;\n      $scope.current.definition = definition;\n      $scope.runQuery();\n    };\n\n    $scope.edit = (variable: any) => {\n      $scope.current = variable;\n      $scope.currentIsNew = false;\n      $scope.mode = 'edit';\n      $scope.validate();\n      promiseToDigest($scope)(\n        datasourceSrv.get($scope.current.datasource).then(ds => {\n          $scope.currentDatasource = ds;\n        })\n      );\n    };\n\n    $scope.duplicate = (variable: { getSaveModel: () => void; name: string }) => {\n      const clone = _.cloneDeep(variable.getSaveModel());\n      $scope.current = variableSrv.createVariableFromModel(clone);\n      $scope.current.name = 'copy_of_' + variable.name;\n      variableSrv.addVariable($scope.current);\n    };\n\n    $scope.update = () => {\n      if ($scope.isValid()) {\n        promiseToDigest($scope)(\n          $scope.runQuery().then(() => {\n            $scope.reset();\n            $scope.mode = 'list';\n            templateSrv.updateIndex();\n          })\n        );\n      }\n    };\n\n    $scope.reset = () => {\n      $scope.currentIsNew = true;\n      $scope.current = variableSrv.createVariableFromModel({ type: 'query' });\n\n      // this is done here in case a new data source type variable was added\n      $scope.datasources = _.filter(datasourceSrv.getMetricSources(), ds => {\n        return !ds.meta.mixed && ds.value !== null;\n      });\n\n      $scope.datasourceTypes = _($scope.datasources)\n        .uniqBy('meta.id')\n        .map((ds: any) => {\n          return { text: ds.meta.name, value: ds.meta.id };\n        })\n        .value();\n    };\n\n    $scope.typeChanged = function() {\n      const old = $scope.current;\n      $scope.current = variableSrv.createVariableFromModel({\n        type: $scope.current.type,\n      });\n      $scope.current.name = old.name;\n      $scope.current.label = old.label;\n\n      const oldIndex = _.indexOf(this.variables, old);\n      if (oldIndex !== -1) {\n        this.variables[oldIndex] = $scope.current;\n      }\n\n      $scope.validate();\n    };\n\n    $scope.removeVariable = (variable: any) => {\n      variableSrv.removeVariable(variable);\n    };\n\n    $scope.showMoreOptions = () => {\n      $scope.optionsLimit += 20;\n    };\n\n    $scope.datasourceChanged = async () => {\n      promiseToDigest($scope)(\n        datasourceSrv.get($scope.current.datasource).then(ds => {\n          $scope.current.query = '';\n          $scope.currentDatasource = ds;\n        })\n      );\n    };\n  }\n}\n\ncoreModule.controller('VariableEditorCtrl', VariableEditorCtrl);\n","// Libaries\nimport angular, { auto, ILocationService, IPromise, IQService } from 'angular';\nimport _ from 'lodash';\n// Utils & Services\nimport coreModule from 'app/core/core_module';\nimport { VariableActions, variableTypes } from './types';\nimport { Graph } from 'app/core/utils/dag';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\n// Types\nimport { AppEvents, TimeRange, UrlQueryMap } from '@grafana/data';\nimport { CoreEvents } from 'app/types';\nimport { appEvents, contextSrv } from 'app/core/core';\n\nexport class VariableSrv {\n  dashboard: DashboardModel;\n  variables: any[] = [];\n\n  /** @ngInject */\n  constructor(\n    private $q: IQService,\n    private $location: ILocationService,\n    private $injector: auto.IInjectorService,\n    private templateSrv: TemplateSrv,\n    private timeSrv: TimeSrv\n  ) {}\n\n  init(dashboard: DashboardModel) {\n    this.dashboard = dashboard;\n    this.dashboard.events.on(CoreEvents.timeRangeUpdated, this.onTimeRangeUpdated.bind(this));\n    this.dashboard.events.on(\n      CoreEvents.templateVariableValueUpdated,\n      this.updateUrlParamsWithCurrentVariables.bind(this)\n    );\n\n    // create working class models representing variables\n    this.variables = dashboard.templating.list = dashboard.templating.list.map(this.createVariableFromModel.bind(this));\n    this.templateSrv.init(this.variables, this.timeSrv.timeRange());\n\n    // init variables\n    for (const variable of this.variables) {\n      variable.initLock = this.$q.defer();\n    }\n\n    const queryParams = this.$location.search();\n    return this.$q\n      .all(\n        this.variables.map(variable => {\n          return this.processVariable(variable, queryParams);\n        })\n      )\n      .then(() => {\n        this.templateSrv.updateIndex();\n        this.templateSrv.setGlobalVariable('__dashboard', {\n          value: {\n            name: dashboard.title,\n            uid: dashboard.uid,\n            toString: function() {\n              return this.uid;\n            },\n          },\n        });\n        this.templateSrv.setGlobalVariable('__org', {\n          value: {\n            name: contextSrv.user.orgName,\n            id: contextSrv.user.id,\n            toString: function() {\n              return this.id;\n            },\n          },\n        });\n      });\n  }\n\n  onTimeRangeUpdated(timeRange: TimeRange) {\n    this.templateSrv.updateTimeRange(timeRange);\n    const promises = this.variables\n      .filter(variable => variable.refresh === 2)\n      .map(variable => {\n        const previousOptions = variable.options.slice();\n\n        return variable.updateOptions().then(() => {\n          if (angular.toJson(previousOptions) !== angular.toJson(variable.options)) {\n            this.dashboard.templateVariableValueUpdated();\n          }\n        });\n      });\n\n    return this.$q\n      .all(promises)\n      .then(() => {\n        this.dashboard.startRefresh();\n      })\n      .catch(e => {\n        appEvents.emit(AppEvents.alertError, ['Template variable service failed', e.message]);\n      });\n  }\n\n  processVariable(variable: any, queryParams: any) {\n    const dependencies = [];\n\n    for (const otherVariable of this.variables) {\n      if (variable.dependsOn(otherVariable)) {\n        dependencies.push(otherVariable.initLock.promise);\n      }\n    }\n\n    return this.$q\n      .all(dependencies)\n      .then(() => {\n        const urlValue = queryParams['var-' + variable.name];\n        if (urlValue !== void 0) {\n          return variable.setValueFromUrl(urlValue).then(variable.initLock.resolve);\n        }\n\n        if (variable.refresh === 1 || variable.refresh === 2) {\n          return variable.updateOptions().then(variable.initLock.resolve);\n        }\n\n        variable.initLock.resolve();\n      })\n      .finally(() => {\n        this.templateSrv.variableInitialized(variable);\n        delete variable.initLock;\n      });\n  }\n\n  createVariableFromModel(model: any) {\n    // @ts-ignore\n    const ctor = variableTypes[model.type].ctor;\n    if (!ctor) {\n      throw {\n        message: 'Unable to find variable constructor for ' + model.type,\n      };\n    }\n\n    const variable = this.$injector.instantiate(ctor, { model: model });\n    return variable;\n  }\n\n  addVariable(variable: any) {\n    this.variables.push(variable);\n    this.templateSrv.updateIndex();\n    this.dashboard.updateSubmenuVisibility();\n  }\n\n  removeVariable(variable: any) {\n    const index = _.indexOf(this.variables, variable);\n    this.variables.splice(index, 1);\n    this.templateSrv.updateIndex();\n    this.dashboard.updateSubmenuVisibility();\n  }\n\n  updateOptions(variable: any) {\n    return variable.updateOptions();\n  }\n\n  variableUpdated(variable: any, emitChangeEvents?: any) {\n    // if there is a variable lock ignore cascading update because we are in a boot up scenario\n    if (variable.initLock) {\n      return this.$q.when();\n    }\n\n    const g = this.createGraph();\n    const node = g.getNode(variable.name);\n    let promises = [];\n    if (node) {\n      promises = node.getOptimizedInputEdges().map(e => {\n        return this.updateOptions(this.variables.find(v => v.name === e.inputNode.name));\n      });\n    }\n\n    return this.$q.all(promises).then(() => {\n      if (emitChangeEvents) {\n        this.dashboard.templateVariableValueUpdated();\n        this.dashboard.startRefresh();\n      }\n    });\n  }\n\n  selectOptionsForCurrentValue(variable: any) {\n    let i, y, value, option;\n    const selected: any = [];\n\n    for (i = 0; i < variable.options.length; i++) {\n      option = variable.options[i];\n      option.selected = false;\n      if (_.isArray(variable.current.value)) {\n        for (y = 0; y < variable.current.value.length; y++) {\n          value = variable.current.value[y];\n          if (option.value === value) {\n            option.selected = true;\n            selected.push(option);\n          }\n        }\n      } else if (option.value === variable.current.value) {\n        option.selected = true;\n        selected.push(option);\n      }\n    }\n\n    return selected;\n  }\n\n  validateVariableSelectionState(variable: any, defaultValue?: string) {\n    if (!variable.current) {\n      variable.current = {};\n    }\n\n    if (_.isArray(variable.current.value)) {\n      let selected = this.selectOptionsForCurrentValue(variable);\n\n      // if none pick first\n      if (selected.length === 0) {\n        selected = variable.options[0];\n      } else {\n        selected = {\n          value: _.map(selected, val => {\n            return val.value;\n          }),\n          text: _.map(selected, val => {\n            return val.text;\n          }),\n        };\n      }\n\n      return variable.setValue(selected);\n    } else {\n      let option: any = undefined;\n\n      // 1. find the current value\n      option = _.find(variable.options, {\n        text: variable.current.text,\n      });\n      if (option) {\n        return variable.setValue(option);\n      }\n\n      // 2. find the default value\n      if (defaultValue) {\n        option = _.find(variable.options, {\n          text: defaultValue,\n        });\n        if (option) {\n          return variable.setValue(option);\n        }\n      }\n\n      // 3. use the first value\n      if (variable.options) {\n        return variable.setValue(variable.options[0]);\n      }\n\n      // 4... give up\n      return Promise.resolve();\n    }\n  }\n\n  /**\n   * Sets the current selected option (or options) based on the query params in the url. It is possible for values\n   * in the url to not match current options of the variable. In that case the variables current value will be still set\n   * to that value.\n   * @param variable Instance of Variable\n   * @param urlValue Value of the query parameter\n   */\n  setOptionFromUrl(variable: any, urlValue: string | string[]): IPromise<any> {\n    let promise = this.$q.when();\n\n    if (variable.refresh) {\n      promise = variable.updateOptions();\n    }\n\n    return promise.then(() => {\n      // Simple case. Value in url matches existing options text or value.\n      let option: any = _.find(variable.options, op => {\n        return op.text === urlValue || op.value === urlValue;\n      });\n\n      // No luck either it is array or value does not exist in the variables options.\n      if (!option) {\n        let defaultText = urlValue;\n        const defaultValue = urlValue;\n\n        if (_.isArray(urlValue)) {\n          // Multiple values in the url. We construct text as a list of texts from all matched options.\n          defaultText = urlValue.reduce((acc, item) => {\n            const t: any = _.find(variable.options, { value: item });\n            if (t) {\n              acc.push(t.text);\n            } else {\n              acc.push(item);\n            }\n\n            return acc;\n          }, []);\n        }\n\n        // It is possible that we did not match the value to any existing option. In that case the url value will be\n        // used anyway for both text and value.\n        option = { text: defaultText, value: defaultValue };\n      }\n\n      if (variable.multi) {\n        // In case variable is multiple choice, we cast to array to preserve the same behaviour as when selecting\n        // the option directly, which will return even single value in an array.\n        option = { text: _.castArray(option.text), value: _.castArray(option.value) };\n      }\n\n      return variable.setValue(option);\n    });\n  }\n\n  setOptionAsCurrent(variable: any, option: any) {\n    variable.current = _.cloneDeep(option);\n\n    if (_.isArray(variable.current.text) && variable.current.text.length > 0) {\n      variable.current.text = variable.current.text.join(' + ');\n    } else if (_.isArray(variable.current.value) && variable.current.value[0] !== '$__all') {\n      variable.current.text = variable.current.value.join(' + ');\n    }\n\n    this.selectOptionsForCurrentValue(variable);\n    return this.variableUpdated(variable);\n  }\n\n  templateVarsChangedInUrl(vars: UrlQueryMap) {\n    const update: Array<Promise<any>> = [];\n    for (const v of this.variables) {\n      const key = `var-${v.name}`;\n      if (vars.hasOwnProperty(key)) {\n        if (this.isVariableUrlValueDifferentFromCurrent(v, vars[key])) {\n          update.push(v.setValueFromUrl(vars[key]));\n        }\n      }\n    }\n\n    if (update.length) {\n      Promise.all(update).then(() => {\n        this.dashboard.templateVariableValueUpdated();\n        this.dashboard.startRefresh();\n      });\n    }\n  }\n\n  isVariableUrlValueDifferentFromCurrent(variable: VariableActions, urlValue: any) {\n    // lodash _.isEqual handles array of value equality checks as well\n    return !_.isEqual(variable.getValueForUrl(), urlValue);\n  }\n\n  updateUrlParamsWithCurrentVariables() {\n    // update url\n    const params = this.$location.search();\n\n    // remove variable params\n    _.each(params, (value, key) => {\n      if (key.indexOf('var-') === 0) {\n        delete params[key];\n      }\n    });\n\n    // add new values\n    this.templateSrv.fillVariableValuesForUrl(params);\n    // update url\n    this.$location.search(params);\n  }\n\n  setAdhocFilter(options: any) {\n    let variable: any = _.find(this.variables, {\n      type: 'adhoc',\n      datasource: options.datasource,\n    } as any);\n    if (!variable) {\n      variable = this.createVariableFromModel({\n        name: 'Filters',\n        type: 'adhoc',\n        datasource: options.datasource,\n      });\n      this.addVariable(variable);\n    }\n\n    const filters = variable.filters;\n    let filter: any = _.find(filters, { key: options.key, value: options.value });\n\n    if (!filter) {\n      filter = { key: options.key, value: options.value };\n      filters.push(filter);\n    }\n\n    filter.operator = options.operator;\n    this.variableUpdated(variable, true);\n  }\n\n  createGraph() {\n    const g = new Graph();\n\n    this.variables.forEach(v => {\n      g.createNode(v.name);\n    });\n\n    this.variables.forEach(v1 => {\n      this.variables.forEach(v2 => {\n        if (v1 === v2) {\n          return;\n        }\n\n        if (v1.dependsOn(v2)) {\n          g.link(v1.name, v2.name);\n        }\n      });\n    });\n\n    return g;\n  }\n}\n\ncoreModule.service('variableSrv', VariableSrv);\n","import _ from 'lodash';\nimport kbn from 'app/core/utils/kbn';\nimport {\n  assignModelProperties,\n  IntervalVariableModel,\n  VariableActions,\n  VariableHide,\n  VariableOption,\n  VariableRefresh,\n  variableTypes,\n} from './types';\nimport { TimeSrv } from '../dashboard/services/TimeSrv';\nimport { TemplateSrv } from './template_srv';\nimport { VariableSrv } from './variable_srv';\nimport { VariableType } from '@grafana/data';\n\nexport class IntervalVariable implements IntervalVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string;\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  auto_count: number; // eslint-disable-line camelcase\n  auto_min: string; // eslint-disable-line camelcase\n  options: VariableOption[];\n  auto: boolean;\n  query: string;\n  refresh: VariableRefresh;\n  current: VariableOption;\n\n  defaults: IntervalVariableModel = {\n    type: 'interval',\n    name: '',\n    label: '',\n    hide: VariableHide.dontHide,\n    skipUrlSync: false,\n    auto_count: 30,\n    auto_min: '10s',\n    options: [],\n    auto: false,\n    query: '1m,10m,30m,1h,6h,12h,1d,7d,14d,30d',\n    refresh: VariableRefresh.onTimeRangeChanged,\n    current: {} as VariableOption,\n  };\n\n  /** @ngInject */\n  constructor(\n    private model: any,\n    private timeSrv: TimeSrv,\n    private templateSrv: TemplateSrv,\n    private variableSrv: VariableSrv\n  ) {\n    assignModelProperties(this, model, this.defaults);\n    this.refresh = VariableRefresh.onTimeRangeChanged;\n  }\n\n  getSaveModel() {\n    assignModelProperties(this.model, this, this.defaults);\n    return this.model;\n  }\n\n  setValue(option: any) {\n    this.updateAutoValue();\n    return this.variableSrv.setOptionAsCurrent(this, option);\n  }\n\n  updateAutoValue() {\n    if (!this.auto) {\n      return;\n    }\n\n    // add auto option if missing\n    if (this.options.length && this.options[0].text !== 'auto') {\n      this.options.unshift({\n        text: 'auto',\n        value: '$__auto_interval_' + this.name,\n        selected: false,\n      });\n    }\n\n    const res = kbn.calculateInterval(this.timeSrv.timeRange(), this.auto_count, this.auto_min);\n    this.templateSrv.setGrafanaVariable('$__auto_interval_' + this.name, res.interval);\n    // for backward compatibility, to be removed eventually\n    this.templateSrv.setGrafanaVariable('$__auto_interval', res.interval);\n  }\n\n  updateOptions() {\n    // extract options between quotes and/or comma\n    this.options = _.map(this.query.match(/([\"'])(.*?)\\1|\\w+/g), text => {\n      text = text.replace(/[\"']+/g, '');\n      return { text: text.trim(), value: text.trim(), selected: false };\n    });\n\n    this.updateAutoValue();\n    return this.variableSrv.validateVariableSelectionState(this);\n  }\n\n  dependsOn(variable: any) {\n    return false;\n  }\n\n  setValueFromUrl(urlValue: string | string[]) {\n    this.updateAutoValue();\n    return this.variableSrv.setOptionFromUrl(this, urlValue);\n  }\n\n  getValueForUrl() {\n    return this.current.value;\n  }\n}\n\n// @ts-ignore\nvariableTypes['interval'] = {\n  name: 'Interval',\n  ctor: IntervalVariable,\n  description: 'Define a timespan interval (ex 1m, 1h, 1d)',\n};\n","import _ from 'lodash';\nimport {\n  assignModelProperties,\n  QueryVariableModel,\n  VariableActions,\n  VariableHide,\n  VariableOption,\n  VariableRefresh,\n  VariableSort,\n  VariableTag,\n  variableTypes,\n} from './types';\nimport { VariableType, DataSourceApi, stringToJsRegex } from '@grafana/data';\nimport DatasourceSrv from '../plugins/datasource_srv';\nimport { TemplateSrv } from './template_srv';\nimport { VariableSrv } from './variable_srv';\nimport { TimeSrv } from '../dashboard/services/TimeSrv';\nimport { containsVariable } from './utils';\n\nfunction getNoneOption(): VariableOption {\n  return { text: 'None', value: '', isNone: true, selected: false };\n}\n\nexport class QueryVariable implements QueryVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string | null;\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  datasource: string | null;\n  query: string;\n  regex: string;\n  sort: VariableSort;\n  options: VariableOption[];\n  current: VariableOption;\n  refresh: VariableRefresh;\n  multi: boolean;\n  includeAll: boolean;\n  useTags: boolean;\n  tagsQuery: string;\n  tagValuesQuery: string;\n  tags: VariableTag[];\n  definition: string;\n  allValue: string;\n  index: number;\n\n  defaults: QueryVariableModel = {\n    type: 'query',\n    name: '',\n    label: null,\n    hide: VariableHide.dontHide,\n    skipUrlSync: false,\n    datasource: null,\n    query: '',\n    regex: '',\n    sort: VariableSort.disabled,\n    refresh: VariableRefresh.never,\n    multi: false,\n    includeAll: false,\n    allValue: null,\n    options: [],\n    current: {} as VariableOption,\n    tags: [],\n    useTags: false,\n    tagsQuery: '',\n    tagValuesQuery: '',\n    definition: '',\n    index: -1,\n  };\n\n  /** @ngInject */\n  constructor(\n    private model: any,\n    private datasourceSrv: DatasourceSrv,\n    private templateSrv: TemplateSrv,\n    private variableSrv: VariableSrv,\n    private timeSrv: TimeSrv\n  ) {\n    // copy model properties to this instance\n    assignModelProperties(this, model, this.defaults);\n    this.updateOptionsFromMetricFindQuery.bind(this);\n  }\n\n  getSaveModel() {\n    // copy back model properties to model\n    assignModelProperties(this.model, this, this.defaults);\n\n    // remove options\n    if (this.refresh !== 0) {\n      this.model.options = [];\n    }\n\n    return this.model;\n  }\n\n  setValue(option: any) {\n    return this.variableSrv.setOptionAsCurrent(this, option);\n  }\n\n  setValueFromUrl(urlValue: any) {\n    return this.variableSrv.setOptionFromUrl(this, urlValue);\n  }\n\n  getValueForUrl() {\n    if (this.current.text === 'All') {\n      return 'All';\n    }\n    return this.current.value;\n  }\n\n  updateOptions(searchFilter?: string) {\n    return this.datasourceSrv\n      .get(this.datasource ?? '')\n      .then((ds: DataSourceApi) => this.updateOptionsFromMetricFindQuery(ds, searchFilter))\n      .then(this.updateTags.bind(this))\n      .then(this.variableSrv.validateVariableSelectionState.bind(this.variableSrv, this));\n  }\n\n  updateTags(datasource: any) {\n    if (this.useTags) {\n      return this.metricFindQuery(datasource, this.tagsQuery).then((results: any[]) => {\n        this.tags = [];\n        for (let i = 0; i < results.length; i++) {\n          this.tags.push(results[i].text);\n        }\n        return datasource;\n      });\n    } else {\n      delete this.tags;\n    }\n\n    return datasource;\n  }\n\n  getValuesForTag(tagKey: string) {\n    return this.datasourceSrv.get(this.datasource ?? '').then((datasource: DataSourceApi) => {\n      const query = this.tagValuesQuery.replace('$tag', tagKey);\n      return this.metricFindQuery(datasource, query).then((results: any) => {\n        return _.map(results, value => {\n          return value.text;\n        });\n      });\n    });\n  }\n\n  updateOptionsFromMetricFindQuery(datasource: any, searchFilter?: string) {\n    return this.metricFindQuery(datasource, this.query, searchFilter).then((results: any) => {\n      this.options = this.metricNamesToVariableValues(results);\n      if (this.includeAll) {\n        this.addAllOption();\n      }\n      if (!this.options.length) {\n        this.options.push(getNoneOption());\n      }\n      return datasource;\n    });\n  }\n\n  metricFindQuery(datasource: any, query: string, searchFilter?: string) {\n    const options: any = { range: undefined, variable: this, searchFilter };\n\n    if (this.refresh === 2) {\n      options.range = this.timeSrv.timeRange();\n    }\n\n    return datasource.metricFindQuery(query, options);\n  }\n\n  addAllOption() {\n    this.options.unshift({ text: 'All', value: '$__all', selected: false });\n  }\n\n  metricNamesToVariableValues(metricNames: any[]) {\n    let regex, options, i, matches;\n    options = [];\n\n    if (this.regex) {\n      regex = stringToJsRegex(this.templateSrv.replace(this.regex, {}, 'regex'));\n    }\n    for (i = 0; i < metricNames.length; i++) {\n      const item = metricNames[i];\n      let text = item.text === undefined || item.text === null ? item.value : item.text;\n\n      let value = item.value === undefined || item.value === null ? item.text : item.value;\n\n      if (_.isNumber(value)) {\n        value = value.toString();\n      }\n\n      if (_.isNumber(text)) {\n        text = text.toString();\n      }\n\n      if (regex) {\n        matches = regex.exec(value);\n        if (!matches) {\n          continue;\n        }\n        if (matches.length > 1) {\n          value = matches[1];\n          text = matches[1];\n        }\n      }\n\n      options.push({ text: text, value: value });\n    }\n\n    options = _.uniqBy(options, 'value');\n    return this.sortVariableValues(options, this.sort);\n  }\n\n  sortVariableValues(options: any[], sortOrder: number) {\n    if (sortOrder === 0) {\n      return options;\n    }\n\n    const sortType = Math.ceil(sortOrder / 2);\n    const reverseSort = sortOrder % 2 === 0;\n\n    if (sortType === 1) {\n      options = _.sortBy(options, 'text');\n    } else if (sortType === 2) {\n      options = _.sortBy(options, opt => {\n        const matches = opt.text.match(/.*?(\\d+).*/);\n        if (!matches || matches.length < 2) {\n          return -1;\n        } else {\n          return parseInt(matches[1], 10);\n        }\n      });\n    } else if (sortType === 3) {\n      options = _.sortBy(options, opt => {\n        return _.toLower(opt.text);\n      });\n    }\n\n    if (reverseSort) {\n      options = options.reverse();\n    }\n\n    return options;\n  }\n\n  dependsOn(variable: any) {\n    return containsVariable(this.query, this.datasource, this.regex, variable.name);\n  }\n}\n// @ts-ignore\nvariableTypes['query'] = {\n  name: 'Query',\n  ctor: QueryVariable,\n  description: 'Variable values are fetched from a datasource query',\n  supportsMulti: true,\n};\n","import {\n  assignModelProperties,\n  DataSourceVariableModel,\n  VariableActions,\n  VariableHide,\n  VariableOption,\n  VariableRefresh,\n  variableTypes,\n} from './types';\nimport { VariableType, stringToJsRegex } from '@grafana/data';\nimport { VariableSrv } from './variable_srv';\nimport { TemplateSrv } from './template_srv';\nimport { DatasourceSrv } from '../plugins/datasource_srv';\nimport { config } from '@grafana/runtime';\nimport { containsVariable } from './utils';\n\nexport class DatasourceVariable implements DataSourceVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string;\n  hide: VariableHide;\n  regex: any;\n  query: string;\n  options: VariableOption[];\n  current: VariableOption;\n  multi: boolean;\n  includeAll: boolean;\n  refresh: VariableRefresh;\n  skipUrlSync: boolean;\n\n  defaults: DataSourceVariableModel = {\n    type: 'datasource',\n    name: '',\n    hide: 0,\n    label: '',\n    current: {} as VariableOption,\n    regex: '',\n    options: [],\n    query: '',\n    multi: false,\n    includeAll: false,\n    refresh: 1,\n    skipUrlSync: false,\n  };\n\n  /** @ngInject */\n  constructor(\n    private model: any,\n    private datasourceSrv: DatasourceSrv,\n    private variableSrv: VariableSrv,\n    private templateSrv: TemplateSrv\n  ) {\n    assignModelProperties(this, model, this.defaults);\n    this.refresh = 1;\n  }\n\n  getSaveModel() {\n    assignModelProperties(this.model, this, this.defaults);\n\n    // don't persist options\n    this.model.options = [];\n    return this.model;\n  }\n\n  setValue(option: any) {\n    return this.variableSrv.setOptionAsCurrent(this, option);\n  }\n\n  updateOptions() {\n    const options: VariableOption[] = [];\n    const sources = this.datasourceSrv.getMetricSources({ skipVariables: true });\n    let regex;\n\n    if (this.regex) {\n      regex = this.templateSrv.replace(this.regex, undefined, 'regex');\n      regex = stringToJsRegex(regex);\n    }\n\n    for (let i = 0; i < sources.length; i++) {\n      const source = sources[i];\n      // must match on type\n      if (source.meta.id !== this.query) {\n        continue;\n      }\n\n      if (regex && !regex.exec(source.name)) {\n        continue;\n      }\n\n      options.push({ text: source.name, value: source.name, selected: false });\n    }\n\n    if (options.length === 0) {\n      options.push({ text: 'No data sources found', value: '', selected: false });\n    }\n\n    this.options = options;\n    if (this.includeAll) {\n      this.addAllOption();\n    }\n    const { defaultDatasource } = config.bootData.settings;\n    return this.variableSrv.validateVariableSelectionState(this, defaultDatasource);\n  }\n\n  addAllOption() {\n    this.options.unshift({ text: 'All', value: '$__all', selected: false });\n  }\n\n  dependsOn(variable: any) {\n    if (this.regex) {\n      return containsVariable(this.regex, variable.name);\n    }\n    return false;\n  }\n\n  setValueFromUrl(urlValue: string | string[]) {\n    return this.variableSrv.setOptionFromUrl(this, urlValue);\n  }\n\n  getValueForUrl() {\n    if (this.current.text === 'All') {\n      return 'All';\n    }\n    return this.current.value;\n  }\n}\n\nvariableTypes['datasource'] = {\n  name: 'Datasource',\n  ctor: DatasourceVariable,\n  supportsMulti: true,\n  description: 'Enabled you to dynamically switch the datasource for multiple panels',\n};\n","import _ from 'lodash';\nimport {\n  assignModelProperties,\n  CustomVariableModel,\n  VariableActions,\n  VariableHide,\n  VariableOption,\n  variableTypes,\n} from './types';\nimport { VariableSrv } from './variable_srv';\nimport { VariableType } from '@grafana/data';\n\nexport class CustomVariable implements CustomVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string;\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  query: string;\n  options: VariableOption[];\n  includeAll: boolean;\n  multi: boolean;\n  current: VariableOption;\n  allValue: string;\n\n  defaults: CustomVariableModel = {\n    type: 'custom',\n    name: '',\n    label: '',\n    hide: VariableHide.dontHide,\n    skipUrlSync: false,\n    query: '',\n    options: [],\n    includeAll: false,\n    multi: false,\n    current: {} as VariableOption,\n    allValue: null,\n  };\n\n  /** @ngInject */\n  constructor(private model: any, private variableSrv: VariableSrv) {\n    assignModelProperties(this, model, this.defaults);\n  }\n\n  setValue(option: any) {\n    return this.variableSrv.setOptionAsCurrent(this, option);\n  }\n\n  getSaveModel() {\n    assignModelProperties(this.model, this, this.defaults);\n    return this.model;\n  }\n\n  updateOptions() {\n    // extract options in comma separated string (use backslash to escape wanted commas)\n    this.options = _.map(this.query.match(/(?:\\\\,|[^,])+/g), text => {\n      text = text.replace(/\\\\,/g, ',');\n      return { text: text.trim(), value: text.trim(), selected: false };\n    });\n\n    if (this.includeAll) {\n      this.addAllOption();\n    }\n\n    return this.variableSrv.validateVariableSelectionState(this);\n  }\n\n  addAllOption() {\n    this.options.unshift({ text: 'All', value: '$__all', selected: false });\n  }\n\n  dependsOn(variable: any) {\n    return false;\n  }\n\n  setValueFromUrl(urlValue: string[]) {\n    return this.variableSrv.setOptionFromUrl(this, urlValue);\n  }\n\n  getValueForUrl() {\n    if (this.current.text === 'All') {\n      return 'All';\n    }\n    return this.current.value;\n  }\n}\n\nvariableTypes['custom'] = {\n  name: 'Custom',\n  ctor: CustomVariable,\n  description: 'Define variable values manually',\n  supportsMulti: true,\n};\n","import {\n  assignModelProperties,\n  ConstantVariableModel,\n  VariableActions,\n  VariableHide,\n  VariableOption,\n  variableTypes,\n} from './types';\nimport { VariableSrv } from './all';\nimport { VariableType } from '@grafana/data';\n\nexport class ConstantVariable implements ConstantVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string;\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  query: string;\n  options: VariableOption[];\n  current: VariableOption;\n\n  defaults: ConstantVariableModel = {\n    type: 'constant',\n    name: '',\n    hide: VariableHide.hideVariable,\n    label: '',\n    query: '',\n    current: {} as VariableOption,\n    options: [],\n    skipUrlSync: false,\n  };\n\n  /** @ngInject */\n  constructor(private model: any, private variableSrv: VariableSrv) {\n    assignModelProperties(this, model, this.defaults);\n  }\n\n  getSaveModel() {\n    assignModelProperties(this.model, this, this.defaults);\n    return this.model;\n  }\n\n  setValue(option: any) {\n    this.variableSrv.setOptionAsCurrent(this, option);\n  }\n\n  updateOptions() {\n    this.options = [{ text: this.query.trim(), value: this.query.trim(), selected: false }];\n    this.setValue(this.options[0]);\n    return Promise.resolve();\n  }\n\n  dependsOn(variable: any) {\n    return false;\n  }\n\n  setValueFromUrl(urlValue: string) {\n    return this.variableSrv.setOptionFromUrl(this, urlValue);\n  }\n\n  getValueForUrl() {\n    return this.current.value;\n  }\n}\n\nvariableTypes['constant'] = {\n  name: 'Constant',\n  ctor: ConstantVariable,\n  description: 'Define a hidden constant variable, useful for metric prefixes in dashboards you want to share',\n};\n","import _ from 'lodash';\nimport {\n  AdHocVariableFilter,\n  AdHocVariableModel,\n  assignModelProperties,\n  VariableActions,\n  VariableHide,\n  variableTypes,\n} from './types';\n\nimport { VariableType } from '@grafana/data';\n\nexport class AdhocVariable implements AdHocVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string;\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  filters: AdHocVariableFilter[];\n  datasource: string;\n\n  defaults: AdHocVariableModel = {\n    type: 'adhoc',\n    name: '',\n    label: '',\n    hide: VariableHide.dontHide,\n    skipUrlSync: false,\n    datasource: null,\n    filters: [],\n  };\n\n  /** @ngInject */\n  constructor(private model: any) {\n    assignModelProperties(this, model, this.defaults);\n  }\n\n  setValue(option: any) {\n    return Promise.resolve();\n  }\n\n  getSaveModel() {\n    assignModelProperties(this.model, this, this.defaults);\n    return this.model;\n  }\n\n  updateOptions() {\n    return Promise.resolve();\n  }\n\n  dependsOn(variable: any) {\n    return false;\n  }\n\n  setValueFromUrl(urlValue: string[] | string[]) {\n    if (!_.isArray(urlValue)) {\n      urlValue = [urlValue];\n    }\n\n    this.filters = urlValue.map(item => {\n      const values = item.split('|').map(value => {\n        return this.unescapeDelimiter(value);\n      });\n      return {\n        key: values[0],\n        operator: values[1],\n        value: values[2],\n        condition: '',\n      };\n    });\n\n    return Promise.resolve();\n  }\n\n  getValueForUrl() {\n    return this.filters.map(filter => {\n      return [filter.key, filter.operator, filter.value]\n        .map(value => {\n          return this.escapeDelimiter(value);\n        })\n        .join('|');\n    });\n  }\n\n  escapeDelimiter(value: string) {\n    return value.replace(/\\|/g, '__gfp__');\n  }\n\n  unescapeDelimiter(value: string) {\n    return value.replace(/__gfp__/g, '|');\n  }\n\n  setFilters(filters: any[]) {\n    this.filters = filters;\n  }\n}\n\nvariableTypes['adhoc'] = {\n  name: 'Ad hoc filters',\n  ctor: AdhocVariable,\n  description: 'Add key/value filters on the fly',\n};\n","import {\n  assignModelProperties,\n  TextBoxVariableModel,\n  VariableActions,\n  VariableHide,\n  VariableOption,\n  variableTypes,\n} from './types';\nimport { VariableSrv } from './variable_srv';\nimport { VariableType } from '@grafana/data';\n\nexport class TextBoxVariable implements TextBoxVariableModel, VariableActions {\n  type: VariableType;\n  name: string;\n  label: string;\n  hide: VariableHide;\n  skipUrlSync: boolean;\n  query: string;\n  current: VariableOption;\n  options: VariableOption[];\n\n  defaults: TextBoxVariableModel = {\n    type: 'textbox',\n    name: '',\n    label: '',\n    hide: VariableHide.dontHide,\n    query: '',\n    current: {} as VariableOption,\n    options: [],\n    skipUrlSync: false,\n  };\n\n  /** @ngInject */\n  constructor(private model: any, private variableSrv: VariableSrv) {\n    assignModelProperties(this, model, this.defaults);\n  }\n\n  getSaveModel() {\n    assignModelProperties(this.model, this, this.defaults);\n    return this.model;\n  }\n\n  setValue(option: any) {\n    this.variableSrv.setOptionAsCurrent(this, option);\n  }\n\n  updateOptions() {\n    this.options = [{ text: this.query.trim(), value: this.query.trim(), selected: false }];\n    this.current = this.options[0];\n    return Promise.resolve();\n  }\n\n  dependsOn(variable: any) {\n    return false;\n  }\n\n  setValueFromUrl(urlValue: string) {\n    this.query = urlValue;\n    return this.variableSrv.setOptionFromUrl(this, urlValue);\n  }\n\n  getValueForUrl() {\n    return this.current.value;\n  }\n}\n// @ts-ignore\nvariableTypes['textbox'] = {\n  name: 'Text box',\n  ctor: TextBoxVariable,\n  description: 'Define a textbox variable, where users can enter any arbitrary string',\n};\n","import './editor_ctrl';\nimport coreModule from 'app/core/core_module';\n\nimport templateSrv from './template_srv';\nimport { VariableSrv } from './variable_srv';\nimport { IntervalVariable } from './interval_variable';\nimport { QueryVariable } from './query_variable';\nimport { DatasourceVariable } from './datasource_variable';\nimport { CustomVariable } from './custom_variable';\nimport { ConstantVariable } from './constant_variable';\nimport { AdhocVariable } from './adhoc_variable';\nimport { TextBoxVariable } from './TextBoxVariable';\n\ncoreModule.factory('templateSrv', () => templateSrv);\n\nexport {\n  VariableSrv,\n  IntervalVariable,\n  QueryVariable,\n  DatasourceVariable,\n  CustomVariable,\n  ConstantVariable,\n  AdhocVariable,\n  TextBoxVariable,\n};\n","import angular from 'angular';\nimport _ from 'lodash';\n\nimport { getPluginSettings } from './PluginSettingsCache';\nimport { PluginMeta } from '@grafana/data';\nimport { NavModelSrv } from 'app/core/core';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { AppEvents } from '@grafana/data';\nimport { promiseToDigest } from '../../core/utils/promiseToDigest';\n\nexport class AppPageCtrl {\n  page: any;\n  pluginId: any;\n  appModel: any;\n  navModel: any;\n\n  /** @ngInject */\n  constructor(private $routeParams: any, private $rootScope: GrafanaRootScope, private navModelSrv: NavModelSrv) {\n    this.pluginId = $routeParams.pluginId;\n\n    promiseToDigest($rootScope)(\n      Promise.resolve(getPluginSettings(this.pluginId))\n        .then(settings => {\n          this.initPage(settings);\n        })\n        .catch(err => {\n          this.$rootScope.appEvent(AppEvents.alertError, ['Unknown Plugin']);\n          this.navModel = this.navModelSrv.getNotFoundNav();\n        })\n    );\n  }\n\n  initPage(app: PluginMeta) {\n    this.appModel = app;\n    this.page = _.find(app.includes, { slug: this.$routeParams.slug });\n\n    if (!this.page) {\n      this.$rootScope.appEvent(AppEvents.alertError, ['App Page Not Found']);\n      this.navModel = this.navModelSrv.getNotFoundNav();\n      return;\n    }\n    if (app.type !== 'app' || !app.enabled) {\n      this.$rootScope.appEvent(AppEvents.alertError, ['Application Not Enabled']);\n      this.navModel = this.navModelSrv.getNotFoundNav();\n      return;\n    }\n\n    const pluginNav = this.navModelSrv.getNav('plugin-page-' + app.id);\n\n    this.navModel = {\n      main: {\n        img: app.info.logos.large,\n        subTitle: app.name,\n        url: '',\n        text: this.page.name,\n        breadcrumbs: [{ title: app.name, url: pluginNav.main.url }],\n      },\n    };\n  }\n}\n\nangular.module('grafana.controllers').controller('AppPageCtrl', AppPageCtrl);\n","import angular, { ILocationService } from 'angular';\nimport _ from 'lodash';\n\nimport config from 'app/core/config';\nimport coreModule from 'app/core/core_module';\n\nimport { DataSourceApi } from '@grafana/data';\nimport { importPanelPlugin, importDataSourcePlugin, importAppPlugin } from './plugin_loader';\nimport DatasourceSrv from './datasource_srv';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\n/** @ngInject */\nfunction pluginDirectiveLoader(\n  $compile: any,\n  datasourceSrv: DatasourceSrv,\n  $rootScope: GrafanaRootScope,\n  $http: any,\n  $templateCache: any,\n  $timeout: any,\n  $location: ILocationService\n) {\n  function getTemplate(component: { template: any; templateUrl: any }) {\n    if (component.template) {\n      return Promise.resolve(component.template);\n    }\n    const cached = $templateCache.get(component.templateUrl);\n    if (cached) {\n      return Promise.resolve(cached);\n    }\n    return $http.get(component.templateUrl).then((res: any) => {\n      return res.data;\n    });\n  }\n\n  function relativeTemplateUrlToAbs(templateUrl: string, baseUrl: string) {\n    if (!templateUrl) {\n      return undefined;\n    }\n    if (templateUrl.indexOf('public') === 0) {\n      return templateUrl;\n    }\n    return baseUrl + '/' + templateUrl;\n  }\n\n  function getPluginComponentDirective(options: any) {\n    // handle relative template urls for plugin templates\n    options.Component.templateUrl = relativeTemplateUrlToAbs(options.Component.templateUrl, options.baseUrl);\n\n    return () => {\n      return {\n        templateUrl: options.Component.templateUrl,\n        template: options.Component.template,\n        restrict: 'E',\n        controller: options.Component,\n        controllerAs: 'ctrl',\n        bindToController: true,\n        scope: options.bindings,\n        link: (scope: any, elem: any, attrs: any, ctrl: any) => {\n          if (ctrl.link) {\n            ctrl.link(scope, elem, attrs, ctrl);\n          }\n          if (ctrl.init) {\n            ctrl.init();\n          }\n        },\n      };\n    };\n  }\n\n  function loadPanelComponentInfo(scope: any, attrs: any) {\n    const componentInfo: any = {\n      name: 'panel-plugin-' + scope.panel.type,\n      bindings: { dashboard: '=', panel: '=', row: '=' },\n      attrs: {\n        dashboard: 'dashboard',\n        panel: 'panel',\n        class: 'panel-height-helper',\n      },\n    };\n\n    const panelInfo = config.panels[scope.panel.type];\n    return importPanelPlugin(panelInfo.id).then(panelPlugin => {\n      const PanelCtrl = panelPlugin.angularPanelCtrl;\n      componentInfo.Component = PanelCtrl;\n\n      if (!PanelCtrl || PanelCtrl.registered) {\n        return componentInfo;\n      }\n\n      if (PanelCtrl.templatePromise) {\n        return PanelCtrl.templatePromise.then((res: any) => {\n          return componentInfo;\n        });\n      }\n\n      if (panelInfo) {\n        PanelCtrl.templateUrl = relativeTemplateUrlToAbs(PanelCtrl.templateUrl, panelInfo.baseUrl);\n      }\n\n      PanelCtrl.templatePromise = getTemplate(PanelCtrl).then((template: any) => {\n        PanelCtrl.templateUrl = null;\n        PanelCtrl.template = `<grafana-panel ctrl=\"ctrl\" class=\"panel-height-helper\">${template}</grafana-panel>`;\n        return componentInfo;\n      });\n\n      return PanelCtrl.templatePromise;\n    });\n  }\n\n  function getModule(scope: any, attrs: any): any {\n    switch (attrs.type) {\n      // QueryCtrl\n      case 'query-ctrl': {\n        const ds: DataSourceApi = scope.ctrl.datasource as DataSourceApi;\n\n        return Promise.resolve({\n          baseUrl: ds.meta.baseUrl,\n          name: 'query-ctrl-' + ds.meta.id,\n          bindings: { target: '=', panelCtrl: '=', datasource: '=' },\n          attrs: {\n            target: 'ctrl.target',\n            'panel-ctrl': 'ctrl',\n            datasource: 'ctrl.datasource',\n          },\n          Component: ds.components.QueryCtrl,\n        });\n      }\n      // Annotations\n      case 'annotations-query-ctrl': {\n        const baseUrl = scope.ctrl.currentDatasource.meta.baseUrl;\n        const pluginId = scope.ctrl.currentDatasource.meta.id;\n\n        return importDataSourcePlugin(scope.ctrl.currentDatasource.meta).then(dsPlugin => {\n          return {\n            baseUrl,\n            name: 'annotations-query-ctrl-' + pluginId,\n            bindings: { annotation: '=', datasource: '=' },\n            attrs: {\n              annotation: 'ctrl.currentAnnotation',\n              datasource: 'ctrl.currentDatasource',\n            },\n            Component: dsPlugin.components.AnnotationsQueryCtrl,\n          };\n        });\n      }\n      // Datasource ConfigCtrl\n      case 'datasource-config-ctrl': {\n        const dsMeta = scope.ctrl.datasourceMeta;\n        const angularUrl = $location.url();\n        return importDataSourcePlugin(dsMeta).then(dsPlugin => {\n          scope.$watch(\n            'ctrl.current',\n            () => {\n              // This watcher can trigger when we navigate away due to late digests\n              // This check is to stop onModelChanged from being called when navigating away\n              // as it triggers a redux action which comes before the angular $routeChangeSucces and\n              // This makes the bridgeSrv think location changed from redux before detecting it was actually\n              // changed from angular.\n              if (angularUrl === $location.url()) {\n                scope.onModelChanged(scope.ctrl.current);\n              }\n            },\n            true\n          );\n\n          return {\n            baseUrl: dsMeta.baseUrl,\n            name: 'ds-config-' + dsMeta.id,\n            bindings: { meta: '=', current: '=' },\n            attrs: { meta: 'ctrl.datasourceMeta', current: 'ctrl.current' },\n            Component: dsPlugin.angularConfigCtrl,\n          };\n        });\n      }\n      // AppConfigCtrl\n      case 'app-config-ctrl': {\n        const model = scope.ctrl.model;\n        return importAppPlugin(model).then(appPlugin => {\n          return {\n            baseUrl: model.baseUrl,\n            name: 'app-config-' + model.id,\n            bindings: { appModel: '=', appEditCtrl: '=' },\n            attrs: { 'app-model': 'ctrl.model', 'app-edit-ctrl': 'ctrl' },\n            Component: appPlugin.angularConfigCtrl,\n          };\n        });\n      }\n      // App Page\n      case 'app-page': {\n        const appModel = scope.ctrl.appModel;\n        return importAppPlugin(appModel).then(appPlugin => {\n          return {\n            baseUrl: appModel.baseUrl,\n            name: 'app-page-' + appModel.id + '-' + scope.ctrl.page.slug,\n            bindings: { appModel: '=' },\n            attrs: { 'app-model': 'ctrl.appModel' },\n            Component: appPlugin.angularPages[scope.ctrl.page.component],\n          };\n        });\n      }\n      // Panel\n      case 'panel': {\n        return loadPanelComponentInfo(scope, attrs);\n      }\n      default: {\n        return Promise.reject({\n          message: 'Could not find component type: ' + attrs.type,\n        });\n      }\n    }\n  }\n\n  function appendAndCompile(scope: any, elem: JQuery, componentInfo: any) {\n    const child = angular.element(document.createElement(componentInfo.name));\n    _.each(componentInfo.attrs, (value, key) => {\n      child.attr(key, value);\n    });\n\n    $compile(child)(scope);\n    elem.empty();\n\n    // let a binding digest cycle complete before adding to dom\n    setTimeout(() => {\n      scope.$applyAsync(() => {\n        elem.append(child);\n        setTimeout(() => {\n          scope.$applyAsync(() => {\n            scope.$broadcast('component-did-mount');\n          });\n        });\n      });\n    });\n  }\n\n  function registerPluginComponent(scope: any, elem: JQuery, attrs: any, componentInfo: any) {\n    if (componentInfo.notFound) {\n      elem.empty();\n      return;\n    }\n\n    if (!componentInfo.Component) {\n      throw {\n        message: 'Failed to find exported plugin component for ' + componentInfo.name,\n      };\n    }\n\n    if (!componentInfo.Component.registered) {\n      const directiveName = attrs.$normalize(componentInfo.name);\n      const directiveFn = getPluginComponentDirective(componentInfo);\n      coreModule.directive(directiveName, directiveFn);\n      componentInfo.Component.registered = true;\n    }\n\n    appendAndCompile(scope, elem, componentInfo);\n  }\n\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: JQuery, attrs: any) => {\n      getModule(scope, attrs)\n        .then((componentInfo: any) => {\n          registerPluginComponent(scope, elem, attrs, componentInfo);\n        })\n        .catch((err: any) => {\n          console.log('Plugin component error', err);\n        });\n    },\n  };\n}\n\ncoreModule.directive('pluginComponent', pluginDirectiveLoader);\n","import coreModule from 'app/core/core_module';\nimport { importDataSourcePlugin } from './plugin_loader';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport DefaultVariableQueryEditor from '../templating/DefaultVariableQueryEditor';\nimport { DataSourcePluginMeta } from '@grafana/data';\nimport { TemplateSrv } from '../templating/template_srv';\n\nasync function loadComponent(meta: DataSourcePluginMeta) {\n  const dsPlugin = await importDataSourcePlugin(meta);\n  if (dsPlugin.components.VariableQueryEditor) {\n    return dsPlugin.components.VariableQueryEditor;\n  } else {\n    return DefaultVariableQueryEditor;\n  }\n}\n\n/** @ngInject */\nfunction variableQueryEditorLoader(templateSrv: TemplateSrv) {\n  return {\n    restrict: 'E',\n    link: async (scope: any, elem: JQuery) => {\n      const Component = await loadComponent(scope.currentDatasource.meta);\n      const props = {\n        datasource: scope.currentDatasource,\n        query: scope.current.query,\n        onChange: scope.onQueryChange,\n        templateSrv,\n      };\n      ReactDOM.render(<Component {...props} />, elem[0]);\n      scope.$on('$destroy', () => {\n        ReactDOM.unmountComponentAtNode(elem[0]);\n      });\n    },\n  };\n}\n\ncoreModule.directive('variableQueryEditorLoader', variableQueryEditorLoader);\n","import React from 'react';\nimport { Button, HorizontalGroup, Modal, VerticalGroup } from '@grafana/ui';\nimport { SaveDashboardButton } from './SaveDashboardButton';\nimport { DashboardModel } from '../../state';\nimport { css } from 'emotion';\n\ninterface UnsavedChangesModalProps {\n  dashboard: DashboardModel;\n  onDiscard: () => void;\n  onDismiss: () => void;\n  onSaveSuccess?: () => void;\n}\n\nexport const UnsavedChangesModal: React.FC<UnsavedChangesModalProps> = ({\n  dashboard,\n  onSaveSuccess,\n  onDiscard,\n  onDismiss,\n}) => {\n  return (\n    <Modal\n      isOpen={true}\n      title=\"Unsaved changes\"\n      onDismiss={onDismiss}\n      icon=\"exclamation-triangle\"\n      className={css`\n        width: 500px;\n      `}\n    >\n      <VerticalGroup align={'center'} spacing={'md'}>\n        <h4>Do you want to save your changes?</h4>\n        <HorizontalGroup justify=\"center\">\n          <SaveDashboardButton dashboard={dashboard} onSaveSuccess={onSaveSuccess} />\n          <Button\n            variant=\"destructive\"\n            onClick={() => {\n              onDiscard();\n              onDismiss();\n            }}\n          >\n            Discard\n          </Button>\n          <Button variant=\"secondary\" onClick={onDismiss}>\n            Cancel\n          </Button>\n        </HorizontalGroup>\n      </VerticalGroup>\n    </Modal>\n  );\n};\n","import angular, { ILocationService, IRootScopeService } from 'angular';\nimport _ from 'lodash';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { AppEventConsumer, CoreEvents } from 'app/types';\nimport { appEvents } from 'app/core/app_events';\nimport { UnsavedChangesModal } from '../components/SaveDashboard/UnsavedChangesModal';\n\nexport class ChangeTracker {\n  current: any;\n  originalPath: any;\n  scope: any;\n  original: any;\n  next: any;\n  $window: any;\n\n  /** @ngInject */\n  constructor(\n    dashboard: DashboardModel,\n    scope: IRootScopeService & AppEventConsumer,\n    originalCopyDelay: any,\n    private $location: ILocationService,\n    $window: any,\n    private $timeout: any,\n    private contextSrv: ContextSrv,\n    private $rootScope: GrafanaRootScope\n  ) {\n    this.$location = $location;\n    this.$window = $window;\n\n    this.current = dashboard;\n    this.originalPath = $location.path();\n    this.scope = scope;\n\n    // register events\n    appEvents.on(CoreEvents.dashboardSaved, () => {\n      this.original = this.current.getSaveModelClone();\n      this.originalPath = $location.path();\n    });\n\n    $window.onbeforeunload = () => {\n      if (this.ignoreChanges()) {\n        return undefined;\n      }\n      if (this.hasChanges()) {\n        return 'There are unsaved changes to this dashboard';\n      }\n      return undefined;\n    };\n\n    scope.$on('$locationChangeStart', (event: any, next: any) => {\n      // check if we should look for changes\n      if (this.originalPath === $location.path()) {\n        return true;\n      }\n\n      if (this.ignoreChanges()) {\n        return true;\n      }\n\n      if (this.hasChanges()) {\n        event.preventDefault();\n        this.next = next;\n\n        this.$timeout(() => {\n          this.open_modal();\n        });\n      }\n      return false;\n    });\n\n    if (originalCopyDelay && !dashboard.meta.fromExplore) {\n      this.$timeout(() => {\n        // wait for different services to patch the dashboard (missing properties)\n        this.original = dashboard.getSaveModelClone();\n      }, originalCopyDelay);\n    } else {\n      this.original = dashboard.getSaveModelClone();\n    }\n  }\n\n  // for some dashboards and users\n  // changes should be ignored\n  ignoreChanges() {\n    if (!this.original) {\n      return true;\n    }\n    if (!this.contextSrv.isEditor) {\n      return true;\n    }\n    if (!this.current || !this.current.meta) {\n      return true;\n    }\n\n    const meta = this.current.meta;\n    return !meta.canSave || meta.fromScript || meta.fromFile;\n  }\n\n  // remove stuff that should not count in diff\n  cleanDashboardFromIgnoredChanges(dashData: any) {\n    // need to new up the domain model class to get access to expand / collapse row logic\n    const model = new DashboardModel(dashData);\n\n    // Expand all rows before making comparison. This is required because row expand / collapse\n    // change order of panel array and panel positions.\n    model.expandRows();\n\n    const dash = model.getSaveModelClone();\n\n    // ignore time and refresh\n    dash.time = 0;\n    dash.refresh = 0;\n    dash.schemaVersion = 0;\n\n    // ignore iteration property\n    delete dash.iteration;\n\n    dash.panels = _.filter(dash.panels, panel => {\n      if (panel.repeatPanelId) {\n        return false;\n      }\n\n      // remove scopedVars\n      panel.scopedVars = null;\n\n      // ignore panel legend sort\n      if (panel.legend) {\n        delete panel.legend.sort;\n        delete panel.legend.sortDesc;\n      }\n\n      return true;\n    });\n\n    // ignore template variable values\n    _.each(dash.getVariables(), variable => {\n      variable.current = null;\n      variable.options = null;\n      variable.filters = null;\n    });\n\n    return dash;\n  }\n\n  hasChanges() {\n    const current = this.cleanDashboardFromIgnoredChanges(this.current.getSaveModelClone());\n    const original = this.cleanDashboardFromIgnoredChanges(this.original);\n\n    const currentTimepicker: any = _.find((current as any).nav, { type: 'timepicker' });\n    const originalTimepicker: any = _.find((original as any).nav, { type: 'timepicker' });\n\n    if (currentTimepicker && originalTimepicker) {\n      currentTimepicker.now = originalTimepicker.now;\n    }\n\n    const currentJson = angular.toJson(current, true);\n    const originalJson = angular.toJson(original, true);\n\n    return currentJson !== originalJson;\n  }\n\n  discardChanges = () => {\n    this.original = null;\n    this.gotoNext();\n  };\n\n  open_modal = () => {\n    this.$rootScope.appEvent(CoreEvents.showModalReact, {\n      component: UnsavedChangesModal,\n      props: {\n        dashboard: this.current,\n        onSaveSuccess: this.onSaveSuccess,\n        onDiscard: () => {\n          this.discardChanges();\n        },\n      },\n    });\n  };\n\n  onSaveSuccess = () => {\n    this.$timeout(() => {\n      this.gotoNext();\n    });\n  };\n\n  gotoNext = () => {\n    const baseLen = this.$location.absUrl().length - this.$location.url().length;\n    const nextUrl = this.next.substring(baseLen);\n\n    this.$timeout(() => {\n      this.$location.url(nextUrl);\n    });\n  };\n}\n","import angular, { ILocationService } from 'angular';\nimport { ChangeTracker } from './ChangeTracker';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { DashboardSrv } from './DashboardSrv';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\n/** @ngInject */\nexport function unsavedChangesSrv(\n  this: any,\n  $rootScope: GrafanaRootScope,\n  $location: ILocationService,\n  $timeout: any,\n  contextSrv: ContextSrv,\n  dashboardSrv: DashboardSrv,\n  $window: any\n) {\n  this.init = function(dashboard: any, scope: any) {\n    this.tracker = new ChangeTracker(dashboard, scope, 1000, $location, $window, $timeout, contextSrv, $rootScope);\n    return this.tracker;\n  };\n}\n\nangular.module('grafana.services').service('unsavedChangesSrv', unsavedChangesSrv);\n","import angular from 'angular';\nimport moment from 'moment'; // eslint-disable-line no-restricted-imports\nimport _ from 'lodash';\nimport $ from 'jquery';\nimport kbn from 'app/core/utils/kbn';\nimport { AppEvents, dateMath, UrlQueryValue } from '@grafana/data';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSrv } from './DashboardSrv';\nimport DatasourceSrv from 'app/features/plugins/datasource_srv';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\n\nexport class DashboardLoaderSrv {\n  /** @ngInject */\n  constructor(\n    private dashboardSrv: DashboardSrv,\n    private datasourceSrv: DatasourceSrv,\n    private $http: any,\n    private $timeout: any,\n    contextSrv: any,\n    private $routeParams: any,\n    private $rootScope: GrafanaRootScope\n  ) {}\n\n  _dashboardLoadFailed(title: string, snapshot?: boolean) {\n    snapshot = snapshot || false;\n    return {\n      meta: {\n        canStar: false,\n        isSnapshot: snapshot,\n        canDelete: false,\n        canSave: false,\n        canEdit: false,\n        dashboardNotFound: true,\n      },\n      dashboard: { title },\n    };\n  }\n\n  loadDashboard(type: UrlQueryValue, slug: any, uid: any) {\n    let promise;\n\n    if (type === 'script') {\n      promise = this._loadScriptedDashboard(slug);\n    } else if (type === 'snapshot') {\n      promise = backendSrv.get('/api/snapshots/' + slug).catch(() => {\n        return this._dashboardLoadFailed('Snapshot not found', true);\n      });\n    } else {\n      promise = backendSrv\n        .getDashboardByUid(uid)\n        .then((result: any) => {\n          if (result.meta.isFolder) {\n            this.$rootScope.appEvent(AppEvents.alertError, ['Dashboard not found']);\n            throw new Error('Dashboard not found');\n          }\n          return result;\n        })\n        .catch(() => {\n          return this._dashboardLoadFailed('Not found', true);\n        });\n    }\n\n    promise.then((result: any) => {\n      if (result.meta.dashboardNotFound !== true) {\n        impressionSrv.addDashboardImpression(result.dashboard.id);\n      }\n\n      return result;\n    });\n\n    return promise;\n  }\n\n  _loadScriptedDashboard(file: string) {\n    const url = 'public/dashboards/' + file.replace(/\\.(?!js)/, '/') + '?' + new Date().getTime();\n\n    return this.$http({ url: url, method: 'GET' })\n      .then(this._executeScript.bind(this))\n      .then(\n        (result: any) => {\n          return {\n            meta: {\n              fromScript: true,\n              canDelete: false,\n              canSave: false,\n              canStar: false,\n            },\n            dashboard: result.data,\n          };\n        },\n        (err: any) => {\n          console.log('Script dashboard error ' + err);\n          this.$rootScope.appEvent(AppEvents.alertError, [\n            'Script Error',\n            'Please make sure it exists and returns a valid dashboard',\n          ]);\n          return this._dashboardLoadFailed('Scripted dashboard');\n        }\n      );\n  }\n\n  _executeScript(result: any) {\n    const services = {\n      dashboardSrv: this.dashboardSrv,\n      datasourceSrv: this.datasourceSrv,\n    };\n\n    const scriptFunc = new Function(\n      'ARGS',\n      'kbn',\n      'dateMath',\n      '_',\n      'moment',\n      'window',\n      'document',\n      '$',\n      'jQuery',\n      'services',\n      result.data\n    );\n    const scriptResult = scriptFunc(this.$routeParams, kbn, dateMath, _, moment, window, document, $, $, services);\n\n    // Handle async dashboard scripts\n    if (_.isFunction(scriptResult)) {\n      return new Promise(resolve => {\n        scriptResult((dashboard: any) => {\n          this.$timeout(() => {\n            resolve({ data: dashboard });\n          });\n        });\n      });\n    }\n\n    return { data: scriptResult };\n  }\n}\n\nangular.module('grafana.services').service('dashboardLoaderSrv', DashboardLoaderSrv);\n","import _ from 'lodash';\nimport angular, { ILocationService, IScope } from 'angular';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { CalculateDiffOptions, HistoryListOpts, HistorySrv, RevisionsModel } from './HistorySrv';\nimport { AppEvents, DateTimeInput, locationUtil } from '@grafana/data';\nimport { GrafanaRootScope } from 'app/routes/GrafanaCtrl';\nimport { CoreEvents } from 'app/types';\nimport { promiseToDigest } from '../../../../core/utils/promiseToDigest';\nimport { appEvents } from 'app/core/app_events';\n\nexport class HistoryListCtrl {\n  appending: boolean;\n  dashboard: DashboardModel;\n  delta: { basic: string; json: string };\n  diff: string;\n  limit: number;\n  loading: boolean;\n  max: number;\n  mode: string;\n  revisions: RevisionsModel[];\n  start: number;\n  newInfo: RevisionsModel;\n  baseInfo: RevisionsModel;\n  canCompare: boolean;\n  isNewLatest: boolean;\n\n  /** @ngInject */\n  constructor(\n    private $route: any,\n    private $rootScope: GrafanaRootScope,\n    private $location: ILocationService,\n    private historySrv: HistorySrv,\n    public $scope: IScope\n  ) {\n    this.appending = false;\n    this.diff = 'basic';\n    this.limit = 10;\n    this.loading = false;\n    this.max = 2;\n    this.mode = 'list';\n    this.start = 0;\n    this.canCompare = false;\n\n    appEvents.on(CoreEvents.dashboardSaved, this.onDashboardSaved.bind(this), $scope);\n    this.resetFromSource();\n  }\n\n  onDashboardSaved() {\n    this.resetFromSource();\n  }\n\n  switchMode(mode: string) {\n    this.mode = mode;\n    if (this.mode === 'list') {\n      this.reset();\n    }\n  }\n\n  dismiss() {\n    this.$rootScope.appEvent(CoreEvents.hideDashEditor);\n  }\n\n  addToLog() {\n    this.start = this.start + this.limit;\n    this.getLog(true);\n  }\n\n  revisionSelectionChanged() {\n    const selected = _.filter(this.revisions, { checked: true }).length;\n    this.canCompare = selected === 2;\n  }\n\n  formatDate(date: DateTimeInput) {\n    return this.dashboard.formatDate(date);\n  }\n\n  formatBasicDate(date: DateTimeInput) {\n    return this.dashboard.getRelativeTime(date);\n  }\n\n  getDiff(diff: 'basic' | 'json') {\n    this.diff = diff;\n    this.mode = 'compare';\n\n    // has it already been fetched?\n    if (this.delta[diff]) {\n      return Promise.resolve(this.delta[diff]);\n    }\n\n    const selected = _.filter(this.revisions, { checked: true });\n\n    this.newInfo = selected[0];\n    this.baseInfo = selected[1];\n    this.isNewLatest = this.newInfo.version === this.dashboard.version;\n\n    this.loading = true;\n    const options: CalculateDiffOptions = {\n      new: {\n        dashboardId: this.dashboard.id,\n        version: this.newInfo.version,\n      },\n      base: {\n        dashboardId: this.dashboard.id,\n        version: this.baseInfo.version,\n      },\n      diffType: diff,\n    };\n\n    return promiseToDigest(this.$scope)(\n      this.historySrv\n        .calculateDiff(options)\n        .then((response: any) => {\n          // @ts-ignore\n          this.delta[this.diff] = response;\n        })\n        .catch(() => {\n          this.mode = 'list';\n        })\n        .finally(() => {\n          this.loading = false;\n        })\n    );\n  }\n\n  getLog(append = false) {\n    this.loading = !append;\n    this.appending = append;\n    const options: HistoryListOpts = {\n      limit: this.limit,\n      start: this.start,\n    };\n\n    return promiseToDigest(this.$scope)(\n      this.historySrv\n        .getHistoryList(this.dashboard, options)\n        .then((revisions: any) => {\n          // set formatted dates & default values\n          for (const rev of revisions) {\n            rev.createdDateString = this.formatDate(rev.created);\n            rev.ageString = this.formatBasicDate(rev.created);\n            rev.checked = false;\n          }\n\n          this.revisions = append ? this.revisions.concat(revisions) : revisions;\n        })\n        .catch((err: any) => {\n          this.loading = false;\n        })\n        .finally(() => {\n          this.loading = false;\n          this.appending = false;\n        })\n    );\n  }\n\n  isLastPage() {\n    return _.find(this.revisions, rev => rev.version === 1);\n  }\n\n  reset() {\n    this.delta = { basic: '', json: '' };\n    this.diff = 'basic';\n    this.mode = 'list';\n    this.revisions = _.map(this.revisions, rev => _.extend({}, rev, { checked: false }));\n    this.canCompare = false;\n    this.start = 0;\n    this.isNewLatest = false;\n  }\n\n  resetFromSource() {\n    this.revisions = [];\n    return this.getLog().then(this.reset.bind(this));\n  }\n\n  restore(version: number) {\n    this.$rootScope.appEvent(CoreEvents.showConfirmModal, {\n      title: 'Restore version',\n      text: '',\n      text2: `Are you sure you want to restore the dashboard to version ${version}? All unsaved changes will be lost.`,\n      icon: 'fa-history',\n      yesText: `Yes, restore to version ${version}`,\n      onConfirm: this.restoreConfirm.bind(this, version),\n    });\n  }\n\n  restoreConfirm(version: number) {\n    this.loading = true;\n    return promiseToDigest(this.$scope)(\n      this.historySrv\n        .restoreDashboard(this.dashboard, version)\n        .then((response: any) => {\n          this.$location.url(locationUtil.stripBaseFromUrl(response.url)).replace();\n          this.$route.reload();\n          this.$rootScope.appEvent(AppEvents.alertSuccess, ['Dashboard restored', 'Restored from version ' + version]);\n        })\n        .catch(() => {\n          this.mode = 'list';\n          this.loading = false;\n        })\n    );\n  }\n}\n\nexport function dashboardHistoryDirective() {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/features/dashboard/components/VersionHistory/template.html',\n    controller: HistoryListCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      dashboard: '=',\n    },\n  };\n}\n\nangular.module('grafana.directives').directive('gfDashboardHistory', dashboardHistoryDirective);\n","import _ from 'lodash';\nimport coreModule from 'app/core/core_module';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { getBackendSrv } from '@grafana/runtime';\n\nexport interface HistoryListOpts {\n  limit: number;\n  start: number;\n}\n\nexport interface RevisionsModel {\n  id: number;\n  checked: boolean;\n  dashboardId: number;\n  parentVersion: number;\n  version: number;\n  created: Date;\n  createdBy: string;\n  message: string;\n}\n\nexport interface CalculateDiffOptions {\n  new: DiffTarget;\n  base: DiffTarget;\n  diffType: string;\n}\n\nexport interface DiffTarget {\n  dashboardId: number;\n  version: number;\n  unsavedDashboard?: DashboardModel; // when doing diffs against unsaved dashboard version\n}\n\nexport class HistorySrv {\n  getHistoryList(dashboard: DashboardModel, options: HistoryListOpts) {\n    const id = dashboard && dashboard.id ? dashboard.id : void 0;\n    return id ? getBackendSrv().get(`api/dashboards/id/${id}/versions`, options) : Promise.resolve([]);\n  }\n\n  calculateDiff(options: CalculateDiffOptions) {\n    return getBackendSrv().post('api/dashboards/calculate-diff', options);\n  }\n\n  restoreDashboard(dashboard: DashboardModel, version: number) {\n    const id = dashboard && dashboard.id ? dashboard.id : void 0;\n    const url = `api/dashboards/id/${id}/restore`;\n\n    return id && _.isNumber(version) ? getBackendSrv().post(url, { version }) : Promise.resolve({});\n  }\n}\n\ncoreModule.service('historySrv', HistorySrv);\n","import _ from 'lodash';\nimport angular from 'angular';\nimport coreModule from 'app/core/core_module';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport DatasourceSrv from 'app/features/plugins/datasource_srv';\nimport { VariableSrv } from 'app/features/templating/all';\nimport { CoreEvents } from 'app/types';\n\nexport class AdHocFiltersCtrl {\n  segments: any;\n  variable: any;\n  dashboard: DashboardModel;\n  removeTagFilterSegment: any;\n\n  /** @ngInject */\n  constructor(\n    private uiSegmentSrv: any,\n    private datasourceSrv: DatasourceSrv,\n    private variableSrv: VariableSrv,\n    $scope: any\n  ) {\n    this.removeTagFilterSegment = uiSegmentSrv.newSegment({\n      fake: true,\n      value: '-- remove filter --',\n    });\n    this.buildSegmentModel();\n    this.dashboard.events.on(CoreEvents.templateVariableValueUpdated, this.buildSegmentModel.bind(this), $scope);\n  }\n\n  buildSegmentModel() {\n    this.segments = [];\n\n    if (this.variable.value && !_.isArray(this.variable.value)) {\n    }\n\n    for (const tag of this.variable.filters) {\n      if (this.segments.length > 0) {\n        this.segments.push(this.uiSegmentSrv.newCondition('AND'));\n      }\n\n      if (tag.key !== undefined && tag.value !== undefined) {\n        this.segments.push(this.uiSegmentSrv.newKey(tag.key));\n        this.segments.push(this.uiSegmentSrv.newOperator(tag.operator));\n        this.segments.push(this.uiSegmentSrv.newKeyValue(tag.value));\n      }\n    }\n\n    this.segments.push(this.uiSegmentSrv.newPlusButton());\n  }\n\n  getOptions(segment: { type: string }, index: number) {\n    if (segment.type === 'operator') {\n      return Promise.resolve(this.uiSegmentSrv.newOperators(['=', '!=', '<', '>', '=~', '!~']));\n    }\n\n    if (segment.type === 'condition') {\n      return Promise.resolve([this.uiSegmentSrv.newSegment('AND')]);\n    }\n\n    return this.datasourceSrv.get(this.variable.datasource).then(ds => {\n      const options: any = {};\n      let promise = null;\n\n      if (segment.type !== 'value') {\n        promise = ds.getTagKeys ? ds.getTagKeys() : Promise.resolve([]);\n      } else {\n        options.key = this.segments[index - 2].value;\n        promise = ds.getTagValues ? ds.getTagValues(options) : Promise.resolve([]);\n      }\n\n      return promise.then((results: any) => {\n        results = _.map(results, segment => {\n          return this.uiSegmentSrv.newSegment({ value: segment.text });\n        });\n\n        // add remove option for keys\n        if (segment.type === 'key') {\n          results.splice(0, 0, angular.copy(this.removeTagFilterSegment));\n        }\n        return results;\n      });\n    });\n  }\n\n  segmentChanged(segment: { value: any; type: string; cssClass: string }, index: number) {\n    this.segments[index] = segment;\n\n    // handle remove tag condition\n    if (segment.value === this.removeTagFilterSegment.value) {\n      this.segments.splice(index, 3);\n      if (this.segments.length === 0) {\n        this.segments.push(this.uiSegmentSrv.newPlusButton());\n      } else if (this.segments.length > 2) {\n        this.segments.splice(Math.max(index - 1, 0), 1);\n        if (this.segments[this.segments.length - 1].type !== 'plus-button') {\n          this.segments.push(this.uiSegmentSrv.newPlusButton());\n        }\n      }\n    } else {\n      if (segment.type === 'plus-button') {\n        if (index > 2) {\n          this.segments.splice(index, 0, this.uiSegmentSrv.newCondition('AND'));\n        }\n        this.segments.push(this.uiSegmentSrv.newOperator('='));\n        this.segments.push(this.uiSegmentSrv.newFake('select value', 'value', 'query-segment-value'));\n        segment.type = 'key';\n        segment.cssClass = 'query-segment-key';\n      }\n\n      if (index + 1 === this.segments.length) {\n        this.segments.push(this.uiSegmentSrv.newPlusButton());\n      }\n    }\n\n    this.updateVariableModel();\n  }\n\n  updateVariableModel() {\n    const filters: any[] = [];\n    let filterIndex = -1;\n    let hasFakes = false;\n\n    this.segments.forEach((segment: any) => {\n      if (segment.type === 'value' && segment.fake) {\n        hasFakes = true;\n        return;\n      }\n\n      switch (segment.type) {\n        case 'key': {\n          filters.push({ key: segment.value });\n          filterIndex += 1;\n          break;\n        }\n        case 'value': {\n          filters[filterIndex].value = segment.value;\n          break;\n        }\n        case 'operator': {\n          filters[filterIndex].operator = segment.value;\n          break;\n        }\n        case 'condition': {\n          filters[filterIndex].condition = segment.value;\n          break;\n        }\n      }\n    });\n\n    if (hasFakes) {\n      return;\n    }\n\n    this.variable.setFilters(filters);\n    this.variableSrv.variableUpdated(this.variable, true);\n  }\n}\n\nconst template = `\n<div class=\"gf-form-inline\">\n  <div class=\"gf-form\" ng-repeat=\"segment in ctrl.segments\">\n    <metric-segment segment=\"segment\" get-options=\"ctrl.getOptions(segment, $index)\"\n                    on-change=\"ctrl.segmentChanged(segment, $index)\"></metric-segment>\n  </div>\n</div>\n`;\n\nexport function adHocFiltersComponent() {\n  return {\n    restrict: 'E',\n    template: template,\n    controller: AdHocFiltersCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      variable: '=',\n      dashboard: '=',\n    },\n  };\n}\n\ncoreModule.directive('adHocFilters', adHocFiltersComponent);\n","import { coreModule } from 'app/core/core';\n\nexport class RowOptionsCtrl {\n  row: any;\n  source: any;\n  dismiss: any;\n  onUpdated: any;\n  showDelete: boolean;\n\n  /** @ngInject */\n  constructor() {\n    this.source = this.row;\n    this.row = this.row.getSaveModel();\n  }\n\n  update() {\n    this.source.title = this.row.title;\n    this.source.repeat = this.row.repeat;\n    this.onUpdated();\n    this.dismiss();\n  }\n}\n\nexport function rowOptionsDirective() {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/features/dashboard/components/RowOptions/template.html',\n    controller: RowOptionsCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      row: '=',\n      dismiss: '&',\n      onUpdated: '&',\n    },\n  };\n}\n\ncoreModule.directive('rowOptions', rowOptionsDirective);\n","import React, { PureComponent } from 'react';\nimport { Tooltip, Icon } from '@grafana/ui';\nimport { SlideDown } from 'app/core/components/Animations/SlideDown';\nimport { StoreState, FolderInfo } from 'app/types';\nimport { DashboardAcl, PermissionLevel, NewDashboardAclItem } from 'app/types/acl';\nimport {\n  getDashboardPermissions,\n  addDashboardPermission,\n  removeDashboardPermission,\n  updateDashboardPermission,\n} from '../../state/actions';\nimport PermissionList from 'app/core/components/PermissionList/PermissionList';\nimport AddPermission from 'app/core/components/PermissionList/AddPermission';\nimport PermissionsInfo from 'app/core/components/PermissionList/PermissionsInfo';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\n\nexport interface Props {\n  dashboardId: number;\n  folder?: FolderInfo;\n  permissions: DashboardAcl[];\n  getDashboardPermissions: typeof getDashboardPermissions;\n  updateDashboardPermission: typeof updateDashboardPermission;\n  removeDashboardPermission: typeof removeDashboardPermission;\n  addDashboardPermission: typeof addDashboardPermission;\n}\n\nexport interface State {\n  isAdding: boolean;\n}\n\nexport class DashboardPermissions extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      isAdding: false,\n    };\n  }\n\n  componentDidMount() {\n    this.props.getDashboardPermissions(this.props.dashboardId);\n  }\n\n  onOpenAddPermissions = () => {\n    this.setState({ isAdding: true });\n  };\n\n  onRemoveItem = (item: DashboardAcl) => {\n    this.props.removeDashboardPermission(this.props.dashboardId, item);\n  };\n\n  onPermissionChanged = (item: DashboardAcl, level: PermissionLevel) => {\n    this.props.updateDashboardPermission(this.props.dashboardId, item, level);\n  };\n\n  onAddPermission = (newItem: NewDashboardAclItem) => {\n    return this.props.addDashboardPermission(this.props.dashboardId, newItem);\n  };\n\n  onCancelAddPermission = () => {\n    this.setState({ isAdding: false });\n  };\n\n  render() {\n    const { permissions, folder } = this.props;\n    const { isAdding } = this.state;\n\n    return (\n      <div>\n        <div className=\"dashboard-settings__header\">\n          <div className=\"page-action-bar\">\n            <h3 className=\"d-inline-block\">Permissions</h3>\n            <Tooltip placement=\"auto\" content={<PermissionsInfo />}>\n              <Icon className=\"icon--has-hover page-sub-heading-icon\" name=\"question-circle\" />\n            </Tooltip>\n            <div className=\"page-action-bar__spacer\" />\n            <button className=\"btn btn-primary pull-right\" onClick={this.onOpenAddPermissions} disabled={isAdding}>\n              Add Permission\n            </button>\n          </div>\n        </div>\n        <SlideDown in={isAdding}>\n          <AddPermission onAddPermission={this.onAddPermission} onCancel={this.onCancelAddPermission} />\n        </SlideDown>\n        <PermissionList\n          items={permissions}\n          onRemoveItem={this.onRemoveItem}\n          onPermissionChanged={this.onPermissionChanged}\n          isFetching={false}\n          folderInfo={folder}\n        />\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n  permissions: state.dashboard.permissions,\n});\n\nconst mapDispatchToProps = {\n  getDashboardPermissions,\n  addDashboardPermission,\n  removeDashboardPermission,\n  updateDashboardPermission,\n};\n\nexport default connectWithStore(DashboardPermissions, mapStateToProps, mapDispatchToProps);\n","// Services\nimport './services/UnsavedChangesSrv';\nimport './services/DashboardLoaderSrv';\nimport './services/DashboardSrv';\n\n// Components\nimport './components/DashLinks';\nimport './components/DashExportModal';\nimport './components/DashNav';\nimport './components/VersionHistory';\nimport './components/DashboardSettings';\nimport './components/AdHocFilters';\nimport './components/RowOptions';\n\nimport DashboardPermissions from './components/DashboardPermissions/DashboardPermissions';\n\n// angular wrappers\nimport { react2AngularDirective } from 'app/core/utils/react2angular';\n\nreact2AngularDirective('dashboardPermissions', DashboardPermissions, ['dashboardId', 'folder']);\n","import { IScope } from 'angular';\nimport _ from 'lodash';\nimport { AppEvents } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport coreModule from '../../core/core_module';\nimport { NavModelSrv } from 'app/core/nav_model_srv';\nimport { AppEventEmitter, CoreEvents } from 'app/types';\nimport { promiseToDigest } from '../../core/utils/promiseToDigest';\n\nexport class PlaylistsCtrl {\n  playlists: any;\n  navModel: any;\n\n  /** @ngInject */\n  constructor(private $scope: IScope & AppEventEmitter, navModelSrv: NavModelSrv) {\n    this.navModel = navModelSrv.getNav('dashboards', 'playlists', 0);\n    promiseToDigest($scope)(\n      getBackendSrv()\n        .get('/api/playlists')\n        .then((result: any) => {\n          this.playlists = result.map((item: any) => {\n            item.startUrl = `playlists/play/${item.id}`;\n            return item;\n          });\n        })\n    );\n  }\n\n  removePlaylistConfirmed(playlist: any) {\n    _.remove(this.playlists, { id: playlist.id });\n\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .delete('/api/playlists/' + playlist.id)\n        .then(\n          () => {\n            this.$scope.appEvent(AppEvents.alertSuccess, ['Playlist deleted']);\n          },\n          () => {\n            this.$scope.appEvent(AppEvents.alertError, ['Unable to delete playlist']);\n            this.playlists.push(playlist);\n          }\n        )\n    );\n  }\n\n  removePlaylist(playlist: any) {\n    this.$scope.appEvent(CoreEvents.showConfirmModal, {\n      title: 'Delete',\n      text: 'Are you sure you want to delete playlist ' + playlist.name + '?',\n      yesText: 'Delete',\n      icon: 'trash-alt',\n      onConfirm: () => {\n        this.removePlaylistConfirmed(playlist);\n      },\n    });\n  }\n}\n\ncoreModule.controller('PlaylistsCtrl', PlaylistsCtrl);\n","import { IScope, ITimeoutService } from 'angular';\n\nimport coreModule from '../../core/core_module';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { promiseToDigest } from '../../core/utils/promiseToDigest';\n\nexport class PlaylistSearchCtrl {\n  query: any;\n  tagsMode: boolean;\n\n  searchStarted: any;\n\n  /** @ngInject */\n  constructor(private $scope: IScope, $timeout: ITimeoutService) {\n    this.query = { query: '', tag: [], starred: false, limit: 20 };\n\n    $timeout(() => {\n      this.query.query = '';\n      this.query.type = 'dash-db';\n      this.searchDashboards();\n    }, 100);\n  }\n\n  searchDashboards() {\n    this.tagsMode = false;\n    const prom: any = {};\n\n    prom.promise = promiseToDigest(this.$scope)(\n      backendSrv.search(this.query).then(result => {\n        return {\n          dashboardResult: result,\n          tagResult: [],\n        };\n      })\n    );\n\n    this.searchStarted(prom);\n  }\n\n  showStarred() {\n    this.query.starred = !this.query.starred;\n    this.searchDashboards();\n  }\n\n  queryHasNoFilters() {\n    return this.query.query === '' && this.query.starred === false && this.query.tag.length === 0;\n  }\n\n  filterByTag(tag: any, evt: any) {\n    this.query.tag.push(tag);\n    this.searchDashboards();\n    if (evt) {\n      evt.stopPropagation();\n      evt.preventDefault();\n    }\n  }\n\n  getTags() {\n    const prom: any = {};\n    prom.promise = promiseToDigest(this.$scope)(\n      backendSrv.get('/api/dashboards/tags').then((result: any) => {\n        return {\n          dashboardResult: [],\n          tagResult: result,\n        } as any;\n      })\n    );\n\n    this.searchStarted(prom);\n  }\n}\n\nexport function playlistSearchDirective() {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/features/playlist/partials/playlist_search.html',\n    controller: PlaylistSearchCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      searchStarted: '&',\n    },\n  };\n}\n\ncoreModule.directive('playlistSearch', playlistSearchDirective);\n","// Libraries\nimport _ from 'lodash';\n\n// Utils\nimport coreModule from '../../core/core_module';\nimport appEvents from 'app/core/app_events';\n\nimport kbn from 'app/core/utils/kbn';\nimport { store } from 'app/store/store';\nimport { CoreEvents } from 'app/types';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { locationUtil, urlUtil } from '@grafana/data';\n\nexport const queryParamsToPreserve: { [key: string]: boolean } = {\n  kiosk: true,\n  autofitpanels: true,\n  orgId: true,\n};\n\nexport class PlaylistSrv {\n  private cancelPromise: any;\n  private dashboards: Array<{ url: string }>;\n  private index: number;\n  private interval: number;\n  private startUrl: string;\n  private numberOfLoops = 0;\n  private storeUnsub: () => void;\n  private validPlaylistUrl: string;\n  isPlaying: boolean;\n\n  /** @ngInject */\n  constructor(private $location: any, private $timeout: any) {}\n\n  next() {\n    this.$timeout.cancel(this.cancelPromise);\n\n    const playedAllDashboards = this.index > this.dashboards.length - 1;\n    if (playedAllDashboards) {\n      this.numberOfLoops++;\n\n      // This does full reload of the playlist to keep memory in check due to existing leaks but at the same time\n      // we do not want page to flicker after each full loop.\n      if (this.numberOfLoops >= 3) {\n        window.location.href = this.startUrl;\n        return;\n      }\n      this.index = 0;\n    }\n\n    const dash = this.dashboards[this.index];\n    const queryParams = this.$location.search();\n    const filteredParams = _.pickBy(queryParams, (value: any, key: string) => queryParamsToPreserve[key]);\n    const nextDashboardUrl = locationUtil.stripBaseFromUrl(dash.url);\n\n    // this is done inside timeout to make sure digest happens after\n    // as this can be called from react\n    this.$timeout(() => {\n      this.$location.url(nextDashboardUrl + '?' + urlUtil.toUrlParams(filteredParams));\n    });\n\n    this.index++;\n    this.validPlaylistUrl = nextDashboardUrl;\n    this.cancelPromise = this.$timeout(() => this.next(), this.interval);\n  }\n\n  prev() {\n    this.index = Math.max(this.index - 2, 0);\n    this.next();\n  }\n\n  // Detect url changes not caused by playlist srv and stop playlist\n  storeUpdated() {\n    const state = store.getState();\n\n    if (state.location.path !== this.validPlaylistUrl) {\n      this.stop();\n    }\n  }\n\n  start(playlistId: number) {\n    this.stop();\n\n    this.startUrl = window.location.href;\n    this.index = 0;\n    this.isPlaying = true;\n\n    // setup location tracking\n    this.storeUnsub = store.subscribe(() => this.storeUpdated());\n    this.validPlaylistUrl = this.$location.path();\n\n    appEvents.emit(CoreEvents.playlistStarted);\n\n    return getBackendSrv()\n      .get(`/api/playlists/${playlistId}`)\n      .then((playlist: any) => {\n        return getBackendSrv()\n          .get(`/api/playlists/${playlistId}/dashboards`)\n          .then((dashboards: any) => {\n            this.dashboards = dashboards;\n            this.interval = kbn.interval_to_ms(playlist.interval);\n            this.next();\n          });\n      });\n  }\n\n  stop() {\n    if (this.isPlaying) {\n      const queryParams = this.$location.search();\n      if (queryParams.kiosk) {\n        appEvents.emit(CoreEvents.toggleKioskMode, { exit: true });\n      }\n    }\n\n    this.index = 0;\n    this.isPlaying = false;\n\n    if (this.storeUnsub) {\n      this.storeUnsub();\n    }\n\n    if (this.cancelPromise) {\n      this.$timeout.cancel(this.cancelPromise);\n    }\n\n    appEvents.emit(CoreEvents.playlistStopped);\n  }\n}\n\ncoreModule.service('playlistSrv', PlaylistSrv);\n","import _ from 'lodash';\nimport coreModule from '../../core/core_module';\nimport { ILocationService, IScope } from 'angular';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { NavModelSrv } from 'app/core/nav_model_srv';\nimport { AppEventEmitter } from 'app/types';\nimport { AppEvents } from '@grafana/data';\nimport { promiseToDigest } from '../../core/utils/promiseToDigest';\n\nexport interface PlaylistItem {\n  value: any;\n  id: any;\n  type: string;\n  order: any;\n}\nexport class PlaylistEditCtrl {\n  filteredDashboards: any = [];\n  filteredTags: any = [];\n  searchQuery = '';\n  loading = false;\n  playlist: any = {\n    interval: '5m',\n  };\n\n  playlistItems: any = [];\n  dashboardresult: any = [];\n  tagresult: any = [];\n  navModel: any;\n  isNew: boolean;\n\n  /** @ngInject */\n  constructor(\n    private $scope: IScope & AppEventEmitter,\n    private $location: ILocationService,\n    $route: any,\n    navModelSrv: NavModelSrv\n  ) {\n    this.navModel = navModelSrv.getNav('dashboards', 'playlists', 0);\n    this.isNew = !$route.current.params.id;\n\n    if ($route.current.params.id) {\n      const playlistId = $route.current.params.id;\n\n      promiseToDigest(this.$scope)(\n        getBackendSrv()\n          .get('/api/playlists/' + playlistId)\n          .then((result: any) => {\n            this.playlist = result;\n          })\n      );\n\n      promiseToDigest(this.$scope)(\n        getBackendSrv()\n          .get('/api/playlists/' + playlistId + '/items')\n          .then((result: any) => {\n            this.playlistItems = result;\n          })\n      );\n    }\n  }\n\n  filterFoundPlaylistItems() {\n    this.filteredDashboards = _.reject(this.dashboardresult, playlistItem => {\n      return _.find(this.playlistItems, listPlaylistItem => {\n        return parseInt(listPlaylistItem.value, 10) === playlistItem.id;\n      });\n    });\n\n    this.filteredTags = _.reject(this.tagresult, tag => {\n      return _.find(this.playlistItems, listPlaylistItem => {\n        return listPlaylistItem.value === tag.term;\n      });\n    });\n  }\n\n  addPlaylistItem(playlistItem: PlaylistItem) {\n    playlistItem.value = playlistItem.id.toString();\n    playlistItem.type = 'dashboard_by_id';\n    playlistItem.order = this.playlistItems.length + 1;\n\n    this.playlistItems.push(playlistItem);\n    this.filterFoundPlaylistItems();\n  }\n\n  addTagPlaylistItem(tag: { term: any }) {\n    const playlistItem: any = {\n      value: tag.term,\n      type: 'dashboard_by_tag',\n      order: this.playlistItems.length + 1,\n      title: tag.term,\n    };\n\n    this.playlistItems.push(playlistItem);\n    this.filterFoundPlaylistItems();\n  }\n\n  removePlaylistItem(playlistItem: PlaylistItem) {\n    _.remove(this.playlistItems, listedPlaylistItem => {\n      return playlistItem === listedPlaylistItem;\n    });\n    this.filterFoundPlaylistItems();\n  }\n\n  savePlaylist(playlist: any, playlistItems: PlaylistItem[]) {\n    let savePromise;\n\n    playlist.items = playlistItems;\n\n    savePromise = playlist.id\n      ? promiseToDigest(this.$scope)(getBackendSrv().put('/api/playlists/' + playlist.id, playlist))\n      : promiseToDigest(this.$scope)(getBackendSrv().post('/api/playlists', playlist));\n\n    savePromise.then(\n      () => {\n        this.$scope.appEvent(AppEvents.alertSuccess, ['Playlist saved']);\n        this.$location.path('/playlists');\n      },\n      () => {\n        this.$scope.appEvent(AppEvents.alertError, ['Unable to save playlist']);\n      }\n    );\n  }\n\n  isPlaylistEmpty() {\n    return !this.playlistItems.length;\n  }\n\n  backToList() {\n    this.$location.path('/playlists');\n  }\n\n  searchStarted(promise: Promise<any>) {\n    promise.then((data: any) => {\n      this.dashboardresult = data.dashboardResult;\n      this.tagresult = data.tagResult;\n      this.filterFoundPlaylistItems();\n    });\n  }\n\n  movePlaylistItem(playlistItem: PlaylistItem, offset: number) {\n    const currentPosition = this.playlistItems.indexOf(playlistItem);\n    const newPosition = currentPosition + offset;\n\n    if (newPosition >= 0 && newPosition < this.playlistItems.length) {\n      this.playlistItems.splice(currentPosition, 1);\n      this.playlistItems.splice(newPosition, 0, playlistItem);\n    }\n  }\n\n  movePlaylistItemUp(playlistItem: PlaylistItem) {\n    this.movePlaylistItem(playlistItem, -1);\n  }\n\n  movePlaylistItemDown(playlistItem: PlaylistItem) {\n    this.movePlaylistItem(playlistItem, 1);\n  }\n}\n\ncoreModule.controller('PlaylistEditCtrl', PlaylistEditCtrl);\n","import angular from 'angular';\nimport { PlaylistSrv } from './playlist_srv';\n\n/** @ngInject */\nfunction grafanaRoutes($routeProvider: any) {\n  $routeProvider\n    .when('/playlists', {\n      templateUrl: 'public/app/features/playlist/partials/playlists.html',\n      controllerAs: 'ctrl',\n      controller: 'PlaylistsCtrl',\n    })\n    .when('/playlists/create', {\n      templateUrl: 'public/app/features/playlist/partials/playlist.html',\n      controllerAs: 'ctrl',\n      controller: 'PlaylistEditCtrl',\n    })\n    .when('/playlists/edit/:id', {\n      templateUrl: 'public/app/features/playlist/partials/playlist.html',\n      controllerAs: 'ctrl',\n      controller: 'PlaylistEditCtrl',\n    })\n    .when('/playlists/play/:id', {\n      template: '',\n      resolve: {\n        init: (playlistSrv: PlaylistSrv, $route: any) => {\n          const playlistId = $route.current.params.id;\n          playlistSrv.start(playlistId);\n        },\n      },\n    });\n}\n\nangular.module('grafana.routes').config(grafanaRoutes);\n","import angular from 'angular';\n// @ts-ignore\nimport baron from 'baron';\nimport { PanelEvents } from '@grafana/data';\nimport { PanelModel } from '../dashboard/state';\nimport { PanelCtrl } from './panel_ctrl';\n\nconst module = angular.module('grafana.directives');\n\nconst panelTemplate = `\n  <ng-transclude class=\"panel-height-helper\"></ng-transclude>\n`;\n\nmodule.directive('grafanaPanel', ($rootScope, $document, $timeout) => {\n  return {\n    restrict: 'E',\n    template: panelTemplate,\n    transclude: true,\n    scope: { ctrl: '=' },\n    link: (scope: any, elem) => {\n      const ctrl: PanelCtrl = scope.ctrl;\n      const panel: PanelModel = scope.ctrl.panel;\n\n      let panelScrollbar: any;\n\n      function resizeScrollableContent() {\n        if (panelScrollbar) {\n          panelScrollbar.update();\n        }\n      }\n\n      ctrl.events.on(PanelEvents.componentDidMount, () => {\n        if ((ctrl as any).__proto__.constructor.scrollable) {\n          const scrollRootClass = 'baron baron__root baron__clipper panel-content--scrollable';\n          const scrollerClass = 'baron__scroller';\n          const scrollBarHTML = `\n            <div class=\"baron__track\">\n              <div class=\"baron__bar\"></div>\n            </div>\n          `;\n\n          const scrollRoot = elem;\n          const scroller = elem.find(':first').find(':first');\n\n          scrollRoot.addClass(scrollRootClass);\n          $(scrollBarHTML).appendTo(scrollRoot);\n          scroller.addClass(scrollerClass);\n\n          panelScrollbar = baron({\n            root: scrollRoot[0],\n            scroller: scroller[0],\n            bar: '.baron__bar',\n            barOnCls: '_scrollbar',\n            scrollingCls: '_scrolling',\n          });\n\n          panelScrollbar.scroll();\n        }\n      });\n\n      function onPanelSizeChanged() {\n        $timeout(() => {\n          resizeScrollableContent();\n          ctrl.render();\n        });\n      }\n\n      function onPanelModelRender(payload?: any) {\n        ctrl.height = scope.$parent.$parent.size.height;\n        ctrl.width = scope.$parent.$parent.size.width;\n      }\n\n      function onPanelModelRefresh() {\n        ctrl.height = scope.$parent.$parent.size.height;\n        ctrl.width = scope.$parent.$parent.size.width;\n      }\n\n      panel.events.on(PanelEvents.refresh, onPanelModelRefresh);\n      panel.events.on(PanelEvents.render, onPanelModelRender);\n      panel.events.on(PanelEvents.panelSizeChanged, onPanelSizeChanged);\n\n      scope.$on('$destroy', () => {\n        elem.off();\n\n        panel.events.emit(PanelEvents.panelTeardown);\n        panel.events.removeAllListeners();\n\n        if (panelScrollbar) {\n          panelScrollbar.dispose();\n        }\n      });\n    },\n  };\n});\n","import angular from 'angular';\n\nconst directiveModule = angular.module('grafana.directives');\nconst directiveCache: any = {};\n\n/** @ngInject */\nfunction panelEditorTab(dynamicDirectiveSrv: any) {\n  return dynamicDirectiveSrv.create({\n    scope: {\n      ctrl: '=',\n      editorTab: '=',\n    },\n    directive: (scope: any) => {\n      const pluginId = scope.ctrl.pluginId;\n      const tabName = scope.editorTab.title\n        .toLowerCase()\n        .replace(' ', '-')\n        .replace('&', '')\n        .replace(' ', '')\n        .replace(' ', '-');\n\n      if (directiveCache[pluginId]) {\n        if (directiveCache[pluginId][tabName]) {\n          return directiveCache[pluginId][tabName];\n        }\n      } else {\n        directiveCache[pluginId] = [];\n      }\n\n      const result = {\n        fn: () => scope.editorTab.directiveFn(),\n        name: `panel-editor-tab-${pluginId}${tabName}`,\n      };\n\n      directiveCache[pluginId][tabName] = result;\n\n      return result;\n    },\n  });\n}\n\ndirectiveModule.directive('panelEditorTab', panelEditorTab);\n","import angular from 'angular';\n\nconst module = angular.module('grafana.directives');\n\nexport class QueryRowCtrl {\n  target: any;\n  queryCtrl: any;\n  panelCtrl: any;\n  panel: any;\n  hasTextEditMode: boolean;\n\n  constructor() {\n    this.panelCtrl = this.queryCtrl.panelCtrl;\n    this.target = this.queryCtrl.target;\n    this.panel = this.panelCtrl.panel;\n\n    if (this.hasTextEditMode && this.queryCtrl.toggleEditorMode) {\n      // expose this function to react parent component\n      this.panelCtrl.toggleEditorMode = this.queryCtrl.toggleEditorMode.bind(this.queryCtrl);\n    }\n\n    if (this.queryCtrl.getCollapsedText) {\n      // expose this function to react parent component\n      this.panelCtrl.getCollapsedText = this.queryCtrl.getCollapsedText.bind(this.queryCtrl);\n    }\n  }\n}\n\n/** @ngInject */\nfunction queryEditorRowDirective() {\n  return {\n    restrict: 'E',\n    controller: QueryRowCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    templateUrl: 'public/app/features/panel/partials/query_editor_row.html',\n    transclude: true,\n    scope: {\n      queryCtrl: '=',\n      canCollapse: '=',\n      hasTextEditMode: '=',\n    },\n  };\n}\n\nmodule.directive('queryEditorRow', queryEditorRowDirective);\n","import { coreModule } from 'app/core/core';\nimport { VariableSrv } from 'app/features/templating/variable_srv';\nimport { getConfig } from '../../core/config';\nimport { getVariables } from '../variables/state/selectors';\n\nconst template = `\n<div class=\"gf-form-select-wrapper max-width-18\">\n  <select class=\"gf-form-input\" ng-model=\"panel.repeat\" ng-options=\"f.value as f.text for f in variables\" ng-change=\"optionChanged()\">\n  <option value=\"\"></option>\n</div>\n`;\n\n/** @ngInject */\nfunction dashRepeatOptionDirective(variableSrv: VariableSrv) {\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      panel: '=',\n    },\n    link: (scope: any, element: JQuery) => {\n      element.css({ display: 'block', width: '100%' });\n\n      if (getConfig().featureToggles.newVariables) {\n        scope.variables = getVariables().map((item: any) => {\n          return { text: item.name, value: item.name };\n        });\n      }\n\n      if (!getConfig().featureToggles.newVariables) {\n        scope.variables = variableSrv.variables.map((item: any) => {\n          return { text: item.name, value: item.name };\n        });\n      }\n\n      if (scope.variables.length === 0) {\n        scope.variables.unshift({\n          text: 'No template variables found',\n          value: null,\n        });\n      }\n\n      scope.variables.unshift({ text: 'Disabled', value: null });\n\n      // if repeat is set and no direction set to horizontal\n      if (scope.panel.repeat && !scope.panel.repeatDirection) {\n        scope.panel.repeatDirection = 'h';\n      }\n\n      scope.optionChanged = () => {\n        if (scope.panel.repeat) {\n          scope.panel.repeatDirection = 'h';\n        }\n      };\n    },\n  };\n}\n\ncoreModule.directive('dashRepeatOption', dashRepeatOptionDirective);\n","import angular from 'angular';\nimport _ from 'lodash';\nimport './link_srv';\nimport { backendSrv } from 'app/core/services/backend_srv';\n\nfunction panelLinksEditor() {\n  return {\n    scope: {\n      panel: '=',\n    },\n    restrict: 'E',\n    controller: 'PanelLinksEditorCtrl',\n    templateUrl: 'public/app/features/panel/panellinks/module.html',\n    link: () => {},\n  };\n}\n\nexport class PanelLinksEditorCtrl {\n  /** @ngInject */\n  constructor($scope: any) {\n    $scope.panel.links = $scope.panel.links || [];\n\n    $scope.addLink = () => {\n      $scope.panel.links.push({\n        type: 'dashboard',\n      });\n    };\n\n    $scope.searchDashboards = (queryStr: string, callback: Function) => {\n      backendSrv.search({ query: queryStr }).then(hits => {\n        const dashboards = _.map(hits, dash => {\n          return dash.title;\n        });\n\n        callback(dashboards);\n      });\n    };\n\n    $scope.dashboardChanged = (link: any) => {\n      backendSrv.search({ query: link.dashboard }).then(hits => {\n        const dashboard: any = _.find(hits, { title: link.dashboard });\n        if (dashboard) {\n          if (dashboard.url) {\n            link.url = dashboard.url;\n          } else {\n            // To support legacy url's\n            link.dashUri = dashboard.uri;\n          }\n          link.title = dashboard.title;\n        }\n      });\n    };\n\n    $scope.deleteLink = (link: any) => {\n      $scope.panel.links = _.without($scope.panel.links, link);\n    };\n  }\n}\n\nangular\n  .module('grafana.directives')\n  .directive('panelLinksEditor', panelLinksEditor)\n  .controller('PanelLinksEditorCtrl', PanelLinksEditorCtrl);\n","import angular from 'angular';\nimport config from 'app/core/config';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nexport class SelectOrgCtrl {\n  /** @ngInject */\n  constructor($scope: any, contextSrv: any) {\n    contextSrv.sidemenu = false;\n\n    $scope.navModel = {\n      main: {\n        icon: 'grafana',\n        subTitle: 'Preferences',\n        text: 'Select active organization',\n      },\n    };\n\n    $scope.init = () => {\n      $scope.getUserOrgs();\n    };\n\n    $scope.getUserOrgs = () => {\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .get('/api/user/orgs')\n          .then((orgs: any) => {\n            $scope.orgs = orgs;\n          })\n      );\n    };\n\n    $scope.setUsingOrg = (org: any) => {\n      getBackendSrv()\n        .post('/api/user/using/' + org.orgId)\n        .then(() => {\n          window.location.href = config.appSubUrl + '/';\n        });\n    };\n\n    $scope.init();\n  }\n}\n\nangular.module('grafana.controllers').controller('SelectOrgCtrl', SelectOrgCtrl);\n","import _ from 'lodash';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { NavModelSrv } from 'app/core/core';\nimport { User } from 'app/core/services/context_srv';\nimport { UserSession, Scope, CoreEvents, AppEventEmitter } from 'app/types';\nimport { dateTimeFormatTimeAgo, dateTimeFormat } from '@grafana/data';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nexport default class AdminEditUserCtrl {\n  /** @ngInject */\n  constructor($scope: Scope & AppEventEmitter, $routeParams: any, $location: any, navModelSrv: NavModelSrv) {\n    $scope.user = {};\n    $scope.sessions = [];\n    $scope.newOrg = { name: '', role: 'Editor' };\n    $scope.permissions = {};\n    $scope.navModel = navModelSrv.getNav('admin', 'global-users', 0);\n\n    $scope.init = () => {\n      if ($routeParams.id) {\n        promiseToDigest($scope)(\n          Promise.all([\n            $scope.getUser($routeParams.id),\n            $scope.getUserSessions($routeParams.id),\n            $scope.getUserOrgs($routeParams.id),\n          ])\n        );\n      }\n    };\n\n    $scope.getUser = (id: number) => {\n      return getBackendSrv()\n        .get('/api/users/' + id)\n        .then((user: User) => {\n          $scope.user = user;\n          $scope.user_id = id;\n          $scope.permissions.isGrafanaAdmin = user.isGrafanaAdmin;\n        });\n    };\n\n    $scope.getUserSessions = (id: number) => {\n      return getBackendSrv()\n        .get('/api/admin/users/' + id + '/auth-tokens')\n        .then((sessions: UserSession[]) => {\n          sessions.reverse();\n\n          $scope.sessions = sessions.map((session: UserSession) => {\n            return {\n              id: session.id,\n              isActive: session.isActive,\n              seenAt: dateTimeFormatTimeAgo(session.seenAt),\n              createdAt: dateTimeFormat(session.createdAt, { format: 'MMMM DD, YYYY' }),\n              clientIp: session.clientIp,\n              browser: session.browser,\n              browserVersion: session.browserVersion,\n              os: session.os,\n              osVersion: session.osVersion,\n              device: session.device,\n            };\n          });\n        });\n    };\n\n    $scope.revokeUserSession = (tokenId: number) => {\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .post('/api/admin/users/' + $scope.user_id + '/revoke-auth-token', {\n            authTokenId: tokenId,\n          })\n          .then(() => {\n            $scope.sessions = $scope.sessions.filter((session: UserSession) => {\n              if (session.id === tokenId) {\n                return false;\n              }\n              return true;\n            });\n          })\n      );\n    };\n\n    $scope.revokeAllUserSessions = (tokenId: number) => {\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .post('/api/admin/users/' + $scope.user_id + '/logout')\n          .then(() => {\n            $scope.sessions = [];\n          })\n      );\n    };\n\n    $scope.setPassword = () => {\n      if (!$scope.passwordForm.$valid) {\n        return;\n      }\n\n      const payload = { password: $scope.password };\n\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .put('/api/admin/users/' + $scope.user_id + '/password', payload)\n          .then(() => {\n            $location.path('/admin/users');\n          })\n      );\n    };\n\n    $scope.updatePermissions = () => {\n      const payload = $scope.permissions;\n      getBackendSrv().put('/api/admin/users/' + $scope.user_id + '/permissions', payload);\n    };\n\n    $scope.getUserOrgs = (id: number) => {\n      return getBackendSrv()\n        .get('/api/users/' + id + '/orgs')\n        .then((orgs: any) => {\n          $scope.orgs = orgs;\n        });\n    };\n\n    $scope.update = () => {\n      if (!$scope.userForm.$valid) {\n        return;\n      }\n\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .put('/api/users/' + $scope.user_id, $scope.user)\n          .then(() => {\n            $location.path('/admin/users');\n          })\n      );\n    };\n\n    $scope.updateOrgUser = (orgUser: { orgId: string }) => {\n      promiseToDigest($scope)(\n        getBackendSrv().patch('/api/orgs/' + orgUser.orgId + '/users/' + $scope.user_id, orgUser)\n      );\n    };\n\n    $scope.removeOrgUser = (orgUser: { orgId: string }) => {\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .delete('/api/orgs/' + orgUser.orgId + '/users/' + $scope.user_id)\n          .then(() => Promise.all([$scope.getUser($scope.user_id), $scope.getUserOrgs($scope.user_id)]))\n      );\n    };\n\n    $scope.orgsSearchCache = [];\n\n    $scope.searchOrgs = (queryStr: any, callback: any) => {\n      if ($scope.orgsSearchCache.length > 0) {\n        callback(_.map($scope.orgsSearchCache, 'name'));\n        return;\n      }\n\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .get('/api/orgs', { query: '' })\n          .then((result: any) => {\n            $scope.orgsSearchCache = result;\n            callback(_.map(result, 'name'));\n          })\n      );\n    };\n\n    $scope.addOrgUser = () => {\n      if (!$scope.addOrgForm.$valid) {\n        return;\n      }\n\n      const orgInfo: any = _.find($scope.orgsSearchCache, {\n        name: $scope.newOrg.name,\n      });\n\n      if (!orgInfo) {\n        return;\n      }\n\n      $scope.newOrg.loginOrEmail = $scope.user.login;\n\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .post('/api/orgs/' + orgInfo.id + '/users/', $scope.newOrg)\n          .then(() => Promise.all([$scope.getUser($scope.user_id), $scope.getUserOrgs($scope.user_id)]))\n      );\n    };\n\n    $scope.deleteUser = (user: any) => {\n      $scope.appEvent(CoreEvents.showConfirmModal, {\n        title: 'Delete',\n        text: 'Do you want to delete ' + user.login + '?',\n        icon: 'trash-alt',\n        yesText: 'Delete',\n        onConfirm: () => {\n          promiseToDigest($scope)(\n            getBackendSrv()\n              .delete('/api/admin/users/' + user.id)\n              .then(() => {\n                $location.path('/admin/users');\n              })\n          );\n        },\n      });\n    };\n\n    $scope.disableUser = (event: any) => {\n      const user = $scope.user;\n\n      // External user can not be disabled\n      if (user.isExternal) {\n        event.preventDefault();\n        event.stopPropagation();\n        return;\n      }\n\n      const actionEndpoint = user.isDisabled ? '/enable' : '/disable';\n\n      getBackendSrv()\n        .post('/api/admin/users/' + user.id + actionEndpoint)\n        .then(() => $scope.init());\n    };\n\n    $scope.init();\n  }\n}\n","import { getBackendSrv } from '@grafana/runtime';\nimport { NavModelSrv } from 'app/core/core';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\n\nexport default class AdminEditOrgCtrl {\n  /** @ngInject */\n  constructor($scope: any, $routeParams: any, $location: any, navModelSrv: NavModelSrv) {\n    $scope.init = () => {\n      $scope.navModel = navModelSrv.getNav('admin', 'global-orgs', 0);\n\n      if ($routeParams.id) {\n        promiseToDigest($scope)(Promise.all([$scope.getOrg($routeParams.id), $scope.getOrgUsers($routeParams.id)]));\n      }\n    };\n\n    $scope.getOrg = (id: number) => {\n      return getBackendSrv()\n        .get('/api/orgs/' + id)\n        .then((org: any) => {\n          $scope.org = org;\n        });\n    };\n\n    $scope.getOrgUsers = (id: number) => {\n      return getBackendSrv()\n        .get('/api/orgs/' + id + '/users')\n        .then((orgUsers: any) => {\n          $scope.orgUsers = orgUsers;\n        });\n    };\n\n    $scope.update = () => {\n      if (!$scope.orgDetailsForm.$valid) {\n        return;\n      }\n\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .put('/api/orgs/' + $scope.org.id, $scope.org)\n          .then(() => {\n            $location.path('/admin/orgs');\n          })\n      );\n    };\n\n    $scope.updateOrgUser = (orgUser: any) => {\n      getBackendSrv().patch('/api/orgs/' + orgUser.orgId + '/users/' + orgUser.userId, orgUser);\n    };\n\n    $scope.removeOrgUser = (orgUser: any) => {\n      promiseToDigest($scope)(\n        getBackendSrv()\n          .delete('/api/orgs/' + orgUser.orgId + '/users/' + orgUser.userId)\n          .then(() => $scope.getOrgUsers($scope.org.id))\n      );\n    };\n\n    $scope.init();\n  }\n}\n","import AdminEditUserCtrl from './AdminEditUserCtrl';\nimport AdminEditOrgCtrl from './AdminEditOrgCtrl';\n\nimport coreModule from 'app/core/core_module';\nimport { NavModelSrv } from 'app/core/core';\n\nclass AdminHomeCtrl {\n  navModel: any;\n\n  /** @ngInject */\n  constructor(navModelSrv: NavModelSrv) {\n    this.navModel = navModelSrv.getNav('admin');\n  }\n}\n\ncoreModule.controller('AdminEditUserCtrl', AdminEditUserCtrl);\ncoreModule.controller('AdminEditOrgCtrl', AdminEditOrgCtrl);\ncoreModule.controller('AdminHomeCtrl', AdminHomeCtrl);\n","import _ from 'lodash';\nimport { appEvents, coreModule, NavModelSrv } from 'app/core/core';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { AppEvents } from '@grafana/data';\nimport { IScope } from 'angular';\nimport { promiseToDigest } from '../../core/utils/promiseToDigest';\nimport config from 'app/core/config';\nimport { CoreEvents } from 'app/types';\n\nexport class AlertNotificationEditCtrl {\n  theForm: any;\n  navModel: any;\n  testSeverity = 'critical';\n  notifiers: any;\n  notifierTemplateId: string;\n  isNew: boolean;\n  model: any;\n  defaults: any = {\n    type: 'email',\n    sendReminder: false,\n    disableResolveMessage: false,\n    frequency: '15m',\n    settings: {\n      httpMethod: 'POST',\n      autoResolve: true,\n      severity: 'critical',\n      uploadImage: true,\n    },\n    isDefault: false,\n  };\n  getFrequencySuggestion: any;\n  rendererAvailable: boolean;\n\n  /** @ngInject */\n  constructor(\n    private $scope: IScope,\n    private $routeParams: any,\n    private $location: any,\n    private $templateCache: any,\n    navModelSrv: NavModelSrv\n  ) {\n    this.navModel = navModelSrv.getNav('alerting', 'channels', 0);\n    this.isNew = !this.$routeParams.id;\n\n    this.getFrequencySuggestion = () => {\n      return ['1m', '5m', '10m', '15m', '30m', '1h'];\n    };\n\n    this.defaults.settings.uploadImage = config.rendererAvailable;\n    this.rendererAvailable = config.rendererAvailable;\n\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get(`/api/alert-notifiers`)\n        .then((notifiers: any) => {\n          this.notifiers = notifiers;\n\n          // add option templates\n          for (const notifier of this.notifiers) {\n            this.$templateCache.put(this.getNotifierTemplateId(notifier.type), notifier.optionsTemplate);\n          }\n\n          if (!this.$routeParams.id) {\n            this.navModel.breadcrumbs.push({ text: 'New channel' });\n            this.navModel.node = { text: 'New channel' };\n            return _.defaults(this.model, this.defaults);\n          }\n\n          return getBackendSrv()\n            .get(`/api/alert-notifications/${this.$routeParams.id}`)\n            .then((result: any) => {\n              this.navModel.breadcrumbs.push({ text: result.name });\n              this.navModel.node = { text: result.name };\n              result.settings = _.defaults(result.settings, this.defaults.settings);\n              return result;\n            });\n        })\n        .then((model: any) => {\n          this.model = model;\n          this.notifierTemplateId = this.getNotifierTemplateId(this.model.type);\n        })\n    );\n  }\n\n  save() {\n    if (!this.theForm.$valid) {\n      return;\n    }\n\n    if (this.model.id) {\n      promiseToDigest(this.$scope)(\n        getBackendSrv()\n          .put(`/api/alert-notifications/${this.model.id}`, this.model)\n          .then((res: any) => {\n            this.model = res;\n            appEvents.emit(AppEvents.alertSuccess, ['Notification updated']);\n          })\n          .catch((err: any) => {\n            if (err.data && err.data.error) {\n              appEvents.emit(AppEvents.alertError, [err.data.error]);\n            }\n          })\n      );\n    } else {\n      promiseToDigest(this.$scope)(\n        getBackendSrv()\n          .post(`/api/alert-notifications`, this.model)\n          .then((res: any) => {\n            appEvents.emit(AppEvents.alertSuccess, ['Notification created']);\n            this.$location.path('alerting/notifications');\n          })\n          .catch((err: any) => {\n            if (err.data && err.data.error) {\n              appEvents.emit(AppEvents.alertError, [err.data.error]);\n            }\n          })\n      );\n    }\n  }\n\n  deleteNotification() {\n    appEvents.emit(CoreEvents.showConfirmModal, {\n      title: 'Delete',\n      text: 'Do you want to delete this notification channel?',\n      text2: `Deleting this notification channel will not delete from alerts any references to it`,\n      icon: 'trash-alt',\n      confirmText: 'Delete',\n      yesText: 'Delete',\n      onConfirm: () => {\n        this.deleteNotificationConfirmed();\n      },\n    });\n  }\n\n  deleteNotificationConfirmed() {\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .delete(`/api/alert-notifications/${this.model.id}`)\n        .then((res: any) => {\n          this.model = res;\n          this.$location.path('alerting/notifications');\n        })\n    );\n  }\n\n  getNotifierTemplateId(type: string) {\n    return `notifier-options-${type}`;\n  }\n\n  typeChanged() {\n    this.model.settings = _.defaults({}, this.defaults.settings);\n    this.notifierTemplateId = this.getNotifierTemplateId(this.model.type);\n  }\n\n  testNotification() {\n    if (!this.theForm.$valid) {\n      return;\n    }\n\n    const payload = {\n      name: this.model.name,\n      type: this.model.type,\n      frequency: this.model.frequency,\n      settings: this.model.settings,\n    };\n\n    promiseToDigest(this.$scope)(getBackendSrv().post(`/api/alert-notifications/test`, payload));\n  }\n}\n\ncoreModule.controller('AlertNotificationEditCtrl', AlertNotificationEditCtrl);\n","import coreModule from 'app/core/core_module';\nimport appEvents from 'app/core/app_events';\nimport angular, { ILocationService } from 'angular';\nimport { AppEvents } from '@grafana/data';\n\nconst template = `\n<input type=\"file\" id=\"dashupload\" name=\"dashupload\" class=\"hide\" onchange=\"angular.element(this).scope().file_selected\"/>\n<label class=\"btn btn-primary\" for=\"dashupload\">\n  {{btnText}}\n</label>\n`;\n\n/** @ngInject */\nexport function uploadDashboardDirective(timer: any, $location: ILocationService) {\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      onUpload: '&',\n      btnText: '@?',\n    },\n    link: (scope: any, elem: JQuery) => {\n      scope.btnText = angular.isDefined(scope.btnText) ? scope.btnText : 'Upload .json file';\n\n      function file_selected(evt: any) {\n        const files = evt.target.files; // FileList object\n        const readerOnload = () => {\n          return (e: any) => {\n            let dash: any;\n            try {\n              dash = JSON.parse(e.target.result);\n            } catch (err) {\n              console.log(err);\n              appEvents.emit(AppEvents.alertError, [\n                'Import failed',\n                'JSON -> JS Serialization failed: ' + err.message,\n              ]);\n              return;\n            }\n\n            scope.$apply(() => {\n              scope.onUpload({ dash });\n            });\n          };\n        };\n\n        let i = 0;\n        let file = files[i];\n\n        while (file) {\n          const reader = new FileReader();\n          reader.onload = readerOnload();\n          reader.readAsText(file);\n          i += 1;\n          file = files[i];\n        }\n      }\n\n      const wnd: any = window;\n      // Check for the various File API support.\n      if (wnd.File && wnd.FileReader && wnd.FileList && wnd.Blob) {\n        // Something\n        elem[0].addEventListener('change', file_selected, false);\n      } else {\n        appEvents.emit(AppEvents.alertError, ['Oops', 'The HTML5 File APIs are not fully supported in this browser']);\n      }\n    },\n  };\n}\n\ncoreModule.directive('dashUpload', uploadDashboardDirective);\n","import { coreModule, NavModelSrv } from 'app/core/core';\nimport { dateTimeFormat, dateTimeFormatTimeAgo } from '@grafana/data';\nimport { UserSession } from 'app/types';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { promiseToDigest } from 'app/core/utils/promiseToDigest';\nimport { IScope } from 'angular';\n\nexport class ProfileCtrl {\n  sessions: object[] = [];\n  navModel: any;\n\n  /** @ngInject */\n  constructor(private $scope: IScope, navModelSrv: NavModelSrv) {\n    this.getUserSessions();\n    this.navModel = navModelSrv.getNav('profile', 'profile-settings', 0);\n  }\n\n  getUserSessions() {\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .get('/api/user/auth-tokens')\n        .then((sessions: UserSession[]) => {\n          sessions.reverse();\n\n          const found = sessions.findIndex((session: UserSession) => {\n            return session.isActive;\n          });\n\n          if (found) {\n            const now = sessions[found];\n            sessions.splice(found, found);\n            sessions.unshift(now);\n          }\n\n          this.sessions = sessions.map((session: UserSession) => {\n            return {\n              id: session.id,\n              isActive: session.isActive,\n              seenAt: dateTimeFormatTimeAgo(session.seenAt),\n              createdAt: dateTimeFormat(session.createdAt, { format: 'MMMM DD, YYYY' }),\n              clientIp: session.clientIp,\n              browser: session.browser,\n              browserVersion: session.browserVersion,\n              os: session.os,\n              osVersion: session.osVersion,\n              device: session.device,\n            };\n          });\n        })\n    );\n  }\n\n  revokeUserSession(tokenId: number) {\n    promiseToDigest(this.$scope)(\n      getBackendSrv()\n        .post('/api/user/revoke-auth-token', {\n          authTokenId: tokenId,\n        })\n        .then(() => {\n          this.sessions = this.sessions.filter((session: UserSession) => {\n            if (session.id === tokenId) {\n              return false;\n            }\n            return true;\n          });\n        })\n    );\n  }\n}\n\ncoreModule.controller('ProfileCtrl', ProfileCtrl);\n","import { coreModule } from 'app/core/core';\n\ncoreModule.directive('datasourceHttpSettings', () => {\n  return {\n    scope: {\n      current: '=',\n      suggestUrl: '@',\n      noDirectAccess: '@',\n    },\n    templateUrl: 'public/app/features/datasources/partials/http_settings_next.html',\n    link: {\n      pre: ($scope: any) => {\n        // do not show access option if direct access is disabled\n        $scope.showAccessOption = $scope.noDirectAccess !== 'true';\n        $scope.onChange = (datasourceSetting: any) => {\n          $scope.current = datasourceSetting;\n        };\n      },\n    },\n  };\n});\n","import { coreModule } from 'app/core/core';\n\ncoreModule.directive('datasourceTlsAuthSettings', () => {\n  return {\n    scope: {\n      current: '=',\n    },\n    templateUrl: 'public/app/features/datasources/partials/tls_auth_settings.html',\n  };\n});\n","import React from 'react';\nimport { StatsPicker } from '@grafana/ui';\nimport {\n  DataTransformerID,\n  ReducerID,\n  standardTransformers,\n  TransformerRegistyItem,\n  TransformerUIProps,\n} from '@grafana/data';\n\nimport { ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce';\nimport { selectors } from '@grafana/e2e-selectors';\n\n// TODO:  Minimal implementation, needs some <3\nexport const ReduceTransformerEditor: React.FC<TransformerUIProps<ReduceTransformerOptions>> = ({\n  options,\n  onChange,\n}) => {\n  return (\n    <div className=\"gf-form-inline\">\n      <div className=\"gf-form gf-form--grow\">\n        <div className=\"gf-form-label width-8\" aria-label={selectors.components.Transforms.Reduce.calculationsLabel}>\n          Calculations\n        </div>\n        <StatsPicker\n          className=\"flex-grow-1\"\n          placeholder=\"Choose Stat\"\n          allowMultiple\n          stats={options.reducers || []}\n          onChange={stats => {\n            onChange({\n              ...options,\n              reducers: stats as ReducerID[],\n            });\n          }}\n          menuPlacement=\"bottom\"\n        />\n      </div>\n    </div>\n  );\n};\n\nexport const reduceTransformRegistryItem: TransformerRegistyItem<ReduceTransformerOptions> = {\n  id: DataTransformerID.reduce,\n  editor: ReduceTransformerEditor,\n  transformation: standardTransformers.reduceTransformer,\n  name: standardTransformers.reduceTransformer.name,\n  description: standardTransformers.reduceTransformer.description,\n};\n","import React from 'react';\nimport {\n  DataTransformerID,\n  KeyValue,\n  standardTransformers,\n  TransformerRegistyItem,\n  TransformerUIProps,\n  getFieldDisplayName,\n  stringToJsRegex,\n} from '@grafana/data';\nimport { Field, Input, FilterPill, HorizontalGroup } from '@grafana/ui';\nimport { css } from 'emotion';\nimport { FilterFieldsByNameTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByName';\n\ninterface FilterByNameTransformerEditorProps extends TransformerUIProps<FilterFieldsByNameTransformerOptions> {}\n\ninterface FilterByNameTransformerEditorState {\n  include: string[];\n  options: FieldNameInfo[];\n  selected: string[];\n  regex?: string;\n  isRegexValid?: boolean;\n}\n\ninterface FieldNameInfo {\n  name: string;\n  count: number;\n}\nexport class FilterByNameTransformerEditor extends React.PureComponent<\n  FilterByNameTransformerEditorProps,\n  FilterByNameTransformerEditorState\n> {\n  constructor(props: FilterByNameTransformerEditorProps) {\n    super(props);\n    this.state = {\n      include: props.options.include?.names || [],\n      regex: props.options.include?.pattern,\n      options: [],\n      selected: [],\n      isRegexValid: true,\n    };\n  }\n\n  componentDidMount() {\n    this.initOptions();\n  }\n\n  componentDidUpdate(oldProps: FilterByNameTransformerEditorProps) {\n    if (this.props.input !== oldProps.input) {\n      this.initOptions();\n    }\n  }\n\n  private initOptions() {\n    const { input, options } = this.props;\n    const configuredOptions = Array.from(options.include?.names ?? []);\n\n    const allNames: FieldNameInfo[] = [];\n    const byName: KeyValue<FieldNameInfo> = {};\n\n    for (const frame of input) {\n      for (const field of frame.fields) {\n        const displayName = getFieldDisplayName(field, frame, input);\n        let v = byName[displayName];\n\n        if (!v) {\n          v = byName[displayName] = {\n            name: displayName,\n            count: 0,\n          };\n          allNames.push(v);\n        }\n\n        v.count++;\n      }\n    }\n\n    if (options.include?.pattern) {\n      try {\n        const regex = stringToJsRegex(options.include.pattern);\n\n        for (const info of allNames) {\n          if (regex.test(info.name)) {\n            configuredOptions.push(info.name);\n          }\n        }\n      } catch (error) {\n        console.log(error);\n      }\n    }\n\n    if (configuredOptions.length) {\n      const selected: FieldNameInfo[] = allNames.filter(n => configuredOptions.includes(n.name));\n\n      this.setState({\n        options: allNames,\n        selected: selected.map(s => s.name),\n        regex: options.include?.pattern,\n      });\n    } else {\n      this.setState({\n        options: allNames,\n        selected: allNames.map(n => n.name),\n        regex: options.include?.pattern,\n      });\n    }\n  }\n\n  onFieldToggle = (fieldName: string) => {\n    const { selected } = this.state;\n    if (selected.indexOf(fieldName) > -1) {\n      this.onChange(selected.filter(s => s !== fieldName));\n    } else {\n      this.onChange([...selected, fieldName]);\n    }\n  };\n\n  onChange = (selected: string[]) => {\n    const { regex, isRegexValid } = this.state;\n    const options: FilterFieldsByNameTransformerOptions = {\n      ...this.props.options,\n      include: { names: selected },\n    };\n\n    if (regex && isRegexValid) {\n      options.include = options.include ?? {};\n      options.include.pattern = regex;\n    }\n\n    this.setState({ selected }, () => {\n      this.props.onChange(options);\n    });\n  };\n\n  onInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n    const { selected, regex } = this.state;\n    let isRegexValid = true;\n\n    try {\n      if (regex) {\n        stringToJsRegex(regex);\n      }\n    } catch (e) {\n      isRegexValid = false;\n    }\n\n    if (isRegexValid) {\n      this.props.onChange({\n        ...this.props.options,\n        include: { pattern: regex },\n      });\n    } else {\n      this.props.onChange({\n        ...this.props.options,\n        include: { names: selected },\n      });\n    }\n\n    this.setState({ isRegexValid });\n  };\n\n  render() {\n    const { options, selected, isRegexValid } = this.state;\n    return (\n      <div className=\"gf-form-inline\">\n        <div className=\"gf-form gf-form--grow\">\n          <div className=\"gf-form-label width-8\">Identifier</div>\n          <HorizontalGroup spacing=\"xs\" align=\"flex-start\" wrap>\n            <Field\n              invalid={!isRegexValid}\n              error={!isRegexValid ? 'Invalid pattern' : undefined}\n              className={css`\n                margin-bottom: 0;\n              `}\n            >\n              <Input\n                placeholder=\"Regular expression pattern\"\n                value={this.state.regex || ''}\n                onChange={e => this.setState({ regex: e.currentTarget.value })}\n                onBlur={this.onInputBlur}\n                width={25}\n              />\n            </Field>\n            {options.map((o, i) => {\n              const label = `${o.name}${o.count > 1 ? ' (' + o.count + ')' : ''}`;\n              const isSelected = selected.indexOf(o.name) > -1;\n              return (\n                <FilterPill\n                  key={`${o.name}/${i}`}\n                  onClick={() => {\n                    this.onFieldToggle(o.name);\n                  }}\n                  label={label}\n                  selected={isSelected}\n                />\n              );\n            })}\n          </HorizontalGroup>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport const filterFieldsByNameTransformRegistryItem: TransformerRegistyItem<FilterFieldsByNameTransformerOptions> = {\n  id: DataTransformerID.filterFieldsByName,\n  editor: FilterByNameTransformerEditor,\n  transformation: standardTransformers.filterFieldsByNameTransformer,\n  name: 'Filter by name',\n  description: 'Removes part of the query results using a regex pattern. The pattern can be inclusive or exclusive.',\n};\n","import React from 'react';\nimport {\n  DataTransformerID,\n  KeyValue,\n  standardTransformers,\n  TransformerRegistyItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { HorizontalGroup, FilterPill } from '@grafana/ui';\n\nimport { FilterFramesByRefIdTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByRefId';\n\ninterface FilterByRefIdTransformerEditorProps extends TransformerUIProps<FilterFramesByRefIdTransformerOptions> {}\n\ninterface FilterByRefIdTransformerEditorState {\n  include: string;\n  options: RefIdInfo[];\n  selected: string[];\n}\n\ninterface RefIdInfo {\n  refId: string;\n  count: number;\n}\nexport class FilterByRefIdTransformerEditor extends React.PureComponent<\n  FilterByRefIdTransformerEditorProps,\n  FilterByRefIdTransformerEditorState\n> {\n  constructor(props: FilterByRefIdTransformerEditorProps) {\n    super(props);\n    this.state = {\n      include: props.options.include || '',\n      options: [],\n      selected: [],\n    };\n  }\n\n  componentDidMount() {\n    this.initOptions();\n  }\n\n  componentDidUpdate(oldProps: FilterByRefIdTransformerEditorProps) {\n    if (this.props.input !== oldProps.input) {\n      this.initOptions();\n    }\n  }\n\n  private initOptions() {\n    const { input, options } = this.props;\n    const configuredOptions = options.include ? options.include.split('|') : [];\n\n    const allNames: RefIdInfo[] = [];\n    const byName: KeyValue<RefIdInfo> = {};\n    for (const frame of input) {\n      if (frame.refId) {\n        let v = byName[frame.refId];\n        if (!v) {\n          v = byName[frame.refId] = {\n            refId: frame.refId,\n            count: 0,\n          };\n          allNames.push(v);\n        }\n        v.count++;\n      }\n    }\n\n    if (configuredOptions.length) {\n      const options: RefIdInfo[] = [];\n      const selected: RefIdInfo[] = [];\n      for (const v of allNames) {\n        if (configuredOptions.includes(v.refId)) {\n          selected.push(v);\n        }\n        options.push(v);\n      }\n\n      this.setState({\n        options,\n        selected: selected.map(s => s.refId),\n      });\n    } else {\n      this.setState({ options: allNames, selected: [] });\n    }\n  }\n\n  onFieldToggle = (fieldName: string) => {\n    const { selected } = this.state;\n    if (selected.indexOf(fieldName) > -1) {\n      this.onChange(selected.filter(s => s !== fieldName));\n    } else {\n      this.onChange([...selected, fieldName]);\n    }\n  };\n\n  onChange = (selected: string[]) => {\n    this.setState({ selected });\n    this.props.onChange({\n      ...this.props.options,\n      include: selected.join('|'),\n    });\n  };\n\n  render() {\n    const { options, selected } = this.state;\n    return (\n      <div className=\"gf-form-inline\">\n        <div className=\"gf-form gf-form--grow\">\n          <div className=\"gf-form-label width-8\">Series refId</div>\n          <HorizontalGroup spacing=\"xs\" align=\"flex-start\" wrap>\n            {options.map((o, i) => {\n              const label = `${o.refId}${o.count > 1 ? ' (' + o.count + ')' : ''}`;\n              const isSelected = selected.indexOf(o.refId) > -1;\n              return (\n                <FilterPill\n                  key={`${o.refId}/${i}`}\n                  onClick={() => {\n                    this.onFieldToggle(o.refId);\n                  }}\n                  label={label}\n                  selected={isSelected}\n                />\n              );\n            })}\n          </HorizontalGroup>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport const filterFramesByRefIdTransformRegistryItem: TransformerRegistyItem<FilterFramesByRefIdTransformerOptions> = {\n  id: DataTransformerID.filterByRefId,\n  editor: FilterByRefIdTransformerEditor,\n  transformation: standardTransformers.filterFramesByRefIdTransformer,\n  name: 'Filter data by query',\n  description:\n    'Filter data by query. This is useful if you are sharing the results from a different panel that has many queries and you want to only visualize a subset of that in this panel.',\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { css, cx } from 'emotion';\nimport { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd';\nimport {\n  DataFrame,\n  DataTransformerID,\n  GrafanaTheme,\n  standardTransformers,\n  TransformerRegistyItem,\n  TransformerUIProps,\n  getFieldDisplayName,\n} from '@grafana/data';\nimport { stylesFactory, useTheme, Input, IconButton } from '@grafana/ui';\n\nimport { OrganizeFieldsTransformerOptions } from '@grafana/data/src/transformations/transformers/organize';\nimport { createOrderFieldsComparer } from '@grafana/data/src/transformations/transformers/order';\n\ninterface OrganizeFieldsTransformerEditorProps extends TransformerUIProps<OrganizeFieldsTransformerOptions> {}\n\nconst OrganizeFieldsTransformerEditor: React.FC<OrganizeFieldsTransformerEditorProps> = props => {\n  const { options, input, onChange } = props;\n  const { indexByName, excludeByName, renameByName } = options;\n\n  const fieldNames = useMemo(() => getAllFieldNamesFromDataFrames(input), [input]);\n  const orderedFieldNames = useMemo(() => orderFieldNamesByIndex(fieldNames, indexByName), [fieldNames, indexByName]);\n\n  const onToggleVisibility = useCallback(\n    (field: string, shouldExclude: boolean) => {\n      onChange({\n        ...options,\n        excludeByName: {\n          ...excludeByName,\n          [field]: shouldExclude,\n        },\n      });\n    },\n    [onChange, excludeByName, indexByName]\n  );\n\n  const onDragEnd = useCallback(\n    (result: DropResult) => {\n      if (!result || !result.destination) {\n        return;\n      }\n\n      const startIndex = result.source.index;\n      const endIndex = result.destination.index;\n\n      if (startIndex === endIndex) {\n        return;\n      }\n\n      onChange({\n        ...options,\n        indexByName: reorderToIndex(fieldNames, startIndex, endIndex),\n      });\n    },\n    [onChange, indexByName, excludeByName, fieldNames]\n  );\n\n  const onRenameField = useCallback(\n    (from: string, to: string) => {\n      onChange({\n        ...options,\n        renameByName: {\n          ...options.renameByName,\n          [from]: to,\n        },\n      });\n    },\n    [onChange, fieldNames, renameByName]\n  );\n\n  // Show warning that we only apply the first frame\n  if (input.length > 1) {\n    return <div>Organize fields only works with a single frame. Consider applying a join transformation first.</div>;\n  }\n\n  return (\n    <DragDropContext onDragEnd={onDragEnd}>\n      <Droppable droppableId=\"sortable-fields-transformer\" direction=\"vertical\">\n        {provided => (\n          <div ref={provided.innerRef} {...provided.droppableProps}>\n            {orderedFieldNames.map((fieldName, index) => {\n              return (\n                <DraggableFieldName\n                  fieldName={fieldName}\n                  renamedFieldName={renameByName[fieldName]}\n                  index={index}\n                  onToggleVisibility={onToggleVisibility}\n                  onRenameField={onRenameField}\n                  visible={!excludeByName[fieldName]}\n                  key={fieldName}\n                />\n              );\n            })}\n            {provided.placeholder}\n          </div>\n        )}\n      </Droppable>\n    </DragDropContext>\n  );\n};\n\nOrganizeFieldsTransformerEditor.displayName = 'OrganizeFieldsTransformerEditor';\n\ninterface DraggableFieldProps {\n  fieldName: string;\n  renamedFieldName?: string;\n  index: number;\n  visible: boolean;\n  onToggleVisibility: (fieldName: string, isVisible: boolean) => void;\n  onRenameField: (from: string, to: string) => void;\n}\n\nconst DraggableFieldName: React.FC<DraggableFieldProps> = ({\n  fieldName,\n  renamedFieldName,\n  index,\n  visible,\n  onToggleVisibility,\n  onRenameField,\n}) => {\n  const theme = useTheme();\n  const styles = getFieldNameStyles(theme);\n\n  return (\n    <Draggable draggableId={fieldName} index={index}>\n      {provided => (\n        <div\n          className=\"gf-form-inline\"\n          ref={provided.innerRef}\n          {...provided.draggableProps}\n          {...provided.dragHandleProps}\n        >\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label gf-form-label--justify-left width-30\">\n              <i className={cx('fa fa-ellipsis-v', styles.draggable)} />\n              <IconButton\n                className={styles.toggle}\n                size=\"md\"\n                name={visible ? 'eye' : 'eye-slash'}\n                surface=\"header\"\n                onClick={() => onToggleVisibility(fieldName, visible)}\n              />\n              <span className={styles.name} title={fieldName}>\n                {fieldName}\n              </span>\n            </div>\n            <Input\n              className=\"flex-grow-1\"\n              defaultValue={renamedFieldName || ''}\n              placeholder={`Rename ${fieldName}`}\n              onBlur={event => onRenameField(fieldName, event.currentTarget.value)}\n            />\n          </div>\n        </div>\n      )}\n    </Draggable>\n  );\n};\n\nDraggableFieldName.displayName = 'DraggableFieldName';\n\nconst getFieldNameStyles = stylesFactory((theme: GrafanaTheme) => ({\n  toggle: css`\n    margin: 0 8px;\n    color: ${theme.colors.textWeak};\n  `,\n  draggable: css`\n    padding: 0 ${theme.spacing.xs};\n    font-size: ${theme.typography.size.md};\n    opacity: 0.4;\n    &:hover {\n      color: ${theme.colors.textStrong};\n    }\n  `,\n  name: css`\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    font-size: ${theme.typography.size.sm};\n    font-weight: ${theme.typography.weight.semibold};\n  `,\n}));\n\nconst reorderToIndex = (fieldNames: string[], startIndex: number, endIndex: number) => {\n  const result = Array.from(fieldNames);\n  const [removed] = result.splice(startIndex, 1);\n  result.splice(endIndex, 0, removed);\n\n  return result.reduce((nameByIndex, fieldName, index) => {\n    nameByIndex[fieldName] = index;\n    return nameByIndex;\n  }, {} as Record<string, number>);\n};\n\nconst orderFieldNamesByIndex = (fieldNames: string[], indexByName: Record<string, number> = {}): string[] => {\n  if (!indexByName || Object.keys(indexByName).length === 0) {\n    return fieldNames;\n  }\n  const comparer = createOrderFieldsComparer(indexByName);\n  return fieldNames.sort(comparer);\n};\n\nexport const getAllFieldNamesFromDataFrames = (input: DataFrame[]): string[] => {\n  if (!Array.isArray(input)) {\n    return [] as string[];\n  }\n\n  return Object.keys(\n    input.reduce((names, frame) => {\n      if (!frame || !Array.isArray(frame.fields)) {\n        return names;\n      }\n\n      return frame.fields.reduce((names, field) => {\n        const t = getFieldDisplayName(field, frame, input);\n        names[t] = true;\n        return names;\n      }, names);\n    }, {} as Record<string, boolean>)\n  );\n};\n\nexport const organizeFieldsTransformRegistryItem: TransformerRegistyItem<OrganizeFieldsTransformerOptions> = {\n  id: DataTransformerID.organize,\n  editor: OrganizeFieldsTransformerEditor,\n  transformation: standardTransformers.organizeFieldsTransformer,\n  name: 'Organize fields',\n  description:\n    \"Allows the user to re-order, hide, or rename fields / columns. Useful when data source doesn't allow overrides for visualizing data.\",\n};\n","import React, { useCallback, useMemo } from 'react';\nimport {\n  DataTransformerID,\n  SelectableValue,\n  standardTransformers,\n  TransformerRegistyItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { getAllFieldNamesFromDataFrames } from './OrganizeFieldsTransformerEditor';\nimport { Select } from '@grafana/ui';\n\nimport { SeriesToColumnsOptions } from '@grafana/data/src/transformations/transformers/seriesToColumns';\n\nexport const SeriesToFieldsTransformerEditor: React.FC<TransformerUIProps<SeriesToColumnsOptions>> = ({\n  input,\n  options,\n  onChange,\n}) => {\n  const fieldNames = useMemo(() => getAllFieldNamesFromDataFrames(input), [input]);\n  const fieldNameOptions = fieldNames.map((item: string) => ({ label: item, value: item }));\n\n  const onSelectField = useCallback(\n    (value: SelectableValue<string>) => {\n      onChange({\n        ...options,\n        byField: value.value,\n      });\n    },\n    [onChange, options]\n  );\n\n  return (\n    <div className=\"gf-form-inline\">\n      <div className=\"gf-form gf-form--grow\">\n        <div className=\"gf-form-label width-8\">Field name</div>\n        <Select\n          options={fieldNameOptions}\n          value={options.byField}\n          onChange={onSelectField}\n          isClearable\n          menuPlacement=\"bottom\"\n        />\n      </div>\n    </div>\n  );\n};\n\nexport const seriesToFieldsTransformerRegistryItem: TransformerRegistyItem<SeriesToColumnsOptions> = {\n  id: DataTransformerID.seriesToColumns,\n  editor: SeriesToFieldsTransformerEditor,\n  transformation: standardTransformers.seriesToColumnsTransformer,\n  name: 'Outer join',\n  description:\n    'Joins many time series/tables by a field. This can be used to outer join multiple time series on the _time_ field to show many time series in one table.',\n};\n","import React, { ChangeEvent } from 'react';\n\nimport {\n  DataTransformerID,\n  FieldType,\n  KeyValue,\n  ReducerID,\n  standardTransformers,\n  TransformerRegistyItem,\n  TransformerUIProps,\n  BinaryOperationID,\n  SelectableValue,\n  binaryOperators,\n  getFieldDisplayName,\n} from '@grafana/data';\nimport { Select, StatsPicker, LegacyForms, Input, FilterPill, HorizontalGroup } from '@grafana/ui';\nimport {\n  CalculateFieldTransformerOptions,\n  CalculateFieldMode,\n  getNameFromOptions,\n  ReduceOptions,\n  BinaryOptions,\n} from '@grafana/data/src/transformations/transformers/calculateField';\n\nimport defaults from 'lodash/defaults';\n\ninterface CalculateFieldTransformerEditorProps extends TransformerUIProps<CalculateFieldTransformerOptions> {}\n\ninterface CalculateFieldTransformerEditorState {\n  include: string[];\n  names: string[];\n  selected: string[];\n}\n\nconst calculationModes = [\n  { value: CalculateFieldMode.BinaryOperation, label: 'Binary operation' },\n  { value: CalculateFieldMode.ReduceRow, label: 'Reduce row' },\n];\n\nexport class CalculateFieldTransformerEditor extends React.PureComponent<\n  CalculateFieldTransformerEditorProps,\n  CalculateFieldTransformerEditorState\n> {\n  constructor(props: CalculateFieldTransformerEditorProps) {\n    super(props);\n\n    this.state = {\n      include: props.options?.reduce?.include || [],\n      names: [],\n      selected: [],\n    };\n  }\n\n  componentDidMount() {\n    this.initOptions();\n  }\n\n  componentDidUpdate(oldProps: CalculateFieldTransformerEditorProps) {\n    if (this.props.input !== oldProps.input) {\n      this.initOptions();\n    }\n  }\n\n  private initOptions() {\n    const { options } = this.props;\n    const configuredOptions = options?.reduce?.include || [];\n    const input = standardTransformers.ensureColumnsTransformer.transformer(null)(this.props.input);\n\n    const allNames: string[] = [];\n    const byName: KeyValue<boolean> = {};\n\n    for (const frame of input) {\n      for (const field of frame.fields) {\n        if (field.type !== FieldType.number) {\n          continue;\n        }\n\n        const displayName = getFieldDisplayName(field, frame, input);\n\n        if (!byName[displayName]) {\n          byName[displayName] = true;\n          allNames.push(displayName);\n        }\n      }\n    }\n\n    if (configuredOptions.length) {\n      const options: string[] = [];\n      const selected: string[] = [];\n\n      for (const v of allNames) {\n        if (configuredOptions.includes(v)) {\n          selected.push(v);\n        }\n        options.push(v);\n      }\n\n      this.setState({\n        names: options,\n        selected: selected,\n      });\n    } else {\n      this.setState({ names: allNames, selected: [] });\n    }\n  }\n\n  onToggleReplaceFields = () => {\n    const { options } = this.props;\n    this.props.onChange({\n      ...options,\n      replaceFields: !options.replaceFields,\n    });\n  };\n\n  onModeChanged = (value: SelectableValue<CalculateFieldMode>) => {\n    const { options, onChange } = this.props;\n    const mode = value.value ?? CalculateFieldMode.BinaryOperation;\n    onChange({\n      ...options,\n      mode,\n    });\n  };\n\n  onAliasChanged = (evt: ChangeEvent<HTMLInputElement>) => {\n    const { options } = this.props;\n    this.props.onChange({\n      ...options,\n      alias: evt.target.value,\n    });\n  };\n\n  //---------------------------------------------------------\n  // Reduce by Row\n  //---------------------------------------------------------\n\n  updateReduceOptions = (v: ReduceOptions) => {\n    const { options, onChange } = this.props;\n    onChange({\n      ...options,\n      mode: CalculateFieldMode.ReduceRow,\n      reduce: v,\n    });\n  };\n\n  onFieldToggle = (fieldName: string) => {\n    const { selected } = this.state;\n    if (selected.indexOf(fieldName) > -1) {\n      this.onChange(selected.filter(s => s !== fieldName));\n    } else {\n      this.onChange([...selected, fieldName]);\n    }\n  };\n\n  onChange = (selected: string[]) => {\n    this.setState({ selected });\n    const { reduce } = this.props.options;\n    this.updateReduceOptions({\n      ...reduce!,\n      include: selected,\n    });\n  };\n\n  onStatsChange = (stats: string[]) => {\n    const reducer = stats.length ? (stats[0] as ReducerID) : ReducerID.sum;\n\n    const { reduce } = this.props.options;\n    this.updateReduceOptions({ ...reduce, reducer });\n  };\n\n  renderReduceRow(options?: ReduceOptions) {\n    const { names, selected } = this.state;\n    options = defaults(options, { reducer: ReducerID.sum });\n\n    return (\n      <>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label width-8\">Field name</div>\n            <HorizontalGroup spacing=\"xs\" align=\"flex-start\" wrap>\n              {names.map((o, i) => {\n                return (\n                  <FilterPill\n                    key={`${o}/${i}`}\n                    onClick={() => {\n                      this.onFieldToggle(o);\n                    }}\n                    label={o}\n                    selected={selected.indexOf(o) > -1}\n                  />\n                );\n              })}\n            </HorizontalGroup>\n          </div>\n        </div>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <div className=\"gf-form-label width-8\">Calculation</div>\n            <StatsPicker\n              allowMultiple={false}\n              className=\"width-18\"\n              stats={[options.reducer]}\n              onChange={this.onStatsChange}\n              defaultStat={ReducerID.sum}\n              menuPlacement=\"bottom\"\n            />\n          </div>\n        </div>\n      </>\n    );\n  }\n\n  //---------------------------------------------------------\n  // Binary Operator\n  //---------------------------------------------------------\n\n  updateBinaryOptions = (v: BinaryOptions) => {\n    const { options, onChange } = this.props;\n    onChange({\n      ...options,\n      mode: CalculateFieldMode.BinaryOperation,\n      binary: v,\n    });\n  };\n\n  onBinaryLeftChanged = (v: SelectableValue<string>) => {\n    const { binary } = this.props.options;\n    this.updateBinaryOptions({\n      ...binary!,\n      left: v.value!,\n    });\n  };\n\n  onBinaryRightChanged = (v: SelectableValue<string>) => {\n    const { binary } = this.props.options;\n    this.updateBinaryOptions({\n      ...binary!,\n      right: v.value!,\n    });\n  };\n\n  onBinaryOperationChanged = (v: SelectableValue<string>) => {\n    const { binary } = this.props.options;\n    this.updateBinaryOptions({\n      ...binary!,\n      operator: v.value! as BinaryOperationID,\n    });\n  };\n\n  renderBinaryOperation(options?: BinaryOptions) {\n    options = defaults(options, { reducer: ReducerID.sum });\n\n    let foundLeft = !options?.left;\n    let foundRight = !options?.right;\n    const names = this.state.names.map(v => {\n      if (v === options?.left) {\n        foundLeft = true;\n      }\n      if (v === options?.right) {\n        foundRight = true;\n      }\n      return { label: v, value: v };\n    });\n    const leftNames = foundLeft ? names : [...names, { label: options?.left, value: options?.left }];\n    const rightNames = foundRight ? names : [...names, { label: options?.right, value: options?.right }];\n\n    const ops = binaryOperators.list().map(v => {\n      return { label: v.id, value: v.id };\n    });\n\n    return (\n      <div className=\"gf-form-inline\">\n        <div className=\"gf-form\">\n          <div className=\"gf-form-label width-8\">Operation</div>\n        </div>\n        <div className=\"gf-form\">\n          <Select\n            allowCustomValue={true}\n            placeholder=\"Field or number\"\n            options={leftNames}\n            className=\"min-width-18 gf-form-spacing\"\n            value={options?.left}\n            onChange={this.onBinaryLeftChanged}\n            menuPlacement=\"bottom\"\n          />\n          <Select\n            className=\"width-8 gf-form-spacing\"\n            options={ops}\n            value={options.operator ?? ops[0].value}\n            onChange={this.onBinaryOperationChanged}\n            menuPlacement=\"bottom\"\n          />\n          <Select\n            allowCustomValue={true}\n            placeholder=\"Field or number\"\n            className=\"min-width-10\"\n            options={rightNames}\n            value={options?.right}\n            onChange={this.onBinaryRightChanged}\n            menuPlacement=\"bottom\"\n          />\n        </div>\n      </div>\n    );\n  }\n\n  //---------------------------------------------------------\n  // Render\n  //---------------------------------------------------------\n\n  render() {\n    const { options } = this.props;\n\n    const mode = options.mode ?? CalculateFieldMode.BinaryOperation;\n\n    return (\n      <div>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <div className=\"gf-form-label width-8\">Mode</div>\n            <Select\n              className=\"width-18\"\n              options={calculationModes}\n              value={calculationModes.find(v => v.value === mode)}\n              onChange={this.onModeChanged}\n              menuPlacement=\"bottom\"\n            />\n          </div>\n        </div>\n        {mode === CalculateFieldMode.BinaryOperation && this.renderBinaryOperation(options.binary)}\n        {mode === CalculateFieldMode.ReduceRow && this.renderReduceRow(options.reduce)}\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <div className=\"gf-form-label width-8\">Alias</div>\n            <Input\n              className=\"width-18\"\n              value={options.alias ?? ''}\n              placeholder={getNameFromOptions(options)}\n              onChange={this.onAliasChanged}\n            />\n          </div>\n        </div>\n        <div className=\"gf-form-inline\">\n          <div className=\"gf-form\">\n            <LegacyForms.Switch\n              label=\"Replace all fields\"\n              labelClass=\"width-8\"\n              checked={!!options.replaceFields}\n              onChange={this.onToggleReplaceFields}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport const calculateFieldTransformRegistryItem: TransformerRegistyItem<CalculateFieldTransformerOptions> = {\n  id: DataTransformerID.calculateField,\n  editor: CalculateFieldTransformerEditor,\n  transformation: standardTransformers.calculateFieldTransformer,\n  name: 'Add field from calculation',\n  description: 'Use the row values to calculate a new field',\n};\n","import React from 'react';\nimport { DataTransformerID, standardTransformers, TransformerRegistyItem, TransformerUIProps } from '@grafana/data';\n\nimport { LabelsToFieldsOptions } from '@grafana/data/src/transformations/transformers/labelsToFields';\n\nexport const LabelsAsFieldsTransformerEditor: React.FC<TransformerUIProps<LabelsToFieldsOptions>> = ({\n  input,\n  options,\n  onChange,\n}) => {\n  return null;\n};\n\nexport const labelsToFieldsTransformerRegistryItem: TransformerRegistyItem<LabelsToFieldsOptions> = {\n  id: DataTransformerID.labelsToFields,\n  editor: LabelsAsFieldsTransformerEditor,\n  transformation: standardTransformers.labelsToFieldsTransformer,\n  name: 'Labels to fields',\n  description: `Groups series by time and return labels or tags as fields. \n                Useful for showing time series with labels in a table where each label key becomes a seperate column`,\n};\n","import { TransformerRegistyItem } from '@grafana/data';\nimport { reduceTransformRegistryItem } from '../components/TransformersUI/ReduceTransformerEditor';\nimport { filterFieldsByNameTransformRegistryItem } from '../components/TransformersUI/FilterByNameTransformerEditor';\nimport { filterFramesByRefIdTransformRegistryItem } from '../components/TransformersUI/FilterByRefIdTransformerEditor';\nimport { organizeFieldsTransformRegistryItem } from '../components/TransformersUI/OrganizeFieldsTransformerEditor';\nimport { seriesToFieldsTransformerRegistryItem } from '../components/TransformersUI/SeriesToFieldsTransformerEditor';\nimport { calculateFieldTransformRegistryItem } from '../components/TransformersUI/CalculateFieldTransformerEditor';\nimport { labelsToFieldsTransformerRegistryItem } from '../components/TransformersUI/LabelsToFieldsTransformerEditor';\n\nexport const getStandardTransformers = (): Array<TransformerRegistyItem<any>> => {\n  return [\n    reduceTransformRegistryItem,\n    filterFieldsByNameTransformRegistryItem,\n    filterFramesByRefIdTransformRegistryItem,\n    organizeFieldsTransformRegistryItem,\n    seriesToFieldsTransformerRegistryItem,\n    calculateFieldTransformRegistryItem,\n    labelsToFieldsTransformerRegistryItem,\n  ];\n};\n","import 'core-js/stable';\nimport 'regenerator-runtime/runtime';\n\nimport 'whatwg-fetch'; // fetch polyfill needed for PhantomJs rendering\nimport 'abortcontroller-polyfill/dist/polyfill-patch-fetch'; // fetch polyfill needed for PhantomJs rendering\n// @ts-ignore\nimport ttiPolyfill from 'tti-polyfill';\n\nimport 'file-saver';\nimport 'lodash';\nimport 'jquery';\nimport 'angular';\nimport 'angular-route';\nimport 'angular-sanitize';\nimport 'angular-native-dragdrop';\nimport 'angular-bindonce';\nimport 'react';\nimport 'react-dom';\n\nimport 'vendor/bootstrap/bootstrap';\nimport 'vendor/angular-other/angular-strap';\n\nimport $ from 'jquery';\nimport angular from 'angular';\nimport config from 'app/core/config';\n// @ts-ignore ignoring this for now, otherwise we would have to extend _ interface with move\nimport _ from 'lodash';\nimport {\n  AppEvents,\n  setLocale,\n  setMarkdownOptions,\n  standardEditorsRegistry,\n  standardFieldConfigEditorRegistry,\n  standardTransformersRegistry,\n  setTimeZoneResolver,\n} from '@grafana/data';\nimport appEvents from 'app/core/app_events';\nimport { checkBrowserCompatibility } from 'app/core/utils/browser';\nimport { importPluginModule } from 'app/features/plugins/plugin_loader';\nimport { angularModules, coreModule } from 'app/core/core_module';\nimport { registerAngularDirectives } from 'app/core/core';\nimport { setupAngularRoutes } from 'app/routes/routes';\nimport { registerEchoBackend, setEchoSrv } from '@grafana/runtime';\nimport { Echo } from './core/services/echo/Echo';\nimport { reportPerformance } from './core/services/echo/EchoSrv';\nimport { PerformanceBackend } from './core/services/echo/backends/PerformanceBackend';\nimport 'app/routes/GrafanaCtrl';\nimport 'app/features/all';\nimport { getStandardFieldConfigs, getStandardOptionEditors, getScrollbarWidth } from '@grafana/ui';\nimport { getDefaultVariableAdapters, variableAdapters } from './features/variables/adapters';\nimport { initDevFeatures } from './dev';\nimport { getStandardTransformers } from 'app/core/utils/standardTransformers';\n\n// add move to lodash for backward compatabiltiy\n// @ts-ignore\n_.move = (array: [], fromIndex: number, toIndex: number) => {\n  array.splice(toIndex, 0, array.splice(fromIndex, 1)[0]);\n  return array;\n};\n\n// import symlinked extensions\nconst extensionsIndex = (require as any).context('.', true, /extensions\\/index.ts/);\nextensionsIndex.keys().forEach((key: any) => {\n  extensionsIndex(key);\n});\n\nif (process.env.NODE_ENV === 'development') {\n  initDevFeatures();\n}\n\nexport class GrafanaApp {\n  registerFunctions: any;\n  ngModuleDependencies: any[];\n  preBootModules: any[] | null;\n\n  constructor() {\n    this.preBootModules = [];\n    this.registerFunctions = {};\n    this.ngModuleDependencies = [];\n  }\n\n  useModule(module: angular.IModule) {\n    if (this.preBootModules) {\n      this.preBootModules.push(module);\n    } else {\n      _.extend(module, this.registerFunctions);\n    }\n    this.ngModuleDependencies.push(module.name);\n    return module;\n  }\n\n  init() {\n    const app = angular.module('grafana', []);\n\n    addClassIfNoOverlayScrollbar();\n    setLocale(config.bootData.user.locale);\n    setTimeZoneResolver(() => config.bootData.user.timeZone);\n\n    setMarkdownOptions({ sanitize: !config.disableSanitizeHtml });\n\n    standardEditorsRegistry.setInit(getStandardOptionEditors);\n    standardFieldConfigEditorRegistry.setInit(getStandardFieldConfigs);\n    standardTransformersRegistry.setInit(getStandardTransformers);\n    variableAdapters.setInit(getDefaultVariableAdapters);\n\n    app.config(\n      (\n        $locationProvider: angular.ILocationProvider,\n        $controllerProvider: angular.IControllerProvider,\n        $compileProvider: angular.ICompileProvider,\n        $filterProvider: angular.IFilterProvider,\n        $httpProvider: angular.IHttpProvider,\n        $provide: angular.auto.IProvideService\n      ) => {\n        // pre assing bindings before constructor calls\n        $compileProvider.preAssignBindingsEnabled(true);\n\n        if (config.buildInfo.env !== 'development') {\n          $compileProvider.debugInfoEnabled(false);\n        }\n\n        $httpProvider.useApplyAsync(true);\n\n        this.registerFunctions.controller = $controllerProvider.register;\n        this.registerFunctions.directive = $compileProvider.directive;\n        this.registerFunctions.factory = $provide.factory;\n        this.registerFunctions.service = $provide.service;\n        this.registerFunctions.filter = $filterProvider.register;\n\n        $provide.decorator('$http', [\n          '$delegate',\n          '$templateCache',\n          ($delegate: any, $templateCache: any) => {\n            const get = $delegate.get;\n            $delegate.get = (url: string, config: any) => {\n              if (url.match(/\\.html$/)) {\n                // some template's already exist in the cache\n                if (!$templateCache.get(url)) {\n                  url += '?v=' + new Date().getTime();\n                }\n              }\n              return get(url, config);\n            };\n            return $delegate;\n          },\n        ]);\n      }\n    );\n\n    this.ngModuleDependencies = [\n      'grafana.core',\n      'ngRoute',\n      'ngSanitize',\n      '$strap.directives',\n      'ang-drag-drop',\n      'grafana',\n      'pasvaz.bindonce',\n      'react',\n    ];\n\n    // makes it possible to add dynamic stuff\n    _.each(angularModules, (m: angular.IModule) => {\n      this.useModule(m);\n    });\n\n    // register react angular wrappers\n    coreModule.config(setupAngularRoutes);\n    registerAngularDirectives();\n\n    // disable tool tip animation\n    $.fn.tooltip.defaults.animation = false;\n\n    // bootstrap the app\n    angular.bootstrap(document, this.ngModuleDependencies).invoke(() => {\n      _.each(this.preBootModules, (module: angular.IModule) => {\n        _.extend(module, this.registerFunctions);\n      });\n\n      this.preBootModules = null;\n\n      if (!checkBrowserCompatibility()) {\n        setTimeout(() => {\n          appEvents.emit(AppEvents.alertWarning, [\n            'Your browser is not fully supported',\n            'A newer browser version is recommended',\n          ]);\n        }, 1000);\n      }\n    });\n\n    // Preload selected app plugins\n    for (const modulePath of config.pluginsToPreload) {\n      importPluginModule(modulePath);\n    }\n  }\n\n  initEchoSrv() {\n    setEchoSrv(new Echo({ debug: process.env.NODE_ENV === 'development' }));\n\n    ttiPolyfill.getFirstConsistentlyInteractive().then((tti: any) => {\n      // Collecting paint metrics first\n      const paintMetrics = performance && performance.getEntriesByType ? performance.getEntriesByType('paint') : [];\n\n      for (const metric of paintMetrics) {\n        reportPerformance(metric.name, Math.round(metric.startTime + metric.duration));\n      }\n      reportPerformance('tti', tti);\n    });\n\n    registerEchoBackend(new PerformanceBackend({}));\n\n    window.addEventListener('DOMContentLoaded', () => {\n      reportPerformance('dcl', Math.round(performance.now()));\n    });\n  }\n}\n\nfunction addClassIfNoOverlayScrollbar() {\n  if (getScrollbarWidth() > 0) {\n    document.body.classList.add('no-overlay-scrollbar');\n  }\n}\n\nexport default new GrafanaApp();\n","// Check to see if browser is not supported by Grafana\nexport function checkBrowserCompatibility() {\n  const isIE = navigator.userAgent.indexOf('MSIE') > -1;\n  const isEdge = navigator.userAgent.indexOf('Edge/') > -1 || navigator.userAgent.indexOf('Edg/') > -1;\n  const isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n  const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n  /* Check for\n   <= IE11 (Trident 7)\n   Edge <= 16\n   Firefox <= 64\n   Chrome <= 54\n  */\n  const isEdgeVersion = /Edge\\/([0-9.]+)/.exec(navigator.userAgent);\n\n  if (isIE && parseFloat(/Trident\\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 7) {\n    return false;\n  } else if (\n    isEdge &&\n    ((isEdgeVersion && parseFloat(isEdgeVersion[1]) <= 16) ||\n      parseFloat(/Edg\\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 16)\n  ) {\n    return false;\n  } else if (isFirefox && parseFloat(/Firefox\\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 64) {\n    return false;\n  } else if (isChrome && parseFloat(/Chrome\\/([0-9.]+)/.exec(navigator.userAgent)[1]) <= 54) {\n    return false;\n  }\n\n  return true;\n}\n","import app from './app';\n\napp.initEchoSrv();\napp.init();\n","/**\n * Describes a size with width/height\n *\n * @public\n */\nexport interface SizeMeta {\n  width: number;\n  height: number;\n}\n\n/**\n * Describes the meta information that are sent together with each event.\n *\n * @public\n */\nexport interface EchoMeta {\n  screenSize: SizeMeta;\n  windowSize: SizeMeta;\n  userAgent: string;\n  url?: string;\n  /**\n   * A unique browser session\n   */\n  sessionId: string;\n  /**\n   * The current users username used to login into Grafana e.g. email.\n   */\n  userLogin: string;\n  /**\n   * The current users unique identifier.\n   */\n  userId: number;\n  /**\n   * True when user is logged in into Grafana.\n   */\n  userSignedIn: boolean;\n  /**\n   * A millisecond epoch\n   */\n  ts: number;\n  /**\n   * A highres timestamp since navigation start\n   */\n  timeSinceNavigationStart: number;\n}\n\n/**\n * Describes echo backends that can be registered to receive of events.\n *\n * @public\n */\nexport interface EchoBackend<T extends EchoEvent = any, O = any> {\n  options: O;\n  supportedEvents: EchoEventType[];\n  flush: () => void;\n  addEvent: (event: T) => void;\n}\n\n/**\n * Describes an echo event.\n *\n * @public\n */\nexport interface EchoEvent<T extends EchoEventType = any, P = any> {\n  type: EchoEventType;\n  /**\n   * Event payload containing event specific data.\n   */\n  payload: P;\n  meta: EchoMeta;\n}\n\n/**\n * Supported echo event types that can be sent via the {@link EchoSrv}.\n *\n * @public\n */\nexport enum EchoEventType {\n  Performance = 'performance',\n  MetaAnalytics = 'meta-analytics',\n}\n\n/**\n * Used to send events to all the registered backends. This should be accessed via the\n * {@link getEchoSrv} function. Will, by default, flush events to the backends every\n * 10s or when the flush function is triggered.\n *\n * @public\n */\nexport interface EchoSrv {\n  /**\n   * Call this to flush current events to the echo backends.\n   */\n  flush(): void;\n  /**\n   * Add a new echo backend to the list of backends that will receive events.\n   */\n  addBackend(backend: EchoBackend): void;\n  /**\n   * Call this to add event that will be sent to the echo backends upon next\n   * flush.\n   *\n   * @param event - Object containing event information.\n   * @param meta - Object that will extend/override the default meta object.\n   */\n  addEvent<T extends EchoEvent>(event: Omit<T, 'meta'>, meta?: {}): void;\n}\n\nlet singletonInstance: EchoSrv;\n\n/**\n * Used during startup by Grafana to set the EchoSrv so it is available\n * via the the {@link getEchoSrv} to the rest of the application.\n *\n * @internal\n */\nexport function setEchoSrv(instance: EchoSrv) {\n  singletonInstance = instance;\n}\n\n/**\n * Used to retrieve the {@link EchoSrv} that can be used to report events to registered\n * echo backends.\n *\n * @public\n */\nexport function getEchoSrv(): EchoSrv {\n  return singletonInstance;\n}\n\n/**\n * Used to register echo backends that will receive Grafana echo events during application\n * runtime.\n *\n * @public\n */\nexport const registerEchoBackend = (backend: EchoBackend) => {\n  getEchoSrv().addBackend(backend);\n};\n","import _ from 'lodash';\n\nimport config from 'app/core/config';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { PanelPluginMeta } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\ninterface Input {\n  name: string;\n  type: string;\n  label: string;\n  value: any;\n  description: string;\n}\n\ninterface Requires {\n  [key: string]: {\n    type: string;\n    id: string;\n    name: string;\n    version: string;\n  };\n}\n\ninterface DataSources {\n  [key: string]: {\n    name: string;\n    label: string;\n    description: string;\n    type: string;\n    pluginId: string;\n    pluginName: string;\n  };\n}\n\nexport class DashboardExporter {\n  makeExportable(dashboard: DashboardModel) {\n    // clean up repeated rows and panels,\n    // this is done on the live real dashboard instance, not on a clone\n    // so we need to undo this\n    // this is pretty hacky and needs to be changed\n    dashboard.cleanUpRepeats();\n\n    const saveModel = dashboard.getSaveModelClone();\n    saveModel.id = null;\n\n    // undo repeat cleanup\n    dashboard.processRepeats();\n\n    const inputs: Input[] = [];\n    const requires: Requires = {};\n    const datasources: DataSources = {};\n    const promises: Array<Promise<void>> = [];\n    const variableLookup: { [key: string]: any } = {};\n\n    for (const variable of saveModel.getVariables()) {\n      variableLookup[variable.name] = variable;\n    }\n\n    const templateizeDatasourceUsage = (obj: any) => {\n      let datasource: string = obj.datasource;\n      let datasourceVariable: any = null;\n\n      // ignore data source properties that contain a variable\n      if (datasource && datasource.indexOf('$') === 0) {\n        datasourceVariable = variableLookup[datasource.substring(1)];\n        if (datasourceVariable && datasourceVariable.current) {\n          datasource = datasourceVariable.current.value;\n        }\n      }\n\n      promises.push(\n        getDataSourceSrv()\n          .get(datasource)\n          .then(ds => {\n            if (ds.meta?.builtIn) {\n              return;\n            }\n\n            // add data source type to require list\n            requires['datasource' + ds.meta?.id] = {\n              type: 'datasource',\n              id: ds.meta.id,\n              name: ds.meta.name,\n              version: ds.meta.info.version || '1.0.0',\n            };\n\n            // if used via variable we can skip templatizing usage\n            if (datasourceVariable) {\n              return;\n            }\n\n            const refName = 'DS_' + ds.name.replace(' ', '_').toUpperCase();\n            datasources[refName] = {\n              name: refName,\n              label: ds.name,\n              description: '',\n              type: 'datasource',\n              pluginId: ds.meta?.id,\n              pluginName: ds.meta?.name,\n            };\n\n            obj.datasource = '${' + refName + '}';\n          })\n      );\n    };\n\n    const processPanel = (panel: PanelModel) => {\n      if (panel.datasource !== undefined) {\n        templateizeDatasourceUsage(panel);\n      }\n\n      if (panel.targets) {\n        for (const target of panel.targets) {\n          if (target.datasource !== undefined) {\n            templateizeDatasourceUsage(target);\n          }\n        }\n      }\n\n      const panelDef: PanelPluginMeta = config.panels[panel.type];\n      if (panelDef) {\n        requires['panel' + panelDef.id] = {\n          type: 'panel',\n          id: panelDef.id,\n          name: panelDef.name,\n          version: panelDef.info.version,\n        };\n      }\n    };\n\n    // check up panel data sources\n    for (const panel of saveModel.panels) {\n      processPanel(panel);\n\n      // handle collapsed rows\n      if (panel.collapsed !== undefined && panel.collapsed === true && panel.panels) {\n        for (const rowPanel of panel.panels) {\n          processPanel(rowPanel);\n        }\n      }\n    }\n\n    // templatize template vars\n    for (const variable of saveModel.getVariables()) {\n      if (variable.type === 'query') {\n        templateizeDatasourceUsage(variable);\n        variable.options = [];\n        variable.current = {};\n        variable.refresh = variable.refresh > 0 ? variable.refresh : 1;\n      }\n    }\n\n    // templatize annotations vars\n    for (const annotationDef of saveModel.annotations.list) {\n      templateizeDatasourceUsage(annotationDef);\n    }\n\n    // add grafana version\n    requires['grafana'] = {\n      type: 'grafana',\n      id: 'grafana',\n      name: 'Grafana',\n      version: config.buildInfo.version,\n    };\n\n    return Promise.all(promises)\n      .then(() => {\n        _.each(datasources, (value: any) => {\n          inputs.push(value);\n        });\n\n        // templatize constants\n        for (const variable of saveModel.getVariables()) {\n          if (variable.type === 'constant') {\n            const refName = 'VAR_' + variable.name.replace(' ', '_').toUpperCase();\n            inputs.push({\n              name: refName,\n              type: 'constant',\n              label: variable.label || variable.name,\n              value: variable.current.value,\n              description: '',\n            });\n            // update current and option\n            variable.query = '${' + refName + '}';\n            variable.options[0] = variable.current = {\n              value: variable.query,\n              text: variable.query,\n            };\n          }\n        }\n\n        // make inputs and requires a top thing\n        const newObj: { [key: string]: {} } = {};\n        newObj['__inputs'] = inputs;\n        newObj['__requires'] = _.sortBy(requires, ['id']);\n\n        _.defaults(newObj, saveModel);\n        return newObj;\n      })\n      .catch(err => {\n        console.log('Export failed:', err);\n        return {\n          error: err,\n        };\n      });\n  }\n}\n","export { DashboardExporter } from './DashboardExporter';\n","import { Block, Document, Text, Value, SchemaProperties } from 'slate';\n\nexport const SCHEMA: SchemaProperties = {\n  document: {\n    nodes: [\n      {\n        match: [{ type: 'paragraph' }, { type: 'code_block' }, { type: 'code_line' }],\n      },\n    ],\n  },\n  inlines: {},\n};\n\nexport const makeFragment = (text: string, syntax?: string): Document => {\n  const lines = text.split('\\n').map(line =>\n    Block.create({\n      type: 'code_line',\n      nodes: [Text.create(line)],\n    })\n  );\n\n  const block = Block.create({\n    data: {\n      syntax,\n    },\n    type: 'code_block',\n    nodes: lines,\n  });\n\n  return Document.create({\n    nodes: [block],\n  });\n};\n\nexport const makeValue = (text: string, syntax?: string): Value => {\n  const fragment = makeFragment(text, syntax);\n\n  return Value.create({\n    document: fragment,\n  });\n};\n","import { BackendSrvRequest } from '@grafana/runtime';\nimport omitBy from 'lodash/omitBy';\n\nexport const parseInitFromOptions = (options: BackendSrvRequest): RequestInit => {\n  const method = options.method;\n  const headers = parseHeaders(options);\n  const isAppJson = isContentTypeApplicationJson(headers);\n  const body = parseBody(options, isAppJson);\n\n  if (options?.withCredentials) {\n    return {\n      method,\n      headers,\n      body,\n      credentials: 'include',\n    };\n  }\n\n  return {\n    method,\n    headers,\n    body,\n  };\n};\n\ninterface HeaderParser {\n  canParse: (options: BackendSrvRequest) => boolean;\n  parse: (headers: Headers) => Headers;\n}\n\nconst defaultHeaderParser: HeaderParser = {\n  canParse: () => true,\n  parse: headers => {\n    const accept = headers.get('accept');\n    if (accept) {\n      return headers;\n    }\n\n    headers.set('accept', 'application/json, text/plain, */*');\n    return headers;\n  },\n};\n\nconst parseHeaderByMethodFactory = (methodPredicate: string): HeaderParser => ({\n  canParse: options => {\n    const method = options?.method ? options?.method.toLowerCase() : '';\n    return method === methodPredicate;\n  },\n  parse: headers => {\n    const contentType = headers.get('content-type');\n    if (contentType) {\n      return headers;\n    }\n\n    headers.set('content-type', 'application/json');\n    return headers;\n  },\n});\n\nconst postHeaderParser: HeaderParser = parseHeaderByMethodFactory('post');\nconst putHeaderParser: HeaderParser = parseHeaderByMethodFactory('put');\n\nconst headerParsers = [postHeaderParser, putHeaderParser, defaultHeaderParser];\n\nexport const parseHeaders = (options: BackendSrvRequest) => {\n  const headers = options?.headers ? new Headers(options.headers) : new Headers();\n  const parsers = headerParsers.filter(parser => parser.canParse(options));\n  const combinedHeaders = parsers.reduce((prev, parser) => {\n    return parser.parse(prev);\n  }, headers);\n\n  return combinedHeaders;\n};\n\nexport const isContentTypeApplicationJson = (headers: Headers) => {\n  if (!headers) {\n    return false;\n  }\n\n  const contentType = headers.get('content-type');\n  if (contentType && contentType.toLowerCase() === 'application/json') {\n    return true;\n  }\n\n  return false;\n};\n\nexport const parseBody = (options: BackendSrvRequest, isAppJson: boolean) => {\n  if (!options) {\n    return options;\n  }\n\n  if (!options.data || typeof options.data === 'string') {\n    return options.data;\n  }\n\n  return isAppJson ? JSON.stringify(options.data) : new URLSearchParams(options.data);\n};\n\nexport function serializeParams(data: Record<string, any>): string {\n  return Object.keys(data)\n    .map(key => {\n      const value = data[key];\n      if (Array.isArray(value)) {\n        return value.map(arrayValue => `${encodeURIComponent(key)}=${encodeURIComponent(arrayValue)}`).join('&');\n      }\n      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n    })\n    .join('&');\n}\n\nexport const parseUrlFromOptions = (options: BackendSrvRequest): string => {\n  const cleanParams = omitBy(options.params, v => v === undefined || (v && v.length === 0));\n  const serializedParams = serializeParams(cleanParams);\n  return options.params && serializedParams.length ? `${options.url}?${serializedParams}` : options.url;\n};\n"],"sourceRoot":""}