From 1c2906cc4b571c2464b6a48ad1d7eaf0c1e53feb Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Fri, 29 Nov 2019 13:51:56 +0100 Subject: [PATCH 01/39] [Discover] shim with local application service (#49483) Shims discover app within local angular instance (or so called inner angular in the code) to enable migration to the new platform without getting rid of all Angular. Note that apart from Discover's main app, also context, doc view and embeddable are part of this shim. There a 2 sorts of local angular used, one for the main plugin, and a slimmer one for it's embeddable, that's needed to render the data table. Both are built on first demand. There are 2 changes of URLs inside /context/ becomes /discover/context /doc/ becomes /discover/doc Legacy url's are redirected, so they are still valid. --- src/legacy/core_plugins/kibana/index.js | 2 +- .../public/dashboard/dashboard_config.js | 42 +-- .../__tests__/directives/discover_field.js | 7 +- .../__tests__/directives/field_calculator.js | 4 +- .../__tests__/directives/field_chooser.js | 6 +- .../kibana/public/discover/_index.scss | 2 +- .../kibana/public/discover/angular/context.js | 59 ++-- .../angular/context/api/__tests__/anchor.js | 8 +- .../context/api/__tests__/predecessors.js | 8 +- .../context/api/__tests__/successors.js | 12 +- .../discover/angular/context/api/anchor.js | 6 +- .../discover/angular/context/api/context.ts | 7 +- .../api/utils/__tests__/sorting.test.ts | 5 +- .../angular/context/api/utils/sorting.ts | 6 +- .../action_bar/action_bar_directive.ts | 6 +- .../discover/angular/context/query/actions.js | 16 +- .../__tests__/action_add_filter.js | 14 +- .../__tests__/action_set_predecessor_count.js | 12 +- .../__tests__/action_set_query_parameters.js | 11 +- .../__tests__/action_set_successor_count.js | 11 +- .../context/query_parameters/actions.js | 8 +- .../angular/context/query_parameters/index.js | 2 +- .../public/discover/angular/context_app.js | 15 +- .../discover/angular/directives/histogram.tsx | 2 +- .../discover/angular/directives/index.js | 5 +- .../public/discover/angular/discover.js | 128 +++---- .../kibana/public/discover/angular/doc.ts | 64 ++-- .../angular/doc_table/__tests__/doc_table.js | 6 +- .../doc_table/__tests__/lib/rows_headers.js | 7 +- .../components/pager/{index.js => index.ts} | 14 +- .../doc_table/components/table_header.ts | 7 +- .../components/{table_row.js => table_row.ts} | 52 +-- .../components/table_row/details.html | 4 +- .../discover/angular/doc_table/doc_table.js | 126 ------- .../discover/angular/doc_table/doc_table.ts | 133 +++++++ ...{infinite_scroll.js => infinite_scroll.ts} | 32 +- .../{pager_factory.js => pager_factory.ts} | 13 +- .../public/discover/angular/doc_viewer.ts | 10 +- .../kibana/public/discover/application.ts | 43 +++ .../{ => components}/doc/doc.test.tsx | 2 +- .../discover/{ => components}/doc/doc.tsx | 2 +- .../doc/use_es_doc_search.test.tsx | 0 .../{ => components}/doc/use_es_doc_search.ts | 2 +- .../__snapshots__/doc_viewer.test.tsx.snap | 0 .../doc_viewer_render_tab.test.tsx.snap | 0 .../doc_viewer/_doc_viewer.scss | 0 .../{ => components}/doc_viewer/_index.scss | 0 .../doc_viewer/doc_viewer.test.tsx | 2 +- .../doc_viewer/doc_viewer.tsx | 5 +- .../doc_viewer/doc_viewer_render_error.tsx | 0 .../doc_viewer/doc_viewer_render_tab.test.tsx | 2 +- .../doc_viewer/doc_viewer_render_tab.tsx | 2 +- .../doc_viewer/doc_viewer_tab.tsx | 2 +- .../{fetch_error.js => fetch_error.tsx} | 26 +- .../field_chooser/discover_field.js | 12 +- .../discover_field_search_directive.ts | 11 +- .../discover_index_pattern_directive.ts | 11 +- .../components/field_chooser/field_chooser.js | 128 ++++--- ...rogress_bar.js => string_progress_bar.tsx} | 32 +- .../open_search_panel.test.js.snap | 0 .../top_nav/open_search_panel.js | 0 .../top_nav/open_search_panel.test.js | 2 +- .../top_nav/show_open_search_panel.js | 0 .../kibana/public/discover/context/README.md | 4 - .../public/discover/embeddable/index.ts | 1 - .../discover/embeddable/search_embeddable.ts | 18 +- .../embeddable/search_embeddable_factory.ts | 43 +-- .../public/discover/get_inner_angular.ts | 328 ++++++++++++++++++ .../discover/{ => helpers}/breadcrumbs.ts | 0 .../public/discover/helpers/build_services.ts | 110 ++++++ .../discover/helpers/get_index_pattern_id.ts | 60 ++++ .../kibana/public/discover/index.ts | 15 +- .../kibana/public/discover/kibana_services.ts | 87 ++--- .../kibana/public/discover/plugin.ts | 108 +++++- .../discover/saved_searches/_saved_search.js | 11 +- .../saved_searches/saved_search_register.js | 26 -- .../discover/saved_searches/saved_searches.js | 15 +- .../core_plugins/kibana/public/kibana.js | 5 +- .../accessibility/kbn_accessible_click.js | 78 +++-- .../collapsible_sidebar.js | 97 +++--- .../ui/public/directives/css_truncate.js | 15 +- .../ui/public/directives/debounce/debounce.js | 6 +- src/legacy/ui/public/directives/field_name.js | 6 +- .../ui/public/directives/listen/listen.js | 36 +- .../directives/watch_multi/watch_multi.js | 154 ++++---- src/legacy/ui/public/es.js | 21 +- src/legacy/ui/public/fixed_scroll.js | 181 +++++----- src/legacy/ui/public/registry/doc_views.ts | 6 + .../ui/public/registry/doc_views_helpers.tsx | 2 +- .../ui/public/render_complete/directive.js | 11 +- .../ui/ui_exports/ui_export_defaults.js | 1 - .../panel_actions/get_csv_panel_action.tsx | 7 +- 92 files changed, 1610 insertions(+), 998 deletions(-) rename src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/{index.js => index.ts} (78%) rename src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/{table_row.js => table_row.ts} (86%) delete mode 100644 src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.js create mode 100644 src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts rename src/legacy/core_plugins/kibana/public/discover/angular/doc_table/{infinite_scroll.js => infinite_scroll.ts} (68%) rename src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/{pager_factory.js => pager_factory.ts} (83%) create mode 100644 src/legacy/core_plugins/kibana/public/discover/application.ts rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc/doc.test.tsx (98%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc/doc.tsx (99%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc/use_es_doc_search.test.tsx (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc/use_es_doc_search.ts (97%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/__snapshots__/doc_viewer_render_tab.test.tsx.snap (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/_doc_viewer.scss (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/_index.scss (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/doc_viewer.test.tsx (98%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/doc_viewer.tsx (90%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/doc_viewer_render_error.tsx (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/doc_viewer_render_tab.test.tsx (95%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/doc_viewer_render_tab.tsx (95%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/doc_viewer/doc_viewer_tab.tsx (97%) rename src/legacy/core_plugins/kibana/public/discover/components/fetch_error/{fetch_error.js => fetch_error.tsx} (79%) rename src/legacy/core_plugins/kibana/public/discover/components/field_chooser/{string_progress_bar.js => string_progress_bar.tsx} (72%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/top_nav/__snapshots__/open_search_panel.test.js.snap (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/top_nav/open_search_panel.js (100%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/top_nav/open_search_panel.test.js (96%) rename src/legacy/core_plugins/kibana/public/discover/{ => components}/top_nav/show_open_search_panel.js (100%) delete mode 100644 src/legacy/core_plugins/kibana/public/discover/context/README.md create mode 100644 src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts rename src/legacy/core_plugins/kibana/public/discover/{ => helpers}/breadcrumbs.ts (100%) create mode 100644 src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts create mode 100644 src/legacy/core_plugins/kibana/public/discover/helpers/get_index_pattern_id.ts delete mode 100644 src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_search_register.js diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 91364071579abb..af7aa3daf76cca 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -62,11 +62,11 @@ export default function (kibana) { uiExports: { hacks: [ + 'plugins/kibana/discover', 'plugins/kibana/dev_tools', ], savedObjectTypes: [ 'plugins/kibana/visualize/saved_visualizations/saved_visualization_register', - 'plugins/kibana/discover/saved_searches/saved_search_register', 'plugins/kibana/dashboard/saved_dashboard/saved_dashboard_register', ], app: { diff --git a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_config.js b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_config.js index 1abe8581c54c6f..3f764cf5766687 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_config.js +++ b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_config.js @@ -20,24 +20,26 @@ import { uiModules } from 'ui/modules'; import { capabilities } from 'ui/capabilities'; -uiModules.get('kibana') - .provider('dashboardConfig', () => { - let hideWriteControls = !capabilities.get().dashboard.showWriteControls; +export function dashboardConfigProvider() { + let hideWriteControls = !capabilities.get().dashboard.showWriteControls; + + return { + /** + * Part of the exposed plugin API - do not remove without careful consideration. + * @type {boolean} + */ + turnHideWriteControlsOn() { + hideWriteControls = true; + }, + $get() { + return { + getHideWriteControls() { + return hideWriteControls; + } + }; + } + }; +} - return { - /** - * Part of the exposed plugin API - do not remove without careful consideration. - * @type {boolean} - */ - turnHideWriteControlsOn() { - hideWriteControls = true; - }, - $get() { - return { - getHideWriteControls() { - return hideWriteControls; - } - }; - } - }; - }); +uiModules.get('kibana') + .provider('dashboardConfig', dashboardConfigProvider); diff --git a/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/discover_field.js b/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/discover_field.js index 9ac76bfcfe04e2..92df04c536e438 100644 --- a/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/discover_field.js +++ b/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/discover_field.js @@ -23,7 +23,7 @@ import _ from 'lodash'; import sinon from 'sinon'; import ngMock from 'ng_mock'; import expect from '@kbn/expect'; -import '../../components/field_chooser/discover_field'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; // Load the kibana app dependencies. @@ -32,8 +32,9 @@ describe('discoverField', function () { let $scope; let indexPattern; let $elem; - - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeServices(true)); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); beforeEach(ngMock.inject(function (Private, $rootScope, $compile) { $elem = angular.element(` pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); beforeEach(ngMock.inject(function (Private) { indexPattern = Private(FixturesStubbedLogstashIndexPatternProvider); })); diff --git a/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/field_chooser.js b/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/field_chooser.js index bac56f008233c0..34c6483349af60 100644 --- a/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/field_chooser.js +++ b/src/legacy/core_plugins/kibana/public/discover/__tests__/directives/field_chooser.js @@ -23,7 +23,7 @@ import _ from 'lodash'; import sinon from 'sinon'; import expect from '@kbn/expect'; import $ from 'jquery'; -import '../../components/field_chooser/field_chooser'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import FixturesHitsProvider from 'fixtures/hits'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; import { SimpleSavedObject } from '../../../../../../../core/public'; @@ -70,8 +70,10 @@ describe('discover field chooser directives', function () { on-remove-field="removeField" > `); + beforeEach(() => pluginInstance.initializeServices(true)); + beforeEach(() => pluginInstance.initializeInnerAngular()); - beforeEach(ngMock.module('kibana', ($provide) => { + beforeEach(ngMock.module('app/discover', ($provide) => { $provide.decorator('config', ($delegate) => { // disable shortDots for these tests $delegate.get = _.wrap($delegate.get, function (origGet, name) { diff --git a/src/legacy/core_plugins/kibana/public/discover/_index.scss b/src/legacy/core_plugins/kibana/public/discover/_index.scss index b311dd8a347789..0d70bb993fac10 100644 --- a/src/legacy/core_plugins/kibana/public/discover/_index.scss +++ b/src/legacy/core_plugins/kibana/public/discover/_index.scss @@ -20,7 +20,7 @@ @import 'embeddable/index'; // Doc Viewer -@import 'doc_viewer/index'; +@import 'components/doc_viewer/index'; // Context styles @import 'angular/context/index'; diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context.js b/src/legacy/core_plugins/kibana/public/discover/angular/context.js index 58d1626ca4b14d..989712a16b2501 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context.js @@ -19,12 +19,13 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; -import { getServices, subscribeWithScope } from './../kibana_services'; +import { getAngularModule, getServices, subscribeWithScope } from './../kibana_services'; import './context_app'; import contextAppRouteTemplate from './context.html'; -import { getRootBreadcrumbs } from '../breadcrumbs'; -const { FilterBarQueryFilterProvider, uiRoutes, chrome } = getServices(); +import { getRootBreadcrumbs } from '../helpers/breadcrumbs'; +import { FilterStateManager } from '../../../../data/public/filter/filter_manager'; +const { chrome } = getServices(); const k7Breadcrumbs = $route => { const { indexPattern } = $route.current.locals; @@ -44,26 +45,33 @@ const k7Breadcrumbs = $route => { ]; }; -uiRoutes - // deprecated route, kept for compatibility - // should be removed in the future - .when('/context/:indexPatternId/:type/:id*', { - redirectTo: '/context/:indexPatternId/:id', - }) - .when('/context/:indexPatternId/:id*', { - controller: ContextAppRouteController, - k7Breadcrumbs, - controllerAs: 'contextAppRoute', - resolve: { - indexPattern: function ($route, indexPatterns) { - return indexPatterns.get($route.current.params.indexPatternId); +getAngularModule().config($routeProvider => { + $routeProvider + // deprecated route, kept for compatibility + // should be removed in the future + .when('/discover/context/:indexPatternId/:type/:id*', { + redirectTo: '/discover/context/:indexPatternId/:id', + }) + .when('/discover/context/:indexPatternId/:id*', { + controller: ContextAppRouteController, + k7Breadcrumbs, + controllerAs: 'contextAppRoute', + resolve: { + indexPattern: ($route, Promise) => { + const indexPattern = getServices().indexPatterns.get( + $route.current.params.indexPatternId + ); + return Promise.props({ ip: indexPattern }); + }, }, - }, - template: contextAppRouteTemplate, - }); + template: contextAppRouteTemplate, + }); +}); -function ContextAppRouteController($routeParams, $scope, AppState, config, indexPattern, Private) { - const queryFilter = Private(FilterBarQueryFilterProvider); +function ContextAppRouteController($routeParams, $scope, AppState, config, $route, getAppState, globalState) { + const filterManager = getServices().filterManager; + const filterStateManager = new FilterStateManager(globalState, getAppState, filterManager); + const indexPattern = $route.current.locals.indexPattern.ip; this.state = new AppState(createDefaultAppState(config, indexPattern)); this.state.save(true); @@ -77,19 +85,20 @@ function ContextAppRouteController($routeParams, $scope, AppState, config, index () => this.state.save(true) ); - const updateSubsciption = subscribeWithScope($scope, queryFilter.getUpdates$(), { + const updateSubsciption = subscribeWithScope($scope, filterManager.getUpdates$(), { next: () => { - this.filters = _.cloneDeep(queryFilter.getFilters()); + this.filters = _.cloneDeep(filterManager.getFilters()); }, }); - $scope.$on('$destroy', function () { + $scope.$on('$destroy', () => { + filterStateManager.destroy(); updateSubsciption.unsubscribe(); }); this.anchorId = $routeParams.id; this.indexPattern = indexPattern; this.discoverUrl = chrome.navLinks.get('kibana:discover').url; - this.filters = _.cloneDeep(queryFilter.getFilters()); + this.filters = _.cloneDeep(filterManager.getFilters()); } function createDefaultAppState(config, indexPattern) { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/anchor.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/anchor.js index 4eb68c1bf50bcb..8c6e53974ba361 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/anchor.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/anchor.js @@ -19,13 +19,15 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import { createIndexPatternsStub, createSearchSourceStub } from './_stubs'; import { fetchAnchorProvider } from '../anchor'; describe('context app', function () { - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); describe('function fetchAnchor', function () { let fetchAnchor; @@ -35,11 +37,11 @@ describe('context app', function () { $provide.value('indexPatterns', createIndexPatternsStub()); })); - beforeEach(ngMock.inject(function createPrivateStubs(Private) { + beforeEach(ngMock.inject(function createPrivateStubs() { searchSourceStub = createSearchSourceStub([ { _id: 'hit1' }, ]); - fetchAnchor = Private(fetchAnchorProvider); + fetchAnchor = fetchAnchorProvider(createIndexPatternsStub(), searchSourceStub); })); afterEach(() => { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/predecessors.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/predecessors.js index ea6a8c092e242b..a21e2117d1db6f 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/predecessors.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/predecessors.js @@ -21,6 +21,7 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; import moment from 'moment'; import * as _ from 'lodash'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import { createIndexPatternsStub, createContextSearchSourceStub } from './_stubs'; @@ -33,7 +34,8 @@ const ANCHOR_TIMESTAMP_1000 = (new Date(MS_PER_DAY * 1000)).toJSON(); const ANCHOR_TIMESTAMP_3000 = (new Date(MS_PER_DAY * 3000)).toJSON(); describe('context app', function () { - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); describe('function fetchPredecessors', function () { let fetchPredecessors; @@ -43,7 +45,7 @@ describe('context app', function () { $provide.value('indexPatterns', createIndexPatternsStub()); })); - beforeEach(ngMock.inject(function createPrivateStubs(Private) { + beforeEach(ngMock.inject(function createPrivateStubs() { searchSourceStub = createContextSearchSourceStub([], '@timestamp', MS_PER_DAY * 8); fetchPredecessors = (indexPatternId, timeField, sortDir, timeValIso, timeValNr, tieBreakerField, tieBreakerValue, size) => { const anchor = { @@ -53,7 +55,7 @@ describe('context app', function () { sort: [timeValNr, tieBreakerValue] }; - return Private(fetchContextProvider).fetchSurroundingDocs( + return fetchContextProvider(createIndexPatternsStub()).fetchSurroundingDocs( 'predecessors', indexPatternId, anchor, diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/successors.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/successors.js index 486c8ed9b410eb..145de081f0d443 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/successors.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/__tests__/successors.js @@ -21,6 +21,7 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; import moment from 'moment'; import * as _ from 'lodash'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import { createIndexPatternsStub, createContextSearchSourceStub } from './_stubs'; @@ -32,17 +33,14 @@ const ANCHOR_TIMESTAMP_3 = (new Date(MS_PER_DAY * 3)).toJSON(); const ANCHOR_TIMESTAMP_3000 = (new Date(MS_PER_DAY * 3000)).toJSON(); describe('context app', function () { - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); describe('function fetchSuccessors', function () { let fetchSuccessors; let searchSourceStub; - beforeEach(ngMock.module(function createServiceStubs($provide) { - $provide.value('indexPatterns', createIndexPatternsStub()); - })); - - beforeEach(ngMock.inject(function createPrivateStubs(Private) { + beforeEach(ngMock.inject(function createPrivateStubs() { searchSourceStub = createContextSearchSourceStub([], '@timestamp'); fetchSuccessors = (indexPatternId, timeField, sortDir, timeValIso, timeValNr, tieBreakerField, tieBreakerValue, size) => { @@ -53,7 +51,7 @@ describe('context app', function () { sort: [timeValNr, tieBreakerValue] }; - return Private(fetchContextProvider).fetchSurroundingDocs( + return fetchContextProvider(createIndexPatternsStub()).fetchSurroundingDocs( 'successors', indexPatternId, anchor, diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/anchor.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/anchor.js index 8c4cce810ca131..730b963d0474ef 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/anchor.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/anchor.js @@ -19,17 +19,15 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; -import { getServices } from '../../../kibana_services'; -const { SearchSource } = getServices(); -export function fetchAnchorProvider(indexPatterns) { +export function fetchAnchorProvider(indexPatterns, searchSource) { return async function fetchAnchor( indexPatternId, anchorId, sort ) { const indexPattern = await indexPatterns.get(indexPatternId); - const searchSource = new SearchSource() + searchSource .setParent(undefined) .setField('index', indexPattern) .setField('version', true) diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/context.ts b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/context.ts index 68ccf56594e723..674f5616faa306 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/context.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/context.ts @@ -17,9 +17,8 @@ * under the License. */ -import { SortDirection } from '../../../../../../../ui/public/courier'; -import { IndexPatterns, IndexPattern, getServices } from '../../../kibana_services'; -import { reverseSortDir } from './utils/sorting'; +import { IndexPatterns, IndexPattern, SearchSource } from '../../../kibana_services'; +import { reverseSortDir, SortDirection } from './utils/sorting'; import { extractNanos, convertIsoToMillis } from './utils/date_conversion'; import { fetchHitsInInterval } from './utils/fetch_hits_in_interval'; import { generateIntervals } from './utils/generate_intervals'; @@ -35,8 +34,6 @@ export interface EsHitRecord { } export type EsHitRecordList = EsHitRecord[]; -const { SearchSource } = getServices(); - const DAY_MILLIS = 24 * 60 * 60 * 1000; // look from 1 day up to 10000 days into the past and future diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/__tests__/sorting.test.ts b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/__tests__/sorting.test.ts index 33f4454c18d400..eeae2aa2c5d0ae 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/__tests__/sorting.test.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/__tests__/sorting.test.ts @@ -16,10 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { reverseSortDir } from '../sorting'; -import { SortDirection } from '../../../../../../../../../ui/public/courier'; - -jest.mock('ui/new_platform'); +import { reverseSortDir, SortDirection } from '../sorting'; describe('function reverseSortDir', function() { test('reverse a given sort direction', function() { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/sorting.ts b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/sorting.ts index 47385aecb19373..4a0f531845f46e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/sorting.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/api/utils/sorting.ts @@ -17,9 +17,13 @@ * under the License. */ -import { SortDirection } from '../../../../../../../../ui/public/courier'; import { IndexPattern } from '../../../../kibana_services'; +export enum SortDirection { + asc = 'asc', + desc = 'desc', +} + /** * The list of field names that are allowed for sorting, but not included in * index pattern fields. diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/components/action_bar/action_bar_directive.ts b/src/legacy/core_plugins/kibana/public/discover/angular/context/components/action_bar/action_bar_directive.ts index 579d9d95c6f719..55a378367392c4 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/components/action_bar/action_bar_directive.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/components/action_bar/action_bar_directive.ts @@ -16,11 +16,9 @@ * specific language governing permissions and limitations * under the License. */ -import { getServices } from '../../../../kibana_services'; +import { getAngularModule, wrapInI18nContext } from '../../../../kibana_services'; import { ActionBar } from './action_bar'; -const { uiModules, wrapInI18nContext } = getServices(); - -uiModules.get('apps/context').directive('contextActionBar', function(reactDirective: any) { +getAngularModule().directive('contextActionBar', function(reactDirective: any) { return reactDirective(wrapInI18nContext(ActionBar)); }); diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query/actions.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query/actions.js index b88e54379f448e..4a9480f9ea2ea5 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query/actions.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query/actions.js @@ -20,22 +20,22 @@ import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { toastNotifications } from '../../../kibana_services'; +import { getServices, SearchSource } from '../../../kibana_services'; import { fetchAnchorProvider } from '../api/anchor'; import { fetchContextProvider } from '../api/context'; -import { QueryParameterActionsProvider } from '../query_parameters'; +import { getQueryParameterActions } from '../query_parameters'; import { FAILURE_REASONS, LOADING_STATUS } from './constants'; import { MarkdownSimple } from '../../../../../../kibana_react/public'; -export function QueryActionsProvider(Private, Promise) { - const fetchAnchor = Private(fetchAnchorProvider); - const { fetchSurroundingDocs } = Private(fetchContextProvider); +export function QueryActionsProvider(Promise) { + const fetchAnchor = fetchAnchorProvider(getServices().indexPatterns, new SearchSource()); + const { fetchSurroundingDocs } = fetchContextProvider(getServices().indexPatterns); const { setPredecessorCount, setQueryParameters, setSuccessorCount, - } = Private(QueryParameterActionsProvider); + } = getQueryParameterActions(); const setFailedStatus = (state) => (subject, details = {}) => ( state.loadingStatus[subject] = { @@ -79,7 +79,7 @@ export function QueryActionsProvider(Private, Promise) { }, (error) => { setFailedStatus(state)('anchor', { error }); - toastNotifications.addDanger({ + getServices().toastNotifications.addDanger({ title: i18n.translate('kbn.context.unableToLoadAnchorDocumentDescription', { defaultMessage: 'Unable to load the anchor document' }), @@ -128,7 +128,7 @@ export function QueryActionsProvider(Private, Promise) { }, (error) => { setFailedStatus(state)(type, { error }); - toastNotifications.addDanger({ + getServices().toastNotifications.addDanger({ title: i18n.translate('kbn.context.unableToLoadDocumentDescription', { defaultMessage: 'Unable to load documents' }), diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_add_filter.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_add_filter.js index 5a445a65939eda..645ca32924ede8 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_add_filter.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_add_filter.js @@ -19,15 +19,16 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; -import { getServices } from '../../../../kibana_services'; import { createStateStub } from './_utils'; -import { QueryParameterActionsProvider } from '../actions'; +import { getQueryParameterActions } from '../actions'; import { createIndexPatternsStub } from '../../api/__tests__/_stubs'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import { npStart } from 'ui/new_platform'; describe('context app', function () { - beforeEach(ngMock.module('kibana')); - + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(() => pluginInstance.initializeServices(true)); + beforeEach(ngMock.module('app/discover')); beforeEach(ngMock.module(function createServiceStubs($provide) { $provide.value('indexPatterns', createIndexPatternsStub()); })); @@ -35,9 +36,8 @@ describe('context app', function () { describe('action addFilter', function () { let addFilter; - beforeEach(ngMock.inject(function createPrivateStubs(Private) { - Private.stub(getServices().FilterBarQueryFilterProvider); - addFilter = Private(QueryParameterActionsProvider).addFilter; + beforeEach(ngMock.inject(function createPrivateStubs() { + addFilter = getQueryParameterActions().addFilter; })); it('should pass the given arguments to the filterManager', function () { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_predecessor_count.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_predecessor_count.js index 7c1fa320ae17bf..a8bef6fe75c79d 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_predecessor_count.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_predecessor_count.js @@ -19,19 +19,21 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; - +import { pluginInstance } from 'plugins/kibana/discover/index'; import { createStateStub } from './_utils'; -import { QueryParameterActionsProvider } from '../actions'; +import { getQueryParameterActions } from '../actions'; describe('context app', function () { - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(() => pluginInstance.initializeServices(true)); + beforeEach(ngMock.module('app/discover')); describe('action setPredecessorCount', function () { let setPredecessorCount; - beforeEach(ngMock.inject(function createPrivateStubs(Private) { - setPredecessorCount = Private(QueryParameterActionsProvider).setPredecessorCount; + beforeEach(ngMock.inject(function createPrivateStubs() { + setPredecessorCount = getQueryParameterActions().setPredecessorCount; })); it('should set the predecessorCount to the given value', function () { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_query_parameters.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_query_parameters.js index 853c5726b3da52..a43a8a11a7bf82 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_query_parameters.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_query_parameters.js @@ -19,19 +19,22 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import { createStateStub } from './_utils'; -import { QueryParameterActionsProvider } from '../actions'; +import { getQueryParameterActions } from '../actions'; describe('context app', function () { - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(() => pluginInstance.initializeServices(true)); + beforeEach(ngMock.module('app/discover')); describe('action setQueryParameters', function () { let setQueryParameters; - beforeEach(ngMock.inject(function createPrivateStubs(Private) { - setQueryParameters = Private(QueryParameterActionsProvider).setQueryParameters; + beforeEach(ngMock.inject(function createPrivateStubs() { + setQueryParameters = getQueryParameterActions().setQueryParameters; })); it('should update the queryParameters with valid properties from the given object', function () { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_successor_count.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_successor_count.js index d63bf2ecf53af8..4bbd462aaa4b08 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_successor_count.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/__tests__/action_set_successor_count.js @@ -19,19 +19,22 @@ import expect from '@kbn/expect'; import ngMock from 'ng_mock'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import { createStateStub } from './_utils'; -import { QueryParameterActionsProvider } from '../actions'; +import { getQueryParameterActions } from '../actions'; describe('context app', function () { - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(() => pluginInstance.initializeServices(true)); + beforeEach(ngMock.module('app/discover')); describe('action setSuccessorCount', function () { let setSuccessorCount; - beforeEach(ngMock.inject(function createPrivateStubs(Private) { - setSuccessorCount = Private(QueryParameterActionsProvider).setSuccessorCount; + beforeEach(ngMock.inject(function createPrivateStubs() { + setSuccessorCount = getQueryParameterActions().setSuccessorCount; })); it('should set the successorCount to the given value', function () { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/actions.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/actions.js index 10fe6c0e2eda1f..28b35a1b81a7b3 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/actions.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/actions.js @@ -18,8 +18,8 @@ */ import _ from 'lodash'; +import { getServices } from '../../../kibana_services'; import { generateFilters } from '../../../../../../../../plugins/data/public'; -import { npStart } from 'ui/new_platform'; import { MAX_CONTEXT_SIZE, @@ -28,8 +28,8 @@ import { } from './constants'; -export function QueryParameterActionsProvider(indexPatterns) { - const { filterManager } = npStart.plugins.data.query; +export function getQueryParameterActions() { + const filterManager = getServices().filterManager; const setPredecessorCount = (state) => (predecessorCount) => ( state.queryParameters.predecessorCount = clamp( @@ -62,7 +62,7 @@ export function QueryParameterActionsProvider(indexPatterns) { const indexPatternId = state.queryParameters.indexPatternId; const newFilters = generateFilters(filterManager, field, values, operation, indexPatternId); filterManager.addFilters(newFilters); - const indexPattern = await indexPatterns.get(indexPatternId); + const indexPattern = await getServices().indexPatterns.get(indexPatternId); indexPattern.popularizeField(field.name, 1); }; diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/index.js b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/index.js index 3e7f47668df59a..14be90a3f61a43 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/index.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context/query_parameters/index.js @@ -17,7 +17,7 @@ * under the License. */ -export { QueryParameterActionsProvider } from './actions'; +export { getQueryParameterActions } from './actions'; export { MAX_CONTEXT_SIZE, MIN_CONTEXT_SIZE, diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/context_app.js b/src/legacy/core_plugins/kibana/public/discover/angular/context_app.js index c9856ad7949523..46093177123795 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/context_app.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/context_app.js @@ -18,13 +18,13 @@ */ import _ from 'lodash'; -import { getServices, callAfterBindingsWorkaround } from './../kibana_services'; +import { getServices, callAfterBindingsWorkaround, getAngularModule } from './../kibana_services'; import contextAppTemplate from './context_app.html'; import './context/components/action_bar'; import { getFirstSortableField } from './context/api/utils/sorting'; import { createInitialQueryParametersState, - QueryParameterActionsProvider, + getQueryParameterActions, QUERY_PARAMETER_KEYS, } from './context/query_parameters'; import { @@ -34,17 +34,12 @@ import { QueryActionsProvider, } from './context/query'; -const { uiModules, timefilter } = getServices(); +const { timefilter } = getServices(); // load directives import '../../../../data/public/legacy'; -const module = uiModules.get('apps/context', [ - 'elasticsearch', - 'kibana', - 'kibana/config', - 'ngRoute', -]); +const module = getAngularModule(); module.directive('contextApp', function ContextApp() { return { @@ -67,7 +62,7 @@ module.directive('contextApp', function ContextApp() { }); function ContextAppController($scope, config, Private) { - const queryParameterActions = Private(QueryParameterActionsProvider); + const queryParameterActions = getQueryParameterActions(); const queryActions = Private(QueryActionsProvider); timefilter.disableAutoRefreshSelector(); diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/directives/histogram.tsx b/src/legacy/core_plugins/kibana/public/discover/angular/directives/histogram.tsx index ab336396b5bed2..496e1cf375588e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/directives/histogram.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/angular/directives/histogram.tsx @@ -70,7 +70,7 @@ export class DiscoverHistogram extends Component this.setState({ chartsTheme })); + .subscribe((chartsTheme: EuiChartThemeType['theme']) => this.setState({ chartsTheme })); } componentWillUnmount() { diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/directives/index.js b/src/legacy/core_plugins/kibana/public/discover/angular/directives/index.js index b0b766478450fc..f1e783c56263e8 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/directives/index.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/directives/index.js @@ -23,10 +23,9 @@ import { DiscoverNoResults } from './no_results'; import { DiscoverUninitialized } from './uninitialized'; import { DiscoverUnsupportedIndexPattern } from './unsupported_index_pattern'; import { DiscoverHistogram } from './histogram'; -import { getServices } from '../../kibana_services'; +import { getAngularModule, wrapInI18nContext } from '../../kibana_services'; -const { wrapInI18nContext, uiModules } = getServices(); -const app = uiModules.get('apps/discover', ['react']); +const app = getAngularModule(); app.directive('discoverNoResults', reactDirective => reactDirective(wrapInI18nContext(DiscoverNoResults)) diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/angular/discover.js index 0e92d048a65a98..7af7ee235a166b 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/discover.js @@ -23,7 +23,6 @@ import { Subscription } from 'rxjs'; import moment from 'moment'; import dateMath from '@elastic/datemath'; import { i18n } from '@kbn/i18n'; -import '../saved_searches/saved_searches'; import '../components/field_chooser/field_chooser'; // doc table @@ -33,7 +32,7 @@ import { getSortForSearchSource } from './doc_table/lib/get_sort_for_search_sour import * as columnActions from './doc_table/actions/columns'; import indexTemplate from './discover.html'; -import { showOpenSearchPanel } from '../top_nav/show_open_search_panel'; +import { showOpenSearchPanel } from '../components/top_nav/show_open_search_panel'; import { addHelpMenuToAppChrome } from '../components/help_menu/help_menu_util'; import '../components/fetch_error'; import { getPainlessError } from './get_painless_error'; @@ -57,28 +56,31 @@ import { vislibSeriesResponseHandlerProvider, Vis, SavedObjectSaveModal, + getAngularModule, ensureDefaultIndexPattern, } from '../kibana_services'; const { core, chrome, + data, docTitle, - FilterBarQueryFilterProvider, + filterManager, + State, share, - StateProvider, timefilter, - npData, toastNotifications, - uiModules, - uiRoutes, -} = getServices(); + uiSettings +} = getServices(); -import { getRootBreadcrumbs, getSavedSearchBreadcrumbs } from '../breadcrumbs'; +import { getRootBreadcrumbs, getSavedSearchBreadcrumbs } from '../helpers/breadcrumbs'; +import { start as dataLP } from '../../../../data/public/legacy'; import { generateFilters } from '../../../../../../plugins/data/public'; -import { start as data } from '../../../../data/public/legacy'; +import { getIndexPatternId } from '../helpers/get_index_pattern_id'; +import { registerTimefilterWithGlobalStateFactory } from '../../../../../ui/public/timefilter/setup_router'; +import { FilterStateManager } from '../../../../data/public/filter/filter_manager'; -const savedQueryService = npData.query.savedQueries; +const { savedQueryService } = data.query.savedQueries; const fetchStatuses = { UNINITIALIZED: 'uninitialized', @@ -86,20 +88,20 @@ const fetchStatuses = { COMPLETE: 'complete', }; -const app = uiModules.get('apps/discover', [ - 'kibana/url', - 'kibana/index_patterns' -]); +const app = getAngularModule(); +app.run((globalState, $rootScope) => {registerTimefilterWithGlobalStateFactory( + timefilter, + globalState, + $rootScope +); +}); -uiRoutes - .defaults(/^\/discover(\/|$)/, { +app.config($routeProvider => { + const defaults = { + requireDefaultIndex: true, requireUICapability: 'discover.show', k7Breadcrumbs: ($route, $injector) => - $injector.invoke( - $route.current.params.id - ? getSavedSearchBreadcrumbs - : getRootBreadcrumbs - ), + $injector.invoke($route.current.params.id ? getSavedSearchBreadcrumbs : getRootBreadcrumbs), badge: uiCapabilities => { if (uiCapabilities.discover.save) { return undefined; @@ -112,21 +114,21 @@ uiRoutes tooltip: i18n.translate('kbn.discover.badge.readOnly.tooltip', { defaultMessage: 'Unable to save searches', }), - iconType: 'glasses' + iconType: 'glasses', }; - } - }) - .when('/discover/:id?', { + }, + }; + $routeProvider.when('/discover/:id?', { + ...defaults, template: indexTemplate, reloadOnSearch: false, resolve: { - savedObjects: function (Promise, indexPatterns, config, Private, $rootScope, kbnUrl, redirectWhenMissing, savedSearches, $route) { - const State = Private(StateProvider); + savedObjects: function (redirectWhenMissing, $route, kbnUrl, Promise, $rootScope) { + const indexPatterns = dataLP.indexPatterns.indexPatterns; const savedSearchId = $route.current.params.id; - - return ensureDefaultIndexPattern(core, data, $rootScope, kbnUrl).then(() => { + return ensureDefaultIndexPattern(core, dataLP, $rootScope, kbnUrl).then(() => { return Promise.props({ - ip: indexPatterns.getCache().then((savedObjects) => { + ip: indexPatterns.getCache().then((indexPatternList) => { /** * In making the indexPattern modifiable it was placed in appState. Unfortunately, * the load order of AppState conflicts with the load order of many other things @@ -138,19 +140,16 @@ uiRoutes */ const state = new State('_a', {}); - const specified = !!state.index; - const exists = _.findIndex(savedObjects, o => o.id === state.index) > -1; - const id = exists ? state.index : config.get('defaultIndex'); + const id = getIndexPatternId(state.index, indexPatternList, uiSettings.get('defaultIndex')); state.destroy(); - return Promise.props({ - list: savedObjects, + list: indexPatternList, loaded: indexPatterns.get(id), stateVal: state.index, - stateValFound: specified && exists + stateValFound: !!state.index && id === state.index, }); }), - savedSearch: savedSearches.get(savedSearchId) + savedSearch: getServices().getSavedSearchById(savedSearchId, kbnUrl) .then((savedSearch) => { if (savedSearchId) { chrome.recentlyAccessed.add( @@ -169,6 +168,7 @@ uiRoutes }, } }); +}); app.directive('discoverApp', function () { return { @@ -190,12 +190,14 @@ function discoverController( config, kbnUrl, localStorage, - uiCapabilities + uiCapabilities, + getAppState, + globalState, ) { const responseHandler = vislibSeriesResponseHandlerProvider().handler; const getUnhashableStates = Private(getUnhashableStatesProvider); + const filterStateManager = new FilterStateManager(globalState, getAppState, filterManager); - const queryFilter = Private(FilterBarQueryFilterProvider); const inspectorAdapters = { requests: new RequestAdapter() @@ -235,6 +237,7 @@ function discoverController( if (abortController) abortController.abort(); savedSearch.destroy(); subscriptions.unsubscribe(); + filterStateManager.destroy(); }); const $appStatus = $scope.appStatus = this.appStatus = { @@ -393,7 +396,7 @@ function discoverController( $scope.searchSource.setParent(timeRangeSearchSource); const pageTitleSuffix = savedSearch.id && savedSearch.title ? `: ${savedSearch.title}` : ''; - docTitle.change(`Discover${pageTitleSuffix}`); + chrome.docTitle.change(`Discover${pageTitleSuffix}`); const discoverBreadcrumbsTitle = i18n.translate('kbn.discover.discoverBreadcrumbTitle', { defaultMessage: 'Discover', }); @@ -413,16 +416,16 @@ function discoverController( const $state = $scope.state = new AppState(getStateDefaults()); - $scope.filters = queryFilter.getFilters(); + $scope.filters = filterManager.getFilters(); $scope.screenTitle = savedSearch.title; $scope.onFiltersUpdated = filters => { - // The filters will automatically be set when the queryFilter emits an update event (see below) - queryFilter.setFilters(filters); + // The filters will automatically be set when the filterManager emits an update event (see below) + filterManager.setFilters(filters); }; const getFieldCounts = async () => { - // the field counts aren't set until we have the data back, + // the field counts aren't set until we have the dataLP back, // so we wait for the fetch to be done before proceeding if ($scope.fetchStatus === fetchStatuses.COMPLETE) { return $scope.fieldCounts; @@ -578,22 +581,22 @@ function discoverController( if (!angular.equals(sort, currentSort)) $scope.fetch(); }); - // update data source when filters update - subscriptions.add(subscribeWithScope($scope, queryFilter.getUpdates$(), { + // update dataLP source when filters update + subscriptions.add(subscribeWithScope($scope, filterManager.getUpdates$(), { next: () => { - $scope.filters = queryFilter.getFilters(); + $scope.filters = filterManager.getFilters(); $scope.updateDataSource().then(function () { $state.save(); }); } })); - // fetch data when filters fire fetch event - subscriptions.add(subscribeWithScope($scope, queryFilter.getUpdates$(), { + // fetch dataLP when filters fire fetch event + subscriptions.add(subscribeWithScope($scope, filterManager.getUpdates$(), { next: $scope.fetch })); - // update data source when hitting forward/back and the query changes + // update dataLP source when hitting forward/back and the query changes $scope.$listen($state, 'fetch_with_changes', function (diff) { if (diff.indexOf('query') >= 0) $scope.fetch(); }); @@ -633,7 +636,7 @@ function discoverController( let prev = {}; const status = { UNINITIALIZED: 'uninitialized', - LOADING: 'loading', // initial data load + LOADING: 'loading', // initial dataLP load READY: 'ready', // results came back NO_RESULTS: 'none' // no results came back }; @@ -704,7 +707,7 @@ function discoverController( savedSearchTitle: savedSearch.title, } }), - 'data-test-subj': 'saveSearchSuccess', + 'dataLP-test-subj': 'saveSearchSuccess', }); if (savedSearch.id !== $route.current.params.id) { @@ -765,7 +768,7 @@ function discoverController( } else { toastNotifications.addError(error, { title: i18n.translate('kbn.discover.errorLoadingData', { - defaultMessage: 'Error loading data', + defaultMessage: 'Error loading dataLP', }), }); } @@ -813,10 +816,10 @@ function discoverController( function logInspectorRequest() { inspectorAdapters.requests.reset(); const title = i18n.translate('kbn.discover.inspectorRequestDataTitle', { - defaultMessage: 'Data', + defaultMessage: 'dataLP', }); const description = i18n.translate('kbn.discover.inspectorRequestDescription', { - defaultMessage: 'This request queries Elasticsearch to fetch the data for the search.', + defaultMessage: 'This request queries Elasticsearch to fetch the dataLP for the search.', }); inspectorRequest = inspectorAdapters.requests.start(title, { description }); inspectorRequest.stats(getRequestInspectorStats($scope.searchSource)); @@ -875,7 +878,7 @@ function discoverController( .setField('size', $scope.opts.sampleSize) .setField('sort', getSortForSearchSource($state.sort, indexPattern)) .setField('query', !$state.query ? null : $state.query) - .setField('filter', queryFilter.getFilters()); + .setField('filter', filterManager.getFilters()); }); $scope.setSortOrder = function setSortOrder(sortPair) { @@ -885,8 +888,8 @@ function discoverController( // TODO: On array fields, negating does not negate the combination, rather all terms $scope.filterQuery = function (field, values, operation) { $scope.indexPattern.popularizeField(field, 1); - const newFilters = generateFilters(queryFilter, field, values, operation, $scope.indexPattern.id); - return queryFilter.addFilters(newFilters); + const newFilters = generateFilters(filterManager, field, values, operation, $scope.indexPattern.id); + return filterManager.addFilters(newFilters); }; $scope.addColumn = function addColumn(columnName) { @@ -933,7 +936,7 @@ function discoverController( query: '', language: localStorage.get('kibana.userQueryLanguage') || config.get('search:queryLanguage'), }; - queryFilter.removeAll(); + filterManager.removeAll(); $state.save(); $scope.fetch(); }; @@ -941,8 +944,7 @@ function discoverController( const updateStateFromSavedQuery = (savedQuery) => { $state.query = savedQuery.attributes.query; $state.save(); - - queryFilter.setFilters(savedQuery.attributes.filters || []); + filterManager.setFilters(savedQuery.attributes.filters || []); if (savedQuery.attributes.timefilter) { timefilter.setTime({ @@ -972,7 +974,6 @@ function discoverController( $scope.savedQuery = undefined; return; } - if (!$scope.savedQuery || newSavedQueryId !== $scope.savedQuery.id) { savedQueryService.getSavedQuery(newSavedQueryId).then((savedQuery) => { $scope.$evalAsync(() => { @@ -983,6 +984,7 @@ function discoverController( } }); + async function setupVisualization() { // If no timefield has been specified we don't create a histogram of messages if (!$scope.opts.timefield) return; diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc.ts index e6c890c9a66a22..af9556656afab9 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc.ts @@ -16,13 +16,19 @@ * specific language governing permissions and limitations * under the License. */ -import { getServices, IndexPatterns } from '../kibana_services'; +import { getAngularModule, wrapInI18nContext, getServices } from '../kibana_services'; // @ts-ignore -import { getRootBreadcrumbs } from '../breadcrumbs'; +import { getRootBreadcrumbs } from '../helpers/breadcrumbs'; import html from './doc.html'; -import { Doc } from '../doc/doc'; -const { uiRoutes, uiModules, wrapInI18nContext, timefilter } = getServices(); -uiModules.get('apps/discover').directive('discoverDoc', function(reactDirective: any) { +import { Doc } from '../components/doc/doc'; + +interface LazyScope extends ng.IScope { + [key: string]: any; +} + +const { timefilter } = getServices(); +const app = getAngularModule(); +app.directive('discoverDoc', function(reactDirective: any) { return reactDirective( wrapInI18nContext(Doc), [ @@ -36,28 +42,28 @@ uiModules.get('apps/discover').directive('discoverDoc', function(reactDirective: ); }); -uiRoutes - // the old, pre 8.0 route, no longer used, keep it to stay compatible - // somebody might have bookmarked his favorite log messages - .when('/doc/:indexPattern/:index/:type', { - redirectTo: '/doc/:indexPattern/:index', - }) - // the new route, es 7 deprecated types, es 8 removed them - .when('/doc/:indexPattern/:index', { - controller: ($scope: any, $route: any, es: any, indexPatterns: IndexPatterns) => { - timefilter.disableAutoRefreshSelector(); - timefilter.disableTimeRangeSelector(); - $scope.esClient = es; - $scope.id = $route.current.params.id; - $scope.index = $route.current.params.index; - $scope.indexPatternId = $route.current.params.indexPattern; - $scope.indexPatternService = indexPatterns; - }, - template: html, - k7Breadcrumbs: ($route: any) => [ - ...getRootBreadcrumbs(), - { - text: `${$route.current.params.index}#${$route.current.params.id}`, +app.config(($routeProvider: any) => { + $routeProvider + .when('/discover/doc/:indexPattern/:index/:type', { + redirectTo: '/discover/doc/:indexPattern/:index', + }) + // the new route, es 7 deprecated types, es 8 removed them + .when('/discover/doc/:indexPattern/:index', { + controller: ($scope: LazyScope, $route: any, es: any) => { + timefilter.disableAutoRefreshSelector(); + timefilter.disableTimeRangeSelector(); + $scope.esClient = es; + $scope.id = $route.current.params.id; + $scope.index = $route.current.params.index; + $scope.indexPatternId = $route.current.params.indexPattern; + $scope.indexPatternService = getServices().indexPatterns; }, - ], - }); + template: html, + k7Breadcrumbs: ($route: any) => [ + ...getRootBreadcrumbs(), + { + text: `${$route.current.params.index}#${$route.current.params.id}`, + }, + ], + }); +}); diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/__tests__/doc_table.js b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/__tests__/doc_table.js index 417d521dd44eda..2c6718e44894fc 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/__tests__/doc_table.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/__tests__/doc_table.js @@ -22,7 +22,7 @@ import expect from '@kbn/expect'; import _ from 'lodash'; import ngMock from 'ng_mock'; import 'ui/private'; -import '..'; +import { pluginInstance } from 'plugins/kibana/discover/index'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; import hits from 'fixtures/real_hits'; @@ -65,8 +65,8 @@ const destroy = function () { describe('docTable', function () { let $elem; - - beforeEach(ngMock.module('kibana')); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); beforeEach(function () { $elem = angular.element(` pluginInstance.initializeServices(true)); + beforeEach(() => pluginInstance.initializeInnerAngular()); + beforeEach(ngMock.module('app/discover')); beforeEach( ngMock.inject(function (_config_, $rootScope, Private) { config = _config_; diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/index.js b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/index.ts similarity index 78% rename from src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/index.js rename to src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/index.ts index 7462de544dbce3..3a037971a1253d 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/index.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/pager/index.ts @@ -16,18 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -import { getServices } from '../../../../kibana_services'; +import { wrapInI18nContext } from '../../../../kibana_services'; import { ToolBarPagerText } from './tool_bar_pager_text'; import { ToolBarPagerButtons } from './tool_bar_pager_buttons'; -const { wrapInI18nContext, uiModules } = getServices(); - -const app = uiModules.get('kibana'); - -app.directive('toolBarPagerText', function (reactDirective) { +export function createToolBarPagerTextDirective(reactDirective: any) { return reactDirective(wrapInI18nContext(ToolBarPagerText)); -}); +} -app.directive('toolBarPagerButtons', function (reactDirective) { +export function createToolBarPagerButtonsDirective(reactDirective: any) { return reactDirective(wrapInI18nContext(ToolBarPagerButtons)); -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts index f447c545077293..c4312b3bc468a0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts @@ -17,11 +17,10 @@ * under the License. */ import { wrapInI18nContext } from 'ui/i18n'; -import { getServices } from '../../../kibana_services'; +import { UiSettingsClient } from 'kibana/public'; import { TableHeader } from './table_header/table_header'; -const module = getServices().uiModules.get('app/discover'); -module.directive('kbnTableHeader', function(reactDirective: any, config: any) { +export function createTableHeaderDirective(reactDirective: any, config: UiSettingsClient) { return reactDirective( wrapInI18nContext(TableHeader), [ @@ -40,4 +39,4 @@ module.directive('kbnTableHeader', function(reactDirective: any, config: any) { isShortDots: config.get('shortDots:enable'), } ); -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.js b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts similarity index 86% rename from src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.js rename to src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts index 6f5a94442e9774..883513173187ac 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts @@ -19,32 +19,34 @@ import _ from 'lodash'; import $ from 'jquery'; +import { UiSettingsClient } from 'kibana/public'; +// @ts-ignore import rison from 'rison-node'; import '../../doc_viewer'; +// @ts-ignore import { noWhiteSpace } from '../../../../../common/utils/no_white_space'; import openRowHtml from './table_row/open.html'; import detailsHtml from './table_row/details.html'; -import { getServices } from '../../../kibana_services'; + import { dispatchRenderComplete } from '../../../../../../../../plugins/kibana_utils/public'; import cellTemplateHtml from '../components/table_row/cell.html'; import truncateByHeightTemplateHtml from '../components/table_row/truncate_by_height.html'; import { esFilters } from '../../../../../../../../plugins/data/public'; -const module = getServices().uiModules.get('app/discover'); - // guesstimate at the minimum number of chars wide cells in the table should be const MIN_LINE_LENGTH = 20; -/** - * kbnTableRow directive - * - * Display a row in the table - * ``` - * - * ``` - */ -module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl, config) { +interface LazyScope extends ng.IScope { + [key: string]: any; +} + +export function createTableRowDirective( + $compile: ng.ICompileService, + $httpParamSerializer: any, + kbnUrl: any, + config: UiSettingsClient +) { const cellTemplate = _.template(noWhiteSpace(cellTemplateHtml)); const truncateByHeightTemplate = _.template(noWhiteSpace(truncateByHeightTemplateHtml)); @@ -59,18 +61,18 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl onAddColumn: '=?', onRemoveColumn: '=?', }, - link: function ($scope, $el) { + link: ($scope: LazyScope, $el: JQuery) => { $el.after(''); $el.empty(); // when we compile the details, we use this $scope - let $detailsScope; + let $detailsScope: LazyScope; // when we compile the toggle button in the summary, we use this $scope let $toggleScope; // toggle display of the rows details, a full list of the fields from each row - $scope.toggleRow = function () { + $scope.toggleRow = () => { const $detailsTr = $el.next(); $scope.open = !$scope.open; @@ -99,18 +101,18 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl $compile($detailsTr)($detailsScope); }; - $scope.$watchMulti(['indexPattern.timeFieldName', 'row.highlight', '[]columns'], function () { - createSummaryRow($scope.row, $scope.row._id); + $scope.$watchMulti(['indexPattern.timeFieldName', 'row.highlight', '[]columns'], () => { + createSummaryRow($scope.row); }); - $scope.inlineFilter = function inlineFilter($event, type) { + $scope.inlineFilter = function inlineFilter($event: any, type: string) { const column = $($event.target).data().column; const field = $scope.indexPattern.fields.getByName(column); $scope.filter(field, $scope.flattenedRow[column], type); }; $scope.getContextAppHref = () => { - const path = kbnUrl.eval('#/context/{{ indexPattern }}/{{ anchorId }}', { + const path = kbnUrl.eval('#/discover/context/{{ indexPattern }}/{{ anchorId }}', { anchorId: $scope.row._id, indexPattern: $scope.indexPattern.id, }); @@ -124,7 +126,7 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl }; // create a tr element that lists the value for each *column* - function createSummaryRow(row) { + function createSummaryRow(row: any) { const indexPattern = $scope.indexPattern; $scope.flattenedRow = indexPattern.flattenHit(row); @@ -145,7 +147,7 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl ); } - $scope.columns.forEach(function (column) { + $scope.columns.forEach(function(column: any) { const isFilterable = $scope.flattenedRow[column] !== undefined && mapping(column) && @@ -164,11 +166,11 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl }); let $cells = $el.children(); - newHtmls.forEach(function (html, i) { + newHtmls.forEach(function(html, i) { const $cell = $cells.eq(i); if ($cell.data('discover:html') === html) return; - const reuse = _.find($cells.slice(i + 1), function (cell) { + const reuse = _.find($cells.slice(i + 1), function(cell: any) { return $.data(cell, 'discover:html') === html; }); @@ -202,7 +204,7 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl /** * Fill an element with the value of a field */ - function _displayField(row, fieldName, truncate) { + function _displayField(row: any, fieldName: string, truncate = false) { const indexPattern = $scope.indexPattern; const text = indexPattern.formatField(row, fieldName); @@ -216,4 +218,4 @@ module.directive('kbnTableRow', function ($compile, $httpParamSerializer, kbnUrl } }, }; -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row/details.html b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row/details.html index 5c8785e8dc5f9f..d149a9023816a8 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row/details.html +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row/details.html @@ -30,7 +30,7 @@ @@ -48,5 +48,5 @@ on-remove-column="onRemoveColumn" > - + diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.js b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.js deleted file mode 100644 index 72943671fec22d..00000000000000 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.js +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import _ from 'lodash'; -import html from './doc_table.html'; -import './infinite_scroll'; -import './components/table_header'; -import './components/table_row'; -import { dispatchRenderComplete } from '../../../../../../../plugins/kibana_utils/public'; -import { getServices } from '../../kibana_services'; -import './components/pager'; -import './lib/pager'; - -import { getLimitedSearchResultsMessage } from './doc_table_strings'; - -const { uiModules } = getServices(); - -uiModules.get('app/discover') - .directive('docTable', function (config, getAppState, pagerFactory, $filter) { - return { - restrict: 'E', - template: html, - scope: { - sorting: '=', - columns: '=', - hits: '=', - totalHitCount: '=', - indexPattern: '=', - isLoading: '=?', - infiniteScroll: '=?', - filter: '=?', - filters: '=?', - minimumVisibleRows: '=?', - onAddColumn: '=?', - onChangeSortOrder: '=?', - onMoveColumn: '=?', - onRemoveColumn: '=?', - inspectorAdapters: '=?', - }, - link: function ($scope, $el) { - $scope.$watch('minimumVisibleRows', (minimumVisibleRows) => { - $scope.limit = Math.max(minimumVisibleRows || 50, $scope.limit || 50); - }); - - $scope.persist = { - sorting: $scope.sorting, - columns: $scope.columns - }; - - const limitTo = $filter('limitTo'); - const calculateItemsOnPage = () => { - $scope.pager.setTotalItems($scope.hits.length); - $scope.pageOfItems = limitTo($scope.hits, $scope.pager.pageSize, $scope.pager.startIndex); - }; - - $scope.limitedResultsWarning = getLimitedSearchResultsMessage(config.get('discover:sampleSize')); - - $scope.addRows = function () { - $scope.limit += 50; - }; - - // This exists to fix the problem of an empty initial column list not playing nice with watchCollection. - $scope.$watch('columns', function (columns) { - if (columns.length !== 0) return; - - const $state = getAppState(); - $scope.columns.push('_source'); - if ($state) $state.replace(); - }); - - $scope.$watchCollection('columns', function (columns, oldColumns) { - if (oldColumns.length === 1 && oldColumns[0] === '_source' && $scope.columns.length > 1) { - _.pull($scope.columns, '_source'); - } - - if ($scope.columns.length === 0) $scope.columns.push('_source'); - }); - - $scope.$watch('hits', hits => { - if (!hits) return; - - // Reset infinite scroll limit - $scope.limit = 50; - - if (hits.length === 0) { - dispatchRenderComplete($el[0]); - } - - if ($scope.infiniteScroll) return; - $scope.pager = pagerFactory.create(hits.length, 50, 1); - calculateItemsOnPage(); - }); - - $scope.pageOfItems = []; - $scope.onPageNext = () => { - $scope.pager.nextPage(); - calculateItemsOnPage(); - }; - - $scope.onPagePrevious = () => { - $scope.pager.previousPage(); - calculateItemsOnPage(); - }; - - $scope.shouldShowLimitedResultsWarning = () => ( - !$scope.pager.hasNextPage && $scope.pager.totalItems < $scope.totalHitCount - ); - } - }; - }); diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts new file mode 100644 index 00000000000000..1be87bfa1f3b25 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts @@ -0,0 +1,133 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import _ from 'lodash'; +import { UiSettingsClient } from 'kibana/public'; +import html from './doc_table.html'; +import './infinite_scroll'; +import './components/table_header'; +import './components/table_row'; +import { dispatchRenderComplete } from '../../../../../../../plugins/kibana_utils/public'; +import './components/pager'; +import './lib/pager'; +// @ts-ignore +import { getLimitedSearchResultsMessage } from './doc_table_strings'; + +interface LazyScope extends ng.IScope { + [key: string]: any; +} + +export function createDocTableDirective( + config: UiSettingsClient, + getAppState: any, + pagerFactory: any, + $filter: any +) { + return { + restrict: 'E', + template: html, + scope: { + sorting: '=', + columns: '=', + hits: '=', + totalHitCount: '=', + indexPattern: '=', + isLoading: '=?', + infiniteScroll: '=?', + filter: '=?', + filters: '=?', + minimumVisibleRows: '=?', + onAddColumn: '=?', + onChangeSortOrder: '=?', + onMoveColumn: '=?', + onRemoveColumn: '=?', + inspectorAdapters: '=?', + }, + link: ($scope: LazyScope, $el: JQuery) => { + $scope.$watch('minimumVisibleRows', (minimumVisibleRows: number) => { + $scope.limit = Math.max(minimumVisibleRows || 50, $scope.limit || 50); + }); + + $scope.persist = { + sorting: $scope.sorting, + columns: $scope.columns, + }; + + const limitTo = $filter('limitTo'); + const calculateItemsOnPage = () => { + $scope.pager.setTotalItems($scope.hits.length); + $scope.pageOfItems = limitTo($scope.hits, $scope.pager.pageSize, $scope.pager.startIndex); + }; + + $scope.limitedResultsWarning = getLimitedSearchResultsMessage( + config.get('discover:sampleSize') + ); + + $scope.addRows = function() { + $scope.limit += 50; + }; + + // This exists to fix the problem of an empty initial column list not playing nice with watchCollection. + $scope.$watch('columns', function(columns: string[]) { + if (columns.length !== 0) return; + + const $state = getAppState(); + $scope.columns.push('_source'); + if ($state) $state.replace(); + }); + + $scope.$watchCollection('columns', function(columns: string[], oldColumns: string[]) { + if (oldColumns.length === 1 && oldColumns[0] === '_source' && $scope.columns.length > 1) { + _.pull($scope.columns, '_source'); + } + + if ($scope.columns.length === 0) $scope.columns.push('_source'); + }); + + $scope.$watch('hits', (hits: any) => { + if (!hits) return; + + // Reset infinite scroll limit + $scope.limit = 50; + + if (hits.length === 0) { + dispatchRenderComplete($el[0]); + } + + if ($scope.infiniteScroll) return; + $scope.pager = pagerFactory.create(hits.length, 50, 1); + calculateItemsOnPage(); + }); + + $scope.pageOfItems = []; + $scope.onPageNext = () => { + $scope.pager.nextPage(); + calculateItemsOnPage(); + }; + + $scope.onPagePrevious = () => { + $scope.pager.previousPage(); + calculateItemsOnPage(); + }; + + $scope.shouldShowLimitedResultsWarning = () => + !$scope.pager.hasNextPage && $scope.pager.totalItems < $scope.totalHitCount; + }, + }; +} diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/infinite_scroll.js b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/infinite_scroll.ts similarity index 68% rename from src/legacy/core_plugins/kibana/public/discover/angular/doc_table/infinite_scroll.js rename to src/legacy/core_plugins/kibana/public/discover/angular/doc_table/infinite_scroll.ts index bf12deeb6b05fa..1a8ad372bbb8a2 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/infinite_scroll.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/infinite_scroll.ts @@ -18,30 +18,32 @@ */ import $ from 'jquery'; -import { getServices } from '../../kibana_services'; -const module = getServices().uiModules.get('app/discover'); +interface LazyScope extends ng.IScope { + [key: string]: any; +} -module.directive('kbnInfiniteScroll', function () { +export function createInfiniteScrollDirective() { return { restrict: 'E', scope: { - more: '=' + more: '=', }, - link: function ($scope, $element) { + link: ($scope: LazyScope, $element: JQuery) => { const $window = $(window); - let checkTimer; + let checkTimer: any; function onScroll() { if (!$scope.more) return; - const winHeight = $window.height(); - const winBottom = winHeight + $window.scrollTop(); - const elTop = $element.offset().top; + const winHeight = Number($window.height()); + const winBottom = Number(winHeight) + Number($window.scrollTop()); + const offset = $element.offset(); + const elTop = offset ? offset.top : 0; const remaining = elTop - winBottom; - if (remaining <= winHeight * 0.50) { - $scope[$scope.$$phase ? '$eval' : '$apply'](function () { + if (remaining <= winHeight * 0.5) { + $scope[$scope.$$phase ? '$eval' : '$apply'](function() { $scope.more(); }); } @@ -49,18 +51,18 @@ module.directive('kbnInfiniteScroll', function () { function scheduleCheck() { if (checkTimer) return; - checkTimer = setTimeout(function () { + checkTimer = setTimeout(function() { checkTimer = null; onScroll(); }, 50); } $window.on('scroll', scheduleCheck); - $scope.$on('$destroy', function () { + $scope.$on('$destroy', function() { clearTimeout(checkTimer); $window.off('scroll', scheduleCheck); }); scheduleCheck(); - } + }, }; -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/pager_factory.js b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/pager_factory.ts similarity index 83% rename from src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/pager_factory.js rename to src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/pager_factory.ts index 5d488fab0c87ff..fe576b63568dd6 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/pager_factory.js +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/pager/pager_factory.ts @@ -16,16 +16,13 @@ * specific language governing permissions and limitations * under the License. */ - -import { getServices } from '../../../../kibana_services'; +// @ts-ignore import { Pager } from './pager'; -const app = getServices().uiModules.get('kibana'); - -app.factory('pagerFactory', () => { +export function createPagerFactory() { return { - create(...args) { + create(...args: unknown[]) { return new Pager(...args); - } + }, }; -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_viewer.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_viewer.ts index c13c3545284139..6ba47b839563bc 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_viewer.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_viewer.ts @@ -17,13 +17,9 @@ * under the License. */ -// @ts-ignore -import { getServices } from '../kibana_services'; -import { DocViewer } from '../doc_viewer/doc_viewer'; +import { DocViewer } from '../components/doc_viewer/doc_viewer'; -const { uiModules } = getServices(); - -uiModules.get('apps/discover').directive('docViewer', (reactDirective: any) => { +export function createDocViewerDirective(reactDirective: any) { return reactDirective( DocViewer, [ @@ -46,4 +42,4 @@ uiModules.get('apps/discover').directive('docViewer', (reactDirective: any) => { }, } ); -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/application.ts b/src/legacy/core_plugins/kibana/public/discover/application.ts new file mode 100644 index 00000000000000..83f4a5962e3cdf --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/discover/application.ts @@ -0,0 +1,43 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import angular from 'angular'; + +/** + * Here's where Discover's inner angular is mounted and rendered + */ +export async function renderApp(moduleName: string, element: HTMLElement) { + await import('./angular'); + const $injector = mountDiscoverApp(moduleName, element); + return () => $injector.get('$rootScope').$destroy(); +} + +function mountDiscoverApp(moduleName: string, element: HTMLElement) { + const mountpoint = document.createElement('div'); + const appWrapper = document.createElement('div'); + appWrapper.setAttribute('ng-view', ''); + mountpoint.appendChild(appWrapper); + // bootstrap angular into detached element and attach it later to + // make angular-within-angular possible + const $injector = angular.bootstrap(mountpoint, [moduleName]); + // initialize global state handler + $injector.get('globalState'); + element.appendChild(mountpoint); + return $injector; +} diff --git a/src/legacy/core_plugins/kibana/public/discover/doc/doc.test.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc/doc.test.tsx similarity index 98% rename from src/legacy/core_plugins/kibana/public/discover/doc/doc.test.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc/doc.test.tsx index ee80f29c053dce..4df56483fa5c60 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc/doc.test.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc/doc.test.tsx @@ -28,7 +28,7 @@ jest.mock('../doc_viewer/doc_viewer', () => ({ DocViewer: 'test', })); -jest.mock('../kibana_services', () => { +jest.mock('../../kibana_services', () => { return { getServices: () => ({ metadata: { diff --git a/src/legacy/core_plugins/kibana/public/discover/doc/doc.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc/doc.tsx similarity index 99% rename from src/legacy/core_plugins/kibana/public/discover/doc/doc.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc/doc.tsx index 0e0e6ed110ca67..85308d9c7e03e4 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc/doc.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc/doc.tsx @@ -21,7 +21,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCallOut, EuiLink, EuiLoadingSpinner, EuiPageContent } from '@elastic/eui'; import { DocViewer } from '../doc_viewer/doc_viewer'; import { ElasticRequestState, useEsDocSearch } from './use_es_doc_search'; -import { IndexPatterns, ElasticSearchHit, getServices } from '../kibana_services'; +import { IndexPatterns, ElasticSearchHit, getServices } from '../../kibana_services'; export interface ElasticSearchResult { hits: { diff --git a/src/legacy/core_plugins/kibana/public/discover/doc/use_es_doc_search.test.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc/use_es_doc_search.test.tsx similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/doc/use_es_doc_search.test.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc/use_es_doc_search.test.tsx diff --git a/src/legacy/core_plugins/kibana/public/discover/doc/use_es_doc_search.ts b/src/legacy/core_plugins/kibana/public/discover/components/doc/use_es_doc_search.ts similarity index 97% rename from src/legacy/core_plugins/kibana/public/discover/doc/use_es_doc_search.ts rename to src/legacy/core_plugins/kibana/public/discover/components/doc/use_es_doc_search.ts index 538fbed821f00b..20bffe829de166 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc/use_es_doc_search.ts +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc/use_es_doc_search.ts @@ -17,7 +17,7 @@ * under the License. */ import { useEffect, useState } from 'react'; -import { ElasticSearchHit, IndexPattern } from '../kibana_services'; +import { ElasticSearchHit, IndexPattern } from '../../kibana_services'; import { DocProps } from './doc'; export enum ElasticRequestState { diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/__snapshots__/doc_viewer_render_tab.test.tsx.snap b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/__snapshots__/doc_viewer_render_tab.test.tsx.snap similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/__snapshots__/doc_viewer_render_tab.test.tsx.snap rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/__snapshots__/doc_viewer_render_tab.test.tsx.snap diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/_doc_viewer.scss b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/_doc_viewer.scss similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/_doc_viewer.scss rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/_doc_viewer.scss diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/_index.scss b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/_index.scss similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/_index.scss rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/_index.scss diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer.test.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer.test.tsx similarity index 98% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer.test.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer.test.tsx index 12473b25802f23..158ed4ccc7759e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer.test.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer.test.tsx @@ -28,7 +28,7 @@ import { getDocViewsSorted as mockGetDocViewsSorted, } from 'ui/registry/doc_views'; -jest.mock('../kibana_services', () => { +jest.mock('../../kibana_services', () => { return { getServices: () => ({ docViewsRegistry: { diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer.tsx similarity index 90% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer.tsx index aa737ebd8dcf18..a2d58439ad031c 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer.tsx @@ -17,8 +17,9 @@ * under the License. */ import React from 'react'; +import { DocView } from 'ui/registry/doc_views_types'; import { EuiTabbedContent } from '@elastic/eui'; -import { getServices, DocViewRenderProps } from '../kibana_services'; +import { getServices, DocViewRenderProps } from '../../kibana_services'; import { DocViewerTab } from './doc_viewer_tab'; /** @@ -31,7 +32,7 @@ export function DocViewer(renderProps: DocViewRenderProps) { const { docViewsRegistry } = getServices(); const tabs = docViewsRegistry .getDocViewsSorted(renderProps.hit) - .map(({ title, render, component }, idx) => { + .map(({ title, render, component }: DocView, idx: number) => { return { id: title, name: title, diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_error.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_error.tsx similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_error.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_error.tsx diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_tab.test.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_tab.test.tsx similarity index 95% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_tab.test.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_tab.test.tsx index 5fa2d24dfa04cf..476d7cef159fb0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_tab.test.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_tab.test.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { DocViewRenderTab } from './doc_viewer_render_tab'; -import { DocViewRenderProps } from '../kibana_services'; +import { DocViewRenderProps } from '../../kibana_services'; test('Mounting and unmounting DocViewerRenderTab', () => { const unmountFn = jest.fn(); diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_tab.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_tab.tsx similarity index 95% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_tab.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_tab.tsx index 750ef6b6061e13..8ac11caefff905 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_tab.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_tab.tsx @@ -17,7 +17,7 @@ * under the License. */ import React, { useRef, useEffect } from 'react'; -import { DocViewRenderFn, DocViewRenderProps } from '../kibana_services'; +import { DocViewRenderFn, DocViewRenderProps } from '../../kibana_services'; interface Props { render: DocViewRenderFn; diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_tab.tsx b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_tab.tsx similarity index 97% rename from src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_tab.tsx rename to src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_tab.tsx index 3721ba5818d412..19558129eae8d0 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc_viewer/doc_viewer_tab.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_tab.tsx @@ -18,7 +18,7 @@ */ import React from 'react'; import { I18nProvider } from '@kbn/i18n/react'; -import { DocViewRenderProps, DocViewRenderFn } from '../kibana_services'; +import { DocViewRenderProps, DocViewRenderFn } from '../../kibana_services'; import { DocViewRenderTab } from './doc_viewer_render_tab'; import { DocViewerError } from './doc_viewer_render_error'; diff --git a/src/legacy/core_plugins/kibana/public/discover/components/fetch_error/fetch_error.js b/src/legacy/core_plugins/kibana/public/discover/components/fetch_error/fetch_error.tsx similarity index 79% rename from src/legacy/core_plugins/kibana/public/discover/components/fetch_error/fetch_error.js rename to src/legacy/core_plugins/kibana/public/discover/components/fetch_error/fetch_error.tsx index 612ca860f80317..8f67c1952f9986 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/fetch_error/fetch_error.js +++ b/src/legacy/core_plugins/kibana/public/discover/components/fetch_error/fetch_error.tsx @@ -19,10 +19,18 @@ import React, { Fragment } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiFlexGroup, EuiFlexItem, EuiCallOut, EuiCodeBlock, EuiSpacer } from '@elastic/eui'; -import { getServices } from '../../kibana_services'; -const { uiModules, wrapInI18nContext, chrome } = getServices(); +import { getAngularModule, wrapInI18nContext, getServices } from '../../kibana_services'; -const DiscoverFetchError = ({ fetchError }) => { +interface Props { + fetchError: { + lang: string; + script: string; + message: string; + error: string; + }; +} + +const DiscoverFetchError = ({ fetchError }: Props) => { if (!fetchError) { return null; } @@ -30,7 +38,9 @@ const DiscoverFetchError = ({ fetchError }) => { let body; if (fetchError.lang === 'painless') { - const managementUrl = chrome.navLinks.get('kibana:management').url; + const { chrome } = getServices(); + const mangagementUrlObj = chrome.navLinks.get('kibana:management'); + const managementUrl = mangagementUrlObj ? mangagementUrlObj.url : ''; const url = `${managementUrl}/kibana/index_patterns`; body = ( @@ -80,8 +90,8 @@ const DiscoverFetchError = ({ fetchError }) => { ); }; -const app = uiModules.get('apps/discover', ['react']); +export function createFetchErrorDirective(reactDirective: any) { + return reactDirective(wrapInI18nContext(DiscoverFetchError)); +} -app.directive('discoverFetchError', reactDirective => - reactDirective(wrapInI18nContext(DiscoverFetchError)) -); +getAngularModule().directive('discoverFetchError', createFetchErrorDirective); diff --git a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field.js b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field.js index cfcb6540771523..0c633e23c5e4b7 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field.js +++ b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field.js @@ -20,16 +20,15 @@ import $ from 'jquery'; import _ from 'lodash'; import { i18n } from '@kbn/i18n'; -import { getServices } from '../../kibana_services'; +import { getServices } from '../../kibana_services'; import html from './discover_field.html'; import 'ui/directives/css_truncate'; import 'ui/directives/field_name'; import './string_progress_bar'; import detailsHtml from './lib/detail_views/string.html'; -const { uiModules, capabilities } = getServices(); -const app = uiModules.get('apps/discover'); -app.directive('discoverField', function ($compile) { + +export function createDiscoverFieldDirective($compile) { return { restrict: 'E', template: html, @@ -78,7 +77,7 @@ app.directive('discoverField', function ($compile) { }; - $scope.canVisualize = capabilities.visualize.show; + $scope.canVisualize = getServices().capabilities.visualize.show; $scope.toggleDisplay = function (field) { if (field.display) { @@ -135,4 +134,5 @@ app.directive('discoverField', function ($compile) { init(); } }; -}); +} + diff --git a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field_search_directive.ts b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field_search_directive.ts index b78f993e187725..69865ec4243253 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field_search_directive.ts +++ b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_field_search_directive.ts @@ -16,18 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -// @ts-ignore -import { getServices } from '../../kibana_services'; +import { wrapInI18nContext } from '../../kibana_services'; import { DiscoverFieldSearch } from './discover_field_search'; -const { wrapInI18nContext, uiModules } = getServices(); - -const app = uiModules.get('apps/discover'); - -app.directive('discoverFieldSearch', function(reactDirective: any) { +export function createFieldSearchDirective(reactDirective: any) { return reactDirective(wrapInI18nContext(DiscoverFieldSearch), [ ['onChange', { watchDepth: 'reference' }], ['value', { watchDepth: 'value' }], ['types', { watchDepth: 'value' }], ]); -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_directive.ts b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_directive.ts index 5e3f678e388ad3..46c8fa854847aa 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_directive.ts +++ b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_directive.ts @@ -16,18 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -// @ts-ignore -import { getServices } from '../../kibana_services'; +import { wrapInI18nContext } from '../../kibana_services'; import { DiscoverIndexPattern } from './discover_index_pattern'; -const { wrapInI18nContext, uiModules } = getServices(); - -const app = uiModules.get('apps/discover'); - -app.directive('discoverIndexPatternSelect', function(reactDirective: any) { +export function createIndexPatternSelectDirective(reactDirective: any) { return reactDirective(wrapInI18nContext(DiscoverIndexPattern), [ ['indexPatternList', { watchDepth: 'reference' }], ['selectedIndexPattern', { watchDepth: 'reference' }], ['setIndexPattern', { watchDepth: 'reference' }], ]); -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/field_chooser.js b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/field_chooser.js index 99a63efc0e0fca..cc3d864fd371ea 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/field_chooser.js +++ b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/field_chooser.js @@ -16,25 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -//field_name directive will be replaced very soon -import 'ui/directives/field_name'; -import './discover_field'; -import './discover_field_search_directive'; -import './discover_index_pattern_directive'; import _ from 'lodash'; import $ from 'jquery'; import rison from 'rison-node'; import { fieldCalculator } from './lib/field_calculator'; -import { - getServices, - FieldList -} from '../../kibana_services'; +import './discover_field'; +import './discover_field_search_directive'; +import './discover_index_pattern_directive'; +import { FieldList } from '../../kibana_services'; import fieldChooserTemplate from './field_chooser.html'; -const { uiModules } = getServices(); -const app = uiModules.get('apps/discover'); - -app.directive('discFieldChooser', function ($location, config, $route) { +export function createFieldChooserDirective($location, config, $route) { return { restrict: 'E', scope: { @@ -50,12 +42,11 @@ app.directive('discFieldChooser', function ($location, config, $route) { }, template: fieldChooserTemplate, link: function ($scope) { - $scope.showFilter = false; - $scope.toggleShowFilter = () => $scope.showFilter = !$scope.showFilter; + $scope.toggleShowFilter = () => ($scope.showFilter = !$scope.showFilter); $scope.selectedIndexPattern = $scope.indexPatternList.find( - (pattern) => pattern.id === $scope.indexPattern.id + pattern => pattern.id === $scope.indexPattern.id ); $scope.indexPatternList = _.sortBy($scope.indexPatternList, o => o.get('title')); $scope.setIndexPattern = function (id) { @@ -68,23 +59,17 @@ app.directive('discFieldChooser', function ($location, config, $route) { $route.reload(); }); - const filter = $scope.filter = { - props: [ - 'type', - 'aggregatable', - 'searchable', - 'missing', - 'name' - ], + const filter = ($scope.filter = { + props: ['type', 'aggregatable', 'searchable', 'missing', 'name'], defaults: { missing: true, type: 'any', - name: '' + name: '', }, boolOpts: [ { label: 'any', value: undefined }, { label: 'yes', value: true }, - { label: 'no', value: false } + { label: 'no', value: false }, ], reset: function () { filter.vals = _.clone(filter.defaults); @@ -105,15 +90,18 @@ app.directive('discFieldChooser', function ($location, config, $route) { return _.some(filter.props, function (prop) { return filter.vals[prop] !== filter.defaults[prop]; }); - } - }; + }, + }); function isFieldFiltered(field) { - const matchFilter = (filter.vals.type === 'any' || field.type === filter.vals.type); - const isAggregatable = (filter.vals.aggregatable == null || field.aggregatable === filter.vals.aggregatable); - const isSearchable = (filter.vals.searchable == null || field.searchable === filter.vals.searchable); - const scriptedOrMissing = !filter.vals.missing || field.type === '_source' || field.scripted || field.rowCount > 0; - const matchName = (!filter.vals.name || field.name.indexOf(filter.vals.name) !== -1); + const matchFilter = filter.vals.type === 'any' || field.type === filter.vals.type; + const isAggregatable = + filter.vals.aggregatable == null || field.aggregatable === filter.vals.aggregatable; + const isSearchable = + filter.vals.searchable == null || field.searchable === filter.vals.searchable; + const scriptedOrMissing = + !filter.vals.missing || field.type === '_source' || field.scripted || field.rowCount > 0; + const matchName = !filter.vals.name || field.name.indexOf(filter.vals.name) !== -1; return matchFilter && isAggregatable && isSearchable && scriptedOrMissing && matchName; } @@ -131,7 +119,7 @@ app.directive('discFieldChooser', function ($location, config, $route) { filter.active = filter.getActive(); if (filter.vals) { let count = 0; - Object.keys(filter.vals).forEach((key) => { + Object.keys(filter.vals).forEach(key => { if (key === 'missing' || key === 'name') { return; } @@ -144,11 +132,7 @@ app.directive('discFieldChooser', function ($location, config, $route) { } }); - $scope.$watchMulti([ - '[]fieldCounts', - '[]columns', - '[]hits' - ], function (cur, prev) { + $scope.$watchMulti(['[]fieldCounts', '[]columns', '[]hits'], function (cur, prev) { const newHits = cur[2] !== prev[2]; let fields = $scope.fields; const columns = $scope.columns || []; @@ -198,7 +182,9 @@ app.directive('discFieldChooser', function ($location, config, $route) { }; function getVisualizeUrl(field) { - if (!$scope.state) {return '';} + if (!$scope.state) { + return ''; + } let agg = {}; const isGeoPoint = field.type === 'geo_point'; @@ -211,18 +197,17 @@ app.directive('discFieldChooser', function ($location, config, $route) { schema: 'segment', params: { field: field.name, - interval: 'auto' - } + interval: 'auto', + }, }; - } else if (isGeoPoint) { agg = { type: 'geohash_grid', schema: 'segment', params: { field: field.name, - precision: 3 - } + precision: 3, + }, }; } else { agg = { @@ -231,26 +216,28 @@ app.directive('discFieldChooser', function ($location, config, $route) { params: { field: field.name, size: parseInt(config.get('discover:aggs:terms:size'), 10), - orderBy: '2' - } + orderBy: '2', + }, }; } - return '#/visualize/create?' + $.param(_.assign(_.clone($location.search()), { - indexPattern: $scope.state.index, - type: type, - _a: rison.encode({ - filters: $scope.state.filters || [], - query: $scope.state.query || undefined, - vis: { + return ( + '#/visualize/create?' + + $.param( + _.assign(_.clone($location.search()), { + indexPattern: $scope.state.index, type: type, - aggs: [ - { schema: 'metric', type: 'count', 'id': '2' }, - agg, - ] - } - }) - })); + _a: rison.encode({ + filters: $scope.state.filters || [], + query: $scope.state.query || undefined, + vis: { + type: type, + aggs: [{ schema: 'metric', type: 'count', id: '2' }, agg], + }, + }), + }) + ) + ); } $scope.computeDetails = function (field, recompute) { @@ -261,7 +248,7 @@ app.directive('discFieldChooser', function ($location, config, $route) { hits: $scope.hits, field: field, count: 5, - grouped: false + grouped: false, }), }; _.each(field.details.buckets, function (bucket) { @@ -285,13 +272,14 @@ app.directive('discFieldChooser', function ($location, config, $route) { const fieldNamesInDocs = _.keys(fieldCounts); const fieldNamesInIndexPattern = _.map(indexPattern.fields, 'name'); - _.difference(fieldNamesInDocs, fieldNamesInIndexPattern) - .forEach(function (unknownFieldName) { - fieldSpecs.push({ - name: unknownFieldName, - type: 'unknown' - }); + _.difference(fieldNamesInDocs, fieldNamesInIndexPattern).forEach(function ( + unknownFieldName + ) { + fieldSpecs.push({ + name: unknownFieldName, + type: 'unknown', }); + }); const fields = new FieldList(indexPattern, fieldSpecs); @@ -303,6 +291,6 @@ app.directive('discFieldChooser', function ($location, config, $route) { return fields; } - } + }, }; -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/string_progress_bar.js b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/string_progress_bar.tsx similarity index 72% rename from src/legacy/core_plugins/kibana/public/discover/components/field_chooser/string_progress_bar.js rename to src/legacy/core_plugins/kibana/public/discover/components/field_chooser/string_progress_bar.tsx index ca3a47cad50757..7e4fc79839a52d 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/string_progress_bar.js +++ b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/string_progress_bar.tsx @@ -17,19 +17,15 @@ * under the License. */ import React from 'react'; -import { getServices } from '../../kibana_services'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiProgress, - EuiText, - EuiToolTip, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiProgress, EuiText, EuiToolTip } from '@elastic/eui'; +import { wrapInI18nContext } from '../../kibana_services'; -const { wrapInI18nContext, uiModules } = getServices(); -const module = uiModules.get('discover/field_chooser'); +interface Props { + percent: number; + count: number; +} -function StringFieldProgressBar(props) { +function StringFieldProgressBar(props: Props) { return ( - + - - {props.percent}% - + {props.percent}% ); } -module.directive('stringFieldProgressBar', function (reactDirective) { +export function createStringFieldProgressBarDirective(reactDirective: any) { return reactDirective(wrapInI18nContext(StringFieldProgressBar)); -}); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/top_nav/__snapshots__/open_search_panel.test.js.snap b/src/legacy/core_plugins/kibana/public/discover/components/top_nav/__snapshots__/open_search_panel.test.js.snap similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/top_nav/__snapshots__/open_search_panel.test.js.snap rename to src/legacy/core_plugins/kibana/public/discover/components/top_nav/__snapshots__/open_search_panel.test.js.snap diff --git a/src/legacy/core_plugins/kibana/public/discover/top_nav/open_search_panel.js b/src/legacy/core_plugins/kibana/public/discover/components/top_nav/open_search_panel.js similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/top_nav/open_search_panel.js rename to src/legacy/core_plugins/kibana/public/discover/components/top_nav/open_search_panel.js diff --git a/src/legacy/core_plugins/kibana/public/discover/top_nav/open_search_panel.test.js b/src/legacy/core_plugins/kibana/public/discover/components/top_nav/open_search_panel.test.js similarity index 96% rename from src/legacy/core_plugins/kibana/public/discover/top_nav/open_search_panel.test.js rename to src/legacy/core_plugins/kibana/public/discover/components/top_nav/open_search_panel.test.js index 3531088e3847c9..ea5c0ef39604de 100644 --- a/src/legacy/core_plugins/kibana/public/discover/top_nav/open_search_panel.test.js +++ b/src/legacy/core_plugins/kibana/public/discover/components/top_nav/open_search_panel.test.js @@ -20,7 +20,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -jest.mock('../kibana_services', () => { +jest.mock('../../kibana_services', () => { return { getServices: () => ({ SavedObjectFinder: jest.fn() diff --git a/src/legacy/core_plugins/kibana/public/discover/top_nav/show_open_search_panel.js b/src/legacy/core_plugins/kibana/public/discover/components/top_nav/show_open_search_panel.js similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/top_nav/show_open_search_panel.js rename to src/legacy/core_plugins/kibana/public/discover/components/top_nav/show_open_search_panel.js diff --git a/src/legacy/core_plugins/kibana/public/discover/context/README.md b/src/legacy/core_plugins/kibana/public/discover/context/README.md deleted file mode 100644 index 18ba118b4da798..00000000000000 --- a/src/legacy/core_plugins/kibana/public/discover/context/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# DISCOVER CONTEXT - -Placeholder for Discover's context functionality, that's currently in [../angular/context](../angular/context). -Once fully de-angularized it should be moved to this location \ No newline at end of file diff --git a/src/legacy/core_plugins/kibana/public/discover/embeddable/index.ts b/src/legacy/core_plugins/kibana/public/discover/embeddable/index.ts index beeb6a7338f9d2..3138008f3e3a00 100644 --- a/src/legacy/core_plugins/kibana/public/discover/embeddable/index.ts +++ b/src/legacy/core_plugins/kibana/public/discover/embeddable/index.ts @@ -20,4 +20,3 @@ export * from './types'; export * from './search_embeddable_factory'; export * from './search_embeddable'; -export { SEARCH_EMBEDDABLE_TYPE } from './constants'; diff --git a/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable.ts b/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable.ts index 9fee0cfc3ea00a..273c7d80f216c1 100644 --- a/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable.ts +++ b/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable.ts @@ -21,7 +21,6 @@ import * as Rx from 'rxjs'; import { Subscription } from 'rxjs'; import { i18n } from '@kbn/i18n'; import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; -import { npStart } from 'ui/new_platform'; import { SearchSourceContract } from '../../../../../ui/public/courier'; import { esFilters, @@ -55,8 +54,6 @@ import { } from '../kibana_services'; import { SEARCH_EMBEDDABLE_TYPE } from './constants'; -const { data } = npStart.plugins; - interface SearchScope extends ng.IScope { columns?: string[]; description?: string; @@ -81,7 +78,7 @@ interface SearchEmbeddableConfig { editUrl: string; indexPatterns?: IndexPattern[]; editable: boolean; - queryFilter: unknown; + filterManager: FilterManager; } export class SearchEmbeddable extends Embeddable @@ -112,7 +109,7 @@ export class SearchEmbeddable extends Embeddable editUrl, indexPatterns, editable, - queryFilter, + filterManager, }: SearchEmbeddableConfig, initialInput: SearchInput, private readonly executeTriggerActions: TExecuteTriggerActions, @@ -124,7 +121,7 @@ export class SearchEmbeddable extends Embeddable parent ); - this.filterManager = queryFilter as FilterManager; + this.filterManager = filterManager; this.savedSearch = savedSearch; this.$rootScope = $rootScope; this.$compile = $compile; @@ -132,9 +129,10 @@ export class SearchEmbeddable extends Embeddable requests: new RequestAdapter(), }; this.initializeSearchScope(); - const { timefilter } = data.query.timefilter; - this.autoRefreshFetchSubscription = timefilter.getAutoRefreshFetch$().subscribe(this.fetch); + this.autoRefreshFetchSubscription = getServices() + .timefilter.getAutoRefreshFetch$() + .subscribe(this.fetch); this.subscription = Rx.merge(this.getOutput$(), this.getInput$()).subscribe(() => { this.panelTitle = this.output.title || ''; @@ -281,10 +279,9 @@ export class SearchEmbeddable extends Embeddable }); const inspectorRequest = this.inspectorAdaptors.requests.start(title, { description }); inspectorRequest.stats(getRequestInspectorStats(searchSource)); - searchSource.getSearchRequestBody().then((body: any) => { + searchSource.getSearchRequestBody().then((body: Record) => { inspectorRequest.json(body); }); - this.searchScope.isLoading = true; try { @@ -292,7 +289,6 @@ export class SearchEmbeddable extends Embeddable const resp = await searchSource.fetch({ abortSignal: this.abortController.signal, }); - this.searchScope.isLoading = false; // Log response to inspector diff --git a/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable_factory.ts b/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable_factory.ts index ebea646a09889a..b5475b2629c703 100644 --- a/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable_factory.ts +++ b/src/legacy/core_plugins/kibana/public/discover/embeddable/search_embeddable_factory.ts @@ -16,18 +16,17 @@ * specific language governing permissions and limitations * under the License. */ -import { IPrivate } from 'ui/private'; import { i18n } from '@kbn/i18n'; import { TExecuteTriggerActions } from 'src/plugins/ui_actions/public'; -import '../angular/doc_table'; +import { IInjector } from 'ui/chrome'; import { getServices } from '../kibana_services'; import { EmbeddableFactory, ErrorEmbeddable, Container, } from '../../../../../../plugins/embeddable/public'; + import { TimeRange } from '../../../../../../plugins/data/public'; -import { SavedSearchLoader } from '../types'; import { SearchEmbeddable } from './search_embeddable'; import { SearchInput, SearchOutput } from './types'; import { SEARCH_EMBEDDABLE_TYPE } from './constants'; @@ -38,8 +37,15 @@ export class SearchEmbeddableFactory extends EmbeddableFactory< SearchEmbeddable > { public readonly type = SEARCH_EMBEDDABLE_TYPE; + private $injector: IInjector | null; + private getInjector: () => Promise | null; + public isEditable: () => boolean; - constructor(private readonly executeTriggerActions: TExecuteTriggerActions) { + constructor( + private readonly executeTriggerActions: TExecuteTriggerActions, + getInjector: () => Promise, + isEditable: () => boolean + ) { super({ savedObjectMetaData: { name: i18n.translate('kbn.discover.savedSearch.savedObjectName', { @@ -49,10 +55,9 @@ export class SearchEmbeddableFactory extends EmbeddableFactory< getIconForSavedObject: () => 'search', }, }); - } - - public isEditable() { - return getServices().capabilities.discover.save as boolean; + this.$injector = null; + this.getInjector = getInjector; + this.isEditable = isEditable; } public canCreateNew() { @@ -70,20 +75,19 @@ export class SearchEmbeddableFactory extends EmbeddableFactory< input: Partial & { id: string; timeRange: TimeRange }, parent?: Container ): Promise { - const $injector = await getServices().getInjector(); + if (!this.$injector) { + this.$injector = await this.getInjector(); + } + const $injector = this.$injector as IInjector; const $compile = $injector.get('$compile'); const $rootScope = $injector.get('$rootScope'); - const searchLoader = $injector.get('savedSearches'); - const editUrl = await getServices().addBasePath( - `/app/kibana${searchLoader.urlFor(savedObjectId)}` - ); - - const Private = $injector.get('Private'); + const filterManager = getServices().filterManager; - const queryFilter = Private(getServices().FilterBarQueryFilterProvider); + const url = await getServices().getSavedSearchUrlById(savedObjectId); + const editUrl = getServices().addBasePath(`/app/kibana${url}`); try { - const savedObject = await searchLoader.get(savedObjectId); + const savedObject = await getServices().getSavedSearchById(savedObjectId); const indexPattern = savedObject.searchSource.getField('index'); return new SearchEmbeddable( { @@ -91,7 +95,7 @@ export class SearchEmbeddableFactory extends EmbeddableFactory< $rootScope, $compile, editUrl, - queryFilter, + filterManager, editable: getServices().capabilities.discover.save as boolean, indexPatterns: indexPattern ? [indexPattern] : [], }, @@ -109,6 +113,3 @@ export class SearchEmbeddableFactory extends EmbeddableFactory< return new ErrorEmbeddable('Saved searches can only be created from a saved object', input); } } - -const factory = new SearchEmbeddableFactory(getServices().uiActions.executeTriggerActions); -getServices().embeddable.registerEmbeddableFactory(factory.type, factory); diff --git a/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts b/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts new file mode 100644 index 00000000000000..93a823a0547566 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts @@ -0,0 +1,328 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// inner angular imports +// these are necessary to bootstrap the local angular. +// They can stay even after NP cutover +import angular from 'angular'; +import 'ui/angular-bootstrap'; +import { IPrivate } from 'ui/private'; +import { EuiIcon } from '@elastic/eui'; +// @ts-ignore +import { EventsProvider } from 'ui/events'; +import { PersistedState } from 'ui/persisted_state'; +// @ts-ignore +import { PromiseServiceCreator } from 'ui/promises/promises'; +// @ts-ignore +import { createEsService } from 'ui/es'; +import { i18nDirective, i18nFilter, I18nProvider } from '@kbn/i18n/angular'; +// @ts-ignore +import { PrivateProvider } from 'ui/private/private'; +import { CoreStart, LegacyCoreStart, UiSettingsClientContract } from 'kibana/public'; +// @ts-ignore +import { watchMultiDecorator } from 'ui/directives/watch_multi/watch_multi'; +// @ts-ignore +import { registerListenEventListener } from 'ui/directives/listen/listen'; +// @ts-ignore +import { KbnAccessibleClickProvider } from 'ui/accessibility/kbn_accessible_click'; +// @ts-ignore +import { FieldNameDirectiveProvider } from 'ui/directives/field_name'; +// @ts-ignore +import { CollapsibleSidebarProvider } from 'ui/collapsible_sidebar/collapsible_sidebar'; +// @ts-ignore +import { CssTruncateProvide } from 'ui/directives/css_truncate'; +// @ts-ignore +import { FixedScrollProvider } from 'ui/fixed_scroll'; +// @ts-ignore +import { DebounceProviderTimeout } from 'ui/directives/debounce/debounce'; +// @ts-ignore +import { AppStateProvider } from 'ui/state_management/app_state'; +// @ts-ignore +import { GlobalStateProvider } from 'ui/state_management/global_state'; +// @ts-ignore +import { createRenderCompleteDirective } from 'ui/render_complete/directive'; +// @ts-ignore +import { StateManagementConfigProvider } from 'ui/state_management/config_provider'; +// @ts-ignore +import { KbnUrlProvider, RedirectWhenMissingProvider } from 'ui/url'; +// @ts-ignore +import { createTopNavDirective, createTopNavHelper } from 'ui/kbn_top_nav/kbn_top_nav'; +import { configureAppAngularModule } from 'ui/legacy_compat'; +import { IndexPatterns } from '../../../data/public/index_patterns/index_patterns'; +import { Storage } from '../../../../../plugins/kibana_utils/public'; +import { NavigationStart } from '../../../navigation/public'; +import { createDocTableDirective } from './angular/doc_table/doc_table'; +import { createTableHeaderDirective } from './angular/doc_table/components/table_header'; +import { + createToolBarPagerButtonsDirective, + createToolBarPagerTextDirective, +} from './angular/doc_table/components/pager'; +import { createTableRowDirective } from './angular/doc_table/components/table_row'; +import { createPagerFactory } from './angular/doc_table/lib/pager/pager_factory'; +import { createInfiniteScrollDirective } from './angular/doc_table/infinite_scroll'; +import { createDocViewerDirective } from './angular/doc_viewer'; +import { createFieldSearchDirective } from './components/field_chooser/discover_field_search_directive'; +import { createIndexPatternSelectDirective } from './components/field_chooser/discover_index_pattern_directive'; +import { createStringFieldProgressBarDirective } from './components/field_chooser/string_progress_bar'; +// @ts-ignore +import { createFieldChooserDirective } from './components/field_chooser/field_chooser'; + +// @ts-ignore +import { createDiscoverFieldDirective } from './components/field_chooser/discover_field'; +import { DiscoverStartPlugins } from './plugin'; + +/** + * returns the main inner angular module, it contains all the parts of Angular Discover + * needs to render, so in the end the current 'kibana' angular module is no longer necessary + */ +export function getInnerAngularModule(name: string, core: CoreStart, deps: DiscoverStartPlugins) { + const module = initializeInnerAngularModule(name, core, deps.navigation); + configureAppAngularModule(module, core as LegacyCoreStart, true); + return module; +} + +/** + * returns a slimmer inner angular module for embeddable rendering + */ +export function getInnerAngularModuleEmbeddable( + name: string, + core: CoreStart, + deps: DiscoverStartPlugins +) { + const module = initializeInnerAngularModule(name, core, deps.navigation, true); + configureAppAngularModule(module, core as LegacyCoreStart, true); + return module; +} + +let initialized = false; + +export function initializeInnerAngularModule( + name = 'app/discover', + core: CoreStart, + navigation: NavigationStart, + embeddable = false +) { + if (!initialized) { + createLocalI18nModule(); + createLocalPrivateModule(); + createLocalPromiseModule(); + createLocalConfigModule(core.uiSettings); + createLocalKbnUrlModule(); + createLocalPersistedStateModule(); + createLocalTopNavModule(navigation); + createLocalGlobalStateModule(); + createLocalAppStateModule(); + createLocalStorageModule(); + createElasticSearchModule(); + createIndexPatternsModule(); + createPagerFactoryModule(); + createDocTableModule(); + initialized = true; + } + + if (embeddable) { + return angular + .module(name, [ + 'ngSanitize', + 'react', + 'ui.bootstrap', + 'discoverI18n', + 'discoverPrivate', + 'discoverDocTable', + 'discoverPagerFactory', + 'discoverPersistedState', + ]) + .config(watchMultiDecorator) + .directive('icon', reactDirective => reactDirective(EuiIcon)) + .directive('fieldName', FieldNameDirectiveProvider) + .directive('renderComplete', createRenderCompleteDirective) + .service('debounce', ['$timeout', DebounceProviderTimeout]); + } + + return angular + .module(name, [ + 'ngSanitize', + 'ngRoute', + 'react', + 'ui.bootstrap', + 'elasticsearch', + 'discoverConfig', + 'discoverI18n', + 'discoverPrivate', + 'discoverPersistedState', + 'discoverTopNav', + 'discoverGlobalState', + 'discoverAppState', + 'discoverLocalStorageProvider', + 'discoverIndexPatterns', + 'discoverEs', + 'discoverDocTable', + 'discoverPagerFactory', + ]) + .config(watchMultiDecorator) + .run(registerListenEventListener) + .directive('icon', reactDirective => reactDirective(EuiIcon)) + .directive('kbnAccessibleClick', KbnAccessibleClickProvider) + .directive('fieldName', FieldNameDirectiveProvider) + .directive('collapsibleSidebar', CollapsibleSidebarProvider) + .directive('cssTruncate', CssTruncateProvide) + .directive('fixedScroll', FixedScrollProvider) + .directive('renderComplete', createRenderCompleteDirective) + .directive('discoverFieldSearch', createFieldSearchDirective) + .directive('discoverIndexPatternSelect', createIndexPatternSelectDirective) + .directive('stringFieldProgressBar', createStringFieldProgressBarDirective) + .directive('discoverField', createDiscoverFieldDirective) + .directive('discFieldChooser', createFieldChooserDirective) + .service('debounce', ['$timeout', DebounceProviderTimeout]); +} + +export function createLocalGlobalStateModule() { + angular + .module('discoverGlobalState', [ + 'discoverPrivate', + 'discoverConfig', + 'discoverKbnUrl', + 'discoverPromise', + ]) + .service('globalState', function(Private: IPrivate) { + return Private(GlobalStateProvider); + }); +} + +function createLocalPersistedStateModule() { + angular + .module('discoverPersistedState', ['discoverPrivate', 'discoverPromise']) + .factory('PersistedState', (Private: IPrivate) => { + const Events = Private(EventsProvider); + return class AngularPersistedState extends PersistedState { + constructor(value: any, path: any) { + super(value, path, Events); + } + }; + }); +} + +function createLocalKbnUrlModule() { + angular + .module('discoverKbnUrl', ['discoverPrivate', 'ngRoute']) + .service('kbnUrl', (Private: IPrivate) => Private(KbnUrlProvider)) + .service('redirectWhenMissing', (Private: IPrivate) => Private(RedirectWhenMissingProvider)); +} + +function createLocalConfigModule(uiSettings: UiSettingsClientContract) { + angular + .module('discoverConfig', ['discoverPrivate']) + .provider('stateManagementConfig', StateManagementConfigProvider) + .provider('config', () => { + return { + $get: () => ({ + get: (value: string) => { + return uiSettings ? uiSettings.get(value) : undefined; + }, + }), + }; + }); +} + +function createLocalPromiseModule() { + angular.module('discoverPromise', []).service('Promise', PromiseServiceCreator); +} + +function createLocalPrivateModule() { + angular.module('discoverPrivate', []).provider('Private', PrivateProvider); +} + +function createLocalTopNavModule(navigation: NavigationStart) { + angular + .module('discoverTopNav', ['react']) + .directive('kbnTopNav', createTopNavDirective) + .directive('kbnTopNavHelper', createTopNavHelper(navigation.ui)); +} + +function createLocalI18nModule() { + angular + .module('discoverI18n', []) + .provider('i18n', I18nProvider) + .filter('i18n', i18nFilter) + .directive('i18nId', i18nDirective); +} + +function createLocalAppStateModule() { + angular + .module('discoverAppState', [ + 'discoverGlobalState', + 'discoverPrivate', + 'discoverConfig', + 'discoverKbnUrl', + 'discoverPromise', + ]) + .service('AppState', function(Private: IPrivate) { + return Private(AppStateProvider); + }) + .service('getAppState', function(Private: any) { + return Private(AppStateProvider).getAppState; + }); +} + +function createLocalStorageModule() { + angular + .module('discoverLocalStorageProvider', ['discoverPrivate']) + .service('localStorage', createLocalStorageService('localStorage')) + .service('sessionStorage', createLocalStorageService('sessionStorage')); +} + +const createLocalStorageService = function(type: string) { + return function($window: any) { + return new Storage($window[type]); + }; +}; + +function createElasticSearchModule() { + angular + .module('discoverEs', ['elasticsearch', 'discoverConfig']) + // Elasticsearch client used for requesting data. Connects to the /elasticsearch proxy + .service('es', createEsService); +} + +function createIndexPatternsModule() { + angular.module('discoverIndexPatterns', []).service('indexPatterns', IndexPatterns); +} + +function createPagerFactoryModule() { + angular.module('discoverPagerFactory', []).factory('pagerFactory', createPagerFactory); +} + +function createDocTableModule() { + angular + .module('discoverDocTable', [ + 'discoverKbnUrl', + 'discoverConfig', + 'discoverAppState', + 'discoverPagerFactory', + 'react', + ]) + .directive('docTable', createDocTableDirective) + .directive('kbnTableHeader', createTableHeaderDirective) + .directive('toolBarPagerText', createToolBarPagerTextDirective) + .directive('toolBarPagerText', createToolBarPagerTextDirective) + .directive('kbnTableRow', createTableRowDirective) + .directive('toolBarPagerButtons', createToolBarPagerButtonsDirective) + .directive('kbnInfiniteScroll', createInfiniteScrollDirective) + .directive('docViewer', createDocViewerDirective); +} diff --git a/src/legacy/core_plugins/kibana/public/discover/breadcrumbs.ts b/src/legacy/core_plugins/kibana/public/discover/helpers/breadcrumbs.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/discover/breadcrumbs.ts rename to src/legacy/core_plugins/kibana/public/discover/helpers/breadcrumbs.ts diff --git a/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts b/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts new file mode 100644 index 00000000000000..33a099cce5fd8f --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts @@ -0,0 +1,110 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { + Capabilities, + ChromeStart, + CoreStart, + DocLinksStart, + ToastsStart, + UiSettingsClientContract, +} from 'kibana/public'; +import * as docViewsRegistry from 'ui/registry/doc_views'; +import chromeLegacy from 'ui/chrome'; +import { IPrivate } from 'ui/private'; +import { FilterManager, TimefilterContract } from 'src/plugins/data/public'; +// @ts-ignore +import { StateProvider } from 'ui/state_management/state'; +// @ts-ignore +import { createSavedSearchesService } from '../saved_searches/saved_searches'; +// @ts-ignore +import { createSavedSearchFactory } from '../saved_searches/_saved_search'; +import { DiscoverStartPlugins } from '../plugin'; +import { start as legacyData } from '../../../../data/public/legacy'; +import { DataStart, IndexPatterns } from '../../../../data/public'; +import { EuiUtilsStart } from '../../../../../../plugins/eui_utils/public'; +import { SavedSearch } from '../types'; +import { SharePluginStart } from '../../../../../../plugins/share/public'; + +export interface DiscoverServices { + addBasePath: (path: string) => string; + capabilities: Capabilities; + chrome: ChromeStart; + core: CoreStart; + data: DataStart; + docLinks: DocLinksStart; + docViewsRegistry: docViewsRegistry.DocViewsRegistry; + eui_utils: EuiUtilsStart; + filterManager: FilterManager; + indexPatterns: IndexPatterns; + inspector: unknown; + metadata: { branch: string }; + share: SharePluginStart; + timefilter: TimefilterContract; + toastNotifications: ToastsStart; + // legacy + getSavedSearchById: (id: string) => Promise; + getSavedSearchUrlById: (id: string) => Promise; + State: unknown; + uiSettings: UiSettingsClientContract; +} + +export async function buildGlobalAngularServices() { + const injector = await chromeLegacy.dangerouslyGetActiveInjector(); + const Private = injector.get('Private'); + const kbnUrl = injector.get('kbnUrl'); + const State = Private(StateProvider); + const SavedSearchFactory = createSavedSearchFactory(Private); + const service = createSavedSearchesService(Private, SavedSearchFactory, kbnUrl, chromeLegacy); + return { + getSavedSearchById: async (id: string) => service.get(id), + getSavedSearchUrlById: async (id: string) => service.urlFor(id), + State, + }; +} + +export async function buildServices(core: CoreStart, plugins: DiscoverStartPlugins, test: false) { + const globalAngularServices = !test + ? await buildGlobalAngularServices() + : { + getSavedSearchById: async (id: string) => void id, + getSavedSearchUrlById: async (id: string) => void id, + State: null, + }; + + return { + ...globalAngularServices, + addBasePath: core.http.basePath.prepend, + capabilities: core.application.capabilities, + chrome: core.chrome, + core, + data: plugins.data, + docLinks: core.docLinks, + docViewsRegistry, + eui_utils: plugins.eui_utils, + filterManager: plugins.data.query.filterManager, + indexPatterns: legacyData.indexPatterns.indexPatterns, + inspector: plugins.inspector, + // @ts-ignore + metadata: core.injectedMetadata.getLegacyMetadata(), + share: plugins.share, + timefilter: plugins.data.query.timefilter.timefilter, + toastNotifications: core.notifications.toasts, + uiSettings: core.uiSettings, + }; +} diff --git a/src/legacy/core_plugins/kibana/public/discover/helpers/get_index_pattern_id.ts b/src/legacy/core_plugins/kibana/public/discover/helpers/get_index_pattern_id.ts new file mode 100644 index 00000000000000..bd62460fd68687 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/discover/helpers/get_index_pattern_id.ts @@ -0,0 +1,60 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IIndexPattern } from '../../../../../../plugins/data/common/index_patterns'; + +export function findIndexPatternById( + indexPatterns: IIndexPattern[], + id: string +): IIndexPattern | undefined { + if (!Array.isArray(indexPatterns) || !id) { + return; + } + return indexPatterns.find(o => o.id === id); +} + +/** + * Checks if the given defaultIndex exists and returns + * the first available index pattern id if not + */ +export function getFallbackIndexPatternId( + indexPatterns: IIndexPattern[], + defaultIndex: string = '' +): string { + if (defaultIndex && findIndexPatternById(indexPatterns, defaultIndex)) { + return defaultIndex; + } + return !indexPatterns || !indexPatterns.length || !indexPatterns[0].id ? '' : indexPatterns[0].id; +} + +/** + * A given index pattern id is checked for existence and a fallback is provided if it doesn't exist + * The provided defaultIndex is usually configured in Advanced Settings, if it's also invalid + * the first entry of the given list of Indexpatterns is used + */ +export function getIndexPatternId( + id: string = '', + indexPatterns: IIndexPattern[], + defaultIndex: string = '' +): string { + if (!id || !findIndexPatternById(indexPatterns, id)) { + return getFallbackIndexPatternId(indexPatterns, defaultIndex); + } + return id; +} diff --git a/src/legacy/core_plugins/kibana/public/discover/index.ts b/src/legacy/core_plugins/kibana/public/discover/index.ts index 35e48598f07a80..7f8ca4e96c5aca 100644 --- a/src/legacy/core_plugins/kibana/public/discover/index.ts +++ b/src/legacy/core_plugins/kibana/public/discover/index.ts @@ -18,7 +18,9 @@ */ import { PluginInitializer, PluginInitializerContext } from 'kibana/public'; import { npSetup, npStart } from 'ui/new_platform'; +import { SavedObjectRegistryProvider } from 'ui/saved_objects'; import { DiscoverPlugin, DiscoverSetup, DiscoverStart } from './plugin'; +import { start as navigation } from '../../../navigation/public/legacy'; // Core will be looking for this when loading our plugin in the new platform export const plugin: PluginInitializer = ( @@ -27,6 +29,13 @@ export const plugin: PluginInitializer = ( return new DiscoverPlugin(initializerContext); }; -const pluginInstance = plugin({} as PluginInitializerContext); -export const setup = pluginInstance.setup(npSetup.core, npSetup.plugins); -export const start = pluginInstance.start(npStart.core, npStart.plugins); +// Legacy compatiblity part - to be removed at cutover, replaced by a kibana.json file +export const pluginInstance = plugin({} as PluginInitializerContext); +(async () => { + pluginInstance.setup(npSetup.core, npSetup.plugins); + pluginInstance.start(npStart.core, { ...npStart.plugins, navigation }); +})(); + +SavedObjectRegistryProvider.register((savedSearches: any) => { + return savedSearches; +}); diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index 822bf69e52e0b7..393399f7da345c 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -16,71 +16,40 @@ * specific language governing permissions and limitations * under the License. */ -import 'ui/collapsible_sidebar'; -import 'ui/directives/listen'; -import 'ui/directives/storage'; -import 'ui/fixed_scroll'; -import 'ui/directives/css_truncate'; - -import { npStart } from 'ui/new_platform'; -import chromeLegacy from 'ui/chrome'; import angular from 'angular'; // just used in embeddables and discover controller -import uiRoutes from 'ui/routes'; -// @ts-ignore -import { uiModules } from 'ui/modules'; -// @ts-ignore -import { StateProvider } from 'ui/state_management/state'; -// @ts-ignore -import { SavedObjectProvider } from 'ui/saved_objects/saved_object'; -import { SavedObjectRegistryProvider } from 'ui/saved_objects/saved_object_registry'; -import { FilterBarQueryFilterProvider } from 'ui/filter_manager/query_filter'; -// @ts-ignore -import { IndexPattern, IndexPatterns } from 'ui/index_patterns'; -import { wrapInI18nContext } from 'ui/i18n'; -// @ts-ignore -import { docTitle } from 'ui/doc_title'; -// @ts-ignore -import * as docViewsRegistry from 'ui/registry/doc_views'; -import { SearchSource } from '../../../../ui/public/courier'; +import { DiscoverServices } from './helpers/build_services'; -const services = { - // new plattform - core: npStart.core, - addBasePath: npStart.core.http.basePath.prepend, - capabilities: npStart.core.application.capabilities, - chrome: npStart.core.chrome, - docLinks: npStart.core.docLinks, - eui_utils: npStart.plugins.eui_utils, - inspector: npStart.plugins.inspector, - metadata: npStart.core.injectedMetadata.getLegacyMetadata(), - toastNotifications: npStart.core.notifications.toasts, - uiSettings: npStart.core.uiSettings, - uiActions: npStart.plugins.uiActions, - embeddable: npStart.plugins.embeddable, - npData: npStart.plugins.data, - share: npStart.plugins.share, - timefilter: npStart.plugins.data.query.timefilter.timefilter, - // legacy - docTitle, - docViewsRegistry, - FilterBarQueryFilterProvider, - getInjector: () => { - return chromeLegacy.dangerouslyGetActiveInjector(); - }, - SavedObjectRegistryProvider, - SavedObjectProvider, - SearchSource, - StateProvider, - uiModules, - uiRoutes, - wrapInI18nContext, -}; -export function getServices() { +let angularModule: any = null; +let services: DiscoverServices | null = null; + +/** + * set bootstrapped inner angular module + */ +export function setAngularModule(module: any) { + angularModule = module; +} + +/** + * get boostrapped inner angular module + */ +export function getAngularModule() { + return angularModule; +} + +export function getServices(): DiscoverServices { + if (!services) { + throw new Error('Discover services are not yet available'); + } return services; } -// EXPORT legacy static dependencies +export function setServices(newServices: any) { + services = newServices; +} + +// EXPORT legacy static dependencies, should be migrated when available in a new version; export { angular }; +export { wrapInI18nContext } from 'ui/i18n'; export { buildVislibDimensions } from '../../../visualizations/public'; // @ts-ignore export { callAfterBindingsWorkaround } from 'ui/compat'; diff --git a/src/legacy/core_plugins/kibana/public/discover/plugin.ts b/src/legacy/core_plugins/kibana/public/discover/plugin.ts index 7c2fb4f118915f..6679e8a3b88263 100644 --- a/src/legacy/core_plugins/kibana/public/discover/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/discover/plugin.ts @@ -16,12 +16,20 @@ * specific language governing permissions and limitations * under the License. */ - import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'kibana/public'; +import angular from 'angular'; import { IUiActionsStart } from 'src/plugins/ui_actions/public'; +import { DataPublicPluginStart } from 'src/plugins/data/public'; import { registerFeature } from './helpers/register_feature'; import './kibana_services'; import { IEmbeddableStart, IEmbeddableSetup } from '../../../../../plugins/embeddable/public'; +import { getInnerAngularModule, getInnerAngularModuleEmbeddable } from './get_inner_angular'; +import { setAngularModule, setServices } from './kibana_services'; +import { NavigationStart } from '../../../navigation/public'; +import { EuiUtilsStart } from '../../../../../plugins/eui_utils/public'; +import { buildServices } from './helpers/build_services'; +import { SharePluginStart } from '../../../../../plugins/share/public'; +import { KibanaLegacySetup } from '../../../../../plugins/kibana_legacy/public'; /** * These are the interfaces with your public contracts. You should export these @@ -30,28 +38,108 @@ import { IEmbeddableStart, IEmbeddableSetup } from '../../../../../plugins/embed */ export type DiscoverSetup = void; export type DiscoverStart = void; -interface DiscoverSetupPlugins { +export interface DiscoverSetupPlugins { uiActions: IUiActionsStart; embeddable: IEmbeddableSetup; + kibana_legacy: KibanaLegacySetup; } -interface DiscoverStartPlugins { +export interface DiscoverStartPlugins { uiActions: IUiActionsStart; embeddable: IEmbeddableStart; + navigation: NavigationStart; + eui_utils: EuiUtilsStart; + data: DataPublicPluginStart; + share: SharePluginStart; + inspector: any; } +const innerAngularName = 'app/discover'; +const embeddableAngularName = 'app/discoverEmbeddable'; +/** + * Contains Discover, one of the oldest parts of Kibana + * There are 2 kinds of Angular bootstrapped for rendering, additionally to the main Angular + * Discover provides embeddables, those contain a slimmer Angular + */ export class DiscoverPlugin implements Plugin { + private servicesInitialized: boolean = false; + private innerAngularInitialized: boolean = false; + /** + * why are those functions public? they are needed for some mocha tests + * can be removed once all is Jest + */ + public initializeInnerAngular?: () => void; + public initializeServices?: () => void; constructor(initializerContext: PluginInitializerContext) {} setup(core: CoreSetup, plugins: DiscoverSetupPlugins): DiscoverSetup { - registerFeature(); - require('./angular'); + plugins.kibana_legacy.registerLegacyApp({ + id: 'discover', + title: 'Discover', + order: -1004, + euiIconType: 'discoverApp', + mount: async (context, params) => { + if (!this.initializeServices) { + throw Error('Discover plugin method initializeServices is undefined'); + } + if (!this.initializeInnerAngular) { + throw Error('Discover plugin method initializeInnerAngular is undefined'); + } + await this.initializeServices(); + await this.initializeInnerAngular(); + const { renderApp } = await import('./application'); + return renderApp(innerAngularName, params.element); + }, + }); } start(core: CoreStart, plugins: DiscoverStartPlugins): DiscoverStart { - // TODO enable this when possible, seems it broke a functional test: - // dashboard mode Dashboard View Mode Dashboard viewer can paginate on a saved search - // const factory = new SearchEmbeddableFactory(plugins.uiActions.executeTriggerActions); - // plugins.embeddable.registerEmbeddableFactory(factory.type, factory); + // we need to register the application service at setup, but to render it + // there are some start dependencies necessary, for this reason + // initializeInnerAngular + initializeServices are assigned at start and used + // when the application/embeddable is mounted + this.initializeInnerAngular = async () => { + if (this.innerAngularInitialized) { + return; + } + // this is used by application mount and tests + const module = getInnerAngularModule(innerAngularName, core, plugins); + setAngularModule(module); + this.innerAngularInitialized = true; + }; + + this.initializeServices = async (test = false) => { + if (this.servicesInitialized) { + return; + } + const services = await buildServices(core, plugins, test); + setServices(services); + this.servicesInitialized = true; + }; + + this.registerEmbeddable(core, plugins); + registerFeature(); } - stop() {} + /** + * register embeddable with a slimmer embeddable version of inner angular + */ + private async registerEmbeddable(core: CoreStart, plugins: DiscoverStartPlugins) { + const { SearchEmbeddableFactory } = await import('./embeddable'); + const getInjector = async () => { + if (!this.initializeServices) { + throw Error('Discover plugin registerEmbeddable: initializeServices is undefined'); + } + await this.initializeServices(); + getInnerAngularModuleEmbeddable(embeddableAngularName, core, plugins); + const mountpoint = document.createElement('div'); + return angular.bootstrap(mountpoint, [embeddableAngularName]); + }; + const isEditable = () => core.application.capabilities.discover.save as boolean; + + const factory = new SearchEmbeddableFactory( + plugins.uiActions.executeTriggerActions, + getInjector, + isEditable + ); + plugins.embeddable.registerEmbeddableFactory(factory.type, factory); + } } diff --git a/src/legacy/core_plugins/kibana/public/discover/saved_searches/_saved_search.js b/src/legacy/core_plugins/kibana/public/discover/saved_searches/_saved_search.js index 9bbc5baf4fc229..db2b2b5b22af7a 100644 --- a/src/legacy/core_plugins/kibana/public/discover/saved_searches/_saved_search.js +++ b/src/legacy/core_plugins/kibana/public/discover/saved_searches/_saved_search.js @@ -18,13 +18,13 @@ */ import { createLegacyClass } from 'ui/utils/legacy_class'; -import { getServices } from '../kibana_services'; +import { SavedObjectProvider } from 'ui/saved_objects/saved_object'; -const { uiModules, SavedObjectProvider } = getServices(); +import { uiModules } from 'ui/modules'; const module = uiModules.get('discover/saved_searches', []); -module.factory('SavedSearch', function (Private) { +export function createSavedSearchFactory(Private) { const SavedObject = Private(SavedObjectProvider); createLegacyClass(SavedSearch).inherits(SavedObject); function SavedSearch(id) { @@ -32,7 +32,6 @@ module.factory('SavedSearch', function (Private) { type: SavedSearch.type, mapping: SavedSearch.mapping, searchSource: SavedSearch.searchSource, - id: id, defaults: { title: '', @@ -68,4 +67,6 @@ module.factory('SavedSearch', function (Private) { }; return SavedSearch; -}); +} + +module.factory('SavedSearch', createSavedSearchFactory); diff --git a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_search_register.js b/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_search_register.js deleted file mode 100644 index 9554642c225fd5..00000000000000 --- a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_search_register.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { getServices } from '../kibana_services'; -import './saved_searches'; - - -getServices().SavedObjectRegistryProvider.register((savedSearches) => { - return savedSearches; -}); diff --git a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.js b/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.js index d68b7f0e0d0971..7ebcba903cc7f3 100644 --- a/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.js +++ b/src/legacy/core_plugins/kibana/public/discover/saved_searches/saved_searches.js @@ -18,32 +18,33 @@ */ import './_saved_search'; -import 'ui/notify'; import { uiModules } from 'ui/modules'; import { SavedObjectLoader, SavedObjectsClientProvider } from 'ui/saved_objects'; import { savedObjectManagementRegistry } from '../../management/saved_object_registry'; -const module = uiModules.get('discover/saved_searches'); + // Register this service with the saved object registry so it can be // edited by the object editor. savedObjectManagementRegistry.register({ service: 'savedSearches', - title: 'searches' + title: 'searches', }); -module.service('savedSearches', function (Private, SavedSearch, kbnUrl, chrome) { +export function createSavedSearchesService(Private, SavedSearch, kbnUrl, chrome) { const savedObjectClient = Private(SavedObjectsClientProvider); const savedSearchLoader = new SavedObjectLoader(SavedSearch, kbnUrl, chrome, savedObjectClient); // Customize loader properties since adding an 's' on type doesn't work for type 'search' . savedSearchLoader.loaderProperties = { name: 'searches', noun: 'Saved Search', - nouns: 'saved searches' + nouns: 'saved searches', }; - savedSearchLoader.urlFor = function (id) { + savedSearchLoader.urlFor = (id) => { return kbnUrl.eval('#/discover/{{id}}', { id: id }); }; return savedSearchLoader; -}); +} +const module = uiModules.get('discover/saved_searches'); +module.service('savedSearches', createSavedSearchesService); diff --git a/src/legacy/core_plugins/kibana/public/kibana.js b/src/legacy/core_plugins/kibana/public/kibana.js index 98def2252b75c7..cc438d338c7d5b 100644 --- a/src/legacy/core_plugins/kibana/public/kibana.js +++ b/src/legacy/core_plugins/kibana/public/kibana.js @@ -23,6 +23,7 @@ import chrome from 'ui/chrome'; import routes from 'ui/routes'; import { uiModules } from 'ui/modules'; +import { npSetup } from 'ui/new_platform'; // import the uiExports that we want to "use" import 'uiExports/home'; @@ -59,11 +60,13 @@ import { showAppRedirectNotification } from 'ui/notify'; import 'leaflet'; import { localApplicationService } from './local_application_service'; + +npSetup.plugins.kibana_legacy.forwardApp('doc', 'discover', { keepPrefix: true }); +npSetup.plugins.kibana_legacy.forwardApp('context', 'discover', { keepPrefix: true }); localApplicationService.attachToAngular(routes); routes.enable(); - routes .otherwise({ redirectTo: `/${chrome.getInjected('kbnDefaultAppId', 'discover')}` diff --git a/src/legacy/ui/public/accessibility/kbn_accessible_click.js b/src/legacy/ui/public/accessibility/kbn_accessible_click.js index 1abf322daa9a82..0b5016d882c419 100644 --- a/src/legacy/ui/public/accessibility/kbn_accessible_click.js +++ b/src/legacy/ui/public/accessibility/kbn_accessible_click.js @@ -43,52 +43,54 @@ import { } from '@elastic/eui'; import { uiModules } from '../modules'; -uiModules.get('kibana') - .directive('kbnAccessibleClick', function () { - return { - restrict: 'A', - controller: $element => { - $element.on('keydown', e => { +export function KbnAccessibleClickProvider() { + return { + restrict: 'A', + controller: $element => { + $element.on('keydown', e => { // Prevent a scroll from occurring if the user has hit space. - if (e.keyCode === keyCodes.SPACE) { - e.preventDefault(); - } - }); - }, - link: (scope, element, attrs) => { + if (e.keyCode === keyCodes.SPACE) { + e.preventDefault(); + } + }); + }, + link: (scope, element, attrs) => { // The whole point of this directive is to hack in functionality that native buttons provide // by default. - const elementType = element.prop('tagName'); + const elementType = element.prop('tagName'); - if (elementType === 'BUTTON') { - throw new Error(`kbnAccessibleClick doesn't need to be used on a button.`); - } + if (elementType === 'BUTTON') { + throw new Error(`kbnAccessibleClick doesn't need to be used on a button.`); + } - if (elementType === 'A' && attrs.href !== undefined) { - throw new Error(`kbnAccessibleClick doesn't need to be used on a link if it has a href attribute.`); - } + if (elementType === 'A' && attrs.href !== undefined) { + throw new Error(`kbnAccessibleClick doesn't need to be used on a link if it has a href attribute.`); + } - // We're emulating a click action, so we should already have a regular click handler defined. - if (!attrs.ngClick) { - throw new Error('kbnAccessibleClick requires ng-click to be defined on its element.'); - } + // We're emulating a click action, so we should already have a regular click handler defined. + if (!attrs.ngClick) { + throw new Error('kbnAccessibleClick requires ng-click to be defined on its element.'); + } - // If the developer hasn't already specified attributes required for accessibility, add them. - if (attrs.tabindex === undefined) { - element.attr('tabindex', '0'); - } + // If the developer hasn't already specified attributes required for accessibility, add them. + if (attrs.tabindex === undefined) { + element.attr('tabindex', '0'); + } - if (attrs.role === undefined) { - element.attr('role', 'button'); - } + if (attrs.role === undefined) { + element.attr('role', 'button'); + } - element.on('keyup', e => { + element.on('keyup', e => { // Support keyboard accessibility by emulating mouse click on ENTER or SPACE keypress. - if (accessibleClickKeys[e.keyCode]) { + if (accessibleClickKeys[e.keyCode]) { // Delegate to the click handler on the element (assumed to be ng-click). - element.click(); - } - }); - }, - }; - }); + element.click(); + } + }); + }, + }; +} + +uiModules.get('kibana') + .directive('kbnAccessibleClick', KbnAccessibleClickProvider); diff --git a/src/legacy/ui/public/collapsible_sidebar/collapsible_sidebar.js b/src/legacy/ui/public/collapsible_sidebar/collapsible_sidebar.js index 1a70e5b8200037..3de138b7cd93d9 100644 --- a/src/legacy/ui/public/collapsible_sidebar/collapsible_sidebar.js +++ b/src/legacy/ui/public/collapsible_sidebar/collapsible_sidebar.js @@ -21,65 +21,66 @@ import _ from 'lodash'; import $ from 'jquery'; import { uiModules } from '../modules'; - -uiModules - .get('kibana') - .directive('collapsibleSidebar', function () { +export function CollapsibleSidebarProvider() { // simply a list of all of all of angulars .col-md-* classes except 12 - const listOfWidthClasses = _.times(11, function (i) { return 'col-md-' + i; }); + const listOfWidthClasses = _.times(11, function (i) { + return 'col-md-' + i; + }); - return { - restrict: 'C', - link: function ($scope, $elem) { - let isCollapsed = false; - const $collapser = $( - `` - ); - // If the collapsable element has an id, also set aria-controls - if ($elem.attr('id')) { - $collapser.attr('aria-controls', $elem.attr('id')); - } - const $icon = $(''); - $collapser.append($icon); - const $siblings = $elem.siblings(); + ); + // If the collapsable element has an id, also set aria-controls + if ($elem.attr('id')) { + $collapser.attr('aria-controls', $elem.attr('id')); + } + const $icon = $(''); + $collapser.append($icon); + const $siblings = $elem.siblings(); - const siblingsClass = listOfWidthClasses.reduce(function (prev, className) { - if (prev) return prev; - return $siblings.hasClass(className) && className; - }, false); + const siblingsClass = listOfWidthClasses.reduce(function (prev, className) { + if (prev) return prev; + return $siblings.hasClass(className) && className; + }, false); - // If there is are only two elements we can assume the other one will take 100% of the width. - const hasSingleSibling = $siblings.length === 1 && siblingsClass; + // If there is are only two elements we can assume the other one will take 100% of the width. + const hasSingleSibling = $siblings.length === 1 && siblingsClass; - $collapser.on('click', function () { - if (isCollapsed) { - isCollapsed = false; - $elem.removeClass('closed'); - $icon.addClass('fa-chevron-circle-left'); - $icon.removeClass('fa-chevron-circle-right'); - $collapser.attr('aria-expanded', 'true'); - } else { - isCollapsed = true; - $elem.addClass('closed'); - $icon.removeClass('fa-chevron-circle-left'); - $icon.addClass('fa-chevron-circle-right'); - $collapser.attr('aria-expanded', 'false'); - } + $collapser.on('click', function () { + if (isCollapsed) { + isCollapsed = false; + $elem.removeClass('closed'); + $icon.addClass('fa-chevron-circle-left'); + $icon.removeClass('fa-chevron-circle-right'); + $collapser.attr('aria-expanded', 'true'); + } else { + isCollapsed = true; + $elem.addClass('closed'); + $icon.removeClass('fa-chevron-circle-left'); + $icon.addClass('fa-chevron-circle-right'); + $collapser.attr('aria-expanded', 'false'); + } - if (hasSingleSibling) { - $siblings.toggleClass(siblingsClass + ' col-md-12'); - } + if (hasSingleSibling) { + $siblings.toggleClass(siblingsClass + ' col-md-12'); + } - if ($scope.toggleSidebar) $scope.toggleSidebar(); - }); + if ($scope.toggleSidebar) $scope.toggleSidebar(); + }); - $collapser.appendTo($elem); - } - }; - }); + $collapser.appendTo($elem); + }, + }; +} + +uiModules.get('kibana').directive('collapsibleSidebar', CollapsibleSidebarProvider); diff --git a/src/legacy/ui/public/directives/css_truncate.js b/src/legacy/ui/public/directives/css_truncate.js index 7105563e0ce5f2..ac8e29258fddbf 100644 --- a/src/legacy/ui/public/directives/css_truncate.js +++ b/src/legacy/ui/public/directives/css_truncate.js @@ -20,12 +20,11 @@ import { uiModules } from '../modules'; const module = uiModules.get('kibana'); -module.directive('cssTruncate', function () { +export function CssTruncateProvide() { return { restrict: 'A', scope: {}, link: function ($scope, $elem, attrs) { - $elem.css({ overflow: 'hidden', 'white-space': 'nowrap', @@ -35,10 +34,12 @@ module.directive('cssTruncate', function () { if (attrs.cssTruncateExpandable != null) { $scope.$watch( - function () { return $elem.html(); }, + function () { + return $elem.html(); + }, function () { if ($elem[0].offsetWidth < $elem[0].scrollWidth) { - $elem.css({ 'cursor': 'pointer' }); + $elem.css({ cursor: 'pointer' }); $elem.bind('click', function () { $scope.toggle(); }); @@ -59,6 +60,8 @@ module.directive('cssTruncate', function () { $elem.unbind('click'); $elem.unbind('mouseenter'); }); - } + }, }; -}); +} + +module.directive('cssTruncate', CssTruncateProvide); diff --git a/src/legacy/ui/public/directives/debounce/debounce.js b/src/legacy/ui/public/directives/debounce/debounce.js index 3b384d70887436..06c82d4356a4af 100644 --- a/src/legacy/ui/public/directives/debounce/debounce.js +++ b/src/legacy/ui/public/directives/debounce/debounce.js @@ -24,7 +24,7 @@ import { uiModules } from '../../modules'; const module = uiModules.get('kibana'); -module.service('debounce', ['$timeout', function ($timeout) { +export function DebounceProviderTimeout($timeout) { return function (func, wait, options) { let timeout; let args; @@ -68,7 +68,9 @@ module.service('debounce', ['$timeout', function ($timeout) { return debounce; }; -}]); +} + +module.service('debounce', ['$timeout', DebounceProviderTimeout]); export function DebounceProvider(debounce) { return debounce; diff --git a/src/legacy/ui/public/directives/field_name.js b/src/legacy/ui/public/directives/field_name.js index b159b712381865..aff849fc5602f3 100644 --- a/src/legacy/ui/public/directives/field_name.js +++ b/src/legacy/ui/public/directives/field_name.js @@ -21,7 +21,7 @@ import { uiModules } from '../modules'; import { wrapInI18nContext } from 'ui/i18n'; const module = uiModules.get('kibana'); -module.directive('fieldName', function (config, reactDirective) { +export function FieldNameDirectiveProvider(config, reactDirective) { return reactDirective( wrapInI18nContext(FieldName), [ @@ -34,4 +34,6 @@ module.directive('fieldName', function (config, reactDirective) { useShortDots: config.get('shortDots:enable'), } ); -}); +} + +module.directive('fieldName', FieldNameDirectiveProvider); diff --git a/src/legacy/ui/public/directives/listen/listen.js b/src/legacy/ui/public/directives/listen/listen.js index b877e8ee6b08e0..fddc85a4f49145 100644 --- a/src/legacy/ui/public/directives/listen/listen.js +++ b/src/legacy/ui/public/directives/listen/listen.js @@ -19,22 +19,22 @@ import { uiModules } from '../../modules'; -uiModules.get('kibana') - .run(function ($rootScope) { +export function registerListenEventListener($rootScope) { + /** + * Helper that registers an event listener, and removes that listener when + * the $scope is destroyed. + * + * @param {SimpleEmitter} emitter - the event emitter to listen to + * @param {string} eventName - the event name + * @param {Function} handler - the event handler + * @return {undefined} + */ + $rootScope.constructor.prototype.$listen = function (emitter, eventName, handler) { + emitter.on(eventName, handler); + this.$on('$destroy', function () { + emitter.off(eventName, handler); + }); + }; +} - /** - * Helper that registers an event listener, and removes that listener when - * the $scope is destroyed. - * - * @param {SimpleEmitter} emitter - the event emitter to listen to - * @param {string} eventName - the event name - * @param {Function} handler - the event handler - * @return {undefined} - */ - $rootScope.constructor.prototype.$listen = function (emitter, eventName, handler) { - emitter.on(eventName, handler); - this.$on('$destroy', function () { - emitter.off(eventName, handler); - }); - }; - }); +uiModules.get('kibana').run(registerListenEventListener); diff --git a/src/legacy/ui/public/directives/watch_multi/watch_multi.js b/src/legacy/ui/public/directives/watch_multi/watch_multi.js index add95e8146f26a..d1b43f74f56aba 100644 --- a/src/legacy/ui/public/directives/watch_multi/watch_multi.js +++ b/src/legacy/ui/public/directives/watch_multi/watch_multi.js @@ -21,10 +21,8 @@ import _ from 'lodash'; import { uiModules } from '../../modules'; import { callEach } from '../../utils/function'; -uiModules.get('kibana') - .config(function ($provide) { - - $provide.decorator('$rootScope', function ($delegate) { +export function watchMultiDecorator($provide) { + $provide.decorator('$rootScope', function ($delegate) { /** * Watch multiple expressions with a single callback. Along * with making code simpler it also merges all of the watcher @@ -53,23 +51,30 @@ uiModules.get('kibana') * @param {Function} fn - the callback function * @return {Function} - an unwatch function, just like the return value of $watch */ - $delegate.constructor.prototype.$watchMulti = function (expressions, fn) { - if (!Array.isArray(expressions)) throw new TypeError('expected an array of expressions to watch'); - if (!_.isFunction(fn)) throw new TypeError('expected a function that is triggered on each watch'); - - const $scope = this; - const vals = new Array(expressions.length); - const prev = new Array(expressions.length); - let fire = false; - let init = 0; - const neededInits = expressions.length; - - // first, register all of the multi-watchers - const unwatchers = expressions.map(function (expr, i) { - expr = normalizeExpression($scope, expr); - if (!expr) return; - - return expr.fn.call($scope, expr.get, function (newVal, oldVal) { + $delegate.constructor.prototype.$watchMulti = function (expressions, fn) { + if (!Array.isArray(expressions)) { + throw new TypeError('expected an array of expressions to watch'); + } + + if (!_.isFunction(fn)) { + throw new TypeError('expected a function that is triggered on each watch'); + } + const $scope = this; + const vals = new Array(expressions.length); + const prev = new Array(expressions.length); + let fire = false; + let init = 0; + const neededInits = expressions.length; + + // first, register all of the multi-watchers + const unwatchers = expressions.map(function (expr, i) { + expr = normalizeExpression($scope, expr); + if (!expr) return; + + return expr.fn.call( + $scope, + expr.get, + function (newVal, oldVal) { if (newVal === oldVal) { init += 1; } @@ -77,60 +82,69 @@ uiModules.get('kibana') vals[i] = newVal; prev[i] = oldVal; fire = true; - }, expr.deep); - }); - - // then, the watcher that checks to see if any of - // the other watchers triggered this cycle - let flip = false; - unwatchers.push($scope.$watch(function () { - if (init < neededInits) return init; - - if (fire) { - fire = false; - flip = !flip; + }, + expr.deep + ); + }); + + // then, the watcher that checks to see if any of + // the other watchers triggered this cycle + let flip = false; + unwatchers.push( + $scope.$watch( + function () { + if (init < neededInits) return init; + + if (fire) { + fire = false; + flip = !flip; + } + return flip; + }, + function () { + if (init < neededInits) return false; + + fn(vals.slice(0), prev.slice(0)); + vals.forEach(function (v, i) { + prev[i] = v; + }); } - return flip; - }, function () { - if (init < neededInits) return false; + ) + ); - fn(vals.slice(0), prev.slice(0)); - vals.forEach(function (v, i) { - prev[i] = v; - }); - })); + return _.partial(callEach, unwatchers); + }; - return _.partial(callEach, unwatchers); + function normalizeExpression($scope, expr) { + if (!expr) return; + const norm = { + fn: $scope.$watch, + deep: false, }; - function normalizeExpression($scope, expr) { - if (!expr) return; - const norm = { - fn: $scope.$watch, - deep: false - }; - - if (_.isFunction(expr)) return _.assign(norm, { get: expr }); - if (_.isObject(expr)) return _.assign(norm, expr); - if (!_.isString(expr)) return; - - if (expr.substr(0, 2) === '[]') { - return _.assign(norm, { - fn: $scope.$watchCollection, - get: expr.substr(2) - }); - } - - if (expr.charAt(0) === '=') { - return _.assign(norm, { - deep: true, - get: expr.substr(1) - }); - } - - return _.assign(norm, { get: expr }); + if (_.isFunction(expr)) return _.assign(norm, { get: expr }); + if (_.isObject(expr)) return _.assign(norm, expr); + if (!_.isString(expr)) return; + + if (expr.substr(0, 2) === '[]') { + return _.assign(norm, { + fn: $scope.$watchCollection, + get: expr.substr(2), + }); } - return $delegate; - }); + if (expr.charAt(0) === '=') { + return _.assign(norm, { + deep: true, + get: expr.substr(1), + }); + } + + return _.assign(norm, { get: expr }); + } + + return $delegate; }); +} + +uiModules.get('kibana').config(watchMultiDecorator); diff --git a/src/legacy/ui/public/es.js b/src/legacy/ui/public/es.js index d1204f8316f0d7..601beba832c33b 100644 --- a/src/legacy/ui/public/es.js +++ b/src/legacy/ui/public/es.js @@ -44,16 +44,17 @@ const plugins = [function (Client, config) { config.connectionClass = CustomAngularConnector; }]; +export function createEsService(esFactory, esUrl, esApiVersion, esRequestTimeout) { + return esFactory({ + host: esUrl, + log: 'info', + requestTimeout: esRequestTimeout, + apiVersion: esApiVersion, + plugins + }); +} + uiModules .get('kibana', ['elasticsearch', 'kibana/config']) - //Elasticsearch client used for requesting data. Connects to the /elasticsearch proxy - .service('es', function (esFactory, esUrl, esApiVersion, esRequestTimeout) { - return esFactory({ - host: esUrl, - log: 'info', - requestTimeout: esRequestTimeout, - apiVersion: esApiVersion, - plugins - }); - }); + .service('es', createEsService); diff --git a/src/legacy/ui/public/fixed_scroll.js b/src/legacy/ui/public/fixed_scroll.js index fcdde7bbdeb328..64c0ae5850bc9a 100644 --- a/src/legacy/ui/public/fixed_scroll.js +++ b/src/legacy/ui/public/fixed_scroll.js @@ -24,30 +24,22 @@ import { DebounceProvider } from 'ui/directives/debounce'; const SCROLLER_HEIGHT = 20; -/** - * This directive adds a fixed horizontal scrollbar to the bottom of the window that proxies its scroll events - * to the target element's real scrollbar. This is useful when the target element's horizontal scrollbar - * might be waaaay down the page, like the doc table on Discover. - */ -uiModules - .get('kibana') - .directive('fixedScroll', function (Private) { - const debounce = Private(DebounceProvider); - - return { - restrict: 'A', - link: function ($scope, $el) { - let $window = $(window); - let $scroller = $('
').height(SCROLLER_HEIGHT); +export function FixedScrollProvider(Private) { + const debounce = Private(DebounceProvider); + return { + restrict: 'A', + link: function ($scope, $el) { + let $window = $(window); + let $scroller = $('
').height(SCROLLER_HEIGHT); - /** + /** * Remove the listeners bound in listen() * @type {function} */ - let unlisten = _.noop; + let unlisten = _.noop; - /** + /** * Listen for scroll events on the $scroller and the $el, sets unlisten() * * unlisten must be called before calling or listen() will throw an Error @@ -58,98 +50,109 @@ uiModules * @throws {Error} If unlisten was not called first * @return {undefined} */ - function listen() { - if (unlisten !== _.noop) { - throw new Error('fixedScroll listeners were not cleaned up properly before re-listening!'); - } + function listen() { + if (unlisten !== _.noop) { + throw new Error( + 'fixedScroll listeners were not cleaned up properly before re-listening!' + ); + } - let blockTo; - function bind($from, $to) { - function handler() { - if (blockTo === $to) return (blockTo = null); - $to.scrollLeft((blockTo = $from).scrollLeft()); - } - - $from.on('scroll', handler); - return function () { - $from.off('scroll', handler); - }; + let blockTo; + function bind($from, $to) { + function handler() { + if (blockTo === $to) return (blockTo = null); + $to.scrollLeft((blockTo = $from).scrollLeft()); } - unlisten = _.flow( - bind($el, $scroller), - bind($scroller, $el), - function () { unlisten = _.noop; } - ); + $from.on('scroll', handler); + return function () { + $from.off('scroll', handler); + }; } - /** + unlisten = _.flow( + bind($el, $scroller), + bind($scroller, $el), + function () { + unlisten = _.noop; + } + ); + } + + /** * Revert DOM changes and event listeners * @return {undefined} */ - function cleanUp() { - unlisten(); - $scroller.detach(); - $el.css('padding-bottom', 0); - } + function cleanUp() { + unlisten(); + $scroller.detach(); + $el.css('padding-bottom', 0); + } - /** + /** * Modify the DOM and attach event listeners based on need. * Is called many times to re-setup, must be idempotent * @return {undefined} */ - function setup() { - cleanUp(); + function setup() { + cleanUp(); - const containerWidth = $el.width(); - const contentWidth = $el.prop('scrollWidth'); - const containerHorizOverflow = contentWidth - containerWidth; + const containerWidth = $el.width(); + const contentWidth = $el.prop('scrollWidth'); + const containerHorizOverflow = contentWidth - containerWidth; - const elTop = $el.offset().top - $window.scrollTop(); - const elBottom = elTop + $el.height(); - const windowVertOverflow = elBottom - $window.height(); + const elTop = $el.offset().top - $window.scrollTop(); + const elBottom = elTop + $el.height(); + const windowVertOverflow = elBottom - $window.height(); - const requireScroller = containerHorizOverflow > 0 && windowVertOverflow > 0; - if (!requireScroller) return; + const requireScroller = containerHorizOverflow > 0 && windowVertOverflow > 0; + if (!requireScroller) return; - // push the content away from the scroller - $el.css('padding-bottom', SCROLLER_HEIGHT); + // push the content away from the scroller + $el.css('padding-bottom', SCROLLER_HEIGHT); - // fill the scroller with a dummy element that mimics the content - $scroller - .width(containerWidth) - .html($('
').css({ width: contentWidth, height: SCROLLER_HEIGHT })) - .insertAfter($el); + // fill the scroller with a dummy element that mimics the content + $scroller + .width(containerWidth) + .html($('
').css({ width: contentWidth, height: SCROLLER_HEIGHT })) + .insertAfter($el); - // listen for scroll events - listen(); - } + // listen for scroll events + listen(); + } - let width; - let scrollWidth; - function checkWidth() { - const newScrollWidth = $el.prop('scrollWidth'); - const newWidth = $el.width(); + let width; + let scrollWidth; + function checkWidth() { + const newScrollWidth = $el.prop('scrollWidth'); + const newWidth = $el.width(); - if (scrollWidth !== newScrollWidth || width !== newWidth) { - $scope.$apply(setup); + if (scrollWidth !== newScrollWidth || width !== newWidth) { + $scope.$apply(setup); - scrollWidth = newScrollWidth; - width = newWidth; - } + scrollWidth = newScrollWidth; + width = newWidth; } - - const debouncedCheckWidth = debounce(checkWidth, 100, { - invokeApply: false, - }); - $scope.$watch(debouncedCheckWidth); - - // cleanup when the scope is destroyed - $scope.$on('$destroy', function () { - cleanUp(); - debouncedCheckWidth.cancel(); - $scroller = $window = null; - }); } - }; - }); + + const debouncedCheckWidth = debounce(checkWidth, 100, { + invokeApply: false, + }); + $scope.$watch(debouncedCheckWidth); + + // cleanup when the scope is destroyed + $scope.$on('$destroy', function () { + cleanUp(); + debouncedCheckWidth.cancel(); + $scroller = $window = null; + }); + }, + }; +} + +/** + * This directive adds a fixed horizontal scrollbar to the bottom of the window that proxies its scroll events + * to the target element's real scrollbar. This is useful when the target element's horizontal scrollbar + * might be waaaay down the page, like the doc table on Discover. + */ +uiModules.get('kibana').directive('fixedScroll', FixedScrollProvider); diff --git a/src/legacy/ui/public/registry/doc_views.ts b/src/legacy/ui/public/registry/doc_views.ts index 097808c5dcfcc5..bf1e8416ae66d8 100644 --- a/src/legacy/ui/public/registry/doc_views.ts +++ b/src/legacy/ui/public/registry/doc_views.ts @@ -21,6 +21,12 @@ import { DocView, DocViewInput, ElasticSearchHit, DocViewInputFn } from './doc_v export { DocViewRenderProps, DocView, DocViewRenderFn } from './doc_views_types'; +export interface DocViewsRegistry { + docViews: DocView[]; + addDocView: (docView: DocViewInput) => void; + getDocViewsSorted: (hit: ElasticSearchHit) => DocView[]; +} + export const docViews: DocView[] = []; /** diff --git a/src/legacy/ui/public/registry/doc_views_helpers.tsx b/src/legacy/ui/public/registry/doc_views_helpers.tsx index 1ff00713b10efe..d9e42e71dfff1d 100644 --- a/src/legacy/ui/public/registry/doc_views_helpers.tsx +++ b/src/legacy/ui/public/registry/doc_views_helpers.tsx @@ -26,7 +26,7 @@ import { AngularController, AngularDirective, } from './doc_views_types'; -import { DocViewerError } from '../../../core_plugins/kibana/public/discover/doc_viewer/doc_viewer_render_error'; +import { DocViewerError } from '../../../core_plugins/kibana/public/discover/components/doc_viewer/doc_viewer_render_error'; /** * Compiles and injects the give angular template into the given dom node diff --git a/src/legacy/ui/public/render_complete/directive.js b/src/legacy/ui/public/render_complete/directive.js index 6bde2293898b64..0e37ec964d3f03 100644 --- a/src/legacy/ui/public/render_complete/directive.js +++ b/src/legacy/ui/public/render_complete/directive.js @@ -20,13 +20,14 @@ import { uiModules } from '../modules'; import { RenderCompleteHelper } from '../../../../plugins/kibana_utils/public'; -uiModules - .get('kibana') - .directive('renderComplete', () => ({ +export function createRenderCompleteDirective() { + return { controller($scope, $element) { const el = $element[0]; const renderCompleteHelper = new RenderCompleteHelper(el); - $scope.$on('$destroy', renderCompleteHelper.destroy); } - })); + }; +} + +uiModules.get('kibana').directive('renderComplete', createRenderCompleteDirective); diff --git a/src/legacy/ui/ui_exports/ui_export_defaults.js b/src/legacy/ui/ui_exports/ui_export_defaults.js index 5c1669b716ecaf..291d9feea3c402 100644 --- a/src/legacy/ui/ui_exports/ui_export_defaults.js +++ b/src/legacy/ui/ui_exports/ui_export_defaults.js @@ -55,7 +55,6 @@ export const UI_EXPORT_DEFAULTS = { ], embeddableFactories: [ 'plugins/kibana/visualize/embeddable/visualize_embeddable_factory', - 'plugins/kibana/discover/embeddable/search_embeddable_factory', ], search: [ 'ui/courier/search_strategy/default_search_strategy', diff --git a/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx b/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx index 3a872b4c1e3274..ebb57d34c01a11 100644 --- a/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx +++ b/x-pack/legacy/plugins/reporting/public/panel_actions/get_csv_panel_action.tsx @@ -19,10 +19,9 @@ import { IEmbeddable, CONTEXT_MENU_TRIGGER, } from '../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public'; -import { - ISearchEmbeddable, - SEARCH_EMBEDDABLE_TYPE, -} from '../../../../../../src/legacy/core_plugins/kibana/public/discover/embeddable'; +import { SEARCH_EMBEDDABLE_TYPE } from '../../../../../../src/legacy/core_plugins/kibana/public/discover/embeddable/constants'; +import { ISearchEmbeddable } from '../../../../../../src/legacy/core_plugins/kibana/public/discover/embeddable/types'; + import { API_BASE_URL_V1 } from '../../common/constants'; const API_BASE_URL = `${API_BASE_URL_V1}/generate/immediate/csv/saved-object`; From 0ebc12e8e1ae3cc6da5a0ad8073d7e2b1da5f64f Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Fri, 29 Nov 2019 16:36:20 +0100 Subject: [PATCH 02/39] Migrate UiSettingsClient type to IUiSettingsClient (#51913) --- .../discover/angular/doc_table/components/table_header.ts | 4 ++-- .../public/discover/angular/doc_table/components/table_row.ts | 4 ++-- .../kibana/public/discover/angular/doc_table/doc_table.ts | 4 ++-- .../core_plugins/kibana/public/discover/get_inner_angular.ts | 4 ++-- .../kibana/public/discover/helpers/build_services.ts | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts index c4312b3bc468a0..055f14f164476f 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_header.ts @@ -17,10 +17,10 @@ * under the License. */ import { wrapInI18nContext } from 'ui/i18n'; -import { UiSettingsClient } from 'kibana/public'; +import { IUiSettingsClient } from 'kibana/public'; import { TableHeader } from './table_header/table_header'; -export function createTableHeaderDirective(reactDirective: any, config: UiSettingsClient) { +export function createTableHeaderDirective(reactDirective: any, config: IUiSettingsClient) { return reactDirective( wrapInI18nContext(TableHeader), [ diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts index 883513173187ac..8ff4ab46ef5321 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/components/table_row.ts @@ -19,7 +19,7 @@ import _ from 'lodash'; import $ from 'jquery'; -import { UiSettingsClient } from 'kibana/public'; +import { IUiSettingsClient } from 'kibana/public'; // @ts-ignore import rison from 'rison-node'; import '../../doc_viewer'; @@ -45,7 +45,7 @@ export function createTableRowDirective( $compile: ng.ICompileService, $httpParamSerializer: any, kbnUrl: any, - config: UiSettingsClient + config: IUiSettingsClient ) { const cellTemplate = _.template(noWhiteSpace(cellTemplateHtml)); const truncateByHeightTemplate = _.template(noWhiteSpace(truncateByHeightTemplateHtml)); diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts index 1be87bfa1f3b25..92ebc24c6e3782 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/doc_table.ts @@ -18,7 +18,7 @@ */ import _ from 'lodash'; -import { UiSettingsClient } from 'kibana/public'; +import { IUiSettingsClient } from 'kibana/public'; import html from './doc_table.html'; import './infinite_scroll'; import './components/table_header'; @@ -34,7 +34,7 @@ interface LazyScope extends ng.IScope { } export function createDocTableDirective( - config: UiSettingsClient, + config: IUiSettingsClient, getAppState: any, pagerFactory: any, $filter: any diff --git a/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts b/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts index 93a823a0547566..3c1d41657a1d39 100644 --- a/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts +++ b/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts @@ -34,7 +34,7 @@ import { createEsService } from 'ui/es'; import { i18nDirective, i18nFilter, I18nProvider } from '@kbn/i18n/angular'; // @ts-ignore import { PrivateProvider } from 'ui/private/private'; -import { CoreStart, LegacyCoreStart, UiSettingsClientContract } from 'kibana/public'; +import { CoreStart, LegacyCoreStart, IUiSettingsClient } from 'kibana/public'; // @ts-ignore import { watchMultiDecorator } from 'ui/directives/watch_multi/watch_multi'; // @ts-ignore @@ -225,7 +225,7 @@ function createLocalKbnUrlModule() { .service('redirectWhenMissing', (Private: IPrivate) => Private(RedirectWhenMissingProvider)); } -function createLocalConfigModule(uiSettings: UiSettingsClientContract) { +function createLocalConfigModule(uiSettings: IUiSettingsClient) { angular .module('discoverConfig', ['discoverPrivate']) .provider('stateManagementConfig', StateManagementConfigProvider) diff --git a/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts b/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts index 33a099cce5fd8f..51f1521504be8e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/helpers/build_services.ts @@ -22,7 +22,7 @@ import { CoreStart, DocLinksStart, ToastsStart, - UiSettingsClientContract, + IUiSettingsClient, } from 'kibana/public'; import * as docViewsRegistry from 'ui/registry/doc_views'; import chromeLegacy from 'ui/chrome'; @@ -61,7 +61,7 @@ export interface DiscoverServices { getSavedSearchById: (id: string) => Promise; getSavedSearchUrlById: (id: string) => Promise; State: unknown; - uiSettings: UiSettingsClientContract; + uiSettings: IUiSettingsClient; } export async function buildGlobalAngularServices() { From bb7c9ed9d92c9ad0845c653826f6e2b7e243fac4 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Fri, 29 Nov 2019 17:12:49 +0000 Subject: [PATCH 03/39] [ML] Changing job message info icon (#51904) --- .../components/job_message_icon/job_message_icon.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/legacy/plugins/ml/public/application/components/job_message_icon/job_message_icon.tsx b/x-pack/legacy/plugins/ml/public/application/components/job_message_icon/job_message_icon.tsx index 7546121250013f..a17ee19f78febb 100644 --- a/x-pack/legacy/plugins/ml/public/application/components/job_message_icon/job_message_icon.tsx +++ b/x-pack/legacy/plugins/ml/public/application/components/job_message_icon/job_message_icon.tsx @@ -22,10 +22,10 @@ export const JobIcon: FC = ({ message, showTooltip = false }) => { } let color = 'primary'; - const icon = 'alert'; + let icon = 'alert'; if (message.level === INFO) { - color = 'primary'; + icon = 'iInCircle'; } else if (message.level === WARNING) { color = 'warning'; } else if (message.level === ERROR) { From 3a0d5f4bf54f91129e70a82d7aeac6fa6ee2511a Mon Sep 17 00:00:00 2001 From: Artyom Gospodarsky Date: Sat, 30 Nov 2019 15:58:20 +0300 Subject: [PATCH 04/39] [NP] Move IndexPatterns into the NP (#51199) * Make a copy of index_patterns module inside NP * Sync changes of index patterns * Remove UI component from service * Remove redundant exports from index_patterns * Sync old index_patters changes * Make common namespace of IndexPattern * Make re-exports of old IndexPatter dependencies * Remove utils and error of the old indexPattern * Plug InterPatternService in data plugin * Make shortenDotString in new data plugin * Remove field folder * Fix wrong merge * Remove index_pattern folder * Remove _LEGACY from service * Remove static code from service * Fix start contract * Remove services from the old plugin * Remove index_patterns_service * Fix filter.meta.index type * Fix reviews * Fix type error --- .../filter/action/apply_filter_action.ts | 5 ++- src/legacy/core_plugins/data/public/index.ts | 2 +- .../data/public/index_patterns/index.ts | 19 +++++++- .../components/fetch_index_patterns.ts | 2 +- .../data/public/shim/legacy_module.ts | 2 +- .../public/views/table/table.test.tsx | 2 +- .../kibana/public/dashboard/application.ts | 4 +- .../dashboard/dashboard_app_controller.tsx | 8 ++-- .../create_edit_field/create_edit_field.js | 4 +- .../public/index_patterns/__mocks__/index.ts | 18 ++++---- src/legacy/ui/public/index_patterns/index.ts | 12 ++--- .../common/field_formats/converters/source.ts | 3 +- .../common/field_formats/converters/string.ts | 3 +- src/plugins/data/common/index.ts | 2 +- src/plugins/data/common/utils/index.ts | 20 +++++++++ .../utils/shorten_dotted_string.test.ts | 34 ++++++++++++++ .../common/utils/shorten_dotted_string.ts} | 23 ++++------ .../public/index_patterns/fields/field.ts | 17 +++---- .../index_patterns/fields/field_list.ts | 9 ++-- .../public/index_patterns/fields/index.ts | 0 .../index_patterns/fields/obj_define.js | 0 .../index_patterns/fields/obj_define.test.js | 0 .../data/public/index_patterns/index.ts | 11 +++++ .../index_patterns/_fields_fetcher.ts | 0 .../index_patterns/_pattern_cache.ts | 2 +- .../index_patterns/flatten_hit.ts | 0 .../index_patterns/format_hit.ts | 0 .../index_patterns/index_patterns/index.ts | 0 .../index_patterns/index_pattern.test.ts | 17 ++++--- .../index_patterns/index_pattern.ts | 28 ++++-------- .../index_patterns/index_patterns.test.ts | 0 .../index_patterns/index_patterns.ts | 0 .../index_patterns_api_client.test.mock.ts | 2 +- .../index_patterns_api_client.test.ts | 0 .../index_patterns_api_client.ts | 2 +- .../index_patterns_service.mock.ts | 9 ++-- .../index_patterns/index_patterns_service.ts | 44 +++---------------- ...et_index_pattern_title.ts => get_title.ts} | 2 +- .../data/public/index_patterns/lib/index.ts | 2 +- .../data/public/index_patterns/services.ts | 4 +- .../data/public/index_patterns/types.ts | 23 ++++++++++ .../data/public/index_patterns/utils.ts | 5 +-- src/plugins/data/public/mocks.ts | 3 ++ src/plugins/data/public/plugin.ts | 15 ++++++- src/plugins/data/public/types.ts | 3 ++ .../index_pattern_select.tsx | 4 +- src/test_utils/public/stub_index_pattern.js | 2 +- .../services/persistence/deserialize.ts | 2 +- 48 files changed, 211 insertions(+), 158 deletions(-) create mode 100644 src/plugins/data/common/utils/index.ts create mode 100644 src/plugins/data/common/utils/shorten_dotted_string.test.ts rename src/{legacy/core_plugins/data/public/mocks.ts => plugins/data/common/utils/shorten_dotted_string.ts} (68%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/field.ts (94%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/field_list.ts (91%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/index.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/obj_define.js (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/obj_define.test.js (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/_fields_fetcher.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/_pattern_cache.ts (97%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/flatten_hit.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/format_hit.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_pattern.test.ts (95%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_pattern.ts (96%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns.test.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts (92%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.ts (97%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns_service.mock.ts (87%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns_service.ts (60%) rename src/plugins/data/public/index_patterns/lib/{get_index_pattern_title.ts => get_title.ts} (96%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/services.ts (87%) create mode 100644 src/plugins/data/public/index_patterns/types.ts rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/utils.ts (93%) diff --git a/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts b/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts index 946b3997a97129..c65ae3a0ec7b93 100644 --- a/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts +++ b/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts @@ -32,8 +32,9 @@ import { applyFiltersPopover, changeTimeFilter, extractTimeFilter, + IndexPatternsStart, } from '../../../../../../plugins/data/public'; -import { IndexPatternsStart } from '../../index_patterns'; + export const GLOBAL_APPLY_FILTER_ACTION = 'GLOBAL_APPLY_FILTER_ACTION'; interface ActionContext { @@ -74,7 +75,7 @@ export function createFilterAction( if (selectedFilters.length > 1) { const indexPatterns = await Promise.all( filters.map(filter => { - return indexPatternsService.indexPatterns.get(filter.meta.index); + return indexPatternsService.indexPatterns.get(filter.meta.index!); }) ); diff --git a/src/legacy/core_plugins/data/public/index.ts b/src/legacy/core_plugins/data/public/index.ts index 833d8c248f46aa..bdfedbc2c81a85 100644 --- a/src/legacy/core_plugins/data/public/index.ts +++ b/src/legacy/core_plugins/data/public/index.ts @@ -48,4 +48,4 @@ export { /** @public static code */ export * from '../common'; export { FilterStateManager } from './filter/filter_manager'; -export { getFromSavedObject, getRoutes } from './index_patterns'; +export { getFromSavedObject, getRoutes, flattenHitWrapper } from './index_patterns'; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index.ts b/src/legacy/core_plugins/data/public/index_patterns/index.ts index 496c4ba7b5b6f1..74981165f3e474 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index.ts @@ -17,4 +17,21 @@ * under the License. */ -export * from './index_patterns_service'; +import { IFieldType, IIndexPattern, indexPatterns } from '../../../../../plugins/data/public'; + +const getFromSavedObject = indexPatterns.getFromSavedObject; +const getRoutes = indexPatterns.getRoutes; +const flattenHitWrapper = indexPatterns.flattenHitWrapper; + +export { getFromSavedObject, getRoutes, flattenHitWrapper }; +export { IFieldType as FieldType }; +export { IIndexPattern as StaticIndexPattern }; +export { + Field, + FieldListInterface, + IndexPattern, + IndexPatterns, + IndexPatternsStart, + IndexPatternsSetup, + IndexPatternsService, +} from '../../../../../plugins/data/public'; diff --git a/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts b/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts index 3dcab22605c07e..7a4c9f139c8873 100644 --- a/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts +++ b/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts @@ -18,7 +18,7 @@ */ import { isEmpty } from 'lodash'; import { IUiSettingsClient, SavedObjectsClientContract } from 'src/core/public'; -import { getFromSavedObject } from '../../../index_patterns'; +import { getFromSavedObject } from '../../../'; export async function fetchIndexPatterns( savedObjectsClient: SavedObjectsClientContract, diff --git a/src/legacy/core_plugins/data/public/shim/legacy_module.ts b/src/legacy/core_plugins/data/public/shim/legacy_module.ts index 06c5caa04ba9ac..0e12790d89fed7 100644 --- a/src/legacy/core_plugins/data/public/shim/legacy_module.ts +++ b/src/legacy/core_plugins/data/public/shim/legacy_module.ts @@ -21,7 +21,7 @@ import { once } from 'lodash'; // @ts-ignore import { uiModules } from 'ui/modules'; -import { IndexPatterns } from '../index_patterns/index_patterns'; +import { IndexPatterns } from '../'; /** @internal */ export const initLegacyModule = once((indexPatterns: IndexPatterns): void => { diff --git a/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx b/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx index e341b7c4a5a866..bad006aa8c7d5a 100644 --- a/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx +++ b/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx @@ -21,7 +21,7 @@ import { mount } from 'enzyme'; import { IndexPattern } from 'ui/index_patterns'; // @ts-ignore import { findTestSubject } from '@elastic/eui/lib/test'; -import { flattenHitWrapper } from '../../../../data/public/index_patterns/index_patterns/flatten_hit'; +import { flattenHitWrapper } from '../../../../data/public/'; import { DocViewTable } from './table'; // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/dashboard/application.ts b/src/legacy/core_plugins/kibana/public/dashboard/application.ts index 797583362a8f88..42ecc0fea5f073 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/application.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/application.ts @@ -47,7 +47,7 @@ import { // @ts-ignore import { initDashboardApp } from './legacy_app'; -import { DataStart } from '../../../data/public'; +import { DataStart, IndexPatterns } from '../../../data/public'; import { IEmbeddableStart } from '../../../../../plugins/embeddable/public'; import { NavigationStart } from '../../../navigation/public'; import { DataPublicPluginStart as NpDataStart } from '../../../../../plugins/data/public'; @@ -55,7 +55,7 @@ import { SharePluginStart } from '../../../../../plugins/share/public'; export interface RenderDeps { core: LegacyCoreStart; - indexPatterns: DataStart['indexPatterns']['indexPatterns']; + indexPatterns: IndexPatterns; dataStart: DataStart; npDataStart: NpDataStart; navigation: NavigationStart; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx index dcd25033e9d151..7972c7603d3111 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx +++ b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx @@ -39,7 +39,7 @@ import { unhashUrl, } from './legacy_imports'; import { FilterStateManager, IndexPattern } from '../../../data/public'; -import { Query, SavedQuery } from '../../../../../plugins/data/public'; +import { Query, SavedQuery, IndexPatterns } from '../../../../../plugins/data/public'; import './dashboard_empty_screen_directive'; @@ -78,9 +78,7 @@ export interface DashboardAppControllerDependencies extends RenderDeps { $routeParams: any; getAppState: any; globalState: State; - indexPatterns: { - getDefault: () => Promise; - }; + indexPatterns: IndexPatterns; dashboardConfig: any; kbnUrl: KbnUrl; AppStateClass: TAppStateClass; @@ -171,7 +169,7 @@ export class DashboardAppController { } else { indexPatterns.getDefault().then(defaultIndexPattern => { $scope.$evalAsync(() => { - $scope.indexPatterns = [defaultIndexPattern]; + $scope.indexPatterns = [defaultIndexPattern as IndexPattern]; }); }); } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js index c9ea1e12c58fdc..5f0994abc11e48 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js @@ -17,9 +17,7 @@ * under the License. */ -import { setup as data } from '../../../../../../../data/public/legacy'; -const { FieldImpl: Field } = data.indexPatterns.__LEGACY; - +import { Field } from '../../../../../../../../../plugins/data/public'; import { RegistryFieldFormatEditorsProvider } from 'ui/registry/field_format_editors'; import { docTitle } from 'ui/doc_title'; import { KbnUrlProvider } from 'ui/url'; diff --git a/src/legacy/ui/public/index_patterns/__mocks__/index.ts b/src/legacy/ui/public/index_patterns/__mocks__/index.ts index 9ff09835e48da2..6f3d39299f9707 100644 --- a/src/legacy/ui/public/index_patterns/__mocks__/index.ts +++ b/src/legacy/ui/public/index_patterns/__mocks__/index.ts @@ -17,18 +17,18 @@ * under the License. */ -import { dataPluginMock } from '../../../../core_plugins/data/public/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { dataPluginMock } from '../../../../../plugins/data/public/mocks'; +import { indexPatterns as npIndexPatterns } from '../../../../../plugins/data/public'; -const dataSetup = dataPluginMock.createSetup(); +const dataSetup = dataPluginMock.createSetupContract(); // mocks for stateful code -export const { FieldImpl } = dataSetup.indexPatterns!.__LEGACY; -export const { - FieldList, - flattenHitWrapper, - formatHitProvider, - indexPatterns, -} = dataSetup.indexPatterns!; +export const { indexPatterns } = dataSetup.indexPatterns!; + +export const flattenHitWrapper = npIndexPatterns.flattenHitWrapper; +export const formatHitProvider = npIndexPatterns.formatHitProvider; // static code export { getFromSavedObject, getRoutes } from '../../../../core_plugins/data/public'; +export { FieldList } from '../../../../../plugins/data/public'; diff --git a/src/legacy/ui/public/index_patterns/index.ts b/src/legacy/ui/public/index_patterns/index.ts index 06001667c9e53a..200276c1727fcf 100644 --- a/src/legacy/ui/public/index_patterns/index.ts +++ b/src/legacy/ui/public/index_patterns/index.ts @@ -24,14 +24,6 @@ * from ui/index_patterns for backwards compatibility. */ -import { start as data } from '../../../core_plugins/data/public/legacy'; - -export const { - FieldList, // only used in Discover and StubIndexPattern - flattenHitWrapper, - formatHitProvider, -} = data.indexPatterns; - import { indexPatterns } from '../../../../plugins/data/public'; // static code @@ -42,6 +34,8 @@ export const INDEX_PATTERN_ILLEGAL_CHARACTERS_VISIBLE = indexPatterns.ILLEGAL_CH export const ILLEGAL_CHARACTERS = indexPatterns.ILLEGAL_CHARACTERS_KEY; export const CONTAINS_SPACES = indexPatterns.CONTAINS_SPACES_KEY; export const validateIndexPattern = indexPatterns.validate; +export const flattenHitWrapper = indexPatterns.flattenHitWrapper; +export const formatHitProvider = indexPatterns.formatHitProvider; // types export { @@ -52,3 +46,5 @@ export { IndexPatterns, StaticIndexPattern, } from '../../../core_plugins/data/public'; + +export { FieldList } from '../../../../plugins/data/public'; diff --git a/src/plugins/data/common/field_formats/converters/source.ts b/src/plugins/data/common/field_formats/converters/source.ts index 54977c7e669761..c9906fb1360524 100644 --- a/src/plugins/data/common/field_formats/converters/source.ts +++ b/src/plugins/data/common/field_formats/converters/source.ts @@ -20,8 +20,7 @@ import { template, escape, keys } from 'lodash'; // @ts-ignore import { noWhiteSpace } from '../../../../../legacy/core_plugins/kibana/common/utils/no_white_space'; -// @ts-ignore -import { shortenDottedString } from '../../../../../legacy/core_plugins/kibana/common/utils/shorten_dotted_string'; +import { shortenDottedString } from '../../utils'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, HtmlContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; diff --git a/src/plugins/data/common/field_formats/converters/string.ts b/src/plugins/data/common/field_formats/converters/string.ts index 0edd219ca60f94..b2d92cf475a161 100644 --- a/src/plugins/data/common/field_formats/converters/string.ts +++ b/src/plugins/data/common/field_formats/converters/string.ts @@ -22,8 +22,7 @@ import { asPrettyString } from '../index'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; -// @ts-ignore -import { shortenDottedString } from '../../../../../legacy/core_plugins/kibana/common/utils/shorten_dotted_string'; +import { shortenDottedString } from '../../utils'; const TRANSFORM_OPTIONS = [ { diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index f9bbeb5f4b3f39..b334342a57ec6b 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -22,5 +22,5 @@ export * from './field_formats'; export * from './kbn_field_types'; export * from './index_patterns'; export * from './es_query'; - +export * from './utils'; export * from './types'; diff --git a/src/plugins/data/common/utils/index.ts b/src/plugins/data/common/utils/index.ts new file mode 100644 index 00000000000000..7196c96989e97d --- /dev/null +++ b/src/plugins/data/common/utils/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { shortenDottedString } from './shorten_dotted_string'; diff --git a/src/plugins/data/common/utils/shorten_dotted_string.test.ts b/src/plugins/data/common/utils/shorten_dotted_string.test.ts new file mode 100644 index 00000000000000..5f8d084ce5e88c --- /dev/null +++ b/src/plugins/data/common/utils/shorten_dotted_string.test.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { shortenDottedString } from './shorten_dotted_string'; + +describe('shortenDottedString', () => { + test('should convert a dot.notated.string into a short string', () => { + expect(shortenDottedString('dot.notated.string')).toBe('d.n.string'); + }); + + test('should ignore non-string values', () => { + const obj = { key: 'val' }; + + expect(shortenDottedString(true)).toBe(true); + expect(shortenDottedString(123)).toBe(123); + expect(shortenDottedString(obj)).toBe(obj); + }); +}); diff --git a/src/legacy/core_plugins/data/public/mocks.ts b/src/plugins/data/common/utils/shorten_dotted_string.ts similarity index 68% rename from src/legacy/core_plugins/data/public/mocks.ts rename to src/plugins/data/common/utils/shorten_dotted_string.ts index 39d1296ddf8bc4..379413c0d91c8f 100644 --- a/src/legacy/core_plugins/data/public/mocks.ts +++ b/src/plugins/data/common/utils/shorten_dotted_string.ts @@ -17,19 +17,14 @@ * under the License. */ -import { indexPatternsServiceMock } from './index_patterns/index_patterns_service.mock'; +const DOT_PREFIX_RE = /(.).+?\./g; -function createDataSetupMock() { - return { - indexPatterns: indexPatternsServiceMock.createSetupContract(), - }; -} - -function createDataStartMock() { - return {}; +/** + * Convert a dot.notated.string into a short + * version (d.n.string) + * + * @return {any} + */ +export function shortenDottedString(input: any) { + return typeof input !== 'string' ? input : input.replace(DOT_PREFIX_RE, '$1.'); } - -export const dataPluginMock = { - createSetup: createDataSetupMock, - createStart: createDataStartMock, -}; diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/field.ts b/src/plugins/data/public/index_patterns/fields/field.ts similarity index 94% rename from src/legacy/core_plugins/data/public/index_patterns/fields/field.ts rename to src/plugins/data/public/index_patterns/fields/field.ts index 91964655f6f3e7..ae17188de8625f 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/fields/field.ts +++ b/src/plugins/data/public/index_patterns/fields/field.ts @@ -20,26 +20,19 @@ import { i18n } from '@kbn/i18n'; // @ts-ignore import { ObjDefine } from './obj_define'; -// @ts-ignore -import { shortenDottedString } from '../../../../../core_plugins/kibana/common/utils/shorten_dotted_string'; import { IndexPattern } from '../index_patterns'; import { getNotifications, getFieldFormats } from '../services'; - import { - FieldFormat, - getKbnFieldType, IFieldType, + getKbnFieldType, IFieldSubType, -} from '../../../../../../plugins/data/public'; + FieldFormat, + shortenDottedString, +} from '../../../common'; export type FieldSpec = Record; -/** @deprecated - * Please use IFieldType instead - * */ -export type FieldType = IFieldType; - -export class Field implements FieldType { +export class Field implements IFieldType { name: string; type: string; script?: string; diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts b/src/plugins/data/public/index_patterns/fields/field_list.ts similarity index 91% rename from src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts rename to src/plugins/data/public/index_patterns/fields/field_list.ts index 108aacc8e07def..ff6706cec6c344 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts +++ b/src/plugins/data/public/index_patterns/fields/field_list.ts @@ -19,7 +19,8 @@ import { findIndex } from 'lodash'; import { IndexPattern } from '../index_patterns'; -import { Field, FieldType, FieldSpec } from './field'; +import { IFieldType } from '../../../common'; +import { Field, FieldSpec } from './field'; type FieldMap = Map; @@ -27,7 +28,7 @@ export interface FieldListInterface extends Array { getByName(name: Field['name']): Field | undefined; getByType(type: Field['type']): Field[]; add(field: FieldSpec): void; - remove(field: FieldType): void; + remove(field: IFieldType): void; } export class FieldList extends Array implements FieldListInterface { @@ -42,7 +43,7 @@ export class FieldList extends Array implements FieldListInterface { } this.groups.get(field.type)!.set(field.name, field); }; - private removeByGroup = (field: FieldType) => this.groups.get(field.type)!.delete(field.name); + private removeByGroup = (field: IFieldType) => this.groups.get(field.type)!.delete(field.name); constructor(indexPattern: IndexPattern, specs: FieldSpec[] = [], shortDotsEnable = false) { super(); @@ -61,7 +62,7 @@ export class FieldList extends Array implements FieldListInterface { this.setByGroup(newField); }; - remove = (field: FieldType) => { + remove = (field: IFieldType) => { this.removeByGroup(field); this.byName.delete(field.name); diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/index.ts b/src/plugins/data/public/index_patterns/fields/index.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/fields/index.ts rename to src/plugins/data/public/index_patterns/fields/index.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.js b/src/plugins/data/public/index_patterns/fields/obj_define.js similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.js rename to src/plugins/data/public/index_patterns/fields/obj_define.js diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.test.js b/src/plugins/data/public/index_patterns/fields/obj_define.test.js similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.test.js rename to src/plugins/data/public/index_patterns/fields/obj_define.test.js diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index aedfc18db3ade3..7492f9372e44a6 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -25,6 +25,8 @@ import { ILLEGAL_CHARACTERS, validateIndexPattern, } from './lib'; +import { getRoutes, getFromSavedObject } from './utils'; +import { flattenHitWrapper, formatHitProvider } from './index_patterns'; export const indexPatterns = { ILLEGAL_CHARACTERS_KEY, @@ -33,4 +35,13 @@ export const indexPatterns = { ILLEGAL_CHARACTERS, IndexPatternMissingIndices, validate: validateIndexPattern, + getRoutes, + getFromSavedObject, + flattenHitWrapper, + formatHitProvider, }; + +export { IndexPatternsService } from './index_patterns_service'; +export { Field, FieldList, FieldListInterface } from './fields'; +export { IndexPattern, IndexPatterns } from './index_patterns'; +export { IndexPatternsStart, IndexPatternsSetup } from './types'; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts b/src/plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts rename to src/plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts similarity index 97% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts rename to src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts index a3653bb529fa38..eb6c69b4143160 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts @@ -19,7 +19,7 @@ import { IndexPattern } from './index_pattern'; -export interface PatternCache { +interface PatternCache { get: (id: string) => IndexPattern; set: (id: string, value: IndexPattern) => IndexPattern; clear: (id: string) => void; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/flatten_hit.ts b/src/plugins/data/public/index_patterns/index_patterns/flatten_hit.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/flatten_hit.ts rename to src/plugins/data/public/index_patterns/index_patterns/flatten_hit.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/format_hit.ts b/src/plugins/data/public/index_patterns/index_patterns/format_hit.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/format_hit.ts rename to src/plugins/data/public/index_patterns/index_patterns/format_hit.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index_patterns/index.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index.ts rename to src/plugins/data/public/index_patterns/index_patterns/index.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts similarity index 95% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts index ee9f9b493ebf25..a0a884454a3f00 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts @@ -20,24 +20,23 @@ import { defaults, pluck, last, get } from 'lodash'; import { IndexPattern } from './index_pattern'; -import { DuplicateField } from '../../../../../../plugins/kibana_utils/public'; +import { DuplicateField } from '../../../../kibana_utils/public'; // @ts-ignore -import mockLogStashFields from '../../../../../../fixtures/logstash_fields'; +import mockLogStashFields from '../../../../../fixtures/logstash_fields'; // @ts-ignore - -import { stubbedSavedObjectIndexPattern } from '../../../../../../fixtures/stubbed_saved_object_index_pattern'; -import { Field } from '../index_patterns_service'; +import { stubbedSavedObjectIndexPattern } from '../../../../../fixtures/stubbed_saved_object_index_pattern'; +import { Field } from '../fields'; import { setNotifications, setFieldFormats } from '../services'; // Temporary disable eslint, will be removed after moving to new platform folder // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { notificationServiceMock } from '../../../../../../core/public/notifications/notifications_service.mock'; -import { FieldFormatRegisty } from '../../../../../../plugins/data/public'; +import { notificationServiceMock } from '../../../../../core/public/notifications/notifications_service.mock'; +import { FieldFormatRegisty } from '../../field_formats_provider'; jest.mock('ui/new_platform'); -jest.mock('../../../../../../plugins/kibana_utils/public', () => { - const originalModule = jest.requireActual('../../../../../../plugins/kibana_utils/public'); +jest.mock('../../../../kibana_utils/public', () => { + const originalModule = jest.requireActual('../../../../kibana_utils/public'); return { ...originalModule, diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts similarity index 96% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index de364b6c217dd7..2c93c0aa9dc620 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -26,17 +26,13 @@ import { expandShorthand, FieldMappingSpec, MappingObject, -} from '../../../../../../plugins/kibana_utils/public'; +} from '../../../../kibana_utils/public'; -import { - ES_FIELD_TYPES, - KBN_FIELD_TYPES, - IIndexPattern, - indexPatterns, -} from '../../../../../../plugins/data/public'; - -import { findIndexPatternByTitle, getRoutes } from '../utils'; -import { Field, FieldList, FieldListInterface, FieldType } from '../fields'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES, IIndexPattern, IFieldType } from '../../../common'; + +import { findByTitle, getRoutes } from '../utils'; +import { indexPatterns } from '../'; +import { Field, FieldList, FieldListInterface } from '../fields'; import { createFieldsFetcher } from './_fields_fetcher'; import { formatHitProvider } from './format_hit'; import { flattenHitWrapper } from './flatten_hit'; @@ -46,11 +42,6 @@ import { getNotifications, getFieldFormats } from '../services'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; const type = 'index-pattern'; -/** @deprecated - * Please use IIndexPattern instead - * */ -export type StaticIndexPattern = IIndexPattern; - export class IndexPattern implements IIndexPattern { [key: string]: any; @@ -296,7 +287,7 @@ export class IndexPattern implements IIndexPattern { await this.save(); } - removeScriptedField(field: FieldType) { + removeScriptedField(field: IFieldType) { this.fields.remove(field); return this.save(); } @@ -384,10 +375,7 @@ export class IndexPattern implements IIndexPattern { return response.id; }; - const potentialDuplicateByTitle = await findIndexPatternByTitle( - this.savedObjectsClient, - this.title - ); + const potentialDuplicateByTitle = await findByTitle(this.savedObjectsClient, this.title); // If there is potentially duplicate title, just create it if (!potentialDuplicateByTitle) { return await _create(); diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts similarity index 92% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts index 06933dc4090528..2d3e357e968199 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts @@ -17,7 +17,7 @@ * under the License. */ -import { setup } from '../../../../../../test_utils/public/http_test_setup'; +import { setup } from 'test_utils/http_test_setup'; export const { http } = setup(injectedMetadata => { injectedMetadata.getBasePath.mockReturnValue('/hola/daro/'); diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts similarity index 97% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts index 87dd7a68e30614..961e519338ac4d 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts @@ -18,7 +18,7 @@ */ import { HttpServiceBase } from 'src/core/public'; -import { indexPatterns } from '../../../../../../plugins/data/public'; +import { indexPatterns } from '../'; const API_BASE_URL: string = `/api/index_patterns/`; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts b/src/plugins/data/public/index_patterns/index_patterns_service.mock.ts similarity index 87% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts rename to src/plugins/data/public/index_patterns/index_patterns_service.mock.ts index db1ece78e7b4d1..d38e9c76430eb7 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts +++ b/src/plugins/data/public/index_patterns/index_patterns_service.mock.ts @@ -17,8 +17,9 @@ * under the License. */ -import { IndexPatternsService, IndexPatternsSetup } from '.'; +import { IndexPatternsService } from './index_patterns_service'; import { flattenHitWrapper } from './index_patterns'; +import { IndexPatternsSetup } from './types'; type IndexPatternsServiceClientContract = PublicMethodsOf; @@ -33,11 +34,7 @@ const createSetupContractMock = () => { flattenHitWrapper: jest.fn().mockImplementation(flattenHitWrapper), formatHitProvider: jest.fn(), indexPatterns: jest.fn() as any, - __LEGACY: { - // For BWC we must temporarily export the class implementation of Field, - // which is only used externally by the Index Pattern UI. - FieldImpl: jest.fn(), - }, + IndexPatternSelect: jest.fn(), }; return setupContract; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts b/src/plugins/data/public/index_patterns/index_patterns_service.ts similarity index 60% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts rename to src/plugins/data/public/index_patterns/index_patterns_service.ts index 83738ffe5b747c..40f833868847b7 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts +++ b/src/plugins/data/public/index_patterns/index_patterns_service.ts @@ -23,19 +23,11 @@ import { HttpServiceBase, NotificationsStart, } from 'src/core/public'; -import { FieldFormatsStart } from '../../../../../plugins/data/public'; -import { Field, FieldList, FieldListInterface, FieldType } from './fields'; +import { FieldFormatsStart } from '../field_formats_provider'; import { setNotifications, setFieldFormats } from './services'; +import { IndexPatterns } from './index_patterns'; -import { - createFlattenHitWrapper, - formatHitProvider, - IndexPattern, - IndexPatterns, - StaticIndexPattern, -} from './index_patterns'; - -export interface IndexPatternDependencies { +interface IndexPatternDependencies { uiSettings: IUiSettingsClient; savedObjectsClient: SavedObjectsClientContract; http: HttpServiceBase; @@ -52,16 +44,8 @@ export class IndexPatternsService { private setupApi: any; public setup() { - this.setupApi = { - FieldList, - flattenHitWrapper: createFlattenHitWrapper(), - formatHitProvider, - __LEGACY: { - // For BWC we must temporarily export the class implementation of Field, - // which is only used externally by the Index Pattern UI. - FieldImpl: Field, - }, - }; + this.setupApi = {}; + return this.setupApi; } @@ -76,7 +60,6 @@ export class IndexPatternsService { setFieldFormats(fieldFormats); return { - ...this.setupApi, indexPatterns: new IndexPatterns(uiSettings, savedObjectsClient, http), }; } @@ -85,20 +68,3 @@ export class IndexPatternsService { // nothing to do here yet } } - -// static code - -/** @public */ -export { getFromSavedObject, getRoutes } from './utils'; - -// types - -/** @internal */ -export type IndexPatternsSetup = ReturnType; -export type IndexPatternsStart = ReturnType; - -/** @public */ -export { IndexPattern, IndexPatterns, StaticIndexPattern, Field, FieldType, FieldListInterface }; - -/** @public */ -export { findIndexPatternByTitle } from './utils'; diff --git a/src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts b/src/plugins/data/public/index_patterns/lib/get_title.ts similarity index 96% rename from src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts rename to src/plugins/data/public/index_patterns/lib/get_title.ts index 777a12c7e2884a..320205f5139c98 100644 --- a/src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts +++ b/src/plugins/data/public/index_patterns/lib/get_title.ts @@ -19,7 +19,7 @@ import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; -export async function getIndexPatternTitle( +export async function getTitle( client: SavedObjectsClientContract, indexPatternId: string ): Promise> { diff --git a/src/plugins/data/public/index_patterns/lib/index.ts b/src/plugins/data/public/index_patterns/lib/index.ts index 3b87d91bb9fffb..0f667e846af91d 100644 --- a/src/plugins/data/public/index_patterns/lib/index.ts +++ b/src/plugins/data/public/index_patterns/lib/index.ts @@ -17,6 +17,6 @@ * under the License. */ -export { getIndexPatternTitle } from './get_index_pattern_title'; +export { getTitle } from './get_title'; export * from './types'; export { validateIndexPattern } from './validate_index_pattern'; diff --git a/src/legacy/core_plugins/data/public/index_patterns/services.ts b/src/plugins/data/public/index_patterns/services.ts similarity index 87% rename from src/legacy/core_plugins/data/public/index_patterns/services.ts rename to src/plugins/data/public/index_patterns/services.ts index ecd898b28de636..a6844cb4c04e2f 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/services.ts +++ b/src/plugins/data/public/index_patterns/services.ts @@ -18,8 +18,8 @@ */ import { NotificationsStart } from 'src/core/public'; -import { createGetterSetter } from '../../../../../plugins/kibana_utils/public'; -import { FieldFormatsStart } from '../../../../../plugins/data/public'; +import { createGetterSetter } from '../../../kibana_utils/public'; +import { FieldFormatsStart } from '../field_formats_provider'; export const [getNotifications, setNotifications] = createGetterSetter( 'Notifications' diff --git a/src/plugins/data/public/index_patterns/types.ts b/src/plugins/data/public/index_patterns/types.ts new file mode 100644 index 00000000000000..59e3075bf215d1 --- /dev/null +++ b/src/plugins/data/public/index_patterns/types.ts @@ -0,0 +1,23 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IndexPatternsService } from './index_patterns_service'; + +export type IndexPatternsSetup = ReturnType; +export type IndexPatternsStart = ReturnType; diff --git a/src/legacy/core_plugins/data/public/index_patterns/utils.ts b/src/plugins/data/public/index_patterns/utils.ts similarity index 93% rename from src/legacy/core_plugins/data/public/index_patterns/utils.ts rename to src/plugins/data/public/index_patterns/utils.ts index 0d0d5705a0cccd..8edb62f16bfeb6 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/utils.ts +++ b/src/plugins/data/public/index_patterns/utils.ts @@ -18,8 +18,7 @@ */ import { find, get } from 'lodash'; - -import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; +import { SavedObjectsClientContract, SimpleSavedObject } from 'src/core/public'; /** * Returns an object matching a given title @@ -28,7 +27,7 @@ import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../co * @param title {string} * @returns {Promise} */ -export async function findIndexPatternByTitle( +export async function findByTitle( client: SavedObjectsClientContract, title: string ): Promise | void> { diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index ceb57b4a3a564d..19c21ab9934ef1 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -19,6 +19,7 @@ import { FieldFormatRegisty, Plugin, FieldFormatsStart, FieldFormatsSetup } from '.'; import { searchSetupMock } from './search/mocks'; import { queryServiceMock } from './query/mocks'; +import { indexPatternsServiceMock } from './index_patterns/index_patterns_service.mock'; export type Setup = jest.Mocked>; export type Start = jest.Mocked>; @@ -53,6 +54,7 @@ const createSetupContract = (): Setup => { search: searchSetupMock, fieldFormats: fieldFormatsMock as FieldFormatsSetup, query: querySetupMock, + indexPatterns: indexPatternsServiceMock.createSetupContract(), }; return setupContract; @@ -69,6 +71,7 @@ const createStartContract = (): Start => { ui: { IndexPatternSelect: jest.fn(), }, + indexPatterns: indexPatternsServiceMock.createStartContract(), }; return startContract; }; diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 35d8edc4884671..c018efcad74e65 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -26,8 +26,10 @@ import { SearchService } from './search/search_service'; import { FieldFormatsService } from './field_formats_provider'; import { QueryService } from './query'; import { createIndexPatternSelect } from './ui/index_pattern_select'; +import { IndexPatternsService } from './index_patterns'; export class DataPublicPlugin implements Plugin { + private readonly indexPatterns: IndexPatternsService = new IndexPatternsService(); private readonly autocomplete = new AutocompleteProviderRegister(); private readonly searchService: SearchService; private readonly fieldFormatsService: FieldFormatsService; @@ -54,19 +56,30 @@ export class DataPublicPlugin implements Plugin; }; + indexPatterns: IndexPatternsStart; } export * from './autocomplete_provider/types'; diff --git a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx index f41024ed16191c..ad453c4e5d11d2 100644 --- a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx +++ b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { EuiComboBox } from '@elastic/eui'; import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; -import { getIndexPatternTitle } from '../../index_patterns/lib'; +import { getTitle } from '../../index_patterns/lib'; export interface IndexPatternSelectProps { onChange: (opt: any) => void; @@ -104,7 +104,7 @@ export class IndexPatternSelect extends Component { let indexPatternTitle; try { - indexPatternTitle = await getIndexPatternTitle(this.props.savedObjectsClient, indexPatternId); + indexPatternTitle = await getTitle(this.props.savedObjectsClient, indexPatternId); } catch (err) { // index pattern no longer exists return; diff --git a/src/test_utils/public/stub_index_pattern.js b/src/test_utils/public/stub_index_pattern.js index b41ebe3e618615..b76da4b4eca3ef 100644 --- a/src/test_utils/public/stub_index_pattern.js +++ b/src/test_utils/public/stub_index_pattern.js @@ -21,7 +21,7 @@ import sinon from 'sinon'; // TODO: We should not be importing from the data plugin directly here; this is only necessary // because it is one of the few places that we need to access the IndexPattern class itself, rather // than just the type. Doing this as a temporary measure; it will be left behind when migrating to NP. -import { IndexPattern } from '../../legacy/core_plugins/data/public/index_patterns/index_patterns'; +import { IndexPattern } from '../../legacy/core_plugins/data/public/'; import { FieldList, getRoutes, diff --git a/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts b/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts index b1879ec92c131d..9a13da65e976ae 100644 --- a/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts +++ b/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IndexPattern } from 'src/legacy/core_plugins/data/public/index_patterns/index_patterns'; +import { IndexPattern } from 'src/legacy/core_plugins/data/public/'; import { SerializedNode, UrlTemplate, From ce127d21b319db318611fac33622afaeba0a4aa9 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Sat, 30 Nov 2019 10:39:32 -0500 Subject: [PATCH 05/39] Revert "[NP] Move IndexPatterns into the NP (#51199)" This reverts commit 3a0d5f4bf54f91129e70a82d7aeac6fa6ee2511a. --- .../filter/action/apply_filter_action.ts | 5 +-- src/legacy/core_plugins/data/public/index.ts | 2 +- .../public/index_patterns/fields/field.ts | 17 ++++--- .../index_patterns/fields/field_list.ts | 9 ++-- .../public/index_patterns/fields/index.ts | 0 .../index_patterns/fields/obj_define.js | 0 .../index_patterns/fields/obj_define.test.js | 0 .../data/public/index_patterns/index.ts | 19 +------- .../index_patterns/_fields_fetcher.ts | 0 .../index_patterns/_pattern_cache.ts | 2 +- .../index_patterns/flatten_hit.ts | 0 .../index_patterns/format_hit.ts | 0 .../index_patterns/index_patterns/index.ts | 0 .../index_patterns/index_pattern.test.ts | 17 +++---- .../index_patterns/index_pattern.ts | 28 ++++++++---- .../index_patterns/index_patterns.test.ts | 0 .../index_patterns/index_patterns.ts | 0 .../index_patterns_api_client.test.mock.ts | 2 +- .../index_patterns_api_client.test.ts | 0 .../index_patterns_api_client.ts | 2 +- .../index_patterns_service.mock.ts | 9 ++-- .../index_patterns/index_patterns_service.ts | 44 ++++++++++++++++--- .../data/public/index_patterns/services.ts | 4 +- .../data/public/index_patterns/utils.ts | 5 ++- .../core_plugins/data/public/mocks.ts} | 23 ++++++---- .../components/fetch_index_patterns.ts | 2 +- .../data/public/shim/legacy_module.ts | 2 +- .../public/views/table/table.test.tsx | 2 +- .../kibana/public/dashboard/application.ts | 4 +- .../dashboard/dashboard_app_controller.tsx | 8 ++-- .../create_edit_field/create_edit_field.js | 4 +- .../public/index_patterns/__mocks__/index.ts | 18 ++++---- src/legacy/ui/public/index_patterns/index.ts | 12 +++-- .../common/field_formats/converters/source.ts | 3 +- .../common/field_formats/converters/string.ts | 3 +- src/plugins/data/common/index.ts | 2 +- src/plugins/data/common/utils/index.ts | 20 --------- .../utils/shorten_dotted_string.test.ts | 34 -------------- .../data/public/index_patterns/index.ts | 11 ----- ...et_title.ts => get_index_pattern_title.ts} | 2 +- .../data/public/index_patterns/lib/index.ts | 2 +- .../data/public/index_patterns/types.ts | 23 ---------- src/plugins/data/public/mocks.ts | 3 -- src/plugins/data/public/plugin.ts | 15 +------ src/plugins/data/public/types.ts | 3 -- .../index_pattern_select.tsx | 4 +- src/test_utils/public/stub_index_pattern.js | 2 +- .../services/persistence/deserialize.ts | 2 +- 48 files changed, 158 insertions(+), 211 deletions(-) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/fields/field.ts (94%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/fields/field_list.ts (91%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/fields/index.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/fields/obj_define.js (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/fields/obj_define.test.js (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/_fields_fetcher.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/_pattern_cache.ts (97%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/flatten_hit.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/format_hit.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_pattern.test.ts (95%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_pattern.ts (96%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_patterns.test.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_patterns.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts (92%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts (100%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.ts (97%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns_service.mock.ts (87%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/index_patterns_service.ts (60%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/services.ts (87%) rename src/{plugins => legacy/core_plugins}/data/public/index_patterns/utils.ts (93%) rename src/{plugins/data/common/utils/shorten_dotted_string.ts => legacy/core_plugins/data/public/mocks.ts} (68%) delete mode 100644 src/plugins/data/common/utils/index.ts delete mode 100644 src/plugins/data/common/utils/shorten_dotted_string.test.ts rename src/plugins/data/public/index_patterns/lib/{get_title.ts => get_index_pattern_title.ts} (96%) delete mode 100644 src/plugins/data/public/index_patterns/types.ts diff --git a/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts b/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts index c65ae3a0ec7b93..946b3997a97129 100644 --- a/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts +++ b/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts @@ -32,9 +32,8 @@ import { applyFiltersPopover, changeTimeFilter, extractTimeFilter, - IndexPatternsStart, } from '../../../../../../plugins/data/public'; - +import { IndexPatternsStart } from '../../index_patterns'; export const GLOBAL_APPLY_FILTER_ACTION = 'GLOBAL_APPLY_FILTER_ACTION'; interface ActionContext { @@ -75,7 +74,7 @@ export function createFilterAction( if (selectedFilters.length > 1) { const indexPatterns = await Promise.all( filters.map(filter => { - return indexPatternsService.indexPatterns.get(filter.meta.index!); + return indexPatternsService.indexPatterns.get(filter.meta.index); }) ); diff --git a/src/legacy/core_plugins/data/public/index.ts b/src/legacy/core_plugins/data/public/index.ts index bdfedbc2c81a85..833d8c248f46aa 100644 --- a/src/legacy/core_plugins/data/public/index.ts +++ b/src/legacy/core_plugins/data/public/index.ts @@ -48,4 +48,4 @@ export { /** @public static code */ export * from '../common'; export { FilterStateManager } from './filter/filter_manager'; -export { getFromSavedObject, getRoutes, flattenHitWrapper } from './index_patterns'; +export { getFromSavedObject, getRoutes } from './index_patterns'; diff --git a/src/plugins/data/public/index_patterns/fields/field.ts b/src/legacy/core_plugins/data/public/index_patterns/fields/field.ts similarity index 94% rename from src/plugins/data/public/index_patterns/fields/field.ts rename to src/legacy/core_plugins/data/public/index_patterns/fields/field.ts index ae17188de8625f..91964655f6f3e7 100644 --- a/src/plugins/data/public/index_patterns/fields/field.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/fields/field.ts @@ -20,19 +20,26 @@ import { i18n } from '@kbn/i18n'; // @ts-ignore import { ObjDefine } from './obj_define'; +// @ts-ignore +import { shortenDottedString } from '../../../../../core_plugins/kibana/common/utils/shorten_dotted_string'; import { IndexPattern } from '../index_patterns'; import { getNotifications, getFieldFormats } from '../services'; + import { - IFieldType, + FieldFormat, getKbnFieldType, + IFieldType, IFieldSubType, - FieldFormat, - shortenDottedString, -} from '../../../common'; +} from '../../../../../../plugins/data/public'; export type FieldSpec = Record; -export class Field implements IFieldType { +/** @deprecated + * Please use IFieldType instead + * */ +export type FieldType = IFieldType; + +export class Field implements FieldType { name: string; type: string; script?: string; diff --git a/src/plugins/data/public/index_patterns/fields/field_list.ts b/src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts similarity index 91% rename from src/plugins/data/public/index_patterns/fields/field_list.ts rename to src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts index ff6706cec6c344..108aacc8e07def 100644 --- a/src/plugins/data/public/index_patterns/fields/field_list.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts @@ -19,8 +19,7 @@ import { findIndex } from 'lodash'; import { IndexPattern } from '../index_patterns'; -import { IFieldType } from '../../../common'; -import { Field, FieldSpec } from './field'; +import { Field, FieldType, FieldSpec } from './field'; type FieldMap = Map; @@ -28,7 +27,7 @@ export interface FieldListInterface extends Array { getByName(name: Field['name']): Field | undefined; getByType(type: Field['type']): Field[]; add(field: FieldSpec): void; - remove(field: IFieldType): void; + remove(field: FieldType): void; } export class FieldList extends Array implements FieldListInterface { @@ -43,7 +42,7 @@ export class FieldList extends Array implements FieldListInterface { } this.groups.get(field.type)!.set(field.name, field); }; - private removeByGroup = (field: IFieldType) => this.groups.get(field.type)!.delete(field.name); + private removeByGroup = (field: FieldType) => this.groups.get(field.type)!.delete(field.name); constructor(indexPattern: IndexPattern, specs: FieldSpec[] = [], shortDotsEnable = false) { super(); @@ -62,7 +61,7 @@ export class FieldList extends Array implements FieldListInterface { this.setByGroup(newField); }; - remove = (field: IFieldType) => { + remove = (field: FieldType) => { this.removeByGroup(field); this.byName.delete(field.name); diff --git a/src/plugins/data/public/index_patterns/fields/index.ts b/src/legacy/core_plugins/data/public/index_patterns/fields/index.ts similarity index 100% rename from src/plugins/data/public/index_patterns/fields/index.ts rename to src/legacy/core_plugins/data/public/index_patterns/fields/index.ts diff --git a/src/plugins/data/public/index_patterns/fields/obj_define.js b/src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.js similarity index 100% rename from src/plugins/data/public/index_patterns/fields/obj_define.js rename to src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.js diff --git a/src/plugins/data/public/index_patterns/fields/obj_define.test.js b/src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.test.js similarity index 100% rename from src/plugins/data/public/index_patterns/fields/obj_define.test.js rename to src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.test.js diff --git a/src/legacy/core_plugins/data/public/index_patterns/index.ts b/src/legacy/core_plugins/data/public/index_patterns/index.ts index 74981165f3e474..496c4ba7b5b6f1 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index.ts @@ -17,21 +17,4 @@ * under the License. */ -import { IFieldType, IIndexPattern, indexPatterns } from '../../../../../plugins/data/public'; - -const getFromSavedObject = indexPatterns.getFromSavedObject; -const getRoutes = indexPatterns.getRoutes; -const flattenHitWrapper = indexPatterns.flattenHitWrapper; - -export { getFromSavedObject, getRoutes, flattenHitWrapper }; -export { IFieldType as FieldType }; -export { IIndexPattern as StaticIndexPattern }; -export { - Field, - FieldListInterface, - IndexPattern, - IndexPatterns, - IndexPatternsStart, - IndexPatternsSetup, - IndexPatternsService, -} from '../../../../../plugins/data/public'; +export * from './index_patterns_service'; diff --git a/src/plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts similarity index 97% rename from src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts index eb6c69b4143160..a3653bb529fa38 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts @@ -19,7 +19,7 @@ import { IndexPattern } from './index_pattern'; -interface PatternCache { +export interface PatternCache { get: (id: string) => IndexPattern; set: (id: string, value: IndexPattern) => IndexPattern; clear: (id: string) => void; diff --git a/src/plugins/data/public/index_patterns/index_patterns/flatten_hit.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/flatten_hit.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/flatten_hit.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/flatten_hit.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/format_hit.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/format_hit.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/format_hit.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/format_hit.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/index.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/index.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts similarity index 95% rename from src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts index a0a884454a3f00..ee9f9b493ebf25 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts @@ -20,23 +20,24 @@ import { defaults, pluck, last, get } from 'lodash'; import { IndexPattern } from './index_pattern'; -import { DuplicateField } from '../../../../kibana_utils/public'; +import { DuplicateField } from '../../../../../../plugins/kibana_utils/public'; // @ts-ignore -import mockLogStashFields from '../../../../../fixtures/logstash_fields'; +import mockLogStashFields from '../../../../../../fixtures/logstash_fields'; // @ts-ignore -import { stubbedSavedObjectIndexPattern } from '../../../../../fixtures/stubbed_saved_object_index_pattern'; -import { Field } from '../fields'; + +import { stubbedSavedObjectIndexPattern } from '../../../../../../fixtures/stubbed_saved_object_index_pattern'; +import { Field } from '../index_patterns_service'; import { setNotifications, setFieldFormats } from '../services'; // Temporary disable eslint, will be removed after moving to new platform folder // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { notificationServiceMock } from '../../../../../core/public/notifications/notifications_service.mock'; -import { FieldFormatRegisty } from '../../field_formats_provider'; +import { notificationServiceMock } from '../../../../../../core/public/notifications/notifications_service.mock'; +import { FieldFormatRegisty } from '../../../../../../plugins/data/public'; jest.mock('ui/new_platform'); -jest.mock('../../../../kibana_utils/public', () => { - const originalModule = jest.requireActual('../../../../kibana_utils/public'); +jest.mock('../../../../../../plugins/kibana_utils/public', () => { + const originalModule = jest.requireActual('../../../../../../plugins/kibana_utils/public'); return { ...originalModule, diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts similarity index 96% rename from src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts index 2c93c0aa9dc620..de364b6c217dd7 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -26,13 +26,17 @@ import { expandShorthand, FieldMappingSpec, MappingObject, -} from '../../../../kibana_utils/public'; +} from '../../../../../../plugins/kibana_utils/public'; -import { ES_FIELD_TYPES, KBN_FIELD_TYPES, IIndexPattern, IFieldType } from '../../../common'; - -import { findByTitle, getRoutes } from '../utils'; -import { indexPatterns } from '../'; -import { Field, FieldList, FieldListInterface } from '../fields'; +import { + ES_FIELD_TYPES, + KBN_FIELD_TYPES, + IIndexPattern, + indexPatterns, +} from '../../../../../../plugins/data/public'; + +import { findIndexPatternByTitle, getRoutes } from '../utils'; +import { Field, FieldList, FieldListInterface, FieldType } from '../fields'; import { createFieldsFetcher } from './_fields_fetcher'; import { formatHitProvider } from './format_hit'; import { flattenHitWrapper } from './flatten_hit'; @@ -42,6 +46,11 @@ import { getNotifications, getFieldFormats } from '../services'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; const type = 'index-pattern'; +/** @deprecated + * Please use IIndexPattern instead + * */ +export type StaticIndexPattern = IIndexPattern; + export class IndexPattern implements IIndexPattern { [key: string]: any; @@ -287,7 +296,7 @@ export class IndexPattern implements IIndexPattern { await this.save(); } - removeScriptedField(field: IFieldType) { + removeScriptedField(field: FieldType) { this.fields.remove(field); return this.save(); } @@ -375,7 +384,10 @@ export class IndexPattern implements IIndexPattern { return response.id; }; - const potentialDuplicateByTitle = await findByTitle(this.savedObjectsClient, this.title); + const potentialDuplicateByTitle = await findIndexPatternByTitle( + this.savedObjectsClient, + this.title + ); // If there is potentially duplicate title, just create it if (!potentialDuplicateByTitle) { return await _create(); diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_patterns.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/index_patterns.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts similarity index 92% rename from src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts index 2d3e357e968199..06933dc4090528 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts @@ -17,7 +17,7 @@ * under the License. */ -import { setup } from 'test_utils/http_test_setup'; +import { setup } from '../../../../../../test_utils/public/http_test_setup'; export const { http } = setup(injectedMetadata => { injectedMetadata.getBasePath.mockReturnValue('/hola/daro/'); diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts similarity index 100% rename from src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts similarity index 97% rename from src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts index 961e519338ac4d..87dd7a68e30614 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts @@ -18,7 +18,7 @@ */ import { HttpServiceBase } from 'src/core/public'; -import { indexPatterns } from '../'; +import { indexPatterns } from '../../../../../../plugins/data/public'; const API_BASE_URL: string = `/api/index_patterns/`; diff --git a/src/plugins/data/public/index_patterns/index_patterns_service.mock.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts similarity index 87% rename from src/plugins/data/public/index_patterns/index_patterns_service.mock.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts index d38e9c76430eb7..db1ece78e7b4d1 100644 --- a/src/plugins/data/public/index_patterns/index_patterns_service.mock.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts @@ -17,9 +17,8 @@ * under the License. */ -import { IndexPatternsService } from './index_patterns_service'; +import { IndexPatternsService, IndexPatternsSetup } from '.'; import { flattenHitWrapper } from './index_patterns'; -import { IndexPatternsSetup } from './types'; type IndexPatternsServiceClientContract = PublicMethodsOf; @@ -34,7 +33,11 @@ const createSetupContractMock = () => { flattenHitWrapper: jest.fn().mockImplementation(flattenHitWrapper), formatHitProvider: jest.fn(), indexPatterns: jest.fn() as any, - IndexPatternSelect: jest.fn(), + __LEGACY: { + // For BWC we must temporarily export the class implementation of Field, + // which is only used externally by the Index Pattern UI. + FieldImpl: jest.fn(), + }, }; return setupContract; diff --git a/src/plugins/data/public/index_patterns/index_patterns_service.ts b/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts similarity index 60% rename from src/plugins/data/public/index_patterns/index_patterns_service.ts rename to src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts index 40f833868847b7..83738ffe5b747c 100644 --- a/src/plugins/data/public/index_patterns/index_patterns_service.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts @@ -23,11 +23,19 @@ import { HttpServiceBase, NotificationsStart, } from 'src/core/public'; -import { FieldFormatsStart } from '../field_formats_provider'; +import { FieldFormatsStart } from '../../../../../plugins/data/public'; +import { Field, FieldList, FieldListInterface, FieldType } from './fields'; import { setNotifications, setFieldFormats } from './services'; -import { IndexPatterns } from './index_patterns'; -interface IndexPatternDependencies { +import { + createFlattenHitWrapper, + formatHitProvider, + IndexPattern, + IndexPatterns, + StaticIndexPattern, +} from './index_patterns'; + +export interface IndexPatternDependencies { uiSettings: IUiSettingsClient; savedObjectsClient: SavedObjectsClientContract; http: HttpServiceBase; @@ -44,8 +52,16 @@ export class IndexPatternsService { private setupApi: any; public setup() { - this.setupApi = {}; - + this.setupApi = { + FieldList, + flattenHitWrapper: createFlattenHitWrapper(), + formatHitProvider, + __LEGACY: { + // For BWC we must temporarily export the class implementation of Field, + // which is only used externally by the Index Pattern UI. + FieldImpl: Field, + }, + }; return this.setupApi; } @@ -60,6 +76,7 @@ export class IndexPatternsService { setFieldFormats(fieldFormats); return { + ...this.setupApi, indexPatterns: new IndexPatterns(uiSettings, savedObjectsClient, http), }; } @@ -68,3 +85,20 @@ export class IndexPatternsService { // nothing to do here yet } } + +// static code + +/** @public */ +export { getFromSavedObject, getRoutes } from './utils'; + +// types + +/** @internal */ +export type IndexPatternsSetup = ReturnType; +export type IndexPatternsStart = ReturnType; + +/** @public */ +export { IndexPattern, IndexPatterns, StaticIndexPattern, Field, FieldType, FieldListInterface }; + +/** @public */ +export { findIndexPatternByTitle } from './utils'; diff --git a/src/plugins/data/public/index_patterns/services.ts b/src/legacy/core_plugins/data/public/index_patterns/services.ts similarity index 87% rename from src/plugins/data/public/index_patterns/services.ts rename to src/legacy/core_plugins/data/public/index_patterns/services.ts index a6844cb4c04e2f..ecd898b28de636 100644 --- a/src/plugins/data/public/index_patterns/services.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/services.ts @@ -18,8 +18,8 @@ */ import { NotificationsStart } from 'src/core/public'; -import { createGetterSetter } from '../../../kibana_utils/public'; -import { FieldFormatsStart } from '../field_formats_provider'; +import { createGetterSetter } from '../../../../../plugins/kibana_utils/public'; +import { FieldFormatsStart } from '../../../../../plugins/data/public'; export const [getNotifications, setNotifications] = createGetterSetter( 'Notifications' diff --git a/src/plugins/data/public/index_patterns/utils.ts b/src/legacy/core_plugins/data/public/index_patterns/utils.ts similarity index 93% rename from src/plugins/data/public/index_patterns/utils.ts rename to src/legacy/core_plugins/data/public/index_patterns/utils.ts index 8edb62f16bfeb6..0d0d5705a0cccd 100644 --- a/src/plugins/data/public/index_patterns/utils.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/utils.ts @@ -18,7 +18,8 @@ */ import { find, get } from 'lodash'; -import { SavedObjectsClientContract, SimpleSavedObject } from 'src/core/public'; + +import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; /** * Returns an object matching a given title @@ -27,7 +28,7 @@ import { SavedObjectsClientContract, SimpleSavedObject } from 'src/core/public'; * @param title {string} * @returns {Promise} */ -export async function findByTitle( +export async function findIndexPatternByTitle( client: SavedObjectsClientContract, title: string ): Promise | void> { diff --git a/src/plugins/data/common/utils/shorten_dotted_string.ts b/src/legacy/core_plugins/data/public/mocks.ts similarity index 68% rename from src/plugins/data/common/utils/shorten_dotted_string.ts rename to src/legacy/core_plugins/data/public/mocks.ts index 379413c0d91c8f..39d1296ddf8bc4 100644 --- a/src/plugins/data/common/utils/shorten_dotted_string.ts +++ b/src/legacy/core_plugins/data/public/mocks.ts @@ -17,14 +17,19 @@ * under the License. */ -const DOT_PREFIX_RE = /(.).+?\./g; +import { indexPatternsServiceMock } from './index_patterns/index_patterns_service.mock'; -/** - * Convert a dot.notated.string into a short - * version (d.n.string) - * - * @return {any} - */ -export function shortenDottedString(input: any) { - return typeof input !== 'string' ? input : input.replace(DOT_PREFIX_RE, '$1.'); +function createDataSetupMock() { + return { + indexPatterns: indexPatternsServiceMock.createSetupContract(), + }; } + +function createDataStartMock() { + return {}; +} + +export const dataPluginMock = { + createSetup: createDataSetupMock, + createStart: createDataStartMock, +}; diff --git a/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts b/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts index 7a4c9f139c8873..3dcab22605c07e 100644 --- a/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts +++ b/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts @@ -18,7 +18,7 @@ */ import { isEmpty } from 'lodash'; import { IUiSettingsClient, SavedObjectsClientContract } from 'src/core/public'; -import { getFromSavedObject } from '../../../'; +import { getFromSavedObject } from '../../../index_patterns'; export async function fetchIndexPatterns( savedObjectsClient: SavedObjectsClientContract, diff --git a/src/legacy/core_plugins/data/public/shim/legacy_module.ts b/src/legacy/core_plugins/data/public/shim/legacy_module.ts index 0e12790d89fed7..06c5caa04ba9ac 100644 --- a/src/legacy/core_plugins/data/public/shim/legacy_module.ts +++ b/src/legacy/core_plugins/data/public/shim/legacy_module.ts @@ -21,7 +21,7 @@ import { once } from 'lodash'; // @ts-ignore import { uiModules } from 'ui/modules'; -import { IndexPatterns } from '../'; +import { IndexPatterns } from '../index_patterns/index_patterns'; /** @internal */ export const initLegacyModule = once((indexPatterns: IndexPatterns): void => { diff --git a/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx b/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx index bad006aa8c7d5a..e341b7c4a5a866 100644 --- a/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx +++ b/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx @@ -21,7 +21,7 @@ import { mount } from 'enzyme'; import { IndexPattern } from 'ui/index_patterns'; // @ts-ignore import { findTestSubject } from '@elastic/eui/lib/test'; -import { flattenHitWrapper } from '../../../../data/public/'; +import { flattenHitWrapper } from '../../../../data/public/index_patterns/index_patterns/flatten_hit'; import { DocViewTable } from './table'; // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/dashboard/application.ts b/src/legacy/core_plugins/kibana/public/dashboard/application.ts index 42ecc0fea5f073..797583362a8f88 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/application.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/application.ts @@ -47,7 +47,7 @@ import { // @ts-ignore import { initDashboardApp } from './legacy_app'; -import { DataStart, IndexPatterns } from '../../../data/public'; +import { DataStart } from '../../../data/public'; import { IEmbeddableStart } from '../../../../../plugins/embeddable/public'; import { NavigationStart } from '../../../navigation/public'; import { DataPublicPluginStart as NpDataStart } from '../../../../../plugins/data/public'; @@ -55,7 +55,7 @@ import { SharePluginStart } from '../../../../../plugins/share/public'; export interface RenderDeps { core: LegacyCoreStart; - indexPatterns: IndexPatterns; + indexPatterns: DataStart['indexPatterns']['indexPatterns']; dataStart: DataStart; npDataStart: NpDataStart; navigation: NavigationStart; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx index 7972c7603d3111..dcd25033e9d151 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx +++ b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx @@ -39,7 +39,7 @@ import { unhashUrl, } from './legacy_imports'; import { FilterStateManager, IndexPattern } from '../../../data/public'; -import { Query, SavedQuery, IndexPatterns } from '../../../../../plugins/data/public'; +import { Query, SavedQuery } from '../../../../../plugins/data/public'; import './dashboard_empty_screen_directive'; @@ -78,7 +78,9 @@ export interface DashboardAppControllerDependencies extends RenderDeps { $routeParams: any; getAppState: any; globalState: State; - indexPatterns: IndexPatterns; + indexPatterns: { + getDefault: () => Promise; + }; dashboardConfig: any; kbnUrl: KbnUrl; AppStateClass: TAppStateClass; @@ -169,7 +171,7 @@ export class DashboardAppController { } else { indexPatterns.getDefault().then(defaultIndexPattern => { $scope.$evalAsync(() => { - $scope.indexPatterns = [defaultIndexPattern as IndexPattern]; + $scope.indexPatterns = [defaultIndexPattern]; }); }); } diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js index 5f0994abc11e48..c9ea1e12c58fdc 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js @@ -17,7 +17,9 @@ * under the License. */ -import { Field } from '../../../../../../../../../plugins/data/public'; +import { setup as data } from '../../../../../../../data/public/legacy'; +const { FieldImpl: Field } = data.indexPatterns.__LEGACY; + import { RegistryFieldFormatEditorsProvider } from 'ui/registry/field_format_editors'; import { docTitle } from 'ui/doc_title'; import { KbnUrlProvider } from 'ui/url'; diff --git a/src/legacy/ui/public/index_patterns/__mocks__/index.ts b/src/legacy/ui/public/index_patterns/__mocks__/index.ts index 6f3d39299f9707..9ff09835e48da2 100644 --- a/src/legacy/ui/public/index_patterns/__mocks__/index.ts +++ b/src/legacy/ui/public/index_patterns/__mocks__/index.ts @@ -17,18 +17,18 @@ * under the License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { dataPluginMock } from '../../../../../plugins/data/public/mocks'; -import { indexPatterns as npIndexPatterns } from '../../../../../plugins/data/public'; +import { dataPluginMock } from '../../../../core_plugins/data/public/mocks'; -const dataSetup = dataPluginMock.createSetupContract(); +const dataSetup = dataPluginMock.createSetup(); // mocks for stateful code -export const { indexPatterns } = dataSetup.indexPatterns!; - -export const flattenHitWrapper = npIndexPatterns.flattenHitWrapper; -export const formatHitProvider = npIndexPatterns.formatHitProvider; +export const { FieldImpl } = dataSetup.indexPatterns!.__LEGACY; +export const { + FieldList, + flattenHitWrapper, + formatHitProvider, + indexPatterns, +} = dataSetup.indexPatterns!; // static code export { getFromSavedObject, getRoutes } from '../../../../core_plugins/data/public'; -export { FieldList } from '../../../../../plugins/data/public'; diff --git a/src/legacy/ui/public/index_patterns/index.ts b/src/legacy/ui/public/index_patterns/index.ts index 200276c1727fcf..06001667c9e53a 100644 --- a/src/legacy/ui/public/index_patterns/index.ts +++ b/src/legacy/ui/public/index_patterns/index.ts @@ -24,6 +24,14 @@ * from ui/index_patterns for backwards compatibility. */ +import { start as data } from '../../../core_plugins/data/public/legacy'; + +export const { + FieldList, // only used in Discover and StubIndexPattern + flattenHitWrapper, + formatHitProvider, +} = data.indexPatterns; + import { indexPatterns } from '../../../../plugins/data/public'; // static code @@ -34,8 +42,6 @@ export const INDEX_PATTERN_ILLEGAL_CHARACTERS_VISIBLE = indexPatterns.ILLEGAL_CH export const ILLEGAL_CHARACTERS = indexPatterns.ILLEGAL_CHARACTERS_KEY; export const CONTAINS_SPACES = indexPatterns.CONTAINS_SPACES_KEY; export const validateIndexPattern = indexPatterns.validate; -export const flattenHitWrapper = indexPatterns.flattenHitWrapper; -export const formatHitProvider = indexPatterns.formatHitProvider; // types export { @@ -46,5 +52,3 @@ export { IndexPatterns, StaticIndexPattern, } from '../../../core_plugins/data/public'; - -export { FieldList } from '../../../../plugins/data/public'; diff --git a/src/plugins/data/common/field_formats/converters/source.ts b/src/plugins/data/common/field_formats/converters/source.ts index c9906fb1360524..54977c7e669761 100644 --- a/src/plugins/data/common/field_formats/converters/source.ts +++ b/src/plugins/data/common/field_formats/converters/source.ts @@ -20,7 +20,8 @@ import { template, escape, keys } from 'lodash'; // @ts-ignore import { noWhiteSpace } from '../../../../../legacy/core_plugins/kibana/common/utils/no_white_space'; -import { shortenDottedString } from '../../utils'; +// @ts-ignore +import { shortenDottedString } from '../../../../../legacy/core_plugins/kibana/common/utils/shorten_dotted_string'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, HtmlContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; diff --git a/src/plugins/data/common/field_formats/converters/string.ts b/src/plugins/data/common/field_formats/converters/string.ts index b2d92cf475a161..0edd219ca60f94 100644 --- a/src/plugins/data/common/field_formats/converters/string.ts +++ b/src/plugins/data/common/field_formats/converters/string.ts @@ -22,7 +22,8 @@ import { asPrettyString } from '../index'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; -import { shortenDottedString } from '../../utils'; +// @ts-ignore +import { shortenDottedString } from '../../../../../legacy/core_plugins/kibana/common/utils/shorten_dotted_string'; const TRANSFORM_OPTIONS = [ { diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index b334342a57ec6b..f9bbeb5f4b3f39 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -22,5 +22,5 @@ export * from './field_formats'; export * from './kbn_field_types'; export * from './index_patterns'; export * from './es_query'; -export * from './utils'; + export * from './types'; diff --git a/src/plugins/data/common/utils/index.ts b/src/plugins/data/common/utils/index.ts deleted file mode 100644 index 7196c96989e97d..00000000000000 --- a/src/plugins/data/common/utils/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export { shortenDottedString } from './shorten_dotted_string'; diff --git a/src/plugins/data/common/utils/shorten_dotted_string.test.ts b/src/plugins/data/common/utils/shorten_dotted_string.test.ts deleted file mode 100644 index 5f8d084ce5e88c..00000000000000 --- a/src/plugins/data/common/utils/shorten_dotted_string.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { shortenDottedString } from './shorten_dotted_string'; - -describe('shortenDottedString', () => { - test('should convert a dot.notated.string into a short string', () => { - expect(shortenDottedString('dot.notated.string')).toBe('d.n.string'); - }); - - test('should ignore non-string values', () => { - const obj = { key: 'val' }; - - expect(shortenDottedString(true)).toBe(true); - expect(shortenDottedString(123)).toBe(123); - expect(shortenDottedString(obj)).toBe(obj); - }); -}); diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index 7492f9372e44a6..aedfc18db3ade3 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -25,8 +25,6 @@ import { ILLEGAL_CHARACTERS, validateIndexPattern, } from './lib'; -import { getRoutes, getFromSavedObject } from './utils'; -import { flattenHitWrapper, formatHitProvider } from './index_patterns'; export const indexPatterns = { ILLEGAL_CHARACTERS_KEY, @@ -35,13 +33,4 @@ export const indexPatterns = { ILLEGAL_CHARACTERS, IndexPatternMissingIndices, validate: validateIndexPattern, - getRoutes, - getFromSavedObject, - flattenHitWrapper, - formatHitProvider, }; - -export { IndexPatternsService } from './index_patterns_service'; -export { Field, FieldList, FieldListInterface } from './fields'; -export { IndexPattern, IndexPatterns } from './index_patterns'; -export { IndexPatternsStart, IndexPatternsSetup } from './types'; diff --git a/src/plugins/data/public/index_patterns/lib/get_title.ts b/src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts similarity index 96% rename from src/plugins/data/public/index_patterns/lib/get_title.ts rename to src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts index 320205f5139c98..777a12c7e2884a 100644 --- a/src/plugins/data/public/index_patterns/lib/get_title.ts +++ b/src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts @@ -19,7 +19,7 @@ import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; -export async function getTitle( +export async function getIndexPatternTitle( client: SavedObjectsClientContract, indexPatternId: string ): Promise> { diff --git a/src/plugins/data/public/index_patterns/lib/index.ts b/src/plugins/data/public/index_patterns/lib/index.ts index 0f667e846af91d..3b87d91bb9fffb 100644 --- a/src/plugins/data/public/index_patterns/lib/index.ts +++ b/src/plugins/data/public/index_patterns/lib/index.ts @@ -17,6 +17,6 @@ * under the License. */ -export { getTitle } from './get_title'; +export { getIndexPatternTitle } from './get_index_pattern_title'; export * from './types'; export { validateIndexPattern } from './validate_index_pattern'; diff --git a/src/plugins/data/public/index_patterns/types.ts b/src/plugins/data/public/index_patterns/types.ts deleted file mode 100644 index 59e3075bf215d1..00000000000000 --- a/src/plugins/data/public/index_patterns/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IndexPatternsService } from './index_patterns_service'; - -export type IndexPatternsSetup = ReturnType; -export type IndexPatternsStart = ReturnType; diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 19c21ab9934ef1..ceb57b4a3a564d 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -19,7 +19,6 @@ import { FieldFormatRegisty, Plugin, FieldFormatsStart, FieldFormatsSetup } from '.'; import { searchSetupMock } from './search/mocks'; import { queryServiceMock } from './query/mocks'; -import { indexPatternsServiceMock } from './index_patterns/index_patterns_service.mock'; export type Setup = jest.Mocked>; export type Start = jest.Mocked>; @@ -54,7 +53,6 @@ const createSetupContract = (): Setup => { search: searchSetupMock, fieldFormats: fieldFormatsMock as FieldFormatsSetup, query: querySetupMock, - indexPatterns: indexPatternsServiceMock.createSetupContract(), }; return setupContract; @@ -71,7 +69,6 @@ const createStartContract = (): Start => { ui: { IndexPatternSelect: jest.fn(), }, - indexPatterns: indexPatternsServiceMock.createStartContract(), }; return startContract; }; diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index c018efcad74e65..35d8edc4884671 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -26,10 +26,8 @@ import { SearchService } from './search/search_service'; import { FieldFormatsService } from './field_formats_provider'; import { QueryService } from './query'; import { createIndexPatternSelect } from './ui/index_pattern_select'; -import { IndexPatternsService } from './index_patterns'; export class DataPublicPlugin implements Plugin { - private readonly indexPatterns: IndexPatternsService = new IndexPatternsService(); private readonly autocomplete = new AutocompleteProviderRegister(); private readonly searchService: SearchService; private readonly fieldFormatsService: FieldFormatsService; @@ -56,30 +54,19 @@ export class DataPublicPlugin implements Plugin; }; - indexPatterns: IndexPatternsStart; } export * from './autocomplete_provider/types'; diff --git a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx index ad453c4e5d11d2..f41024ed16191c 100644 --- a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx +++ b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { EuiComboBox } from '@elastic/eui'; import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; -import { getTitle } from '../../index_patterns/lib'; +import { getIndexPatternTitle } from '../../index_patterns/lib'; export interface IndexPatternSelectProps { onChange: (opt: any) => void; @@ -104,7 +104,7 @@ export class IndexPatternSelect extends Component { let indexPatternTitle; try { - indexPatternTitle = await getTitle(this.props.savedObjectsClient, indexPatternId); + indexPatternTitle = await getIndexPatternTitle(this.props.savedObjectsClient, indexPatternId); } catch (err) { // index pattern no longer exists return; diff --git a/src/test_utils/public/stub_index_pattern.js b/src/test_utils/public/stub_index_pattern.js index b76da4b4eca3ef..b41ebe3e618615 100644 --- a/src/test_utils/public/stub_index_pattern.js +++ b/src/test_utils/public/stub_index_pattern.js @@ -21,7 +21,7 @@ import sinon from 'sinon'; // TODO: We should not be importing from the data plugin directly here; this is only necessary // because it is one of the few places that we need to access the IndexPattern class itself, rather // than just the type. Doing this as a temporary measure; it will be left behind when migrating to NP. -import { IndexPattern } from '../../legacy/core_plugins/data/public/'; +import { IndexPattern } from '../../legacy/core_plugins/data/public/index_patterns/index_patterns'; import { FieldList, getRoutes, diff --git a/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts b/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts index 9a13da65e976ae..b1879ec92c131d 100644 --- a/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts +++ b/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IndexPattern } from 'src/legacy/core_plugins/data/public/'; +import { IndexPattern } from 'src/legacy/core_plugins/data/public/index_patterns/index_patterns'; import { SerializedNode, UrlTemplate, From 19c6b89ec2cef54ad8f9833209faf5dcb73d92e8 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Sun, 1 Dec 2019 15:36:59 +0200 Subject: [PATCH 06/39] Newplatform/move index patterns to new plugins 2 (#51940) Re-merging a fixed merge PR by @Avinar-24 --- .../filter/action/apply_filter_action.ts | 5 ++- src/legacy/core_plugins/data/public/index.ts | 2 +- .../data/public/index_patterns/index.ts | 19 +++++++- .../components/fetch_index_patterns.ts | 2 +- .../data/public/shim/legacy_module.ts | 2 +- .../public/views/table/table.test.tsx | 2 +- .../kibana/public/dashboard/application.ts | 4 +- .../dashboard/dashboard_app_controller.tsx | 8 ++-- .../public/discover/get_inner_angular.ts | 2 +- .../create_edit_field/create_edit_field.js | 4 +- .../public/index_patterns/__mocks__/index.ts | 18 ++++---- src/legacy/ui/public/index_patterns/index.ts | 12 ++--- .../common/field_formats/converters/source.ts | 3 +- .../common/field_formats/converters/string.ts | 3 +- src/plugins/data/common/index.ts | 2 +- src/plugins/data/common/utils/index.ts | 20 +++++++++ .../utils/shorten_dotted_string.test.ts | 34 ++++++++++++++ .../common/utils/shorten_dotted_string.ts} | 23 ++++------ .../public/index_patterns/fields/field.ts | 17 +++---- .../index_patterns/fields/field_list.ts | 9 ++-- .../public/index_patterns/fields/index.ts | 0 .../index_patterns/fields/obj_define.js | 0 .../index_patterns/fields/obj_define.test.js | 0 .../data/public/index_patterns/index.ts | 11 +++++ .../index_patterns/_fields_fetcher.ts | 0 .../index_patterns/_pattern_cache.ts | 2 +- .../index_patterns/flatten_hit.ts | 0 .../index_patterns/format_hit.ts | 0 .../index_patterns/index_patterns/index.ts | 0 .../index_patterns/index_pattern.test.ts | 17 ++++--- .../index_patterns/index_pattern.ts | 28 ++++-------- .../index_patterns/index_patterns.test.ts | 0 .../index_patterns/index_patterns.ts | 0 .../index_patterns_api_client.test.mock.ts | 2 +- .../index_patterns_api_client.test.ts | 0 .../index_patterns_api_client.ts | 2 +- .../index_patterns_service.mock.ts | 9 ++-- .../index_patterns/index_patterns_service.ts | 44 +++---------------- ...et_index_pattern_title.ts => get_title.ts} | 2 +- .../data/public/index_patterns/lib/index.ts | 2 +- .../data/public/index_patterns/services.ts | 4 +- .../data/public/index_patterns/types.ts | 23 ++++++++++ .../data/public/index_patterns/utils.ts | 5 +-- src/plugins/data/public/mocks.ts | 3 ++ src/plugins/data/public/plugin.ts | 15 ++++++- src/plugins/data/public/types.ts | 3 ++ .../index_pattern_select.tsx | 4 +- src/test_utils/public/stub_index_pattern.js | 2 +- .../services/persistence/deserialize.ts | 2 +- 49 files changed, 212 insertions(+), 159 deletions(-) create mode 100644 src/plugins/data/common/utils/index.ts create mode 100644 src/plugins/data/common/utils/shorten_dotted_string.test.ts rename src/{legacy/core_plugins/data/public/mocks.ts => plugins/data/common/utils/shorten_dotted_string.ts} (68%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/field.ts (94%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/field_list.ts (91%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/index.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/obj_define.js (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/fields/obj_define.test.js (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/_fields_fetcher.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/_pattern_cache.ts (97%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/flatten_hit.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/format_hit.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_pattern.test.ts (95%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_pattern.ts (96%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns.test.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts (92%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts (100%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns/index_patterns_api_client.ts (97%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns_service.mock.ts (87%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/index_patterns_service.ts (60%) rename src/plugins/data/public/index_patterns/lib/{get_index_pattern_title.ts => get_title.ts} (96%) rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/services.ts (87%) create mode 100644 src/plugins/data/public/index_patterns/types.ts rename src/{legacy/core_plugins => plugins}/data/public/index_patterns/utils.ts (93%) diff --git a/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts b/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts index 946b3997a97129..c65ae3a0ec7b93 100644 --- a/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts +++ b/src/legacy/core_plugins/data/public/filter/action/apply_filter_action.ts @@ -32,8 +32,9 @@ import { applyFiltersPopover, changeTimeFilter, extractTimeFilter, + IndexPatternsStart, } from '../../../../../../plugins/data/public'; -import { IndexPatternsStart } from '../../index_patterns'; + export const GLOBAL_APPLY_FILTER_ACTION = 'GLOBAL_APPLY_FILTER_ACTION'; interface ActionContext { @@ -74,7 +75,7 @@ export function createFilterAction( if (selectedFilters.length > 1) { const indexPatterns = await Promise.all( filters.map(filter => { - return indexPatternsService.indexPatterns.get(filter.meta.index); + return indexPatternsService.indexPatterns.get(filter.meta.index!); }) ); diff --git a/src/legacy/core_plugins/data/public/index.ts b/src/legacy/core_plugins/data/public/index.ts index 833d8c248f46aa..bdfedbc2c81a85 100644 --- a/src/legacy/core_plugins/data/public/index.ts +++ b/src/legacy/core_plugins/data/public/index.ts @@ -48,4 +48,4 @@ export { /** @public static code */ export * from '../common'; export { FilterStateManager } from './filter/filter_manager'; -export { getFromSavedObject, getRoutes } from './index_patterns'; +export { getFromSavedObject, getRoutes, flattenHitWrapper } from './index_patterns'; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index.ts b/src/legacy/core_plugins/data/public/index_patterns/index.ts index 496c4ba7b5b6f1..74981165f3e474 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index.ts +++ b/src/legacy/core_plugins/data/public/index_patterns/index.ts @@ -17,4 +17,21 @@ * under the License. */ -export * from './index_patterns_service'; +import { IFieldType, IIndexPattern, indexPatterns } from '../../../../../plugins/data/public'; + +const getFromSavedObject = indexPatterns.getFromSavedObject; +const getRoutes = indexPatterns.getRoutes; +const flattenHitWrapper = indexPatterns.flattenHitWrapper; + +export { getFromSavedObject, getRoutes, flattenHitWrapper }; +export { IFieldType as FieldType }; +export { IIndexPattern as StaticIndexPattern }; +export { + Field, + FieldListInterface, + IndexPattern, + IndexPatterns, + IndexPatternsStart, + IndexPatternsSetup, + IndexPatternsService, +} from '../../../../../plugins/data/public'; diff --git a/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts b/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts index 3dcab22605c07e..7a4c9f139c8873 100644 --- a/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts +++ b/src/legacy/core_plugins/data/public/query/query_bar/components/fetch_index_patterns.ts @@ -18,7 +18,7 @@ */ import { isEmpty } from 'lodash'; import { IUiSettingsClient, SavedObjectsClientContract } from 'src/core/public'; -import { getFromSavedObject } from '../../../index_patterns'; +import { getFromSavedObject } from '../../../'; export async function fetchIndexPatterns( savedObjectsClient: SavedObjectsClientContract, diff --git a/src/legacy/core_plugins/data/public/shim/legacy_module.ts b/src/legacy/core_plugins/data/public/shim/legacy_module.ts index 06c5caa04ba9ac..0e12790d89fed7 100644 --- a/src/legacy/core_plugins/data/public/shim/legacy_module.ts +++ b/src/legacy/core_plugins/data/public/shim/legacy_module.ts @@ -21,7 +21,7 @@ import { once } from 'lodash'; // @ts-ignore import { uiModules } from 'ui/modules'; -import { IndexPatterns } from '../index_patterns/index_patterns'; +import { IndexPatterns } from '../'; /** @internal */ export const initLegacyModule = once((indexPatterns: IndexPatterns): void => { diff --git a/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx b/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx index e341b7c4a5a866..bad006aa8c7d5a 100644 --- a/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx +++ b/src/legacy/core_plugins/kbn_doc_views/public/views/table/table.test.tsx @@ -21,7 +21,7 @@ import { mount } from 'enzyme'; import { IndexPattern } from 'ui/index_patterns'; // @ts-ignore import { findTestSubject } from '@elastic/eui/lib/test'; -import { flattenHitWrapper } from '../../../../data/public/index_patterns/index_patterns/flatten_hit'; +import { flattenHitWrapper } from '../../../../data/public/'; import { DocViewTable } from './table'; // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/dashboard/application.ts b/src/legacy/core_plugins/kibana/public/dashboard/application.ts index 797583362a8f88..42ecc0fea5f073 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/application.ts +++ b/src/legacy/core_plugins/kibana/public/dashboard/application.ts @@ -47,7 +47,7 @@ import { // @ts-ignore import { initDashboardApp } from './legacy_app'; -import { DataStart } from '../../../data/public'; +import { DataStart, IndexPatterns } from '../../../data/public'; import { IEmbeddableStart } from '../../../../../plugins/embeddable/public'; import { NavigationStart } from '../../../navigation/public'; import { DataPublicPluginStart as NpDataStart } from '../../../../../plugins/data/public'; @@ -55,7 +55,7 @@ import { SharePluginStart } from '../../../../../plugins/share/public'; export interface RenderDeps { core: LegacyCoreStart; - indexPatterns: DataStart['indexPatterns']['indexPatterns']; + indexPatterns: IndexPatterns; dataStart: DataStart; npDataStart: NpDataStart; navigation: NavigationStart; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx index dcd25033e9d151..7972c7603d3111 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx +++ b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app_controller.tsx @@ -39,7 +39,7 @@ import { unhashUrl, } from './legacy_imports'; import { FilterStateManager, IndexPattern } from '../../../data/public'; -import { Query, SavedQuery } from '../../../../../plugins/data/public'; +import { Query, SavedQuery, IndexPatterns } from '../../../../../plugins/data/public'; import './dashboard_empty_screen_directive'; @@ -78,9 +78,7 @@ export interface DashboardAppControllerDependencies extends RenderDeps { $routeParams: any; getAppState: any; globalState: State; - indexPatterns: { - getDefault: () => Promise; - }; + indexPatterns: IndexPatterns; dashboardConfig: any; kbnUrl: KbnUrl; AppStateClass: TAppStateClass; @@ -171,7 +169,7 @@ export class DashboardAppController { } else { indexPatterns.getDefault().then(defaultIndexPattern => { $scope.$evalAsync(() => { - $scope.indexPatterns = [defaultIndexPattern]; + $scope.indexPatterns = [defaultIndexPattern as IndexPattern]; }); }); } diff --git a/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts b/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts index 3c1d41657a1d39..8e2d15ae48a1fd 100644 --- a/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts +++ b/src/legacy/core_plugins/kibana/public/discover/get_inner_angular.ts @@ -64,7 +64,7 @@ import { KbnUrlProvider, RedirectWhenMissingProvider } from 'ui/url'; // @ts-ignore import { createTopNavDirective, createTopNavHelper } from 'ui/kbn_top_nav/kbn_top_nav'; import { configureAppAngularModule } from 'ui/legacy_compat'; -import { IndexPatterns } from '../../../data/public/index_patterns/index_patterns'; +import { IndexPatterns } from '../../../../../plugins/data/public'; import { Storage } from '../../../../../plugins/kibana_utils/public'; import { NavigationStart } from '../../../navigation/public'; import { createDocTableDirective } from './angular/doc_table/doc_table'; diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js index c9ea1e12c58fdc..5f0994abc11e48 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/create_edit_field/create_edit_field.js @@ -17,9 +17,7 @@ * under the License. */ -import { setup as data } from '../../../../../../../data/public/legacy'; -const { FieldImpl: Field } = data.indexPatterns.__LEGACY; - +import { Field } from '../../../../../../../../../plugins/data/public'; import { RegistryFieldFormatEditorsProvider } from 'ui/registry/field_format_editors'; import { docTitle } from 'ui/doc_title'; import { KbnUrlProvider } from 'ui/url'; diff --git a/src/legacy/ui/public/index_patterns/__mocks__/index.ts b/src/legacy/ui/public/index_patterns/__mocks__/index.ts index 9ff09835e48da2..6f3d39299f9707 100644 --- a/src/legacy/ui/public/index_patterns/__mocks__/index.ts +++ b/src/legacy/ui/public/index_patterns/__mocks__/index.ts @@ -17,18 +17,18 @@ * under the License. */ -import { dataPluginMock } from '../../../../core_plugins/data/public/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { dataPluginMock } from '../../../../../plugins/data/public/mocks'; +import { indexPatterns as npIndexPatterns } from '../../../../../plugins/data/public'; -const dataSetup = dataPluginMock.createSetup(); +const dataSetup = dataPluginMock.createSetupContract(); // mocks for stateful code -export const { FieldImpl } = dataSetup.indexPatterns!.__LEGACY; -export const { - FieldList, - flattenHitWrapper, - formatHitProvider, - indexPatterns, -} = dataSetup.indexPatterns!; +export const { indexPatterns } = dataSetup.indexPatterns!; + +export const flattenHitWrapper = npIndexPatterns.flattenHitWrapper; +export const formatHitProvider = npIndexPatterns.formatHitProvider; // static code export { getFromSavedObject, getRoutes } from '../../../../core_plugins/data/public'; +export { FieldList } from '../../../../../plugins/data/public'; diff --git a/src/legacy/ui/public/index_patterns/index.ts b/src/legacy/ui/public/index_patterns/index.ts index 06001667c9e53a..200276c1727fcf 100644 --- a/src/legacy/ui/public/index_patterns/index.ts +++ b/src/legacy/ui/public/index_patterns/index.ts @@ -24,14 +24,6 @@ * from ui/index_patterns for backwards compatibility. */ -import { start as data } from '../../../core_plugins/data/public/legacy'; - -export const { - FieldList, // only used in Discover and StubIndexPattern - flattenHitWrapper, - formatHitProvider, -} = data.indexPatterns; - import { indexPatterns } from '../../../../plugins/data/public'; // static code @@ -42,6 +34,8 @@ export const INDEX_PATTERN_ILLEGAL_CHARACTERS_VISIBLE = indexPatterns.ILLEGAL_CH export const ILLEGAL_CHARACTERS = indexPatterns.ILLEGAL_CHARACTERS_KEY; export const CONTAINS_SPACES = indexPatterns.CONTAINS_SPACES_KEY; export const validateIndexPattern = indexPatterns.validate; +export const flattenHitWrapper = indexPatterns.flattenHitWrapper; +export const formatHitProvider = indexPatterns.formatHitProvider; // types export { @@ -52,3 +46,5 @@ export { IndexPatterns, StaticIndexPattern, } from '../../../core_plugins/data/public'; + +export { FieldList } from '../../../../plugins/data/public'; diff --git a/src/plugins/data/common/field_formats/converters/source.ts b/src/plugins/data/common/field_formats/converters/source.ts index 54977c7e669761..c9906fb1360524 100644 --- a/src/plugins/data/common/field_formats/converters/source.ts +++ b/src/plugins/data/common/field_formats/converters/source.ts @@ -20,8 +20,7 @@ import { template, escape, keys } from 'lodash'; // @ts-ignore import { noWhiteSpace } from '../../../../../legacy/core_plugins/kibana/common/utils/no_white_space'; -// @ts-ignore -import { shortenDottedString } from '../../../../../legacy/core_plugins/kibana/common/utils/shorten_dotted_string'; +import { shortenDottedString } from '../../utils'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, HtmlContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; diff --git a/src/plugins/data/common/field_formats/converters/string.ts b/src/plugins/data/common/field_formats/converters/string.ts index 0edd219ca60f94..b2d92cf475a161 100644 --- a/src/plugins/data/common/field_formats/converters/string.ts +++ b/src/plugins/data/common/field_formats/converters/string.ts @@ -22,8 +22,7 @@ import { asPrettyString } from '../index'; import { KBN_FIELD_TYPES } from '../../kbn_field_types/types'; import { FieldFormat } from '../field_format'; import { TextContextTypeConvert, FIELD_FORMAT_IDS } from '../types'; -// @ts-ignore -import { shortenDottedString } from '../../../../../legacy/core_plugins/kibana/common/utils/shorten_dotted_string'; +import { shortenDottedString } from '../../utils'; const TRANSFORM_OPTIONS = [ { diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index f9bbeb5f4b3f39..b334342a57ec6b 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -22,5 +22,5 @@ export * from './field_formats'; export * from './kbn_field_types'; export * from './index_patterns'; export * from './es_query'; - +export * from './utils'; export * from './types'; diff --git a/src/plugins/data/common/utils/index.ts b/src/plugins/data/common/utils/index.ts new file mode 100644 index 00000000000000..7196c96989e97d --- /dev/null +++ b/src/plugins/data/common/utils/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { shortenDottedString } from './shorten_dotted_string'; diff --git a/src/plugins/data/common/utils/shorten_dotted_string.test.ts b/src/plugins/data/common/utils/shorten_dotted_string.test.ts new file mode 100644 index 00000000000000..5f8d084ce5e88c --- /dev/null +++ b/src/plugins/data/common/utils/shorten_dotted_string.test.ts @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { shortenDottedString } from './shorten_dotted_string'; + +describe('shortenDottedString', () => { + test('should convert a dot.notated.string into a short string', () => { + expect(shortenDottedString('dot.notated.string')).toBe('d.n.string'); + }); + + test('should ignore non-string values', () => { + const obj = { key: 'val' }; + + expect(shortenDottedString(true)).toBe(true); + expect(shortenDottedString(123)).toBe(123); + expect(shortenDottedString(obj)).toBe(obj); + }); +}); diff --git a/src/legacy/core_plugins/data/public/mocks.ts b/src/plugins/data/common/utils/shorten_dotted_string.ts similarity index 68% rename from src/legacy/core_plugins/data/public/mocks.ts rename to src/plugins/data/common/utils/shorten_dotted_string.ts index 39d1296ddf8bc4..379413c0d91c8f 100644 --- a/src/legacy/core_plugins/data/public/mocks.ts +++ b/src/plugins/data/common/utils/shorten_dotted_string.ts @@ -17,19 +17,14 @@ * under the License. */ -import { indexPatternsServiceMock } from './index_patterns/index_patterns_service.mock'; +const DOT_PREFIX_RE = /(.).+?\./g; -function createDataSetupMock() { - return { - indexPatterns: indexPatternsServiceMock.createSetupContract(), - }; -} - -function createDataStartMock() { - return {}; +/** + * Convert a dot.notated.string into a short + * version (d.n.string) + * + * @return {any} + */ +export function shortenDottedString(input: any) { + return typeof input !== 'string' ? input : input.replace(DOT_PREFIX_RE, '$1.'); } - -export const dataPluginMock = { - createSetup: createDataSetupMock, - createStart: createDataStartMock, -}; diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/field.ts b/src/plugins/data/public/index_patterns/fields/field.ts similarity index 94% rename from src/legacy/core_plugins/data/public/index_patterns/fields/field.ts rename to src/plugins/data/public/index_patterns/fields/field.ts index 91964655f6f3e7..ae17188de8625f 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/fields/field.ts +++ b/src/plugins/data/public/index_patterns/fields/field.ts @@ -20,26 +20,19 @@ import { i18n } from '@kbn/i18n'; // @ts-ignore import { ObjDefine } from './obj_define'; -// @ts-ignore -import { shortenDottedString } from '../../../../../core_plugins/kibana/common/utils/shorten_dotted_string'; import { IndexPattern } from '../index_patterns'; import { getNotifications, getFieldFormats } from '../services'; - import { - FieldFormat, - getKbnFieldType, IFieldType, + getKbnFieldType, IFieldSubType, -} from '../../../../../../plugins/data/public'; + FieldFormat, + shortenDottedString, +} from '../../../common'; export type FieldSpec = Record; -/** @deprecated - * Please use IFieldType instead - * */ -export type FieldType = IFieldType; - -export class Field implements FieldType { +export class Field implements IFieldType { name: string; type: string; script?: string; diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts b/src/plugins/data/public/index_patterns/fields/field_list.ts similarity index 91% rename from src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts rename to src/plugins/data/public/index_patterns/fields/field_list.ts index 108aacc8e07def..ff6706cec6c344 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/fields/field_list.ts +++ b/src/plugins/data/public/index_patterns/fields/field_list.ts @@ -19,7 +19,8 @@ import { findIndex } from 'lodash'; import { IndexPattern } from '../index_patterns'; -import { Field, FieldType, FieldSpec } from './field'; +import { IFieldType } from '../../../common'; +import { Field, FieldSpec } from './field'; type FieldMap = Map; @@ -27,7 +28,7 @@ export interface FieldListInterface extends Array { getByName(name: Field['name']): Field | undefined; getByType(type: Field['type']): Field[]; add(field: FieldSpec): void; - remove(field: FieldType): void; + remove(field: IFieldType): void; } export class FieldList extends Array implements FieldListInterface { @@ -42,7 +43,7 @@ export class FieldList extends Array implements FieldListInterface { } this.groups.get(field.type)!.set(field.name, field); }; - private removeByGroup = (field: FieldType) => this.groups.get(field.type)!.delete(field.name); + private removeByGroup = (field: IFieldType) => this.groups.get(field.type)!.delete(field.name); constructor(indexPattern: IndexPattern, specs: FieldSpec[] = [], shortDotsEnable = false) { super(); @@ -61,7 +62,7 @@ export class FieldList extends Array implements FieldListInterface { this.setByGroup(newField); }; - remove = (field: FieldType) => { + remove = (field: IFieldType) => { this.removeByGroup(field); this.byName.delete(field.name); diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/index.ts b/src/plugins/data/public/index_patterns/fields/index.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/fields/index.ts rename to src/plugins/data/public/index_patterns/fields/index.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.js b/src/plugins/data/public/index_patterns/fields/obj_define.js similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.js rename to src/plugins/data/public/index_patterns/fields/obj_define.js diff --git a/src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.test.js b/src/plugins/data/public/index_patterns/fields/obj_define.test.js similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/fields/obj_define.test.js rename to src/plugins/data/public/index_patterns/fields/obj_define.test.js diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index aedfc18db3ade3..7492f9372e44a6 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -25,6 +25,8 @@ import { ILLEGAL_CHARACTERS, validateIndexPattern, } from './lib'; +import { getRoutes, getFromSavedObject } from './utils'; +import { flattenHitWrapper, formatHitProvider } from './index_patterns'; export const indexPatterns = { ILLEGAL_CHARACTERS_KEY, @@ -33,4 +35,13 @@ export const indexPatterns = { ILLEGAL_CHARACTERS, IndexPatternMissingIndices, validate: validateIndexPattern, + getRoutes, + getFromSavedObject, + flattenHitWrapper, + formatHitProvider, }; + +export { IndexPatternsService } from './index_patterns_service'; +export { Field, FieldList, FieldListInterface } from './fields'; +export { IndexPattern, IndexPatterns } from './index_patterns'; +export { IndexPatternsStart, IndexPatternsSetup } from './types'; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts b/src/plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts rename to src/plugins/data/public/index_patterns/index_patterns/_fields_fetcher.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts similarity index 97% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts rename to src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts index a3653bb529fa38..eb6c69b4143160 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/_pattern_cache.ts @@ -19,7 +19,7 @@ import { IndexPattern } from './index_pattern'; -export interface PatternCache { +interface PatternCache { get: (id: string) => IndexPattern; set: (id: string, value: IndexPattern) => IndexPattern; clear: (id: string) => void; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/flatten_hit.ts b/src/plugins/data/public/index_patterns/index_patterns/flatten_hit.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/flatten_hit.ts rename to src/plugins/data/public/index_patterns/index_patterns/flatten_hit.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/format_hit.ts b/src/plugins/data/public/index_patterns/index_patterns/format_hit.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/format_hit.ts rename to src/plugins/data/public/index_patterns/index_patterns/format_hit.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index_patterns/index.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index.ts rename to src/plugins/data/public/index_patterns/index_patterns/index.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts similarity index 95% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts index ee9f9b493ebf25..a0a884454a3f00 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.test.ts @@ -20,24 +20,23 @@ import { defaults, pluck, last, get } from 'lodash'; import { IndexPattern } from './index_pattern'; -import { DuplicateField } from '../../../../../../plugins/kibana_utils/public'; +import { DuplicateField } from '../../../../kibana_utils/public'; // @ts-ignore -import mockLogStashFields from '../../../../../../fixtures/logstash_fields'; +import mockLogStashFields from '../../../../../fixtures/logstash_fields'; // @ts-ignore - -import { stubbedSavedObjectIndexPattern } from '../../../../../../fixtures/stubbed_saved_object_index_pattern'; -import { Field } from '../index_patterns_service'; +import { stubbedSavedObjectIndexPattern } from '../../../../../fixtures/stubbed_saved_object_index_pattern'; +import { Field } from '../fields'; import { setNotifications, setFieldFormats } from '../services'; // Temporary disable eslint, will be removed after moving to new platform folder // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { notificationServiceMock } from '../../../../../../core/public/notifications/notifications_service.mock'; -import { FieldFormatRegisty } from '../../../../../../plugins/data/public'; +import { notificationServiceMock } from '../../../../../core/public/notifications/notifications_service.mock'; +import { FieldFormatRegisty } from '../../field_formats_provider'; jest.mock('ui/new_platform'); -jest.mock('../../../../../../plugins/kibana_utils/public', () => { - const originalModule = jest.requireActual('../../../../../../plugins/kibana_utils/public'); +jest.mock('../../../../kibana_utils/public', () => { + const originalModule = jest.requireActual('../../../../kibana_utils/public'); return { ...originalModule, diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts similarity index 96% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index de364b6c217dd7..2c93c0aa9dc620 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -26,17 +26,13 @@ import { expandShorthand, FieldMappingSpec, MappingObject, -} from '../../../../../../plugins/kibana_utils/public'; +} from '../../../../kibana_utils/public'; -import { - ES_FIELD_TYPES, - KBN_FIELD_TYPES, - IIndexPattern, - indexPatterns, -} from '../../../../../../plugins/data/public'; - -import { findIndexPatternByTitle, getRoutes } from '../utils'; -import { Field, FieldList, FieldListInterface, FieldType } from '../fields'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES, IIndexPattern, IFieldType } from '../../../common'; + +import { findByTitle, getRoutes } from '../utils'; +import { indexPatterns } from '../'; +import { Field, FieldList, FieldListInterface } from '../fields'; import { createFieldsFetcher } from './_fields_fetcher'; import { formatHitProvider } from './format_hit'; import { flattenHitWrapper } from './flatten_hit'; @@ -46,11 +42,6 @@ import { getNotifications, getFieldFormats } from '../services'; const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; const type = 'index-pattern'; -/** @deprecated - * Please use IIndexPattern instead - * */ -export type StaticIndexPattern = IIndexPattern; - export class IndexPattern implements IIndexPattern { [key: string]: any; @@ -296,7 +287,7 @@ export class IndexPattern implements IIndexPattern { await this.save(); } - removeScriptedField(field: FieldType) { + removeScriptedField(field: IFieldType) { this.fields.remove(field); return this.save(); } @@ -384,10 +375,7 @@ export class IndexPattern implements IIndexPattern { return response.id; }; - const potentialDuplicateByTitle = await findIndexPatternByTitle( - this.savedObjectsClient, - this.title - ); + const potentialDuplicateByTitle = await findByTitle(this.savedObjectsClient, this.title); // If there is potentially duplicate title, just create it if (!potentialDuplicateByTitle) { return await _create(); diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns.test.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts similarity index 92% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts index 06933dc4090528..2d3e357e968199 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.mock.ts @@ -17,7 +17,7 @@ * under the License. */ -import { setup } from '../../../../../../test_utils/public/http_test_setup'; +import { setup } from 'test_utils/http_test_setup'; export const { http } = setup(injectedMetadata => { injectedMetadata.getBasePath.mockReturnValue('/hola/daro/'); diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts similarity index 100% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.test.ts diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts similarity index 97% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts rename to src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts index 87dd7a68e30614..961e519338ac4d 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_patterns_api_client.ts @@ -18,7 +18,7 @@ */ import { HttpServiceBase } from 'src/core/public'; -import { indexPatterns } from '../../../../../../plugins/data/public'; +import { indexPatterns } from '../'; const API_BASE_URL: string = `/api/index_patterns/`; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts b/src/plugins/data/public/index_patterns/index_patterns_service.mock.ts similarity index 87% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts rename to src/plugins/data/public/index_patterns/index_patterns_service.mock.ts index db1ece78e7b4d1..d38e9c76430eb7 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.mock.ts +++ b/src/plugins/data/public/index_patterns/index_patterns_service.mock.ts @@ -17,8 +17,9 @@ * under the License. */ -import { IndexPatternsService, IndexPatternsSetup } from '.'; +import { IndexPatternsService } from './index_patterns_service'; import { flattenHitWrapper } from './index_patterns'; +import { IndexPatternsSetup } from './types'; type IndexPatternsServiceClientContract = PublicMethodsOf; @@ -33,11 +34,7 @@ const createSetupContractMock = () => { flattenHitWrapper: jest.fn().mockImplementation(flattenHitWrapper), formatHitProvider: jest.fn(), indexPatterns: jest.fn() as any, - __LEGACY: { - // For BWC we must temporarily export the class implementation of Field, - // which is only used externally by the Index Pattern UI. - FieldImpl: jest.fn(), - }, + IndexPatternSelect: jest.fn(), }; return setupContract; diff --git a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts b/src/plugins/data/public/index_patterns/index_patterns_service.ts similarity index 60% rename from src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts rename to src/plugins/data/public/index_patterns/index_patterns_service.ts index 83738ffe5b747c..40f833868847b7 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/index_patterns_service.ts +++ b/src/plugins/data/public/index_patterns/index_patterns_service.ts @@ -23,19 +23,11 @@ import { HttpServiceBase, NotificationsStart, } from 'src/core/public'; -import { FieldFormatsStart } from '../../../../../plugins/data/public'; -import { Field, FieldList, FieldListInterface, FieldType } from './fields'; +import { FieldFormatsStart } from '../field_formats_provider'; import { setNotifications, setFieldFormats } from './services'; +import { IndexPatterns } from './index_patterns'; -import { - createFlattenHitWrapper, - formatHitProvider, - IndexPattern, - IndexPatterns, - StaticIndexPattern, -} from './index_patterns'; - -export interface IndexPatternDependencies { +interface IndexPatternDependencies { uiSettings: IUiSettingsClient; savedObjectsClient: SavedObjectsClientContract; http: HttpServiceBase; @@ -52,16 +44,8 @@ export class IndexPatternsService { private setupApi: any; public setup() { - this.setupApi = { - FieldList, - flattenHitWrapper: createFlattenHitWrapper(), - formatHitProvider, - __LEGACY: { - // For BWC we must temporarily export the class implementation of Field, - // which is only used externally by the Index Pattern UI. - FieldImpl: Field, - }, - }; + this.setupApi = {}; + return this.setupApi; } @@ -76,7 +60,6 @@ export class IndexPatternsService { setFieldFormats(fieldFormats); return { - ...this.setupApi, indexPatterns: new IndexPatterns(uiSettings, savedObjectsClient, http), }; } @@ -85,20 +68,3 @@ export class IndexPatternsService { // nothing to do here yet } } - -// static code - -/** @public */ -export { getFromSavedObject, getRoutes } from './utils'; - -// types - -/** @internal */ -export type IndexPatternsSetup = ReturnType; -export type IndexPatternsStart = ReturnType; - -/** @public */ -export { IndexPattern, IndexPatterns, StaticIndexPattern, Field, FieldType, FieldListInterface }; - -/** @public */ -export { findIndexPatternByTitle } from './utils'; diff --git a/src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts b/src/plugins/data/public/index_patterns/lib/get_title.ts similarity index 96% rename from src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts rename to src/plugins/data/public/index_patterns/lib/get_title.ts index 777a12c7e2884a..320205f5139c98 100644 --- a/src/plugins/data/public/index_patterns/lib/get_index_pattern_title.ts +++ b/src/plugins/data/public/index_patterns/lib/get_title.ts @@ -19,7 +19,7 @@ import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; -export async function getIndexPatternTitle( +export async function getTitle( client: SavedObjectsClientContract, indexPatternId: string ): Promise> { diff --git a/src/plugins/data/public/index_patterns/lib/index.ts b/src/plugins/data/public/index_patterns/lib/index.ts index 3b87d91bb9fffb..0f667e846af91d 100644 --- a/src/plugins/data/public/index_patterns/lib/index.ts +++ b/src/plugins/data/public/index_patterns/lib/index.ts @@ -17,6 +17,6 @@ * under the License. */ -export { getIndexPatternTitle } from './get_index_pattern_title'; +export { getTitle } from './get_title'; export * from './types'; export { validateIndexPattern } from './validate_index_pattern'; diff --git a/src/legacy/core_plugins/data/public/index_patterns/services.ts b/src/plugins/data/public/index_patterns/services.ts similarity index 87% rename from src/legacy/core_plugins/data/public/index_patterns/services.ts rename to src/plugins/data/public/index_patterns/services.ts index ecd898b28de636..a6844cb4c04e2f 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/services.ts +++ b/src/plugins/data/public/index_patterns/services.ts @@ -18,8 +18,8 @@ */ import { NotificationsStart } from 'src/core/public'; -import { createGetterSetter } from '../../../../../plugins/kibana_utils/public'; -import { FieldFormatsStart } from '../../../../../plugins/data/public'; +import { createGetterSetter } from '../../../kibana_utils/public'; +import { FieldFormatsStart } from '../field_formats_provider'; export const [getNotifications, setNotifications] = createGetterSetter( 'Notifications' diff --git a/src/plugins/data/public/index_patterns/types.ts b/src/plugins/data/public/index_patterns/types.ts new file mode 100644 index 00000000000000..59e3075bf215d1 --- /dev/null +++ b/src/plugins/data/public/index_patterns/types.ts @@ -0,0 +1,23 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IndexPatternsService } from './index_patterns_service'; + +export type IndexPatternsSetup = ReturnType; +export type IndexPatternsStart = ReturnType; diff --git a/src/legacy/core_plugins/data/public/index_patterns/utils.ts b/src/plugins/data/public/index_patterns/utils.ts similarity index 93% rename from src/legacy/core_plugins/data/public/index_patterns/utils.ts rename to src/plugins/data/public/index_patterns/utils.ts index 0d0d5705a0cccd..8edb62f16bfeb6 100644 --- a/src/legacy/core_plugins/data/public/index_patterns/utils.ts +++ b/src/plugins/data/public/index_patterns/utils.ts @@ -18,8 +18,7 @@ */ import { find, get } from 'lodash'; - -import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; +import { SavedObjectsClientContract, SimpleSavedObject } from 'src/core/public'; /** * Returns an object matching a given title @@ -28,7 +27,7 @@ import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../co * @param title {string} * @returns {Promise} */ -export async function findIndexPatternByTitle( +export async function findByTitle( client: SavedObjectsClientContract, title: string ): Promise | void> { diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index ceb57b4a3a564d..19c21ab9934ef1 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -19,6 +19,7 @@ import { FieldFormatRegisty, Plugin, FieldFormatsStart, FieldFormatsSetup } from '.'; import { searchSetupMock } from './search/mocks'; import { queryServiceMock } from './query/mocks'; +import { indexPatternsServiceMock } from './index_patterns/index_patterns_service.mock'; export type Setup = jest.Mocked>; export type Start = jest.Mocked>; @@ -53,6 +54,7 @@ const createSetupContract = (): Setup => { search: searchSetupMock, fieldFormats: fieldFormatsMock as FieldFormatsSetup, query: querySetupMock, + indexPatterns: indexPatternsServiceMock.createSetupContract(), }; return setupContract; @@ -69,6 +71,7 @@ const createStartContract = (): Start => { ui: { IndexPatternSelect: jest.fn(), }, + indexPatterns: indexPatternsServiceMock.createStartContract(), }; return startContract; }; diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 35d8edc4884671..c018efcad74e65 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -26,8 +26,10 @@ import { SearchService } from './search/search_service'; import { FieldFormatsService } from './field_formats_provider'; import { QueryService } from './query'; import { createIndexPatternSelect } from './ui/index_pattern_select'; +import { IndexPatternsService } from './index_patterns'; export class DataPublicPlugin implements Plugin { + private readonly indexPatterns: IndexPatternsService = new IndexPatternsService(); private readonly autocomplete = new AutocompleteProviderRegister(); private readonly searchService: SearchService; private readonly fieldFormatsService: FieldFormatsService; @@ -54,19 +56,30 @@ export class DataPublicPlugin implements Plugin; }; + indexPatterns: IndexPatternsStart; } export * from './autocomplete_provider/types'; diff --git a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx index f41024ed16191c..ad453c4e5d11d2 100644 --- a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx +++ b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx @@ -22,7 +22,7 @@ import React, { Component } from 'react'; import { EuiComboBox } from '@elastic/eui'; import { SavedObjectsClientContract, SimpleSavedObject } from '../../../../../core/public'; -import { getIndexPatternTitle } from '../../index_patterns/lib'; +import { getTitle } from '../../index_patterns/lib'; export interface IndexPatternSelectProps { onChange: (opt: any) => void; @@ -104,7 +104,7 @@ export class IndexPatternSelect extends Component { let indexPatternTitle; try { - indexPatternTitle = await getIndexPatternTitle(this.props.savedObjectsClient, indexPatternId); + indexPatternTitle = await getTitle(this.props.savedObjectsClient, indexPatternId); } catch (err) { // index pattern no longer exists return; diff --git a/src/test_utils/public/stub_index_pattern.js b/src/test_utils/public/stub_index_pattern.js index b41ebe3e618615..b76da4b4eca3ef 100644 --- a/src/test_utils/public/stub_index_pattern.js +++ b/src/test_utils/public/stub_index_pattern.js @@ -21,7 +21,7 @@ import sinon from 'sinon'; // TODO: We should not be importing from the data plugin directly here; this is only necessary // because it is one of the few places that we need to access the IndexPattern class itself, rather // than just the type. Doing this as a temporary measure; it will be left behind when migrating to NP. -import { IndexPattern } from '../../legacy/core_plugins/data/public/index_patterns/index_patterns'; +import { IndexPattern } from '../../legacy/core_plugins/data/public/'; import { FieldList, getRoutes, diff --git a/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts b/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts index b1879ec92c131d..9a13da65e976ae 100644 --- a/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts +++ b/x-pack/legacy/plugins/graph/public/services/persistence/deserialize.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IndexPattern } from 'src/legacy/core_plugins/data/public/index_patterns/index_patterns'; +import { IndexPattern } from 'src/legacy/core_plugins/data/public/'; import { SerializedNode, UrlTemplate, From d2811df358af5a2f141053ef4c5ca09001d7a06c Mon Sep 17 00:00:00 2001 From: Nick Partridge Date: Sun, 1 Dec 2019 21:20:29 -0600 Subject: [PATCH 07/39] Fix type error with jest tests (#51925) --- .../vis_types/vislib_vis_legend/vislib_vis_legend.test.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/legacy/ui/public/vis/vis_types/vislib_vis_legend/vislib_vis_legend.test.tsx b/src/legacy/ui/public/vis/vis_types/vislib_vis_legend/vislib_vis_legend.test.tsx index 66acc9e247e630..839dc0024bbea5 100644 --- a/src/legacy/ui/public/vis/vis_types/vislib_vis_legend/vislib_vis_legend.test.tsx +++ b/src/legacy/ui/public/vis/vis_types/vislib_vis_legend/vislib_vis_legend.test.tsx @@ -19,7 +19,6 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; -import { act } from '@testing-library/react-hooks'; import { I18nProvider } from '@kbn/i18n/react'; import { EuiButtonGroup } from '@elastic/eui'; @@ -173,10 +172,8 @@ describe('VisLegend Component', () => { it('should call unHighlight handler when legend item is unhovered', () => { const first = getLegendItems(wrapper).first(); - act(() => { - first.simulate('mouseEnter'); - first.simulate('mouseLeave'); - }); + first.simulate('mouseEnter'); + first.simulate('mouseLeave'); expect(vislibVis.handler.unHighlight).toHaveBeenCalledTimes(1); }); From 01322363ecaf330229735f42d9c9b047cd6b148d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Mon, 2 Dec 2019 07:52:10 +0100 Subject: [PATCH 08/39] [APM] Add script for creating roles for local dev use (#51824) --- src/cli/cluster/cluster_manager.js | 1 + .../setup-custom-kibana-user-role.ts | 215 ++++++++++++++++++ .../apm/scripts/setup-kibana-security.js | 28 +++ 3 files changed, 244 insertions(+) create mode 100644 x-pack/legacy/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts create mode 100644 x-pack/legacy/plugins/apm/scripts/setup-kibana-security.js diff --git a/src/cli/cluster/cluster_manager.js b/src/cli/cluster/cluster_manager.js index a67593c02a5935..13135196e38036 100644 --- a/src/cli/cluster/cluster_manager.js +++ b/src/cli/cluster/cluster_manager.js @@ -187,6 +187,7 @@ export default class ClusterManager { fromRoot('x-pack/legacy/plugins/reporting/.chromium'), fromRoot('x-pack/legacy/plugins/siem/cypress'), fromRoot('x-pack/legacy/plugins/apm/cypress'), + fromRoot('x-pack/legacy/plugins/apm/scripts'), fromRoot('x-pack/legacy/plugins/canvas/canvas_plugin_src') // prevents server from restarting twice for Canvas plugin changes ]; diff --git a/x-pack/legacy/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts b/x-pack/legacy/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts new file mode 100644 index 00000000000000..7d3e107a350bfc --- /dev/null +++ b/x-pack/legacy/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts @@ -0,0 +1,215 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/* eslint-disable no-console */ + +import yaml from 'js-yaml'; +import axios, { AxiosRequestConfig, AxiosError } from 'axios'; +import fs from 'fs'; +import { union, difference } from 'lodash'; +import path from 'path'; +import { argv } from 'yargs'; + +const config = yaml.safeLoad( + fs.readFileSync( + path.join(__filename, '../../../../../../../config/kibana.dev.yml'), + 'utf8' + ) +); + +const GITHUB_USERNAME = argv.username as string; +const KIBANA_INDEX = config['kibana.index'] as string; +const ELASTICSEARCH_USERNAME = (argv.esUsername as string) || 'elastic'; +const ELASTICSEARCH_PASSWORD = (argv.esPassword || + config['elasticsearch.password']) as string; +const KIBANA_BASE_URL = (argv.baseUrl as string) || 'http://localhost:5601'; + +interface User { + username: string; + roles: string[]; + full_name?: string; + email?: string; + enabled?: boolean; +} + +init().catch(e => { + if (e.response) { + console.log( + JSON.stringify({ request: e.config, response: e.response.data }, null, 2) + ); + return; + } + + console.log(e); +}); + +async function init() { + // kibana.index must be different from `.kibana` + if (KIBANA_INDEX === '.kibana') { + console.log( + 'Please use a custom `kibana.index` in kibana.dev.yml. Example: "kibana.index: .kibana-john"' + ); + return; + } + + if (!KIBANA_INDEX.startsWith('.kibana')) { + console.log( + 'Your `kibana.index` must be prefixed with `.kibana`. Example: "kibana.index: .kibana-john"' + ); + return; + } + + if (!GITHUB_USERNAME) { + console.log( + 'Please specify your github username with `--username ` ' + ); + return; + } + + const KIBANA_READ_ROLE = `kibana_read_${GITHUB_USERNAME}`; + const KIBANA_WRITE_ROLE = `kibana_write_${GITHUB_USERNAME}`; + + // create roles + await createRole({ roleName: KIBANA_READ_ROLE, privilege: 'read' }); + await createRole({ roleName: KIBANA_WRITE_ROLE, privilege: 'all' }); + + // read/write access to all apps + apm index access + await createOrUpdateUser({ + username: 'apm_write_user', + roles: ['apm_user', KIBANA_WRITE_ROLE] + }); + + // read access to all apps + apm index access + await createOrUpdateUser({ + username: 'apm_read_user', + roles: ['apm_user', KIBANA_READ_ROLE] + }); + + // read/write access to all apps (no apm index access) + await createOrUpdateUser({ + username: 'kibana_write_user', + roles: [KIBANA_WRITE_ROLE] + }); +} + +async function callKibana(options: AxiosRequestConfig): Promise { + const { data } = await axios.request({ + ...options, + baseURL: KIBANA_BASE_URL, + auth: { + username: ELASTICSEARCH_USERNAME, + password: ELASTICSEARCH_PASSWORD + }, + headers: { 'kbn-xsrf': 'true', ...options.headers } + }); + return data; +} + +async function createRole({ + roleName, + privilege +}: { + roleName: string; + privilege: 'read' | 'all'; +}) { + const role = await getRole(roleName); + if (role) { + console.log(`Skipping: Role "${roleName}" already exists`); + return; + } + + await callKibana({ + method: 'PUT', + url: `/api/security/role/${roleName}`, + data: { + metadata: { version: 1 }, + elasticsearch: { cluster: [], indices: [] }, + kibana: [{ base: [privilege], feature: {}, spaces: ['*'] }] + } + }); + + console.log(`Created role "${roleName}" with privilege "${privilege}"`); +} + +async function createOrUpdateUser(newUser: User) { + const existingUser = await getUser(newUser.username); + if (!existingUser) { + return createUser(newUser); + } + + return updateUser(existingUser, newUser); +} + +async function createUser(newUser: User) { + const user = await callKibana({ + method: 'POST', + url: `/api/security/v1/users/${newUser.username}`, + data: { + ...newUser, + enabled: true, + password: ELASTICSEARCH_PASSWORD + } + }); + + console.log(`User "${newUser.username}" was created`); + return user; +} + +async function updateUser(existingUser: User, newUser: User) { + const { username } = newUser; + const allRoles = union(existingUser.roles, newUser.roles); + const hasAllRoles = difference(allRoles, existingUser.roles).length === 0; + if (hasAllRoles) { + console.log( + `Skipping: User "${username}" already has neccesarry roles: "${newUser.roles}"` + ); + return; + } + + // assign role to user + await callKibana({ + method: 'POST', + url: `/api/security/v1/users/${username}`, + data: { ...existingUser, roles: allRoles } + }); + + console.log(`User "${username}" was updated`); +} + +async function getUser(username: string) { + try { + return await callKibana({ + url: `/api/security/v1/users/${username}` + }); + } catch (e) { + const err = e as AxiosError; + + // return empty if user doesn't exist + if (err.response?.status === 404) { + return null; + } + + throw e; + } +} + +async function getRole(roleName: string) { + try { + return await callKibana({ + method: 'GET', + url: `/api/security/role/${roleName}` + }); + } catch (e) { + const err = e as AxiosError; + + // return empty if role doesn't exist + if (err.response?.status === 404) { + return null; + } + + throw e; + } +} diff --git a/x-pack/legacy/plugins/apm/scripts/setup-kibana-security.js b/x-pack/legacy/plugins/apm/scripts/setup-kibana-security.js new file mode 100644 index 00000000000000..a3dc3d66f56a03 --- /dev/null +++ b/x-pack/legacy/plugins/apm/scripts/setup-kibana-security.js @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/* + * This script will create two roles + * - a read_only kibana role + * - a read/write kibana role + * + * The two roles will be assigned to the already existing users: `apm_read_user`, `apm_write_user`, `kibana_write_user` + * + * This makes it possible to use the existing cloud users locally + * Usage: node setup-kibana-security.js --username YOUR-GITHUB-USERNAME + ******************************/ + +// compile typescript on the fly +require('@babel/register')({ + extensions: ['.ts'], + plugins: ['@babel/plugin-proposal-optional-chaining'], + presets: [ + '@babel/typescript', + ['@babel/preset-env', { targets: { node: 'current' } }] + ] +}); + +require('./kibana-security/setup-custom-kibana-user-role.ts'); From 45e7a11d68e18db56445498ef6769996f3ac4161 Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Mon, 2 Dec 2019 11:17:27 +0100 Subject: [PATCH 09/39] Remove usages of `@kbn-ui-framework` (#51696) --- .../listing/no_visualizations_prompt.js | 55 ---------------- .../exit_full_screen_button.test.js.snap | 38 +++++------ .../exit_full_screen_button.test.tsx.snap | 65 +++++++++---------- .../_exit_full_screen_button.scss | 19 ++---- .../exit_full_screen_button.tsx | 17 ++--- .../translations/translations/ja-JP.json | 4 +- .../translations/translations/zh-CN.json | 4 +- 7 files changed, 63 insertions(+), 139 deletions(-) delete mode 100644 src/legacy/core_plugins/kibana/public/visualize/listing/no_visualizations_prompt.js diff --git a/src/legacy/core_plugins/kibana/public/visualize/listing/no_visualizations_prompt.js b/src/legacy/core_plugins/kibana/public/visualize/listing/no_visualizations_prompt.js deleted file mode 100644 index 34b662838880e3..00000000000000 --- a/src/legacy/core_plugins/kibana/public/visualize/listing/no_visualizations_prompt.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { - KuiEmptyTablePrompt, - KuiEmptyTablePromptPanel, - KuiButton, - KuiButtonIcon, -} from '@kbn/ui-framework/components'; - -function NoVisualizationsPrompt({ onCreateVis }) { - return ( - - } - > - - - } - message={i18n.translate('kbn.visualize.listing.noVisualizationsText', { - defaultMessage: `Looks like you don't have any visualizations. Let's create some!`, - })} - /> - - ); -} - -export { NoVisualizationsPrompt }; diff --git a/src/legacy/ui/public/exit_full_screen/__snapshots__/exit_full_screen_button.test.js.snap b/src/legacy/ui/public/exit_full_screen/__snapshots__/exit_full_screen_button.test.js.snap index 2fe29dd29a59ba..6bd9652d2a1b06 100644 --- a/src/legacy/ui/public/exit_full_screen/__snapshots__/exit_full_screen_button.test.js.snap +++ b/src/legacy/ui/public/exit_full_screen/__snapshots__/exit_full_screen_button.test.js.snap @@ -8,32 +8,28 @@ exports[`is rendered 1`] = ` > In full screen mode, press ESC to exit.

-
+
diff --git a/src/plugins/kibana_react/public/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap b/src/plugins/kibana_react/public/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap index 979b12847097aa..07e2dc7f35f808 100644 --- a/src/plugins/kibana_react/public/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap +++ b/src/plugins/kibana_react/public/exit_full_screen_button/__snapshots__/exit_full_screen_button.test.tsx.snap @@ -13,46 +13,43 @@ exports[`is rendered 1`] = ` In full screen mode, press ESC to exit.

-
- + - + + + + +
diff --git a/src/plugins/kibana_react/public/exit_full_screen_button/_exit_full_screen_button.scss b/src/plugins/kibana_react/public/exit_full_screen_button/_exit_full_screen_button.scss index c42d8b7c4a66d4..e810fe0ccdba6f 100644 --- a/src/plugins/kibana_react/public/exit_full_screen_button/_exit_full_screen_button.scss +++ b/src/plugins/kibana_react/public/exit_full_screen_button/_exit_full_screen_button.scss @@ -1,17 +1,9 @@ -.dshExitFullScreenButton { - text-align: center; - width: 100%; - height: 0; - bottom: 0; - position: absolute; -} - /** * 1. override the z-index: 1 applied to all non-eui elements that are in :focus via kui * - see packages/kbn-ui-framework/src/global_styling/reset/_reset.scss */ -.dshExitFullScreenButton__mode { +.dshExitFullScreenButton { height: $euiSizeXXL; left: 0; bottom: 0; @@ -59,18 +51,19 @@ color: $euiColorEmptyShade; line-height: $euiSizeXXL; display: inline-block; + font-size: $euiFontSizeS; height: $euiSizeXXL; position: absolute; left: calc(100% + #{$euiSize}); /* 1 */ top: 0px; bottom: 0px; white-space: nowrap; - padding: 0px $euiSizeS 0px $euiSizeM; + padding: 0px $euiSizeXS 0px $euiSizeM; transition: all .2s ease; transform: translateX(-100%); z-index: -1; - - .kuiIcon { - margin-left: $euiSizeS; + + .euiIcon { + margin-left: $euiSizeXS; } } diff --git a/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.tsx b/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.tsx index 09e702c55ac783..5ce508ec1ed5b2 100644 --- a/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.tsx +++ b/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.tsx @@ -20,9 +20,7 @@ import { i18n } from '@kbn/i18n'; import React, { PureComponent } from 'react'; import { EuiScreenReaderOnly, keyCodes } from '@elastic/eui'; - -// @ts-ignore -import { KuiButton } from '@kbn/ui-framework/components'; +import { EuiIcon } from '@elastic/eui'; export interface ExitFullScreenButtonProps { onExitFullScreenMode: () => void; @@ -53,16 +51,15 @@ class ExitFullScreenButtonUi extends PureComponent { })}

-
- +
); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 30a9d4f8c77042..4fd99b2c888a31 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -659,7 +659,7 @@ "kibana-react.tableListView.listing.table.editActionDescription": "編集", "kibana-react.tableListView.listing.table.editActionName": "編集", "kibana-react.tableListView.listing.unableToDeleteDangerMessage": "{entityName} を削除できません", - "kibana-react.exitFullScreenButton.exitFullScreenModeButtonAreaLabel": "全画面モードを終了", + "kibana-react.exitFullScreenButton.exitFullScreenModeButtonAriaLabel": "全画面モードを終了", "kibana-react.exitFullScreenButton.exitFullScreenModeButtonLabel": "全画面を終了", "kibana-react.exitFullScreenButton.fullScreenModeDescription": "ESC キーで全画面モードを終了します。", "kibana-react.savedObjects.finder.filterButtonLabel": "タイプ", @@ -2427,8 +2427,6 @@ "kbn.visualize.listing.experimentalTitle": "実験的", "kbn.visualize.listing.experimentalTooltip": "このビジュアライゼーションは今後のリリースで変更または削除される可能性があり、SLA のサポート対象になりません。", "kbn.visualize.listing.noItemsMessage": "ビジュアライゼーションがないようです。", - "kbn.visualize.listing.noVisualizations.createVisualizationButtonLabel": "ビジュアライゼーションを作成", - "kbn.visualize.listing.noVisualizationsText": "ビジュアライゼーションがないようです。作ってみましょう!", "kbn.visualize.listing.table.entityName": "ビジュアライゼーション", "kbn.visualize.listing.table.entityNamePlural": "ビジュアライゼーション", "kbn.visualize.listing.table.listTitle": "ビジュアライゼーション", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a89b648c2688fa..52b67473c1b916 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -646,7 +646,7 @@ "core.euiSuperUpdateButton.updatingButtonLabel": "正在更新", "core.application.appNotFound.pageDescription": "在此 URL 未找到任何应用程序。尝试返回或从菜单中选择应用。", "core.application.appNotFound.title": "未找到应用程序", - "kibana-react.exitFullScreenButton.exitFullScreenModeButtonAreaLabel": "退出全屏模式", + "kibana-react.exitFullScreenButton.exitFullScreenModeButtonAriaLabel": "退出全屏模式", "kibana-react.exitFullScreenButton.exitFullScreenModeButtonLabel": "退出全屏", "kibana-react.exitFullScreenButton.fullScreenModeDescription": "在全屏模式下,按 ESC 键可退出。", "kibana-react.tableListView.listing.deleteButtonMessage": "删除 {itemCount} 个{entityName}", @@ -2428,8 +2428,6 @@ "kbn.visualize.listing.experimentalTitle": "实验性", "kbn.visualize.listing.experimentalTooltip": "未来版本可能会更改或删除此可视化,其不受支持 SLA 的约束。", "kbn.visualize.listing.noItemsMessage": "看起来您还没有任何可视化。", - "kbn.visualize.listing.noVisualizations.createVisualizationButtonLabel": "创建可视化", - "kbn.visualize.listing.noVisualizationsText": "看起来您还没有任何可视化。开始创建一些吧!", "kbn.visualize.listing.table.entityName": "可视化", "kbn.visualize.listing.table.entityNamePlural": "可视化", "kbn.visualize.listing.table.listTitle": "可视化", From 06bef094278473882da26a2bf4b8d8b7cd735daf Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Mon, 2 Dec 2019 12:39:43 +0200 Subject: [PATCH 10/39] Replace StaticIndexPattern with IIndexPattern from NP (#51872) * replace SIP with IIP * import path --- src/legacy/core_plugins/data/public/index.ts | 1 - .../kibana/public/dashboard/dashboard_app.tsx | 11 ++++++++--- .../discover/angular/doc_table/lib/get_sort.d.ts | 4 ++-- .../kibana/public/discover/embeddable/types.ts | 5 ++--- .../kibana/public/discover/kibana_services.ts | 2 +- .../public/visualize/embeddable/get_index_pattern.ts | 11 ++++------- .../visualize/embeddable/visualize_embeddable.ts | 6 +++--- .../kibana/public/visualize/kibana_services.ts | 1 - src/legacy/ui/public/index_patterns/index.ts | 1 - .../public/index_patterns/index_patterns_service.ts | 2 +- .../local_ui_filters/get_filter_aggregations.ts | 4 ++-- .../public/components/inventory/toolbars/toolbar.tsx | 4 ++-- .../public/components/metrics_explorer/kuery_bar.tsx | 5 ++--- .../public/components/metrics_explorer/toolbar.tsx | 4 ++-- .../infra/public/containers/logs/with_log_filter.tsx | 4 ++-- .../metrics_explorer/use_metrics_explorer_data.ts | 4 ++-- .../public/containers/waffle/with_waffle_filters.tsx | 4 ++-- .../containers/waffle/with_waffle_view_state.tsx | 4 ++-- .../public/containers/with_kuery_autocompletion.tsx | 5 ++--- .../public/containers/with_source/with_source.tsx | 4 ++-- .../pages/infrastructure/metrics_explorer/index.tsx | 4 ++-- .../metrics_explorer/use_metric_explorer_state.ts | 4 ++-- x-pack/legacy/plugins/infra/public/utils/kuery.ts | 5 ++--- .../editor_frame_plugin/embeddable/embeddable.tsx | 6 +++--- .../jobs/new_job/common/index_pattern_context.ts | 4 ++-- .../public/components/events_viewer/events_viewer.tsx | 10 +++++++--- .../components/page/hosts/hosts_table/index.tsx | 4 ++-- .../network/network_top_countries_table/columns.tsx | 6 +++--- .../network/network_top_countries_table/index.tsx | 4 ++-- .../page/network/network_top_n_flow_table/columns.tsx | 6 +++--- .../page/network/network_top_n_flow_table/index.tsx | 4 ++-- .../siem/public/components/query_bar/index.tsx | 5 +++-- .../siem/public/components/search_bar/index.tsx | 5 +++-- .../public/components/timeline/fetch_kql_timeline.tsx | 4 ++-- .../siem/public/components/timeline/header/index.tsx | 4 ++-- .../siem/public/components/timeline/helpers.tsx | 10 +++++++--- .../public/components/timeline/query_bar/index.tsx | 4 ++-- .../components/timeline/search_or_filter/index.tsx | 5 ++--- .../timeline/search_or_filter/search_or_filter.tsx | 5 ++--- .../siem/public/components/timeline/timeline.tsx | 5 ++--- .../plugins/siem/public/components/url_state/types.ts | 7 +++---- .../detection_engine/rules/fetch_index_patterns.tsx | 6 +++--- .../public/containers/kuery_autocompletion/index.tsx | 8 +++++--- .../plugins/siem/public/containers/source/index.tsx | 8 ++++---- .../create_rule/components/query_bar/index.tsx | 4 ++-- .../public/pages/hosts/details/details_tabs.test.tsx | 7 ++----- .../plugins/siem/public/pages/hosts/details/types.ts | 5 ++--- .../siem/public/pages/hosts/navigation/types.ts | 4 ++-- .../legacy/plugins/siem/public/pages/hosts/types.ts | 5 ++--- .../siem/public/pages/network/ip_details/types.ts | 5 ++--- .../siem/public/pages/network/navigation/types.ts | 6 +++--- .../plugins/siem/public/utils/kql/use_update_kql.tsx | 4 ++-- .../source_index_preview/use_source_index_data.ts | 4 ++-- 53 files changed, 130 insertions(+), 133 deletions(-) diff --git a/src/legacy/core_plugins/data/public/index.ts b/src/legacy/core_plugins/data/public/index.ts index bdfedbc2c81a85..4cefff8a6e2fc9 100644 --- a/src/legacy/core_plugins/data/public/index.ts +++ b/src/legacy/core_plugins/data/public/index.ts @@ -35,7 +35,6 @@ export { FieldListInterface, IndexPattern, IndexPatterns, - StaticIndexPattern, } from './index_patterns'; export { QueryStringInput } from './query'; export { SearchBar, SearchBarProps } from './search'; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.tsx b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.tsx index 26b86204b03dbc..dcedb2a166fcc0 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.tsx +++ b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.tsx @@ -17,7 +17,6 @@ * under the License. */ -import { StaticIndexPattern } from 'plugins/data'; import moment from 'moment'; import { Subscription } from 'rxjs'; @@ -31,7 +30,13 @@ import { import { ViewMode } from '../../../embeddable_api/public/np_ready/public'; import { SavedObjectDashboard } from './saved_dashboard/saved_dashboard'; import { DashboardAppState, SavedDashboardPanel, ConfirmModalFn } from './types'; -import { TimeRange, Query, esFilters, SavedQuery } from '../../../../../../src/plugins/data/public'; +import { + IIndexPattern, + TimeRange, + Query, + esFilters, + SavedQuery, +} from '../../../../../../src/plugins/data/public'; import { DashboardAppController } from './dashboard_app_controller'; import { RenderDeps } from './application'; @@ -54,7 +59,7 @@ export interface DashboardAppScope extends ng.IScope { savedQuery?: SavedQuery; refreshInterval: any; panels: SavedDashboardPanel[]; - indexPatterns: StaticIndexPattern[]; + indexPatterns: IIndexPattern[]; $evalAsync: any; dashboardViewMode: ViewMode; expandedPanel?: string; diff --git a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/get_sort.d.ts b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/get_sort.d.ts index bb32da0d11fc0f..ebf715a64d9397 100644 --- a/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/get_sort.d.ts +++ b/src/legacy/core_plugins/kibana/public/discover/angular/doc_table/lib/get_sort.d.ts @@ -17,11 +17,11 @@ * under the License. */ -import { StaticIndexPattern } from '../../../kibana_services'; +import { IIndexPattern } from '../../../../../../../../plugins/data/public'; import { SortOrder } from '../components/table_header/helpers'; export function getSort( sort?: SortOrder[], - indexPattern?: StaticIndexPattern, + indexPattern?: IIndexPattern, defaultSortOrder?: SortOrder ): any; diff --git a/src/legacy/core_plugins/kibana/public/discover/embeddable/types.ts b/src/legacy/core_plugins/kibana/public/discover/embeddable/types.ts index 2d940ad8cba98a..adfa3d5acbf7a3 100644 --- a/src/legacy/core_plugins/kibana/public/discover/embeddable/types.ts +++ b/src/legacy/core_plugins/kibana/public/discover/embeddable/types.ts @@ -18,10 +18,9 @@ */ import { EmbeddableInput, EmbeddableOutput, IEmbeddable } from 'src/plugins/embeddable/public'; -import { StaticIndexPattern } from '../kibana_services'; import { SavedSearch } from '../types'; import { SortOrder } from '../angular/doc_table/components/table_header/helpers'; -import { esFilters, TimeRange, Query } from '../../../../../../plugins/data/public'; +import { esFilters, IIndexPattern, TimeRange, Query } from '../../../../../../plugins/data/public'; export interface SearchInput extends EmbeddableInput { timeRange: TimeRange; @@ -34,7 +33,7 @@ export interface SearchInput extends EmbeddableInput { export interface SearchOutput extends EmbeddableOutput { editUrl: string; - indexPatterns?: StaticIndexPattern[]; + indexPatterns?: IIndexPattern[]; editable: boolean; } diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index 393399f7da345c..497427136f415a 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -84,7 +84,7 @@ export { unhashUrl } from 'ui/state_management/state_hashing'; // EXPORT types export { Vis } from 'ui/vis'; -export { StaticIndexPattern, IndexPatterns, IndexPattern, FieldType } from 'ui/index_patterns'; +export { IndexPatterns, IndexPattern, FieldType } from 'ui/index_patterns'; export { ElasticSearchHit } from 'ui/registry/doc_views_types'; export { DocViewRenderProps, DocViewRenderFn } from 'ui/registry/doc_views'; export { Adapters } from 'ui/inspector/types'; diff --git a/src/legacy/core_plugins/kibana/public/visualize/embeddable/get_index_pattern.ts b/src/legacy/core_plugins/kibana/public/visualize/embeddable/get_index_pattern.ts index b6d5adcd98bd02..9bc9ab99c4aff2 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/embeddable/get_index_pattern.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/embeddable/get_index_pattern.ts @@ -17,18 +17,15 @@ * under the License. */ -import { - getServices, - getFromSavedObject, - StaticIndexPattern, - VisSavedObject, -} from '../kibana_services'; +import { getServices, getFromSavedObject, VisSavedObject } from '../kibana_services'; + +import { IIndexPattern } from '../../../../../../plugins/data/public'; const { savedObjectsClient, uiSettings } = getServices(); export async function getIndexPattern( savedVis: VisSavedObject -): Promise { +): Promise { if (savedVis.vis.type.name !== 'metrics') { return savedVis.vis.indexPattern; } diff --git a/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts b/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts index a2b46dab1ef33b..13d33c9eb99ec1 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts @@ -18,7 +18,6 @@ */ import _, { forEach } from 'lodash'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { PersistedState } from 'ui/persisted_state'; import { Subscription } from 'rxjs'; import * as Rx from 'rxjs'; @@ -33,6 +32,7 @@ import { IExpressionLoaderParams } from 'src/plugins/expressions/public'; import { SearchSourceContract } from '../../../../../ui/public/courier'; import { VISUALIZE_EMBEDDABLE_TYPE } from './constants'; import { + IIndexPattern, TimeRange, Query, onlyDisabledFiltersChanged, @@ -61,7 +61,7 @@ export interface VisSavedObject extends SavedObject { export interface VisualizeEmbeddableConfiguration { savedVisualization: VisSavedObject; - indexPatterns?: StaticIndexPattern[]; + indexPatterns?: IIndexPattern[]; editUrl: string; editable: boolean; appState?: AppState; @@ -81,7 +81,7 @@ export interface VisualizeInput extends EmbeddableInput { export interface VisualizeOutput extends EmbeddableOutput { editUrl: string; - indexPatterns?: StaticIndexPattern[]; + indexPatterns?: IIndexPattern[]; savedObjectId: string; visTypeName: string; } diff --git a/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts b/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts index 61b1cde0dcaf9e..612f0ba0f077be 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/kibana_services.ts @@ -117,7 +117,6 @@ export { // export types export { METRIC_TYPE }; -export { StaticIndexPattern } from 'ui/index_patterns'; export { AppState } from 'ui/state_management/app_state'; export { VisType } from 'ui/vis'; diff --git a/src/legacy/ui/public/index_patterns/index.ts b/src/legacy/ui/public/index_patterns/index.ts index 200276c1727fcf..237f3137bc9f4b 100644 --- a/src/legacy/ui/public/index_patterns/index.ts +++ b/src/legacy/ui/public/index_patterns/index.ts @@ -44,7 +44,6 @@ export { FieldListInterface, IndexPattern, IndexPatterns, - StaticIndexPattern, } from '../../../core_plugins/data/public'; export { FieldList } from '../../../../plugins/data/public'; diff --git a/src/plugins/data/public/index_patterns/index_patterns_service.ts b/src/plugins/data/public/index_patterns/index_patterns_service.ts index 40f833868847b7..43ba5082ec479c 100644 --- a/src/plugins/data/public/index_patterns/index_patterns_service.ts +++ b/src/plugins/data/public/index_patterns/index_patterns_service.ts @@ -27,7 +27,7 @@ import { FieldFormatsStart } from '../field_formats_provider'; import { setNotifications, setFieldFormats } from './services'; import { IndexPatterns } from './index_patterns'; -interface IndexPatternDependencies { +export interface IndexPatternDependencies { uiSettings: IUiSettingsClient; savedObjectsClient: SavedObjectsClientContract; http: HttpServiceBase; diff --git a/x-pack/legacy/plugins/apm/server/lib/ui_filters/local_ui_filters/get_filter_aggregations.ts b/x-pack/legacy/plugins/apm/server/lib/ui_filters/local_ui_filters/get_filter_aggregations.ts index 0bf89414e2894e..859b6f1f19c228 100644 --- a/x-pack/legacy/plugins/apm/server/lib/ui_filters/local_ui_filters/get_filter_aggregations.ts +++ b/x-pack/legacy/plugins/apm/server/lib/ui_filters/local_ui_filters/get_filter_aggregations.ts @@ -5,11 +5,11 @@ */ import { omit } from 'lodash'; +import { IIndexPattern } from 'src/plugins/data/server'; import { Projection } from '../../../../common/projections/typings'; import { UIFilters } from '../../../../typings/ui-filters'; import { getUiFiltersES } from '../../helpers/convert_ui_filters/get_ui_filters_es'; import { localUIFilters, LocalUIFilterName } from './config'; -import { StaticIndexPattern } from '../../../../../../../../src/legacy/core_plugins/data/public'; export const getFilterAggregations = ({ indexPattern, @@ -17,7 +17,7 @@ export const getFilterAggregations = ({ projection, localFilterNames }: { - indexPattern: StaticIndexPattern | undefined; + indexPattern: IIndexPattern | undefined; uiFilters: UIFilters; projection: Projection; localFilterNames: LocalUIFilterName[]; diff --git a/x-pack/legacy/plugins/infra/public/components/inventory/toolbars/toolbar.tsx b/x-pack/legacy/plugins/infra/public/components/inventory/toolbars/toolbar.tsx index 167a328135bf72..7cf9b1c2924095 100644 --- a/x-pack/legacy/plugins/infra/public/components/inventory/toolbars/toolbar.tsx +++ b/x-pack/legacy/plugins/infra/public/components/inventory/toolbars/toolbar.tsx @@ -5,7 +5,6 @@ */ import React, { FunctionComponent } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { Action } from 'typescript-fsa'; import { EuiFlexItem } from '@elastic/eui'; import { findToolbar } from '../../../../common/inventory_models/toolbars'; @@ -21,9 +20,10 @@ import { InfraGroupByOptions } from '../../../lib/lib'; import { WithWaffleViewState } from '../../../containers/waffle/with_waffle_view_state'; import { SavedViewsToolbarControls } from '../../saved_views/toolbar_control'; import { inventoryViewSavedObjectType } from '../../../../common/saved_objects/inventory_view'; +import { IIndexPattern } from '../../../../../../../../src/plugins/data/public'; export interface ToolbarProps { - createDerivedIndexPattern: (type: 'logs' | 'metrics' | 'both') => StaticIndexPattern; + createDerivedIndexPattern: (type: 'logs' | 'metrics' | 'both') => IIndexPattern; changeMetric: (payload: InfraSnapshotMetricInput) => Action; changeGroupBy: (payload: InfraSnapshotGroupbyInput[]) => Action; changeCustomOptions: (payload: InfraGroupByOptions[]) => Action; diff --git a/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx b/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx index a851f8380b9156..f1957c1fa91a77 100644 --- a/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx +++ b/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx @@ -7,14 +7,13 @@ import { i18n } from '@kbn/i18n'; import React, { useEffect, useState } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { WithKueryAutocompletion } from '../../containers/with_kuery_autocompletion'; import { AutocompleteField } from '../autocomplete_field'; import { isDisplayable } from '../../utils/is_displayable'; -import { esKuery } from '../../../../../../../src/plugins/data/public'; +import { esKuery, IIndexPattern } from '../../../../../../../src/plugins/data/public'; interface Props { - derivedIndexPattern: StaticIndexPattern; + derivedIndexPattern: IIndexPattern; onSubmit: (query: string) => void; value?: string | null; } diff --git a/x-pack/legacy/plugins/infra/public/components/metrics_explorer/toolbar.tsx b/x-pack/legacy/plugins/infra/public/components/metrics_explorer/toolbar.tsx index 1b7a9c6953bf1e..d2a6cec36f6dfc 100644 --- a/x-pack/legacy/plugins/infra/public/components/metrics_explorer/toolbar.tsx +++ b/x-pack/legacy/plugins/infra/public/components/metrics_explorer/toolbar.tsx @@ -7,7 +7,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiSuperDatePicker, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { MetricsExplorerMetric, MetricsExplorerAggregation, @@ -28,7 +28,7 @@ import { MetricExplorerViewState } from '../../pages/infrastructure/metrics_expl import { metricsExplorerViewSavedObjectType } from '../../../common/saved_objects/metrics_explorer_view'; interface Props { - derivedIndexPattern: StaticIndexPattern; + derivedIndexPattern: IIndexPattern; timeRange: MetricsExplorerTimeOptions; options: MetricsExplorerOptions; chartOptions: MetricsExplorerChartOptions; diff --git a/x-pack/legacy/plugins/infra/public/containers/logs/with_log_filter.tsx b/x-pack/legacy/plugins/infra/public/containers/logs/with_log_filter.tsx index e06e83f08680c5..60261fc728ebb1 100644 --- a/x-pack/legacy/plugins/infra/public/containers/logs/with_log_filter.tsx +++ b/x-pack/legacy/plugins/infra/public/containers/logs/with_log_filter.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { connect } from 'react-redux'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { logFilterActions, logFilterSelectors, State } from '../../store'; import { FilterQuery } from '../../store/local/log_filter'; import { convertKueryToElasticSearchQuery } from '../../utils/kuery'; @@ -16,7 +16,7 @@ import { bindPlainActionCreators } from '../../utils/typed_redux'; import { replaceStateKeyInQueryString, UrlStateContainer } from '../../utils/url_state'; interface WithLogFilterProps { - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } export const withLogFilter = connect( diff --git a/x-pack/legacy/plugins/infra/public/containers/metrics_explorer/use_metrics_explorer_data.ts b/x-pack/legacy/plugins/infra/public/containers/metrics_explorer/use_metrics_explorer_data.ts index f514c1a7e0524f..1418d6aef67ac1 100644 --- a/x-pack/legacy/plugins/infra/public/containers/metrics_explorer/use_metrics_explorer_data.ts +++ b/x-pack/legacy/plugins/infra/public/containers/metrics_explorer/use_metrics_explorer_data.ts @@ -7,7 +7,7 @@ import DateMath from '@elastic/datemath'; import { isEqual } from 'lodash'; import { useEffect, useState } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { SourceQuery } from '../../../common/graphql/types'; import { MetricsExplorerAggregation, @@ -24,7 +24,7 @@ function isSameOptions(current: MetricsExplorerOptions, next: MetricsExplorerOpt export function useMetricsExplorerData( options: MetricsExplorerOptions, source: SourceQuery.Query['source']['configuration'], - derivedIndexPattern: StaticIndexPattern, + derivedIndexPattern: IIndexPattern, timerange: MetricsExplorerTimeOptions, afterKey: string | null, signal: any diff --git a/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_filters.tsx b/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_filters.tsx index 379b73f48158a5..0214237ef52d8f 100644 --- a/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_filters.tsx +++ b/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_filters.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { connect } from 'react-redux'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { State, waffleFilterActions, waffleFilterSelectors } from '../../store'; import { FilterQuery } from '../../store/local/waffle_filter'; import { convertKueryToElasticSearchQuery } from '../../utils/kuery'; @@ -16,7 +16,7 @@ import { bindPlainActionCreators } from '../../utils/typed_redux'; import { UrlStateContainer } from '../../utils/url_state'; interface WithWaffleFilterProps { - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } export const withWaffleFilter = connect( diff --git a/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_view_state.tsx b/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_view_state.tsx index 86beb28a7f3ca1..4e8a051bf86970 100644 --- a/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_view_state.tsx +++ b/x-pack/legacy/plugins/infra/public/containers/waffle/with_waffle_view_state.tsx @@ -5,7 +5,7 @@ */ import { connect } from 'react-redux'; import { createSelector } from 'reselect'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { State, waffleOptionsActions, @@ -56,7 +56,7 @@ const selectViewState = createSelector( ); interface Props { - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } export const withWaffleViewState = connect( diff --git a/x-pack/legacy/plugins/infra/public/containers/with_kuery_autocompletion.tsx b/x-pack/legacy/plugins/infra/public/containers/with_kuery_autocompletion.tsx index 8f2ed458cc1187..ba072b754b9571 100644 --- a/x-pack/legacy/plugins/infra/public/containers/with_kuery_autocompletion.tsx +++ b/x-pack/legacy/plugins/infra/public/containers/with_kuery_autocompletion.tsx @@ -6,9 +6,8 @@ import React from 'react'; import { npStart } from 'ui/new_platform'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { AutocompleteSuggestion, IIndexPattern } from 'src/plugins/data/public'; import { RendererFunction } from '../utils/typed_react'; -import { AutocompleteSuggestion } from '../../../../../../src/plugins/data/public'; const getAutocompleteProvider = (language: string) => npStart.plugins.data.autocomplete.getProvider(language); @@ -19,7 +18,7 @@ interface WithKueryAutocompletionLifecycleProps { loadSuggestions: (expression: string, cursorPosition: number, maxSuggestions?: number) => void; suggestions: AutocompleteSuggestion[]; }>; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } interface WithKueryAutocompletionLifecycleState { diff --git a/x-pack/legacy/plugins/infra/public/containers/with_source/with_source.tsx b/x-pack/legacy/plugins/infra/public/containers/with_source/with_source.tsx index 0512888ecd4ea8..e8c609ae0bad9f 100644 --- a/x-pack/legacy/plugins/infra/public/containers/with_source/with_source.tsx +++ b/x-pack/legacy/plugins/infra/public/containers/with_source/with_source.tsx @@ -6,7 +6,7 @@ import React, { useContext } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { SourceQuery, UpdateSourceInput } from '../../graphql/types'; import { RendererFunction } from '../../utils/typed_react'; import { Source } from '../source'; @@ -15,7 +15,7 @@ interface WithSourceProps { children: RendererFunction<{ configuration?: SourceQuery.Query['source']['configuration']; create: (sourceProperties: UpdateSourceInput) => Promise | undefined; - createDerivedIndexPattern: (type: 'logs' | 'metrics' | 'both') => StaticIndexPattern; + createDerivedIndexPattern: (type: 'logs' | 'metrics' | 'both') => IIndexPattern; exists?: boolean; hasFailed: boolean; isLoading: boolean; diff --git a/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/index.tsx b/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/index.tsx index 7a9a705a78887c..63f5a81967618d 100644 --- a/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/index.tsx +++ b/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/index.tsx @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { DocumentTitle } from '../../../components/document_title'; import { MetricsExplorerCharts } from '../../../components/metrics_explorer/charts'; import { MetricsExplorerToolbar } from '../../../components/metrics_explorer/toolbar'; @@ -19,7 +19,7 @@ import { useTrackPageview } from '../../../hooks/use_track_metric'; interface MetricsExplorerPageProps { source: SourceQuery.Query['source']['configuration'] | undefined; - derivedIndexPattern: StaticIndexPattern; + derivedIndexPattern: IIndexPattern; } export const MetricsExplorerPage = ({ source, derivedIndexPattern }: MetricsExplorerPageProps) => { diff --git a/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/use_metric_explorer_state.ts b/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/use_metric_explorer_state.ts index 605a907e077f72..415a6ae89a8b1b 100644 --- a/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/use_metric_explorer_state.ts +++ b/x-pack/legacy/plugins/infra/public/pages/infrastructure/metrics_explorer/use_metric_explorer_state.ts @@ -5,7 +5,7 @@ */ import { useState, useCallback, useContext } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { MetricsExplorerMetric, MetricsExplorerAggregation, @@ -27,7 +27,7 @@ export interface MetricExplorerViewState { export const useMetricsExplorerState = ( source: SourceQuery.Query['source']['configuration'], - derivedIndexPattern: StaticIndexPattern + derivedIndexPattern: IIndexPattern ) => { const [refreshSignal, setRefreshSignal] = useState(0); const [afterKey, setAfterKey] = useState(null); diff --git a/x-pack/legacy/plugins/infra/public/utils/kuery.ts b/x-pack/legacy/plugins/infra/public/utils/kuery.ts index 2e793d53b46226..2292bf272b388f 100644 --- a/x-pack/legacy/plugins/infra/public/utils/kuery.ts +++ b/x-pack/legacy/plugins/infra/public/utils/kuery.ts @@ -4,12 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StaticIndexPattern } from 'ui/index_patterns'; -import { esKuery } from '../../../../../../src/plugins/data/public'; +import { esKuery, IIndexPattern } from '../../../../../../src/plugins/data/public'; export const convertKueryToElasticSearchQuery = ( kueryExpression: string, - indexPattern: StaticIndexPattern + indexPattern: IIndexPattern ) => { try { return kueryExpression diff --git a/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable.tsx b/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable.tsx index 5e87182bba32bc..6fcf2bab8921f0 100644 --- a/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable.tsx +++ b/x-pack/legacy/plugins/lens/public/editor_frame_plugin/embeddable/embeddable.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { Query, TimeRange, esFilters } from 'src/plugins/data/public'; import { ExpressionRenderer } from 'src/plugins/expressions/public'; -import { StaticIndexPattern } from 'src/legacy/core_plugins/data/public'; +import { IIndexPattern } from 'src/plugins/data/public'; import { Subscription } from 'rxjs'; import { Embeddable as AbstractEmbeddable, @@ -24,7 +24,7 @@ export interface LensEmbeddableConfiguration { savedVis: Document; editUrl: string; editable: boolean; - indexPatterns?: StaticIndexPattern[]; + indexPatterns?: IIndexPattern[]; } export interface LensEmbeddableInput extends EmbeddableInput { @@ -34,7 +34,7 @@ export interface LensEmbeddableInput extends EmbeddableInput { } export interface LensEmbeddableOutput extends EmbeddableOutput { - indexPatterns?: StaticIndexPattern[]; + indexPatterns?: IIndexPattern[]; } export class Embeddable extends AbstractEmbeddable { diff --git a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/index_pattern_context.ts b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/index_pattern_context.ts index aa92536da8d1d9..271513ea4b4061 100644 --- a/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/index_pattern_context.ts +++ b/x-pack/legacy/plugins/ml/public/application/jobs/new_job/common/index_pattern_context.ts @@ -6,7 +6,7 @@ import React from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; -export type IndexPatternContextValue = StaticIndexPattern | null; +export type IndexPatternContextValue = IIndexPattern | null; export const IndexPatternContext = React.createContext(null); diff --git a/x-pack/legacy/plugins/siem/public/components/events_viewer/events_viewer.tsx b/x-pack/legacy/plugins/siem/public/components/events_viewer/events_viewer.tsx index c868b7950289a1..ee7853d092784f 100644 --- a/x-pack/legacy/plugins/siem/public/components/events_viewer/events_viewer.tsx +++ b/x-pack/legacy/plugins/siem/public/components/events_viewer/events_viewer.tsx @@ -8,7 +8,6 @@ import { EuiPanel } from '@elastic/eui'; import { getOr, isEmpty, isEqual } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { BrowserFields } from '../../containers/source'; import { TimelineQuery } from '../../containers/timeline'; @@ -29,7 +28,12 @@ import { TimelineRefetch } from '../timeline/refetch_timeline'; import { isCompactFooter } from '../timeline/timeline'; import { ManageTimelineContext } from '../timeline/timeline_context'; import * as i18n from './translations'; -import { Query, esFilters, esQuery } from '../../../../../../../src/plugins/data/public'; +import { + IIndexPattern, + Query, + esFilters, + esQuery, +} from '../../../../../../../src/plugins/data/public'; const DEFAULT_EVENTS_VIEWER_HEIGHT = 500; @@ -46,7 +50,7 @@ interface Props { filters: esFilters.Filter[]; height?: number; id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isLive: boolean; itemsPerPage: number; itemsPerPageOptions: number[]; diff --git a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx index 502fa0583536a8..62788abec1487f 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/hosts/hosts_table/index.tsx @@ -7,7 +7,7 @@ import React, { useMemo, useCallback } from 'react'; import { connect } from 'react-redux'; import { ActionCreator } from 'typescript-fsa'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { hostsActions } from '../../../../store/actions'; import { Direction, @@ -37,7 +37,7 @@ interface OwnProps { data: HostsEdges[]; fakeTotalCount: number; id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isInspect: boolean; loading: boolean; loadPage: (newActivePage: number) => void; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx index abb57c7d7f55ea..ae2723e0065091 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx @@ -7,7 +7,7 @@ import { get } from 'lodash/fp'; import numeral from '@elastic/numeral'; import React from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { CountryFlagAndName } from '../../../source_destination/country_flag'; import { @@ -43,7 +43,7 @@ export type NetworkTopCountriesColumnsIpDetails = [ ]; export const getNetworkTopCountriesColumns = ( - indexPattern: StaticIndexPattern, + indexPattern: IIndexPattern, flowTarget: FlowTargetSourceDest, type: networkModel.NetworkType, tableId: string @@ -157,7 +157,7 @@ export const getNetworkTopCountriesColumns = ( ]; export const getCountriesColumnsCurated = ( - indexPattern: StaticIndexPattern, + indexPattern: IIndexPattern, flowTarget: FlowTargetSourceDest, type: networkModel.NetworkType, tableId: string diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx index 15c48ddf32cd67..81a48ca162e156 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { connect } from 'react-redux'; import { compose } from 'redux'; import { ActionCreator } from 'typescript-fsa'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { networkActions } from '../../../../store/actions'; import { @@ -30,7 +30,7 @@ interface OwnProps { fakeTotalCount: number; flowTargeted: FlowTargetSourceDest; id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isInspect: boolean; loading: boolean; loadPage: (newActivePage: number) => void; diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx index abb4d9ac29f1b0..d9de8091805f6b 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx @@ -7,7 +7,7 @@ import { get } from 'lodash/fp'; import numeral from '@elastic/numeral'; import React from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { CountryFlag } from '../../../source_destination/country_flag'; import { @@ -48,7 +48,7 @@ export type NetworkTopNFlowColumnsIpDetails = [ ]; export const getNetworkTopNFlowColumns = ( - indexPattern: StaticIndexPattern, + indexPattern: IIndexPattern, flowTarget: FlowTargetSourceDest, type: networkModel.NetworkType, tableId: string @@ -233,7 +233,7 @@ export const getNetworkTopNFlowColumns = ( ]; export const getNFlowColumnsCurated = ( - indexPattern: StaticIndexPattern, + indexPattern: IIndexPattern, flowTarget: FlowTargetSourceDest, type: networkModel.NetworkType, tableId: string diff --git a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx index b37a3dce808bd7..12b87a517b4f77 100644 --- a/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx @@ -8,7 +8,7 @@ import React, { useCallback } from 'react'; import { connect } from 'react-redux'; import { compose } from 'redux'; import { ActionCreator } from 'typescript-fsa'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { networkActions } from '../../../../store/actions'; import { @@ -29,7 +29,7 @@ interface OwnProps { fakeTotalCount: number; flowTargeted: FlowTargetSourceDest; id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isInspect: boolean; loading: boolean; loadPage: (newActivePage: number) => void; diff --git a/x-pack/legacy/plugins/siem/public/components/query_bar/index.tsx b/x-pack/legacy/plugins/siem/public/components/query_bar/index.tsx index 591fe6a73359da..bf440e238c2a32 100644 --- a/x-pack/legacy/plugins/siem/public/components/query_bar/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/query_bar/index.tsx @@ -6,11 +6,12 @@ import { isEqual } from 'lodash/fp'; import React, { memo, useState, useEffect, useMemo, useCallback } from 'react'; -import { StaticIndexPattern, IndexPattern } from 'ui/index_patterns'; +import { IndexPattern } from 'ui/index_patterns'; import { SavedQuery, SearchBar } from '../../../../../../../src/legacy/core_plugins/data/public'; import { esFilters, + IIndexPattern, FilterManager, Query, TimeHistory, @@ -24,7 +25,7 @@ export interface QueryBarComponentProps { dateRangeFrom?: string; dateRangeTo?: string; hideSavedQuery?: boolean; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isLoading?: boolean; isRefreshPaused?: boolean; filterQuery: Query; diff --git a/x-pack/legacy/plugins/siem/public/components/search_bar/index.tsx b/x-pack/legacy/plugins/siem/public/components/search_bar/index.tsx index 710c1e230fabab..fa9ff1e16ddb75 100644 --- a/x-pack/legacy/plugins/siem/public/components/search_bar/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/search_bar/index.tsx @@ -10,7 +10,8 @@ import { connect } from 'react-redux'; import { Dispatch } from 'redux'; import { Subscription } from 'rxjs'; import styled from 'styled-components'; -import { StaticIndexPattern, IndexPattern } from 'ui/index_patterns'; +import { IndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { SavedQuery } from 'src/legacy/core_plugins/data/public'; import { OnTimeChangeProps } from '@elastic/eui'; @@ -68,7 +69,7 @@ interface SiemSearchBarDispatch { interface SiemSearchBarProps { id: InputsModelId; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; timelineId?: string; dataTestSubj?: string; } diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx index 35d4cd93c372dc..4b1e723f1bb3a9 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx @@ -7,7 +7,7 @@ import { memo, useEffect } from 'react'; import { connect } from 'react-redux'; import { ActionCreator } from 'typescript-fsa'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { inputsModel, KueryFilterQuery, timelineSelectors, State } from '../../store'; import { inputsActions } from '../../store/actions'; @@ -31,7 +31,7 @@ interface TimelineKqlFetchDispatch { export interface TimelineKqlFetchProps { id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; inputId: InputsModelId; } diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/header/index.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/header/index.tsx index fb00c9aa748460..814d25d9c718d5 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/header/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/header/index.tsx @@ -7,7 +7,7 @@ import { EuiCallOut } from '@elastic/eui'; import * as React from 'react'; import styled from 'styled-components'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { Sort } from '../body/sort'; import { DataProviders } from '../data_providers'; @@ -29,7 +29,7 @@ interface Props { browserFields: BrowserFields; dataProviders: DataProvider[]; id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; onChangeDataProviderKqlQuery: OnChangeDataProviderKqlQuery; onChangeDroppableAndProvider: OnChangeDroppableAndProvider; onDataProviderEdited: OnDataProviderEdited; diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/helpers.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/helpers.tsx index 6a880df27b29c2..0f228a4d3df104 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/helpers.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/helpers.tsx @@ -6,13 +6,17 @@ import { isEmpty, isNumber, get } from 'lodash/fp'; import memoizeOne from 'memoize-one'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { escapeQueryValue, convertToBuildEsQuery } from '../../lib/keury'; import { DataProvider, DataProvidersAnd, EXISTS_OPERATOR } from './data_providers/data_provider'; import { BrowserFields } from '../../containers/source'; -import { Query, esQuery, esFilters } from '../../../../../../../src/plugins/data/public'; +import { + IIndexPattern, + Query, + esQuery, + esFilters, +} from '../../../../../../../src/plugins/data/public'; const convertDateFieldToQuery = (field: string, value: string | number) => `${field}: ${isNumber(value) ? value : new Date(value).valueOf()}`; @@ -103,7 +107,7 @@ export const combineQueries = ({ }: { config: esQuery.EsQueryConfig; dataProviders: DataProvider[]; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; browserFields: BrowserFields; filters: esFilters.Filter[]; kqlQuery: Query; diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/query_bar/index.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/query_bar/index.tsx index a49ec1b7583670..c55ead5e2d5d5c 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/query_bar/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/query_bar/index.tsx @@ -6,10 +6,10 @@ import { isEqual, isEmpty } from 'lodash/fp'; import React, { memo, useCallback, useState, useEffect } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { Subscription } from 'rxjs'; import { + IIndexPattern, Query, esFilters, FilterManager, @@ -38,7 +38,7 @@ export interface QueryBarTimelineComponentProps { from: number; fromStr: string; kqlMode: KqlMode; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isRefreshPaused: boolean; refreshInterval: number; savedQueryId: string | null; diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/index.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/index.tsx index 4af6178a7223b2..31d2b7a2d85f2a 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/index.tsx @@ -8,9 +8,8 @@ import { getOr, isEqual } from 'lodash/fp'; import React, { useCallback } from 'react'; import { connect } from 'react-redux'; import { Dispatch } from 'redux'; -import { StaticIndexPattern } from 'ui/index_patterns'; -import { esFilters } from '../../../../../../../../src/plugins/data/public'; +import { esFilters, IIndexPattern } from '../../../../../../../../src/plugins/data/public'; import { BrowserFields } from '../../../containers/source'; import { convertKueryToElasticSearchQuery } from '../../../lib/keury'; import { @@ -29,7 +28,7 @@ import { SearchOrFilter } from './search_or_filter'; interface OwnProps { browserFields: BrowserFields; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; timelineId: string; } diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx index eaa476bf3e2b27..373d9a50d245b4 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx @@ -8,9 +8,8 @@ import { EuiFlexGroup, EuiFlexItem, EuiSuperSelect, EuiToolTip } from '@elastic/ import * as React from 'react'; import { pure } from 'recompose'; import styled, { createGlobalStyle } from 'styled-components'; -import { StaticIndexPattern } from 'ui/index_patterns'; -import { esFilters } from '../../../../../../../../src/plugins/data/public'; +import { esFilters, IIndexPattern } from '../../../../../../../../src/plugins/data/public'; import { BrowserFields } from '../../../containers/source'; import { KueryFilterQuery, KueryFilterQueryKind } from '../../../store'; import { KqlMode } from '../../../store/timeline/model'; @@ -48,7 +47,7 @@ interface Props { filterQueryDraft: KueryFilterQuery; from: number; fromStr: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isRefreshPaused: boolean; kqlMode: KqlMode; timelineId: string; diff --git a/x-pack/legacy/plugins/siem/public/components/timeline/timeline.tsx b/x-pack/legacy/plugins/siem/public/components/timeline/timeline.tsx index fe100e47a8afb8..ec7d10d2373d49 100644 --- a/x-pack/legacy/plugins/siem/public/components/timeline/timeline.tsx +++ b/x-pack/legacy/plugins/siem/public/components/timeline/timeline.tsx @@ -8,7 +8,6 @@ import { EuiFlexGroup } from '@elastic/eui'; import { getOr, isEmpty } from 'lodash/fp'; import * as React from 'react'; import styled from 'styled-components'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { BrowserFields } from '../../containers/source'; import { TimelineQuery } from '../../containers/timeline'; @@ -36,7 +35,7 @@ import { TimelineHeader } from './header'; import { calculateBodyHeight, combineQueries } from './helpers'; import { TimelineRefetch } from './refetch_timeline'; import { ManageTimelineContext } from './timeline_context'; -import { esQuery, esFilters } from '../../../../../../../src/plugins/data/public'; +import { esQuery, esFilters, IIndexPattern } from '../../../../../../../src/plugins/data/public'; const WrappedByAutoSizer = styled.div` width: 100%; @@ -65,7 +64,7 @@ interface Props { flyoutHeaderHeight: number; flyoutHeight: number; id: string; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; isLive: boolean; itemsPerPage: number; itemsPerPageOptions: number[]; diff --git a/x-pack/legacy/plugins/siem/public/components/url_state/types.ts b/x-pack/legacy/plugins/siem/public/components/url_state/types.ts index 13618125325e1e..4eb6398cc7773d 100644 --- a/x-pack/legacy/plugins/siem/public/components/url_state/types.ts +++ b/x-pack/legacy/plugins/siem/public/components/url_state/types.ts @@ -6,8 +6,7 @@ import ApolloClient from 'apollo-client'; import { ActionCreator } from 'typescript-fsa'; -import { StaticIndexPattern } from 'ui/index_patterns'; -import { Query, esFilters } from 'src/plugins/data/public'; +import { IIndexPattern, Query, esFilters } from 'src/plugins/data/public'; import { UrlInputsModel } from '../../store/inputs/model'; import { RouteSpyState } from '../../utils/route/types'; @@ -70,7 +69,7 @@ export type KeyUrlState = keyof UrlState; export interface UrlStateProps { navTabs: Record; - indexPattern?: StaticIndexPattern; + indexPattern?: IIndexPattern; mapToUrlState?: (value: string) => UrlState; onChange?: (urlState: UrlState, previousUrlState: UrlState) => void; onInitialize?: (urlState: UrlState) => void; @@ -109,7 +108,7 @@ export interface UrlStateToRedux { export interface SetInitialStateFromUrl { apolloClient: ApolloClient | ApolloClient<{}> | undefined; detailName: string | undefined; - indexPattern: StaticIndexPattern | undefined; + indexPattern: IIndexPattern | undefined; pageName: string; updateTimeline: DispatchUpdateTimeline; updateTimelineIsLoading: ActionCreator; diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx index dbc148a96365d2..8cbda9cd5afe98 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx @@ -6,7 +6,7 @@ import { isEmpty, get } from 'lodash/fp'; import { useEffect, useState, Dispatch, SetStateAction } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { getIndexFields, sourceQuery } from '../../../containers/source'; import { useStateToaster } from '../../../components/toasters'; @@ -20,7 +20,7 @@ interface FetchIndexPattern { isLoading: boolean; indices: string[]; indicesExists: boolean; - indexPatterns: StaticIndexPattern | null; + indexPatterns: IIndexPattern | null; } type Return = [FetchIndexPattern, Dispatch>]; @@ -29,7 +29,7 @@ export const useFetchIndexPatterns = (): Return => { const apolloClient = useApolloClient(); const [indices, setIndices] = useState([]); const [indicesExists, setIndicesExists] = useState(false); - const [indexPatterns, setIndexPatterns] = useState(null); + const [indexPatterns, setIndexPatterns] = useState(null); const [isLoading, setIsLoading] = useState(false); const [, dispatchToaster] = useStateToaster(); diff --git a/x-pack/legacy/plugins/siem/public/containers/kuery_autocompletion/index.tsx b/x-pack/legacy/plugins/siem/public/containers/kuery_autocompletion/index.tsx index dac531365c8702..d06f4f6fbbbfa4 100644 --- a/x-pack/legacy/plugins/siem/public/containers/kuery_autocompletion/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/kuery_autocompletion/index.tsx @@ -5,8 +5,10 @@ */ import React, { useState } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; -import { AutocompleteSuggestion } from '../../../../../../../src/plugins/data/public'; +import { + AutocompleteSuggestion, + IIndexPattern, +} from '../../../../../../../src/plugins/data/public'; import { useKibanaPlugins } from '../../lib/compose/kibana_plugins'; type RendererResult = React.ReactElement | null; @@ -18,7 +20,7 @@ interface KueryAutocompletionLifecycleProps { loadSuggestions: (expression: string, cursorPosition: number, maxSuggestions?: number) => void; suggestions: AutocompleteSuggestion[]; }>; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } interface KueryAutocompletionCurrentRequest { diff --git a/x-pack/legacy/plugins/siem/public/containers/source/index.tsx b/x-pack/legacy/plugins/siem/public/containers/source/index.tsx index bc7b87cda6af9c..653d5543c0923b 100644 --- a/x-pack/legacy/plugins/siem/public/containers/source/index.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/source/index.tsx @@ -9,7 +9,7 @@ import { get, keyBy, pick, set } from 'lodash/fp'; import { Query } from 'react-apollo'; import React, { useEffect, useState } from 'react'; import memoizeOne from 'memoize-one'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import chrome from 'ui/chrome'; import { DEFAULT_INDEX_KEY } from '../../../common/constants'; @@ -52,7 +52,7 @@ export const getAllFieldsByName = ( interface WithSourceArgs { indicesExist: boolean; browserFields: BrowserFields; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } interface WithSourceProps { @@ -61,7 +61,7 @@ interface WithSourceProps { } export const getIndexFields = memoizeOne( - (title: string, fields: IndexField[]): StaticIndexPattern => + (title: string, fields: IndexField[]): IIndexPattern => fields && fields.length > 0 ? { fields: fields.map(field => pick(['name', 'searchable', 'type', 'aggregatable'], field)), @@ -118,7 +118,7 @@ export const useWithSource = (sourceId: string, indices: string[]) => { const [loading, updateLoading] = useState(false); const [indicesExist, setIndicesExist] = useState(undefined); const [browserFields, setBrowserFields] = useState(null); - const [indexPattern, setIndexPattern] = useState(null); + const [indexPattern, setIndexPattern] = useState(null); const [errorMessage, updateErrorMessage] = useState(null); const apolloClient = useApolloClient(); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/query_bar/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/query_bar/index.tsx index e3180c150b2390..92b2f557d4cecb 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/query_bar/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/query_bar/index.tsx @@ -7,12 +7,12 @@ import { EuiFormRow } from '@elastic/eui'; import { isEqual } from 'lodash/fp'; import React, { useCallback, useEffect, useState } from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; import { Subscription } from 'rxjs'; import styled from 'styled-components'; import { esFilters, + IIndexPattern, Query, FilterManager, SavedQuery, @@ -35,7 +35,7 @@ interface QueryBarDefineRuleProps { field: FieldHook; idAria: string; isLoading: boolean; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; } const StyledEuiFormRow = styled(EuiFormRow)` diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx b/x-pack/legacy/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx index f136ff72c906da..a9a0693a254471 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx @@ -6,7 +6,7 @@ import { mount } from 'enzyme'; import React from 'react'; -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { MemoryRouter } from 'react-router-dom'; import { mockIndexPattern } from '../../../mock/index_pattern'; @@ -31,10 +31,7 @@ jest.mock('../../../containers/source', () => ({ WithSource: ({ children, }: { - children: (args: { - indicesExist: boolean; - indexPattern: StaticIndexPattern; - }) => React.ReactNode; + children: (args: { indicesExist: boolean; indexPattern: IIndexPattern }) => React.ReactNode; }) => children({ indicesExist: true, indexPattern: mockIndexPattern }), })); diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/details/types.ts b/x-pack/legacy/plugins/siem/public/pages/hosts/details/types.ts index 4f3d34f51fb932..091f0173635af5 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/details/types.ts +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/details/types.ts @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StaticIndexPattern } from 'ui/index_patterns'; import { ActionCreator } from 'typescript-fsa'; -import { Query, esFilters } from 'src/plugins/data/public'; +import { Query, IIndexPattern, esFilters } from 'src/plugins/data/public'; import { InputsModelId } from '../../../store/inputs/constants'; import { HostComponentProps } from '../../../components/link_to/redirect_to_hosts'; @@ -60,7 +59,7 @@ export type HostDetailsNavTab = Record; export type HostDetailsTabsProps = HostBodyComponentDispatchProps & HostsQueryProps & { - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; type: hostsModel.HostsType; filterQuery: string; }; diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/navigation/types.ts b/x-pack/legacy/plugins/siem/public/pages/hosts/navigation/types.ts index 98d931dd7e275f..cfe7953f16ceeb 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/navigation/types.ts +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/navigation/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { NarrowDateRange } from '../../../components/ml/types'; import { hostsModel } from '../../../store'; import { ESTermQuery } from '../../../../common/typed_json'; @@ -46,7 +46,7 @@ interface QueryTabBodyProps { export type HostsComponentsQueryProps = QueryTabBodyProps & { deleteQuery?: ({ id }: { id: string }) => void; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; skip: boolean; setQuery: SetQuery; updateDateRange?: UpdateDateRange; diff --git a/x-pack/legacy/plugins/siem/public/pages/hosts/types.ts b/x-pack/legacy/plugins/siem/public/pages/hosts/types.ts index afc577244f7e0e..2121a3840926a2 100644 --- a/x-pack/legacy/plugins/siem/public/pages/hosts/types.ts +++ b/x-pack/legacy/plugins/siem/public/pages/hosts/types.ts @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StaticIndexPattern } from 'ui/index_patterns'; import { ActionCreator } from 'typescript-fsa'; -import { Query, esFilters } from 'src/plugins/data/public'; +import { IIndexPattern, Query, esFilters } from 'src/plugins/data/public'; import { SiemPageName } from '../home/types'; import { hostsModel } from '../../store'; @@ -34,7 +33,7 @@ export type HostsTabsProps = HostsComponentDispatchProps & HostsQueryProps & { filterQuery: string; type: hostsModel.HostsType; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; }; export type HostsQueryProps = GlobalTimeArgs; diff --git a/x-pack/legacy/plugins/siem/public/pages/network/ip_details/types.ts b/x-pack/legacy/plugins/siem/public/pages/network/ip_details/types.ts index e0029d8d219ebf..d29f58e90360eb 100644 --- a/x-pack/legacy/plugins/siem/public/pages/network/ip_details/types.ts +++ b/x-pack/legacy/plugins/siem/public/pages/network/ip_details/types.ts @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StaticIndexPattern } from 'ui/index_patterns'; import { ActionCreator } from 'typescript-fsa'; -import { Query, esFilters } from 'src/plugins/data/public'; +import { IIndexPattern, Query, esFilters } from 'src/plugins/data/public'; import { NetworkType } from '../../../store/network/model'; import { ESTermQuery } from '../../../../common/typed_json'; @@ -68,5 +67,5 @@ export type TlsQueryTableComponentProps = OwnProps & { export type NetworkWithIndexComponentsQueryTableProps = OwnProps & { flowTarget: FlowTargetSourceDest; - indexPattern: StaticIndexPattern; + indexPattern: IIndexPattern; }; diff --git a/x-pack/legacy/plugins/siem/public/pages/network/navigation/types.ts b/x-pack/legacy/plugins/siem/public/pages/network/navigation/types.ts index bc63e26f71ebaf..b8ad8877bf3c1b 100644 --- a/x-pack/legacy/plugins/siem/public/pages/network/navigation/types.ts +++ b/x-pack/legacy/plugins/siem/public/pages/network/navigation/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StaticIndexPattern } from 'ui/index_patterns'; +import { IIndexPattern } from 'src/plugins/data/public'; import { NavTab } from '../../../components/navigation/types'; import { FlowTargetSourceDest } from '../../../graphql/types'; @@ -29,7 +29,7 @@ interface QueryTabBodyProps extends Pick> From 5b84b6904241ab5aea8a47780fb9b4ca25a46c88 Mon Sep 17 00:00:00 2001 From: Maryia Lapata Date: Mon, 2 Dec 2019 14:19:54 +0300 Subject: [PATCH 11/39] [Vis] TableVis uses local angular (#50759) * TableVis uses local angular * Clean up * Fix TS * Update angular_config * Fix export * Update render_app.ts * Cetralize ui deps * Fix loading KbnTableVisController in Dashboard * Fix graph * Rename const * Add table vis mocks * Fix kbn_top_nav * Add TS for test * Complete conversion paginated_table test to Jest * Convert table_vis_controller test to Jest * Convert table_vis_controller test to Jest * Create agg_table.test.ts * Fix mocha tests * Refactoring * Remove module dep * Remove LegacyDependenciesPlugin * Move file * Fix path * Fix path * Fix TS * Fix Jest test --- .../public/__tests__/table_vis_controller.js | 193 ----- .../public/agg_table/__tests__/agg_table.js | 16 +- .../agg_table/__tests__/agg_table_group.js | 16 +- .../public/agg_table/agg_table.js | 2 +- .../public/components/table_vis_options.tsx | 3 +- .../public/get_inner_angular.ts | 104 +++ .../vis_type_table/public/legacy.ts | 7 +- .../vis_type_table/public/legacy_imports.ts | 46 ++ .../__tests__/paginated_table.js | 419 ---------- .../paginated_table/paginated_table.test.ts | 713 ++++++++++++++++++ .../vis_type_table/public/plugin.ts | 6 +- .../vis_type_table/public/shim/index.ts | 20 - ...pendencies_plugin.ts => table_vis.mock.ts} | 36 +- .../public/table_vis_controller.test.ts | 257 +++++++ .../public/table_vis_fn.test.ts | 6 +- .../{shim => }/table_vis_legacy_module.ts | 25 +- .../public/table_vis_request_handler.ts | 3 +- .../vis_type_table/public/table_vis_type.ts | 13 +- .../vis_type_table/public/vis_controller.ts | 104 +++ src/legacy/ui/public/directives/paginate.js | 338 +++++---- .../new_platform/new_platform.karma_mock.js | 12 +- 21 files changed, 1473 insertions(+), 866 deletions(-) delete mode 100644 src/legacy/core_plugins/vis_type_table/public/__tests__/table_vis_controller.js create mode 100644 src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts create mode 100644 src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts delete mode 100644 src/legacy/core_plugins/vis_type_table/public/paginated_table/__tests__/paginated_table.js create mode 100644 src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts delete mode 100644 src/legacy/core_plugins/vis_type_table/public/shim/index.ts rename src/legacy/core_plugins/vis_type_table/public/{shim/legacy_dependencies_plugin.ts => table_vis.mock.ts} (51%) create mode 100644 src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts rename src/legacy/core_plugins/vis_type_table/public/{shim => }/table_vis_legacy_module.ts (65%) create mode 100644 src/legacy/core_plugins/vis_type_table/public/vis_controller.ts diff --git a/src/legacy/core_plugins/vis_type_table/public/__tests__/table_vis_controller.js b/src/legacy/core_plugins/vis_type_table/public/__tests__/table_vis_controller.js deleted file mode 100644 index e22dd4caa6d011..00000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/__tests__/table_vis_controller.js +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import $ from 'jquery'; -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; -import { legacyResponseHandlerProvider } from 'ui/vis/response_handlers/legacy'; -import { Vis } from '../../../visualizations/public'; -import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; -import { AppStateProvider } from 'ui/state_management/app_state'; -import { tabifyAggResponse } from 'ui/agg_response/tabify'; - -import { tableVisTypeDefinition } from '../table_vis_type'; -import { setup as visualizationsSetup } from '../../../visualizations/public/np_ready/public/legacy'; - -describe('Table Vis - Controller', async function () { - let $rootScope; - let $compile; - let Private; - let $scope; - let $el; - let fixtures; - let AppState; - let tableAggResponse; - let tabifiedResponse; - - ngMock.inject(function () { - - visualizationsSetup.types.createBaseVisualization(tableVisTypeDefinition); - }); - - beforeEach(ngMock.module('kibana', 'kibana/table_vis')); - beforeEach( - ngMock.inject(function ($injector) { - Private = $injector.get('Private'); - $rootScope = $injector.get('$rootScope'); - $compile = $injector.get('$compile'); - fixtures = require('fixtures/fake_hierarchical_data'); - AppState = Private(AppStateProvider); - tableAggResponse = legacyResponseHandlerProvider().handler; - }) - ); - - function OneRangeVis(params) { - return new Vis(Private(FixturesStubbedLogstashIndexPatternProvider), { - type: 'table', - params: params || {}, - aggs: [ - { type: 'count', schema: 'metric' }, - { - type: 'range', - schema: 'bucket', - params: { - field: 'bytes', - ranges: [{ from: 0, to: 1000 }, { from: 1000, to: 2000 }], - }, - }, - ], - }); - } - - const dimensions = { - buckets: [ - { - accessor: 0, - }, - ], - metrics: [ - { - accessor: 1, - format: { id: 'range' }, - }, - ], - }; - - // basically a parameterized beforeEach - function initController(vis) { - vis.aggs.aggs.forEach(function (agg, i) { - agg.id = 'agg_' + (i + 1); - }); - - tabifiedResponse = tabifyAggResponse(vis.aggs, fixtures.oneRangeBucket); - $rootScope.vis = vis; - $rootScope.visParams = vis.params; - $rootScope.uiState = new AppState({ uiState: {} }).makeStateful('uiState'); - $rootScope.renderComplete = () => {}; - $rootScope.newScope = function (scope) { - $scope = scope; - }; - - $el = $('
') - .attr('ng-controller', 'KbnTableVisController') - .attr('ng-init', 'newScope(this)'); - - $compile($el)($rootScope); - } - - // put a response into the controller - function attachEsResponseToScope(resp) { - $rootScope.esResponse = resp; - $rootScope.$apply(); - } - - // remove the response from the controller - function removeEsResponseFromScope() { - delete $rootScope.esResponse; - $rootScope.renderComplete = () => {}; - $rootScope.$apply(); - } - - it('exposes #tableGroups and #hasSomeRows when a response is attached to scope', async function () { - const vis = new OneRangeVis(); - initController(vis); - - expect(!$scope.tableGroups).to.be.ok(); - expect(!$scope.hasSomeRows).to.be.ok(); - - attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); - - expect($scope.hasSomeRows).to.be(true); - expect($scope.tableGroups).to.have.property('tables'); - expect($scope.tableGroups.tables).to.have.length(1); - expect($scope.tableGroups.tables[0].columns).to.have.length(2); - expect($scope.tableGroups.tables[0].rows).to.have.length(2); - }); - - it('clears #tableGroups and #hasSomeRows when the response is removed', async function () { - const vis = new OneRangeVis(); - initController(vis); - - attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); - removeEsResponseFromScope(); - - expect(!$scope.hasSomeRows).to.be.ok(); - expect(!$scope.tableGroups).to.be.ok(); - }); - - it('sets the sort on the scope when it is passed as a vis param', async function () { - const sortObj = { - columnIndex: 1, - direction: 'asc', - }; - const vis = new OneRangeVis({ sort: sortObj }); - initController(vis); - - attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); - - expect($scope.sort.columnIndex).to.equal(sortObj.columnIndex); - expect($scope.sort.direction).to.equal(sortObj.direction); - }); - - it('sets #hasSomeRows properly if the table group is empty', async function () { - const vis = new OneRangeVis(); - initController(vis); - - tabifiedResponse.rows = []; - - attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); - - expect($scope.hasSomeRows).to.be(false); - expect(!$scope.tableGroups).to.be.ok(); - }); - - it('passes partialRows:true to tabify based on the vis params', function () { - const vis = new OneRangeVis({ showPartialRows: true }); - initController(vis); - - expect(vis.isHierarchical()).to.equal(true); - }); - - it('passes partialRows:false to tabify based on the vis params', function () { - const vis = new OneRangeVis({ showPartialRows: false }); - initController(vis); - - expect(vis.isHierarchical()).to.equal(false); - }); -}); diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js index 2978856a3511d9..25a28333b07ff9 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js +++ b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js @@ -23,14 +23,15 @@ import ngMock from 'ng_mock'; import expect from '@kbn/expect'; import fixtures from 'fixtures/fake_hierarchical_data'; import sinon from 'sinon'; -import { legacyResponseHandlerProvider } from 'ui/vis/response_handlers/legacy'; +import { legacyResponseHandlerProvider, tabifyAggResponse, npStart } from '../../legacy_imports'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; -import { Vis } from '../../../../visualizations/public'; -import { tabifyAggResponse } from 'ui/agg_response/tabify'; import { round } from 'lodash'; +import { Vis } from '../../../../visualizations/public'; import { tableVisTypeDefinition } from '../../table_vis_type'; import { setup as visualizationsSetup } from '../../../../visualizations/public/np_ready/public/legacy'; +import { getAngularModule } from '../../get_inner_angular'; +import { initTableVisLegacyModule } from '../../table_vis_legacy_module'; describe('Table Vis - AggTable Directive', function () { let $rootScope; @@ -96,11 +97,18 @@ describe('Table Vis - AggTable Directive', function () { ); }; + const initLocalAngular = () => { + const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); + initTableVisLegacyModule(tableVisModule); + }; + + beforeEach(initLocalAngular); + ngMock.inject(function () { visualizationsSetup.types.createBaseVisualization(tableVisTypeDefinition); }); - beforeEach(ngMock.module('kibana')); + beforeEach(ngMock.module('kibana/table_vis')); beforeEach( ngMock.inject(function ($injector, Private, config) { tableAggResponse = legacyResponseHandlerProvider().handler; diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js index f4e3a8e36605cf..be981829ae909a 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js +++ b/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js @@ -21,10 +21,11 @@ import $ from 'jquery'; import ngMock from 'ng_mock'; import expect from '@kbn/expect'; import fixtures from 'fixtures/fake_hierarchical_data'; -import { legacyResponseHandlerProvider } from 'ui/vis/response_handlers/legacy'; +import { legacyResponseHandlerProvider, tabifyAggResponse, npStart } from '../../legacy_imports'; import FixturesStubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern'; -import { Vis } from 'ui/vis'; -import { tabifyAggResponse } from 'ui/agg_response/tabify'; +import { Vis } from '../../../../visualizations/public'; +import { getAngularModule } from '../../get_inner_angular'; +import { initTableVisLegacyModule } from '../../table_vis_legacy_module'; describe('Table Vis - AggTableGroup Directive', function () { let $rootScope; @@ -52,7 +53,14 @@ describe('Table Vis - AggTableGroup Directive', function () { tabifiedData.threeTermBuckets = tabifyAggResponse(vis2.aggs, fixtures.threeTermBuckets); }; - beforeEach(ngMock.module('kibana')); + const initLocalAngular = () => { + const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); + initTableVisLegacyModule(tableVisModule); + }; + + beforeEach(initLocalAngular); + + beforeEach(ngMock.module('kibana/table_vis')); beforeEach( ngMock.inject(function ($injector, Private) { // this is provided in table_vis_controller.js diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js b/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js index 06cca15f885568..8bc275f5255bbe 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js +++ b/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js @@ -18,7 +18,7 @@ */ import _ from 'lodash'; import aggTableTemplate from './agg_table.html'; -import { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; +import { getFormat } from '../legacy_imports'; import { i18n } from '@kbn/i18n'; export function KbnAggTable(config, RecursionHelper) { diff --git a/src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx b/src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx index fdcd531ad6930a..4d69af59b0c99f 100644 --- a/src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx +++ b/src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx @@ -23,8 +23,7 @@ import { EuiIconTip, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { tabifyGetColumns } from 'ui/agg_response/tabify/_get_columns'; -import { VisOptionsProps } from 'ui/vis/editors/default'; +import { tabifyGetColumns, VisOptionsProps } from '../legacy_imports'; import { NumberInputOption, SwitchOption, diff --git a/src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts b/src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts new file mode 100644 index 00000000000000..9f3a8327c9ad94 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts @@ -0,0 +1,104 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// inner angular imports +// these are necessary to bootstrap the local angular. +// They can stay even after NP cutover +import angular from 'angular'; +import 'ui/angular-bootstrap'; +import 'angular-recursion'; +import { i18nDirective, i18nFilter, I18nProvider } from '@kbn/i18n/angular'; +import { CoreStart, LegacyCoreStart, IUiSettingsClient } from 'kibana/public'; +import { + PrivateProvider, + PaginateDirectiveProvider, + PaginateControlsDirectiveProvider, + watchMultiDecorator, + KbnAccessibleClickProvider, + StateManagementConfigProvider, + configureAppAngularModule, +} from './legacy_imports'; + +const thirdPartyAngularDependencies = ['ngSanitize', 'ui.bootstrap', 'RecursionHelper']; + +export function getAngularModule(name: string, core: CoreStart) { + const uiModule = getInnerAngular(name, core); + configureAppAngularModule(uiModule, core as LegacyCoreStart, true); + return uiModule; +} + +let initialized = false; + +export function getInnerAngular(name = 'kibana/table_vis', core: CoreStart) { + if (!initialized) { + createLocalPrivateModule(); + createLocalI18nModule(); + createLocalConfigModule(core.uiSettings); + createLocalPaginateModule(); + initialized = true; + } + return angular + .module(name, [ + ...thirdPartyAngularDependencies, + 'tableVisPaginate', + 'tableVisConfig', + 'tableVisPrivate', + 'tableVisI18n', + ]) + .config(watchMultiDecorator) + .directive('kbnAccessibleClick', KbnAccessibleClickProvider); +} + +function createLocalPrivateModule() { + angular.module('tableVisPrivate', []).provider('Private', PrivateProvider); +} + +function createLocalConfigModule(uiSettings: IUiSettingsClient) { + angular + .module('tableVisConfig', ['tableVisPrivate']) + .provider('stateManagementConfig', StateManagementConfigProvider) + .provider('config', function() { + return { + $get: () => ({ + get: (value: string) => { + return uiSettings ? uiSettings.get(value) : undefined; + }, + // set method is used in agg_table mocha test + set: (key: string, value: string) => { + return uiSettings ? uiSettings.set(key, value) : undefined; + }, + }), + }; + }); +} + +function createLocalI18nModule() { + angular + .module('tableVisI18n', []) + .provider('i18n', I18nProvider) + .filter('i18n', i18nFilter) + .directive('i18nId', i18nDirective); +} + +function createLocalPaginateModule() { + angular + .module('tableVisPaginate', []) + .directive('paginate', PaginateDirectiveProvider) + .directive('paginateControls', PaginateControlsDirectiveProvider); +} diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy.ts b/src/legacy/core_plugins/vis_type_table/public/legacy.ts index 8513622dec9aad..e5b2619ef29702 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy.ts +++ b/src/legacy/core_plugins/vis_type_table/public/legacy.ts @@ -18,20 +18,15 @@ */ import { PluginInitializerContext } from 'kibana/public'; -import { npSetup, npStart } from 'ui/new_platform'; +import { npSetup, npStart } from './legacy_imports'; import { plugin } from '.'; import { TablePluginSetupDependencies } from './plugin'; import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; -import { LegacyDependenciesPlugin } from './shim'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, visualizations: visualizationsSetup, - - // Temporary solution - // It will be removed when all dependent services are migrated to the new platform. - __LEGACY: new LegacyDependenciesPlugin(), }; const pluginInstance = plugin({} as PluginInitializerContext); diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts b/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts new file mode 100644 index 00000000000000..a372eced3e34b6 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts @@ -0,0 +1,46 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { npSetup, npStart } from 'ui/new_platform'; +export { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; +export { AggConfig } from 'ui/vis'; +export { AggGroupNames, VisOptionsProps } from 'ui/vis/editors/default'; +// @ts-ignore +export { Schemas } from 'ui/vis/editors/default/schemas'; +// @ts-ignore +export { legacyResponseHandlerProvider } from 'ui/vis/response_handlers/legacy'; + +// @ts-ignore +export { PrivateProvider } from 'ui/private/private'; +// @ts-ignore +export { PaginateDirectiveProvider } from 'ui/directives/paginate'; +// @ts-ignore +export { PaginateControlsDirectiveProvider } from 'ui/directives/paginate'; +// @ts-ignore +export { watchMultiDecorator } from 'ui/directives/watch_multi/watch_multi'; + +// @ts-ignore +export { KbnAccessibleClickProvider } from 'ui/accessibility/kbn_accessible_click'; +// @ts-ignore +export { StateManagementConfigProvider } from 'ui/state_management/config_provider'; +export { configureAppAngularModule } from 'ui/legacy_compat'; + +export { tabifyGetColumns } from 'ui/agg_response/tabify/_get_columns'; +// @ts-ignore +export { tabifyAggResponse } from 'ui/agg_response/tabify'; diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/__tests__/paginated_table.js b/src/legacy/core_plugins/vis_type_table/public/paginated_table/__tests__/paginated_table.js deleted file mode 100644 index d146a1bddf2601..00000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/paginated_table/__tests__/paginated_table.js +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import _ from 'lodash'; -import expect from '@kbn/expect'; -import ngMock from 'ng_mock'; - -import $ from 'jquery'; - -describe('Table Vis - Paginated table', function () { - let $el; - let $rootScope; - let $compile; - let $scope; - const defaultPerPage = 10; - - const makeData = function (colCount, rowCount) { - let columns = []; - let rows = []; - - if (_.isNumber(colCount)) { - _.times(colCount, function (i) { - columns.push({ id: i, title: 'column' + i, formatter: { convert: _.identity } }); - }); - } else { - columns = colCount.map((col, i) => ({ - id: i, - title: col.title, - formatter: col.formatter || { convert: _.identity } - })); - } - - if (_.isNumber(rowCount)) { - _.times(rowCount, function (row) { - const rowItems = {}; - - _.times(columns.length, function (col) { - rowItems[col] = 'item' + col + row; - }); - - rows.push(rowItems); - }); - } else { - rows = rowCount.map(row => { - const newRow = {}; - row.forEach((v, i) => newRow[i] = v); - return newRow; - }); - } - - return { - columns: columns, - rows: rows - }; - }; - - const renderTable = function (table, cols, rows, perPage, sort, linkToTop) { - $scope.table = table || { columns: [], rows: [] }; - $scope.cols = cols || []; - $scope.rows = rows || []; - $scope.perPage = perPage || defaultPerPage; - $scope.sort = sort || {}; - $scope.linkToTop = linkToTop; - - const template = ` - `; - $el = $compile(template)($scope); - - $scope.$digest(); - }; - - beforeEach(ngMock.module('kibana')); - beforeEach(ngMock.inject(function (_$rootScope_, _$compile_) { - $rootScope = _$rootScope_; - $compile = _$compile_; - $scope = $rootScope.$new(); - })); - - describe('rendering', function () { - it('should not display without rows', function () { - const cols = [{ - title: 'test1' - }]; - const rows = []; - - renderTable(null, cols, rows); - expect($el.children().length).to.be(0); - }); - - it('should render columns and rows', function () { - const data = makeData(2, 2); - const cols = data.columns; - const rows = data.rows; - - renderTable(data, cols, rows); - expect($el.children().length).to.be(1); - const tableRows = $el.find('tbody tr'); - // should contain the row data - expect(tableRows.eq(0).find('td').eq(0).text()).to.be(rows[0][0]); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be(rows[0][1]); - expect(tableRows.eq(1).find('td').eq(0).text()).to.be(rows[1][0]); - expect(tableRows.eq(1).find('td').eq(1).text()).to.be(rows[1][1]); - }); - - it('should paginate rows', function () { - // note: paginate truncates pages, so don't make too many - const rowCount = _.random(16, 24); - const perPageCount = _.random(5, 8); - const data = makeData(3, rowCount); - const pageCount = Math.ceil(rowCount / perPageCount); - - renderTable(data, data.columns, data.rows, perPageCount); - const tableRows = $el.find('tbody tr'); - expect(tableRows.length).to.be(perPageCount); - // add 2 for the first and last page links - expect($el.find('paginate-controls button').length).to.be(pageCount + 2); - }); - - it('should not show blank rows on last page', function () { - const rowCount = 7; - const perPageCount = 10; - const data = makeData(3, rowCount); - - renderTable(data, data.columns, data.rows, perPageCount, null); - const tableRows = $el.find('tbody tr'); - expect(tableRows.length).to.be(rowCount); - }); - - it('should not show link to top when not set', function () { - const data = makeData(5, 5); - renderTable(data, data.columns, data.rows, 10, null); - - const linkToTop = $el.find('[data-test-subj="paginateControlsLinkToTop"]'); - expect(linkToTop.length).to.be(0); - }); - - it('should show link to top when set', function () { - const data = makeData(5, 5); - renderTable(data, data.columns, data.rows, 10, null, true); - - const linkToTop = $el.find('[data-test-subj="paginateControlsLinkToTop"]'); - expect(linkToTop.length).to.be(1); - }); - - }); - - describe('sorting', function () { - let data; - let lastRowIndex; - let paginatedTable; - - beforeEach(function () { - data = makeData(3, [ - ['bbbb', 'aaaa', 'zzzz'], - ['cccc', 'cccc', 'aaaa'], - ['zzzz', 'bbbb', 'bbbb'], - ['aaaa', 'zzzz', 'cccc'], - ]); - - lastRowIndex = data.rows.length - 1; - renderTable(data, data.columns, data.rows); - paginatedTable = $el.isolateScope().paginatedTable; - }); - - // afterEach(function () { - // $scope.$destroy(); - // }); - - it('should not sort by default', function () { - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be(data.rows[0][0]); - expect(tableRows.eq(lastRowIndex).find('td').eq(0).text()).to.be(data.rows[lastRowIndex][0]); - }); - - it('should do nothing when sorting by invalid column id', function () { - // sortColumn - paginatedTable.sortColumn(999); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('bbbb'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('aaaa'); - expect(tableRows.eq(0).find('td').eq(2).text()).to.be('zzzz'); - }); - - it('should do nothing when sorting by non sortable column', function () { - data.columns[0].sortable = false; - - // sortColumn - paginatedTable.sortColumn(0); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('bbbb'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('aaaa'); - expect(tableRows.eq(0).find('td').eq(2).text()).to.be('zzzz'); - }); - - it('should set the sort direction to asc when it\'s not explicitly set', function () { - paginatedTable.sortColumn(1); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(2).find('td').eq(1).text()).to.be('cccc'); - expect(tableRows.eq(1).find('td').eq(1).text()).to.be('bbbb'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('aaaa'); - }); - - it('should allow you to explicitly set the sort direction', function () { - paginatedTable.sortColumn(1, 'desc'); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('zzzz'); - expect(tableRows.eq(1).find('td').eq(1).text()).to.be('cccc'); - expect(tableRows.eq(2).find('td').eq(1).text()).to.be('bbbb'); - }); - - it('should sort ascending on first invocation', function () { - // sortColumn - paginatedTable.sortColumn(0); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('aaaa'); - expect(tableRows.eq(lastRowIndex).find('td').eq(0).text()).to.be('zzzz'); - }); - - it('should sort descending on second invocation', function () { - // sortColumn - paginatedTable.sortColumn(0); - paginatedTable.sortColumn(0); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('zzzz'); - expect(tableRows.eq(lastRowIndex).find('td').eq(0).text()).to.be('aaaa'); - }); - - it('should clear sorting on third invocation', function () { - // sortColumn - paginatedTable.sortColumn(0); - paginatedTable.sortColumn(0); - paginatedTable.sortColumn(0); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be(data.rows[0][0]); - expect(tableRows.eq(lastRowIndex).find('td').eq(0).text()).to.be('aaaa'); - }); - - it('should sort new column ascending', function () { - // sort by first column - paginatedTable.sortColumn(0); - $scope.$digest(); - - // sort by second column - paginatedTable.sortColumn(1); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('aaaa'); - expect(tableRows.eq(lastRowIndex).find('td').eq(1).text()).to.be('zzzz'); - }); - - }); - - describe('sorting duplicate columns', function () { - let data; - let paginatedTable; - const colText = 'test row'; - - beforeEach(function () { - const cols = [ - { title: colText }, - { title: colText }, - { title: colText } - ]; - const rows = [ - ['bbbb', 'aaaa', 'zzzz'], - ['cccc', 'cccc', 'aaaa'], - ['zzzz', 'bbbb', 'bbbb'], - ['aaaa', 'zzzz', 'cccc'], - ]; - data = makeData(cols, rows); - - renderTable(data, data.columns, data.rows); - paginatedTable = $el.isolateScope().paginatedTable; - }); - - it('should have duplicate column titles', function () { - const columns = $el.find('thead th span'); - columns.each(function () { - expect($(this).text()).to.be(colText); - }); - }); - - it('should handle sorting on columns with the same name', function () { - // sort by the last column - paginatedTable.sortColumn(2); - $scope.$digest(); - - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('cccc'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('cccc'); - expect(tableRows.eq(0).find('td').eq(2).text()).to.be('aaaa'); - expect(tableRows.eq(1).find('td').eq(2).text()).to.be('bbbb'); - expect(tableRows.eq(2).find('td').eq(2).text()).to.be('cccc'); - expect(tableRows.eq(3).find('td').eq(2).text()).to.be('zzzz'); - }); - - it('should sort correctly between columns', function () { - // sort by the last column - paginatedTable.sortColumn(2); - $scope.$digest(); - - let tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('cccc'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('cccc'); - expect(tableRows.eq(0).find('td').eq(2).text()).to.be('aaaa'); - - // sort by the first column - paginatedTable.sortColumn(0); - $scope.$digest(); - - tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('td').eq(0).text()).to.be('aaaa'); - expect(tableRows.eq(0).find('td').eq(1).text()).to.be('zzzz'); - expect(tableRows.eq(0).find('td').eq(2).text()).to.be('cccc'); - - expect(tableRows.eq(1).find('td').eq(0).text()).to.be('bbbb'); - expect(tableRows.eq(2).find('td').eq(0).text()).to.be('cccc'); - expect(tableRows.eq(3).find('td').eq(0).text()).to.be('zzzz'); - }); - - it('should not sort duplicate columns', function () { - paginatedTable.sortColumn(1); - $scope.$digest(); - - const sorters = $el.find('thead th i'); - expect(sorters.eq(0).hasClass('fa-sort')).to.be(true); - expect(sorters.eq(1).hasClass('fa-sort')).to.be(false); - expect(sorters.eq(2).hasClass('fa-sort')).to.be(true); - }); - - }); - - - describe('object rows', function () { - let cols; - let rows; - let paginatedTable; - - beforeEach(function () { - cols = [{ - title: 'object test', - id: 0, - formatter: { convert: val => { - return val === 'zzz' ? '

hello

' : val; - } } - }]; - rows = [ - ['aaaa'], - ['zzz'], - ['bbbb'] - ]; - renderTable({ columns: cols, rows }, cols, rows); - paginatedTable = $el.isolateScope().paginatedTable; - }); - - it('should append object markup', function () { - const tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('h1').length).to.be(0); - expect(tableRows.eq(1).find('h1').length).to.be(1); - expect(tableRows.eq(2).find('h1').length).to.be(0); - }); - - it('should sort using object value', function () { - paginatedTable.sortColumn(0); - $scope.$digest(); - let tableRows = $el.find('tbody tr'); - expect(tableRows.eq(0).find('h1').length).to.be(0); - expect(tableRows.eq(1).find('h1').length).to.be(0); - // html row should be the last row - expect(tableRows.eq(2).find('h1').length).to.be(1); - - paginatedTable.sortColumn(0); - $scope.$digest(); - tableRows = $el.find('tbody tr'); - // html row should be the first row - expect(tableRows.eq(0).find('h1').length).to.be(1); - expect(tableRows.eq(1).find('h1').length).to.be(0); - expect(tableRows.eq(2).find('h1').length).to.be(0); - }); - }); -}); diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts b/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts new file mode 100644 index 00000000000000..781782e42fbaf2 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts @@ -0,0 +1,713 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { isNumber, times, identity, random } from 'lodash'; +import angular, { IRootScopeService, IScope, ICompileService } from 'angular'; +import $ from 'jquery'; +import 'angular-sanitize'; +import 'angular-mocks'; +import '../table_vis.mock'; + +import { getAngularModule } from '../get_inner_angular'; +import { initTableVisLegacyModule } from '../table_vis_legacy_module'; +import { npStart } from '../legacy_imports'; + +interface Sort { + columnIndex: number; + direction: string; +} + +interface Row { + [key: string]: number | string; +} + +interface Column { + id?: string; + title: string; + formatter?: { + convert?: (val: string) => string; + }; + sortable?: boolean; +} + +interface Table { + columns: Column[]; + rows: Row[]; +} + +interface PaginatedTableScope extends IScope { + table?: Table; + cols?: Column[]; + rows?: Row[]; + perPage?: number; + sort?: Sort; + linkToTop?: boolean; +} + +describe('Table Vis - Paginated table', () => { + let $el: JQuery; + let $rootScope: IRootScopeService; + let $compile: ICompileService; + let $scope: PaginatedTableScope; + const defaultPerPage = 10; + let paginatedTable: any; + + const initLocalAngular = () => { + const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); + initTableVisLegacyModule(tableVisModule); + }; + + beforeEach(initLocalAngular); + beforeEach(angular.mock.module('kibana/table_vis')); + + beforeEach( + angular.mock.inject((_$rootScope_: IRootScopeService, _$compile_: ICompileService) => { + $rootScope = _$rootScope_; + $compile = _$compile_; + $scope = $rootScope.$new(); + }) + ); + + afterEach(() => { + $scope.$destroy(); + }); + + const makeData = (colCount: number | Column[], rowCount: number | string[][]) => { + let columns: Column[] = []; + let rows: Row[] = []; + + if (isNumber(colCount)) { + times(colCount, i => { + columns.push({ id: `${i}`, title: `column${i}`, formatter: { convert: identity } }); + }); + } else { + columns = colCount.map( + (col, i) => + ({ + id: `${i}`, + title: col.title, + formatter: col.formatter || { convert: identity }, + } as Column) + ); + } + + if (isNumber(rowCount)) { + times(rowCount, row => { + const rowItems: Row = {}; + + times(columns.length, col => { + rowItems[`${col}`] = `item-${col}-${row}`; + }); + + rows.push(rowItems); + }); + } else { + rows = rowCount.map((row: string[]) => { + const newRow: Row = {}; + row.forEach((v, i) => (newRow[i] = v)); + return newRow; + }); + } + + return { + columns, + rows, + }; + }; + + const renderTable = ( + table: { columns: Column[]; rows: Row[] } | null, + cols: Column[], + rows: Row[], + perPage?: number, + sort?: Sort, + linkToTop?: boolean + ) => { + $scope.table = table || { columns: [], rows: [] }; + $scope.cols = cols || []; + $scope.rows = rows || []; + $scope.perPage = perPage || defaultPerPage; + $scope.sort = sort; + $scope.linkToTop = linkToTop; + + const template = ` + `; + const element = $compile(template)($scope); + $el = $(element); + + $scope.$digest(); + paginatedTable = element.controller('paginatedTable'); + }; + + describe('rendering', () => { + test('should not display without rows', () => { + const cols: Column[] = [ + { + id: 'col-1-1', + title: 'test1', + }, + ]; + const rows: Row[] = []; + + renderTable(null, cols, rows); + expect($el.children().length).toBe(0); + }); + + test('should render columns and rows', () => { + const data = makeData(2, 2); + const cols = data.columns; + const rows = data.rows; + + renderTable(data, cols, rows); + expect($el.children().length).toBe(1); + const tableRows = $el.find('tbody tr'); + + // should contain the row data + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe(rows[0][0]); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe(rows[0][1]); + expect( + tableRows + .eq(1) + .find('td') + .eq(0) + .text() + ).toBe(rows[1][0]); + expect( + tableRows + .eq(1) + .find('td') + .eq(1) + .text() + ).toBe(rows[1][1]); + }); + + test('should paginate rows', () => { + // note: paginate truncates pages, so don't make too many + const rowCount = random(16, 24); + const perPageCount = random(5, 8); + const data = makeData(3, rowCount); + const pageCount = Math.ceil(rowCount / perPageCount); + + renderTable(data, data.columns, data.rows, perPageCount); + const tableRows = $el.find('tbody tr'); + expect(tableRows.length).toBe(perPageCount); + // add 2 for the first and last page links + expect($el.find('paginate-controls button').length).toBe(pageCount + 2); + }); + + test('should not show blank rows on last page', () => { + const rowCount = 7; + const perPageCount = 10; + const data = makeData(3, rowCount); + + renderTable(data, data.columns, data.rows, perPageCount); + const tableRows = $el.find('tbody tr'); + expect(tableRows.length).toBe(rowCount); + }); + + test('should not show link to top when not set', () => { + const data = makeData(5, 5); + renderTable(data, data.columns, data.rows, 10); + + const linkToTop = $el.find('[data-test-subj="paginateControlsLinkToTop"]'); + expect(linkToTop.length).toBe(0); + }); + + test('should show link to top when set', () => { + const data = makeData(5, 5); + renderTable(data, data.columns, data.rows, 10, undefined, true); + + const linkToTop = $el.find('[data-test-subj="paginateControlsLinkToTop"]'); + expect(linkToTop.length).toBe(1); + }); + }); + + describe('sorting', () => { + let data: Table; + let lastRowIndex: number; + + beforeEach(() => { + data = makeData(3, [ + ['bbbb', 'aaaa', 'zzzz'], + ['cccc', 'cccc', 'aaaa'], + ['zzzz', 'bbbb', 'bbbb'], + ['aaaa', 'zzzz', 'cccc'], + ]); + + lastRowIndex = data.rows.length - 1; + renderTable(data, data.columns, data.rows); + }); + + test('should not sort by default', () => { + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe(data.rows[0][0]); + expect( + tableRows + .eq(lastRowIndex) + .find('td') + .eq(0) + .text() + ).toBe(data.rows[lastRowIndex][0]); + }); + + test('should do nothing when sorting by invalid column id', () => { + // sortColumn + paginatedTable.sortColumn(999); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('bbbb'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('aaaa'); + expect( + tableRows + .eq(0) + .find('td') + .eq(2) + .text() + ).toBe('zzzz'); + }); + + test('should do nothing when sorting by non sortable column', () => { + data.columns[0].sortable = false; + + // sortColumn + paginatedTable.sortColumn(0); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('bbbb'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('aaaa'); + expect( + tableRows + .eq(0) + .find('td') + .eq(2) + .text() + ).toBe('zzzz'); + }); + + test("should set the sort direction to asc when it's not explicitly set", () => { + paginatedTable.sortColumn(1); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(2) + .find('td') + .eq(1) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(1) + .find('td') + .eq(1) + .text() + ).toBe('bbbb'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('aaaa'); + }); + + test('should allow you to explicitly set the sort direction', () => { + paginatedTable.sortColumn(1, 'desc'); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('zzzz'); + expect( + tableRows + .eq(1) + .find('td') + .eq(1) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(2) + .find('td') + .eq(1) + .text() + ).toBe('bbbb'); + }); + + test('should sort ascending on first invocation', () => { + // sortColumn + paginatedTable.sortColumn(0); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('aaaa'); + expect( + tableRows + .eq(lastRowIndex) + .find('td') + .eq(0) + .text() + ).toBe('zzzz'); + }); + + test('should sort descending on second invocation', () => { + // sortColumn + paginatedTable.sortColumn(0); + paginatedTable.sortColumn(0); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('zzzz'); + expect( + tableRows + .eq(lastRowIndex) + .find('td') + .eq(0) + .text() + ).toBe('aaaa'); + }); + + test('should clear sorting on third invocation', () => { + // sortColumn + paginatedTable.sortColumn(0); + paginatedTable.sortColumn(0); + paginatedTable.sortColumn(0); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe(data.rows[0][0]); + expect( + tableRows + .eq(lastRowIndex) + .find('td') + .eq(0) + .text() + ).toBe('aaaa'); + }); + + test('should sort new column ascending', () => { + // sort by first column + paginatedTable.sortColumn(0); + $scope.$digest(); + + // sort by second column + paginatedTable.sortColumn(1); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('aaaa'); + expect( + tableRows + .eq(lastRowIndex) + .find('td') + .eq(1) + .text() + ).toBe('zzzz'); + }); + }); + + describe('sorting duplicate columns', () => { + let data; + const colText = 'test row'; + + beforeEach(() => { + const cols: Column[] = [{ title: colText }, { title: colText }, { title: colText }]; + const rows = [ + ['bbbb', 'aaaa', 'zzzz'], + ['cccc', 'cccc', 'aaaa'], + ['zzzz', 'bbbb', 'bbbb'], + ['aaaa', 'zzzz', 'cccc'], + ]; + data = makeData(cols, rows); + + renderTable(data, data.columns, data.rows); + }); + + test('should have duplicate column titles', () => { + const columns = $el.find('thead th span'); + columns.each((i, col) => { + expect($(col).text()).toBe(colText); + }); + }); + + test('should handle sorting on columns with the same name', () => { + // sort by the last column + paginatedTable.sortColumn(2); + $scope.$digest(); + + const tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(0) + .find('td') + .eq(2) + .text() + ).toBe('aaaa'); + expect( + tableRows + .eq(1) + .find('td') + .eq(2) + .text() + ).toBe('bbbb'); + expect( + tableRows + .eq(2) + .find('td') + .eq(2) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(3) + .find('td') + .eq(2) + .text() + ).toBe('zzzz'); + }); + + test('should sort correctly between columns', () => { + // sort by the last column + paginatedTable.sortColumn(2); + $scope.$digest(); + + let tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(0) + .find('td') + .eq(2) + .text() + ).toBe('aaaa'); + + // sort by the first column + paginatedTable.sortColumn(0); + $scope.$digest(); + + tableRows = $el.find('tbody tr'); + expect( + tableRows + .eq(0) + .find('td') + .eq(0) + .text() + ).toBe('aaaa'); + expect( + tableRows + .eq(0) + .find('td') + .eq(1) + .text() + ).toBe('zzzz'); + expect( + tableRows + .eq(0) + .find('td') + .eq(2) + .text() + ).toBe('cccc'); + + expect( + tableRows + .eq(1) + .find('td') + .eq(0) + .text() + ).toBe('bbbb'); + expect( + tableRows + .eq(2) + .find('td') + .eq(0) + .text() + ).toBe('cccc'); + expect( + tableRows + .eq(3) + .find('td') + .eq(0) + .text() + ).toBe('zzzz'); + }); + + test('should not sort duplicate columns', () => { + paginatedTable.sortColumn(1); + $scope.$digest(); + + const sorters = $el.find('thead th i'); + expect(sorters.eq(0).hasClass('fa-sort')).toBe(true); + expect(sorters.eq(1).hasClass('fa-sort')).toBe(false); + expect(sorters.eq(2).hasClass('fa-sort')).toBe(true); + }); + }); + + describe('object rows', () => { + let cols: Column[]; + let rows: any; + + beforeEach(() => { + cols = [ + { + title: 'object test', + id: '0', + formatter: { + convert: val => { + return val === 'zzz' ? '

hello

' : val; + }, + }, + }, + ]; + rows = [['aaaa'], ['zzz'], ['bbbb']]; + renderTable({ columns: cols, rows }, cols, rows); + }); + + test('should append object markup', () => { + const tableRows = $el.find('tbody tr'); + expect(tableRows.eq(0).find('h1').length).toBe(0); + expect(tableRows.eq(1).find('h1').length).toBe(1); + expect(tableRows.eq(2).find('h1').length).toBe(0); + }); + + test('should sort using object value', () => { + paginatedTable.sortColumn(0); + $scope.$digest(); + let tableRows = $el.find('tbody tr'); + expect(tableRows.eq(0).find('h1').length).toBe(0); + expect(tableRows.eq(1).find('h1').length).toBe(0); + // html row should be the last row + expect(tableRows.eq(2).find('h1').length).toBe(1); + + paginatedTable.sortColumn(0); + $scope.$digest(); + tableRows = $el.find('tbody tr'); + // html row should be the first row + expect(tableRows.eq(0).find('h1').length).toBe(1); + expect(tableRows.eq(1).find('h1').length).toBe(0); + expect(tableRows.eq(2).find('h1').length).toBe(0); + }); + }); +}); diff --git a/src/legacy/core_plugins/vis_type_table/public/plugin.ts b/src/legacy/core_plugins/vis_type_table/public/plugin.ts index ce8d349d8dd7aa..17c50b0567b67d 100644 --- a/src/legacy/core_plugins/vis_type_table/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_table/public/plugin.ts @@ -21,8 +21,6 @@ import { VisualizationsSetup } from '../../visualizations/public'; import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; -import { LegacyDependenciesPlugin } from './shim'; - import { createTableVisFn } from './table_vis_fn'; import { tableVisTypeDefinition } from './table_vis_type'; @@ -30,7 +28,6 @@ import { tableVisTypeDefinition } from './table_vis_type'; export interface TablePluginSetupDependencies { expressions: ReturnType; visualizations: VisualizationsSetup; - __LEGACY: LegacyDependenciesPlugin; } /** @internal */ @@ -43,9 +40,8 @@ export class TableVisPlugin implements Plugin, void> { public async setup( core: CoreSetup, - { expressions, visualizations, __LEGACY }: TablePluginSetupDependencies + { expressions, visualizations }: TablePluginSetupDependencies ) { - __LEGACY.setup(); expressions.registerFunction(createTableVisFn); visualizations.types.createBaseVisualization(tableVisTypeDefinition); diff --git a/src/legacy/core_plugins/vis_type_table/public/shim/index.ts b/src/legacy/core_plugins/vis_type_table/public/shim/index.ts deleted file mode 100644 index cfc7b62ff4f86d..00000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/shim/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export * from './legacy_dependencies_plugin'; diff --git a/src/legacy/core_plugins/vis_type_table/public/shim/legacy_dependencies_plugin.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis.mock.ts similarity index 51% rename from src/legacy/core_plugins/vis_type_table/public/shim/legacy_dependencies_plugin.ts rename to src/legacy/core_plugins/vis_type_table/public/table_vis.mock.ts index ba30664951f473..d04964cb7af038 100644 --- a/src/legacy/core_plugins/vis_type_table/public/shim/legacy_dependencies_plugin.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis.mock.ts @@ -17,16 +17,30 @@ * under the License. */ -import { CoreStart, Plugin } from '../../../../../core/public'; -import { initTableVisLegacyModule } from './table_vis_legacy_module'; +import { createUiNewPlatformMock } from 'ui/new_platform/__mocks__/helpers'; +import { StubBrowserStorage } from 'test_utils/stub_browser_storage'; +import { injectedMetadataServiceMock } from '../../../../core/public/mocks'; -/** @internal */ -export class LegacyDependenciesPlugin implements Plugin { - public setup() { - initTableVisLegacyModule(); - } +jest.doMock('ui/new_platform', () => { + const npMock = createUiNewPlatformMock(); + return { + npSetup: { + ...npMock.npSetup, + core: { + ...npMock.npSetup.core, + injectedMetadata: injectedMetadataServiceMock.createSetupContract(), + }, + }, + npStart: { + ...npMock.npStart, + core: { + ...npMock.npStart.core, + injectedMetadata: injectedMetadataServiceMock.createStartContract(), + }, + }, + }; +}); - public start(core: CoreStart) { - // nothing to do here yet - } -} +Object.assign(window, { + sessionStorage: new StubBrowserStorage(), +}); diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts new file mode 100644 index 00000000000000..5ae58204a8cf30 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts @@ -0,0 +1,257 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import angular, { IRootScopeService, IScope, ICompileService } from 'angular'; +import 'angular-mocks'; +import 'angular-sanitize'; +import $ from 'jquery'; +import './table_vis.mock'; + +// @ts-ignore +import StubIndexPattern from 'test_utils/stub_index_pattern'; +import { getAngularModule } from './get_inner_angular'; +import { initTableVisLegacyModule } from './table_vis_legacy_module'; +import { + npStart, + legacyResponseHandlerProvider, + AggConfig, + tabifyAggResponse, +} from './legacy_imports'; +import { tableVisTypeDefinition } from './table_vis_type'; +import { Vis } from '../../visualizations/public'; +import { setup as visualizationsSetup } from '../../visualizations/public/np_ready/public/legacy'; +// eslint-disable-next-line +import { stubFields } from '../../../../plugins/data/public/stubs'; +// eslint-disable-next-line +import { setFieldFormats } from '../../../../plugins/data/public/index_patterns/services'; + +interface TableVisScope extends IScope { + [key: string]: any; +} + +const oneRangeBucket = { + hits: { + total: 6039, + max_score: 0, + hits: [], + }, + aggregations: { + agg_2: { + buckets: { + '0.0-1000.0': { + from: 0, + from_as_string: '0.0', + to: 1000, + to_as_string: '1000.0', + doc_count: 606, + }, + '1000.0-2000.0': { + from: 1000, + from_as_string: '1000.0', + to: 2000, + to_as_string: '2000.0', + doc_count: 298, + }, + }, + }, + }, +}; + +describe('Table Vis - Controller', () => { + let $rootScope: IRootScopeService & { [key: string]: any }; + let $compile: ICompileService; + let $scope: TableVisScope; + let $el: JQuery; + let tableAggResponse: any; + let tabifiedResponse: any; + let stubIndexPattern: any; + + const initLocalAngular = () => { + const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); + initTableVisLegacyModule(tableVisModule); + }; + + beforeEach(initLocalAngular); + beforeAll(() => { + visualizationsSetup.types.createBaseVisualization(tableVisTypeDefinition); + }); + beforeEach(angular.mock.module('kibana/table_vis')); + + beforeEach( + angular.mock.inject((_$rootScope_: IRootScopeService, _$compile_: ICompileService) => { + $rootScope = _$rootScope_; + $compile = _$compile_; + tableAggResponse = legacyResponseHandlerProvider().handler; + }) + ); + + beforeEach(() => { + setFieldFormats(({ + getDefaultInstance: jest.fn(), + } as unknown) as any); + stubIndexPattern = new StubIndexPattern( + 'logstash-*', + (cfg: any) => cfg, + 'time', + stubFields, + npStart.core.uiSettings + ); + }); + + function getRangeVis(params?: object) { + // @ts-ignore + return new Vis(stubIndexPattern, { + type: 'table', + params: params || {}, + aggs: [ + { type: 'count', schema: 'metric' }, + { + type: 'range', + schema: 'bucket', + params: { + field: 'bytes', + ranges: [ + { from: 0, to: 1000 }, + { from: 1000, to: 2000 }, + ], + }, + }, + ], + }); + } + + const dimensions = { + buckets: [ + { + accessor: 0, + }, + ], + metrics: [ + { + accessor: 1, + format: { id: 'range' }, + }, + ], + }; + + // basically a parameterized beforeEach + function initController(vis: Vis) { + vis.aggs.aggs.forEach((agg: AggConfig, i: number) => { + agg.id = 'agg_' + (i + 1); + }); + + tabifiedResponse = tabifyAggResponse(vis.aggs, oneRangeBucket); + $rootScope.vis = vis; + $rootScope.visParams = vis.params; + $rootScope.uiState = { + get: jest.fn(), + set: jest.fn(), + }; + $rootScope.renderComplete = () => {}; + $rootScope.newScope = (scope: TableVisScope) => { + $scope = scope; + }; + + $el = $('
') + .attr('ng-controller', 'KbnTableVisController') + .attr('ng-init', 'newScope(this)'); + + $compile($el)($rootScope); + } + + // put a response into the controller + function attachEsResponseToScope(resp: object) { + $rootScope.esResponse = resp; + $rootScope.$apply(); + } + + // remove the response from the controller + function removeEsResponseFromScope() { + delete $rootScope.esResponse; + $rootScope.renderComplete = () => {}; + $rootScope.$apply(); + } + + test('exposes #tableGroups and #hasSomeRows when a response is attached to scope', async () => { + const vis: Vis = getRangeVis(); + initController(vis); + + expect(!$scope.tableGroups).toBeTruthy(); + expect(!$scope.hasSomeRows).toBeTruthy(); + + attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); + + expect($scope.hasSomeRows).toBeTruthy(); + expect($scope.tableGroups.tables).toBeDefined(); + expect($scope.tableGroups.tables.length).toBe(1); + expect($scope.tableGroups.tables[0].columns.length).toBe(2); + expect($scope.tableGroups.tables[0].rows.length).toBe(2); + }); + + test('clears #tableGroups and #hasSomeRows when the response is removed', async () => { + const vis = getRangeVis(); + initController(vis); + + attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); + removeEsResponseFromScope(); + + expect(!$scope.hasSomeRows).toBeTruthy(); + expect(!$scope.tableGroups).toBeTruthy(); + }); + + test('sets the sort on the scope when it is passed as a vis param', async () => { + const sortObj = { + columnIndex: 1, + direction: 'asc', + }; + const vis = getRangeVis({ sort: sortObj }); + initController(vis); + + attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); + + expect($scope.sort.columnIndex).toEqual(sortObj.columnIndex); + expect($scope.sort.direction).toEqual(sortObj.direction); + }); + + test('sets #hasSomeRows properly if the table group is empty', async () => { + const vis = getRangeVis(); + initController(vis); + + tabifiedResponse.rows = []; + + attachEsResponseToScope(await tableAggResponse(tabifiedResponse, dimensions)); + + expect($scope.hasSomeRows).toBeFalsy(); + expect(!$scope.tableGroups).toBeTruthy(); + }); + + test('passes partialRows:true to tabify based on the vis params', () => { + const vis = getRangeVis({ showPartialRows: true }); + initController(vis); + + expect(vis.isHierarchical()).toEqual(true); + }); + + test('passes partialRows:false to tabify based on the vis params', () => { + const vis = getRangeVis({ showPartialRows: false }); + initController(vis); + + expect(vis.isHierarchical()).toEqual(false); + }); +}); diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts index d909842a71e2d1..c1def9b55aae20 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts @@ -22,9 +22,7 @@ import { createTableVisFn } from './table_vis_fn'; // eslint-disable-next-line import { functionWrapper } from '../../../../plugins/expressions/public/functions/tests/utils'; -jest.mock('ui/new_platform'); - -jest.mock('ui/vis/response_handlers/legacy', () => { +jest.mock('./legacy_imports', () => { const mockResponseHandler = jest.fn().mockReturnValue( Promise.resolve({ tables: [{ columns: [], rows: [] }], @@ -37,7 +35,7 @@ jest.mock('ui/vis/response_handlers/legacy', () => { }; }); -const { mockResponseHandler } = jest.requireMock('ui/vis/response_handlers/legacy'); +const { mockResponseHandler } = jest.requireMock('./legacy_imports'); describe('interpreter/functions#table', () => { const fn = functionWrapper(createTableVisFn); diff --git a/src/legacy/core_plugins/vis_type_table/public/shim/table_vis_legacy_module.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_legacy_module.ts similarity index 65% rename from src/legacy/core_plugins/vis_type_table/public/shim/table_vis_legacy_module.ts rename to src/legacy/core_plugins/vis_type_table/public/table_vis_legacy_module.ts index e148fd98490df2..57d8b7c448b4c4 100644 --- a/src/legacy/core_plugins/vis_type_table/public/shim/table_vis_legacy_module.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_legacy_module.ts @@ -17,32 +17,25 @@ * under the License. */ -import { once } from 'lodash'; +import { IModule } from 'angular'; // @ts-ignore -import { uiModules } from 'ui/modules'; - -import 'angular-recursion'; -import 'ui/directives/paginate'; - -// @ts-ignore -import { TableVisController } from '../table_vis_controller.js'; +import { TableVisController } from './table_vis_controller.js'; // @ts-ignore -import { KbnAggTable } from '../agg_table/agg_table'; +import { KbnAggTable } from './agg_table/agg_table'; // @ts-ignore -import { KbnAggTableGroup } from '../agg_table/agg_table_group'; +import { KbnAggTableGroup } from './agg_table/agg_table_group'; // @ts-ignore -import { KbnRows } from '../paginated_table/rows'; +import { KbnRows } from './paginated_table/rows'; // @ts-ignore -import { PaginatedTable } from '../paginated_table/paginated_table'; +import { PaginatedTable } from './paginated_table/paginated_table'; /** @internal */ -export const initTableVisLegacyModule = once((): void => { - uiModules - .get('kibana/table_vis', ['kibana', 'RecursionHelper']) +export const initTableVisLegacyModule = (angularIns: IModule): void => { + angularIns .controller('KbnTableVisController', TableVisController) .directive('kbnAggTable', KbnAggTable) .directive('kbnAggTableGroup', KbnAggTableGroup) .directive('kbnRows', KbnRows) .directive('paginatedTable', PaginatedTable); -}); +}; diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_request_handler.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_request_handler.ts index c432dfd84cbb83..1a6d4600025f19 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_request_handler.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_request_handler.ts @@ -17,7 +17,6 @@ * under the License. */ -// @ts-ignore -import { legacyResponseHandlerProvider } from 'ui/vis/response_handlers/legacy'; +import { legacyResponseHandlerProvider } from './legacy_imports'; export const tableVisResponseHandler = legacyResponseHandlerProvider().handler; diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts index 7e8537a1fee54d..5186b6cf59dfdd 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts +++ b/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts @@ -18,18 +18,13 @@ */ import { i18n } from '@kbn/i18n'; -import { Vis } from 'ui/vis'; -// @ts-ignore - -// @ts-ignore -import { Schemas } from 'ui/vis/editors/default/schemas'; -// @ts-ignore -import { AngularVisController } from 'ui/vis/vis_types/angular_vis_type'; -import { AggGroupNames } from 'ui/vis/editors/default'; +import { AggGroupNames, Schemas } from './legacy_imports'; +import { Vis } from '../../visualizations/public'; import { tableVisResponseHandler } from './table_vis_request_handler'; // @ts-ignore import tableVisTemplate from './table_vis.html'; import { TableOptions } from './components/table_vis_options'; +import { TableVisualizationController } from './vis_controller'; export const tableVisTypeDefinition = { type: 'table', @@ -41,7 +36,7 @@ export const tableVisTypeDefinition = { description: i18n.translate('visTypeTable.tableVisDescription', { defaultMessage: 'Display values in a table', }), - visualization: AngularVisController, + visualization: TableVisualizationController, visConfig: { defaults: { perPage: 10, diff --git a/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts b/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts new file mode 100644 index 00000000000000..7adaa21cac5938 --- /dev/null +++ b/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts @@ -0,0 +1,104 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import angular, { IModule, auto, IRootScopeService, IScope, ICompileService } from 'angular'; +import $ from 'jquery'; + +import { Vis, VisParams } from '../../visualizations/public'; +import { npStart } from './legacy_imports'; +import { getAngularModule } from './get_inner_angular'; +import { initTableVisLegacyModule } from './table_vis_legacy_module'; + +const innerAngularName = 'kibana/table_vis'; + +export class TableVisualizationController { + private tableVisModule: IModule | undefined; + private injector: auto.IInjectorService | undefined; + el: JQuery; + vis: Vis; + $rootScope: IRootScopeService | null = null; + $scope: (IScope & { [key: string]: any }) | undefined; + $compile: ICompileService | undefined; + + constructor(domeElement: Element, vis: Vis) { + this.el = $(domeElement); + this.vis = vis; + } + + getInjector() { + if (!this.injector) { + const mountpoint = document.createElement('div'); + mountpoint.setAttribute('style', 'height: 100%; width: 100%;'); + this.injector = angular.bootstrap(mountpoint, [innerAngularName]); + this.el.append(mountpoint); + } + + return this.injector; + } + + initLocalAngular() { + if (!this.tableVisModule) { + this.tableVisModule = getAngularModule(innerAngularName, npStart.core); + initTableVisLegacyModule(this.tableVisModule); + } + } + + async render(esResponse: object, visParams: VisParams, status: { [key: string]: boolean }) { + this.initLocalAngular(); + + return new Promise(async (resolve, reject) => { + if (!this.$rootScope) { + const $injector = this.getInjector(); + this.$rootScope = $injector.get('$rootScope'); + this.$compile = $injector.get('$compile'); + } + const updateScope = () => { + if (!this.$scope) { + return; + } + this.$scope.vis = this.vis; + this.$scope.visState = this.vis.getState(); + this.$scope.esResponse = esResponse; + this.$scope.visParams = visParams; + this.$scope.renderComplete = resolve; + this.$scope.renderFailed = reject; + this.$scope.resize = Date.now(); + this.$scope.updateStatus = status; + this.$scope.$apply(); + }; + + if (!this.$scope && this.$compile) { + this.$scope = this.$rootScope.$new(); + this.$scope.uiState = this.vis.getUiState(); + updateScope(); + this.el.find('div').append(this.$compile(this.vis.type.visConfig.template)(this.$scope)); + this.$scope.$apply(); + } else { + updateScope(); + } + }); + } + + destroy() { + if (this.$rootScope) { + this.$rootScope.$destroy(); + this.$rootScope = null; + } + } +} diff --git a/src/legacy/ui/public/directives/paginate.js b/src/legacy/ui/public/directives/paginate.js index 7ecd5fefe67103..6663e1fb8b6e48 100644 --- a/src/legacy/ui/public/directives/paginate.js +++ b/src/legacy/ui/public/directives/paginate.js @@ -22,209 +22,215 @@ import { i18n } from '@kbn/i18n'; import { uiModules } from '../modules'; import paginateControlsTemplate from './partials/paginate_controls.html'; -uiModules.get('kibana') - .directive('paginate', function ($parse, $compile) { - return { - restrict: 'E', - scope: true, - link: { - pre: function ($scope, $el, attrs) { - if (_.isUndefined(attrs.bottomControls)) attrs.bottomControls = true; - if ($el.find('paginate-controls.paginate-bottom').length === 0 && attrs.bottomControls) { - $el.append($compile('')($scope)); - } - }, - post: function ($scope, $el, attrs) { - if (_.isUndefined(attrs.topControls)) attrs.topControls = false; - if ($el.find('paginate-controls.paginate-top').length === 0 && attrs.topControls) { - $el.prepend($compile('')($scope)); - } - - const paginate = $scope.paginate; - - // add some getters to the controller powered by attributes - paginate.getList = $parse(attrs.list); - paginate.perPageProp = attrs.perPageProp; - - if (attrs.perPage) { - paginate.perPage = attrs.perPage; - $scope.showSelector = false; - } else { - $scope.showSelector = true; - } - - paginate.otherWidthGetter = $parse(attrs.otherWidth); - - paginate.init(); +export function PaginateDirectiveProvider($parse, $compile) { + return { + restrict: 'E', + scope: true, + link: { + pre: function ($scope, $el, attrs) { + if (_.isUndefined(attrs.bottomControls)) attrs.bottomControls = true; + if ($el.find('paginate-controls.paginate-bottom').length === 0 && attrs.bottomControls) { + $el.append($compile('')($scope)); } }, - controllerAs: 'paginate', - controller: function ($scope, $document) { - const self = this; - const ALL = 0; - const allSizeTitle = i18n.translate('common.ui.directives.paginate.size.allDropDownOptionLabel', { - defaultMessage: 'All', - }); + post: function ($scope, $el, attrs) { + if (_.isUndefined(attrs.topControls)) attrs.topControls = false; + if ($el.find('paginate-controls.paginate-top').length === 0 && attrs.topControls) { + $el.prepend($compile('')($scope)); + } - self.sizeOptions = [ - { title: '10', value: 10 }, - { title: '25', value: 25 }, - { title: '100', value: 100 }, - { title: allSizeTitle, value: ALL } - ]; + const paginate = $scope.paginate; - // setup the watchers, called in the post-link function - self.init = function () { + // add some getters to the controller powered by attributes + paginate.getList = $parse(attrs.list); + paginate.perPageProp = attrs.perPageProp; - self.perPage = _.parseInt(self.perPage) || $scope[self.perPageProp]; + if (attrs.perPage) { + paginate.perPage = attrs.perPage; + $scope.showSelector = false; + } else { + $scope.showSelector = true; + } - $scope.$watchMulti([ - 'paginate.perPage', - self.perPageProp, - self.otherWidthGetter - ], function (vals, oldVals) { - const intChanges = vals[0] !== oldVals[0]; + paginate.otherWidthGetter = $parse(attrs.otherWidth); - if (intChanges) { - if (!setPerPage(self.perPage)) { + paginate.init(); + }, + }, + controllerAs: 'paginate', + controller: function ($scope, $document) { + const self = this; + const ALL = 0; + const allSizeTitle = i18n.translate( + 'common.ui.directives.paginate.size.allDropDownOptionLabel', + { + defaultMessage: 'All', + } + ); + + self.sizeOptions = [ + { title: '10', value: 10 }, + { title: '25', value: 25 }, + { title: '100', value: 100 }, + { title: allSizeTitle, value: ALL }, + ]; + + // setup the watchers, called in the post-link function + self.init = function () { + self.perPage = _.parseInt(self.perPage) || $scope[self.perPageProp]; + + $scope.$watchMulti(['paginate.perPage', self.perPageProp, self.otherWidthGetter], function ( + vals, + oldVals + ) { + const intChanges = vals[0] !== oldVals[0]; + + if (intChanges) { + if (!setPerPage(self.perPage)) { // if we are not able to set the external value, // render now, otherwise wait for the external value // to trigger the watcher again - self.renderList(); - } - return; + self.renderList(); } + return; + } - self.perPage = _.parseInt(self.perPage) || $scope[self.perPageProp]; - if (self.perPage == null) { - self.perPage = ALL; - return; - } + self.perPage = _.parseInt(self.perPage) || $scope[self.perPageProp]; + if (self.perPage == null) { + self.perPage = ALL; + return; + } - self.renderList(); - }); + self.renderList(); + }); - $scope.$watch('page', self.changePage); - $scope.$watchCollection(self.getList, function (list) { - $scope.list = list; - self.renderList(); - }); - }; + $scope.$watch('page', self.changePage); + $scope.$watchCollection(self.getList, function (list) { + $scope.list = list; + self.renderList(); + }); + }; - self.goToPage = function (number) { - if (number) { - if (number.hasOwnProperty('number')) number = number.number; - $scope.page = $scope.pages[number - 1] || $scope.pages[0]; - } - }; + self.goToPage = function (number) { + if (number) { + if (number.hasOwnProperty('number')) number = number.number; + $scope.page = $scope.pages[number - 1] || $scope.pages[0]; + } + }; - self.goToTop = function goToTop() { - $document.scrollTop(0); - }; + self.goToTop = function goToTop() { + $document.scrollTop(0); + }; - self.renderList = function () { - $scope.pages = []; - if (!$scope.list) return; + self.renderList = function () { + $scope.pages = []; + if (!$scope.list) return; - const perPage = _.parseInt(self.perPage); - const count = perPage ? Math.ceil($scope.list.length / perPage) : 1; + const perPage = _.parseInt(self.perPage); + const count = perPage ? Math.ceil($scope.list.length / perPage) : 1; - _.times(count, function (i) { - let page; + _.times(count, function (i) { + let page; - if (perPage) { - const start = perPage * i; - page = $scope.list.slice(start, start + perPage); - } else { - page = $scope.list.slice(0); - } + if (perPage) { + const start = perPage * i; + page = $scope.list.slice(start, start + perPage); + } else { + page = $scope.list.slice(0); + } - page.number = i + 1; - page.i = i; + page.number = i + 1; + page.i = i; - page.count = count; - page.first = page.number === 1; - page.last = page.number === count; - page.firstItem = (page.number - 1) * perPage + 1; - page.lastItem = Math.min(page.number * perPage, $scope.list.length); + page.count = count; + page.first = page.number === 1; + page.last = page.number === count; + page.firstItem = (page.number - 1) * perPage + 1; + page.lastItem = Math.min(page.number * perPage, $scope.list.length); - page.prev = $scope.pages[i - 1]; - if (page.prev) page.prev.next = page; + page.prev = $scope.pages[i - 1]; + if (page.prev) page.prev.next = page; - $scope.pages.push(page); - }); + $scope.pages.push(page); + }); - // set the new page, or restore the previous page number - if ($scope.page && $scope.page.i < $scope.pages.length) { - $scope.page = $scope.pages[$scope.page.i]; - } else { - $scope.page = $scope.pages[0]; - } + // set the new page, or restore the previous page number + if ($scope.page && $scope.page.i < $scope.pages.length) { + $scope.page = $scope.pages[$scope.page.i]; + } else { + $scope.page = $scope.pages[0]; + } - if ($scope.page && $scope.onPageChanged) { - $scope.onPageChanged($scope.page); - } - }; + if ($scope.page && $scope.onPageChanged) { + $scope.onPageChanged($scope.page); + } + }; - self.changePage = function (page) { - if (!page) { - $scope.otherPages = null; - return; - } + self.changePage = function (page) { + if (!page) { + $scope.otherPages = null; + return; + } - // setup the list of the other pages to link to - $scope.otherPages = []; - const width = +self.otherWidthGetter($scope) || 5; - let left = page.i - Math.round((width - 1) / 2); - let right = left + width - 1; + // setup the list of the other pages to link to + $scope.otherPages = []; + const width = +self.otherWidthGetter($scope) || 5; + let left = page.i - Math.round((width - 1) / 2); + let right = left + width - 1; - // shift neg count from left to right - if (left < 0) { - right += 0 - left; - left = 0; - } + // shift neg count from left to right + if (left < 0) { + right += 0 - left; + left = 0; + } - // shift extra right nums to left - const lastI = page.count - 1; - if (right > lastI) { - right = lastI; - left = right - width + 1; - } + // shift extra right nums to left + const lastI = page.count - 1; + if (right > lastI) { + right = lastI; + left = right - width + 1; + } - for (let i = left; i <= right; i++) { - const other = $scope.pages[i]; + for (let i = left; i <= right; i++) { + const other = $scope.pages[i]; - if (!other) continue; + if (!other) continue; - $scope.otherPages.push(other); - if (other.last) $scope.otherPages.containsLast = true; - if (other.first) $scope.otherPages.containsFirst = true; - } + $scope.otherPages.push(other); + if (other.last) $scope.otherPages.containsLast = true; + if (other.first) $scope.otherPages.containsFirst = true; + } - if ($scope.onPageChanged) { - $scope.onPageChanged($scope.page); - } - }; + if ($scope.onPageChanged) { + $scope.onPageChanged($scope.page); + } + }; - function setPerPage(val) { - let $ppParent = $scope; + function setPerPage(val) { + let $ppParent = $scope; - while ($ppParent && !_.has($ppParent, self.perPageProp)) { - $ppParent = $ppParent.$parent; - } + while ($ppParent && !_.has($ppParent, self.perPageProp)) { + $ppParent = $ppParent.$parent; + } - if ($ppParent) { - $ppParent[self.perPageProp] = val; - return true; - } + if ($ppParent) { + $ppParent[self.perPageProp] = val; + return true; } } - }; - }) - .directive('paginateControls', function () { + }, + }; +} + +export function PaginateControlsDirectiveProvider() { // this directive is automatically added by paginate if not found within it's $el - return { - restrict: 'E', - template: paginateControlsTemplate - }; - }); + return { + restrict: 'E', + template: paginateControlsTemplate, + }; +} + +uiModules + .get('kibana') + .directive('paginate', PaginateDirectiveProvider) + .directive('paginateControls', PaginateControlsDirectiveProvider); diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index 80031efba6e48b..f8850d1691cddf 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -114,8 +114,10 @@ export const npSetup = { registerAction: sinon.fake(), registerTrigger: sinon.fake(), }, - feature_catalogue: { - register: sinon.fake(), + home: { + featureCatalogue: { + register: sinon.fake(), + }, }, }, }; @@ -229,8 +231,10 @@ export const npStart = { getTriggerActions: sinon.fake(), getTriggerCompatibleActions: sinon.fake(), }, - feature_catalogue: { - register: sinon.fake(), + home: { + featureCatalogue: { + register: sinon.fake(), + }, }, }, }; From 05047c39c6930955ac296ac537119424df1e415e Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Mon, 2 Dec 2019 13:08:52 +0100 Subject: [PATCH 12/39] [TSVB] Fix TSVB not saving correctly (#51887) * Fix TSVB not saving correctly * Address review * Add functional test --- .../visualize/embeddable/visualize_embeddable.ts | 2 -- .../public/components/vis_editor.js | 7 ++++++- .../public/components/vis_editor_visualization.js | 5 ++--- test/functional/apps/visualize/_tsvb_table.ts | 10 +++++++++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts b/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts index 13d33c9eb99ec1..e5a723a99eafd8 100644 --- a/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts +++ b/src/legacy/core_plugins/kibana/public/visualize/embeddable/visualize_embeddable.ts @@ -149,8 +149,6 @@ export class VisualizeEmbeddable extends Embeddable { this.handleChanges(); diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js index 1d42b773369334..ae39d75c7a2d1d 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js @@ -44,7 +44,6 @@ const APP_NAME = 'VisEditor'; export class VisEditor extends Component { constructor(props) { super(props); - this.appState = props.appState; this.localStorage = new Storage(window.localStorage); this.state = { model: props.visParams, @@ -82,6 +81,12 @@ export class VisEditor extends Component { updateVisState = debounce(() => { this.props.vis.params = this.state.model; this.props.vis.updateState(); + // This check should be redundant, since this method should only be called when we're in editor + // mode where there's also an appState passed into us. + if (this.props.appState) { + this.props.appState.vis = this.props.vis.getState(); + this.props.appState.save(); + } }, VIS_STATE_DEBOUNCE_DELAY); isValidKueryQuery = filterQuery => { diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor_visualization.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor_visualization.js index ae82dc41fa9bc9..10c17dbfd5ace5 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor_visualization.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor_visualization.js @@ -70,12 +70,12 @@ class VisEditorVisualizationUI extends Component { return; } - const { timeRange, appState, savedObj, onDataChange } = this.props; + const { timeRange, savedObj, onDataChange } = this.props; this._handler = await embeddables.getEmbeddableFactory('visualization').createFromObject(savedObj, { vis: {}, timeRange: timeRange, - filters: appState ? appState.filters || [] : [], + filters: [], }); await this._handler.render(this._visEl.current); @@ -287,7 +287,6 @@ VisEditorVisualizationUI.propTypes = { timeRange: PropTypes.object, dirty: PropTypes.bool, autoApply: PropTypes.bool, - appState: PropTypes.object, }; export const VisEditorVisualization = injectI18n(VisEditorVisualizationUI); diff --git a/test/functional/apps/visualize/_tsvb_table.ts b/test/functional/apps/visualize/_tsvb_table.ts index c096c28f7b8043..a36b6facb30398 100644 --- a/test/functional/apps/visualize/_tsvb_table.ts +++ b/test/functional/apps/visualize/_tsvb_table.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function({ getPageObjects }: FtrProviderContext) { const { visualBuilder, visualize } = getPageObjects(['visualBuilder', 'visualize']); @@ -54,6 +53,15 @@ export default function({ getPageObjects }: FtrProviderContext) { expect(isFieldForAggregationValid).to.be(true); expect(tableData).to.be(EXPECTED); }); + + it('should render correctly after saving', async () => { + const EXPECTED = 'OS Count\nwin 8 13\nwin xp 10\nwin 7 12\nios 5\nosx 3'; + + await visualize.saveVisualizationExpectSuccessAndBreadcrumb('TSVB table saving test'); + + const tableData = await visualBuilder.getViewTable(); + expect(tableData).to.be(EXPECTED); + }); }); }); } From 9e24cb268ed2e9a18e16584fb080e32a026d539d Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Mon, 2 Dec 2019 12:15:19 +0000 Subject: [PATCH 13/39] [ML] Adds functional tests for the index based data visualizer (#51832) * [ML] Adds functional tests for the index based data visualizer * [ML] Address comments from review on data viz tests * [ML] Skip data visualizer functional tests on Firefox --- .../datavisualizer_selector.tsx | 12 +- .../field_data_card/field_data_card.tsx | 2 +- .../components/fields_panel/fields_panel.tsx | 2 +- .../components/search_panel/search_panel.tsx | 4 +- .../datavisualizer/index_based/page.tsx | 2 +- .../machine_learning/data_visualizer/index.ts | 14 + .../data_visualizer/index_data_visualizer.ts | 287 ++++++++++++++++++ .../functional/apps/machine_learning/index.ts | 1 + .../machine_learning/data_visualizer.ts | 5 + .../data_visualizer_index_based.ts | 107 +++++++ .../services/machine_learning/index.ts | 1 + .../machine_learning/job_source_selection.ts | 6 + x-pack/test/functional/services/ml.ts | 3 + 13 files changed, 440 insertions(+), 6 deletions(-) create mode 100644 x-pack/test/functional/apps/machine_learning/data_visualizer/index.ts create mode 100644 x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts create mode 100644 x-pack/test/functional/services/machine_learning/data_visualizer_index_based.ts diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx b/x-pack/legacy/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx index bc9f1fc21086d4..e6f6d4581c7060 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx @@ -113,7 +113,11 @@ export const DatavisualizerSelector: FC = () => { /> } footer={ - + { /> } footer={ - + = ({ config }) => { } return ( -
+
diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/fields_panel/fields_panel.tsx b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/fields_panel/fields_panel.tsx index e32d1ca17e12eb..8b060ec9f551b6 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/fields_panel/fields_panel.tsx +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/fields_panel/fields_panel.tsx @@ -78,7 +78,7 @@ export const FieldsPanel: FC = ({ } return ( - +

{title}

diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx index a43b680720a2aa..4dd1593a14da51 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/components/search_panel/search_panel.tsx @@ -122,7 +122,9 @@ export const SearchPanel: FC = ({ id="xpack.ml.datavisualizer.searchPanel.documentsPerShardLabel" defaultMessage="documents per shard from a total of {wrappedTotalCount} {totalCount, plural, one {document} other {documents}}" values={{ - wrappedTotalCount: {totalCount}, + wrappedTotalCount: ( + {totalCount} + ), totalCount, }} /> diff --git a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/page.tsx b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/page.tsx index 3e388329590ced..99e128e9541030 100644 --- a/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/page.tsx +++ b/x-pack/legacy/plugins/ml/public/application/datavisualizer/index_based/page.tsx @@ -585,7 +585,7 @@ export const Page: FC = () => { return ( - + diff --git a/x-pack/test/functional/apps/machine_learning/data_visualizer/index.ts b/x-pack/test/functional/apps/machine_learning/data_visualizer/index.ts new file mode 100644 index 00000000000000..fa4b5e76ae7282 --- /dev/null +++ b/x-pack/test/functional/apps/machine_learning/data_visualizer/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function({ loadTestFile }: FtrProviderContext) { + describe('data visualizer', function() { + this.tags(['skipFirefox']); + + loadTestFile(require.resolve('./index_data_visualizer')); + }); +} diff --git a/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts b/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts new file mode 100644 index 00000000000000..cd2b2fca426f9a --- /dev/null +++ b/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts @@ -0,0 +1,287 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { ML_JOB_FIELD_TYPES } from '../../../../../legacy/plugins/ml/common/constants/field_types'; +import { FieldVisConfig } from '../../../../../legacy/plugins/ml/public/application/datavisualizer/index_based/common'; + +function getFieldTypes(cards: FieldVisConfig[]) { + const fieldTypes: ML_JOB_FIELD_TYPES[] = []; + cards.forEach(card => { + const fieldType = card.type; + if (fieldTypes.includes(fieldType) === false) { + fieldTypes.push(fieldType); + } + }); + + return fieldTypes.sort(); +} + +// eslint-disable-next-line import/no-default-export +export default function({ getService }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const ml = getService('ml'); + + const testDataList = [ + { + suiteTitle: 'with full farequote index', + sourceIndexOrSavedSearch: 'farequote', + metricFieldsFilter: 'document', + nonMetricFieldsFilter: 'airline', + nonMetricFieldsTypeFilter: 'keyword', + expected: { + totalDocCount: 86274, + fieldsPanelCount: 2, // Metrics panel and Fields panel + metricCards: [ + { + type: ML_JOB_FIELD_TYPES.NUMBER, // document count card + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: 'responsetime', + type: ML_JOB_FIELD_TYPES.NUMBER, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + ], + nonMetricCards: [ + { + fieldName: '@timestamp', + type: ML_JOB_FIELD_TYPES.DATE, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: '@version', + type: ML_JOB_FIELD_TYPES.TEXT, + existsInDocs: true, + aggregatable: false, + loading: false, + }, + { + fieldName: '@version.keyword', + type: ML_JOB_FIELD_TYPES.KEYWORD, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: 'airline', + type: ML_JOB_FIELD_TYPES.KEYWORD, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: 'type', + type: ML_JOB_FIELD_TYPES.TEXT, + existsInDocs: true, + aggregatable: false, + loading: false, + }, + { + fieldName: 'type.keyword', + type: ML_JOB_FIELD_TYPES.KEYWORD, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + ], + nonMetricFieldsTypeFilterCardCount: 3, + metricFieldsFilterCardCount: 1, + nonMetricFieldsFilterCardCount: 1, + }, + }, + { + suiteTitle: 'with lucene query on farequote index', + sourceIndexOrSavedSearch: 'farequote_lucene', + metricFieldsFilter: 'responsetime', + nonMetricFieldsFilter: 'version', + nonMetricFieldsTypeFilter: 'keyword', + expected: { + totalDocCount: 34416, + fieldsPanelCount: 2, // Metrics panel and Fields panel + metricCards: [ + { + type: ML_JOB_FIELD_TYPES.NUMBER, // document count card + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: 'responsetime', + type: ML_JOB_FIELD_TYPES.NUMBER, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + ], + nonMetricCards: [ + { + fieldName: '@timestamp', + type: ML_JOB_FIELD_TYPES.DATE, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: '@version', + type: ML_JOB_FIELD_TYPES.TEXT, + existsInDocs: true, + aggregatable: false, + loading: false, + }, + { + fieldName: '@version.keyword', + type: ML_JOB_FIELD_TYPES.KEYWORD, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: 'airline', + type: ML_JOB_FIELD_TYPES.KEYWORD, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + { + fieldName: 'type', + type: ML_JOB_FIELD_TYPES.TEXT, + existsInDocs: true, + aggregatable: false, + loading: false, + }, + { + fieldName: 'type.keyword', + type: ML_JOB_FIELD_TYPES.KEYWORD, + existsInDocs: true, + aggregatable: true, + loading: false, + }, + ], + nonMetricFieldsTypeFilterCardCount: 3, + metricFieldsFilterCardCount: 2, + nonMetricFieldsFilterCardCount: 1, + }, + }, + ]; + + describe('index based', function() { + this.tags(['smoke', 'mlqa']); + before(async () => { + await esArchiver.load('ml/farequote'); + }); + + after(async () => { + await esArchiver.unload('ml/farequote'); + }); + + // TODO - add tests for + // - validating metrics displayed inside the cards + // - selecting a document sample size + // - clicking on the link to the Advanced job wizard + // - a test suite using a KQL based saved search + for (const testData of testDataList) { + describe(`${testData.suiteTitle}`, function() { + it('loads the data visualizer selector page', async () => { + await ml.navigation.navigateToMl(); + await ml.navigation.navigateToDataVisualizer(); + }); + + it('loads the saved search selection page', async () => { + await ml.dataVisualizer.navigateToIndexPatternSelection(); + }); + + it('loads the index data visualizer page', async () => { + await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer( + testData.sourceIndexOrSavedSearch + ); + }); + + it('displays the time range step', async () => { + await ml.dataVisualizerIndexBased.assertTimeRangeSelectorSectionExists(); + }); + + it('loads data for full time range', async () => { + await ml.dataVisualizerIndexBased.clickUseFullDataButton(testData.expected.totalDocCount); + }); + + it('displays the panels of fields', async () => { + await ml.dataVisualizerIndexBased.assertFieldsPanelsExist( + testData.expected.fieldsPanelCount + ); + }); + + if (testData.expected.metricCards && testData.expected.metricCards.length > 0) { + it('displays the Metrics panel', async () => { + await ml.dataVisualizerIndexBased.assertFieldsPanelForTypesExist([ + ML_JOB_FIELD_TYPES.NUMBER, + ]); // document_count not exposed as a type in the panel + }); + + it('displays the expected metric field cards', async () => { + for (const fieldCard of testData.expected.metricCards) { + await ml.dataVisualizerIndexBased.assertCardExists( + fieldCard.type, + fieldCard.fieldName + ); + } + }); + + it('filters metric fields cards with search', async () => { + await ml.dataVisualizerIndexBased.filterFieldsPanelWithSearchString( + ['number'], + testData.metricFieldsFilter, + testData.expected.metricFieldsFilterCardCount + ); + }); + } + + if (testData.expected.nonMetricCards && testData.expected.nonMetricCards.length > 0) { + it('displays the non-metric Fields panel', async () => { + await ml.dataVisualizerIndexBased.assertFieldsPanelForTypesExist( + getFieldTypes(testData.expected.nonMetricCards) + ); + }); + + it('displays the expected non-metric field cards', async () => { + for (const fieldCard of testData.expected.nonMetricCards) { + await ml.dataVisualizerIndexBased.assertCardExists( + fieldCard.type, + fieldCard.fieldName + ); + } + }); + + it('sets the non metric field types input', async () => { + const fieldTypes: ML_JOB_FIELD_TYPES[] = getFieldTypes( + testData.expected.nonMetricCards + ); + await ml.dataVisualizerIndexBased.assertFieldsPanelTypeInputExists(fieldTypes); + await ml.dataVisualizerIndexBased.setFieldsPanelTypeInputValue( + fieldTypes, + testData.nonMetricFieldsTypeFilter, + testData.expected.nonMetricFieldsTypeFilterCardCount + ); + }); + + it('filters non-metric fields cards with search', async () => { + await ml.dataVisualizerIndexBased.filterFieldsPanelWithSearchString( + getFieldTypes(testData.expected.nonMetricCards), + testData.nonMetricFieldsFilter, + testData.expected.nonMetricFieldsFilterCardCount + ); + }); + } + }); + } + }); +} diff --git a/x-pack/test/functional/apps/machine_learning/index.ts b/x-pack/test/functional/apps/machine_learning/index.ts index 1d081783c6c600..f6a929bca60313 100644 --- a/x-pack/test/functional/apps/machine_learning/index.ts +++ b/x-pack/test/functional/apps/machine_learning/index.ts @@ -12,5 +12,6 @@ export default function({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./feature_controls')); loadTestFile(require.resolve('./pages')); loadTestFile(require.resolve('./anomaly_detection')); + loadTestFile(require.resolve('./data_visualizer')); }); } diff --git a/x-pack/test/functional/services/machine_learning/data_visualizer.ts b/x-pack/test/functional/services/machine_learning/data_visualizer.ts index 5eec624a985aa4..dec854130624fa 100644 --- a/x-pack/test/functional/services/machine_learning/data_visualizer.ts +++ b/x-pack/test/functional/services/machine_learning/data_visualizer.ts @@ -17,5 +17,10 @@ export function MachineLearningDataVisualizerProvider({ getService }: FtrProvide async assertDataVisualizerIndexDataCardExists() { await testSubjects.existOrFail('mlDataVisualizerCardIndexData'); }, + + async navigateToIndexPatternSelection() { + await testSubjects.click('mlDataVisualizerSelectIndexButton'); + await testSubjects.existOrFail('mlPageSourceSelection'); + }, }; } diff --git a/x-pack/test/functional/services/machine_learning/data_visualizer_index_based.ts b/x-pack/test/functional/services/machine_learning/data_visualizer_index_based.ts new file mode 100644 index 00000000000000..32d9bc94de50d9 --- /dev/null +++ b/x-pack/test/functional/services/machine_learning/data_visualizer_index_based.ts @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../ftr_provider_context'; +import { ML_JOB_FIELD_TYPES } from '../../../../legacy/plugins/ml/common/constants/field_types'; + +export function MachineLearningDataVisualizerIndexBasedProvider({ + getService, +}: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + const browser = getService('browser'); + + return { + async assertTimeRangeSelectorSectionExists() { + await testSubjects.existOrFail('mlDataVisualizerTimeRangeSelectorSection'); + }, + + async assertTotalDocumentCount(expectedTotalDocCount: number) { + await retry.tryForTime(5000, async () => { + const docCount = await testSubjects.getVisibleText('mlDataVisualizerTotalDocCount'); + expect(docCount).to.eql(expectedTotalDocCount); + }); + }, + + async clickUseFullDataButton(expectedTotalDocCount: number) { + await testSubjects.clickWhenNotDisabled('mlButtonUseFullData'); + await this.assertTotalDocumentCount(expectedTotalDocCount); + }, + + async assertFieldsPanelsExist(expectedPanelCount: number) { + const allPanels = await testSubjects.findAll('~mlDataVisualizerFieldsPanel'); + expect(allPanels).to.have.length(expectedPanelCount); + }, + + async assertFieldsPanelForTypesExist(fieldTypes: ML_JOB_FIELD_TYPES[]) { + await testSubjects.existOrFail(`mlDataVisualizerFieldsPanel ${fieldTypes}`); + }, + + async assertCardExists(cardType: string, fieldName?: string) { + await testSubjects.existOrFail(`mlFieldDataCard ${fieldName} ${cardType}`); + }, + + async assertFieldsPanelCardCount(panelFieldTypes: string[], expectedCardCount: number) { + await retry.tryForTime(5000, async () => { + const filteredCards = await testSubjects.findAll( + `mlDataVisualizerFieldsPanel ${panelFieldTypes} > ~mlFieldDataCard` + ); + expect(filteredCards).to.have.length(expectedCardCount); + }); + }, + + async assertFieldsPanelSearchInputValue(fieldTypes: string[], expectedSearchValue: string) { + const searchBar = await testSubjects.find( + `mlDataVisualizerFieldsPanel ${fieldTypes} > mlDataVisualizerFieldsSearchBarDiv` + ); + const searchBarInput = await searchBar.findByTagName('input'); + const actualSearchValue = await searchBarInput.getAttribute('value'); + expect(actualSearchValue).to.eql(expectedSearchValue); + }, + + async filterFieldsPanelWithSearchString( + fieldTypes: string[], + filter: string, + expectedCardCount: number + ) { + const searchBar = await testSubjects.find( + `mlDataVisualizerFieldsPanel ${fieldTypes} > mlDataVisualizerFieldsSearchBarDiv` + ); + const searchBarInput = await searchBar.findByTagName('input'); + await searchBarInput.clearValueWithKeyboard(); + await searchBarInput.type(filter); + await searchBarInput.pressKeys(browser.keys.ENTER); + await this.assertFieldsPanelSearchInputValue(fieldTypes, filter); + + await this.assertFieldsPanelCardCount(fieldTypes, expectedCardCount); + }, + + async assertFieldsPanelTypeInputExists(panelFieldTypes: string[]) { + await testSubjects.existOrFail( + `mlDataVisualizerFieldsPanel ${panelFieldTypes} > mlDataVisualizerFieldTypesSelect` + ); + }, + + async assertFieldsPanelTypeInputValue(expectedTypeValue: string) { + const actualTypeValue = await testSubjects.getAttribute( + 'mlDataVisualizerFieldTypesSelect', + 'value' + ); + expect(actualTypeValue).to.eql(expectedTypeValue); + }, + + async setFieldsPanelTypeInputValue( + panelFieldTypes: string[], + filterFieldType: string, + expectedCardCount: number + ) { + await testSubjects.selectValue('mlDataVisualizerFieldTypesSelect', filterFieldType); + await this.assertFieldsPanelTypeInputValue(filterFieldType); + await this.assertFieldsPanelCardCount(panelFieldTypes, expectedCardCount); + }, + }; +} diff --git a/x-pack/test/functional/services/machine_learning/index.ts b/x-pack/test/functional/services/machine_learning/index.ts index c5ebe3e9cc1564..f0ec1012893620 100644 --- a/x-pack/test/functional/services/machine_learning/index.ts +++ b/x-pack/test/functional/services/machine_learning/index.ts @@ -8,6 +8,7 @@ export { MachineLearningAnomalyExplorerProvider } from './anomaly_explorer'; export { MachineLearningAPIProvider } from './api'; export { MachineLearningDataFrameAnalyticsProvider } from './data_frame_analytics'; export { MachineLearningDataVisualizerProvider } from './data_visualizer'; +export { MachineLearningDataVisualizerIndexBasedProvider } from './data_visualizer_index_based'; export { MachineLearningJobManagementProvider } from './job_management'; export { MachineLearningJobSourceSelectionProvider } from './job_source_selection'; export { MachineLearningJobTableProvider } from './job_table'; diff --git a/x-pack/test/functional/services/machine_learning/job_source_selection.ts b/x-pack/test/functional/services/machine_learning/job_source_selection.ts index 9e54f59691738d..38dd6070ec3215 100644 --- a/x-pack/test/functional/services/machine_learning/job_source_selection.ts +++ b/x-pack/test/functional/services/machine_learning/job_source_selection.ts @@ -26,5 +26,11 @@ export function MachineLearningJobSourceSelectionProvider({ getService }: FtrPro await testSubjects.clickWhenNotDisabled(`savedObjectTitle${sourceName}`); await testSubjects.existOrFail('mlPageJobTypeSelection'); }, + + async selectSourceForIndexBasedDataVisualizer(sourceName: string) { + await this.filterSourceSelection(sourceName); + await testSubjects.clickWhenNotDisabled(`savedObjectTitle${sourceName}`); + await testSubjects.existOrFail('mlPageIndexDataVisualizer', { timeout: 10 * 1000 }); + }, }; } diff --git a/x-pack/test/functional/services/ml.ts b/x-pack/test/functional/services/ml.ts index 8609552b5dc558..5851d2b9b116ce 100644 --- a/x-pack/test/functional/services/ml.ts +++ b/x-pack/test/functional/services/ml.ts @@ -11,6 +11,7 @@ import { MachineLearningAPIProvider, MachineLearningDataFrameAnalyticsProvider, MachineLearningDataVisualizerProvider, + MachineLearningDataVisualizerIndexBasedProvider, MachineLearningJobManagementProvider, MachineLearningJobSourceSelectionProvider, MachineLearningJobTableProvider, @@ -29,6 +30,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { const api = MachineLearningAPIProvider(context); const dataFrameAnalytics = MachineLearningDataFrameAnalyticsProvider(context); const dataVisualizer = MachineLearningDataVisualizerProvider(context); + const dataVisualizerIndexBased = MachineLearningDataVisualizerIndexBasedProvider(context); const jobManagement = MachineLearningJobManagementProvider(context, api); const jobSourceSelection = MachineLearningJobSourceSelectionProvider(context); const jobTable = MachineLearningJobTableProvider(context); @@ -46,6 +48,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { api, dataFrameAnalytics, dataVisualizer, + dataVisualizerIndexBased, jobManagement, jobSourceSelection, jobTable, From a3b87700aac87379d99ca8f5a115602620980308 Mon Sep 17 00:00:00 2001 From: Pedro Luiz Cabral Salomon Prado Date: Mon, 2 Dec 2019 11:21:10 -0300 Subject: [PATCH 14/39] Fixed NaN comparison (#50000) --- .../vis_type_timeseries/public/components/color_rules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.js index fcd80ae8844c07..d649777b56438b 100644 --- a/src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.js +++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/color_rules.js @@ -46,7 +46,7 @@ class ColorRulesUI extends Component { const part = {}; part[name] = cast(_.get(e, '[0].value', _.get(e, 'target.value'))); if (part[name] === 'undefined') part[name] = undefined; - if (part[name] === NaN) part[name] = undefined; + if (isNaN(part[name])) part[name] = undefined; handleChange(_.assign({}, item, part)); }; } From 2c311ce8259cc81acac321a09033237f0ce39a6c Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Mon, 2 Dec 2019 15:21:45 +0100 Subject: [PATCH 15/39] refactor: replace 'change' to arrow in index pattern selector (#51954) --- .../discover_index_pattern_title.tsx | 21 ++++++++++--------- .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_title.tsx b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_title.tsx index 23679c4db5a7f2..fb5c3c8d45ce85 100644 --- a/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_title.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/components/field_chooser/discover_index_pattern_title.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { EuiToolTip, EuiFlexItem, EuiFlexGroup, EuiTitle, EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; - +import { i18n } from '@kbn/i18n'; export interface DiscoverIndexPatternTitleProps { /** * determines whether the change link is displayed @@ -65,18 +65,19 @@ export function DiscoverIndexPatternTitle({ } > onChange()} - > - ( - - ) - + iconSide="right" + iconType="arrowDown" + color="text" + /> )} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 4fd99b2c888a31..dc1be496d2877c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2492,8 +2492,8 @@ "kbn.context.olderDocumentsWarning": "アンカーよりも古いドキュメントは {docCount} 件しか見つかりませんでした。", "kbn.context.olderDocumentsWarningZero": "アンカーよりも古いドキュメントは見つかりませんでした。", "kbn.discover.fieldChooser.fieldFilterFacetButtonLabel": "フィルタリングされたフィールド", - "kbn.discover.fieldChooser.indexPattern.changeLinkLabel": "変更", "kbn.discover.fieldChooser.indexPattern.changeLinkTooltip": "現在のインデックスパターンを変更", + "kbn.discover.fieldChooser.indexPattern.changeLinkAriaLabel": "現在のインデックスパターンを変更", "kbn.discover.fieldChooser.searchPlaceHolder": "検索フィールド", "kbn.discover.histogram.partialData.bucketTooltipText": "選択された時間範囲にはこのバケット全体は含まれていませんが、一部データが含まれている可能性があります。", "kbn.doc.failedToLocateIndexPattern": "ID {indexPatternId} に一致するインデックスパターンがありません", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 52b67473c1b916..f4db392b494d2d 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2493,8 +2493,8 @@ "kbn.context.olderDocumentsWarning": "仅可以找到 {docCount} 个比定位标记旧的文档。", "kbn.context.olderDocumentsWarningZero": "找不到比定位标记旧的文档。", "kbn.discover.fieldChooser.fieldFilterFacetButtonLabel": "已筛选字段", - "kbn.discover.fieldChooser.indexPattern.changeLinkLabel": "更改", "kbn.discover.fieldChooser.indexPattern.changeLinkTooltip": "更改当前索引模式", + "kbn.discover.fieldChooser.indexPattern.changeLinkAriaLabel": "更改当前索引模式", "kbn.discover.fieldChooser.searchPlaceHolder": "搜索字段", "kbn.discover.histogram.partialData.bucketTooltipText": "选定的时间范围不包括此整个存储桶,其可能包含部分数据。", "kbn.doc.failedToLocateIndexPattern": "无索引模式匹配 ID {indexPatternId}", From 4e820b5be1cd44c3dcdb3d3e1603a90f8591ca17 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Mon, 2 Dec 2019 18:27:25 +0200 Subject: [PATCH 16/39] =?UTF-8?q?move=20saved=20query=20UI=20components=20?= =?UTF-8?q?=E2=87=92=20NP=20(#51870)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * move saved query UI components to NP * Fixed search bar test * Added service to siem mock * change import css --- .../core_plugins/data/public/index.scss | 6 +----- .../data/public/search/search_bar/_index.scss | 1 - .../search_bar/components/search_bar.test.tsx | 6 +++++- .../search_bar/components/search_bar.tsx | 12 ++++------- .../data/public/index_patterns/index.ts | 2 +- .../public/index_patterns/{ => lib}/errors.ts | 2 +- .../data/public/index_patterns/lib/index.ts | 1 + .../value_suggestions.test.ts | 3 --- src/plugins/data/public/ui/_index.scss | 6 ++++++ .../lib/filter_editor_utils.test.ts | 2 -- src/plugins/data/public/ui/index.ts | 4 +++- .../data/public/ui/saved_query_form/index.ts | 20 +++++++++++++++++++ .../ui/saved_query_form}/save_query_form.tsx | 6 +----- .../ui}/saved_query_management/_index.scss | 0 .../_saved_query_list_item.scss | 0 .../_saved_query_management_component.scss | 0 .../public/ui/saved_query_management/index.ts | 20 +++++++++++++++++++ .../saved_query_list_item.tsx | 2 +- .../saved_query_management_component.tsx | 2 +- .../siem/public/mock/test_providers.tsx | 5 +++++ 20 files changed, 70 insertions(+), 30 deletions(-) delete mode 100644 src/legacy/core_plugins/data/public/search/search_bar/_index.scss rename src/plugins/data/public/index_patterns/{ => lib}/errors.ts (95%) create mode 100644 src/plugins/data/public/ui/_index.scss create mode 100644 src/plugins/data/public/ui/saved_query_form/index.ts rename src/{legacy/core_plugins/data/public/search/search_bar/components/saved_query_management => plugins/data/public/ui/saved_query_form}/save_query_form.tsx (98%) rename src/{legacy/core_plugins/data/public/search/search_bar/components => plugins/data/public/ui}/saved_query_management/_index.scss (100%) rename src/{legacy/core_plugins/data/public/search/search_bar/components => plugins/data/public/ui}/saved_query_management/_saved_query_list_item.scss (100%) rename src/{legacy/core_plugins/data/public/search/search_bar/components => plugins/data/public/ui}/saved_query_management/_saved_query_management_component.scss (100%) create mode 100644 src/plugins/data/public/ui/saved_query_management/index.ts rename src/{legacy/core_plugins/data/public/search/search_bar/components => plugins/data/public/ui}/saved_query_management/saved_query_list_item.tsx (98%) rename src/{legacy/core_plugins/data/public/search/search_bar/components => plugins/data/public/ui}/saved_query_management/saved_query_management_component.tsx (99%) diff --git a/src/legacy/core_plugins/data/public/index.scss b/src/legacy/core_plugins/data/public/index.scss index 94f02fe2d60495..78673525a54835 100644 --- a/src/legacy/core_plugins/data/public/index.scss +++ b/src/legacy/core_plugins/data/public/index.scss @@ -2,8 +2,4 @@ @import './query/query_bar/index'; -@import 'src/plugins/data/public/ui/filter_bar/index'; - -@import 'src/plugins/data/public/ui/typeahead/index'; - -@import './search/search_bar/index'; +@import '../../../../plugins/data/public/ui/index' \ No newline at end of file diff --git a/src/legacy/core_plugins/data/public/search/search_bar/_index.scss b/src/legacy/core_plugins/data/public/search/search_bar/_index.scss deleted file mode 100644 index 0c42a9426e41e0..00000000000000 --- a/src/legacy/core_plugins/data/public/search/search_bar/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'components/saved_query_management/index'; diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.test.tsx b/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.test.tsx index 0605b156a96691..b4fd3f45785441 100644 --- a/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.test.tsx +++ b/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.test.tsx @@ -38,7 +38,6 @@ const mockTimeHistory = { jest.mock('../../../../../../../plugins/data/public', () => { return { FilterBar: () =>
, - createSavedQueryService: () => {}, }; }); @@ -106,6 +105,11 @@ function wrapSearchBarInContext(testProps: any) { notifications: startMock.notifications, http: startMock.http, storage: createMockStorage(), + data: { + query: { + savedQueries: {}, + }, + }, }; return ( diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.tsx b/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.tsx index da08165289afc2..b24ea763ace750 100644 --- a/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.tsx +++ b/src/legacy/core_plugins/data/public/search/search_bar/components/search_bar.tsx @@ -26,8 +26,6 @@ import { get, isEqual } from 'lodash'; import { IndexPattern } from '../../../../../data/public'; import { QueryBarTopRow } from '../../../query'; -import { SavedQueryMeta, SaveQueryForm } from './saved_query_management/save_query_form'; -import { SavedQueryManagementComponent } from './saved_query_management/saved_query_management_component'; import { withKibana, @@ -40,10 +38,11 @@ import { esFilters, TimeHistoryContract, FilterBar, - SavedQueryService, - createSavedQueryService, SavedQuery, SavedQueryAttributes, + SavedQueryMeta, + SaveQueryForm, + SavedQueryManagementComponent, } from '../../../../../../../plugins/data/public'; interface SearchBarInjectedDeps { @@ -112,8 +111,8 @@ class SearchBarUI extends Component { showAutoRefreshOnly: false, }; - private savedQueryService!: SavedQueryService; private services = this.props.kibana.services; + private savedQueryService = this.services.data.query.savedQueries; public filterBarRef: Element | null = null; public filterBarWrapperRef: Element | null = null; @@ -368,9 +367,6 @@ class SearchBarUI extends Component { this.setFilterBarHeight(); this.ro.observe(this.filterBarRef); } - if (this.services.savedObjects) { - this.savedQueryService = createSavedQueryService(this.services.savedObjects.client); - } } public componentDidUpdate() { diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index 7492f9372e44a6..a22a8b8d858134 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -17,12 +17,12 @@ * under the License. */ -import { IndexPatternMissingIndices } from './errors'; import { ILLEGAL_CHARACTERS_KEY, CONTAINS_SPACES_KEY, ILLEGAL_CHARACTERS_VISIBLE, ILLEGAL_CHARACTERS, + IndexPatternMissingIndices, validateIndexPattern, } from './lib'; import { getRoutes, getFromSavedObject } from './utils'; diff --git a/src/plugins/data/public/index_patterns/errors.ts b/src/plugins/data/public/index_patterns/lib/errors.ts similarity index 95% rename from src/plugins/data/public/index_patterns/errors.ts rename to src/plugins/data/public/index_patterns/lib/errors.ts index 3eb43eaf460cc8..12efab7a2ca40d 100644 --- a/src/plugins/data/public/index_patterns/errors.ts +++ b/src/plugins/data/public/index_patterns/lib/errors.ts @@ -19,7 +19,7 @@ /* eslint-disable */ -import { KbnError } from '../../../kibana_utils/public'; +import { KbnError } from '../../../../kibana_utils/public'; /** * Tried to call a method that relies on SearchSource having an indexPattern assigned diff --git a/src/plugins/data/public/index_patterns/lib/index.ts b/src/plugins/data/public/index_patterns/lib/index.ts index 0f667e846af91d..626881b721c33b 100644 --- a/src/plugins/data/public/index_patterns/lib/index.ts +++ b/src/plugins/data/public/index_patterns/lib/index.ts @@ -20,3 +20,4 @@ export { getTitle } from './get_title'; export * from './types'; export { validateIndexPattern } from './validate_index_pattern'; +export { IndexPatternMissingIndices } from './errors'; diff --git a/src/plugins/data/public/suggestions_provider/value_suggestions.test.ts b/src/plugins/data/public/suggestions_provider/value_suggestions.test.ts index 02aaaaf6f46890..9089105b4e3a82 100644 --- a/src/plugins/data/public/suggestions_provider/value_suggestions.test.ts +++ b/src/plugins/data/public/suggestions_provider/value_suggestions.test.ts @@ -17,9 +17,6 @@ * under the License. */ -// TODO: remove when index patterns are moved here. -jest.mock('ui/new_platform'); - import { stubIndexPattern, stubFields } from '../stubs'; import { getSuggestionsProvider } from './value_suggestions'; import { IUiSettingsClient } from 'kibana/public'; diff --git a/src/plugins/data/public/ui/_index.scss b/src/plugins/data/public/ui/_index.scss new file mode 100644 index 00000000000000..1fc673d5450c27 --- /dev/null +++ b/src/plugins/data/public/ui/_index.scss @@ -0,0 +1,6 @@ + +@import './filter_bar/index'; + +@import './typeahead/index'; + +@import './saved_query_management/index'; diff --git a/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.test.ts b/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.test.ts index 2cc7f16cfe261b..fb3fbc10d74552 100644 --- a/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.test.ts +++ b/src/plugins/data/public/ui/filter_bar/filter_editor/lib/filter_editor_utils.test.ts @@ -36,8 +36,6 @@ import { import { existsOperator, isBetweenOperator, isOneOfOperator, isOperator } from './filter_operators'; -jest.mock('ui/new_platform'); - describe('Filter editor utils', () => { describe('getFieldFromFilter', () => { it('should return the field from the filter', () => { diff --git a/src/plugins/data/public/ui/index.ts b/src/plugins/data/public/ui/index.ts index 6fb8e260dd7205..d549ceabde86d4 100644 --- a/src/plugins/data/public/ui/index.ts +++ b/src/plugins/data/public/ui/index.ts @@ -21,5 +21,7 @@ export { SuggestionsComponent } from './typeahead/suggestions_component'; export { IndexPatternSelect } from './index_pattern_select'; export { FilterBar } from './filter_bar'; export { applyFiltersPopover } from './apply_filters'; -// temp export +// temp export - will be removed as final components are migrated to NP export { QueryLanguageSwitcher } from './query_string_input/language_switcher'; +export { SavedQueryManagementComponent } from './saved_query_management'; +export { SaveQueryForm, SavedQueryMeta } from './saved_query_form'; diff --git a/src/plugins/data/public/ui/saved_query_form/index.ts b/src/plugins/data/public/ui/saved_query_form/index.ts new file mode 100644 index 00000000000000..c52b6c92ef6d3e --- /dev/null +++ b/src/plugins/data/public/ui/saved_query_form/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { SavedQueryMeta, SaveQueryForm } from '../saved_query_form/save_query_form'; diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/save_query_form.tsx b/src/plugins/data/public/ui/saved_query_form/save_query_form.tsx similarity index 98% rename from src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/save_query_form.tsx rename to src/plugins/data/public/ui/saved_query_form/save_query_form.tsx index 4515c71baa2671..f9a0ae4e803c44 100644 --- a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/save_query_form.tsx +++ b/src/plugins/data/public/ui/saved_query_form/save_query_form.tsx @@ -35,11 +35,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { sortBy, isEqual } from 'lodash'; -import { - SavedQuery, - SavedQueryAttributes, - SavedQueryService, -} from '../../../../../../../../plugins/data/public'; +import { SavedQuery, SavedQueryAttributes, SavedQueryService } from '../..'; interface Props { savedQuery?: SavedQueryAttributes; diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/_index.scss b/src/plugins/data/public/ui/saved_query_management/_index.scss similarity index 100% rename from src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/_index.scss rename to src/plugins/data/public/ui/saved_query_management/_index.scss diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/_saved_query_list_item.scss b/src/plugins/data/public/ui/saved_query_management/_saved_query_list_item.scss similarity index 100% rename from src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/_saved_query_list_item.scss rename to src/plugins/data/public/ui/saved_query_management/_saved_query_list_item.scss diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/_saved_query_management_component.scss b/src/plugins/data/public/ui/saved_query_management/_saved_query_management_component.scss similarity index 100% rename from src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/_saved_query_management_component.scss rename to src/plugins/data/public/ui/saved_query_management/_saved_query_management_component.scss diff --git a/src/plugins/data/public/ui/saved_query_management/index.ts b/src/plugins/data/public/ui/saved_query_management/index.ts new file mode 100644 index 00000000000000..be5ea0cd7c8e72 --- /dev/null +++ b/src/plugins/data/public/ui/saved_query_management/index.ts @@ -0,0 +1,20 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { SavedQueryManagementComponent } from './saved_query_management_component'; diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/saved_query_list_item.tsx b/src/plugins/data/public/ui/saved_query_management/saved_query_list_item.tsx similarity index 98% rename from src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/saved_query_list_item.tsx rename to src/plugins/data/public/ui/saved_query_management/saved_query_list_item.tsx index bee32c347e6f45..09eeb8359dde7e 100644 --- a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/saved_query_list_item.tsx +++ b/src/plugins/data/public/ui/saved_query_management/saved_query_list_item.tsx @@ -22,7 +22,7 @@ import { EuiListGroupItem, EuiConfirmModal, EuiOverlayMask, EuiIconTip } from '@ import React, { Fragment, useState } from 'react'; import classNames from 'classnames'; import { i18n } from '@kbn/i18n'; -import { SavedQuery } from '../../../../../../../../plugins/data/public'; +import { SavedQuery } from '../..'; interface Props { savedQuery: SavedQuery; diff --git a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/saved_query_management_component.tsx b/src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx similarity index 99% rename from src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/saved_query_management_component.tsx rename to src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx index 65ed92c40741bd..2a11531ee336df 100644 --- a/src/legacy/core_plugins/data/public/search/search_bar/components/saved_query_management/saved_query_management_component.tsx +++ b/src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx @@ -35,7 +35,7 @@ import { import { i18n } from '@kbn/i18n'; import React, { FunctionComponent, useEffect, useState, Fragment } from 'react'; import { sortBy } from 'lodash'; -import { SavedQuery, SavedQueryService } from '../../../../../../../../plugins/data/public'; +import { SavedQuery, SavedQueryService } from '../..'; import { SavedQueryListItem } from './saved_query_list_item'; const perPage = 50; diff --git a/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx b/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx index d4a7bb1f425d4b..e573afaafc2d2d 100644 --- a/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx +++ b/x-pack/legacy/plugins/siem/public/mock/test_providers.tsx @@ -58,6 +58,11 @@ const services = { storage: { get: () => {}, }, + data: { + query: { + savedQueries: {}, + }, + }, }; const localStorageMock = () => { From 5906801b4f96e76f2a85abc62feb0d4c81d59c01 Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Mon, 2 Dec 2019 11:43:06 -0500 Subject: [PATCH 17/39] Http compression config (#50738) HTTP compression for responses may be disabled entirely, or it may be conditionally enabled based on a whitelist of trusted referrers. --- docs/setup/settings.asciidoc | 6 ++ .../__snapshots__/http_config.test.ts.snap | 43 ++++++++-- ...test.ts => cookie_session_storage.test.ts} | 1 + src/core/server/http/http_config.test.ts | 56 ++++++++++-- src/core/server/http/http_config.ts | 16 ++++ src/core/server/http/http_server.test.ts | 85 +++++++++++++++++++ src/core/server/http/http_server.ts | 29 +++++++ src/core/server/http/http_tools.test.ts | 1 + .../http/integration_tests/lifecycle.test.ts | 1 + .../http/integration_tests/router.test.ts | 1 + ...gacy_object_to_config_adapter.test.ts.snap | 6 ++ .../legacy_object_to_config_adapter.test.ts | 2 + .../config/legacy_object_to_config_adapter.ts | 1 + src/legacy/server/config/schema.js | 1 + test/api_integration/apis/core/index.js | 56 +++++++++--- test/api_integration/apis/index.js | 1 + test/api_integration/config.js | 1 + 17 files changed, 284 insertions(+), 23 deletions(-) rename src/core/server/http/{cookie_sesson_storage.test.ts => cookie_session_storage.test.ts} (99%) diff --git a/docs/setup/settings.asciidoc b/docs/setup/settings.asciidoc index f2c06a3737c7c9..5605ed5c56688c 100644 --- a/docs/setup/settings.asciidoc +++ b/docs/setup/settings.asciidoc @@ -258,6 +258,12 @@ running behind a proxy. Use the `server.rewriteBasePath` setting to tell Kibana if it should remove the basePath from requests it receives, and to prevent a deprecation warning at startup. This setting cannot end in a slash (`/`). +[[server-compression]]`server.compression.enabled:`:: *Default: `true`* Set to `false` to disable HTTP compression for all responses. + +`server.compression.referrerWhitelist:`:: *Default: none* Specifies an array of trusted hostnames, such as the Kibana host, or a reverse +proxy sitting in front of it. This determines whether HTTP compression may be used for responses, based on the request's `Referer` header. +This setting may not be used when `server.compression.enabled` is set to `false`. + [[server-cors]]`server.cors:`:: *Default: `false`* Set to `true` to enable CORS support. This setting is required to configure `server.cors.origin`. `server.cors.origin:`:: *Default: none* Specifies origins. "origin" must be an array. To use this setting, you must set `server.cors` to `true`. To accept all origins, use `server.cors.origin: ["*"]`. diff --git a/src/core/server/http/__snapshots__/http_config.test.ts.snap b/src/core/server/http/__snapshots__/http_config.test.ts.snap index 57d9db5e8c1e4f..6c690f9da70c3f 100644 --- a/src/core/server/http/__snapshots__/http_config.test.ts.snap +++ b/src/core/server/http/__snapshots__/http_config.test.ts.snap @@ -1,17 +1,35 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`accepts valid hostnames: valid host names 1`] = ` +exports[`accepts valid hostnames 1`] = ` Object { - "host1": "www.example.com", - "host2": "8.8.8.8", - "host3": "::1", - "host4": "localhost", + "host": "www.example.com", +} +`; + +exports[`accepts valid hostnames 2`] = ` +Object { + "host": "8.8.8.8", +} +`; + +exports[`accepts valid hostnames 3`] = ` +Object { + "host": "::1", +} +`; + +exports[`accepts valid hostnames 4`] = ` +Object { + "host": "localhost", } `; exports[`has defaults for config 1`] = ` Object { "autoListen": true, + "compression": Object { + "enabled": true, + }, "cors": false, "host": "localhost", "keepaliveTimeout": 120000, @@ -82,3 +100,18 @@ exports[`with TLS throws if TLS is enabled but \`certificate\` is not specified exports[`with TLS throws if TLS is enabled but \`key\` is not specified 1`] = `"[ssl]: must specify [certificate] and [key] when ssl is enabled"`; exports[`with TLS throws if TLS is enabled but \`redirectHttpFromPort\` is equal to \`port\` 1`] = `"Kibana does not accept http traffic to [port] when ssl is enabled (only https is allowed), so [ssl.redirectHttpFromPort] cannot be configured to the same value. Both are [1234]."`; + +exports[`with compression accepts valid referrer whitelist 1`] = ` +Array [ + "www.example.com", + "8.8.8.8", + "::1", + "localhost", +] +`; + +exports[`with compression throws if invalid referrer whitelist 1`] = `"[compression.referrerWhitelist.0]: value is [asdf$%^] but it must be a valid hostname (see RFC 1123)."`; + +exports[`with compression throws if invalid referrer whitelist 2`] = `"[compression.referrerWhitelist]: array size is [0], but cannot be smaller than [1]"`; + +exports[`with compression throws if referrer whitelist is specified and compression is disabled 1`] = `"cannot use [compression.referrerWhitelist] when [compression.enabled] is set to false"`; diff --git a/src/core/server/http/cookie_sesson_storage.test.ts b/src/core/server/http/cookie_session_storage.test.ts similarity index 99% rename from src/core/server/http/cookie_sesson_storage.test.ts rename to src/core/server/http/cookie_session_storage.test.ts index bf0585ad280d50..0e4f3972fe9dc6 100644 --- a/src/core/server/http/cookie_sesson_storage.test.ts +++ b/src/core/server/http/cookie_session_storage.test.ts @@ -57,6 +57,7 @@ configService.atPath.mockReturnValue( ssl: { verificationMode: 'none', }, + compression: { enabled: true }, } as any) ); diff --git a/src/core/server/http/http_config.test.ts b/src/core/server/http/http_config.test.ts index 2b627c265dbba3..1ee7e13d5e8511 100644 --- a/src/core/server/http/http_config.test.ts +++ b/src/core/server/http/http_config.test.ts @@ -21,6 +21,9 @@ import { config, HttpConfig } from '.'; import { Env } from '../config'; import { getEnvOptions } from '../config/__mocks__/env'; +const validHostnames = ['www.example.com', '8.8.8.8', '::1', 'localhost']; +const invalidHostname = 'asdf$%^'; + test('has defaults for config', () => { const httpSchema = config.schema; const obj = {}; @@ -28,18 +31,16 @@ test('has defaults for config', () => { }); test('accepts valid hostnames', () => { - const { host: host1 } = config.schema.validate({ host: 'www.example.com' }); - const { host: host2 } = config.schema.validate({ host: '8.8.8.8' }); - const { host: host3 } = config.schema.validate({ host: '::1' }); - const { host: host4 } = config.schema.validate({ host: 'localhost' }); - - expect({ host1, host2, host3, host4 }).toMatchSnapshot('valid host names'); + for (const val of validHostnames) { + const { host } = config.schema.validate({ host: val }); + expect({ host }).toMatchSnapshot(); + } }); test('throws if invalid hostname', () => { const httpSchema = config.schema; const obj = { - host: 'asdf$%^', + host: invalidHostname, }; expect(() => httpSchema.validate(obj)).toThrowErrorMatchingSnapshot(); }); @@ -296,3 +297,44 @@ describe('with TLS', () => { expect(httpConfig.ssl.rejectUnauthorized).toBe(true); }); }); + +describe('with compression', () => { + test('accepts valid referrer whitelist', () => { + const { + compression: { referrerWhitelist }, + } = config.schema.validate({ + compression: { + referrerWhitelist: validHostnames, + }, + }); + + expect(referrerWhitelist).toMatchSnapshot(); + }); + + test('throws if invalid referrer whitelist', () => { + const httpSchema = config.schema; + const invalidHostnames = { + compression: { + referrerWhitelist: [invalidHostname], + }, + }; + const emptyArray = { + compression: { + referrerWhitelist: [], + }, + }; + expect(() => httpSchema.validate(invalidHostnames)).toThrowErrorMatchingSnapshot(); + expect(() => httpSchema.validate(emptyArray)).toThrowErrorMatchingSnapshot(); + }); + + test('throws if referrer whitelist is specified and compression is disabled', () => { + const httpSchema = config.schema; + const obj = { + compression: { + enabled: false, + referrerWhitelist: validHostnames, + }, + }; + expect(() => httpSchema.validate(obj)).toThrowErrorMatchingSnapshot(); + }); +}); diff --git a/src/core/server/http/http_config.ts b/src/core/server/http/http_config.ts index c4a61aaf83ac79..89676380610a94 100644 --- a/src/core/server/http/http_config.ts +++ b/src/core/server/http/http_config.ts @@ -72,12 +72,26 @@ export const config = { socketTimeout: schema.number({ defaultValue: 120000, }), + compression: schema.object({ + enabled: schema.boolean({ defaultValue: true }), + referrerWhitelist: schema.maybe( + schema.arrayOf( + schema.string({ + hostname: true, + }), + { minSize: 1 } + ) + ), + }), }, { validate: rawConfig => { if (!rawConfig.basePath && rawConfig.rewriteBasePath) { return 'cannot use [rewriteBasePath] when [basePath] is not specified'; } + if (!rawConfig.compression.enabled && rawConfig.compression.referrerWhitelist) { + return 'cannot use [compression.referrerWhitelist] when [compression.enabled] is set to false'; + } if ( rawConfig.ssl.enabled && @@ -109,6 +123,7 @@ export class HttpConfig { public publicDir: string; public defaultRoute?: string; public ssl: SslConfig; + public compression: { enabled: boolean; referrerWhitelist?: string[] }; /** * @internal @@ -126,5 +141,6 @@ export class HttpConfig { this.publicDir = env.staticFilesDir; this.ssl = new SslConfig(rawConfig.ssl || {}); this.defaultRoute = rawConfig.defaultRoute; + this.compression = rawConfig.compression; } } diff --git a/src/core/server/http/http_server.test.ts b/src/core/server/http/http_server.test.ts index df47ffdc1176b9..27d9f530050bea 100644 --- a/src/core/server/http/http_server.test.ts +++ b/src/core/server/http/http_server.test.ts @@ -53,6 +53,7 @@ beforeEach(() => { maxPayload: new ByteSizeValue(1024), port: 10002, ssl: { enabled: false }, + compression: { enabled: true }, } as HttpConfig; configWithSSL = { @@ -578,6 +579,90 @@ test('exposes route details of incoming request to a route handler', async () => }); }); +describe('conditional compression', () => { + async function setupServer(innerConfig: HttpConfig) { + const { registerRouter, server: innerServer } = await server.setup(innerConfig); + const router = new Router('', logger, enhanceWithContext); + // we need the large body here so that compression would normally be used + const largeRequest = { + body: 'hello'.repeat(500), + headers: { 'Content-Type': 'text/html; charset=UTF-8' }, + }; + router.get({ path: '/', validate: false }, (_context, _req, res) => res.ok(largeRequest)); + registerRouter(router); + await server.start(); + return innerServer.listener; + } + + test('with `compression.enabled: true`', async () => { + const listener = await setupServer(config); + + const response = await supertest(listener) + .get('/') + .set('accept-encoding', 'gzip'); + + expect(response.header).toHaveProperty('content-encoding', 'gzip'); + }); + + test('with `compression.enabled: false`', async () => { + const listener = await setupServer({ + ...config, + compression: { enabled: false }, + }); + + const response = await supertest(listener) + .get('/') + .set('accept-encoding', 'gzip'); + + expect(response.header).not.toHaveProperty('content-encoding'); + }); + + describe('with defined `compression.referrerWhitelist`', () => { + let listener: Server; + beforeEach(async () => { + listener = await setupServer({ + ...config, + compression: { enabled: true, referrerWhitelist: ['foo'] }, + }); + }); + + test('enables compression for no referer', async () => { + const response = await supertest(listener) + .get('/') + .set('accept-encoding', 'gzip'); + + expect(response.header).toHaveProperty('content-encoding', 'gzip'); + }); + + test('enables compression for whitelisted referer', async () => { + const response = await supertest(listener) + .get('/') + .set('accept-encoding', 'gzip') + .set('referer', 'http://foo:1234'); + + expect(response.header).toHaveProperty('content-encoding', 'gzip'); + }); + + test('disables compression for non-whitelisted referer', async () => { + const response = await supertest(listener) + .get('/') + .set('accept-encoding', 'gzip') + .set('referer', 'http://bar:1234'); + + expect(response.header).not.toHaveProperty('content-encoding'); + }); + + test('disables compression for invalid referer', async () => { + const response = await supertest(listener) + .get('/') + .set('accept-encoding', 'gzip') + .set('referer', 'http://asdf$%^'); + + expect(response.header).not.toHaveProperty('content-encoding'); + }); + }); +}); + test('exposes route details of incoming request to a route handler (POST + payload options)', async () => { const { registerRouter, server: innerServer } = await server.setup(config); diff --git a/src/core/server/http/http_server.ts b/src/core/server/http/http_server.ts index a587eed1f54eca..f77184fb79ab63 100644 --- a/src/core/server/http/http_server.ts +++ b/src/core/server/http/http_server.ts @@ -18,6 +18,7 @@ */ import { Request, Server } from 'hapi'; +import url from 'url'; import { Logger, LoggerFactory } from '../logging'; import { HttpConfig } from './http_config'; @@ -96,6 +97,7 @@ export class HttpServer { const basePathService = new BasePath(config.basePath); this.setupBasePathRewrite(config, basePathService); + this.setupConditionalCompression(config); return { registerRouter: this.registerRouter.bind(this), @@ -187,6 +189,33 @@ export class HttpServer { }); } + private setupConditionalCompression(config: HttpConfig) { + if (this.server === undefined) { + throw new Error('Server is not created yet'); + } + + const { enabled, referrerWhitelist: list } = config.compression; + if (!enabled) { + this.log.debug('HTTP compression is disabled'); + this.server.ext('onRequest', (request, h) => { + request.info.acceptEncoding = ''; + return h.continue; + }); + } else if (list) { + this.log.debug(`HTTP compression is only enabled for any referrer in the following: ${list}`); + this.server.ext('onRequest', (request, h) => { + const { referrer } = request.info; + if (referrer !== '') { + const { hostname } = url.parse(referrer); + if (!hostname || !list.includes(hostname)) { + request.info.acceptEncoding = ''; + } + } + return h.continue; + }); + } + } + private registerOnPostAuth(fn: OnPostAuthHandler) { if (this.server === undefined) { throw new Error('Server is not created yet'); diff --git a/src/core/server/http/http_tools.test.ts b/src/core/server/http/http_tools.test.ts index bed0ac8d770949..7195717d9d3fc5 100644 --- a/src/core/server/http/http_tools.test.ts +++ b/src/core/server/http/http_tools.test.ts @@ -90,6 +90,7 @@ describe('timeouts', () => { host: '127.0.0.1', maxPayload: new ByteSizeValue(1024), ssl: {}, + compression: { enabled: true }, } as HttpConfig); registerRouter(router); diff --git a/src/core/server/http/integration_tests/lifecycle.test.ts b/src/core/server/http/integration_tests/lifecycle.test.ts index 7c4a0097456ca8..d5f9343f3e9818 100644 --- a/src/core/server/http/integration_tests/lifecycle.test.ts +++ b/src/core/server/http/integration_tests/lifecycle.test.ts @@ -51,6 +51,7 @@ configService.atPath.mockReturnValue( ssl: { enabled: false, }, + compression: { enabled: true }, } as any) ); diff --git a/src/core/server/http/integration_tests/router.test.ts b/src/core/server/http/integration_tests/router.test.ts index 481d8e1bbf49bf..463f941ba84b4c 100644 --- a/src/core/server/http/integration_tests/router.test.ts +++ b/src/core/server/http/integration_tests/router.test.ts @@ -51,6 +51,7 @@ configService.atPath.mockReturnValue( ssl: { enabled: false, }, + compression: { enabled: true }, } as any) ); diff --git a/src/core/server/legacy/config/__snapshots__/legacy_object_to_config_adapter.test.ts.snap b/src/core/server/legacy/config/__snapshots__/legacy_object_to_config_adapter.test.ts.snap index e59312cf8a9484..172feec6746773 100644 --- a/src/core/server/legacy/config/__snapshots__/legacy_object_to_config_adapter.test.ts.snap +++ b/src/core/server/legacy/config/__snapshots__/legacy_object_to_config_adapter.test.ts.snap @@ -4,6 +4,9 @@ exports[`#get correctly handles server config.: default 1`] = ` Object { "autoListen": true, "basePath": "/abc", + "compression": Object { + "enabled": true, + }, "cors": false, "host": "host", "keepaliveTimeout": 5000, @@ -23,6 +26,9 @@ exports[`#get correctly handles server config.: disabled ssl 1`] = ` Object { "autoListen": true, "basePath": "/abc", + "compression": Object { + "enabled": true, + }, "cors": false, "host": "host", "keepaliveTimeout": 5000, diff --git a/src/core/server/legacy/config/legacy_object_to_config_adapter.test.ts b/src/core/server/legacy/config/legacy_object_to_config_adapter.test.ts index 202a1e471af9b6..201f761701a35c 100644 --- a/src/core/server/legacy/config/legacy_object_to_config_adapter.test.ts +++ b/src/core/server/legacy/config/legacy_object_to_config_adapter.test.ts @@ -74,6 +74,7 @@ describe('#get', () => { port: 1234, rewriteBasePath: false, ssl: { enabled: true, keyPassphrase: 'some-phrase', someNewValue: 'new' }, + compression: { enabled: true }, someNotSupportedValue: 'val', }, }); @@ -90,6 +91,7 @@ describe('#get', () => { port: 1234, rewriteBasePath: false, ssl: { enabled: false, certificate: 'cert', key: 'key' }, + compression: { enabled: true }, someNotSupportedValue: 'val', }, }); diff --git a/src/core/server/legacy/config/legacy_object_to_config_adapter.ts b/src/core/server/legacy/config/legacy_object_to_config_adapter.ts index 0901458866fb31..6f0757dece165b 100644 --- a/src/core/server/legacy/config/legacy_object_to_config_adapter.ts +++ b/src/core/server/legacy/config/legacy_object_to_config_adapter.ts @@ -70,6 +70,7 @@ export class LegacyObjectToConfigAdapter extends ObjectToConfigAdapter { ssl: configValue.ssl, keepaliveTimeout: configValue.keepaliveTimeout, socketTimeout: configValue.socketTimeout, + compression: configValue.compression, }; } diff --git a/src/legacy/server/config/schema.js b/src/legacy/server/config/schema.js index 3f9b897730f51c..9e06fa178c5d67 100644 --- a/src/legacy/server/config/schema.js +++ b/src/legacy/server/config/schema.js @@ -106,6 +106,7 @@ export default () => Joi.object({ maxPayloadBytes: HANDLED_IN_NEW_PLATFORM, socketTimeout: HANDLED_IN_NEW_PLATFORM, ssl: HANDLED_IN_NEW_PLATFORM, + compression: HANDLED_IN_NEW_PLATFORM, }).default(), uiSettings: HANDLED_IN_NEW_PLATFORM, diff --git a/test/api_integration/apis/core/index.js b/test/api_integration/apis/core/index.js index d617b2ad073511..7c4047ac1f537b 100644 --- a/test/api_integration/apis/core/index.js +++ b/test/api_integration/apis/core/index.js @@ -16,21 +16,55 @@ * specific language governing permissions and limitations * under the License. */ +import expect from '@kbn/expect'; export default function ({ getService }) { const supertest = getService('supertest'); - describe('core request context', () => { - it('provides access to elasticsearch', async () => ( - await supertest - .get('/requestcontext/elasticsearch') - .expect(200, 'Elasticsearch: true') - )); + describe('core', () => { + describe('request context', () => { + it('provides access to elasticsearch', async () => ( + await supertest + .get('/requestcontext/elasticsearch') + .expect(200, 'Elasticsearch: true') + )); - it('provides access to SavedObjects client', async () => ( - await supertest - .get('/requestcontext/savedobjectsclient') - .expect(200, 'SavedObjects client: {"page":1,"per_page":20,"total":0,"saved_objects":[]}') - )); + it('provides access to SavedObjects client', async () => ( + await supertest + .get('/requestcontext/savedobjectsclient') + .expect(200, 'SavedObjects client: {"page":1,"per_page":20,"total":0,"saved_objects":[]}') + )); + }); + + describe('compression', () => { + it(`uses compression when there isn't a referer`, async () => { + await supertest + .get('/app/kibana') + .set('accept-encoding', 'gzip') + .then(response => { + expect(response.headers).to.have.property('content-encoding', 'gzip'); + }); + }); + + it(`uses compression when there is a whitelisted referer`, async () => { + await supertest + .get('/app/kibana') + .set('accept-encoding', 'gzip') + .set('referer', 'https://some-host.com') + .then(response => { + expect(response.headers).to.have.property('content-encoding', 'gzip'); + }); + }); + + it(`doesn't use compression when there is a non-whitelisted referer`, async () => { + await supertest + .get('/app/kibana') + .set('accept-encoding', 'gzip') + .set('referer', 'https://other.some-host.com') + .then(response => { + expect(response.headers).not.to.have.property('content-encoding'); + }); + }); + }); }); } diff --git a/test/api_integration/apis/index.js b/test/api_integration/apis/index.js index 9f2672959390ce..de36ee678b10ed 100644 --- a/test/api_integration/apis/index.js +++ b/test/api_integration/apis/index.js @@ -34,5 +34,6 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./status')); loadTestFile(require.resolve('./stats')); loadTestFile(require.resolve('./ui_metric')); + loadTestFile(require.resolve('./core')); }); } diff --git a/test/api_integration/config.js b/test/api_integration/config.js index d14630f932bf69..bd385b1ac8b960 100644 --- a/test/api_integration/config.js +++ b/test/api_integration/config.js @@ -40,6 +40,7 @@ export default async function ({ readConfigFile }) { '--optimize.enabled=false', '--elasticsearch.healthCheck.delay=3600000', '--server.xsrf.disableProtection=true', + '--server.compression.referrerWhitelist=["some-host.com"]', ], }, }; From b3cf3118081e9d0eff97b3ad2402eabd89e71260 Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Mon, 2 Dec 2019 11:50:20 -0500 Subject: [PATCH 18/39] [Maps] Move vector-style component to vector folder (#51779) --- x-pack/legacy/plugins/maps/public/layers/styles/_index.scss | 2 +- .../{ => vector}/components/_static_dynamic_style_row.scss | 0 .../styles/vector/components/color/vector_style_color_editor.js | 2 +- .../styles/vector/components/orientation/orientation_editor.js | 2 +- .../styles/vector/components/size/vector_style_size_editor.js | 2 +- .../styles/{ => vector}/components/static_dynamic_style_row.js | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) rename x-pack/legacy/plugins/maps/public/layers/styles/{ => vector}/components/_static_dynamic_style_row.scss (100%) rename x-pack/legacy/plugins/maps/public/layers/styles/{ => vector}/components/static_dynamic_style_row.js (98%) diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/_index.scss b/x-pack/legacy/plugins/maps/public/layers/styles/_index.scss index bd517f81517c23..9060a4a98a4bc3 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/_index.scss +++ b/x-pack/legacy/plugins/maps/public/layers/styles/_index.scss @@ -1,3 +1,3 @@ @import './components/color_gradient'; -@import './components/static_dynamic_style_row'; +@import './vector/components/static_dynamic_style_row'; @import './vector/components/color/color_stops'; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/components/_static_dynamic_style_row.scss b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/_static_dynamic_style_row.scss similarity index 100% rename from x-pack/legacy/plugins/maps/public/layers/styles/components/_static_dynamic_style_row.scss rename to x-pack/legacy/plugins/maps/public/layers/styles/vector/components/_static_dynamic_style_row.scss diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js index a39db57dc4883b..c38c2054860ad4 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js @@ -6,7 +6,7 @@ import React from 'react'; -import { StaticDynamicStyleRow } from '../../../components/static_dynamic_style_row'; +import { StaticDynamicStyleRow } from '../static_dynamic_style_row'; import { DynamicColorSelection } from './dynamic_color_selection'; import { StaticColorSelection } from './static_color_selection'; import { getVectorStyleLabel } from '../get_vector_style_label'; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/orientation/orientation_editor.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/orientation/orientation_editor.js index 65efddae909333..4c06739ced0655 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/orientation/orientation_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/orientation/orientation_editor.js @@ -6,7 +6,7 @@ import React from 'react'; -import { StaticDynamicStyleRow } from '../../../components/static_dynamic_style_row'; +import { StaticDynamicStyleRow } from '../static_dynamic_style_row'; import { DynamicOrientationSelection } from './dynamic_orientation_selection'; import { StaticOrientationSelection } from './static_orientation_selection'; import { i18n } from '@kbn/i18n'; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/size/vector_style_size_editor.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/size/vector_style_size_editor.js index ffaaace680a43c..187ca17f95b494 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/size/vector_style_size_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/size/vector_style_size_editor.js @@ -6,7 +6,7 @@ import React from 'react'; -import { StaticDynamicStyleRow } from '../../../components/static_dynamic_style_row'; +import { StaticDynamicStyleRow } from '../static_dynamic_style_row'; import { DynamicSizeSelection } from './dynamic_size_selection'; import { StaticSizeSelection } from './static_size_selection'; import { getVectorStyleLabel } from '../get_vector_style_label'; diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/components/static_dynamic_style_row.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/static_dynamic_style_row.js similarity index 98% rename from x-pack/legacy/plugins/maps/public/layers/styles/components/static_dynamic_style_row.js rename to x-pack/legacy/plugins/maps/public/layers/styles/vector/components/static_dynamic_style_row.js index 5537bb90fa245b..cfe7a0741a194c 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/components/static_dynamic_style_row.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/static_dynamic_style_row.js @@ -5,7 +5,7 @@ */ import React from 'react'; -import { VectorStyle } from '../vector/vector_style'; +import { VectorStyle } from '../vector_style'; import _ from 'lodash'; import { i18n } from '@kbn/i18n'; From d2846b618d4f82425fff52e3ef940cffdf2a4553 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 2 Dec 2019 10:02:19 -0700 Subject: [PATCH 19/39] [Maps] fix too_many_buckets_exception for top hits (#51497) * [Maps] fix too_many_buckets_exception for top hits * spelling * do not change re-fetch behavior when zooming in * i18n cleanup * review feedback --- .../es_search_source/es_search_source.js | 54 ++++++++++++------- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/es_search_source.js b/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/es_search_source.js index 24d9c45510aef6..57a43f924b7e64 100644 --- a/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/es_search_source.js +++ b/x-pack/legacy/plugins/maps/public/layers/sources/es_search_source/es_search_source.js @@ -241,10 +241,17 @@ export class ESSearchSource extends AbstractESSource { const searchSource = await this._makeSearchSource(searchFilters, 0); searchSource.setField('aggs', { + totalEntities: { + cardinality: { + field: topHitsSplitField, + precision_threshold: 1, + } + }, entitySplit: { terms: { field: topHitsSplitField, - size: ES_SIZE_LIMIT + size: ES_SIZE_LIMIT, + shard_size: ES_SIZE_LIMIT, }, aggs: { entityHits: { @@ -256,24 +263,29 @@ export class ESSearchSource extends AbstractESSource { const resp = await this._runEsQuery(layerName, searchSource, registerCancelCallback, 'Elasticsearch document top hits request'); - let hasTrimmedResults = false; const allHits = []; const entityBuckets = _.get(resp, 'aggregations.entitySplit.buckets', []); + const totalEntities = _.get(resp, 'aggregations.totalEntities.value', 0); + // can not compare entityBuckets.length to totalEntities because totalEntities is an approximate + const areEntitiesTrimmed = entityBuckets.length >= ES_SIZE_LIMIT; + let areTopHitsTrimmed = false; entityBuckets.forEach(entityBucket => { const total = _.get(entityBucket, 'entityHits.hits.total', 0); const hits = _.get(entityBucket, 'entityHits.hits.hits', []); // Reverse hits list so top documents by sort are drawn on top allHits.push(...hits.reverse()); if (total > hits.length) { - hasTrimmedResults = true; + areTopHitsTrimmed = true; } }); return { hits: allHits, meta: { - areResultsTrimmed: hasTrimmedResults, + areResultsTrimmed: areEntitiesTrimmed || areTopHitsTrimmed, // used to force re-fetch when zooming in + areEntitiesTrimmed, entityCount: entityBuckets.length, + totalEntities, } }; } @@ -459,24 +471,28 @@ export class ESSearchSource extends AbstractESSource { } if (this._isTopHits()) { - const entitiesFoundMsg = i18n.translate('xpack.maps.esSearch.topHitsEntitiesCountMsg', { - defaultMessage: `Found {entityCount} entities.`, - values: { entityCount: meta.entityCount } - }); - if (meta.areResultsTrimmed) { - const trimmedMsg = i18n.translate('xpack.maps.esSearch.topHitsResultsTrimmedMsg', { - defaultMessage: `Results limited to most recent {topHitsSize} documents per entity.`, - values: { topHitsSize: this._descriptor.topHitsSize } + const entitiesFoundMsg = meta.areEntitiesTrimmed + ? i18n.translate('xpack.maps.esSearch.topHitsResultsTrimmedMsg', { + defaultMessage: `Results limited to first {entityCount} entities of ~{totalEntities}.`, + values: { + entityCount: meta.entityCount, + totalEntities: meta.totalEntities, + } + }) + : i18n.translate('xpack.maps.esSearch.topHitsEntitiesCountMsg', { + defaultMessage: `Found {entityCount} entities.`, + values: { entityCount: meta.entityCount } }); - return { - tooltipContent: `${entitiesFoundMsg} ${trimmedMsg}`, - areResultsTrimmed: false - }; - } + const docsPerEntityMsg = i18n.translate('xpack.maps.esSearch.topHitsSizeMsg', { + defaultMessage: `Showing top {topHitsSize} documents per entity.`, + values: { topHitsSize: this._descriptor.topHitsSize } + }); return { - tooltipContent: entitiesFoundMsg, - areResultsTrimmed: false + tooltipContent: `${entitiesFoundMsg} ${docsPerEntityMsg}`, + // Used to show trimmed icon in legend + // user only needs to be notified of trimmed results when entities are trimmed + areResultsTrimmed: meta.areEntitiesTrimmed }; } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index dc1be496d2877c..3b7f3ded77290f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -6406,7 +6406,6 @@ "xpack.maps.esSearch.featureCountMsg": "{count} 件のドキュメントが見つかりました。", "xpack.maps.esSearch.resultsTrimmedMsg": "結果は初めの {count} 件のドキュメントに制限されています。", "xpack.maps.esSearch.topHitsEntitiesCountMsg": "{entityCount} 件のエントリーを発見.", - "xpack.maps.esSearch.topHitsResultsTrimmedMsg": "結果は各エンティティにつき最も最近の {topHitsSize} 件のドキュメントに制限されています。", "xpack.maps.feature.appDescription": "Elasticsearch と Elastic Maps Service の地理空間データを閲覧します", "xpack.maps.featureRegistry.mapsFeatureName": "Maps", "xpack.maps.geoGrid.resolutionLabel": "グリッド解像度", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f4db392b494d2d..017aa7d91d74be 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -6408,7 +6408,6 @@ "xpack.maps.esSearch.featureCountMsg": "找到 {count} 个文档。", "xpack.maps.esSearch.resultsTrimmedMsg": "结果仅限于前 {count} 个文档。", "xpack.maps.esSearch.topHitsEntitiesCountMsg": "找到 {entityCount} 个实体。", - "xpack.maps.esSearch.topHitsResultsTrimmedMsg": "结果仅限于每个实体的最近 {topHitsSize} 个文档。", "xpack.maps.feature.appDescription": "从 Elasticsearch 和 Elastic 地图服务浏览地理空间数据", "xpack.maps.featureRegistry.mapsFeatureName": "Maps", "xpack.maps.geoGrid.resolutionLabel": "网格分辨率", From 5b8b8a9d873397c6cba89641e09e4274232ce8c6 Mon Sep 17 00:00:00 2001 From: Pedro Luiz Cabral Salomon Prado Date: Mon, 2 Dec 2019 14:26:51 -0300 Subject: [PATCH 20/39] Removed duplicate attribute (#50001) --- .../core_plugins/kibana/public/dashboard/dashboard_app.html | 1 - 1 file changed, 1 deletion(-) diff --git a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.html b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.html index 0b842fbfaeddc5..4f41ab5d4fad6b 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.html +++ b/src/legacy/core_plugins/kibana/public/dashboard/dashboard_app.html @@ -12,7 +12,6 @@ show-filter-bar="showFilterBar()" show-save-query="showSaveQuery" - filters="model.filters" query="model.query" saved-query="savedQuery" screen-title="screenTitle" From 1883f4c9041091058a7b4911f30d4f0514e7ab9f Mon Sep 17 00:00:00 2001 From: Brandon Kobel Date: Mon, 2 Dec 2019 12:31:03 -0500 Subject: [PATCH 21/39] Update kibana.yml explanation of elasticsearch.ssl (#51451) --- config/kibana.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/kibana.yml b/config/kibana.yml index 47482f9e6d59f8..0780841ca057ed 100644 --- a/config/kibana.yml +++ b/config/kibana.yml @@ -51,7 +51,7 @@ # Optional settings that provide the paths to the PEM-format SSL certificate and key files. # These files are used to verify the identity of Kibana to Elasticsearch and are required when -# xpack.ssl.verification_mode in Elasticsearch is set to either certificate or full. +# xpack.security.http.ssl.client_authentication in Elasticsearch is set to required. #elasticsearch.ssl.certificate: /path/to/your/client.crt #elasticsearch.ssl.key: /path/to/your/client.key From e68b39b72d897337956eecd1e0f57ded911af192 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Mon, 2 Dec 2019 09:43:25 -0800 Subject: [PATCH 22/39] [DOCS] Fixes xpack-ref links (#51936) --- docs/setup/docker.asciidoc | 2 +- docs/setup/install/deb.asciidoc | 2 +- docs/setup/install/rpm.asciidoc | 2 +- docs/setup/install/targz.asciidoc | 2 +- docs/setup/install/windows.asciidoc | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/setup/docker.asciidoc b/docs/setup/docker.asciidoc index 0827cf5c730095..f3e7273adedeeb 100644 --- a/docs/setup/docker.asciidoc +++ b/docs/setup/docker.asciidoc @@ -9,7 +9,7 @@ https://github.com/elastic/kibana-docker/tree/{branch}[GitHub]. These images are free to use under the Elastic license. They contain open source and free commercial features and access to paid commercial features. -{xpack-ref}/license-management.html[Start a 30-day trial] to try out all of the +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the paid commercial features. See the https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. diff --git a/docs/setup/install/deb.asciidoc b/docs/setup/install/deb.asciidoc index 9cd83f44885cbe..62ab661d9a66cf 100644 --- a/docs/setup/install/deb.asciidoc +++ b/docs/setup/install/deb.asciidoc @@ -7,7 +7,7 @@ Kibana on any Debian-based system such as Debian and Ubuntu. This package is free to use under the Elastic license. It contains open source and free commercial features and access to paid commercial features. -{xpack-ref}/license-management.html[Start a 30-day trial] to try out all of the +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the paid commercial features. See the https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. diff --git a/docs/setup/install/rpm.asciidoc b/docs/setup/install/rpm.asciidoc index ddff35c61b5bb8..77a16e67cf2a42 100644 --- a/docs/setup/install/rpm.asciidoc +++ b/docs/setup/install/rpm.asciidoc @@ -11,7 +11,7 @@ such as SLES 11 and CentOS 5. Please see <> instead. This package is free to use under the Elastic license. It contains open source and free commercial features and access to paid commercial features. -{xpack-ref}/license-management.html[Start a 30-day trial] to try out all of the +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the paid commercial features. See the https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. diff --git a/docs/setup/install/targz.asciidoc b/docs/setup/install/targz.asciidoc index e3104520292ff3..d2143f39fba50e 100644 --- a/docs/setup/install/targz.asciidoc +++ b/docs/setup/install/targz.asciidoc @@ -6,7 +6,7 @@ are the easiest formats to use when trying out Kibana. These packages are free to use under the Elastic license. They contain open source and free commercial features and access to paid commercial features. -{xpack-ref}/license-management.html[Start a 30-day trial] to try out all of the +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the paid commercial features. See the https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. diff --git a/docs/setup/install/windows.asciidoc b/docs/setup/install/windows.asciidoc index b9f0224e676999..db55451f01aae3 100644 --- a/docs/setup/install/windows.asciidoc +++ b/docs/setup/install/windows.asciidoc @@ -5,7 +5,7 @@ Kibana can be installed on Windows using the `.zip` package. This package is free to use under the Elastic license. It contains open source and free commercial features and access to paid commercial features. -{xpack-ref}/license-management.html[Start a 30-day trial] to try out all of the +{stack-ov}/license-management.html[Start a 30-day trial] to try out all of the paid commercial features. See the https://www.elastic.co/subscriptions[Subscriptions] page for information about Elastic license levels. From 51c7922518024b892885a30d6c7ca1c9cdb59253 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 2 Dec 2019 12:14:58 -0600 Subject: [PATCH 23/39] [APM] Add NP feature catalog registration (#51765) * Move register_feature.js to legacy_register_feature.js * Add feature catalog registration to NP plugin * Add plugin dependencies in kibana.json Fixes #51542. --- x-pack/legacy/plugins/apm/index.ts | 2 +- .../apm/public/legacy_register_feature.js | 16 +++++++++ .../new-platform/featureCatalogueEntry.ts | 22 +++++++++++++ .../apm/public/new-platform/plugin.tsx | 12 +++++-- .../plugins/apm/public/register_feature.js | 33 ------------------- x-pack/plugins/apm/kibana.json | 9 ++--- 6 files changed, 50 insertions(+), 44 deletions(-) create mode 100644 x-pack/legacy/plugins/apm/public/legacy_register_feature.js create mode 100644 x-pack/legacy/plugins/apm/public/new-platform/featureCatalogueEntry.ts delete mode 100644 x-pack/legacy/plugins/apm/public/register_feature.js diff --git a/x-pack/legacy/plugins/apm/index.ts b/x-pack/legacy/plugins/apm/index.ts index 1784ed22a2b4dc..b79e2801a0898f 100644 --- a/x-pack/legacy/plugins/apm/index.ts +++ b/x-pack/legacy/plugins/apm/index.ts @@ -31,7 +31,7 @@ export const apm: LegacyPluginInitializer = kibana => { order: 8100 }, styleSheetPaths: resolve(__dirname, 'public/index.scss'), - home: ['plugins/apm/register_feature'], + home: ['plugins/apm/legacy_register_feature'], // TODO: get proper types injectDefaultVars(server: Server) { diff --git a/x-pack/legacy/plugins/apm/public/legacy_register_feature.js b/x-pack/legacy/plugins/apm/public/legacy_register_feature.js new file mode 100644 index 00000000000000..6e98d0784bee1c --- /dev/null +++ b/x-pack/legacy/plugins/apm/public/legacy_register_feature.js @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { npStart } from 'ui/new_platform'; +import { FeatureCatalogueRegistryProvider } from 'ui/registry/feature_catalogue'; +import { featureCatalogueEntry } from './new-platform/featureCatalogueEntry'; + +const { core } = npStart; +const apmUiEnabled = core.injectedMetadata.getInjectedVar('apmUiEnabled'); + +if (apmUiEnabled) { + FeatureCatalogueRegistryProvider.register(() => featureCatalogueEntry); +} diff --git a/x-pack/legacy/plugins/apm/public/new-platform/featureCatalogueEntry.ts b/x-pack/legacy/plugins/apm/public/new-platform/featureCatalogueEntry.ts new file mode 100644 index 00000000000000..7a150de6d5d02c --- /dev/null +++ b/x-pack/legacy/plugins/apm/public/new-platform/featureCatalogueEntry.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { FeatureCatalogueCategory } from '../../../../../../src/plugins/home/public'; + +export const featureCatalogueEntry = { + id: 'apm', + title: 'APM', + description: i18n.translate('xpack.apm.apmDescription', { + defaultMessage: + 'Automatically collect in-depth performance metrics and ' + + 'errors from inside your applications.' + }), + icon: 'apmApp', + path: '/app/apm', + showOnHomePage: true, + category: FeatureCatalogueCategory.DATA +}; diff --git a/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx b/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx index b5986610d3048f..ac87671492b76e 100644 --- a/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx +++ b/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx @@ -8,6 +8,7 @@ import React, { useContext, createContext } from 'react'; import ReactDOM from 'react-dom'; import { Router, Route, Switch } from 'react-router-dom'; import styled from 'styled-components'; +import { HomePublicPluginSetup } from '../../../../../../src/plugins/home/public'; import { CoreStart, LegacyCoreStart, @@ -29,6 +30,7 @@ import { MatchedRouteProvider } from '../context/MatchedRouteContext'; import { createStaticIndexPattern } from '../services/rest/index_pattern'; import { setHelpExtension } from './setHelpExtension'; import { setReadonlyBadge } from './updateBadge'; +import { featureCatalogueEntry } from './featureCatalogueEntry'; export const REACT_APP_ROOT_ID = 'react-apm-root'; @@ -53,7 +55,10 @@ const App = () => { export type ApmPluginSetup = void; export type ApmPluginStart = void; -export type ApmPluginSetupDeps = {}; // eslint-disable-line @typescript-eslint/consistent-type-definitions + +export interface ApmPluginSetupDeps { + home: HomePublicPluginSetup; +} export interface ApmPluginStartDeps { data: DataPublicPluginStart; @@ -74,11 +79,12 @@ export class ApmPlugin ApmPluginStartDeps > { // Take the DOM element as the constructor, so we can mount the app. - public setup(_core: CoreSetup, _plugins: ApmPluginSetupDeps) {} + public setup(_core: CoreSetup, plugins: ApmPluginSetupDeps) { + plugins.home.featureCatalogue.register(featureCatalogueEntry); + } public start(core: CoreStart, plugins: ApmPluginStartDeps) { const i18nCore = core.i18n; - // render APM feedback link in global help menu setHelpExtension(core); setReadonlyBadge(core); diff --git a/x-pack/legacy/plugins/apm/public/register_feature.js b/x-pack/legacy/plugins/apm/public/register_feature.js deleted file mode 100644 index 8994fac17e914e..00000000000000 --- a/x-pack/legacy/plugins/apm/public/register_feature.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { npStart } from 'ui/new_platform'; -import { i18n } from '@kbn/i18n'; -import { - FeatureCatalogueRegistryProvider, - FeatureCatalogueCategory -} from 'ui/registry/feature_catalogue'; - -const { core } = npStart; -const apmUiEnabled = core.injectedMetadata.getInjectedVar('apmUiEnabled'); - -if (apmUiEnabled) { - FeatureCatalogueRegistryProvider.register(() => { - return { - id: 'apm', - title: 'APM', - description: i18n.translate('xpack.apm.apmDescription', { - defaultMessage: - 'Automatically collect in-depth performance metrics and ' + - 'errors from inside your applications.' - }), - icon: 'apmApp', - path: '/app/apm', - showOnHomePage: true, - category: FeatureCatalogueCategory.DATA - }; - }); -} diff --git a/x-pack/plugins/apm/kibana.json b/x-pack/plugins/apm/kibana.json index 8161f6ee06bf8e..40fee07742cf60 100644 --- a/x-pack/plugins/apm/kibana.json +++ b/x-pack/plugins/apm/kibana.json @@ -3,12 +3,7 @@ "server": true, "version": "8.0.0", "kibanaVersion": "kibana", - "configPath": [ - "xpack", - "apm" - ], + "configPath": ["xpack", "apm"], "ui": false, - "requiredPlugins": [ - "apm_oss" - ] + "requiredPlugins": ["apm_oss", "data", "home"] } From 1c6bd0992cdaafb4a20434c9e0fecbaa40f628be Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Mon, 2 Dec 2019 18:51:11 +0000 Subject: [PATCH 24/39] [ML] Fixing info content detector field selection (#51914) * [ML] Fixing info content detector field selection * fixing test --- .../__mocks__/results/farequote_job_caps.json | 8 +++++++- .../models/job_service/new_job_caps/field_service.ts | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/__mocks__/results/farequote_job_caps.json b/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/__mocks__/results/farequote_job_caps.json index c005d9a5b5aaa2..9c10f9083be5eb 100644 --- a/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/__mocks__/results/farequote_job_caps.json +++ b/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/__mocks__/results/farequote_job_caps.json @@ -397,6 +397,7 @@ "min": "min" }, "fieldIds": [ + "airline", "responsetime" ] }, @@ -411,6 +412,7 @@ "min": "min" }, "fieldIds": [ + "airline", "responsetime" ] }, @@ -425,6 +427,7 @@ "min": "min" }, "fieldIds": [ + "airline", "responsetime" ] }, @@ -479,7 +482,10 @@ "aggIds": [ "distinct_count", "high_distinct_count", - "low_distinct_count" + "low_distinct_count", + "info_content", + "high_info_content", + "low_info_content" ] }, { diff --git a/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/field_service.ts b/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/field_service.ts index d53d5344adb647..af4d869274d73a 100644 --- a/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/field_service.ts +++ b/x-pack/legacy/plugins/ml/server/models/job_service/new_job_caps/field_service.ts @@ -135,6 +135,7 @@ async function combineFieldsAndAggs( rollupFields: RollupFields ): Promise { const keywordFields = getKeywordFields(fields); + const textFields = getTextFields(fields); const numericalFields = getNumericalFields(fields); const ipFields = getIpFields(fields); const geoFields = getGeoFields(fields); @@ -148,6 +149,10 @@ async function combineFieldsAndAggs( case ML_JOB_AGGREGATION.LAT_LONG: geoFields.forEach(f => mix(f, a)); break; + case ML_JOB_AGGREGATION.INFO_CONTENT: + case ML_JOB_AGGREGATION.HIGH_INFO_CONTENT: + case ML_JOB_AGGREGATION.LOW_INFO_CONTENT: + textFields.forEach(f => mix(f, a)); case ML_JOB_AGGREGATION.DISTINCT_COUNT: case ML_JOB_AGGREGATION.HIGH_DISTINCT_COUNT: case ML_JOB_AGGREGATION.LOW_DISTINCT_COUNT: @@ -220,6 +225,10 @@ function getKeywordFields(fields: Field[]): Field[] { return fields.filter(f => f.type === ES_FIELD_TYPES.KEYWORD); } +function getTextFields(fields: Field[]): Field[] { + return fields.filter(f => f.type === ES_FIELD_TYPES.TEXT); +} + function getIpFields(fields: Field[]): Field[] { return fields.filter(f => f.type === ES_FIELD_TYPES.IP); } From b1a3a619a46d75dbef7ed7a427cb1662316751d8 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Mon, 2 Dec 2019 14:10:10 -0500 Subject: [PATCH 25/39] fix tab url link (#51993) --- .../integration/lib/hosts/selectors.ts | 4 +- .../smoke_tests/url_state/url_state.spec.ts | 4 +- .../components/navigation/index.test.tsx | 56 ++++++++++--------- .../public/components/navigation/index.tsx | 56 +++++++------------ .../navigation/tab_navigation/types.ts | 4 +- .../public/components/navigation/types.ts | 21 ++++++- 6 files changed, 74 insertions(+), 71 deletions(-) diff --git a/x-pack/legacy/plugins/siem/cypress/integration/lib/hosts/selectors.ts b/x-pack/legacy/plugins/siem/cypress/integration/lib/hosts/selectors.ts index 1c900944752c48..ab2502676d6f75 100644 --- a/x-pack/legacy/plugins/siem/cypress/integration/lib/hosts/selectors.ts +++ b/x-pack/legacy/plugins/siem/cypress/integration/lib/hosts/selectors.ts @@ -16,6 +16,6 @@ export const ALL_HOSTS_WIDGET_DRAGGABLE_HOSTS = `${ALL_HOSTS_WIDGET} ${ALL_HOSTS /** Clicking this button displays the `Events` tab */ export const EVENTS_TAB_BUTTON = '[data-test-subj="navigation-events"]'; -export const NAVIGATION_HOSTS_ALL_HOSTS = '[data-test-subj="navigation-link-allHosts"]'; +export const NAVIGATION_HOSTS_ALL_HOSTS = '[data-test-subj="navigation-allHosts"]'; -export const NAVIGATION_HOSTS_ANOMALIES = '[data-test-subj="navigation-link-anomalies"]'; +export const NAVIGATION_HOSTS_ANOMALIES = '[data-test-subj="navigation-anomalies"]'; diff --git a/x-pack/legacy/plugins/siem/cypress/integration/smoke_tests/url_state/url_state.spec.ts b/x-pack/legacy/plugins/siem/cypress/integration/smoke_tests/url_state/url_state.spec.ts index b1867a437f7f41..21829a0c202287 100644 --- a/x-pack/legacy/plugins/siem/cypress/integration/smoke_tests/url_state/url_state.spec.ts +++ b/x-pack/legacy/plugins/siem/cypress/integration/smoke_tests/url_state/url_state.spec.ts @@ -181,7 +181,7 @@ describe('url state', () => { cy.url().should('include', `query=(language:kuery,query:'source.ip:%20%2210.142.0.9%22%20')`); }); - it.skip('sets the url state when kql is set and check if href reflect this change', () => { + it('sets the url state when kql is set and check if href reflect this change', () => { loginAndWaitForPage(ABSOLUTE_DATE_RANGE.url); cy.get(KQL_INPUT, { timeout: 5000 }).type('source.ip: "10.142.0.9" {enter}'); cy.get(NAVIGATION_HOSTS) @@ -194,7 +194,7 @@ describe('url state', () => { ); }); - it.skip('sets KQL in host page and detail page and check if href match on breadcrumb, tabs and subTabs', () => { + it('sets KQL in host page and detail page and check if href match on breadcrumb, tabs and subTabs', () => { loginAndWaitForPage(ABSOLUTE_DATE_RANGE.urlHost); cy.get(KQL_INPUT, { timeout: 5000 }).type('host.name: "siem-kibana" {enter}'); cy.get(NAVIGATION_HOSTS_ALL_HOSTS, { timeout: 5000 }) diff --git a/x-pack/legacy/plugins/siem/public/components/navigation/index.test.tsx b/x-pack/legacy/plugins/siem/public/components/navigation/index.test.tsx index 97cf9522f488fa..fbeb1a2090cfde 100644 --- a/x-pack/legacy/plugins/siem/public/components/navigation/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/components/navigation/index.test.tsx @@ -11,50 +11,52 @@ import { CONSTANTS } from '../url_state/constants'; import { SiemNavigationComponent } from './'; import { setBreadcrumbs } from './breadcrumbs'; import { navTabs } from '../../pages/home/home_navigations'; -import { TabNavigationProps } from './tab_navigation/types'; import { HostsTableType } from '../../store/hosts/model'; import { RouteSpyState } from '../../utils/route/types'; +import { SiemNavigationProps, SiemNavigationComponentProps } from './types'; jest.mock('./breadcrumbs', () => ({ setBreadcrumbs: jest.fn(), })); describe('SIEM Navigation', () => { - const mockProps: TabNavigationProps & RouteSpyState = { + const mockProps: SiemNavigationComponentProps & SiemNavigationProps & RouteSpyState = { pageName: 'hosts', pathName: '/hosts', detailName: undefined, search: '', tabName: HostsTableType.authentications, navTabs, - [CONSTANTS.timerange]: { - global: { - [CONSTANTS.timerange]: { - from: 1558048243696, - fromStr: 'now-24h', - kind: 'relative', - to: 1558134643697, - toStr: 'now', - }, - linkTo: ['timeline'], + urlState: { + [CONSTANTS.timerange]: { + global: { + [CONSTANTS.timerange]: { + from: 1558048243696, + fromStr: 'now-24h', + kind: 'relative', + to: 1558134643697, + toStr: 'now', + }, + linkTo: ['timeline'], + }, + timeline: { + [CONSTANTS.timerange]: { + from: 1558048243696, + fromStr: 'now-24h', + kind: 'relative', + to: 1558134643697, + toStr: 'now', + }, + linkTo: ['global'], + }, }, - timeline: { - [CONSTANTS.timerange]: { - from: 1558048243696, - fromStr: 'now-24h', - kind: 'relative', - to: 1558134643697, - toStr: 'now', - }, - linkTo: ['global'], + [CONSTANTS.appQuery]: { query: '', language: 'kuery' }, + [CONSTANTS.filters]: [], + [CONSTANTS.timeline]: { + id: '', + isOpen: false, }, }, - [CONSTANTS.appQuery]: { query: '', language: 'kuery' }, - [CONSTANTS.filters]: [], - [CONSTANTS.timeline]: { - id: '', - isOpen: false, - }, }; const wrapper = mount(); test('it calls setBreadcrumbs with correct path on mount', () => { diff --git a/x-pack/legacy/plugins/siem/public/components/navigation/index.tsx b/x-pack/legacy/plugins/siem/public/components/navigation/index.tsx index 7209be4d715f3e..748187a01fc8eb 100644 --- a/x-pack/legacy/plugins/siem/public/components/navigation/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/navigation/index.tsx @@ -14,54 +14,42 @@ import { useRouteSpy } from '../../utils/route/use_route_spy'; import { makeMapStateToProps } from '../url_state/helpers'; import { setBreadcrumbs } from './breadcrumbs'; import { TabNavigation } from './tab_navigation'; -import { TabNavigationProps } from './tab_navigation/types'; -import { SiemNavigationComponentProps } from './types'; +import { SiemNavigationProps, SiemNavigationComponentProps } from './types'; -export const SiemNavigationComponent = React.memo( - ({ - query, - detailName, - display, - filters, - navTabs, - pageName, - pathName, - savedQuery, - search, - tabName, - timeline, - timerange, - }) => { +export const SiemNavigationComponent = React.memo< + SiemNavigationComponentProps & SiemNavigationProps & RouteSpyState +>( + ({ detailName, display, navTabs, pageName, pathName, search, tabName, urlState }) => { useEffect(() => { if (pathName) { setBreadcrumbs({ - query, + query: urlState.query, detailName, - filters, + filters: urlState.filters, navTabs, pageName, pathName, - savedQuery, + savedQuery: urlState.savedQuery, search, tabName, - timerange, - timeline, + timerange: urlState.timerange, + timeline: urlState.timeline, }); } - }, [query, pathName, search, filters, navTabs, savedQuery, timerange, timeline]); + }, [pathName, search, navTabs, urlState]); return ( ); }, @@ -69,12 +57,8 @@ export const SiemNavigationComponent = React.memo + React.ComponentClass >(connect(makeMapStateToProps))(SiemNavigationComponent); -export const SiemNavigation = React.memo(props => { +export const SiemNavigation = React.memo(props => { const [routeProps] = useRouteSpy(); - const stateNavReduxProps: RouteSpyState & SiemNavigationComponentProps = { + const stateNavReduxProps: RouteSpyState & SiemNavigationProps = { ...routeProps, ...props, }; diff --git a/x-pack/legacy/plugins/siem/public/components/navigation/tab_navigation/types.ts b/x-pack/legacy/plugins/siem/public/components/navigation/tab_navigation/types.ts index 856651e6f97dc1..1283691e658065 100644 --- a/x-pack/legacy/plugins/siem/public/components/navigation/tab_navigation/types.ts +++ b/x-pack/legacy/plugins/siem/public/components/navigation/tab_navigation/types.ts @@ -10,9 +10,9 @@ import { Timeline } from '../../url_state/types'; import { HostsTableType } from '../../../store/hosts/model'; import { esFilters, Query } from '../../../../../../../../src/plugins/data/public'; -import { SiemNavigationComponentProps } from '../types'; +import { SiemNavigationProps } from '../types'; -export interface TabNavigationProps extends SiemNavigationComponentProps { +export interface TabNavigationProps extends SiemNavigationProps { pathName: string; pageName: string; tabName: HostsTableType | undefined; diff --git a/x-pack/legacy/plugins/siem/public/components/navigation/types.ts b/x-pack/legacy/plugins/siem/public/components/navigation/types.ts index a8e16c82fbf806..845642256be8a5 100644 --- a/x-pack/legacy/plugins/siem/public/components/navigation/types.ts +++ b/x-pack/legacy/plugins/siem/public/components/navigation/types.ts @@ -4,13 +4,30 @@ * you may not use this file except in compliance with the Elastic License. */ -import { UrlStateType } from '../url_state/constants'; +import { esFilters, Query } from '../../../../../../../src/plugins/data/public'; +import { HostsTableType } from '../../store/hosts/model'; +import { UrlInputsModel } from '../../store/inputs/model'; +import { CONSTANTS, UrlStateType } from '../url_state/constants'; +import { Timeline } from '../url_state/types'; -export interface SiemNavigationComponentProps { +export interface SiemNavigationProps { display?: 'default' | 'condensed'; navTabs: Record; } +export interface SiemNavigationComponentProps { + pathName: string; + pageName: string; + tabName: HostsTableType | undefined; + urlState: { + [CONSTANTS.appQuery]?: Query; + [CONSTANTS.filters]?: esFilters.Filter[]; + [CONSTANTS.savedQuery]?: string; + [CONSTANTS.timerange]: UrlInputsModel; + [CONSTANTS.timeline]: Timeline; + }; +} + export type SearchNavTab = NavTab | { urlKey: UrlStateType; isDetailPage: boolean }; export interface NavTab { From c8eef0458bdac5413ff3859f53e92d6994559980 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 2 Dec 2019 14:21:38 -0500 Subject: [PATCH 26/39] Experimenting with delay in test startup (#51459) * Experimenting with delay in test startup * Move firefox tests sooner becuase they take a long time to run * Move functional test parallel process delay to a spot that should work better for flaky test runner --- Jenkinsfile | 4 ++-- vars/kibanaPipeline.groovy | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6030f2b4a021d8..277c5a9424cad1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,6 +12,7 @@ stage("Kibana Pipeline") { // This stage is just here to help the BlueOcean UI a 'kibana-intake-agent': kibanaPipeline.legacyJobRunner('kibana-intake'), 'x-pack-intake-agent': kibanaPipeline.legacyJobRunner('x-pack-intake'), 'kibana-oss-agent': kibanaPipeline.withWorkers('kibana-oss-tests', { kibanaPipeline.buildOss() }, [ + 'oss-firefoxSmoke': kibanaPipeline.getPostBuildWorker('firefoxSmoke', { runbld('./test/scripts/jenkins_firefox_smoke.sh', 'Execute kibana-firefoxSmoke') }), 'oss-ciGroup1': kibanaPipeline.getOssCiGroupWorker(1), 'oss-ciGroup2': kibanaPipeline.getOssCiGroupWorker(2), 'oss-ciGroup3': kibanaPipeline.getOssCiGroupWorker(3), @@ -24,11 +25,11 @@ stage("Kibana Pipeline") { // This stage is just here to help the BlueOcean UI a 'oss-ciGroup10': kibanaPipeline.getOssCiGroupWorker(10), 'oss-ciGroup11': kibanaPipeline.getOssCiGroupWorker(11), 'oss-ciGroup12': kibanaPipeline.getOssCiGroupWorker(12), - 'oss-firefoxSmoke': kibanaPipeline.getPostBuildWorker('firefoxSmoke', { runbld('./test/scripts/jenkins_firefox_smoke.sh', 'Execute kibana-firefoxSmoke') }), 'oss-accessibility': kibanaPipeline.getPostBuildWorker('accessibility', { runbld('./test/scripts/jenkins_accessibility.sh', 'Execute kibana-accessibility') }), 'oss-visualRegression': kibanaPipeline.getPostBuildWorker('visualRegression', { runbld('./test/scripts/jenkins_visual_regression.sh', 'Execute kibana-visualRegression') }), ]), 'kibana-xpack-agent': kibanaPipeline.withWorkers('kibana-xpack-tests', { kibanaPipeline.buildXpack() }, [ + 'xpack-firefoxSmoke': kibanaPipeline.getPostBuildWorker('xpack-firefoxSmoke', { runbld('./test/scripts/jenkins_xpack_firefox_smoke.sh', 'Execute xpack-firefoxSmoke') }), 'xpack-ciGroup1': kibanaPipeline.getXpackCiGroupWorker(1), 'xpack-ciGroup2': kibanaPipeline.getXpackCiGroupWorker(2), 'xpack-ciGroup3': kibanaPipeline.getXpackCiGroupWorker(3), @@ -39,7 +40,6 @@ stage("Kibana Pipeline") { // This stage is just here to help the BlueOcean UI a 'xpack-ciGroup8': kibanaPipeline.getXpackCiGroupWorker(8), 'xpack-ciGroup9': kibanaPipeline.getXpackCiGroupWorker(9), 'xpack-ciGroup10': kibanaPipeline.getXpackCiGroupWorker(10), - 'xpack-firefoxSmoke': kibanaPipeline.getPostBuildWorker('xpack-firefoxSmoke', { runbld('./test/scripts/jenkins_xpack_firefox_smoke.sh', 'Execute xpack-firefoxSmoke') }), 'xpack-accessibility': kibanaPipeline.getPostBuildWorker('xpack-accessibility', { runbld('./test/scripts/jenkins_xpack_accessibility.sh', 'Execute xpack-accessibility') }), 'xpack-visualRegression': kibanaPipeline.getPostBuildWorker('xpack-visualRegression', { runbld('./test/scripts/jenkins_xpack_visual_regression.sh', 'Execute xpack-visualRegression') }), ]), diff --git a/vars/kibanaPipeline.groovy b/vars/kibanaPipeline.groovy index 90df352e18a001..0058f21f2356b4 100644 --- a/vars/kibanaPipeline.groovy +++ b/vars/kibanaPipeline.groovy @@ -11,6 +11,10 @@ def withWorkers(name, preWorkerClosure = {}, workerClosures = [:]) { nextWorker++ return { + // This delay helps smooth out CPU load caused by ES/Kibana instances starting up at the same time + def delay = (workerNumber-1)*20 + sleep(delay) + workerClosure(workerNumber) } } From ec853438c95b2e43b43760487dad4c0cdca11e68 Mon Sep 17 00:00:00 2001 From: John Dorlus Date: Mon, 2 Dec 2019 14:22:59 -0500 Subject: [PATCH 27/39] This app is an entirely different app on cloud. Disabling. (#51844) --- x-pack/test/functional/apps/snapshot_restore/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/snapshot_restore/index.ts b/x-pack/test/functional/apps/snapshot_restore/index.ts index f589555fe876d8..f9bfafed37529f 100644 --- a/x-pack/test/functional/apps/snapshot_restore/index.ts +++ b/x-pack/test/functional/apps/snapshot_restore/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ loadTestFile }: FtrProviderContext) => { describe('Snapshots app', function() { - this.tags('ciGroup1'); + this.tags(['ciGroup4', 'skipCloud']); loadTestFile(require.resolve('./home_page')); }); }; From d86f85bdbc8be08b4d61f497ab1efe0f80bd7159 Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Mon, 2 Dec 2019 15:32:14 -0500 Subject: [PATCH 28/39] [Canvas] New Platform shim Canvas Client Side (#49358) * New Platform shim Canvas * Fix typing * Use some new platform methods * Fix formatting issue --- .../plugins/canvas/.storybook/config.js | 9 ++ x-pack/legacy/plugins/canvas/index.js | 2 +- .../canvas/public/angular/config/index.js | 4 +- .../angular/config/location_provider.js | 17 -- .../angular/config/location_provider.ts | 21 +++ .../public/angular/config/state_management.js | 14 +- .../public/angular/controllers/canvas.tsx | 63 ++++---- .../public/angular/controllers/index.ts | 2 +- .../canvas/public/angular/services/index.js | 2 +- .../canvas/public/angular/services/store.js | 35 +++-- x-pack/legacy/plugins/canvas/public/app.js | 51 ------ .../components/app/track_route_change.js | 9 +- .../public/components/editor/editor.tsx | 11 +- .../public/components/editor/editor_theme.ts | 146 +++++++++--------- .../canvas/public/components/editor/index.ts | 7 - .../canvas/public/components/editor/index.tsx | 14 ++ .../components/embeddable_flyout/flyout.tsx | 9 +- .../components/embeddable_flyout/index.tsx | 13 +- .../workpad_export/flyout/index.ts | 16 +- .../workpad_header/workpad_export/index.ts | 14 +- .../workpad_header/workpad_export/utils.ts | 10 +- x-pack/legacy/plugins/canvas/public/index.ts | 30 ++++ x-pack/legacy/plugins/canvas/public/legacy.ts | 59 +++++++ .../plugins/canvas/public/legacy_start.ts | 30 ++++ .../plugins/canvas/public/lib/breadcrumbs.js | 24 --- .../plugins/canvas/public/lib/breadcrumbs.ts | 29 ++++ .../plugins/canvas/public/lib/clipboard.js | 8 +- .../public/lib/custom_element_service.ts | 19 +-- ...tation_links.js => documentation_links.ts} | 10 +- .../canvas/public/lib/download_workpad.ts | 4 +- .../plugins/canvas/public/lib/es_service.ts | 26 ++-- .../public/lib/load_expression_types.js | 8 +- .../canvas/public/lib/load_transitions.js | 4 +- .../canvas/public/lib/loading_indicator.ts | 13 +- .../plugins/canvas/public/lib/notify.js | 19 ++- .../canvas/public/lib/workpad_service.js | 34 ++-- .../legacy/plugins/canvas/public/plugin.tsx | 101 ++++++++++++ .../canvas/public/state/initial_state.js | 4 +- .../canvas/public/state/reducers/workpad.js | 6 +- x-pack/legacy/plugins/canvas/scripts/lint.js | 4 +- 40 files changed, 588 insertions(+), 313 deletions(-) delete mode 100644 x-pack/legacy/plugins/canvas/public/angular/config/location_provider.js create mode 100644 x-pack/legacy/plugins/canvas/public/angular/config/location_provider.ts delete mode 100644 x-pack/legacy/plugins/canvas/public/app.js delete mode 100644 x-pack/legacy/plugins/canvas/public/components/editor/index.ts create mode 100644 x-pack/legacy/plugins/canvas/public/components/editor/index.tsx create mode 100644 x-pack/legacy/plugins/canvas/public/index.ts create mode 100644 x-pack/legacy/plugins/canvas/public/legacy.ts create mode 100644 x-pack/legacy/plugins/canvas/public/legacy_start.ts delete mode 100644 x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.js create mode 100644 x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.ts rename x-pack/legacy/plugins/canvas/public/lib/{documentation_links.js => documentation_links.ts} (51%) create mode 100644 x-pack/legacy/plugins/canvas/public/plugin.tsx diff --git a/x-pack/legacy/plugins/canvas/.storybook/config.js b/x-pack/legacy/plugins/canvas/.storybook/config.js index 3e1152dc3a6116..d3cd8e8057ae8c 100644 --- a/x-pack/legacy/plugins/canvas/.storybook/config.js +++ b/x-pack/legacy/plugins/canvas/.storybook/config.js @@ -4,11 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import React from 'react'; import { configure, addDecorator, addParameters } from '@storybook/react'; import { withKnobs } from '@storybook/addon-knobs/react'; import { withInfo } from '@storybook/addon-info'; import { create } from '@storybook/theming'; +import { coreMock } from 'src/core/public/mocks'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; + // If we're running Storyshots, be sure to register the require context hook. // Otherwise, add the other decorators. if (process.env.NODE_ENV === 'test') { @@ -33,6 +37,11 @@ if (process.env.NODE_ENV === 'test') { addDecorator(withKnobs); } +// Add New Platform Context for any stories that need it +addDecorator(fn => ( + {fn()} +)); + function loadStories() { require('./dll_contexts'); diff --git a/x-pack/legacy/plugins/canvas/index.js b/x-pack/legacy/plugins/canvas/index.js index e3448d2051eea2..8e742de6de9448 100644 --- a/x-pack/legacy/plugins/canvas/index.js +++ b/x-pack/legacy/plugins/canvas/index.js @@ -22,7 +22,7 @@ export function canvas(kibana) { description: 'Data driven workpads', icon: 'plugins/canvas/icon.svg', euiIconType: 'canvasApp', - main: 'plugins/canvas/app', + main: 'plugins/canvas/legacy_start', }, interpreter: [ 'plugins/canvas/browser_functions', diff --git a/x-pack/legacy/plugins/canvas/public/angular/config/index.js b/x-pack/legacy/plugins/canvas/public/angular/config/index.js index 8a8f3e3cfce51f..020bcf1f7686e5 100644 --- a/x-pack/legacy/plugins/canvas/public/angular/config/index.js +++ b/x-pack/legacy/plugins/canvas/public/angular/config/index.js @@ -4,5 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -import './state_management'; // Requires 6.2.0+ -import './location_provider'; +export * from './state_management'; // Requires 6.2.0+ +export * from './location_provider'; diff --git a/x-pack/legacy/plugins/canvas/public/angular/config/location_provider.js b/x-pack/legacy/plugins/canvas/public/angular/config/location_provider.js deleted file mode 100644 index 40b2081ad007d7..00000000000000 --- a/x-pack/legacy/plugins/canvas/public/angular/config/location_provider.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { uiModules } from 'ui/modules'; - -// disable angular's location provider -const app = uiModules.get('apps/canvas'); -app.config($locationProvider => { - $locationProvider.html5Mode({ - enabled: false, - requireBase: false, - rewriteLinks: false, - }); -}); diff --git a/x-pack/legacy/plugins/canvas/public/angular/config/location_provider.ts b/x-pack/legacy/plugins/canvas/public/angular/config/location_provider.ts new file mode 100644 index 00000000000000..547e354d7fde92 --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/angular/config/location_provider.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ILocationProvider } from 'angular'; +import { CoreStart, CanvasStartDeps } from '../../plugin'; + +export function initLocationProvider(coreStart: CoreStart, plugins: CanvasStartDeps) { + // disable angular's location provider + const app = plugins.__LEGACY.uiModules.get('apps/canvas'); + + app.config(($locationProvider: ILocationProvider) => { + $locationProvider.html5Mode({ + enabled: false, + requireBase: false, + rewriteLinks: false, + }); + }); +} diff --git a/x-pack/legacy/plugins/canvas/public/angular/config/state_management.js b/x-pack/legacy/plugins/canvas/public/angular/config/state_management.js index e6c1da418b6fc5..4347765748c5d4 100644 --- a/x-pack/legacy/plugins/canvas/public/angular/config/state_management.js +++ b/x-pack/legacy/plugins/canvas/public/angular/config/state_management.js @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { uiModules } from 'ui/modules'; - -// disable the kibana state management -const app = uiModules.get('apps/canvas'); -app.config(stateManagementConfigProvider => { - stateManagementConfigProvider.disable(); -}); +export function initStateManagement(coreStart, plugins) { + // disable the kibana state management + const app = plugins.__LEGACY.uiModules.get('apps/canvas'); + app.config(stateManagementConfigProvider => { + stateManagementConfigProvider.disable(); + }); +} diff --git a/x-pack/legacy/plugins/canvas/public/angular/controllers/canvas.tsx b/x-pack/legacy/plugins/canvas/public/angular/controllers/canvas.tsx index 4738d358363587..0dfa1ceecdbc56 100644 --- a/x-pack/legacy/plugins/canvas/public/angular/controllers/canvas.tsx +++ b/x-pack/legacy/plugins/canvas/public/angular/controllers/canvas.tsx @@ -8,8 +8,8 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { Provider } from 'react-redux'; import { Store } from 'redux'; -import chrome from 'ui/chrome'; -import { UICapabilities } from 'ui/capabilities'; +import { CanvasStartDeps, CoreStart } from '../../plugin'; +import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public'; // @ts-ignore Untyped local import { App } from '../../components/app'; @@ -17,35 +17,38 @@ import { AngularStrings } from '../../../i18n'; const { CanvasRootController: strings } = AngularStrings; -export function CanvasRootController( - canvasStore: Store, - $scope: any, // Untyped in Kibana - $element: any, // Untyped in Kibana - uiCapabilities: UICapabilities -) { - const domNode = $element[0]; +export function CanvasRootControllerFactory(coreStart: CoreStart, plugins: CanvasStartDeps) { + return function CanvasRootController( + canvasStore: Store, + $scope: any, // Untyped in Kibana + $element: any // Untyped in Kibana + ) { + const domNode = $element[0]; - // set the read-only badge when appropriate - chrome.badge.set( - uiCapabilities.canvas.save - ? undefined - : { - text: strings.getReadOnlyBadgeText(), - tooltip: strings.getReadOnlyBadgeTooltip(), - iconType: 'glasses', - } - ); + // set the read-only badge when appropriate + coreStart.chrome.setBadge( + coreStart.application.capabilities.canvas.save + ? undefined + : { + text: strings.getReadOnlyBadgeText(), + tooltip: strings.getReadOnlyBadgeTooltip(), + iconType: 'glasses', + } + ); - render( - - - - - , - domNode - ); + render( + + + + + + + , + domNode + ); - $scope.$on('$destroy', () => { - unmountComponentAtNode(domNode); - }); + $scope.$on('$destroy', () => { + unmountComponentAtNode(domNode); + }); + }; } diff --git a/x-pack/legacy/plugins/canvas/public/angular/controllers/index.ts b/x-pack/legacy/plugins/canvas/public/angular/controllers/index.ts index 0d14bb4d9d4b58..01fe3dda9c9712 100644 --- a/x-pack/legacy/plugins/canvas/public/angular/controllers/index.ts +++ b/x-pack/legacy/plugins/canvas/public/angular/controllers/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { CanvasRootController } from './canvas'; +export { CanvasRootControllerFactory } from './canvas'; diff --git a/x-pack/legacy/plugins/canvas/public/angular/services/index.js b/x-pack/legacy/plugins/canvas/public/angular/services/index.js index f15372a7a483af..b472b9bbac9931 100755 --- a/x-pack/legacy/plugins/canvas/public/angular/services/index.js +++ b/x-pack/legacy/plugins/canvas/public/angular/services/index.js @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './store'; +export * from './store'; diff --git a/x-pack/legacy/plugins/canvas/public/angular/services/store.js b/x-pack/legacy/plugins/canvas/public/angular/services/store.js index d008a9af9b1749..f6f9d8922b99e9 100644 --- a/x-pack/legacy/plugins/canvas/public/angular/services/store.js +++ b/x-pack/legacy/plugins/canvas/public/angular/services/store.js @@ -4,27 +4,28 @@ * you may not use this file except in compliance with the Elastic License. */ -import { uiModules } from 'ui/modules'; import { createStore } from '../../state/store'; import { getInitialState } from '../../state/initial_state'; -const app = uiModules.get('apps/canvas'); -app.service('canvasStore', (kbnVersion, basePath, reportingBrowserType, serverFunctions) => { - const initialState = getInitialState(); +export function initStore(coreStart, plugins) { + const app = plugins.__LEGACY.uiModules.get('apps/canvas'); + app.service('canvasStore', (kbnVersion, basePath, reportingBrowserType, serverFunctions) => { + const initialState = getInitialState(); - // Set the defaults from Kibana plugin - initialState.app = { - kbnVersion, - basePath, - reportingBrowserType, - serverFunctions, - ready: false, - }; + // Set the defaults from Kibana plugin + initialState.app = { + kbnVersion, + basePath, + reportingBrowserType, + serverFunctions, + ready: false, + }; - const store = createStore(initialState); + const store = createStore(initialState); - // TODO: debugging, remove this - window.canvasStore = store; + // TODO: debugging, remove this + window.canvasStore = store; - return store; -}); + return store; + }); +} diff --git a/x-pack/legacy/plugins/canvas/public/app.js b/x-pack/legacy/plugins/canvas/public/app.js deleted file mode 100644 index 760bb7a46f9552..00000000000000 --- a/x-pack/legacy/plugins/canvas/public/app.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import 'ui/autoload/all'; -import './angular/config'; -import './angular/services'; -import React from 'react'; -import ReactDOM from 'react-dom'; -import { i18n } from '@kbn/i18n'; -import chrome from 'ui/chrome'; -import { documentationLinks } from './lib/documentation_links'; -import { CanvasRootController } from './angular/controllers'; - -// Import the uiExports that the application uses -import 'uiExports/visTypes'; -import 'uiExports/visResponseHandlers'; -import 'uiExports/visRequestHandlers'; -import 'uiExports/visEditorTypes'; -import 'uiExports/savedObjectTypes'; -import 'uiExports/spyModes'; -import 'uiExports/embeddableFactories'; -import 'uiExports/interpreter'; - -// load application code -import './lib/load_expression_types'; -import './lib/load_transitions'; -import 'uiExports/canvas'; - -import { HelpMenu } from './components/help_menu/help_menu'; - -// load the application -chrome.setRootController('canvas', CanvasRootController); - -// add Canvas docs to help menu in global nav -chrome.helpExtension.set({ - appName: i18n.translate('xpack.canvas.helpMenu.appName', { - defaultMessage: 'Canvas', - }), - links: [ - { - linkType: 'documentation', - href: documentationLinks.canvas, - }, - ], - content: domNode => { - ReactDOM.render(, domNode); - }, -}); diff --git a/x-pack/legacy/plugins/canvas/public/components/app/track_route_change.js b/x-pack/legacy/plugins/canvas/public/components/app/track_route_change.js index fb8bd68d5401e2..e837f5200a1590 100644 --- a/x-pack/legacy/plugins/canvas/public/components/app/track_route_change.js +++ b/x-pack/legacy/plugins/canvas/public/components/app/track_route_change.js @@ -5,16 +5,15 @@ */ import { get } from 'lodash'; -import chrome from 'ui/chrome'; -import { absoluteToParsedUrl } from 'ui/url/absolute_to_parsed_url'; import { getWindow } from '../../lib/get_window'; import { CANVAS_APP } from '../../../common/lib/constants'; +import { getCoreStart, getStartPlugins } from '../../legacy'; export function trackRouteChange() { - const basePath = chrome.getBasePath(); + const basePath = getCoreStart().http.basePath.get(); // storage.set(LOCALSTORAGE_LASTPAGE, pathname); - chrome.trackSubUrlForApp( + getStartPlugins().__LEGACY.trackSubUrlForApp( CANVAS_APP, - absoluteToParsedUrl(get(getWindow(), 'location.href'), basePath) + getStartPlugins().__LEGACY.absoluteToParsedUrl(get(getWindow(), 'location.href'), basePath) ); } diff --git a/x-pack/legacy/plugins/canvas/public/components/editor/editor.tsx b/x-pack/legacy/plugins/canvas/public/components/editor/editor.tsx index 110502b48348a7..c79d837a1662d8 100644 --- a/x-pack/legacy/plugins/canvas/public/components/editor/editor.tsx +++ b/x-pack/legacy/plugins/canvas/public/components/editor/editor.tsx @@ -19,9 +19,9 @@ import 'monaco-editor/esm/vs/editor/contrib/suggest/suggestController.js'; // Ne import 'monaco-editor/esm/vs/editor/contrib/hover/hover.js'; // Needed for hover import 'monaco-editor/esm/vs/editor/contrib/parameterHints/parameterHints.js'; // Needed for signature -import { theme } from './editor_theme'; +import { LIGHT_THEME, DARK_THEME } from './editor_theme'; -interface Props { +export interface Props { /** Width of editor. Defaults to 100%. */ width?: string | number; @@ -79,6 +79,11 @@ interface Props { * Function called after the editor is mounted in the view */ editorDidMount?: EditorDidMount; + + /** + * Should the editor use the dark theme + */ + useDarkTheme?: boolean; } export class Editor extends React.Component { @@ -115,7 +120,7 @@ export class Editor extends React.Component { }); // Register the theme - monaco.editor.defineTheme('euiColors', theme); + monaco.editor.defineTheme('euiColors', this.props.useDarkTheme ? DARK_THEME : LIGHT_THEME); }; _editorDidMount = ( diff --git a/x-pack/legacy/plugins/canvas/public/components/editor/editor_theme.ts b/x-pack/legacy/plugins/canvas/public/components/editor/editor_theme.ts index 836f65456a9757..04d4369ed4e208 100644 --- a/x-pack/legacy/plugins/canvas/public/components/editor/editor_theme.ts +++ b/x-pack/legacy/plugins/canvas/public/components/editor/editor_theme.ts @@ -8,87 +8,91 @@ import * as monacoEditor from 'monaco-editor/esm/vs/editor/editor.api'; import darkTheme from '@elastic/eui/dist/eui_theme_dark.json'; import lightTheme from '@elastic/eui/dist/eui_theme_light.json'; -import chrome from 'ui/chrome'; - // NOTE: For talk around where this theme information will ultimately live, // please see this discuss issue: https://github.com/elastic/kibana/issues/43814 -const IS_DARK_THEME = chrome.getUiSettingsClient().get('theme:darkMode'); +export function createTheme( + euiTheme: typeof darkTheme | typeof lightTheme, + selectionBackgroundColor: string +): monacoEditor.editor.IStandaloneThemeData { + return { + base: 'vs', + inherit: true, + rules: [ + { + token: '', + foreground: euiTheme.euiColorDarkestShade, + background: euiTheme.euiColorEmptyShade, + }, + { token: 'invalid', foreground: euiTheme.euiColorAccent }, + { token: 'emphasis', fontStyle: 'italic' }, + { token: 'strong', fontStyle: 'bold' }, -const themeName = IS_DARK_THEME ? darkTheme : lightTheme; + { token: 'variable', foreground: euiTheme.euiColorPrimary }, + { token: 'variable.predefined', foreground: euiTheme.euiColorSecondary }, + { token: 'constant', foreground: euiTheme.euiColorAccent }, + { token: 'comment', foreground: euiTheme.euiColorMediumShade }, + { token: 'number', foreground: euiTheme.euiColorAccent }, + { token: 'number.hex', foreground: euiTheme.euiColorAccent }, + { token: 'regexp', foreground: euiTheme.euiColorDanger }, + { token: 'annotation', foreground: euiTheme.euiColorMediumShade }, + { token: 'type', foreground: euiTheme.euiColorVis0 }, -export const theme: monacoEditor.editor.IStandaloneThemeData = { - base: 'vs', - inherit: true, - rules: [ - { - token: '', - foreground: themeName.euiColorDarkestShade, - background: themeName.euiColorEmptyShade, - }, - { token: 'invalid', foreground: themeName.euiColorAccent }, - { token: 'emphasis', fontStyle: 'italic' }, - { token: 'strong', fontStyle: 'bold' }, + { token: 'delimiter', foreground: euiTheme.euiColorDarkestShade }, + { token: 'delimiter.html', foreground: euiTheme.euiColorDarkShade }, + { token: 'delimiter.xml', foreground: euiTheme.euiColorPrimary }, - { token: 'variable', foreground: themeName.euiColorPrimary }, - { token: 'variable.predefined', foreground: themeName.euiColorSecondary }, - { token: 'constant', foreground: themeName.euiColorAccent }, - { token: 'comment', foreground: themeName.euiColorMediumShade }, - { token: 'number', foreground: themeName.euiColorAccent }, - { token: 'number.hex', foreground: themeName.euiColorAccent }, - { token: 'regexp', foreground: themeName.euiColorDanger }, - { token: 'annotation', foreground: themeName.euiColorMediumShade }, - { token: 'type', foreground: themeName.euiColorVis0 }, + { token: 'tag', foreground: euiTheme.euiColorDanger }, + { token: 'tag.id.jade', foreground: euiTheme.euiColorPrimary }, + { token: 'tag.class.jade', foreground: euiTheme.euiColorPrimary }, + { token: 'meta.scss', foreground: euiTheme.euiColorAccent }, + { token: 'metatag', foreground: euiTheme.euiColorSecondary }, + { token: 'metatag.content.html', foreground: euiTheme.euiColorDanger }, + { token: 'metatag.html', foreground: euiTheme.euiColorMediumShade }, + { token: 'metatag.xml', foreground: euiTheme.euiColorMediumShade }, + { token: 'metatag.php', fontStyle: 'bold' }, - { token: 'delimiter', foreground: themeName.euiColorDarkestShade }, - { token: 'delimiter.html', foreground: themeName.euiColorDarkShade }, - { token: 'delimiter.xml', foreground: themeName.euiColorPrimary }, + { token: 'key', foreground: euiTheme.euiColorWarning }, + { token: 'string.key.json', foreground: euiTheme.euiColorDanger }, + { token: 'string.value.json', foreground: euiTheme.euiColorPrimary }, - { token: 'tag', foreground: themeName.euiColorDanger }, - { token: 'tag.id.jade', foreground: themeName.euiColorPrimary }, - { token: 'tag.class.jade', foreground: themeName.euiColorPrimary }, - { token: 'meta.scss', foreground: themeName.euiColorAccent }, - { token: 'metatag', foreground: themeName.euiColorSecondary }, - { token: 'metatag.content.html', foreground: themeName.euiColorDanger }, - { token: 'metatag.html', foreground: themeName.euiColorMediumShade }, - { token: 'metatag.xml', foreground: themeName.euiColorMediumShade }, - { token: 'metatag.php', fontStyle: 'bold' }, + { token: 'attribute.name', foreground: euiTheme.euiColorDanger }, + { token: 'attribute.name.css', foreground: euiTheme.euiColorSecondary }, + { token: 'attribute.value', foreground: euiTheme.euiColorPrimary }, + { token: 'attribute.value.number', foreground: euiTheme.euiColorWarning }, + { token: 'attribute.value.unit', foreground: euiTheme.euiColorWarning }, + { token: 'attribute.value.html', foreground: euiTheme.euiColorPrimary }, + { token: 'attribute.value.xml', foreground: euiTheme.euiColorPrimary }, - { token: 'key', foreground: themeName.euiColorWarning }, - { token: 'string.key.json', foreground: themeName.euiColorDanger }, - { token: 'string.value.json', foreground: themeName.euiColorPrimary }, + { token: 'string', foreground: euiTheme.euiColorDanger }, + { token: 'string.html', foreground: euiTheme.euiColorPrimary }, + { token: 'string.sql', foreground: euiTheme.euiColorDanger }, + { token: 'string.yaml', foreground: euiTheme.euiColorPrimary }, - { token: 'attribute.name', foreground: themeName.euiColorDanger }, - { token: 'attribute.name.css', foreground: themeName.euiColorSecondary }, - { token: 'attribute.value', foreground: themeName.euiColorPrimary }, - { token: 'attribute.value.number', foreground: themeName.euiColorWarning }, - { token: 'attribute.value.unit', foreground: themeName.euiColorWarning }, - { token: 'attribute.value.html', foreground: themeName.euiColorPrimary }, - { token: 'attribute.value.xml', foreground: themeName.euiColorPrimary }, + { token: 'keyword', foreground: euiTheme.euiColorPrimary }, + { token: 'keyword.json', foreground: euiTheme.euiColorPrimary }, + { token: 'keyword.flow', foreground: euiTheme.euiColorWarning }, + { token: 'keyword.flow.scss', foreground: euiTheme.euiColorPrimary }, - { token: 'string', foreground: themeName.euiColorDanger }, - { token: 'string.html', foreground: themeName.euiColorPrimary }, - { token: 'string.sql', foreground: themeName.euiColorDanger }, - { token: 'string.yaml', foreground: themeName.euiColorPrimary }, + { token: 'operator.scss', foreground: euiTheme.euiColorDarkShade }, + { token: 'operator.sql', foreground: euiTheme.euiColorMediumShade }, + { token: 'operator.swift', foreground: euiTheme.euiColorMediumShade }, + { token: 'predefined.sql', foreground: euiTheme.euiColorMediumShade }, + ], + colors: { + 'editor.foreground': euiTheme.euiColorDarkestShade, + 'editor.background': euiTheme.euiColorEmptyShade, + 'editorLineNumber.foreground': euiTheme.euiColorDarkShade, + 'editorLineNumber.activeForeground': euiTheme.euiColorDarkShade, + 'editorIndentGuide.background': euiTheme.euiColorLightShade, + 'editor.selectionBackground': selectionBackgroundColor, + 'editorWidget.border': euiTheme.euiColorLightShade, + 'editorWidget.background': euiTheme.euiColorLightestShade, + }, + }; +} - { token: 'keyword', foreground: themeName.euiColorPrimary }, - { token: 'keyword.json', foreground: themeName.euiColorPrimary }, - { token: 'keyword.flow', foreground: themeName.euiColorWarning }, - { token: 'keyword.flow.scss', foreground: themeName.euiColorPrimary }, +const DARK_THEME = createTheme(darkTheme, '#343551'); +const LIGHT_THEME = createTheme(lightTheme, '#E3E4ED'); - { token: 'operator.scss', foreground: themeName.euiColorDarkShade }, - { token: 'operator.sql', foreground: themeName.euiColorMediumShade }, - { token: 'operator.swift', foreground: themeName.euiColorMediumShade }, - { token: 'predefined.sql', foreground: themeName.euiColorMediumShade }, - ], - colors: { - 'editor.foreground': themeName.euiColorDarkestShade, - 'editor.background': themeName.euiColorEmptyShade, - 'editorLineNumber.foreground': themeName.euiColorDarkShade, - 'editorLineNumber.activeForeground': themeName.euiColorDarkShade, - 'editorIndentGuide.background': themeName.euiColorLightShade, - 'editor.selectionBackground': `${IS_DARK_THEME ? '#343551' : '#E3E4ED'}`, - 'editorWidget.border': themeName.euiColorLightShade, - 'editorWidget.background': themeName.euiColorLightestShade, - }, -}; +export { DARK_THEME, LIGHT_THEME }; diff --git a/x-pack/legacy/plugins/canvas/public/components/editor/index.ts b/x-pack/legacy/plugins/canvas/public/components/editor/index.ts deleted file mode 100644 index d7215da20e4a02..00000000000000 --- a/x-pack/legacy/plugins/canvas/public/components/editor/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { Editor } from './editor'; diff --git a/x-pack/legacy/plugins/canvas/public/components/editor/index.tsx b/x-pack/legacy/plugins/canvas/public/components/editor/index.tsx new file mode 100644 index 00000000000000..11c5c710b6e697 --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/components/editor/index.tsx @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { useUiSetting } from '../../../../../../../src/plugins/kibana_react/public'; +import { Editor as BaseEditor, Props } from './editor'; + +export const Editor: React.FunctionComponent = props => { + const darkMode = useUiSetting('theme:darkMode'); + + return ; +}; diff --git a/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx b/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx index 0f03657e970bbf..d09ef53f65fbbc 100644 --- a/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx +++ b/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/flyout.tsx @@ -6,13 +6,14 @@ import React from 'react'; +import { EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, EuiTitle } from '@elastic/eui'; import { SavedObjectFinder, SavedObjectMetaData, -} from 'ui/saved_objects/components/saved_object_finder'; -import { EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, EuiTitle } from '@elastic/eui'; +} from '../../../../../../../src/plugins/kibana_react/public/saved_objects'; // eslint-disable-line import { start } from '../../../../../../../src/legacy/core_plugins/embeddable_api/public/np_ready/public/legacy'; import { ComponentStrings } from '../../../i18n'; +import { CoreStart } from '../../../../../../../src/core/public'; const { AddEmbeddableFlyout: strings } = ComponentStrings; @@ -20,6 +21,8 @@ export interface Props { onClose: () => void; onSelect: (id: string, embeddableType: string) => void; availableEmbeddables: string[]; + savedObjects: CoreStart['savedObjects']; + uiSettings: CoreStart['uiSettings']; } export class AddEmbeddableFlyout extends React.Component { @@ -66,6 +69,8 @@ export class AddEmbeddableFlyout extends React.Component { savedObjectMetaData={availableSavedObjects} showFilter={true} noItemsMessage={strings.getNoItemsText()} + savedObjects={this.props.savedObjects} + uiSettings={this.props.uiSettings} /> diff --git a/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/index.tsx b/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/index.tsx index 612406c30f88ee..c54c56e1561cae 100644 --- a/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/index.tsx +++ b/x-pack/legacy/plugins/canvas/public/components/embeddable_flyout/index.tsx @@ -14,6 +14,8 @@ import { AddEmbeddableFlyout, Props } from './flyout'; import { addElement } from '../../state/actions/elements'; import { getSelectedPage } from '../../state/selectors/workpad'; import { EmbeddableTypes } from '../../../canvas_plugin_src/expression_types/embeddable'; +import { WithKibanaProps } from '../../index'; +import { withKibana } from '../../../../../../../src/plugins/kibana_react/public'; const allowedEmbeddables = { [EmbeddableTypes.map]: (id: string) => { @@ -68,10 +70,10 @@ const mergeProps = ( }; }; -export class EmbeddableFlyoutPortal extends React.Component { +export class EmbeddableFlyoutPortal extends React.Component { el?: HTMLElement; - constructor(props: Props) { + constructor(props: Props & WithKibanaProps) { super(props); this.el = document.createElement('div'); @@ -97,6 +99,8 @@ export class EmbeddableFlyoutPortal extends React.Component { , this.el ); @@ -104,6 +108,7 @@ export class EmbeddableFlyoutPortal extends React.Component { } } -export const AddEmbeddablePanel = compose void }>( - connect(mapStateToProps, mapDispatchToProps, mergeProps) +export const AddEmbeddablePanel = compose void }>( + connect(mapStateToProps, mapDispatchToProps, mergeProps), + withKibana )(EmbeddableFlyoutPortal); diff --git a/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/flyout/index.ts b/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/flyout/index.ts index 756e84baffe547..1cc56eabaebd5e 100644 --- a/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/flyout/index.ts +++ b/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/flyout/index.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; import { connect } from 'react-redux'; import { compose, withProps } from 'recompose'; // @ts-ignore Untyped local @@ -31,7 +30,9 @@ import { API_ROUTE_SHAREABLE_ZIP } from '../../../../../common/lib/constants'; import { renderFunctionNames } from '../../../../../shareable_runtime/supported_renderers'; import { ComponentStrings } from '../../../../../i18n'; +import { withKibana } from '../../../../../../../../../src/plugins/kibana_react/public/'; import { OnCloseFn } from '../workpad_export'; +import { WithKibanaProps } from '../../../../index'; const { WorkpadHeaderWorkpadExport: strings } = ComponentStrings; const getUnsupportedRenderers = (state: State) => { @@ -61,8 +62,15 @@ interface Props { export const ShareWebsiteFlyout = compose>( connect(mapStateToProps), + withKibana, withProps( - ({ unsupportedRenderers, renderedWorkpad, onClose, workpad }: Props): ComponentProps => ({ + ({ + unsupportedRenderers, + renderedWorkpad, + onClose, + workpad, + kibana, + }: Props & WithKibanaProps): ComponentProps => ({ unsupportedRenderers, onClose, onCopy: () => { @@ -74,10 +82,10 @@ export const ShareWebsiteFlyout = compose downloadRenderedWorkpad(renderedWorkpad); return; case 'shareRuntime': - downloadRuntime(); + downloadRuntime(kibana.services.http.basePath.get()); return; case 'shareZip': - const basePath = chrome.getBasePath(); + const basePath = kibana.services.http.basePath.get(); arrayBufferFetch .post(`${basePath}${API_ROUTE_SHAREABLE_ZIP}`, JSON.stringify(renderedWorkpad)) .then(blob => downloadZippedRuntime(blob.data)) diff --git a/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/index.ts b/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/index.ts index f677f84362da7f..a8ae785adafc1a 100644 --- a/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/index.ts +++ b/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/index.ts @@ -24,8 +24,11 @@ import { getPdfUrl, createPdf } from './utils'; import { State, CanvasWorkpad } from '../../../../types'; // @ts-ignore Untyped local. import { fetch, arrayBufferFetch } from '../../../../common/lib/fetch'; +import { withKibana } from '../../../../../../../../src/plugins/kibana_react/public/'; +import { WithKibanaProps } from '../../../index'; import { ComponentStrings } from '../../../../i18n'; + const { WorkpadHeaderWorkpadExport: strings } = ComponentStrings; const mapStateToProps = (state: State) => ({ @@ -53,12 +56,17 @@ interface Props { export const WorkpadExport = compose( connect(mapStateToProps), + withKibana, withProps( - ({ workpad, pageCount, enabled }: Props): ComponentProps => ({ + ({ workpad, pageCount, enabled, kibana }: Props & WithKibanaProps): ComponentProps => ({ enabled, getExportUrl: type => { if (type === 'pdf') { - const { createPdfUri } = getPdfUrl(workpad, { pageCount }); + const { createPdfUri } = getPdfUrl( + workpad, + { pageCount }, + kibana.services.http.basePath.prepend + ); return getAbsoluteUrl(createPdfUri); } @@ -79,7 +87,7 @@ export const WorkpadExport = compose( onExport: type => { switch (type) { case 'pdf': - return createPdf(workpad, { pageCount }) + return createPdf(workpad, { pageCount }, kibana.services.http.basePath.prepend) .then(({ data }: { data: { job: { id: string } } }) => { notify.info(strings.getExportPDFMessage(), { title: strings.getExportPDFTitle(workpad.name), diff --git a/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/utils.ts b/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/utils.ts index b06bf5a74b528a..f0ca5fac1d271d 100644 --- a/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/utils.ts +++ b/x-pack/legacy/plugins/canvas/public/components/workpad_header/workpad_export/utils.ts @@ -5,7 +5,6 @@ */ import rison from 'rison-node'; -import chrome from 'ui/chrome'; // @ts-ignore Untyped local. import { fetch } from '../../../../common/lib/fetch'; import { CanvasWorkpad } from '../../../../types'; @@ -17,7 +16,9 @@ interface PageCount { pageCount: number; } -type Arguments = [CanvasWorkpad, PageCount]; +type AddBasePath = (url: string) => string; + +type Arguments = [CanvasWorkpad, PageCount, AddBasePath]; interface PdfUrlData { createPdfUri: string; @@ -26,9 +27,10 @@ interface PdfUrlData { export function getPdfUrl( { id, name: title, width, height }: CanvasWorkpad, - { pageCount }: PageCount + { pageCount }: PageCount, + addBasePath: (path: string) => string ): PdfUrlData { - const reportingEntry = chrome.addBasePath('/api/reporting/generate'); + const reportingEntry = addBasePath('/api/reporting/generate'); const canvasEntry = '/app/canvas#'; // The viewport in Reporting by specifying the dimensions. In order for things to work, diff --git a/x-pack/legacy/plugins/canvas/public/index.ts b/x-pack/legacy/plugins/canvas/public/index.ts new file mode 100644 index 00000000000000..b8358bfe022e68 --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/index.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + PluginInitializer, + PluginInitializerContext, + CoreStart, +} from '../../../../../src/core/public'; +import { CanvasSetup, CanvasStart, CanvasSetupDeps, CanvasStartDeps, CanvasPlugin } from './plugin'; + +export const plugin: PluginInitializer< + CanvasSetup, + CanvasStart, + CanvasSetupDeps, + CanvasStartDeps +> = (initializerContext: PluginInitializerContext) => { + return new CanvasPlugin(); +}; + +export interface WithKibanaProps { + kibana: { + services: CoreStart & CanvasStartDeps; + }; +} + +// These are your public types & static code +export { CanvasSetup, CanvasStart }; diff --git a/x-pack/legacy/plugins/canvas/public/legacy.ts b/x-pack/legacy/plugins/canvas/public/legacy.ts new file mode 100644 index 00000000000000..49b88ee60921a3 --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/legacy.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { npSetup, npStart } from 'ui/new_platform'; +import { CanvasStartDeps } from './plugin'; // eslint-disable-line import/order + +// @ts-ignore Untyped Kibana Lib +import chrome, { loadingCount } from 'ui/chrome'; // eslint-disable-line import/order +// @ts-ignore Untyped Module +import { uiModules } from 'ui/modules'; // eslint-disable-line import/order +import { absoluteToParsedUrl } from 'ui/url/absolute_to_parsed_url'; // eslint-disable-line import/order +import { Storage } from '../../../../../src/plugins/kibana_utils/public'; // eslint-disable-line import/order +// @ts-ignore Untyped Kibana Lib +import { formatMsg } from 'ui/notify/lib/format_msg'; // eslint-disable-line import/order + +const shimCoreSetup = { + ...npSetup.core, +}; +const shimCoreStart = { + ...npStart.core, +}; +const shimSetupPlugins = {}; +const shimStartPlugins: CanvasStartDeps = { + ...npStart.plugins, + __LEGACY: { + // ToDo: Copy directly into canvas + absoluteToParsedUrl, + // ToDo: Copy directly into canvas + formatMsg, + // ToDo: Remove in favor of core.application.register + setRootController: chrome.setRootController, + storage: Storage, + // ToDo: Won't be a part of New Platform. Will need to handle internally + trackSubUrlForApp: chrome.trackSubUrlForApp, + uiModules, + }, +}; + +// These methods are intended to be a replacement for import from 'ui/whatever' +// These will go away once all of this one plugin start/setup properly +// injects wherever these need to go. +export function getCoreSetup() { + return shimCoreSetup; +} + +export function getCoreStart() { + return shimCoreStart; +} + +export function getSetupPlugins() { + return shimSetupPlugins; +} + +export function getStartPlugins() { + return shimStartPlugins; +} diff --git a/x-pack/legacy/plugins/canvas/public/legacy_start.ts b/x-pack/legacy/plugins/canvas/public/legacy_start.ts new file mode 100644 index 00000000000000..49ec7acd6375dc --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/legacy_start.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// TODO: These are legacy imports. We should work to have all of these come from New Platform +// Import the uiExports that the application uses +// These will go away as these plugins are converted to NP +import 'ui/autoload/all'; +import 'uiExports/visTypes'; +import 'uiExports/visResponseHandlers'; +import 'uiExports/visRequestHandlers'; +import 'uiExports/visEditorTypes'; +import 'uiExports/savedObjectTypes'; +import 'uiExports/spyModes'; +import 'uiExports/embeddableFactories'; +import 'uiExports/interpreter'; + +// load application code +import 'uiExports/canvas'; + +import { PluginInitializerContext } from '../../../../../src/core/public'; +import { plugin } from './'; +import { getCoreStart, getStartPlugins, getSetupPlugins, getCoreSetup } from './legacy'; +const pluginInstance = plugin({} as PluginInitializerContext); + +// Setup and Startup the plugin +export const setup = pluginInstance.setup(getCoreSetup(), getSetupPlugins()); +export const start = pluginInstance.start(getCoreStart(), getStartPlugins()); diff --git a/x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.js b/x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.js deleted file mode 100644 index dc90402d7f9583..00000000000000 --- a/x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import chrome from 'ui/chrome'; - -export const getBaseBreadcrumb = () => ({ - text: 'Canvas', - href: '#/', -}); - -export const getWorkpadBreadcrumb = ({ name = 'Workpad', id } = {}) => { - const output = { text: name }; - if (id != null) { - output.href = `#/workpad/${id}`; - } - return output; -}; - -export const setBreadcrumb = paths => { - chrome.breadcrumbs.set(Array.isArray(paths) ? paths : [paths]); -}; diff --git a/x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.ts b/x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.ts new file mode 100644 index 00000000000000..834d5868c35ea7 --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/lib/breadcrumbs.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ChromeBreadcrumb } from '../../../../../../src/core/public'; +import { getCoreStart } from '../legacy'; + +export const getBaseBreadcrumb = () => ({ + text: 'Canvas', + href: '#/', +}); + +export const getWorkpadBreadcrumb = ({ + name = 'Workpad', + id, +}: { name?: string; id?: string } = {}) => { + const output: ChromeBreadcrumb = { text: name }; + if (id != null) { + output.href = `#/workpad/${id}`; + } + return output; +}; + +export const setBreadcrumb = (paths: ChromeBreadcrumb | ChromeBreadcrumb[]) => { + const setBreadCrumbs = getCoreStart().chrome.setBreadcrumbs; + setBreadCrumbs(Array.isArray(paths) ? paths : [paths]); +}; diff --git a/x-pack/legacy/plugins/canvas/public/lib/clipboard.js b/x-pack/legacy/plugins/canvas/public/lib/clipboard.js index f9d68769c9c3a0..1fd14f086c9493 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/clipboard.js +++ b/x-pack/legacy/plugins/canvas/public/lib/clipboard.js @@ -4,10 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Storage } from '../../../../../../src/plugins/kibana_utils/public'; import { LOCALSTORAGE_CLIPBOARD } from '../../common/lib/constants'; import { getWindow } from './get_window'; -const storage = new Storage(getWindow().localStorage); +let storage = null; + +export const initClipboard = function(Storage) { + storage = new Storage(getWindow().localStorage); +}; + export const setClipboardData = data => storage.set(LOCALSTORAGE_CLIPBOARD, JSON.stringify(data)); export const getClipboardData = () => storage.get(LOCALSTORAGE_CLIPBOARD); diff --git a/x-pack/legacy/plugins/canvas/public/lib/custom_element_service.ts b/x-pack/legacy/plugins/canvas/public/lib/custom_element_service.ts index ee5059cc69b0da..478e2f8f18cf5e 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/custom_element_service.ts +++ b/x-pack/legacy/plugins/canvas/public/lib/custom_element_service.ts @@ -4,30 +4,31 @@ * you may not use this file except in compliance with the Elastic License. */ -// @ts-ignore unconverted Elastic lib -import chrome from 'ui/chrome'; import { AxiosPromise } from 'axios'; // @ts-ignore unconverted local file import { API_ROUTE_CUSTOM_ELEMENT } from '../../common/lib/constants'; // @ts-ignore unconverted local file import { fetch } from '../../common/lib/fetch'; import { CustomElement } from '../../types'; +import { getCoreStart } from '../legacy'; -const basePath = chrome.getBasePath(); -const apiPath = `${basePath}${API_ROUTE_CUSTOM_ELEMENT}`; +const getApiPath = function() { + const basePath = getCoreStart().http.basePath.get(); + return `${basePath}${API_ROUTE_CUSTOM_ELEMENT}`; +}; export const create = (customElement: CustomElement): AxiosPromise => - fetch.post(apiPath, customElement); + fetch.post(getApiPath(), customElement); export const get = (customElementId: string): Promise => fetch - .get(`${apiPath}/${customElementId}`) + .get(`${getApiPath()}/${customElementId}`) .then(({ data: element }: { data: CustomElement }) => element); export const update = (id: string, element: CustomElement): AxiosPromise => - fetch.put(`${apiPath}/${id}`, element); + fetch.put(`${getApiPath()}/${id}`, element); -export const remove = (id: string): AxiosPromise => fetch.delete(`${apiPath}/${id}`); +export const remove = (id: string): AxiosPromise => fetch.delete(`${getApiPath()}/${id}`); export const find = async ( searchTerm: string @@ -35,7 +36,7 @@ export const find = async ( const validSearchTerm = typeof searchTerm === 'string' && searchTerm.length > 0; return fetch - .get(`${apiPath}/find?name=${validSearchTerm ? searchTerm : ''}&perPage=10000`) + .get(`${getApiPath()}/find?name=${validSearchTerm ? searchTerm : ''}&perPage=10000`) .then( ({ data: customElements }: { data: { total: number; customElements: CustomElement[] } }) => customElements diff --git a/x-pack/legacy/plugins/canvas/public/lib/documentation_links.js b/x-pack/legacy/plugins/canvas/public/lib/documentation_links.ts similarity index 51% rename from x-pack/legacy/plugins/canvas/public/lib/documentation_links.js rename to x-pack/legacy/plugins/canvas/public/lib/documentation_links.ts index 351e388609e5bf..a43653f420ce0e 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/documentation_links.js +++ b/x-pack/legacy/plugins/canvas/public/lib/documentation_links.ts @@ -4,8 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } from 'ui/documentation_links'; +import { getCoreStart } from '../legacy'; -export const documentationLinks = { - canvas: `${ELASTIC_WEBSITE_URL}guide/en/kibana/${DOC_LINK_VERSION}/canvas.html`, -}; +export const getDocumentationLinks = () => ({ + canvas: `${getCoreStart().docLinks.ELASTIC_WEBSITE_URL}guide/en/kibana/${ + getCoreStart().docLinks.DOC_LINK_VERSION + }/canvas.html`, +}); diff --git a/x-pack/legacy/plugins/canvas/public/lib/download_workpad.ts b/x-pack/legacy/plugins/canvas/public/lib/download_workpad.ts index 7bcf0ac948613b..e4866641fd9e1e 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/download_workpad.ts +++ b/x-pack/legacy/plugins/canvas/public/lib/download_workpad.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ import fileSaver from 'file-saver'; -import chrome from 'ui/chrome'; import { API_ROUTE_SHAREABLE_RUNTIME_DOWNLOAD } from '../../common/lib/constants'; import { ErrorStrings } from '../../i18n'; // @ts-ignore untyped local @@ -37,9 +36,8 @@ export const downloadRenderedWorkpad = async (renderedWorkpad: CanvasRenderedWor } }; -export const downloadRuntime = async () => { +export const downloadRuntime = async (basePath: string) => { try { - const basePath = chrome.getBasePath(); const path = `${basePath}${API_ROUTE_SHAREABLE_RUNTIME_DOWNLOAD}`; window.open(path); return; diff --git a/x-pack/legacy/plugins/canvas/public/lib/es_service.ts b/x-pack/legacy/plugins/canvas/public/lib/es_service.ts index a4553369abdd15..2fa1bf94ad6690 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/es_service.ts +++ b/x-pack/legacy/plugins/canvas/public/lib/es_service.ts @@ -4,24 +4,32 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; import { API_ROUTE } from '../../common/lib/constants'; // @ts-ignore untyped local import { fetch } from '../../common/lib/fetch'; import { ErrorStrings } from '../../i18n'; // @ts-ignore untyped local import { notify } from './notify'; +import { getCoreStart } from '../legacy'; const { esService: strings } = ErrorStrings; -const basePath = chrome.getBasePath(); -const apiPath = basePath + API_ROUTE; -const savedObjectsClient = chrome.getSavedObjectsClient(); -const AdvancedSettings = chrome.getUiSettingsClient(); +const getApiPath = function() { + const basePath = getCoreStart().http.basePath.get(); + return basePath + API_ROUTE; +}; + +const getSavedObjectsClient = function() { + return getCoreStart().savedObjects.client; +}; + +const getAdvancedSettings = function() { + return getCoreStart().uiSettings; +}; export const getFields = (index = '_all') => { return fetch - .get(`${apiPath}/es_fields?index=${index}`) + .get(`${getApiPath()}/es_fields?index=${index}`) .then(({ data: mapping }: { data: object }) => Object.keys(mapping) .filter(field => !field.startsWith('_')) // filters out meta fields @@ -35,7 +43,7 @@ export const getFields = (index = '_all') => { }; export const getIndices = () => - savedObjectsClient + getSavedObjectsClient() .find({ type: 'index-pattern', fields: ['title'], @@ -50,10 +58,10 @@ export const getIndices = () => .catch((err: Error) => notify.error(err, { title: strings.getIndicesFetchErrorMessage() })); export const getDefaultIndex = () => { - const defaultIndexId = AdvancedSettings.get('defaultIndex'); + const defaultIndexId = getAdvancedSettings().get('defaultIndex'); return defaultIndexId - ? savedObjectsClient + ? getSavedObjectsClient() .get('index-pattern', defaultIndexId) .then(defaultIndex => defaultIndex.attributes.title) .catch(err => notify.error(err, { title: strings.getDefaultIndexFetchErrorMessage() })) diff --git a/x-pack/legacy/plugins/canvas/public/lib/load_expression_types.js b/x-pack/legacy/plugins/canvas/public/lib/load_expression_types.js index e63b29eed2d587..fb23f9459d30b9 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/load_expression_types.js +++ b/x-pack/legacy/plugins/canvas/public/lib/load_expression_types.js @@ -8,6 +8,8 @@ import { argTypeSpecs } from '../expression_types/arg_types'; import { datasourceSpecs } from '../expression_types/datasources'; import { argTypeRegistry, datasourceRegistry } from '../expression_types'; -// register default args, arg types, and expression types -argTypeSpecs.forEach(expFn => argTypeRegistry.register(expFn)); -datasourceSpecs.forEach(expFn => datasourceRegistry.register(expFn)); +export function loadExpressionTypes() { + // register default args, arg types, and expression types + argTypeSpecs.forEach(expFn => argTypeRegistry.register(expFn)); + datasourceSpecs.forEach(expFn => datasourceRegistry.register(expFn)); +} diff --git a/x-pack/legacy/plugins/canvas/public/lib/load_transitions.js b/x-pack/legacy/plugins/canvas/public/lib/load_transitions.js index e3fea75cedc80b..915d63142bbf7d 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/load_transitions.js +++ b/x-pack/legacy/plugins/canvas/public/lib/load_transitions.js @@ -7,4 +7,6 @@ import { transitions } from '../transitions'; import { transitionsRegistry } from './transitions_registry'; -transitions.forEach(spec => transitionsRegistry.register(spec)); +export function loadTransitions() { + transitions.forEach(spec => transitionsRegistry.register(spec)); +} diff --git a/x-pack/legacy/plugins/canvas/public/lib/loading_indicator.ts b/x-pack/legacy/plugins/canvas/public/lib/loading_indicator.ts index ee69aa24df55ff..a95f4278b6a699 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/loading_indicator.ts +++ b/x-pack/legacy/plugins/canvas/public/lib/loading_indicator.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -// @ts-ignore -import { loadingCount } from 'ui/chrome'; +import * as Rx from 'rxjs'; +import { CoreStart } from 'src/core/public'; let isActive = false; @@ -14,17 +14,22 @@ export interface LoadingIndicatorInterface { hide: () => void; } +const loadingCount$ = new Rx.BehaviorSubject(0); + +export const initLoadingIndicator = (addLoadingCount: CoreStart['http']['addLoadingCount']) => + addLoadingCount(loadingCount$); + export const loadingIndicator = { show: () => { if (!isActive) { - loadingCount.increment(); isActive = true; + loadingCount$.next(1); } }, hide: () => { if (isActive) { - loadingCount.decrement(); isActive = false; + loadingCount$.next(0); } }, }; diff --git a/x-pack/legacy/plugins/canvas/public/lib/notify.js b/x-pack/legacy/plugins/canvas/public/lib/notify.js index 928d49b7b61e07..64876a02a3c646 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/notify.js +++ b/x-pack/legacy/plugins/canvas/public/lib/notify.js @@ -5,8 +5,15 @@ */ import { get } from 'lodash'; -import { toastNotifications } from 'ui/notify'; -import { formatMsg } from 'ui/notify/lib/format_msg'; +import { getCoreStart, getStartPlugins } from '../legacy'; + +const getToastNotifications = function() { + return getCoreStart().notifications.toasts; +}; + +const formatMsg = function(...args) { + return getStartPlugins().__LEGACY.formatMsg(...args); +}; const getToast = (err, opts = {}) => { const errData = get(err, 'response') || err; @@ -31,15 +38,15 @@ export const notify = { * @param {Object} opts: option to override toast title or icon, see https://github.com/elastic/kibana/blob/master/src/legacy/ui/public/notify/toasts/TOAST_NOTIFICATIONS.md */ error(err, opts) { - toastNotifications.addDanger(getToast(err, opts)); + getToastNotifications().addDanger(getToast(err, opts)); }, warning(err, opts) { - toastNotifications.addWarning(getToast(err, opts)); + getToastNotifications().addWarning(getToast(err, opts)); }, info(err, opts) { - toastNotifications.add(getToast(err, opts)); + getToastNotifications().add(getToast(err, opts)); }, success(err, opts) { - toastNotifications.addSuccess(getToast(err, opts)); + getToastNotifications().addSuccess(getToast(err, opts)); }, }; diff --git a/x-pack/legacy/plugins/canvas/public/lib/workpad_service.js b/x-pack/legacy/plugins/canvas/public/lib/workpad_service.js index f1ed069c15d4d7..b678a532ec084b 100644 --- a/x-pack/legacy/plugins/canvas/public/lib/workpad_service.js +++ b/x-pack/legacy/plugins/canvas/public/lib/workpad_service.js @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; import { API_ROUTE_WORKPAD, API_ROUTE_WORKPAD_ASSETS, @@ -12,18 +11,29 @@ import { DEFAULT_WORKPAD_CSS, } from '../../common/lib/constants'; import { fetch } from '../../common/lib/fetch'; +import { getCoreStart } from '../legacy'; -const basePath = chrome.getBasePath(); -const apiPath = `${basePath}${API_ROUTE_WORKPAD}`; -const apiPathAssets = `${basePath}${API_ROUTE_WORKPAD_ASSETS}`; -const apiPathStructures = `${basePath}${API_ROUTE_WORKPAD_STRUCTURES}`; +const getApiPath = function() { + const basePath = getCoreStart().http.basePath.get(); + return `${basePath}${API_ROUTE_WORKPAD}`; +}; + +const getApiPathStructures = function() { + const basePath = getCoreStart().http.basePath.get(); + return `${basePath}${API_ROUTE_WORKPAD_STRUCTURES}`; +}; + +const getApiPathAssets = function() { + const basePath = getCoreStart().http.basePath.get(); + return `${basePath}${API_ROUTE_WORKPAD_ASSETS}`; +}; export function create(workpad) { - return fetch.post(apiPath, { ...workpad, assets: workpad.assets || {} }); + return fetch.post(getApiPath(), { ...workpad, assets: workpad.assets || {} }); } export function get(workpadId) { - return fetch.get(`${apiPath}/${workpadId}`).then(({ data: workpad }) => { + return fetch.get(`${getApiPath()}/${workpadId}`).then(({ data: workpad }) => { // shim old workpads with new properties return { css: DEFAULT_WORKPAD_CSS, ...workpad }; }); @@ -31,25 +41,25 @@ export function get(workpadId) { // TODO: I think this function is never used. Look into and remove the corresponding route as well export function update(id, workpad) { - return fetch.put(`${apiPath}/${id}`, workpad); + return fetch.put(`${getApiPath()}/${id}`, workpad); } export function updateWorkpad(id, workpad) { - return fetch.put(`${apiPathStructures}/${id}`, workpad); + return fetch.put(`${getApiPathStructures()}/${id}`, workpad); } export function updateAssets(id, workpadAssets) { - return fetch.put(`${apiPathAssets}/${id}`, workpadAssets); + return fetch.put(`${getApiPathAssets()}/${id}`, workpadAssets); } export function remove(id) { - return fetch.delete(`${apiPath}/${id}`); + return fetch.delete(`${getApiPath()}/${id}`); } export function find(searchTerm) { const validSearchTerm = typeof searchTerm === 'string' && searchTerm.length > 0; return fetch - .get(`${apiPath}/find?name=${validSearchTerm ? searchTerm : ''}&perPage=10000`) + .get(`${getApiPath()}/find?name=${validSearchTerm ? searchTerm : ''}&perPage=10000`) .then(({ data: workpads }) => workpads); } diff --git a/x-pack/legacy/plugins/canvas/public/plugin.tsx b/x-pack/legacy/plugins/canvas/public/plugin.tsx new file mode 100644 index 00000000000000..5190e8521101ba --- /dev/null +++ b/x-pack/legacy/plugins/canvas/public/plugin.tsx @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Chrome } from 'ui/chrome'; +import { IModule } from 'angular'; +import { i18n } from '@kbn/i18n'; +import { Storage } from '../../../../../src/plugins/kibana_utils/public'; +import { CoreSetup, CoreStart, Plugin } from '../../../../../src/core/public'; +// @ts-ignore: Untyped Local +import { initStateManagement, initLocationProvider } from './angular/config'; +import { CanvasRootControllerFactory } from './angular/controllers'; +// @ts-ignore: Untypled Local +import { initStore } from './angular/services'; +// @ts-ignore: untyped local component +import { HelpMenu } from './components/help_menu/help_menu'; +// @ts-ignore: untyped local +import { loadExpressionTypes } from './lib/load_expression_types'; +// @ts-ignore: untyped local +import { loadTransitions } from './lib/load_transitions'; +import { initLoadingIndicator } from './lib/loading_indicator'; +import { getDocumentationLinks } from './lib/documentation_links'; + +// @ts-ignore: untyped local +import { initClipboard } from './lib/clipboard'; + +export { CoreStart }; +/** + * These are the private interfaces for the services your plugin depends on. + * @internal + */ +// This interface will be built out as we require other plugins for setup +export interface CanvasSetupDeps {} // eslint-disable-line @typescript-eslint/no-empty-interface +export interface CanvasStartDeps { + __LEGACY: { + absoluteToParsedUrl: (url: string, basePath: string) => any; + formatMsg: any; + setRootController: Chrome['setRootController']; + storage: typeof Storage; + trackSubUrlForApp: Chrome['trackSubUrlForApp']; + uiModules: { + get: (module: string) => IModule; + }; + }; +} + +/** + * These are the interfaces with your public contracts. You should export these + * for other plugins to use in _their_ `SetupDeps`/`StartDeps` interfaces. + * @public + */ +// These interfaces are empty for now but will be populate as we need to export +// things for other plugins to use at startup or runtime +export interface CanvasSetup {} // eslint-disable-line @typescript-eslint/no-empty-interface +export interface CanvasStart {} // eslint-disable-line @typescript-eslint/no-empty-interface + +/** @internal */ +export class CanvasPlugin + implements Plugin { + public setup(core: CoreSetup, plugins: CanvasSetupDeps) { + // This is where any setup actions need to occur. + // Things like registering functions to the interpreter that need + // to be available everywhere, not just in Canvas + + return {}; + } + + public start(core: CoreStart, plugins: CanvasStartDeps) { + loadExpressionTypes(); + loadTransitions(); + + initStateManagement(core, plugins); + initLocationProvider(core, plugins); + initStore(core, plugins); + initClipboard(plugins.__LEGACY.storage); + initLoadingIndicator(core.http.addLoadingCount); + + const CanvasRootController = CanvasRootControllerFactory(core, plugins); + plugins.__LEGACY.setRootController('canvas', CanvasRootController); + core.chrome.setHelpExtension({ + appName: i18n.translate('xpack.canvas.helpMenu.appName', { + defaultMessage: 'Canvas', + }), + links: [ + { + linkType: 'documentation', + href: getDocumentationLinks().canvas, + }, + ], + content: domNode => () => { + ReactDOM.render(, domNode); + }, + }); + + return {}; + } +} diff --git a/x-pack/legacy/plugins/canvas/public/state/initial_state.js b/x-pack/legacy/plugins/canvas/public/state/initial_state.js index 4ca4713fa8fb7a..40c017543147fc 100644 --- a/x-pack/legacy/plugins/canvas/public/state/initial_state.js +++ b/x-pack/legacy/plugins/canvas/public/state/initial_state.js @@ -5,7 +5,7 @@ */ import { get } from 'lodash'; -import { capabilities } from 'ui/capabilities'; +import { getCoreStart } from '../legacy'; import { getDefaultWorkpad } from './defaults'; export const getInitialState = path => { @@ -13,7 +13,7 @@ export const getInitialState = path => { app: {}, // Kibana stuff in here assets: {}, // assets end up here transient: { - canUserWrite: capabilities.get().canvas.save, + canUserWrite: getCoreStart().application.capabilities.canvas.save, zoomScale: 1, elementStats: { total: 0, diff --git a/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js b/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js index 40e36a455705b6..12733680ed32d4 100644 --- a/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js +++ b/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js @@ -5,7 +5,7 @@ */ import { handleActions } from 'redux-actions'; -import { npStart } from 'ui/new_platform'; +import { getCoreStart } from '../../legacy'; import { getDefaultWorkpad } from '../defaults'; import { setWorkpad, @@ -22,7 +22,7 @@ import { APP_ROUTE_WORKPAD } from '../../../common/lib/constants'; export const workpadReducer = handleActions( { [setWorkpad]: (workpadState, { payload }) => { - npStart.core.chrome.recentlyAccessed.add( + getCoreStart().chrome.recentlyAccessed.add( `${APP_ROUTE_WORKPAD}/${payload.id}`, payload.name, payload.id @@ -39,7 +39,7 @@ export const workpadReducer = handleActions( }, [setName]: (workpadState, { payload }) => { - npStart.core.chrome.recentlyAccessed.add( + getCoreStart().chrome.recentlyAccessed.add( `${APP_ROUTE_WORKPAD}/${workpadState.id}`, payload, workpadState.id diff --git a/x-pack/legacy/plugins/canvas/scripts/lint.js b/x-pack/legacy/plugins/canvas/scripts/lint.js index f0f462b2041c53..effc654712e6cb 100644 --- a/x-pack/legacy/plugins/canvas/scripts/lint.js +++ b/x-pack/legacy/plugins/canvas/scripts/lint.js @@ -4,4 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -require('./_helpers').runKibanaScript('eslint', ['x-pack/legacy/plugins/canvas/**/*.{js,jsx}']); +require('./_helpers').runKibanaScript('eslint', [ + 'x-pack/legacy/plugins/canvas/**/*.{js,jsx,ts,tsx}', +]); From fe24b3d44120140ea004c8ef6d569441309f89f7 Mon Sep 17 00:00:00 2001 From: spalger Date: Mon, 2 Dec 2019 13:33:00 -0700 Subject: [PATCH 29/39] disable visual regression tests --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 277c5a9424cad1..261ba000968184 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -26,7 +26,7 @@ stage("Kibana Pipeline") { // This stage is just here to help the BlueOcean UI a 'oss-ciGroup11': kibanaPipeline.getOssCiGroupWorker(11), 'oss-ciGroup12': kibanaPipeline.getOssCiGroupWorker(12), 'oss-accessibility': kibanaPipeline.getPostBuildWorker('accessibility', { runbld('./test/scripts/jenkins_accessibility.sh', 'Execute kibana-accessibility') }), - 'oss-visualRegression': kibanaPipeline.getPostBuildWorker('visualRegression', { runbld('./test/scripts/jenkins_visual_regression.sh', 'Execute kibana-visualRegression') }), + // 'oss-visualRegression': kibanaPipeline.getPostBuildWorker('visualRegression', { runbld('./test/scripts/jenkins_visual_regression.sh', 'Execute kibana-visualRegression') }), ]), 'kibana-xpack-agent': kibanaPipeline.withWorkers('kibana-xpack-tests', { kibanaPipeline.buildXpack() }, [ 'xpack-firefoxSmoke': kibanaPipeline.getPostBuildWorker('xpack-firefoxSmoke', { runbld('./test/scripts/jenkins_xpack_firefox_smoke.sh', 'Execute xpack-firefoxSmoke') }), @@ -41,7 +41,7 @@ stage("Kibana Pipeline") { // This stage is just here to help the BlueOcean UI a 'xpack-ciGroup9': kibanaPipeline.getXpackCiGroupWorker(9), 'xpack-ciGroup10': kibanaPipeline.getXpackCiGroupWorker(10), 'xpack-accessibility': kibanaPipeline.getPostBuildWorker('xpack-accessibility', { runbld('./test/scripts/jenkins_xpack_accessibility.sh', 'Execute xpack-accessibility') }), - 'xpack-visualRegression': kibanaPipeline.getPostBuildWorker('xpack-visualRegression', { runbld('./test/scripts/jenkins_xpack_visual_regression.sh', 'Execute xpack-visualRegression') }), + // 'xpack-visualRegression': kibanaPipeline.getPostBuildWorker('xpack-visualRegression', { runbld('./test/scripts/jenkins_xpack_visual_regression.sh', 'Execute xpack-visualRegression') }), ]), ]) } From d0d6d43aeec02746dfbfa6ebbc59192c0ce8fd25 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Mon, 2 Dec 2019 12:55:52 -0800 Subject: [PATCH 30/39] Prevents xpack.task_manager.index being set to .tasks (#52002) A quick solution in preventing what was described in kibana#47716 Signed-off-by: Tyler Smalley --- x-pack/legacy/plugins/task_manager/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/legacy/plugins/task_manager/index.ts b/x-pack/legacy/plugins/task_manager/index.ts index 0487b003bc1efd..2d9183bdcd7975 100644 --- a/x-pack/legacy/plugins/task_manager/index.ts +++ b/x-pack/legacy/plugins/task_manager/index.ts @@ -40,7 +40,8 @@ export function taskManager(kibana: any) { .default(3000), index: Joi.string() .description('The name of the index used to store task information.') - .default('.kibana_task_manager'), + .default('.kibana_task_manager') + .invalid(['.tasks']), max_workers: Joi.number() .description( 'The maximum number of tasks that this Kibana instance will run simultaneously.' From a46833ec9844421b0ce0dc7e33a46e75cf270f9c Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 2 Dec 2019 14:08:30 -0700 Subject: [PATCH 31/39] [Maps] Refactor style editor to use style property class instead of style descriptor object (#52001) * [Maps] pass style property object instead of style descriptor to style editer components * pass symbol descriptor * cleanup from merge --- .../color/vector_style_color_editor.js | 5 +---- .../components/get_vector_style_label.js | 4 ++++ .../orientation/orientation_editor.js | 7 +------ .../size/vector_style_size_editor.js | 5 +---- .../components/static_dynamic_style_row.js | 18 ++++++++--------- .../vector/components/vector_style_editor.js | 20 +++++++------------ .../layers/styles/vector/vector_style.js | 10 ++++++++-- 7 files changed, 31 insertions(+), 38 deletions(-) diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js index c38c2054860ad4..98b20cb3ad62e8 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js @@ -9,15 +9,12 @@ import React from 'react'; import { StaticDynamicStyleRow } from '../static_dynamic_style_row'; import { DynamicColorSelection } from './dynamic_color_selection'; import { StaticColorSelection } from './static_color_selection'; -import { getVectorStyleLabel } from '../get_vector_style_label'; export function VectorStyleColorEditor(props) { return ( { @@ -37,7 +34,7 @@ export class StaticDynamicStyleRow extends React.Component { type: VectorStyle.STYLE_TYPE.STATIC, options, }; - this.props.handlePropertyChange(this.props.property, styleDescriptor); + this.props.handlePropertyChange(this.props.styleProperty.getStyleName(), styleDescriptor); }; _onDynamicStyleChange = options => { @@ -45,7 +42,7 @@ export class StaticDynamicStyleRow extends React.Component { type: VectorStyle.STYLE_TYPE.DYNAMIC, options, }; - this.props.handlePropertyChange(this.props.property, styleDescriptor); + this.props.handlePropertyChange(this.props.styleProperty.getStyleName(), styleDescriptor); }; _onTypeToggle = () => { @@ -100,7 +97,10 @@ export class StaticDynamicStyleRow extends React.Component { - + {this._renderStyleSelector()} diff --git a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/vector_style_editor.js b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/vector_style_editor.js index c8e4150fd2c266..3043d57c040377 100644 --- a/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/vector_style_editor.js +++ b/x-pack/legacy/plugins/maps/public/layers/styles/vector/components/vector_style_editor.js @@ -15,7 +15,6 @@ import { OrientationEditor } from './orientation/orientation_editor'; import { getDefaultDynamicProperties, getDefaultStaticProperties, - vectorStyles, } from '../vector_style_defaults'; import { DEFAULT_FILL_COLORS, DEFAULT_LINE_COLORS } from '../../color_utils'; import { VECTOR_SHAPE_TYPES } from '../../../sources/vector_feature_types'; @@ -121,10 +120,9 @@ export class VectorStyleEditor extends Component { _renderFillColor() { return ( Date: Mon, 2 Dec 2019 15:20:50 -0600 Subject: [PATCH 32/39] [APM] getInjectedVars shim (#51635) * [APM] getInjectedVars shim Set up the APM public NP plugin to expose the config variables on its context, and replace use of getInjectedVars with that. Since we're not yet running as an NP plugin, we don't get passed a `pluginInitializerContext`, so we use a shim in the plugin setup that gets the config values from injected vars for the time being. Also: * Move toggle app link in nav shim to plugin setup * Replace the routes exported from Main/route_config with a function that takes a configuration object --- x-pack/legacy/plugins/apm/index.ts | 1 - .../public/components/app/Home/Home.test.tsx | 7 +- .../apm/public/components/app/Home/index.tsx | 84 +++-- .../components/app/Main/UpdateBreadcrumbs.tsx | 13 +- .../Main/__test__/UpdateBreadcrumbs.test.js | 7 +- .../app/Main/route_config/index.tsx | 325 +++++++++--------- .../app/ServiceDetails/ServiceDetailTabs.tsx | 6 +- .../ServiceIntegrations/WatcherFlyout.tsx | 47 +-- .../public/context/MatchedRouteContext.tsx | 21 +- .../getConfigFromInjectedMetadata.ts | 24 ++ .../plugins/apm/public/new-platform/index.tsx | 2 +- .../apm/public/new-platform/plugin.tsx | 47 ++- .../toggleAppLinkInNav.ts} | 11 +- 13 files changed, 347 insertions(+), 248 deletions(-) create mode 100644 x-pack/legacy/plugins/apm/public/new-platform/getConfigFromInjectedMetadata.ts rename x-pack/legacy/plugins/apm/public/{hacks/toggle_app_link_in_nav.ts => new-platform/toggleAppLinkInNav.ts} (51%) diff --git a/x-pack/legacy/plugins/apm/index.ts b/x-pack/legacy/plugins/apm/index.ts index b79e2801a0898f..91745246687d99 100644 --- a/x-pack/legacy/plugins/apm/index.ts +++ b/x-pack/legacy/plugins/apm/index.ts @@ -43,7 +43,6 @@ export const apm: LegacyPluginInitializer = kibana => { apmServiceMapEnabled: config.get('xpack.apm.serviceMapEnabled') }; }, - hacks: ['plugins/apm/hacks/toggle_app_link_in_nav'], savedObjectSchemas: { 'apm-services-telemetry': { isNamespaceAgnostic: true diff --git a/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx b/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx index 7a23c9f7de842f..ad391510215d20 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx @@ -7,8 +7,13 @@ import { shallow } from 'enzyme'; import React from 'react'; import { Home } from '../Home'; +import * as plugin from '../../../new-platform/plugin'; -jest.mock('ui/new_platform'); +jest.spyOn(plugin, 'usePlugins').mockReturnValue(({ + apm: { config: {} as plugin.ConfigSchema } +} as unknown) as plugin.ApmPluginStartDeps & { + apm: { config: plugin.ConfigSchema }; +}); describe('Home component', () => { it('should render services', () => { diff --git a/x-pack/legacy/plugins/apm/public/components/app/Home/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/Home/index.tsx index f562f158f9bf81..4096d69673636c 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Home/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Home/index.tsx @@ -13,7 +13,6 @@ import { EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { npStart } from 'ui/new_platform'; import React from 'react'; import { $ElementType } from 'utility-types'; import { ApmHeader } from '../../shared/ApmHeader'; @@ -26,46 +25,54 @@ import { EuiTabLink } from '../../shared/EuiTabLink'; import { SettingsLink } from '../../shared/Links/apm/SettingsLink'; import { ServiceMapLink } from '../../shared/Links/apm/ServiceMapLink'; import { ServiceMap } from '../ServiceMap'; +import { usePlugins } from '../../../new-platform/plugin'; -const homeTabs = [ - { - link: ( - - {i18n.translate('xpack.apm.home.servicesTabLabel', { - defaultMessage: 'Services' - })} - - ), - render: () => , - name: 'services' - }, - { - link: ( - - {i18n.translate('xpack.apm.home.tracesTabLabel', { - defaultMessage: 'Traces' - })} - - ), - render: () => , - name: 'traces' +function getHomeTabs({ + apmServiceMapEnabled = false +}: { + apmServiceMapEnabled: boolean; +}) { + const homeTabs = [ + { + link: ( + + {i18n.translate('xpack.apm.home.servicesTabLabel', { + defaultMessage: 'Services' + })} + + ), + render: () => , + name: 'services' + }, + { + link: ( + + {i18n.translate('xpack.apm.home.tracesTabLabel', { + defaultMessage: 'Traces' + })} + + ), + render: () => , + name: 'traces' + } + ]; + + if (apmServiceMapEnabled) { + homeTabs.push({ + link: ( + + {i18n.translate('xpack.apm.home.serviceMapTabLabel', { + defaultMessage: 'Service Map' + })} + + ), + render: () => , + name: 'service-map' + }); } -]; -if (npStart.core.injectedMetadata.getInjectedVar('apmServiceMapEnabled')) { - homeTabs.push({ - link: ( - - {i18n.translate('xpack.apm.home.serviceMapTabLabel', { - defaultMessage: 'Service Map' - })} - - ), - render: () => , - name: 'service-map' - }); + return homeTabs; } - const SETTINGS_LINK_LABEL = i18n.translate('xpack.apm.settingsLinkLabel', { defaultMessage: 'Settings' }); @@ -75,6 +82,9 @@ interface Props { } export function Home({ tab }: Props) { + const { apm } = usePlugins(); + const { apmServiceMapEnabled } = apm.config; + const homeTabs = getHomeTabs({ apmServiceMapEnabled }); const selectedTab = homeTabs.find( homeTab => homeTab.name === tab ) as $ElementType; diff --git a/x-pack/legacy/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx b/x-pack/legacy/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx index 9d42108f736692..6568c9151bfd92 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Main/UpdateBreadcrumbs.tsx @@ -9,8 +9,11 @@ import React from 'react'; import { LegacyCoreStart } from 'src/core/public'; import { useKibanaCore } from '../../../../../observability/public'; import { getAPMHref } from '../../shared/Links/apm/APMLink'; -import { Breadcrumb, ProvideBreadcrumbs } from './ProvideBreadcrumbs'; -import { routes } from './route_config'; +import { + Breadcrumb, + ProvideBreadcrumbs, + BreadcrumbRoute +} from './ProvideBreadcrumbs'; interface Props { location: Location; @@ -49,7 +52,11 @@ class UpdateBreadcrumbsComponent extends React.Component { } } -export function UpdateBreadcrumbs() { +interface UpdateBreadcrumbsProps { + routes: BreadcrumbRoute[]; +} + +export function UpdateBreadcrumbs({ routes }: UpdateBreadcrumbsProps) { const core = useKibanaCore(); return ( - + ); expect(coreMock.chrome.setBreadcrumbs).toHaveBeenCalledTimes(1); diff --git a/x-pack/legacy/plugins/apm/public/components/app/Main/route_config/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/Main/route_config/index.tsx index 4769fe6400ac1c..a410febce56951 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Main/route_config/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Main/route_config/index.tsx @@ -7,7 +7,6 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { Redirect, RouteComponentProps } from 'react-router-dom'; -import { npStart } from 'ui/new_platform'; import { SERVICE_NODE_NAME_MISSING } from '../../../../../common/service_nodes'; import { ErrorGroupDetails } from '../../ErrorGroupDetails'; import { ServiceDetails } from '../../ServiceDetails'; @@ -42,172 +41,180 @@ const renderAsRedirectTo = (to: string) => { ); }; -export const routes: BreadcrumbRoute[] = [ - { - exact: true, - path: '/', - render: renderAsRedirectTo('/services'), - breadcrumb: 'APM', - name: RouteName.HOME - }, - { - exact: true, - path: '/services', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.servicesTitle', { - defaultMessage: 'Services' - }), - name: RouteName.SERVICES - }, - { - exact: true, - path: '/traces', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.tracesTitle', { - defaultMessage: 'Traces' - }), - name: RouteName.TRACES - }, - { - exact: true, - path: '/settings', - render: renderAsRedirectTo('/settings/agent-configuration'), - breadcrumb: i18n.translate('xpack.apm.breadcrumb.listSettingsTitle', { - defaultMessage: 'Settings' - }), - name: RouteName.SETTINGS - }, - { - exact: true, - path: '/settings/apm-indices', - component: () => ( - - - - ), - breadcrumb: i18n.translate('xpack.apm.breadcrumb.settings.indicesTitle', { - defaultMessage: 'Indices' - }), - name: RouteName.INDICES - }, - { - exact: true, - path: '/settings/agent-configuration', - component: () => ( - - - - ), - breadcrumb: i18n.translate( - 'xpack.apm.breadcrumb.settings.agentConfigurationTitle', - { - defaultMessage: 'Agent Configuration' - } - ), - name: RouteName.AGENT_CONFIGURATION - }, - { - exact: true, - path: '/services/:serviceName', - breadcrumb: ({ match }) => match.params.serviceName, - render: (props: RouteComponentProps) => - renderAsRedirectTo( - `/services/${props.match.params.serviceName}/transactions` - )(props), - name: RouteName.SERVICE - }, - // errors - { - exact: true, - path: '/services/:serviceName/errors/:groupId', - component: ErrorGroupDetails, - breadcrumb: ({ match }) => match.params.groupId, - name: RouteName.ERROR - }, - { - exact: true, - path: '/services/:serviceName/errors', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.errorsTitle', { - defaultMessage: 'Errors' - }), - name: RouteName.ERRORS - }, - // transactions - { - exact: true, - path: '/services/:serviceName/transactions', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.transactionsTitle', { - defaultMessage: 'Transactions' - }), - name: RouteName.TRANSACTIONS - }, - // metrics - { - exact: true, - path: '/services/:serviceName/metrics', - component: () => , - breadcrumb: metricsBreadcrumb, - name: RouteName.METRICS - }, - // service nodes, only enabled for java agents for now - { - exact: true, - path: '/services/:serviceName/nodes', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.nodesTitle', { - defaultMessage: 'JVMs' - }), - name: RouteName.SERVICE_NODES - }, - // node metrics - { - exact: true, - path: '/services/:serviceName/nodes/:serviceNodeName/metrics', - component: () => , - breadcrumb: ({ location }) => { - const { serviceNodeName } = resolveUrlParams(location, {}); - - if (serviceNodeName === SERVICE_NODE_NAME_MISSING) { - return UNIDENTIFIED_SERVICE_NODES_LABEL; - } - - return serviceNodeName || ''; +export function getRoutes({ + apmServiceMapEnabled +}: { + apmServiceMapEnabled: boolean; +}): BreadcrumbRoute[] { + const routes: BreadcrumbRoute[] = [ + { + exact: true, + path: '/', + render: renderAsRedirectTo('/services'), + breadcrumb: 'APM', + name: RouteName.HOME }, - name: RouteName.SERVICE_NODE_METRICS - }, - { - exact: true, - path: '/services/:serviceName/transactions/view', - component: TransactionDetails, - breadcrumb: ({ location }) => { - const query = toQuery(location.search); - return query.transactionName as string; + { + exact: true, + path: '/services', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.servicesTitle', { + defaultMessage: 'Services' + }), + name: RouteName.SERVICES + }, + { + exact: true, + path: '/traces', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.tracesTitle', { + defaultMessage: 'Traces' + }), + name: RouteName.TRACES }, - name: RouteName.TRANSACTION_NAME - } -]; - -if (npStart.core.injectedMetadata.getInjectedVar('apmServiceMapEnabled')) { - routes.push( { exact: true, - path: '/service-map', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', { - defaultMessage: 'Service Map' + path: '/settings', + render: renderAsRedirectTo('/settings/agent-configuration'), + breadcrumb: i18n.translate('xpack.apm.breadcrumb.listSettingsTitle', { + defaultMessage: 'Settings' }), - name: RouteName.SERVICE_MAP + name: RouteName.SETTINGS }, { exact: true, - path: '/services/:serviceName/service-map', - component: () => , - breadcrumb: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', { - defaultMessage: 'Service Map' + path: '/settings/apm-indices', + component: () => ( + + + + ), + breadcrumb: i18n.translate('xpack.apm.breadcrumb.settings.indicesTitle', { + defaultMessage: 'Indices' }), - name: RouteName.SINGLE_SERVICE_MAP + name: RouteName.INDICES + }, + { + exact: true, + path: '/settings/agent-configuration', + component: () => ( + + + + ), + breadcrumb: i18n.translate( + 'xpack.apm.breadcrumb.settings.agentConfigurationTitle', + { + defaultMessage: 'Agent Configuration' + } + ), + name: RouteName.AGENT_CONFIGURATION + }, + { + exact: true, + path: '/services/:serviceName', + breadcrumb: ({ match }) => match.params.serviceName, + render: (props: RouteComponentProps) => + renderAsRedirectTo( + `/services/${props.match.params.serviceName}/transactions` + )(props), + name: RouteName.SERVICE + }, + // errors + { + exact: true, + path: '/services/:serviceName/errors/:groupId', + component: ErrorGroupDetails, + breadcrumb: ({ match }) => match.params.groupId, + name: RouteName.ERROR + }, + { + exact: true, + path: '/services/:serviceName/errors', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.errorsTitle', { + defaultMessage: 'Errors' + }), + name: RouteName.ERRORS + }, + // transactions + { + exact: true, + path: '/services/:serviceName/transactions', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.transactionsTitle', { + defaultMessage: 'Transactions' + }), + name: RouteName.TRANSACTIONS + }, + // metrics + { + exact: true, + path: '/services/:serviceName/metrics', + component: () => , + breadcrumb: metricsBreadcrumb, + name: RouteName.METRICS + }, + // service nodes, only enabled for java agents for now + { + exact: true, + path: '/services/:serviceName/nodes', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.nodesTitle', { + defaultMessage: 'JVMs' + }), + name: RouteName.SERVICE_NODES + }, + // node metrics + { + exact: true, + path: '/services/:serviceName/nodes/:serviceNodeName/metrics', + component: () => , + breadcrumb: ({ location }) => { + const { serviceNodeName } = resolveUrlParams(location, {}); + + if (serviceNodeName === SERVICE_NODE_NAME_MISSING) { + return UNIDENTIFIED_SERVICE_NODES_LABEL; + } + + return serviceNodeName || ''; + }, + name: RouteName.SERVICE_NODE_METRICS + }, + { + exact: true, + path: '/services/:serviceName/transactions/view', + component: TransactionDetails, + breadcrumb: ({ location }) => { + const query = toQuery(location.search); + return query.transactionName as string; + }, + name: RouteName.TRANSACTION_NAME } - ); + ]; + + if (apmServiceMapEnabled) { + routes.push( + { + exact: true, + path: '/service-map', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', { + defaultMessage: 'Service Map' + }), + name: RouteName.SERVICE_MAP + }, + { + exact: true, + path: '/services/:serviceName/service-map', + component: () => , + breadcrumb: i18n.translate('xpack.apm.breadcrumb.serviceMapTitle', { + defaultMessage: 'Service Map' + }), + name: RouteName.SINGLE_SERVICE_MAP + } + ); + } + + return routes; } diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceDetailTabs.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceDetailTabs.tsx index 1fc83217f2a1cd..82b641b0602594 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceDetailTabs.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceDetailTabs.tsx @@ -7,7 +7,6 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { EuiTabs, EuiSpacer } from '@elastic/eui'; -import { npStart } from 'ui/new_platform'; import { ErrorGroupOverview } from '../ErrorGroupOverview'; import { TransactionOverview } from '../TransactionOverview'; import { ServiceMetrics } from '../ServiceMetrics'; @@ -22,6 +21,7 @@ import { ServiceNodeOverview } from '../ServiceNodeOverview'; import { useAgentName } from '../../../hooks/useAgentName'; import { ServiceMap } from '../ServiceMap'; import { ServiceMapLink } from '../../shared/Links/apm/ServiceMapLink'; +import { usePlugins } from '../../../new-platform/plugin'; interface Props { tab: 'transactions' | 'errors' | 'metrics' | 'nodes' | 'service-map'; @@ -31,6 +31,8 @@ export function ServiceDetailTabs({ tab }: Props) { const { urlParams } = useUrlParams(); const { serviceName } = urlParams; const { agentName } = useAgentName(); + const { apm } = usePlugins(); + const { apmServiceMapEnabled } = apm.config; if (!serviceName) { // this never happens, urlParams type is not accurate enough @@ -105,7 +107,7 @@ export function ServiceDetailTabs({ tab }: Props) { name: 'service-map' }; - if (npStart.core.injectedMetadata.getInjectedVar('apmServiceMapEnabled')) { + if (apmServiceMapEnabled) { tabs.push(serviceMapTab); } diff --git a/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/WatcherFlyout.tsx b/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/WatcherFlyout.tsx index 18964531958f7a..c598a2fb1da2ce 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/WatcherFlyout.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/WatcherFlyout.tsx @@ -36,6 +36,7 @@ import { IUrlParams } from '../../../../context/UrlParamsContext/types'; import { KibanaLink } from '../../../shared/Links/KibanaLink'; import { createErrorGroupWatch, Schedule } from './createErrorGroupWatch'; import { ElasticDocsLink } from '../../../shared/Links/ElasticDocsLink'; +import { PluginsContext } from '../../../../new-platform/plugin'; type ScheduleKey = keyof Schedule; @@ -149,9 +150,13 @@ export class WatcherFlyout extends Component< this.setState({ slackUrl: event.target.value }); }; - public createWatch = () => { - const core = this.context; + public createWatch = ({ + apmIndexPatternTitle + }: { + apmIndexPatternTitle: string; + }) => () => { const { serviceName } = this.props.urlParams; + const core = this.context; if (!serviceName) { return; @@ -186,10 +191,6 @@ export class WatcherFlyout extends Component< unit: 'h' }; - const apmIndexPatternTitle = core.injectedMetadata.getInjectedVar( - 'apmIndexPatternTitle' - ) as string; - return createErrorGroupWatch({ http: core.http, emails, @@ -613,20 +614,26 @@ export class WatcherFlyout extends Component< - - {i18n.translate( - 'xpack.apm.serviceDetails.enableErrorReportsPanel.createWatchButtonLabel', - { - defaultMessage: 'Create watch' - } - )} - + + {({ apm }) => { + return ( + + {i18n.translate( + 'xpack.apm.serviceDetails.enableErrorReportsPanel.createWatchButtonLabel', + { + defaultMessage: 'Create watch' + } + )} + + ); + }} + diff --git a/x-pack/legacy/plugins/apm/public/context/MatchedRouteContext.tsx b/x-pack/legacy/plugins/apm/public/context/MatchedRouteContext.tsx index bfa49fbcbc35a2..b0a587421dfa39 100644 --- a/x-pack/legacy/plugins/apm/public/context/MatchedRouteContext.tsx +++ b/x-pack/legacy/plugins/apm/public/context/MatchedRouteContext.tsx @@ -3,16 +3,21 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useMemo } from 'react'; +import React, { useMemo, ReactChild } from 'react'; import { matchPath } from 'react-router-dom'; -import { routes } from '../components/app/Main/route_config'; import { useLocation } from '../hooks/useLocation'; +import { BreadcrumbRoute } from '../components/app/Main/ProvideBreadcrumbs'; -export const MatchedRouteContext = React.createContext>( - [] -); +export const MatchedRouteContext = React.createContext([]); -export const MatchedRouteProvider: React.FC = ({ children }) => { +interface MatchedRouteProviderProps { + children: ReactChild; + routes: BreadcrumbRoute[]; +} +export function MatchedRouteProvider({ + children, + routes +}: MatchedRouteProviderProps) { const { pathname } = useLocation(); const contextValue = useMemo(() => { @@ -21,9 +26,9 @@ export const MatchedRouteProvider: React.FC = ({ children }) => { path: route.path }); }); - }, [pathname]); + }, [pathname, routes]); return ( ); -}; +} diff --git a/x-pack/legacy/plugins/apm/public/new-platform/getConfigFromInjectedMetadata.ts b/x-pack/legacy/plugins/apm/public/new-platform/getConfigFromInjectedMetadata.ts new file mode 100644 index 00000000000000..daf6dadbaf9664 --- /dev/null +++ b/x-pack/legacy/plugins/apm/public/new-platform/getConfigFromInjectedMetadata.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { npStart } from 'ui/new_platform'; +import { ConfigSchema } from './plugin'; + +const { core } = npStart; + +export function getConfigFromInjectedMetadata(): ConfigSchema { + const { + apmIndexPatternTitle, + apmServiceMapEnabled, + apmUiEnabled + } = core.injectedMetadata.getInjectedVars(); + + return { + apmIndexPatternTitle, + apmServiceMapEnabled, + apmUiEnabled + } as ConfigSchema; +} diff --git a/x-pack/legacy/plugins/apm/public/new-platform/index.tsx b/x-pack/legacy/plugins/apm/public/new-platform/index.tsx index 9dce4bcdd828cd..0674dc48316f43 100644 --- a/x-pack/legacy/plugins/apm/public/new-platform/index.tsx +++ b/x-pack/legacy/plugins/apm/public/new-platform/index.tsx @@ -10,4 +10,4 @@ import { ApmPlugin, ApmPluginSetup, ApmPluginStart } from './plugin'; export const plugin: PluginInitializer< ApmPluginSetup, ApmPluginStart -> = _core => new ApmPlugin(); +> = pluginInitializerContext => new ApmPlugin(pluginInitializerContext); diff --git a/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx b/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx index ac87671492b76e..d9d1d94e778ca9 100644 --- a/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx +++ b/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx @@ -13,7 +13,8 @@ import { CoreStart, LegacyCoreStart, Plugin, - CoreSetup + CoreSetup, + PluginInitializerContext } from '../../../../../../src/core/public'; import { DataPublicPluginStart } from '../../../../../../src/plugins/data/public'; import { KibanaCoreContextProvider } from '../../../observability/public'; @@ -24,13 +25,16 @@ import { px, unit, units } from '../style/variables'; import { LoadingIndicatorProvider } from '../context/LoadingIndicatorContext'; import { LicenseProvider } from '../context/LicenseContext'; import { UpdateBreadcrumbs } from '../components/app/Main/UpdateBreadcrumbs'; -import { routes } from '../components/app/Main/route_config'; +import { getRoutes } from '../components/app/Main/route_config'; import { ScrollToTopOnPathChange } from '../components/app/Main/ScrollToTopOnPathChange'; import { MatchedRouteProvider } from '../context/MatchedRouteContext'; import { createStaticIndexPattern } from '../services/rest/index_pattern'; import { setHelpExtension } from './setHelpExtension'; import { setReadonlyBadge } from './updateBadge'; import { featureCatalogueEntry } from './featureCatalogueEntry'; +import { getConfigFromInjectedMetadata } from './getConfigFromInjectedMetadata'; +import { toggleAppLinkInNav } from './toggleAppLinkInNav'; +import { BreadcrumbRoute } from '../components/app/Main/ProvideBreadcrumbs'; export const REACT_APP_ROOT_ID = 'react-apm-root'; @@ -39,10 +43,10 @@ const MainContainer = styled.main` padding: ${px(units.plus)}; `; -const App = () => { +const App = ({ routes }: { routes: BreadcrumbRoute[] }) => { return ( - + {routes.map((route, i) => ( @@ -64,8 +68,17 @@ export interface ApmPluginStartDeps { data: DataPublicPluginStart; } -const PluginsContext = createContext({} as ApmPluginStartDeps); +export interface ConfigSchema { + apmIndexPatternTitle: string; + apmServiceMapEnabled: boolean; + apmUiEnabled: boolean; +} +// These are to be used until we switch over all our context handling to +// kibana_react +export const PluginsContext = createContext< + ApmPluginStartDeps & { apm: { config: ConfigSchema } } +>({} as ApmPluginStartDeps & { apm: { config: ConfigSchema } }); export function usePlugins() { return useContext(PluginsContext); } @@ -78,6 +91,12 @@ export class ApmPlugin ApmPluginSetupDeps, ApmPluginStartDeps > { + constructor( + // @ts-ignore Not using initializerContext now, but will be once NP + // migration is complete. + private readonly initializerContext: PluginInitializerContext + ) {} + // Take the DOM element as the constructor, so we can mount the app. public setup(_core: CoreSetup, plugins: ApmPluginSetupDeps) { plugins.home.featureCatalogue.register(featureCatalogueEntry); @@ -85,21 +104,33 @@ export class ApmPlugin public start(core: CoreStart, plugins: ApmPluginStartDeps) { const i18nCore = core.i18n; + + // Once we're actually an NP plugin we'll get the config from the + // initializerContext like: + // + // const config = this.initializerContext.config.get(); + // + // Until then we use a shim to get it from legacy injectedMetadata: + const config = getConfigFromInjectedMetadata(); + const pluginsForContext = { ...plugins, apm: { config } }; + const routes = getRoutes(config); + // render APM feedback link in global help menu setHelpExtension(core); setReadonlyBadge(core); + toggleAppLinkInNav(core, config); ReactDOM.render( - + - + - + diff --git a/x-pack/legacy/plugins/apm/public/hacks/toggle_app_link_in_nav.ts b/x-pack/legacy/plugins/apm/public/new-platform/toggleAppLinkInNav.ts similarity index 51% rename from x-pack/legacy/plugins/apm/public/hacks/toggle_app_link_in_nav.ts rename to x-pack/legacy/plugins/apm/public/new-platform/toggleAppLinkInNav.ts index 295b1017775417..010e196da9bb3e 100644 --- a/x-pack/legacy/plugins/apm/public/hacks/toggle_app_link_in_nav.ts +++ b/x-pack/legacy/plugins/apm/public/new-platform/toggleAppLinkInNav.ts @@ -4,11 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { npStart } from 'ui/new_platform'; +import { CoreStart } from 'kibana/public'; -const { core } = npStart; -const apmUiEnabled = core.injectedMetadata.getInjectedVar('apmUiEnabled'); - -if (apmUiEnabled === false) { - core.chrome.navLinks.update('apm', { hidden: true }); +export function toggleAppLinkInNav(core: CoreStart, { apmUiEnabled = false }) { + if (apmUiEnabled === false) { + core.chrome.navLinks.update('apm', { hidden: true }); + } } From f7f72cb737e03b0c5b12af7f3d89f03bc34fba31 Mon Sep 17 00:00:00 2001 From: Karen Metts <35154725+karenzone@users.noreply.github.com> Date: Mon, 2 Dec 2019 16:32:35 -0500 Subject: [PATCH 33/39] [Doc]Replace outdated screenshots and change graphic format (#52017) * Replace outdated screenshots and change graphic format * Added screenshot role per review comments --- .../images/monitoring-logstash-node.jpg | Bin 464987 -> 0 bytes .../images/monitoring-logstash-node.png | Bin 0 -> 412527 bytes .../images/monitoring-logstash-nodes.jpg | Bin 192300 -> 0 bytes .../images/monitoring-logstash-nodes.png | Bin 0 -> 235149 bytes .../images/monitoring-logstash-overview.jpg | Bin 309372 -> 0 bytes .../images/monitoring-logstash-overview.png | Bin 0 -> 313493 bytes docs/user/monitoring/logstash-details.asciidoc | 9 ++++++--- 7 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 docs/user/monitoring/images/monitoring-logstash-node.jpg create mode 100644 docs/user/monitoring/images/monitoring-logstash-node.png delete mode 100644 docs/user/monitoring/images/monitoring-logstash-nodes.jpg create mode 100644 docs/user/monitoring/images/monitoring-logstash-nodes.png delete mode 100644 docs/user/monitoring/images/monitoring-logstash-overview.jpg create mode 100644 docs/user/monitoring/images/monitoring-logstash-overview.png diff --git a/docs/user/monitoring/images/monitoring-logstash-node.jpg b/docs/user/monitoring/images/monitoring-logstash-node.jpg deleted file mode 100644 index e9c3d15e4818e069efa7f01063cacf3dd3eafe0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464987 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

Y&gU3soZX

4~#?q^)yrf$dQ5sy#T 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

{I0aNX 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 z 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

U^}(!|_e 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

c}I@nAEc{rUZ(OI7Tu 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 E0MlUe8~^|S diff --git a/docs/user/monitoring/images/monitoring-logstash-node.png b/docs/user/monitoring/images/monitoring-logstash-node.png new file mode 100644 index 0000000000000000000000000000000000000000..750e683b72aa5d0d0a727a00f7b2382d6add34f6 GIT binary patch literal 412527 zcmbq*byQp1w=NVbv=l3)K=BqR6ll@n?rxz3cS5k@5Tq0S8?ob>G6emD%EgGDn zLBr+z?tS;Y_um=kWQ^?W?7jBdbFQ`LT;Dh6OhVOEWbyGR@X*lE@a5&CG#)-E(9m#1 z9%DZo5tQ<fmT;4p3z2X~dgf6-P@QZcch+D?QdbKw-TM_kk?(Ex zUKVoM^Pb-s(Qh(Fra5rlbeXVaN9@UXOAz2+)XeJ{O9O!a^=-(LCN7v9O|j*~U1Z zu6>fPAVg}4LH?A`w3yhc^z*}}!So=4oFCU55K3rXKCBB?T4;kk0sJZ`@%Kvj<-6Go9m7RqyBy4j+XgTA) z_SL=K$?5ZMk$vO5Q1jU1!3>in`_0h^4O5C9pSaYHZ>iKjY`fv?$rGumvi6Ag9~b7$1oq#jpy ze^mTs0^Z_1F=y#exPgZ)zHSJPC`Fc8HIjN%n)WHaCL+qU4^f1ilXp&#wj9AQ<4j~Y~`Oa1QRoau1d)+ViNS+ z9b0?g2aix8yL>|O?rc>(q_$rRz1C-PA+m=NCik}whF~%Jvv1Ss$2)H&^RK(bOpy?D zVbF?h{7U_S>)6#NscI|q`1&Fc7{%yhabe_q&lbW_Qc<1vLqlzlS>b)}>R#%+%6t~X zyTLSHT{_pYR0h}0hzRck=&5u8R#o)%Jh9$as?Pc9_*wq_$J0+g&3-P!YWYT`y%wu| z)?!174++=ljep|#piCe9QVXDQIRATo?^;|KK>JR^mj>Oc&?QPKgN?+UztODV#@z%e3h(}+*B z4d1xdqAqFu9caQP!Lq(t0@!%J8psB>VA|;rMk%H0&qY z@1Z|7-b~AZ&|j5n1b=*QN&HpbzxhaV`&eIsg)aSlx|+=Q*S1Wr=rjBsGznIDV&%+< z4?>s!*eNk=5h93_iTH?-#HxgXp-VmJ#G&R&PK;PFrt(4>=*1Cr{&ndt87@JSl3t3_ z^m;K%1FIV@HG%pP6|axzX&8*?L>UP*T;4W37gcyCEtV>&D?TR!D$vh8Q^PLy(t_Ba z@x-P{8Yq?L@@l};jx>yHKp+lWMaO^6|m<&Etn=U68bAgx!|q!5J=FP z$+{85vE$NAC7hC_!ja8UGy_*1KZ38=aMktMIM-v%KdA@TrPozji^6lZXLqYy3-_My zY3;rmYs!ZgDUR2}H@8n*$hN1qsi)hD1+)9coZ;b9Lo<4XjfzJZ%OpN=?U}wQ?P48T zex<0lclOx7sw^E}djH~!u#4b|pvK7cZ$qDd|f9P2Ww?ofmAN z6anhn;5-j}9^XEWop&dDDw`a=EPBnSIXOANz3fu41AvDYVpwij5?N~0 z;#(FCUk|5lb#3u)fk&cKk-+!w9i^x8}HKZ!Hz8&#Ou2DjMw?eax&Jl1-7B z2DM8h5C%wvPqk0LodHg>WK8$F5P=YIl$0z@pMGCtRC1;olPXiJW+eQL)#Tie?tbfd zlk-!Ph@+PSDa{}F46NC0lO>X|lX1*a&GPz^BJ8MdY%@lFoP93+RUdt`vAdIoXdXF_ zN^f6~Y9ww1G?E>v9C{-ukYH+;XvgRvYBp+EpI|gu)CxB$iK*K;4&k0RyG*`Zzs%?J)O*c4=_=#=&1LW<`8=) z67FBL(Kw71#dK&{-!uFP>8zj~qBT@A80$9PGZz1I@w?Af*6kUD??(3<_}jY;wSLMd z8Y>Zm6!QxTA|UlVQ6Wvza{!f_=pu`dU@Kj#=ua+F`<_ra33IKDlKymkE_SFM>;Sqg z{2A2)SFigX_ zX=Fq8*#7u*ZGq$^E*G)en^u*l^7^qJOapZCv6D$<@j^UJB3H@^)`PnV6_cNfPc=F6 zQ}aXNzzO-Cft>|7PGO+3E?K;+0$tYAWNTq7Se0~+i1DVJj)F(V5kQfqBlG^q<@JV@K*122{N>L%E> zyoyzgZ+!l;6aPj!C}2&mH{fUI&$OS7weeOo%oD6}&kZuxxvh3G`g&J;MMrxPCy0iT z+Kfhz<$$aGE4>%APdLfy*y;>FHCI`w_vB`V7l%8O-2>NvHO(7Sd~a9klF|~{Sq@OV zYYV}g2b{WdBS*I#3$2(&^oA4FlV&@?1<*mPO$4hxD+{a0yLAr1`?dw7_6h+T47gnV z6Wm*v*pnES$OphGpKk&>xE}8w^2ASbms^yx8Qs_{MYtkZ`gH6KRShaXt!R@POx1K* zb`Rpylt@p_fF*1$rqia`%YACqtBwZ?e=A3(kMQc)`rZdzhUn?hH*inQO=;V|v1ePn zw$?joxS;XzEnBg#X*0d)ql%+45L|c9sz6p$u2?jKr7`BSt+$tiU6Gr@IS?R)0Y&4! z#bNm@&c)k{yJO8?s(cr+2M&V2owJX#54z?hBP2JK<=`2GC`)x`9YvrbVl^~m0eGiJ za3^$upptzTJ^6}9sCn(>`KO)gob}#592Gg$v&>}9`-7W>X!AgGW@RiP8enZ3o(2L0o^+Fl^$2lW3OQ!c8vN7Ul!h$A1`Dc zc`w&@sCwReI9}jPgp@=_(ddav`!owCh;qN)9PlV9N5iH}OT_97r*eeGV56;bE{ZCt zLr=B7euovZV4_F>P%P~=EHQ@tgay}8T(pZW%f`p{<0h4hB}~{Dlig^)BJ9ZOu2U81n4?D+) z)@W!#9s&=$b`~xsv>tZ0_Razx!u0=XA@H#O*I^EN+W$0h0SnWAQdXmtba1kur@f1b2b;Y!!+&@3fBKQKa5i%SIl6!x>}mh%*TmGp)kT<|{;wPT@9V$iwD17^ z-#ghm|BqS^3Ud5)hT{YKdyfC@`{7cdzm5uMJ6kwOI@sA+*t>{mnmJim*gIQ0xCs5{ zlK=1I|J+cB<1Z=xAF2LZ<^LRg&{+geh~t09PXy0?c$pmyO$<$5N?gkWeSZlnL(5{J z?-)!nThJninJ@m9w3<+=x~sG2=c7b23?Es*nJj%o5TZJt6ciL}K7C3VBNRhJ$Na||+A~bzc#T^(o4p3A z8jk_I4)`L&P*P+f^^!oiL-2Q*ku+i=BG9i8z1onQ(cgx+-H&O%pgsD>8^W|llzet0 zfWD|#q48}u7m$(kv@{!$^fl>4Bfv4*F|=>I~Shmnx@MEmxw{4*+nj05V!6~BJ) z@*hW4QikeBvX*fJuZXx$=+`j*x%>~h=WxWtq@?7jP^-%QNfYJa>Ghs2kts}#iG7y# zM;&##AAxYs`xKU(*H);P6p$_mmoz}TdA@B?yio1DVTp1CSM-y=WgT{;f{mxo(l;3@ycm46XCCYCF;Hb2n%w2Boefmg4TkN~k1lXHFB zAy~U}seWa?z<32hKGSvC{_;viW%NkdvKi$>L^RRhExn^xo}{ndk~PVp%?Q6r{r1mS zlpk18)XN+=?hd?_4+FO6o~H%J?WVaJ-p zH}WJ3LzL2m`T24l9v-3M{Z)BHtHhA|IpXDPr(pTs&pkOCubXTJUZu90>B${rVP~S| zJ7&Cuf7paR{cfPMY&WOQBJ~0|ULJFj!}X6RCq|w2%^O{}GF@iMq+7O-i=)Ah0kD^m zQ~N7zyYhGw;UYnRO+Zn~JfWh(oM&AlH$Z0mZb9y>sa#=Lyu)vVlhr(* zu6EMe`DchiXTQj!LeXM%_32)Uq!?ya<*{x5`k~DL0M!A%hwMK!Fn{8AF&PQ8=}C92 zdt@UCf$Oqtp^ovgV_#z1Yi!)m1_D`L{~Ug0ff}!hZRf74vz=D0u|&CmCJvt$&yBeJM=kUm}=;7zv z0xkvuW$1;Q_sa39M(yvKN7m-)>A7tRHf@y#`%7%%Ss3dQU4f-P{H3@n**_pN=q!)I z7b>t8p~rgDieX8}u=iMb<@JPu^k&g z5guzDAN`H9(pcuTi$SxBL8CpxvaMoc6J-6w^l2HyMnmS>5{0YEBOVnu`4gO&JgbgK z<0`pKsyJ~M@|&w2qR6x<7`YuG@>u*A zk~cpwO%BVw&u1gvelm01I$o{uti z4<;tfhTJH8x|#@r`%5hD&j0AnD#zg}NnW{$pVlclx@r@ij{e7vjqXi0U0%Wct@Zg^ zjnbFWGS5HV*EOqa0kc8l5e^pc2|qmB1+40v_YY!e5B6)0_XkGOYiek4+i4Lla4gzM z$)+gC_`Gff1pPb+flViuE!#)(SL?Dt-*(-3eB|fJwLmB;=0foIu-RjA|J<|N zV;U}0+>YOH!oh-j|7y3a`P6QGlJ%*ja=w03jYcUzdB+u~%6~9PO~-uDp(s7Da!>vI zpgL%^0|Lj>y+)doe8nZfzq1a?`D#yO*+QJe5<2j#G^-V+Z*8eV-3Ty7ZuiH2>}WB=iIRFTm_MLd zU_1AT)sg%5Fb9A(a3m2Sl}(7bMsOG#1n)QtG{SppZhq82>ZpJp-}5|H+RvM9iQ_x_ z2hx)H`0#y5$y>vOWg)tXey#YAcwC`*Yl{l_`>)lPC`b_o<|~9^+28P9g^Jpr3-K0e z5iMafM~baJc070<1(9E5K>&}1cV8{6L2T!^{+^%7&d0OvwEkIS6h`&lX1XpEm+(AB zg=#^ue4eMEq1ZTIxm#|b@gSz@^hJu;gi(#x2$0n=e=54-rAO$~rsK3Yg?`_V7%`2X zA5!m!nBo#rXo(n4h;<()MtJkr)u@MEi5|pX9BiQY6wO^gD|2C!h$=_Ta{2VFu!&sh z*j{1t=Tj|B3DlEwwd=Rx55^Lh(iwY+St?s?@t7iLHYZ1rj=i&o0$Z{@x=fmfer{O2k{rzR50SHZkn_Tv!h~wNov8OZo0F9y{u6s#p`!1nRG^ zahjq?wSJ@!@0Y>oP@pY&y|QOkY`>us9gFp*>hsQu(`Bb2>kTm}xw=~Vh?Af?1+Rj9 z!*!vL?L>}y(oo>V)8azNmPOc0-4V>FFjwikemB?GmfN5lAEj-oM~@S%{eR>=U~~(! zT*W#`dv}osg1R+q^v(`gA2U0fvRDzk8J3MUqe3KPEnPR10hT`Nw8&d{wO~v8;mO}* zRbu^5tmWh+Wq`fRyu1KIkBiT&VhQn4VA`G7afSlF4iP8VH+6vV&g~PN(BQ~NL5WT^ zs5Rb7K%m#>{g3N)G7SzZsg*4{r2u@;a#`_H8s5obxx`A!r?H7N;eyOyvf(PPysj)Y z@O)9=#`Dr>*EILIiE2`b@^JobRUkP77?;cTM5ebPSKT9EkXZ1GEs zwVU=Dz_n8WP+yd!B}#Z94Y?~$Hi$ctZVqlThMgT-tqh!ymX=Q~`@zaJ8fF%A)hP%1mMOieZ^owbI2+Y zM0oS@)DRO(Hc)(sjwqSN-6N$9t4G4@P}i#RvYJyf;N#G7U(f?S!)4l49IbT4Q=n&TfWxYL?{ zmGSZgmugjit+SsSrf|EjHGu<|%=6c+ZqFq@17z8zM#enyKwE&8*GO{*v#7o zjSU1@bt>IQ?=o91%-dE?dHckjX$)--`{pU8D;Zq(Ch>}e_1i21&Z%B(U3b@K3%-nS zwhO_%JzVe`+ihM3cibP7@pl}h>K+ajj_75cI^RSs1-;;&s7k)0`Yc4JK4>|2n)^ZW zeUzOW^6c9cjUg&^6E|{)Gvryw^oqsY62X?_--M!%+0a*FVwYO_vOK0K_WcZL_IxHb ziaGD1Qw^uw_gVPcRQBE?&IS9@jzZ)$dkm)ylc{(o24yw}Nt260_S=S*Zl0JKIZMb~ zcaOkC<4^H4=9X#zrOik8GP>dn!Y`T+$g+IsTf)iau85;)5|xL9Vfxa+A@-}OawNP8 zywXf{m5~cjcA{8y=?S4l-s#R*ky;R{;}R<}mmz+*A67Cqzb8%Z8lY^g(_1yt|S%veg&WRV@N$ImhXITJcJqNks0K=UocIHZ6v` zk(S%RfO8gYmiZFG9Pz;AB3IaZ0*0`n2bbs=wHKxh?rk4!cClfdF>sZ41n5Uh$I&3> z6QEXdh-Y@gl?s#0G8)njIw$M1FNCqYBK{`iQcJ*M^t~>?B`8mvo&8jV7uzOE@e*iP zs0{r8$19#)KX7kR82t;oG%ouZd1cOPGWuR53eS1YJfK4tJwE)VX>y}DoUIW(>jPAA zky|o37b;0F_*wEeK_sEzEa^K+eBZXqiI01!V2GZVlA^>ylW+BF##hOXr{0cqD1c|u z#u+V{ZyPK>TM`?U=U;b#HYdYN) z`#kRVQ=jM=7@S+5y~ot)0TIBTyG z{+nLRKkjXn-OV$mmuEj~qr-hK%4N)PLTskX=mM|}-(?CkB)=F*2O0z4S{=4xF^Zif zl1kMeT){RTg>L0(fEbw~s1?iW9Yox6T}=#c`MZ45V3E6h@R0BFZP3Y|@ApseV3&=e z@6oFW%3SeVZ|R$?W)CI`zz!Wb)!DZ1djK_{IX^%&y;5(sn!|iwg1P2Y|5?*_?8u)# zxivRxcmskiwA`SXMsiA@@_T}%Q<2PXDT&x3=~?7Tzq3qCwAx5-3FT{CUmp@rm8*Y; zD)#32;qO5%Bw6=tmv`G#;l509u}Ajs+N4f$nJ%0Ye>}t23pUZ+N?`c_aM3?erlos zn)o5k>>k~YrTc)$`?Jf~v&DR~z#$`k*1qN?H~7>pCY=XdboZDKQ?X@Ksmt{@Q3Kke zoktFlek&y|@XDjPi3c#WlfXN`XUn~RxUdoCpPbK;!kh2U;ImVQTL>JVO;)PL)p6F@ z9=B6MeNNlvr6Cud;2{g3K(l$k47jf%*7y<-v2lOib|69KQ}4Q(9Gl5KsKp9+~jDD2*n zon&}mG{cgISVmLK@){dzHeb(cuFW0E2HCGJwr%#zHmfuy1WM9e-fF{JZRG2}y=>X@ zUCFy?jMYFi9t%dsiof{wmf>Xi$62DytTmE4wnIs5tNu9ac){&kgs1pML6HR7PMzYr;UHJ>)U zmk?iYGeC7W$_E;BsIeYU0MCDG3ArqP`4_gZyeTywnx-Q5J4@+Fc*_P1+KEH=Q64QT zsa?*`f9<(C<^GzVU-|(U39LiCQTSGuyZ#vYhD*RvD~K_C%kJbLA8L`z4|`~k$}!4m zxiqyAVYsvzxTU;5*SgH)jcT)gN6?Uk$*gg1fAFmy64-7-AgI+t7=#{`p7aN}7Dnxi@|uUm>O zR~kS0iOI-FD@5987f7~D=k^ISD$m?ZxoeiKd-rQiPE^K!a^_G=Znr{m_PsuZxVXVc z%2m$hW_D)$FOZ#G-KJ2c*ezd9)0EtW&f6ajNxBgqZ3Zj;~+Z!W*8V~#EX(^t7Z)}su z{$813W|~ty6irEd31{E;x_!@mM)ZE9an!0!wp1~5ek+-medowk<%T_Z0e1DdA~7tA zw{P6}9%^w>07hJFiE^I4h-<7^JsR=x%R{u&*dLO5K_{wC=B&vUmIBbhB>@rzhTi^XJK!2sBPL%R%Q8gefE&oFK?S8{+&U)gxlew#puYq z)5$>Q#@Z7YOnyenZ_4~+1GELP%F9nN8_!pl+?goIyW&Z8(-`rF-heBkAc}4W^LEP3 zhx4q;+pUGST;PV`%To?rdz1`#r9CpkO~IXiCtqdMJ^JFf(hn8iagWk*+n;@VzB`qu z>E#yRj<9U)xU_dheU;_}O=vw}_VE3MMx&C{(}K@=*iNfoPV;p&@BNamDgt1CH$dx2 zGDaKLkRGfLZrc;RQ|`^tE}i)VtKLRLi+T?|5Md|=4?ZQRKCcuTk_DT@6KG~{!RLhY zSerY*sbMX$V&!S+W78vz&$zU6UktJ};>V8{*2EeJv$UuH6L;H*@`gX?gR`Q;6ZuwN zrmwr2yX)l$t#lcrmmiV_#l#+bhcWJ*8qOna@PYGr;iE0V;bleLBk6NwcCjdGt%kzq zC!#kR(L+#Ny|UyKL@lK>ASON+tXnxfuKi|$1-7wct~C>^v2|@9w75>(>WNPb+RP0f z2}sxymuqtUk@&-YLm92}(WzG~k&=B!JOriJ*pbUuf1ZrT#I#Te`Yz4~ zW0$4z*fBRQItC@YHJBF;AJ(ht!4o-HtnU+Q6;&?081>xD!5OUf6wv9sF zEzvKHTRu#x^*rEP4=hSyPpUfBZCBD zkNIYz8t=xv8Y7f`yG-w6IUQy4Vb@Opef0$mGhwSZ_#mN^jiG7bfwu3nE21`_^fjH`;rHjBrD_V_k>pnh=^7ht<7PZo-<$i zW-eclW10ny_FI)KACyJqi2VoTg5P~Q12k=7LRI9$JUFd`AT%^|`hKj+ zV}P@AKrxv;`H1PxJhEkf;)%tqL8IkIqX!7d%BobtmFWX;@cfz*7Xtxd0TY|fORHNZ>%-_=raUKs5OEf>1dTtMDp))9)yxQT+?uQiE}<45E_=u#a()SpsFOQi{Y zTjF*$zhGJ{9gY?LfVncmM3n$r)9L?q2j47^bT)UMpes!#8YxvA7Pd+eK7L&!QMLD` zRPlT-Y|+W*T154Z$0sF63G0l`#>dz|k6+WIAlUOIzhJpW@5#yaY+u<7m_sNoQ~E0> ztlP}+0*_o;T3UBXLm@HDZTfyEIlgRAOn{z#Q8QASwdO~@HuEX9YLFqRDr5%^bR~5g&ZsnL8l$>?$P2rXlOe zRd!;&H&Tz)Y1`8ZNBbPIQO_spBmp|q-Z&E~)-TRQcsph?dA07J_87bwYNPV&rkM3S zxteK{kePRHYu`7H!;UfZTn~79bBQc#%AJZ^T#0RlX|w3K@D`v~xQkv-T-g$AyFob< zn-^CL`}^fW$88)z%CI2D%%`)>j%s>O z4Ffvw0zIQ}TUl_q7eSo~vZ8@Uo(KA!oa(n+U5l&Sp96iny>T`R%Q;s~kv>LtXD@eM zZTZ?}wtdF<0t?|hfrW@lLGyg14Dtk648D1$iVK8fwjX(3RZN2!8j-*iUvs2$RdhMF zhqt86VY@ZYua@AIBkDwxPq5>M2pdZ~9m5K_==~Zc`T3vt_PjQcXwO}&%9vP4E{Z@* zRroIVY1^qG(z?>*pc{uq<&2_;rY;(pW~4Y!60KQu#{%oP1O{)C`~S^Q0-+E({*CpX zE0CZv5%nGvX3Hn4rVkflDAW#fns*^L0L!wNpU z=@{o6zy0P2P%d{M7gz+!B(n|BG1LpR&S)xi`%d$*c9a#u3|j&0t?T@r#`~C_2k~!D zeigwtMn4=4Ht|Kq;>HWjXaM&5ZJL*KT8?x_Xl&r|@tUnI=09a(FH}5LahFsFOo}-- zXT4ILT-u&i%&FVcxJJskTuYARESwTg);hzUd%}dcTkgN4#J#+JUY7zr;t)q`T9_&? zybf7P;{)3g1aGulXqUdRhKIBrwSd3LOQn|pKnIxwBFRmKxiKQQcY~BiL))?L3N9`Q zLU*%|!BIqcS)Y>{`{st`k0|U@g*M%9^7Lo#ZTaseD@MDK4~zxo^-;GmNBiTMiA6aD z@%MU%1%-;1UEqo8) z)8BHfMZ0pgsTz!b;=)NU-_>29l3x{{a_xjO8F@V!8T=y;Z`HU(U)a7o}H_)C`M7e!(XXOZEEhQLbbO=0UdsPxh_ zt;~6z%?iEB&lPupfl{T-8OsdZ+!t3fqJtJ>=ZQlchgNN<%-T-8)*S)CItRNY2A>(D zmq_##k!`EC!t-VC5mGXKbe8hw^XV3na*)8?lUl!kku&4ETcMdV0ZN;a7wwn3f&iW5 zN_}t;)e_S{pqVo0#!>WNqk0+UK=9x=7^sE`Otlu3n;v;e7Zk9#K6fNS>NK!M2 zW#qTVz@$`6x7Zbc{RvTI2=}tvyOXapxM^Rt9p;IdIoe%Z1{)ak9~-}qK3HzM;S7uz z70OG_aNXL`=+h#|cnGSup6uSgexPT3n%Sf6@7*#UD2#(uO@-vp+eVu?i3du~tSWjM zXRS?d2Xx(zSS|`1U9SW|>ugW@iQE;nPkrvX^NUZ`RpA-B9jIw%*v@QD=Az3w&lcq5 zhtl=ulH1!M7pp9!Xa?6*_C}hN=2cThoCRaL<;MHcGh5rEQBDI&8*B9xdMNkn+X+l$J+#A7NPVgA; z-3TD}S1;AP)q%tNtZKt1-}DF%6az;`%0$6yR0@KB<=E(!K6DFbwUT^n2%MGSTXkcD z6fPPfySU9l>~;$+$w8jX;BbYTmQtw8uzRina9NF-ncX@(kaI#}tjchjx)-PK-?4$w z@i}J8y?`;@s8==*oLtFo?5vKO$ulUTu98pRIdzhUV3rp=uXdf`39M+oe+Y&O4(&)D zTb&>7U<$iPAmatoLe}8-gx6akXCc;^Sa9t5I(s@kgJcw11Hh*$K&EuY-jOnL_EOj};vu`oQB?C`oZoPIoIx91dHYAeA>Q8T{#;(Tv9sl~o!8kc;>+d?5ZNzkEfT31Sv z=nz1N2!%inO?*5Ix=H7`pCTt2kOC%@R7IplhfV7;OjX%k=~RNq?boGtilx7ER%6AJ z&yWI0?sra8olnZ%_rG0g@krfvb2XT+tN9kZzaJADrCEz}*fv#in+IKATPu&rcm@VT zOrM+zbOmDNDs_Gj(H}c{_mFIX^NhJqlMB0!*@P!mRN-*7f~UxY58Zw!SdHC{U##|= zITyy_k}rXOes$}YE844fT<1yN%bwaA*0UwB^q?`8_;MH%J37{JL_YCD-N$PAA&Mf{ z?MeRlqCP&k-8!i1>Pa$x>DW!|!|F~lx(C-gORHPx;qa}(DM!NE)Aqd^hAZ0^AI2k) z@t5OdzhH*vE&jVtt&8M7-M@!gD}3-hp0(UzYx^&4) z{D4Jy{-9xN*|(j4X1`&MbfUIz^Fp`-R$mxNDaUszY{`dTvwKI|avh#0JOiyDh}9mRA+rEqyl7b~og2RLUnnIT zaCQP^k@igT(#{8N)++!;@7so^BHlWy*ayQICcmH>>(CTQzpOapM?BqGEDjL5{v$W; z+N>9VeZJvW*}dna7wEdgna9{Nm{EhC+0oyyAE2Nh?nBoQ6H%Y(ucm89r?j zV!&qhucVZ4M_c)U;Dn#jQr0hs3_AYPNMGx~^SmyK*UcxpbWWF5h#xzP0%hwiX{f5I zQN{lL^^}Bd&(V3`EVexRi(mW8esYI?z0-X^!_A!Qb~*<;)DpXD(c&XY70|pD@)4e8BEsGp0|? zJ5IspAt#$dK=_&gLC^K5_f;?AD#}SDnO%F3d>W^+el5bG#cM3+>5sNT9U+vVT*d*QeJkmSB_0&Z>}=FALyIUTKGvE1ptcB}39Qy&+C zUF*Ftkhw6lo) zI(*t;`weaezt?B?5-L>sJF`}Njat}+pBJv;`zd2^3Ml)qx4m!cIP~N>%kgLSD+ec^ z87WkCW1_Z(27VYD3G&Z19JPwxUlegENG2XCNRMK2Wp|07LI!f$D*V@JqGFk1A-xUNezO;DjwRnhj&5xxqumC7X6I&O7doqo<_H zDVz~L(YlF#UeNg|JcW(=qeJ76;EylZb%`7kV?m@q4Nc8*1KGSnE4zq6=4WmN&%Qe!Y_c0NCh%E}uChLWU%o^8)XSzEjTJZ_f1Q3QR zpRC!1W2C(f=>({K%5Cu!tWD%|)sV(h!cP}7)93e&2dtIIrF!%>Q~AdTRrZO&r~%#U zfdq}GE{Dym#^$6y$9;4gP2xSbA<4Fjb;@;k$xFn<#0OnZk0L3q35vFPz)aCR`kNIV z8!f~uct-8;hhNDYQ*C-rgNN+9eiUKd%vaweEgL7aKr$*M@8z~Tt0NDwHdXEaE>{ zcj>Nwz_BX&VA^gWV+6T9K2=PCh)|;3UO9SowK=oXo>vZgLRNH7EK?9hx*1LGca;e< zFp;yGt#)qY2E9r*S!UdFc)0@T$a1$RnXiW*!7f@8S#@e~%H3}qp4?TL?>Jedp$KGL zl@lfX%FROD0GqNmg7(F_hqoxib$a6Gzq>d+PI!!tZ-4jaK&t6#+T^c-G|z_;CaaEg z9y`;Zh{1w8<9aTC|Ln(QpOR4-2wh>$7o*>eT1x6{G<1^6m*{KBDscyS!!H!{3DVN3 z25vMDvC2N2O`hiWJvd0)^9$|p&7q}*@|nBy^ud&0Omd%sn_j9LKiV?UEz&-D=KFD- z{15T>eZ2ntC&w&mK+-&)1wf7QI478fTkSZycq5nNq1LFPcyOXchi_-1x_m~&64{;Q zbCapdLwLF+NRk0d#V^xs6feTYmu{LyMtb3JWBv zF(|~vDB(s`V=1fG=~C$EH7BKGNUnyHrp~^!^8v=fX_R@SokcWNa=_u0$5> zXR8)g=>@rY7^9XUXc(h0-MD{o#~)WuYiU$ig-c0*+(Vbf9T0SUgE{fMHV}H=Lv_x_ zTCGxzIr0lWH4d?U8ARLmt+V-PYp~}S-}I?NJkQu$2XSEtMzR$hbqO_4oYi6Q%tse0 zQ{wEaWD1}H_?tUNGg~q?8|+r-kWnu;y+>`0k%z*J)|2nM-=!`kAEb7V@Fd1JfZeZG zC`M{8>(jB%_lBC!Da)pg91rwV8v0uQ?xURg#9B;Rk~M^YhR9t`x^#ViwptTV0bJK& z9Q0NuFWRk{cQH6Dgf&>7QXOT5nA|_|ieU5>GNkt02c_PwbAtrTkLmd}qPN)=-JX#As||t4<22#3VsrpI ztdWiCv2q7gUe%rS{SmZ}vC(d$xtRG90{EWFy~*eKI~E~binCcy6^ise?oGl~8DnN= zcfavI`@!@lVG7lHhq3|~%SaMGg!O!WbhNTc+vTE>1CpT#`QXSVnc3A>#D3UL1GQr1d_Mjnxkv1AHs0^`pWo z=OE+G(v!#;KFAA7h4eCi?v_NB#75C?`{&PlAXSx_trz?s#z`#U=UM}65Ea(ixr5mc zu=?bTjbf?7^;&^vM6pB{Yvjx40+Y`5;N*)nNIQ+H9AUY@>HcivMhK1HNR_Rd?DMG` zF*hX4z5T1m%wI)^CFzhT-nOm2D9B8sq9Jr?#?cl?u2V_wEn#}0>ppCZ{Wy#By(swaiZDyFxV#MxTEs9zuHEwV?#f-F> zDM?*-t@$D=79dUIcbRlfZ~pwUtg2h!&}#V+?7%OKy~VT7@SX%CB2pF7&egf0B)i}f z8G$!?x|(YLj)u|8=HX9IF!*?g=`n&NlbejAaTDBN(ydb#%G^WizJOS@|x%-6XHbeJLR$3tfGa%)7~ zd2Ww;YS&+P38@)2yMV~g{Tc=L2KK}NCJ9_#u4F!-`s9a{{a{!kSh?RiorE1&Z`s!R zXIIc^#X!<&GBJ#Ff@b<)GAA;_^sCq$$khf?R8(6VA*>4jg}*V5bM(T8`C^6tNqNZW zOloHawrCv{?`qsbOi$O)ixHBDy?@@ka?WV0qsdH3lJP~BRP*zIJw-zENzIe}=+yQW zR%@)ZFx%V8d^!|P(r%9q zy5qX9+eD!*rB6du>^7K3RRyE83B~maFW-@^Xosce;&=tpYkO<kw(hAEz(HYLmDX+ zB5HX)dd&_#pDP>KP%ehF8Z{VZo2Q*ARRupa-fxA=K=rSEPZ2au*F!}4vD(U$e9h6e z)98z;3-evd>6sNeir6DUbPs>FvgKZwKYG~upeZvs*7ih6YweIp(P_dDyq~K0mBJ4s zJdYUD-KO$76{_*+vTWFI8XU()bR1_W90SKWpaHZ#?Q+KMW!zMnX%bELN5>v_l_w(x zFeA5n!r+DsUC+EkPH$}Q4sJ&P)ux)ygL!Bv?m~3!tJhk?P2P2pB>IiJJ;o8+A(Fbc zt6Mfhezc0gCHD^G?!G}S#+=NaNyl>M@_hIcV$5exDRs0uL@O!+>j`Pzd)6HJw%gX^ zw!T`gB0Qdi5`P^~v3_3Z@yqiN!nP!e%0~8a3zua)aRj4?JFI%W%!I>hqp^9r^OIE8 z$cO!4UVV@AHyQhY_G~Z|F)Z5QY0bQ1s~PzN%Vu!wFrRSa-wF*vM3nDg6Rbe)*F4(u%0;b5sk6{_X3nb#E+_=5B)G0o_qB}j#lZB;312W&A%Uz-t z7wwl^j^*U43)_v43YU&mY_Z zmv7X28R-kLm$a(~*+`iOZBMR|!sBZN4T}HZ0{Ccp^Adi3Mpm2eKy}-Gz0|fp_v({G zbEB`6=cZJLwA*-0MDPc2#UMQ(|LjaqmzdYf!w2uw-Bo1|yyt7~E+`&lZ)aEjt<&R1 z$Dqwy`*S6`UX|c?5Cm*%U{UTG%zW%K4qqL*v%yi02_68B%rI0>mm8B-QCtel-5@YB zwp_O-+=9t|TJ*F0gZ+O1EHBKuOn*dmGl|c{fzd7SQ;Zs)E0xrPtz;owiY@LYyTLTR z7t?DFO&s<}9P<|S;1d){QfA$Pq}|1)DNnb#7m-e_H~fP;hLUs@T3X=OLM2Akc9qkK zlYws1bjZB3ok?f-*qHIsr#8CD$9+ADj_u3^tOdG)qhgMtzDh%e*V&Xjc+OT+NnJFt z*d)Wa4`ur7^b6P2Ue030QYi6JX`*%6Tt2z-Zxb?-@6AGF@Qkx54;WW{D=m#rl`}GG zxjyX{A7V!g!(jKV_|;>xY*0$sD{Q?^Zn?3Kp@Nt)(mvwaEQ z9O^E|-MlWICTM2e5CLqo6}BR|{OCCqzvtX+ijO3g-^8-5DAm^vSTM89H!_dw$WV;n*xW|Zv8-pV3QX3 zF+m99;x$+EqQz^)E#HZ^PO}U(bSfsL?gxQ~tj<2ytg)?qQIGBqq48n89n4CG#Q?pi z8mYwc&a8)WJ%Q)uUrB%5Hj~_125USU6s7rTUJNA8tSb6Ou2Rgl28n_OCc=d)Lf{^| zia-%@&K*7}f4oa6P*ViI7u9LGuyTFD96i9i>>$e&g?Q|%aB9(unnlm>t}XF|XE*(( z-0W3v=Nz`&k2Rfk=vLO?n3_CF!@Z%aAlYIzZD4YI=X1M7keV)}?L&y(eoGVKkI3n$ zY`#X`iQ0#uH-bX)Lk5D1ZuIY{A!i0X!y%~{XT4NqD7SG9+0qXaQ~hsh5b66KCct(M zr(3hf$;M3FCt|Vom0V>Zd&Dg1e!cAjO?p~Ine&aU6J_bXZMNqYM-x!QUX)Hl!|l>W zM#y`<8A9fi@6Cb2;PHMEYGLmeZMUOW>y1cks>ephun(y-GA-|rp@djdz1VQVK+nb=PpoG%mj^vUH*16Grj0~I&Pu@ZAZLH10x&< zu6*!BVeZst*EhkYz6c*S?>xjiB)o`wAQy9d!E5Zjki9{D&l6QQ*>67pY45Dg9Ii}V*qD;WD$~@4q>&%IHt|~j`VuZKsVuChaexC zH)jQpg0ZiRnpf7p40$BZ-kfeu^`>5TsJ35wVuJ>tme4=D6w?e1S?=7w#Ue^M+0v3v}iCn84Jd!}m9M zvKB_f)h3>6IH~QAL{Ccn*bqlME*F>SNHCX8I;&iT!TOD3q4zwMPUO!)JBYCFh}=J! zIzP)qT)Y}1DjSOxT`v71(EDw;twtQ(d)mXrq}duwZ=Afqn5G~L*+m)_9aPt z0DZmV26b-E`f5D1W`D|5^G1a5-41@qtE1HlcZG1CaX*&%tgBoGXYOd;n4i6LV?1 z{VdsAz8y5=_qxoIvAE_rMn%Y6a)llTl~Q7qma|lL^P7+5#`V3JRufM*-a8C07}VP_ zj^AESlOrvKY{m4c!HOl@$_70UB&=@9een?<83tm_yJGvz{(IGr!E~Usfz!-pi>;c; zno;LG3XjuWLJeCk?I01pw6romjNrA4v-Kh7!b~T z=gxwPgF#sJNAaYWZJ|mxoT0>#Ag&*NrS*8a_ly*8Pl-N^<0Xp^E1_!dWe z;k9Mtc#M2)Ax?#}0$U8bQO)zD)KbmMgT@6;!F_fwwKQIbmr=5wu)T%$maCo zn-^HxZ*J;cmA6rZ_f(wy+>ypkJr8l$X^-moO_hx8jGU=KHKP#AY-1a5M#Aof!T42K zmTpM&H~s#(GvKMcq5c;_(I`WsJC9qr8VqY0aVm~Y?q*^P3Ki0Rv$3Rsi%nmF9Hz>D zS2qIfA=ukS{dVFfA_u{?obdw6BV4tGX99?!F`inAu@)sA5VW=fRb zF>&Kf*QcrKIg35aWV|L5VK)F1e9(P1EV0a@Gfdkg+{ArQdwsuP%w*;0_`QST)w@C0 zdOe>B`vsT&g+dzx4{L`#QpF@rch;jVUc_2j{i3%%hV{<|4=?E73|GxrT+;aUuF@3A z-}?HL_sK+y9@+(0vyo@j3*EZq! zFs>HTPB&S-dKlo1&umoFsS0RKi{J~uC!aM*1gGU zAM?DZEcNIxaI(17^p>@{s-+4Y6O&D5Nr$aHca*7j*4spnlsTbc7OjLo8`zO)@$Gzm zVbQ+v#rf=f_de97lpJ2Jrk|Gdad2pNV1+Fwk$((@)Fj@eMJL;OM&gAZM|*8aB>`Ct z89%TxWI3d!`svZP&84H&W1!*W3sAJYyu1$cXH!2gN?+(J0Yz|WB0?Eg(BVgHySm8a zZK)N2n9`krvf}lpxdrP$~U!+UkIpl z_(a@FpUbKcbO)z>vQ&S;)&=V9*}I6qC=W9grX6u}g&^TqJa^i$gaKge%S>xyMT1c} z)8hfLo&E(-Q;g1|>NLh_r`g~I-&RcZNbuL7DIv2`2J23G=oDDdYoqBTQ|CeUF*4nC zCdnpuQTEtEb^6Sef?r6I4pIK4W(U~zP0Ro4xp>;kd52N8bjR?pu(%MJ`*5#C8*MtA zIO`z6W^0KN2ZJs1gB)yWsni=tDI&3&M-IFdjp@7m2yP87lAgPLPg-C3nXq!o*yoT;eMn=vJW<) z>Rp!drJgIw_I!bE>J`4bkWM``Q5Dm+>$WpE-B01zX6rX_P?_jw;<2Sq=Gomk#EYPL zd$KkMIys3HxPMBOxt|U9dwB%QLoc%&PTdE?LPOtpSY4NCv%3po4InzNm@r@;x8G96q9)$u<zPT|0ln+A8_>bK6Kz~n zx2I)~@lr$Rn%!v46R-`S(yuG3Mn#d{u1~oQaoafD+2go#VpI#?b9?m4iIRJ4%{HZ! z`0{(R$ZF0Cn9o`ZipAw2W^t|Cq4uMImDh2KdF2I<3|q&haF(yji{J;roH?J0)#>(Q zj@DY+jrgio9U%4i9S%p$xS6W;dBl>`UVs!$%-&XSw~+l-+t7@$)^P3W9w;{?dh`rx zZQl<)*^LMn*~Y{Lj4+F*p?~5{nH*sy z*rbfZbzzJ22zb9aBjZZSf^>bh@U~Y>z>i`yE*{3wd*P1bzV6)G-ZIfG%vk};uB5(nBgw=-t@{WKjz5vZwBC#%0tZa{7p7;Lixv@RgS zxrdgw1wa1oQ;*D`-vG@jO7kR(zvvnfMGUTaQeF7KR-4SMvA2bI&%?0qX0aKFI;3m8O`Pmb^x@Rs%)}i8mRXoe$isD3uW`Am4yAYT(V6a)j5D$4b%Q z;3V(4!D+lWO|J~|1yz{!-tBkx-7EivqQG}}1jR zP59+yW+fe8ekm=z-^ZtY2#vqlfcK6N zx2{uD!~LArh?6~(!%r_v#y>K-ZZQMfPXm$M>ZWDtc})>Wh6In(E!n|CtTTadKF+>j zSL!#G)2MzvPRe!Y;OG?-pGB?n<6C#hA{E#Vywwx!YVu3YKC7QCMD~6#f+aPW#(zk` zO^z73H(Dx-ET>R+IiJvM4j0MK?GRQe+Il7o#J%G8$x^ESL>vpC4p7O2=-)j{^-rey ztxuI=q01~<+{`|=(IW~(4}uH|D`>e`%RlWT1&v6V7(}uXuYNM*Orn8$ODy`?6kqSh zrkgKgyZ5`V$n?NT&xSO6i?8*b_Ax}p zeLUpaBj7K6a;`>W8{W-Uy$vsE0zo|=H6iO+brR8rBRTp9&27o4kWs*wi z$`TjZx5?|aZY{aa$IG^Tl>7X`X;yzCjS0B%Q73H{iSyQ~(9j2=sH>z0+Xy%;GTIPW z3_0TTTGZbfj9SMFb%U3ah57jcIQ;O|Ft*1TYmF<)^EaB%L&?)z0cuam3N00rfl0_L zHPT6(Ttg*f963<+<%P{%My4xUWJ)Csf2=TAovU+#+y=I|IY9)V7w)_BW<#|caTy8h z)$6*HX(?f{r$C|eq4fA+?Bwzo0ch$=j$G{oUdk=tmfwgqUoNb$M#I9HX6mY1gnrqP z?5x3l{n_NUf~(E+ftL@_sn6$y>FbA_3L9zrH_gaUm-EdeA9M|8$LiJ*tyR{>LL7n1 zPC-a#uVVK~o8)9cMJN0C$T)M_%ihw5t=Nphk=4%u0-DuIg;;&%j~r+fac`$~`uiYtKARyKmu=nG;$4!1nO#s`8$VFEdT#o2#76-cSRclY zyA8C9Zv7>5iID{$0knSN8Mdm!y9gw4#S1pFSq^^wDXhoDT5Hr^&8e-Vb?xYWl?^tb z$sU#noGD&W5<)R*)6K*JtUf<@hINhGlG4X}c=5$bz8OM#ZH@Y>ubslQT}$Mfv&PDg zXB+jUqmt#7`t)36vyIcA9z*SbWey9Ff7LNh7wh+XiV3q1981l-TK_cq(%ij;KQ0sR zCQzp0wQY|fw2h;n&qJYnb|=*p(0-D38%?P?82WlRKK_hZ6Zz%xMT+s0Od=PF23or`E_^MQ06WvGRqy4Qqztpcte<4uLt}Vg zGfV?C0?RnGxuy_%kJ5De-XJULHH%Igms5~6X!EwL@J+lCo2s=zfi49knUOQN^4frz z=$g;&5MrJ)(0s&*)3athniIcdi6{>nK55?hd{HA$y8CP=D_1bd^(P}=Ja#pI!WOuyQ>5bJ z;jslH<@pf7Pc6dgLy8~;#l)U+jZzLYPqD|!+pF~1yX)g3>6v=!eo#5tF3xZl)U@8` zdF<~m_qN@QQ59kQ1L`3>5iN=+ows5ozR-~{Ko&U?a*vVCr77@$zGD-eIdh!9mbQwd zoXd4C-(>koHUo)0RNi|h9rc7rvtpaib}i{s$6AZ;M$hMdt|2!$xekSFB!kBfi2C-6 z+Ct^>7L>>t!AemX-29CvW`cz0Zy%CiKFK~8EV2ca=>qhi*!izV&> zK@msTj~+j_2m8iiI_q0RXfSXO(6?YUcgp3roa{ah(RQ-sSh$ z=S+1z&vD_@ebQU~@+=!p>n|~iABsftY}?JIZ03$zdxlBeyGL|pTV%b0&Iq8f{JL9G z<25Wsc5&dWQ7gk&qFEM9k7PJPqAD!*+wKm$96zjV*LgKjW_(lPYRG$5(uHkDv0j)YS%zaw? zSV4ufbb~7iWm?MQ?t-F3O++8W0F^zviRL0egX?6rFc2rihx^ecN zD6)}Nh>>sbiKWnV*%@&_GiHQR%FKP7;$?0rl$6NMTNDieFVT4Vf8Eb^oT_;D)FZ`1Mzeh3H zcW}@bcvlUC_FKe`kdZ%S|4lA7iB(K|pO`IjzLyg_AnK_jw}&j_Xepr*cQ9R^AsG&L z(%(+uHG~AEDu^tRhqAOJ**%x(WhtalA01nYkPMoR&2i8-)6`+18&0Q-uQeU2 zSQ)o>_sV=`&^C!H#t#=Z{6s8;u5GSXil0)16-O}{bKORt6e;=N@1+dnYn2(PL{Y0I zXpF`Vy+eN>@yIzK&I!hAtz}B>@tyPHdZ)L>X3$e!P7b)N*QA9^uolE+%r|Cccz8w+ zd`U^OMc!SxMqYf6tEZadD@JrB-A@8pR}CcIKaY-}w&nm%hMj;HF7fR&I{_gZAyu|h zCt3of7NwNdope5<5AI0^q+n?)=UC+oq@I4HPmNJc`JniMHYk$!WdgtiB7D+j1aj>B z6hx-2+1FFcc4_JMRKriSz3QvXbf!z8kqgw7%uW_)%0lR7Klns!hVJA+^g@e@iNm_F zGRw>yW)M6vJT#`GxA)UXBITLnm5NkOF%|&c&`10_%;s!M040b~Ev_=Nlu^lLE~bof z2MO_^7Zxs6V^a~%WVv&fVatf^PRO_|sZgB>`x!VUkSR~ho4=LIT8amEFCHnAJx|2MWp`B-60%SC`i7N1d}|sm zF<97^)x$5fAxcUxhhGeU+Cot2Gk?~t{a^P5pb!@?l;^pKZLoffh=^NF&=Sf@VP{zv zZBMH-tp7AOX1`r$%V(c$n$8A-2hVnfD>2X=u13&5QxYe7jtnatLAH<1>6{jG{TQkr z1gaWHmo(HoQkb+^(@~ZkCJQXCy$Xo$qcA@qn1wDb1q=a zvp%(83zdl=7%Qbf<9Yn4(;E~PiyW+a-D_go^d{KytP9tmBL4Uz?26o2ig%8$15fy9 z^E!gG?2G8Ncx^}s*`_DYP~E-~5M&a5_Mv=kIg^p0L!%r58dmQA7OXVAdG8+&k|;_- zDX4U8Wm#nPL;O(EriR6{$;h}k23nR*@*#U5$SJmR?>*x}zX@Sl2$L8oBIIBJB3B`-#u%u$|s>@j24fp6w?} zhu|7WW=$MCk&levU8|U9l94>^u`(ooqM%U2O171tLd^Q{G&T57Ch{lMPO-!ba}clH zxaKzanSNbm2Hg(HV1n6U2$C?l4FBVY^oSQ9KFR}3WL5~;8p$dQ@;kjw7T6!NT+&t~ zMzJvc56N&k?8R(eIINlcAuZ5IK0oS2nvFTYycXsgeiJ_%f=4pJc$?jN^;<;g(5av= zH(Aq!n$&))06sDM3^8$Y^Jb+z$IMmJsj*KJe|ednUVmk?n{KtDCThMSUZ&b}99m3{ zUXhKVc@dso`uypAKj`Y|Edn}h9vrcMv%cz?<>>BEb|RSvY12!6_U=Q3@iW<*dWKQV zlZM3iPC+brI2&E{Nz+~@q!c_jKY48b3Cr9)(yB*l=~*2apGT7>vCRj+W}6RJ(lZI> zqlJNjP+lx`OQ!>;t4cuoqDE=%yKGOzOhLx1Yr@%H6(oXA8u|vK#q958s)a*ou5ii{ zX4c@j+qP(Vs#my)@P)CpR%MFSe*1Lr*HH)g-jNv-vbv_~>aik|yFy@j=SJSPNYE&^ z8ShW}+JEwmkGSq&qk}gmpdPz(&5CYJ_Av>Wh76(>^}DKbbk-#-P7-X?`el{G;WpDH zY(s+ZRMmVSp1n4!tjjwaLcfN{%oXOLrmJ! zho!^A9rC?}i)Xx#a`flCuRoc{-vuM5@1EdN?#mfwMzz_VqKZBvanfHJ-)|_7t8Zo= zNIh{}4QF;Hf(%gpW6kt?!w@ZvfQX2J9=7qSSaC)@2(uHm;{WkT`w!irrjLe_nw#=@ z4UOq$U_j~c!aEV3*2wwK0(DFbK$ z9gIs%TAR*!-*|S|*%4ocNR8>R-IrAJg1oR#lmzQ90S?DT#RQ&mxikyt|A9G2xpr znShB{nTTS5R%ezkC+S~pgg;S}|7!*VLYJk#JeNU@Ja7G9*Zwch%~8MtAjxmPd__JA zh4T8BI$Y$0VWJYsxJ~NoKOZR$6Ga$t{?dlK6Yx@+&Wcv%y6Vqo^k;RK#3VsaPtOQ8 zt`0BOdZc%1YO1zkK-n*~x5x>@KKB+QzQ-65=s{y-$3jLZ!Db7c!uCDg9FzAxwwJ?t_ zXFpUQEshhLGa~t=<@LbQW1&+f6C#d${Vln`nvVRJo_0@*;Z9M6`u9M4oemk_?BQgo z&tGMAwn86h;HJGc#dlD4EqT3BAoU9~5x|V{RE3PLC_z0ZH`JTCjAR(No|EAjcCn16+#E(k z_aA-awDLH{M^vk+-N7N&cV?BbfMh_n3Gwr~l2B_09TMs06n;sK=QN!Xq3ABzawY!Q{!H&E{Lh{}MbT%UDj{e|lP+X4KsN^6Rbyq=5)9@T1+#izo?BC zo97=dlnrmVKbN_Asn3>8C^%+{4*P=W>~*)={e=cLkJLEP0$ty`*ctHl;Na=|zYx$1 zrdQLSG3nS|=9SQ84m*{S z&t|nDeU9%v%NN!jBt`n)dxk#U%8nGjv%`jli{hye(`BPmFR=Uy)X!&67ay(N|BR;%~h&nI^{w6e4mUP@XP!4V~X@#w*mni%z*K=o5= z$;;QKzw)g|EZ@;XbE7%?%S?!{NE-3;H)V-DDtK~UcG6=v0FDjelz*p*enM3zWJo;e zkMGA+5Y!@CD@VE+BL@8xTMxYPEux;Mr~Z;c{VhO&H6}Ke%)^45|0tx7McTm(^B1fE zq;bGnB=Ja-s63x2jo(P*)C2)dHVF#G*!k~P{nJK zUz`3?e~Bc`0cLjl{QkC-&~tTSweJMK^qmqCXc?eb6_?UfI#%*S#h>MP`_tt>x+S5^ zCPeJ!FOViXg5XW#UoO_qTtGzyMZ|(%zM>11xr6KbOYWCiCu$%jUGsK1JMI4;?vlSm zRc>tU13F*5p9@k1^f6Ys&Smwv$s6JQyJ0FJM1(AyGHE2AY|7l?_U$uBZE^}>pGnZD z?CN^?pco6qXJx0aI&)>U3m=wmpJ%Xk6UW2N?Go`NOy)~VtT+#krneXtMdFoJ^qqe? zK{4T!8m&HG1Tg?A?ERFyXmv5zMMZY zG`uGJ=sXQHUEHeEe}s4}kbn%jESS?WQ9_ymQ?G+I|v|J#K9m8HO%FQIhbT}Qiz zDN6F+JxF4;oO1E^QQ0lRIXWt31zMkr5@_kv9-|=PNH09OY>G~yW4sot*G%Athl$-U zwA8s`SN^GDDK1Azy4y3+4bpB#N$yE@(3&br+bN|-L87Ck?JoKc1T7*^`jAlqG5f?1 znf-tDDgSM6SB3xW z4*^G9YC74H9Ow_!KjvR+K7Ec_+T!18*>CuPscQrK8P`*CZmiXaZ=`0}|2%Tde1;N` z6UZ1@ETplQ&4wN-@xlK%jl=O39YsQGHY!aMGFKgH6^Zs!CRp(SiuaaHkRMj#Z~u0G z&ewYhOIB);Y+4T)(UE~%k_{H*G#xBU3j?K2bQ8j4uFm$8k@Y%#xIUD^E^->0;~CIe zVON`Q=zelTgUpy74WG@#_p_ht)K*$0aSp@RPWfM_J~LVX_r-l1eSf90Fb!%c>;nHG zmIuW-D5q(zCiQJc&UXUN@O?Bfv6V0FEj(~37?}2BU3UaRmGk%n-k8tn0!`T9JJa!X z_68#3fUDXcppbte`vGAbFY$}GKMHBv@ykR@q+%tsPge|+Dv9d98T~4A>9-~f04cne zO6RwC%j){k%jI>fHfO1RZSX{iX19KJS{m!sDa@UfO23m1o07u_q-W4oAA?H;N!$Yd z#`G(8jzrEgEOQHs?W(}ZQFe@iT3;?7ttc7qO|@Wl{iXp-9R1J57X2jTlwqXp;{4sr z9B<6=uphaOtPlv;$9?-YD7?V##rI(%&#S(;du=n6`2VXm|72hOy^bI>k>y;!Xvcp*t*Hr| zjIh&wvzVM}Z4uR{Y6$kM(Cr2Ed=F3o=K}H+m6Zv-UfAj^^+X|k$tk8^NOk=XoIn(n z2IhzSVVGL{N7iftVmbkU@xnnBiJnpd{h-{h{325ocIG|?(0{(Qe;3aOA903ZsK+vG zq1>_-kcgZ&TL&nbP?pa>JuZHKOK}7W8Chy<3TgLi*L3~S!Oftnn{@8Ca;}|mR`OY)U+dPb#L~D zp;U@)J_5gYTLq7!x-VKSF{tborir2y1MQBjB^1M`N)O2oYJ+4>K{kS*RVN$vefcet(58itw*R;J;$( zePy1w{xn;YiIiMtbhRRtOcWe*$O)OyDNwVh?*1lp+Hn7LE30Gf^ZkFfYkz*yY+h4T z|G@?D`;OOEd&J1NoBRH_txB8NX6oyUe=feo1}Mk-LNe&$IAt+k&j;`=I(dsqA)X=tQkFRnuI zF`O!^GUFNwz;nqB!+TtYpHY==+73?3+Pf$G( zYZ-C9wq}61`K*Sl?92w{s7rR)`xrP6tH+ql{$!4)2lyF6wRLonTXD3NOE0e?&U{RG zCKz%$PLZ=cUCNl}C6LJDB@plS7JM|vaP^;3sK$Z@;VWgxyW)+H&0INgcCz1^W_>^n zvCl3N*o##qv5QqDbw~t@j4L88qwS_8ZoJk$KO6R9rc;d5I8}UoBzEC8>*irKB_ltZ z9lPwmIw_Lz=Gk<-UE>l);# zi`E<%_H_PV38^(k01@f5TwMHFPZX6%=X!Xpe)d#YGjy4f?&o%oL?>}dT$L1cDoDYO zyrMCHZq9e7ThZc0k>Evt300;w2%)db8{iJTioQNMRw|0`zCF#EDATP6Q0aWn6L6TP z_w%}D*}&p#IxrGCO<6)~N~2*?jlcCh_~<-v_YBH`1k1CG9Pa+VeGQ00{1?n`y0|DT zj>2F^JC~w0zPe54K2OIgX7RZj?0v|_fsGj>;I|W+txwJJo(XtF*20h-R1{<@&LzW% zX6nxTGtRxg?_1Tj+)fO|id21&c#5s}c{5b_qL#3{$Mu&~mJS6)#sCwtSEJU^V9bCL1#g));h` zFKHjexIOCNv8m;3oY602*iEo6!N@nTi^!NQ1Ng0wTz%iHnm`+x!jf^kX#?t|^gzC) zl02TLjn~~f2z){EqGnsh%J$s`cLl^OfF7F)?DsuHgT_%(1+bK#%(=_J!S~1+dW(_` z!*cSLJQdZI3Rt4eE4dW*a(BzMo7z@rJHSEPO7JPG@@I$$= z1_uZ|(wcD#(a$e|C&tDuo!D>W{O5-LixaDpwn_w%lOgabi;%p=KQ<_McWIHG*cZ21 zvX2_M`IC!=M44BZfN*MT{=yy%-P34Kqjxj|y1oG)K4?3w47v-Edcyd0duFOhNiTCZ zhE18>p~pG&`?H#xVuBC;uxy!a0~#sf)*3c^V?pmz7uDGPM+|66u6WElr&?=trMRaU zhZGW0cij5to1@;Ma4g;#NND^_12x`6l>^;N-1R%1;HJU5%PbPm&&O*{OJ{q^Kq=r? zHG@qW6m0_=a>l^ij!@Zi$h;!7hxj;;Jv1H@_R z^SiAHdMysvUc7K$K7%}iL4efIn|S_URfEz}&3nO{@>L z!s}(rqD!?*Vb_*VB$i!m(w&zzQ`J%;R(*IsXSnAGqIM~zu$@MJA>qDsm{((xOK62k zswyQvL_l{%LcG%1LtSo5GS|u%2UovsSP4rqV6*!OIE2>Y@!TWQ`QCWQ)h|oq$B2P@ zV2=pmTNV7Dw=#>PB)9QFvB_Mg($B>kJ!4#~$vylIzomY3g13`|kqE|F7;3HoO__S$ z7rAnZlYWtVAn_Uh9v<1k(Gr2jX*b_RT=mH4nj=PO`TCAO0i>7JdC-KWbvap^%k$kF{dc;DE`q%e#dBG98 zeWdh-J=fnx1gJx7^@8X`rUDf-3EV>A@<_ZZiehp_=shy9{ajPAvD33Z><=|Y6bkqK z_zy7ap~mPDifyZfw=PjJvGy%?0L6=q8Q;Z+(A3P$K^|nZc}*%ulB4~Zvk9Kn6EsY+ zHU3Lqjvb-&DeHSBEugoz#_a9(3WveYPSK2u-X=U$pvPmq3+X+@4v__0_>;$w$yuFx znev&uwBZd{GaD?Yc4%SU{@&0FLulRwzLN@c-O2ZsL>+3_aaHv;aso@C=**6lfAK3n zMTl30^j3ElPm7e4P_3@!7NKc!cmDY7zu4u!TU3eCpPx$(tLkrPbJt)=2id!oYfIJi z$xLl*iVd2-C~ElXwn1f;m=HIP*Xsv-7-M^{Z%!zi=NNh1ADd>g@vk3XDPKHmdA?Wo zc7^fce07W4sH%i{`BJ?g;Iq_>{K1=b=-!=CE^F}*w7r#X#Rm&1pT>(=a7`=vfgCuLcoe$3-4r2LWlr{HU?<}X?)#{!0zYD;K_W&jVSK*`O&c^ z*Zz)E@S87=N9|l~aeO;d{nV}E#rm~{V_;h=A;$rLm6!oWEu1(T+AmRso> zHKn_K2UDJHv91Lr@zUz#!oG zbcf4$7XWlfB$(`vJ?Rx7o&G!kktf0*M|Xk_pNF7%=3Ns)E8|+Pc=9be(i&mw<^`&4^l`gGaS^`OtN zd}e;Ujxm;_JPU^TuK3+VyK8MK3t%v2ik7Rp$K-; zTCVib(Ci*-Qs-!N(z9)RBY|Db%IP4I63ejB#xHBv#Nv@%3n^8}JX*GMCnfXqjV`_u zVqtjJ2L*9YI;NlXO^IGHwD~G;jn`COTfd_qo39LT_Xee&yiesmOpfF>W@{N3-R7yY zYbWe>{}}IeB7_S>A%wk~N{skiy8(9*Q}k_mW820?HrT%LaEszT(Hehg{YfLIDh$z> zp0DezYb6IiQIuxai_hIxoHZ;%=j&YL>B6;7TxqqJ-Ih!hbbdd7Iy$x+(wk@Hk|>@X zcg*LN)rJA-uphPt7pH@562KqZ_jfY7*KczZlf}k2zQg)2MSv`Z8+BK=_0Op_ln0wPxM6;37$Ta=9HlB%g2A>9*?5+9xjE z7p{GaKy8p0EKbZR;wJq8^?RXwM^65%vPHvpGl%B;@oUT|mnO!0finC9)CIsk0 zHT4+6rWni;)or_34+-_CkYq9qQ|wS0ZwkNXcRmz#jMALxd9+InDGAj4dSX-)X$fBnLMt} zK6!PaS7@jo>yQ0u7;woa6>uX&adcA;aS+UQo*oUMstSr|dd4g5w#D1RG5TQW%2}X) zfyp&NR%M@{tv9`%Vm1VU*q|gT4Rbh@7C*xyU$$CiJP!0?o-gh!A_B2L+z$d}CpM;EA1n^cuy&>$KCJl6y)-5!^p&ix9W5b>MtmGoBZ$UvBNgmc z|Ez+xg!n8vA!+tG;nEei=`{+BH^MCy-KKou`pfcbp#YynaLnj?ay1rJ4zHjB67o1j zd4;cWePLt~P`H^Bw zvvUeKs!fBe=sxZ%v5mo8I{=CCHs;RKC;IQUwrEgH<4 z^NQ+B=nhqLVHDMz;)V)Ut8GnysKAYdergr#_QTuDdM3K(GHw+b-=jdW*o88n7es|k zroWV#ME)C~A|Sr%@w20Ifim;;v;}pqXFG|eKi)#;TW{&Qdare9(LQ?X(D4JBXZf;f z_POWK`dx!rCIcwV03K@SycqjILTjr4)2Ja|p`Wv(m^hDaTk{jyo}Mm;M4fU5Tj|)^ zTYNI~;YDDh1s)lAGAA%7%ShZSs=TIjZnw*Cj=C+{-g(+}YFiaXAst+3l3FMB*xcM_ z&f{yOxKWk#Q2LW;(MSO>>k}WEbP{~-nvHjF=Fm09Y0fDYv)*f(q^(hPC~e)#s91Vp zt25XWXnkRiIJt;uTnaCac00RO+e3bcv5pU0i#@K+vC}lp)EO99NfSqBZl37F&$RFE z?p&yYxk**=Y_(0ter+lN@p`g%7k{z5DXn?2Fda;w2Xd1E7UI+9-6g*V3V~nk3#GS6 z`8JxpLzda1ADxjj`)0pN^%}6w_C1`V16pcF>^2CyJ|3^|pz7fNIq&3=I7&7LWP8^VIzN}A zbK*!dq$)mpR^3*vdKK(|lyNB~9R`-AFR@O`$2=ARzE>Wv*eH<8g>+B=)h6z4AxBkq z#35}L{94AFTxSam-I32^*b`n4?ipWn&;S#So83f+!}uK+Svd@NkArWvif)hB9h+S< zGMrDz$h$D-zco58CDo6k%3Rk(!_9PiU=DUf*Jk@ z|0jqCY?I?Q+Q})V7W>f|)?(#2?p$Xwxg{tfsRI_in~Ws6J<*KX9#Io(a>~)0d|>;r z`AkUrjn2NDa}p3S?8q%(=$cOf#_F%{zpE{6WBYCsqvGW06ZU&>WH82Q1w%1o1vt9> z|B&|80a2}6-v<-}L{v%|M5IHyOG3J9h!LfRZlpy@k?ux1hOVJOQE7&*Aw;@yh8$wP z?R)Qe@4e?e=YHPne++xi>}RiMJ*(GmN!d}1#}hX3yC-szPkqE=YAqB%64=q;f)KZP zCS-KyE4jY-7P>k|y7~JQY|Xk)N2?3Y87CpeN=_R5>fv==wK3juZm~f4Mlf`0;fy{r zgKjm}(0iv4ACv$Ig`F0=H1*L$+A`?A{ggVlEwPR%=rh5`*MDOctm{z4B1=*YLMPoF z6wjbZ-L|dy8r?iNedlNiVU92}(yvRKgmq03Y5w=8nN^{@hsWa0+cj$!8(HQtx|yJQzVVy!28S%5jT;Sg@oKyeb*B+R zAJh|!3xh*7YsvLrra3~u#dmMDO`{1`?Gi2hjp!xHZfob%-T8_DVXZ$byJ}VjncGB0 zy*uk>a2Rk&%*v|P?R;sIajI59_R#Y1whu{0?ZX~VUqK4w_ZK7I>_EY`Z?(qz-S_U0 z;$E~mYdAn?>RTkCZ^ic8iII@~_Ry(IwG4!@y?A*bA#d&EAu#17W{}{*Dy_x+ojt50 z8$o?xoqzrU?KNGr*Eq2aVuY+)OKwRP9gJnFxVB~X&qbe+=Ic*w6z}QvwPsxx_XkN> zTEFZKpFOTK`R=xIjCKgU@RnkI^GZxFmAm?0fWhN$eIvCRp7tb^)x9!Lt`PvqwF88= zYolt$5NGuOLKtCjHq{ms-izYto%)&ha!~{JZUmp@p*?7ubP))*=N2(m?#JQ;mf~ud zvQX%Jj*dw=-W@mQXg}91>>X%5p64jc5bnhzn?ABoN$XY-FtMyrJ+pKA8lvgpxmlZ) zVSqQ5E?`kh%3YlhLCzQ7b$RqkYi_;X&_23BE@HNm<JRDr%yal>(Ou ztn{qp27-`}TZFAU{{G0}H-Jkm2pRi+H@k!}(`OLT-e6gxSMjK#je8!@A{hIGl5gUq z7k`gMNe<(f3|ID49^tn}vUNLWTnpG-_#WZvZx%Ms)UF*!ACn-~l9Ag#6|p0+zR+#o z-R%x3)_Ky_X!-_rTw+%|-!kwppE5eBZX^;R-emnurn`Fr?5%9b=(DuzGVc9u*5EW_ zet)-~lZ3IcX3%vIZN@100&f@p6i;C1ZPESbIug3pICpID4;{`2$-nhDG-KYW6Bqq( z)xNJC9@u|@iErcKlFWPCX3kMfGN_hQPV^Qhqx~)2T-t~};FC=UP}Nxv13twe`oz?e zDSo-EzpH=6f%D+VOD~Wl$tJl6xaS(4wvV%0(YGFU8jiywSjsV9D}3j$_cU9E!6pMDQ5o*y^Z z2Y8iw-ua||T<=nQdYCH`Q+XDt7Unp+2y*yT;p62vRAgXg++Q-e7aCzD`LOOl$d{Z$L{cC zf?RM00Cp>Fg43}_EM40uM*I|#pD*YIP*cB^|6D=i{C}n{kgTywLpUKAUQ=G%siHn@SQO8Y=S!*aO z+z9g9j+GdGrCn?BLbTD4@D#*~D{DhS`_h0leTp77(dNYNFscUi=*_Bi)|5)sk*XdF zsGA2xEWgHL&!HAq?3y;{dhr1|;C&>&O=z;X`MG#&`E5}T z>qMP}`c)7fc$~D{beUBVD)2{7K3Eg$xM-!Gt(TJFV(P*=HHswwOiY)_S)+^ZZeIi5n@NAoC~k4MuSEf$1kfjp?etN^$%Ap%LkU(!oQzt_{v zU*qjjT?&Rt-4k$#3DSWsZ&kD(A3a@w!P8(V^r5$7_xzK;l{TM8P4>Qd5tWF7)3Ez` z9miUam&k4#4wC@*iAh`0ONV$t>{e#%?Cb+jFEc4N7!@CzHgkvZnksuTuWL6gFz>P= zU8hg4lr84HMyP1{2P!UyUTJs+ zso0dQ9^ZSnUH>kawSM2t8`FLy*PNl$1NzNFO(1ZfZN{85Qv}mVKSPh@yIVMRf{y?=AaeE zb~`Pkcm=oSJ1@RgN3Gf=PBO|Yn<1u|%e1)TcRD7Z>~Ymqd*wtRvv}yPBo@6fu;yXW z+pE5kBKH-W>yxR(ZmdHkP3%9NN+c{dQd*(I~#!W$~oJ z$nzpzZ2MQmwH)gJ->#i$J6u$2EEGQI^d`}EMv%4#oAB&5?HA+hZPzrm7V2+Juz9I7 zo+qF8a}HOkny`yL6#|11i^OkosE+e>Audo}w;o+Pb}4A*Awk<3NC%2JcX~B@+`a9D8SZ$(! zHukMB3e{fmRkpLRDNXBBe2Tl=xT18rF>8fcmfeh5K6EatgDxyYE62r6E2~>8Nh$4$ z*48C1-SNevpQ$IB+_xSSX8Po$yKgF(-07NDm+~7ckMm~WY?pBCv^-LpPOY6Y9M^zS zuZ%ajZahTFK8vzLU@x>~Os4oXOPOIALmx<7c+Z*zVXIO2x-Q-Ifx!l|{CRf19{ihQ_Rb!GaulvU_7oy{ z38cK}y_NyhA*;R1TU8~>6RN|};SmF6C1z4AFclNBljfqPNC%lhb@dN(nFv?ksnZ%g zP>-MTq%Bs!HiCT&wY#knxhGww_@eLg^u!LXpng`C&2OF5rw|nHjo}7~8T3(l5vQ3?au&&)Kuf;+T!K z`TX!$(4&dv#BYPcGV4)(&^*+aJU)8`Osn*cG#Jz|n3exF_de|tj{cua-!j-l+ZF=caz$d&a@tNB&|pP^0g=*r$4x zNcgBkDG;vHPG+5I#zcE0>s;%F20JVex~KcP7a7t|G-l72HKC?+)RR|p0s_*$!`J7u zO)~3E>eum6h}xVUci(NX=*4v86n0Sf_N&(G(o6RGh^)!Ve2co-&Z&*-Jmx2(5`8%; z!>rk32WPd<)!h_;RLev)#y5TKZ6Jk*4NmdL+6+kc(zg2v4xp|4C&HL3RKYZNO)B@h zJ{i0nTuO2A?#8E|Az5{$)RMsxpw#|kpWew{Yc_B}xx*H}A2qjeeMMc)th>DJ+Er+9 zFcGJ(jY*`U9DnI;rx@^zdZAY-R8Q<1FAmv@(WaO#kZfVQZw9SL z)|f)=*R)ACUULGdriZ#%JGjl*enkCi*t4fYh{uTjfG3Nl$+i>*Y_YG7gDH>X$bHJs zgTlkidO!SB37mTH)$KgH?~reerg}%drc7J#%?*w)X|IiPIU(NTAZq>q zf33O@L9ywR>*aS=rhL{~ij}<|J^Yq2JleD~GTwepSgG&iWify>Xggi4Gf3tFDNizn z?cQ~sq!Q@cfknmv#ur2<4+pejRSyi==oWeecmyD6oD*~{lKIOkF+xONtrc^F5ln6C(aQt$Rb1ZLq zT=ib`SXqik!=rX#mCcEL7J>mp^tO(6nESa=S>;l_F8+fj3XE3|9e1Y6pACWq3o*0~F zdHlI#WeM;Js9g>l(azubPc5e1QySfq8f260Pp#e(mR3h!DRaFlK3u}5JG{Q#Hjq)G z_1S46#uz(`Ck!gB>G#ET1c;;@p@(c{BO6y5j*th*)boqSRz+X1`KJx-iASsV^d|a_ z$XRS%z%LfNFsG;$Rbr@Nnc!nTY93Ssl$X=I^0-pXW zRT|KzZV0&`(EF~CHY)KmNx>W18OW6RPl8QqsOPO50PkevJ~TY498SLJ z(mJYh7#$oD?!}X%d>A+SyOY6qHES}aTF*n-I!}GL^YgOE14~QQE@(Q zC3ra=U7&iQFi628d>*YRu<$_qK-i$sStnB}m$;9xWy@i{wpd{AxXTOG?7njkvM^}q zZh7yXZgb85vPJBT*~{;m25o%mRNsT~yux(2dZBgJ`dW!N$FSb}R}jm_DvvALKEmp3 zw6!d*qK0ZFR;YME(aGPaX0n~kaAK>T7y?~_h()jq|Hi;EBE$C#R?fLQaM8)zqGjyR zBJo~FTzo`*L>DNI9M~P88Rb0iNT@+_Nz8=kNE$TL@8@4@q(Y)n=Nj!soOTcDeLZ(* z$?^k=x9#lql?baV;Cs%YkLaLg7s$YGFL$pMLB)1O^5gVna~EvhEE<-jKi`P}^9zq_ zBSplISW`O;+ijyQdBb^{)Oe~&s6rxdMk=@9HU<%-VT=PkcW|QS4S+G=6yZB5biQFGwc3{)84b?(86vrQSLGkjIkPL zF)6q7j!8nco#gZK=9lU%uq}))O!2n$4JJ?xi)_s#4z`GH-BM6_OaiOg?))d{>f^<= z!`NzxeUD*J&E$D}kH z99^@s74kki^MJ0f(gP zXu61##npu>gik=i?t|a`jK55w{QW|}?A4jiBuBJ?d+S0 zU$*|prYyKej#!cKd!c8kt1mEeLIi0rH=R~DtA%+wV3KNKUfxyv?OOs>w8MzKa}l2e z0nGU1LLcAc92=oY785WeiFIV3uu1S9uS=LhN zzbtlvGoLc4N&&u;I6WKf z!X}s}dQ(04p+|mjPUOb@HMU)?J{NErA>Ytpscux`8fwLPyq!cLuDSj2NMS1Rk-Yd} zjp)$;OXFs1aJ9SqV3-h!KjfqATq@OKW-5gFrf3lz7gU$8+9h4|B`8Tc>(IFj$cV(0 zR;2M&YEq}RN*D|c*^%5jA04)vm30udv7>!s#mYf`-^CY!M)@yJ%RW#4bH7&zjsQmP07^qBU|OlkAO!dtw>- z%+YE*%SkEO6zWkDre-n%JBYdjVYkhvfL8`sNl$lMw)`N7^16eaQKd*~akl3RVb#x$ z8CuW3@gSS4^m+rXTwht(^Jg-IJ?dE>E>tpZo%l3hX!bGa?Q^<^Hpb0vF^2X{9N&;$ zHnh;}kV^NRnVl&U=M7@#O=d>LLvlW|&tX>$np{0UU9$aN=D2dF!TKeIrzUjLR$-cx zq=}5jwEUJmLQ-{`oY9>glez=p)^eDIg~`{?*>M`(DG6UMXYC!s6;*EZOujYD6_>HL z0CKWy4N3b#h0y&LS;Wx?%j=~Fm$^zmbMjFZP80L(X1jrTuQHGhCYL*a|Rh{@c#t;bVF0XxpoG6XBNA35< zJu16(J@tyMi-Ie9(9KE$P7txQdIwLlMNF*NR>t zfngbJYy2gOOAZ@pct4OkQIjW-}y=_G| z{`|0Kc%oRrZsU%g;g3ws7YKZOFSH(*hsl>f4Ajdl;TW!TC1m$9w@=!EUM8p_TDbFf8GUz;IzF?bLIyNj3L)o#PO$EdF_mAjo-P=iPR8&{$gJi zvcO2lu|eM@E<(R4g#I*{;9!4$vn7O`?VtiI&_nZDO4*yn`>fhemBzhNY++i=wl$bz z^tRc{Gjqz_fls${h?^yK6N6h{Vrx@1ll-e>I z!{aeuxk8U;eACJUEmcSWl!Kz#tgVWX5YmgVw)BG?QxOF6rra;pxii9t`6xVL0?K8;{nS{L)2LwqsgTy522i z5w$PSRP`k8ouR0l5j*}z6Kd#95r=t;-PSdC&(&$thho0qPhKQ{PpZ8ChC5cW8b=1B zVG!e^jC1Ew|Ni`_Y3_NHRasMr>LX(jnMnNkZW_C+kL6os0%QK}1Cl~JE8q+cHZ~&a z`_5-&6$$Yc^WsJ&TlnbVR2|MHRaU&l0cp``!(8F<^b+N_Jpt`D-?k>BNzhEnHBQP+ z?v>$`n0J)j-Okimn0g%`X>4EhTUV6LM?FuJN5p2HX%4%peh;=1r>gOqXbY8VLGiVM z*xH%6y8ZU33}SSrv_zC&>xfXh4qNIz>YC+f3i(yxGD|JX`4aLAuSv&^qkW=j=!ZaK zw84f6zMhPYSSk%&#nmVGcaQupva@dadxa1dRlg{+wykBUr9VW?j*~ynO=#;db;CFv-VXC=kYNjo*Q?pj#0ekVr6@W&426-tLFk!uC9Lv8w+}CnJI>OR9X7&1 zEmxuQXdt+JKjb?Q8*!dgpvu?bGI|LcG?ZO}*5M`@u9TLy-QE_?664gqs5jlQu2u|8 z$RE~ynBR->Q*xH}a&LQ4yNRsupx)7THf&)2Oz~O=ga(Q*P1J{^6%@#E-4Nk?%@0bN z#Q2-i*hYsI%<%6v4N(5@S*H#g?G_8v&6zx?Mq^3eysh%D`8eO|#*c1)&LBZD`0vUc z|H*0A)()QAGAW0aV^VVwRXUHJRzxP2R6@CXC2%& zEpBQqJ?4woRPA**gl~i+R$p{xsFRbF>Cd8Ng!M`+^xp?IBW$4DNZVzc2h?8dCo z`tA!=k9ohibk8r$yDSC2TN`h$Zp$68M@8Jj`*`AODj*eVoI987uN@kKL}W#=#{l`b z5{Zi0dv0xe z8hI_ed1C{M0P5Hej;c~D+-$l_MMC<9$)CTOu(nSA;77VT>sCwZ=y*&q)YRr;Tf0^3 zyM4U82(&7|mO`GY;8zXz%5`8%lMpFRz(0@_8KCyR5AMOO%DnibB}khGKFZebE5Kxw}o4j{!R;;DbXWX`Oax}P?(QK=QM+|YIshIZe7-UpSH1{WCezz+& zkplZI3ddvis56Y}xm3Z3wVstuPDb(d)=_+0E%54=clQ^0HAfTgVzsOXS`K8ZL3y(o z^)^HM8fDw7^%0=M9VkQgV}T-_0nbdJnWI{{4U*j7VAoLUxBgP7*n7QokVQZ&N$KnG zP71&9wBQTunj`a3J z3X@5gN04%(_j|EI#W=D$OQM_Y=F^wMn`Pg1z*3Tu-U+_ke_v`8Lu(itn+nE9t8^~mR#5~QtCev-l$wod%+V*sfe5!!WBeyMTr-nJ!exTLJ zqZ_C?VxZ^I+8irqx8wCOA3f)Xf@-CVDR_%GRmi)XqE!4Ar~cMI8=y#AsmhwgHXZu_ zTA#1Ph`)Vn@|A`${$9L$jT75^`h)8{-1(+un+*(0pTgNI)m5N6 zZZ_^gt`Ly?bC;Xx!N{^|_k)h8#_SHjp8_v#V-C1E<>`%>fA~+~!SimpRi?H&qx9dAiZOWf+vSo=-EikCI zwLd1xp+J6eO=%Sug6CpTU0BYSuSn*_D}ZeCWE)M%a|;SKBeMh_YrUw$qdq%})XU?L zQE=vpjwtTJ-l)yB9s}|()ki=@(DFBdwP1&%RYq%^;wq^%g?BKBdA-4W{j5c)^%NQmBnL(-&?|KDLlJL7VMM!ljt%?)@KXdXBQ3GKkyQkPnoxt zO)rj2@Cc@199iRqDYX!NC3GF`tfR&FyNNx;BshtEf*Prv8@8N#rW5^)W)D;QSMy46 zo%ML0JbZUBm#Z+!W=wrsV``!lLRcklZWF;rX%_X7ANqVO-=*s#^`O)55-|X$G*#W6 zI9L%?-Poow_7^KjC?J0|dSCLzkYofS_P@K3Bh~&0oS=+UkQcWGxR9{_+a-EnE z6ypoi6UCL}I`WBTBUTE7m)#}A1}hwA=eF=>KD^ZFwRJTT`yU-`%;T>#G=AHi;Oe)! z*uxqRBz`+cb0>@5$}IbR@LTWY`8biDWIy&C-6_Q(t_3Bn$zC2$?USmn?-BL8(|d!f z$@VHezJ`$*fvjx2V`~mt%bbPoi9o87T_v(8^MxK%^59E2J~Al8KejeU<0!FO;z^_* znz3;$Pt_SnG?>s_ziloot}EDeDbn+!+BgBU!3;taOs-#x$gzXl&DFQ!w6D&hOK`Vd z)LBJNmNvv(lY9Z78q^e}F9Fi%7IB1PMmph7pnqs%1&kC~5e*75n1+gqGJhzxCu$Ri zodRxoY~kR>E>4UyqN1dfvw}FHBurxR?LW70;*h@2(fBYR_&~Fx5I^EBphSfU1 zpz}~`7?#u*CKooN3>ED9g0AZ|s>}h(>B26dUrv6?XnkLbBj*}6x+&*W?H;PjJ`yIY zTgN1H@%~40He>>3ZhT>}Y8_xL5BgqYY*bcF&As-2+S&uSi7HDZY9<*)qPQu)n5x+k zM{aAx>r(m>t(;S)H3Jw&dFJ7zIE;Q}Ru9F&v~EOGAJu-UvO)5*L!mbm6Gp7zg7_HS-c$GKXa{#?!!LT`NZ zS>{tz$t&!nU%{9I%tw~5c@eHTS_70C!*9U9mx=$8x_?Rbf4NYSEGhFn=NTOURHU<= z^s4Wd&_HQv-~V7dJfI&F*Kwcl-v>Yb{nY@LN5EcA>sXrKl*(l}I&k?_Jf_#g5$VDA zzjwa=$!+@!D;+@UqNjhtDX2fplq`TWx3JJ<$0`3MT&w^Vj<2XwZQ5k6AE2y{A1^XQ zmNeW+iuzC1xsTbNyY53YKGXG`F)c`SJzDbBkT)r@cB-E3tM^ltrdZy4IGpuck)j>eHvR?Wo5oJUo^bgFXVycO+12e~e?% zO5i3}Y7j}~o}cu(!2b=~{{{X2@r_dhT0TC$muCUOa^mnWU+umAap}ML%P|C3MounO zgvUJmQ(m}hOyVPP7V?bj3VztnA};;uiX{uMLA~91;iX}6cfTp|{53kOJ;Qy~-?0Gx z^q2ncel9a&LBnG(A$2wYoX{vT?ziJ#g87zgBYjiZd*2{G{G2#Kd8#`pH8pk5^tb;` zF8n*7o9AS%}_}}cz4{D^FU`Mc!h_pWHx4qk4i0ygUn!3ttvRq-i ztmIM{h1|gVV)w6zPe1=4NAwLV;#gjxb`Ucrz6U2=oRf-YAPM{OxCG;ymh{^LA90N9 z1Lf}SES`Jdpz@)gDO&wglF{zrC6~Tl{p|qi0ey+_>A_jPn2aD>wZZbOnAtOoyW9VS z{f^&A<#XD~`*p4>77D5g15e`m!CK73TD1OiTpsWKF9ZCEe{~~|kja2W&V6S#&Yl(e z2P&l8OfHJ~l*Gd1Q5TsMRZzzBgpW&-F1EjaDzu}Rc)y+TP^@H6#}~fZx|$ick;Z)X zfSw*TFPd`qr;@4wkbT=-CZnQgtEvBOw)p!39Br}uzds-Oge&r{7`e3E_ zC}AbUVr6A(+R)5vgxa9N3Cz(Srt~1X9fv%1^Lbgxm+pvxKBbjdoU-GB3-N(>!x^=; z+Njq!id>M|Zr9xO1C2{R_D1iYq17G1CqR<(O|^NLlC@$QazP{h-+rxHiuS>S{fZRJ&PG9;zr9Ui>#NH_D@`o&Tl;#qNBn{SfvV`L zomY1ti>^KCVs;RYx?$rbuEqR02)p0MwP_V*OlW(@vs6VE?q4V@Q;#{d9fH5b9@d!9T*ytG8*X<<^QhqCuh>8FzwYQ8n_{nR zl0u34(}VXf_R9Y-NVO8}M^U4E0-yX8#)_PQEBDaRp%TxQ3CK6v2RF}c%BI~k2LE9H zIfmS{@}j-ZJJJ!usoBo^H8%k3VrAr3cd!KxMZX)p?W{i6k|%{Ob4cZ4vw-g<<%jl$kr9=)x|fwsE#D~xy>j<+@F{p)4p6P5bsS8m|>Bw z{IBpS-Cfw13siiR?-LZy>9G72B~fCH2KYlIna@p9v{B|b6rX}3N`+D?1AA`Bq%8#V zS(#nrQmlGBbCx?j=}I<)J7I0rNMUH=H`dQI+Id~gu1C7gfxk03=asl#8gUQ~ja(_73)q0XN zjWGYvvFKOC%a0eZ;ol4~9l>>C-kjb>mOM38xKT3t?FZ<<+su!w^4jqX0i0m)nkoQu zNO_NIPhgAwzqP@IQlY6wP73#i;5q%lxDMa}b&Ng6z51?yFX0lCem1bPwtq1> zx$u%67}y;HQuy4japg8S_sBxv;V~E^@x{~~&^NT9SI-+MS(VM^t=*@dLNhloNh5A{ zjTb3*H&?YZYdKP(De#D*7D0_kqK%($g?|Vn#)t3WGE=7XDx~=-mcj=C1gtO3s8jzB ze1;<%)|sdG1)pXvcIE|Jch zOU!W|X$?jq9uP(!Zl>=SU$~&IXO|KPxfB#>YvB%9-h20x_$gnN2^}T6O~trPHRX;1 zO)Y0yohAN7cK?PgME@)}yjEKMeWU+mEo|jTb8Y!Fl&_z&9fIbxx1#6x>hV^bB&%V049@8Xo419p~+YZE``dj{~Re06Qo+c^ zSMW6+?0_H*T40RO8^IE)#wO{$hkqj(xsQ_E%yrttQ(G9TwMGC zK`{0h>B)c1WArCO!+*iZ0X*8Y+}tCxDan}?qZlo}KABU2Kyt~UI;fdPNDvHzd}vQ;uj=Sw$> z`ErGo*+;pyv9U29f-C>wp8nwgoGQ@rsr22)Nj)mIGP9}tsfxY7;(c1ojXcjV(oiMV+`e%FIXQPFDE|C4{z*{&yS-ZG3E+i>#oW9vd-aOEM$_Yu zb#$C*%E^MVk5p4xCLq#~@5VLndg^a0%G%A;CeC{t#0%Hicoj?` zXKzoS`^lEX5Ez4c>1#gR>W@@XE$k|cp&>p8iwMu^reX8|f-%q(6;7X7IZ zT(GPil$i0eSS)|eT+ymuI|2f^A-!1}^&#Mhs0t?ht;wTXMRzDHk!&%Sx87M8XliPX zAT@R9@oz%@XDjbf7)qg!JT*bJR-27)OUnVgBRzE6L8|Rctw9(ut95Y1NN7T}S9v|4LQin?xbb}B^o-_sHhBZco?NoWyu6K{O?fGqIA1?S|a@|(i zd^7tK73H8FJJH!nB*GrK2@wagGY24$)Z1S($ozImg9k=1vh}sM?_*S<#t4*AOQaPOl~S}y^hz47Z8oFEE5 zH_za6xDkZDX7}Cxrzq8nGKblQ=_adpt130FPWWUAmufVgi&0g&-9=8e={^%XAcKqb znrg4Y_7V-a1v`&el5d%L-#s3xF4bQ$%?6FISnVF>6w}8E^&W=F0g||;bcyAQMbCK# zB(BtnoXcx%q+E3+C&0y`H+4=#mX(5v)yfQPvmlPCt8q2G_DhC?W5|t{VWc>?WGh}n zR;RfBI@zpEhn2~egZF6?4WVSMA}^}z7O1#K@X2{cCSXtGZOC>F`&>i>n-kd!b7BIe zuK$82qRqOQ%nj(q%9sswX~O6-Vu%6H{5bo`$fN8gt)8ca;=mbH2DNHF$0dm^KP1n5 zud>yPJa_E1c?moF122bx=-+lVv&wkflg914Otp;O!rKr`Dmmi&pnf6mZ9X^f>q zu$h^eR}%q$58E@h2!MM9hMqRMS2#Hl%dEZu5EJzP?Md!V{bR$~%44;?w}=&H>PA6P z%=%A(9)^(cNS%Rh;SQfs8whZ4!74qVMT%b%{iiY=S&X<3!+9Odnl$d--MuGYXp#en z1oN@=DsHC{?TtC8W%o^G{RE~s-HO^He8Z+8khOVk8UlNaGx-#eUGDG)}&LRZa@NDb0Vi(mO<4rn#a3(l4mCh|MsQ3BzVc z=Vm>5OO7wlW*EtVAWA*`OqT3%k^V@YG>#5N+4BliqmYk^* zgO^wzd}joAQ&hAsr*v-`iVzx%$ILeg`JZ1rZuudUTdQJ$`cZU zEstBNoD?RfNuP*>FFGF%;;+^WmK!&(Bw)_L1s=vj+6l$#ZRy&j`WiEJ&62(G9K`PD z4(%6o@MGW4GvEeCIP8%}(}*2T$63vtn{&!vwdcr#-iJFg4&B(TPP#hgyXL-N?KJpDi)1;&nF9Hh7$-u*}!>G>7XVYa=dEm=`&&P3QM44NZ2G z(|JFq%mB?4`7$^Chpcu*2@CLo!d*LHtCu&(g|r!G8{51|0pP5NbM7O86d{|;u_9fa z^7d8SEg#PIqs+Ro$M_UuG0#7TW$wEPaxv|1Sb}@GweAkvFMWwfD%W$Z)~j(7>S@WU zx1F=dK+V`xJhX~0YZCI{Hi4zrtn~kff-HLUZyE6iytYJi;$?y{h%&(J9a(CEmO@(g zkv7#Hd*YUg##?;-iP15cTJSQJiu}pEV3Gz@GmbOnt1R6Ux$MaMRgN`d-kz^*XMF|7 z?CTq^aujXg_t%xJ7<=I7dxzkj^PwCX(KBggD<$J(yOrkeEHdo?+~~v7EPK{En@MgR zgV$J}uHkQH*u$bN*9;3>6_{;H%pt7$m9OGi4QJ5RjFehAf^_s0OAnI(-}Wdd{J>S> zLiF21c<jlg$(@(>s#P8pnYuc;E3Efc%Dt%*9oo=> zhJ`L`a|G|i*^HnT_`^2C(s;86D@Lb&M{@8%ud2_>m;5(JN}a=r*zYj+)o&;5SvW*z zt=h+qb-+ij5prAa_sS@ERRt1p60HbjCcN)J=uIS5%i?yQ<9n|py09p`>t%Q?vXOCw zjqyFidHa@mcUC^tGZ1jAWMd~vV;;ZwBBY~O3mVRi5~G*!IS!VQKZ9b{rNq4FnI1Dd zH{7@6FxzFQSKdS3}dArCkJJ}VY zE#(f5W3!vj;85Z}WmVr1iG2X`;ZyV59RJ7zkW4cCrfKWM;X%13VGD)V22Luk{X+(2 zbtdiRr6a@T)?AFwf!$5S6^N4JXOKd&KmBqmUtk|Bj=f$6Ej#092VU>Pp?Sn zPOYz+aNA56&ACadM74fMe*!lT4L=~S4aa6KK=!(2!JXWJ*vPyVso4!Op)1OTGK)+p z7oSc?sudM1QQfkJGFOxeo2aD zgsL79O^8H=2s-aOk6Yv4yT36Q1ZGbX_CW9lgLBJ@7FF~NUya9QO9+?a}Ss3HUs~?3bF!hQYC5D4!e!CQ-51kNxHm%+@ z`Wqg0^p@bF$ZH8+w{BhQPdtJ!ngfnO2(@r3ivy-g5v`^Y%kCZZwEE_al;UJ3oIIz` z_dP4TFO=87iyI3vaUKlsWcrY6h#o5!48diCeysad8uY|(<8h=qNr?88JtObM8oNB{ z@2>~Fic}FE7Tw=eyvvOB1m49FRM@TGN=t8eQhxq2v2MOWGyL2SBQ)4{kP*>Lpp>P7 z>3)M_Xm(6T*ud3DfdA_AXCmN;^mYFb7vBn`HPJ^y(Vvk63tMFa?9jyc;Q|(&qNBA< z^nd%H)Z6Uy9a<)%()wCmY#AGD8l@eK)uSlFdJ)pack|1NMS?f>u z^eJJL4z10sP7AW0EMX8>@M%r=H(`Z;U(}7H7Guek!>|N~-bw(ZxnV$l_tUITpFb;J zpxsu==V3~=w!w~}mQ5F@ZJd4Qo_J+IuRQwo7}T(fY_DyBpER8@O4PZ%KdW8+TCz9D z3Y*%!vQRo0IZ|!z(zur?!tkh|!NsQ`^4gQO3;W9OvmJuzdb_kG&3r{-q2u(L<%vuI zg~gA-AE|b2vxHm{-6CZHnC}uDXxYxDVX-Dd<09Gy!0^T}Y|4nZ;Dp?!*qEK2W{1bJ zHoGTcT@kOT-+)h_?k$=lOrZ8h(tnz7?W#w=fE017Oc z-4G^(=u2W{_39_qbG^3{Y7NTX0dSXU+~>U2fS!V!+uU9U`lp*|4(4-BhZEkw008uS zbHh@w^OGo>nuAOLs-W)HInsvJ*8X~HZ#*+QU=}1543PKf%r(6U5r`TufS>gB?|Bmn zg6YnV&oIyteSe*0Jz3W2`TX&3X4pO|%V z=*5zBA8$I%>5Me%shy3nb>2A0s{S&qRV+idG2T>N<5wCP@+$LO58rcRl6YdM=PhCd zIC`Qor!*Z7lwc!^3WVLx*=EHda*;2hHdS}(=w<(3!Mc3OMKRmEZ zpPO#+d^bMM)lqMUSSfF&A-Xts5x`$#17@RTzO0T~e{$f^dTL#eovH(kTh8>Rc9$kN zYUHg2=8#<5ve};c?tHcbdkRl;=+=DNAs)&xSw8o5b`Uoj0c(XKq;irslu8J<*6_ z&>h+-B^g-WGq}Wk^&~W+*Li3?_cE(D3G8c=HE6K8)^YNk(7ZPuG69Fx&>I)}wR%;ZKsH?Gro1jcQhZ{-Zsx>)TJmg_$ zBvgv~J?1R)xLnLVv@wKAb>#Rnsf8`(GHbfIEZ;A2UAz?&lj|4bN7Ke?u9$=juhKhc zJqD1w4ffc*(^_i*O$h8X+Z|!QG9AQOXOKNme(C zpM=&UPjU$?$fty-C)qo%PW@zz;Gd2dGZsE>GAD|%a9nw+vyi}Tb-VzJuFT%`)SRkp zXb4E!6pVZ(buRQ|x(u@yONZEiVH@I9xmfgKa#0Ls%UtF&r!P+3E&ZcvScET1-FL01 zZmC((nxDKL7|bSs;fc?d>O{$L;O@Fy!x1LWJKf28CL5dvFJC4@CKZ>AZk9pFq~&CD ze95q7FO-?qzi07?n{5ka8#FElwu`21KO4#2ff^DAg7jE-wlO0?F5EU3h1aeadS#}K z3`o?x*zt9U026bYX}3Jf)2ZvB_UOL)YWLhPzzT=Sqq)g5y{4ohSQm;r{)O#3wSc|C z(43fGp3wYlvJLm+)48Q}OBLGFA_*DGDDmOSHTo#ArJH04+&Ym5eRHb=VA|H*rUhJ{ zMi}Da6EW+`s-c(p4YCBF<&uSdddc;4qY$hgaOJpud%MD*MvmI+L}4vn_H+yoV zCwikT2P<0LZn@|&;FEY!d#uov*&?@HIQ7S^q%+o1EWzD(xJORMD!_0w>a)1q6D2kA z@h%gwmA;6y);-hXtK5h+YI%v4j=UbN4E3nXbE|Q7J7Zz+DkZP|?4GGVb%s;{YTo;T z8*o1MSU_cc_Gnbu9u_`fur=tkXaHwTr1@Y?tmX*H`Y=DCVfz%(C5qY81MaSM*09qO z)AXO;DUix;-t+9nrJ6xVv&&<+CkVMmjx*+Sn;|d1M+nTjIUo}87oQtWgL_5Wyl>$s@?t$$PzP(VZlL>fT_=|&nv zK&4w6r8|ZY1{eVW>F(~%p*y5Yx$Bp$-Yc26My-6=0hAK*+g1C}Q}j7+ZRtgW`v(T%G(3r_JX@DnN)ykER5Nu+WscK- zl@9F=L#wNR6!zEP0_}Pq71)~sis5qR(p?*Wla?;4>cr)uP<`tm3u3kORFh|!$MtyX z?T@Ty*6)@OX-d<_01Ul9hl3E$OTq?my$JIXJ+co+=VX#=1*U`^E52g`?HJMH)n?Pn zX)B9anW?`ui#iqV7jS}6Y>q*)E!d)hD%@Ck-&$F#sFSENS{33giW~#?G%UT&FezX5q)ML& zznVPMSc1{PXR~2}{cvmI=|uicW^K!^v2`dv<^U0{rD;9#k5bNr$)pU^t975Lj~(ONi{9PeX1{SZ;PGL z0{OkrfGX1BW(k)Cmka_X#cvvm6{gUu^>LoW8?C+HRMbcjYEDBMGT9;!I=dI0k!+{xxi4T+zc6p@32XLO&H0h0sA!l|e+}kGR zbGc~^-%p8YKbL_|DV+DSP#WWs_9(a@SURh|)viybwKUIavB9vQ;p9SdrZRp;=y;_a zNQyxVg(*3e3kanz1W@5qlP)KA9{FsCKFkd9} zGCEe$6j?y^eo&i^m3n}Jm4@TEz#iuuHc<|F(E|xDV=SiA{rVGukd2&QG@i$lD(js~ zK|b%TO)@3D*gRE(YRBx0C?pKUKayE~L5I@cSfX zA5cRsVu5W}Nm4e+-65XVP}ePSoHXEM}t_lVs4vxDxJ4R1At~QX3Qnm|9URER~gn65*(P z6$bt;v#&35G-U8e5V?!|z=BJZ(q9KQ>_bZ4xVn~(%UyZt} zo{5R&&T#5|uN&t*m{0YPHH`e#tIXr&UV1XS_=r)er^n^I`yQ(c!Qtx9cZ`m#n3$eC_FuYk$nb&fn2D*-clBNFHvYgO-hAxV zY@*j~6+tUkUH>6Qu((-+!foXyaLZffV};BJVV5E2#my>!eP+AO^nytF)HuNX(cOzR z(61|w8*@?=)SPzL$WHrW%VcfjdCWR8)7mBYF6(ujy#L zMg&!_?tOrWOfN(yl_a>y{&w$)hz|bV`4xuT>wjyUg8dXtqDu0^OORSzNdh)n>) zS4XXwe3N{VX-h=0-jYQ1yqhQ?I7X$+q&rbBiVWP%5rx;Q!b493QznI$0lS%op z=#*nTVn=mO8DXkh5ZD->wfY2v8dW`KpxwN=xHuub)#Y9MEt4<`ZXL0d=+uB^U7Mil zTs}MKC0Rr-eNx8^i6^>CpsfYuYPXFi9p`fiqa7)+F_opcf>~xsD!>EGS!G zjRQR*tLH+k^v`jKn6SARHLC$hrlf~hV@FTRSQRmBd{6BarKVj4hiN`r3I~BI4lm;qYI!|B`<3~_(-_P#-nY|zkrV_~l`$>+e3lBc9R=qRE6?J2#zcVeG^Wg#x* zCHETigouMIRZdm=cSJNIXCmV^Ly^NIILOORtV$ z|MHtiIQfR7NzSH6mPb>v4StxIs%K?_wnDNCZ7&>+zxN-@a#0F4t@F0h(}QKE485@$ zr(lDJo~_To3E=4}BjOzFutD>Id)D61PNxF4F}%3pFgOx$*ZB)HrB$*zNKg5;9oOsC zTYZzP&4~HX4MT7%$(r<_Ak+n)z1jV{Jl-Ub0xZpG%K^t-gbI`P`(7djz1?VQW9N2- z2z;;B%$t)ucAbC+k~2CPeECvPmk^|*@yR1BqwA|GPg%21JW>)N9F>!dthR4F;EOvy zwOH44+Y{ER=^~DNyY53V`OYY1QRBgDFC51NcEh^)O8U=?It|~{cY(87R#;hbNMB8O z_ zVyxYcx!ZJ_M)=Bx8hae%@1@K_48cj%JE~lcd2_ zI3SEmN^@KKm}F)j>n=G-p+9Iki@eDHJ)EOLpr96CaTo^I3kT2Xa(L}J&o302)1Jcb zA~dbG!aitT;HueU`Sfwx=cu@jREN<(Y`Gn_C#E;+`AIa)0N2aJgiT9xBY!VTpL2|; zcsy5U9=q9lRu}4nGFCh-(Io=ZZxTW&tU#n{K2j4lmZv$ZGf+B4m8B|lIiV~tQnJOB z&#Ui#iNMQ&^gJWtMaYx8p_1nh7>y@;Re%|}v^qTNEB3#OFY*w0djCOM95wz@X~L$& zv|IGKT55Sg{7~A8-p0l!@sk?*#YnnvfWxZQ5zB5l26=l0B|YYE58{ya%jFvRWCRt)CxCpuC+fDGAgy;*FI0Qm}V`JBf{}*Uq15okng~v zh3=~(*NT1&p));^wOeT57Q^f&@wd>x8 zwGy#>EU9TrAUz(Qn8>K0fE)r67zygFIP=Ap-63MD>uK%c4E2d%__V4asT;yBgIqA4 zQTS>DuSJ;~WCBL=e#o&MP)S;8wsxlipTHx2WOVjA%-4S*@4HvhLa#L4sm)bzxEkYf zJC+Nf-dMBTY_P$K+D>cD+%ASCf0$bvXg$^LsF{+6bRI8ljTaccl)S*z=#gv=55IyK zA=!-z^G3!;iL-a*PQeXIU(flyZY9YiaQBt3G8l;ee21^4!LmJJ75XiTp-BGYMcI!D z2DLl_tC-40>CGi$iHnwSolz^9cyyFSWwoJ0t*w5k#$rP)j=`*|H60tmc`hpI;Xvao z6QF~abBwT&nT&kFb?Ti1tfRDm|UUxf?y zRN_?S(dSeBZ&1PXfkw69zMs_HFiJnuEl$o@UI-J_< z)rvOM!peXnU6ZXDF~tgoR-K=yMy*DbF%-6Xty>(S2MNVi%<%g8IOa#~$Mf-XY(9kv zZ0x9{SQ}9+3NiyV-+0wv+ri;cWr1=piNnd=FawZcQRER~XUUnLi_to0a+M!nRTBY( zg%zF>k}?}6tv-UuhrA5-vTssFJWMtn#f@t(;W}}u$nM@AeHoJn9K(25f)g^ zdbtU9RWIW5PUHz(swGhQsM_}oJ|e$!k=V^!ZH487#rcI32>!YpNQ&-6gf5kYXO|3{ zqudnW^(cj$@UUdi$V%QsOmfX@=|C+U-h`C#$yF6eU77aI?30D^};bD z^Pedn-<{pUt}}@$)91ovH9cl6%8pX6FV`e;zD&X^e3Bs%w2vO-PAoXVtIUuS#iBN$ z?&Nf`GtJ=Tdu8FBRi5!q-D3j{K1!(u*{)hLR&;e;^T@KHooF7S;C*=aN;Z-6+1&Tg z+2doVrfj3t$+`M(W7(V~TChptZg^FR?EB~T)4w^BJU~bj(do`z+UyMh$pULn>d01)Bh-M52RCSZiZ}pT&RlV=p z4Ijv|QcTs+@V@*2cNb2V;4u_H%hT*m>ZdrACj1(zqewLgt`7 z^ufV58Ylj!gkWbIA@Wqeod-0Hq8W0+2x=)38lRBp+Y~jk9I6HK(@gYy`dPx@6!2y- z#o7WKZqD_L-=w1BOPuQS;_xl5tMO2Y1Z+vi`f_vQ`fYV9j@D#;mw5&ki<)eezO9Ko zCMB8g^f?Kaf*Z&=zU1w?qLB5M;KEDLH@D&)*ZCduvfr+}9{7tGL~fru4v>m}eZ47G z`M_gLK_`yx@Z~X@LoZPjr0R@;&K0>nvwV*PAz&SW|898N$@Kk`6&ZoK;&^<{c;oz? z9idppXV{WGfM3J6Tw)rwfAiu@abd6X%k3eDPUEam*5Xg9K8AeR0K{g5Q%GX1_)zWq zT+c52F6WPgw+w74>N5Y$1>o4-M1u?s?NRI@FOp?6QD%GoDP(n^(!EA-n^2#60DM+R z|BSuASqxUrK7#IBVVac=oT|O$E!%}Zp46j-GsEOZ{4H;1@*Vs0MMO znfcmJPbE*E()K3}xAinNA^jPHqBnmZ0D2lMW;g7uxyVXta>R5$2{T5#XQ0)vU3tGQ zIE*mt#oWz#xBAI>-+R5>l|IFJRJ8<-XHtVluT&Q)aI$ghU{CC{=jSsigNYqycJKsQ z9EVe~i8qa7_yK(a#fgUe3i}APEF#E5Pz@C;mW>GY>&&CpRnALb&nq)qMEJpopbb z{o6P7Kl=C8u2)17Lk25?$&dR=>`-n_z`#*d_h3?ep=DT@(B}8Fp!K&b2X%N1ft-~di-QdH(c~rV)(JZXH zbD5}|_b_D@WLny5#d};gy>9#$zM#JY4_P6+c{wd*EcD!hK)k#ANB3ls=Ad7UvBZ@= zasT^9sYljx496ifiHBFYhQYeW?Bbbwh^)dEZ@JAoEl(qRC1-M0aXm7}&4H4pPn@h#hreEFnnmr>wsvtL&r8)ORSl6} zdAV-pNz=M|^7qBys)~%7$pGjZfmRMf0qOQfK_uLzO)d*_V!zD(q8rb9On2UHVgdKI z*R@6KGJ`ITPS52orNYsk1m1f7<=|o#5xo777rlVPH)d&^TG9Jy=>!`KS-+=*h z`s_Rk zuP__m!f!GNJST&Csa~AU;v*QldnRFDtb=d;wgW?Uf6v%ox`WWt!&{Ew>G%6Ju(@7} zFU6EY50zfiNWq$y9~!Qn+!~xpUN_PaP0hjLnuZ+`o3BP}n(wF#ivW3k?H6vNFb&%- zD_!JjiK||TuSW5LJL}k5#EfGj7W}p8H1+5`GMUP@ml?MRz3gYbU=QtWU%^IPT1&sd z#d=hy7@+v%GH)Y}>)A_OZN-=0V@Xe9J0YwU!$G}p8GXPA6q`OOe0sd_ZM@tKrC{Dn zvB)d!O+SS7o;M3^5%2uP==Ns&$srM=O(&=I%(u-LCe2QK#&}NKd?<^S@wO`D4$~ZR zZf>DaU4Q*RvtMAcsIP(A-^U7=l)Xt7(Ud{>B|O|yWn%8KGF*Chq5AE%>iWwBTDfFk zB2_&UG)X~x-nTnw$~9H)FdMvlF>*Pc-M0%NGZmVJp8bGpaY5|I9Djc68641YLX6wN z#?_22vVK7GRlFeX_sB`^(r@}zyb7J?gb5z*PM?@{uP!|i_MM|JTXrrQibBIkFVY6m z4q@H_kNRSDy@VO&rSHE`)~xvCXAIia5fu9smZU(CFyaIy27vOl3beJqOxt@Ry^z8u zpCp91V%Rp%Vu&3pRNn)^L;NBVK|b3X>z@%wn~VuLct>|FH}3Iz+zecwu)@bkGEU_MqPv51-BEcA;p5*2-Y*&p{jn>U%9RkDLy_i z9rtsG;rw?q{*RdG2NJj(PHOq#TZSac^vZPh7;ONKiTG++{xpqu!g_Q~V5s&I?`#YT z*BRcDv2H%}aJ|?hno#@ks@2~&MwjI1d&@{-?ctoS%Z2%5F;9y5c{rK#v?x!5Y`c5 zRj~P# z3&=QKxLqgchU4IR!B)5)+~S2N{Gj|*ZwpJ)zJT6hnwaJb1?oVDS~yKCWSJ1X2jo*f(6$h01(=vOM(G=a$^Q&qAXWs5sZdql*Hf`ioWE z0?IFpl-C?(M0}cD zb3E=1)!~CoJc~;^lT`94>$)dj!t8U9j0>((EbGQYyi1Rhtklp89@Rpk>m6(7uAB)j z@G|3p#-1N-NSm;x(`Mw_C4mzwG?`J+=ovpLtk*%8;xC5wizqJ^Xqk-u>ma#@mAGY=3g(@cq7aVWwzFhz{To zizl=wDbX&p)KC6RbavjC|)eY~A1Hl~ zzA*UKha?ir0`^+GG1#t*7Hq+Qe0RF#UGn{}fk*0iJ?78u;ojpkook7oJlcfx_yi>+ z@|tyocTu{12f!X6b*6<0ASlZf&$c6C$&Z1_bY$ZUS~ErDNJE(gEiY0=&ixCr05V&}MhzA9daK6%WDYe> z##O7+d2kL`#pS4G2HSH(0+-5u)1^qcL_tO)?uJ-JSt5^h8tu2NWviw{?)45n(SaVsZf;yHAO$o9f5bg6UFlVK` z)NDz4<^+ebxP=AqbY?;2sM4fAs88f1VO0^FCMx5Qn3hV232cf06vz_g3iaQ2EahkDo_=vs+#Ibv|@HW6t)Wmo1X z-(AaRsDI!31gsrH5`DJ0{)649-x>hqko4N#rkm?p^+xuw9EVj|4mxG0i$1}1a6N4g zQ59(=U-&N4b{hpARYJVRYbX`tuieMAzF`a;>E~;+luzBVa?`~FdOss~-;UEqC7Bzk ztxwwG8w@48O*_=xU5~5Q^JBzC*Ja=7_a&7GLXOv(Bc@G^J+0xnO!eM+Nx@Ix z{3TMAW>|yI5$a@ITWaSg^-ol7WFV@Q^A77U#VmiGy`N+R*&y%j8NN)7O7uLf+HlAA zsxC^fe7-6!a&F5N8Oy5fbMA&z}v<3zk{>V`^jY_^QiY>-pB}d8zRJKX?h?NG+v_IB%!r0&X* zbl`BP_4RKtjs1J}oGJ!=q>u#2xr7b27G6>d>}P1j6UPiFp>^Ph_Y~3&#wa)?JsVhV zSEHj>d8wh(&`@Q8u$DB{g!bFci=~;Q*cWOJ@=CP7n~(p-w;ku81J~+`*Nk|__Q7{N zgyDI+OLeGP|CGGUEk4>&3JbLX&>3tUlXB{0=S{U@g`Pnj6S3O3(ND4U-h}zBw-)=J z#JAC_v=mDc`<)NaY70d-wqC<;)pOmOdBi@R)TWX=0;^lJf-mn_GJ<49C@Y4{%ohs% zT#=^2Lt^J}{mNHer;F}SH1?lD9T5)ms~PUQUsYdXO~&(B(^ILmbKEps)ti085lcaN!b2Wn$0&+u35 zZnMqZs{9$~gO3S8WvTRZHnQ+vXm}fT>VnFbmE)52560r+;6rl!5RNGO9Y>vQ)%246 z{feX3r}Y}4Zov=P*bb&?Dc=nxfIp$Jp13zI;Go<)mAej9H_A?pt9D$^pC!-F*Et>( z`f3c*OWzXSwpLNWK6W3mloLXh3LsW8((XA`5xxu_VqB*h#ah>F(o#RaD3EL8+icjH zEHQRFsTK2vgUp-b&RwspzKd**Z9b$8jdPdosCn-UkE2~Vp47qC%wnR|tv)*Z@Y_@{ z-GV^VsKF}2XxuS@C^r}t znl`2<8E4j2-s*T1@fiP2FRaRN_kntaX$j+O`Qk-fu~J&@7!Rl*^sNYO^}1`rq}-gN z2y(hX&R#uTzGCV$*Mn69`Ow4-*_=pPQnETgE!aRM-Lj@;Y4 z$zBbB1IorhWCAwdul$IgIBbta0|;s#l6cG6d*nilazdwORY@#!e)+V@VYhc1ndYpj z)z(fX%oeDhXx1_AJB_Xs9isie^Lcmyy+LjWGyuNv(1OIeO^-s zJl{4D0sGCUEVLQ@UhH}zt;{(`9}hXDt^&zK2`q5Zn4?cES8r9F8f_@#A*bCZyBrW7 zdXSx@PXYC35f={|(Ttotv5eEGQ4T^#3(}U4haU=#y>k~L!Hn+`V-+J{*WVr zmsYR$F)x#6YMB1DdXR5;xKf9Phkt}~$`8|p@*HGkXRk%fu5B#6MeFMgFns6%~(PfV+DXdx^?n3=A@B zIg~ozNcX-WGBy1f@b%8?;KA<+YgPY#+AXUh5I}aB2dG;+lF$0oL-A{~{s%LmfPb14!#S z0H7narw0u^$tsi*&FZfdng2^;;(xTADMRa$rD&4b<_8k!L1(qU`|-cDx&f35nORx! z{IZ9Om5;bCASdu!to|QEmd~EP77_1YeqZLKJm%{^MTnv7kE>92!ynC)>QOu{L;6Q? z@o)YB{HQTtija^&ujIW*%d58wS8G<>;Fx+TJEyns@ZAQYs)gvGqKfwnAnXTdO5RTujxc%iddel9US9}N?c#}g) z&cev7$|L#oT2FUBmjjKthK|HS`Tpi~?)Pjy5HgYOTE^kdW2KT@ofl%93%RV>2^k|D zf!89G_$=%aj+rBeOT+396q~5y|Su+^;YFNUtu9WKeRqj1H8~^J(+Z`%B46TYV za-fT!m%c622ty+%{zEhYQ7kGtW~vztS}_%CcvAnO3Nl=hZ-f`xNCWV(N)_{S0^|c? zuYPww|JQb;f}nroWAS%1P>vP$9SZwxfW=?dD{_Kv!6Wf*c)`xBK{BH)?bh5rfv#&1 z=>Z;~Px8qv>$(WV1$xH+*RYcR#q9jM)kvMVV=-igT z#Nh$M==}4UYD@jP6i3D93Cq_T$T9ZB!z4rk9*A?m^Zkve1fFc{V^>>!c+D)PY*Z}8 zd_BhD!H1PfcW^ABzyFS|pi+rW*o%BM6YOI(c|GhMO02)Rp#S*JJS=b+b(`j_*k>{n zIKO0-*3`V5z08Y-$s`|C%nmg!cRfbDkcoQ~xBmR>I-EYhcR$1?c=TxIeE3d=NkbUy zWzNY_{NbovbLL%Q# zo@};<)3iL97}PZ{AxQdS$)ulrSvq92ZhA8%$TLD!JuA#~u_|cOedcYgi$59Bwd|h? zvwVq;U_IV!P#AR}XDNz+kbrK5?sPPS`@P9htyn*i?jRdONkciY^Z2uD@qnaWvQL+e zmi;R)PK0S^q^aEPL*oDEbdUe2wEvUB zr^2!5vgt_FGChL0=;;|5`+0rCGORdRn%U|->?#6K{s;0_m z`l>C%-3mN$0P9j$Van|?6}GNE^lQD4X#zTVgRskhd%wSt@(;G>t%|5c4DM%d`w4o6R9J)Gunyk2)|WfTq`sVs2abBf^oYa4}mWS-s0Urx6F96A4wm#EOn zrzZyn;@TcKDmT2=JH6k{aZ2lDbEGXwH!YA zNelp?%;e$1RsJ@KWLkmLl^{sS4s?DkvED>CtN%Y6EY!yQQsd$49khUUF)n!qq_;|7 zge3=ITlOC4Op#qd4>vhrARFM%ZY;J?wyh<@6A}c@Br_``uomPnuC*Im{+P1AY?AK`C1bPJLc+_{8%STU8+~SaDBmq~G zAG*?|JWY!v|1?Ge)W=Sf>Y+4&U%=OI(o@U0=>gPi1k8oGM=2&b%waYDGsG4vvfKw9 z)9=F)?{N0QQWRhUe3S;6C|1|c3Mx=J#myTV0~9$`@$)Qly@`noJ*jgzoL4`l&Cg4SLv>w8+%s*NV>`|G5ngJw)^N#>f^$ zP>-5q`J9w^yr5USA^UWK`l0`_SBRNh>F~j7-#l*}3oVJYva*(z1vU;22#K?N14?tB z(qN^^46=<)cX3{gVYDwSRSu=8y2d2H6~E6v>5=D7d6x;NU9X`2xZD~}MJm*dlo(0K zv0}Z9Hv$SrE7Ung{${!{GR_A$g&ytF1O^7+EB1KQ{17DmnG~U)QGa}pnj_>`Em!T9 zWDoP7hXNj3MDki4)(~cP2;5W{tDXBX`b-hyu|Ddd;YO7hV1=6Hg&Ji{Ig8z2F;8>q?!uK zCEu@37uhowg2q|{0$RToZ|ifsq8#WO{`vFg$g(O`6oMfzPQ5O+Oyh<8{i~W|9F`X^ zxKT{nMj1Ou2jhC%Q7&n(3-QW>e%=>dapmS zjqL~2L9psx=662_*(JFgZ%r@zCredGlDcsA_LR_H-p-;d3yB4ZA@os5jiZp+X_6o{ zc3jfJPy{(t{Li0sfcGKz3sfkp8)%kay)L=hj>%^qXD?1kbpfNHQ~fsl^b zD!+wbA~=E`6x~lpBR`W6)&!c33wxoX^AU+O&eH@9jH@yqVi{e-7CNZt1&yoPpEvjFK9=o9)T8g#Q$7Pxk1w~YOgGC{ zt)^NWx5ckv^zMJX!)a0KNvd9F5Jy_~{_Z4H0d}9>X8y6bR~Bb!tAuw)N7(0x8C(BE zaq64mJs8@cO>p&M?e_2+ROr9wjsDK@`|tYPduNOx5d8-uOVtwzZp`*$69awr^fX>( zRhki~LR`pNN8m?N>xWN+X7Mv5Gej~^LN@qA?1v4T&(UPYkf60|MC=}c7zAD)^x59M z!%i$wCg+`;PuT(byJq9rGLDpJwvr<&n#NBI=G*%I-0q$?Mm*KHoyUe#p$AgSNtN3_m^sMo z{B&^hkAn^oZgj1?KCofBhY=sDAAea!rW`*C7 zZ8+(}Mh;uwc-8-W*QSP}`M1h5N?5*o#$5aj^D$v0CfRU?g5`w|gFQ31i|iAlFcB!W zn`hLYYoWtceg+X)0w5EtafKjG^Ah+bduFWp7_?XOTCP{+^v$=I4A0! z+(#!KPab7@@uG?rAC~pDOv!N!lTth*#B9jf?)eM!u_BeHR)Z%ND>Q?Og+tWW5LhwJ z>yND1TGA4heqD5Q^3n=Vd%w9gJ4VuF@Eu8opq}`;V>`U@P`XACKu>$0((3_bhC*%8 zYUd2w`h8e`c4^J~d9tvrc#$i-hTEU-oMOSvPE%O7h zw%5``jsR+Y=b}qf-@zb-Yse=b{i8m6Z>NRwxI46Y-bMWQ9S_O>k+?E+C{3v>r=8%> z{jOh;p|S|oLnQ)O+Kd0LMz#37|7~#QUu&udYE%l+K(lo6J;~sI?dL!FZS&4+7fyfo z@~7;KfpKwzs^@pFx7d|55zaO`mz5)vNMGG2zJY)8O#f|$MV_N!V5G@OcHxLYA74Y; z0mI_KNA=erk}tL8#WjLN;1NF)+5iPEJzws%uM|ON3jb*z{O!NVcl}qf>2<0C`Q-zf zy8jlzABpevKZ{MlL3cR)ZT7A)AqLQ12Wcvj51CNr7i{Px<7Fi&qt|*5RMhuj!`(6j zvDEMX+}i*0NK&n^e$|4KZ7L*z8jZpSTU*Tj`&1x#_9D=Q6t=CUX4S-l~+;+yB|I7QnI|yT)&2OqdupKi7lJ zb)%xn3C``pMpgHu$CCfB+@UHSl#q+*4QIE20iM1s#{w7qbC)?4Slh`zh15-W^B}SI zK*oj)_>Mlb6?41u*&kDYWckpeS#+(82Ct?p8jqumvZ7QAgSE@?(8I9_h=^jC15Wgn zGvkyy85}+^LNFw>Y>Up<5_U)UJO;RDza{dgT5F`Nik&l+>b2?`eaC2*d28$UfGxFk30bqV4z<`6_lpjTQg_xyk^=yMc})lm>+b9CWhjcAa6G#Y zNK0M??R1W(RTbcOYfI2|7+2{ZSJTn@ajec(*|L-t6X$&BE>#l_H|4izE}AyYAs=v@ zwbEwb$kKH~1o2)>Ma-XDSNy_+)gCHuu-zDQ5BVV|ASzSd)$-lCdW~T)R z;MLOUB8pYaN82cx1&^>H^Sy3B@UC5?Y2#_~YGKDu|2qxG6ZLC@_3)zZ{8m09Tz-~Z z6N>)A^f1?EwP*T067D?HRdK-7c`n*ie|exi7>g`eQj)bntx^f;j>MHZq9flb#eHP+%80jenE~Fr~BWi1Oiz(opU6yd3}V z&dkU4GnIUciwQQTI6#EoIjtJH`lHW1q3X8V$eAOae!){&o9*3tYX;C9 zTN3@%bi4)|#`4(Sm*<^a|_Ux-vcC@flg(^}S{fu7~OaOUdh_23) zgQ1hMAAP5Ewu=uIf3Zw1e>pW6@A!X?N2dQ83@x~+t%=7A_6ND>b<9q0K+J*dR`3yH$Hx~$ry z5;}pH%UfDa2sju#gc!Cc6&-EhtpvD~(NCQTA4dSNT44;Jr7s!arZ{DA*sEmf-hd7@ zv0^7H|4<5e#IMpzJsKr^Z#9m-u1GxKk(&K@;3UJYPS&H#CKPkH@!SID9a{6E{OlCo zpHIre7K0X_j{+MPgtmpqLGcnj#vtj)QHKg~UDWR)eFy5Q+D?jiv=c^$=A>enxdg#U zxRQthr#Y3dUNAQj=}W0K{}HAsDp@jhfH%HP{X`y$);l{zN3&}C4qIBm zuc(GHQmO=(Qf3Ba&82jzkz(_RX z6N;ti-Et5JG|QBsSgaZ69U|*WZR8+h%<-MhXc>5Nz*P_t@z!M^Aj}dNRk7IauY9rj z>?F>Ox^W`OxzjXz_N}(r&e22}lY;Lk&_eZ5V=wt^%HR;N1#ut5FvsHsL=wdAvFckj z_X+OiG5m1FX2*u81=4&Lfjy8HU*np5pD~ATHutI0Zn7tbkQrL^xu8^e9o2dCMrwr1 z_NwOqvEMb4D(ZEnuEMRo&}bHJ=?31Zxtv4p5<3+PBN!EWvy6jZcXbH>Gh}o-d6vq zHp^eHVXoUgC>5FAtfN7!(?@6%#rS;#kQc6JpsJ3uA#}fUd=bqy9i&I`>!4IZ+jqW8 zE_qd-?p_t<*T+I?b`NM0Eu=Imj(lKb_i-z!0UXlAHuMmV7`>1g0B&O`RB4!MW}#|& zC5RV~C!A<#)p)Kkc_U)cx_E^bvCsPYhR4-?dGZCCd&2!E+{jY?CEDl0rY=dgX0^9V zC`8@bOY87m6V1KE1lCIFagZEzjC|#gIF?#Yf+<$6i_{A?{b_S2FGO4-HIJReP9q`?-KwF}Xv8=2-RVX0}pSJAP4T10UVq z0M8;Z!h5tIPndg4!*zhGujKJ#B-!#m9OMTcm%Ft|R$As8U8z(hc@dQK&{GKVd{Thh z)W7z_QBiUE%$Vs=tW1LCPYrbjs2#Xr7>P_`9Ue^-0fUBGzlm0Y$kZX>X|JAKC4&g;bqcR4EoW#L3>e{fw z7EA&x_xc!T!E?^*cus^~gx^LXE#7NCZg<7Wa8J{%cPlrokFs^y-*u5xTh&h)6fSAz zU5&)=_s1oTS1~VT3p5zQ-TJUKG20p6WyzX9vKLUoIuLJZQ8jPG0Kxue!t52A-@(l~ zUBD*97;Wr5fNO_(2FY$X);YV(WQZwu}m2M<&Q=Bc615r_v(yW~Wf)OhFc<;ji(aW9l9T&UY(E+ye&m1r9cz z8gqQw$f`1)obch(H-yj=Y1^sXH>mJ}xm}e@`NTe#nFvzfUscOa5M9Ru?anLL>K6Y< zozm(7b&_%71FjSi8hMC?8i@&K)<+KsIU((tv)K>66c+xyrjNPRs1CSvBN*JtZUZIZ z=Fe!-l;9N|HLI-889)+w74_B@)0s(LZ!94UnSP5Dq?{Y`cI3M zGUtj;?4KU_fsP0v27q6h4s5t6U((WXIj_`f;10|+#PbX^Yv<|V{biIY)joq&U-b08;gDZm?#V?UkC-{D|F76gKKZl8f$HbAFPB}IL4A3rfMsd& zKhJeZ&^9mP(qCI`e=S7eRKxS_Oedh>9H9Sss0=?jjAm3fYdZT_l@dtYv@c;QuejX^ zf>w9L-ZDb_A}TZI2shSQuksIW9Hwiel3#(>i0lQW43qj|xXxG3i&8{&94i z+Z6&Yi4v{u1m7T%a#6)nxc6tciM0fuLeMCXl|%LNHuqvne=e}sJAyM%SKfc zoeG_OcfH!rSzFh2XWK5SFE-DD_Sq)kH$CX%FlCzMQ?((@>S*~S>Er({0fcwCp0ZLg__}Y+fT1tug*~)aLfT0>6vj6T+3<3 zR1ySl5n8KuZcgCu3=Wy@?1BohiTQ}rznj!eYa(X{p<)BXb+KQ-<{oE@&(AFaY;E@QL}Dp8G#AufehiwUr+m? zEU_^yKEe|IO0&-G!O$P-=-){nYLb36=nGB$E`TMXqIlt ziU+_;Qd;n<2$QQVx1-+CI`JWz#x-s#LCL_(0hdlMgwD>s2{!WWF3;~Z<;50gx> znTHM~oF*s~{NSH94j_j$$_z=Eh0&-e_F21Bon35O59s0$#Sd`Lf3q-T;&(8yR@E%p zf%*+D`xg{*Kv4e|P2U~PX8ZpAw5py`bkSjT8d21qq06d0Vy`}G@7jq(RZ*?c)~Hdd zb`-5GR#CK8>=lyQBqWFkiSXXOzvKPe9}e#8If{KAQQdfBO0c! zcC=p&E=~bHm(O#n&FPU1H`_iPs7Bg@=U=_lgX_FbA+jx9Hf!Ts69=;rgh}~;P8Ps( zawncv@`pw$n{eIkURCTo)7v%|GI~wkgFGN7E0h&t6Y|635qWymP6nk3r_ND7Qsi)B z!r^`)^e30O4Wldb#g6MU`(oC*#^dC1b)jRy{T)&7`%|sGovlbMpS_j?NDT}z`Omhh zBlm4lV|6vV<<>=q@#tzdjml92QL+?bZ=+G1^KiH)r-8nLkLPK+>e3tIT|3S#NiRu= z{Z8%`SkGBOS@mUrb^mx+f4?QlZyuW%4{4=U~R_Ckx#{5 z#>970kxj%_bbl7TR+MFHRdHnR_qVXxk-Qk*HKO#os{dM3$p)!iASQbHHz~TlM*%3J z*$!rjHp%B^b)-`;?x9_&m5nJ-<C3^mV?!%v z7whP`u58T^9?+s*kbe80LdlmJ=p-*i>{IHWdK^M+-T!gXLBorfR3de)z8I}`Fjl>? z8H}x8&c>xj?KQe=22MyR%j1Rv)`kXG;wN^>1bOk~_0&un`(SpKHJb0J;Tm8#q?{}H z+I`YZzZY*D*#s6%xMU1?scMUSxjF=XOl8ekAZe$!8uYEyqNI9k(_y7*!D{_Ay8S*q zoSmd*Yz;~N^1Wqs_=vKoz%{u!RnEJ;5+M7Pq@9{=?a=xdfzVk<(WJ5@(8nI5kKUBO-Uk5<00p2jt_I%Wpw_ zvw@RYqGS1GJLgH^4@OteSpPt|WT7$m(FKZC1MK~q)l~PDdO6%eQZEzFjGb>%A=uM$ zp4hbcAE2)F%$Om#DMXRq&#SCf?zK#>@%XS+X1okTgO6M|y!;)~1FPVP;?+z5b^0)# zH2@#bV3eLZa+i)(nXa|!<0>KLq*K1}c)MEnrHnK>7m#&rrj?xL;lEaUZfo)%$n&6g zt-XJwhmu;-iF2Rv#lUh1oTnox0venuoO2PY1~hesz+woI%gBxDAGk?SnT*sb#~P1A zOyx(&_L0(*Q9waeVC{k$I$-mHaO`@suyI?ZuqAWnj9>2;=F=&c)ApyXNKbO_;+b8l z_2fA0l=jPo|Nb_o8PAuYbj_F-_Y0m`W>h{*qIcu$R_;}^cIH57p;Sq(ogmV%d{Lk{ zUuULI%OdJApWpgW+GB?{iOule-!DG8^&#gN=t3KTeH8y4o=Tn-Q%)5DlhNfONHMwe_zD#QfFe;=_=kj z2>#B+2BoO>aDAmy5C;@m(`PjHkHqK?S}5ympvkZE)+RiH)G@ zCo3SwDxRG$9Z++fwI^Yf_?jcc&I~ew~``a`q?LKQ?~r)(?Pk)ay(G(uv zNBtyqo)HoQsGTp<$CZ5qY>Q5ZqT0sOB3}UgiF^6ajy7)QNs31NjmC+wOIhDQ4-!#F zD}OU!*j$8USs@J0hD!p$3?>4HaY={mYf*2Hk`X{tp7t=`rh#A1qwa^Y>ReAC0~eCd z&d6(ej!Hn>A+^#Y6sys%{=#<1kccO4z`h{grSZ>#p0YOJ@;$|-jp`_3ti;sSgW#FJ zi$^XwZc2eFvpy5-@89cekOyAKSM<_UhlH)$%3rJ&^lr1tnK8${kIr%tm8jtHw?RCn z+BQZf5s#&eBHAJ5HdpL^0hM#?(J5w$)~yB6cKu1Jd`^>MRlZpminm@PF4YR7 zLfkirv=cdeylhaU59^-wTMhC5({&X^NIm)ZO30fTYDb5ovk#Q^oa%QpXQFp>^EK@F zO;tx2ibft;^Yq0Zn!$1BWKgg}rj_nYA5MYS1P&~h-ON8rCI*V_U$BcyY0D6BUi6bg zNz(AkVCjyt27d;GmWKs$WX73e?SeO#R|2g+miru&8UM+TDS=oFhqlG!@B*nqbj8EWkthp>f*Ir!zF8bTnH$>FPOqb0GDM|ICdj@@x0q+pR)u%rpF$ z8-cBTjSWgp0T{=S+2E+N*qXt`*{SzI;vu9Er6tyd4n*-B2Q z8<4`cK6>4+jLba0%3L=WL;%j%7FZ;S>NaCkS2@lFCiY@=T0Tanr^ZIrFZTo*m~?5T zl$8dH%(*N^>K9|^F$Sv`DTm|xxnWZxd)a*Y@4Y&opelt+$Ac*o7xn+lj=SdUIMRuu zy(t4-@^M%8yngiQugsF88-rsI7$tAnFBTsID6;ZtF`l_epNNEFs>;0;$Mu!DjsxB0 z<#F=7^j>4XPz&J@SpOCo+z+Z&t){+`3N?g08z)bf*T>5yVz8op9{-H`U@bq zhSmN~*#e{XSa7twY*`KcJ?Pw(E8H6TTJdi&$D&-_SHGw`lO;|ETK}c09lbp#Wqhk% zdKA^U0+_T@ucTz+%hybZgg> z`}ni2m45h^qQpBqQ4V_%P;w5!p_4Mk1ZndZ|2M&wP|>(@;}NwM`E#x(8w2#%DFM<@ z%W&P#Nsh1M0uZdeJ8id|0-XDWy;{VkyFojd5JC?f*xPbm z&>DJ)#*H<1BK^TPKBV5o1vb_ddLY{jHixC^m`y;NpLWmEesT|dwRH71B%o5Ox7$bb=u3?~xGXBC z{>p;@cPh3bki5Tm!wbe|H1DFYPW|d~_8#Qf8b+e-D>THm`yxQp{aX^a85EOZ_8q>G zKJxC-_UWYTx4XT_19$ke5age=;c6dUbvs*+0QNmJ0kyJbcU53&p*}C~v{TrJk2^7_ zVv$6k7h`rLURxE~tRpZ}!EFL!yVS>!n;U!YN2yfJRH{QTaW zKv;TdZ%cAAkVMoyEke>p`B0Pyy!EX_b(CCmXSTwaH@* zqiyVzGlTU`4pyQAJ zZ5th-hh;IHFj;S}Y8C4WXSpoyGrA4Tm+1u0$?C?-uLzEZA`Df-;mNPsE<*5j6r8i_NvvB?I>=19q~;P6m_)}zo|Z# zEa&#AAqCdr310fk)X%(1;k0TQi)=ley!#l^^Oa==0Y`5&`7_VVRD5F9^==7Gwv;yw z_1LhbW>|anne=+v0CU+2UQ~iZm7rN;%UD-G)|0opZ0c$J-b{Xaq7WXjyY*f|9vFAa zJj%zy_ku8&_G*N3{E|RZ4Vx1L-G-m)a*;81E2*M}?i+maf*TnS(KYo(JJ9)7hldvm zmKcx=GQ`2m*`O0=36FQ%T-{2YwMOH1z_C#~_#qa> zxrS4IPLQJ=I`F(%P6Bn8zK-&F1d&)6$0T`3j#nl-l#sg3uMFwLUaXVN;tQS{WDJ`A z4qnu&Z?cQ#F8J4MCzIm*2T?76km(cl?H6JQ?s?b7fN@ao3FSKL-6JOPfVS(kzn~%X z&eytSW+5BfBR{`I)D_0**KwUco>uehTh|nTRk5X+JpYTJ*S!?;A^1ZNKCSyeFt>o- zVUx>sHbgeK#i%`=XiaK6&YO1nTqWVw$yJt!4|w{|r*(?h)Ca!O4X`Dcux7yZ4&rBB z+V>+%uRaOYu)U?$=nEe6?{dlG{yu5vG4S_-bf76)Hf!BBHJ_tyhn^b&kAy`H9-Cq= zHAbT<*XgD@0ji}!-9nxc+|Q6T@I`iWoWEujapB#^3S$&PxzxC*t(;j- z7{EjD<5eD$`H?r}!MJti&sI+6UGW%C^-gKDf|x?VboFY+HdW=CZdsQqpjQzO!GHWn8-~<4>LE zd+9y&;mwYOyY5eFgD;l3a{%z(?GJRH50o(DU(YBLXNUGc>@3>VPTalaWgeJPp`5=v zmF}|BtJ5dwGi-0N@4A|V^I}kk{C;j=aw6oOL{4%z-aE1|dGPv!DHYkxi=VGj`^r3o zBLM*ZKjJn2Cm%Rd=RQ3Ds8Rv?DpIO0ats!;Yo6Lm+sgF{nOCjX)qn~LORzWk=31*C z2n(b^*VV70KHJQr%~t+bn(KC&<`-Rf0nNYpPnH}!>f5{Kbirj7Q^A$`GS&ujJ5`mC zvu27@lzg8+u38zyGir5zCuf2*Qstwt8y_XD0=pd+>BdS^arql1PRhfsUg0gR(kaaJ z;a!hjwl$x7CURuNq~m_dTAM3S(?;o6iWmM`Kvv7NU474VcTh)!mWbTv;oDi2282r7 zuSC>y0Juntj}nw(@KZK?&2S^#g;zpU0=62Rll0_R_rB7zD^2%HHuHk0bJl12WIn~e z91RO0zEyM+1OV-4%vf`D-tgG%N7MQCsjel2uSX-HIcAVa{L`LvS34(C;fzL+(|@rE zcT@~WMc$}o4tbAgb{VB+Mqc{@Kwbqo{mS_9*~{};X{}el5Vb%UofSMYJTR$Ni4GCH zHW>tf8I{kk+7gAl_^F?AT?7Wkq~G-Vr+hX^Tm}G!8>7 z{yp@6Ev3&qzkZ;%Oz!<$=6PH7gG#dm@ao?TXGYLBgUvM*JSK{XcLVG(|B>|^^@Zo4 z4^qVLd{HDX=BmbWIQ;$_q0zEID%qRV9^EGXyZ~yiI zwkq|<)vzz90^CG>Bf+QPo}j@x^`mDA>XA^kujdwG75_1R;DvSY(yxjh6jY4;hN-xN zB0>!*FT+SFUUXp@#Y5)g&zIet9@Pg+T9}Pf*BmqfC(J|rf7e=GaUzDB0%ft6asuGH z%O78ARo!kvuwEE201Qq3@2bh?f?q;Wzu`c zGNXtj10`%geS`)`%Mes!`}*MOj56_ixgvlIRV<{kg2(=A<&+vhvC`H7vgt*2v7?9o?^7#lgPPsD z9R*JF1@D>{yRp1yuDe-|3KG(R!C2r*kZAPPxeXsWl+FAE-ktRjel-x)bv$k+-L9W z`^xij{)`e)PeVvq?oK^7ASQ8=Nbc%ol86U`woZ>4HVi1~9AcF!$b19X?{HnODkJvL|J!Are_ zW|;{_ol{A1u5P8zJfpzhfFoRWJVei)GZ1I=u(a)1)?sdjM+Oo{izW*8+#D#l7mcU={RPiZB z(pyY9H{?8B$zQIXjaMsqoD#0MJb8{&qRrFd0`M_=B}9C_J?l_~15wk6nvTxO)+51& z3gm)`!f!2};oWKY-~$%EhDya?hn$-^X7hYc%}o*G%0fK7_brWEAMm~?pd`0p{S)UR z6W3Jnk#RC6)Ji*-FZi9&3^U(KQ2hAQ-d*a4_(N~KFYc^SZAbHtR+MWAJ;zsdk@54Qsm-ya*o6HKLEL519cue z7=kHKh8;Tn?xZ6UrHrQ=h*@~CN9@{fBI9bBOgtCuT3zxJH$$UM7t0L>x}u(gi>$WftQ<=cIcMxo%qS=XKSEH{p8(4DZoPR*eluxODx4@ zf(XLvHl!cm>s}4>G|5afP*kfWmGgqbfiK_J(X)R@mS8EP5-_4gaVA{38a7H}HQ&K% zNXgE*4f^9t03=ZVs#mZnd+N>#>F*Qej3*dAC$i^9Dan-1Qa^KhgN__OIYRrsm*5SK zwxxFtb$F|jKm1|O9mV{!?naZ>x%b(d`b}L#=3b^d-Erxu9bVj9`QJ{ z5Y*&)aU<;tBD>c^;#$}bw^{?9(akaGIePAXa28@tHyU6AoPg8h-{iI{D@l2ar159{ z`9TKU0KZ#bWk09fNAAv&CAynq_F%BvruDZE?QHt0LkEOO=?Zg7PDd)2*iTBQ2Y#UL z;vOY4Rc;}_s!z1?8vnI$vez;Wc2CLs1k2gHtW~cooOubw;X-EwLMFz0R~oC!@mz1m z{Jx*k*aIgTC=TZj*Vf6#ezpr8pwJdLzkyrOkXmMT#sneN51{6X6m=y!jC+|_hk&emo>};|h;`fe z{-#v?Kc^c-KOh&X)ZFLluT0^SB<_xa4WeGSuUkwSY=*^}2kS82d>hu_HX7^L zd>|64@_*<71fJk2066G{{)&#_X*ux){2g#q$o|2(%3=@;p3WKreA ztxikHgNB8LOJqVNIqtO6O8)_9>Pu_>-sZEuSJfXA+2r`;KLPLoDdd>37ZmQ7nUHRS zIjbS6U>>0kMHpjsM0l2q#woKG{U4tQ&h*cfcxp_Jrtc{!FTC@Jym^Va(X-*X=TA*_ z4wWpb8zi*6;HTT~YZ94;Tz?F;IgvVvyX zQ@F~)LTJ14k^EibkDJi+%@;7mop}CI7j<0If(DPb11ig+jvBi8G<3nY@k?(mCqOHG z4_6ym`O9R>xq(16=iPX*1D?QR<&G+>9dC&4<^V-=r9MCJ29HtX>p#W{q;f|0XHDS; zhZC6GUbu6zZOJVvQRFsi`h7uEc_QgXIbMxYgYRaE5N&K$+TJ?_>c zn%iaeD<5 zxj0V4Uwjsh&jNs=`hZ7zfAIZxF^I1RCt~6+)5;_C##GK$2ZwZ}yW@U|`T?H(PyUI> zxH#0rFS}bF`~=Dk$P?xN>$OT=4ZXdK)gl0oQRNBhP;6a%KdgCv+f!|{Y&p>r*~oy>^Qxid@f2YCw?0l63$nF{;-L%npSYBGm<{ts$W#T&wWm= zYFk5=-&N-2So})+xyxmcr_4?7W+s?E`&@6a;(V30-293aVQyXiQetWqZSP>(Xv%zt z_1ih~!Gj*N+-Ip7vKWQw+tmr1*R?s(Y*)qOEQ`Cum6=D8Lvux5E*J<|vf@H_{cFB& zAO2hV2ZKUX6+Ei~Jsgg#vGb%CTU_((f@_W2J2I92 zXT?w~lHTjr`?O?B=t~gJ>*^#b4P;fKp3`=GBvh1gty~#4IQ#cbDQo;*ZIt<+kyZQt zbKFsFXb0zjr!A0m^|zc?-q{n2O&HE<2|?i%f$~!ha58Y|>4_=V=V2BKT3tue-Y(M>%f*FyWm z+Nh7(z-*w=#(f(!F;TCoKiy8*_r8`jwMVdQ=;Rt*d*gS;J@%DPmg4mK zU8qrBsxmxxxIn0=>&y+2DSIxzlwHqOJhJRe=FwJXV&t|{U+TS<1abRT6$_ui*^zgB z?YhcU!x}tqgdDp&#ahHHzTb4VR2Ljudk@kk(2$1{r&t7@D+Mad*7)GMJzJ-XEInR5 z4jq2Vb+4nRp%)b2ktDh3{_2(yQlOW5*Zt{}93xVls+ffMUjDdJ|Nk|7wb>7pffF8g zCTtqF&~`lNs(jR$6J~7Xy$?jVQ>y#UL$HM|;mm1kM@23!%l8&ds$LHIc53xo^c zQb+6$H&d~?`DX2KD^!5?7SC^uMz=t4@cyC;z>dpGJUCns?Z5ZgmW%go@1KPvkO(f6 zzP3Njm7%{1w}RM}i3SV>6#`U{wAkgcHNVpBv-WxFEtg6ul>ahgpd?1R_ho=kwHzWO z^k#5r?E>=b25M!m0SL{Qz>t`m*yPV%6t^CO^*@aV(>RH>E`7N+`Z)8i5A#nf50!RA zUjU0kDgA3@gqEWw2qek4DvmZ=?>hij>#mBWvkm(ND8MhrOQKbeKe0VF`DuFiJUYyl$H23ga^ohfMB+#XF}>D%QO%__Jl%mB0n_+u51E6MoCf*SC$o4(@a{n2Vo zd4H>t)wy1xPT=I=bp?eGiNL8mmJ~P71{85P1spU1h-r{qYYqgBeT_9iu%xWu&{|}= z05fTgqQZ+%`?%?$5sLn`J|Uu0WS)iI<(bMg%ek_fzQ)M19|X+q_@akOPLHQkk?*LJ z5KD7W%qn^hX^>m+)CoBZ^_Barm9PG2*NDQW*`FOo2m!fbdV@^t__WJ|OUnL=jAjcC zl_>r6SXbTsv{1V)-T$jcFf$knS1ZxAnjW=P9Qzu6=#m5(!wzx31BNf=ev$R4!xDmz zUpTU190}1Goqrot6iWWZRd9&7q)wna-2e%zOY}ipD?8Y^Ru2EOenoa88{TtLlTev; z7p3C@YNWG6>lPkR;gAjP#rRyO*9?oE?gNBU+&cRgr$M_>F>to&DKp%iGEp$d5r); zTWBx$X14@iZ<}((z4KhI&`pBA0aqIoIO#7Z@uzK-&`p@{*S5}1tcdLH*m2=T^`3~U zOxE^h5LeB$42Qv4ULu^fmqq@sKa%ysZUFgtBbQxg8-9qI18ZE=Mlla(iw|YB0HpY; zPD))3>GZBmx#`% zqAp3&yLldYGo%Y$x%L2PcIF9|D3UV>8WuaD^M8}z*F`NEg9r)Lb#T^BW6q4m&S7u^ z6${(%@-BI|(i&&ct_4yyd-chn^}glkeAP3sPr}yW zt>AT3(!KDu@f}_A&hl~|r%!lESuS!1V9Vm#e18{u+bnYcJ0UA!mEU%PPX@oXR~6~8 zy@KOS`vhsM+|~1~zioZEzAL^QbH&^-z@;S(nt{{O;-dvSCfDQT-?6`CEjP;>PBFJr zT!&5z_wDjbG9HJ+VL9Go-^-yfnOj4@ZW_QaX?}H*@wM?4_3H)Jn~W!?n4Y1;?L&@U zNoAH+zyi|wq=A~`Zu&6ZUR2^MGy)$eG;2|J;~TluBxVmW#$F8{5Ej;D=zj6es!EIG z(0fDTnhq&42yD|bla~%qhy#>ZeE%a#FfRbP4hl(dcf!2dgd_rqSHy!nB}R}8#pIzZ z@8nnYj}z#=vR9u6o@~>N(HeKpj9fH)?ni268hGU&)4&p{7n8(q*vXamR?lhP z)la3FA+_$|9URYTa7*Y{Laf5!6M~eVG6&l%x|*4a@!^X1dOS4eUML0N@mAzmwKw?v z@@`U+8!!;7MQqk#1lKBP%jR}$r$fe3Uk&h-n_qx?%;r;x>?xx`8)*3Wfj$Y{_yZo< zmrs4IkTpamjmY$%yCyxpgw^@fPaSkES$;&FR;}G(6=2W#g?^@xHRvNc=eR@FZ~0CZ zIaFC*jf$a|YuTQXZWce0OVOE?f|YJ7{3!*Z-xgUdfT2ely->dAzTVAH+deQ-QyVud zPn&o;1E+GIh|-x)bsb#`;DBle&41AG6wP%xTOLeXJ})Z%VV!h~=V0!gfS3pH8THso zTyEX7RUXrU75%Y~yiu8r0>)>{J2u{F&eM>hp3F6JU#dp$!`g4nhkA0Sv&TB!!c>U> zmctxVbhhGBp)T1kwr+jZX%QAiC=VXE$k%j@vXT3D-PhR3Ro3{TiO7tc@3Ki+AW8B|N8*uZsWnZ`lJ3OIidIElpE!){6(%I8OO)1-UW5BXF!*4yqi71o8t)4qyf` zO<3od2%)xU-7)FCOdCT%JadP!uoV5aBU+|6@Q&Pm!mQxaY~;4686E?5A43=yZb|no zbWOt(OZg=L%c9rF9G&hp!gcAsmb^set7XZ0I~Uq6@p^JQeSn|}KFVg%iy5@_^5H}O zFJ>~An^nehYKZd2k2+=jx;k_3#YQ+4B?k!vr)>qInpMnwa}{O2V!aGh<}Ju?%9V$g z8}eV@X##{l?IBJY0rot~L{;j=<&WMs;Ckt_YgQJv)U{q-Wx|Pc@n7M@#UyCHi7|Q@ zVFRA7^=!&mbut*w>O#vlH*jY}uhlQRc6o{o({4rj-kS|5X?AQom#I-}-r!?zc$CyhQ}wuJ)ZO@!25SZ`SN z`E;{OGs?R?ETZlX4Pc^Cd&nM3e>fZNbMEL-~z6Mh} zwD-(jXVL)RA293}S=R6{(F9kDxoS1ZGuTJ?V9y7N<)c_ykN^(+@ z*;=lB$TnmWT5YEK$L#ye=pHC{sqz+3;vzHkDd-Kw!WKdl`EIGI318nB6UyL3e$DoF zdvv=qU`K5mBMd^C3+9%(ppypj6T$PRe+Gn`dQ5w9Dl4qyKd;v9rT-^)BkT7r%rw24 z)NYtL_9KWG&@kP2kf4D+buBq}x74HS;9QH4ms*aN_xu-CLQK4};1bV2EFUZkm0in@1!8C=cZE{FEJ0&BhiL zMn74bDZX|8W!-e?0mr#S4S6m5^m4z&5$?7OIj>9Kj-%K+w7Fb&4_58Z61rK+&#)o= zmi#j3ceKSKiGcZ5&GH1OlU|7x`PjRes3tl7Wtg1oz}MpWA>IngakZIQ^r_}bw4LEE z3G3jwz}J@c{n<$}Lt1phh;Tu-mZ4T|jNOu)SDm(Crau=?@a%Kt{5BI59|?4Zm_Z3(_GP~>@mkzv!gfkpKU&SUf5(@x=$m@1=@HFj6BRY@Vx2nWRgUgU{|g3oZd-u zWaECJ0N5+c8eYyfhqjs1(mJ>3MCU`J6v(~G43&^81y+u#>u{gIL&lBFJxU$9}ZXrB=fSj)qt+=raGIj&Y zK3hxz6%Q~##?HXvMjydLo6X7XPTx@TFgtXm$>mOVc?-3v&9ce?tsAZdpHuwXKwd9I z_6@l;#@<8GM4?PzD)qBAsiXjGuKm!3WM^kUh#8m$P$__}^7;4BWrEKQcwonBQjX^n z+gM{ra^}wLN3D!d;6HsmA^=+qSw2zJ+ocC~Qi%b*zd+RzvcC%+-YNWSpUra%pjTV_0KyH+%~=$(I7TikC;;5?J!|J_-z$An9fP+NDJzcbMs`wgO1#q*{eI(1vQHw?fI*oobg9+cbXB?qrv^CHfW9zrqbb%0 zz|r~k0s|Fyqvd+nlHezleOD_lHFDsSIwX(8a`{&ta9(u~>0s^b@#wYN3u z-d3FKSa5Ko#FwP--vghAnD5X>BCnl`2sjf~_61*i&*;O)x>E53_`7cE!JoJoe7h^Y z#-$%vY-!_c4RtVo9tTPjDZTd~5SAlc`r)o6s|2R6&KqyiApb>~gz7nqxleunUo@Uw zWR^CySI1T9c~{`jblR)*)7a&tVrBu8dmb%o`g_I8s^Go-D{A;?JYPrgkKj21;En6S zB{jn~w&aL_cDo<}twMiI=jiinz9bzq4cJOJKmj=+yFdP{0MCvd&5gNK#84~3S#@1G z8}M%V)3X*Yp9PmfvZ|qh)H2NDKO@-IDvC9`+)1SLnER=g-%~-E<+F-NuI$)E1CGJ^ zYOfR-RVOI?JexMN^!iQ)?YvNH4Z!4z{_0spvkB{^3^wS6q2HszdsD20-? zNsk5avGi=0UFoa@rQrb5^dwr2UV|0A)<$hT*B)~Cd!$fjz&04?V(O+xrSul`9@Pct zgT6y(BWKTqZ!do-Xfl!b4C<$pm$-LD1CGrBIgb_9{8Y2?1=!bu=Ba%czi!Rjlj{(} zJa(zxAW2Y9+5k-cl4)9q*?*^P^&Qt*D3L3Wwg2YWH9c=9iaJI3_WCnYYW+r*a88Lz zG{_Sd(8ssZcAT25c!rrvAoS@v+Yc%>)6zK$^}um^;TQVS_G9^(%y$^r< zAFGoq#h1fka(!WF{xc8rrNU<*<(-t0G50oT+_uPU2|7)gxOW1?ML_5#GhUNfm(2vl z$$9P>d9V0$x@RTD-4ruUSA#MowlU?uw;CLk8?$+8Dte!gn$+re6-L8skdDCneqLTR z&^43k^4aSm;j1ugV9$cppZC0weY<4uMiDe$Y3uV7Btz-+e6aI&4yOcLn?YHxN8q94 z3lF7HsUN+(J%h?Aa&JQDS%ql!`KpesJu8x}Rdk4>%r)~qs_S(ie0ETI^IG#|81dk0 zJoLR*vS~Y=xLruv?x40kC481QAi2Oh1pqL2m^b8SYr7_VM?3KUX8}O>@IHXD_Y0ss zjH-uV8+uQjz!0GaDeF#VkUsJ%$HwJ;pxsG)?WX~#ZT48-@UTodXNpB$9&iSyy>NPi z%$X;Mm&}_((hQQXSj-%xCCw@q5;Soct|_4O;_mseYhRB9RSqqB;ljA>_Wluqv(sxc ziN+0NZcK2Cfl@KfQiKWtszNeL$K(H1g)P{faeBrPjfbdUDv2Nu$cy>wj)xBXF3`73 zXG$C_DRrT}=;;gt$^krryJ_PJ@6waK>-v-=<9p?cN!a$X1cRz8;?!7sq2~KGf>+w? zssODa1?jJ3b7Tw&tVNQ;rp$xR^fptg+Bu_Qt#}X>(RYd$I7D z&&Kq+n1)-&Hw`T#^fG1r1r8XAYBo9s+d1Zj-E$(Zbr&WpH+Fy6>dSUYw06Xyj#A&G zgdWp8^3tgoAMa}Si^{X^Rw4GIUJp#azNer}QN^!h!wj&CcO&QNSUK=w{D`+B7jGR6U)UmZ&&r-l zOb#3Jq+TmU=p+rnp%zdCLv?GeHvnc(A&V7FV10TLn)XMkb1rDEYv12keg^mfEIn{{ z$MHo?SG5$IsN@sQ$0tH}_+zfi;(U@)&%4whI}HK9WS#%!<~bin&ae)r z5_hapOFFb0#_N5zZ0itZDGIh`>i~5?cW{ZIX?AA)ZR7-2hv_pn; z2Q``VQ}f&Mb;A5Be<+I!6^P-`YuE{r<4vpuGt&xS+Fx(FK<-br2I8!}Y9S1~^J-S` zd14>y1Cy?9@f?5<$HM$RoRuo)6&(#BXZ71 zL$z^Dq=){~%XjoL>#`zK&1*a6H)qZe*slk<>E8Tg?@LH)x->}byAF(pb5{(rJ!&C$ zCjZa{!tT0`OIZ@KW9pS}44jL+14*}@G+4$ZC=!#?4(+z)&udQnyZl2{XUH1k z^x58##@R4b@{#n8=iR+2<=5SI-yKOe?xj9$ zf6H~D$w8j=TE4O4qk`C;gEcnnX!NA>=&9J-kTgFmj6htEqhVKQ1Cv|v{bhpgyhXzO-ax8u!V2N zYs3qduBGSt1pJOKi4NDWd)aDTX;$dsU!3KK=tV5SHd6`WAjj`Srr8I0xqR4{UZr%q zBaiCz{Sl8*y)X%236<-s)2NEkYIy2K;5euz!Q-2ZnHM8rR zkR?BIyg7y@^Qdp$(#+U;b?ttp3$SMIis8*eY%_t#GE1`A)UR9B$S||UT|XET8AUjQ z0+;3CMQ}$T`h83r%S78GO8~b?N(J3@R$8nrpU` zC8(^myZ5uHAh3Jlz{|Y#j6V>;{k@X|gPPb3jD!yTb)4m-ig^(--Q)3a43d#1loN{> zD;Bo|KZ%*D`9sB0zgtfqTurDc-Q;|Lnf~^K1~cQ%yXxui)`!dVlpq%)o={XZ^1!EU zPObv74!E%gn&qAw*W_conre-7PPMMRUm_}dOGR?1bwff-y6PLrE9p#}Q|KD^>5l#k zaL?Qq;|rhORSACyrD-F!Aw>LsvYX~g4Ci%cA61I9nANvzf2TL!ok&c3q?}O%Z^Lmb zVEEE(3Jt8*EU!V9bhO*Sh&SdA5BjdJPU~L8%p|{O=<0ZE5n(31wNiNQ^G8O72W*4N zqs(z`yLS>3eq6tyDhb0-f(R2`VS5KxD@I<23q-1$mj>^vuQss8psvdwb(zl&bS@@b z{|^ZNVZvl!Z1R&o_I_IK`+15*Q@%O~6DVYU>gk@99hd%I4ZYDX(YtPWSi-Yx$p^K} zsA{?=@Yl6LNv#aQI63{^Y{I@(dYN)5#HE}VzO3zNdIh7m)&KC>-ZU(+L{>{}FqnLR zAQOJqH_e|VVEm2Qs6Q<@T?SR?wnoj$2<-$t5oQMiA$yUosy@79v{{5nrx-zV{cbvAK$L!ltm6wUiK2nih z%&L$}hPfj;5(eK>u27|BNa!O*VY+KLQ!^bq=9>P1>>yM1DI1BX+x>o=WS|=COtT$5 zPGsue?%`iXaGq#Io5{p0Wc2D07ohQR?PUKt@wZl#i32>u;5Uq7=9`R&;e8&iwz2X$ z{3JmsT(kL$q(k$kP6sLAm@}PnQZmWEkdlIx8inIRSV@=b@iZ zyS9Olg4wma4;9w-Ve7K>(~<^9o%d_g&FXPPPL0wHTqqSzt^%6_2*#v0>a=^9a|4oC zTrmggeY!eX{Avg?7j3T@7#Ijf*j9av9S+92AojO4tF6f6y2nSbDOP@-r5o!F zEOzM(q^P*$s_lc3c-6%Xwt@LbmIlJt+jN-)vP7#)KB+;T#t#2A&s3Go)=8NNI@Zgt zkb06pODY>G@`zw?DD=xF+v3N!)#v>E2rtJFkHjdEX zNzWqDuQ`_tk${Ept25}IL3^}{mV@2u@XQ~3{4a`fU$m)>`{8Qp5W)NKA|S;s{z)zp zJz8LFf*Y3=$tHn+AU85W{xR`lB^`7n!nZ6xE+Ba#V|}9bJxrD0GBuoSFO~9MTmhq- zxtG$nRz~P=f07^%6`W|FxM<1*K zsjG9Vg@BBP!97%KO>6mM|5-dRoJ<4r+fA~czhN_KWUdKL>m^=vSH7AZo?6D4hhjl} zM!x!eC+7T1Dqi(yU)r40krr1eQ`Ypklz^TAv6_ts#_j2$gG}WgKl*O%GuQJC*O-(} zZzBz~Z3g4X$IxLtDm`#8y_kk&ZL-(T{5bL|hDa@R`Oa=W)C#xux2XEjHlv~$Lw~3S z)OWjwZBZ1AW&D{aCtU7)pKmkGgP?pTN6BfO&dV_wh1;D!8Uk|b0r~Ud_7bMQHXns89KO#KZhW@5^rV zu;~5pDX7k*RN9`riIG!8qSqP9Xx;5E@A#$GxVRw}L!2Ci?C9c>qTIIrk0^==q5@JX zDk2R^O5;I>ZU&^gJBAKX0i{z)a_H_D1Vp5}yQGJ180xnN&wJl{fA4+IeUIlKKMLbB z``LT#72mbicRlPm28noA#Z$x*aPLlUVZFOcH#!RsBK`clTLjPEVZ=#Tb;R-alEb>P zB3M~y*MVvoEU(pZVy_fy@|8Wya`L5MegvW@dZ`>teZ`? zU3?vYXv87!_bT@U>SLKS8zhYfGuP02{nI_JSZ)h){lG#z1XN*0Enh+?H_eA3${>cS zuL3C3lACeI=Z55@nLoY+iYiAl6GA_b!|DlX!gh~e<#yk98y98#O|7mz>m*OE)P*%fB)ZHOkYOk!UTw$d>*gA0SUN=8ww@5C}aeGnpU{%w4RTR0IqN?Uc z0Z$%heOeAR7bh`;N{OAE){3~*z0|yfUAJ`X8#UJcx#h^UnghZ&F4LEeAye{Sk* zg_eUInfpUkqj=arqmz4{o>v6jNa0-kG9!B{fOZOnU9l{jJk^4d>Qb*8$@9qk- zADHgL+<%b5{4m4+=$OUe18%3Bpb0JTIu{kgXA)c|h4nMKVF}DMSipjc5D%5qiIH^>Qt1Ryr^IEqjEvs z>rg@{Kz$t66wt%+oL8Fn{F``NN7nRU)y9{RrOyiZLWFU7#BZDH8O^*?W0Letgw3AmXl6pbhh#PGN;8QvW~AWg@tj& z73|zrF%;K!7%*WAa+4xg5hy3}KoA8l=fKT3l(hMEUNA7y~$^{0eYA9N;UPVbZ)~>gQR3K}gi0H*?>C zV%PJVHYyR8rT_VX{glH&E@Nzv#oKfu zeW=Wh;UIozOR;WYl&eSeZn8g>_|Ugf^|KzIb#~L75KcNTi}zE;mQlM)lWcCK7LMiW z4(xd24pnWN!Pefif#IbOHho^wt28K`A6cfFI-l;9Cp-0z`djSJ$qg0}>GAo6xI4a& zCLoy4neB6lTjrI~zftOr6fe`t*fDRwQ6KiAX*p#c-4D}!z{+4wH&?@IEN3kfk-#Kh zE*U$xkaR3uC4n8Cwqgr!?JS>it~Ryi`7AsVV^N&2Y_?JUc69d)=U%W;={S?BdIGeT z5AX?hTV0_=@!gPj&6X>rom5oVK61}Cs)k1Ir)vv#a2m#avI&glt6r@WP(S4Bum1q| zzIXTjr~KV{;klKJK}LwWgIC*J*z$OWSU<;vRcbCVN4F(&YW7Y%?QeQ6#Bl$cL+ZBC zoHNo*DfCJao(q50>-{}ESy7wcQo~bW2^8IqfOeR`MMaiaNH@f(X$JxR(rAABuVVFg+ zy2}1_e%`6P2S&U*a}+&n;hIzF37^=~5>3hVb-Foes+YK7bg?vtBZg<6LZKXPHAvFH zrZ$g!rIPiuvSbygn9zo0+TOTs@o}bC-R3JTN_-b22Gw%B)8|=92 z*Yc6AFloE-V(F+hh{h7_IFd_fk%rB6^J{f^G(3>Ls!V0Te6Hwo=U6N8M%%=}6Vi&! z`Xh~|qdh(3!VVvjSJ6IO;y@dO_TJhHaEY<5gBoLX)I`YgAu-4R?} zx7PXDLddm^c1Lxk`+Hh8mBQ58>P%TRUP#LnBDbcM=pOu_2}{)O$YVE~0K66Ac=BTh zC5Oj-dxiD_Q*kB&vn|i@^xg8H_}nTW@QfLD82kwMTd$iHcPP@-#@RYqD1ewVTO~b* zIRvpCTT^tZ#|1Y3zUP!>VRY3Q^z9q7RPjjMj*ON3=GT@0Ts#`bZ`~`mPFq`G&f|*L z90HeLEzrve87jd1jk;1?h`mEL(_Mj}=w$xLBgVshEAwb!@hD=w5oMZV?0x1=XWPQ) zlG3hve?>%Dn*p~y<^V1`ANI5?V)Vz4ijQMA7NRuvc{4i?QcFtupJ+6~ls<(=5z;9} zMen#<3y)^2`lxXI@Gg&@Z;OmIF7pbhEYpv=S;qW&h>=X+l~_|=IB%`%Guv2u;qn?` zd#~=S1<5G?E$GoENnx+kVDVd2z;sSNu@00iTU} z*ZYKt#}f`L9d9vfqjZkB0nL?*0%*un!5(r#Mrz)TQDjg>>?kC49ii58++sL3Tn-e= z%&P*IOV$ybQY-eXCOk=5LQ}@Y1|5Y5l8YlQy^V2U zgT;#}-g2IM(o~-DXTtYTrYH2VNwVI7tKya*;CVAePn_gvJLRk+JC>WuhMJt2f)n|gNLS!{5MjY)_Qz=H65A=U&MH~mXT`hOqx^v9^ z#3Db08#;<|kz5lOTIpCE%}w6(?z_vRtYhHL(Z)NZNO=y%n?{(rKKq>D4ltoF7|x$U zEH7dRXZ3;e?j0gG=@pFyZ?c?7`D)BsS4jsbIpmnbArE<_)OIQknkg+We>`-nvxiN; z-WhD`7XfoO!yJ>iqHUMYTxm5YY0?v>-T)L2#z0)#Db1zIb)IO8%zu_OTU?X7m^Gcy zDkk~!dg&i4hV`xJsOQG;OhVNU()$)Ggt$vh*O043V_ZX7cu6v!UzJ-u=R}Q5$DBxY z`lLbXUH0frSEZV|%hX+ny5z!h#5FbrC@`@mPWD$g$-@(@4?C-3Z=dely&EXJSvxtp ze#b~*?1vdspXe>ZpOlXOh7?|xV0e4F-ouu`$Z}-yfJ9Vb*1P#sA5k|1}HSO4G4+HBgukIVjSl)pGVRTmdM)Qk=Kx8l0uufXeXYr{0XVQz&paj zy&=tx=S^`sX=hmS&jwPG#tG~!bV%lF#8wEv zBk082mkl+v*eC4p``T)_?2QZ!I^sjlii*F%@O?b*<@H^(6soO z1&4^$T@FB!JwE=kF(J6}({Fb=p8;%%P1@gS^!~JA!s*yjgoa9qk+ub5My&W~p}Lpq z`F|J^A;60-a)p?LlD()J%pfQ(51J5qsCkL^&|>mSw6bmh`%#|n{QpAy?|GHVYLJ8~ z*8Hp>)oInzgCpVGMJ2p0Lvm#>4VVhmxPEZ#f^<;E(fS^m|D1lgE_M5G%FVJ33MMSvS&+Zbv7St=fcAWy0q$z z%3R9-DlvLQOI4@r5T*#Uc}Y%=qG1fw*L?F+G;qbAd1vcEEHO60c4cYI0;e*#NAmsuepZC`l!k*T@BOTjBQ2S_={{?6zufrrqq zSIGuG3c&lTb+7=r$KP0|iCkhzN{ZQD3lGFPKq7^UHdb-WZ72vaAOR4BXcj|_)Y$dz zq_~m%bB%?=*}yD24THb&ZD6II+vvgG_9>FOdS>AvT>A-c4O!)aduFA1a;sZ1sfm~K zTpqBdrluMUZwcC}ct`)8mjlwPE|BSO7A_m|Ho#Xx?Gm>TDYcA~#j0cZyzm1=8;E>L zd#ev^MsaMvht#(ZFE-&DDP-RLGyV848t&f;T(GEsvA-HE{8f`TQG;0vt6^?{>KDht zF~y&XFTEW?@V8FvRt7>KMD|Cr-u7b{80nbR^c>JQ_4DHV`U)j{7&h^*7I}G%^H!l!4jJS4k*;_)B~dxr|Bw?%I8`^_qi6 z=rhhLAv)fhVu?9t8e7+5jN1%d=0$lMsWI}Rbq!<+MmeyoQzj&8LW>xMZBd83wi5*Vxywv2mNn|nYI|YSKYt#< z_!S3$2j&=*?4>I0!n}%LGzqt#>}N{AXf4WK)oZ| zwR=`?jEC~nTbYH)-AazmjyL2Rp{!O7gi2AM--v#eezd&lflK?BGt`Q~_FM~uDy+us zIL5qeq!H)di|*Z}9*S9;h=9+}wBI_N9W72gcRSf?vN%>TJU=__V60k|8~HJxHU$`Q zJ4NsT>9&3z0-0sAqrj?zo<=ibm;h@!YNgAMGVV)@j^}lW$t|B8{p`Bkk|v$NN627d z&=I4bS9|8n;(p?|bF`QcTV_5M6X!5FqP%=+G*YBLIG-+^U~#rzUKBE>tlcu=@z(R!+VajvgNJyC*xq`QbK-7+wrbxau~N3E*`U} zV!Oq86Z9hhEA{C5oO58GlRO8(l+)sU2TAJ7>i9^NBZaz62-`V8 zk7;&xPh}yED!A`YB=Kg>~;I@|2h2Y;Zl@8?tb~ z<6eDcdpP40IkpE1??HmmwfD>E{+Pj!?;qDI)oR^O$4mPsT{hO@JtI^<-2Ou{SUlA> zB&FiG2EJ^5yCJI{jmt6Ky;{;IWl*(N#&YexU9jS1HgU_U2Ld!;H9^B?jNY~!(RQm#@F~P-} zQLZ&ypq+NdP&8_aGi6W2;x*iK1>(Kmh4{On9siN7=3wmFn_DRk_o8 z<)TDW;Qh9a?H_(jF@iTaztgK#6pXV5yf~bG*Krw-C-}Kc=2Lo>^(z!$qdl)a4Q@M9 z^7-6$q!0X<1%H;#XB<#v zTjM_08?`%FpHRPiM;&2D!*MiqepYVk`m# z(FU(ni?R)7c`Fx3@E(l!VJ@a|pt1&s$lVWT%>0CAVU{~U&i%cYU!rYH2I4Eofgwpn zyA(GhyWaL!IOhcfF7Bw&j!h1|LW_(JT4ZEG1k`Ib;La%1+)_n_AmxMf@QNgvdGhl^ zpChn=;|m;9_Zh>QaQfn%)6#?hefemUCLJbSl>u@ez{w$Lcy%sqZ z<85wErol{k;l6Cc10(k}mofV_a~|0`7S(%$R(FT;@6OX=GxtiE z=r7`V917aq*{73jn;f+-^JC~Z=$Dr!DOE^6pr}?z*GC~pAYkW6V+5d`wNTF5doHVm zgjY#gwu;&qvv-~GjeAurl0q?y(Qj+e- zYh9nPh-d3NeqLT&JT6qhr#kq!x$Fj&jEag5N4!6soE*g%S#heB%lA*WGa#4r$7D^q z0gVe3F$fG0E9!Y3lNBbSJ(i!_9d1m>Je zyeU|8uFJx;w0@`Hmd~qr$jSuE`70{g&5DfpyBd#`aQ$Ua`!{CTElV1%e@;$?z;JMG5bLB zl1R;xo6O2h?M$gQt7?$D0strU;n0pHw37++PK5P1lruRu=kJUb>9_fJHq1Cwc6!vF z?#CuX00;@~t(GzZf%t5{-biLCQ8~!9)6O!%7LzC3#ku&|=p4pt59+O7)gxtt%^lpEw8jv;-EI4@6p>}9 z0Y)1uoq)}QkJwG5N)#f>NLdX0M~vVB$;NQupg`2mTQ88vhn3S>E$X4h>#}bbaRZt^ zHygyyj!0PYL&`}+GdJKN);)mG8XX35uUqY@DGX7brXGi1_|BeCA{olff+d8|)PQp) zKmGEKcb}^VUsvi0S8o-Y?D=yyG92{YRATk}9P?#y=c1NTyt&Ty1Xqw*Z`yS92(-iL z%Q)7LmmhaWU9l@}hy>bb{IgxJsC)O``QdEPLZ~>S_3YVRzDIO%Cs*5^!^$8-3{$nR z=kMC@)0v-}71Ui_F0S;|c29YrK`qi~c*ObR1BIHwL-K-@YviNuz)d-QOj3nb&#jKo zZ56n z-LH$BaG07H2O5?!E~asBsi*$F653F~R+1O8vh!^GmKx=Ue|!V7V}6roQ-DMAlB64I z_c_Zhc$Im5qLuZ;#;}%1HV`JPI}~yrDtc0ikH7U zyHLSa7=&?}-^?7bKS4KyXmvLgext^Bmr+B~lZ>*xys#tX5vyla8uQ3UZk`WJDv+}k*&JR2m(qb)a`k=M1=D`#*`;mc(H>ZpI=SM*sY@lsSQh|z+ zRP@5X7bwNbaDUH~)t9z%SF=Cgx{GJWpKNbfHz<|IVSDGu;zE#^VFSaDdNN#@-7&7z1rt6?w?~?D#TL38?xZ|H%wqCxw1m$t7iD&Z(s? z=apPTy=3R9a0FAZO&9b))6Z9eKGKW^cHTWKc*XzN<^iiwunQnAZ7u>Ce50wF>Ji|& zOo&Gm_KFifBrqTsOJKTJGyh37Igunl$)s{OnW-yNJ{2qzTaxt88Eu%-C;wlR;_$=6*<+dIP5$2pap_br5j0akp zE7-+*M}A@6tL=q99b|RStk1LG%yPJr3nFAZ-Y?Id)ITo8A!Wx1agR%xhjKE0Y3yhI zBOWihZbeQXi!*!S)*=yaNOik+3eet_>u!&5n#0DVvV+rdZ)#69WTHue2}A`_BzpiV zO~+vYD?+P4^}88Bpui z`kKWt%i6u_JhH3jht~nz3L`9w_$aL3=uhG<*O*5e;}y}d+mMjCl(N(1an>imDqNwmer-Ang^hpbDjuBr6x3&7J2#Ri?1j1OdcO0bZ^U* z@--|H>Q6g|m`8u(MV~XMc-T8pjo9&%YeYumQp4j_Cbxv@r2Y^iY)W8a)rNl$esI&g za{kl2y(-}xtNB8Ev_*{OLZqgXs_Gd+1Z zOK`@I^g2%4_Iz6hR7riFmMTmCK;2ucN=@J%`+lV3?fI_76L@C*sq$R)kR6xz3mR2<5O$LF}WfL#ZB^+TA@Wy7Q1W9W$ z_Ayub%llcIoKAzli~|&od#k=8oU{{ci+olULY{ut^4r!ZdFpM2>#B{iukuu)W zR*{W^l#yyW_8^icvI=(>6kk4ZZP|ZjGyxmhE3U|^{Y{KRlw;>cD)@rVE@6;313^9t zb9amlXMNxnOyrlkBy0VPlQLF_sUCdp8`M!gsfp+m4PvmDPpTAjj-atOrah#A}FnbA6Mqj4_@U zPCkeO3cd>B@rK)27Ftf#^z?MbadRM*g4Q*&&b*O>8Fi}q#zQ+?uuPv%zc*YwN&nJ- zpL`<@A@7bd2&VjLqgPVh&+lbGvlR^vH)ja*_!Ac8MikZX_sEOQ{kG5&&xdgYjyyP| z#&oah02oTi5yA=S-h)DBFAdOAL9>_22FD|oRL*#NDZyA|Y7b>$IaX%gI=&2>mwUSK zEOCw`OY_zsr%aiA00_6b;w=~eI$*`2x2auk- z_j77;>f1Sb-X|`mC%7|HK>R;6QeUozkeL(U`tZ)+na90}VKu%Z6^M$^=p=HZVNxk+ zE-@SF4H8@KjA5hGcZ`D#ijwSKUY;%eTy$$dA!HVWfa{9+vEpLa96`j6&{ebw?ma%b zL0*ezyU_l8nWhXzLF>lHUrXBoT3oyIxm3VNunsT~S8hR)e*`uEW2=Ju_A!1O9&1+i zC->S5>xD&3G>qD;#}g(%SnYV`^@#kDvC4pBoF8?0B=ee1)wuO1OyW!JctTn`v&AgW zxK>iaq?k=obn>hBZ7zu;Jk!q#4)yD;f8OPX4==61+v2>4){Ry%Op;(<-&~?0d}L8E zvU;iWkv8usRqx*{RmeMz0>6R1;6A+&Sm>?p;skW4 zn^9EW^=Ye_A}A&243UDYUd^U2KmXRV7T618T3pP|TfZ%QFXRq1+wRTiHB64o-f=R((qJLaEK6Yh+76KNd{U{Cz57I;8yl_$ zdwj6G+Z)###HnWaqC@pCFM;WEQ;D@5&T8y_kL#qp~ zo!$!{h0c)8e6xneVf5v~d1`YH~N9t8*_zrpCuS#+2PCCtb>=5txEGz7qao2-pj0RVZQ zk1J!m_JJoFNMkxbYlZ+L~dfuI4|K3PZsT0^Fr z$UW>rqOoqC?DT=q{Pl5x0G_6hRYfo(G!9^anF~uG44(G9o~nv0{~!I?n|0~ z$z`rbr&~eb+j4zBKviC*-rE%#lkM5o?l}(2ZU4;45|bk4L<<{W9+gF3cTWg?;`Eem zAm`IN-I#;Jg}MPn{jwJab1Q=hV`eXzx!QnkCZMT+jY}O4YOH5z{ERg`+=>C^BT4Gx z11~a|#@maSUH}20x?Uk-G$3@#h#n)0;JMlGv!UTc{sn;9S4be;qyC8f1B3)}(>4IO zOM^>HQx%dgICCGhzh(+NEZv%uZE<+3p-G`SA@;xvuc88Ad3gZo#4USiRK>dX;$qIt75@WM~S<3sT99#(3b8FzK6Tr6=m%)KpTl z7GmwnQ7%?H2OA#|8m=>5VGVhyV)9iB*nSQo4aX!jhy|Zt%B;fp=nrW*r7KlG_D%KA zsXFeAed7}$l$?V@H9ab%0>pt~R~pDu$&eMYOt{IUrV;U#@JlLzGuLh8_oQ_gn5(Jb zak>}YE)X-Aqs*eDt@cu+#teWhVBjJ9&bz#9v3Z~S_ODr`G7nr$uWtiE|Ge0g8N0qd z6=@eXT848F0!m|m957$PJbwW2yB@4KDh=ml%E-s;e}t(ZXD#p$hjg1`l6lSkh50*N zc9CcyhTp1>*Q*S^f4B`9IUOxCHw~BFk9S#rE++key&~8>Agt)|)eA8qEfqj*Z~X?2!9Cwh)<;$Gs7f* zN;pxEqw1*iiQ?iz0t1)?8JSFaoY2cTz51`8I31h>gxLVNm zXP!NM@UH8K%SN?Z{s=&G;9pbCjz`iYV~yPR=rwD`sXH{vEhdsrWn*5a&Py?2OJMuu zzm^qgv+`KF$f8o?R{&zAcA(Vm1$0*`ESBsJmcvPY`g;P2H*dVpC0$M%{mf~r)|N2C zxWWZP_Gk7`pMQmL(8A(UlUEA(+)z>CjFnGfqj$1!65`Ln{R5zZV@zeDv~RXSRL^*ggF zi_-K5*8wk3M}bM>l&SWl=z5sY(n%@E7gagm?0LJ}Pve=KtmP1TTBt=(jm1iP$t{`| z(~ek=)%DN{uEa>m8`}c_45ekAYUe#0Ww#T5Jif!kjQ|81DQ)GWxs{ci9Q)#Utz46} z4Wv@EKpEj3+-yS-zURSA`Q_>aR2Zj{-S%EWREB`-Opq&AhJDgwYN%St!0YS)G~!d7 z47n^GP0;YGJGCOk&ZjEN+PhDUF-Rozjg}&`6}XxU!c}fA;2OcTrzj{iOFnl+DTs*I z@}mX)(v{XL;kTJ^nB_JzRRpr>3(C!KcYl`SfVyxya{|B=B+k?-MsQbMHIp9jTOt~J zVV{^uQ;AA#h|(mbr!-I}7x*O>s|IlF*d`C+DbR963V%atPR!$IB^DeKFV4HyFTc)} z{XE91{lXClP!b^Q?R)1R?{Vf-4AQH5LL^*v86ba`>5^%ah{v^kBSU8q?af|OzaL`s z=I7CV#_T6nf8ASa$;RNOhGL%CUhevswXH_0COxbP{QvsBKD0Zb08K2MIJkb6qsK3dba-~Jhst%JeR+jOm z*qYM-R7t3qwwGCgE$cekWCM`eww>>IRre$kUNc>KUz5NHKaFL;8IN=B7XJul*FBJT z?I}?CD4S}Uny=`6P4nABDkv>Cz-ImVuV--UH3x^c8i3d|PqSZ7)sR&XlUK}e@vj&SJ_fDgxCU^*-lyY_Hh#UY-))={7h3d`f0}R81f< z8NiD{=LM1c3sJgq`^M8>J)eF_3{7CZfArXI^LuPiswUM>u=4~nuXD#s<7xIIpM+C;zzRjk??|g2*`WjB}K^Rdm^IBiG z78o3Lb$kXm7Y(8Yhb*(>6G@ij`4V}jLd2B1aE+LtGgLlqz_0q%+}Ium_S zXaEpCB8yM1@#4mq(Sy;Jr%hH<%V=TVCN%OtaQnvfTPv|0$U0P@WOfx{jE8ZFEjE9dT%FQGMI7dOJp?lnx zBM+tZdxM)Ru~lA2={K<}j3{)A{VJm1C-O1tCGU&*V=>mjN@n1pl?35C-(w?>++?Do+i z*-Z!Ask3{ULns2kyk1#hp<Q8Pynfy&>lUP{i@OagoCD%4~3bQ(xqyU z0Kzd$2aMyOUQ77WfSU|OPK`e)TPs^|;+At};gx_Lp&b_0jgpiv)1W0QVC7G`U|1SetOFw`NmMN`^~MsaFd9C2#n09WWaaa_a0B1xs*1A%t3qb z_5B2k!3iKHPum}^1rnKo(SknxZg=6|q5v^tbYdXQST%&V3;t8h zb>G4S<5U;@eInLAXGFW1&SfobuUBm#zCPx!Ma(t^h%2WfeW?Ak=pj`@G|w*ZP)_WO zBn!8x2hK}Ld6RLP5(k^TZHlVq^TtUIb<#^BJtg?~z$6R>%HK?o}x@t9`)JRrF)4Q6ik}&UFffzfLQO}fjW%=f%f zlVK(`;aCk;b@x!^<2K?BTP%9bx8Sqbeu1;-f{02`f>PfjTf48!k@~=OvyOnfqr2M0 zA+kr5sz4%Qks#Woi}#@7?!Dgf?D>JWfl~e^Y&`PH&^Cz`9l(_E5F|x=yULgAlZ1p8 zBcDl{R^a>uhOqjtdHQx*yPx~uk{M_?%||SuI)eb=gxG9T5C>J9o!kp9q!OF}@jTsU ze|gBg)g;9}%(MW-Jtz$@On6Z)BG(qW!k@NEd>P2OKs*NF=~;*E0L)~oK;unK z0!Ts$DJk)ci(=lc231h#;a49a*^IE)&bv!9o#ZHU@=woXz3)hm+m8WxGdFclSbdyx zko!i7(yiNxdR)5JJ&q|{org#I$k=Wr`ORbh(A1KC0?>-%vpiVyHOGlR<|+Hc>oCWE zDqNyT&)T^mV`=+CU(F#kKu5Ds$19q1gUF$~8Uf2VeP?+^RjtOgQn^6OQ`s;MR`eiu z@>=QR#6b-LR(N=SM8rt3VHIot$U>hBsQl85C1Eij*1y*)8Q;n$9g)j2R+h!AF(xB! zg?MNJpe*QJHa{XJ`zE+RrY{dm?(XqMEeB|UE>xAGL1f!pHiy!)tX)PUHRzrF`G=m8i^ z6}T6A=mH013MWbA+rh5TIS(ofEXq~p z*g^qt#EbRx;z4utiMH>V@4%M2>r$=}Ld!yh{O(pduVe*HAYdyt#o3H+-8bl1vda1@ zZ4HYXNln9JneHVWDG+JE8cL-G)bp3V5HhN2qWI(Zn$}Fx?Q3|W_$4^37Z3JHBwgIpmM;_+I3)SdBc-HhXZ_=(NP`60F^MQym?NGBa;LEh z|B-q!( zuP(67e{Anx-AB*HC)2&els8{jgKabr*S$0S`XU(otIzqbb2Hk-5Mm4n5!VlIHqv_+ zphHPX8SvohZ~wTZ|Mj`QvS89M0ntpbNIz7I(Hz?!kicI!iGSYZZpSNP@}WeO%w!E> z^-J(Z-MWyUsj6Rno)M<6PT}`LqLGL2SD!;Z5*okx>4N;S+ysb#dhBdBnvb%~A-72a zNPEV*lK$2bgKuGl5skQ$S-yf$@R9xVX8h%MW@Yx2i)?7VN=z7mc`u|VBg75sh1%ab zTb;t!7b~I_q!}zX2@D;op8$%9O7L!^SAb|`!%Mo zFM)gt7FI@PQGr)~9D!k2^`}u$#a*s$V^G1?7iqPvNfZkO-yM1(?3G4fm*Ila%{P?U2t-Q7CR74zst2@9_g(}|_Ai^YAD5hM`t$R``U_T^EH z;XV9cUOs`wL*A@PmhZUwSTDCS8r%Qy!#JjWG)fCn}G*lBd7+-w~{v<0WOMEeoB;n5bfsb)O*G(DrF`MV!}p+TFws_cqO!_{B6cb*8^&6T28IYMDSbco*F zZq$47mZfBo5%6$5`2FT_#JGpheVQc6o8r&JFW;iRL0xR=x=CU&NxvSro{lL_`c>8j z>;LwC|Lz6@3j34Y9i8&zg%12eB8#sLdQUJ|T6Ng63|&gAKZT!4KV^R0ol!RBg<&DR zQOS1&+335fYANqf`Z_myi~^JN6k+Cc=^#+@BF+BO1^%n%04Au_(mU1Obt4iHXI!X) zPxLP7wf{4AxW%e*jf?g>358Hmb0jRW=l#d90F7{8OaiqO97Wo^S-yc(_Bd#WPJl$) zKn%iosy*J)UA3lnZ|83`GIbMUx~rFcbLBRy;oenbh#6bDLFS>Ynbr)^r-o2`Onw~@ zo+Ge#r;R*d!pTM8<$4+l#_HkngT}T#V{BY1!5SsHP~drODE~5b|0Gh-tUNcU;yImU zNC2xzsk3~sS%X;d_*D|g^92usTy}DNkPE=f9Mn?BM?fX@-+>xwGRl4*q764$(M+1MKGnR*?>U2ChI7=E_1x8KzUjZ9 zE$pNI58M1F!Yv?pm%7aJ6*$T?+AgmC-iW=* zCqF)hHU;}f`wm6E13bmIi^Ni~-} z{WRf&yuG99tRy#SJvKSDXg_k=LXrTGZ{>bQw|aMWH0y1!uUH3CQpX_mev$zE*)!1@ z(e)s>_kQre-|$%2D5rHFn{g3Ewh3FaIX9Rk$`*<%De1=*NZ@V%FteC?FNm3#cfWbU;Crf4v~^eQ zQqco-o2^Q~!HP<2Z+hcLVS~e{)_j$qVbz2Ed#BLY$SVkY4x`2SEwOeneFW{t=+FpC zzU!Zk@x|VgjO@MAy$lT{$0P;}O#e=${U3fN@Dek$#rc~X*6d@~S_65R5R8w$<}$MF z`vhY%KlFk_yd%CecUjtgVf`Sdqbr;oTH39V$KhtsUcUAk^PFh1&^7 z9#ZhDnSl0ar^UyCt4(~0Cg;>T`||l_5Nj`j2t+$1rv98^Dd_PLiHX4P_kP{(vnpI_ zctx!x($FMA9sljzkitLNUkICZyU%Pj#IFu3Qb7XZ#)O?B_R4oy*ZL9#`{4Jhq!D+w zr}M~R*-j@P)8ov2ZmzYvpB^xu9&Z=}#(|9@;(+@cd=1qu<&0_48w_e?$&=L_4t;4- zr_IzWJ>i+;F~)thV$mL&RgC%^fK51$#BgYDyn+bSfb5L(yu129uaoC=4m5+iXbpZL zmke_pukkfcQ5{d~FCu?cy?QM#ZIX!GOhF~)15ck}QvX##8i$aT(PY5lO!GT zHjp*_#w#&;<&pnEa8(iZ=cK+l6A8R_yo_4Zwok8e^A0LQs^S?HL_joU^kyf@wj z?A8^KUp{D>?$sEXks~+LI~VXZ>kkoMiSVbDOO!QvBa4)=5bjj_8w$!C>%BI_m&O<4 zi5k6E$F#04)v6;m*KI3#{W`6^Z61IgPaaAR{d6C*@EB%OU+o^OrWn~ z7+S677W?c`!#E(ee1U>+;EjFBD`V={+*RPm&lV6BO>|beu*Pm>`{~8N>BB*aYU2pl~kqUyB$5qnGW@(=!UGSgsF3U8RXTGsyE4weI_rfND%+0=6BYNoT z>tBx51QItfmaT8i`?Tp$W7n3KR$jx-D`LV_ro5bs9p5A3vvJw|E`ypvCdBMe*&;qv zJU`n?gFnFldvR}Ub1cV-QsULG2mb(0eu@30kGN8|_>_GzW11wOgsCr$ikSqqF{Z&|Csb3n zs}bz`tjIp4FgFD}sO{l2n zCeUrPT#EWl^R?R%u~AJ}wYfC%{O!67^uB-o$UpzBz$pPW14ALV#XEn6 z@c!og(P_BeZU~v`@wr4aDrC$kVR9f=x%nE6KDNU47|O=^adYN=Pz=K_dm!l5$h`1O ze%wGn^Nm_Lyr=n~@1ol9S8m0{b@6O`B%>13Zje$hx!)u%CKf)Jp@re*Y-y3^z8MnD zyeHU~F1@GEMq9ay$Z1M3&)i)aWLx2p_~q|Ie`#VJcExnEUV*Iayd}!2rk82_(MIP%9&9afDa&-Xo-h2ezgSY9tg9mm2ka zlZZWw0Mw-+#sgXUrDiO$=T!V-|x>=~K#j5-z(h zA#-!{hGfvXy81?mG0RB?=?cpH(0p*%`}Om`_ks#PtF^fSs-z(&rvt#umkv%n$wC&# z41Gl;UeO;;ZZ5D$t!x6tvAdG`H$p{_0o1)MBO&WdWA;8|BG&5$Q8aMaY>uI1%HAjJ zC6eZ`f5YaYAC51g$13&!mbo^n1Qe_?xDM5=&m8Yhx5MQkMBFa=UkWm9+-Ic-fORQ zuY2A1#L)QgMfrKTl}(fNAF1|u3(zFrPAyU1fr0Sp>CggPri<;y^oQOi%|y<);MxTa z{Q(dGoXAWJKfe!CN)6CvAEjH!1d$8oiYXwRv8!Zwn74?CP6NT<8=wr7h@8&%M^4w} zj=jsQ&p6)Z<;~YFfj`34(DDojL>Eyq zTz>1>M$m-v?t}~axz9g`rGI`^jOGEOb35#VIgOyMs-^7XAg^4Tv#M_9`%;Y(WlBG6 z>W+_c%Zl6cCZf5wB?o99RTLVj=u+_R&PV$qO`CrBDZgkcDfsYTb&cPP)d6yb?V;&l z#G@m@0w^FMH*chAO(EOJNrp@27JOY$=mjgGjyAjA_}p`e@dfG$yZU&Z zCR5s2zFpj?Z&H#eT_C9Sa7u!8Wa=ZHi4Z@I$MVr8aANt>Ho2q_fWRg)v%&A!JzC5b zz0wj8gce(B^ZT{Y^{)+(r=}BE;LuV4z9M%y@8b)%bxTm{;42Mrvb+QIq9$7Xj`u$p ze>*|Q!beL_kJto_-F@1~8^NkRi#!E$A&SdwGGU-*9v)gS`YX9PPBOyL@NO(L-`SK` zuS2eyq+rY_A8c@tJM)!~KRErLcW*5Ida+dhp|lH9pP6tU^O zEdNuD7R{c6RfoqFx`lIZ929ilTs3K?Q|MUu0b|+?np=bs)uK0!B@MseQ{i7cr$zn9 zq7jUwP8HhKqWGU#;J>|KsU}u@-}L57-y10}4w41cFFF^j~E>}|5<-PUL`^B9nOgQW^ucndcDOoi?-Be7jzD`no6ul=n zeHnFIbZ(M`arogc)hH z&&!UE0$G0>`3A%hnD6@&#w-KaVe?wIeCJSHjGIu*B;6g^y++A5>S^Ostz4TmZg!rmTnhva5MWe-hfNhvfK)*M{3C^6C zd!!5Ql#Q6bIj|g0t9uU4f=%&E<^3|t>oWgM{w@Wl5!9OJIDS)?Z6-1OQV`pTMqggvssN}%(dD*E4! zRkxXvv32|mf)zVRiV2@e$YwnHO7&8i;5)}M{1bL-e>>f?|e2USn zu1-FWgUa(`gFI572UPyw9+P5gz3(~1;T|ACmXXlSg{A~NG-zxf)fTfeVm9jW81aIQ zgcx5%k3c;y_h}`M@<_+u`~Qcu^IIj+j|XiLoN zBIZnIx{3qg&qZR}^gnsFcn|8fd^-TKbCMxN|A?OxBo?`PG8;Eg4Eh@Kz~>E^i^GUx z-l|)O9XlpKs3sAgP^rIvcf|rH(J!#%$?G0p*;!hZC&^lQ^D0iH6;9y=X=%Jie^6X; z_`Yv3Bq=7bw^zb0CMBJ#K1|`Nr=2s+3+ZR1@hEts+Z5BKru5JhBR)pS$(`o)?}x#g z7%%Qb`x+PpXwq?+?%o@!>U3_OKAlbHv2&KehRcp% z6i_BhfAn1Vw}ZdfXF_&kc9L_G2mT9gYn+wIvQ{h^QsRe%l_VTw364odcN9j? zM+2x+PhNqP9?HH*B`_~x{_Ud2gvk4Z1eOJS9u50~oOw?b^LBFl52`8SL}WIX{a)PzWENs)gl}6++>Ch; z+c7o0EFu|aq zx_14=g0V5?yG%gkz~GCpK*s~maBPCgSHGPR{q?KZF}loY7P{SdjRM=uf69CR+nW8; z4-lire+#I>N}0S$R-&)LuKY8?+x#sU7fAczL-Gga1ig(7|MbEC`lU@cyg%Nisavb$ zd)&tu20hpP?+DdzzUeL+Hfcat1f#F_A98#-qP`;sG6QfF+RVf6+YwNblgCvNRBHdx zl5$juIXRU+4!-~9ueT&LRkROp|5OQByZ*s8=16`2z?$G?vJ&`wvFaZsyZ1Kemh$n5R@=oSiY2ZBA2(7jh0jCr3*k`F6UOLGk?v*K;* z8Z&4c&KGSTwh@iX)G63VS1!;cwHRImWowr?xHn+*{56j8yF0-f&UBxWlG4iqmk%-e zWWj4iF1bGlWZ3^Tq_BP5nOyiQ+1s?j7#n63vD^lUfX1^Om2~K+aRRCa#vCU zuC@I4P14Nr#{5eaDlEuxr4UdjgFi!QZ}Z)npMMC*)HwfeaI((J;FoDIJ^4D)_5Cp} zHQD)3vGy)J%93ryewP;XpY$e!kln}sA&@T4bCNf|lFXb*1NjrN zg*mVD$^bo?G_M8`?_QhZ#JZH5QaTmQW-Lq^!n&g+AB zH#)DCvVZ^E#OP7W%0+TwklC61B$E(CP$Z1SKa1p&l9J5~v_X%7akXW2veudIhAx$u z^@{ALcWP%&l$wKSrX>A`zEu4X{gcnWO--Gt*eXB>GfZ90`Zx&cVMQ9t!yj5?Yo|NR ze*7Fj!rB^m!KzkJK$`?;LDV~Gtvki3jzvtFsfc?P=(;udaH5-0a8Uf&e@b_dVa6%C(wG*FStiTw+*62b=58Xz}kqZ{T^o zzjM+|Ad!T_1h z`yEK9;*x+5o}uf)3I3|3QK0Jq(JMYGK4T}}`2$kx^#h^3Jz8=} z!u=dMCV~E?{Ne!K70s=Yqn>Y_XnExcHQ5{wC~=trS&UUX&K@`}bL3TpQ z0$l&>UV@9MhHtLnN2c1SA#ICQTI0GMW4R%TF;!9;e#Fd77KFWx|5pnDU(`*~a-?3t zkBHUiKRb%3+bIoY4m<#jlRs#MTxUYGJ#t_Ze;$ru;}nWHNu(^Y#KE-deF~kddfPzn z-4I>_syB(rm;|`wXV!gT&^6@a+^1wK}006?W@jN|} zufz3l!31Ly2=cZVyYgdFN{*1D9xQte%kks0P5^* z_&$$#6wi@nUpi8nJB2hdoU7&i%ZH%lR3eNEBZa%A>1h9)82#I;51+sYo;*`Pm?no{ z-ad@mj|nHcj2|T5|4eEoXU+mJrzFex_@fFuISyX995>^U*2C%mOSV_&xho< z2_3_`DS7i5(Vyh|_t`NXa*)LkDIuBr%+K)Ry1u6%nv$ZFn4>yE@EK?g0x3$~^xEz_ z*=di{Lb!H}+6qtr(1Ro7l?Oc{qtGOLHs(HHIaAmSm-_Z3^ zl|_f8?4HEGUP{3Vx13;auP)I8;mq1xo|8jLG1BTso2VuV(XwY1V%}(>!Vn&-i2oIp z#CU8bjG4k2Lp6+GCqXQryMZkb^ESzI$Xc@}Z3HUGE3h-vbmn87j_}a4D zY%|6Y9=I6s+5C!`h!q2pwaP*HnF2!G zqIT=0!E6=fTm|$~U`!c3Y8o!d`|c>F(cAfd?Nx6%I>V3SuSmyi5b{3*z>g3kp_>iS zNiXXu_|sa4hL$eL%7kJ90v`#3G082ODyB&uzuQ}M@o<^IqvC?oT6jq+#IsinJ<}TB zP(;bG0Yf{;rLb9{e>oU!qi8iQo1s<(`Ad~;-sq3QA*jjCtWG)RB!vX}raO-N`6XyYI-mfF?(OuL-Qy>73i__PMPG6v zS5IUP>h0&HgMJe#J6v1Q&?g$~Z9r`Bf-q0=q> z=nQTDBS}ol76aYm^7Hcx#qlF}juuej_ssvNwA}fNSTY88cHG&%Cikumtj#~0^}mB zYUceqyQzIukuZgxobOmvp0t9liP(2HgNFM$IC_94u0c71PehkY@j=j>I|$daHo_URv!@&VDUAxz;am8;+Ro;ffg@ zy`onSE7t&NiH^-WyNKv$5`K@9ueGPcg5EaO$>NyDQ;?v=wvZ_$s;v${_iZsk!+| zf^1D6UqZr`7Cj?lxvgLaUdeW$JzrYpuvg*W1ePxS0})3o(u-t$?Rn?Bd9`J!JshwX*s>G~qJV;CmIVP$po17<=q%*R?cLGR!z?CU6fjn0q@ zDObb=H;J_WjC~ib#W@~nfHLvid7o@hXTl3j$yiB9%+S9<O}r1-_8IA&GX z2?`8*$fR}dCBku>_UX2&mzV|dF=r0}GK>kGOnDw4 z-2&=C{jP8%CL_T4rancB>Z_+Yxj%g%nt!Emu>yfLNnY;dXL8tJaIu51tjW2oS#s6$7256{dsYiHpX2uD2A1|+|3ScN|8feQpF-Np| z4oT<4vCsL?mSx(v5cbLG19ws#;%IaHvoo7EQ*7BqZXuC&ZoB))O1S43EObbVMDSv7 zy>Rbt$*=7Zd*xUp=U-vX% za50s_0Y-k+;ZzQm<{{QOo``CRzTA2*|nHX?E{Nzt0J3!A%hYTlT(OtACG$wL~z4c3M zS^@E-2U3oI8kigacQD8aEr_?L5i%&mhwqBqe9<0rAGi-qm-%Fn%ITr${FfJaVP#2> zO!a(isXz*TilO36#m)k~8q>}o9jH%?)45q&U)0j+N}|h#S-!64yIZ}-20piv+#P}m zmaZXM+IgA}o@$ie?Nz(z%lb7>$h+v)JVm?zycZ1>zS%2^^a`pjE3v*5 zW!E?@Ure@W27I2p=jdO!+_DtfWxLce9b2Yc z=gvI?<%Fbz-AE5cX_lGcIrj&ZQvIBJhip>x_{n6es2q6j6QW$Wa@A3 zlFp=|ac?kv=)=8_4f|VeG5qT|GcPT_htzZ3wg5oaG_3*h^kbVTY`(prl!t%2NS{1S z?p1RtiL97;*J~f$E1DFsD3(gfSv&Tz+65V&)*f>(rs{we04V5+E|9hG6?jK-nUTj|wRS1n9lmwOMw?3kb*5vGUN!XA_k5Epn-I?SRZ+%yKb)5nxw_-u) zqXypR-oz7SJl$J5jQ_0AH&!ZbtO$sP{}?PbhA5(>G-!`>oqH3ZEguz7ZUtmWybqVZ z>|M0YqA9h&mEh)20#Ep8d=>1(K}WsGCYSrBx^aPfo#;Uw(2?O#pmdJ*es$Pd|M;+_ z_6;UgfKJ1>?yvx0D#kOee%uc&!@DkZf(dR?N?A_l`Lb}8)DtkTb>}=^3d@#82A1EB zC-es9ncGXVsbs_A$RL5D{UjK}V#YG_Xh8Uv0lbb}C0}+E5!hxt!`%RE2jRw7+T4YX zd6Jgt3JKbY1>9{c`JDiuk_O$NJudQW!tDJtSZFY!LTuZ7f=$)2yU^NX^T?dnVz1SENs4WCzrQ_f znwOKHDyYn5O2Adku+BDN+}qUZ&Efd$WD5oW34&S;hSrY^MV|9J zRM!|%dJ|xqW8OY~->#;ie%C64H-UR6PA!+RRdl;{f6s#jFJ2qklr zzP2{7iZto65s@2X7pRe#<)f_$v!i00iE=T6;UBJX^--%VT6t>iQM`q!d2SMhQ+3H1 zK*|y_<9Vfbv@J?~b>S)l7&U_Rt=dDQNLG|P>SSXJ*5y3eYIk4TW^o-ep^*KORzJX04J}{OgIOX~45^yPjnWA8{kSl%+YqEXQ@)KJG5L zNQeFCRLwEp@Fw$!fk9Kf<+H-K!o5daQcHe|LK<~-u0h`c*}oW;UNx0dpKpS{MDRKC z#9olm?4Q9*X{H(Jt3;hd$w6ddT$Psr%d(uLxccn9LII73{K!V9IV=;sTjU8B2+HtG@u zx>ac^tw#=aNj0$9&==}uD|NkfP)aR60W#EG2vWk>(5mk4qjQ*f-xq^^!!#ut{Ydx2 zTG2ErLE8_j%$o1EPKhbwEC)}LJoa`a0|oT>T{fbH4i6ktwA5Y@CfID%iyXHBo=W&R zTCXZjyLB^tyZ|3t9?Z)g47D-Ed2*Vf*-h8hw#lkpuhfl+JkvU?YS(q9I@`_1T5xb# z&dd7s_ee=l@ON^%dP)a+8C($H*pS(6_%WE0-Ws+D&GZHvbj7@R^fbR-axLw6IL@vP zA0Z7_Kdf3Q2yT4qBASq|x(#@x)mdP;Uf9eKXxdIzhQLUULP-f8W(jrT2%O}jx5!2b za5e!xqXx#V7^(_bT-w8 z!mELjl7!i^@Cvsw-6|@$QER+s8$Lq%)@rDBddeoJa2*ym{NAOZ-c@!bkoSu-Y#u~C z0f4?8Kc$n}fJSy46tJ4mSsRwV#H0Elz#i}muq#gN%RSys9JYFs+y^l{7yCu%0U2II zSGt4K;;n(38@X@T*5TEyR1n%lI5osf(B+)o;1ok(Y$ATWGy7C`!nW9O?n!^%?6<^i zD_|mMT!wdn)T>B(>E0uO)pwX@C&`kq)L=y0q|q)8zl1%JLO z32z7G~vI&@4(Zwj=C_ilQpF#^&m8 zui-lB68UCeXw1a6qstv3j{J{z=iic;hlG7Ioqi;Mvgrr(+*hp{+PNz|HJC&;+gH)2 zPuf-|PbYhZIBh0|1!*Q$l6vp1J50vBa>~57S?A;Hxa{$m+iD1p)FchHM%`7j9T0Jb zYxnR%+`V$C^m%YvqcW>@IWDPCGCG}J&0)AC739feLD--I7TA`9Bb<)NBrRd>u*_zp z|MrF(jdZJ2cMBQDVw4uL@7v47rk^b>vFN=vwp-Dw)M@u*g!eaa5GBrnoZq_!Vsedg zLrAmdaCzI|y><6F+(526b>Mui>f-FKc6k<0<5K@qu|rDFEGNgkjbp>nL)% zqWN`fYqP6r507e6lJv4tNVByokkl_f-^1a*pX1XjA6Le~`RUUdTYg2vbB@TW&P&nb zn%u4~37Y`a@!ZXz&*y^Q1lML#lnP-ymqgq|-Szms58Jm@`Brj8+uq`NtlxlR+I`Yl z?lqV-*B-f@e84O)dbL;d08wRioGi*-bTr`TZr|3qTvu=m&QhLXFn59miw(TKpmmM| z)48w3JYKeK1ngGj{f86M^qZDbd{(wnyrruPi8f^?RQ|pzy-OdO_t(a(ygq~JF$l=y zQE<@D+bim4pt$UYxr+6CY?F94;mH$|+&q8C2#tuLuXQ`*=46p+dd3H9*o^G1EJ2|P>5niR5lA1a- zB&|K-n{%Ms#0u<2D%$~7n~ITWp&q?+`ni&drz$NdIp{*g%vjtj6aI(2YC(^Li9#IH zRel+h@3--xd9O5szlYfCfol8t$<4#Rs5FVxKMf4ZcGB00>;VTP!U$uik3p?d-G&}_k^4$5x%c-nC>e^K~%IiPU8o2#C$zG$u6xyGB!Uq`*~5EYG!8AJAF`~ z`;cc&py@>-ujORdbI7+;Z!3xIZINSP>Z?S7rE!NN^$W0>(@c{WnYX0#I=2kh_ckaY z*#Y94u?DA9dmSs?ddRuLCy4&pg;Nx!$d&NhisIoz{kJngo@2oW4TK3bPP`?@7!7#& zBAeUet~EyqFE1<8)miP9pLCZJBlnI37hoICUa~+#>sGf3m*cW7pd6btX4{fiRiByG z2pa!#lnzz?weVEi6Z!3=pV0N$oh|S%N z6d&dwTz8HlTLbf+?v2Svwa4okd8YT25* zclt@!0r;NLJ&}xM_F3$Zlvi58NMX8Z=kh~*eB)Js3;4}Z zXbv~ViwEJ|%bOr}Vwc9U=H8h*P7qwGd%hqi&5^m)}nAjBi#x;E8? zY+lh?4U>%REvWZz=c7EScs#;Y^OYsm26w@6@79nj!pHBO^#aJa!~NN+r93&$qu2~c zS6zp4hSbBHb}u(wr(=i!E#hT9-iyF0y;ASX+uxkmBU3i7PFJY+DfyT(XiI&v?eLsS_@AXU}XA1oHLfblG%hrWhnbfKg zD#Up|E?hOP9;vclX4G`bE!cg*EUfmwOxPOzmY}OyTS+18qN+~f)yg1$Hrg-e6GLBn zwN&D;l-K+nm7`|02zW9ANPVQ3p5?REyf`?xm$PPLrckl3AXhz`WxJNQ zadNuWVj+36Gze%KM?-rID0g!Iy-%A00$jY7U3D_PTjtqvQ;6l8Y~+rEFfhUnEf zXIziVtWtYGVhP~SeyaU9N{GMIE}q_7=bKuJ(zyL@^v5ThcjZ+4p>8~!y$aG-})M)MB6m-<->Mcq7;w z1Yhx(L+1PJrrPJm3pmT19YNZ(aciSkbwKp;9tJ>3@i1%P)3(>B5xBd*ktKKa{oHNi zBKy_gmHeFG?X#xCxu(w@gyrJlO<#iAjDtj<4rF?5jcWK{0sLQjz#ra6tFTdQ_-^2t z@hR4s=!W@Bs*VN?dv-=@kM`KfrfcGNTFSOqoGAprR=u=!R$)qXhY)&T(D}lPWpYVA>zlH3W_NNF=!#1&wVZ(mOZw+WcP{L}tj_-NAUC5P<3t_$K8M zRBBfTa$P3LPqLjf7|PWcXcpsl+errMHKiCqUXlAh#@ToJ#Y>FFp7{C+>{E4^c51W@ zS`6gVd%IG0QSr~y(VS$sB`cWWQ(ladw|rmf^sYWAN0(+a3n@kcXeK{{|$>O z80c9q-If9xCay@tyBMd9$?mldj}e$@Y>e!ct%cY;`o$KGb&|j)r)1GET}xNKPZ9;e z=$8K1Mb{2!-s^RN%I#->c7lt>ExnP3q$7tWTwIFC;c~?c1vnA<_8Dab`P%1l8*N#C zuza_*i}&Z2A3!P?CTP3O3fw_(jkwM;-WONH;|)}2$AIgaE176;<<9{TZYCnuz=kb= zb@b`(og4s3WjWb%r1`q0+2%r~nWh!MH7bP~X8D!UH8m>+;N}Nl?D@ddGB7<;Sk z^(@*VS2jPsLKDghz(0cN9eq z^Wx-e%}2%b$%PSN_A5uz6&>>OI{b;QYy0JeL@aj&NulD7^}Pni5%wb?;v~Dget0GREUV*bIoGCMiaWE8uLo#hA2X z{(;=cSCDKyu1fRmdg$K8v1s%RRYTt4OV}r+(HaSzw2R=jbgp75{lKkkNpFvX1#=vFBOABYzM`okSdvOm|;%z zeBJKhn*IA%P92hg)HG8JUY8zwYguzC@XD&r!ikES+|aW6smvs-N0l@9Ko)P-87cp{ zPKfp`#YKomDhM}#Dn*d92!rgE;T!3>r3YmeUVH_WnVtK9RPslUH?SLH`WM>G&B$!5& z!E1C*``bt&$mo=3veObL>P0ViHk7l1_Z!d?F|i3_n{DP&nghGbd@zh`Pv;~h1?yVR z4(mpg%<|2L^C#R7OV!hr({s~&cWELMkFk&z?)~%Wd6l1wi{uK7=jhoXMknv ztjhq7qa_h#@VrItfIp!|*KO|8UYE+WZ!3?@+4R()s~#$zbDa}dC7yb~Rc|pOq)7-x z$@lhq^m{YkOp(bu4KR?WH`m-j<_uOvCy*z;+{*Em+Cp@>4#WeDJU$^Kx#wlrqgX!gPf+n8=p&Vh{JU=pr)Yg`9s|HWNvZ5w@$Inrxvt!&M0 zq~R7imOGr;W~RQW|5+7t=B4n`*dYKEBnsrdz*5rig3Hy>&k896z* zYFX;EphSWn*mAR&=_M+N!`P+i) zm1mE9w?k&?L^sljp;(srj{V8WW{K_y;0E;)aCSF51;`3}*@_u4BL?JzdxGQH#*n8v z<#NeMQmoeOA}Z_CWz)_rvfXkSF%jdg>>NJM>&Tc3<=&OyM?KcB1R#rXcCbi0-n__& zPU23;cI{I(@|!A08wy+NS^9N3H8Pi6U=l>U_q@TSZ-Zkjr=VU|CNB{& za+}xOgK-V?&MUI9%}EI}b6oXDq$fo&(DjPV36rBP%8vFS$2cv~d%ms?v;e&#yi2dzX=}B>Z`576<;{jo6aTmC zgK&5A%)jg48BV>QVBt~jQLs&7M@$MXw}rd}u(q|VX|SAAx%(lRWI|aA+^`xwgzL4m z&o-juE)~z8}kv*xmTJ@1*vOkw4@gW?6?#@|6vO1&=ugTT>%E%WK- zR+iOJ$tPnyjq*{BA6>DWBk+rFSg3bvlY~IOm)i%A>qevdP@zGuwF}Rd;PGkt^05>u zk=rT|bstgm2CA4)^I}`N8`GGLjM|(KchR00_rP+L+G&O?-m!Pewc1tw(78@=>iF%1 z3*}NG1O;4bk%gK_h+H>V6~25}KT)a-&p{fx08}QQ@_yVIXvG*@nEQjqlhcH~__tsE z07Wne+NaWYMTYXOK!_-OtD2pQ`T8uPldW(zYxqXG=LJ>dOA*l81(#A!)!?yvGd`jhT375H2bZ`w^Dk;CvQ>`GV4E%VAgQp z6i2bW%jnmLz&3?WV^-20s?miM?3AuG*W&6F#B$y0R$me4PI_ z>FDE-Pf*n5?XeWY#t*)jo95-T!io^0K)__^%Leacz*0xVKG)EK`S&19%`)?8Rj#k8 z2sI5q@RD@UQcPx2cw&JZd&A~Qw_}bLyyfE||5`G<=6ts`Mhmavd?ytG*F`m02{~`w z!F6!J>eIAAoYlhvt-KVww?mF{1seRcAEUiHAJ0^qV$~DuOm4;e+@-oGLfpM^?X5#TR({l$C=6LNqd9qfwRHis zlxr+<@+9{JBf{~8+z+BN-vNF5Yo-Aa3Fzn{lh~$L%Zy03IhgIN=_Zt$7mb*lq|xRt zf|H`Ta0e_GAs?=gidHTvQWr1sjBrKpR ziMTgGu(uzi!4(&xKoJ%XKo2y+5SK83bW1j>$9a=gw^S2IcLC8a98RzsgM?#JlJOTu z^CfE_0=9p>?h=ZSPt}=K?8ZA~0#2tKtF(%~A#0rVPb8j6<;ASJ1=b(H%ZYKpcOop> zr-!R3mUOv?&r7NxWVf;z)k@L;GOsKVn?9NOE^^Rf@8?30)ME{hTf>bsg@kdeBiZ&3 zfwxX>u~bdv8LwhE;t8LBU0uoP?RXjCgN5hLBPl5fSwob3Sjn--?k@g2N(CT2ZMtZ? z&n2*XL-D7LjEs$!tVKz>b*a!b;)c;;CFZNll4KBXa7fYl8f9AVZJGqL_DM~!Y8Lg8 zuvk-$nl7~1HB-KteR!rAQ3i|PT|ED}`Jaa%}W;%10|;nDnlZ)}Wyo@43t+oaZB zwoIfHE{2OV<9U3@9BwAzj;dTwE z9?l7q6w0(B@w9psY2o}zJ`Jbxe(`VYq8i;BrItgMt&gop;k}s5702~zBIi3ay{`Hb zz0v#=K-c_U{78;--DyR!_{CY^hGn&|=2N%J(?t2RtE(q!9g$UocMnj&9D$MP6B%T2 zDI4oJ?=NQgq^!J$^R?a30x}d5wt!xQfNMWgMcLMNq6N_Rg$5+;cr)~^P93-K-%ITc zb^1_P%3@c?uMK!|*V0n$_0(+P@;?hv?=3rgw+{e1i|}6X*TDTeorcHlBM&XV7?Sp0 z908D;gCuoOIse-ou@bZZr%-+%&7XFtz%HB4w<7L6l|MC!opd(a{%(s3Fxwz|Z^CvK z&-D~vVC>kLtx&7%$H>bh=-N*$prabTl1MdA`jX_Njk?`R&TXW`)X_D{`%v^!i1TT@ z+PnH*M|CS5%Ua33D$9u6-it19_8U2>U*EyAY_rF42$HLe!6(7?7<Mx4eI8M5tb$u$V}W9+{339oHQ1MaaX;xiaLgji?+1cq z`bSnrrrCWUTw$-Xtf@nU%r;TJ;z4Jaq(~l0M%iwMo!Q6m8XABP=%fR%XB736nGv1P zDD4><(af~i$_c9s;sjQQE6)|{knsZ5?9i45-zXNX61Nf`x_XU8?MaKfTl7GG#b>p! z?lPlxZ*BcC)*+2+{^fSVK%ySt%SWY{V9>nAZ6!PuTgIr_PX&dMqXG}= z7i@czE1*=kDFa&e`7!o~c5Cmypk%$#Zf$f6b+!g2?F?Fo>7~gO&r5WPrRHao0PAki zU;oPnGmdJZzPu9$6>9M{*~b)8+q~Ha3HRG6qf=0-x$4{!nYpBIwad-vlb|A;eL-M~ znc@ZBs>M+MZUNx}LG*W-ftz832l#wa97F(lZHfFOL{o$8;DIGtX{lSm#nO4yBH< zV!G@Ip&|tm=s}a|C|12mwe0!={PGA!`){X~uNx8%yxzWFK&4`Nn14@oSO^IC04CqZ zu^qrZe4=%os)eq|&-{9uyxqd#3;po3*+8*0b#Jl(RB*%lD~|44@i+b6*pU94jLfs* zUU^r@%$`PkO1V7kGCydPTveWrY>=?PYkK*3>R39)_!J-b6l9VfU?}p(FTbfceX|c5 zJ4CSsjszN1ob{wdjkn%&4t2l6U@2{_GXLSgO& zo<5fim({{~wvntlbLJXTC(osgeEP2QlKqwLNRi`7!tzZNm0Y;MA%NQ`AnWW{P*W1=7+)c_S?%Zal+89L{8qyG~llJB4Gres9Te>^$=b~2!3LF52U7x(EV(fFc!3ngk;<)Rcb1Q_1{PI2$ zqkf6Q=hgJ+5`Xhns~!Ccd*I>TbBi#Ed>Ft&uSeC0HC{A zB&9 z;1TYp6Te&Cd9%>E*tvK;uN6SvaHv}WHuW`04tccmnVjq^n5v)p4y50j%@GV;#wKCb zPWuWBc;tzLo?cLJPfRw0UVi~Q0h2pl@D~lsjvkIy{~`&#!?u_$*oftKUyagQF+GwqFnP;xS!U{ru7lb&<> zO8rPn=9S>)7y~!clfwj=o+=9-fn&oHZ*(k)0H25{$PpjV*WI)v6MZEm(@*MfxE)+y zy1J1hYCA;_SYZ0viH(-qh_=tu$)~L2_tG4Rq7=ubA1HcXvl-cm2LU=DNDQn5UnrI#uVK``q^_f}YyhhT6F1 zhp6+PWLt30keT4c_aTRW%ba^ipprX@Ml zb;S0py?)W-38|?__GM=kqDYF}md{dxA}oF6Z5}OtFA2`Nj=c~a4%UPg!9Xm60&w&8 zhvhQB7p^R`20t z4VXARN!}KZ?SO8h)E3S;2)Ma}O&MjHT^RgX>{ffqJ>_=nV;w539F?0^n33@-olAK@ zC8rdko-#8n(xjo~aFs<3C$K{BhT+_Wi;XI?6ya#UAjbF-JvTfkIa!9Cp!O*y|y=EOo2}{v@V!> z4}ex6Y3S_{MiHHGWU3HeibX|_I|Vx)OgW5K55g4kI8M^Gk%%70BgJPiSPUS3P_MCt ztXpoT;bY*>dkU1@927T=_eaKx1+b&>T2Jf8Q_^E{Qubb)3^ZUVv{T*FHTfBvQVAUcM)u zU(TX`OQLGec1`%{RaU(UhcDLRZqxYvEqrL|g*I71kICfjlUyC!D>y5ao|~d1z_bT| zaJ6>iFJeI#7Yh1U1fjV5Id>MpF@l~LmX(C>^ojPX(<#Y-7_KK+2UXd4gwCfHap^FO zDp+tZsPjNk@wil5HHA0u*^H?0-CeOGO_J&|co7nAOCJ|{u3Dj{)chnwq77Ke!(z_$ zk4LSNOZorRv!8%fPcL7L9h7CDbT#{x;yzBxyXvU0~Va4dsI!4 zz5DusB1kn^MZV>har*8KnjtE+%t6-YbN2RSI*BLz0pl2;v=S_GLOb@ zA3H9uuB|7$OrbEQb!_Q?FQj*-oDa1((!uWGl{Bt5OH%?$m(3uo!@?}a^u}L!78;*H zk>s~f$57Jlkej&=wITYo$?t6FM!cp-Vz6wjIv{xx*fL zXWK_NMPE|v8@Do@Z~u^Z$S)crIa`wbV+(9rUaRl)RLd4!X^WM!m3CZ))2BF+Ys>Qn zIxFwon3$Vc0F>wI{2tc^rs@8kwUON0+}zx-4fQe}5Z-lKM8>CFfqb`-qHQHaE_eMevZbYT&eg~ctg9v`ODPTx8)Wom!GvK?RNmi zQOD=(!O7^U950^NqQtW&;${qge>eJA?M+IZJYXZR-1@>VmC z+d97IkkGygufpV6iFIre)b|X=rX`x-(lTOGO4Hpm}k!E?{PXb!ZP zscDV1-T`TL*L`A120*ln`dM4!U6c{@+IS|&?m;+x@2r7r!*)Cg`zq1ykO1Yc0$#gR zT02eN3-VET-Tw#-&p)f~UURJHSQGrUuX<aXOx- z#wf+JD7>Wp#4%B7;mS8^%tX|&%?4ObhcsLoN#|*5gU&0SXA?0N_wFMP?RB+*KP#xy zo`pCj@>!3`Z*Dp_0^aY?fod0D+|kx`ci#5eV@1~(<1#;5F^>UfNt?F32bO$8JNf$A zSz_GFCOaDbVIGP=TjvDW*~OR<@wG|WDZP6q#3z~W^t719yUn?6aT{*Qj!tYVUY6$C zR4bVy-ONi}1Mvt6kUcY)#tx_}RXJ zyG}k}I50OhB40lH+F|4;VlaTwKWn~ATT0&0E+4~5nj`;vTQJWUzw5GdmZN=VX2RiOh^c-(BG48;d^lFTT@WcZ4*7 z!1Qczc}V4G@Dm_p{9bpKBm7l({#x$Xl3)X}TA%M_jpk(>Z}kN?oL2)s~X6nY}`1odhG?65bqmUMPy)^WlfyB^O9WvTe*W&z14kd1bK$&!Pek z1ZA89U_Z`x21aSM2j0IR+q4)8*C27@3caS@^a51W?h3e1iIm)JkViN0e zhQ-5`x|!bhNOvOXz?Sj8tlorPyRCTc*<-z0yP8LbW_iLT!#JA}6wSqfEegqN4GxW4 zHG0<6%uz#2c_N2w}mO=ZDf>Jv=4RmxZW6x!_$lB>@ z$f;ZMB$MfR%Vcgk33d3`OMlWXBMX|@Eng&r7=H}2*PuxV9&jcsF|Sx*?l2Y#$QIE@J7H*+lA68i7_27l6jTCTD2>hgHcb#D%8;5rd^7xp?VH%^> z=qoM^L^+2ukE^Ym1~70~v3HHvUS9G~53$KpjcfW< z{LzSfy^5m!-9pkJGH=V^Jqga=5p4_a>eW_BuuWDXJ$9SNK( zv~{`vDRruVh=^*eicB5b056;g>C~&gc4@`0cIMd~Q|~;w19o?c+@(qMBORvw67r-+ z@-LrGQkaT);npV`rl>)oKD!DTF|q&%o@9^}X%moR3A~6EI0r$Y0SDz45MVtN|24fq zqPs{vJ9?Z+Z3x*)tnV9X96=#0LRgY^ZF9xUS%f6X=pp-+PREp|t3YEYg%CDMXp2AP~v^GLWoYsCR8VtBeQ*+tBg^o(Un;x?4d3WD=M_;C`{Ui6&Et~aRb6uIP@Na+k@)KVUhsGerv&Y-f6R*LA zjtHgafdBRY((h_K;rO%$ARHhMcHkXnA8}%AP&^B#^>%rFquNR``f_AnytrIEzx@-f zHFxJpps#j|cY0vtD}!sxwHK0seomdp{3WV4p)tm`D3{jiYA#aa^G_!1CoMDt39Wi3 zUDbBbYhvQ;x^wmY4tISso)B;EtiM&^USGI5gvPDUT&OqDgfJhw`u8y2m&JQXcp?4D zb@p`nK!z7x^dIwOsHf2D#t?N&Q5Xychi-U7Do4i{prp(^7hb5yNNM0lrUJ&x6~YTQ zcf@AB5yu0iE#bco*acZHrRTPJ(?GV5AGM$r^Na< zVsXc{pJcW=o?pk&r$Kb9zeS?_&-+N?y_Ueq;W&tCy}rGdE4^eFG_*tLu$UhTl*-=T|HF z2a!@oMKq0HT9NO<#8Dotylv=51?OBeymqFn4);icuW?;t1#*hb{YKouijjh4qH5Bm zg~sh}-8)UvOIszr!x0Ei z(beL{_F9aAD`*m7-TcDSS9^o2eC@*j4d{=NU2^uz%F23_nyLAoV>Sm?Q{x$1=HY{f zy;hCRBX%2aCYXg<)7~2T(&BZqE-H^$#lP9CvN@DtlQ zltjN2yOLezE&a3&uyz86p+|C!DH2;-VPqKbLg_2gNB57Kbvh1ri*YvoJKK%Nix){h zg_U4Op|~9hjz`c7iW5qx9$cjx{Bpo)?CS_;^>w;v|n(xkN?y zncHU%LoaR{$DssqL5)Xr*8R!ihhGTuF4o;$e;9B{MDQ_=OWZoXD&Ud~&KD={8C}`O z>Gf<-oizLWHd3QCq;>+-#j&`{6-L2foB-}lg6%i$vw3+>)hubOyH{S*4S^jxA|7mo z-SbkPtD}N9tSB9NY28 zWsO77wMJ=g!%^F!DzMpYZyzfq{>ZX1f7Z1<#8+EfCE~NhKX00UjN$SVzp+c->`7$p zw`BKTZV~SjKQRpx=)emJA=0F3{x#s5*9g3o-2G^*%tJxnQU18CUXHHwtkRQ`^!%%i zdUf+C{h>V^dV$Yvef)9)Q030P(?_|(tmk)g2-mUTf4APjyFrWAE(+ZiJeDe^Y$NQ_R)$;(w-s59S}oPe7_Cs z4^0a@*V<79?UU$SJ0>w3Rt=yJC#0-9W;0TXxTE+eB9G#y@fr8r^sUIyRzzKg%?M2T zP8I>J#|I&5w<^d^mdoC#w(H>xfYe1Da8-Qnn~8Ii$r{_wYrGqya1EQxsTK=e+M??g zsmDsL9%Yv=!;nJ?C{Z*LF(auk5D`SS0pIN5tv$XRZS=vo`DizSPBQU$$q2W9nfz<_ zl&qA_QPplU!LfLf&vrtWvgQa~-)!h4%xAY2izAW82%!FQgxpu8e?d*_yIi-@c(jCA z*{+K6aOy@J^*72_nR8hOB23YGed7D;m!bEA5Lxq{eIrEWQ+QCm@1dl|dB+xr zbV*EObHJEDxE_-!w!uR9kqJKamJkuJI_ABCI@pEyFozBO(mROdy9 zbUkqx&Q7Rzm{i4VL1yGWdE*iUi9jkMz2KtV#M&c_*RWN{T5$*(E~)8M-zdr`7y76X zm7kKcyqKHqn`}-8EuGU@5AK>oWwjs&QqUvqY@7iI?mGQ!E1b9;PMpJad~m|Kc?MIAf{n z@pM0^8YpO8o@FY)GI_i9qWKsuj!}f4>)_+#%W8X#)}TvSCpfe@@7Ky#ci8oK5u zA(hB*8uN*5a?qq^YWV%c$8OM3XedWDiA#24yo3>4T_@t*HfpVjN>sfpx<0_S@a@y^ z1t#hg+2Cc}y8}|<%23QqgSWC?%`l^XBYV3xnih@2E zl}QYNr5PedHC;B7WnxN@G1e5c(SfYG<@h3Ny~cr1IYGFv3rE|!&ztyBQo`R7Q3i{A z8c3g{U0M^;nBq^(Bb?+i7hnyX6J({xqWD5pc8YEy#2ua;K7p9OF#&}tiGBH%uf+de z?2NchPcIPCZzBPQrS83p8uvRA9Ub++?LZG_c0;Hfi>$WC(z<4x=3(}kJem8X|Gtt*lIN6Y7$_rTPYjYv|0F$BB)R`Q$Uy zk&3uEE*vXliw>r-Wfvxi`efMa-P-E*PvOcRmUl%c2S3@cRs@=?JA5bW!PuaRQA)eF znF*c!)NG?pfu5A8+xjD7$?djA@{J+{&`4)RDCwy11wpGsOczN!pS-PIuSpx>=jX2| z&k|vs%%zq(<0ngSWvcME-;$!k_eFh8b6LS~7FY9>YDZZz)*ZYf&hWrk=1MPShw?m( z>LcED^Ca6ntlVKk1fomAd~abVQjWKz5PG=pc#78zQp$KC=P$1GInID98R?*9bExop z)?YrVvxX97CwbJ2$62OmZ*@SwVHy*Bv2Y1pr=H9I8mRp~@=w~IjX_5}d|~x$#csS1 z+49@n)&VWTFUf`Z!8P#7iN6PR6s&lT60Rm9$a-hC*O)NeZolq1Ila3T2FaL_?``Z?rZ6OY!#cacywQ|kwaK=)@ZrYUkmDUF zI>}{3RgO02W;OBmriq{R3fKFi{Kg{yANS(4xIe<-MT)$ZJvl-G)NTw-s~nEP{2V$@ zA8l2W8yzL{0p#e3(W~F*?oSK*{R2Uj6q)h$d$OueBF<6qkHO(fnBzbHWLd{}wmyB> z(PwdZ1$Trc4>}J$MBqdWj*^3hKB_A}G&*X;)d@+Md_3T@=!t!TlhT&JF+sJQx(V;1 zD~zzxt=yvDF&4s0Mt-KDaWTiA_o40wc#-0srlzLoLd4Od2@=ik&hI5Izgn>n)#R=m z{&ZC`yOHtf=|p@gqGGNW*|&d>yS%u*QKcO2ot!I5Yw+TJuFwKmqk}qJ#PK%QF<%1? z60-~Ybf)^rAvj_U+!5-7J1N)|y6nMpIc@5)`~S!l{v7w;en_p!mgWh8+*d7rC2wY^SNSz=9lF%8C5dherP055pZENC2l>|! z|F?hfqr7I-`Hs9nRgag7zfDrQu$v+D`X3MQD>^3|LK(;ZMtLKe+q7+D^K)?UUzfS* z?iDLLE9&#gDlBsL=B7XMqeKaOvLB`hKg+ zty$-I3qqj0SMP6}{hqag->_mDc(-Ah!XBV%So)mtM#v<|#6MQqEJ%!vACw|M$mD&73MmMhNs9&n8u^-nkHbN}Bbu&BIehdCJiKG==hOR@T;iq2=YY zAsMo|{1+u`f+TF<0hTcJ{?9m^b z_A5dU&c(;av!$?K6tF3zEqT8*H3I0~oGfiFLGe;U4e+OGKfg`{Z1JIM_3cqobHi(kn7 zd;a_1jgKN3&(+nue@3gAOEg3N|6cPy?TbG*$jOJ3 z92K~t>g%BF#GNS%ZaE&xL$!bTq5uA^C@k#-nhU=X<>vH_JgNMswTaH>Ge#G z5>?YRLwnp|CYMplCTt1j^EL*ypSIhn?33~7%zn9nKe_0GADcX5oeSkM6s^2fTW|;BjBX%X+y(qq~sGf{|(~!@0OVUuHCsw9?FG&qnK6O znJ-0-RTezxNg^ZptpK$y2Mq~SawS`%Y|?)}xBqOeO;4{|+1PZ^)^Vh(wosX;pcfYx z<15E&U8j8Kr%KInrsDQhMwXXZh!W(nI!}aS`O$`h@1Jft3)$G1=&rWcFaX=0x zl}TR)nQka3PgOMbN&MIW;b+42_8iqHTrYJnZ8U!<#Rqr%#6eF(#4Zf(BbiM zfETr`QLXL%A;G4?VAU@_xYE@Z`2+E>$*AS65fC%}W>TBhuPHGtnuhH0<}4 zd%}xcrugBR#MDqV&DYP`=dyHZUw^w@$oe?gMl4j~zciSCH8X;c zreOu`rG6gU$(E7WRw&;Hd})hTcU*2tfWhT_HYfq{iXU|-d-?4Akp-29RY!r+ulW`` z|DX|G zA%7#48!eWgdZbFH>u|pA2qo^GMMWkaekYVN3HEHle`qhpDCtfZt$KxtjM1RwF3tYI zYJ_q|b@q?0rN__Gk5u&^tJ;;urlSik)wb>_OC*PVX%2&k7`U&loE1o37TqLS$Pdy( z3L6U!bN`@eQj+Ebb)+2)S9ZP#p-f0fV4Sp4@vk@EFFHEDXxX#=l-dZry|=RIz1iJw zfSwH+Vv^hnm#AW!G2JN|^L85#fBE+=6_ z-+&w%IWWinel|7y|8q87I;U6qRmL&0!y!@)g1<5HtY&ShFfJJ8_9;fqCoQs+Dk`il zd!wsZmFek+ivYUg@t90WOMoZnEA(Am55>he7PZ5 z%b|~w92<7SxGw(WC*TLT&>5s`T4r&u)gh;L8n|Ul2$f(Kkc>;%&(;eorbvj>c(0dO z?=BCDZ#sfDiJnt{zMNeGcuEJgC?e2yC2q5>m|q21=m@d(8cvuUfdxQLd*4)9{Jat+ z)k6N)^b?i#`g)aix|1JF?oXCkD#I2_fXdAQ&iN$iD`?)frcxoHUm&)clRgy7Z7L#$ zq(9BBo~E8-@Ki;y+~)3@W1(bBSLGm}GVtoG8&(uVL`(Q=WdB?!GzQx(H^8i|UnBH8 z@P67({;tU{wV+pzI!GCv ziqhrr&$sfcGN`Ns^Y$(0=!S*Ld{EEbWqO)7;(uyrd-pEhs7`jy80CF@G6)WXPzEip z^E}42jUfEk-E2uk5_Xr}LAh+eJ}jQ|v0hq|#Cg)DYD^-nrUnMyp5%D5*iH9rK!rn6srYnww z^@ocILGoftDLnjiEFZ93yxYZdBTBy4k}uFt_KK=pvrMKxv%U9Z z(a5Zu$3-#BdKt@X9{EL&LZ~o$(+P*&Cx^5o>;ouynh$h7_j$kJFL`7F8>j?*zg_yp z_cOWyYrT39C`^YyU+_q-tk#c@E97@IyZT%XzW8hB>tj##-kMjJks>k`aEh^FqZC?? z&wg_&@^L|-qMOxx)u$njZ+xxTvGQ`Aa^2JPdmV)Rx(xsnT`-`B!$} z9Tb5C|DkHw^Yl6-Ow_=8qe6!2FA(A%htub#3oTw!h76yXUxbw6sICG?Ewm%)bwtx# zYtS$-Qw+AFB!}#xi7H6+6N>7$yVjA~wtNWgcIpU_EXU6k`jQ-#nS6SE{frzS2=`5a z){=a#dsaddySZ;Jv>% z^*2t4TE{Os`a$ef-H_6&CRhHEes+b8ZPM*QcT?1SYT3l?;Rcd@bVqn4#{2+ex_;x$ z?9rlNHt@uIEALahR&(cSL2-&k=B?_A@vaf=`c66>HphjPSSV1Y)@i;i(=<$6Aj!E; zxV7e318^q|A4@pS)~6ZfwWJxaAI*3p8xE(=JJu{ji%kuI`#}^G?Y@s+Jpak>%=MF* zsUIoOv%N%8UJf{0N7hu7lt6oH5Vb!uI1j3ZqBKq|B(1riKvtWx51{2x`P(mw{)AHg z{V4m~ba7-<=8>vxTGY{I_~3FAak{(v<8lxHMIaF=MlRdCH)afdMl$XXbtedBb;Fz> z==rKfHjYHq!{~Ac(E;Oe!ulm~WUj~9w&0#-;!qb)@W#&7e!YQW z($||Tz41zVWNlT=^oYX9_Tod5$Gf94VcDW&l1W;2ld;OvEvo6mdoc#X8@GJF%;h@4$#z#gM^cJ1oz3;N%6rMr)sYNh%UU)$%44FEiYS)b|6kdDGV*^|&Z@N*i4 zu^Drq)O&=)+BBc#_IszC?yL4j2T2G8qk}=>K-lqSyX1o{mUA?&6Mhl+UN=90cTaPb zn|K)*p=%BZ9HeK&7nbsLxu9#GFEAyl4DO}L1O;N#Lq%8(KnIl8V^C=sa&N@U_~73A z)2?pency?aXk`;VU0o%L%@n-UMpSE~ed$4F*0~-_MP=n;0!s;RMXh1-*#7wBWJBUU zA5?rn7T4VresS>z+Qh?keqBW)V+mU?FE4SSoeA60cvzFq*zWGG=hMZCeiwev_lE_Y z)+;V5nTLTJzh1Z|V!zb#?HY4Ka6w%~s7(hr`Pf#%^IHXE z_GlD!wCm!sSdy()G1DhDhB}Ir)sD{|*CS`n9j_#}0`Skg3P=P?WJAIinP-&*VsDp{ z+D|mF5uXoqihL1NBwFF9`-Xv@g@>w@sg%(G_myfQ931EJ)9N<|jQm2V^m!d*BxkVg zf;^N_JoGYc?{&bLw!PiWwKOAp1KiM1HRD z0VJ-!Ipw8IXp@hYy7M;-Ps&S4f>CO}!-A~E&->;Q1klUppWrXL(rXYDEAI$21xIc>+mfqy}-m<@`S_3-${M5?{%qwnpre z^~J`)?xyoEFIORJ%Bq!rpWTi*b=DaUSnCVzTyTxTZ5p?6lgybs2SLZ##C<`hxfU#% zhS%Z|$@)$b(uc{wXR9^WXF5B{ZPFLMyDN47{(VYOH@nq!dw-Gxji1X`^9+=c*)yMi zj_q&WD@M)qT2{yqR7vg#S09hU>JAGkmp`K{B?#b+lkS2kqhvJG$6(sg+L+D7vdOfU zQz?hkk8ysrb)GcL6U{4dpUa`%Mo2vgBgn=lSAvu#P`(TFUtPa#4QdI>h+|Y$klO~E zBZ#DjK;!?(^P=9-{1~}BnR_htVSpE;3gV!?OPh}l7YL7+r%ny(X3CV6E(>=w6 z@L!|U54`_xZvTgg2C$+2c3P#PX-0D(*MMB^YHyu;RwJYzGyHYX zG>@lX8B?}D8wW#wz2*spbBYz_H9yk4k)iZDqX~#Pf}8*$v?0e`g9XZHT<>X5FVEiA zidbQmqxJmiTP1Y(HDVaJ*PZ$Bkd-wfoL4-bwOYKevxUg(S^}E z6)`-olzJVi;_KhGozz@l1U(#GIjY%FGouN7p1M!xu7+;fV$w8!Kn$xELpsmp40=8f zx0BU08GU$1g*I0GxUDhtsl1;o$rice1l5~uAf~xKlk75d426QoIZ8=vt3_j$lZU?5 z5~NKmrJPBwW4hL}^`0`4tfwWbP0efr;|FcezVs!Diuw#(xOV3&7blzK4SNN@hlP%! z?2=P@fRb@9&`xec0Yua2MZv~60_s-0#eLX*gG(!^cDbWP${!)*zk@dv#(sf_1ARTm zF&(F;&j|($_DOy!e~Knq32kl6A>=_1#S|+82Dp*$VJ5PH8M1wiZskLM-=s{_5M2_~ zWNay6=;IAu(fYA_co33UpjLI#RX!VXp68_wi~isn62_tN64RiPDD6I>`QYpK9suf^ zPV$TuyvU$+Mdymow`PLj$qHNba`jUq&X-2?FG4_Q8v{r@;f~!e!{%0qC6B(jEJSH* zNliocXRLeU`43A7rB@XL$V&}eM>SXSjj%R>sp%lEMJ+zFKQ&^@`xzjQ6?=!^BE&qe z2$(yWpVUIL6p7gG0<`A+@;3$C(dfv~&^w8}&b2^O)s>=|B`yzl8E;YiyqkAHwJ|Nh zb#07v4+RvTf>|e#tUsgefK-&uPr=WY-}}3H27x;evM+L0r&^V{tPJgzrC`~i&c@U} zs0qt+l%yi3t@h{7WN*mxL0rZP?U18`@SQ}bGZNok6Hx^UfNNb?R>ccjy00)P#z&^5 zfNnDUp?!vFW5W^^jQ@&S{huv)F}=k;#>rae!yBD41Z>?Qb^H;7fX1a3s2r*0mcC5_ z@Y_TF)ss;H#%+Cq4!-x7SL7n=+W}0;%%Pw^N>z?_+133}`g&&YJ}%kdVxLBd*6jM8 z6iG?Q@_jma(4)1RSWYr?{lUV<$f>jaQrQ^XJOViH%OhLT@zW zX1<(Onws!t^}PJ(6DmIyzz2iW&WDPEQteDsBh3e)39TF4Po$l4#PrpjRK8!x1~X1^ z-LG$qC67Cn@VdzQhfje;4s{!qN=6UJ?#W7GSCoS)ofmspRvU6b*NI#9ljSUpw_XG@ z7(YA}*FJwgmH*4b=)+r?>@7J?cV7=AcpLsRh!NO5r-K35_(pM=a%whS6~fmW>?ZA5 zAK(~P>Ua9O*UBvWl}<9fewn-d997fr7;Fbmd^Bj$|4ysuvF`Mf#h$pcl`54W*gKNo zjz*)g5mBvp2KZN7DdwF)lAZ;^3hv$nL9W)R3yh3v*7vw3qj>m9UuvKJ&WfpJAnPYu z7Dsw2*KV~@?ePEF!S`FD4Gyjh#!w*!BLa}0DgK7>fZlCR-Jsb(_D;WK<2VSoV@jed z#y%j}Mq*&uIR*Pj$pt>Mzc59}%u2&n z#YVGM^qX~iF{=E`6KH#q(*!DT)vcF`J+%ZWnKj66SV}KOSyBYHZQW@K;;hY?tF_r^ z`S{q{#1UMwlH}$+rfa#N8<%zuUqKwboPL;%J?H4ztv^Xus{HRq=^u&8r8Ft+wdW17HE7WC=A>wTYM;u zsDJ@vZ*&D%xYn@+Ec(HXF|9O&#}wifxuK58$Vz2NiDL;A^c&_xi=oC%gS;^EW_q=s zUtAmt^W9Bn5LNd~(2@3m*Ud%&=s?d`=hO-b@F2$p>MaB4+BTJA9RQsv!yh{<9=`+W zWb^`;Hk%~f9)OB6z+IVu)+knn&Gl)lTY4kA<<@eNfu9&ylFQIT8r1yXpn3SSZ=er! z*`*O_l$S?zX8fDZT=!TKMNBNraKaAeK$F}opD%1=gOf2rZouDt^`GB3*#inE=1=nL z$S@DkUI79Pv_88x$c+o!ie(t~s)jL4tW;=L_4bR9xiavoVozCTWrYAjBu0_Pu%RnQ zE-HKKdc2W>!dbw02aZh`RF**~-X{rS;Xe3P0T4^xQA&(GNn$r@+l7}BBj(b-pZ)=d zd|xINly)ShMf_y%n@={!-txlO=TxM?*otu1 zB`Hl$nb&3{=lYpPKYu?Tze4}?>Cb%p{N}`C(Std^bG8pZ`{*gl7{?N}AihMii|d*( z240ds_5VN3#hf_rR8c=P8eQ;EAC&e%tqPxs8K3Zyf!{$8b}-D>Wm)2R__aUw$Eox2 ze@^R#_J7XV>o_Te8*;0)!bO1LNP$-v=iuL?%96P$~aMkC~@$PmX?V30=Tm)PYA& z=4=Ox|KRC>e_6|KEHW!Cve-|X#0m+R^y9j{MIQ2&F~`F*)P z5I>l+5vQ+LwMRCx5ji=?A+>VS8`pU zp^@8zs2?4Z3H`u3CSF#M+ess({`T}J!tF}QmR(OORQ_*~to{>5KiNX+;~yLocp0!#bGiC@@1)XA z1hD@f-bPdfSB>) z_0<&Ao#nSC;EAsc%QI?g*|*bf231)VD7%(~V3|o`!dst|uXn%Ti!V)DpS+&Esy_wi z7bqXwsVrR5Pg5)p!$|KC&RbboZB*T?D;jZkY$L(4;iGR3P%3Mn8v61=4nZ^Zq}s?I zS-`uI=k(mxA1c}kWM{!kl`HKh%D6^DXyPa@r@W;M6=CP67U3KXp&X>V5_yi1-*Gw_ z)le_NUxR3l+{)M!Des^%XKGbjnunZ+RT0sN7i}ngw`X`%ifDO zb8p%jK_86mFBc#Sc0H&`4l=IfR7#QIGY#ZS=AcgnI{s#*UWZEEqM3w=Zg^W8Ok$?< z%H3Du**{yl=cR}V@b^fFg#=%h*3Ej4c1qXdr8aNAkI}N1_f9s9Llx@85YWghroU#< zeLGm6t2>}#8a|kFd#!3^kHZ?lMl}S>EUq|DC4-1)%L-@edBjn-pV?M`tPLpid)T{H zmD$j3)ISv+mhQ9}$;VSCH`CFkL8lL*{Uwa%Cr0}|9%s_u$aU0qimn=oYCmLz)JJ%_ zZZeO=O-%C|#J`v`Y9lh+mR#a{YPZq1r zrL2nBr%%i9m*L*}yW&_g}F`s6;E~Fzen`8LqXrMg*;?*%UZp&CbY>#9mK{ zhA4VwrK@2&WFxigAG!87Mq5(b1YF|QrB~lgF}fBPJ~yltKW5i=)}KK^75~ZtAaGq# z@1BJeZYU6yIhC8iM?>h62=4OtB_zp$%L56hX@=YdU4#8h(QN?SvJh$}@Q zi^oAic>T=%jTf(H={x$W%=~09rBcC*b_tfg0bZ!iW5>p;?PXH$qqEqR7)z;Tj8)ak z?JLH zrg(naApkwZ0H7>hHkcwjOF1QZu{R;6EsPGaFx;>^q;R5MF{liPP|sFU^rvyt$=-O< ze6SE>q%?>CxcZQ)98FZH@M0_=+YPMn(wJHJtYlFQ25 z?~`S0r09c+I`G~we9qzQX4Qa?za3>}D+dfyt6~z~1YUZ&^>7A*$LI*MnHcb4FWI{w8d@uTDQ!@6fO}Rt~U(K!P{VlbDh{ z7Pz8Q#{`MoU0>!V>Bq%QZC@$s`o11#BA86<6G+ zFbTAkUa8qbr!+|FU_bPDCr~OQ%|sV)3jUcS6rH5{U7N|bnxt=qXBcLFGzcb zapiO28zFf&^NCN7TK(=_dy^Wc?@)6aT((;{%*_tiEi#qq#J=BN(p0WIe5>kDZb9IV zoK13Q#G=X}7*t<;hGK$1W`ZM3xDl#cO0~yFpF2#2`X+5g_j6c{>~Tv zm;3PoNmEC?T++a-8ZUaV&%LS&)amIeJx8X$Qa_aHkfOowdR=8tNU4H zcvaCFxeZrWs1IhX)9%8HVqnhQinX?GIa;xnc2mTsk+Ie*6W%y%?E+rS*4ij~g?Up` z&_TmSZ0;@J+%iip_ga-hfmAwmHyxI&gV&O@p&Z6uSR#0lpta&ul>H<)u#x@@8c?&J zK-7z0Bb1exl3dgR+2z7bmL@DydS6;IRNr1@N__fDYe)ClNT3S+usc=-tC;gSR5H6` zW8{1Ai4Nf2dlLy<%97aK>v6sesaCClq$_|PAP>5>^-f7=rJbO@5OU0h+)qmQOs<*? z-b0|lYLeg$aW5BbMNx5b+gIUREN#;Ux-cKlW9pd-wj|=0C->30?L052u!S$)2xkyt z!wcPnVK!YhD&S=H8s7~9?&{#}U6aiwX;)I-)3rz^ag2`|n$3!&q*BASjIqm*P-qCU zc3VZZUKkCr>L?@2Bni=-V%)hT7k+~U?*#*|8YCK$^K@9jh$Hz;9;H_<)5@&aIK~nN6awaI4T-sS^t*ue`O~4Gd)< zEIJ`xqINgTMk${EEhAY&-x!PD^NcCkbRCo-&y3@>B&z~dG~OX_1>5jRY42$K3wFUQlHXsx;6%p@+>4 zYkGqEThQ=UB7_5Q&{kAa2P2dvCi3+k#ojfM?5=TMTJ(E-!ql29F_ojOzCN{?T%j#E z7W>`65pt!Y>^u$F>J}*u3aHKO*B5kuQqvzxE1HCd^xy@yh4q!uga{SoM;9)wmZ3;I zGOh^S#p9T;FI7f8DXllN<=ESb=J`7mrb*?x2k3YeWI_i>RG4#>EuF%;T1f!-UD!CO z4ual>j~`!)Iw{Fv{HdQkP(?nxU3#aLiRVVEc-PBddAM>sU#<|$*%F27WQ_zJbhFfq zfG1KQ85n_sW+z1>20v-wp9SRBn&PT)WNn9=2J6OBy36#bF+7FUZ|X05p#FMtD}7KZ zVeQlsE4`F)6TTr}$)q6(nO6&>>6KWV2fMi%6T8kDbe*-zdK5RLOHM-@_EUP8&sRp8 zWH!n1kr55p6cP>SX*KOMWv2!C=+nZu%l+V&@OrGnLjZ)0M}k#V9}@YrCDs-o)H(rokHG^r2{7YDK!xvC3g4n%3*Uf2G-8uU z#Z%(zxt*oV8@ySdC?m?0v|m{^{Og5zTdZnu*msxyx5F?s3=cScmZEi=-u&w-*Fvi7 zCe*-sY)n;YuOr+M5KmMx;cL+R#!e4Zs%4DTWaeqtPpFzQ#(jXw>-AIyu9yrxKD@5` zCQVu(9ngyM)-H+&Q}vU@1%A9!D$*+OB20v}xPDvSS16cRe0PAsDnGqaT$rq1h4oAR zsRN3a|TAKlpm~3gY zcC9FlHj1z%fIbmaIx~quwKP}fX}*h|d zjmmCBiNuP!JLuKASi>+8DMz=GAgGB<^;Uu8_mO^9t0TGMJj|R9+5yiqL3u3WZVDhw zRE7$^H^@)k5D*m1K5)_K3UePVO1Gt<@;S33c;KuOLK53b=40!EJo|G1Dh`K zNk%_wu>B1!JL*e5cS9xs2m>ohn1XH|p5y-}hkpY*nJuYr#^tq>o1LLBi`lemUXFFK zLj`Ofy)(Cdh^oO%?PsQlA8Me7B%%EMUb|sNNBYgO{CE9dpAK;3WHo_mbZj!Xbi2Nr za9J0`pCG8!YUS|V3Np&rTZ5CgPjVGSTgn8=hF4_2e}9vhjMV^;T&t#^Db%j!~xk88taI7XAD% zzwmH*&8o-LXu)PpWJgDTXAnLZ+Yaj*ZF5~L7Fc{=ry6+-ePcy_550lIo!J>r`aB?X zLU9sv6_f|xRP0j(p%vni;xtK~>$%{jVBRqBEpsqx(HijZGVfR7qps!T2L;QLn2czZ z+L-1Vu1yj0cp=Q;Uv+~)Y#%Lw^T+WwEO1=hr*gxmZe1Eu;FJgT=d|5JNerE*vD#xy z;gsWbyYiISv)>J5P9P$`_iQJ00GDwS{{=tkt+2yQa3#4|{$RrFZk8C;;E9_y^gUb% zBnVDT*?tD3;tTiK!e1@_dQItplYJ!NgTOV=L3+yvI#p@E0=%;Vxq*u+3^75sfm1ap z4}yAB0~T^0=gQWWjRkLD0w7uDeVYPRU$2$Sm?6+=K5z?kV;0s=nTke+fkLLEe&V`i zW+Vq|>8-uW79DW73|S9o_uR9lt+jzqVQiqr_&o?eC)(w@*mgfMiM!Z@_OtV11Mb{m zXF0?^U=tes_6oI-TR78T3T_4@=W&${3!_yo^uObsEj~;g9EdG$rZo3a4!pW&C!Wqt z_P|CwUzH_d5b(5yk4zUcp=kePb0!dgJ09VTlp4`%DT?66!2YtEopu^N=e{46{ATV1 zubMCjFtbwwV}<%VpWmHGEC9KpMG_q(m8Nr-3PeJOxh~D;$Tiku+@26^oCIPgev4S* zz}WWy+_A`&wCPg!^vg%FH5L42J3uNR9trT~0t5qMfxsJ%?3@)c$ zR}jP)I8Rzt6;UH4JKta~+{nG%?aTvt=|Izm5 z;Z(Ql+xU|xMW`h6P|BE@kf{`*GKa{VA#;d~Ns(EGD4CLZO6HkN8JBq;LNaF_7t8PZ zw7=i|?sxBJ*~i;){GPvB4~MnZ{kiY!zOM5+&-2;^!f!MOG|YXUCT>2oFwher6xO5< zx@!Lx=MyY`kLU*~5r{C3n>}T@&k)k!#v|I}sEYRv0zp09BFnDtDvw%?MqJxuOn7tP zI(U9yu%v#hVeoxWMPR+irfQZz7O#6gH}O8rt7i+@x)xeiv}OjhB~-U|MC|)|cl6kU zk5lI3Q9S~G07^5_Z_LM@P2L@A$vsnd;hwyw|3nG%*~|W@Y#-f(OL7s@u83N2YI^TF z*0@d2wT?GIx8b_%Nq47kq!!>ipdOQYaIZXF z-3}YQKdLB>wES6#vLRw4r0{3ft%zIzCVnZe4-BmWwI`$K$8SRBekK@Ev!TpMuirUM z4jF3J1#&YOHT!HUF)n>{*sS^m-mRx8tMe0!zs7*4z9tceFSa|nRS|)be-`y?Zk+D= z9qvM!@W^x}h5KrY!X>>q)#tg~5k@At$FmHtiSJu_w7|$rwS-4<(|^tigzOw&A_%GpUUOvo*wY==^o2mD;nH@62p?%D>}DEHVN(;8r

=W@xzi; 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

G!{aa*NrZJzgvtUm)32%IsLPA%vz=%B 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

  • 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 uudGK7Dq{ zA@tw|cK$SW5%0n+z=)&ptns;+93NIHvo{xwT=Ubo$Y?78E!bZD15|)6)CSPBe>W4t zR14Ytre|2DciIyZzO6Vm2-z#pJx{e89AGJdt~4ceTl?6w?};A%GtciP>Rg&awkF!r zHNtBb{+#;0;MTs|hRRk!oGvn>BI@_4hUA|F-_CJ9?@$G74JR&dZJ zT*hy{>!1LAoYBSN2eo%_v_7{aZ!Kg1d-Q@z4h$i0N$ow;mOOBq17pl~ied!-*(>jM zV$D$K3qmdXjWeIy>_&FXoO1Ul#i9H^#F-wBKt?TE4@e1&s+9LO0BK+Iz-+cVy ze}}Mm+|=mYDE9fVG7x!r`}i*fFK};daI3)cod{;Jg8wMMu9FvK*T(x`IM`8a@Jbpy z6d0lJJy;RA*)3n;g?46M_rAgabJBJq{WKhBmFHqI@cuIEk8?Ht+81uT`F6^4`xfNG z-l8Qd1%R{FKoT8}eF1%aj?Mr9*;EVJZl**RYCvX}`ScHYaL>$L321xToJ8 z;m_o_(a3)QK~#T3W^OwXh3vrS$N7qBh2FT%N7fj#;gI%SuhnXG5i^6+BCMOR2MNZgwj$Xck=D0fjKfv z@JLH0uhzpD)(vUpqCnmnSrFi-8?`bgb2aAc_69uCCXAxBZ9zKCKAr6}^StmAxwV7TndEb5e zP2pyAm9NiVQ!Up7lWg;=gVa6UmB|Id3*b3W9_GtUZ_{ zY!&^N@Ds=|9?-JhiDs6tG`ML$kXc{`H0jv}R-zS_3F;wv@+cRlSq_Yds&vS7lm;Ga z#Y%y0sjheJ+VQrnJxQnETu-u*K=qM0d8gYxgr+0t1kahlfcPI~W_FKgv!r@a zRqcB)DGrvA#uNS%h-QpX@z6?c2lfU`4*1faaQJhMA#5SemWywZ#U2RrzJvRFzrLCV zg>WvsoVaQ3ahJp`T)unW!mf*?EN}Jgrlnugx60mYkZB~KjN2iBm)_w++?-x9-c&g4 zwYhu)P%jj65hV0&@2Yf7wLs(nOV2KFA!J0vl$1P;Buv!TZ_l|+q^uckoBCHEA`;KE z|1++5FA+2vqT^C5j-u6of0?);569ru@f0vgz?up<=}Q$M;w%}3S$FHhG;TgLM`*oo zn{~d75WG^JI5Hr->MPF2ivrPEY4F&N!LC+)-?#32m8TOo5t=(??G#0_^$Dfz}h@=U}4w;oWo4zF18H% z3o>5ws7@GV?>aw@(>5ifz`v$L-Af@eZVmOVr1-0IEBSYZKy9@nGwwdxtP1sw3Tr-sXIpH@An(VX z7yIi)Vu&weJQa=Jw(KE+ytgYdt>eN#9%ZrMQ%?Pc>Fi?$ z+aE+c5~1!>pW1t;V$WObO4Zjj)O}9q>{BgA+qES?$-ZnAkiizOvLT zckPHywt4(2Hm&&D92&a@6F|vc(kHx_MF-HepcGT5mw8;jm(zx|BeIs}kIYVs{mS8} z&!4`h#3;%^%dYJxfPlZ)K(92j{=PwzrEmvL>#i+R0jK#6JOLDll^^`Q%o}x=&V-wp zDoCllej@k{NWRcItJ!@%nzSjg&#OdgEtge{S9=ZA!53eh(SN^yc<9jH?#@WRp*MP5 z)LJU@;@d8{s>3-h?vvlm1j~H9r|S$7wTBNC6&F^=M-b<|t;YVXD>5#+ZHfHDAot(Y z!pqLPnR;&z^11aep=m9n@@UJdFP%pCC+6$mMR%HpZht)uQi1>$b`Dj zUeL8m*1ULnY3dfgA>9!?NCnZdq|kC%ut;y<13aky%4c;_ze7b)LzGU1R{D|74j;3C zr-+2|%J9URl9CS5*#iNGc(EgOBD)0zs((1ja;^ag#+&7_J-Rj3@ehtg%XBcxfZZSq zwEx8*^n7PlAx<@y_)lvpb{3pWMXiR!Iv*3nKRO8SUp~ty$~AZt3!Xz@EJyj-clCB! zy{)te!ZmzmXHF8d-GS%z&uCDZoOV|q>x%F~KQyUCsHZMa*5zpSGA;5ufN>c1QU zY$ZRT!XDb{=0D@&_hhmIO9@6#rWM8GZJv>0;?_a8WLnJ`nDokDUWJ|X2cF;EF&)#A(b788fs)vrAns@PKhu35oVRvs ztn8*CMy-!|y82l3M6QQbOLNUkm|J$`QFT=Cw(`=)T&0@ZP4?wRkP?0hh(3te_xD)H zkKR^u!gm-yqN|Rm6C8B&@_*HM;9IjJ+$$;7Za+JGigr9WCpA`y6vsss)@7i95kj9E z=+Rh3CUYXoMVet^tzU3LLlvkvYH?f+$ApAB8(wIk)AfQemu`^bF|Zh!^(@R^d}dFJ z)a`;u)J{@Kjku@+7X$(BRiey4An5vNwGrhxlO5(vO7C~iJzcIqknZvzdb#8)+3pO- zH9LO~wJVf*`KGkSi3DN+Ob6j>)pn5dXB#sO4lORI_$e3XoY;}=^#;A3@z+Or+CZbZ z85_$Rf{9_Id9VF-fu*O|J|mts+WH*~;W*!AJ=yXBHnbv)ebI_P>WPx1$K4M|c4C6> z02xQpGNpc_T)d6x&_j#3F^Y_ZK>85ko&2B22tVqfbhRmhxjCb`k9#{`z4N7QGwHbR z=8RkL$hldHRj$%lu1a}}np?HY;$0Y~z9SHIbLmWW&BY$g%U7@7YL1!Fbc5btaF}IM z(U&Jl<7t@<7Y6gcTr7ay`1BqT4F?^sv>1Zk;IU~7p29{T7ho?74nf<{$I~$|@TY+& zZ2z+KJG95stUHP#QU{r{)^>`nT@}))h`esRUQ?^o#%SPeHL6%nI}?5r%6(07K?OnMV3XW zjg3{@(igwv&6Tb=Y{9(=nwnv>Qa^l45@`6hIqcvvE1G4I1jvz_L5GIEtFYB-92?%y zugJWk1z!zAYr~*v56n}zc_piJY2NQRW?(79z=mM^6;?!C2CVZPlRN2CyCax}1jv!i6z%Gz=A5$p6un&l~G;0AVSl(xNfkWzi)fXp9_ez&SkeQnemv5UH6 zx8U%?Q?97iWUsK8`Y%dK4?Kr5Snunvflq@L7ReR;ERdib35|J1ZeA}8Qc8<~eOUhc zn>4Xb%khiOfgkYemA&Fqw>sbb+GCaH>|s}H;fHp5Wl>*PiVU6pVeH={X7B|8HY*>9 zGp6b+%(+Y}0c9ke0YBL4B@02|KI2yO__)ma%d9A!Osm?7s`GlwOqQ z?Ed(P!3LE%Ke?jv@>7mqCWp_b#JlXbgMiB;9a1g5;;`CqqC?nxf}3xHL^apvOuk8P zgUl~#jcrz&j7eqfgO8||0zziY`P%+r8>`aZ_8k|h>ytGC4L2{=pT_dX^|h1R9k-DL zp!qLw{iTCR%Xn`2M+P>Pqg#g=UX}!!<5xShf8ZASkq^LamPfi!gNi!RN{35bUfqEX zGy-Y;E@AIbc~+@rC2~FW3A(R?)1u2252TJFXzSVewbs&w^jdd{YtAtxnF&vUR*iRr zbb|Bk%5$CiU0K)ie-ZHN%j?Gn<9(>z25vHsu42Tm)z!K!=db7HsOyt1)}0byKD=X7 zpLjPMe*m;II|x3*_7>vS>{qt4*r(7z+;S`ezOd#xO%8?J&qKqQ*li-Soz5+*gNg7& z<%2Al*%)Z@pvP@*Al4klJh(cZ(^_UnHFY*B3lVNGz=yQA=Q>7Mo*6y+)m1$pdV3(? zE5}j!bOHK~pjOhrODl`fz_T+9ujB&Lci9>j>yJcN^Z)QT=E11BfzrI{mf%@ed8F}N zje1PuIkd8(LLqc9`tCf~H_ume5E`HN$W?Z&8dk4&X09xXtql#7-DO<@2l)l&?H5J^ z>-H2G0X`y|@%<}ez{uL(wyx;t>Pi-jAMHmcIbNML03)_S_k+nC6^o$2zHVVuGKRH8E1mi z8-s9=cmBfVK}T5N-vrx|(!k0u@aFdaUh~I(^9|wwm4-o_Aa4fCu=^m{zrufgdKV+P z0dIm){E%SE`AQaC(A8V-^fyWCaryg;6u(HbFnjj_F-`)?g8EaD=2 z+vA@w+vRd)J;LJ~vAX7SwM94Pef{Lj9^9JjpG|8^)l#jtGPos5IPM_YW1@}<(<>pE zSUHuN*Z8*TZOfaw6Q$Pl-b{xDDxxpxo~*GFrF7W+TW4h?u98M|x%G+UMk&_&*qFu0 z;)yf>D%c!s@Lp=MLM>aA_a4?n9E2?592wSq;G-sT=+zx~TSz}lj^oXYY$R=3XmoT< ztWbIKzyc9v=`o`t31=>6E{ih9@(7x7Mf2?$TC1O4y>Th`DssbVq1M0l|J^u$+8b*v1zI@b8?GyBTGYDk*->G)pAo zt(w)X{u#`Vo0pIKCB#zWb{Kj%}Ln)a7ejVNV!#fNTH2i*?-dSIZ9pi*QyoS zl8uL%?r*~f)vQb}Td7&;+N$ej+IT7c7oDnsqER!y7Br1X$K?~0-#3|`A*iSstEf3R zmp=QEPf#;!d*4|5KfEKp|Ak5ZpMFRGBg{MT9cF2>&6QH<01Nz|zxndBFymyFEVGDL zt0Ox{U)Ba~fKE}NKR$z(POY3Y*YSHOC{2Id2V;pn{>`_A(}y)J^3-56c}(PB`Qdly zSORa}Tf16i5C?&C!hwlZTozft+^!NcLT;&Vge99_W~@1H2Z?qNt_s9 zW!2F(xu+BG^4)It$Xzhg@)FnQ09>-jI%(@&yi!89nY9Taw*sDlN+^(vgq|A;+H$XO z2sbEQT`yW&cPx)t+h&5C&uhuB@^7}%caR_{OHnY(*C{zoGU%&jq*G4+Efs0Hu8F_S zpCezZ0-|COuCEbJ)#~xjJ!IaLsW*e~g($a;=_;Zv9rXo7+Xq0;uOnzb_SMjY&uQi& zYzrU>p1z1o>xJ+}$*sMORUB&o7xEOov2W2{=Z|Wj31>xsX3-msVUopVy%`6$ij0l( zN_<8ykeqI0_7d{11Liv)#Y5+YLe9x7_=XfSp~svn3f3QG=GO+&9JhY;#0TlRRa!}* z=BgO)i1wzL#ifgo9T444|7IbHlb9F?xLq&%meKKXtR?(=a-lcP#1T9kA+z-Lp`{QL*A678Op3<^%(l z?7zYlG~c;T?robwQm!+9J}_6)>5EW=HzwP=PBa8&e)Usv>Sen(knE}q*WW?|%xlFi zmS67s_O?09g|hDH+b+({DP`~!%GFWBBVy@Pr@o*lgKuHqi9gb7-r*Vv-X|kco>Wz- zVWKS4U!2Q)??HFf^Gy>!?teFD>?|mVms}G7<%D0~xHfT=WyOnwO=2fzvjZ!_z$?%RMW0Zek*H^cB1V1C{n1G<1JXLjVT5^ai1hNK$AyQ~L9G#yEm&T0$<~w4zm*lUWOyApHVtb)5l!5)Ybj@zf zGfW43-3I(9$GY0v-z&^tDx=80xAmpoX0ztSFFOL;AC7@v!djAI;DzBoKn1ps1X!|l z(gF7#v=A5{lv68Xs5&?Lq9q(GhHuW;=6|;DZ!xK~?|0CpvmU+2LufnbOt0C9;#=V$w=hl$$MDw=6ywT(l=;c5U& zzf(jXUkqI8D?c&SDg3Fzh`Sj#=o%8mG<%KsJH)}n)7u(z@^H*%Y2E_3E{A zRmA+g$Sr;JM%$;vM>DBn;zmz+4XQSSQ3G^+v_$;CJg4^X4t7rFyRQDYKIQI#*y^R|S7y-`^xGH7ltsa;$7IHjT=AY~jSa+lxm>G+Gg-ZejhTZ2G zA(RylUQB3SkJQ5L2--95W5Mp7)nlI4&b1__a|4)gD=OYo;mnMHy zt>=8QncMl}oQW=|EzqOOeKT(;cGPId9@F?F9f596M>)iX(wO2z_n0qMUObtYMv+M2 zva1&Ax4en`ZwNY;2TN~wsqiz}1!#JzAuoN~(?Zv!m&MMnuAHb2Xp|~dmPt8ocvZ8a zUpht8K{(Q|P!W>#%DKcgkLVWdSX2)9tbQ_P^u?4Pq6~I zH9IXO_WE=%7%U>-Im(#U(_6u4aPG;w%qUpN)NC0&Z@4siJ{LzEzAddBx?Nj&cECD&w(<jWFEk2MbRjRF_TB|vvAJc5=+S8^jofy_yt{~Rxoxl2YZB&2! z&Ds2>?yh?b^y81@nR30+b0xBtkXPMz?GC2)-S8AXRbi+4dUN)5qj;gLc6AADgI1AQ zd)eGj;9<8i?drb7Z$2vK=o~BzcM=`QR7v8gfBDTPga(66H?fEJx|M2qZ&q3&iFdIz zi|C8f-Cn5ua$F)KAwqPIGA9%9(H$se#eeMbQheC=x8Qm7&T(PwG$BVdV%8hAHS%nN z*Sg$g3uW5I#WHm-H}jM6Vb(^h7gUM}1i>$*Bvm!+8tvQ2HvKj0lfFiv7Tl7%?4gbp zvXCGplU{X)IJf%RU)}EwadxS&P$-vqE`aiWlg%Y~Ik=fT*`h9Mci3qxW=+}u9uWxQ2 zZ$GpLN4$)XCK`16I7Opx{g;AG>AC|>?ABm>hAa9!{k^zM%k8Us2OrU0av`ac)fwfo z$JAX-Xd`Mbtzr=uqRUip=wKRIk~g(-n5REP+smf(tw1ocAW7RX{d*S3d1O8Ei@w$g zq?+q>#uVSwMV~2rb^ zkPqagoi8&i@)($I*a_C0E7y*qS})voDZZWE@!r|@!vgWdYE-FL-(&7^6){T)B_Ak0 zR}*^Y$_4%A{Q?3Y&-gIoLnCNoYX^z#Z=B<}@x@sxo>-jn;6s^R7Q{heg_aj?l zfMazH8633=w8tztcyDnP?aM&+RA*lXANVMuIL zYt$p9B4=8A(p%T|UnYIVrA`v(c z26>yk21{F!#NGgV>a|y(K#9wI5D8hEy%QM~HfDNw_p$ zKI6eBK%?}V6bhajLFM-P3B(uP^~g9ozuk}y1d@D}gVKrHy7^%NQPOP+;x8U$stXGR zo&s%W;=*o$B-5MzY9ALGghPC#Q^#sthXHTg;kB=I>?GhDByH&9yeZjxq%kH6P>>mz zp?vbZ>e!m&fL02VDz!N6R38g_FPvtnS zLKjq6PhY+RZA$YRA$V2ASeL=XttQmW*Ik^`# z|F;Gs;%crmvXSO_BVT>u?YY|2_-_IxIbpx~JWFaV^&VEbNL!1fmsTFVP1A7AR_mPJ zj2<7ZOezey$5a%e{`fYKwf5G^KBppc7(~wTL3x2qr3(C8{}9s#KbC^a?RextA#u|J zx2xk2TY~M1OS#fi#dk;_EC(;~oh-d!43)4r0!UJNWhYubT-5TRk_E8Au*F%V94gtv z$k}V&KeVkA*C#J)&ma{{kIg02iLHDQ6Aa07X#Mj_q}b4C)6M#NNipu@68h(K5~zt+ z4yJO{ewd$EIXCu9!;Mf*SEs)}O>oF_z4a5!3+0$M?fXONZ@;FR9cf-xc;(z5Q0?Yf zM>(_VDB>TSU0*#-w0bTnluq+iI^Jm*tm;O!@~jKbcC$TM;&yUvLqVCjn@qyYkOg>V zKA|ufMMlGYj0pNF<4E;$d$t~C>L9#hhJ&aFEM2A|>;86p(Bx@RhD6fX)SiclR?9Ty z!i9j=G8yZv@mK3JjD;hK1&$(lroWzRC^lSthRRDz%vUV5(~F&P|K?_>#=TwC^zlL7 zI$l4ga&+s4$u7U-pt(NPl~HOhr(jnQrNA#{g@z1{h`HAzH7jU@i@L8>?E8yfxwFOy zS8UCvJ5G5N+d?b$l^Y@&Hun8Hf`thYh}wDYFr(T1vApUHnU)j&7xM-r2v5V^+rXYd zqRcrTl9@|W3%U7`xupBMw>TM&R+w{zJ4w3pc7b{xQO&8=p-0VDbUm^xOuyQ;PSzvG z)+Jv>)>bqs4(8oYS6e$ft?OFpf0Ai{m?a)}Q0NsCk#fx}4e}ApB-)9k)#Ta6gioe; z-|kkwsAq5O+-&^+OM%~ZO>N5{3~w|xM>xyt?Kx&S8@($5>a-O!O0uN(1QIJWKfi2k zD-RF;$5L~aVY@MY{N@wrJuKtqZ$3^X4%9R>*K#Yc-+xuU-LI-L1O!KJc9J7fZ5k^0~TH2V0w|QzapuG0x$BFOp+CNnPd>C_g zA!2q>>#J!cA66OOZaj!x1docry#??>Vf+VRE~{{}uzy2@!O-`H%u{KrMnwelbugEg zr|kLOPbbY_C5J580+;#X0)+e}A-eUi=>|{!F7W+JjIpUI{%kpljRa^FVln6Ik*9~-E9i$B*S)3KqrB`9l%i?@(LTQi_kouxI< za{zpNu7H2Rolux47(j@E3@uyCwtNa-$%3}v|Jn_gMnxo5;~74a@PFmZ5FAmkpakAg0 zholJgUq{1|Q5kj9!+bvz{$F{y`A_;fmsiB7q~9SDj+j0#WBeQ}+7Go_{KOllB$N$2 zvick@o4zJ6zxr)V^&r!dC-i)3n*>|UhaTG_(R0m4@6tU6M?<`0b0$8|;OPn^V)s;Y zq39dUmM>ChYJYr`wZcKGzQ4@bEZiVSK;c)#_QCdA@;w{Oeb|zmzbDME1||j0c{`Lr z2K_F+`e15Y=&mt>LRU*iiKH49DUmYoq3g*C94t77OJH9zsg^gmtjjGShr-jrXEm4s zor{;_>GB5mhbXWI)iMo#knu#Oo(GrZ+z3RdxGk6;Lfo={cFgF*#(=!;G1goDYp6N zP5@gI4fdmxGJP=P7U~S_&Jb-}65HRvOnXH-IN&eU3&6n6lY)FJGxle{qa>w1EP+JK zh+&hIHw``*`?ZR^_uX3Q^%=fdw>$F+7XLpe39K9sXy3pG5Ku+DW0FL~9ixOuJOb>6 z=>hUWgq)NXqdRvRj}cC5-1UjcJsNcAp{T*-Ll60epFlRe?^&2}$*^!oAq-`uNo8=nY-*uyt(Bw(`3Y6uIZ<`9Bzk2BlBdLNB_PN@l4%RU9oj) zJqg*MxvqW_ZCMYb{Gt8r<-v8hX#5Jpdwi*jccR3-1T>;f3IrDj=1)rO+THm_WKd-l z?zl*?{6#`*9op<2r$U7-BHISgp`s>F*7VE z!-jm{`%^6eeGotz-De8&1nj{aBoCdFcNC2|A^ z58s}-NS8>XD5y>a^HqRg%^?(=M&`(Au#bVwMV&P8Fc3tk^uZYRI_b+&jG{DyyH1E_ z8~$?dy6xBO^=&7=e~JAS*xcBbq!Ie+%zCt__+$wcXW8iq?yh1 zp^Tg8Q;ap*jWV_aYHnbk%ht7v(6C|@7U{M&x99kWbA#MEjP@PU2uqc|Tg3xA1t~A} zeU|0^T4Vcx+zqxgjw#QWfPB_9MO zM5#d8Dso;23>3Cm71U@riM|TNGd$7mjL$d&{0{7izoI|^mt z626OG-s1`T;+(T%Zw|2i*oxpW!N+a-ud;oBZyBPT>1k(R2k?TH4GWvaj~{Gx9w8!Q zW1j(86w_Lt=A~W&jVyv#e4Y_+*d=>6qt5@+d~5eaGhd?YU(nnYh6j9!3A@pdQV3qM zj<2|;YxFpfis8B0nMQ#w{G>rrFRlPd;0C`COZ!63SU%OBd6_rF_?%i<{&mf+bJ|-l z(Z#1}sUyZugW6e`f8aZwBc{j#$%v_f+zj3^-l#_>p|^|PaBO34e}$?QITGJE-3!Vc z+`5^tEQjJr^jC!U9b&ab*0c9l8b@NEBif2QM69FCtDY#RfQxCIOrFB7=0V%m$4Vy& z6plt?V_d4GEUA#VhC8;oSm^opuLz=_pJp{DO26Xu&1?LVaE61Hnd2mO6~EGGm|Jwn zh~>n4Lq4FCYliAh?;dGLwUF-W$iF=7QN9&V%ztQSr`VzCShRMXMncDe`sbJ(=q(C$W*prGwVfy%HR8z=bxL`^}TFTd<}P4(f&B zCpj)M`r2tvLQT<&rJaV$&m$s`hCU_@!38l|2dT!LDE@gE!vVG+yuv!k&Eg%wyu~iI z?X%iJk`hIKbnSe?=ye~hpdpOv46@s0O}5AUsswVo>c>tXYsgyvOmtfwB5+QmZs&B> zLD=eZ?AP3tB^+G?Os{8 zjwBT+j%wSZK#%oGc!e#t{kw`gfHnu|arKDK8!5<;%0=ti<*;Ls`^8@pT7R{6w&!@D z_^Yse@@QF=?Hq6dPk{sa1iYEfW1s+z+L^Y!!lY^fJ_QxF80IZVm?y8cLR*bNMtBhK z{hiLaLFfZe`w0UZe9_!T7`||e({nK^smsS1b4gdqfBH;!!=5g0Vv#ekf_6Q^Tc4z# zNpz;RW9foBVM2B?dWa{IAdz@{VXqI$xQqu>`L{KgT`YampA^T1ITjfh4rd!0z*+7w=hgf*2ggPc8v$mvyAFYiZzgNClMis@ z36!ZO^Mtw?+nnEgmAo$-^OZP(_sWk6TSly=O^N0YHX+rX8^vYyO`We8yauf?LhU`Q zHJ0H>o}XeJ;FcQT6*%tP`{3CqNW5=x9xv=4mH_@oX$vpfeb^i$iF08KwWnw!yDjN< zeiEm&JL0vgiC*yIep0831%sQDmj8rI6#svPAQY?z=C&tj&`eX}Aeb`88z&#`Hf9$2 zJlyw#)1Rj>hW_hAYuP3`{Sj6qS+3JK@%J3DV@Bj+n1>D~WLh$7SeZZKu9T`Qa38>K;&4*uVKOzw^vhlmpQ2-0rck58tuYwqr9X(*S>*jRtaE?C5Ml4Pmh z8{~n5uka_kRY)j7dPuUl1`||1DYp5*PN2*Nm!Xs0F0{nR8RcA>)(<~^A226Uhn`E9 ziac#s>vhTF#DMwVcA}=#&Hksh&lC*^(gQXsh`#EJwm(}c&y-$owfFO$(-v2EiI@Vr zG}0FxM5As$nA2R{2_KA#)XSQ5iZCMvr2?1PCjY_TdkAkzw9(v(ny_N)bS-l)0({wT33bP0y=$u5i8znSeG|yu zX$2{!-tz6Nca9>q(NCUKy>WFj=_eREI0%Rl-&T(aXx)B;H=i+TO)AZoaky;XnOE&x z8C~Y-N_4*+@rGbJY}KN?6d6@}veLH7hZ zCaVnY$^bOA_XKlhHVYZU-X*n+;6yh~^Jnk0>m5)Us5@Tx?e(FDgS#iERR{HBPX^W) zJpDYP5OQ)iuW(1D#_!pvMKCP2GpUr7J^iiJ4OYrkDTev;Uv<5NaQVZh^ z3mHcHpyNFH!|B8!hwZUTKkY_K*F1Z!Hu@h};y~*;VRSwc>i#(2q55?wvSBDd`+UuLXH_FbJIc^^hWiJ znvvIw^UgF?`Zm3$W#-Jr5ZpRCMQ%O$Tw8g}#N=Y$+(N&@?Z~rDk zCJWd92rkq1aPMH;0@v>gl^OR>=XNDsiu?8oV{!v-HL2?rz!JB68urd-IX@-tsq1AT zOg+fW2%FjgYwI(+CGsY=c{Q8H_H#I;5dJq`E-ZX?YwdZ4JlgBkp>x|*+cg$;jQ0mf z(udIgBNcGOfD4Rqno4S{Py4i?A3u$JpJTk*qvG0IAfu)eYX*fNI?*yIOP2=4qT}VJ z;#J;2)^iG6@@p=*l-wqY8&r>YD#3E!0Uj2mEXNYkcc({#XG^LNRXRIpjhWiNL@WFp z*oA-K`LxR~PyjL3IqpM@B_dG1~aV@=3Q#~4ON}pHO84k8ELQl<(Ogb!zK+nNmNr_-jl_!JKwf$U)ig&KTN&tUxaNL*8b!k<3pKZ zxyn}BEwFX|ANJles;RYI8--;-Kt!b1ERkMSK#GB=C@eq-y-P$y2ps_p5)v2Et5TH~ zDKRAU-iaiXB?w5DPJ)OuNmL+0h-a?%?D6jJjPvd9{MkRw9%J!?F-RcHG3Qh6=en=r zWwsx*cSrFdX>g{pv!GSeSy{~*TW(fJu#+Fz)+MNgM?io698v@FnTaT`g(FNUp6&nS zVKRPT*xRKDB$@+3Wodi}2Zx4fO|wq4bz}2{->cb0vjVx0QlB6c{lW{+x{0lTEu3+R zs9bY!)Nk$R5XSF2lrD3v3MFcY^Tg^{=*DNkH4EQcr6n@c{sp-{kWY`tfE~W?J2gI% z;DqKG#Y@$co5_%FluFI^nc&6=ZSedfR2^F91e>>6sm}*^Q(Mo08}`hLNbug2UPY6( z)p}0Om6k*EPV8Y%Q;x>mSD1mwgK+7Q9RaV^KAn8<<^=ghr|3Pnkw$r3ilb?#4s^M| z)YPK%f_}KC0#+@hK%;v_k>b5VaKB_r)5*>@^t^b;caf0pq7gTJ<%)v$d5EkdoFE&M?BMf>= zdqw@o-c7r@x8n{Fz+@N?*&GI{DSI7_1I(9EAel)c3cV$-0hBdT573^COlx$x{5#Y+ z#vmPSe}p%XV+zqBe=e6jp5g?xU`M}jce)t z_?!p*;IF!?>NYS1Y1q&vQ9r?(I)lk1rw12=MVk|`Nu*KR!c6zm<|=)bHU;@>RviKl z=A}z41jALWeQcyl^DpU`J^~^ND~*K}M_6vARf4OjK76A_XC3#=L$sB$6kDsk&bXls zX#2gO*;ifajHKl.NCTXkwc7q=PR%wig#xU0vjQ+8sU-_c`VQI6!v2KwVWOz+va z#Ly)n_`cZWQp~Q4%g(Wl<~jt-G4~Fq-=vhXZO!Dxmc$=N4Jdr#TkFgXorlzt1Umv? zCm3yG8!P~~v{T*o!Jal3wYBPybjn<_XcE(~3huS(*BOt~Zouv$#!|$-{_CWl$1p8sl^$KU~%#v({jm+mx?SH`2bdxOf>keBl|wz9|swCLhz{%a;!3FK6>CeWf_Lu%l&MGd-K z8f_5-h>#kDd(!}Hj1$RT;@yP$y_u0j;h^Ok=;d{zM$F=7=Ol`d<0AgKO;gv3n`j_w27jEe}`rW71C++_%`m@)lq$k8_ z8f(p!5nW^rF^|tE+FlbVGUR+kR?2@s47azg1Pf0oev4?J);28YjAkuOej?~41_xzN z_gBx#ucXC-J?LFa6sZ@q*+5R#dk`mBm+nEeBc}R;Z-rGduVvgx>NWTs(_P3r5$f+{ zR!c+fNu8zzV4rlIp9G*30ppM=pEmP^(dD|>z3tl9H5(Z{)cFO_wvw(N+%nj%WXO!u zfiEc|chx5|m=R_gRZm!P$gR9e&fQSd%cM=XdbqtgQ>9T@asNy8;#5&=k$1!ru{^ed zVE5Ur51eA1`}yJS$SepDRltt1hGzHs&{2gvw4LO}Jjk(m#y4@am~Xwe^T{|$1cY;m z(RK)%^r%T(v6)&N8yHZ&8psPj=e)4t9J5>3gvHGmhefc*m+ap5ysajUd{LBGDAxGL zt)cJZRb>yy0ylE~ zz8bwMEA_{>Rz*>aFdCj>MuCxBh?4STm=L4f?%6U&B1(hD*la9-pE8tPL@59nb^wS5 zpdC{%38>OETX2i?TUgH~4eUjv2pdnUP2D&McbMakwxzecSJj)q_X8xqXEC>Jf7+y8 zxOk9QUhKMgCb#FFZFsnM?>p!1SIa&fM*Qpvc+LUG4sf|GE-p>8LnqKcu(#m&} ziq0$8v^Wc2XhpuLLM<&`VmRTDw}4}HD%k80%(SAvDWIf9b)BclCv^#JJo%hMn;qL< zF;3nAa|@->&k0Y1gDXB>r-%<)QHvr=+(ya}&7_PuY-$2_qkgWmQ(Zm9#Hc{fEx9PS zqpp;GcFj(@#<8LsFe$)^m`tQdoRQ0~A%uySgY{zUaS+e^OFTwe1i%>ac3YL6=K7G4 z?HZKt8HsSY91=WM?gBE*5!A6s(Xs9|#cFR+M%JIewzcVoefF?ZC=gSPkwv>o<>&<^ zqI4N4r5h~$G)jLDh?k*G>58F|Nx6>`z-HJ@822tzGEE%10&4UX6ME$lSdJ(mTbX-Q z&H1J~sqh(}ScIPJEM46yH{>x?FHgx|wa+qf2=4pv);e0=!eBTZ591fKo2@U|eM0vM zlRY76=VFstN>QrobFX=Ulk!%wu8yuw&R-pFEx%<&n#xiG9H`qe!>nvx4R}Kur?-Xa zZi}EZ$jh{Sk~$Cb8UTFtQ(>uHmm$fjz-A2M+USyFgwV};fhC|4EVzu`DhRnTp?T+O zpWet*FtoBdVYhX+9Rmzi_@jQqses=3EPiYZ;Pm~(PO&1Cj$ne{WQ5|!Nl;EMJ0N@dGo2R{ zn}^#j*(wn$pEYSQg}q)ng*rcjbY-4&@KsfBs9U!WTCqo zn)Zd3XcqntujYksmqHq$+oz~k<2|Epq*Q)6bd@PfX(YzfJ{#r)wC@|lSpY`mKU7Ec zLKQDICTeN5l!UUdgy|E+4h5{JX-GH0Ta>)`8@Vx@W9!Oj+1g=Is4kGZ24GxQ6l0e!m zi*%ULPjm?}h~0q3t&5)lBQL6rF`;2pRdkP==GYIHf-97OP~V8~>Z*oAbGbp|96P}3 zE`sj$#_cKE8pO$z1d%|`fXH5U{N~xkTQnji=NVG6%y<8^YUS4znnO(Jw$P4a!J8me zN4BJjAHMYc>W{0s3dfeAXHXwO00&|@ zA9fm0kP>U<`?o=Tdmt&43=#=As!Fp4S!c$W9MmB<=ZXjvU*yrwFUNlB9>o#?ArZQpw{a|RxlI9%v6bV~NV?!D-?yMwGJD*)QTjGZ2_AYd_Kj5fVZT6ob#|k10zExNJ(Pq{EBg+m*xZui-?0jBU-dsvjG~2EAN{Zj!4# z6hjSkU7&lBhoskf(LkNR1E3s=hgt|}(&#QA|6UU7I^Vu7CH%tA!$i!Nmq&S?fw8_^ z)|9KSqA%?CK62)W?UFzw?l_PA zm@@&pmmvyuf4r&;{i*JM9ODIG4|^XMJIgqJ9Q|!g%+5Rlrde3!S9y9G^PFpUAeahb zC}O%fN^^m+PrEq zyJa4I@8|z%fv;$I&6ZPBSpdK4^wcn$HG?0jRv z_4%{|dL~z%?7|IdTxg4HYZapU#<61`{cg$exq1r=JhnVWNF}=aE&y#lokjz;8!rIL z)l4(6tkkFVsGml#MyTJMk=GeXWxj1*F<`UDz#~X>Q$cfSN@>t0v&dHpJg|nIIQ^#V z1fTEqa(is7s744wNjO$>iJ{~Mbdrvf0;3l7FgddTJO#^S&qAYjr0Y^6wt0TwKee{BwTHD@1%G=QISs6WN(^3LMPhLQZMx&i z49OLB-VwSBr9aM(CC6~EZDhpwfo;3w>uI1^@OiZ)^h$zEqYF;}YsHebS5Ut3=3qu8 zO#g8C906&$J~ z114^#`LC#o->yqs*^&}!hc+%<_lE}xJa!XGa-y}7wE)`mxtwdDiNYNG`t0H>oUfk# zZWXR{WA92X@RH+*Bv2sYU~~OpfVee;U(-RT`O#Rfeh0nYSj8g!g5X`p-*(xMphEyp z?!LwnLU$W9sK<6)VT>=sk^q#QoCZSV*weadR{~=eIa}$SIpm0T$;+z778A%o4=+t& zdp)^^Z37HE(l5YEn67f^d~~LwIZ(GLwe9ds0p3K zQR4)ermmWXF)#>^p!s{PNmnk+A}j{?p!G>1*~C?d@a8jGP>qE9ge z>E>&R1_oaW&(#1WOmmOddnhkry8nqqa~Zr@>gt3hB@oD`Xi$zkW;3zcKBh`(qpQ}z zv$FyC#z`->key)$JlQY6MZQLNYXiq-UOonSullGQ>~v^?`T+b7SjxseQ2=#u2{m%C zu$V&oe!DY45GBZzXvSFm(ZGA^OH;Yf3w>5W;N96qY`&1tqgiy^_IAT88!HQS0^My# z^n%WY?71D45PdLzc7YhRR0s!a=!trA7)XE-(o=YPm?hCaQS457Kg7_yi?t}c3*0cG1ollGX9Me*7AY)zLN%p1|;WW<;Js2}(|2cVh7TxW| z;zf}#b^Eapk0pjeT#SJRQsk(Ncz@>%nuN!Y;51^doANX2NLXZ17N z1gSm-lFj3xjH<>+8`BT!g;T0Fw*ixb%}-ZegP_3UK4)+i=}CW_Li8VDD1!Qz;&RtW z)dH*qj9_S|2jww&N3b`{ms)+Ad6wqv^PFL7?l!Q;9WkgiSv0X#v2~%NxhZ!CN}H^z zKT+ZQsPg_W`w=@(FM?j8Y4#%w1+5V#|Fb=d36usS;_YJ?pMf-^zGn}8x=YyGU!amQ z2Nn0tRco(s_GM|LPdVsSvZ3u@H9Onevzi!ccqyCeon1b5S}a z;rG!qHY;s1!52&}v?H(3&)VL+HoVpIltAdoc*<+aMjv5FH&_Fk#c{$>oOGe$-7EtR z?;>ihcA_n0_DLg*+76v0Q%TYoq#p)_KnPH^huqjb3}m^sYD^~ z@%3huIAG(lLYI7l!Ncyj7Mz9O6ZQAseXPgA66WELoS|{)d(2~#kmbrQ1v+T!ZxuSw zLW~LrhNTJe4sES(QS0axN`z^^$fMZ+%3b8KqD4fUB_kqY#SAU@@#ALhP(g*~y}I=A zKA_WPZkAAKV;6bMZd|nr(y%(dUG>xe*jb`Ffsb=$@u21~HF5oEPeC>4Sd=pA!#Q6m zp)sZ%y`QR|L&5+?CY1f|>gcXBbhQMke~9&TBL?um2W4;eJn1TWv+gXHRUenY1(q=sNMn=I-lssZwp*o%8Po~N8QVP00EeZK}xmv;)yRfiML*$Uuix9qj z2M_8g3qCWbnc|JxVhv&1sm)4td`-(#@)kOS$+Sn#4( z@AVudqrG_(LXZJ;hpk2`B*yJLjkhlndV{tf+u^hV*!D;;K@rqIE=R_9QyMlqi!y`s zTJCf)q;teIss@^jHstv~>DDYTa#5(3ZB^}*ql*Z~7buMNxCifkV_IXeTzJc(#O{0W z-T@2#9?MECw{&E~hEU=gq`Fa2`?U7jQ*-ww2b2-C0$j(Cqa%W+&z@AO^`;6lBZ?JvEO-F=V# zGp8}LNJ5TR#nDqy$GUs6_w&mNeIyxl3Lio#w;~&5pV_F$QBy*7Yjdd9PGY0p-jy}Y ze?UjP@1FL_mv<0^vgcU#j1ST@3i5-wsxHjl8w-^lC-pjDcFu#EyRHC3(ip6DC_m50 zF{kfu)gSsUABgyGVD<1Bz8X96AlqrJuG6l?K2@nf-pZI`_kAd>p|cX=VYVrF=^<&%v_MNcj!eBI z(Lk%uKW|a0WR-P=qVtek{AD~-Q9A+QC*3n)`*~x?5*M2)U6N&*PiXYf)WyXods+u& z=@C#&`BS@6R~gOs(Etnh9O9S}qm%9myMyl52RqRp8#C_U)=?s`D1RK8t`%wqNt|LS znPKS-XaQ^L=cSu<M}`A=m1#eR=VC}0h-D-%$g%F#&G?m znki;)-Oi)qFU`OUMO*V+qNw}5r+_76#GsEgZZ`hGbv-7`3Hh_PI(@@<<5jE%%qyGf z5mOCnR!V={f6*eHs8X_Zza-q0cNRW4(7HMYg!oXuF(sV$S`!133nni3*#>2oZOsOh zP5@?P4|k}pxDnz>;9N>TA7fo+UZrFD2Vt>jsV)#}ppc7U7)eL%?3Dp@Ie%pm=9JbP zkC?vZCQFp|+(4m|zLWsIUJ8tb^>TxP*Ut?n*U4EO;KKs%Hd4xy#{I0wd7cR*G^f{O@ruP^0Bmm$lWucvHqW4u7es9M={`{4j23OK)5FYxdE zNrwPzZi+qX9jr+`!GM!-*q56V)ggaqPNuDOTQMak?vI6)@0?izh{1{mGHLM#(5L68 zG&_x^S?3mP-U>Cv_=|aPmA(+Ry|>Yq{H9R!-o@wrmX2wUXWa=DA#L6(lwtg!U|dk4 zm{z!~!|Z5cQkJ7M{fwr(Ghfb>8;D;;)+^2;*p33*nDpRK_uLlbn*UI3&1H#uXKz8n z>SC~yzyH_0N6@c{y}oB}vu82!6h`3VlSLF;`jw^{*tKteH9tvT@Sl2+4!_&1F&uV2 zD8u5#sW+iZ;(7(!N91LPI^cu~PbZxFTv{ty{AS!g0#ZHo$>%V{X#A0hw!BPwI^>-? zwha%GL=@R2r9ij7N~~EZshWRkagbGZ`+7M*I1`8wD$_NvO;Fzb{POt9 z9hL6cH#>i=#Ch*cJ7*0z!Ke1c3O-#48bOE4f8F+@rh7)@#SM_TI-(_8s{9_viKxga zi&_i%*pMij_v9^-B~8a;#2(^-W`KC>M0%2C)RcAI*#6ar^E|HOm)?3dC|Q=cTrlf-N{0~=LEG62 z8|Uq5AJnGH#lE9nEypnOeM_$2w3})?hR`xA0GZWH7<7A{y{!MfW+>zvOFNG0CPwbV ziCYb7*t2?Zc6Vz{me;$FfObK1xO*7^$_r>`D%Jh1ot1*}f1fAf==mJ|FJ~xB zg`PF$rFbBx=VEo@=4iH8&VVk~IbkIPw8f}$MafP(wtZBQ0-dY*aXx$)YidJy@eR7o zUEyP(M*m0$(i+Y)K*bDeqxhimslW%VS?pbf!zbc~ zzLCE^`tEte@vLUzG84aQMRf``kU!>DJw>0a)hwsNCwfe#Vz>we&UH8uBXjE%lMtOH zipdR75+g6Q*UR;0OB9ZsOlF?(jV4z#E0FJA(ox~@(GgM6y6q-8MW(DznRCrXhrzCCM3EM&TqzJRN$<6@#XC^VvhN4mmh`L zW~ChN%#5?nb)x&9WIj>t-y&0Z*%0XNC({WHn3Mxde51Z8X|7keE%td^c7|4SOvSFh z^Vp`{_#)3$Xr%V`czby8`&G}g!PYCnIm>ke4|~T~@=^XTA2_P;phU$Q=WxX_$nfe^I?GGyE?x)ZBj5x<8rS( znezSg19^3P+FScno4CG}i{m{X_7F&wnz3HH>ciZJ`Pg@6$)gZ2vn2rrpg7Q>;d(%v zh(t7}ccCm@e?PXOp<28=>>mb+8oMlc8QLI%{~Ec2N6_tQHEi+o?Pl$e+>Ec)J zTeCx;vcueTpm^|Xwp^8v4*W*89O9*Qk6nqLZEXlv%x!Kz5U#VgCdKn0JizJIWKl0z z<0bv16X_*NvnQyED?DwlLnjcZ(pT0}ZF=smFMB1B+-ooPI1HA=7s_vphEaw%NgA7I z@9LS7zYh??y+bexF&W9P_KNm-n$!jmkV(Ved&U_hB$ODPr#bG&$G|ErRk!XRL#E4{ zxfRw+0KH{$;VZ@;KdX^0(k=X|n;Dqg?|xar07&F69M|r9;Di#_$3st?KB+AkU7l7| zb|ZzWoX>)rBPL4^kw9@bt#sA5&4a(+?=YodR0l%NsQ1zOBFI2!GNqzkdYC?c!L%#T zL3{9Waz9UoyKDkJsh5I_s*KO}dU>PM@3aP2)))8MP=b^CydhQT=qB^{e+Fp(?cwp? z6ix}{?_}HxlkXb}S#iswzHldOppS2(_#EMvza&HizFBZ&G`r9}af$a^{EdzwFSJaK z&6@L7ZjaeEE`|wyPn27nH9L_+GF&K>>pIur3yGL9<2IHwg|t7i6DZWiIFS|yvqvy5 zRYmQ)Cvrc>3U4Obex+{oi>kD~3sHZTbyqhaGjFeXKU@`Z?kFGf0Fw;+tqN>+g-9Rl z#+(c22)xov;2~2wcd1?Hj9y)SnPHFuK5D0w4YdZR4 z;T*TQ{7qJ0Q%rRGy}xbXj<2BMyzml9o{0wNvEwPF%xU5&gWcjUEq_Yq&Sh6 z6tWi-qqBO-{GNWN2_b*iwj2k|wo|xnZbP=t_wo_Ihp2mskW3ZL8qvsU1mR zUZP@76*KP(V>r9`5i3-$o~36nUg*>9yOSLnfbsuSp>lJRff60fl(Fsyq%%B>b1(@; zRUqdV8sqV`j<5+o>Qtk@NoZc=w^}Zd&?0jce{l7obgb$CJyz-x)98WQ6GsQanF;;44nx(chx%v6*`&vyHQE@sNYe&j5(NePYOw6x!?P9LjWOD_i z2P-hv_O3BXRva5=c(=LFydWUm8QK)}XPAa2tS_zI;sxvc3<4gO zJ+pmjR5U;1$?^zqa%e=PwsmdclBv0&adS)diVGLkI=`mMQPJbe1I?Pn8N%~w(*mv# z9N07}pT>x%1PwIk3f|fxhS_7T-uyPs?5%LWbwzWIX(7m&tJ(aaYI!`gwkY|2votF=nevA$}0(<*yHedtUg;#C;paA z<7>*GLaW^T&#JND{X!`|vS}t99$OMiw#44rR2Ybs<;s$DDBr`6H%RzHXTGeCeEq?@ z42`#k&=TQ=5{#JQ8H5>miF+4wazjdN3ds>zWk}@}){0GWr$B|>+)^G}bTy5IDr|+R zZ$mg|=VhKS^>7(-)%W*mUDa9=X+6{Ll_yH7E|(HU)AU#33U1%rnEbr&(434PnQ{XVE6e+dY8`M2H;*_a%Gderw2GEG zzmIbxkkI*gnrRbEV5DDVY*+5`NQMq+ZSNlJ*B{gsiGKUgGto0~&l4-1?fGveq*sl!A_>(ZIuqnbC#6e!m(vb!slcWrmKwu+JM6`I z>@9Fw+FSx(2*GI@*>$LXDM<4)NADptC07#$c-7fVcF90jvKg*%l%Cl~jkGyq1~h#6 z7*ObVNmX=7!8pCeRC}CX(7z*MI*f6><*pkxbM^3YzMgTch-Has5b5xAnAndsheE8A z2OWV7Gac}`7_DU0bC*^X9hvzWKZX}e4CplBO}EK%n#$U+a1=HlcddO>ci>3S^pKTT z3$rfN7Ae2l+w82CQ@3~V^SkDwSg^zLk-Sj`1=|0Lsk+i>Oxa0eNg$o*)$v_Yj))4x z!8p|+HLNLEZ>DPcPMM}_EahCUhQjX00qzNV%d6jl0f!6;PIGP1hih{bNXu>f7 z(sIPV{ZM7vAIk_aZ5&f^+pzm%$_1~weIX)2NN39A)q=;h8}^8f+w_;Y3_^n9bh%!g zm3?yfYM2P_@u1*Wpq*^G{~%O>AOIgt%FNPH_-?XjgZ6od9@2HQUVr>1`>N8K*1t8{ z|LguJ7XKopEHNoPC{f`4t`6Jj!lRJQYl1r}evKkx)0Xv(T}^0WV0fV5d*0N%;#X2v z`r9y5PcPJrYc42(>fui!Q}Y4~7H`Fr3I%Nn;@hc%0+LqYbLvGs}kNj+pzf_TLk!x@Yyi z$8ooKMM2_!qe|aQknpbU7b6&pDcrnyz0pcAh(LI)L`Y`4c<}_=>G)MM=~}~9ZUtE= zA!8pZX~er4%NE9FT|XYW4W1Y0=2qr^tl_#Ke$`PmWr!TP{uTUkeE1bH(MenPYkwkJ z`@aH(r*0wxZ~2#A{%Ser80!8!$oSsH$S>>@Y~2z*?>FKlyS~S;=SgZ`6xG?62OXR` z_J!^B$>?kEDFRpTYW(Y+E9^Sk>5;XGY{j7|3L8mPk{VFGF(*l_uxFlrVYkL}0~@Xs zwgJ&#wf6(q@@Er}&$M@Ld(wWe7hU7|7}FCY&?0WQEl%2Jula*x{P)Q4*KEZa%9j;A zho_Xd)t+q2oYPo3j?#V2J}P5fr_@$R*buciV|4v^P*Av}v7hB{PX$g`vH@Rj*@6IN zB%2N!@1Ou%1KYa`skYwOo7vjd)e?!4l2E(*e&vdi*G2TdUlTn*C6vHbHP)XPy?WEx z{eB1V>~(5b(|tb_DDc3r@ZoCf+IY~3q$2~eU0oZH45e&tX3-gI<~zrI=pCq1wY@5S zKWbx&s(ZI3_Ll7ZM8^dQiOVmp@urSVi6i{aH#H}Y&FU02H>Qe=EuM0}E^*0_t1MN4 znsPH(##>0!k|22P^@&5RX6E7bUu>w7Uu-L(Y&&w2X`qa=sn_iPU^aZ*Ap3IMDRR7A zP3o{3r~ z7Uox9X0v%Nz9`+`pSuHFe-gGklo!y@(q7lpS~ywX9@bEQ^V_w#r+z&H4>hK9*+&0m z6X(${@syKKhV2uFz)@- zke_%e;I$;#9^As-bMl1aN$ZQ(MUP9pe)jzOKB$0=i$D;xRr>QOfz48%O@s{v%3}Nd z=ILQR!=__8mZG)eA$R#xXXNKZUUThdUvW<9$j*%^sN5}WIXAoL(i;{icjj8U=;#Vk z%4k&woX8ediLFfLo1JlSnVBWEyEiq)UPVZ|wR^U!AvED1W zqPC?kOp|0DUO0VO@1oKMIjZ8+g(zO>r%I0NdTu!ZQ@H_o?l|Xmjn2lDf=+CEd*r_N z-Bg{Kmyw?pOm=eFT1NW@YhQ?7JlSXIaP0N$brF%3RQ;CM9Dk;A00V6Mn&^|%xME)^ z*j`r}cB9bYpn6-&xpwxUQGCc7##)L#e z5Hj(0)d|tEI%9hcc=-{o^lZU-UypTLoM^=9GfrmgT=h{nm0M3*DvY#6Wm-M7jZ#b- zzI?!I4Otll{-JPl8;B+Q#n%5AMst8hVfeQ@B&oh>u?NOml5|{mZgrabXc#B>JPy%r z&zPnS+K(~SBd8~yu4m7(O0bSFAA4upY31-R53jJ0)8?no>8<3Tc7%JzFs%|s=H$#W zQ)i_~?*~6Soqw!rm#&!>IEN`2snMb-icY3-GjTf?k=h~=-^gp=TlO6uWd2JTygk?A0(<4z*Apmv~WH%-@0jO)(O7)CM-LX2L%( z^_MXxU6JNA2cXYd9s9^lk=RPJz%6@&MJo^y%R4>jQ=r&Kv!PRkqLUQ*Qja=_L8AQN z-3qS?Na^j;@ouF&6dg}K>bRt9q_EX!=vGRkC}OqmufJvWM=3 zf>QdIY8^5t&&c%!$+XZT_8ok=bi$WXE5bDq6n04`zI>d3lL!0u4s*E@?e{_o95_+$ z&1ltBci@Vj!ckg4(19laI)%b$#+@#d&_YE3JqrQaQPC(!f;IB~=4$@_l%|v9M#yq@NMQ@mho24bd1U`wu||gDqsW|>mzrF?va zt#ZqEc_n`xyu6~}7*it{Q1>PrVTsH5C2aoQCMHkr`D3s@o0fYv{MMu%J=g^q}Q>@8EG0ytZ!%$ggktgYP9ty^j-IK-jRbmy` zK|}7tj$7efe<-~es$nDySY=^N^WhV#(Hjr@>PqY@)qLQ8?f>l>Qs>oMow7u`0pnr~ z04;_dmMCL9@=yeMYE%WuLA{mH{dknI_EwJrU`vND>w9en&%UFic-T&KXoOMn5*m*; zvHqIeF&Hg-X}?GrufCd5o{UX=vzqAW`oJkE2y4}6w@#6b&2qNHN8kxTxoP%Ke&hP&XtR-xkJ`rNpMYqK5qPN2 zG-7NXYHhg59OVQ3otlHdzQCA+qn%X0q9Z)h;n0vlUVi*`2lQo;XSyNs-ljD@tp_8q z#MGi67k<9DVIV~NjH8^G@}vvs^(NOk&wPX;{IxRiU?UCD7@vj<(eEP*T!CQugmObc zqhS0q+j4c^-44@Ltdc`$0irJizqQ_15fYq#k%3f`<1wKI@d0L-YDloM`vxhLt`v%q zpS<`j`OTZ%J=Ja_i)xux-rv?|`vIf5k*FNNI{*{~qgjDw$Si)ytP*Ku4}VmEx&)-) zJdP#aE6}DG;mQ{V>2ZBD^&Z__$Z>{n-x;?%(C)_|cBUl_kz|!G+Z8=!eg5|4!RF}F zwV}*@Zl_6XNOec7%pCYaiuY|MpuC z`yih%W7Lw$6{5goaEg|V8U=5ZWq|g)!7JVUaI_ewIG_nP`hXL)cxdJJ11mRk0@Z@n zD$Jq9k)+N5izyE;iKWl@6Ce+f+S2BT4M^XzkMGK6*ZuuH^m{7;eI=fM_1%0)txq+1 zka()_?pVt)L29s&$16`KBW20VRl$(=ks!~lhqGFCqSH3zr)+%!F4ti#tji`m6t%=< zt2=jH1=Bwv4SQNqRy|0QIEo5Ja5t^etEB>5Ya5iBEmi4knWZqC8^~wRS0rjtdS2Ax zTXwcS#Fa5qVn|yjdNGh%SVkOWF^+n8vM9b&@{Z@Zllj=gkwSXdbBiIfXY99(zbSXDi|U6>s1uI>q((0purZR&8~ z`|_e8I31f$0UXm0BqE>2aSxKcJsn*~VlOi{`BKQiVrjM1eA|hQ?t4KW@qM8Rca?Pq z8dV5b&i;=BnuO_)PVb>ZBVXmP5`cl=XJ7#7Tj0LV2=fcwsrb$35|n~RmLD&>=f^<4)&7}BFtR|QFpmoF1eP>jt@HiUWama| zu7>)xn6C`sczP~mDk|zzVW9&uYs;HwHfayLmY40(nuo-g~way`%mA{!EV|g zQj@3=7!E{x_oAAaz<5BI>ajbC{Wi@JcdYvqexC@PThOP5{~o&`ntuOem+@6f#{+c@ z^4g3XT%tq=8->rJ%EosaUV8gLH_UW#!M*mSlO1^^H|4>GWu--3W;pgF_T-BLW3J#~ zm#j}BU(Zqtr7-7$hLx|BU?}IG4f%X(9X2VnB7^0pzjcrVE@}P@7V#3(sZf)SUWcX^ z{LwNjd=(T=Y#2&QMqZ-socz*tqGME36-@!$5YysvZD*U4<>^w5Z{SOSC3poQYR+n+ zkyF!GqhdpEdavGjK3!Gl14;gzn<$t3tIQyMzmwYP?}NiDRV>uG3%y=_me%oW0-8`h zGm9>9gR5~xMmo7m_9bz)f{p{bk`@8RTqYrA>xi^ora^GV112Pgwtzh8l17mdr<@kN zjf$|*>Zb&CT*cfA`D-N@k#INY7n@tpiflY0+<2d_xMW)&>+n@F6VznhSWVWV-FIW3 zHYx}F5di3SxgAUF@i!WzEHuUp7lZ&61?QtY+QyRcl?%Po)had{`_s+SAh>6X(1_o@ zxper;G#;;n;c_6crKX%0Fhra;8v+-m_)(^coKs+1Gi&@k5q8-&wpa;$G27Sc-;HM@ z{usBylt{seznG6`#5ktrUQ$KpTN>$$UiGuxONfku%b@KLfI4^T_0zYb z>x&L^$x&X17fo38>?H1Ee^Ok}^|vL(YWTT%6TsT?({4)H{$?LrBH%}N3=gdaF@;3! zT9ZD5@df6ZHeJc73Qm>sI!cj%92`COd?is<5rRL;tlOB^ce)3pTZ5|f2G3jVS?C0M z?Uo-p9m)}yOE7Pg>;JR;{@*0_J^wF2v?Hf`kV^l9!M|bIi*77n>d+Zjlj25By^L24gvbXwNq>Kco>!fH1-Un4O=~lZ<~( zv)F%cXE^{map0E#I(>AU>o2w<{vH_P5-kmgPswzK3=?UbCzieunK{4MvN@PCdTU3g z3jgL&rbVNFmKOiVwF1UxS-;pm5t%g*%K2%?mz#89)@kI0Uu;9NLTTTtnZI3s%mfHo zvcK3?{{&XHGp)baZpg6lVWa zs{fSk|D0w1e}1?VL|(7VwnXw!1y4Lx3FGBF`#N9fJn|367>Vbvn>g4LdjEA^JPD(r z)jQM6mM zL1vKbbHM6*b~DG3`5OJfj~=}wcTwlCUmr0ne3%1Z20yiR9gbqxKnJzeM`$wU6MAfr z1x-7L{#YFg*)@y;*AZPHd8DWMo6C@`CA#)r!enC}h}{X^H0uzn5?ewg3M0~gHdJ#X ze1_8D7b49p9o0O26G{LMr1;gVzIhoZI`%Ic3pQN7O_c9N!qbBufp{FW%AFC({>H}a zId|8U7+d}~sktR41ALarxKjgI6OzRD6fJpOqsvFaWFj}BzGo}oDi1mHVna>1`H93~ zjf(NJv~UBv>wTrK>5ebQ%C+rF;gk6aqd5C=oCVhDhGvmse_!K*-uNF=VdiT6&f^`% zUbrP!r@74oJ(yfZ#jU^#Mp`^tVOPy~47aqeA_u+N>l$2SSIfUPfG^Y^R886Py* zpdTc>zBB6-XF4+ufhTY$;bC&4LltrKior8oQbZAZ-C3qye3bKGk0 zRqaL=fFHo7-F1y10-2G{4uC0U^;^NwKC7%a!gKO^|1UO|pV{`l=x;1y)iPETsR}W| ztRA5*l!g>*kJa`^P+eXZedQwC1=ZF+$=8HVoxbKD*b|G`qJrJ+^n)@8vu5 zZ7C;rBqw)zwX<@_KRhtPH=qO_|DW^YxIXWPu?UC}M-?C;1h66LrTU$t*uUH9gu%XD zMspJJ+aJLkN8tePa-;tw+U7_M^67IB^eFl>`k>_f$W{|E5xRT-KR@rkNP_&IF$sBp zjUMu^AQRMk(}CiPnTZKcbpBqklJ`OxcsC!?%xw_|NlMBs{Ze31}P;nfM+vz(#zJPKWO?H0t4Cm%6q){q8aBp2}_!Vw`*vr>9 zKAAoTrie4z`=sOszZ>Wc(sd1FKU@7(=KjSYH23 z$u&JaWrg+TNTh}P>R({#VVW!S&s0N$i+#YTcCv2>5m|keZ5K0G(^$)Rk`Td_YK3>; zj4g+FuiHJtTVxU*f-vZY{jJBeV|(U|!0LG)kiae^o+!Yy^1^+=@PZXXPUc~Uip`J8 zJwhrG?UprTI{|94jSZvzfIpQn@#4%;-I0*O*RQ5p#LawOs=5%J6&4*Mk(vs9ao5Mb z_W|RJMI(Y*vZX}k$r&qmE70k~-o8z-_en2+dYQDEX7byibD1tQV>0?=i^Jve|Es*H* z3|XI(k_zx(DQ+b5X%MHac)ptoO=k*WmMn5!=M%!RxB1@Dr?@gbJj~vb-b`3D|9t;1 z&bkh<@LN>=p3Yel3#!-4F<-v1M_&dHs)X%{-B;V`bE_apbT?O80d&1jJKQOfUj9Ww-@9$!EZ&(Y zm(d@~l_!MEfjiqMIb5D#iIwS)f(Ha;;<{h&FitsJUO012yBH~l)^_27vJU0lr~a8N zm-TQ0J*CNfLjx-Y7yo@5Qa9GKcXAch- zty{-Suk&tg%*9Jb1?Tz%TU6T7BIdf@2bFIHIO(i8n|Nf}`S*fmyu^=BdN}y3nc)8@ny0Fg9moiHO+iScS-X zn0+~feVHY6=wUISnj)<@Kq_<4l>Jy9msk$!HiPKW1y`1S8-7Sa^2f=o)4)y1wUwRm zbwXh&JgPnSk+*NYUqwTQT@!j-H$NQx5cS~;$ylukfD&hV$9t@T%SN%+=&z65sS9&V zyTT+C3-aG3BAx;3WEZ zd$Q})CNT5RZ?=1YKxJcyP*XCfj;nqHj;1dCtu91Dd}ARKU1DYL7ho1EOPTj^XxNKy zh?&$JaWtS1nd-;C?W*p6E6MJE`u0@MBWC@Fuj>PXw36L$=cz4eQ~-Bdv5$H|U-#;8 z9e85<#|S36XRSUTtR&2nVlqeeCQslIA27yABE=?i#%#w<`=z$|sNP$vk03wmO^gy>NUE*x*wRM71c!w957+qBH_rY0u>*ka1{Y%i5;3WR*LNk zJ~g4uYc8Ny_JFD5L56y^Grpuq-n0ZJB4=+j6MPhcGmp;$C$gugANI z3K2~j>Kf`NLvFw~S{}aflam_)VdH7p9nP5^Q-MBMH9NKq-aL1l>$WGz_^>uoC z*kkeS%Od`tDoq95a5m*OLB+9|0C7xO)*uWRU7ztc;MXBLZN>6XIc`I*lkRrL28Qe2 z;LPv@IYBP_7YHZG&5Ry!mH`x5{+#-~d7)khR&-ie7S23=xW_T;&0k}O@c)wTw73kpx4}6wEbjzNp7+#&`PF&zXIz)u=LHC!52tW^NQvEUf$}^IpxGiNdrKwb-@R9~9 zeoj1Yx9Sn$zStE?YT`F%b(2USL23r#c}bsllD*6kHos&T`dN4WA>@x0`aIX``>L9% zVZeWuW=}4UCUEYAo9QQYjcSyeZ-u3}#1mjv)PRj6^dx2nVUaHj4N;T@!jHLWq34LX z{Vs-z@8v)Lh;Yq<4y$BAro%b;*K*rs-2yZq_50xMb5Y&>jgHVyC*mG)n8OOY3cI)| ztI9HB4{n=tH1hwc{r^vqr~mwS2-p8L>Y87kLw=6`r%!GNJK~?_{G#U|se52o>RB*n z*|zSbW=a)yWsj3?L$ghhlFU(VyXf+muvAk>Po7vpIy)JHG9Q`}l; zo-pS!+IA=9Y1|;(WA^rl45{uSV5|bQz5eBZZSb`n%;y4kzQ80_N5F^3y~yTyUHP;i z-PjVtGLd`Y_acKN!pUtr21@g1$cv_1y{CqW+4tGEsX3*z7Pu9m*R2CIRSq}Z4%l+e z6ekYuS0tXk<ZpT5y-X=7bs#hr4lOusDiYhszON9f*|^jXt2 zdyDHAlzeFvX~pyK3HYt(MN^Y|`t8?`j>MRvm-tA{w^>DIv;df2FS7M|{v^U;u*^EO zJ(@W9RlV0(Ifpkc!FD=Xe6eMaFnju2$DhbOo`3_=S7Cfym;ZI=_;sw8CE$^%v64P% z8xY7y+FU7r|MYI>`D=NP``qqtx8CbvgqUi~aMyq5F%7t}8a~7Q9z2%9A6{Gc?!@q1 z&~>JBrTj-S{VEAb5(4_Lk5N``g!VV-#(U2E%bqBe(IA|bW#xuV34X+~WX-Y!|7IOM zpHcgDIpcAQsKu4v#X12k^6EezBzjJ9Cbo@-Ebpvt&^BF66`AJm00>rbZqAS8K|2yt ziu1jBd<4b(IeVfAt0b;3+UdDy?(2=Z6yA4rJNgPRcvQI~k0Co)RHweCnJ$ve7a|J( zkkRc{y%oG>(b8aH4l9@B*+qKy>MD^$I3yI`sT+gtUXT|xS0hCCdT3wwGP66@uo26a zlh+)osmgk20UK4r$k@ZCADLNx`8&6Xlaog16Vq&>V!oD>Ifc6#m(+54kDhoX)B{P; z^M7ngRtl{r6J}jDwQAt|hJxc$c%BoLt9`CVcA*kp@gxq>K96RRQhQ%H0dOt0VaPqQ z-0{5QIqOoaEo*$wWN{qUvLZ7ptfGl9yk>7^Dzp-AvKoHjX&zN1h;E>+IrdONDHN(% z6g5&k+sMbElp-wteE6Ylw@pz@Kw^*OahrS8S_094%L((4p%ZS^G}&<#(Won*VbV&& zzbWLP9cnyN{$so{WQ1q%4!^mx4$(Anz$D>D@Cn!wehL0vm3WOB|E{H3xuhBTTY<1l zk4=|?zDS~=NQCWS9u2MUq^qWudHNP_Q@L%EQ7)~m*S0m0nHl!iPu?9YbQc zdUm+lu1aBWEq&wXnR{JppA>Ypv%bDZ?lU7FrHIc?@j^)yo5iat>H7!c+ zIqS0?p;5zuZ7^}s=e_-xx4^pctd^Sohgmw4TjQ^R436|@2WS)?-ed7NCuAixxsy9W z3?U{t3D&G~eVKD=1Eswpj*RvRPU>|w6{ox3qjtkZg z$y-3jphTuWSXx_7ElD{3?O%*>lu$SXk0kV7LcZH-O-*iaRD9YyM9$|SGUO)?6`$T^ z)5!OM!+x946xA8B{`euT{`H9N+|;)dB)Oq!*7vgijFNn0vo~*4*Zl&A>dC-XO@A6Q z5W3KIK3rFvi*b0%%|GkQ3{YKA-HL25`mjgVa$1EA~;;XAJy5&n` zD{fJ8I46rlbcUwIGSyncG-XJt0+kX)ITn2b;wGF1NW|ot5s{zQWnK?92c>Npt7S?K znDjnU$0nAil;@iZ#^ZZ6X;?0WA*P)5dwpK7(2Zd?!#$<4wU{09AC4)YtG!u4ZK66( zRRuykQIcZrK+l6a+?9I6rgj?aUhcTG0MB#oh%Iq|AKPRVJ)BcY_EtFP#(bHRiub~9 zKJiU=a#|R5YiLLvDG2j?)t2P&HZUne>D?C_;2D;mk0&Sq0sG+w68!OfZXOq*Apq^% z+F@#I@+f$7!Yo86>54%Adr5Kicq9Q#UV!oQ=aU~!BiSyi?Yw1w*|kzT+^N(B#o5&R zzY^(GB9f|KA(R>r4H%(df=+|9_MmAMjIZ5&dsdO?4+ zw?(R!eM%FtRsZ98W15>?lpzZ%PsV_B272bZ?TZ?7V)&a)$kD=fa3Os}6=(wzTEy4H z$4f8eB!~a8cF_n>lKM|q$#(wWS~=-=nL*X9K<4HMr@tO@(%AtW*=pAD#x+zrB-nfd z6NDa^a_8rnYY|^!YcYW1uN)BE0wTCI*He7O z&odv)fi`B>d?7>I@LwM3_N?X4Glf<_P!pg&+plI!Pocg@m!VdC$9|p>DFzaX#9OcI zl%vKfP_$oBKkQK6h|X_3lMu>v;Hxpk;=TCi)Wu6jR-GGD5c)3=dL^Wx!R45FOPnSQ z=t&1;KBw**evNx7=W?)B$T%y`uo3?^FDEn5@Q1|rKW=6z|2Q-UPKK#~=8bdL*On3a zB$jaju&`4HwI%3jCvU_CbLhudKq+Vli0@*L8gW0*+`4)D=b3YlP_#9XG{&9NkDUKp zkpC+dB-UoiA4T>m3x@2U{Cy3`f(*tMQ^raR$}L+@r*6)C`uk1RjRy>6UM|bPn|@yQ z^!2#+d`nsbaKT+LdL)%*hw7=I&JyLdnSMR@ZtE<$lb8BTvU}n7gPgDaujNt0Lree= z`Pl2*&odu;@-@lk7ePJDm1Z8EZ!%mc@wvMXntp_ThcqWJu0bY$|8H}uoH_({8G#kr z0hL82vqGuJHCpMbL2x2>1YGpfLB^0su*g}L#exfOX?~fIo z4qm$2G~LiA2POcJ#0haWVq(Gl5c22|gBH*L5O`yPtVTwB9b?6iR+O;)>f0Wf!jGKMp^buPg2y&M>^@ zeSE>N&_l%NIX3rm^A?CMYOuO1dmUr;#%M743G{TA<)dkkB~IYIye6`F&?Sv($V}xw zzkXP&Bt2N8ZRVvfd&07%7X3uAnaC5>3k@ntAX){aM?c{yH*FqNa-wFst~YEK>Rdj% zXdkXdWnd`Z9ceYLBvYF`(m>4Ni8!nGlJbk+o=F=~FJMIL8+ANL2OU!)GqO*;*4`=R zeY!c-X6j!%9Jl1_vnpSdcYojE)0{?~Q-oNf{P`D!YWR2}X;I$+qa4y*5iy7-uL(Ao z`5G9j1sqZ6T7_==BE)#gEKI72a}Cs{%cM5qx>F#`l-Sp5LHtmeuWxT$iTh}g2{&e* zjLcjOmMWr549wXQPnpQ27?P>O5NResv;8(PLX;X#?aec*se&8b*wP8f_|Z>VYjAWd zl4xk{8uJbk2?GClx9m1(NN&AhUk5p-K2rV37`bEc3wX3$LDF9D^7h!`XA5)%w03=? zo}>h`*UzwxtsB(lumjHpB>6X^iJZpPIM;_w5V-aP)~q;lO4(z? z46kW1i3J%(aYXUiTAuB`^5V?5Zfyzef&GohrL4SVdM9DKg2SQZor0#5r(F2q*2j|e6rpGbym5(#B|Mk7#$%p6NljUFLV>mzT z--yVs)6^$<3sN&l0^EXl$c@MFyhlA`lhp8|Go23P(q4SeXk z1mWCAe=$ZUubG7D&inapsK+)QykR>WFjVPrQ*B;oO!fdjc4m{j`$#K z6C)#IWQ%1UltY)U4k6I^k|)TdLbV^y5CAe#=x?o;H0O6zC^yU2MPCuB z#hKY5vdRr$(^;BI!J94mM(Do@NJ|mPgI#rc{cq#qr83ml^I)SK0da8$f)f5%k_V{OnwoI{Q|#P zSS+;or1;AoP0E~JLO24_7^;C93UX*g+wZ(geaX1<^$JiBg3M3t?~iTn73a{=DL~y; zjUE8tyt%oj?`NojjK8A)i+Wi8!FhA`=ky_JE^W9_tm8^e%ANR01zjUOCV_DU!y97y z8)d}cn=QPjGb>*7*WtwsVi4if!R^^i$XF1)^cX05-*1tXPx$<27-f{$=eFC}gYIJ> zMEuvBN!^Q^%MGyXpJ(`{7r}*2-Eft*GP>Fe9G>g*R77a&$@&YSWMp91>>Ll5@h(WqQk^ z3{Ux}BEqrM8*DVpEl*yR3~Y~e0Bmeaqi)tzdiQ2&+JF@?Xku{d`eXn{K;-c-WmLD} z^j7r}R0hNbm|kU3xKOm#+w?D3kD3!`l;)aejPDA9sXLsX7v zpYguFW73)2JV7>b=R{KwHohePD)~6s`^`d~=Uw;P{4NY!iQ$J3hlFFg4Vm(-9*?O0 zXy1*)+eDgSbc~F7AFP+W!RQqoIz7vwL`bMpp{(S`^14G{+*A;BVHMO=;uJR>gCk?r!A$FC17;+>(|rQ!H~I|N^7T;1}{nP z!-aV#t0BqtG>I&pUT$Q=+G5x#P}E)Q{InBN@>VxwEYW=;Zuyya=rtIB47G2H3QbfM zks^sPACD@5zMq%OvCc3h*_=0+WYipvK6w>-eu#~&0*eT_B6#YOtTsepoTY_DQdu-T z$dO%ZV=~D`-5VgJfsy-KUW=^tap4i7*icXiZ&nHy5^9~q8H>NrJk>$5N1uskX7oF3 z#1c>*?d~f%iOM?)ZR#gR0A@#;rd77E^!}nV4{SPu8Q$7S^t*gVH0n=cNx1$;ur5CM zdVhS7ih?n@^AeSZDIte%C1{vkCu1079)+5|do{}Qv|a^lesLYCIaGp4cuy7hBKJ5j zV{NTT6LV^~a^&?KOZuu6U5A*2KVbYudkKxK)3UUhnZmrLcuIb5Neo0-tv)BS>DoKa z-+-33eEv#K`_{fV)7|cFe45|EONH1n? zgRwF>CIWGso$Rs6?F%-XF)Gz~vr7%uanrIRGKHwP999$Nt|f8LkXp1YGleO!MeCwl zg_~SYigTW4CXz|~)dr}|!&+N=?MJMzdj$z+RknJ23-%fP+lE9gg+DgrDG=;DCPdhU zQwB&bu^k|-zSI<($6^946qo01x&=}+#bP=q6^8YePHdATZ6kwCZ}-gE_6j2bP|B~{ zLiuH_?KNXZ&vrjcK6;H+?Q@k`0o4}%vY|b#e%0wprkkoAVV7-;j{-J?#_!Krc|`S* z*DO24HF`bN@wRHj4}}WX@D5p0Xo(nT&Z_sim>4)h7osn2*{K(9|e-H67^}zf6>prZ>r?ni01|55G67~@A+Xvn(w_D#{~GKY)O92j17r@hMx<#|zGCrPvZSG*M81y3 zBz+MrbyJ=@iwn*#d;Q0bXLBCBTKEdGTU$8yia75XmZDo3#AbeZRpk|3U+!>g630xg zrXj?gux0^Riz>Ljei^ZEg)M?Jc{x^anFoOKDLnJp=tIA0nyLk7$Ps~T_xng;rsP3? zYkwN}x=^yQc7!y4JYy6W7wzzE@1ga^oo^}(RoV+O=ZgrLsc>=1Uf=Z@m+GaQ3dU%t z&`e~9Fp;Fp6EWEec`+^szV^s8C-YE|OH)gfS^Xc$L%>R>I4w#|(`p9|1DX!qw39Fg6~42kgXoyPpR ziWpE#alOqlEvAWfs>!-f$#0@702Me#2lrgW#GLewDRrp7^HTT~fFIp0em}OiK%ACF z`jw_mMhVa%wGF96htSkV!55m}7W6CXjvgINFD;)K^yCi+D9cj{P@J@7- zj{r`O$EJZYlM*gLErqbrp7z;xvX4}ytt1=v<>ka^(L8&+6Mc2Q;3t;4obg>S*i`~F z)~h$n8Vqw)5*eZ`za+60bG=@-!X$TjwkQEa2aj*+p-`?|SBeRbF=&p8wXEl_Jqomd zA_#`R-ox};(bVHq1#L`}R7L>y(UnQEf->iWsdA67e#2h7yBxRCG5i@axbN=|iu^B)kNLH0o7$>B~?5q{k`OQ|zXrNIBs5fN6Cg(fS z<11-jMa8>a9)65?zsh-8sR=i)@T96vGScKUd*)A8&FY3zt)4F=TMips>~Og!wAXVs z88Mg*PZ>eg73<7&uUV@KM#0@~mY(~CGKrDai^S7C1P@LeI^$>uVCbroCd&`r@RStJ z*g&7_f-~>chT}J&(SoRl8{ewK%yqdeh7TZkGcLPIt1o3w1c05CArYt`5?n{hU7}nqwJlB*>x1O9-|j#brMb zWXR|V5X+u3YK(g=7jOVQt=ADV1ss&Gxui8Jz#+1kV{dMx?8UW(t+aFY z!4yBZTXFUKwB3Gosl7Q{rt6PF8=a)S-?{J5G=HQ(y1$+uaNBkRzz9^NWPFaUJahKC z0Gf}9doOfXC39_ORq*EOt?`6K{l&WPVC<$axe@xDc%Lum`G^=xVO^J};F5Xd@PX51 z%i7?8!(x_(Yw1Sjyod4il^gPQv~99hZ>KnrY5NGXN{Ek;p9Xu7N9_J;n+|zhsEd+P z>{%Kezh<`^e5yNThbhf>J>QU3!F}b0ma1R-U|@LN)vk|2fl0h<7g(ZC^Vz^*?!yeZ zjEuIesn^pXh`|u4nRe+1sqc|5;|@lFxG}+HE?`QutkI{r8-N@{AAC-wY+6R%!{|k8 z%mKOLvL8$9qxi7wurzY?83FOn_kOu_vHMJ<$}JJD&E-^|h~V=%e#$v+_8!@fIl;A~ zB<|l1?i_$pRO43JrR)p^$Qn#;9G7Lz$R)W8m-VZfw&+^DK^N@9{iJ;zr@juz8b991 z#108eq=GR@cDL{JfM)`tY|K&5iHqBmU)mn~=JRBmh}Ydn-^^f2SGX-R&%@7$41^Fj%^yv3+TaZn}j5m#o1 ztbsV2QzbfY+Ggefu-qD{8skP9wby@0<}TSk2tV6lB$5-_buOsxI@7iLED{2JGW~L@ zjs~&@@>OXLijI$6Dnu}H=|O0W_WLF1-#>TI82LfdYgwParkglkc_scCRmf;sy_+$| zxI_=4GW7_Hi$3IA5~LWWv9ttf)h)kgxgIV#%286%1`LvD= z-i(jI1KcZmqK3(2!J}TcAM}%0|J;KiZ|gqyefnebczoiJx=3xCj2k5@;Id>)Z`la~ zlyuYBE`i%>s|U}#s4vqD15EPnJx<=Q{FBt%6xl9Vpgo+7o)=|rSQ$9Ia zsW#gz3G=?}`v?dSx~+>GVx%&XFiIgeZs*)sW$O3i4M)rb-*oTI))o4&1C}NEDtC*q zQwm=OqjtnukcK@D;2h|uhfl=N-?e6BALVE@g+k4rJ_`#A3h>|4B%T$*JP^4VN!k(^ zL^?DNJBJSlLsf?ZexyijgBBiN#{hX34(-+~{@>vi7_&**5pzP45Sx@qQvW=Ppun2n=BgU=uSpBwB`}+`@%?6j$Na#eX+*;lIWXE&lTZF!1uzpTg2MsTb^g34~Rh ztXKS37cQ*@<1P_T#V(S6a1QMg1iFWQ@jk(I%}SCw?lt~A<2xE$hdR*c{r-09#@_eY zzsFv0f>&2vxMZy&QL|{xl9G&{XVS#j7Z(Rm<}HB-NW-HGKu6_wVAMmu0OX@3&upWq zdo=M;#&iz-6qp6Q0Qw@?O#g7Bk7EGS@cB~*mxH5129r3D1@TE}`Sce8Fy9jLV`v$I zpEAzw!ck*$D4NLM(F*syQQufPfr%KrleQ=VJU&wcFf)U|fteX#vRQj^`T{^IeUSTk z=I5ESrGKY;1`Twsi2d^!{QqnXB1O+RcKBaz?#6$R#tS0*9!Xy7|a?jU`6EJGa<7|HY-y?XDy9Q)~3r1a|fp-K2 zd1-{iT~ztP?Fv*&4{B?OY2qEQcYv(1%G}7C1_6)k(EaakEHk*&Z#IOU`V5zkMJP1tM#J%ki%TV0CS* zPyJ4PYZ!*73Z0*6RO!w&Q zE}Z;%#vt{FHkt>xjdmfU>_GiQkwDHkwf_$Z1^(~1?wtD>1l=fSvB>mr@K2VM(LNa1 zZPOy{5E4NL(ZHR0-Thl&p=j4?fz}@(%Dzca@=XGA7XIZz2)v(%ah23Pw0~xW$)!!J zBd7G!_Y;5_Q{1=M@TV-vY%zR zdRt_3Dl}gym)C~N?dWr-08JREKw?p~b#%G$aB*@fKP|(7 zYL=vUUILV5bbc z+sBl!D8%8vgRZ&iziC_P;`Q?0L7e?v^DnaiQz*K%1Hun`ahpSYz0fF5J@#*H;T2AdPx;f;&h+;7u%zR zJj{#YxMYWK`PyT%&~i)aoexte&rV@@ClljxxJ``yR8@xxt#-R-iI*bv8VhqmraKvi zADjKv;n?cL9=v%Vsyir;x=Bi3^54H!B6S%#qloKm+2AzhNJ63%QaoOHW>xeE=sXU7 z*3L9iDaHqiGj6vxneFZ`5v$qA{zPC6+R^&OKS$WW#UV#<<1i4M6H94!I1DnLPLbbg zZr*PaN)&fwf@Slwo1rVLQtQeEA@KKNmfw#eXvNpN95oY|!CdUlj^Q^gA_Nu_;FL$_2)1!XCDUZyEnV25YajNrgs|h7FlFtm=jb z*r9^YhhSWT9qP=+YFXhnV*Y`}P|nz7om3uc^9=T#b)50*#P#%{70&*4!@ehDFLoFL z$PPa~DRj1|E7kJ5N>C1H&<~HAu zN}8p-QMf+#cFCO?9rO9!y#4;AwNPL0lOe08iN4qQaxC($d6^iTjoh$JqFJW!GbiH; z*Q$HmH*5rS_N!V{IifPP)h zqS#(f5NHLnTb)S_KvOCzdy}G5bC1I;)T98n5{XqRztyaj4a35Mdn_L_@ zu+j2}hgbRj6w9YLz3}ET1LTwRC6!_awL~l|yxs-uYiVXA-~kf}I0}1_?Ug}^dG>1M zDm4vRsdS-avo-gbkwyQ9D2Jpix9X`YAnTrqq#D_YvMG7JM=IW(=OR>TUJjIjSk1kd z2-S&@Jt1{{lBtxh5ZPom0=a1U)Ko_}Ks)c~W4``jw&ho%zt*2UteQ4F3CJMP*a0#n zcgfj>JzL*gg&^_=FIZAr7Bq#I1z`*j+(#ifnsSY&3rqd>Ik5`?8RY%&PBoI#9y1{5 zZnan9F1=8KTel{!3X&+3nq#H8}5&eUAsDV3(eQE)+uH zMA05KEyhL0#3jiNTrM|mnp!U{)(OEFE0xHOvIIr8U2Z8JX*XvN{~d!y;r3VPKQ>$} z?9qW+NZDziJsMIJb9|`$V8g6R2$b+=v1Nl!da_(jG|W)2`J03CP7QU{aT4rZtWVi< zuAOdUCT(+aZOs`JAt=kRImArk^b^yLI0^nsh#ZH!k$|TU?xW{SJxaIK691(5JW?M{1`82w4HZnE-&D)T8x91 zoZ7z;7L0UPA-eC26cmIc^thE9=Q|k)b2(i053c=w-m*ZQD>-7$PT#n=*b;QtGRw|5 z3v)nEd(W1BTTUa8DAA|z=sM8S>${dbxnGrnu{Xc+f+@|#S;ohsEFdkpG85 z5dZtcQ2s464h7EQtS$p$sH}CAch%mtmQ)7VhnlL+K2c@pw0e&BbY$gOCs}08rt{=$ zK<8-^(0+9phrIiF29rZC6uSm!(OlS2Td}`}c|_EsvkO0Ic~QbeAzt4#_T9OnDirPIt$<1uadCfO_~YSi7C7Wp=vnFJ3hpu+>hy$ zpuUb(X_;XL_A(of_@Noj@!r+)o@9vcZDE^=VzX><9(`lZC7h6dvAxN64vbN=nbI9b z#<5aBzk5%?wfnVBof1O_vHi{H3qVsW9(U;DX&XZ{;f*6Ccag*7^kwdqJ5))t%Agu5 zE|=^17fR$TEjJJV(mk1JpfGi=uy^kwP-XNSqhi`z#9}!Uu2OjrzBn4pRKlcgyow{k z*ULM=w_@JZ70$kxU-CT#)a z*EWO|u6vcznc8-PpMp#n-p83|?dVpBt7h&nwm+c&jb6DY8%P)<538 za=-`Xd`D^7;PynD+lt0@uhya;)Ue9-OdJ7Lg@ZffH>d6P&aIcRV*;dcOUr247R=Wn za}1Wxoo4a^^pr@~wTK+vFOV3LT`A;R=RIw_!Rq*1d5+ODC_85?f83jLs{)-64#9$!`%Tu-%CQcf;{sE132&? zopAk}jc-BWzlu0bt^)E2HH>AG99F=lTu|$&$#)2Q+pTvr^DA9zVfn@lvhK+J`sUQL zB8rG=LbvwVMKUc2RE8BW&T^PUxD~@vxJ>4a8^yBh^qiVfam(Q-+PT%_+r%YNYGqz+ zxHe^Mz^|U>_lGkCmZGRmGLMe9q`zW*2B8zxYE;{CqS0}+reO-KUjh$R@gC#dr4Mnx zZ9x@adcqyEKlHBFej#->)htLR+AZ9zAUPCrd4?O;`4BmcY^~v1=4WMHtC0zl6(ne} z0e8Kn;jA0ofHDv6Tl=9Kpb&bTn?Xy=Mm@OCC#)J(M$x_1RYzJV6m=%GCnI%cCuKba zvpLyqvRy%Ls@7LbtsWVC#h&Pgi+t4BV}=W9CDdP^4A-O-9;H*-M*vf5YAi#Z5*qy* zRk^oa3uuZ)*(?(uKfx_}i+i=S#XM-AepK2d|CG1ybm4LJ(7BwPghI`diVQfQ(5Powv-mW;G>({+Xi}tI0=uLhG zAqF`jo-h&vNVb#d@{WR!g6ADK@5fp;b*VOuZ_Fz5ObpXvMKfHtDy6*h{QI2l2JV}e+RYI5T(7|vqe+Efg?mjZ6!>`}|o0#%h6h^BlrE&I(U8ivN0;$?c zA0lKQ{yZZDAfl0Tw7TA9mT(VpA@dd=Ljx$|LfEg=oAUfIsR%Y)`FTbdX(prS`}*!o z-{e~{N9~Za!A;y+W~{&Ab657!^H+!JhHZ?LM0)-6ojT7I0?xg`ET;=z$uV-)HLnsv z0_j8Y!w556h=0ML?yky4JQSUCj(tH}LlE_Z4suS`kSoj{q4zPfsSAxE%})H$@wOv-$~m~#=^-kK>2dp{2{1gs^gBLL7l^>{Ls&=Q&)W@o6jvB)51VyaHRJJl{pT0CIM8yK;; z_quQ0-yfADMQ6I!MGNg?MSP9zw(5G_{55Jcs9CNowa{eaw4g<*IMDyUxH-q4)F#W6 zN@vB{70v>7gQZ_6SLxC;_^RL8O&yyS@)$qT&(@b4N?3GW0y{)^Cx|+e~VU69XZk9{%FSiUNFb})}^f`nW;Hr<(7&}XQIglg9``Y3((>H<}hAg!B z0KQcLp95f-ghX30fH&TrYSvh2**sD5p{TK`v2)_L)`m!X_r}3j1)6)qNE8^LI}I;0 zW!)BMae5j}a+vzdkh zTEsj`(#pu=&KggD`n$BziZ69!Wzpe2zgZc*9 zOIPMhyPHq&eJA*S>f=^l1PVMAB|8PEhTUOkxyfi9Y7$B4L(+n)gG#x;WE7%Lwx3r* zu+Jnrz|zz}r}*zS?mw-6|F+W%`8oNY4jb5Cj6OZec?vIw=j1$jT#Q{HhPk6$12pq@ zvlic0Hh#CsvDwL(ce;JGGR>5=B&{{Zz~;6X4qH#U3-o>o28I?>me0AauSTr4Y!%j`-VV8OD=`qC7S^ zP{W$Z5P2p$WhDSq?xo^5{6Z>DGyJh1>E{`?4f|4~*KXBj1romnPhUvk`9z`wVGU{t zdMVPJLS~vWA1cu06H(=uF-`e?r?k@>F>Ri!UwKIk1yb8vP3vl>2RQHy&#Ou^Ep?0| zPfRu^e|(p_S7K6`TL3c5Apgk}oGg44j5#mZzwrVQ@!QN{nZ{dZFQ;kEr@q`DHjgzs z%FCA#Dw}*4ZmZT#NVGNQEBLZijz7zr)aTfD^b8~5i(dA)dcjJCS!0OiywG_!54~tP zwO;GBwWF+jP~TMfVERV>nyi}HyDISiBFF+U#@6e1?h z%rYe{a+Cl1#?Gb;F?VTRkoQBt|DqcNGX$wkNpyb2Nd^ZsGyyEF`3=sy(;+l-=*+x# zH5HX3IuFmWDP40v5b2jvUdss*8#iN!JhsnX55TewDR-@3!YDnl=qJgz6`PsOWNE_C zlft!cldH1wKW=;2ABCk^;cO*F>wNMsNV$+L5Bn5#rF;Z}UX4?bL@1TGeO|Eo(E_Vk z^R2tEzkguywz+ds=__H6AoVoy?fiCp)t=H<$r~jF>szGH0GM4MJIpgQZPZ9QZwq6b z#o}LVkfoym*VoIJyO*qEwbB@^<8KjlwbejY^1}geRT-$Y``9RR0UYICt1Kr2XC z2`*UWVV3dK)+olI;Tl7B5?ylKgjGa*=>30BT>iOr{NvU!_3v&SK&BpD_5V9?8~mRG zxBpGR#6xy$iQ>ma-C|G|eBlV`-^G^1799(jdwuCT9HU8h(n}nVo&g?` z<)qF-d*o6lA2pO=#PQqTHWQaqyOpsmRIwo)J<9yI&14LiriSGLl1Hi$qw>Fv&1Cj} E0HvR$vj6}9 diff --git a/docs/user/monitoring/images/monitoring-logstash-nodes.png b/docs/user/monitoring/images/monitoring-logstash-nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..559a69ae9b191b74ef3b310e05540b8f72a66bcc GIT binary patch literal 235149 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
    UgX!fBqeLL zVPGvG?!7KP*Luvk{@4F7(*Mo;zgw~FUkXIXmt)Dq&Idan9{Jc5hRQlld)Sbs<_o(k zw9)~+G7oz(Tis~$DNFRq{x5US?OrJ&h8^wq5xbGtk84fcF_)M#QC>n4<%JL|8njReYDvvRCt! zF8dqrsSwIpvJi5B$5<31DBJ#dc-d<9o+|l7t9+sYykLp5;eLeuf)?0ADzGMnGrV&CQ8c+s|?Vd&COZ9`5^Nw$j@B3zdG>1 zR>=+6a1mP@F*Pw$=nveym?ImGe9%tJoe8ZqFW=GQH&U1`jZNQ5k`S;d%5Kr>Ho8GS z5M56K3DHXbBITTI+OHi16>C|J)wPRix2rwTeAOAkEBndwPKksbPjZsAY^Ib=lQ6Fg zlA0--pn~p4%1^`8Qg70-ZKgw0X-{iT6i{}Z9h56s6C6RCyU&|*{9gPyl+3+j@z6#7 zRh+y1TVCf9+im+OAv?rnwrCNJ>GFvl*KLdL)!dy1q5)Tmc&=lsjI7`CYSwAy0g@+= zgk29#niGs4K>4@@hG#wGf~af+vL>*$JT}1t(wcqUZY9k27wclyYGT%&#p83Xn<-#; zzGVD@mRm@g%njmtnmVUQ+|w6=B62df*4`MFOqs~st0JA4JeqR0bhvL)mgkt1ZepZ3 zndnf4Hpns2O?8P~cF@@OU6a=F^`oRa(9B4|l)UX#56b0YVru*YZ*fkBSEW+yfsSUU z1cmc`*;loP(Vc0NYs=1d3p8&v(ekw6jPrJDbTv6+KuLYK};~@uGQGWo>T(BT5XQ z`Pl7wn)O)>(NJ-L0?#fEd%GVe6@>fC`raTj>S~N)Za>Gm$Tsk585!w9i2xf#S5%k; z>*kEJ75n|&^H|~)LOwh3d+W2-O4WsbC*{?KFOnW zVNUoRrX^_&c=P+q4;AKE6)WBwt+g)+y!qpZX}QQWtde{xJJ&mr))OhOXZg>rIaV`> zu#c$b>9Zr!&;;b23c_?C*P6&Xjt^#6Yz0c0rF&jEMt0}C9`6Ickf1u_3u_tW>%7-Y zg)+Ugoclp0G)`&>8Jwa6b}xlz8&fXTMC)87`%bEdm zsrD(=pPy%81wHF#6ECI;TT_&DC*|a1#AYUUi7Lon0lWWoCEm9+?+ZX`W6j#igzxs8 z(`3PCLG5EE>oRK%wXMjDicbYKM?LqD_Fi-Mzt#JKe)NpT?L64*x z)53rNCWa1KiLeaTCv)I?IO9+pA(75ueb6d+k}rfutwY#}awVy;!*o@@p}qrNGT~RX z*Wf73q5E6YFUbq_50t(U-Uc>O>PC-Wt;EP_V0*PL2f9@AD8XNe1Rx$6^BS{fyOxjh z+EhKl&sJLF;;}XjnP3l7sFwK0If|uR&&GXXwFoiKN72DS{r;_i0X-uBi(trum1utG6Ij2E;&O56Fi-`4^yIpoBzwtU0D$ zVwSHkv2?F-idS5_IkV_CU7_onI-uZ2CGM3Ocl1w>Q=^X&8Ru2?GOV!y%4Lm3I&6Pr zD8_Yx!J+EJr1&8z__$VHl(f``YDC^SWix@p-x?={V;qM6<4{SM^U zQ@bGWq+^va-MR|8EXroXK7l|Ni#Vm~&Mj1j{vO^JDK!k_WncKe76k!aNr3tH=#UwR z+Hh(fUmIsA{d^eo--Xj5@pbSam~kVUWkOiL!pu$v13oGsvtXA-=s!G@J{qU<=mA?( zl!5cypCFeytw>=Y$+R?^Ri4>sOlUa*=GWJhq}~7{wBPB zO{353`tpjs_vGr1*RZ*9-WNLsc_=<3BAVRi3HtL;;OLVZ#^@wwyOTvY*dC{vq)Bg z4zh*HO%P`DthA(DZeZ_j{XPZ)!CgSteG7gC8uvz8lc>-J4B@yANfP6)>uMxdV>X-6 z05+2DAcy@v`78nvv=gSGaoTixzO_Fq-(YBcvHwm!k+aR0wk4S=Y+z(8w(78ER}Hd+a(#0I zyr)Vsya)cKbV!hF;sEzmDucUohcvOp2dU?ekw4ssVt<~tV~pko_Sqs_K2bGGYa{pd z{b2HUnm;$!8<(473XHY7!{=WIpsYsKBHT)5y4p1H7!9Z|MT#a~=zes~1oRs+2RT+6 z5r|pm3zdGtd#`XXee08flAyOGb1^wWvtklAlvW{Ro~*BCDza*i(8}&%NdRuJwNf#8 zR)4F8CC!U?NJtbOMqTllT6HX9NOxsB#Xyt{eUo)|!oVg4EV;val($+wK%2K%;dgOJ z3nX~dhT+wWQh|{`1nyLB(bsw5^c6!TG5DFk3GvE=uymFZ?@7cw{wBranGSZ2s)E{W z;!A;OXUwAa8nR>sYzGmlawJ~!*ea1TrgSV7*O;D* zO45!h*5fOuN<7P_+U-4^B|Xit=A#@0#5*h7jP9PvPX2dcNP!x4E_W`D-GJMDJr9S! zv5{H4bp7Gj%@zwo?Vp^W?isUG+XCgpL#uFhtb09!ImX$0O8)6Yo5>}=WGx< zS^Y{LH^QIp)X~vVn%SlrpnvIgaIh!5ylJ`Ix(vUq?<`rJ-PX82XEV>dVyjY<%Y4x8 zGUQA0B|#_1_VA7R>?wIs0&1lMT+QjP^keYzcG)?bL07;4u=yFXNUApCz;em-+hgKbI{jS_{X?a|cSnN4$9!x6!fB1$XSSn4nqgA;328YQQnri)h_79C=ObXP9-BPI3l6_3Z!? z$NN{`c1kvPwvlIxA5}%@wyonlLfZt?jB)bw!_bPsD2#Bfv17LJAWnf#HUA%c%)i!BME%?wXvB3<8gVX_oBTkl<}q}jKz@?+w755kOG71)2wFbAvhW@xl(>bQg}jbEu6dJ2 zb-Bru3e?^vjy;a9H!=7&CQUHdU)U+4BEKsfJ}hgfJyWBb!3lPgO$eQjsp1PZ>_H6;7_Q}ZSLB4x*N6Tm0Tn~IE4Z$@b>Xv? zqvfu9XhZvuI`HY0clQ1gs_QTgU4hFGOgMkgI5_ukX0+K1JnGioL-V= zgf}si{z>zIQ_#Yc;}qZ*you`8Z#VPfEBx-gAhic#=HJax#9e#6?OL_%(D${#{uPlm z@Mq+k?}=!c>Q8CL8o5D5#P_W!5dIpK0mQ0&RtI&G%COAdWc?nzR);D=nrlc}YKRokf_J*Onn4C}EK4oZC zbYhtm&|>&SmjYsyt%-KsQ$MfvhO8aOkOvNZzc!T3zp&{k5gL+t^s4qj&DjQCS+jWCxd&bU(MbI>dtWu8uu~=#4XSbSZR65SHlSpT0@vQ>9O_JKPGB^H&A55 z8Csbq8yXqR?Y&z&e8@$@}s4y+c z2eVlfExvav{stc=pxBUntQA!4LB$#<_T1}j$RpSnh`5f@qu5woVP|-tqS`}0K7wOI z3w{dlEqgrL-;)VMq&Y1tE}8g2!-MLz9Y+>3WKFBD2<}U14XH^R9i^um4q|;4jZLXP z>$GTLiOt2yoylU4EJ%uX#x>swX9Oz6XpPURB+ZF_vcHl=LkUL>Ky4itiU2M<~ z%Y(n82|4d`oPV~KF0QN)?kp@12azJ1Kh4`0+`~Co-B*q_?4fx{4a*qp1V=myt+QdY zG?>rzu~bPbH^}Qhh#vqV@y$R!eeF&jw_qJaP}SCh;aSDl8(wyUuEe+$z79#7d>zqC zv4uh@M)?ACZKE4{UEWIUh&wbtx*@B3MTX2z@Z;%j!mOL6Hi){aD#fV4J(La@(6z)j zUV#ejV&YSamYuQB8zOThgq)onOef7=-H1&~dgPE9@QpTBvgM7t6AEJ?%ZOIs(cd!xk=cjj=elBbG3%l+-RsGox_NXv24fQ^L z^q|xuj8a|^Hq+duaj;$d`q|-Vz0*qg7C$ZI*lEZPq4YKT0`V<;=~+1-Fs#+(sY7jA zOLpjLDY%$Eqv%&)S)7iJvuu6l!za#)Z8+ey)Dyg}B>a1*jw7nuRp-|-VuQ0YqC>-& zO#fla)iF`aJrK#2FTv`SRlD78px`VlUtA?KwQ#1hvbf?jd$w?T*0w@93hH0wd?^A# zturrb=86m1&W0+7r;R`tlJk^6UNZe9IYAr2wrP*Hs3X$=oBSqVV&IZr$Iq-h0$}lt zlpU)S80Rke8Q!6~Bg~I|&`&*|cgR7x@lWly1kpSTqGI)v%T}A+^yY}5HmCXI-_I9h zcDIoWtEC^#(0^&7_r`y3wiFy4WETExCQn_A;```S&l#7-+A*)*kg`51UrjsKsWGl2 zXZJ(mAoVUEs=Xy#68`|MWS1R$*wsj)+^GGW14S{{otXS!!%f?{J3nL_IivUq`&f8> zera4ME6jXUC2Q6)lMS9Ns0mRupJ*(BsdtSHuk2N|Ajj{I)hlt*Z2Q^=E~XB6jEnvp z?%wzScQTb?+lU!bw#!=={GG1VZ_JrkRzB5-ZFZBfEM;3FC%KCO(6u;#Qpy7rCz~oL z>?`rm#i@?WN*v6!enQPH70@4lH`#jcm9?~Br!{S3Twa<+T{p8ww5-@4Y=OO&L!$;h z4%@P3q7P?_(wf>}rF+@7FC#_#jO_0{-1bPKW=ie1dy>uOrz@8YBW0H!$Bs+u2Q%(t z3`#YpHiJrmjzMi$pc<0iE?!O`Da{YBGwN_lQ*abjn3>o9KvZ>c{#MEsu(l!K-?%LV zEy5q+ZqH*Rz>z9_UNWhi5~Ct-A}|M}0H#*$w@*<&!(Z=qWqWjN(2*!0NTQzjT2$&% z9#aBgH*%*&Zb*RjTWR+E;EIAqV&F!0=Te?`Qz@^~HyBMCl=KtD!y=qI{LwgbuZ1#; zA)DzpWzh-ROUk(Z#&t6`C)FlAKH{Z%+4foroEQn!8SKUJHXW);oC!t*_Mf&QkRdKs9vW0#&) z%V=(-+xjlJP2#}NU^yI&~Zr}6wz}&mH zY45kK`Yj2qU+a^$p1d#1Exqpe--TMU1l45~lGOg7tGxC+@MiTD=k+1$bH=pmg$0W^ zjK?;}{WTZ308KOW^ibxDS=qncZ1=^jNPsB|T`Bb)8hrHykvZlX^ek>U&TupjmFn{g&CUAlF|lP1BlgvA$=!*}O z>GQrzOK?k;xVa|ZRMFn3Ypns3>8okah1mM82@JjPJkVPaIYWV$|0F;JHKD?0m$z{N zdASxX~P=tbQiwYO!*tTb$!czXl+CjpO$sZShFt zAcR@?D%{q)(_2r9RjiIr*4(lNE! zu?fUeh>J|d8zjEiOJV3c)fKaBAH=`PknU^tT%5?w%$vjw_BA0ndsDbQj{%F7Kh-n; zDXt3(=+>_xLXB+Z3^k%aHDl4%e5~PnfiO2Rf&MGvq*=hsRP~Y0g0(m14s6sbz(aC_$BF9iwH2rMY++i@-#e(U%{6{+=+5w~@7p z+s^#S+LNt_w2eZ@&4W{XeJ^E-|4JeZ?FMJT2m0;wpw4}+$|8J9sk>5V7BwU;Gz;ns zZ;hyQy9m=PDYjG+v-S@}G#oUc3oZHubSSYAq+f>Xlb1-nACm5`Jm{FNac`M`>4HKO zkbB-c&*=J79o(ZZ=*y3~O=QEm4I8A$Wsdv)Z}TYJ9nXn7CB@!CA3YZ41j(EWa=b@U1?H=iC}tUBPb~KhY7#7^#)iuNeh=KYXmk{v;%6fVX>go9V&EfuSjLGZ4ZQ< zX6r~E?M->>a-(DFVDw!XMrF9vgQfMeVesYN9|+Ch<&{~zTsTz$s>*sy(QLY7?95ep z(xriNF>h-!-5uOuk-j>$sHKDY)7FJ0O&&xh=-u!gy#lX~B6N@v;bofL?z&O~voD0t zX1gC%YjB$JClWeFuL&J|A^KW-4qU0V3v}VN61PyZZFonV&{CR!4 z-?a#yr0B4Z2~FqU3AYMl${GLmRy_FL$X*Ne_m*!mg+w=|=?2r`tsyf}V z(wM7E&yAP6*JnZ>Si89&P`lgO#;gCZ9|1&bu|)iphPW5xr7~Y{x8TnVv+)x8bB*7g zbq<@sMrC$*2PZ+FqSp8&;@)@=mzlh2U0RI$TU+QM&-L9Y<20L~X4}Y4(I#V1(fH8z zYM}|~WZjlP{EU|$8G~W{kKpT&PIzCGP4>~qjJavGCKR|C;m#FX^?AIca=gggaBkvV zN_m$GFpj2`(*c)hxAp-5Ks4WW;Bn!lp;q!CCX>2chzO{94w^&tMzJHNWZ~EEB$LM} zmYG@)gQ)eh4h`yu0{1`G{T}l}#taFi7fWd0HZ>|kKo#AWsBK*-E=?W`*Vn!w&FA5U z2UWwjLkiroR(@?PaAP!`T*L(9G0%#V%KK(>`ln)U=51OhOAtJNsMN5vW!%vInBMw) z)Png%kBv35LG_}oalVUWqnTjlm}TAQYx@6rwV8DXkHHQ$^fw;jzg1- z$7NVQ75}q?sHoOfwAJuI5&J*4*kIP^rhk;(229fkWBixxx z)EX7_jdaU;M*Djr2Ho%~B!z38)*&k6dWRO?)KIG#N}C<4D&XhR_OpzYFDf?C7t3Z{ zr@ifgT-606|1*W;#f{hri-|^<07H{B;DvYM`5V24po)1sv@S znJ?LI4hBR0Ma+$KVW-5)Om!y8a|Vr#pF}?@EvU(9Y^_FZwL?s{hw1#6Ix$QqR4%EveIFa7{GDtaa7CgiRku|`%N zjOp=6^|W&+hw+S|m#dG1GI;aLVgm)Z4jxY1I*u=^Q#>hgipBN%F%u8dOUpP=C3g&; z--x;8JnvIkv3OJ$E4TmhD8#WH?HuZIxDR?#li2q{#Dg}<{k|p+4uC33m9+Ci|CCvn z_vyB-(PqQ!_x-FgLfSGa3|CM#ep#v;T38a~vX`C!8O`9q4;-fp-Cg@ai=)fH5%yv4 z!^Kb!%ALH9IeTxEK)_UNaVb*HX_I2l-ud9Whm@n-BdHc;$9qDret<*V?mANKS`9|1 z##Ys-zrn`=?a&~E@_Ng{3)sP30@9K<4rLb2@E)qmxF5JR87;5q-czHD=~rFIb2Z2a znWo;ZOOlzc-bC(J_=nrm1prIVfmr=0gQxCz1#E5KVNUVyCHFxI^X<8k6OE(`wETc= z$HV%sIpZV461Dl)8z)6CT(|eR_*ooWIiCceV=_zTeN_L=ZJPq$jSTHPF8qmqq$t`y z&}a5plI__YzjBE5a(KS!bj8Lc7f8YCHn)Syx?i-XA+NDDRBBi3mec%dLe{3zj!wyD zb`%c&cBZ+?9HNjIxqcD%23Rea4TCt2s3Zg=gg9lSkfz%ww3Q!R~{dpyl?FV zF01cZgCEaEibgBCOI+mfBuq+AlzF|1GR`qKGTaMY0}1`Vz0-Q`6nrn}edI}63L(L< z)4e-qI;O+C0t)4Sql)JA8eHMf=ynk!Hx;A2mNeQZ+}r#1A4|P5GeZLxlz;KHIlZ-; z*g=uNNM*hgC^CWw=^YM+kiE-NMxzx2Nb!a2ih8oN7a)$!>EpnGcYVminADA)w!FhO zV4{Akn7hIuWEa>{G;xiDQqvsHnq6(WbHbJqyDPB7K?zPE78*F)_Gojy*S$fWHp#@1 z9*sXo)3Q;&<_Z(kS^~wm;aLu247Fm99F5q&C%($_*1WLa)739WxIg^8V8q+@Iz)`Y z<24Qvi0noH`YrSHPBU&vfQ(O&Kj^gcv^~sGEOsR-Ts$CdgIlLm2_a`Io#%`~koblB zWV2Tv7ENF(q+Ki$n^;uoG`P_T3*>jjDkb`=BM^3S{P98kJpR>~PV+aSP_@?=u&!!G~++%M1>Az|jGG>r7zQ z!KBcD=FnDa&+VyMoz0+{&Xk`mlGRUpSOQEX%7^}Ezii5q2+2Gd0I9JD>2Q=HxDJ2p z>TkJ`@9@bXaMLC?E$`Pf3S9iEQcVfyV)2CVc!t`(LoA~l9?UP*(_;Ja^%4C!SvitO z&NN@5sm4F&i2nYrmmHjXkR|oAYNT18b*_-iCI5H4(=oOM)^eRU;<~mUH3t+j*yJ|7 z&FR7KG`(62LJmaxC-R728Fz_m+I8>Ncs8HIJ4SQTr~3&~4ytAR!v^77GSaQmbgATy zdj!yX#0A81dL&QV&%WK#G73N89ID*jlpwdcvsV?)O~w&doa^e|9F)Gbs_SaehtA)< z>r>Pgch#skQ}b>06)>;A{gP3CzDF5~q}^n?-S&&L3GITsA&l-S@~sq>;(QISC1Z%n zK0xinHF;BA@XdTLc=C1PmR)#LhgZK7iT8fq90r$|?*O)-`iLyl9jg#*<5jl-oLb?o z!!Qh`03fQM%j#vPlwx)7Pb(?ri#8%nZ?%OxxH@C5vUY8@_Ld|*#wGIy7_vt@`|U_& zcx{hU5h;IKk3d3m=rObI$EFJf=X*J?{yy@Uk8R34eNCWgT6rA|mSz7~lD{VT@yHxO zOz@T?O!th6oDAci2kuJ>P5N4Ia}35JiZ7v;b%G+AeG0YWcxCUmCsu^Iwsd?gHDvJO z{k6NQtra7MzX@N3V2zK|QOHA}wM5FF4qAC}&X||YPNKok1!1zaM9)u~xa*p2V31l+oP<}=SMiPsVRe;XzNNUuTx^zDyU_7zU^uo{uXboFuq!!t!sG7=2YatIn$$Qu z7qgOph@VM@dCE6$hV{DTLjnOQ_^dxXGLE zui#z>vgUbGW?TlUP;Ksw<37=l-y?cs`%sT*A;|=CJqCYqCty240;oG$uBIM41qF49 zPX1@F>S!8j3NwB`-(6Nb7{dGUk$1xrY{flKD39EW5BJ{}2Ul$EA=CZ0sA*0p=f$$H z_Ll8Pv`Fm$k)jnV_#)3OuGh9#ci@+dtybpEMx&{8U$x)A)@TE}vQ0%Y&$KFRauckf zHhFl}tr7P$)>whugerQ5zLFK=vgGg2$>13vKBj`a$4Ji}1$=*ord(LOJN4PYesTDs zahCS0RJp#URO{BpM{6I{Tin9k*n+X1f3{1!Cn_B5sa>%PG_yCTPc#yt%gs2D=Z@IJ z%UqTA6M4mgIFv1WhJ<9Ro7BbB#Q(OoDhyPjJM-L>#%rQ;&@mk_`b*Xnzff{oa0Foy z2Go486Vi|x@BZXsJsX$^LtG#`Rv0CDP4=1U=I-9ObkbVGlZ6LeI&Scja_cys0(Q1e zfHYo%Bd6M;4FjiOGpq+IFTpA?UCAtV6VAB4r~8-05+bEu1W?kqCSw!}l%xQRy)pcg zZ5s;QA^S6Z>QSe=SHakbp%h*Ie{(d%a@LaEPkrQXJlqlZY~K|ov4`%G4c}U@rg>Mz3t@@fNb! z!m1V>y{^vwg4E#$DxIx;bU~H6!5^EyF_oSqpBA182`&93%H~3JH1~({oN)qUPm@qc zKw0%f1}rIY{`P54nyAB(nwKKhJukLSfl9#;1Iw73=)@&KT^*#BlmW_&i}FbfdcW!= z0fLW8EUpNZkrEcuVht_HPBe1PT2k+lzef4`p9k2QJ-@x~j~aGmD|({qCh&_n7R;9ivBDr*7Oxss>ro*WjsIQ(KH2K`V+C;LI2!{1D2DbHX|68%f zQiD@+tnv*nFt66<&_ci^b7i~Gs(f>#mX@r`cr{-q*sd?kxW3#Rsa>D`RZkb*ZaRi` zMO=mdJJ-Iri6C3R;+6l&I=(xue>OQyueHXEEpuzw+q)Feh~e1F5W)Jdf^F7k#0RbK z`Mchb`}KP+xGw0h^;r!`p#unJIf`b*gakTG3=9>jL>rGGlaFt`dU4YqX;H#!zkVD0 zdrsLeF}(t;_-@Oh++6!ZzMAxJ&F;cdpv+TI_cQ=VT4$!KF1q)8gulhiNqrklDo{j^ z2iBa1cs+5R-Od!Ui7p<{`xxEb2`&OFU8{lna+ zQ9z1s!c;@*MaC2^1tQs2IG}qrdm~Tmz>9)W#n!(Zl^gPn6epkOd`fA#6eM>#p(x=S zZs3L8+^5h?wznQ<|NDoLx=h>ql>S>B^W=97(= z967l>#n|{w(DlIm@MFIQZv--10=f#iR2O$*46iTEf%`IlMWh24=W&Q0HT?G-J)5=77ykJxxZbW7h z>!u49>QY2r9M7#Wjr^@`e5bMG^9Y1UEngmu2VDW)rX0~C!sJwdV@n`lsov7QONy!? z$tyNQNGc2LkrTgviQf{?f^S{yEXY~)PUPmUDq{a5@zKN&mACJh!Arn`}fN0Yo~7w z@NHVuoOL#vm&T!9v~CO^xDTMC5cTPWr}S>m(V)w*Zx8Nz1HiOLUw;PPRaq|H)R?oH zb`hOY8mm&1?vQ~==51Km?L`j-^Ysf3LtDSA6)7QB(~w6N?(%Zadg|wPwceWm9fFRe3N; zrnAdtNLWwiYio7BT#}p9^PED01>(JBeJ1}+^D|G857rZ#hno@qo&Z8VPl2+KSj=XP z-LFEj8UC8f5|R|H^yj0*QccO`636&jGMj2;HtG7;7JgfyprSJXGIvomb{z+8EGl+v-q!AIUn-oqvWR9#txd3M zYW%4thtvo)i&Y!t9Mt8b;*>r28j@{Zb}@P1s+e~WoN9bKTDreb z{weo=ZInO&Y17T$0g%PK5Izy0`{dr$U&j-6#Zm(^JGwQykgrK9ucB0~&6cjNaJ#>hi zR=8;%exMWfctRI&f1WiX$2E4o0IZT|H>|Uya6YG1B62iNb(DQ(P{q){tUq9TDs?QW zeu3Rz_e)LbxtNgF;n+>%|_mC@AG3b$N>t)zJ0Co7@PEa^s{=%r**AlxAz#@+Q6qv`Y(NyxZ}Ryr+>N6 zNZ6F#47{}{BJX8^p&Lc+#al@?vKgFDW`Nt9YH9e-a7*mu8JC-_z?jqR@r?*2bMEh5 zoQ;$6Fk{T!bc@IK|HgUaG)38&Wjp2a*yyFq1_{ubeb!1%MLnz?N0&1swP?5X!+o5zWSrex&gB3+;R8i5r4;E~{bZ*t9J5T8ctPC4zC`}?}O!~B4(m=bxpN-BnC&1=a zR@93x1+j!Eywh2HEpxoT+25lM29b67b@sb8;c=5s6OF4b9>I5QE<3wiP9Y3swnefz zdYi3)O3Fy(aPCjD=;{bD+9{E_LF|^CGG;#8Ma2u(V5>Y^I;*8ah-4*M5U)mz4XZxR|QDKIp zTP4o4MFauQ5s3qWa2^fbIu;WR2u`Vf(#3fPsdtTw+H=C<c%j{@`7jYDWn;5O+RJ_yF1GDm&Hpi~_?9 zk$7!TMz}uf8a;(RaP`ebhtv$?tb9-Hv_e&+RItvr5}1i*1Q*|<3$n&8%KwRb-a!kA zK+abe5kObw9THH_eh(Nod|2?(wo?Cq5y(^Ul7D4vW2|^%aAt zo^j~BeV_-a`duxvNsj)jECfJIM34g|f216gY%9{;%S`4?oIRf()Pca{)A9Qv zm`!gpF?o!z3?-I}GU6Ejg<^eFtE%$&GMt<)H$3u3ny@v|jpYzZeO08Z&KF>janYj_ zSgIr_;0z*q*7X~;Eusr~NgKc`fTDhsE5-iFSDbOcLxXJDuH{WTcz4!+D0+BhHqPlk z=Fp|rlWUt*uIQPv_dbW6Q(8&|$A7lq5dC=WZ?ygQ<<=wCetH5F9WDz?zr4lAQXK0u zoWKNfhlGBKZP?YlvXE5&%W|4k49n?g<37A{L{Y}{o&Hu7T#f_a9< z-TUcN->)^xlb_bC3B?ToVAEE=A0W3fITPSG7?nsH02flFng1y$+?W<`MUx8(%kEDX z@Kbm*zD7LgJ?1Fd_o+E(huWoA4V~^7%b($j`S4kF4RC6TGH>A**+6=WUHjjUr7f%@ zKP>U@hpX0i*ho57%1fGN6Jf|dEu6pI8eHOS#^3P1dLxl&_f`uCX$`Gf<(j z01xi9c~T&Rh&W^9@A`r2bawTODN)g??pHt!&p z9fu{4S)AOF)1Zs`YfY5|4%o{%n+(2ILdwmb%lv+2fu>r$%$qb@c|gEjN4A2)Nn z&2u|{u5uiu1da8qNZ;yLDZ{EFMbPux7(6>ef-VpasilQ1>xiAXr}3U~n#eTf_M%L|yydJd=Z{Wi4N+EACoM#7>vwcXFVA-h^PbHD-C6Tpb7&(AA|hR*vu} zNlsk=bEW6bqJchVp0M6ysRZ;3PENS{jziu){E$fcHhceW~I>M zPh%X*cTm-+Or0RQ{-nzAnMd1l#q#ZoeZ~%~y`&Jw&hkNf>J+}Za#)jaU~26*DzN`@ zgjd!)g`F%FC)nxE2E^J6oIkiq56sOnuGH8h+4X~stjoZj{`Zyj0Do8X1G>@?3&D^U zI|Y38&6!jlp~*#A!PL)=%#W~UL=XSlR|=!)61T3kYRLyHDdBv@_K%xztXtI1-Oj_m zC*%S_+(5NnEity9ilA_{Y|k>Sms>%&j$^!4;N5zR<90b+%6gx!<8bU12^t`Bu=k+J z#x-+c-=I(BHC#k!eH6oQU*8huX{f8~W{KKHbu%(?U{CkZ%r?#)ej;00Q!SZV zdEGHLVe~T1Z@C-lS@sB~kOS4iIaW%SH0{r1``G>9s_U&b7C2ZWrNr+orG_y`Yx{b_ zeNGBag&0uDj_f2#wgp`>V*A!w_D9KS+^~dkr^dx(i&%*wfqruzEj?Ze zXEaMR5-Ucwf}OYjg?4>=kJd=pRc#kw$RN(9t4GR{`!mDuo}F=4)^S#5w{44)_ijAx z_43)n+kIEhl*vu@t@(9y9;@EnZX&T6ALAp`Xt4d(#XLi?K0VclOZ7Q33qCiSBEEGA z0V$}0o1Mm~m1!FSzt#cDt7Up;r`^xITEFyS?eX+{Pt(D|SB%RvDY~X1`2pctO|3W?`!X)qryYu&i1}%kn2&6wKT=4Y}h!`dF^hvWMT3xksbhod% ze@qX-12^mo_o!04X!qTs*pzSsocbAM0 zyf{WA9&{>BbZ1dBJ(1h!^J*rWFRL490Rah*$NL!kde%)vXHg&dZEd+?;-RrV71h>H zGX{T{{y3QT?sT=6TilzAXp?hdrX)dMG;_^%V8r~21 z4F;R0syAl?8j1N0`?Fe+`NYvHt~7K^WX6&8%K_nd%qx6S$0@R%!>61-U!Ht3xm}LQ zcts1nT6pWWPt(PukS9^m{4TdER(3zHi8yBb6l1YDlI41vLv@>vQ{L&R!Ci?W!L}{} z=$6K0fM~HYQU%IDw3zn@xsS{>*x+lo5$l_0zQD1$L)KXt#Rnmy!HxT;*j{ zMD>KN<2(Q)^jNn;9!ychW2Ig1XnKWA#~zJdvWgbb_qv_&QYr>659S)-nKP~y=8E3H z)P!2eHp^NhR*xc>$S!dYF5tuG3F2Ay+4SG@cJK#~=C;&rOlV$cTyEd#em)`ls2|&= zDdz3!hw2|p+$0*fBMOZ6L>H=}EEZ@U&6%#w_%=ZZSxi{8qZ}nO+S3 z(aVQk#2do}YmMSyHQ64KZ0+y0c36EKkf$M+rmc~hwME&*@-N+@3FNkYOwPuxFYpwd zqf|LO-VQsLONM?E@;;_PER)wyi@k9PR7VN7*yX;VC+q6_iL*FmtUY!up-)%ORg6nBvzpJ^t4$fQE%NFU zn^no`f6RAM@pcba=wGI5cGB-64MDhz`=e|BCxVUp|3t8*IfsBg=2QPyapnL0)Bis; zmUoGrXFDtjK%uZF3hE-Fy`CLhitwTNZ3!!c89RP=;O`iRDJs<5Y(&S|<%Y#HrDG&- z>0hpxqIEML!+o;o>YHou}D_tHlxm=Ca=V9B4JpgzFQ9 z>6PfgRKq}XnCYB^FoPctinVS{gJmmJIBAzu%SDg5J;tE4}qQjEH zj&Zq*W0(`=8ptuVFe2w=_;W|N!!;%2ssF~^$JythTyWp;XR7os)$Z+GV<~ZnI+9YJ z(cOj*pB?`@--mDXzs60SVZQBfPW@Pu7;d)g>G-*of{xa;_C5m+8F~IyLFn-5{E6vE zZYOoUYriH6AxFU$ENIOpat~n!zlCnly>V>z9JT~|(_;CaaP0^&wI`G0ka4q3&&fD( zktM94=nty%PJ^dW)tD%?jZ>Bs4I*sUzuHjxqG=zBzAeOCdv?%J)Ft;TpU&mWuUb*Q zW?B5vDGWODU5dAL2~!OrC+50h9hd>%UoLgXjUtF%B^xT{IR*jEA78bSU@_wf>wW$@ ziar(7AenHE3T!0<%6!ifuNrw7$pvU0H_04>mv?!TX)89Abk2>;6Q4uWkr$3!P5+*d zksfqG>U(L<1>sPSy-m>{A6PYX)_}Ven5ipL8wh){KYb;r5jw?is+! z(Wdvt>)dkDYZX(mOap#lu*yE1HsG-=-mJ)%SD2Q!rj&)CxzeNt=Kh|T4Y3`omqyDC zb_fz)E>-y~ZxU5Hrp2;t(9nukh066)U2#}Kg7BMiM7I*cEroL<_&~^*qab%RlSbNCKgaJR)wDfZcMu*L47*CNeF$SOoZj;n-xjV z=BbYBM5n_7Tr)0QZE$5*B+U{+LiDDPB*I#dlEtUyu>d@?1akQZM)hDg`>r%QSB>dT zutvCM2gD6}xo#O=RrvPoZRAxwBV-^mWq3O6W2ij1f@v9{Fz>hc2=t%$aLCH8TdF0Y zr5*4ZBZ*bD+=*`2L|)XeS$Z1%UNUWnV5jSBZ}f>TlEo-2~h5iNCVqDb*2u9D?Rbe-QZMTC7O?IYYPF;#fF?PhKN zOtgeVt~&q}nf%k10osYYiLppx@lDC=+M>N8ck%j4D&(assa~6Hfp(4>&BF_L@&m+e3k`YCq z2tjG~it3ELiWKmCcpMLvH1Vm;%fs$i=+b^WJ&p2NTFCgl73RpDfS~b0l`y8e-n*^` zjWOXWM9|oS8^K7xEk?l{2EQ^-b|0|YIdj#a89t&qnM(Cg&FuhO;WfQ$F8$GE%xt60z~R{FN$|PhYvl@7dq>t$p(4g{)wU zjFIkKDK+1LypK~!!BT$DQCObKRed(cLB3#7zqPV_3L-8~%eti`&sR$i5w+&Ew`Ex* zP+HhA7wTN7A2}9WyA5f~VsJ+gUj4+=-mYYJrAf(;VaS>N>q=>fhMFyce&-g#TW`e= zTxxyQnsk`xVMs#3^zdYxjkPYmr)ya>nS-iC;v{+2JvQWJk;2ssuzK%UKHh#JU@sN# zcmU!wV8xG1jXG@KzHQ(Y|?M)!SUeBFtKie%1Qk%auHu}1cP1g3j z+BQK-<{1eR;;JaC7CcArEqd)u@a)cW0$oJX2`D!sl zGoj^jfFmA0eJAWq9{27SiKo~p`T>~^zjjuH0t32Yb*rcMDLIs53wt7Wg|o3n}FZtjT(nmu|oH}%I2?V|9z3?>bFPFwSJ`mKD9edGXdnEN%457A*=JcljbMAy|M!y&Z$=$Ejl ztl+B!x+opHR-CHiIOn|<=bpS63*qx$icePdJvbs~WO-W`7MdK;`wm=FrYV3mcJJ?r zdDa=)8-sMULyDb{ok-+0dlxEIO=3|ESv`9+z3lk@!0feHEoZOM>)(b99^nDj^@1RR zi-Kz}`l|P>7y15$TB_8Y40G*CdMk#`7d?ydUsf5olIflPdQNFeL;u3WMdR*Ul-Rizt>ujhgg#7*+ul&%I=|qrJy=^lI_yg zbk++;eN6A(WkR-3*SkhPPm72RjD4n_)uONhq;7-imx;bMm8#cFYxMkkf{k;xoc_q( zb%-?rJWPJubL!(_?Em|9eBfq~*pbJ>H%5K6e@`Hk>RLVZocOLC4&6L#Z2cFQ@#<}1 z4Muz6lI=ejC&*=7k!Gj}pgTF@V9G69&-t<&)iMD}D?hYJn(T0Av9-dxRB7!cTO`&; z=rUE)GppnJXls`+LyTG9p>i`zW-YfSA(+p%3bh~cJ@A&k-9M?S7l(|mBvfk{YsMGu z|E|6q0ooX5;5Pr%;~iCYSs(oEE}x>n-al)7+ArdHfEc|#Zef`S=Zld&7;j33dm6PR zKgk`FkgH!Goz)wMU11GE$mXr0D(&}Z!pk)rb5~ne9%c>9m0v$K{w3MbW8u8*TwkiF?7oebU(3r=OugBn@Z@lxeC(6u}Q*=QWKX2-iE)E?oTX zs{Y}-^{c|(%RIK(F-|Rs0e??yEMBs72t><{GksX&&B0KyJ{IRs)_02Grc|Ee$5+j< zda71P1y^ibC49kuPy*ktIF~Bgnvjv zcc@L-8cb06-~SL2ukW$G-hO#*B&Ow(->$qWYHe4j^Vo4CY<>hJMra4>*2*^dqiJ2p zT)1WSZ_@X&!j)H%6B(5TjD?QP{fJzL9rvC!Zy4($h;FfcGVvo^Y1#c7>CD^7dx~hi zTH>bo$Vr=z_q7DO*$cp?vR!+Sn3Vl#6v)NubJun|tdlO?bte_eijTbfuL4#c@C%x8 zX}%pPQJ(qNPZK+QuhoD$kux&=5K-Ie0rD`TNrUqYredk@0RC<~<1wPKOLWur(rP%m zHQ0czbGF-BJZw4RPAGxQ$;vZ|m=a>Ohhr%O*#dzG0bdhaOU$Kdb}6wanxZt2%66P9 zaaG&3RhjDh(odBHUR^f8&%siolNooJ$=6FE1#OsMP zv$|Xr(2p#3mq?TwQkfA~Bw2zK!(>WASlDApqwZ=O=c7B;H4!#VV`W4CBj!Fr`*6<4 z^@-eaz%U}oybJkk+J&!o0yfC_-Da=bSorq!i0D8R&kx>6 z+iuesqdU^#&se0)oVGQZ?ObC3E4=0ySeD)<5-DQ(W@l?b{FA!>P{ifC7-&1VNcVk` z-J(ghf!xQMkh#Zcwj)KrpZ|v(ezyZe7lg-Ju=Xz3P`o%m*Z0>~^;6`dXAk>#@=IRU z4IXBy%Y=Wy{}DgMLLK}wDjPV&2*chk94=*#@_N=@ZR$?Bb=1ZG^d@K)2u$fT(Bp_o zGZjluB8kJk#f*PF7+oqGgCbXtvc0=3L{822E|xTe$T+^{9pCjnKW$w=*>LfNcvk!Kh|V##b zc7FA_Aamp07A%?9ppzaNxe$4)f0c}TL%&NqH*WrYfN@i(0R81bUVf=g>x3UAbygfH z%i24C_FBZo`&^(el9&})h{zaMp-6Nz|C&Dt{?U}_oeeMSZ7hQ7{5|2l{Ch#3G5O`b zO_--onKy7VuZ#-=Bz=TOuE)y0TRoYlZB_Q9)G&FyvJ@VrE-<>F{bHx!gy2e=`Rkzm zr;IHC+O%vm&_=?O^um6%C)*>&Pxs7?XUWS^ZYgi2Kr!mwE6RgPIel|;i|v6Oh#Nq? ztbkb!YoV|XSSKi2P(wS|9BW? zoqb>Y_XJ2H(FAY~-f@`U7;~7O))(6yy`-FDZ~IzQ{*_5-hKu}g*N5Afeq8ykrlB;J zoQ@PAVc7^(6OC)a{&Ffikl7W?+g?1`Bqf>8TkO-){~$G9iw-viM*UbfDZRLw80@l> z{lj@TNm$mIC|j7~O{eVq^NgAc=-&=u5lki89Oyl~D5s-%Gmfx+!{p=hnbC8%Ej<~k zHny0_ZTcdy&lJptR0@Ipy;}>#F!PPFx7hF1M#nP5 zb@3rh_1IEV0a$0!_uzl)KE0>ws;fD!3_0;L+xhjFg%4S_1_d&1e@|=;yhA*CETvR$ zKQLZUZEoZ+Vx`={=bk?ilcOf^j3DRL1ceU#aU|L#0@I?60hSos`nBM07um5MSDlfv zB8dIjfr$R_NVTg-zh)nN<@wB^(wd#_0LObYc6Nc` z$jlD3T=9mo*d#vd#vo`9SUjwsT{pTc=D)H8CT`IX?&8V!8#Hic0xvmpr7yG9K)6Nq za|R-lE zT%X79yWx||JBhZ}1ooHZ2AuDxik00ZY@o}Q5IVHLw@wcZ+$sDwh_D7OQjvlfqAXXAW>cQYiI-rOgmCmh$|eymCK zoJgr9z<68m(c6B^SWJkGY3>i@&{;t3$;&uGdEQlWJ$_8{El%O|gq%A#YbNi3I7b{m zABw{UfAZ*z`!Us)7GAn-yU-%nMbGh7bb(rTNDecYU8f!ml;bFUp&#j1qgXnv}B zx>}EIhV$$aO~r^392Wp@EaZl#_34REu>jRKh~9hHCD%1s^C!$Xbf9;MAJ-s<u`mFEZY zWNb`-wIZ6xPjX=Oi3=`=;F0N8iu(?}+K6(R8U<{%h$X=@6q+TA?eGgN^YOJc#m2Cj z%QWH97c1wi$IBAe?!EZFG!OmRYdA}wY+Dbfm>(&6BB!A{g?QIvY~RZ+T@^ysxI5?I z&PINOB)Ro*P<)06ugK{8&KzeeQRTeU&eUE14W)UP9&h)RlwD79!JI+z#)?#**^HS{ z(v#>Ai*0>ib3pQhCmPOtsBGQ0PScb=QJu)WRuoZQ>7+$ZgX8<{6@z%LTY_2SVp+n&Gl+4sL_q_8#4f9 zc$)<-F_#v-N#SMjG|-L+Xac6%EJYoG5!4~EsXNY~etOZ{)s8($6L6_LyZ zCmeIL>^b@xYlVDiOxJyk|LyZa6>PXa@lt0*wb|}v9?S}lWe_!dPh=s^2>ipZ{t?5Q zHg&5_gTb9eji5AKV0mxs^3wm&#&St7!+$bt#+R&f*UvtF)sQ%$G$&yfU#;g3c@b|h z1jRH7#iSVSg~@m{9{k3eG$G*ROE;2_t!Vj}Ket+?0Y`S88=Hes$6KapzqEGbZch5- zv+`!+%SP>+f{|(AB6WHqKy}8`c7+&;NkA=$E2^DeJzw}Rw@3SJzomT5_5IcK-V1lu zR^`7jy1dv>c^g7n!esOj%{=_9DD!cMjru{bf2d#y_sJvs^SM1~583 z{l*TOeHG@hdKHm7Jgz@xcYzXXIgT(Y7BB}{MFxDO@P8wnwEuqLhGA@^=)&li9y49k z;;Lzb>x-Q$M#HXghp*rl5J8=QfC00fXx67yI(tQi5Q!nM*Jy+A?64Z{3|ee&2BD&T zh*prHt6<_uc~T@12K5#;63c;{u&+UTq|6q6i~A9-!~BBqhFx8{$Lv;0)Rill)j50f ziUsixnIiK5{qK|c;ZOn8?U}g0Cq{n=TnKr&x;y2G%qOkE!j576v470ibS;RcWqrVZ zN}$e54U{iy*YQGDmPOwvicOj_3tRLHRTKCVip>?9+qa;3Y!uQ$H84uRZiDdSa3`E) zbx3l(>4-^PT)!$KBdCKsQuoeaZ406Q$XA-_&jH4?vBTh|AH;7G@5vyxzFHjq!IC0D zX3E*?U(F4UEI%!D(3YCGSq6RF!Ek9^&x=`pFxX-1Pnjl2`UxCPa^) z#&$lw2qyjPcK!EJZtZGfYOQy*QFWe*xs`0==kBNFdxx1f295$eA(clnOlWt9vu;jo ztgiR_L?Ng4YqvlYUAVv*~aAU6uN)gHHW5 z%SbvX#-gWKr^x6V=4($@M#XCHB(v5)R|-VaHV22zGM(~J(Ba{qYXGua_b&Z^N1O*8 zGVeIZbfWEUQqcpS-A0@771K7H!kzB9v}-m7_Y(6CrPKoN?gT+VM@MEC4yGMTjt`m< z1zC3s)JpfwN^Hl1wL4I~42fm1t9H2yxKr0z{w#DSue?fxCx3U-wGTM3DcG{EfZhOh zIS6+MO4yEt#S5zb+7P?dzhckKY*>x?Sq&D?^!$JLde68d+yDRHu7+7Am3vaTCz-j@ z$q3wTLjB2>^9W!g;w#TK%+PH zR8aC&fp*vN(~`7ddiu>ucb9a`8K%rH6bvuzE6MqyE7)6&%eK19s|so7d&8CUI+aubCkU$LBMp-hy=&qv0+uPV1Z{O6>0&t^-D z+s-<{J*-3=q12f@QKh9$baE=qt6BHJ2+>n;|8W$vIegHTIH_HDo`K+F?SPe5%79sH ztGF73l74*ANgK#ovl5+{dW|vHSFvgOX8kWo zGc*4%E= zFD1V^NIlxfgKXdh%70S^kA*6Ynn%$NhCxx+-sQP&%0J9<=`h=vu^A_sDZg0B1SVbg z(s2*4_LS9k*Mo4c?5m@T*AfX%L-W5K?dzACt<9k#)WuD?=6-1144b>h$G3Oau>#EL zu~5M+paQD=_B+i#n{CR4AH;1q4 zy#E<|*0UuBRFf7Zo(82C`S;BhkCo_*poWNQEA`}k7+ofBfr{t^MI0oc=xA|F3$zhL zx_VYEHe?pDIPp#;h6xm%LK8l^?2IaKgv&oY?V!{(lV{~$ge`(3KWjmIvosHlm(Z!N zBn*EvKE8$CD&S+u)W+)68>!@jkF{vKO0mWd>r}OxT{RAywu6V=xfr6yH38SZYfR{; znr;f3Z_>DLZJLHa_23SQEvYR&f1KF@h=(zYXezn{$`%(g>ip;}ks)T%{6Iv5b>T?ei9S$kc8blKA@G&5 zwYnHncC?E9s-?Z=i;It=k7SX98QSPwg?40rRPM$YIb-?ormLs3hvBGknu(F}PV+PE ziakM^{wS_(9?;fgFM4Pgd|?keU!mUdd&4J!d%YL`usiafe{H9_FT3@*v+cycl!OV? z6_Nkrm}@I!jd<<@OBS^Yj;F&mO@)q>LbP^`RVg_N-J2z=MG=b+0zj#2wf}MS{^?4w z_hCHW1nVJ>{|m&Y3vqg?sn3YRKm{fiSdau2i$_TZI5vc8@GcRaF5Gv%4f-jr;OK`i zZe=c~+D8-`StSG?KA$iZY=5-rj|tq{lIa_R7Bt^G4Lh*25qk**nV|+GRzxMccWPk9 zRnJpojX!AQQL2;kde`8Uo2yJ|Xa#6Pl0^2CWZtKbFeIn1A+Cj%O}=WtTyWGkJ~v!a z8l$7eVJk0tB5jbn&PQwQ=FLnocuMABaFaSZWUCYiio>r%zc)G`8LTAeekYk8qt+Lv z)P=^|#FeBBr)F(9I$tp}T9erefTfQTJvBWMQw40UrQoZ4OdC2OU#C{jJl>cT*J2Uy zFK-X+@3(*S7sXEcYK+^$4;))CBgL?-BG3J)BX&Aod?B0G%*~Q3^qx3LaaPuciXIUJ zEgDN33Qmvu79J_WaX~O(M{3o-XLmPWrtF=I#fqW+r5h~N@)9zp2HP<_jo&tZDz7-$ zn`*=zeR%z>*M?!~%1mB|Z52Sqav<5#LIjbW#^LNHJ#kW&=HOrGvMmpPKcCE8wONUM zdc)rE!A%5hh%y>HzY)T?Lk~WEpnwvg#!eZ;v3KwNDj4-TrOhb+eb@Jfi=?)ihxHJRW=MHFWXbgp>`ewnHn~ z-*jCW;^>w@Beo}!2<(B4_*D%wW5(m*jPv_d-^hy{GQw@g<1QpB63$6DdaFLKlXuZ0 zzar{IZO!qy5`SavLvqi_O4tG{$_e_;8i5=q4F^RvdIeMj?_XY9g91F)xluN~Xd#wxjg~YCKNNKA997 zctA2dF6l8F6Xac6NleRhT@N-N*in)mH!=6tFWn!*l;1o%lQ2 zQ^AzpjNw*Bts{!KHYpbA769=_)G6RLvLX2{HL*4cQP zI&a3e0VlycozI@>jl|r$u@2gcpj7*!Hy^OeMC>QkV|yyNA&S9F(;DTP!14-@EE9$u z9K?sju(@_g?@_;*UJN4?XuM34Tk4uEJ){-rewNA1sIDlW&u_uL2x?P-X zJLjx8Zf?e4!~L<<6dRr$)Zm&`C*adm{A)ysMSh-^?5sx6R?Hb<(=$D#nhyp-yAJnLAKh;g ziuFl5SX1A8nNmt2k0fmdKR2ryCxm#3I(g(kN6StXopJPEfW1r6mMMp2d;6u210sj% zm-(XCyZ^SD9_@U6Az!sc#H8%G1LfEjZOFV6eVTG=+~%SqQ={{IOeWXKJFz+1ER7yYKK~<0oSpwn0yL2)giA3b!lNan+%@r|yAzcWpwr2o0BD zvzV(`x8pG|#_bzBZ9qe~oWk%JYBDd#3=i|2^>L+`wsp`}A4@oLB z&9}wP^VGdmUwiR4)Mq`ADb1ffLLr8fTu0*pNJFgP&+MYjNz*jjECt*!r?BDmx*4P_ zXX+!@pM-*n5<^W_e<^~rt1$XCy0_3DXpYe30^@|DPgMcar|18z$#|7G*rF%?tJ0QN z>%^hyuG|Tq4DMZLZ*}(eNf5d9Hk>X7^Z^wy>0<_mifiYj!%3K&{JR8jAyPJR#Y&#| z{oNur;2t@aQdv`JmcQLF?=(2_d;$9LEdbX3H}QXY+y8&q_Mg{RQO5sqTnd>#0`91u zIv;!so(}&L00cnW$#n11Uk?}N{D0aaTc3<-k zP^*;EzyPLkRtS~_S$1xom(|*j;!wb?qtDJ-k_VeMB;U zC536Vh!uwa^Ovces*|gQinQjSzAq7n&>t4DCP%RB<3bP}``P*4XG?o2eVC;JtwtzKj5hj*x*RXz(EN-wK3zI+dtWSuswS@33f|oY-3EZpW0UU%WO)X8*m+2LAD$Dk*yZ@s=kW@+P9U?Pn#7I{+G(dvGu#{%fP5+D-bCRJSQlaxd=RV_@JZ`sNV3XY;_ zGQBCYL3TFuhw9}44II6cyzBhQNw34NKe@W3x+A%wf7x#Zkn}lVM&_&l@k`KGqR#WZ z=AI!SF(P2Pno=Y}w5U0~!z(fK@$R3D1netE59{n#=ImP}v&Q@pbbaDu5M4h1{a3RM zs0Tj2S?Iov++VgT75a8>UjFi6y6^}8?0}lSmblkmTE%87U9N;?kvJmdbbnJYFlDiF z_olAES%$-!_?|(Rp?nuFNj7S-ePv@b^{tXzGNXwvFgJY+@D5h)K>Er6_+m;=g1 zrdz!|jfkmbO8%jyeZ>qDBK@?D)3gVLe4eh%4yO%V16;+^Y>3yt%TGCPZuUP-*VUw* z`jro~0Su^mD>QyVxFAZ6TG1}}VQ0~>(P|M9op$|`(%Bo|%cs8nz&+65@v(Qw>;8C$ zovCyk#p)0a++FMS?yl+GhZ}PDWSQ(0kp5cAu&^gACZe8_W^p(;=oJDahiw1)4Jo;>F@F9s=Y?-EXJ5IJbK@R0 z2jm61D02s#l&vx}V$H03kpq_x)@j5%_IvX$A3`PBakh@S$&U?Ud=7J-J4TN#O57-j zDN=@9Up4=l#JKi+sA?ITR#oKB%Q*fADk>t$Dkwrvpmob@1Kd6(;LA|l*p~R`ZZ4v_ zx0SEGtUDVfF;5b$cX3Tf5g&c|z9!x3aD=g3jjky-XL%mumSsN3cO~uM88W;rJYobR zc{vAO95Pz>(0bV|H=Q%o*PiWpif+%HB$NqBg-es(cm%*#Y15%MY~lI(XEo9*pVOB< znWa}HMLuq)&zu-bHyug1+>w7Y?U3c2wm^k<&C{iwOIExYm=;hpTGFF=*F<`|W$;XH z%)gg71{L*~)i6;5_0l>yw-0|y%&}~1d}`AT$cKI3-Z?{3!HC)k5~742)v9e?Kq=IZ z5?@uh<}?*&8T4uvVB?kj7kUYTK!9b0c`{b|Wp=94{*tY-suiO5;-&?~>c+JZwmKOATE9Pc?_ zr%W8b0qk({9qFaMK@CgM=E}9MV>Y2;Pq+KZa_-RX854kVaSQMf#H{b8_?AB~7_A=m zaj0^jdjSz%&mW(Yw4+%0(*BNIr-azn`|nc&R7BF%A9)2z=~YJqU(>gnHfha)mBA>) zt81V<$WV^T7rA2F2NQzvWb=n{@C!a=F7JvC_?d>3hBK^E1vDozG_qwV?nP6X%_5)Lv#B(%JBe8@ zrVJZoLsjZ9o`4y5{5hr$;|jX-=*8=3a9f(jS4OQH;ylu#W9ravLK--#4_0-z2DJ$w zu*wTJ;N2OSgfKa0S)kq6HOR-V>(uRz7nUMESiu!7xoOK(yN#VO{+hOZQ>RLDb*eUo zF0agV7Nq-8z>9aIo}koNC3U z`j7TQ&ebNtoAcdst5czTS4Rf4O4`wUZ&z@FNVTp>Wg$d=Y^vzV=r(n5m7K2bj77*E zZgL*j_in!py%=IBjnUQada82;72Hu{e*RdRN#G(h##<8C9O&@%xDUB{HSUeYC!NK= z(v^~?V1F%k4g14Ns4`WxbcrbNSboh|<_D$B&`77)r?=KdHcw7jAf}{f#CY04O_qHo z9&rQRm358E|JfyQ0T?Z*Ld`27fW(e8+aVw&?*dMb{_(!OV*|ci=j>eIj^WND5w_4w zZA8w9@#cZ}{GIyB`Gh(iE4w^{cjYRoKNULdJ6}`cwWDZDk*u9-$m{RAB6g)5!3|1Nv@j zl9MNxVgv)EhI^V*`;e*fwng#wvae2VxFuLbs$tyfnFqd#mm8+Pd0qN)xund);Ci@V z>$jOKYudG)=`qFayun$&LbD$%wVh`1&lBHTk*d+8;D@n}jqex4NUdjZO^T+<#=lXp zw4?ky@GmEoX+{W*#v;tP4iC~E0A5lpZ~Kb<3#ck36@l~mADkRsC|Hdu;^$6UEhLeD zkOcY{i-EB6Sb0;u|N6S$VUn-|L-Wt%!V7qV0$an!`}u5Qk{!x7Lwqw=Dtk#fI6+yb zL;BQAvmLN#GPy_j@znKpK?P$Epg+RN22WLRdsR|W-z=JZ@0uWYFwOOh8Y(#73u>2T zEE(KZBvcpeW=!Bx>b)w64GhlBldmWr=XtKxD@(`X#eLMDX6^4bcFC_~jA!jrcH>?g zy6`QDD#O%)M_2b3SBTqu90eZ#JFtMSK^doIKJ zu2%?RBfZ~7n#dM^4~PfPx;?TROuU|LV}iRX_7XbG340GHB|71U-^I*q+GJyPQ(-?o zl?j)*HWZl0gsrX^ZsbgxKCgDz-6BxzcOij)xJ84XTn~PlGS83h0$R*7XeMiGZ8Cjkj zVZ$Qyj+S*!NZq}S&|?g%n%__WQj;yKIJi&8Qlr{d9&Bh)Iooat#rBJ_4>rPsw61v7 zD!qBhq&vN=dkgqsTjl|(jj_YP`GU+1wCh68(coLWA@kG$$@xUz;s0#>xH4>42fIC; zCFbck)6A`;6;mZv;tU|fkY)0LJ06@pPIV^{-agI%U~i-%X~ufzHjm+zIj6h%r-igT zZ}B~8no;>j1gN;@{jY62TF-2NWRa1-Q;)aI=Li_#m1`AawIW|l82WJXndUyfDNyw| z!hAiitc%@KtW5NT(&emhx92Z3^ZZ4kfj=fXs?EClY}Xc7co3`x|Izz}Yn*khJ!bHGt}{m)N#Q!pC`jdQ`uHG_xq0QRmaZJZ-hAl-}gKA z@8Ca&BQ5i1(HzJN;Bt-9{J(6aEdGuAAHodZ>{K6L*vzi}guVzJv~Fat$ptty5L3gJ z>M-u1g1TpV(<>|HRH7TVn{t0X~b#6=yV^%*mdHy@9Is=lL3q9AM;;8xly@ zhiYDGum~+_2|1OKy@{yCt=r!hyc7nG%fla>;tI^V0zbTNb+qSfT|ICh+YY56a%6|r z&(%!O!#Z9J3_38lw@<#Q_c<`Pt^pulWL8magFcM=(*FR9ER;D`)U=6l1u6It+_I7> zyLgk0Z#?!vGgVf;i88b$_ql}kZdI=bCQ#5U*f}j=y_ryuGltblYG<9NYuK#VA>x?^ zkr>aU^+v_W_MLfCQ^eD}p5$b-?g!rX+O{>W))V8ws@t{YLRM9@EqP`HC3Bu_o`&xA7#IBPZgGiwl_Q*|#I5Z4I2i!Bo@NkOkVZ7L z`w?C6&*b~*R9on2d3Ot}163mk+ogbI`s9cr{P|}KS?UbqKaw5b3PKkGh^7lm9rD0U-a)AvnAaM}x*Vi@D**wi4PT z$Gh_|cbHDgjhbl#*r%HT!M1F7ul;F)1WJUyO?^8WTgMh*YO^9s_txGh0jV3QQjcR~ zpU+J!QY3!5aysDfaYo7#`AAqA#v7G0oLh0~2y@Y-bbH7j6FRtWA^bY(9KDVtdu+Vv zjIL7}OU_5AIKXI6t3))uog|ey4CCZHgX-S3mv^e5t0#)98F&V(2e(P{A@8aTrcr3t(Tpw zYm5!6^wm8GYf8tee-Xn=l9uZ%3`=x%0%EGRdtVJvqnH{CUV*zRGhmyk_l{O8}3a{IPP3CYr@N!Rt}U7OxP*%j~Xv8a_{IM zQ@WgaR}?&9UkxCXoO9NB&bx7n<}{N{;ryBx->JR>E7R<=!V4f!7q4PxvdzDZk|dopBl5VoDAH$#karJEa?lnVweR8A9& zYJM3<`)OOkc$1&bxU`P$8(IEwoAFEnN_a)jOD(2`8h8gXj`8*`72rG9rX$z0kk+Q;NNu;6+dikG*O-!o z@pUH??=)6XRqPfE&g?Mm#dOl|WEDHqNPwxl$KREj85lDZ)XCZban694cbPtv3w^x@ z4~O#bn-G~0=x;3T7Nz6|Q4&_{fI?7a_dC8F*NL-^w2+kldHAMBbrxs?>y%oQa(k;7 zZWnw@Bu+A$*Q+3ZvyOFkMXNG>I+Tm?RG#Md&f4y(8BJus@40Pe0%TM*n`ln>nVmK^ zSz@RHUrR)eLqzBSQpe08T=cB#53l}{U$C(MkmCmj@Z+-yzlKTJ1ys@68f0xFbALH6|F!$&OlR7SNRBt2EBaF&*YS1s+0=s^;lALk?=G&FBssMWe|Ca?t@4|p z%HtXg0X|~yTAX7!b6TORrAqgdJ8tRG_+Q%xu3~qc*WFG0NBWqyzV3 z+e?Y1-KMOz*4gMpWcCks;)S1=zA(Ki%}~iae)Z7qVT59w2(98?uVG%5qhm2MMMxTR z(|+3F6?6!jA8xW z4TfTah|uHTc~Bo1(|C)*+d1*v^n5R6)qq+_+Y!QDag?31>|;3Je5=kKr9h#vdrB1< zzv7Xo;v3KBoYR1b$67R`!@Hb2e{OXK4cYV?MXTyYva*)?vCb^Xk!Be@dzAVBo&>^t}=JQ>4?vXJ~mU*=7 zl838v)`=5Num+R|vRMLH)c1FaRZrI!Y^W{%FqFBhKo4BB8;!v^^+Qs@XpOMbhZ6z! zorP3h)OA&B2v)DB;UH_fO_f!7%%%4ag9?U>@_7LFLTIk3(O6=7SihFxV_w6_JD>8z z=XHj5rdG+=u1#Sa`}92HnsYKl0rfE5&fWE~WOGvq3a)rr;r@qQ{&Yn+ruX%L|n4jnQWC`=9SVdlppuxWrey_eo(HxG@R_v zw+%8*%=+L_`XqO7IKB5I(1qQM0BRjnr{;%^tn_9@dxmvw=gTDH2Yl_za4hBDY?Ck1LHIWqBbj;VH!3_#EkE7DV~HN6 z-FhQyGi}A(hlZU=?UoIc*rlDnRgA>bCaJ}7gm=Uj(05ao=Bs*7^>~Jv(Cp6h`>F+f zh58mc)k(V|gW|a_AF>^#wH+|=bwQpiPfxt|9u_ycgU#6nHAz@4z|Xq4gUCf$OKQ5U zUZu$^tTjli=k)!q-4L45x4QcOeN9ZvNN#v3z6~$NbR7MfaO-?cLbEQNNBD`QP=Z+T ziaItGc0I+M;PiU}2+nJR{0qNzAMTjroEQPSv)UNL&@12hJVGxt%6GJ8`_oH6BvXN= zq^A3nRnC=t`5yCtjE!lN{_FTFrv2j3j|lq2`2aZQM4rQ+%kA2^xmmJ` z-C6|^kGAS^46ZHB5LA=ZQ%a?+QzjHsYa+g8)Y>+x`YjI92Lk#KwpF+{#IGPM^?p*MVJ1ZV4SV@nFwUI*kZ;#0dQC?E-G=V6Hh8+9`LLnz+x>>=TL=3}9E%79519v0 z4c6yZatmtP=XQ=j2Z)oMll`TX!JCUlwo^qqig{Kh(w-$wJ&r#s7SBdew%Z_dC49uE zTN=)a6S_8hCpNe^+p&=Wn#Pxegm`E>Jq3sXeeDxxt`KZwamY>`%wRqCsEKXtB37R4 zXR30$o!{uJyfi}RZ6drv;+Xsw$7#K^hpY&6i=xzb zy7NR^sc)^Fh`2im5?Ogj+8IC_*Ir3^%Kr0X!0wJ$%H*OCKp0(1!5=*DW*q_8;0YGz zpAh>9jELR`yzSd$*$nG`e%U~Ni({R2%?cTZU#oJ=%{)D~dp3~*%@Rp%aEdiP5(CN( z>mA7fEYA|GFXeWLuS79`A#TrYE)W!!fA=?=2W&m)`TEk*ccrIzl*nWj>>yL5cP4tv zXY2SY?z_$3PEc74PSK|NMe)Df$e&tG;qL0Fx2xn$3h+?6doik`7vh(?X`J|t(mx+d zT*$^(VP8LelV361sKcBiWBm(bACc?BzSv6) zrZ7|-{0ys?_5fdSf;~cl-nD2GXMaZr38T5QaA-jz)?LA1gNXe@#3jx+Ugh_0U`;uY z(3QH~`?a?-py|9ZMZ{erjp3fzU}g%oTQ5x;b5zroq546Np`M8(EXfMp*13`FQ&;A2 zhTp4nLgq5iI&2!IL7(g?3hl!pk2F3hM8%p>^zklNB(UOhVdol(Xs++W_6fo|*BRH@ zOZ4N%-=%^?!#Y}Od(XzSElNr^x&p>4`Hdqn&zQQvDPaePMx!$chtYOnB*E>h`IXl#Mj5M5-D45=uNJ`(ikhqtdcJ84tm!KN)f-nPGnuX zI@E*G>+>AJ0;MrH^LY!^QMt-d2HeU_IHBI1ZpE32T-_>=ZXK2y!^ol^;_kXVrH?6=EWHZPPTt%QP-f>rs-oZ z3wIXC-ysSXg|w=%(HKaSQBJMZKC4%A(y-vVA`TuDnh{Y4=ht z6wWsurpTG2C?oLT9W!@BUle3u~YqjYd(=oK%~GnPY5B@&l^m>%P?Lq>NC*a#3QR`>*GfoGX7booOWcRk0AZmE9Fx=FPO zgOD@%I4)o7kTOnHDvvyTIWzVI&y@a!v-_&+9FMwy?>-C;QX_P3+*6pp1LoO{&}y_f z|F}`P*XP{z|5+d!;~#%9Y;uCRYZ>M}tF_xIb6Xp7r`@H1!cGM`0EK$o=^>-WZx)9c)G&s#{KVQ zgFFkyED<>AA?e~of=Z^D0pWm5lM=oY)jjpFzd}y4ctWF>j^JSdxt-%cKxJx!PEp0^t57eL@FIb(bgl&>^=!&5VzF>q z=XUp3)QK^7Ud868QYM}fRCb=w$tYnLJFVR=xnbsj8KBklIa^~A>QzUjZ#1nQYW{Ld z#OidpsEMT+hqN7AG(Cftj0^46vcjn}?wIUO{oIFh)BpXAX;CO`R2UN9L3d7t6NKZm zgVZ6BfoY8iF0GN*nnsKa#HxLR$FF7XnqrRPtS720Q>*{rTzB*|H3zK~*FM>3TO7D7 zbqZWa%&c<>Uz`#Wx@RKodV1)g>6G05cM`5X30VO^P!t0gC{j%(rv&NQsRsG9@&+i_ ztuHhNUU<+YtY>cM-!q@uGt99T$8D3h=h}e6AI2l7tf2UywdZUZ6f_WR&9@&aDXX1B>2)PbLK*(=bu|bGA zf-t4SA9zpBoRxv}!Z%qE1fe4mK>a z@LkmcbBHv(XR5TmphDq^fM0rUWx5UayYT)f0=OA;v^Klxfj+lqgdS;cWE>;XY9i*O z$c+uV3}?~yvE}8dJXXY^^j3q@Mi~3d)4PC zpt2iwySBrLH|x;?IL@IfB~gGq(h+cBG+Ph8ggA{uA}eBat1Ij3G7^_Z(rEQfOP%!U zWqJYo%vr`2ho?Qw7g_0OWjc%P^*4TzumL_J)zNGf=$B$qnf3LHZ(j{K@K_9+Et3Lu zHXfJ_4P+PSWP43Y&SJb{L7R}@ z>$K#mvyIrWIrVz0sR3h;qq_%d5wMTd>yK;-&%OOoc;(xVh9{H(8fy-j5hz#Cr>nKEr+KbE=IV6UiwP4s6B(v8_Nz-1wQ{pE@| z`vO(AJ>=toWRwW_N7LEvPci56KG%;<)~Jl}AlGBoW0v#Mnup`n$-&zb**jHDb_{R3 zI}E_)E?sL?!qjnFfn;P}frZep?;cgP^_8E1GX?IgRcPppwQFactCF-PMB!S-Wxl0X%t_$nQ+ZJa z4DozHn1Z)WTu2Th;UZB%3l1j-taU;N*tGG61BaFPtRU~(?|$evXl%1V?db8u7x)hhm){L@^P-MPB9D)RjQyOI2h#I(Z)%Btj%lXi?wnaV z*}Af>2t8d_$*RzGr7ZBEZ$8I-7ayvTB{zh%fqDHy6%Jdeb)=YqD}VL8VjGv`_-!Ev zT9#|KT>R%|_C}m+@TT?ZE|{EYtHzT*kwu%NYTh+2gQ?O#V*^^oCllK8j}(#!I-1!@ z<-SQ|?4G#uG4>PuYdFO+qy>np(NZJt`JtjvS2#CHkHf#Q;TtQbQQlYC()X!ua+B>myo(j)z%mVtClfNP`Wm@b6!F+u^znq&9`- z)Boy?UEFJ#IlrLpM~0>InnRu^yT3Y`GQ-X11aHD`eX%3#qUZt66i` z4wA`tbi38=af*v=Z@3*;lMxQ~&Y27Ir_UL%x$Fv%hS@U+j7!5$CQ&)L8wg&{Z4pKf zy;A3;Ho&v#imxrLEix+%^nO>-Esbjs(mQoK!dplR{z0R4K!Ix%bv(STF3GF_7W0Rc zwqou0Ex!)aCaSZA)~EZ~>uJ-usJlydZPVb#)&a9_MNfyEIDNFlGiR~#vGdJ_ag&Bc zKg(Tx%M}x}gZJ~m?#>b5Lwbe45#VvrGw4c$7=%_D(6&5qWfD}yHs@pbEmAuYoM&Y} zib-cZ>+^e{&tr5$p7liQzR?AnM*F}6OBi6!qwhKnb%n*Uwe&rB7hzrSsk2=d9?ZH$ zJ)~xiXL5%X^tcQsUpoHGEaHdyvYTRRqdcHvY`l2}^9n)^g(GU&g8!qvPzIzq@kBEm z7u}B3#WQgBx&PHhr~$vZUL$>+94Irl!Mag){1639<^=us>;KY&$Nyw{(w+czd9bh> zfn5+W6JT-_(x%;f`rbmRXuEyHjI%1Wt^sy~>(#k`dQF>k-}XiQ=VjLoNHG9PX80C|MOwf?2_ktgCLO|+Ti4* zk(wDx6HL^xHJHWVb3b`tbe3WB+p7NxDS5a{2R>Yl(1YeFK`c>Q)2Ws@Z1+N*h7$$<<7% zkAxEQ4zRfoA0Fra@XxIe$2d<2IEMW}`}{mYTW&C*wOL32WJS~e_lbYr-@5$fg#U?0 z*g`EfJcVoCs(1&KBMU^79q8;D2I)6SoVgDcX7P`#r*2`#papikGEVKCdHM9r)&$V z$f53qjnho53Y;Seq4O#U&@w2+Bvh2aOS?kn;<_USs9)7X10Dufc+M$KRJp!CI{e_& zd3ZC>tudoxUKHMA25_OL2|9m?1LNPB_x8T`K`YVkv!pFo%o9Y_e~^Dw_h<(gr!HjJ zc-swSyr{0i_Cq-o71)E$AW7u^(}^?T=YX_Hce4_@H3Tg*Tn^o_9Z*h)zRva39>ILT`JYdS1@3@&gsR4vf|JAb3W|@ddpb z^U8JD65=-?FMcwRd;UDW{QcP3C;AFYwl{dSwYY>7ulu~^y7N=(Lx&%neNlOyA9#L4 zXfr(NFIt)P1@Rd_7F2};`nMKF6vK`MOr@pQ*Zh$J`AuQv{cu={o}%#;rW&hWPofnQ zv;;K6589e8>Y#_QBJ0g3$5x!eg$>ir$=FC?m3!QjE7pp*jd|`CalS_uN#4-y#G=R~FQ@g*taM|Nm%QUHAp3BSN-}2Q^v-!`Uf`(5ws>(` z)H-K9L8f=ipZ5=N`S2fy^5s#>)fH}@poNOA9{SXFl`(|jFI`PoXlwIq>VzIY5Hh0aH#eb=fpK>ucT1fC@1=fcmlppJz~8lw=1k!#7)3>|SO`Q@ z*Ir-AJ8j}KiO{gs1NaF&3B%qpaHMbJjwNmF-4}IFNRSf^x2?n$7Qt=cG{a)N0dTP5 zYnF&=^~8)yvq&by#Y+^dLkWm4(B(d_*lJ!4!FxW@Zc;X9!|^ki^vYdKF>;doP$NsU zLu&;XX5KpG~^HWIB ziVw_FVBpYcs{3Bid*-TLsM3QV4>!+dg{Y+z-}N5?7wh>0$NpFZp(O)RI3cW5^qLf@Be*o-xU+G(W^%@S7x|Bj*izEdTmhqCC@{ zWD|OT^AIH5UM#QTP-Tj&?Mi1%Oqe1-tZ=5ZG?B@hM4KC4iDF%@LL?jo{hO$BJxhXa zl{@|Qvi|XFP7Xc1y&RE`M5TQkmhwlh>d{F zeie)oN>O=s&*A!#u9tzPqEU}!aZ9r+rKEFWMHjlL8Fr4yyZ~Qd7k^s}LBw<~X}oOw zxIZXFKWO__E16m9RXlZB>V3x@jGya2#!dDBKOlo9;^#0QouysoJQrmp+)M%d1-_&r z(@{jI5;+{#$aUUEcKf3VeydozLTb1=Aaz^ZXt+}y=Cgn~FB7ClgNP%8g`Y}fISTsz z>{1N3zC?{#?;*eNl4kbgqK|ynN4)lTx53lsNT64b85Vte8Ev~_SsSH3sDmjN+IV1HV63uf)4%S}f;xZCA2?wYP=Z!Y zgHPsp{QdPDGKo`JDq|Cv{zxo&oX6qh{U^~8{=xfKw+{OeP)~5Z;`Vg!9**W7CHxjQ z!oa4dG9 zdeY|RS2(w)s_P;$CO$GbR3aVvl~y%$2qP(9A~4T0>>J_(j7H|^X_{Ozd!8UHE&PGn zn}(m?q@T7#yF8YJ^ei?R66yAa>yrF0j75&FoTQ1q~NY1uAnt*#m<4TLAGOL*IIgBbNCyEG0qI>3A~_aBK#24XA|e6;(j-VoRC+&Bl@^s|3=rv^ z2%!iFks5kPklqqX2&9~EzxT&C?zsP83^Ld|d#z`$XU_S|3FZkZw^JO=F7^JnT=yqG zyf`BS^(bK5toY+kco$HJ!AyY+T3yb-B!+_NXfFSUqcctD?t=2;_s9=`Wkuial6|^M zg8Y41yMBtv;o%=FMKW|0;?gFVt3?gd0Zy==_8fvo~X zT-u=}6+7oyiA=>mOmSeP>oz92WGbic*!mbu~9Yf zLj}vF>i5E%b6=4{OyF$$&cXhIXIdw?+O6xq6GA`FecE-66gQ;YYAsg$w`7_##VNgm zXRG`{5uc=qLtaB~QW;O%we@gSgLY%rB`7AwLGBDoovL>yd?h9SO8WgF$n^beuvC}L zaV;C1<271#?EPqaW z0cy_$CAW=bpQYQ`RRg?wz+qZ4;sqi_6Q_Du9^$a?Cp4lKQ7$_XVwJskdA~@isPpcT zT8J&{2-&wm+^zx}*BvOZ&ryztpSu42l0)I&t%TmuUXP7|k^)1={KBM_B4F&sD_|cn zlLt5qdQL;=&jyXTsM3*WQhjN)-zERp8z~mfr;if;es`iIp1|=Y5;5&@Xk!Zy4(%_H z0@#TC&|}Rf%H;^MlDm{jl}VbA`=x;C;>A(?lJI5()|T}JvG575{8&PzU7zmM z@!M=HlcM^j{Dn-M!M}L;qC^ee>b~kjgTHQlH9^oN?z1Ca0U0O6)ci(OE_ia&)mBd< zT=I$m3R2scmY^>3!MXwB4dE89Z?_d@pR;y@(D@evgzsZpDZ*RA6zT2(xx444>GPwe z*^g$No=w(y_3ae2?UuS!gm)5FaD)`>Ru3@vGC#6E>2`1C3G6;uDHSqDcH;sW^jF8gw{?)xjxPLDuadvR#LPN5n7f4Kl9v)f>`FGjJzmyJ49Y-+WHXA znoyfbHvjPOubp!vjCI(5C(H+Li9m5M@LTNtOWfs1UV6+&CpNCJ8rfFXvJ;^)dmORt z7}U&Q%K)B{%I6@>h1Xa~p{Ah7j%&v{-K*P&f42ALF6TY_Ev0C3RcZ5aS2>jpOhaaoJ>loqfLe#HmSPp%~WCHLdrg{L_vN7 z-j(5_i`a947h)?=i<+1GT|}=}c>G!q3a%erUNZeyCV{2Pnq_n|#F;u1a?UPLtRwyX zqBtPdE==Db^0iv%nHE+oJ6+?>Ab?(Sm;-v}>2;NVQ*>1yjKmh&!UM(&5hE*nqV%0^ z=(&Kyn?k2zG!zseL84(?PxqI&6iWtdZEUd07I$ei?(PgrM8~ZIcpO`(w`+?Nx{(q= z>Z&?IsO^3S#tm;uZRDNmpT4a`X(m-|unVkm=B(WCczjWs-Mjb4_$aLLCJ&Iu6Z10F z%L{NHi=J1AZmJMBr_%cI3wDP)A+Z3Gsq?xLphGc2zE`eL zuSDNvy(ER;=Ttq(80d2J@pY9VXoa7U2Z)Kn+=YGlNY7j7Q=9k7v^#{o<)+FG^^t>9 zt||_2uN;rXP$ePo*`y>VlzWxHhGO_U=N>;pg$d3@(B;auK1=^F92}F>i{jnW0DR&Q zF|V5}W|eF3m&Nb@wyEDOw_BxZ0$Eoep@v$kRcw;H>heaY@65`pA~ps(+%>kwQZq=Q zrdY2I_frm3C9V>L7WZK1vg+IHN0Y+F%Y+WWfry1dfHr0&0_Df_m05cLu0^rO@|#Ae z;tcC{0$0Zz?Ms-{$G5YUdX`Y`Bz4 z(Q_ALU4_P(jFy%gNUfIH8FA$R` zB>=lkVBQsYypNlibb8;p&9~hv+m;VI`hF9B7}$Os@o%zAJK|OEG4DPS4@~aBQ?U0P zRl*8AGThbcB8EyKI8lFxo7nITvBq5VKrX@d!8%)qZjZnbv7WbFJdU&jqT!d@vJ#sl z5wZJeiSa`Yx<3;mL}E|x#H(rgPA$^; zHBkNRapxADK6Nz)N^k4==D`R76ig$~UF~Q{pin*WMtWTpb?Shh{dj|k^`f{Xg1Emr z8#Qo#P!1@4T=q8q(q9g*I&1(<_^$#C(JUsFH|Hsq- zXzgSleSm#CH|#Uj?Og}{CTDl9nlx45Bz*;FBr_?dP+xM{*3aF~R-c(R)fDT$so%Zf zfRAKw=o!xKa=0h5pXcN?Qt)1cL-`TvF`~^FzmuXLwzhIO`QM4#>^#uzOEXdMRBG9^ z3HOf1)XU#;rlG&kF>97zHkGGwxiMPvB?V2 z^;m@^_B^-@ggg1RYrJ7P`!-G>C}{wl>6w`CKYrM@9bva+_-dMS3%%g-@@4`c@_&*x z{cHffa}AVx>7{S~-$eCiF?ai_ghOt(lI^*(QpKGG4J$wV(qznG(a4hv2OJ++QuH*H z2GG~Y%b;sr*LNBBi#`mMI;qaBdEQtQmJhz~r{FDnl$OdicP zU`C=Q4OPPDnz>c3uTNMR7Wz(AE9v)jzUC9Oq9-JllP*ndeFo>tIL zYw*fUCuM@4UpL&bRKtHxbr}yF06lrnYd37I0lMJ72#(509#mD*P{GN`PrP*FcA4po z>XQv8&hkSNdPQHh%q$PhC%?etEK$wb8v*ROMArzH<8asBHR1yp$>vy%C9E+ywhYa0 z5KR19IS1g%8qK010U^jHCF{i&6J}Ml-cGWs&?z<-H$#1WK!mFtCQdlu4EW%W#5JpS z>q_+f6Le42ON4iK>7Q%<-2!ER6i_4!)8eQ=BxlKmu0{Gq9@LW;9s(Nc+X2Ea&CLc* z^?vjhQZyPc)#{~qKIoRK4wZH_L$^&&eXUs_MqfnG6<4;bP<=d?tLQqP=cAS~|8nD7 z#d2xwp44v;9hqR?y{y=j{g3dHU$-}+(_DC{Hk+~AjByE>Q&jY8XM_>r~QDXT937=;%5Tfff_i15>b7U5?{7Ie`YM|A0^KQxGzCLj>2RCWzr)9sRu8kMJCU9+!WAo^ zj{SY3{j)(e*EsUsY4Nml9q!>A)9iZf`H2!+H~RU47MJ-6!Zrx=B{irTh!8VK7fsVI z+0<1{*31&$q=*gzts7W{5-MO@wH(}5&^F&d7LK_mMR5ptJN+Z=(6Ql1L4e~c9QWv& zfh7I?r$2(yA9^Qm!ccSHEANQq0_;X~;>NcML2S5H1fpZ@TRI&EJhQg4-#T3nPvv0W zQN>jU$d!54)TXj?&s-26Tg?;PjAUx_eVBhyo`y+LY=|?KyU*=5X@I}b^RW*+^>XSFj7ou7Z)LNIP4aq1Rrd0Fq!I@VV13 zmNGiUuC3L`A?F6lAF4q_w=y6%b2BMxAw`40L`a+dtF215#l8XZO`$zyaT zX7&S|idbikJp+Yl4Y5-9f9~ypMx%Ya#s#;>mfpXtJH3P^6js=~%-EaEPP||>V}KfY z3*WOd>DGz6&%%NizPNumD*%@nd1w;GJ4?@VBQOp7-!8qsY9{`N#Q3VP(?IAM$UB*{ z1GfWC2;D{vp;*mbQx67qO)wwvJW>pvlw#I2Am8&XePp}TBHOdcabnxJ^HF|Ct((h} z_i{`=0#3OI%1g@}D~|6WAZsOCKFg~gAzCOy1uxzywZpNd)hyDD!Ww^Z~M zt^*L|m;utbm5E_wnX7*l(}-knQPa{Iq&`q1l-bm_NffjN!h6;qb>N&LW*Z!}zU;g; z5EQdx3U1IUoA|a;AyLOh@mFP>-RtOZ!Qx^y{V>x&iNzFRc-VrcrlB`czOw?6xQJ%k z+49iL#NthQB%V7!`Ehuluu2!`F z?PG8y^G}t77MeHV_=Tn4<-a8(mogutKsD+eSHG7jdI}O=uY)6sS+5`%;xo8c=gr=6 zgLjhG+{bcJPF=|=b{t=pV|DmDMVfjJ{oR^B$7c^1`dQut(-nnd!SygNhT8fa{of8iljeRu`h{oIkcXxxGj>A{OB?X>=?T#-;UVS+`+d$?K zNZr<9|L*qGQXa%;v(f%$pc%6w9M;?A34{v@2z^%mzLpS*i~w1DhARXa+MoDjIC?!ObUmg=H#Ww_Wt z$+t7HTnO}u%QwLx9#>nt70H>jfD0vX0tyZoj^I(u;5UQwiao!CBIWhTFiYI>NM0`F zaMtO(M@B(;yXhE#1oyEX)*FX?FssUBQN$A!OY8Eo z`PKUs?yILZST4g@)*hk0&H-C5QYzr1fFKWoJ*OhU+r1MH*J+9y1_@G*Ba*zS|DAZa zt$i|T=B9vqxMS;ps=| z>4?{0WI$BTMQ0drzwg56JOKyuJggQ2mFJiMP*Xij}IJ`lsGhbSY5e;}xD@pOV zKix*^2cu&0t?Z(f;KSD^S=_)sEd0lfrca$)ryT1fvIRDbFFV)DLFh=5v6vwYlX>sO z!oX1XlLwdoofY+BECED3TFPkz$pj;Fx}}zOz6cshNk9X54pPCgi=cLkwoGOWpH0D3vKDbhpWRD$t;BaP_a*ykf;9L36 zH00M~t->qVnrIBYTM-^9jnTO{rf2G%eLG)@`2PjpZVEYn^+w2qY-O|H=%QSdt;t9TVJ;Xw|RxW7^<1g6tw@>G*!^7A*)O%u6;-h~ILQ@(uUUFf-iknOv5M(*fzMx3E z)z6Y{`s>V!xlQV#KApM{10aL**@`Cl%DElt&q z8ch-FWZsN}pJCEy9Cx{pQEnGAyoph1oEyAp87u2i;^BjVB$p~JDW5TB`}8g%XBN)6 z0Ne#!iSCuq)|MmrG9Oc#gI80>wuKTfq$02m)(gEtMQi~S$lo-pj~o?%Brs81_Wy=5Ok#qRZntkF5C8o@tO9Yza;E$)SE0Qe;VLq`^T&lHJK z{Lra1eMum%Qj^S+w5)bb{<&dFH468*nPWhrZp*Tu`t?AaIV5w%?7tJpfWZOQX_EQn zWP>-b$e3VfI$RlrTL*jJ)y6|Tr22CS*+pG8K`93o8Cmbw|2y%$ES4vZ0gOa<-0Mpk za6$;I?r{G6bOr_?^YTGctR?OJQ%Eq?{-g7g3h#=<6&EysUEdEtwd=_+#w~wLTLTDD z>>tP~+V?qDW-v$48H-sit~GtTzc2~`SrL^ZDG%n_pHKI%Ti%4s-0di{2KLM+HcmK+ zXZ0W=@~ZbwQGT5_fH@cMMUzX9W9_$=65?05GO~VXLvPL~^&&!B5VH?@z;e5c?FiSC zUPP;7Dc04mdfD0MDh&#>BXm`+^=bV2#;sqPzi}sWdjwL&2nK+k2xL3};UfN);)9Q1 zzbm1I4hZcsQs*FVAO!+&9eNn*$mm>f{n>ys60Mz+C-_|_91NTdz;3ZfFx%KB%rxTl zp`+9)`1fACtsO~c#Fht!Q6_=6zS+IL6HMB^-WhyohcbWXzp-H3FntWfT;aY*c+e#2 zC3>YRzqKKMZL9_syd(6yRxZbnd9WmppUw^G?5gK3_0Lt+=IklFXOL8}J87sRsoyo~ z$8jU#QK$wWaN6MNfMZ)z!HYO4*WA52XON74YZ(BZaJ1f%AZ)&;G<5D7e%JvvKbCXt zV&^GtoCQ7HJwU+^_WhaWcLm(#bT#$F&f1D3w83NoxVdP53;5_Z+@|-a_$z&`=Vq6u zw|grDul~JY0%=1|HnTUOR##hRn1v8r@SSN>VLvqR!1DgesxQmFN)R@X8~2*4-9AMc zdcTlj{G;!hl7^Fu+R7ih$H8wDXS(ogK{Yp$<8#8!B|^^qtm7F|7G~e8M^ZLLwKQOu zmha_b9R!omcX4P}=%MmlRIboQiPhQ;eC)pEpEib_1RJse*5}Ab%lA(46etD)RK<_zzJ7lr1p3oHISQ=w0@EiC{oySw0V_;DMaL@cRv2Nqil^{S8a zaObkaD;J)6`|}yfokIrBb>3sPPL6ZD!_8!H{{Qj88~(qPY&&pKm<~0k8za8zdWs_S z7MuVwu5kG>vqt64rq0~yKg^jf89uEHeozw?(j3F;u=gXenHT}cpOudjPPijiMeV`B zmmQBOV>4OazBkQEQ6rx@c5J$=vx-bIZ>^bDTV}$OqUlbz77Z>BG={}#OnbifomY)aQ98K?Bz;?@tm>$1op#Y*SMU_@a0po~geBjz(Ug00Y zoVG(5#f}?~bTbUiE>B+zvun1Tv7e5g?a;Mo^RQ7jssp?Tu>PfLz z&|MF*{Gr5OBw||;ZT)@U+H-T=8`_)Ic>`RqGoAATdB#A9&M>3 z6a=0=chlonpns)Z_Vqr<*{sf#>z1L;i()mXgl}lO6|_iS=cB-~GrD)c%XUe#w>m)5 zT~JrSh4Km5?MrFOsp9c9N9GqxK2o_Ky2{pH)qOsUvf?#~J;kM@!Zr1~;KBVmy{ZC7 zV4y7MsI+~O`PG*N%=?7=cS4~V(G^EuJjwvax{(m?j|VG!A3;ZHU#W7NQ)DR)D8DV; z;w$vY_2gIZ)0Cbx4E?+#Q?8b(!<2n(mlSeK0q0!XG^!m)OZr%6x`CDlUOC497RRSB zkBqpK8r}+vku*Uw++8BhIAO~I~rbiqxq}WiOJ+Ng+|r~_8F)hY5slqVw$9r1GN2+WSc>CUblonD7NX- zB@;y#eQmM4wP~?AuQZ^A))QJB*#l-&pZSMR2~+1CpJqR&>a;elBv1h`uFx*a8lB@# ze+L6Afr3B-{F`eXy}a>*RiblxRUH=Dy!_gZr7j9$?pKdC6w;INiOA@7sU?u|+pZO+ zu@P^9N8=5Ur;)f-QuX=szSbzQ##T<=$8^_vNry@W(ZbWwl>M3yPo$XgHt&jJ(f2P# zx2})@GvqZAIL1|o{&|rr#mc#DScU1fP{2!r<TjKQ(}p07L?EHlMI~Mj=$}hh0AvqEHftQ}unV z(X*@&x)xz)$4ccc-VsG=_rQh!z~nNhaTi*jdAME2q>*4cvD#j?$#VH5Xxzz5fJ`^3 zx6gemA=V~CCkAr>B?WvmmcJgLC|UCSW?9l@ltWJ3OfNvj!Rk4rGnQ^j_;OOPpo$#v;2azSVirQZsYux^~(d zsdIJ~RJqO%rPM}x-)H7UM2elOj_;NzT#C3J)hUF%5UP6iHp$dQMm2=R9pX#;?#;gH z;!>?1@CaKIFnoH)+nLE@>^GQu!(4#km^UEsbqOvL5~lK9EZu z2JX6KdMP&6$t3m4vkwY3RUcY~xWqxem8)dM=1KXnZj!Cog));bwBR61wIPts!Z)== z9^MXoe2y3eandwdJ$zeQ5a>qj_8yv@N1x1l=3oXwuZL9Wf-b2|rRX`ldP+Sgi|?|` zK%1y#%HyXEuEMU+?Wnwq!o9`;%5_+A*rNt&YL>S4`w`U&)vG=m0+RAHbW z2!9#3#1zd66td`?N|lyJo?g;k$$g5QZai7 zX9I#T+h!n{eI8IQ{&(VTgDNm<^O>y$-$!(uMf{mHP(w^X#}Ef@bRKLn2w*GH(}3Hr z(gGiVFCkFad&HwFHUFJpD4-GRNO^Doni_Td0T8wS^~OMy)zHohGol{?hWyyhw3wXN zf|x{*4Jjb*0Tr6~takK3S=@};-tcWb*O6G!Mx=$#O*?e?RZdThyQ*Fv@LSG{-srF` zyUTyBF1*QO&`ZKGBguGbyKdZ@=w#1oS>5P$mM3A7VA?(To_EzNGXDG?lsUT;GXBDx zU#;5{DC4{$l%WdV^50*m{5D?|P>uM4I~X}Yd;q&b3FrcIu<`AGQF!C)DlP^jz(wfp zMRdm%=h3Zsv(u`4Ypzmh538FKPjS@D*-t^Zzh|`%_y^dYl@X#Gb;|UYui^PD11)Km zX!+}H*T_o|p*23NkUay_RLyN+Jky+PF4Mou>_nb@#&k~|^7fqkR+Z`rLW_SK5RNa> zODwS;?s_6WR=&_yVG|cB&FgFRe#or=3Gh#dX~YkpMIdbPQ%<>3g>fXR6!{sJoMO~z z<{hj&5uXj0F}onh_p+pfqthBQozde}jnY9ZO-coXcVl@F6!MM?F; zs>{C}Rz@neK4IJZ#CjBC8>)S$wC1jwa*3nyH8@&JUidSP!=s(f?e zJbXgDkzaFInK5b>0b{+q3wl{xpd<<6n2c`2m4V=oM)zwsZ5`b z2cmA{j=*mIL}0J&FCl(bX{NJkLhZ|8MmZesCWRo8<7fbz9G%qZMkxW5tv1LLDf)vs z?2B%jJ)>Wm0(gOjgB2C<0Ty_Xp1E<#l8biUe)C#nZev@!6a&1@tftM676N~h``-y+ z_Q~xTEQ+}TyhQKfAoMH@Jw|FOoOsM)H>t=#EA0_aBLkn589qZe9FOFv9=GXavW(Vq zjt7prr%kFTWoh8Y_!+z#9k;k6@SJTxcP-?iLbfzXJ1H+6XMI%p2g6878%X-SRG5;cm`nkWIrnkycfAnPO_6vrSVzVTaYBMA0Kt=H}S%*Aj z4~?)>NZ8_>;TEL@SMfgTtakSvemCH(CYX2KrYzbjMNhO{GKV&AVI<7Lm?%G+%JlJg zzKpPK7s|}P`E?I;^LUuy1k1fI*Df{!6HMTZ2Cl*_!BufapTjD%DOLPGI zmb?Lr#E8Ww$CZiAsYqX_Uzt#ju!YG(C&MmD+lwW7_K7wMrKGdL+7jCtHER+2`k{3N zJ05gohl&Cz^$gW1O1B}2(#VAH{<+yeiO@m`d-Es4Xh3KC<0K7NC*;~6hkV#RHn z(hbWZT~+VFP0vAgzZ4HMf`TM@0hNw<2Z&50iqjQIoY5ftuP&=^OGhp{ar^c>TBZHl z^sXCoKc|G-pl5mGXM@h@^k5*qVA-;3EXLW;F>@?aPUl+j0pS(Pg_yPVd!WZ$o>Zw# zwM)@$hykt%%;??A7l(bNrQdyad0_m*c)NMQAZmq=8NFj-anFU9l1)1zF*i44i9a%GsI z^cs1(!%x*bd(D4PL z2sCd2A@Ju&jvo~DR)ZO(N>0@MdM8$|)G2-OE?M_ajk z54xc~O&QJZCe{ufGWos!VP$=pfc*uRUYoyG-`HI3yJB{pewElw0Dh(XfnR3-9PptL zEGOstP~sfM9t}BW469g%bA8nZ&kwCO-y(D*wswMduQvq|?;RMs+G2GMAzr5zccMQa zN@6`1l_-}?8tnu#$4iVZe5YhTX^gEjj_d!nTs>gWBJf@NIgURrm48DcQ_fZd>nZ8x zE;Z7|-$~>vXP;ba=Nb#$x)_j1Bc5HL4E82S*9OpyAZgN+52N6Ej+}qXk4-k-`secb z#5&nrcI<7u(;iY{MhLdZsSb6{gcE93u&TbhYwHNvWzpVq1gfeqk`y%Cb4kz+uuR^s z{z!0}PKsSAUW!E~VV_8@px z=;4&IJJgj}Y<2CHO`Q`yhf~!|Ubn29eH-!=}%sFn@9uC5YQ;&L=w7vpr zEicIWld49&G2fni1%)hUnOEicpDIMb5$5*uV4t1R)?ON*1AKre+PMTpkZp}Sk9Y;{ zCeTOKNv%^J>h?14a2~<=+1XrN(Sz!O;JPY>XpPOv80Yp%N!{nHSH(x;@;6&uR4dtM z;6un-;kVcq*y*&zv?Q3(!a&*ynB&Oh@053wM-6(zezN2qRSwyrvOIAMcj1^?U6tBF zh*&alMn}`|WnR^C$AA;x9VkfoOb>h{Ij?{=!K6io=b3qb8NCZ2au-^yD82Emrzv5$ z)(izaDp2+B#cxl73GshQ-k6G;@*7-+IzuMVtY_gp9+t71oG@+Gua+?;mP=R}H#rti zEuW@MmyyagYZx}nYgDNu*a<*?*?^|wttcGb(R;4XX@q&zkz8EYbSgTGmE!;63)P6r z%O_hHJo!0JPwpXOLQ0XqSgUNw;Z-ZY`K)Sj)(135hfO>>;s-{GBsMlobvrt9-= zO{9bdeofKSYBA+PUn_*DK|(EhNJSs;f&*4l{mRPx>3NB1`Y8wIc+;|PuN?{tjTaB2 zKZcFe#512%3wd!|4z7!vL!dNb1UYel`qNa z>nE*xWlx<~d(U-!_epPdyNi*iHR}4@eXESbh~gPq!NXkEk(Aj47|)OSG!DY#9!hIV@aqQuEJHCpgoiB}u3z>B^$A{$2xEWO)LxveCjZQd>P@`3HV=wOqLSK+c6@Ic%kKCR&1yejYNn%5lO9S@B^kY8Us)G3M=b)l zjrc#5<(7!gXq60^q4%DGnd%P0@1{ypCx*m*?>F7}9a(9At!dX|uU;i|fZPMvvvD9={mhs;Q|vm@zFd z;0u)Fr63Yo`MN3 zL2xM?%6z~|LHO_r0g$(TyD4fEyi(jq_rR+h;E1hN~ z#%S$tGd0~MrWN|L-?((tX4JqQ8D3K}L&>Ob)V$=j^l!zBh={4ZdBW)Y(r6?@sz2N| ztaB2~|MHTdoANKI)9#JavB65;1i$P(plm5^>;7EG3bVKmo%CF@45CqKSsnr9MtL(v zd%^er_pNb**=K9Y;r%-pD4&7!oG$_VxXR^@gO+aVsX%gz+l5)WBjf_YGo`uW*Tz>@ z*&>?!#cR!pKjyfx&!c{4tDfHzOsIo+4WO%+Lj`VHH~Ehy+S-oL+6u}Mb{@=d3W9$h z^Ml@ZsUd!;Gc#z~&7ljVB>e%O;Qh32xBq5W5FVqyusRC$x!B3_;m`ky7u+lfy%UMt zbYf_*C#5)B!>EVd|D6y6#`ayF0ojCh??7_JtJ9V5HGR_Ope>!R)rXmy==mAIJVM>O zgzozQJjFlFF^6gt{!4a>mf$6t&}mzCN5Fe5vCJ~ad+oW|yagoJuSs8j2J(Xfilher z7}6sF7WxJ!NJG*;+#4bB!R7v7j?~icFH7F9*aNKaGF|DG-N$8>dd(ZXs+FS^5s%5N zjNE1G&+9s97qh8r8oOL8wE5z4mbCY6MD?^sT9-waP4p_NL@Y3Bd82=>ypm=n7fFm&_z8po_opchSWL|eKO6U%{d+J?J4%gvWMw) zT4rCg_Hli=gmCO-<%2!3(-=}*=gy2K4z5hic>_si>uk)cQsr+!(b__v7~4uL?jRJR{$c1Fjr~+lf6<*LAFW85FG$WRWawaqH;nXtHf{ zBZClT*Pd-q)EywwDoSRnQG{>wX{g9JaK=sf8)gNXa|wJl;s@ni?^y^Gd02LmJ!kO* zz2I@ad%TK71YLPrXIXTm%NRsLG-nd$l7KNVfFZOx369*63Y8J8tY44pO`8YP`Fq(C)XKXZ;i~+P$f@#+FVIPf9)XkEQJo&a z&NAn3@Cp{#<guF&A2bTTN!P5b@>MY z_Zy(d?UVm}v-)EqVZ&OjohF(El(rz#SYoY!CpxZ=YBH{Y=e?~4O+K(4WY~J{6HoXYgRgT_@Us%XBDJ2 zyDmrk|0ag$BR}auOFJX_0T;!^3+}8u8guM57Z%Q~Z;~uSpRt{5@8kIMs1`8KEA~JS zV{A3Q6c>p-idrVlH5-RtpK|SIzgo`8*w3YkziBmJEHAo6VQ}Ow?3Qz$dHV6RG{ZLY z?N0KL)R(!*;ZYKt&?nhJQUCYTng!7FT)fk90crT6%s+=V}DZGEbc~5Ly zZ|w;n$8*1v<)fL2>IoY)l!uu)zTR_if`sm`!nZmMG+07*G4M+-?c!&JyBy}h(bbzr zWOKbF>QV{WfM0(A3hqluZ%cfXAsV`!Z8vy3~;^WXpX zjB9xlK#JsBUSzj!#WbmD7pVWMmWVkg%bFW(S;9`4p83D^!yDBzYiSUe?a~yXx5=%^{+WoZ5DT#K7bAa6ze479kJvO0dk>cVTkvxl}Y@7Tgd!CC6 z>&}|4v3_QcQl&Ve%fESwK9fWe0*7jMSFO8y`BOs!60=^16}UYulO)g%>GD)7+B;T3 z9pL+SCSadSmEXrzmQsiclZvl&>=}JDyf0y+?OncACs@=oONLbT6JI#{6f2cphf?BQW5SdkyHmRdl~* zxdZ^oWy{tJOMHC1^e*;lr62*v^5UV?RYAQ+ZB#|c@)H(0Rkf|Yw6k;&Ap?Mbqc6uM1^d;p+2MGMtTkokOVrtAdFhHp< z;IA&P7J_&@&Nk+ZJ4yGOiOI;6;nXhXwOLDj&+eN5Uf$r~*_<@Yt9Sf8US4i=$44Fh-MSs3gy#Efq* zvbH3r2Qh^u^G3m>-HVx*8!58y!w_F9^Dy?TO7?~Yp*GZ*d9%W4K&9z5P3QHi%8`3o zEA?karanZ?c}I6W{u~<;sFpudF*IW5c&$iTMk+=&|245<+5r7yM~I!)szbU3KS_0p z)!f|UPg%@`8KoA*cDA}Y#nVK5be$U{=RgEil!zxCN+?SF@wJa!WcN{lIh(1+JBg;f zWPOK=z+Tf)R43YdDj^Ew#@nSD$L9ZC$F+5F({=s0r;UXCe*2TLf)RKV3^Fn4lXuH2$NV~SY%R#nPHBQ@uAL-f z-sZcLu%{_rF_&&4pN8ssB-E7ma>xF<9_hyMb|5&Q9IufqqlDK$C8BaY+KZBKomTDV zQqB$smHk2)Bm4uVkhCg#9~E#p>EfN*>49@my5ruqax7wb5}3DNy{MDWw50-azmMdb z(pH}~OcB0hFi#%0(A*oN5&uuwl)P&dFlJ%D8{~hC`C0fCCKoH$K#ZwC{~Ymo9*XW1%B{=5#1%&r81z1DB4~>P zhigXg%(TS)<(~fS>;3_TwRaqDn;pt(h6fI&pv~K5O8}@-)0;8V&|kS#ku^cg?p*|I z2PAKh5PYqUn|5LYc&9dKx%4SAerm4^QG-u{Ns$uR0`#0NNtxV@uF<;kV@UkY3qK{TG(M-O zFB|XIU(s^IXl>EWf%P1&EU#Vvw{yPjoP4oG=kEnx$Zsq6kP7n>*e0`9ry9HviZ1@} zl>Gqe-A*v?t{eX@MnL1?p>A2vM{|eF(W1;z8`NS@xxv+XIf*Plk{@%v*QoQ5nEeCsw}BF%%06+K9!dplFadYHgvZpfq|ljbl&t}`nJI6{%WX-P zLWj9Y4)&~e_M%;m-B?NHKd`R>3$=Srn+$%XP#>EOhKY#@=-;H}k!=Nn$#(yQ?e0dz zz>+~a`^rnZgn3zOa^>Hh%g`64mABJ9Clj7!+KN?5OJuvRMAI_WlK2wrUuY|xSJQoP zw;&kLZQF2_*4jJem>f2;c1ZQk!1FaYE}L#F+A;xDEl*)0xDJw+aj>vkfZzLmKR}CX%+BHcgCT4tn=AMeb@=_#0ih2kZQYq1!OstbfT{kzb^qX079wNMI&G2^H z1{W|x$lJn;ctLt^Qlmci2lwhr4E3_q&zA;+o@|iIqH(?I-Ti6xU6HOLzhLSjxw>JF z{(!_VZ5vonyd11(gqKt*@dWcO!+0GbQitXA$wmsY<-F;+n zSYrDnXjT>-61DKK#h_ziq5VP}?=#3vi)e3mAe`s!$(%>Nf{D=P4<@zh;|hyAkeOb7 zV{O@{>+pC&Awn5hfUR!WBvA<@)h&I71JjxwS3%cf0Gy3j>+JwE)L-K4pGe1pP3=f? zzrVKG{wp2XyloI;gpwBb)b9fEToFf} zX;sHEyDHaQd4iO^lNa(y7iLy&*!;c^CuUWWLT!u zzgqee)}CLXk5)VktMz&dz;Z(-TXp<6~8wEEF zb^Y^vL&vppcO%=cQzM0777K{8pxeKoMX4{Rx?f263;){9Z?A`#=;k)UTyNC#*w{F0 zRq47ypS;ZUC7~v4kmDQH(X)cAHXeOiDk~T99Pk7Mi(@@_<6VWRc5lsdC@Sn;D=KTK zIK$DoAjqlU486f|xRzSx%x!{q9SP~%-{4l8bue}h8h-dR`esvI>kTn)oR^8)lb5`+^Pu}I`vxv9ff?iJq%5SOticbRiz*qYBq>JBQW zq!N$E!Qbo#0vr3G<@Z%539+(?1^SSj$tMQvmj6z?U%3r1u}CX|3j=c_fF!=HVTIwc;FQ{vq@3`| z0M+e)x~YR(K?jbVy$l7#4SklvwDRS;saW#R@;}tm8uP~@vxevPDZ?eAWhS}NP4&jt zO9Z|3r%HF8?+}1*%`);T$cD1m1(&46DKETexz#~#l!`9GO=S!giG_T1N4f8=Lmy&! zCKNAHGjIf)hXP*0M2T^0^73N5!n;alWQiF`lB z`SoGv`g)8@n4A*T6!$`IIN%ngu->V#9rTOdoO7YGP1gvBzRA^Xy^4FL*&XS>Pr57n z*-jPp_Wxt=JHwjl)@`vDnnnsdJI9PfC?ILga+zFXv= z{I+7)bF26G1~QQ1aBLSbvA~Hz0qg$o6PUZXpa4se=%Gro~BZ2*Kv!n8oie-YgkCRkQh|KPwTdG=666GJlo?(p`FNp1fVllW?XOs zAGlY!;-v|pTvAvU}79@=$PME(4RRZcO{2)OQ~P?`s%3+*Ye)Gm+TbWWvTbXC3& z5^kqXu8`0!MH07j673@v4nCdaq8@=01+JgG(y}0h5idMbPGzND8&Qcz>ehIF#d|eU zo>i{d@|ac;lT~Nx89jXK+bk#fZ+9}PSJ~|S45&NFZ>n#sjp}lfkiP3ZR<>kos4w|- zZ#>r`v|B=ke{8DX)VF}7){Q#dEGI=qi7!=i5w(IWdbwlHbGte`Pv~yJC_NqUyYY>~ zEU|*GpN>Qs;D-`wRTRAIm*Nj((Hc!6kk_btLjWO>4F!NeGgusmzFlU)ORYe3M5Tsp z4v!;j#|Lf@ zw&$77vDbsJ?B7)?jK!Ik>P@s}T$=QY1*}73sOSHJw~(SIufg7O381U{3l}zY7%3BE z%}+cvG53cZ7HlwZCE{tF$l!1veE92;qERiSGDe=2p>4aWun3;-U*zNEd{nyci`(Gb zpjJuaYu)7#AYb!nUGXtmU+=4T0^G-wXc7p&o_1D>LWumBzhkm|%{x>uQ0w#l6oD6eXY4D9Fj=d_$X4?rq5ao_twu)<#5J27!iWmmhGbd=> zTAW44fUY9Npg>Civ+jM5mt9wJ#f?$z?6s|9gUKz^Af{P+Z}|<*Nb@}J8bA8CzS!`h zzX61oS&~kw)LrJky`z2`)Z82lgey1HH?=wY645c)3nTqFIff6&I_;t!KCyh;fu9<$ z;ySq>NV;>}|Cy)9XVh(r$jGtnB6z!bo!I7f^km%mg3HQcQQJCmtVs<%DcEY)a703< zw64GF1=8I7)fB2WXY>Oo&UNF>Che-W&-T~c((n{*znGLqd*O9}zgo=FE9yzQJDE*^ zDYA&W#?$b&^Vegf1S)pEbrU71^HKnKt;BE?6YMdQOToQj93Q`KtdilXg7vS*6tLS# zM%HjbH}M4XV~;$)z>f%r5}{D=gJn<#_|fik))DiYeaW(M}MlH~y zW8I*~VKv~FZrjfxLP2Tg`t%r6V65EPl3x09vM_V}lQE;t-9H4RX1euF0uDH)}3Fd z6M#SIDd@!lECI}lG#w8#(-`gC?4}8f)ziZuY+htW$)#hXA+s=F7U3MjNR#7`@v0Sj zL35!GIK~8=Wr4z1c6C_K`gy3Dwce2eYZ$-De{51ftp z&|Q3W8hr=@`pEA!2}LhfUR8drdW7Z&S6dzx2(j|aI2R_{_(5##jq2wNTTQWHWX``W z6FG|bg^mTh9FBI46b*Q6oJCyT?R4xep8Z@Pl+Z^5v+(=hiTPxIr)jrx!8<2#qM-Ps z@bvmROj66p%^I74NMQM7gKHkbe=XI35n7g)eLongz%-j8YO+?E?YiX{pVSno@gp2^ zJhGQvRfz(^h57ejBfv5-V*&I_K5PY$<=8K|6+Oi*lCAx?%-)S7vTdV^BqTn%xltsJ z)oH^57f%|n(3%vQG?_V47C?XPhN}Xwmy4feE;+qC7KJN<&*M;~;W5L|O+vUJo`$o0 zxqS%2|8&-qyySn7XxS(jMY8w4k~Cpt=@U!|-~8E7jTwbj&xHhK7F}2PMe$qyz#&WS!ZixlqR*VTY8z<0Ju8nD=J_p#gcwaK0^wN!)+buxR z3+P4jluH5CrAE?Jfb@t*CH3NlKVpGsTfP*|s3oEFtuWW}gZw7G?ORRBI`(0zQ}gp4 z7{9P^tVzned5;n}JrNXF6qmuNujrhfE;3M6cW5~=|E0B6s%i3b|2mjh8rv?pLZwex zi_#&XX!=bWpej}8#$1F~$dtShdQ8_g@ zB>1G1cJq|D%ke zohp};?+dC~CZVA50x&S7*f_u)Y2Kj2At*d@0KppLYLJb=D?~GBpNs03&^>b-#u|s% zNaT&`zVE7*nHJzZ7ArGb9D8!LMvLYIR;Qhg_=>8R1KP}|03@lKh`vfuG&@E0c*fg7 zUZ(|qEfp;+`KHJDd?(OEX-oA@hnC#y@Cu{xC7$Sxi5*X;DClD!!96LW{Jwm%qeaq5 zG3V~wx+i&NldP#S+wXpa?y6zek|(0iQrQ=s(Go*TU3nKQEr!Gr0@fA@(cNR^R^Z~u zZfU*X_)Nd-W4?!1%@~b0l%Xw_79WbW0fWx0EixH<;74Na+GV7APije&FCglO1+`1b z0$}=Y+FSQcT)%#0^tZvZglpcNIr$joac-_8@49;_j@wQ_Yuoo~FH!uyn31*hXtKy9 z|Mfa#xm4TBhMnCx{Hok&Y&VD*X+w0qGKe^HD&I~1m)M1Sh+uv#V*2ABk3UV-Sjl#n z7xKBvuwLyAmcd3A#XJq(6yAeC%KmFq$88@1+Ho^r8cnK0asl!@d z*N~=5)U1H(^y0{Cc)gyyfITO}`fw-Xc5L$ms{WzVEbLXG-oxz0u`fh%<5R{==_i$v z>aA2s>J)TtejPuVT=o59BT;pHRI`b*HE|FI-cAm5!ymut z1Rlf(a`Vzev+UkA%`2K*qd4F3XeIUKUzKBSEI!W7`bigcVce-<>9Op~gi^a~LR)HQ zqmyoK{)|6tAaiyBiqgAJO9Sh_!<M^*oyVY^uZ*M^8GQYH_ z$TB-kN(=N;v{@1^-iG>vn*N$-LkF>w5&Y9g)=7-W+c~5*dEqH0yfT&DXmXQ(C39ZH zjA=8|ic!tl=|$n)qok}*i)V~SE_$ipz8}zg3T%&eni{RVi^WWC1o_UJc~)iQgu)s| zK>B8ENDUHJflSXzWP;=`LH)qzh&Nz#KSKQ~S9Q59-_|*|vRp{$)R0pw^4*F5r=2WI#X9wjx`awCC_gvhy?G-vd|R24{AL>3MqNB~jZ7dKDyD1R@>#4;XJay~A_}&;Qi!3^j zFvmdyQS=))K4jr|y4!ln{r&lYKE6jni^}t!(}J6wOOLI~-Igrb`Hgf&=A?=x7IKW| zA#8BA7N?TRlZ6h{TeFef=gk*7sp$A0Op@hYRC=ofg%>?;kBzxwKRx`W%V5Jd1&S#@ zsfxCb^W@^Ge;)ufW}+2}FJv-Fv4DZ155kV9T1TSq(z!IMGIte}(2~`eyTCAuNC>kt zV@7qt0|}mE!V`?|I)re={S}y(J{jxav5c7N$SEY21tqdD6cJdQ{*M7L= z&#BL}>!0hY**_t&GX0n|Wd|f5KV(f7f4KkToy|*tWixT4-sR`l@$Tzeo4XI>Es`Y+ zCu1ARx#i$YC@83Jce?jL{N#fUBQk(;YYCD-lcu0TNQVS$=K?!YvthKp%BI1^><($N z&Of}|5nto9=;aaXrmu#c$EtAclww2zh6ED-o z(8Qp_@LA#Nxvlo81G7~09p+P%pSWsu0*(I5jht9kGKA~f4sR^Hru;sjF0 zPs|_1IqvEb0N1ORCCloQ0kd%qhE})rdbSH~LtB8*VZCZnCKt|t2{#eBoe=^UiXT}P zEZ}WPDF~`R7HukV>MUR*vsXsmnY2C7KJB3Luyr(NI{ZBZkj9+KST2=4-!2f_bU;qe zFha)bxsrod6DL(yoEwA3`nMyL_Ml|B&LJjmN<2WtRTBSNXT)dI`Ghba{3OA3#|sFLQfitypbq4(2To)dzbG1 zynypu!oUaTy9yx@qHW$Y^Qr+79ya{Ji6!Nz&SdWo-YV8@4RZMSGq1k=(f5JPjaMVn z=1Hl$;`8Ek)l24mceu`asw|;DDJ-v~YWQgNXY0*0FIeZAh)#^cHMJjYyZ`!4NAW*q zikK6)Oqn1BJCo&7Be;zT%*+v^0&HJgMhzi-zRBtX{9xWa|o zlYjM|@ry9aBrS01#@&eR{8sc_!mc99ddcR2wYOHJbeFrWuZ>lV$*V9vS0VoWhqdFc z%Z+De%)zEuUvMOdT?b72>MBHmkYde;A0Z8^VFlbDv9Votj2<5EyZ~yKKygT^ZkbH+ z?zEiAa$|lN!}j?pV+nZDi}2UlAX;`%;NTh)qU3hWH;D{yJ`^G0S~jgc(jp2VFze2$ywHZM1{#(220 zr;BZU6#3OuLHi5>I&8T&=TG~_fq7_rlq@|GXLss3#HL=#u1$=wi|jGZyys6!LQm(y zrxxT(hxLO|7raiq*0A>e_YW@gZYzlsd$w{iQQl!1DuNr9c_Lm^BRl7+V<(rj-FL>u zRUz1l_pa*UOh5RV;yD=*;oT1UZe4ktU3{9U8GLL6C+?U*PcbXWuKV780+MW-#EqWh zz*n95_JsGOWRUkSo$81R+BAfr{W|i&Np8C&Ql0`q71<+jJ)sPaGDVwThoM=H0Y}L% zVJ#1ujC}(hc}ytZ+1-+<(HRnNEFelSXQb-L0h>WSpPpm`>*J`8ZF9Sxebj9!)mAwr zO8=*JSwh4az{U}QO_HCc+UouJ(5iPT#fjaDQ=45&pUKN=$Mmja zqSVOmu;zzs6*MzOdEw}gSlSs0Sf8Jf-RFs0qndwnQ z+_kx^vpeoJoFTlXKOKsF4IJ^KFtDYC=U{du3u)7GOgWVo(e$ZZkhB}y!02JW{^$HA zPr#&f)1yC~>lMB^4QYRvqlckC7%IAi7x)VId}9;4Xj`li-*+X?Lxi8#aKUUH0;~8& z^C0zW5@NEv?^;mD-F1mWLs3 zTZdPwk1zdtaeS553vOiYK&2F1BoFm~IT7@hB(bQ7b6-ely(T039OL`iYPk2V)kTDb ziw^o);1bDvUR%gE?;v!in(-TV-Lc*XYA)3No9oqvOP%SG5`8W2W}VCXCes(%q<+e% zTRLu*B!H(NcfkA@`lVf_=EztCvk>vF7|UvbU~e*+t1^hiO&(D>SCV@sGhkJZssr{6UYm{w;|pbe-_z!Fq#bi~BL_3&5kQK~T64wrXfBshU8*6lH~)x4@fOmJA?X}i(A%-Ut%?UB~; zkX=EJoztj*_0;o<=!$3d4jTKbm;21}CvbpzLtW|CI(e1QwEgVZit0h`X8H z)aT+Rb2K$Kv(lh;nPiH^Zk3Z+6YUF-Wd`E}cMY(RCYS2+u*X@ELsADB3S0^7@~<4_ zt!%`pCRB}zuXDSaDkX^~=ZNTp2wt-1vjV2aAg1M+eJ1I}JGP}cw!LM&vW0x`%XMFi zVk>I{BU(?&b2YfOl#bdsBXMH^;DEPfEVN-%U2Ly!9JVod3rogzXskw7()f_qVs^k+ zW;cd}L$}K&e5-pC()vaMj-S0lvmnB^_Nvs|=U^u;=dVZ9t&=*eCny!ft0PbAb5*5SRU|GTICR zg3&zoWj0CQDy+Vz0*ScMP#xxFTR{R|Qvzj)peNSE3V=v*NmOu8NKkmf0OdHw);QBx z(xL#wqPr224=N*ylC1?!!+4Vm6OMN4y5!tU-?D`i@o?3+oHWyzsRoq&V`bzmiWRBx z=j{eEI05_qJ_4hslXR%(1((H}_ z3d$Q3E6cG;7#sY{L<=B*m~8*7YbXZ(Rf80D0)!FcNJvpy;^9tygchZZ<`meSb7GC^ zAwKzL%X}#b;b|K?SvFj7y`^5r!m!7ALnTBz{X}YUHIgPsQ93}8E<8gzRIN3kSb%D;+{K_hazFa|F@W}=x`2Ai9Ba|u7T^z6q5Tx}8uJQ8a3 zZP+&TV+1i`4r8v9?{F=DMwZ*nd_?C%&Z6AS@L``o?*Xr0UeXyCGBfTwC6cVo7=i|dWM)a2J)7bFv%C^hX11fiYcv@`K zCCYv_6=9qne}H_(w^a?!nnF>Ql*px_C@qt{7*b8wK&uon7{@1)^__w|oE?qkLvAjs z_)YxCdfsso@vfZVO^MJ&GI(1VRj(aw-kUS?T7!V0d^w>#8Eis=* z2>zziZ-03+DEDqtUBc0k3CJvAy=t3rt0m}#Oh)qH?o1)4-4$cGUH^l4N^Kx?vTLHk z(D3$?73bOczTK*7pxE7a0M5hs6L)z2DwPi*3Jwjn*+jV8`YsFT!_ZWL3msHn>Km zUPv2wAcHucHrri_#}UhyCnU`-#TCfW8?(Q9Xpa#Ev1_EgBP&0)&vS9+*XVn@Y{@R9 zPs;mP2(>>^0xdDeWv9?{KdmVkEi#k;G}cF^B%L>TvHUSpQ>Ij(EAUzO!)b;(#_UO) zQM5*Y_h^AkPnEc2p!%CCX@%pPNHf$aUDEtd%i#tHlcSeE#oYw$L<){pL0?^?@iuz~ z57+y0csuG1#RUv1DhZ=KVn%6VwRR6`GtXWwpOC%sc{$fuBbv{K0q$%f?IU=@xgQkW zL99);H1EFuURmKv=Y1(h1z>zlY?nCBwumy7UOY@HnI7EIBD4BnoJeOJk6Xi@U6pgiTx0 z0uHXRYe;g9OIXrmURs9qh%J7qj~1t}*n2eIK@P zDua&^H_UriZNw)A$SfHK(k4bM>Ci8ofg+}vY3U_pJ(u5p->_cEUCBz#A^Wm;hR89K z4xl-LzCk_GVHdQ z%Ob@6>OO-fdUHmOvJQ*@gr};qPR3!0us2KV2>H=jIkPNFtvOHjVal;~vbMe_+i+}v zyaz!3r6ipSA`DueyDel$I;bhb5q6m!5j7CfO5`#>FK+%iIl4NVIc~p=*Hr%2cl!;V zq&3d=30!U!#F9KA9)JI0uCbKj*lj~{mg)F@RS>@?&L8p8X#(5iLDoBbs>K{ebWw89 z(94WIDJE=tFX4W;u5k((k8R5o(FW2k61so6&9tMfLDlinz`vKb|rr$4OOTV9fKeJE5L1aca&A6m@Wi0)j zX`q;x#CYC2Q?n4$Cr|PU@O>stCA+Wj52ES*p+<0zl100Dh}{Ru4H-|Cz>#1Qc6hu0 zH{F6bDjC!UBHf1kQe#d69k{B1PV8uBYL=LJvEPgO!CNNGCuY5%4c`$p+MP$g>1ciL z7LH2$%w{J&Y^1v+%cKXo&e@z1PJ2xE*N+Qg?39j^yN~VA>^eNt2sb1w1kl{SMYu5T zG0NICSPfm(&9aX95w78Mu|cI-^`(nJINaZR#6U?t=aSW_7iDKkhXYSIyLt3du!K3w zUZ)Y28%ak&6(!#cg5AR|z91^jI{)FQZf?k1_(1r)KL4%Pmz3eKJ7lI@c%_$PMrLiX zYe>nM#aQ+I)(;=An90=l(7)m)X1F)U*gL#@OjPzui0il;<~{A9l`n`6gctkR5zCBxRi>wt#7W-nz-}@gJ`NcpDc)2n)X$D4Vn% zC%Kb9kP0{X;s5Dw$ZtBKp;$mq#-0qJ-}Kh{?|yLsj(>mySGW;q1*KO$Co(6 z3beU1gRY=2CHorbi1S!&RuRakNBBOkFaGSg-XEZyRsbRM;3Kh#)Aw@c*p1`|5Bth4 zfC+K{tOm4N2bZnW=*cxP7^|?if?vw}TwXOJ&78T_5QIzm|S3-unE|$a|GrS39=1c;NHLfsn|I1cQ=yQNzA_QiJl6c zZgcHl-lRG+=r`Tx3?l0I4A3aIR&;+o#C% zT@f6pSe3sNcYH{Hc=5v*iq7$GrVbf2eZ4G|i4&2zLk=FSpg`85-M zwhPQ9dXgu%+A^lHITW8mJ;Fw7NoY^SavG3NuhRs{HbXJg>q~NM6qIo^9H|*nigsh? zkX4^#?1+uqL$j?2T{*<90I)dwvGJ{CBggbjzn~%NvDzQx7+drHjB`(~11Nz%&<9tz z3Gme^^aK#iV~y^A=-TNw6xCmHE8|l=?P8ow9GR1fgWnO>I}LR?JH&Z8X^K~u)<@rJ zbm*JU^AGuFEZFH}0Cs|UC2Dw|h@ze&0c2^#JvzX}`rmcsl<8(iQ&ZaXpx+XN^^0h3 zkZ)z~XVSY6HT}_z&tIZQqm|i!9#Gq3o`e9ewX^)DTXB6VX^+r2zFS*AR*8WT5s$Xug!+cq&!o2nHkgZo z31CGCLw#xko9sGw-ja0Jk5529E`e_nycS9Z(@s+ifP^fR4*YMtQVw67-89_Yk)ZTL}Tt#!|Rg*qcW8ul82Okp{dA#Qdst#hKOrLHt1%7cmUN%r43ng7p)b4nFW_y||A zZwMPi*-!f1d*3=%HD+$YBYyAs5wVB3oDt9_WE%Wp!L*UCU+CSt_crJ1Zt`pYM+`t7 zhb$h4D;>nwl2ft?vCsJ-1W-yL85|cdCmuWAkWRjULj)vh>sqEIB{qS-lxWerS?#EapU<4Y*TB%0hg2qm~X^Qa+7LqEFE zwV&X7(L0pt?=|XO2SY(?C$H5uH;gTt_^q^Oa?&j#1A%6lO~9m#CcKflB*(ZZpg^hR z3$=}f6TtC~Z#K|Cv*)_wVGKrufaY8Was}a9@_g)TL;@g7<=*ptgTv>2N5!UwbXI1Q z`Hkm~nJX}?rSphfg4y%yllA#wpYVA(py++xWR62?wBr;;yBu25Z;{aV(}sLDG^TaX9o&%XB^ z+yY!@AFvLujoP6GJJ81p0LxW%$bOP^B(^_{)IL(0VMenWvE49>QJ9x$HNRh9H)|e zXDk8jX+YhXbn!RckN5xOsYKwJ$p8PuKS%BVkH>$WMgLRdQODY)@wMh8BM97}!n|+x zn@%oR0KGqq0{5%*CmBzh>5%*HU!Fp4?HwlMQRo{KOPT363}CA{{pl8bqwaiCf_5A3`GYvYYA1( zAcDIr9o~;MwCNhrW}C*iG6P0ID8j zGiQ?B*6eGqpNLu8$%t!6r8e>c(2akpdodTxz2Qd*yF+Tq5NB$l$%zG}K~bFvdic#GcS@KR13NCZR1F;vcf3KlEG4tVFS=NP}bJ4W4fU>cUu}QY$g8gbW3gOZQlhRqj#P1z(?~7%Tyr1wI(H@>@$To~MFtiH zbeGWaSoR1`N>NXaAfk!LRuQ}i_gceGbu(V*kYB^26AeTX2PK_!h3LX2{+@;l(34s1$n&XW z*kXF9Z~XQn3_TITvMInfNtI(tKAUya{R6?*qJ<4tC65~Lf=y9vG$sO=6(?ae%T_;G0nXp3m)g!audzNc7(RUj0QhQ1~1 zp|dxe=E31kHb9o*WHbJdEHchQ&y$~$K&(Jc;W_8}c_RKS7&qt3yq-UFbvW}5jYx7f$wz1fg!ue`s| zo&T#ffscA?TuYY}*@fRtkyDw|TuOql3XfCygFTD%-XaV!@>3eAu_yv-n2gSt&9i_x zosoKz$KJs$SqJ$OqY&eRu=HfFGuz&O$3V5z4pPRcfrUr`aw*V7O39h(4DF3ohMPf} zCqzeHPgbMNMgwMNzep=L`-(X6YHn`6s=B8Uyd{AJ}|hZUF2ELXV~)nb6ns~j#k7(A`RRhMNw zk>m91VY4-W*H_bNEF`Ec@TrIn?;y2{Db@YBE0o-BR##`_wF&BlVB(xp#|w&259;Cu zYX@0za>2L}(>_@`es1SwY1MY0o~O59fo@Sh0tVWv-YiYlQ9?g(d zi;7FI;cS1dZ+jGN`svr12s1XHDVRW7k&Qds<%V^b(1|=d%~%#zf@qOgs+=@Zv0aqZ zNhw+CwV;tNgy?MUozV^P{;xS((fIe6CY=ZdVV?wV*&gdjws-i+&Hi^Yh z>CMxye;$wj8>IA~@F_B+25CrnNjmy@P&(dF6^iRV^C{vqX(}0csYv&YUI{ex;>1`l zc?OymSBkcr$d8GAJ5=fF;?0fu=#>6G_HKj1?Wa5om#B8+i*376yRXTORZE-vP8}M( z$%~Yl@WnX=VBF3js%2ccsm6%NN%+y z&qw-`u$Clj{C0r$dEW%r)5BU0C5$}t$ChONtayyWo3$ddM61>e;%LD4`j&B#cGX6? zau<_>8{4~;g~rj%bUzH+B`GBkAikkpQE@rGILJlhUD8lzo1__i_hK`Z3jn+0lu^tW zE5!E=GruLc)3KEcSv#{Jxe$+shB9IgoIe;VPX*U~q8mzS7omJ1_@0N-v|tOo6j+z7 z2C{B`t^ITp2^~jcM>y2ag(NS;(FDD7CS#CpWot?lA0mCe{_GzO!L`qE7GZaaKK_Au ze10uLo4mb{um=W#_~+)<1cXlt0k42ZNFCK2FjeRZ!q_CXE0f2z*iCVLy*iaOycJiA zhzZv>F}0W7YPht;n1=5@^ZLT9^4~G}$7t3I38~Mt?#|OsJ)$ZRxdK`f6Sbcl8oI!h z*S7y03Q=jyl^Lw6KLi$OO28PNT=F4?T$r;n`s3pK+$S9)vK#;q$LBQ0k~nXT45i9F zAggt-QOcK2%m||h!Py?i__4j3i+_yFLJ*&4*ECGt9>ufb|zS zUIVFWTt|Vt-`+&rgu@Y zIq>T&bW1EM)Zq$1*cKC6!+_$ceepdms=+(wUXiI8u_@mjH_pqS_!nZ3c4RSYl3ZLp zVJ5Io2RVMExj0f#TZwm;V^6-c9TwWy zP(QZv^c%N}*z;@5a&vrV852NwSSG-*r#+C0>tH^Eh8yljxFMKh~oO^XMqcKAS+eUH?8 zhXD7^Ym(%s!j`vS@Zf3(gjH7--Zi&u!+aX&d%vY}`gI30BoT{PKb>RVroG%^MRe8dcm2$TSPJM=9ujq)+dIN?L zk^aQ>fVU*(?xE=4bPS#pr&7_Efdm%=GqNgrQJ8GehW$9o>)J9Ys{-boGkfjbc$gV~ zu07cubl~3|9Q5HSoXSN`?V_(j5zf~T&G_dL@A{X}xZiZ#2%I%(d%Gajw-ljk4TN}g zR56YqR0=)FB0)2cJmW-$_j%!#o0eg%xyEq4YQff!G;`*PF;t=j2pyh^yK=5$#1JZ8)yfgb4Haq?T6XqoLU5 zXpfhNszhktAM>K9t`Iqfdm`DMua0i;N%{c(5|RxYjv+!e z2y|4lT72`WYK(E`jH#GvZ=YoGozd^5y7UIQ8AOHVcVD@XB4_swGFI6o!s^FYz4|w5 z_yCrrGT0j+y+LfquGyssP9nS}RuGD`dP|icS7jvuYU;H-++sX2k!&2nQ_Mc)5;-z5 zay#tq!B>>MTq2}o$YGIn3~&Z^?~j>gTF&W@1Ak)LOU_(MY^@K^6tyZhl7v?~*k*{k z8v4&opQvdbX(C>}TyD-AVvPNQNGpJFN)OR@{_5siknbPAzpMf|$72l}e{5vxhm-ti zB=h4(sRWYl*4gJ5uVq|&&UNL^waDjO0vCm@J!fK!c%8rRSo#iDPJs|chXRf@H*&&C z8#~SE?$Evb#P@OyY_|H#{3TqZ0xq0oJD2wBy$^oRu^^s^jY6{`8J8HPfI~$hm6-@) zrp&s;-fkYjD4;x=Y$x2v%5Ol-U);{hiGSp&-?~=!V5Hr%}OfsaUG7P``Ym`ANAHmw*x}I3a=`fp#E4 zQtAOKK6*qAZpzTTYE7d>m?tJXSOlYH(eWf+xHdKoPrS4=BUI5XsZndoK9cqD2H(QD z*nuYlHqt&9*tw0F6JCES2RvCMtscYm+8xtZF9cMHH;m+Ee>KZ_yyKDhrEY)`S)=mF z6wqJgvrK{!N-Z-q_LeO4t&&&ut2AEJzs(clXf?=|t~h)pH~ws@)Hx9ReXn|K04{@f zt)YG;P7#_?eK9J9lule{=wu;b=qe@Ao|O5l9C}bf^_~|d(X!!HFh{+N{K8!Gv{jQ) zpT%)mvuSEZ!^0OIf)b6tGL-V(rKquFP4>F2Ey=&)3CR>qb~u)Eds^W_C?~$N&Pf(A z4P25mK1^`l7?i5^^+{#&Y)-17&m;V(d?+N{v(oTHOF)d-Y&P6ewJ178wfc1OW!EuQ z4N|9(%7To5sfqQs^dbS?P-JN+fwnrJ<9mo|>(xR2J$Q2G-ulsV#~vV)EoFx2dqalDy0w;yr2-Uk&BSifO2F!nN$b&2epd4M_Wo z)|Py$M|r)UsBbNQ6i5#wl)_1au;8=9hRa_hId5BJtJaxvvg-23;Fjbw+#&Rdg~sf$ zRcC*B6E??^9c=)w<#cbWyaylCphknDm9STfej%n{?u->{vB&{MstuAujozjg??y&= zrxm$I{qhk1Ia+b)wsTrqOG^+eSGuJfr&zA_^v>C%eWB7}8lUX}YHI%k`Bimvu6SdV zhOOQTJo67S%4L9R!AyN#4R{;A{7omh+=DugBA^QAvVPNHfa(exO6kZH*y54c?^85o zK;xow19eob16bNXQouhfmr(~Iv9!{q)V-y(y5Drd`T*&~Lj`hT?IE@ckB~%}{4*E- zN1m=|KkD^8;Z}>f#ZurG-WTH)49_q2r72$2iMq!__oK>vF%}2+#kI4N+9u<}V8s-k zuJs7kECVuUyt0g^-k8W(mSM{n9HU#b(WtQrkjK0YJj)%2%8Z$c*erOvbMD*^r0bi+ zdiq9%?ni|JXXlt*_tC1UjtY;G^#XCSYrH$a8tKF~wKtGn0>MG2?m>?Ky26GULzS1H znjJkXIAnFs!ExxyX>V*DwzDnRWGtY~-I#p7^n8{;EtGxYFjXr!xWZ*!=UN)x#UF=n zYy!uj?I$rx?+iV?4-5Dve0P;S`CF$i z5@NW9&!&hM+1weqX{~qp^{E89oWCCjnH*O;bU50^sd^RjYX?(V?b4+E)Mzb(gT@@< ztS#vv?+Axq54Ke@IuM;Ri&F_qFaGewpMSIa@sD0U@uz%DiN|27?6AxLkI#$B>u@U^ zPho2dIW|d!|1SC*riK8QJGL^Pk_}`b%&~oQmO;mK_pP~!FRY&#iYed= ziJjZJl6sFJMicw=5Xp7XXuXaM3(pj8^D{%KpU^QEy6~xq`p^6YYRgTkT|d`u(gaft z>nAWKC12hmA|a#oXD2vsk5CON)<*~7;Wg_yfhAS)1w`GzRcB|TMgB8Xd6G2VE=C!a ze0qLosN>KT)Hdw818dFQ48zj*vW3bFPL`_RHZ<}YE7%_DkMH=hJjim1n*v3D2S3lt#Zk43C`~sfwG@c-3T0lQwEW<=81bM!|q;uVyBL|&O&t2oQ9ndwrs+u$3T7;|gQkWMl z1jSMfVMPnmvxuzQ#@~-Ep*&lT(a-xuIyeYE)tTm(TZTRXt`(bTpJV3;sYcr9WMHz- z@i8y)LP|Yz{T%Ed$0MZ*c5OsU?;iMr54=9{tP2;a>%&A*rm-d_O(4thJ79(`PExU8SPDkS>EGt)-DM`MF}jQZ8KAC*Imgs zp2Bu&EBznbr&HZ7R4r2SPWDp1K)9^gd!%8(&Qgybu52T76vhhi3Pr{2d~=>%(DQd& z^~!NcPL$2oPTPv=D-_Ft@}0t`;&v}?6ya)J*Dr~nqXSN?3`h2wcYLpnERF6bvrsir zCG*fL&IYC4L5f~qC;c2ZY^NU2O8k@=m3ZFwnvXwqYn_y8HoWi4+(DRKt)CPl?ROnE zMM#ic4zQkLQC!$4J3X?@N`qg`nmNTGdnk5sWS>_&ph%{p!RFZH(_>}>Qg9?veNpE8 zEG~j$>}!6plSxSM2jhyt+dDhQmaUn9I@fpuzp+Jg>v*8Hu|->R&d#wpwxzlCV}V_o zgQ4J4jfB4^_5a+cf#cFYIfVbb_`RBXi6C?PXLs<_kx0Yd{EgvCEfr!t2D$?e%%{Jb zYL_r%`td`iUA?_~qRWK)pEzH>tV=a59 zAK8~{>K_wSlkk#RNI&Au4{clgJijHL z)G*QTO{ukwE|l{bO#lGX=AutxqqnLTc^ZpFYbzleIqfw>ewh9E_ok-$W1os@*i=hO zO_>RQesNVkAc!sO1T*%MshYguZf(x=zu0^4pr-ov-4`n&B_h(1*eFt^Nhc~wHAF#L zC=n59LPUxILgFI=(jUQqQdOk)5;_D(fJcztq?1HCNP>t<2=T1<_r7P(+57B0b7s!W zIdf(Xe~=j_1hTT$`rhCBzOK(T{_k5Tk3OCpq8z<2vPtYcAIe84^Ju+PVW>}$G^(a< z8u8j1H_!Sgz|Yr^Y9sxQ=58)cF3#LixV?H!!YGGRYacS;U-OvP~8r4 z^U_1}fvk1YT4F+1*lF}DXM-?^U3HXY^H@$TlP@0JY@Qp@yMB6Z-cbeaJicRk#Mn(~ zU(4k$4jpbZNR#5-VEN+CPXl3ert)sYc%>+Nd_3K-ZlXMZGK9t&dsBl(#mP2c-+TCu z=Y$RzO_7!{UV1_QvzpoWLu>c`efiin*VK_}8Y`O;!7R19tl=faFRgAZ6gbb&cOzRT zW|Pu4HjU@L_IvFRCZ1S&V_pDhrIcasg5kB{P zuRpffbC0;2Sl~HslQNZ(3AVL;3b;KkH6_^RnBF<^aR?^?sF8o^M0628v>#r(+6t{q z>aq7#+G)~-aj%+xTuA|qV9ylxg5r7e(qer-=T1+?mc~lWXUgRia6$^%{V2{rAKmN2 zzSv6-Mw)f=W>$iN8gUJ@vr4+Nhqu{^mOsc-zek7;woIk)X9eW5i(QGdjOqh>9NDyK^9+|~=plI}>wP&qbm31S{riJUs&*S~2C2PNef@+5x zyc!9!oovD`M%*l`j~f5xa20NV#BD?7d`0-_1Tm8`R;J@?dA__6yx5j>g zoTsUX)F}-V*Q}Rj+Odgjf9O}GKp&-LBhuf7XDZwMmRIXig{FP!nHPWPeI-cW3*_iV zL}i_hft)oIN>?zZ-Tq}OsoEH8ISQhKH%Hj2>HP8A+KpA-?GEP*nBS3Rpy3 z?L7DH8=*}bl+{w7Go=%0)$bi!D?j2pV2b7M%7IAuRS@dX(HK13tXb+UCchS+vz~Qs zNI?ai@4eR}POJ0;Z5zdqAF^+G>vlsi!+jW@^bH)fK^C6@W@iJ!@- z2iZG_7k6+|uQW0Bz z1!n)=PF8$hyDyYkGChrVbF55;Cn)vHQ2cnBVYFt=XgeNWu^sQRRK6wEPM0Fv?j^xW zGdrDNX91q z=FXD_3q(|#nJ59fuhOmS>d(_Hs@1Pf&@hTrI>Ro8g}iiSLRn|35HD15QL zO}O>8nKYRzX+(gQ*3YGX5xP7Q^cavNS-|*2W%e3iGw6e(Vh=Ek&&0J&wD zmota$$HytUJJKY=Qw2%)h>iuo`-mB76l+~>L-5)e&3L-@8-0pik%6$EV-Ku5YFNa^ zuHRL2OZ^r01IHJGqmEKf$41rJ@o8nc zY1BOVDYdCAS658NS`X`a2ZO}0_snM-pfY8;9pt-u*n>S`@J=5h6T5*mTo~YH8IA?u zUy7x+mvhZt56lBc>lMylzhdx|tgGHFYMreYD~a|S3bX|6@|uz@n zSAE_-bi7c-CtYk*CVr*M?VjB7TVL7kkq8MRO)ed4HwW%F_?r7qeqq#InYjRvf-s()!RIaI}voY1lfE| zJ0RCkp|lNC^j3kyr3cqG<~ChAMIP#qvpA_#Qc;r@c_Co=+x&@UVW##D^e?&vaEw86 z7;ScA#&+u{Z_aW?x1Iq`j-wBIjw8Dgc~in^x|esFL~y5o8v|7A1WtZ-K|2qt=Zw=&Ybu50B6ls6J(kTxgsMa=C?HbLGPf-?#pcoO&8kXE7 zw$)Yta1_&)Uu9e&HQgJN4Ygw>axF?A8G4F8osUqPalvWKF1P2*WUjYQY7IA4AJ@LD zs&{)U;d|W9QJ+uvv-gu3rgl^3BBSF**@H#vu}tqf#ci|eS;rZY@Af4zN2vMXY@szt z9-y5$O|yunAw<09I2oi@ST~RyJ|}umNFCM_&ck?Q64WtU3Y{r<<(`~Xt`+~! zBIg5b84H0xWlrs@7_FHgWAaxej?WkeIckZ`UC`v4mTDPdPx@3N@kUWB4@JEl`5Z`K*%H-QAJ+#@9oyFS5gyAm^ zus)Yndi7&r{s)!zdH9nJ!jXDX8H*^Jz8?w-m)!+b6)dFluHIXjc&Q?iYRe_8fmE~H zB{kog~Q^4^?pIdsx3m0G_7uFJg4;opip&DXiUR z;K(YaJ&fU8txyG>97}>$zrebI7*-!~3^&k-ipL&ecujXA74xF^?|4ilK7VX*1W=~o zUp2eZXN9{BE)TNLVvQP@TQMm=tcC($T$9sZ!_o~Me9UzFG_N-aP1zJ^9G7oTfAr&v z+I+#XD68UahK;~;zc*^g4CBOq81HPjMN<|k?U$UlXE+rVoMlv&isjx$uIdD;ym4H2 zIY?9wOAx2dNW(kuQ})8gM!sCJlj!Zt;8VNsp}oOYV9C)mv9~%S=tzXWth;tvIZCl@ z@l?JA;p9n?SG3FbnF0yoqMNC(AMEejx}T-zuNntSO^Z=lT`N7WQep~EZz#_w>(!(#}?%@PQa(k}6ees{&58@PPNRr!PH^8>b9Nj_ll_Gt^y z>}A98bi_f15{P3cqEi>~f&l1Jl2Wn-jbe8AHJsKT4hw@=*!E3#{H_()KpQi%#5J;q z@ioHXq({mxaTkC(x*b}1Lp`XbVt5CxPH9Yi)qK4Oz8fZUvoZ-kbM2SqRtoL=<4!jh z^s|u9vf(}W?khVo(ZynSh_lmZk52E)x=t%iiq2^>Y#Jk*Eb*)JyJk=Q#i(UNNOX4* zknzYRb_sL4SfQOfMfc~q>9XJRI*0oP;iM0OKf2fuB092L=ErI~$iOdD>YzH&vCdEc z%~Ym3l|NS}iLVD`K^fgK>S%$!GQ&Kty^MA5oUcIA_z$y@=(N=_ zF1t2KwD}>5n+4(Wy?pD@CyDAG>Ae9&U&SC>Y^kygXfVLj$_K4P+cN~-F>Sg0;(evM zp6sGfYJJ;rI4gv5mhzGCPwTEsQEM-eW;5$2HRr8PRoK1Nw#~Kh%DQY5ciDP>oo>7- zN}oT(a$(H3lcMlE&7yQCS0vzGiiNk1HTyGh&PDuAsCV#|ZJD9_(`fJBWzJ@@Q;OE2J4HUx0F8jfQu8 z(8lA-^^ERFwiGBFG~1#b&(HCk%KB?T*T>;*1G{_VCsfF*(db>F*VSKlJttBxqvhXo zKEZq8pNDsYS_vO;Uc~pg8NT45QONR?^OU@p+>s@K=3T)vk})rODfm+thvwTtt`>jv zxa5^q_8L@tOy8@hb<@21+GJh)`4bdl3d*U6pxU!c8P%O3oH6sJAm$Iojft{gYB8h8 z)3ds!0Fkz-Mh@Y8<)gmo-~M#Hu|{mMWwUSMuRP)qsY1`a010;Or!X;};bWTxoH@Pw z7OcbJWXWU9-0n_g9wcB(vk9kVp8@2Z8nf1>5#xHg3t@-XDeNob&YqjD?A{7Sf3%xl zV5y_Ge12ZGYIpw3=BWFNp*C%O*zWMbyFlfmKrxL6dPY%^rM=JsCT(fH${Ewsrk@p{ z)TWikBLx}o__`MwiF{vy3F~@hVf`zNzIrwU)FE`h_lG_n5KF%cad43y%}<%%I>`Cn zs_6tgkblM?ks+}csjX2(rL_%tYhsiqSObP~4AE4h4?;ouCKr3?jHi|X`S%8u1Javh zrR#LeL~~4?#-HmMFVt<4Xo;_oTkTqUVGOeg>efrVM?8dfoXBYE4AJc5g>?(Vn7%v3 zTc_4)aVm@kMtP)$6Xz!KcxG_0cY!CGrf(oW7H-yBPi$zZ_H5Hl6u`}cMIs`qnUk&z zMFRP#iBc?gAb1Y=U#nsWC)8{SD!@(?w*X`8+2ScoD8)cx=%?-gpSLDsUNJvf(PwFJ zStoF|MtB=_!bgf@D-b`;x%+fb&ybqP?TtU}QnSW6!-?f1X|Ad{fTg?(-{EC|B zaF$Q)N}Egep_;Gvjt`fgt4-ZR2Hb6aur2!b$T}*KB)rjj6pV*^Mpw^g(pip{8Ph}Oz{^(m#>z6O<)Skf=Lts!p~I7XW#}>P9GsetIJz#(78%O~ zaq-~U{H>|3#nk5!F=0(SHuMPu^FL{_{!crv|EnJ!y~JU9j)Ut`1_$S*Bn$`Nr#~EK zhvZj?=$ollj8qzlB~)$-0&os&$#}ljQ@7|S4&a%6!?3d6-9n(qNx+IJJM#S@v1L?G z*M%<;@8jxn>9y&>JEeT}?fGjL8`8MX%f^Q_+UpWD|c?W$6VE0lgH_NP)|HeInyzYW3|~Af%`4qJT(0)FF~j z{X;W%*kg_lAbtWksmq{o7*3039iyT-S!VUX2X9)baC?vr?|k%@EAuc$ zxx+?CCo2Ja{o#ZTPqfBr#p^&>q@B<=D=H5#DGMDBfAY7MzH6pp^2iN$b`T0fc(y9NX;mscdu^B@K5<(kB9Yl zczq0aI}S3`%U}Iq$&i3_SI&gTEY}>C!6?`l+E5lW&s~|*WJ=g1WBfa&wqhO(eq-cC zm13fmHzNOX19iDi*HxXa^JOSWr>NiOyGVxBkv6C_MG!H1E}7yiJ>*jZjh;IPz>lTm zFt%tsX%o>{>-TFosgbGq4jsu%YV527r7w{4CGo(%q{iEP*4%jbv2+ttFeRbjpZ8}c zx}a0w{U5)t=Y$(H;2ttgtm#bzZg55hlv;pFJSr=sojD&5-p~6~oy>kY54w+HHGO>i zX(!6j*_Mpo4Rv+3gooAf{r8TXgiR%y1NenaO$w=|#DE(>;Av>Ffrav;E9|4plqP09 zrtV(ijj$j^-P_4zgG0lCrp?Cs#FR275HexdT<;xvG);6VY1L=&FyaV%8da^_$%{4v z@8Q`oNZV+ZAx$10%u+)i#M3tAO~;8SUQdDbkYAA>n3DO_X&-()+xM%rKjtt|9Y&kY zwjUfEoIV$ zpw06E;S@iQRv~7Fv%v7CMo_{4c|;?xy67utE^l>MH+lK@yo0w8(vGtbg_}WDTSQY~ zM=>NY+Nqw=nV7(WJ)>o+cH1)W@gsJ_EbTmmk9#R5m9lqRQalS>sapAmesUL-D1(k) z5%sMTzbVaPUv}yJcleBVlMk89pSU zkE?8n>Itmt2amm|NUVP0dZTo{Ul|5%KK3(R(a?byIZo@D@;2`cmg4w{Pb7)yxiPA( zfa_Fz)I47RDcV2yjFW6OZQ35jwU(U^~Bda$Jd{c_Zb zq+We3=rs-FcCH@9%H)2&|BDIKdON9E_!z(^Jl*^SJ8L-38W8q9SsY{FE@6xM4JTh; z3nod0G1fuxa$vT&(@NtP7~dxbK8B@R2DF|5 z)$9ODW;b-4Tk<1Y28oYA@j|smtjAKaMPq}|ufyjchguJcaTh_!lwkQwoEnyA1bYaq zyW2>j*k=p+R>nYeE@s*(-2%9rKe?{+%|M%RkQ%Ym3*+HM-x^ie+9{qrf?^U089%x| ztqo73;3uB&P48MCyvMrk-vn-Bra_MhIq{^2SY#A6-uo_WeKDC--lWxRx zDodwAcnzsODD ?*8h~7Bf@#G#YFc9N}vn2I#xBKqzCKMvBEjF?BlbQCO}8(xG(& zS!Rh(!PjMa;-r&!u;z@iR62sw*?ArlYPWA!*)XaO_a~?3ZYY-pOn)s4K%Mq%G^%saX!)7h z*ZlYV>h3oBRaIg9>#s*D{_ib=NB&Iww;uXkz>rx?OKd|6PXp^z&A31?Z7JaddqATz z{FX*a{zFHTJzrw3Q@25SiD&;BC?F7;;Q#a-ej+B&)V6B?6Dm!6d~|ze>yR<@W%6>I zm$QcKD3Rc(kI@<h2hsfjT2!DxhSG$f}VU4U^MN_01IX)zwss9<1tf2C(8Z4|SxhFmO36=rID@m=+key8zrIH$&qRqHWLs~R{_ucp{F)IGqP*e6GQ zn8lakpIDsOK~?yjv+-o)Zm!hvdCv{Zfbh%xd(+sH!m?$fx|<3BGYnO;i%d?_OdaVaVIQbux; zKPn#@31UMS2lLrZ9pK*I?~!(|iemhv%u+XeCWBs!kf4j^x`8;#nyLM1B6z3onts;g zyW6r=THErg&SI8pb4yuKN^Q#7X{vvy8Lm(Kvin2bQfcynrwied$2U}xN$-#To^b12n^L)G^&+c6oxsyci%C|o zaY=6+;s_h`oW>x+6O%jd|9<~XR_jj4L*;9JUDsB07p(2kZlOrFQ`6VjCgk^tmPQoG z`*)&!p0Vj^PfL?;_BpTJ0x?TQJk=KqZA`77yS=t|RDE&cqWaU$yawyEMX#QIWel+z z*&><1evBP%#16wv;TqCuNn>z*u_UiG(;w1hr4PDyBR`~fu?I=B1%*zxS||OR?%Mc# zsoPu%4=I^faY&X0b;uTS`tjmciIus%run9!TF7Jv9q*LUsTFFkPfC2%K}(=qwe|Xs ziMSkR+*H0k=JVX$QYBxn%4E|X4T(2t@VU)i$uDRefe_OY* zSf|~I3DTGTEx2HD8b0V?Rrx z`f1s@{Z5bqNw7Viitew`3k^>fSnYKx7^o7opH7`TbvF+0)T8G%@H9@Dx8R$E;#+se zv#AIWI-l96uegdgU~d1pZqt2>9MG|1VJ0YWI*k+azv_ z-Qz{tE9gOtWKX;9dg7<*7NlDkwcYl0gL=k7g}GqTs7~&-+1^8gOM|V$wY7UyZRJnY zXN`Jx|8T$?(oQU#QO6G}c1E9A_Wsq?87C?uC!X{o%OY znmDIu+@5&)>Gvy?1-T{rdkoB%blrC9;t9G8;gP}T@!}T*V=vcR*{d z78ZH#?imq_f!-TTDbg#JK`rT|fvo-K^OeJ8>P>lIt7p}6nMxWntY^K%K0pV zan}a>?@1HZcp;1}IV5}c!6t#m@%vw+BZftGw4@|(iw=3&SQg8e+j1O+Jp#AGs6#km z)}sdC7g#!e4E@^do#&Y*_%aoBjOFB7gyEz*Cl{}#*<=UOby1vNlILO+ZEsg0c)woH zm%HVAXeV`(e_slO&gK^bKO7lB4GWn%TQ*?$mH_K2t zqnX3F)&?DrEBSXT_k9ap701SUR)$OXbK8!YZ#~bhu^@r}h7A2`=6kF%aJgWB20iQr zdbwCu3_3lPau9-umOKqQEhMu`S=!8~j#6W4Vr26ndhx_pbrd(teDr$_njZ+g8PntK za5JgvtVSEC97lXL2PN}FTMFqECb9dpC;y5ttU9ugQQaYyW?o=Q!*gPd>zUmwDWrSs zX3fBPbvVMPDn{43WrV2PRG{G^v1h#t>i9;7uW&{Hb-UsKnC~RACaK08hy*KKBdD-} zAod&s(SC$?a4XOrA9b;CqY(bJ=wx~Ktq1ud&rR~1fYduk^Vn5%vP|oYI z?e$rxuw>rBYii@_bI1DQIB-clN@u#qNFNkowToFd1|PG}0`u)Cem(JhCC`+gklen3 zj!<+wTP2(}(b>tAdJDg*=80#@SPZLg3c(;=FV-MOki8F5)51mzPjZ;&vpY#b^x+T8 z+0++o0gO34`z21A1p%Ty!HaN%_!?+8l#hi7r%E_$)Mk^N<(ZnD@yCBqpb+(BG=2UQ zd?6b!+QFYeP!DWq;)q~lrLyT zG|QulS)RZ=v!NX8&Op#Wl|iTOrh8YGE|C1eVLin6HNE9VK#h}bM~JE&fE3M5nl}OI zMW!H)FHs!V2^C-kGo!jur&*|l#KzTllbh1iW^D8(;8PGhx)YZCcT z)2oeW@X~;Iu*HCR>hFL)$nEhR2msg9Uudx;Q?AT9Aap&2uP7F94xwrh9i%B`x<={? z78j!itJVy_Lj4P7SpJOsSQZ|P@R2+RB<5ZNH$PunIY99AOT8oX^myI2sV|#P*{~N= z;=HaDoqH;P?;N}L_9)RkMs5DOemB`i4|{&-JJwkEr6ON;2}_HBg)`{;YLwXYViO;qn|0Tq=3rQ)G7a{s zRrw&j^t(p90X`DX$#PSsl#3y~Y=xsJIAvzkORU;e0;5Qa7TIqu9uG5TDwPJ)!@RtE z*F7(eH)~T#Rmi#EmOH?9G3+MeSqDtiuBUq4KzRZySPEus<=<aG2c&lFp!y4Xd(e4*;fPaAPNzwm#w7TEU$MYYV-Vrz1wWLx`{R)0>G z%?Gnuuy$b1tuA|L7bfsCRyhI=f@oQqV}Zp@rAH`8QuM;$R)FG#y*1MhRZPiLKX0j> z37vbE+|TNVE{q8soOgJWFlV1NrTi&3jXJBo_M@Z7=8da(p=n@jOH#_NC-UGizCurU zXN^%T&>_NOEUNHJmewqZx{=^cxc@YyA%ds-Y*da|po*xCD#4CQH5S#{w;TQ3qJmn(@74yfGmjEw-|kQJmlFTW3>U?PwbjUB(n#wwWn{BlSNLJ~pnql{L-# zvwA@LR0x<5lSpZPW_#=)(_D)(6nR8B@S+VyukKL9hv&U3V&v6s;NskLWN}*sPj0e?|?zpR0i-l7)#oB)-CVFsr$GG!CMLVg^b1o0xhKu2nAyc zK&!45P5C*Ai+vmu)i!q(*kn#GczLFfPWoufip}3^iCvfx%SvX#ZZRzqY23x}&&XNI z6;(~)j*)BMyPZyXPbJB64vKAUe4smQ9m8T6t=YvGv&*eAxbf_h2D*UHcO{}fZ&Wz; zP!a1;bMr9qU4ODhH|tUok|i^qQ(I`mm~nV+ZuWlB&zQ5??_p78Bc`!ay~sUO8i+T1H@e!z5D- zv>Qg>Gtlv9)>$Su+2G3P&H%sH)j9Do4TnD1y`dd#tbSne0M*l%n2O(2G&YUi@&(&! zu;aM?ER87ZgKVOGt01ob562M&gHzZi%sPsXdprIp5e^zT$RXpeX{f*0>VTh5G13>X zXRHa(xdOKY?0C)OGo|JI-mm)27?;k>Dj>Z$?lA_ygP94r0SJR>Mi{*rtlB|7-eW7i z^+M9rvNivj0TgJ5YzhiTm8y^X2x(@cKo3Yn9ksI57?V=#Cly(_tGoY)YHjmXQ54=_;?|jIuQ?uOKAFVLvK-zSI0GPzB?Zz( zy0Szjl-UE3z0p{H7t0!L^@0bD9V zsm76kq~ohdH_#+`9U8CRI}4*;{hQ6lRH~*qLGKPOj-v6k>Mcl<5A{zVr7%y_WVPu* zP9T`wTgz4$3E+JO`r62(S2!7_djeL!)M;(^nOIkP5lb4}0KN!#GxTt1Oo}~H!IX*K ziMI-v*z+>EP%wcVT>^40ncQ14N)1;p7xs{HbPFD&i!(7=!AZJJve3fz_pjS#!pvQ;cmV z0*_X3tf2pJxS-?e<{?;r#sjBN>ICaNUic4(YxZ*x-o$dCpCFRXT&F>guxy3|6`93nP`vodCs~_6w-pBz1bD$@QC`q8M zJL@n5AHnjWwTQPHNH$GiwfC=M!8q7ZS}2qYa%wgM5pjt~#B z@$P6zzzSq^wCZ5G+wg~5xeW`jmxf!I*4drMZMcuQpw$t8slgzH)DL5 zes@?%?LEd2Q3opA$5TIfAqSf#+|7$aQ}P+zv~3_8yz04Im9Pk)d;j_z z)^TEkxCI4%Q2SFqdLYk!0k1A=^g?-bD?g()pN{4R*)tQ*^|Tjuh6BSiZ`N&NuVGDm zzSANB=l(-GbsJ*~i7|LSHXq>LffB`fV1wy>I?EK*Id62Sm$PijgfWRJR9JvVsT9fUz|Ncp_;8V!|{}X)w|KsrQlji@G<3I-4SW1-# zglC!ZcaHSn;Gfvp-yzGtCzMpmUG!}`_V&&;gn7vez(bKCpOM3e@;BK_iK|E0yuWMf zYY*Py)TJn=+cx*FuRShSM~e%BOQJtx$M;Z2hMP&h&I_&XK9)T_77?x5iyusZ?qw&i zNz}xht(9`w-WO`!LZ3+EUd12-)-tYmd>%jl;onfKzy9qD`!BuzfBaGZpM1do8TvoM zuQ~ehd9pQ^^07Ad;zEbk|{vR;*4~S8vuoR7xWCRA3R-M28Shfj=a8}qZwD;d>bn?Biw7v6{`sr z1ZNgDZ`=>G-vUw#uvm?!x2wZ3$ujMu3q_~f+~3q|EJ9TJ7-eTXEQ{Zbzl7>z9$eW@ z?{hO2TI(lzSv<>lh&zTgW3XeX%CE9?80AqKy0h-r856OA2izuOf%348{ev51v(Ykz z&9d(sq{XS=oR_*vrwp)T2^xX7*j1lZ-e!`rlIK4-ucIdZ=#+}y9sG2P*7nI%1dX-aK4ZLg8=`SFXzD+&BKVQKnC zzSd{8FI$tg?Zec)uWNQJ{ootcZ=SrFMFx6qBTq-F$|v)cH56UGUcdbVTIy#TK4VM< z(>NVvD@7b91iRik7PZ3TI;=_&+;R zQ%bzd_x5s!g=(80o}Ym;CD7}e1j!nVQ9ocKN|`d&fhR72)Prs8+K!Wl&9@wj(pxso zg@~^mLD**Z$kyXvmRv%%K`9j#(W*1C)9a}rD?=L5(=K#$Fb>Qy|K^oqbeB*3PGyF= zrdY`F7JD0$&Q@U7d!*YB%(Nt)H-=^{V$6u=Z{+F(R=#o79;W2W3BCy~-|*_xzCmI* zhAnI5y<1o`kYtXB-6)fhrt+QtQnBMjWBl}XQEj$13t(z-8EJh{$nABDCHMP9+*aQ2 z$Zjk&EtDM`0-Li|Oqs|)gct@-U5?X88Kge-CWL}<@Uy3&?b{J9DG^tqMwfUWVISRoh|Mj3@|O< zIJ~e>a?(V^9 zZ8S&uU#7&WajUcTV;wNZ(?bJ=Y3D=n%26)Gj(T3mWth{ z-v$2NR)vVk>e5hO9nZR4*u8YiV<@-#?e>jA?+fY`MeRWhgk~n! zi_1qVzb|0@+Is}O@FkPVQk-z>r0zSZ%0&2x-(p7Q&EIapmdkP4ZvE6=C6p%yPQw;901-&4m{BipuS&&=_@C%=tP zE>A{a6Z~^C?vmZ=-;MQpk1Q{fAAIN)wdz!Mv;1m{y-ConANEo-8;@of(xK5rW*3XEfT^ zT6O3dzFmBs>r9$pyn7^FCI(I{db{`Pm#W*+2JyFh6$%PzS7vs8FOA6sdYkhROwDSp3>OtVa1&v#HM?2Z z66wJtP%dzb{7y#bk-dRZ!maFK!edFzujAi72)`;c(9aSJe(8DOt{j(-wGg^f zDvo-y9kX|Ye&b*L+9RA4(l%$yAC59*R&lB*OB5_{*-^eI_HRR$$H5BNwg63fpX;&r z!TuSu;19XAc46ze9s*p^b!?+ttJ0lD)e}#yKGPxo%zG`A8=7xtS^z&*om=IM znsRt&7VRF-t?{p_4l2bue9!`-UW1sRl3X7QU_nfCQ_;`a=U0ckZSW$v3sWq$|b9IAFKL>{8U!OvO5c zg9({8T~73Gf7_gnJ3HB>J)r&mgfywLHfc&ccG^U$1+Ub9xy&WTyy5tK(&VN4BlUA6 zh3ko58oF$rODAE@^E^tEeR1p3_lK`fUE+7`dlxInedd1nrI#DG<2(I-aQHdv1E~x6 zNEDx*8`HZh3!IFCCb1(OxN}TWOtX1QxkAl6F9ro~93z%q_7NeeN;WKV79b2|q+gST9Fpzg4 zGL$o|V|&hCaqGbg+6*aG&+|f+ET<{j-zWH__4a1;&ChVU)C=-^3mOwpK%}O3s+p z-s_b^zURlJ$8tw^e(Q-ATrEj$gcC|U{oQxX(`!9nUW49poJCIFm=I3Af^_JP|1r}i zaVn4gSEIfC-KQo;6jUvan;w3yN21Ggfi6ZE2ktD2WeY0HWAQwIfW;_Q{?kCIcxa1> zc_C(+(g;pnRNUR&bK61s?$zS*^(m(eZg;c+rQW-txyeK(lS5x)t0bp3bW&;4wfdEs zdC)I@sT!|*o&jzA<-=Jb)v}!7Q_m$+uMW4R-krHFRZ@^-{4}YHVUpz98}QDqYh^#O z%ZB{Wr{C`yPt0CVXl$&Bvf`u0n(5tQkFxVgv}ydz{!Q5>lV^Cy+v28LziV6uA6&fk zTZny|xhYFuT7GSo^dc68&7{K z#`c)8N>0}4ox0wB{JAQz#dqZ9phhD9ZOOH6qv61_4+5)IJ}c}_`Fxs4ma6nTEkmIH zm88G@QTUwN#}qHH@4|>;36ZJ&rHqj_SPf?ah$Vzf%TtZPeA$!BHxkIZsZ7|5R&lV~ zeR78za(Z0_6KceS#=)pZfLvO+2oTy)r}Kqj*H`WY+@7-URX6%}v+DeP$mD0DqR!L_ zUtjb_>1LT8sd@$x$a7_2sceN}`OjLC=$S}(M4i%!qY{Ih=~xS3n$f$k`HOs3jV2TQ zp27aWOr%*PGm@!epHe1L{V}oKA>+xV>nX^arf%pbKIhpzjPIqvfrWDi*|)3A-5i?g zA2!sPw&}|)->s;w6;6FN9#k85M{%rg^ooN@@`0T|&pN*{i$k+-TK&-DQ*Ek$U*~wi zcb)U^>!L^b|2fAFeh+!qtg>%~fp%pRA)U}k_l`7~=%3}Mv8RF1g)Ipzk~!8a<_Kab z`HQfIX=~`CEFIEl-sp&RBXbT!m2l6C7-YJALgcSzi96_Knp@R2j6N<|_6Owwyp>7p?@W~YQ_K;7{_7(Z! zHLdyL1Mf9VdC?z^LB!bF0qPG2=hJ=g?%eWglDLp8J1pSAOWf3+ZCNg5A#+@xs?2HZqyq3zRwG5jNBlC(KA^$%8D& zs50R%6X?JJp4n+9Z_P#o0j&_y7tuT}+(;al{+4K+wEy_2L!)Um@T(Ks7{%$wzDs%C zZQZv{uUt1MBs`#gr+T{hjV>d2&H4K*m3eLaN-ZK_4>FG-=Hf;i=U4NG2J||C%!T>W z42A7DP2T(4aqk#`d>4Ai*7mX=T%r{Ew2y=oL-P6xBD=W3{ z$-h*z|N7qVq^8WA-W~j&rXM;|&o72nCe^PReWzowexq2aU8g{o!!$81hfgH{w(5+0-8M&sOmLh`)GnzJ6M`tM$@SRrizc+)*lynzo{3 z>k0r_NqL}>)cb?Sc0b4^CSLAJd2~VE8wr7=LNeoUF&r#UZx4Q5KC z&HzEYzUWv3F6L34)OeN#Q`zRl59(Hw-bHHt%`6Vk<>NM@c#%0viViq1I@-+iY2b)dd{{9bA7YmyTt|;m+E{?TXX)@bw06MnqhYb;S07sX-P#!Qbkoh8q!qGqaq<%! z+K@Zb@JjDWf2%w>BRi_1s?e6psaLgQ@i#%iNYH!=G1(;&Q;(RdEr55O27!pevKR?l znmZreUsCjcWA44fnppdFVXUYKp?8Rih=33gkQT_YAOb?9cOoDlARy90jY_XsB1LIY z=_Mf2l#&R6AR;1NKuUt3G)brf3Gth?-?R5wZ#mcA-+Rt3|9D-FR4Br)fZ{WVZO5BIPEQG_5+UUNwOs==i&EKgGBgOBc7y!ew3&oBHu}6Y>!jRqpvLy3gHN zyRfA=*?A|W08HcD)6rPPa8(31ee-o(Y{zYSwfK^R$?YYc1ky16III2`y4#}SoXW`~ zm$A}zACm2~KL$C(V~;q!zAJsBDocEThCJKuciIooku8hC9i6krY^H&+s>&R3S?mD4NCl=)3^PtWAevLDlk z)PnVSIN;*;ZW*Z_@ z#Bgg$IJrSevwOXYhcx%qDCeFcOs%_w1V>6LlbqJhjmncPi&8#Ho@%%RCNd>)*jnGc zb}XIH80`y*epznbLWrOTcX>lBX;x$jxgK)%xABrBqL;TaH4@9Cb0VRd$>A>9+-M#$ zu9Et7qUX%-^o8IHS0bwgD!T4)W~-pAGHCfQj;HrBLf^Ux^53u8-}&uLx87pfmImH; znPFm*SuK6qVwd3~ zf96G~3_7{_V&~_wwx`CTT{HLLgEA!Nd&4v!*VT4N334GOT=nkZ3;Ab+%A)ZiW_Vo# zk7~ER!RaKp*wa}cP5tP1tA>r>th!Z>a`=|br$a&}c#U}<%0!*b6Em(pB! zL_3|&ThLYAAG~*o*=@Bqq8vd&l9Qd6kYD=q?nF4J+w)8RAq|KxNH?cK53e5^n=QH$ ziylp^{iMkH)aLf)TvN=s>13IwT_UkPd%5KnMaeyK7Ui$%2=xgCarkqRC!1d9$)bZh zeRpeAq{dnHpbERhJyCv)o@Q?6@<9j{= zli~0pAyKn}vy4xL-a@dLS@G!;eQ($w>6CP+So)Em6FZJtaZ1AWAA~>Z!h7QVLh>OO z+MNX@Z31s7z@^dUk1OJf9Mg$`qCWa$gtFBn?(x6WbPhujFyA0yzu4?iJ64LyfHGKX z-{bm9+*^wS`WfI#;Gpy`wkP)humEshd3rMoRE)4XKL27HV*0U)_xLd1 zV*5bWcsU;QO9(FnMRTlUuYLo&xhHG#bjrKP9-PQg`&lU#H{ME0`?Y$XC-WAo7;d$t zzL!JvoJ7uawLOj0V2y!R9Eh=PGO9K;ibCXOvSYWLX|M;yt+c*m7N6~%@yOI^-a3qs zr|1t>TjS6RzDds0It>lg5<`~lb063utw6~zOAUBNgUqNgc@Q18Kk;F7vvz1helz1@ zxc^Y^=7*(h?6NjP$*?#)bdVVsc>iPLy@g+Fd^)_Ih$93^kL`i$d}f4URWIJv3t#0P z+!sQz=_s(i;_BF${P|1Pdrx#YBL`S8AeeC-y|fhqIL)FGF!kS)b&dh+TNX6vqZZ|Y zE3}kI2vd``-Civ$^U!o&>kUEr3!0%nQrFWb>6Imfyy&gcn!In5J(1{!6byIXD@Dva zM%AvaOqTV~VV#=n%VrEcMAwSgReELc6NoGBsov4Jbv2%;PI7+SQ)cn?PqWF7>x>E9`s zcJ?9Fr0V@lHJ}0?*@xqS8V`6aR&bBuMgxA;y|R{J!_@kA_l&F=Yk5{?6U47J?N{dpw%%YmSa7jN<7k2tZ}Z5DjW^z$aOTjk9ls6NbIvmkIzcs$%WTD%X;xPyGy$`$rQQPjPT>BgoK_n-t3m z9MPVfhd9Wg5|8?`3KV-H!Tk`UvY#xH1q{2^0@f#?ep6 ze4Q@TZn%H-lH|z&&e*u;muTNRm4Cb(H?q{qlV5?Iehy98oo-*<2M}3DO&I2Av#zOw zH2WsRGFXQ_cCeqkvMmzfw^F>-{MW1l)RBy};8ZmW_p3CBHr0Wo8TM?Abd8}WFm)hXh zCD8|A5z-1@4|EeQMD`-;aLZtaJ_wEgkBZU$UHK3iZh4*N(q&70_s5-j!Dj(k?EWC7 zRUZ0Kc`;v|rt_G7d7^Dfb|n1dOv)9KreqB@$w8}=B~Dw3%@cg`e0pl}rpHYZ@Abh4 z5iWGhmf9YU=sZ1Mz&h$ZOB`!#8^v%k!{`UL(nnYjrZt^_qx$lq&^fbuk6NzK#Heuz zs_%8qFWOd>MaXm*S((t);_CW%bQ-D1hQ-YBCc{8if8SOUHdz)4`r3VYjN#`sUGKXh z!>|LSkiZf{7ahFy4OpSAi7-Pdf!KM*3^ayt6ksr9C~Bl>wuPIEBYps%;UH7Zr2r`G zE}XEjN5_7*4O=n&Zo)3NkAe`1lm}L~prBxKrT|JqqSzcACYZnN6@r{PWip0_ObX7% z)J0&onDl^YuE^6r^2Iz(U%28*lc6S}x5y-9}s_44u!43!h_A3zC_JOF}HJ+{4N zIH1Fh)&SY&(e4zrcUa)JfCM+Uu$&&>5AdWlgc?=0(RA1!Mu4v3*)+ikZ)_`K+jHK-Zy=&@ z_0uax^eZzZap1G#ra6h8)4Z(r)0{2r6lCHb=GS-nu)A4p*k~xn#&m)XbQm5%sRp-e z*9QZj@lE-7D#*I`DIN(#N`3+4b#Yf3?|{@!z))=Yvo1IL{Psf@4^w`x0OMQ@oEVMQ z(LjSL)0%QGOg*83Cbw-%PpvISH+(k*E_uUNPBmd3+I6Tk-n3t8I)*)h*7f%Nc`B7* zlJr~uH^q3O`*TPE!lN&0e6(W~kX7INy+xZL8!oh0ptFzFi>a|{pY)wUE;rMoX1~Wr zf=oc#F1ogpAWz#)(vd-jwU1*S=$x_*zcIQY=D>cHcG@aCqf&oHi@h=J6LN*q9?8wV zgkW*=mU^!XBS(MMe-@3y-gqp#1_WuBXYdF=R;7ud7L@u?f~O6R?w__nvrT zm-}aMVeL=cX-14cS6=%~?z+7J`f zGbpU;swkkg6-T#W)7xs4J+mry2GKm*ok zz9mrm5>bLq>`e|Ph{kmcOiCba2ItsvB6L-Hb=G=}o5gO|5D1N}4`VubL>a4`_iso> zbfRxu)ZxL$kZyLkEIQ3sA2%eGmIt_1RU^mEQw$yt8*`_hetWyGD?E_e(iaVffArhY zwxQID2f^6WZ<5V|Djub3T1ebA5{XD$j1jFXHSZs&uoQ4vZ9j(k6j?jN;e`UuY(1t| zT&7RQgzHr-V(N;D8k0}I0i66wnD#UrcCO#IIO5F2Y~W~oj^&8Tq5hQ(6nA|}eqzIb zXZF`ms;VuuZ?3T(7GeGA$EuL11Bs-8BGT(jzN`x=H!1`kT9j3L!L!v}4KjjlElOqk zxWAS4V}G{hzUX6mBz!mtIrNH&jOl#^u33F9mK-NrT+ryJo;&PA8+P3c4L30pId@Iw z$g2(7n=XTVQI$CqpUh^ADWBd30{pzo0s1Ts3&JAT9#)6z4k>Q-380lbbxr_*fmFLK z4_~IfD+N$#o|G{kQnWwZGW6ueh(f>wRF45V7dCUABwIm8r;uXI20Kg`T4&Lm&N=V z`V)QZhYC>;sJJ|+8XH#5eoQ>^j%hcm|!(LD|BdNOR1pGYfH@O z`{dIVvlT`8+1C)xH&$^)dGL!IO9AWS<>+#e^z%Ryf7!JngPL}yGC17jxQe^Q8*=18 z4Qxj@b6Uuth8yFl6Z&b6gy3n#Mq{i252w(4&Qh8#eQaNCF zF1b&tR;$L@FygChd-_S^Tq)x`buxGKse&VyWzUk8QVN7SPp27l%gb9c6Y;k7i{^M+ zyuomVd7kZX`6mmx;R;jZKsoa=tq*}R8XCs;!v~&tPrg3(^53|ATFt~n1Rsp4Ec9rV za1xkWZ=AKvIAP%*8x2OURV#bvjWL@Sr5j)0j57!XQx+=QuCmOc6iC{ z-!frsrN+M7LY%Xf&bAEDNff*ZrMkNQnBp{ zzT_sZY#xbUAH4m$g$Qd{t4P{@&*ZXqsL~;QBRBO1JHy-UdLN;=AK$yjDLBJVP8G|2R zw5>c~%;}5av!8tSPSKEYkqK#{t92oSro*)d0=50OGHAqDrV#yuk?pMcaKLJOqyQ}| zPSyA59ZkvV7mGsMni8!kAoH)+${=4GW>n*SZHhi&>h(5FgZsc-7z~hxENd5stMwE3 z7pA%3!A>))$I)b%1aMg%HqNmX(*P>tsxLkNWAAh@@;Kcd!S75*#B2x$ur+xCR@a6r znHTy``|B5K51D*=4mJKm*Yg?_BoW7uZM(RKgaZKAM4RRrB2{c!2*{szK!GN^bXZc0 zO=+8#R|FL$1oU+7HndXv1iZ2Y8!UrLOhyBf7ASS~4Rwuoyl*8+v(Zpk6zvA)OUc$V zprSO~8|b3pY)1)aJ*Ol-x5$*EtA7KCbkIDX{DQK2yngA9t@m6UsXCq@FyM1)(9VQ# z=X4g*qsLw&&GMuX+if6+b<~EziEboKbHKIA!=*-VA)_QE=t5BhC^|_O=%zQ5SUQ7n zF>0^pc88-BEwX|xr3<9E%&rQcUCc-7#d>yBPyztf?sY?U$f4w*{#t3a(2H5%hr`%Q zsY5)N2H7QUoI*3usDSDR7@@#tEmvlzV@1Q3ED7Snstc7Z8ZLXaw;p>|1XEfKpup7@ z?NZw*wA;3Ct4TP?m%m9Z`CLIF$tU}>P{E~{#DMc9$2Wa;FZ z*{ep1>o;oCK8tZtH?*!3>TBP1FQG4-6l$)K2#rUj?_RV&LDq z0K3TD%o^t@0s1oe9tRTWS15$M**&xN+KImBo+xgn5^b9t zDNO51t>@In-%45`$PNS=Ry1E9A+zi%&c8a#{xLKdY*8|_{yUQ&HPf|XNN?P7eG9PD za<-&t$W9{&g`dbBu1j0(03DjaOjlbVFRz(8Yu!a!_>ZqXYO%@|1l*d(z znY)v#iEv$sjZljM8;43Z=quaIJok!)(Ou($BX0*c4dwBgyI)%#CnafpIo;3{-GUS^ zm40NE+~Sj_xLi=dHneX&JF*K=YrU66q$GUYyFiGwF;GknXKt=e$g^HUb?CwQeR(?RMR4Y_4wvhd&_z1RxGJ?Zpw!q8knAT`2_4 z$wk8H*ED1l7%D9EifIg*k#*A9+a&kZHViVQDAP%qnuyfObCKt*e{2c<{>2A)1{Ra@ zuD#Pv#ru`oG`GK#C;>&CGdO4sC|1X~Pak9TgqF1BDNfJCJqWj)(f}eT3LGdpm}~+n zvRi;SJNi|f6QHT#29$e&1*4_DaIXM+hPU>HLJ(P=6JdhWtxJ^PKa>Al1jC1z$;H&H zc7ov&%+uidmH>i@&Edxe>@I=&B`;J0fJy%;xKnG6NWZTL*W`! z*qGtgGVM%;8W|GRSPLW>&?TSIQ^J+hNHB45Coxo)ps+I7J}nR_lBWq3P|?hPLRCO? zib^-UDEdg7Y_?^KKvYNeVh%EqGpmnSY@=|VL)+09cbq`@MS5e~ibOq*=W;$59nr3! zy-^*PovRi!UZ*zRj1FqoYfPO$y&b;0$rj#gIlg=nr!p@*y1LEGBQqOMc)aD{Vp`jn?`?Ef$Ua){+qh@Y z)=#=Rd*3uWW+sRDT5oxE);wjCi1ay%b$lF*pWOp^{+&J5VtosCic&+&}x0tg0}+8 zj1>h+Eev`GD~ydV)VBB(i5Z;Tse)1Lt5ej&lqeskl+p0^G;Dq0Ky^&DfnP;zC*|89 z=m}qU(p1hc%~LT?SI$4zb>}>eX1qGSHa(L(U9%ynwU>d~Lg%m9On32xtJALo@7%Ji zG~?-7UkXdEV8lCpu4Qn&3d~z5>=KA4a+kkk6@o?h=(*gkBP|=cnfX2+hw-J1#i|g8-%1VVN%;|?4 zOO3a)N8?rX5_qM;%29@=$!F8Axcew9dq0}6yPULx;dXyBCDmJFL(u57?C3r_Se#vS zIYqtH_jewe3HO75a|~@c%7`=pX+FFjn(V`?Y_3&Yy1o zpP}+`tjq4mzE%W{t5R8V2wbiby8d=}rOG#;IpR{msS)qX1D_T@EY1&T7_`vrCMOK# z_9wt~qpD}wHAjG?b){;UyjC*<_iB2|*1;q6LHYrA5T)c}$=W-NFR%`_&>FD*&%-&f zv&eY2(KtEHr(O-pkA8RUp zFYSKyIYeiW=*4*DL!q%d&od)MF(+?b^x%~S1nk_#1i3~1ui zLk_O!_O}iOVmLgw$f{Ja7;Xje;Ke z#kQ{h8~eZi_=mKrg*`3rewpsOM)I7;?g@UFH(KMr z(N*ggeDxLw?*G-T|M@px5&=338$I;#h4WF>UxekztNMje^p*We9WOcE$#J3conQB< za!P(H#(i=7wyyj0{|Rj_`=iaqF+Q-rw7EiF)#)#7p1S1ZA^C-Qbs0WU@zh1p%9(v? z&ctSD|Mb8A22(VZwHfgc0^2UO8*D6`OF|wPkRI}h>f7^+3CJ{Gq|cM7EHihdlQSkt9VYK zO2E!=*mv@@)sS~$f{Ddw2xmqoTi|~g;K;x4*T{eK47R+T$kYK#IU{c=CBvJohg2so ztQtPCq0Lb}#x`o<+7yMOrau?uch09^zB?$X0$MIti=0Up>Hyu)J4PHiawvqdU`mRiaqU|=;=xbCN1qn8D*doR&l9>* z6VFZ#1r!ddh6%M08JwH19X?d`J!{FrLp&AP`^b|{~z=R7~a$Z-|lm}!WP zv<>LwTv0KJ&I`Aq_J)}ck6wR7W!MrwTYd^j>mu!1CcL!P-2x?B;VD`M_4?8_K2^uJ z{rj{Ygz1(rLnkn!Er?x(JNrBTEi-K2dl2%t?8pup)zuI;L5onfz@a~_u*I$Y1YyXklYignUyKa@a?X97i=c0yG;uFEpA-D|=Bv-Sn*L;pbRdmh&3uR_F1ylv zSw-X0Y=M7Xy^Ck1AinWZT^g!q!OWT{cGzHxgtlQ`O zzhC*ca1cH@2|ECK(|noUO#-qXXfFPd!wKoe0%v~Ws1Ar($jWr_(lj3&HCsn(?DBxi zdV5n1mzv*5T~uSqKC6H4)ZE%)DBrvpFev?~!)`nxN3Y@31;W)JLX|W1$BezlWt=t_ zCQ!O5u4y@A)O+fwPD z7S|e3G0c13X%-oI7!+kWyu8Wo@F!D&eck9$)^8)zTNeN|5D;JCeV{r1ulb|QJiw?B zc!>byR#yZL^>wTYEovTqMg#qq&P27125(nCmjg0k95!|fN(%!HIw0XQ?slrf<#y`G zh3Tn&HuT_N4o6N_D)X{;gKD{)OoCrlWvjHK&zf}xVX z*g!E2N3)TRS+S>%*zmVuMQ?AP73z@85Psg5vzO}yXYWg!$tR62U$6Kr-m;Ixr_L80 zeKTNctgq%Fd#$_GBCoh|uxZksHL|Nhy>E@y+Q`gzZ5xw}Na%i}1$joPJ>J7{jUa~` zJ^!}hu&{weh0_v9^XIV4?)B*7G|h02e_n5zB9~6I@#;Y&UVfkZSo{Sve|Y@`5Mo-}p7br|kTSv|HS(?Q~YY#IjC6FG@^RPTO}+ETURG|-yz{ltSNnY<(*TRbNPonn-53L(hELh zOjx!~^q;P;&xug*GTepz=%?r%0@}#W8ae%N+-}bVp+`wJvHlNi3`lx>$<+_bE>S}& zoL{|ZI$!Xx&6uErhuto>N|7`OJn69>(fs1;qFR&Ug#SAbeJT&4{Sy5%r{U)CR z?LyOOYlU`ZEk3WO$L90>gu2x9Mp@*_Nb9}(Fj&xBtD^k!H2 z!JaxxZS8DrjIIMVQjB+pd$)?S&*UkVm5$qWyBA$5T~bu((eRo3ZChSSe{Q1l+(JK+ z!?s>7fm)AQ%Y9?B9K;JN75E( zj?;@WMh$O7gRQ$KO0@@1y0Ud%mn`rEn+msd~4|RJV`mjm(D%AQScWzb*y-YMGG*&TpLF;ERSu zVKx=}&;IYF0HkX=YJ58ne9_T+C6z~Y>~RN}+9h2iEY4t%!0T}9QRh9;MOy4T_PKHX z=B&-~E*9^-Pt$8GZ=#h&Mx#SiI+51IV3EXGPyLE(yX7h> zOfgb){xrS*gEJw2V|MfB#o0f&^M3~VW!aGZ@n6v|BM|-KyWTXs;sdMu1N{Q!sC#)u z!zsPPm8KaX_?edaOmovD_|>>-GGx(ZHVl!35%g6xtd47PPi#3^wWx{h#3Lx=IJzf< z9qIA1;~W!$2YR|*=~7-$4RegVtY~;LSlu}Cjd#Lxp(JNd_r(yu3`Pi*CXS1lgCl93UIBk0-H?d7o=R6_AP+Y=aTVbw&g0kGu&ZOhT<{%T5v5@GR1S)Z70`bFzcMFny}$|4(pf{;|iL67P_ne)*GlW z(%a1*kgXUu%T8KK(P3E9e%2IFQCyQiN}uz(|Za97_??Vz8rXv*0_0GCySo%v{laEC5#r7Lf5JM58;#lUN|G-)P<`DaA+{zLd zU}8yZlwtC*s7t!J;AjcdS8eL6A~{hLp2{{}jxgHK$3>k2t$WF8!8K!xJd-Hv)3WCq zhxohqE08iVF8kQeaXD3th|2$X>!hLP4GSz7wHW`%V(ea+(}>mjLD_hoDaMynBDw>8 zO)@RAtdwPh6HoN|AHVxTm{A@`t4bB)rWVN!oi6QOE8^Qiu=tGBSP%2hf!~i-CzM%M zEzUZqf#C)kkvTVMVTyUwKta|Sk6e8Uf~VsXk(P>%m3UQ|?WwZv^USV0S|67Fy0^9` z_S$oRGGpqdjfG34BktzoU9VhFV z0uwv17A8MPA8`jV0|2 z2XwuYEmoDjugZfzbx`hmmerQ+RhhaaNk%_Q5p9N z)9z6WDy(6hAUhc-`Nfu@`fz9F?+&W$+W~>+Lzn1!F@-}!7ws!1w7uRQkLkMUnD1{u zzCp~UJWA_w%5up_zq_^rX*5H#OwC`)H(c0@?%71PK14pexapPjqQ|dhef^tv&qoaTYElT~{ZoOySTYq+OUHIWMT%5Yjuln=l7dKVQ zj8#2L@2@vRRzpP=oN@Hkj+X5~+~A%yzu4xC*r0!RitX657w-WdJ1+jBV z`)}vFi1WzzoRVS-{QIl?S03?~RQ#6~Pmr5}6Fy_P(Z&vgXk^FlXTHEq3O+4LdS6hv zpn0w5_@$Qad8M{vEw4|VX9wxje>=SWgAwnaKEzJZYeR@$#?h>Qv8C)jnebfkD8EC1 zeNI!~Ffy=P+qH^m;ZaJd`_>S)aR*dr1nVelm){LBJv(=;I;aUOka$X(7OzCSEixVlpWfEMDomuiU_ZS{On0MZP>VJ*TY=J&z>jlcdfTYK z8wbGBi0UVoPJ+T9m=Iy^pw;ois>6{lNBNJpbkh1?-;%0_gOqFR39|mY>_NGK_wnx} z5X>{#zI*$b;Pf2rn~2#l1IsJ_%n|4#1kKzbA`m&=xD_~3`Eo>I2Joiz9YHs3$xlMf zUu8IhHeN40yiYU`>Ju+x=Q_oM_j6;_?E*rI<#`!zok7^6qk3mY_EKm$Ushn4*F@23 z0ELykcbsB`mZ4S&7Fr?rzl;35a;d&@(J5T>W9=bHB22|p@n(ZSGjv~ZVvv@*XW&O!ha>gF!0}uFf4B;!QuJmXd}&(XR6-5m$8n6 ziW_eOv7A%IIn^Hhj_sej{R=tyHn^?e0SrYjsx8#F1DP-`6DLzMQrTkWTD+vmlS5uZXPFa5;QHl2+)W~F zc&mV`wrX-Q^wIR9B(&*sq2MUgt={m?i$-p?P=`^{G}l+haCmc~Rs}!cqWzH|^!oKP zsn@Am*yGda8@5w==gbVX>j_UVXB)5Pi}0c;kH2MD%--X=I6Z@kt=rRTAJNolrLG8m zZ_9Sas`PO!iAJz8RqbGawQWj6S*2rEQ-4+Ed~5C7`gjjF!!r$uXVSEq?LL3|%$~=* z1SnB3?5y7DI;+^nRm_`kkD0y%!dW_JUxGrNhMgJx&~((97)A24!XLXAAG&S@4FoLU zXKMz$EqoQoFHVMiPor$UkP+Q*6&$oU=~l-u91JX2i|}>%3BT~sPeU*M>(OUUN~*6i zXt^j-y_92&ZMx@W$i?>dx`-m#Yn}pkJ`~B-7!MX{45p>urba5UMnYo>F|_NeUlymx zQ)1U)f!G5^=Pd6Pp4Sg?rNAU22=nIqI2;_NyZwUwFLEG5;Op?z0U_VuW7Rp%6Tz?Z zS4*_DRfArq<~s;xA_g#r&JP!DOwvb+&lDL9p9i>3l^h+-EivU+5*g(>rz)(^&=pm= zM=!dT4D$?-9W3Eb_lAD(nXQ^a3Y2_fod|7e`szckNGS=ib;uYEx0y6!F(xAwrkYa!<$@ zkNL+Px8%v{$x>}5g*A|@XV>?1tIxBv{{R$rz&*^P$Cr1%ugK1VqrE?Dd5{L1L8hEY z->;kTsfKaQBhCIp!S83D7{1A{ejsd@rvF8LvS;rr{KUx9>|x4cL0qU;F?P_QxY}h; zZTIX@ssrWXrQgk);*uOs0odQoV^%g3)u9|p_lgd$(DZ~1coT;;6T4**VcTmXyCd|I zcVrUAy{uuD(vL+=yze)^NGBh45=)K=zw3PDAhku_ZjD8(26bS{OHLJ^GjvUJsbwQ& zap_-AzgQ{LGA}M1F!q}yGrMi-s{HfMfWU9oLl7Ie>$|7RG`jTgFEtj74(1h%sSmQ3 z`=YXc?C5nu*dxb8Z@EI7au^3@Yv}vC4$N*pK5_W!{ody9ZDQAbF%qjzUa*}_ILNPj zS85m5ygC;C6H|iHzg@%P@f&eyo>^Xh7jBmX%&fz>Fty_4@{A1WNd0T$igvB0i02<@ zkad1$HE@Vw$pY1MJaH?1Lh&skGe_%v$G}tsQ9V*C45=n)LQD#S{P}kl}S zhqYmksGG5*M?xGUI$pJ*adF-BuV%@eVeqRX`cILkQ|?Z~3SX%R?r*|lyFQmhdr7`9 zh!OoHU=JPH13lLc0jqSGt>5=@H(-g={2*`+vGL08if=(Wl^`h<9+h`hjUc*1m|E|8 zk$|yHPGcjT<>^bMW4-L-W4Gm!62!ED<=ZJ6ANitUF`9f?s)_-_wcVR!|jD zprpzwR$~)Z6*$%KIri#b z>dRP@tq)|Ezh9=3W70Z4GH%ZVrS6YLmwbz?BYV!Anm2?((WDLrcf$-pqMnu;>+ryZ zJE@&~`GfPpO-nbF?-?s}hF6I($VqtzvTC%vi#Ap~FfTE++ptt+zF8$Y_^|^v< zed+L#hTub7ZmW#0ONzQez21W+rh8qrZ|s^4?dndZEsk?UyPhbsd1=F6CeD3j|B;zg zJzKhMtygUgD|oc z3@N5r?YWi9In51OwFoWDOu=+LI~g*Dq)e0gB$x{QOj(Re1wccGbvEXot!)}gn-U!G z*))>B@w%pVIH2OeZvSAta8=-u{CUG8-pT?sX@QxrD=?C2r+L}2DvwhCOS%(wV-4e8 zlda3+#P_U%T{-lncLZfRlKv5=F1Fe%+G|N@Kx^Blsfox8Y(d{Tk&x+gRkg(FF>m(F=WqY%75aX3T-l|&a zKGd`+=bGl?u?Kt0H$N5%WD6Hr=~8m-rO)cCp6%`|0rM3{cQ+8Z%FHY%>DiR`@AGK; zYmoEZ>*9_MNhIe5hPbXAV6b`CSk+_7#IyzW(;#3xxJ09ke1D-FdE)FpC@$~Y8Kp&m zI)KSp)C6hv`|<)62?2B_C^!;~QxET9mC5t9B!1;3DA|a1^yQp(SmZ4GYPaZ36>|t$ zvzydb>47a5_}+bVpKiD{eYr|B`Min}59kQ|#4or}F_+mb?{I$&@3R^_36=s)>3z}p zk|0pkPa+}t*K+%`@trNG9K(Gn1qm6lt`_cB7|tS9qOl@QvgU1-uL%y9g~M;u1Wu`q zTRbT&P}k%IqaEu|U| z$1*Ku^pbT>_;I=BQ-Iosd9dYjVUcSZfzl}?6C2pbS-66GGHa;UQR+}qT?iySp*5TEof#;=dB&`7ap3($T0H47Yk<+}5bT_w?3+ zVe{=FabMNtT{Bbt_pFD{GR$ka%b(XOa|@UsPt$+L_QxOMxmMAbXR;Ru^c%+YrGvmi zS0=vkHL7e!W(GH5)debWh~BFSP&Snu%mGi3QZ3Lgnti<3A`H*c=3H`TD7 zM(~$cHiL2@j#p^|aJ$(oiJPSjfp_|8NviLz2{p|pb{OQ=C$C6*wQpywMm`J38u!74 ziF^#sw9L95I;VId)j~sv@g!y ziPjmUHBv1a)FKMrNh(G89Pn8W*DCEwDPj8_blw?yJykJY6+8H-p!J_x-o{+>S%ml5^+oLsn9SYdE8t$q%F^=&q`42-G4Zb7h6 zn!eE;gLY1N3a(wknV#{rOQJei6(q#E&3okB^{jzgJ}J;T_48nf9>0=`y;b zIFmPThTuB85>*8XAFr3($hwhZJzU&>OOQ|B@6g=yG#j^6eZlF^_=o2A0_eQC1*SfT z=JdOGMXvxOl>$uIwTA1g;#pilvCzZteH5sm@(sp?c0WB{H(^m#b>#UTOToNz7v06l z4WfCn`g`}mC7`$fyuGmIJSgLqUu);iby|sZ1KKE2bi+;z&B_Z%Hwb`6p*X@tN|Z<; zLONimWf|~uMK4lS%vv!h+1r(k`9)#SAo7EV0Sl~%{9;?#P0St*EP1kHJFw^f&_A$k z2lhFNQ|*1NB79by!C&tmCgpRkwq=${{1SRS}TTLok=NkzaQBMeBQPR;_= zdbL9YHoIO*lHJl6i$t}c;o~0Yh@ulIFVk0Y^cqJi>+M=~K5&1wK|KhLcqwwo8yi>i zj+|!V?JSzth*d5#mG|DU9UiL>D=C5fz!|{P;QKc2et2`{QMcbPE&q%~NzMp~vasha zo9Q1qaLUVA7)nA!wEPVtspSB(QO9i$T&#H@g(5#- z4io~_Gph%_0P|ZAfghTjdsX<5V0UoO?NbH2;<+33Mc%PV?ESfoirY!f9FwMF^Y@eH z3`ZZ4t_awT8T)W#np#?USKO&~ed&XAc+!Ywt!@O;a8h(!$90-xSci401Zk+-|6C8J z-J#1V;XVkVhg)3g;wpZE&kIY(BFny zkQ5{Y{Rkv$r@6j~kX*MJ@KzPeQ>x;Z`#7R(uU(Vnxw^K^ZyE$sp%!R#YL$L4K{gqW z?u>s2X;>MQ*E&*tYxa_w8u@%@Kh@r-<$T(nQzRa7{P0DBV5Xu<-lS@L%-P|a&Ho>B z?-kY5{{DY@js+DJm0oic=_N>!7RXl-5D<{wi3mvVEl7!?fYeA=T11GU1*8O!79j+L zP^3$!2?Ek2p#}(?+26UCHNT6QiLlJ{1YMX<4+IGifs2>_| zvBPu(6kik86_WQDIHlLFWBu_WTgcWR)@+kjJr8;`&(hT`tc3TB;1q9fl{fVs zaR=OJbaS+~=`_g!DhB=@T^R1|U#Mc*Usif7eek*#5||H?FEe9>$@h7xWBCohZ^A}q z+2T+6tFjh404V_mWL5R3GM2!RF@wq#>)l-S>A=L$89_m&S`M!(OQGgHfp0?pmxh+Z z%hnIm&akRDmQUvOu_v46)J3luSZvfgnBoenqc)xQhpxLO57prR)6W@+k?hb_s36#6 zS;chfB(GBCzEIR^znNwy@_;M0sa_@%@?C>wFT}f!5vLcI_OZ}?XL@|BUyke6n^Prt zopDn#?a4emqT{GJZ*icCL+hRO*aI4{nuIMz==_jN=>IZ$wH@vL43UFoG6ROi-#blc&6+vLEUO^*r<- zr{UG2wM!M28s&yjBVMHKVD<%6I*OcYK!gis$(=)0DgWTNXoHLIzF7 z%Fevj#(qWHTDX(aagv#Cz)PjbrNDt89sAm32Q(L&+e`6J-s9ZY3P2lEYTbx8kh#R- zYh{S@2@v3k*zXhnT5qf(TaILBZSZ+SJ-eu7#L6sb?KCKw* z58#wk-+30;uiY{D@!pcw~qH&>KIeDRUo(_SyKN$2GYc+8=c)qMU1J zjfswH))OXobPV9Kj*t4^=_ei=aMSvJYh4wZg0D-suZTUn(*? zt+bq_fz{_!bq0CF#~NV$27k@YrEIsLLmHi@kDdo;8_7}eR~RWvKLxJJ-l8F68R_}7 zFTPlt6&x^&-j0pb(zl?zss!jEJ5_KK$Gw@Uqt{_ku20i?qr$yh1?sf@*k@<7eA8!) zD7RwneHeE1$bXY4BJwMc(;|UCax8C3d9`})BovDLO`-FA&{y%~thpJhI-c)7Qeg8S zOKHHgBvV+7&p$CRpS+Z4<#T&nm_3<3OKfXM@H}Ae@J*p2&+Ak}hC8vs4E)1OeD%qR z4nvn;W;=glL36dwea`$nffeIZET2eE#)yw#)M}r^Ea%TWEg8GT0RZTA?ppbX!1sfB zQNY0oh~6jd@!}UM5%sdwcb^Yy-fkq$$2S{xQ=OaI8QMWKhU3GwB%6-sg^s+h3=#qk z?pOPYQ{QViaX5x)ov1E;KQ?BCJfQ5? z_njuq>sG?*PHkLgwBA44@~|Cbm?G zht(X>LAvkaXi1djx%|K{bDpeTZlSMFLP~ak!A<6T_kxIQ zxb?0QB#>5B$bB`AIF91`^)C2sa8w)11MAWrPE+%_o#MEVis9_`!8WxJ=|kyg7r635 zJ)%yghk0|oi;LUJ>MC_p%Z3I<`uP^cT~I@IzYT^asQG3cXK8cg8o!mU3O)v@;JSv% zCF$}cDfA0Y&sNj^VwX%owRgB(bCHc1Y{i7^R&cXp&mNeM-Uj0h{Pzs{)XX-8&-kBe zg1rUd{R>Vpizov^GPU~ZVhymQY+YXr%*~`*V=i`QirAW@P%aKaTjXY@?GN$Kn_?Ef zXDy(5vsEKMjPg@*oRxDVUHnoyn}4}nNu>MuoEYy=0gBaE4Xk8lTM4Ir^vKP44b@16 zczOFD*$w%=DBX`S+rw3bL|-g?LQ9j zEp#K;@1dCYO|B5BT@8$KufSwC;(9<(Lu!eqS<$;P4d)2SKe@g@V$#0XmSrQ1Am}@? z4m8CluB z)Cpqe61mIs%Y7-q@8%=_s%+vb_1c(rq%}2QT)pSKEYQuj8e(ZXg)hL>xg8DJ*7ij@ z9cjDKJtSQ4x_$KW^w;@8-YaiJOv>|zP2bF3lFaeX^0kw)X`+Fy&oUi=X?IR8Ufz)j z9L8cIqe-XI_3*>oOS@ah7i{^%_g3XLy*vW9->q)zO8CovZ#FxS92AstrawWb-P{T* z##Lh10cS94wqSZ=&AJ#qA0k9l$jXUW$HbUlS!i*Q&@uFh zfk)1;XRa@*>_2@p&wKZBel+J-XovX;c6no(Yad9OugDUVOcFHaZG{u|;$i({bw#s~IPSo6kpf z?XX58x5OeMDq2)z{GO@WB}x4G=c%QsRPhBe(TS{gdc^90OE+H5Xx^DQvHAviE_Qa& zDz+(E6m&JQ`m}|1DriC+-LH3mJlD*=)_Mq(a6D+!{~3<;cy>$w(}Xy)`y@Y_&ttw0 z(Z$9Pt$yo$r@-e_5lGmgDIo4y1A!Zgr^58Y91PQWq<;ArVj?z$#d&?L$MUIiE~k?R zuODVvPZqx|rE~0XjI{BMVK|pA{O-l>0kp1FO&`wOC#TJHtE2!&DgU7nl2liBUd1D$L@P~dhy>0#!&B|!N zii@gW(n;iBdBw&L_kD~%G~hf8@@B)@b1ZAqe!=$y5U+Tvhl4<|UB4oA-vWE<*JXW$ z4pyk2&vpca+yqGcN!SN#Z2}jZA>C4cy{-3>d~cieaZyDpr6m8?j9Ivxr6>Kp+M7;Uez@~iL({T&W*qgpC=5B=ThyC~2j)#1X(7fW#Deg1^x z&t74hE%drqibhn+x~qhbO6UUkZJ13ur?~(y2|rMzT+{+G*WNI)G4+68OrGA?WT?{q ztaRXi!fr5i-NLALSABGGF)@^ zwD+D${_mT|IS$Lf0mLaWQWUnT0iQk7LRw^Ar$xMkPji(+bK`PT$;Afgq+C{!w6?|B4&yF5^N+&J$(jWxNs+$uH=wSdmyVKY z{W(_9s}NQ6+La*uu`$82m|%-~e~lNmd8FOp>i3>~Fwii_`PK&Af--E8;g}vtqPa8U zd*+1f!Hc>HHj2(9ogA*^rha+5D6@Om6YQHM+$eIqW~_1|CG_VJdshy~h4u#@(&9H& z?_jwYs_e7v?UoTb7v}5>@bgl=3f20gT3{&B&M~q-FxPQjk>qZBIxW{RQWuJ^?;44% z9y!1r`6ASE#X1GSFveM6@rhw1m9DFu=5Zhdb2^m$S99hb{yo`^X9ouI79ZQGm-5zL zY-RAkInw5JIcKL3X=&CDU$ft?7Ckp|%}i{ESFEg}m&6HK2bMXOdsZV`c_#+_DvSKt z@SNR2inr`p8RDR$K>I(%5JwQ%JfsQndb={W>T)e3fQN^oVEYs4YW6|eLflBEGlT|=VQ0e(CdqKX*znBdMCaeK7{L{Iz=HQKEQBDbwP!a`3Qn5T%RcPp6ub>Mos%pAy4BHqo}f|}zO@|sl`5sN4?g7W0=i@`<5>WuxtVROmuLI^|Z z(?HZeCfmyfvm%XI-=#0!S>W4IxD@foseBJ%{W=WaVQa|*9eN}9qNHku5`bT?YYHu8 z5HGrJ-1>xHu364i#;f;c1nsty8BKXeji;JAx{T3V4DWgJg_g6qh=>rCiB@t~o&yih za1obq^W6x3I46GYwxRE~3?Xon635E7=XSCAL*T@&XJF&Hfdc?OzTGz#IK*y6LZLv%&#dNfgV!gG1&L8MEM@gg&JLrR{dIaf>?sN5ca$-umlf{Ai z^s)NSy$UT(8<}WH3t`{2{ZWL5VgjIrh3Io?Cj6l7n=eXR@xy%9trbLh-|?ibT^ia0{z=#m{W1>Wh~|JJ_x%|`CpBI{?);7!wn>!k znh@b$><7rSq1)!EU<1;4crlqgYdxbgvh39~Hy>$vE$2)3GrrvN8YNX9+V=6odRvEx zNuSxhDaGidMV6QOT&?Q#1ERDM8_*EyAYaW1uK<`YR$j8HFipvCCNZgwAIm1bN#FCb zwXO_CZ+bkF(7RtA?0OmK#DLaKZWdr75sVf3`~o_M0Qk!tVKHh2rv=IhxT`vI`$Kj< z>Rn-ld|9&6PIa$#rKa;Lc(*F0KR35UB%ROJ2~H_a~ex@QamZ^OLXFrxq`cX_HFcw zw0{5HvS$($x)MeATG=z#i>3OUPO4FL_HH|?3-k4-IG~Yxftx58VcXnXI}(hzV!y_h zGW%xBE6UHqNAaeiOiJJ1`v-{?c{cC-^!DZB{*m&~R<%I$Of{Nba&U0y^{sFIQ{Cvi z-U=nrzcvc_TiWD2K_~P$H`T@a|Fq>v)NdEUdVX!cs-u!9f8hCJ-SK9NrZY1$7R)|tx*EPn9QfN zJ&#F}YYNG8IrvjeAl5V+`qLCGt*JgW@{#tQWa9a`4l0lL@oK5?V~AhKpubRcu>((a z@9Y~SnY#3*YCx$hUC`@VWkj%xj8|DFrMI)B*5&#X%z)*TBB>D|#qCEo!*KIQPLvM~ z>>~GiUUEoS94Rcqg`UJuKrD(D?P)oTr36YLH%TlupDWc8`zAl!Idtiw&F9MKm(dex zDQ5d6z==Hqj@ZheyHUduA3MNl)r5rS>^=lUnewl#scqk(JRze$S7hJYN8(q<#pjtJ z2s=AO>*;fvsWHpK)(AoYFKN%&$*Zh6zpX}X8r=^YT|BC_T(+9d4*PLaUu&iQ^P<-!H#9@q%002s%gw8Ca+PMR2FZHzl<3xi$7QL+mQ65lWfoO}VC2?mz zR}KE6;%+3LoXyW`#V+pbJ~zHgc+_BkziD@Gy1gFNWI4 z@xyky-05&bDyzY){K(PKvU(hA+1lMza9DubdD0vF*ueB}6Mne}mOjcljmRc9I$EJs==}B>L&}M!Nb{ z(Syemn~_$&M}(gbMy9nYY<_1qJNycGV5^~E{k0`kd_s;6#=cH=U#!Vo)t!lzuq)iG za&)-YV%XSDZ)g@p_`}b>18B-8BFu1#3w>!ajADEVrAdY`$@fsOL)(|ui{Sj*%RXnzP*xXi7CHpz9Z|auK zpFb`H!+_fl?-Yjdm!uWybcnWc{h22JIg;T#mWkesb~{W<#G3J^bUhO>%2I1;weTD% zj{jU{68l)&#&EPqN7;N;$7~5>B>N-A#Hxnz*Rgv1NTl8Iwa5^EEvDm11=QO>iuCDn z9toO2DqST@2jbPURhgp80$Fo_qiC|_tyQX83^|+o!Unb&O%fxM4IJik|EnBDn*Qqk zg?fa%_H+__mZ7j5+Gp4q#0J3&D)K=%Hdw?6d@F^_kM)W-5uT~3= z%52o7VA#v%r70FEf%e;slaS9y1(C&+JE_*u2kC=-3d^6*OJ8Ubc&IiWvbau)H+F10 zQu;M5cO*kuHU2$HH8NDuv1po?ql?KFhivKdy2S+t7!oL%`L0G`b-DVsYNp0{e-I3b zuuWyaI^@XEUO;e0inP(NId7Q;bfF%Cl?>JH{J5hT-4yIrry(+B{=}A&Xc?9 zcw-YI^dG&?c5hW`HHAdP<^hSZU_(<1eSuCL&f?Mlo&j0awb!eBB5T=G* zi4SHS2vrvkX~A+Ee4TI_MJuchd)EEzkS!K`^D9FsGt5Vx+@~l1pBufZqD>;cZlnkY z@{u~spel75)jx%k=DaegP?SA%!wg*f-dW_E?69~e6N&a^0H;2&wVAeC&q(;~kOOI*AZOS5QO ztDYkg8XUAeM$>c*!~N!r>&E^)W55{k4DUhO+{Dp9539}<_l~glewh-wXY28Ov`aNG zVr#CpjN?yq5~AZVjupvpm5Jz>(2o803=t;8lxD!510|J}X{{!U1J`FCR=jT2!~C3+ zPI`S@EXH!i3YA^GUpj=A3;})*7ZjI#XKmLHKqTnHWEn6ch1WOgtsbRGA&$|LwEi_x zF4cq(9)nhe){zpro&+EUi=A0dFN0~*)PuL}XPI(>&qY5 z-a`*A!doQNaS`f%xUD~XCp;=cF9X3hR9Xb7RpF3|_@?R@71XVMNpk{qof0JZVPEVl z#F3SUrdUDsQ2XirtlVkEDBYO*@{^FKOXs19(X6PqP?{kWd3v5Pppq@7;asWuIZK?{+dn;u%l4}@Hg`m z0aw}E3uN96Tvehkr(Y_pZ?dN#6B9iQTE*eA4$f7-4I&+FD?1>oe)0K=B2k2?lR@*x&7~%gPz!)#ZrnZ-&GycHyFv9H{}o53sm$i zZe23Eo7`%)e-WrJ1~2w(5EhIR5u6wx@@q!5!?T}n|KW3MbaSg73-sTnBAtW6Fm`oz zKRuPY zTEtTz!xlrF^OiqEU1Q#&82BoC=MhkUL+%F;V~z*|Gc^XcUp{(zS@ND#EjV5E0S+Io zsytuVYB6^#wR^nfeDE00vn`GKEvA*1k&_tIzg)H2^n6ZuDKm4f#>(7Th1kgH!yoXK zif;@{uCG8bMBFyIavCQk${EFv8C=cYTnC~`tvT9^sGy+Awv98*bJo*#(~sxOW3x5x z?@slCuX8qBxcdBkp6zhRo>!YTiAin;Ld3J%r>}Mcz6aE|e{clr$MI!;3D*R7StXU( zA{9%uk#x|IvLRLVVc6nvpL*oELEC>!%1hE37xLC#T1TpDew z<3&ipX@&pfi>xIqDqivDKVRFwKD{z&)|GT;EB1npPkBXbHD6s|g{9%0S-pnr1ZA;L z(}1YFAf(Y_)z4T-t`o4ha*vxml?p_8Io}eVu9mClb5<-jm1ntA%D^!xs(mIHL0do( zoJE1z$kWDcCoRq=Sl3-|BjQtOrDteq z*KdfmCwgWV-IWT4@LMY-hX}jLS{RY>;oWOibL*6)7oOyCROuLvpVQ!*nvj}t;`Un# zowtP~;ontiq_UQl>SHFBS?28ec0VNGU4@Z#?}AgDugZDJKh2r0M$nK+UdF}$a}^X& z=kfp2>i2*B_P_qu_i$P^YGQp#JgxYyp}fl1pG?{7p*xopVQQMTAffi#J*8{WXAl?Rq6gGq*!6n0GpjjjRtb9*$oSm$UWC)LlUvwUy+}Ezyk<=W1Fa=L14L<>G^ zE2ceGtcXZJr#o}jYd$Uvrr*wfdQIK%q&)hD=RNKhEe;Hf!LSTdp&DK_Z9Bo_ruqmQ zj_=N2HuUnMzE`x_QXGpiHlyurF14j%Fw?{p^mJ<|^_P~yN0!KTSsWctsODJP&jlwc ziW?RNajs8iI(e>i9gPz2GDKV8Tb~gK+)W?Fpvv^LBwrm+QPP;hUJT`ihD? z*0-;dT2!BAN~*WsgHvR$Cz;q!z2TyC#0jH(YjMMwpkhh)S7nwCV(rjrXNa zzKAkjK=g{{;AWi%j#ttri4*s19VV(Gt^9L!P^G_z$)0L&3t2NG()V}XgMBW4Y;G`- zR0uWc7$Z3Q2b3<#hL=_8Mg$&{S4VZxlZ7cgM=UR+kxT~)+X(+Rdk`lz@Ua*5F_rg} z{g|H{##JhvnAEc<_Y?iLlj2hT#51dW7+}A+{93ilc&!2q{iqa0MBIF>*am^h#=^)R zoTnOhBDtA&{aEa+8x?s)wYS^ zYIycAM7Mg)D&R5QUWWLmrrhx{DX=}#y_e(t-B_49x5;?dMBcioo^0aXgJ(G<&vKZm z%(_J+$0EQ?Xon63ag>dt*q?_-0lXEyOd9-3-VI2xY=>#4h-Bn@Z?4O+QX|oWX2}@- zof$w5BEyJt+_fjw(5DFQsr94BfT5;t(fIXV#9P0Q?hCKG=GkuX`8S26y>XwMNNEgb z72Y(7x#UA5Q|{7Fmw2mXZFBKor&rdZ(|}#|ao8(_UTeWrU#iwO0WE!KUu~g8X^oPM zTZudMc7D~@uqZYXC>g=W6r*oZF~lwMw07Q;SEqk5-A=M0>a=yEiKq8+_J#f)h8R?PWJmD(yG|^olxefz#}_1fr|YSg&BtppxC1UM%@0K^$39w%D0cX zvqOErb-h+xnpC&)SIs*w(zm(0-K0bR5UW9>OVOHb*_%C#(ce_`OH%tgn<3iTlIFR9 zRQ|jV82!&4NhCS_P4B}+muXv!7Y@!aX0jgxd}pf#&`U%;C=Tb<=A#ImBK6?eTMaNi zqgI=0c)~zL*PQ6&F000c@jt@pQNFxD&L*Nwc6}pm{ExH)+FInp=Fwe-XGV2g`qDDd z49&R(J4n2n)J}$m%uhz#i$?7h(lQe2w%A+6`b&+)F}VyPA^%pUxOq>v;%b1UL&mQ| zUspSB6SH*d%kR3Ldj25(I2vk5meP?65k3#aMY0~-MoOK0M7V)DnC7&C5#$yYaD{aH^REvgsj`yq!zpyRVr6bw zPhWaVlBwr($U%}RJ2thRPpRp(hxQplCl!N;fK94 ze;v?!P*<4}cLD}e368BNMUh}CYu=@Cm-Dh_`s07dkMg-6s|NqX!nE{`^~d=Uo&BB$ z19ohtQWGPItNcDEz%Hd?hBqOeBcO+C+0?TVuC?kxoJwAbD2G25i~TwQyM(D`5}%6W zXc(R(F_R^-?AN5eAa@iGM!xneC%2P!m@2kD0lQSZAM- zNY#_1g~n`lWn%T~CvXHTR?s*jDCAh*a4~tlJiX?-Oh}3McZ2YVmw)|7Y0bbN$-n*D=Z2Zj1)n1^Xau296N~h&pwqXT=ntZ z61i?~*W)L%a~nr&tN(q*WjoUR*{>yoM_=u7J&qegty1@`+BVA#ySMT(YgpbUwfiC+o1wAk`-QTC;jlC?#AIt|`iX@Ws zZ#I{TZ3Z5BNJZ%vr$;$k7`BLJ9eGq+7WQmL^Hb=ii}RoG7ffQo6&6R303&5JjA_YJ zKuJ)UzFIihr7!2vJRVi)?>D8b?+I!hzTb4B7eeo$G`Fa{S_@3npEFE&2L zmPeg9bZ>i;8KYTYUv$gR6c}3WN}=vno0?cv*xQGn`zMle`24U`R_5J z1zOn>t)L447I-jfj%^ zwx9bv2@QX)V|ng3_fc4~QbP5J#6+*@++3%wUWW6LMP8wrijD3;h(AtPT`6>>BG=(g zfzrsI&AFl3(=IxTJdw^eVkJ#;lj}rxFx?g=xt)UgHHF&v6uO?N#NSBmS*$A$w(~pI zy_ERfKa;j6rf)HWvAbEcv8OrszsnTWfKTyUyEvRcbd;pOX~tD|&rd1noS<9nqHcxz z`9WNr7EzotjAFx@`kcOO>S^DoMYfcI9E8-(7Ua8ie$3eZL(KkI5f7SMi(6XSV%Nk! zUSxM|e6HF1&twbp-!r>KgdrpxD$=`Md4cUOD*|4yrk!<(LjxxXkGyA>L}^XuRUld+ z6(w}ptu9^0JwJ?kBf@9F;W?Zy{KpIUPSu}$c>HK!0i5h1MV{^Z=d_m=?i3=>;w_!T z#=|+lw8_GpFRFun{gC{|r{|cP9baGURgKfYRxpHSb0>kienvv{P&GHljMYt=aI%-l z>$1HKI@nnp#_l-(Q@Mc;(^NJ!*nF^x<`^pn7Re3J&VSDco^}^r`$8L^X!J$lAcaDs zm0T;v+G7wf#Q=Q6oi8WZjefPB+v+xXUqb_ATwB)=F~6xNmbG~&!o@3Ajz>SO+uYRO z?^4*E!t{cYB2q~Ca$O6qvMP_^f20T(>9SEq&gh<$ZYMh+&Mu|)JU9Qs*z(W?6^@bW zBq17C&SCU3vba-{1G3hs!tqD>?wv}j-IZCw&YcMEc24Gb;Hn|lVb>I+jI=1msq;YB z)T)V~{ES|S`>85TFtw%x9%!h8kXJHL$Di}KFyS=~U*bA?(@^6m$2mO$syluiiSOCCwyXnxfNjx+*3LM*&}-8#nR z&KTl3=rTjr?)lDgjx{Z+Fuv59U%sSO4&i10p!vlDeK(yDC!PsXQ0`$iH@~_=)z>T!YHYvXnF{l*8MuPwFZK0vmE`g6yhgStx~f*?CNf=YYiIPQ=hx4| zE8Pq?3ik*;E?``4r|T(vg`g>rWiJEsd4T22qweJ2PO;)M4a~mQE`-)MODvE~&r%&- zLCUpDoD{W#08DR#-=-5C+GQ2S*Yjp?XlinyCz;#>+!L<&aV4zV13CmSw0^4llIqps zrQ3AB+~x!NYjb1V$mn3M$KRNKijH-q(9L}5k{YG5IV-)O`{swg3zNcpDTJBxdGKC< zHe)aLjw+|9kPJ!^KoArI!V5fpd|UYPlbI@DXKAr!igBznDrCK(0@O$YkVavi&fLI2 zO?%*aeTqcTssZw^!fF59T}JTaur<7~>r|FL>i(js5l6p}lrqET&L!_53cIE{{uLq?E=+zfC%e1dc=>+)?QQm1Mo0LMkm=4ClB7)mIzOI8_Wk`_@#G>j^0xl!n<1ty|hZRfA?SPETPrKtH z(BJq)zfJB1<9JjZB2`n=u(G4HEuN5ruOF?~``9+NGKL$t$0{hQ;zR6ox_~YtD~)Zd z^?10~&Fbs_XK!arLhXHSaE4WgOz4sJ?7ELbMnmG3p)4YEPQYIioD6ZK46<~N5lp+B zRT|eqJe?(vC9e~f-j_G!BOsXq1=?>qo^eW=U?e86y*hGcX^i#C$ft}D+R8pqFct%6 zbgQqE3cM&iJt!7N?T&F>-PJN6ihFUedNHs1?cMit*26bxdcncHw%QKHQPtVstED>D z%gri~{StHc3N8^sT>Hz){XUanx?WpFC!5){>?lAf)(4@XmwVRaFkR7nE8*H})I~|S zyPL{20d(iM7>`Z}SoZ|AZt~0T;z_l9Mv9U;zM&_930*`aLUC@$`Y0pv_Gl*%hjQ`p zA|%5|Uvu3Uq!Pwws`x?%Sa7^OFWA=?YuA@8SXJ9)6K2{Gkx8qct}BSNhna6`6Hor! zGjyC+@5%VRr}J62W9|}dLZTBO5_aJQ<@3Eg#*$Z!tR2txxa{bol|(FAx#P1$Oob-o z?XfBtXTSY%M%n_Hyt3GcY`;PFRH#B8t3?lh_#rl*lzurHp{R&ts~1A?LCyii1_HIx z4b4UwBA9)LJ?b}EoJrXE%Eu{wO5~1C>&F^ugY%mzxz{s{nDt*va{UZl4ia0I#>pEC zw6nqkt!y+>Y~=ke2se)IMclf!eZ|64<*m_YhmPz0JJK57_rQg64PtWr5>(+tf)mEp z{7ZS}TD$vrEO-+362#jIqN1kODJ)4~h*@z@czL84&9}Jp&e5CORGEkHXFbP8s+qmZ zmx|gGmsS7L@%jC8P-jc*2Fn#~PXx&_z;d&Ha~jFmCq#e-LS1zd!Eg_9Vi!w`dud+Ok66ro*qLWaC1 z9N>jn2eG%`v74E7@O@Un+mJh=)7*SxQ;%KUA-&CGJ-LVQ>D!>hVYxZFp}IX`cP#_j z(vnRP{DKL8w;SnBvvHN4(yaI4kuR-Ws!vAi2antRHoX zn4-TI&dK{r-;uy?dvBBthy^-s+mA%+Y1^)%>mjJF?R$$a|tuDlwK%u1~H?(aXGo#g5(N$>(;}o?W2Q?j9|6Fvm*}pAc+Q z0=og%4}G-98tNK1P2__d+`N7#sFp`K-Gkr#5}$&=d1AO5{lhkb$sxMcp(zP0dZH?S z!do6S&|#gcyP%}Pb7MZT>C0P2^!S&!2nRF6^o!VBn?_HS3%5k7^CYwF0BTy zu&;@x85QCk&77Q9yq%)Mhgf;cj7mO5o2)`PAW{p}Q|$X8Clw)r_G>6kAG|M^ooP=; zqf^>vwahb!&8UR>A)!^dOO7hUwv{)*hN{wTxfCBEm&EV-B5omj_9Bqy!WY_EVp7B% zn2_>oH(#`cmu!VZs887xABXW0noe)g*NL#dzXbnwfjfR7Jb%T~-1s{J`KPVB&(wc2feug`a9#M!Y zX#0(Jtr)gJVc>a`m7BjlpnlZ-ld~Tj5WKySBaRk#rfhJ935k&E`aOd@uMVez*WaxDru==ph`B(F2{|pv+0FI;8oY>=;I0=Z^$pSdjPt-wmecD+^oKjj&11ks$!^$= zudN#;e)HH9P3QGlY;=2gYVu3+RX$P8v?vyK_43_m4Iw}h=rf>Fq?x^T3a-4ZE3>Y3i+Yk8pMaUE@=W(z< zPODEu_nxVU{x6hU`8TW%l^6_SWkl%W7-^qGzb+s-r-4Ak-0gZsxKb;Y%AX|T^_cFu zlIqk(Z?6bnv}tv9s+z09z93g2O9`R9;eO%AO<3xg7}!*XUH#}=+7?kA@GL|F4S>l^ zFkQGyIhw0}44GKT45vov63K(bB_5;-n+{5pv(b1+!E-3vW6=re4QW4S5=lefz`aWR zEZO&zXLT!zmKwo&2+(S83F3+Bv(Sbg;cf)~x!-Bu z6v3B&EAw@?$s#{>?)$v}8m)0+Z()veq;sJ^`m*Wg1{~!bsFQQZZq$^fQqF!qkV9WN zN1&jRL9{38z0X+u8~JJ(rawWqUMtl#wWz!1`DeOvJf*fVEwZnb9QCFC1!F?y8mH@{ zT%Aue>8ZXT-P1cm&#;jBmzv2Ox9)v)(0!HaXHo5rCRyGM=A;69l5b7Ooy6*&snXsd9TF58AF6NwH@_ zG$jl41D9hhr1{fxGqM(2zV3sW?DLMA7a6Q{b&5`#+_BY08$F1+LLi}|%D_xvTO({3 zb>ITMoBM`w$=b#{y&7lt%>+w-)sO`x+;pTJy$T5l>=9zs^HO7kpc_rEJd^J)|4aQOvHmci zNl&KiM`d+eTQc94%V_qjP<3uEXs$Jk!0>Kdy|Liy6IV8*8wZi2v!4gZtNulHF@aZt zMGObpA5CDS#~+lWn+EC`z+`_}pG=>8fbS8pes9*n&bay1(v7hdGg#+c4KkDO zQ;;S|^qB9{;jNAQ3E!wu*`lZ9oC!IcgvEZyvqMjW=8a5&x z^rTh(y8cr%Gy+e}_no}KV{7j}FT5=LPtjjI$G5MJx^1Jk5{o-lRpM>ej?VVr)-gBh za(|3SWh_f1W;XQ)@x}c*e$kW_9D-k0eO!jURF+d1RB5T8R$DvSt=VzJk)+3ONW=i@ z9|U%|P|hBvPboPhfd|d$KL7iVAQyGt zV9zGE!i{oSH9Hq=ZjXxQj_j_k(5}o`t(G)YHbcGh?r^1>+_>zz{M6r_cl#`Cyezrv zFyf!SEfo0-C}pVtM-{~aqcym;v01g@H@Kv0L6U={;Q(AF&e+$s<@Jsjeojx6mKZIs zDlt_1o&bsG&0b3>kPH$Yt*DNU@Y4-e`EqeNcxfa}E!fbZS7eC4$_FXp=-1ulu!PHy z3EMl^KZFgKzn)!BPus3fK;N(6Iup&a>$?fHM#-8ILQ3vp%vrW8k)y`AYl$q=8&_JV z`-XUYh8KoZOXHY}a{_?31(WgbxtmNu==sNfP7s3vtW0&EE{dfxuU@Jy|Kh9KYLn2Ijrc>8G5RiLW zX0sEZ4-C+@2Tlwc^r^@JKaX|9OysB13h#_;A<#Ox6d^IETlgSFllxqSg+(tq@8wyP z-!J-5Zg@4ZSj#}!V(SF6z`ac4qY5)V#$I1rE-W^ohEw?V?~oULxaGOVeULtj-LFE= zW|t7?m}_-E3?;8v;GbKZb5;&7QDwK0%oDxo+Z}D;^So)Jxd<1&3MquHRtAA4#d?^U zeU?-$bMA)jE6~~^k5S8F+4*JL%W`q_dsHULyx7C3Rm0=QXAfj?=Z%CgU_OFWadMT=0a8o zuzths!@?@Wnb0`?n)>Hz1Ix{jq&w1MD)Uyj7R#D#>A|w5&<3x0aB~YnVIK}~5Qtb= zlaKxb-DJm2!OMA}=6a<5QDP> zCPxv}GxB39Kx)ys{O;G^`eU~9w{=Leo!*}}^dl}Nbw|JF&i%N%cY$Q}|beDO!a zYq{x9*6kw_a?y>&rV*wCRrJo&FfcY2p?lA)+36TF62zD5+?~>znd+m{lK$Nqzp?z( z%tpLaNuE)xXu=S;Nz9wm30dNiPD}8_0!ANV`JC&Vm6w#PM1i=Ld`HWB z+e59WU4aJMf6uknn|S%puCy;sGUWOcmCz8i({Q5uzO3w9J-JbGXMIkaM{?zWwue@A zh|9-WK(eEG#n_nMS-;AtreCdw835mcx3mZA=%yfNs38fGsK*M8C%U}9!<-<1yY04Kz89p)UW>+)OR6GEqED)IKvPjor8b!8-0f2^n*^}|A044sXpjAE9EB!PdOlOd#BazzDj$U%gI8Kq>eJayy}G~Oy zxQPh6nW2I8ODhh5stbmvSmVD>ZAVB`9)G+qT!rBGwV!Xdk2DOVJ;57+&%zv5zwDhV zbq;Rx<<1b`tg5h<0;CQ$Hdjx|{ri_O-v*?KQsQF;8!4YkS^Gsr)rxOz7%2(0%-L#q z^6KwRRs}ZU%S8$Y0c*;%94)G~;^p@vk~rd#zb}2Lo+gF?~&=eyd`AvYGcU zDW|#TxIgH?*dBN1d)AVJt9~tQ>yyCDep7Ru`2{jvhpdk-`M~xV4a%8oC?Ds%r16(- zzgu-n#p+OnzZ`a$U;obT*-*P**Wx~W7L4gs6id)5-<~V5!ld+B4<9*`H%FBP!-sR7diG(`+iaGhn!ORvZ5U3f4R5fo$X;_l*@Zx&g>-+?Iz?9;&ChpX!>UV z;7NrfuW_mg+ufU9?`VC*oKQz1zc-(WKR!@6Q0E_Q5N`>_KKc?X^ZLRS%}LI;r$*Y8g!+WvZ-q z=la@L7k#8`OL()YWen2AK*hT1WZyu3U<==J-43N4=mwwirNO-s0#qmOMdn&RugKk* z*jxG$zWZEXct)wo?u?@SYjXvQ8)d)x_R$+Q4>Yj*<^@{enDVrW$|a}o9}X}}s0D_V z25BggV=9%~Bc)hTB*Q%m>XP|hpfN+B*5VbRhL3d&;a&AQq4MbuA;a0SD%b1P#_9^Z zwPB_8_gWa`U@!1eJduZ5l%+Iy_zIYI-pC)IC!cO`Bt`LLl$6O_cqKAM{W)5zse7Y` z`%UW`i`k&kJz6@?oqx~$UM$zN|L-{^iP4jf^tno6%pZ3#i6t@&5vV(RY7Qs~CfBQy z8^z;sse;y`f_H=HO7IOsIFd7)+bt?tvJ*(s+6K;-_nc}$!Z2?}LV)wF!X9{?7lN0- z6`*jSfV=g8eCk|9Zcz2UC?3pN{Bm^+e=v2kO`4R4W9kS`!aG71YKxY90ub}35K!>p z&yc@k-%PuGtK0(Ym_je7axiB*Hm$BOb5@NN63@FI2AWx^6XIE3T)-|CC2!32D=p=( zuk|2Aw(#vY=#Odl+}95UeFegc#p`xsh0+EJP7tA8ILu1cNqpR`UisRi6P(sRo0dfl^Yi$H^o8me{|vfK{fZiveeG4~+z3!B3TJFI z1DjN%Ciwgkb-XKURRW?Aro=|$vLv%NzMZ2Hr<-zqoA(-9K{Tj#_-2(m3F>9?#~b}J z_C;dXjQpbIAYV*&Wejv#0W;sDqJwKMP??miPrACkUs|LRMroO>_!-OWX!EOx!VSk@ z$K5yL(KB-cftP8ghs>+|G~SjM+zuu8T6A;B}{Q4%!Ww+K1)=0YAri zx7)GkqTg)`E@6!VY_9|;e9OOR5IXB`BZpa?%ryC7Z5A7zE?!bKj@*m&H~hPCOtAcT zmE_AGii+#zd*Ny4sP1FX^!^=%hi&TB7K>$8^`6RJHeXz|E3%v=wK`GJHwSfvu1OK> zDaaikFsDg_UZP&X-2jcJ;XW6D>#tpu{hIW3EdbM5Q ze@EmJ7wt<|rsKm;D!1i~RTu!84fE2Z-%&NwP~lgHrAwo zkvOhH^Mw|hya}y#XAy#C!HyCaQ{E?~W4sp@7PqXq|dAgUvJcY#t_}m*gKCE5aq>b3#8b^eT-5UO(_gvqJ=#F2A^)V|Jmrx?iG* z;|*Zc%oXlokC+uv! zYskj*A11p?7IfqqTUPRJjE3*?AC&@G0X>?>_Ik=R4iXUK`Wx}ChWfOgE)?C#hgt@n zInd(DH@xx7{8(+<*Lg?&UQvFH}>} z@?ii%5{+Xh4aIsKqX(zg&BV#$ee%_OQi)`eL?}V^@$Y?`tGHzQ;)fe8)*_Y5I9P{OW-TykI^YXqQv}cBK4)u3#+<`Mms% zXn4UNq1k_tza?cUH0b9_`zix+vVeB885e;!-L6o8!2YE^=eiqhxD}iA4jAQ9-sC-H zQO&rV5hTQpr}2*!Cdf^WH|!M?C9awVn=r6$?v~3F>4*F~1$sK&M@0*<)GMp>fN`_NkwOCVpqE^Agz3`mQ*+>N_1iUkC4EXPS1%;}<3x4dqqJ z2St_bY%TTwE7)twNxj_FFL3-oqmL*@keld#>Nnfx_TuL)$0RWh%TT|sXftE$or!AG z0iCwi=o*sE#@4}zHbEDkcGm{d0x9&~!X236};ccren zF0#D!eT~*0coJk9UGKG#k5@{cq+0@`kZDha>)M|H8}fLKop}yAY{rE@p^7MeWlDb6 ztQo0MTrJyCMucfx>G>?BSq5!#VhKNFEZ3-wFcIg_y1 z^)b%4JH+~nhvX3oXeKXwn+hHEBbX0z2$&$}b?8sWq`a5-tFZ zd~G%0=0?-(1zl6w11pMRH27{F<-VQ47(3Ia>s9h3;bbRKHOS1;Y(nYv7`8r+(KS$2}U>6}}=1)D|dv^0F_ z?{sx?bszb65vStl{<#-)jikjDgUOTYgJEGhRlo02ZU4B@tr`6RS!k?8Kt$T)o*ABG zFn-$3&fz*1Ayf71JN$!FDDB~Ti)OnVT3P|6#LHrv#Ua4(K8j}yYjAA6W0ol3-=Tl@ ztk7tgaft>dubI&95!T}2Y{zLPPIn-eU=rtC76>rO)=C!Jz-&u~~Efhx^a= z|EDbeIRsF)n8txh!mcsYS7PA#TYmy&cMWD-OqNng+Wla$49(NC@^})&UbuoGF*>6ks1> zpgKc>;|4b^PxhJZDd zpJrdmk2orZM%_zj_t^T*r}i4;C+OZahS;N|;k`w^L=m6F4vWm$+m?9(d6EU`9%jLr zD#kAi#{j>(7sZbHlu-`%Z=pO~HG1kW7TTrP>YWfiH6@xnBn^%G|V~EuYXZ*X;qCI(mG_2n1Y9_`n-T3)|B3 zn-F99i!5K(<_WFY90`LSuhS1E)Bl;i74bo|%?jxB)SDYE{dVQa@7?Dddx2pR zqZ?TC&lddQZ!6yQrngi5mVRbi#X+CXy@>QmHg227JhMOg;^!BnG<3b-r%E&<$U&o6 zHf5=7%5EwY2HVd>|p$H50zKAc@)#D$$YFli)@52(Nob#d; zs_kNo^?l+vL^%~1UPmR+?arit%oNs-E6ea+F(OCOssP!PiX<$}6WgLq#uE!_EO!cQ zXhuZOy!AqwM`#IaZcO8cx}hCm9a!`u2&6&*FsQ|{Jjjp-e%zj`NyRKT3Kj{1e zU!=eSS&D?bTIjw`sC$RJYK;`2!FG9cpt=FVL&Xo@8^ySOuzqiuW`~jc_Cyn>D%l3&tbU*h!D`#$fi z8qr-pV2#VgA-~}2H#TR1ek3#+uw5O1KA4GdL0;;{5EsTc&JRK;N;WDiuTeK;+wMNE zsP+Cn6qFjaW6^KfZxALWW2EH8H#~f^wC3M)B4GE-BuJAI{xAW=1M{ec_LpoAe&O`;;l81ST;)Uo`BCioo=sZ>gLBFWy5x`rI zWd(dE?Az?n6ooOgW{->O_@KtbAA)vInvK-D9Haevi6%x_-``svbbU>znjDrr>aarZ zeb^5hs+PJ$FYOXsi>|(7&&>S-jn*QLT|N~E>I|kk*U^;+C)SIWgavNoNUvAYUcSWi zVNsG(P~TduP9E7x*(d1Bh9&eWh~bVaug)C(MmdwS3?Zhu2XWg;FBC2{qdE9jq7KF$ z#ZdpQ+6rGk_eHeMa${7x1&B(Fjh<=Ahv%0JZrDHG_)G5{;7zhH8C-tooYPiTo=TE! zHHu!+TI?|0_djl1hhvu=?SR%Fn&jnA@00|#59ua>XG%T)2;M;?pTS*3KwrgG2W%$y z#ioAVbwM;$^(b1(W&X??vV%!%dxq^dxk?qBM!(sNdOp>jF@Df?YWH$#;6>)-86HZQ zxk+d!z}>bU$&G>ypJ^%pvtf@_X@~4JKp}ilwhlIyovYyP=sW`t08(D~2#5Ggn#AGX z?`P3_$CzY5%5n^0TWIdC)R!!SDZMu*A1uyU%mhd%tJMp3T^pDs?h{SIySnUW#BSXD z*kfI^y=kKzuw`sHr9U=fDq8ciF}z_yZu@=91nCttGgZrK`z1bmc!#LmY2E{+FSZZA z$Q4Uu&X4#|OdaPR3rmN5G_?RC(JL*ia_ztNwdqChi0#5@(u1GIQ$S6Id!sdUO`2W# z_r=3BMO_ENT@QJ6gu#@N5^9@o(j0c`TK>`GBBHi}XTo}Al-tU_>t}mQq1w~7;L~F= zE!VQzS2r6m8R#G4F8%77L-8A3!F^qL$=Hyo_^#phYu?C{;d}nZ)&a9!jlrYdGT$c zgn048Us(aRd705ht0#7|L$mpwCdaQvb=AjV?(Ye+=M@IYgDKk0f%57BQa!VncZAzK z6#mZJ_N~$K`ZtF z{Ao*1_r)EY#GIN!h!y1$rgBG5rlYZA+N+boj%Y3nep6fOj&g8X9CY{c<9?yFw%E$RNOiJ((>cDt5j)QM3y#=$0-Jlv1Y2$MXd5SwZpmO zKM`)Xsk0p4Zu;&4Etqe&%&FH(Hxots5S4jQvbnNn^)G-J@7tN08+LTg1Kn2`1mC|1!HMcn>J_G7|ev-2>HZ>jnA#i)07C%#ZuU zr?It5E-Q^^O53w_(^@8dsq+p4)~zim(ERj+mYg4K$w^|`#``UjJ2ILaK?Xrxn};a*LvwW`);5m*h(1JPm!@wA(e8 zg%50c`n&IL&GxK_=lfvOlsNwI+Yl2ayhYzxgl$M#v7Y_Wz{%>aDH2;~`y+Fa*?B5W z!w?P=LnxY@1HY0&@`=#oL>~`r@rF)e*mJ)j+BWgy(bt4okjT#P@8p{`=90Ww_N6|y zLZc?fg?3X`b`xQyqNKq5%I%2u=V$j88mN;_4!7IJRvMZwg=DC%c7EHN+M7DVg0sn5 zZGQ#Pbi?F+tW(~?T<#o>CZk!tb}XL6b-$xinIrk5#7qFt?a`nMORp&Pa$Jj@m|INO zEv;MG?&edVb9iE=tMAq&UeEb7wt5?T;LazZJKz-U`}Sc;0gA($`UA&6dvtbBDuHfO zzR=va?Me+F1&#C2_>+6bsHdZBu0{z&fdeIUwN67;$KvTBXcoRSNRY~4YR3*kZs7P~ z>XV^}zyZBKAnad|+l!+cxMJ?z4>Xj)%%NWYM^_W}+>(msa8*GWjAZIO&Miy-2T%U! zrk>z2UbQg0!V1`W;GULTg8wa_e5V=&(e=Ab;wo zuhpr=nuss;Gy#x(@7Kh~24Yusi9R*@I@fb;1kIH5#nM}t=V98kcwl~B0DXe9box9c z3>l_1t3sdWwuk?gq-jki+^3`s< zLWCokSzNZ07d0JkIDNb?D){d3@c5T_)0=>wtS0Z&Xsm**^03x}S+R{i-d~6)`&3G$ z{uhkb%`Z))s(@Lu6@ji?3^sEDmxq%e^QFd$dlcDx(i)ipC1f zQwOb)CO{E@gsWl(Z`Vy?l{nB?)Mgx?wN=FA05%Flp_e&Z$_3*O6M7YU0VYq&CAZH! zV}Dh1(Cys?!9V%%Y>QeQu1*S*TMz-J3R{vC+; zr&pTvnB5rvJ_c}%uQCUmB?fqwT^limy`8)^+QxIH$mB$1j7@Wg;o)9hUe-9zbo1H}T!!5JkKcUg`7_sI+6a&Zy>#VS1R^2`&4A0V8ng-Xn@!Z7Nc62Q zw|r7;Y*8s;{9$`-VJLLUqUe3Z=WicK5q>VEV<&reKeVKPea*S(LamQ6pE48Iu%&Uf zd>0J;KDD9P7g`U%6g)0Vo7zYB;yr&pJj&wHkeI??tR_(4s&)nv)=* zhSJNy8Fwlehn%#*9+i}{|Llwc(In=Qo4OI*H|VMW zG|veQ9y=YR8qqij;|Vyyw&|MOZ%wq9)wHt#+%28{Mq^d#KB#ZNUvKPrqr>3GNA8?o zq{EBG%n&m7ReXrMLp51|ojeF-ri;tUEj$dwHo?X#M7+|;X9Em7Xu#xl@poDW zaaZYzAsIsg^_rUWF@Yw!`P1VQ@!mG z4daze`1qG}&-mg5#?17tXxG2zqMg(ZzO_X(nBH-aVfwwKMD)QTk|74yu6(BOlSq0O zD4L0ly0b}2?3N|xuT*WR?|9DWwSbq2+ivw*op*+Po-S1;^;I=dgz|!_^P?$zeXe(D zP5@f0xztQN)wGE z5w&zl+RLZEyN3sCkZ~WMe->T{nB}wBDeLUiZByp(0E-|`#kC>Sp zIg~FRe4s%nGBt9YEoUQL-kJy@r3lmEY5F^52{Gw(;n7wCvo8;;&akJOd@JwejxOq0eg*X4kuOK;WwAPkclHA38 zLF?@yq~Q?O*rte7QRp*T?eF7$_V2lE))Yb@yRO%%ZmmppYIz?_;a!j&?m77HP;Mq%>P;nO5z@VT{%B4e>GgnN0nIW=IN*13aA;sA z@wusS)6$DTZp@8|^gR`G9B&2y_Tk>^j49RoM?Ev6AiEo;y~EUhea!ruq4Kwx8K7 zJvbjV0bk_obCV73e~MCnb*5~Q9#iwI1mo)DprAB6NF6YBh>9eesZ&B*qcxT4J4zNhkFDsS&QlL@07Zb`;hqtXO_o{8GKAs7%eAu9F#lxSn z9;QL+m3ovGNYr<@X&`I?oD`KwMRwEWx|~dW)Xt(=(Xo97lUUZu=U7udn^GocF=TJ< zMB^)Nct2lbE>qU|?jSd1C_|%Jj4h|!#_8luRLjt}$Yl2y@u(NBcQp$j9IFdC zMvc)|2CNAWzOOA9QdMd0XP|l7K_3B!Aql%GiR_#Ppgy*wg~_pQHY6Lw9kHtn^oQidjHCM1$R0o^6=zC6>5oje`f zt3DFMshD{_%j?Q7ujU zvFhLk$O{r3+-?tZ??-7pcaiCri{8KYAfFg}>>pa3J?Df4{j5&bBB=oS6lad~`L(^% zo25Xc8>KNmWKZ!@j`w6=&?Pa2&(a$_-v_KJ9dlH53(|du*-(2vb~!5&W;fE^PsH0% z{oo`B+1fm{y`mbNT%#vK*Jl(d>UwZ1=R|i!^nqDJO`_%ax%V}BablA&J3XMpu%REE zykRH!#{YhhgmHzFvD~|9)GLebqoJDOQ%qQooC7#I+M#re-18!kkHG;|y&R8vM}(Fp z!fcSQ$AUKzLLC|;p@CX4E`BA#>`?uJ+HLb|Bt9L7BB96}q>K6Yahhaa-f6_14cT!g zAOL3MMa1wee>M>Cq8K9RhBf_i!I6GW)v<<8e%sOxfc3BOJA|gCgUL7b!TsRv#-naz zg|ZtRPTIN6A0A@UZ9a@m(o*M7ZpGA)5@B7Li3!N$);xAJu-x)F|$K zbJg=c@c))L_u5eImQdW?d*AGCg!}A!MN{eB;8tc-&s-iKUn0I|5ehS9A;$njrL6w< zsfqsQb5+aC0J?-!|F{TU9GGG}VAselLG8!$lsiCqXao7{MYWTw)v?@Sq&=xjN%TGo|C&qB+k z&9j0cJq6P$<$|#z1lcE9`Rzo~RqP03d=~t2tUfz_I!tE$grA}aMg;w8X1z5=^R;L7cxyx=SgG`p$n!e&OpF#hd(YgUtuZJNj5Eab$0d(WaX?GY)uY%_2TgR@NrG= zMri%GJSr3Ku7XWT-yyok5g+RYf2-&D19{msgX`-33Kfg+OtoF(>7{pPey++)SmHV8 z+@R9mAQrgy;pLun^R!id5h?OUMWYvHVX30La$D0j3Y%`HG2!9_+2#wks}F4I>TE2z z14YR2)5C7uV^66NCQ8} zZxDHmt-Z5|1_H(_8d^1maMrlPk)xvA|Hk^>3BWfO<#(SglL?_;5 zkfr*A#lwTN>#NK$QIwulQcNVt%rO+TFUGq%+hF9sWZSiN2$V``vf)abC&yBqbhgw3w^E zUeRsTZ27yW>go2>W;imVuPGPvMRKJ%N~YE$7LE4zftPn1JpT6_mx{Yb+^pB!IG5&jn*C@2Kk-a_`GA?Ye{4Y8ObVYdv9?hGm!q&4E*7`lOHdn4uQx_ z?o^E-GJ@b9{yKdoWF(57puYQy$ zhQ!6670V?P#^|N!SV#~ZX<2)j^Edf3dB}PFsLLDZdR`*WX}k zSiss{B+|NQMoT~1I6GZT#_*_{Fpdbrq?Fd5(78$p%(n7ki3$d$^Xhu_^AV4K&n3k7 zfv*I>9t26E04wN#R#@aw!a4u?F{1mTRsI3yq5+QIrf;VIY4uDG(N>Tr<^9ie`ATbQn9EX*jIrK{ zJ*ZG9Go|~R)Oz5VAaJ-(+x2t*HupdH=~$roqert-9Yu4ZW&YU-se=fz@9() zpCstBoNaV1{o(Zc98u%Zje*6tac*Ku7w7XIsm4E9=AM~-g)EKn>jZ&3wq9sBeHV7AI+p| zi*G5-vmBWdUIV8%xVU>h-mp8Ky22>a)s7Td;)oY0&4Ar4f4}_j`~Vz#EwTEMHD`i+ z{j#CRqz$_F_2pGe#BIMFtw@Dk9ThlrgEexkyg4s0(xDBGEH!ox7r;zldTVAAmhhAV zslL4_VFhp`Bc8C-19<70P{zTyD)a$~JbWsSx$^Hhwcfv3&e1~|ujoqdfLfm>4WV;O zJS`dd+&-2W8OUaLTXz7&>u0wrjgw*Nerr2P-BvjGd|#nfK-yFJi@5hHP9wmcts9=? zbP{KAaMD}|v2FHd?w{VN_8$ zQhoo(3@bf`)Pvr)%G`4SS~K6!TFxY(Pri4PEkQJCRqy<$Co|m*mWTQds0?oa))>$! zDJGhvNVOz(ZnZSd6x{r&pSc-lWO=oDTvj3aW+f{BFU8`vuER%Cpe{7VpJ%pU`0Q|C zWNY`|bNb+Nfe~qUSJvHz^2}VF5R}Z*V0lS7StLuC7l#)MmTXZeFPM#e)N3PCd7tae z@nt%f6E%=Fc%}utOl;1ll$(+(iisQobkjD9M=4z_DiK$yFw@lTf<}*yZmg6^G-+75 z_RBBo74Ue~CppE32q|eL-X00!4&sr~Q4F|^8v2!s-3&Bc*_-t5dXA0;y^E2D*{+-O zK=b33i_WKw)jN3J>s1SOHl)@H)L!HEd%*9Am9>_h3#g%7f3IaV2p~g=uPRwwhit@* z#vpz$_j=|uEr@tmDd2ElZK`Rdd-W`~+TEuGXjZ&)^XB;D3~Uddk3KaAvV6#hmHHuR z^y;)EB8#Ln{PQtMt{>tT;{-}Z#})>|`}SgQ#`dhTlHmh^>D>(v3vdXZkHbLV#+Qha zKU&+BWLqgwFh7cC+InKg(X+HM|KBIVgzZc-Ld4xRBVD~WkIH2Z-BCJfLE-)}?%ZX$ z*^IUN_)35D$X;PH&JH{U`j8Y;LgxDoy2N(vsS_&)ccVpDf_}9GmUYE+B#-NrzM*E$a6y8a=E5Q2E^{VxmTJUZ4 zbt%t+l{=U>%%@L-cy7Nf(vwXKs!qZfavGb2St1@y$2;vHxv6L4pVw$&o{9ed(67;k z-STbo`D`Igd}(TtiC8>WUCV?Th;5tN!geb{j(rL_wfGqxq3iwZCIy6gS)wZ|+Xfc<^ z@oL*-_LGlgzs%Z=l)A&S>E~P)O>ItoEs=b(hr)qCa7gHmMZzM=ij-oJGg&q<&EAx3RuywlU5KVj6s zpRFO_tn#`7r=Z>#+chSau$6On#++qcT_%3Ey?9DJ{o|ychJSf;Id6U->fdt}j=n87 zMn*3LBS%~___z#!dzb;{?hYnc#ziyW1du!hoGO6x;B&55pdEyh%QQI>B$@7>GG6|c zQps3621mSOKek|jdw(DBGC($hH-#<9S$chPVTPOySz zuO|icy998uwp&a`Z5_nfX=5O<#$YKir z>FbWd)e+&kH^o@|Fh>kdAT$tDs@}ef%QHL;JVv4oWyyDx#wyJ~jubdQ!PGJJ#tABq zoS!_sr3pR&d{JiUjN%Q!F)mY$a?nag_b-u9&>2rBfd8N%SLWj2?=Cz2dGXx;nX!*KN@bmXvS`Xtfl)Yu2!>bA^*XJrZ0lP>%8@~=6A7K7L=18KShb?Mk68W*+ z>@Luk>h3kpt~(EmzV6rT>8e)lXnO7(8ST%AH64jiI&;q<`SwNHKdkah!BojWZPnT< z*gbb*N3m7kiOyEM?wx2tboWJQ#ZphnACp))L^PzK4u@-@u=g!4R=f#`%CGx#F7I3K zkoWloT@MOZ512##xjKgsE!%|L)r@)puok}gzloeO6p$U!tT#zFOroI*gaVsptdZv% z(GUR*_H)6DhJ)jAihrF?{^1)6A6n|pOxu0+ ztjA768~fOgdelCq{}v7rq*(#}iEFT@Xd2k5X)d(2$^3@BNtn0fJ@$Rv8?|gFQy%=2 zQSL87Uq4$uyf7#qppudP3G}YJu?vC4(0Tl*eK?*~tAQ6{NoFCVW%_V#E}jb)kTB{<0@Lkd}|2cHhtZO?r*#$99yMV^i?ShL{?C z+|uk)^s5lg8qA11^GDGcPVn`I>fcK7zfqUWf1Nf1PUctM=QjZSr@^ZSjsWxHxapyk z+|^E9A99@2RhZ_rY@)P$sLA18u?PJDQnJNuwsADLSqGmPo-}l59-SEC51qSx0ijdr zwrf#to1h&j2PvR*Vx4P&K0lYKBkaN%=mKqPfPVgyvln6ZenZ6TAiVPJQ7^>s#;cLr zYc8J*K2tLN0uGCe1+CSS9i%|E=I)l}}-RJh>e20|B1U zUyxcb3-@EagN|nM#=m5YNTzLGb`5V;~$1-e@Y+`p3S_#3nQZk^TBpQlAnwTW!mc!_Ts+ z%V!+Lytow>x?c_c+P%QAu7frNnLiq|}pqPg~;phpx2sJ}P4|R8CiMp;1cJfG zuK2U1>}*t|gE;(N>3ToA7G5`#;RoQu-ygdcJL zHp^(9V#cDo$)W=1^p*fuKiGDS#>sx}zpq0*C%|?k3FD$&rDzgc`b&Q^MPpK9mDZeB zX>ZgsIUju74*&g!ecN2^zM7n}--W!qIRWf+iz#&pVL&*SaV5b0C5xu%a~I#^N}wfd zSl>|tQ8+o5hjH>LYg}3U%t*_mhmbHgpoZ~Uaw$?dorN#!j_ZCsuH%Q#D8DVOUia~6 zlJivW!alM^n_M*DwyQ%XqNGMGkuuX+Ik6x9`|{HH@4x!Ly$R4Oa0BF3sNncgJ{4$w z@)xtMYn{=%1r^vFJ2+kN-$xU^>d8887aT_@Iw_l=eH;60e69|bBKy@Q&pj#lNvW*4 z^!rhou|`AG*@UHOq{P8+G}y`TY-OXFwmwoP;DNfV(2Kknv1i<#%>1LT><%E_CiJ`bwB za9KdX+jgwCW#4#y7NX5x(BvVp_H;oL+kwk~)Ca*cbb|&~g~{+F?WrO74DKovvR6q^ zIeDOr`N_ufyyN^&x)t6UWw+BRukU!9dJ_i5Zc^VSJ63IFPQ(AR?%Fa3&EGPGnM3dk zv3&GU+MBb7P@6D&rYOuZ=@i5Xq@pCQrUa<_-ygJ@`8ILf$PIVTww?}MGAYbf2joi= zP2ome zPjP)O%F#eKXr@8RjC4O=Y%V3Ru5tRF<`!4%J#X3+(t&sMam_akytUtZ=JLEb57^%^L(H0^ZT8%_xb(hvF4e@ zTI+q^^}e6?^M2m2sLM|zH=?Zpa*h>T@xvXR4RvBe&*Y23YZcV^4t+oTCf%*oPcIc0 z`yDT74GBJ(Gi5gUh1h?xy~t;v19R~rcAMJHcAQmoff~V7+kR{C{_^@;cY{4VHop4V z4#PrpJUSk*pK8@ZF*}|ZNUeLA8M7wh7QQ7UVGK7f4&U+Df1`sivarF+Nk;gvTQ}sx}?&? z3t?&3F$}dbgBA>Pu?!rpP6d3$!6P!f|(`A02c9Sd;px6-BNyb8uB+sHiP{A zk^MtV3L%=-S7Eoll>@6=zOE4cJV(13s5rO-uN~v+mAdyq+7($>g^I~)%GYmLaL7&R z?T-n-59gQqZVA>Gcdcx=pJOne+RO((KviKI=1;QqGvxe2=1B=#>N01KZ{{Fh7qpWC z)A)0!lV1BOBbrKkUYUHWscJ}ZESwCz?~@T8nq6?uiK{g<&9B(3M}2cFtIvQfXYqGIUq`gHa@l2cTQ154`pd0)P$KRl+< zj_|M=O&%^D5v#c=g2ep-j}!O()?~yKw`n-51s5v5v+s9n2`d|C)!-?#b+6Y9?RlGg ztj(A!hc61x*b09?&QNZ>Jo83j_nxNK3z#;(4G#{yLNb zHT4y%^&_W9Lc8OFQinttnM)Q2=kWP0P z)%pngb;0v)?W@K~L;Z`jSUnScnR`Q$Ux-^O0aT&bv|GGO=*_zQepF(tCNUMIGoEEO zUZ*<_r$o83zxmiVDJ?st2jn z)jS_)oIGK!Ph3B)Ruf76_*f^}4T&a5mErB=MlD!oD9$ld&@S$v1FTaD%2^XauV4Ed z7EKCp3W2W1tL@8Clm=p8hWyl&Ox@ClK@}JaE7eB5mdW5Y_ipOYlyf)AwX*W2A==ZO z9y^G`mU9fVR+al$7R!Y5C^EoA6G~Q0D!_m8RsZEFQ&8Wb&`)aKSB9?@oAOJ{)+e?z zyYTfbR>X{QeEfjVzUVN`FD3rQr(&lK6|Fv6n`J*oz~Re+h#I{JUNNZ(5mx|&h0CXR zfUx_RMFkfizOM9kOqG6zKg^zUn;v>=i}n-v_h@I>YM+M0Kk;u^P z%pBitmGnB5EqB|<3aM-~3%#*c0+s>I8^O>quL1*gO|BW4EJ1D=zCt9}N|ZWemLP9S z_%!iaG)bJWS4O-g2PEv}x-n6})-G_AR{4q|U<-pTLG~BLHVO|GEJ3DqAW&f}9wCWw zktgwzKndaxham|58X;+Mb&fh1i&Qg~ATRDnwd0eTeN~cNg+T}T6vdVrE&afN6Ej$I zRXmBWAzIIHZ^GVjfM%^f_8nIXdyyAif9vp-FvS1n%-_L?yn-aui)s6O^lQtn9%SRz2ySnaH||pU;U4L$CjtwWh+q&x1Ve7;02!t$Vj{voWLasP2=?o^vJc zC>!<0*J0x%|Hb8(R=-1No{lM6T~U;EA#Uxd(uJQ6Uo29WleyPba_nWX{Qz%!XY$Cy zYh2k4x&k zIo&ink932#C9l;hKh)-$>(`rgyhxE@4yir{pWiR|Y8GKdWN3poe|KvZ9RU%3E3YHS zJvjLuGqJYD;;da=_h+bsTB2NIe7S!zufnrzAOhyOdk$k`QhIXwDL9uf5=AnqsTyAF z&U8^pnwL7~UX(SGa_Xl(&JI0x?hf~9Kx7=?eAD~$_gXSM)>LIvlj}&(9zT6|kEgd5 zK)%7M01$r~br<$YR#i4i4$wA%sXp^}wzR1xp02|`Q3YMO&3B_v>~K*K7aNvp*L^hL z20oxAEyB%UK%b1T()XL@hD6-5*Bu-!*lR`kzq2+7>30UM4*}s$)21cJi~$}4lDLqd z8q`)-so(wg52SzppJybAHTZH)+l`F~+d)+duzI?oof8$U=opL6OKX|8sZ7{$i&Od{ z6{kH=SHHVbL9}z%6Fa$dWLk{XrIJ1SZ{IGEbv_oOv*(hNTM~BPVc(fM$3BwFKTnW; z=O#-38(;c2UtRc3@jCu?P)VQ@2tQb{5KQA!;f_g~hAx%$H@U7Nt#rRjAHao-+hXl% zo~29EoZesCy#a|CXav(N6FNJ_Gmf^Oe%3i87nvT|T&8l^E#2T&ajwVx2F{%ig7iZ+ zdUC8UgvAA2A`_I^Z}dYb;yd;}?h7+XfC}#dWQ3AK#ITK?U3k}UP33|LHRX=dzHPpz z<39D^ZuXmNT)A!Lx(&Vhn?Mx8dUd~G)xPFUj42;ncyzSNV0}HM1{fR8!3-B-nf>Kx zW;xJgB!czTr?;iqp=!hlX-gv+lSTZFkO>fL8xIWANMp zocOoe&A*7Adr07JuI9&R51LFY0U=itFVm`c9%1#SQdy}}C1Z`~o?l1Ng1{a?1e8Ib7 zw<^~>EHX! zO1-OMwT(Zw@fGEA)5R|j<4F!~+itA*x@~Lsr;tZ#QGW5RR*?0QM%u(zB*;M_qckf@t+Uv`1ajb;|>s-5^FL*Gbx2pCqC^go4Y~*8*wVuv~uVz&vDO2Z= z5B}0&{%a1bVBf->Ru&=_Q&N^7#f=HY(&gYsFw@zX#cYN;xKT>6jfqPnBdOfDv+S9v zwMa(7qt|&smm?YXG~cWCdGtNbf8fuS%(4RuVgvJIKf2sHxAsLAU!=0L*QP-CPTBCI zIy7f|sD$K+I4Epn85;@X5-2LdU~L&&vm8|7s|ov^P2Fug(S}VYN8L;9s}6DB21Jl8 zEq=MUTB)$~?4>nMM?4H37CG5vn_Kk;=s2%U-kh0yEb-8&h3*o>^vw5|{SjGqi&x09 z^%~W&I@dmJ+;;W0lf%caju~m0C-1+1Uqhg?Ys{-ZR%cXA7J_2``qH;Vmf{;?`6bBN zbCmf+;Ncak@gIr~1^ZU+^m33q|0J!caXusP&Tl+~-#REEzF^Mwvw6*8G6OtAPyK-h z3e`UpEz-CDk+=#8tNfuovMHS_PPI~8OdK*;f^^ev1WNy*w7{PKYR8G}me^n$Cx)Pl zs+Ce_{(etC5S*4ETTG-u0ho8(`6M9opPv`#C+mckiz&BB_#62I++| zSJLXTatSi-^Uzhs=Z8=QHc|T|d)eIC-2jLi9Gg`BYZLWvUsrH!rA)5^)Ac8mCdxc{ zv{H)w_J?J|A)f!p^ZZ9k_}f|jT?OkuR>p`wf3-0=ulU56RrG9W$>6@Tg=6G!tJvJA zOIumk0Kb4W8ET%M%GIhrVRMIaQKpBeo`CA^t(A z%C_b~ghQu!%rlX35w;ACWH*MbOyz4v9ql0)fwJ1iB&{NN#jufuhDkLL)W)o9ZZ8bt za+C^wu_VtOWnp(#Jv#@P%}P}Y^oWcGH4Ld}k4T^1Iv?*K%gh)m_0DVuq}D-D_l*2g zj&2Pcf6E(}zRXdkwu-^IKjdF*3T)TK>srcG!w z5`gQ?sjC7_lmlBVBdDKLbMLN-(iMJ+*Yv<~tdWTFE6j_{G<4 zTIu@Tmv`>13SZC;8aHWKe^7~DT#fyjD&?#A&vDlgWZT9J?B5$jh0zr|Ji|V*r4vIRcT&{hn-Y< zdhA9o=Y7W%R%tK4a4GGtKJd~_yrXXtzUf7VFI0r>ORj__bJxP6cwdDJEknwkbos7S{^5YFpuN;&Eeh>HEj~Fk zw*6AkC~d{(ivw4p8WZ4as-HGi5U-a8au7-2T3v>yk+0|Dp|QPk&IiHIdBV@$Ek=8e zkO6p&&HY>6@d22Smm#AoYQrExDq{9*T^9_>n>3NARNed_v}_~E1CqAp%$hhDf;Mph z-{I43EY>Nor#TvU57s`d7%Z~Ly?C);^y83*b$U%T+zk>fD_qw!r2iIl7pMY$ikW#i z1rsIE^flW0%Eq#Z<6K{Y_n30(p4?g|x{p$z(`4HP4j;S+yrx3Wq+BZ6SJWQzcqpRy zidHd9j^8VF-24FqA|+^4fk1eWl@(VYJgG%}DH4CBaBeQFQEVUvc@piJAYk$zIB?Si zfJk@atGN< z5Mimva|vP`_?L?Lk3F<(4@`=mfYc?+BRy);-dxQWArb~3+-=(iKfi3T&6vjU0JosPaL52Re9HT^*N~ znC)JX=Ed0-8`uSc(0R914=^8PLeeBkI7L!8IA+*PW1+;ge?b@ifCH;Wgfg*uu4zrB z&eskV$XX_dT?}MTrR&D-eTuO@@bhbR$92h-AzNSE4RhP8Olp?rPkjNkA&vv3OOOmR z5MKBL4oGccK!h#h%6M~h=eb1JG(3f+{D3U09O$=t{^hbm{s+i$)P!hU~9rYS@qNm@eh&+UT7$4+0hgNRaq1M-?sN8M2cYe)InS+0S zasFptI8u9|OaE00S3mN-WIi><(+DUYB9>dp&dvh{S~%q;Xi>)V`PD!TOG_sz+Wv4i z%r8%@o7AF)DYx}!GnBh0soxflFvAPRF7yLI{gS}|f304}E8&zi=1KS+=9J~|2HsR0 z(&QQ)CCHX;9V@_hdy8ynDO4J9lNUZ^imo|KTQ^>B6>#ZWm+egt33S2h5_YFdh zuxt79G6Lr(;6h?c4Ttd45!5mAS-0B6j)mZzJSbA~CSxr{0Y7o5yUP1@08>j9crr|q z$6HL#xz_b^OytM9-q9m{s%cT?uh~Us9|rZQSEu-0H1F+Z;ZBiJffs}HrAG~ZEdjyB zEH+b#AVI!#_DS!I%Q_&>rH%<9=$eUT}7k$lUn*`x<8vuT4?II zoZvfpK5K|_yIAr*NKM(%2y#}e%EpDFaRd#lKyf(`?&Siw`A^C~5*Jq!Lgd!9GPGEG)gm z2T?pAjgLww-|?+ujrfE}uO-?Z)ommW5k7yu*ziPPuV2|FrC3HPi3 z4Efwmqe>H&jT{e#R&M|)3F=oZoV~Sv=h!?kyO5bbHnC|J64plzn9X*Mnz*NP>-jE* zB4&=LDd`p#R9Erk6+J7UvSJ(!-`deSKgGIB+&l)~k#RB+wZ*y_KjG( zMJ-BSdMxrc%hD4aoJ(Xt@o}@yK+9T>r}%)}xHSN-b$(6c>(L%8-TKiy^;+m$M7^6^se=w^pEO>g|)r{JB1t9dD#;dF4+c@_c*&gKl4;XIxdhF>x(84lKG) zgs~;tPXOQ+Nl`NAgEBtklbh)Ho4cHV)Nj3=<$g8Ky7F$bzi^K}Wpsx&En{JoWKt#~ zV{3$^dqt$U;4mX=R}mtGu#tw3MI|z%0ot&M%HRq7VUu`?Mk-4^md2m-%k8Fb9KqvS zehGC^3S7af&Ty=|rg7!8(OxK0ygJpPQyd`5Yhoz%mVZM?;R8+x-7{CvIfI~G?U-@$ z^cLnL*GV6uTI;3HKD;9}Q}ruT6>2#&I_I$jsT|7e z)6x~ea|`h`ys1=ml)O*S^g;fhrdg_z*sPmxWt??}{E#!v8%L(UW>c--k5hHVu4%lW zZmy|`mwpA?&i6Jn(IA`?c`{L|HB9araEIAbz$YIRO_b<}Op?S#mxhm)jAi!S469!- zQ3W13I;^uz9@ARWJ!D;aRI7X**!^-vN?8s9_G`57Pf#lchht=2p7bsV10NHPAU0=|+w5a@mox zp$mJquzw+67@OAg)r~LAN4eBoW4#{D3cJ5^U=veW2XcC!@Du-AdG^_SZ@gL)d*1op zV!>ioK@&e))yRsu5Y&Z{Kl}Nz!?|iUm&3MHQ;npgD@QZf5!f&EcLiamR+CYy8ERwI zb<~?#!r|x0XmV{}wfbN|>UA*!jVU{kpA+OYPM)1797S>R9~>snIqq=W{8hy^rALa5 zR)?oOKv!qNV?Yrd<6EcI(#{r)S$J?RX9p+8;LymK3+UFiOr|eqoN{w1TkOAk!Bt_ z$DVIu#W5*yb;onNXBwB`t(_iQHPpn*lPTbZzIr>scHUOOPHAYkb0OQKYp+(H>-O1a z8>H8_r{0wcb%{eM(#^t5`P^lI^**Z}Wp9j(o$yUkLAD3SXUMNQ|9n~Q0+yb|C0N4G zIW_3`g(aSSNJW9*((`4Cwx)kxko&MW;`TEJ#S zO!18cpL&D4en(bAMuS76b*CeO%V!#_#y<`_XC2BBe0;@;_}CSU`sG>I2>DQsgW1@J zWe#Q8nH*1z{DiyGdsSdIe2P5a=?dQ_WV;-;w7&otb@vSnYU-*lGyc6E(^u>W+@ z8`&^2?A>HacQqe;nX{#Og$jm}4Q zfR8Tb*GG3oihNY-`>GWQ&sR&;{AQSTkDo-1hFLzXj6Td^3tG9Zm_X#boMA2YQ(a~3 z=iD4a?|WsFy3cCtPZW~bLk??mR^5Y`>IiAEdR@k1gk_xB_E3%QpK2MM+q!l@9q6@n z4OZ#BEcSh@r0t^3n}@GS7k50Sr};b0hm#ewjhfvIXNGVzoQ&!|rYi-e`TrO8tlSz<&nK{YPx~ufHk&>7x{* zsgt=2j`j=s;#GYNgM$xQ0;7m3BNL|9+RpLG zY42I*&hyC|gO$&T<7DITk2(v8C;DIE9wmoY&D3Lch>OIHq+Es+;AFBlSnmh%yQz}W!y)*JEqvobU_JOf>wFDYU{zk4rNmm}szNTdL&jkjT!~u(U8+qlF zO<}YYxU#UQb;3jjBUvuug3ET-yhOy!tQ5{t`Eu0Ac_Zs1J?H&mXUAq zZT*G-r{#>$?U@mFrj{`~I!wKC6k!Eq{-;D1|KiRZts9T;)&Y^`zN!r6(8m*NU#`B3 z3$WBDrb~J$Rcc8f4e+uM0YcT_G+-0$8c|&&(`=%Qmyp&IJixq}qUBJE;n*jKA`}Kj zt(+R;2sqxiC&}pfg4Vo?Mlb6FEcn{*1(gZP6CALrV&?}`2yF`UqAmu{MTW5| zAQApCAZte#*hod^=!ur+XacwL0gNNyILy5XU(;s-cJZ7PS*Tcwe9jAeskhK4Hbd~* z-t$R)BG;{}%Er`I)JoyY2Y7T=IT|^4u>_V5fl{{M;E2!_gOkM@w$)J^KQD?XE+TO8 z@n4q4cQK##i>?SZ-Q5J@@KNzbj+l0TP!rU#UIA(8JeTR*lT-&PrBnXDT_rj1qC z)E(LB>l6_r^%<_dNUdyC6{G0Dt~|nKpu!|UY!1C{-*T@Ir2b>%8<}#HO#qSGQU@dI zbq@%3iNFa&OrZ}4R4G!F36$swzfl*TcT=kz2L__v8SS-30Z8H&(DRGIuj|cXO(bh= z7Z9Z8?uCF`7Z<_4pX@3i1#GWp^fS6=X-`Rh*=7lZ)F+D%d{Rv(?X*W+WekU*ocaSo zOV(>`zHx)FUU0|LSHE|Pu#4BB(xiB$P&k(i^TzTTyxTnLR;K!aXB6P8`@^D5_VWEET@v|`RC^cd6S_&CM&!ZxOL3WlWx?Fr}uC6jbPou`ek zqj^C?ihbwH3EG7zE?$i}uR=QoJu4d8pG&=WTJXbrdx&h>;^1oH9RO4GP#)SOkr&aD z=m&*!w!-E>t+m~Zt$06zACGEz?3oB8?&yUV1J{v4dUfQ)=#W+=+qkm9(ygnoNAg-X z7bgd~43@K?3Pvnq{WtJ&5VeHXn9SY|7Uf!(II_$5;p1vY6Gi-*Aa&JS=Lp`~sPA>o zRgWgD-q$%(3iip*&`4l8tbEYy=kj#J$1==5ZuKWtG-8-h&ucf?AYLxo<^ip$zPDi0 zPkb|*Y0(I6tDjnig36W`iL9M_KEtpj2TlpAVjD_;iW3>fh4OK+;9b}xlsu$S`v=W- z7t3@tDj~4gb>JUK5~FyUZhSS?A-ZD$-cwK$PgpZ24Sq1|(o&y#BXc=pTc6qDy3cUy z#y+$4J(V}CisGik=!f{Az7yRb>9`lna=hM1wNLzl45#QrTP8V9?sHQ+InY=a4enRWXjRV&N#L0j_?Ys3e8~(WPRIPI1I= zwEb*)uL;r22XD#p-3$&f(_$$VQz@Y?Qg~9UWTj9YXm{wLQxfN=5Yc<@a3;t<`qI2ozgT%16%AxAPXay_`NUpYkQx-083@J5wg^b5-iv zAZxQh-D!6SFnk#3UvLHTW{(IdZCRj_A+(~XY0{R-SO=8Q#DQ$F8?SLAp4Qws!BrF= zFCSGW-r^^nAY9_3&A4*DOOVsPx<%A+^_wN-uRtxzVf)S;frx)adepIza~vkOUf*#5T2kw3$?B&{>}@@!lML;o{63aa9sa@d0}Nj+)hs74bvL6`MHT+~mGoLa>OI z3^V6-#5F3p#L_hcE*f~SO(^iq1*0I0s7z83Bl@^Z-_377bxp!BQNxqU(>~4`dEm#* z2YG{A!m{CSu+Ch+JLI&Jkmx;s9O(LE`S(Lx{(r=JrT%o*_qfcY{9&Syy? zv3UglQEQnBr|x3p_JdQZ--0AQQ9&J3Cac7*Z^Y2y`?Qp&R%W}>FI=GAXd8J};=JK} zpJ8j0TPx3?CuaO;m~sqKg;%fxZjiG2eY%RJGl@*92nPpZBr2(_4h8W6pj2dkNK~D` ziw@~%@zn$qY#1WCASJ-Ft6X);u2!TuR1h6v^tlXox`vVA_~hpBWW~NsySdaS={hr_ zjWv}8`p5G5+uO*;?xc;l5RVUWbU8KIQ_#;i6-G8?g0$S9Zq#&NGlef^#)pi5_eE!Y ztR+J?ep{npai{p~n4kNFJLtM+$p>Y7n9Pj{*(RrDU*+$7Q?spvcvI{Jj;dL+P#eTH zq9VR!D^-t=im#-^BKw*r54ZUO$FU+4=ibU_6wAs!X~hRey%ajsI4cShoyT0o^l39w zexcCX^cU?K>mwQGH zq_1@-mx$8>4U;&yu1N2ikr_Y-9(Gk}pjQZ=bz}RV!z`OnLZ=4PCX@nkvv}JRQ6H1f z>sUwFENW}wuAZ33eIDUK6~$-YhN4ux4;G^PBqjhgFNh7M8%n{TI;J`b_u^QFL6*mjb@}e~v`zD`*9APEm3!=4X3Bqc;!BrvZh))Ua zs!9k3B4`ZVGoS=-&(lrkrN(E3=RhCh!=Q3r;v+6v6LpL%VIM0qxq^#NYRZVb{B-Ve zhMKzPY~RnFE)baraCHO;$Q9sHtWd2}HySl6DKU|YHO*rTmGQdZdSOntz$dmO-!cio zH;$F8%xYz<&2XZ}eqGc|cj~#c@8vuGfZ>_UtkboWb23(gWtn zpLiWHRN__)af`@5PJmVY+APrnp3e_XB~&4#N7v#D#duTZtcTSRbu$5tHYOMktwqma%MnHf`)xoXhQ@IrnQb(p<6Sf<7`3C-BY?`KQZwB$E8G zinC#i3L%9#xvoiT!(*(8H;`IB2(;}NmM0NIUvD&*>xi%Mh8YDNq~7iBd{Y``KG_m4 z^%5|gJuRXINuE=p+2pH1f(`glIKe2gzT z)FAYX2Xm?^`M`PIyh2d_XEx2}-8-kkgJ?qc`;(B6CCFp@=Z+n5yT#!^MH$|k#gIWI zqt;cul&AsHZTsIql?fJrX5j<}e7C_&_;~JA-m8L>Vmz4JMylNB(5jO?S#4 z%e>h>xd(iCRrHe1G^j?qxQT9FA5Nmk6ON|NX4Wm{6QCl6cBaMdaiT_afb(1N9zjQJ zU9$AC>Wr45)gsdMGV@e<47tWC2MLj3q;4- zygFwB88%*=rXs>tVNo1>3vjz*cqm(-Y3)@HWQqK3+}uTasbX7xDK-L2M?5--L?iJP zPj4CyDva|6e9^ph<0PSrQTT~&qSDX=LRGQ}Xl&!IB5J%Bt9Dm)#5Y!0-hh#K4N?5_ z(09|onE^K-iUzbE=oUxuOJ8eGqK8uzfGqp#$9?RNJ?Vk%<`CWv?3J3aZ=33`XCXEa zrADF4=sF@lxboO+qcCxdv9l4x3z&;mSnbv!g||E8tEoI$x=B7pvL3YtuxC}+W3(!Y z@Bv=k{h_PA(0Abs#xi4GoKi6UI(r;=I*X7qU(^6;8L@Oj5s9~0lLFJ@D{jCC@Qf1* z04ex-fa@q6iJ4;7cic!Aj;q)i*vC*7eyQOPdOC|dGR-C?x3YU@>a({`?FhbN?W6&w zDpPSp4asYgd?-nEf^=#z8?HS{QWmhy9ld?*Jw@!=qA@Lt%D!#v4>!FHqv4yCHqS#1|M_R|Bm#CLnALMvoMYa zk{5=+-jZmXqzLHoX(@D+$ndx@AQdK6EcO;sQpM5KiH=8rV~Z9jcWE!Ocy&>RnT4wW z9|}Hb9S}rP_SQ@JCa;TAUK{cN>L=a@n3jv(0rNb9si-6MVS`AM7B5l7=baR_-s0<< zMMY!W0klZ3nX;DDN!Jf+9}SI)zKoNzFMv5xQQ1}+FO7$zUT!&bQu?}x_L))yyy>33 zUYXU}$CeX)6~r}lB!s7^#^Lq|e`#Drg|FxA%kvKIIVVgH|j=Kt>*iqcE}Rh;Ypo5b%2 k7Ve+^b*ZKQDkkoqen0*npN-U?Plf$)z1aW%x3mBM0K~Sw3;+NC diff --git a/docs/user/monitoring/images/monitoring-logstash-overview.png b/docs/user/monitoring/images/monitoring-logstash-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7ea3baaa02d65f45a3ffe1d890705adcdfa7ad GIT binary patch literal 313493 zcmbrlbyu6s_dQ(NLJJfr6!+p@+}*v!o#O89P$-n*?oc4OyIUz5q__tS?iNA_Jh`9m z8~ELyJAYhRD=X_-GiT1s-e>PKQJ+=iFwlt6Uc7jLp&&1 z7cbta*h)!#R*;gS{OsmzW$R%1;)Q%vs?HltjZxw}19b(P(6{oa-BIcQCDZ~L>;z0+ zNgR0w4!YOxg@6rcHAd3nM$=mFWfotK=zk$tEnG4JO6h58FARReNabVvb({wQ`92G{ z?{_{wUcn0h~f!p?!VH_qA^aSbWmfX7j?b z?YXn72MOCUcwT1ocIxt($?s)B4%Q2tH?Ae(lT(rRlrMZ3O_-QpgdDuOU1&rHC<^15 zy&`&tZB~wBUFnK=RJf*&(Q)Lxx^#Lm!cDH0h7sb0KG%o_T~3gL;s2?@3DtcWf=RS3 z-t&V#gdb;{0}ACzC0s#@9B21wcpl0W_&vH~8UNLjjfpDqCwN8}l=Iw3`fPA@{b4}# zAcmaVcVp$+hcn_Hh{yO)7+4GSwFz9G-PVO$9rYL z)T;=a{kcZd67ifSKSH(_ti__J{AD=i3;N(F2e!S`c*;JVbh+cFY_s?DR!g!aKXiti zU)AS-#(7`3H(X*p`g@1xt|0*G(zAqF!NmLE5_x&GMNmL=*3^@k1 zSn^33%6AwV`*BA2ib>p1GozVr2|g2R1T$Uyu_CH?dom2S+Su7+=(ybOmwhkWDCZx2 zVwxz~zL3%9We#K$md3qde>olUN)id3;VbYpmjouZ_YDuEU+7kze-nvl1VwVQaQfYp z{FhkyO&+8VVPaG`FQFq{*z;xBA0*+!@2eki-c90t!cajaQJdNG%S!aM2+9O|eoX}Pu6SbyM`Ha-{;6J(J7 zz{n!FgPM=@0gW(?A-%_Yrz!08k)E+gWV%qc11iI0_q}w19j}CWT&(_Alw!L>nQf>p z{lijf4#ICA?!xus=-e#tOx&MYBiSoz>WkXcKaVjeej405&RkJl$)jc&%L>w?@~q0F z_5{bo1f1qy%M>Hm#Xqdz7(-3c1CTyH z$<5`Lrz_7tBbnwsS25eZp``S(u{jvAHu8A?B671+I`C4@x|jS#2X;s!IuuQ>KtGb1 z{k1r<;6*Ga%3dEae_y~_D8a>>e#&>suj?t_140k$#y+;?S$^fsc!M9t`58(3o98cL z2NZ*T)w(w)ZzeY1@}mYJ5%gKQkgbJQmc9{2hHvr^N@ItI|9y{Q7Nbkq@`GzT?w&GK zo)9PY54Ej4N>Z#mHZms`6s25Tn|gi(A3zR86^O}^o}|hhaok0kiS7~y6%i^*VSMJA z!z7D*_~pQjrXpQhuzbMMM93*h7j^;kpz!>m z+HI_hphw(L)lanixQ}lQC7GzQKV^TGEu(RuC;gZc>a2ma#giy+fpZ!Kx^Psc-oxI< zNq^6W1Hn2|;T5Z`6Jvzul zGV)Z}f3cS?&ZnnS?UYd%-b zOb5$zp1-bvSVyZbxSm~+C> zj1CSyBO5k{bjfs-^f%_2=0(G4F^=Rghn$JF8`sLA=6Kld(P7qp$HZ-1cF(GGD^9C+ zE5VuSSpb9>Vo&Z7?-Ku=oRxfPSSX$#ZiD+NjefvAY2Q1~F^{6VtJ}gj*0>wQ3nBtF zgZKj91#AbTL33_t?<4NnZbY_WlT*OjKIh&IlP9*P_NUIreC4`)%A7h!N$(J?7wlh^ z#C0f{KT%&q_SH}VDUClH{T=vv{8i%OZgbc{&I{9@52p9S{s+tM=Mj=P3Tx4QX$E}a z_xj{3?@K7sK4_D9iLEgS3w2R-iT&m>bNUk{FKMB&|pbi=`d!T}&Ec|o~@#GHgW$~F$Uer<`T9JjD&g2(xa+}zdyL7s| z-d@EeMCHQqqU}7`}shM*vzt&&}WCEgQ^=A|g zM-NwL-;{)_=SM1LzyU{KO0zb6fey06v0bO$tXs%FnwpbmE81vdRXV4qPj{LH=Cfa~3ern)=p;>4OK$x@ z*oOg=`5v}yFc|i`?|0Vk*2ZLO3Wgcxqz^_pJKWZXIm3fngJP3|`&aud6OB2oKAgUW4BZ~9Kkiq-RhRjUNqAWY?LeJf+5UmX?)+v2Z{crohlGHz` zNvV9=$ki+D`p%x0M`t|A3*6O~)vP8kyY(2)eWqa@Cu23ETHOsTJfr!Beyf2o42lYw z`9*t4ySs&~1-9zI#xHf3V+1|M6v=a=WToM@d`*B)#Pu3GLW z0)whHoEo~#V8didWJW?e-gz~Un%WJ^4ttqbE5B?G)ZLb# zjCb%$jUhF@JGoP5p-uN+m%mQ?SEOR3z$)^yIVDe4U)*(+^p*Cvq9RxI;RaZ6;k$h@ zIhOc2QXb)sZNgjK!}@}q!QnTm@@hA^6>y|(M&?Fz~^%31GZu*iMMWA)`~?s)*HxmV5i z*~jJX%}iuPd>n;=m`q@YP>L8g4S3Y2qWT32NmeRyUo@FZegevi9nLi|bF#o9Xk z`&WtUg?#mkfD{Z23@1|Jhc*lpf07W~#<_i^V(hKu&B(8`9Zo47$N{v^D9A}6L`jFC znJ-?5zfh2t(DXq%S%2g6L2GsBk{(a~U`F!%ZJE4=xTdrWa{X4NZhfec*oR|#ofEW& zm3o4@UxnXZ@=AY5{n!lwDN!P+_g?3$XO5?Z-@LvO>rfVR-)n6oX{%|!mbO5AWTmCw zVj#W77JuV4tw+5M~BRM~~Aj#IV zMmj2G`OE(lk5EpUO=i1Yb_YNd^;A_nRpr5#rfh8{DRD!l|2YKzgwIls^5buv{SlrE z9r3ZBWKbrmL$Ba!8gCt||FU-2;+vlcF0{n2Oe{*+y>_Q4qu8?m!AB3uQR5>c{Nn;` z!v85Xu;1ccEDANuCj_`s(}(Y_E)vN6C}F+j4Y2EUXGeRx|$N zcpK<8*}Z6-BxuwWXt+oYnbS2FG~0~-QzDGjgs^Mu(!>W~s-BGKJj=IcrbERVPB>k` z|84$XnJF@FzF2)FAMMLX)ki}8_@73J&0z2{lh<)~PMCACW{cVcG_sc%K>UOz-{YoW ziTMMXkE*&vPJX2)pCoK?CUd?w z>CylDSxXrbqSmKzHzKu-PHve+ndB^lM1zId_@CA&g$${5D6xHeyvn!qWzvrLi_yfd zKmW@R#WQg(WMjLoL*KqmcqyVQ`Cm5YW*x!E$jGO~gIYhpGPT+hLnVGvJe9t8Tnx(- z>CBn?28*Y&bgFX=yQjIC_KT%L)k8!$Qmn$w~5GZleIyB;vV5?pgCr+zO zIPc-d{-0qRn}H=X(BEt9tlECUzWZdYYe+SW`L(TJsolhbdb8K7a`nbM&FXpaF`X)H zT`7jVphqe|A0Sb0=9x={Iq%Esyy7`c@t;3a?jxs?4!mw(z46Ilqb(^N1z(o{+f+yt zZ}IYUT6?-yJHj-h;@IYQEL{HQ__^GpT37&pC6ehRXKJQMp`CU%y-r|Sb1D3j zH&5pg61kP71xp5xX9kbVi1?q(TguAHm!JeFD&este~*?|O8)WAgsw)bcNSPA~-ttys0cgK@ zWSQ~;V2$rP)SzvOGdCG$>a|+*Q9t7@$+fqy=k4b>kpP6xw;AYvkI{)z^{i(UGy4h1 z8cg0-F<>A8mU`rrz8`ns_0OkHvaxfd#*3Qt4((2kW02W9E&a;wo{P~BlV>cyi|Fo> zFo*t9iB#v}M)~$XZ^y`daXX;{u1cbJ31jNEKIzd?x2{)+)qcpQ- zDxqmsr>ZF^jvewADU1vnX!;1k*vLeA_z9kVWLR%hTmWd$M`A2dGLPykO_vvS{-%CG zzHj>$ct@*nyg|Q`&0EAB8J|;L8{Ozn8AY<6o_?_{8NBhq2Tgu@PhTaFUhRG) zU1m)Gy{&%GlH7aqXntkt$$-UW&^(RfFXAe zsl`6O-u>_75>qSG(VhU9Z*JVWMXh4+Cu>b6#uv}(MiMq7+UzVMcLg%K+UIi~S>TCQ zM9LO3FT_?@3K0qLa`{)3=bcj0(PBahFSpQ`Z`_e4cG#z0=J6@@3F->}5VZ z*9wGOz?|JB(&InS>U-n`wtJ-#wMXe0bq$)a*Dhm&(h2~^5_L@#*n+#wcUqDC7z(+u zh+?kjBM;wW9U!+ao5*jrdz}mw%Ziuk(#2Oe&o0hUWrm{8KO*}i>0k;+fdGotw^?Vz>VO)zkX73?27qJvKZ5!r;HQle-)ZR!?&{99S%N zDXF3}?aI%=s!WW6vot9mF^fMd1}T^qDT9l+XgLcMgZvqicJ^4;ZD1l5GLnfm=N=vO zBI}tVyCpILciUHDyMKvX>d~q;8Vs0Hq7#p_wtwDs<-7}(G76cREO^4?4Ek4~FSq&G zuLjyW8ax8nC>a@w&9<1z>u#_(bn_=-HQ-KGOl4A(lq5TJb@LX00&sJH%(t^rqrG$H zd*&guTfLqWA2Xl#`LnC1KP70>FrDFBPBOpGOv=imLN9ru#ADJ<&5G40IR2!pMZE## z*4d@{gd9I^79LA!`#~YS5GZ{=VraKUR;s93xgtvVB#nSt#i+i}6z=7AA-y|UIUI2& z+H=$ae(u-zC#1yZxJCc`!cV*% zN9@D6=gwu6jwQ|nGt^ep8DU;g4>7tYIb`2b-X^ev(+~ldii0@VMWPxLG?vV;h7Su z;#d;i(U{Ce<V@P!c*yQ@Od~Xd(7m#eproej4R?M37#-h4&FF0g4qvu z4S6&W!T+U+dZMCQzY|saSy+rxaek1C@HHA`pLOXAAJTuvyTsXE-<>Qo^R02~=8VY( z`azPEloQIdfP1F#3zSJcf?mSfC>ULe`0RRgManL=YY<#8Yw#_A&zMA(2TPE^5|uynQBx0im>0_CjmfF@X35M* zC*ev9Rxwk`v{ur)^5vfx3jP1nnnR^Iz19-1AS5t28uDUz$H2;}Qt~XM6X!ImxV^K3 z`JIYuND^nWQA0k#BkW%Rnm8d62A1u;d?oqd@Gua4O4KP##?))VD-|V`-1orvaCKj~ z{rc>UW5Qw1HT!!EDoX;hv6e>8Itga^ZvGRkohD^or!_->PENvS1N{~oHt%;m%hg}C z0Q4-hxfJq>Dd0xB)oGi}(k31<4Mo2QGIMxZF2FDV{E@=U00Tqo*CGv z$Beo9LfxY12q)N?y*g5BcQfZjXd#ZgDu~`BP)K5r)$rr!C`@JmpM!%#y;0WFcBL)U z!y!1O$!?l^b+-3vFS5aP7N2CiEqFv_`D{2M>AgHC-%hUydnxsytRs&TDs5~8I!G5#c6@RbFyHw{cb&h*Hoo=2^2VJuGY=MSYE#8 zUshl!v{~5Y^<@)|e%x3@Yg#&$VL9xsxw_zX%o>I!%qz%X7&;~TtQZ8n^HTZqx=9r zPpDMm!Gb$~GP!%m;`HqBuvyfu={(v_fO`y9%pcSEZUiki`>QRT(l)zIJ`N^jw8<3~ z76Oi4PnGNlX@fxB3b0c`ronXf>G~?&c5SaS#U}HmdUKs}RLVnmb+!IH(@cvey3je? zd_L>e>0W+O?PMK`X&3PK!^wD-h>q2h&}!a= zxZ+s9S^(i$fyAQkHU1KFbX-&#=ILr`MdjnpRPQ>ZOq=y(MDfvt>8Jm9{_UcR_8LLB zq61E%tWO;_8mF3O>v!n>L7>-~$F3DeH~j6LIqUoHIybz{hojxAX44V0Oi@0SNy|e! z{qPWdz}R&_4v%>Vcs;e-y{+kl)Z8&|1QE7*CI4W2&~D;$7qvznG;)@n*02%oSF(JW zO{r4e9cP0psmLe8w!o6ZHW4Qx^RdYMr$^O${o4^-J~u0PB8|Tjear_V05xLe%!>fq z)PXeHKkk$GVOxQdk$E2!RM5MJuE5fE^B>C7DQCK)Q%IJp%!~y$m`IbALG2)qM{o3%k&jIHaHggim_zHB>YCW-C#ttieDJ{{^SD) zCU^#mx;nXLU&b^yH{XpP#YL-i_xo3s1OM)8*+9XS@SkZ)0RdeG%_Hq^F>qLUR_Rpo z%m$bz{j85P=b?^Q6juwY=SuO(9l)}w9uMA5jZ=fEf_-A{3nuSCy}V3;SqS>PnqYah za^7R7=-TaSQFqT$#wm>zYy9H4|WLH>HJeqt?UCVFAN z&@-l-?o+era0D=HNY1r`4+;T+gdB*3^Y9J{v6Or<2C5(FxuDe!9^HvxG z`Yc1%&srxI^bd|^#pt-6U&~{Vk4v=XaI-BfNx&5Uk z3X|Pq)iqmmdQNxe_rXCQFdh4*%Hj44C`{HD$5ZFH-og@AwSFjnJ z^aKZ(N17KSpw6pHU(b4IT#ruorWk`k0OrRoE5+l9d$bf1>m;_SsW}5~05#zx@>WX& z@S;TFC(QO@*Bi@M7h#YOXj2Gg^QpfM%fSTB-XnfS8W8PqHpAtRQT16>cT7;Pag#!* zkU_(=tcj1zT(+b9o5hgf91>0b_g+w<=$ezh_Welfe0hQelU%CuVHp=+FqP~3X&j38 z<|Q2J98B6-(prhU9CGsZ*NQ(T{e6lbdDdx4>~Z(eGVzPWcOrT~%{Wslx1rWq_mv}E z-}hFhQcStTbZy!Rmg-y^5r>*HBqZ)MKFz-NF~0L;T(jIz!HL+XT{)XW4g~XQGU~QG z_F8VUji#9^2cHZzeLz1^5v3%?ozwfEv`A>iTeVMoT6{&P)bB4wI4(dp@UYZ+iYt$`R}=wYcie_q0g^1TGt9c+;bJC zmNz}j<%T)4-Ha&~!;O@dTXk@}o$3dKHDAh?(^V9hFVqifk8JqoXG3J7CEF&Fg=h3k zfZTYA0WfL%c0kChoWP$xS#(568JT7#cbX{HEe?qsu(XxIqxWEdqq54OVNIMbt^7n; z8>!rfRfr9v_vEy|*#Lry{HUb70#)ke+P<|t=1mk+cG*jP-*ZdC8}%+w!s1@z zRlgjcE)Ss|sU`SO+_TKyxPe3KIz0H*fObYE0-FS$ar9b)l4;IY*zL;E>mdE?oqsSf z#2lZ^m~Pf;GIf5h&8QQXmX}wyLaY2^_tXKET(d1vowEc%(p~Wq8+V9i2J7@A@>ZoY zU534h_47+YGF;YX`-OzN)0Lk+i%`dv^Yo3F)^qp5^1foR&)XB;p&d78^8;P<0>N_o zccRmFviX6jw*r4J&sMtSa$qzo0r_hpOPadZeEWelpL=rN^?-@3J^Q%V1LOk5T$9H0 zI^}N!n`jC^ViVasN#yJCe1j|7ukIjh4!r$6qZ&^wkcl+MRmZ_TragA&hh?E|YY1s@ zkl$3L7O-i)%vdFh*Oqc0a*B6%y(`k%6S)!i9PO~$BXvhdn_WA@Q0_3fUaj;-=*$Jl z%rozCn0s~Nln*n3b=525^NvY_&7~WH&ot*x7}WHB+|25RC?`Q3hO+!iB)VT;V})4V z<&92kyvJwJr<`+-aVgdhBi78(FHywU}7( zY%m{IEw}A?lg(>Ov!CzX(qu#aq7#hnO&9=-*E`${_c7f}d) z+I#bZyxLAy_hDyUml5_-L91a;foD_Y&m+RPFO0uF=(akAkx31p+=9E@Ve;7v)m^2@ zwZk!Z@anhElUc_#i~hU)k&zw12dwUl3_@=`Yp?8cS@>`ad1bNNt!So5RSKnoK~y58n8dPLtTyN*tf&?ILTf6L~=G^)i)dh;d$1ie6?zDQ_26?5s!lM2&e&EiWVsp-~a zN?|`=m$916vVQd?yVW6?V?!k+s#h6xsmB9a5dwyYJ6il9iEZ94}qLXmjz9&GP3*W{TK{l}^P!0UvO2AwP}J<9i?3_>8?X=lHgg zx|&?hL&<9;8cgV)Ei1j&{RUD^2fq4tt8sJhb<^JnKS;6q=~_PFd>m&+SIsPxr!XfRd7x-nFURR?1CzjE@r;97;We@YtN` zV@==f`ezge2wT7%ROjk3y4FW$`Nj0cvvO-M()N6Meq$(=b>tI)5jM8?%;&$@*YRO` zjjwu{b2)65%7#bR!H4t|91^@68~NN-+=s1w=Q5|kkKy^bvmjdZ!7wP}_@ zd`z+6!y~b}`i#ZUH@pT@Af^GJ$g}Zbrtr(R6m|lQi%Au%FLaP()8FEPcZKgLp?L$C z@}#~)wa0KITHGH$5jOXQ150-!^Q;%pdNg|XEH~N0XWK(BJI&?|$^YrP6&XqR#oiZ| zwiX!2(Q7U$3wZwI7L)p;hWtp?l!d7@OUaNzwI;?1GPu%bU^O-QYFNg7ZLFuIS;hH+o-wgfg3)s zK7Ih3FOv}QCfzzCsoI7E6W?>Q^G~z>bsc zIqv?g9Ot-y`w~zh5#-o1Oxk<>Iw9ua1Q>Qzc8kHcVH!Ve4s^ShufKDE;GMhVQHe5a zN_b`Pdbj5UAG^Cf*Ck$!(eHq7)#%3@r8ZIy&831R9wj=^JC}(nx$f$O@O~?v zU(fWfTV`D(vIkjQ30lz|Gj45)C>^@_NteWII0wzbds5vjb1~h3VXvgku-btP#U0RQwnHKF#sCLuhwmvu}hmBrspzQQ#Hsc>2jKF`@l7;Z?XW5 z<=?>0=K&Y(dXB3bbMIA=v!Dwih>vxydllFGUtrs1uVA!W z(1x+wn1a!o%RqkcR1?yBkx1>~=|1^ZHnMein01^;NvvTY^m|E`ToYOP_4g{+1m6~W z>7i(@5cv+vSQC-^Zg+ejRWd~7>uyGo{;KF2*%e14pTHnFo=HIt>hIm6uwPPMCu^(& zCjJ{nt7iubZkgqxTGOu`o2rdkzZmqUP@@`(Q*|!j<_F(lsU&b5yfb`CupzUfat@hLpGhVZskta=dsfz!|1zw`9 z!3RDOqOb~^&vMx)K21q#vD6jImert}Mo;Wl*7>d1vR-i=dedn^ZPOVqNv)aKYx2hAi8!ljR41`Q|+TZR1Xr z=X=v_XDfpR?|!1vT!zy8nRN_gTP;ATiO)bp_6=9rxueVcr&2DmXcQvno+m{}M{Yuq zHsdvjONE3l;kgrP2O+-g_CG6rpOlnjS9_i9DmID-pK|Z;D)qyJv)l@uD2In8#Y<^+S5-Nrc_EmxW{ zub>3x(v{e@vrKZHc8f_s_Rf)IqZWsCI(E$9d838QS+!%TZq;)})V)@@@eBba(JdP~06V7aZf6Acav$e=A1uGi{$Ieyg4QMlU zxL-_g-oa3>_6*KfPaj0!;C+e}C?W2G`^%V0o!V3^v4^>uMKSI*{)3Ln-9KkWv_qs^ zL62(xh$*W#Jx;+>nu;@ys=#x?+@0J*Rk;6mTYc@8DZOq$0Mu>If1llVe?30OXm>cD zZuB;+CQTNDr0qCE;$N8`Z6PS(O`az%4tPo;RKeN$!7AKdh3Sjr9Ql{ zonE}r(|?4m>Mh>i&tbE6&{yP>ZnoJ^ykH7%dHQ@8L-BigK7?NUvD}2cKSjoY#X8Tc zq0`yeN)&ox;0=j}-6qcZdwCDM?z_NKsQd-i60f9*#}O{h&r))t?Fbi-Ty1Fk^}_KQlPdAZa+7bi zQ-k9`39A>eCDR)tH`9#}e>ExPbconuM6~M3f`xiu9{1mJ9jX&&6mCV; z9{@lFg;8GN((9Etfr?aLGTXCxLR?`%iOEy<4#bF0iEo79b7z9~t2xlE!RsoI&LI365|{eP72d!-Lu+0OzdY18euyqfsSQx6 z;w&A;dSE)6!QmuLYY-^bNxGq69CS!jZp9Qm&zEnC!FRgaI(23;_&V&CPZ6Os4T>0Bd*t@S zm7Sp<9}1FPkJ9IE8UsmcF&ZT*WMhe!g2xTrZ^3S|wHlr}tN1MMy4bIUWJ|@)JuXi9 z#-y;;SpU(B99LV?NR*f4funw_+k;Bo(c}Nh8QzurdJgLLs(pR^uAr6GsAG){UdJR{ai+)YH$Mui{GFp@RXbgvKPp?eMtgv?auN7!c5eX z6rMB8*pO`|b#v9Be=CZ+%u=*RT~<6akYr!I?N^b)hdS!d50+DEbnD{@ zw8Jh?*ag*t2ra6ym9^&8-#29Z*zz zk_9ndC;q_8as;F4Sb;mULZ1G^*ETj+qr35yR8H-^`AntQ(;4_)Gr++xWOMQH^?rtLRQtF$E=x) zg!9zZjDXJrzsnW+v#Ksb8;-VkljXTOY1H{j@-rxqXS`IR+@)G+-@Llo$^E6#)*TSo z@%!my7rfRFiz5@F`Z|w3C9;LGl7peoc(80uo_g#|dQz2?AN-^;dFY>Jly|?we)h0Z zA~-X_hvAW)o2gx`KVn;Yhwc1hc)3KQv?6uVd8tidp~i?EgLrOMW|jK|&t+t7&R~E_ zbHnU4!aj_juh0cewal6>vJH3A7Xj6ELuJo|9W=^NP$MjdN=+D= zL$aq&^dX`tY!mDM-8)CLm69T--G|9O0PDIZ%3}b%xO4JMXZ>SZ-vXFt8>)w3QhE;C_Q%)DJ72`H`dh`6+Y6|=Aext8l zrB6+qV9;$9W;4%**ex`j3jkMm9fGD+LOOUcjC`4CkSTuQ^|{$0%rwhRJuw4S=9u#) zL^kuA1J6A`kKfM<9vN91@(w(c}m*DWl*c4$DS zw0+(Pf`rY+8eZfx1MJf$XG*=;7yyJCMHL-$Rq4RO>Dg&t%?n-v_wAy4__jG|urCZJX0W5hEC;?oL z=6PviZ2WE1LgY18vDdYNH4rsy5}oLZRcUYRpqk|LxF=%5(q@+W)hit;xw=AmJwz@;1lg)Qx#6Y!X6G{siBEGzvLG2Va|>`wJJ!XD201;!Do z^k=%qo6ahpe0yiwWKzuf?4J*!qlb@vYIg3waRg3DoL2iPVZa@==P8UMhm|fB(I=0X zK&>i5_F+;_z>P>{DFRU$H(mC-I<6+X<&YhKPW>clGl6sW>7&7;DPpCgEvG_`v?V8T z6SjdC(iTe-Apa8m`I7-(Q!GqA;y9+H}e{zmW4eiLI40HLk(__UJnn-{F&Wu5VTV=N0;NusFZtk;$yI z$x74986xW(rgXzK_SJ+GcSBVTjB1sKQ!MDob*;r+PCJtM)FJ=6wyya&qq5ed#>Cmz z9aEuyB`TGLpy=G_HHrA&p@i!+Wlff-WLwrlE$5-tWkthwvprpoVb27&dm?fUzWexk9uL@aai78F+&T?}sR&RDpX(dQ~$!#iD zP%=Ygd)=o}?(h517>M(9yS=)*Ak#KPPe=YvA=K;x8?EfYv}bo`Dw9ClwZKmAQyT9z zzv{WFFY897T*R_7KY7iEpFcvxuDWcR3%<27o$qEnf#uWhVkCO6Ns_uNO7!w_J*^l_Qu)NlNX+!w-rTR}-J4Gzsi|q% zY9zJepC~R6%`Bp&5iHNc_%A`)pE^+yxvw3Ho6Yb zt?I0Y3;LcVzY2Is%>Qsd(0USm@#W6@JMK1W5HBB$TC(+^-k#49Ydv8gYZu<`ZzW_% zFsWN)j<(-^?Xv&Z6Gq6UJaAFN)z=LT7olA08Cg5kHDFFz*S znmDi0tXn-%?W~fqr>f}3YR9|`&b~;0jtu24qoUo&aCpi#&rI734f}7J!>wyi*~2H71wio`YVKPdh4wql=WB zQd)Hi!4o8I%@fuq99wLcT2;YGwo1WDpB3`iNx!=zwESR=bmwFifoZ-sz0dT-nD_n< z4wj1bD6g@Y zPuv95DxipCZ!9jia~*y}JC|0p(vq@J@>_KP#dE^CE2oMpwJa~-$MH8lYqr*1hpZevk1U3wa}D}Y1??%wt7!Y7?h*z2hew}fF+!<_%>`~$t_ zwgL14^z$W-mo9Z7o87&WdDQaRcb+*&sf=*F(F2AalII@O^c}x0?l&^W|0I&&V zZ)*8f@Q~E`h@zJL*b_k7IW%9`Bpk&v&Ou!bzuJ)9buSZS3NiBhD_WuXj^)nv?<--U zgX_kXZRR)l%NNzGCt~m~)FP$Hf}D*#gUZ2pG#aFZb!rA5;LTCBtZG3Q-=v37FujNJ z*4?%q50ern6iVsNQk=L-Ms_jjCP zK)7QklDap^{*7VE4oAmjCq+==gh9(P+-`n+J@Bj=Eji-=UE_7WJZ`f89Sw3VW@pvT zng2rhU9o9wt@176sC{;X7j81~S9^ndn;fQTO4rdnv$fL&zyP+pVlp-O zz6tbxmZODOT~V=u#iV^mdvJ70Az1~rJ0?b%(YXg`R#K63X*ch&XzNq)sro6m zvG24qu#=bbqT=ZvVf)WYodlDr+N0B#K`SWoSI&8)9L11Bw-w#9=OR~!(ZG(05T!186YUB?NUUL^b z_BaXvbst}Gnyg+!S9*5-zNN$)w5Dgb+PYKu)a%&Kh}!7@{pr%V;=a%3?ceR^ zxem3Pujp8%Q+|}GA$Q5_oDjM`1~7sK9rn%5%>EI$PL;e@EMHntgPz1iDMW@utdb7x z`%=@}fbE%3_lk3vA;fX%S5LrAe|BhU+xSDZLF;}A^K~Xe7RTPv?n(H+(z&ZcBEtS@ zg@K`0zQO1kTdzG|wjMLs(`$+);RBAS$?Xe-0}yhz=g}PgDR4E%ByN3Y_Y5>YPW}1d zWon#!LiKU_s`c+zIJ~~Xv(v03D=(6?c`Lp&Cu!E|bHt1626-dy5yf>MWQ&~w=x275 zdvTKJqb(w_^=@7!X>m08n^iSps!Uo@mjow?)F*51}K^-eP zi_i7i(F1tO(r;;-hH!mcggChx_gHR%`~4Ol_L{e+`F4U*;*~$qx7q6M6rw-KL*07R zor(X9oRRufq3C`?6uOOL%xv6Rsdt%g?i=k*g1C%>9xZ>C$poz!_iiC$jVT-timj^Ax+>dHKIT`hZgkdq>{-pRX*bdz9{vo`OtK!nUa zeO3zDZOU}F_yfxyn*mo!#?2q8A=)&yYD_vfDebAQrSrE-a^!BN^j+6TCe+9a&nY3bBVZ|jSV^hgb@BCx5O=0InQwG^E za$mL+(ZS{h22lj~!^%a}ygL6vPLmT&+JK-;Q+8zSO2Ojcs52{P3VoSTXk-ea31-=X z2|W-x&j->v>jG8o&_A-&c0a|vYllf>iU=KFmkDWA>&rx}`BrL{eFlkGO>dv{Qa7OE zvR!NX90e{MQf*P623(zQofrKkFY>1v|5w*dKU9Q7gdjSKCmLgcmIFg7NP!T3=<7~l zhkN@o_H)c7s%&Jq%!XeKZz-0w&U(rIj606Fn`Q=nsyJTo5BmL^(f%n=h3x`+AqB@n zX~HXQ=Ow1VnqWnz0E_T0UN^~+yRIsEi1oLMdAo%4fvfgfKD*sqtP?g)mwFG@!OWK` z1LT3y6+EM8N(XNtfYQ;!#^)pz#-2zh7Vi;br}s#;(jK`3U(3FBUpVRR1SFt#5rp4< z&XE{hgWnEiOT@^d;Kh3PzFgNMs%H%o@_FU_UUgV8>_HFG8DTc0a?f)@JI*<8d***H zz}Ht4nt$>Vy`OBZGFz+Ulk1c*^bXd?-upc|eN>1dh&&*pQ~0J`$MUyYFL18cIs$|J zWF?n@k#6aiiqgbN#W>p^=bo?Kk0gl)`)1kQDPJO;2E(A z6>n?gu3fJa9SyjtRqS55<$UD-BkipNqT1U1aYaA{iKB#o(w#~VjYxM5(n@!S#4vz> z(hbs`LwBPfFm%U|(%s#^?R)R}ecyA=z2_cZ|8qN=z1Q07SxT%e?nr^? z-!l&tIR63Y89+pBkGNnte5C3I`)pM^PGJ(9pF5LnCgGwq${)=RX3w)?v@T^OxwwKq z%inv|eEX7V$ws@{q!SGR{qEVQo7CU-Mp<>MF;uL(xf~x(v>Q}08sv?oQ)^dPFU9a2 zwB0jY{)$dHTMmop!El!(OVdHf6^CWaBj`528}sVfdu1=_1k?{sAM@n0zvhAt@p(B|ej;VE|Czwv&mUT_$<9)NeO7%`)Tn_&J6sVCZ zubq$ z&LGnDWNp8>KjIdXgowsiB3LKH^9q)|I7AfD1cJkiQ}<%^bBil14W z7&5wgEQ_F+W4<`6qJiQR;1=?Vi^ViOQ&KVV;d5EE9NMV(a^LVcpZPPFHeP&}n2Tw# z69!FPR@E-xJ2 zH-^(^x|S0;c@IG<#X720@f#coRTk*EXBjE;cVo4~5_Yx)>Y&?JKf~<=P+v;xVNZu7Nou^!n7&O_%qtGZnXki5u)Rs zYwWA%!vF|8?x=p3>=clAtq`kCw;ITotn1gXa+CVSD)Z&Li>X+B#hT5Mepjb-g9AR` z6hw^+tVg#*1)OmID9Op7+bDfB_F&TWc#C-#vUQ0bgsPfMaFSiYn_mgk#k2tc4@+Q7 z5jIAUNnl98V}5xL4Zl*!*%Uq4peo}xGzp%V!+wxROraJ9gIZzqz57Z_X*7P4Ihf*8 zr5gu{F6gqJCegfG+{zePGlPXd4c#bYbE2=Ix_fISR4h2WIj5JCtU6=s5(J%p9LH;2 znwgbj>|BF$B#@`Q`9M=tQr>2+wO?uz+-v!LaVQW;glHahpynL}lyhooRbw@>wrg-v zPI=&3C;nn67s$mro;pUyG)KBaBa?N*AG}n>vt93e&-c(#D*Mje#wfKm)HlrRa!=4PyHpL{9x7fLmqV zjomFj9(dB)Yn%~XA(&mcHQCq!eywS-)6rrAaZ54V@sBQ>p60qB-hj;IHP#wyaIoPz zSHT&dC=7eX4L5i(8*AIj1|F0zHu{|(;!CYE^Ebj?t^7CEd+XwWnijOs8*BJwl&j`$ znlRT@3Xr2w*NETscgYsC-V=w4v}#&6;S3nF9oipk+>J%t2`?A!9@*%gVqaU@?ndAl zHbwTWPicxl*I{85kW0*U+YJN&;R{iMfo0E)Cm*S=*7hIQD9Z^9f~Mtooj0&c+%KP> zBIc-VUmu$tEaQ_*TF%I?(L?2~JNjV5>&A&JGxg3dN2eEhuIq&Gm^2;_d~{BG(Z04F z>he=L=kzBv_IpgM>(zn=02DXNI)%-WDzhW`J?D}S3#OYYyO4wAEqa#7rPB%lfSo2O zG-C&1bf+n?Tl=or4@pf&_^z9vBSf9>z2bwN7Ct0Va)l;6)jX}j7|NY#a>7>u0Y{k@ z2R7|BXv<4^yv)&4eoYKOfE_D%t8JnCRlC9>ku>%g!`+DOeM(|XQfgEPsOr@qp6@=t z$oA>LxA2eD=3~`llX)+~hrdhfP0c_qyC140J-6F1$Lozrak4^JPf5V#il>*DfvLo< z;4avg^IjsOn;2q3u_@k07LA*61QYouI+cCSnUGbY*cA@*6zJZ2)po}1vXI8R)VZo# zJ}MqX&cxK~htg7N(iT;JUzdf$Tm`EdH05}&c!wpF|F}%E^A&96J;SQWF%kc+5#T3T z#cI1JGiu*NV62!#hXST`N^Q^MV&G~t_7q)*DJOA6l{#UAjnH!>_K8uvr8lbvic|tv z_+nR^tD8dP>6InIE)-+bv>HxRL^mm_`|9n8+2zS{|4BeodMo?fFNdPRNQwm=Di)D59nGhhue?d3|wZecFxH7W?64fM95;Bv=_KI-3YFp#(e(# z0oq|=V$^uvy%_{uom^ypn_c`Joa2O1dl7J313RAGv|pi1pBJ>$KrtEGg(70>BcWm< zwhtZ6PzrV+VpxbK``AM4Y@#yWVyk+f%|!_)R3%kzPYdKA`Xj(XL*p{`y%z_Zg<_ei z2^NQH{s&h5+gIN;i(by>zvFZ;*(FfcmSkW=sb)?Jbrg*KIu)Q_n=8ocQj5B(;~X*w zebLBwrCxhJM%G8KTuZN*Eqgl-KnrqnC0vZZ-DXxjL_w)euxc2a?f;raVccv+{q*7} z607@|3)2aVB4b^@?5gQvdVUb?)aaom_fj>$J0WDgRQ!e^njYnbN~Jl+EoD@?>GoZ^ zn}m{5#KT%@f7JL8Ac=6a;TUkfjjJ0krM|f(;2L~^C1|}lcFfI{xujiui1J+D2FmzT z6-u07PXT==(_0VLg(NIPI6qbw&`3l^vjN>l;mpjuOMyXdIKDBGX9*)RU8b-e##RzN zl%AV)!F;-T4a38GO&{`jjz%(^mqG5C z*P}%)K72N(y?5vDukr!u$ci*-W6=A2vOMvfW^JI=?r}pWvpJg5<@<}ldXW}_x(|L? z#0{t5JT1_k@OunamjqO{9b!IO3zE8&vlQaifpFr%b87e17>9JNr(;})ob0;ER;n_*lHTDtP9Z*2U1G*9LN~>>z4)5 zA6qyI;aRIA3d%L$fy>ve{Np<3Bv1N2JzNvuM#e39X(Ajt?s2362v2=R-o@cSW3^)(wqdVA*BqAQ|se={2KnloJ$1y`7U~ zUFnvWX{t`Ex84hy4crZRFIrT4VK;~-`&D-Q`P7aH!8PJzRsZ+xx~sL;(=Ln;MOC=% z4O6kqhpN*<`EnG39#dB$CH2nbywI=b5ZRh_4*(e6)n)|AM$-?PG_KhkKAvpYHT0>i zHvQ*aXh5U)`ICWw*B8%#658O8y1xe1di~3c*Q-A|n%=iE02O$L1i;DMaJLz5I)0`h z?7#A4ZK5368vvL75yU9mx^B7qS1L>zDgT9Y?3eee#Z*TyMX*WT?HS6M}%ugYUJ zc$V-#b6;-6Na$9U4dpuvX)Eby$RgTS4>1c@$TSX&|1KS3gv@WCn@Pju(?@}I_KIlT z7^nB%UfZ&+LcqQDciR`iKN<@w2*o1Bj?pI#zwB$Qo3wRRu1M315stw0(cV07s0$kQ z0#E%YAONXL#4~&#ET>r%F`w1JBOq!*W$o%vY8K?lHtba>ZDn=DH9!D?BYx(&{ z0|?s~GSMrZ36NdAc5}ga!PMJg!<4+5;V$HYjRbofG0ifwz|72S>0wk3$|83YiPRT; z^GD(F@zk)fg2>>6s?WQ(50o9V{MgOjuuvK-ZlxsTO|D&545oCNF#*yq2|6X94)N8wdRpz z5y7UxpklDzkel`g(O_8;LQ=jr%H`+iv0W=nQ#k95=ZppbkL#pv@gR!jTd?4V5e79ryMP{Nb$C zB?z9I_|$$Bxh+dcPJXu&%TxxG0W_&#E{ECgV9d48eF5mHWqn>irL@^-0i9~T3MN9N zztp`=3Sn|Hub8JNYHEaJL8#DW$q@8%!cPM;# z4e1vcR__@;0^p*e3?v{~*tLm}Bm;AF40z~<@Il?tf!E!Yws#r3ZSYX>sP|O)3kSM9 zkaWfre$jMt3QFpHhnto|mBWH;u#nkUQGLbQ2#nk6UY<@yjEewI`z>R$|MR$or#H_c zRdgp}`OzVqT6gkf-7Q_rd#03%l-{<*Ha~Wj3Wer$dCAC^<=>$Qc=;4P zlvgxf^?@!T{f_qP`M|Da{34}@T6UHx083*W63Jv=+L=pB){I9;HR8Y5uMZu{_%$Q zovgJt?O!>ul}q&+_-=a^he{Vq&+U?5>c>2K84Urt4^eey-65ZW*nv+Mf;%dl^;K6y zg5{B$Xbht|a{{L&bG~%twOJ*7p?juk{swi_)nRYja>PCGu{ z|5PI2A*rcx%#u`^<7Ig>6Q7SlE`7+xEpQY z7$7J4^s#_OBQ)hG`A|O1H}t3>ZzbMZms7r-7^1cJ;*A)99z@fAYh6|xq2}&u=R3>w zoZN;R{n<`R(#yG^$Ta!J?@hk-PTMiJv(7o19Gxn8QPxe@0;KLL%^un<;zdu{eoC{7 zQl;J{D^$uP%gpMI=>|~6WX7i;kqg~vmhpKqjF*rLL@cY*G%{}w(5i#jQ#8$YS5fge zUswAe#KL#^+5>a>vlg03YK~}!vcYsWV@F`s*7Lhf(9WoU0B=J{Zh`5+3(tM$6v9zcdIN2`g$cfP%bU3V8pit4J; ztHsc((syU~CQwmP?d=MQ?9^1^G_XCo`!ijMsf-Uy6eM7{!50n{L02RAltV8RyYYH6 zfwqdQ9}S^$uPm#*L%@583fuA@@Kow+PC$6Ht>P*+2D7d&JE^W&a9YF-=lkep#wQ9O z@`xI}qOFBBpuuL?0p?igcuF{u_7Okgsu6gbdm7JEXh^8OZa@by(1~i_p zQ8KZgfl0$Ye3`#NzxF764AaJv~mfHn-Kgk0T zj&AbS1b~(*3bZ%eu~sjT)fsF_jJJ@T^(w&xaU{CEQ9kAPvpn z>oCt;q^x5O#1WL(#K_1_uQTFx9wk^N7>wRPhHBh>0YWFa9|f2b$+8|ntsw+{(V~-v(>hiZ7OQ~_)}`M%jPkpo z7ZvSHJ~|qD5yclO+#x6OT>&pw$9LdM+SSd=lZYp@3@J%#YbK!jeu9&%Nvd<_@(8zT z5Zlj`8NZ~F3)QSCxa2%FmP6totcc*$?u$Z!2FI#AdDX>Embp;mlNlYFxTiQ(1X=oY z!DL5h7j6+46m)b9t4%Ms3J)eW-Gk%58afL0H;q;~TPvX6UdoQ$#k%{{&|5sTSckBz zDHrTs;gaJGlvOcr5zlCGK~$oyha>4Uks<4 zO;#t1^aF8+Jq^2HRj!=#fX6+kZPPWrBtF=*Et=PW_@i@)D;qi;U@?rvgpL3!0&-cfyBUW2MKZ9NWQ;L}TvrzB_Q`VFV zmy}jpJ|{GCq1aF5^B_7Cai(f$g>~D4<=J zY>p%!9SXOu_I1(%DCmk=Xe^gI$<_<#KIq?$B&BnR;=W;(RKwSm?vscumpL;5^i-Sk zP%7KDgmiSRq}$TknUt_5W^vm*Q)rASZ*_O#w;9gwkpu)}af5^JBF(7mmR(u0vk+b4 zt~Vj7`TiksKLug=qyECl5>jy}U>B&XXE%W~6zKA4gL~r0FC$MS#OlB-kNw$Iz0+lg z#o4$uUeIy}W}H9k-CrAdMov)o-FkVEUUFE!PP!4CL`l!nuCBcRwD639%4EyMcwplz znvs<)J)-rdRL=VQy_pGKCvk_NGE?RCXL9kqaURp9$0b;#ZK7hGnSC_f(TB$H3E54{ zfsQ=(C=6-;!lqQKdoDS$Zi6p}|1mSvU)IxW0eiqxp|wie66hTXK$O|_kwnzk2V&sF zd5dMA-{Y-)D)TQsz(Ify&}f^oC66;Ia52CfU-uI|AZV1K4Qgu^9Lv^HMWS)=@!}3A zrrNtvU)j`N;)XVvIyV%6>{5cJOTbNYb%QFeC#l?qWSn^AKnrNmrR zrjo0oO0QbXq-w_b;&4<-Z>?4!rx+;$>RjlTIhxdyjvD6vmBP4FMW_o74~r=9j@pFj zb-cnI@a%7t)tFREbCNOsDUa|EH-C9Y38ZE@@-m9EKMso4#x4{)8vt3KvKH|^%%)>% zH=Ol?cR%Mv{6!ZU3X!&u@RY@F^pmYO^j+xu7l$u`;_TkfxNLvbTbRaPVKR!~S&51r zMW5?o8tms`V4g(P8qS{yD*ifz5~L=XaIs*SLwR@fJ~SwKr;5~%?os$;`?H@hsekzl z51ySMk>Q5%sU^}~qyP{RR<^-p%buU}P5!6|esEhq*~90xqbC#PX4`nnDlzzjz*g3G z^Op#0Q@7AevT5n*rG9jClCuuIGTDDZ>Jrah2nUi;bdw2E z2UZ5ee_ijt=%By31yk1xav1>x9vT)+v@&}VSEZTo)>uylk-tjkPbd&C8zcZh_^L&` ziK2o&f)hzX;QqfT`2P1toIy`^?!5?Ly$3 z_o&#o)iuDkeA>nM6sMkDRH*J~z%BRgW3!0c!=A04KI(+eVjHKUy*&+VhkZT92rAg& z)cwDiJ1`nAG-~Wso#I$_G~LGf&vdpIp&UpO@19csL8JUt@c-!Y{P|`TMlYcQS~gaa z5UO(=3K(~;=c5s-}d)o`O~jaZeBq_j~d%;Mk%_9Q4Ykz zH6)lt;4?MT2{vB8^k7nKya&DoMT*>xQB<}#o#eF)uWW6@nUR0i;r-)sr6Qpr2at&t z>DY^3SR>udeDKizmqw|A3`{==Ziu=;d7{nld3NELm_Ao6}W1V`DxOoR9l;L^1 zU;4Va-;w5P!eytg!r5%y79D1{N6aL_%>KXN$NdmCTxn9x4fqC`Z$fXabQ&OR#j(FY zb^F6SsIYsNzJ&Y6IBd!oW6iV~StNrUkU~n)pXWTG*~I0f z{-om26ZBIM!#~-(Fl|yY0m_e9Yjpb$AIgzse8J{X0n##h>)czh4T8 z;(xlD^ABMDdi=N5L*RS}t(W37av>5TB06b_3N8r(OJ~6`J~cX&T-LdS zj65!5j~<=Y6onG@O@smDg$!v){2tE#m8baD422RBuQ)Z~9IIcNzscDF_RLqRquWqu|~;hbCU9hihJjPmhfDr_!|Y z=Yp7Zo+u$({(;pS;ukh4D(Ivx@`J*HD42g*>z}$*Xh&&a3=maf6f)@U6C9hrfz{$N zWj-k;qtqrrYpYi)K#n81@DS69e(B6IVSc;}OO)UrJ?V@qM{FlIUv_PVw(- zGo*O-jU3I&t?cz=`YgOv=hC7RJyE`Gfj$k3OFS{S@ZpXQON@#u%=}yNyszwe``q@0 zBLUIh4VW8_^z|&vBvqHMVT~x)XqDip ze5>@rWXWOeq{{!ep29_%5ZnbHV3m^7>qO1Otrl`W>kJ+@?oUQ_dn~fgV=b@oUfVY1 zNyo3aS+u-Jg9JES0!zq2iI2h!RmjKnK=90W`V#XP+1^@8Hq`d7hwAwRVn{&cef7^UH@;?`mR zBQ;*Ta)upFt6W-sehSxEp$DBaE!U<*RM-LmReBHqPKy3s>;ccPjQnkzt(_I9*nv%S z{useo9%92p$uC4pK_RU{w@Oil`YTVri`?ZUWEDqVn1B;PVu~$kFY$2syK61-f4oos zH68dzPtCh@4I(uY;b$n}NL1ktoH&)X0+=n?f3NlauU{2nP#TuP-7s{v;Du0w&7-ti zzpeu+yPf~*@BXxGf4U5VdU3N@8q`lV2(V@xN?7HbJP~50`~`soo{uZ>1%n7hNdiw` zNOaTx$Pb{H7Hx~B4|^Q@OCi6IFW!S#zA|X)K^YnzJ|=8c4P|u0fs=@u zk<~r|JkB6HtQM4C%tE{-#VM;3n;%h(`KCx2xKt$ZDKOAM)bH&-WeO#QeQB5FEpsXj z`lIde6beUYH&cMYI~aRB8LD?;6c^RtK2(|pCv{1_1ObrWgi`MyHO7xcW$;jTVTfo* z!(2zvUc4f9E-eUe4@!>|vl7?JuHwUNHM%eScDtQPiH=N|WdAWq3hBdrvWEzf5AS?h zF_E}M{>k(e9^6He@cp8%_D6~H;zN(hzB5!v!VWx}8op(mO*zqS)tR{#{EyGH`NRYuXxA^OHztfFiyv;ymWu=Y zV`!*sEFZz_m+U@>qiEr+MRt4g9Mc3 zgNFKLnOq?r<%k31HY2ynVOBia!d2Z8p1@Z8xA!X=v@YmRy6%6wj54~r zQ%c+0FSlh+;f^!q`-iitXs?l|&Iv|B8tpcTUEZ}w;dk{?M0v3HVS5FTV|&O>nvdwf zeBGK$-Yarj8AR?)aN4>R5=KlB41pCt)yn;GRsT0*mHGwA)^?uv1sWd`@1KPxjLR$H z<`IwCH0$Z>z|1mG(y)v={z}3=)K) z%Kv{GQK${KJY_I!ve?{z}&4fn>RaiV!_7l$!g; zp#=Z8-J%t~dr58b7jxW3rl6D}yq#fhJf>6=1 zH$sy4e!Q-1HOT9qyzGA(4{aopmFHIs!l+L4@0q{l<|4_NjP4XAg~XFN+05^a1f#S zP9Gjg(Ta8vtMgMrY6LAakfj--ed#6KPIsb#2G1@$$TMymAtmME#J~c@j5#P51R{z8Q1t^i)+=?nJeZ=;+HNZ1f zqIp}azUoNS_jq{~nT?Ij;c(Af2?s=6_g`;{Mah5fubLbFEC!Nl&Sc zZQ3{O0w6t~m`+tW+Hn6|AJ1O~ErgOzpR9gdUc*fjf|KWFuus7i5)~F6PL@@OHsp10 zofZ1^6^)F+*9@cHc$3uJJW9%M#%|tBpA4|jsVhgX$BHy*%*Tty*If}=^O;53JRJZL zgpk7@vjl%$rvKwt1x4f^>6@qOXK)RGhLLdtt6H~Q9L${OQ2F*OSFPV_DBm#9f-IeY z%{Y+XyBA5Ss&HHXD;3PoK>ru2c0aZRDLFO?BhC^Yj~&>xG*gBpF|#o(*G@A0rIdx$ zdKs?Aa>m_{C-(V7Z9H)!BkZN(1xC2x7P>%Stv~da5BtZh^goF4zyHM-TnYL9PuUNA z!U}d2wQ4THEpY~Iw{Z&7? zntwFqQQ}_HtfFyxw{M1z!ux!r(7((!x+T$z?(gpdB0Wsb%S6=OUV$dz^yn{|^rzm7 ztNo?W69@bNpZ7p!f&IO~Eq5*49c2%Lt$C#v4eyy)&{qfsIh=zH^6oWdS{?tVN zd~=lQzoJ0=w}%(-pgxM)q)C!8ODPdvo9~|XgsLzw-NEpF`%#GE(*3tW|FOpUF(1In z6LF$thB3Nl297;hACO{iZOqu&y9bUd2GIV73U0C2DWa{s^Yqrdw#;MLo) z8S$>3`Vhu|w5RvHSjn(eM`)$JD1cHszL*p(lbV4SIZPocKAv8uEq%I=>CHTC^|nP4 zfJq*RX#Mh2lwE%qB%FKzre4U%k88g_5L3B)K~|V$9XL5u<>82kO(yH++Ktf^h-X=h zvB>*OyL^$~sz@PC=#oc~(ak!0kof-zFBRElPCsjhx$1WeVYS zf=qxDb*QMvBBP?7ml<}0OV86SII}C$iK}V*!%P2}M0gb-Ek;(sDfD9lWc4{%J{fFU zpTGBdWST;Inl#e)!{j%$JZ!j}g)Zf!x6vylvAHCwXO20b&AfE^!uDNA49VroRIx*J&eG{hAB5$o6a(SpzEaF+m=&Egp zsZKdbzoM1n;o^CXX{o9yc4Woa;gnBus9-IlL(w0sxl?et7T_@?$KW%Nj>5S;Nz=i< zdvjwEbDAd@6ssU_}rYhT%>hxu^_cIZ$3zj zGIU5E@~G-3>y`{(dWW;Qal|yIAVjT(`>$B!wFst{QhT`gGRqqFKkDe*P;NX;IOe!M z_LfzI7}};uZs*_F+ZfclB8Mf?ynM=m)+a95nnmrYqAMca9a9+AONeLYMyd_NZ4*y1 zy&H?U_J%W?gBSH59s)&+js!%Cy2&KFvsx|LVc=zn+ z@U5u?rcdlQ=S+6317inKv#GBcG`s-4)4heTPZB=eo>Hs$K=N(SX=j=W9iQ1QWFTGC z-gLS~F)bt}K8AW+8yZMyJ-HQR|84%`vReblezmhFt~}{lNmJHu9r>);Nj_+fM z*;;u&0WS3z3#mZDRZqVN#x-l8xkra7_K^v7vGxSpRPPzEPh-xBoIsaW@>3)nsOUvP zlT8kDxyxNqHID^xkNb|R(rZS6EpTdqSimuNaX+n8JeWW?QF()Z%jIoWkg1jbJ()t?(3KM3oA9W{##~p$$qVBZ6WR!-)zw@?C;f z<-o8cUnP$mXeGDHCk3b=d<9ma5rXy{Dyrfr6k`h0clM-A=v z+wgJD(v5rLDV%4nQ!}?F6u-Zm`0aOfLu=|q08?ICTlEO9xF)#Cd-EdAS3v1ByL%zH z-XPY`xF9&L4xC*u&CIsLH}tUXjQ54|0ut22IphiBV7hAADI!wp%AMOQ;z^B4>uWrL zG9%qS+u{3%R|ATB1z?Mr?IURV6yI5!p37cTNSR*u&UflI0VvGl93C_p-miw2Ypz}$ zUm;n*yn1X-zfJTyA2#FY&P%{6c%BO0B1rdQEZ!bGg_HHmo#4gADBtCh#|a@Ylzisv zcHA|C`_MLv*4HSF;?gM+_|&|k0cIn)in%}{|9M+`*;tXKxpCJ&v>&PL=s{2UMYf3i z##@ACf9C>VazC1Zd&zyF-8?^m>P2|mvrLq!*Dq=ALXrZsfw0`}phSq9N5GS}Wu(K- z6!*`jUVIP|MoA_*E^|NHH!ia#ncLA-5IOm8>*+N_VKb;%ezm7~zp?fKHihY;OrOYn7b)2{N_~viE#Of?y&`|4j{_JS(19-H~NA zy?L?|w*-+oRk0~dPwhdunRtK7uxt^@&?LyUA$!~E+2l$pYFNQ!#JGn>)o6mDMmTZ{ zS*FApoLMLKNVm`%cSbvc8Jv}CI!rCsmX5Gr>GZm1WmiMGYH&IE6nqVDXSDd7N4ok& z;LmQ*znQn+w=ZyukO#8WptZnBi?}2fW-x(3*}hTn3|;w{SQ8oO{Ug{XgG&uhQ}-df z(wC+WaKLZBwzMhEX8@$1I8G8L|9=ia>h;^+6aI(_P%r3&%r)bBWGWO6h*NazBMa)= zhMH<<$gYg$Ws$hAiNlCfD{!}ZrBbV8R#x!UF5kK3jNGk* z+}h-qlzz+XLa+i)n)E$_vDzkfzDzr-1fESZus^<=3YzbgWp&oJ^F@Q>O~9T^!A(&x z*1t5h{RO-K`7GhH);{xGuoh32rby`_lS%pEUQy+X#fkGrR+?&Zo3je8oQ3KG!*uqS zh6b~=a=fs zSy40hmzrabdtW|VwodGbQ#W^lgNpmHc~{?x=J4(4P;+UP8zs44t*@5poztt=TP3L! zf@R}3@wbv4hF%ajOn7Pm;OsI(m`ozO`bxhh=^;LIgpX7-aF`f1Krt?2xE4l1d1mx@LLMw##!~|&T zN(gG0Kbdyw9IpeovEz6g>+GAue3SBFk{y`a2H(_MvqS@pnt8_(5zU>qO=nUu#adLn zM@<=k$19a1_k3yVx7MWdH}_}$8m z0Ae5%`_DMyM0L zM;rg)0m)!d^0RcVqScYUQKGe!GpD?*$pq%!4REh1TMqPc=lWo+!3MFc)gK~$!!D@o-|-%Je{chz~PKGd3JyHZNIglc!12LE=r zaGEvO^0|u;LzRPr~AWCeMTLm^nd`^0$RbBMoPwLr(${FkLC zIlJE<{BVC(%a?NOIag|dPgEZor8A$ZC}(^eBQTzo*C?o;h%LFDa9 zt7`)OQQIsVGw}r9l-pFy$Th1`ms#y`28z0Kq`3SxB^31X()`2%f>rTxJb8FSiOV#a z&RqXyq8k*_JC_q3FEG6NeOvm1yO?hCaPsG(u#qAX}9$s%DqA8<-N98ugF;g_=)Ywhl?KnsEU?4V7pU3d|IQ{oVr+4xorCYfN zW2c~0Yi1__wFa(L=YE>a&xWQTf!Q14irny~aUOq)>on|eXPtUNXUMBPL7q3xrY73; z4l(EGcsyj3=#M$9$42t>qQb%sb@!ZR!N(>^9uvCdPD#q=@D_1SynpJaZ6jfY%G$~8 z`=u2IQcmkfhglSeH%Uc^w=+kRQRshUI9M#xw)Uy8_9i}Q!8t#<@bVRqM<+qN;k1Ie zo`WLGYPXa5-IfNM1?c9?X=%+hGt-DRt!EqZf?N(slp0+t3lct|7+KXX&gM$Jt_t72 zoHtr?-dU)9+h3>~35r(#KrT*VhT`x(iQDY}VC^yW@&98pX1& zc|>MiP9e4H?dHG~^xCALw*nB? z?ir{H?FJ#BZ(^dh=@22(_y0Qxiz*P>&JRz$JsPdO)wbkHmv27&G{^rAoy5`Iq`_j? zw4`_3rtgw%tXsRII#OJ2{i)V+{}jf~hnpMwDzuzV!j-s;v}CB9Hq6W0>A>bK6rJ>{ z#-RMop3%Y()607jBz@DQb1bu4B&%tW%2^*~4M;5PE6O%#?5F22rp7}tK`7PTrZ*eV z{^)TU@%tQ%J_h60?MtHvbKRFK6|iCJuSLVU*Q(Uimc3OoXxG#4uB#ypLU_}>ug%P} zh|Jxv4B%>nV_lQp<8|N>b^EX_j4YxJd*AzjEeIfr{T68$Q?uUE9YOI6 z$OYb)Q?}Vf6U_4F@6GnFMY7amUWnRgt_13&R{D)F52glJCJ201qr6|zUymo?s_=m! zE6=bHKJvQNo;OlCLvE1%A;dvcFi(^JfEa(8v{a0$cKLIaoz-0S!K$-ScQs)FT|Q@t zqjv4WUd)hEN@RhhzaM?05w2fT{d~zYkvI_S&n)q_VNRJi~bt6W@$}L@~*b|O>;)j z;sD31GDHq^UL6jI4%+`IYCbCJO8`^7q4%tonx=I`>41VF z$B!J?hLlrKOBEK-%o=R$MTU;4?wOm)^i*IYYmUcCKlb!wVo}~05U!00ojNnew6n7? z`*ZN~^~vyRql`1h3z^#aY~Jg=aLc(Ic@_d26DV|U&Le?E|K^+pstaq-*VnXZH+S3| zv%M&|ExCK$xbrw^*6FfQ&ZeUXNP2S)r9pUa*EQbsMXE2VB9f@v(!O;}SJd*9e#rX^hGsF}&@I&KzF;#rnJY!p zIPviH+yi7t!7GLS?8?N^%ZkSe1*L+Ymr(;7UNSz2u59Fj6wYy^%j-h{BFxxkUK-6a zc;5_t`5Wm$G)m(u3LeU2M=kqqLIJa^yQt_QE*>Y()TzM5>ZD)B?pK#O>ge7t#2d}l zarnFu?GH-_)MC|h8k4K}EeyMpHG&Fw{a`(ddJ3dzBQ>Z?fo}1qWaqnm4 z0Y)1q^a}wYVY$(0C}T;?_?Tu&f6Zp|r*jj?Emjt@yTQ2OXq~quq~;=a+&QRe;gFuz35%>aSU1ri;Ih{t3xrdzSVvPr%~U0B)tgU@@Zd0eoddR?`snx% zJ#$GkcTVRF`}ddGb3CJZP)%FmzW(;Im)k^*+fRKlxYSj%GVg!vvh9}-M_gF0qZIl? zar`Uh5p|tGDdm~CeB+yL-4v`sQMWtGyS$br9^k85fZ%@#y*T73vz&6uNgup8Cd!hG z6uU8nT&&+-ooiYX&>1J&=KDEJC-7EV%~0d(IK%-lC)w@$V+;aTgOUn>y}6I?kbU)C zv`Po;;V%6_n}}K*KLxFM0&;9i}b{usp`2ro#SzF zlCY5HlOPdIN9y0x+ff2uU4(?S210BE8O;=${%nmY30%Ppki%iVjS9+3p<`E)a>s+vvOOJK6RqO^393Ra0`A)$?B ze}-j0tQFo%-KKlI&xAqQG4t38VG{%>^t)sPlnA37b@Cx zuSepvm*hWk;KQ`^dSBhSzO|0n8hYX7D~)Gfi4QX~n1`X9V%S!#?+tJpC!qv12pEfg z@2E!S>Vyk9CXO?&rS;ph<>Bnk%2=mFGQYRae)9>QPYcP%P4hbq@+oaM;dsV^|FQy- z4tCsFggPPg`!9zDyR`~cDuF2V346JjTE)U|do6S+ChrRxs@YoKG1SYU<8F^^y!*;| zk*=de_3Tsm4VF<+tT9xJS&+$|VO)cI&$95TLjxGIY^=n{@VomgJ%NG!o0`IjgZ_yw^vQ8M;j2P#Fy>^CSN8 zcZ));|N8I#b?dAD!J4jYU)o7`)*wI=;`6d_Y zJTZsATv$7wUXmx<0u*=M4b(P!+a!U)%_`T)&>ejsgKfb6eV}Qms?dWWlzBY&xAPAs zhhxT@7DQ7qKy&~574G}LXC(hFS&j{dc{;cDuJaSFIL7i>uLiF_r|9QhDM|BFvyHmT$2|CYw=Wzxf<1(8NvTB&uNN}9AKAa|!ZCrl% z1nOkOWMY5vX&$(NXLA(B5PH3RH-~VjkV}`v|9HctKH5J|mC5xe{PJoq+*wwh@1_KL zBOUWvO{i>OXl=aXZ1eVJDMN9dLeuuDL_fU+{NqH8X22^^DbkYEffz=S0P%ifK3EjO z*#3K>qXoSooh(Y&a^vEj`j=%5j0dAl*F@_F@b`^g9$u(Y=?q?HL>-??iDsb#bK#AE zxg3-aW_-+^vsB`96HBmgOFd7ZH?KAj(_Sm528%`0%Q9Bs$cO2FxgYx%+b#@}Ym zb$g^wjFQ%mRO#eW+wmHRj#mq&ep7w-E#HT6Fo0}qV`KO1Is0_vxYI3uc)p@|1&k)6 zZ)asL(^`K5AHSz|HCO8+Z=HU+mOyT;^1I_(x!o;yb#FjZKc6y<&Hw_CrO^G>bcr{e zyFINvS=Rmg)vjvyp2nKNI{_yf4PC?C&M@;;S1$?kUUhZcDF=MMauEM`uT^}^_+2hb zk$_5_X>>F!#Dp%#wAFLu@i&4F}1vyvsC$1HPE|8AE=5b{oV^4 z516T(gL%V~us)ms;!o?zoZkV?EiNqBh>_j zF^X+IyVc;RAGUnMg4a#m_-@8rQp07n)|MereA9JwDf+PfQuSklWtp7y5Yf`&JzP-3 zaiPO49^q?^!e~$d;lN#{tVI-WopF6POCK=TK0T2OWcDcQu&!I2kXB+apN6wf3PT!E z6Kn?F@2G0RxrQ`5aa6m8slGm#6&w$2P_3R=KDIx7=bHTd$el5)(xYQG*U}reR41`SDVaONe#8|P!n#>Rk#X^c zme@$&J}cTGpscs;}$rj&?YpwEsxwMCvz<3nB(kytFO7*LonzgU`)j?L4 zsvQld5^gL!JLkG(sqe0AE^->8aU&2a(2jRKk?<};2LW&sY&|Q zJ@^r5;{j+jaUM7l#W_zUPidse&@xSXY7CTYr+nR_hfb<4EiHWrqf{5_Hvfnfpn|t| z(U6A{gNnJv0-U)SJzQzBAMxR_kXb@E$NSZm-w{SqDW0lJB^^tKQ%j>MYMtZgoZ`OW z1*}8OsL99?Q0m)a%G`3Vo^=WObM1x;u=tS>-&+j_oXL}`QMc4Zw>~LE&E(io`qoD^ zto9g)Ttocg8dir8VI<39U(h*m$5Hrg#bWtLHVSpe)-F{Xa{G~FbS@XF;pXj|=yFV9 z#woqq{B0VmVx{-^zCsRI1$9OKKhnN4ps6iuTTui-M5RgZ(m|#7CcR1ty-Dv7YN&z~ z1t|dn(ggyD5PI*3NC)X1RC*1)hkVC*-_v-=>Kd~^B8k|Y*o5Y?TE zD)!W8WT_c1GxvpZ&2sQLf?E*cHQTu511)BSG{P15e@9npTWOj|7pTUIQew61A?Evb z`5UoEO+2o-l|=^HPNLNa4lDa(UsqKQS}_-XFH?HlI&Vjb!s&U3zJj^S9n4tJ<{4!B z$Mt^Hwc$YPVlNE&hU2_QZP#+o>@e%C*+y1n;?n);TE-ou4D9GKtTN{2!^R^)6&=jz z%&MnKMM5O%I>mR#%YDMm)Od6BgAMCB1M;mF z^x(@~)ztCg4X$Iy=LV1FMY>F)c^9?8)gIdwT9iIU3#lB})_7BEI_dB@RYyy|dHXwG zxDSL;u(3lfAS1coPn4VmH+dk|OHD#rPPphv-x9H+&*@dI9@By5`yZ+G1m57tbKV#K zHA;NY1A<))8RF4BR^nyPr!DiY&zuT##;4wmZ#~4yK^bGe*@YH1J1+#(9aZ}-O{{a9 zi{SxUJ+WV+$a{u!d()5foHbRHi zlimqRd&i{yMaV0+j{oJf?F1tJ0R#>JF%c#8Iqbn@*cR?*DL~}Yaq9J+U${o!zydi;L}+5#8jR3gO!=QyAjLGUvWY;( z>6NUkqo!H0Pc$clVyp)?SSRppwPV}M)MzmqzpB%QyL#3ncRhk zzoPzbJ~sZ%G*`lVFT2Lds?g6OwOZxv)zfe?*y8eQ&!c_6FCfw)0sS0(SkB$}Og9Hz zZXc7vYezLD@k_;vGm*rv4^l%5w#>A*j|*2%BKdlw$cPOo?&6=5TP06<(V)l1%I`eC zOMD~t*vUSSqTL9}JDp6*1h7=G)cBMBDeLz8_Tz83fTcmJ6K8of*j_&aL;kEz|8GpI z%dON2NAu8F_@-%W4EvHJ&a?%8UWK(c8SoKRU4a_*l%{Y;=9ISGUvMN?ou@3Vji~1Hjn!qM6TZ)9wdy z2kEV_P->eF`rS96x-uMj>qEOOtpe7FoV(j=0Rzk*BNQQm`HPvEbR!@cv z%efzUwHUPX5jS>EgFlugdNjltS5K%*rk;@D?x2$ffq<{XNvs}mXH&yu3&lCPg_>b) zRT<%OuJi6=KjXRAcgLx-ku7#zOH893ARiBYiTa{P#8C76dUyOU z(WA{4sEa*Z8|sG``gDhu1C*V*%?zx|4F!Tnmkic152K}_k@P6&~B4)Wwj)BTvs9VDuZIK=X zZ;636aac`_A{k15#n}HzOO+VnZEmS$8)*={5@EukF59L*$ zib+2Iva@IP_DFWMH$Mu0SY6Gsi8e43gn1_4u1H?>Ada`eI`A2?3#qNTioCQT`tYv& zMdXDgmf-gO!Tz=&V)$ToqvT>gi|xTp@XW3Ig@h=LkZkXr^N)q1 zJECPxx|ncryV~yth{_k+Q6}R8V>K{Ww-9D_FU*4~4%FSKJp4*i0=iAnTR z4}o;|j>GwzW>v*<(St=W;=`DJ<3s}{;%B~D4Be0NL#EH1yM#V=K7*DieGb-xI1=x( zMOWLdirK=ml`j9RF+GX5H6h_cDE8aON21_I(D6HZbV;4)i2g5GqSn(2v8g* z2e2WJ=Pn|*EdD|86!{`yjNRRA)L1>gW{#g)(glkV$piW#3RQrTnL(#rpj*<4J2iJ2 zeDm}3dw*tsH=P?f0Ns9f;Tz(q{LZWshW^P5+~!}{1I0F#H+E*7AN1Gz+Zs`Um%d*W zH1V!bKFQH_3sB;+%j;FO}Ds`0UoD9`_up##PU5-{&{t*4r;g|CjdC zQ`_o}cyI^tP z>|mexGqCsvEU)f0O||H4e;gpTz2IJo>b8I3i~`>h_`qt);wYwH^FWLk-Z-{6v^)iNw%_@&dl0vD6)*gsMz6^oe$zIN@!`} z>A`(4@rz<@3B*C;Z^o8B93S!cxl71K89cYhw=|!62P6n`1X4m{GsFrD9j;o;2HIB; zCD}FAj?)4+4XT}B>B4j5Vy_+%KlZsu55#J?JOdO8jf?A#ACaQYAJ$!DU@_9upWou1 zaq0e%dvz>YC8SY0R$$O+l7{GH!AIznP{qAln}23c^xoKeZ_FXd<6GPk~h zRN==W{fT0g!~NSdO$D@hMc<1{TFxYmDN%_n;(u2KRTsNCFlxtQ>}w#+Xl%N$d64Hh za?#2ZxKEt^RYe7_mrz@{Oi4N)93E9;J0W&jctAo^{i06=% z>66uSvk$t`5Zb(SUwi>rNV(HN)veF-qY~;)2;-=ps||%-IwDx3Dy|ac6z7oMY)+ze z6Q8Kn*G)YHpWDf5`e$9NEK|Dtwz0W9JidYD*Rm(rAA29&=V+1% z6!HiqSFemdxR5bUy}G4mH83>Mq>aluaD4C-AwcdFUR7|=U^dXE-_2aZIzZgm2mpQa zvCl_r$;d=Dt4u6Qnpc`U-Q`aFTMewpIPQ^HXU20t2%Wy`MN&fWowbKh9BWZse-C^A z69biI0R!M|83UZHk0K=t51hs#eE3UX$S1+VeZ%D69oX%G>cNiW{hYO%#sQXWOFV`9Oj;SRayTlbww$gv+sQR%A|9`Y)9&00B21a zh~F%ax9Y&1=_g8s;~a3E!5#4DZ<5bv5@DgWwE~c{4(la+5);mg^t`M z@Ju@1BmIfu1)3bWnESX)dYhwlIkSF?RnLZ_ydom8U(2T1z9JCrVk6K| zhydZ1yCL`2yagq1Xp>!CZqI zQ?+g_e!SvS1vU@9#qfrtWo4#X6{)(8r(gAy3_Pqh%?$jg6YX^_URR#!4zXxF@I%*H zMDkqpo`5f09ghw`DrGN+NLn1@N=Tf*)m7B1M~-x`A9D@J8U7EPjs%6h`&jnORRKQSLw!VM)4^s6ivR$6qF5?{x>pu<>xl3#oZS-&v+nNX z5UY@j^XjrKB@soXhKq{O{V|Ulmm_sZ2LEjp{bjD1J}iBdwLBKT`lw`KrKqQmbs6df zFYe&c@of8VZ7cZ*n@ z4lq=o;F4Rh-jCG?_{!B8aM560E6mZ4Pm}KP#TICvVxqL4*FVr+P{b|d^E#0urT635 zPEBJ2|5@#3Aqc^WKO0yxi*7YZk52wsZ1keaz^PvKXE@_FpRcvL@e8N@Ji>N_$ zELd*oESv#I+~8bIH}_yOO@kNm&Bp)V5XBNzinPgoGv9|*q`7S`=5R^{a!S6YERCnZXz#&n-?k8weivnC_Fk^V_y@%T zD@D{5q^e?r2M;@a7Lmp6tQ{NBR1$u|Vcjx{qbt*E!6-0A_cpL&1ObD+8Ed zX&z8T4P)w&moEtd2e3^s5DJ|Snt+1>$0~#e0zoJ+#K9I1So(O$8&PsW{w*cGabr6yc>V1 zLTy|~LG3?SkI4{6MZpT%W&kxvNNbDFd+Qcy2V{!I;Of&&DCH`1nRXSP>=r zT$l<Y7wLv z)N9au_Kt5LQ`mVbkC+dKxUB5tB|V_2T0lMwRVEQy3xBuXHaXtTsU6L(P z4x-=!)qZ5JXJEDN+m#|0<6-Pupq9x@;6$|)lHVA`XMb()IpXGO6|X+yPT?8UtymKg zcOa5~iMmPZwMdifw`r<({PhXgFR9BnUE9ZpGn@v_?}~6GlmR?0AXSmkfB45D0fQtOj5pQZ1KMj$=!^gK{8ymAE=kkHNBs9j zYt0Z8)y#f1+FWE$e8QCFr#}+KK3EE)b+lOe3TiRH>pu1km{la@4XC3QJKx=JZfP+2 zK3IDgT^itD?gmy#sa*&#)*o<3U!lq^T;m+%RTF`(sY(r=j*Q~885{;R-P64G9eErE z)v@CU{SAL6D0z1PQivZQ*is66$}h@B!2v)h!1>^5MF5aXEB84fQyA=uB^xVLQo^&G z;wkC>NPz%N2zl5ky*ht0+YqlKQ2jq?;`bETMWc!=2mD(Jxv8E?zIgk0#=kvR!8;=K z0w9%|fc!1B!PxpSR;9re-rmp1gKpuI?yV}8asxI+4;yvqdK<>9%SzGug(aeyQE?Ta zjVofOaz*VkThA@MLQQyLK-k7~ZQd0piLWzm>bo*bQdV1!!hxu}&}ck+dB3}omEV|; zlkGD=_6pOD1}WpkMS-dtmbgIEBd)c}FpCp6>zrFyNH=TM)x<28M0eCd4O*gpv~Kev zjgPGgMf|v&RUQb{GxFUia@umST68ZP#^UyQbgB4-^31dS0;L%Y`M8*Sc8IS|t?N@u$Ae29-zA^DaHTnkXEFwyI3yF%#8^ z*u<(pH4`S1MnUe{=}hVzqI}M~!ZGPJ3T$;MM-$6D=GtGHzea$GB`%w)K_)q!Estdu zQoUpx?Xp@FYVIUv^uGuvc||^G(xNorx2;o#quiEw_-$yoxcNeFZ%2)!XK{fOuQ)m- z5L9R}_u;yXeGB^n=c|l!7CV1iy~(T7vhT_fsWRP22=6eO&kT}STf6J)d@4Gc{%l^I z0K0A}DRKK(mMKuk_KL}L;oAkOD+mlA6U%3NY|Cb-Y7<uhXmD&44ZN3pWqTpPBhHhWOIgms1igCPodezY`b zGN-ZXoQ$koPBK+nbYn8hNYcw%{O?F~I|j&~IUna)2ShJ-S!Cb0AI}~{T)3q5)e811 zdM9>G1V<J?+-`Rr8yk}6k+YV(&X znjD`^Wq8>WOH>RFW%f_gyoFDteIJMMj$yCPz5K+ zDOwcDBLD|is~}zsk;m)w5|H62j^oJd%?vcHgFlamch3Q-VIW0u*g5G%)4o@xsD8Yl z&}>kv$2rlXUN-%xNtO%9vH7d|r+O}n-@Rim%-~KFvTD`}% zA!67>pN&SFFtC{5?`1|mYg_lZBrxHZsbzANFST!%Zx}mP_Neu<-d61>VFVhPO(j;Y z;VF4{v(o8}Ri2YQn=UfTVNBJi&=xsw(yV;Ku3V}8N(qEoPgGF5=z5+xCBRAb_R>rL2-8pj?5NVef!>K|L7; zU&1`1j)$Rw0g%ZFpeVXI&ZR8JWnP}?dyjmzzBNHMA1A)fAn(83>EFDNzj-Um%B{gN z{C6C;MS7-kT?K#7gJER-#uzgjUpfgrve*z0xXHq;D#hp%O+oR`ui!sL$p21GiZG%X zPW{~!D~v)*-n2SRyTy;FG-1k-R~`nfan&obw7 zrh%cqbYqG4wKqR8#;`{bs#5C3%#gpKeSW>5HUmHUzZXXVCR>8#{%cmdgxppri6~BI ze8@Eo7Rayw-mj4d{(VmW_7);^Xw;9HT}=7C6AEOYvqv{$F$DgaEVa7p%|<fGr@_VgvFkA8v9z58F<+#hU} z-<{2W8gUSq^&T~KiH?;keH7W$vsbd??A}Y^F`qW2wIsj}r@sih{@ZB(W``s&2}(ae zZ^fj2hLQ_|&E+{?ahJ?x^|=TY1h2c){hk&2<^O4!UXLURU6kc>J&+styd5->fZ93D$DafA#H)Nz2WKUyNR#Sj0>$^F~cf^gVlp`^tD7Pt7Q z2k53={3OCLs$cKcwfSp9r3mW#00{aXLIFYFO&UPZ7piXc7@_6*wpQaWSr$Ob!H{{$ z*f&i!n(mCA$!7^OhCRZ9gV37%uL!jetqmRCqqryW{thm}iMk%fZ7lRD1%OcQ(|>CQwbKIq7uTH0+3ny5 zd|I`DZqrYSLcO#EL0KXFa|`eu_~UU-w1$l+2iVGnZJW zt%uw>@}OF*a?)cc3|^`V!R+Nz^zjL+>8pH)xiS9HuupEu<=5Umkk$U6S(E6nP@VI_ zkX`4^Zw`1u=u6pHIAo3$eDobXIPc#or=9Ch5oq;PVvQ1GxIvx>LIm50pp-GfzCrn3R8zO99ryWtj^bQB=cZ1#4bR)MNekk zX866b_qYQyZtV~Ed8~XOlc0I6^{kQNRuJ92(uMeQst z4V!o&p>Z}?n|%Sl_J}~|Al>(VFS2d0|5cYew&kVKwT`FIcVtI;G#6%0k}53yjhUdf%)q}6?G=@4nEX0n zEU6pLKw)uL#*NKm<54n-fMH2Xx@YCPmTrUvxi!%*njM;L9p6>AH_@ln~#YM`un)s%MOhqBB%QbT3=K6WdsSgnHN; z$`p&0Me`Ja27H`_kR#Fs{sbRv;b>$pMITFuMbfD2cwb&$Utf_6CrfTSUhAIBhnJr< ze}!DqIz(%VR{2Wz{D5CFbGY$VVb@0%>RlYE0O{p*@;SGasZ>e_oGq-EUo#>b)QJI`FR{5b17Hi06 ztfzB!^2f-w6|WZ+{bxq+OoC#Tyu#gJeAiL;--}~?T4~8gltRy@-itG(eU!88VUYiP zx%JiY{D6T%>~$vTii%;4vFJes(*r<*kFtAH2AdjIEf;(7ORX+~UJ+rxIV1nje_Jt{ z`|nx+;iBbIdKzE+uB61jWd*WT0V=SmDmfa%ZRh3GzY&B{7rNQUm9P>+AW?th`fmDR9B*XTm@0icR2KhdXez0KPjGwqqBf0@*Ilp<_ zMt>g06>S0c4RZgF4%7dfYB>@T;wEPPyV5u0R$h^q9q{*Ah4T7Ye5BLUjy-(jmpLkc zv-3vjUtBZhyVozgDKFyGI(b^Adfjlw9fDHETE^$ zW7a77!KF;M(_Rw&+DY=B5L+Oyq9UNR{X7;HfZgl&nBL+FWV3oe>UaE+Py~CH?l-T; z1smhsHDJ|Ce)Hh+ydn3B;36$hf%$3ngt@kPdBA$rjeGh>T~|s1%Dc?t{3E~#?^1j7 z5G}Yqh(#b&&Xy-Q7Ms>1H?9^fE!2?C643;8Ys~bZIS#Dv3w@To5>+Dp@Rywe2<}?= z(=`0xbu5X>2XQFDI~UIW<1Hw`PHWzMF$RNw34;`~UKaQg;!-3p&~1wsOSzJemJOD) zEQA#)%HP(9bQtDbGu|Am*Vor7E@pdSjJ+lbdEG=b@FY z|1s+-=iA?2hfQ`yFSQVx|Q?OiW0eA?o?4DRC{}-S&7@`Dg>qQ*?jT14)@o#+doAf|CsTg z|LZc5(3H!wC1XjH8NTm3ipvC$&NP1D{@N`4!SvFwdzH7{0zI-A)K}U zwcGc%8S=wuE|+V5F6^CP87zP72{iqosQ=Zq|GU>EP+iae0zr-~;x5 z*}MPo)%<2AnYA&lK0sTjpV7P|JT(1#P4Az($N#R6Aai3HZtjs;^P&x?RgB*meFxUyHeI@4c4InRh(jAQ$Y2oy{s@zm4_Cw_)fnhTP^_G_0xHas409_XjKepT3ds^m-Io@;4|%_ z>A96a8j%tc>?x%a$!}K5pR@u&8tm`)vUO+WNj$H*^e1y@M{2Oz^I$KSohbj(ZHJjm z!z01)=rsAb>w6fA-)(sG&qHeeA;I=X7UTaMy<(XJ4;u(2k5@_EOSf)ElV-sO_^5F9 zzq8E$&oBSsUQvvZ0KNYJO%fY61{K|nqkQ(@w)NSFVs7Va;a~C$|7e=tkK%-UGP{_U zegs}xjwxD$5{L{l$5qSAGyPg%@`qFOp76F!ZC7L35839oP@q|xwEQCiqv(ZVE# zCZ7yWQQtIA!dbkezhpxt_OL^w^sloROwn`y=!kAaWU-G#tUkr{9LIa)aM)9bzK=(p zn~!AustRM(t_+s9wZ&#tlTBFr)WXp8^C2Ka`J&Arhm9!XvU4|Kum;6`OxcV~;{jVQX zjqqp~<(VB=Y0grN&X{|to*aD2!-#Ws+wmUVXU-R%E{Zr0Qc_ z#;bpYL;jSzB4JD1#ip6Scpk&2iP`NQya#`wMSig(pjYn@3QT?#D>czkt_?4vXmy79 zC|geC`7Q;ON7NsQoJ%y8tMAh;ynTcdP9U!_-mCivorU=KDmk zm2}U2&NDOIs}Q>A?Gs&~Y2A}ha4hJiZ2Cvb_?OQ6AaldkyX1nrF@60&G5G-b+0N`8t5Ajq zIG?);N9XPSKj+ zp`Gs{ z+BFs(M!tW#|DPJn&xoCrbN#4LHNC14aiTiEhQYN;*q|F;Rc%Y^P|zDEk1_JZARH zIkp28;l#-U^P;GvRKtldM!_-sxiXRk$5Qfv*%_$oLb&tz%sc2+n5Wt>!Y?u82kM4L zw%th9J}dtf`zZ14-Gg1mm~v%t(CzMmmrJvDWmvI^95sdaj3xtLdZ<)btAL9+IyDNZ zMTPBCcz5ur*I(X>trVTjFRAL=R+`W}uT4$l1o}HfO8zQ9@q26heZuY29NDXYSXv50 zjwyQrVicY5@eYhiC8Z7)a~Qz{>|D)w9Yq-U4R~m8Tk%-Mnq0!n!Yfg%BKm$XsxOrj#|Z1y|ATSw#u4DAjXnfN&% z7N!slT1xClr^tyRx3#)T!PRK~m?wYXP``dNT06)^cay9`LvHGUoH23t{Jq-hFoTV5h=IoL$3FeCBJ+A*wzA{(Dzz_aZ^3r!82g@aT(RS_Z<0VU1xAi-=t(x$qbMJ zIWJftbXby@^??F1xif9?a?i&mhlbPoRpo_TdTf4w&8tqpewOnbsp?-qpZ_pUI043Z zKiwfodH+~2t_iRnNrPf&#XRM7TK>CK4^Kwpbr7)y-E0U)YObpeeW1Br_{AYCGTK?^ z+c&7&ZnvhD?i?r63Y9l_rTqT`yVy8ea}8?4!(NzJi$!Ba&k?$4VeSFOCx5NLQ9v00ZQd6unQ!|lG7;(2^SwTh2N=b-VMx`Vrz$XLy(Py4HeH0$gQQ#(> ztSdYMW8n@Bxv?8Ge-g^iNDXU+66>O7sLq_m`08rS;}W7mVh+~@eGmHQy?94x>MpT>NpRZUdYY0CH{& zITGJTGEw6)GdiPH#Plu;5AEH8XQvS1hj!B!7Cqa`NIE_61QL|5WbnN}VzRR>| zCuoUheRJPSI6X(n^x~Lu|MLQR+4wM4*oi~Sbn${ZAOR3P)x7}9DP@bPy{mkSe(Z>d zUScXJOfjd}pbj#T2`RiENlqADuMBT~@fVP6MqhOrR!3<2=hYWTY38ds+6GD)2(H5k z+)yXYSNv^At_E4YcgUvdROfoh;--}z!x$qCKIL=I2*14!bWyM1ftNqrc|mL^Hx~}? zvD7i7PfqrPbS24(&{GOky48&Q7ux`EYit_jP0D1pkZCb8amtJgC1e^56r5K$>?gAx z4ayl$rGKt{x0SvmP9vcy66fXtwJ91lWV0IJT6~YDbdZY?_1I7@Jcnk)CpNV9a*ua4 z5fFFp+&IRnMse3{3(}nHzl-DKQZ?WpsVro3HknZ9Nn*LO?hZ_6EJGi{VLO)FgMD#2 z*2S=f3m%WoH3}mP-{UP9&;zB81d$b0bH&|*<5&9%;+~ii;V^I|?77AM{5rfqGru>l z-=L_l<#IprHqG*$Kl_f#!3t_gOb)Y-7$M|65j(Rq>vpm7PAo9!w(OTra`moTllajQ z*M`BGGD8q9?Gj^-dlKh|BZITM(D@N8>S(5y@O$B3H^z%uV(?M%4%6i_89v8EoAMJT zZpjon;tF}HnT(p&mo!HzXnd=pyxT2AUSCo7oM1+OHb@RK*Kds`S(c|1gfh4x%Ut4a z(}m^?rCpDwM`+f88A)9_7{_g?A(xqPiHSSLpJX~~*y47fRGKjemBHLqcn3-C`dsF6 z4D}@$(3;mdMlDbQwn&}H&LVu=G1K=>?Y(cLX>74|@3(qq*0~&Y)3J{h5Y$mk^e48} zIHma3Vxxwoy%up6wX4l!iki8P+De*7J-G21E}!-US125BFnO+1)GpoKE(jpJCfEi0 z{2Bbna0w+`rZ zD6CHkR+?`B=!wL0@mmmx2yWS{)74)y&xmZaL`R+1BbcXEYGxT(SPF*AW!yFmWnBBr z_a06(3YyHPraq{xT8wAyruOB54&W8aca+~QcOT(|cLe^ChDS?~$MTCjw22 zqa1%Y_yt3$I9o>RZsd$20>^SWAI}y%*WIa*6sFx2br^j+XhN=qaZU~S2r*MB^k^qM zRiOSRkD=Q^e;~HuAuw~6{V5*hHhVA5&NsVvs&7-PB>;lVH$P%(7pY6iHVPPup$>7` z48c>DBn<~K;{ythULJNypCtE)a4&rxNM8y*7!=fZ4&D6c)^fiX61|tlEXRipU{05s= z0t!b>c#Nvfr$eRdzu8oAB7JDi?*@)ayh*DPT7awyk;>4y}=}?n+;>^Fp7b-ne0JID`a@yNvVcPDlPKgsRf94XKjqjN)p>)jo-`YAI`Hy;hrj6j_l zR8G51&NfX4OYUw~BVjj^%Z634eBZa1nw&THwYzBDg$UfNc0%>zcv3{03wO@eIJZ2z zVXJAa^gS^-IT_H`&G@vP(CN^Whq}ODdXi(B`t<2j25xTs((XRiQi(zk$5PM*dTU^z z%q{=&@PKRQJj-(nIg^DhV*R+frjC@8o(7tWiH^4GBDLp9!uz_e{~_f1haW^3N>mW6 zN|?{-47hSlm@BtyT3_J=*?V$jMT~s zN&7N*yT#d+5;>D}j8QSl$wKX9&Ol5@~Xo^$hXB8}M+x)V(A}NE0V^ix+-|s`IF=m{8A*OCMO;R9>|(Dj{$Xp#5&yktcbo#zB*6ylOf&ZC={8+HiSS zpSBrmRJzlvvob+m&6$1HUHJQS%P=BY2P8CFLN{nM%{RDNa#2&lXg5zW z#+m@Nl=kgjUAYSPt5pY~S1_OO=z1WN`E4cNf*BIb3MzmN8affz|j&)K2oI8 zf;3cB})P_1=d6zeE_%c~`ia~ZO828r)Q!P5@Z>;#JbU$^A zKl+#uKaa5M`DraIHJ`KiHn`17K~_7D#$6`9j4ioocCZ>>h(Q|C(8CU1BMlQ?iQM`V z;0aW^o7_O+RAG&Qw6qUD3~Rvd`+~CgBbP6vqRXkydAj!0f&0ma>vPieo*XF=rewya zmyukSvvSnE^;Mg*v1((i+HmvEWAHYwj{Hn@C&`*`*{oKGuleE3Q?DJ2p=%M<`^yBm z1~u`^E9B0xx9~Pd)&vINFt&Kh!&GO3pdrVZt<`7JnfVHq?3grgFbWfn6s4eH}@%GQx_!0hmaEHq3 zbvMY5HpCXM<`DmJEN3YsL#=d<|8NJAIWKW{t%u7}AKJpunP zdmLvafW@Z~#>p#ud}(2lZFJkVZ>FT{gN|(PJ1_Cd;Adoy>;Sy-a062BE?5@NFjly! zOoD1X_>!QN%+I-cx3X_GFb-ipsk~~_iph}>|GvkbvGab-H_xM8 z8byQ-#canLZKEMVv5ASCfv6ejr_NWw6f;KxZvBJD2K}2qu24&AC$muVyEj5fY-Ver z?1r^n)2^C!rFL`ERphhRCeJ-sg02nkH2Katilgi0SGZ0Ub{aR0`R}b7z7b1WP|dJv z0{n5sy0bj;G!?-_nInp2fl}vIh}uRh2!DhoZshW$0ciC>db~6;&b{g|k=rajx;fu+ z7dGEi-@6!t$BU-wJwp|~;T`0c5omXb~Gk>#KBNiqb$6<^cs&38^Cf@C7Y{_ZB9p$sP2nc*3 z>ZJ{6jL!jf6`B1l0Bx{Tcd@F*14s-HgrYMiCG*|EOtg!ENX2L{`PcqlH=vqkN?7H~LY!}6MdK9Ff6PyClAC~AI zUkGpu0~?9$Pl^Mhu^T^}=dM5KAu6=k?GLOBmYu?{_Cgxhy=ZNv_?~lq6bFYDyv{$_ zsEqj%NQZpuzo2Ic!NwpZ^~Bc1zyD^5O1F2DaHfwtPSg)R7$>HAl^4YCe+;&l*`rwY z-1-!aMp2_Z+vNr>iX5g)F~#sewxJcX`p;(vhxVH%AL1H(shDi`4<|Z~sEPXX5KmAX z?Y+C5VkM54&^}&4+Z7CF8j^9`ydX@9gCCNlk$y z#JKlQ6bgqPq0d|Mk=_=@px=f$d}0}KD=^J-uDdNlXu#XJ*GIee4Mq@%tBd zuk$?x7~HJtSs^&)Zgg6;ET_$?b}5)CWkBwL|5mZ3yfas0f^BhGOM%u>gVxz*a{qEl zai>DB&@tBhD$ucJwME2$FIiE3+BmIR-)U`JeR{0K0nvGpEt&C56QNMZXf&1Eto2kf zb2-&ZX(VMCu^zZJrJGk$+5WIlB{XLV;R{!AFgRYc4P^op6!Q`dFndUQo$FroI@KXZ zI(B%Piu3zDj*#yxw1bCF4t?GDyWT$$e-l<$X|(r6L=Sz6WEcu5tz17UJjvl*e55r+d!H?lAX<_?$06VcLzYP*OKP{ygbHKogKmh*MTs@cd z%$}ouFGtOtxabvc%bo=2+qZW}fdmWb*>K@FA%f1x7(HEQPIm78kBk98X>meLwi7g=oxe zNqi;i@CXGQRD*NUOP>N(>(Tx^>oY9-Yv%L5i^+y`Yj1tP{Vi}oIX-=*W#m!7UX&qtNHBb#!_4GQgPcL_%(1ZCOzoIu z1s-d-QN?KS+>0Al9U-vBjRylOarL97&@kxF_~=U`D&nVS>tk!uxl_04N$aO|ikweb z@Wk@8(-YQhqAPt81Ct$Vl4wnFY;%chks7wpbX=EU7l}u?T;WJLZh#VQJ*r)*{Ju~e z*I#A|jc)RT_(BdFK~AUgokF}tbcIyw^a{=Q`d^|a+wRO!mDuKH%itd-wB_@;xASt? z>BQdTF5b?*s{oSdp7Q!!X^~H^%c-i86!oZeu~OLoJBu}Y%ksA;;tki?nu_&K((FDe z@m2!RMG1(v;Zq1apspm}0FR~rX4hpFWBSR(fH4u=nb>y>;hxHe=hIqOxuO34w7&oGDC z+HP?D{xI%rrjmk(eRs08dyRZv|D`0T#AtQ5^#6mizm)g_!gOXcjI3Czh{jsz$k-(G z0L*!|ra&#I(^uYw3A*?sMdmXU+uK%oo`(}RGVXj5EFk2mbRs+OsPNNJEyP%x(z-q4 z#`EO+g*+C>k;y3w4imH!qCspo;TG7x<`kCF!w|BB*c7UFOLCfCK3?>o5@-meSj82x z%*>%8@i=4+d3)w6eatd`F0bj>Z3|O@y`Sf>7b?Wm-{CzGcY_&mJoEBK;-}|2Hl4y! zD=|g@M8q{lxI3i&Ql(Hz&~YZ?259V&wNVl^$8NB!bydN(6B&|xLK4wcY3>}>fYM)Z zos$$2yvZ|JkVT4sXRELc%zB~e1y`2&AMaJ5>oqIEePcRCJH;2m`k~7UXrE7%!v`vv zSLqGSK)!FNM_#pIbw?O(8~^R1cPejHaPe)%fZc2^m3`+x`Z!-xCzL)+sSa$pIItaX zUNBr2e*$31UXrHsKm(oGqke|hAhE_bAZqGz z8;o&38NLQ|*HW21`s8`2*KIu3B^V}VeqJP~l1c7QoDNDDgu3-f8*Nnh?4#2OPaZe< zdL(U(71qswO7^bO;jd&M;*2PNXg#FR@92oI_s5}=QLe&bSaGE1z}AQn&uh3g-va8J z<{Q~2R;Qph|3$Wzu<&KT{D@;&05jivrTE8BOgvN*L(bG~l=BF=cup62@MtI@DxzQ%OHXN}63?@udsc&h!5I1gU8sk%BRX#8O#rFgIX`M|7q zuUder2hyYke>GE`f1bx{%ZK0-csd2qc42Rr(>PkNgemo9;C5JE9%46`DyP^1Ng>;; zHotOQwYZ=bGtotn1bTcO&+~G9hjzyTae1)gyEuDvDFjHlKpB-1>qnfLJk;OQMK;im z53xR*Q#}*+I-Tj(oV&uWSgrTpK5SXLZ1p(?f;iGxf9BGwZ3g6|k=h0w5t|ma!(cOb zCAn!Xi-=7JxRmGr(e~c)aIW3@cn}03McX8LuOo;WOcIPP2%;x?@4c5Gh&Ebu(Yxrq zMf4z}_tATAgHe7@_W7Rk?!DjloX^ho`TaM{<1zEx_gd>(*S*%YfN4%zsZZ=;-2t9* zr>;3eIWh?x=auC7>g_(%;Gi@wY1u2(!zt;m+kr`~~0T>}l8Z^y+fMBE2=|z@TAu zHzr>DX%Jx6=v77ITmIokw+7@T`>Pd|hU2~^mODa<=i@P&kOMZbQlBu~d)XT*Btb3m^x;D+tk`T+^8ksc!OMiLF#mq_;e5(tnPp}z(-yO4{*|qfsVp-+ zLDrLf`Me#IW9N#mSenlBE(d*?-3NRUDtO;{E2&m>)rf4YP-kNwMghx%td`XQ^(t5qr8T3ZznWSpVwqux9Qr^tBtKqRO+g*92AB4)DE zR6n&t;Fn9T!B4PhMISblBcTv&bt)DWbV=HDuP6`3SjB^rbk&60q+@qfKogd}-0G#d zUn~HTupM^Xf|bH(JINf{vo=90mZfy%pjjTmaEw$_uW^kwX}hs)YeaLo6Ml6`^2n4g zO6C(043_iT^qp#F6Ynk0on(T`v*up%+M6-TyH`$6&ilFiOmIV#qGr%cKING7rRCK> z3Gd&q&?clgb}@3C-?4coRcCMdrd_BFtVGp~MR{4_nWO*7&(t6b7zfcQ)T~8j*2JC~ zpJaXvPfXNBkHGuHF*xwZ5hHB1_y^OM7Mgo-&?Tr=@np9e&D85`6OHpEnOEj11^nIy zA7ly`cPOY{WloZ3${e~hre1OMLJE+bw8=pt)tQ)@vp+`y>~s%6uP?~WED1WAZqSo( zo%q!pF5nicmD6)fS4isB0>Nb|FDKQm^SA+@;cCov{q0b;>`y{H7Ovy^L^*AuG1 zXpw#w8Lu>8{&?#W=O34d4Ttd8xK?jRTny+c2txwxX_}I0B9rFT;49DSe=hy8M=2MZ zmhjaUOYdhrWYysOdmfjBBf)E#GXvPeiCQi#fM7_Ub{wj7={KVJ1I)ek0V^5h+x$|PUyrbWK1zid_ zE8C0r?fKrxXx3RJZ&aMP&A)j%2|y~x?cS4Dm{lvy&?eBEJnCy9+y0tLh@O*mAeM|t z7G;j?o4NQIXVs)hBPU-cb8g!6~Hb+=zGg{nd% z5JU2zZn??@P_Y8Y49BU;MAHlob4Rjf59TB8T#)L$nrEkV8@9EJ;k>p z`;#AD;!zL=Ok96IOKng048yjQ4b-z#fXhp|>i`pAiObvuv?XO&8R9gZ<(fV&JW(JOe%dt+i-z zQWQZVcvFDTpqsvavilLdBnIHg7>6rA>U@FW7OaI`PP#m&x%S!F70~xz66cV&dXg;Xw-F>arY=WrEA>{WImYprd6kzAzFo-@6C;P4-*w^O zsGLTeQxprMkLGeXvw}9k@svM(jJdnvXpNG2uH4{OsMmjdh0CzwCfoo1wo?06rnqvl zveQJ4GF$v_I0PmJ89*HA9vnxgy%dvcr`6gx-$7GQYcimCE5OI+{Atv-AR^|{{>rErm`T2~ z(zgG&784ZEKVOpyJ!(32fGNgTjR!E22Y^3Bna2-6%qi!6_+(SyUUbe!`;AYkZd ztYRLNIF>cQiZJKbQT_)k<7~$2*sNBXp%)3loHM>LU%R%AKT>d^jwMfncaZi$4kG2y z>fW!>+$I_ye)Rtsh^-^)GgXOL%y)T5>g2a>|I~*J_rP4Px}e^8Z*8NvvpYR>eW#+{ zjn@t-mtzz97X1@ZC9~8?k8J;RTWv$58$Jp53Bx78bYoTmj;F+FsA z1^((h2Q!OJA9Ir?hjAhZHo#5YXma_x7!g<1&LQrlKMG8T8*7Pg|Ij*`yapz3S0cXY z04mv~O?aA@UXEF`W;8l@Qga}$I_aj=;|$|Z5>q1uDsJ3BLd&z+k>| zi00~M0G)Ir;vE_Ms?y9Ar3@IMx9W0trp6{im5yb0Y0|-WK+bcFaQC;`Q03fL+I0?s z6Rzt?BW9yLU6Ca{!zNsXTEn|z{vnw&SQd7Iw-+I=z^O5rnWsKVtDF}Dnr!&mc9Zk& zVM%t6yO-x1QWrdRwx+6egiqJF;_L>aNe;G$<9A#=$!2t>*zq|o)`qToDpj?iaCYc@K<~yT=O25^DKX!oZ-myX$gmfvM2fLGWQI(ilMbFeQ+X%R8E|Bp9^z-Z`gj*z&T*^n%Zs-z zWNTo<*g|-UTMX$8;wzryimWAt*h?LdjMg^!!JwR^rH){n!wIvz5HFot)sDbhi?K_9 zGEG;WyH&Wvl!oH_u8rJg)qJW-Yu4TDV|_|v2I0qi)shuFud|UcOA&1d3ufP^{l@w{ zAQQ7}*2_7u6yf4xF84~>EbiQN=dg5dc;~d0i7#)D5rjDh> z^%Yu~r=O}#uSkhaM!>^`L5TBvwFmGf|_bqFt>hS|nert0wBwRw|Ov(4}>kc%B?f?;P{GHpy)(M5j-X z)^^>@E_1yNE;ZBa!N&Wsw1Bf#uv5UbG5OJJhrpbo)4pw;BsT9Qo$GhUj!r2%C7qwi z>cGGh=H=jCki)&DdxkZBP5t~vsq4i*6Pw=;fL%}e;enSLj@y&Vc&QGfyVF-T$D5Lu zuG({3O-PDJZXL>&WMctAr|fPdh5Hgk4{UcPCr~i^c|Nar^LDY(uJMP3bCGG*=1n)B zyWG8?=8KNx^pQ~eLe*5eB}AMSO@V5OL-m;;7S=od9ljFmu_h0(L(h{`zpGZPH2^Qm zG-MBa5;l_?GJ2INmh+S0dt6czC*~kRx9w4Cxa}IxIfKJX4Y#@*s1S+O=vrrl^jL8w_?XbpnKL; zTQohPuAD!m#6@QS>HpHcsKXuyBC@Pnv7E94$Hr5tTFMsi7+C%E^gTh5EnkW^oll6Y zuD9&ofNENbs_$aI_c@q6Jm_VAfD7l_o^=b9l9I|V-(VNHSi_I!HVLkutygu*Q>u@x zFHQyyHhZ+j(gyurQp7d7`4LtqD)Dw#j^X0HF0^qva9~!+r6fKU93X?;8q8HFNxbBo zd9rQXvJnZnX5SpO_|gHCVzJjFoJR&XhKt!)R0{18E_d04ytDAGIWM%w z`G=$Ms$OCp54YUFcV53v#l9r?B0_IEC?+=)9y;klqxCI;gxiby^GjJ7zD_-tVI11` zFFDV`EC;vONfzGwa!=ciL2#B+_HnXIbyuC|_WxT8fCOJOxJOuNAL1u8G1VJa9mkH_ zXeu~SjU2PuofWn85P8$L98EuxX?pgSv7=c&WRh^nr(B~aLx;6I;F#1c;r?rBuGwO3 zLdmH(Dma4`SMS?93z3KF(rQY{xw(@jeWq`G=qvZD>)lqh&bmc-tFMk{NW09+M-zTT zYxzjLd@D9?Mf@n7iFHE3A|MitAO9QYckk4XO-nkN#M^?Wx`%ErD)J{OAN855u`DAhZ~2 zl~K}ytCNvbDK_9sdK&U+@3xf>6fZgK;ae>MhZVzfif` zt=%iM9XT*R;ckx2ou{T9D?BdkD#R=8IUBJun@I%jA+NFFiIu(6ZB%U^1CV9{FVEOZ zc3hLDuUbJ1phA1d0R7nxqD75OfA>np<=|0?X-`>Sy_nAaWa@x1{Y%$nuW4uG%2P*& zvGaq5yt~WXMUO{{Jq?VGBVu*no@GhL3-=C^v6M`dGSD}j)JwK7dE%d(8NVV{QeZ~d zjTOETPZ(wdbvJL@I1Lo#M}{HMBMpUIk=N)n+ZiBcg$}0e zXl81GkZg;*3Jb9NSwEKlI_Ub@GvxOu+f56n-hAcmQA^VMXItf<%fK(^yl{IzcR`ng zpF=%5d5kEZJWR0vU@!Ku{eB&}xB*LHNjdWfH?a)Bad%~`RzmyQ&WV`a zGhYQ6d>yQowHT9mDRU`EU%TnzK;E2I>0m(?UI5*!s5)lu?&NihWcWVqEbAv2I0)b| z((%gx0QQaAY2>|Ozn*(PDN}n$;F5p64}D#$X&DGD4=-Um+}UPdO}XEk5b4!3VECK9zfaRx-_NL_oje^cj|+}*{+cODep-ovJi?Y&%; zJK@^=J!G#+b{?q>8OfzKPOC>ggV5iPQynsut*!hzU2^?f(DFiRxx`M+?FNuxUkU>z zp8ly-Z5Oh;V611-;Zg8K&Exxjv-t2|?G$MosHNWi^r7y3+I^h!G;VHP7q~|g*{6m> zLR+YtO4U;F65kpg$|#3_5d9vQ*>=v^T?&S7ebJHJVd&zZbB?u|r3>N7mOgKiF;UJ* zf1LVSGXGPWqD{4|337QX)Z}OFCXAuhVJ3KRR8wQ-nXh2GN1wmY_0KutlBRWQWv03$ z2=b?l;w&DhQ&kpmPtC@pdIDZE=};+<4wryJNqM6=4Qw%j4+bZiuf1s*N@9;6Day2G zN)6_|YpX%|+z>VoCkhoe*q%Htd-7Dd%JNJ$e=L{&cylZYqjLmg-A*mkaemB{ovs+H zudgowOvD6=QHh|ce7#<{NB5e&Rru?+PuvReO_U3;7U2%^b+!g&tlAB)d+1_g0&qzs zqUb{xF`}l)7VLu;_=D}nbssSYBbka3?eFEAqpfm0oyNB<8~4>sX38esiQHrOyC+Zo zx~_{Utu{u$VN=~D_Lao-pcnpk4!ud;Qrc?Bt!`bWCJ^N1t-MovKCYi!6Li#U1=2l0CzkKvE94}A!|U*(6miQM^6QW44}U=*MQQnj7GI3hi~4p1wph3R zFGH+9+H9Dsk1_YgjGyX(gf2gAAK3&Oi!`;s1bh6_$A5L7*kW^=j=y5xfe%c+DsU`H z!vF0b^a=cIzoY~d88i!iDl&9Qk;Q{PM-V?N+xa$2&WV!AnomgxM>zg_&-BqFL+zU> z3IwZz|4aD`XqpBj0C+<(S8X1$sa$k@$1#fMl(^Z=?=#AxCNKpr2Nz~WdhC)4mq98? zp=4s%i7E;DHGoXizbx;UUr9B3ld%Vn2plLvE3ol&x^xk=fM-`@K5t@ww(c$IKF zU9EHj;yN@LZV+kz^u8QtBK2#qBGDiB{U7$*AO7_JGB7{~hUL|8mo&vhd&HLY|6j5V zq8Sjmy{>5SvK7%60)G{<`@cTkfBHgM65uwmm1P3n1A~uc-)kPd;DpgIQ^urs`fB_- z()`2fwh-+RKjrkOACIi;o=Qid!w09MKD>wf%k2Lj+XAzsDSPwX_0z?hdLUumhLIIO zjQ}8(W7e-M-wY#UHqDK5!I*JyA`p;f%;fD;0%ylLNg<<|cGj^g=iCj`#U6 z&<}bD4C419$wWAx(+&ka_CpM?{W28z)7}A-|IYlre^W|hgF}5LMICR+$H5=&SBCZH zCHNPf{d=#%=ujA3^x;wXf@PZ&>pX{?USB&0+3aqnLPQzS4DOPAwElWKQB{Q_T>oBz z4XQ-&4MhqFu*Tof=wM5>L4b+T4KQFh;w#GH*TK;>$~RgqsY);)Jdho!n@2-d3Tgc9 zAz_5n@yoA$e^q_^6(1fg?gLiHFh>tdT2o+6p}id;wTS;!=q7ihoCCQn4Sn&0s2LWJ zi3Oil!Pqc-h6249kQr1Haq$M)RQ&e|yE))lxi0)nrMfk&azWrAqVenR{B-B%HGKc{ z35DUI=(y7L9_htIBmu&8LV#{@hocC}K5_)k-`2uLx#|F9)9mHUe zYqAE;Q2>zmXx@%3lqYxq z0I3R2gN?hJ3G95k<|NP7>K;0HXx_b1_@h&3>Bn!^75~|He%ke4edkbTu3D|Afbdz5 zT^gsuT-9qDH8nL`paF1a9QGsLQpQq5T^(}$8>nd04cVuV4zj=(sqQQ!Z2CVI=U+GbUtfVWf5P%mvj#?@Cxefn zP1AuVP~HY0!XUjOUu{_`6Ush@Z}iCN_YK;sjoG&)4x zGoG(iz@&#ed=r&samy~pmAt`CNhe);*U_GrCA1%wyl;j#D2u%T@W0oU@2MXLF4L1Z z(f`?-t(JXPkx^g%gIm%=?oU7ihP=pO`XhFM-RY*^rAe?cHEn`^iaKQgjbz4jw7Arv zfHcrFpK+QRoRL&LAE-{(w4R;dbpGK$w^m$3@K3Gqcc>m#;oT9UYXi{E3u1L&RA2T- zh<=^li)^a%6M$pjQ=cE|kVgY*QxfgLgv)sh6j4A+^D^Hk`f4g$s@#PY<%cC1DS5a- zsM*>^M=M(LyBo@CF{21-N7Fbgi9$b$u_o#3O8nGqTd<**k7rla;u^=Ms5FQDtVxyv zT9EB%RPLC3eM55IqLW1B0_??6X-s<0t1LmeUq3_pLs0V>q`&_Z-E%to@(qz>C+a+H zd7h{W_@^ArPaFR!z6DfLm7Tlp1N|eaKTD#2b_*1*OmTlW8r~x|7%SHDsr5{4!BDwL zCUpPQ>tqLwBUl%A?lkTN<^$2XU|(;oQYv3mqSvBX!5=;_jw?K1ar}liejkM?J$L;6 z1M|17?92;oQp&DT+OH*M-OG91+~TBxxz~{wtMSuYJLbq4)7kzVULCCa65$f21YyF1 z>aL8)Na7Frs1bv*+;WPFH45*L#(OXpeE8A5muQg{)7F>DgGFWxUY-pxmRf>6xv<47 zw{YPr=IzO<{ms`m`hJWisFK~?vrJ~13X~NRhtwu>k;LzpWV48}=4gaAn06bi?p?L- z(`@Hp;3*frp;B#y)cFWEx=n7&#BW%r`h`zFtM>-PT7M;a{^jCmJ``MbP7(UrNH(9_ z5K{N0G71xG#mHW7g3bDTfL|<}aGWib)tDMk)A5Qnd4$VHy~e0SPV|?%{L+und_Lew zno!OID4Cl7-b371QqZOJSd=`Cv9J^H)5FLsV_2cs&CL0J*CQYM#IvsVr0AR!wQOdr zP{Zf8SzQKT+xXyY84oyl1_ni~%TC(aua|lJA&t7_GmS&bz~IJWMhV5B@*g7i&z~m| zW4|RCu89_QN1*2ty(QsBi=$5$k&RIc5-iO||DA1Hf73i+L<*dtmkk)HGuA80M2 z*t<7{$ykYj%{))2TQ@TCA`;tFJJeXEV zk}Y6$fa!)g77?m8M&>KOS7kK&_|)i%)bXaaqKm9NJ=8aR4sxjM2VH^;#EwhLB7+7i zoflD>NpkUa|AedjSGMP~g$~uMh~ycmJCh9m2stoJIJ-^B^zde;@sM^7{SkV41ovr| z%tq3lCJ0T@R8h1>5vGuEdzDlXUoZY5ct@1>X|R;_5+`Nt+sqgDz^1ic9%hqQSvF

    r$%uH8T9+MPHr+ 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

    4?+$Q>FwW}rX4 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

    + + + `; exports[`Home component should render traces 1`] = ` -
    - - - - -

    - APM -

    -
    -
    - - - - Settings - - - - - - -
    -
    - - - - Services - - - - - Traces - - - - - -
    + + + `; diff --git a/x-pack/legacy/plugins/apm/public/components/app/Main/__test__/UpdateBreadcrumbs.test.js b/x-pack/legacy/plugins/apm/public/components/app/Main/__test__/UpdateBreadcrumbs.test.js index f3c3067a73e62f..40c77a4c97cbdc 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Main/__test__/UpdateBreadcrumbs.test.js +++ b/x-pack/legacy/plugins/apm/public/components/app/Main/__test__/UpdateBreadcrumbs.test.js @@ -11,8 +11,6 @@ import { UpdateBreadcrumbs } from '../UpdateBreadcrumbs'; import * as kibanaCore from '../../../../../../observability/public/context/kibana_core'; import { getRoutes } from '../route_config'; -jest.mock('ui/index_patterns'); - const coreMock = { chrome: { setBreadcrumbs: jest.fn() diff --git a/x-pack/legacy/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx b/x-pack/legacy/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx index 53a9fc8bafbd18..1888e1d04c2cb4 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/Links/ElasticDocsLink.tsx @@ -6,10 +6,7 @@ import React from 'react'; import { EuiLink, EuiLinkAnchorProps } from '@elastic/eui'; -import { metadata } from 'ui/metadata'; - -// TODO: metadata should be read from a useContext hook in new platform -const STACK_VERSION = metadata.branch; +import { usePlugins } from '../../../new-platform/plugin'; // union type constisting of valid guide sections that we link to type DocsSection = '/apm/get-started' | '/x-pack' | '/apm/server'; @@ -20,6 +17,8 @@ interface Props extends EuiLinkAnchorProps { } export function ElasticDocsLink({ section, path, ...rest }: Props) { - const href = `https://www.elastic.co/guide/en${section}/${STACK_VERSION}${path}`; + const { apm } = usePlugins(); + const { stackVersion } = apm; + const href = `https://www.elastic.co/guide/en${section}/${stackVersion}${path}`; return ; } diff --git a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/__test__/ErrorMetadata.test.tsx b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/__test__/ErrorMetadata.test.tsx index 0c84adbf22060a..c3913e43cbd62b 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/__test__/ErrorMetadata.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/__test__/ErrorMetadata.test.tsx @@ -10,9 +10,14 @@ import { render } from '@testing-library/react'; import { APMError } from '../../../../../../typings/es_schemas/ui/APMError'; import { expectTextsInDocument, - expectTextsNotInDocument + expectTextsNotInDocument, + MockPluginContextWrapper } from '../../../../../utils/testHelpers'; +const renderOptions = { + wrapper: MockPluginContextWrapper +}; + function getError() { return ({ labels: { someKey: 'labels value' }, @@ -38,7 +43,7 @@ function getError() { describe('ErrorMetadata', () => { it('should render a error with all sections', () => { const error = getError(); - const output = render(); + const output = render(, renderOptions); // sections expectTextsInDocument(output, [ @@ -57,7 +62,7 @@ describe('ErrorMetadata', () => { it('should render a error with all included dot notation keys', () => { const error = getError(); - const output = render(); + const output = render(, renderOptions); // included keys expectTextsInDocument(output, [ @@ -79,7 +84,7 @@ describe('ErrorMetadata', () => { it('should render a error with all included values', () => { const error = getError(); - const output = render(); + const output = render(, renderOptions); // included values expectTextsInDocument(output, [ @@ -104,7 +109,7 @@ describe('ErrorMetadata', () => { it('should render a error with only the required sections', () => { const error = {} as APMError; - const output = render(); + const output = render(, renderOptions); // required sections should be found expectTextsInDocument(output, ['Labels', 'User']); diff --git a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/__test__/SpanMetadata.test.tsx b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/__test__/SpanMetadata.test.tsx index 3c851252666e0c..438fe57218cc9b 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/__test__/SpanMetadata.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/__test__/SpanMetadata.test.tsx @@ -10,9 +10,14 @@ import { SpanMetadata } from '..'; import { Span } from '../../../../../../typings/es_schemas/ui/Span'; import { expectTextsInDocument, - expectTextsNotInDocument + expectTextsNotInDocument, + MockPluginContextWrapper } from '../../../../../utils/testHelpers'; +const renderOptions = { + wrapper: MockPluginContextWrapper +}; + describe('SpanMetadata', () => { describe('render', () => { it('renders', () => { @@ -29,7 +34,7 @@ describe('SpanMetadata', () => { id: '7efbc7056b746fcb' } } as unknown) as Span; - const output = render(); + const output = render(, renderOptions); expectTextsInDocument(output, ['Service', 'Agent']); }); }); @@ -53,7 +58,7 @@ describe('SpanMetadata', () => { type: 'external' } } as unknown) as Span; - const output = render(); + const output = render(, renderOptions); expectTextsInDocument(output, ['Service', 'Agent', 'Span']); }); }); @@ -76,7 +81,7 @@ describe('SpanMetadata', () => { type: 'external' } } as unknown) as Span; - const output = render(); + const output = render(, renderOptions); expectTextsInDocument(output, ['Service', 'Agent']); expectTextsNotInDocument(output, ['Span']); }); diff --git a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/__test__/TransactionMetadata.test.tsx b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/__test__/TransactionMetadata.test.tsx index 1e06648f21eead..1ea20ecd645629 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/__test__/TransactionMetadata.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/__test__/TransactionMetadata.test.tsx @@ -10,9 +10,14 @@ import { render } from '@testing-library/react'; import { Transaction } from '../../../../../../typings/es_schemas/ui/Transaction'; import { expectTextsInDocument, - expectTextsNotInDocument + expectTextsNotInDocument, + MockPluginContextWrapper } from '../../../../../utils/testHelpers'; +const renderOptions = { + wrapper: MockPluginContextWrapper +}; + function getTransaction() { return ({ labels: { someKey: 'labels value' }, @@ -38,7 +43,10 @@ function getTransaction() { describe('TransactionMetadata', () => { it('should render a transaction with all sections', () => { const transaction = getTransaction(); - const output = render(); + const output = render( + , + renderOptions + ); // sections expectTextsInDocument(output, [ @@ -57,7 +65,10 @@ describe('TransactionMetadata', () => { it('should render a transaction with all included dot notation keys', () => { const transaction = getTransaction(); - const output = render(); + const output = render( + , + renderOptions + ); // included keys expectTextsInDocument(output, [ @@ -82,7 +93,10 @@ describe('TransactionMetadata', () => { it('should render a transaction with all included values', () => { const transaction = getTransaction(); - const output = render(); + const output = render( + , + renderOptions + ); // included values expectTextsInDocument(output, [ @@ -107,7 +121,10 @@ describe('TransactionMetadata', () => { it('should render a transaction with only the required sections', () => { const transaction = {} as Transaction; - const output = render(); + const output = render( + , + renderOptions + ); // required sections should be found expectTextsInDocument(output, ['Labels', 'User']); diff --git a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/__test__/MetadataTable.test.tsx b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/__test__/MetadataTable.test.tsx index fbdd6bad3457df..bed25fcc640127 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/__test__/MetadataTable.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/MetadataTable/__test__/MetadataTable.test.tsx @@ -7,9 +7,16 @@ import React from 'react'; import { render } from '@testing-library/react'; import { MetadataTable } from '..'; -import { expectTextsInDocument } from '../../../../utils/testHelpers'; +import { + expectTextsInDocument, + MockPluginContextWrapper +} from '../../../../utils/testHelpers'; import { SectionsWithRows } from '../helper'; +const renderOptions = { + wrapper: MockPluginContextWrapper +}; + describe('MetadataTable', () => { it('shows sections', () => { const sectionsWithRows = ([ @@ -25,7 +32,10 @@ describe('MetadataTable', () => { ] } ] as unknown) as SectionsWithRows; - const output = render(); + const output = render( + , + renderOptions + ); expectTextsInDocument(output, [ 'Foo', 'No data available', @@ -45,7 +55,10 @@ describe('MetadataTable', () => { required: true } ] as unknown) as SectionsWithRows; - const output = render(); + const output = render( + , + renderOptions + ); expectTextsInDocument(output, ['Foo', 'No data available']); }); }); diff --git a/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx b/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx index d9d1d94e778ca9..6477f9a9dd41d1 100644 --- a/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx +++ b/x-pack/legacy/plugins/apm/public/new-platform/plugin.tsx @@ -35,6 +35,7 @@ import { featureCatalogueEntry } from './featureCatalogueEntry'; import { getConfigFromInjectedMetadata } from './getConfigFromInjectedMetadata'; import { toggleAppLinkInNav } from './toggleAppLinkInNav'; import { BreadcrumbRoute } from '../components/app/Main/ProvideBreadcrumbs'; +import { stackVersionFromLegacyMetadata } from './stackVersionFromLegacyMetadata'; export const REACT_APP_ROOT_ID = 'react-apm-root'; @@ -77,8 +78,12 @@ export interface ConfigSchema { // These are to be used until we switch over all our context handling to // kibana_react export const PluginsContext = createContext< - ApmPluginStartDeps & { apm: { config: ConfigSchema } } ->({} as ApmPluginStartDeps & { apm: { config: ConfigSchema } }); + ApmPluginStartDeps & { apm: { config: ConfigSchema; stackVersion: string } } +>( + {} as ApmPluginStartDeps & { + apm: { config: ConfigSchema; stackVersion: string }; + } +); export function usePlugins() { return useContext(PluginsContext); } @@ -112,7 +117,17 @@ export class ApmPlugin // // Until then we use a shim to get it from legacy injectedMetadata: const config = getConfigFromInjectedMetadata(); - const pluginsForContext = { ...plugins, apm: { config } }; + + // Once we're actually an NP plugin we'll get the package info from the + // initializerContext like: + // + // const stackVersion = this.initializerContext.env.packageInfo.branch + // + // Until then we use a shim to get it from legacy metadata: + const stackVersion = stackVersionFromLegacyMetadata; + + const pluginsForContext = { ...plugins, apm: { config, stackVersion } }; + const routes = getRoutes(config); // render APM feedback link in global help menu diff --git a/x-pack/legacy/plugins/apm/public/new-platform/stackVersionFromLegacyMetadata.ts b/x-pack/legacy/plugins/apm/public/new-platform/stackVersionFromLegacyMetadata.ts new file mode 100644 index 00000000000000..3d43b8e39a122f --- /dev/null +++ b/x-pack/legacy/plugins/apm/public/new-platform/stackVersionFromLegacyMetadata.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { metadata } from 'ui/metadata'; + +export const stackVersionFromLegacyMetadata = metadata.branch; diff --git a/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx b/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx index 8f609f41b079de..b5cee4a78b01c1 100644 --- a/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx +++ b/x-pack/legacy/plugins/apm/public/utils/testHelpers.tsx @@ -11,7 +11,7 @@ import enzymeToJson from 'enzyme-to-json'; import { Location } from 'history'; import moment from 'moment'; import { Moment } from 'moment-timezone'; -import React from 'react'; +import React, { FunctionComponent, ReactNode } from 'react'; import { render, waitForElement } from '@testing-library/react'; import '@testing-library/jest-dom/extend-expect'; import { MemoryRouter } from 'react-router-dom'; @@ -19,6 +19,11 @@ import { APMConfig } from '../../../../../plugins/apm/server'; import { LocationProvider } from '../context/LocationContext'; import { PromiseReturnType } from '../../typings/common'; import { ESFilter } from '../../typings/elasticsearch'; +import { + PluginsContext, + ConfigSchema, + ApmPluginStartDeps +} from '../new-platform/plugin'; export function toJson(wrapper: ReactWrapper) { return enzymeToJson(wrapper, { @@ -179,3 +184,23 @@ export async function inspectSearchParams( } export type SearchParamsMock = PromiseReturnType; + +export const MockPluginContextWrapper: FunctionComponent<{}> = ({ + children +}: { + children?: ReactNode; +}) => { + return ( + + {children} + + ); +}; From 99c6396fd571074f8bc09e723ac44009c114c01b Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 3 Dec 2019 09:34:49 +0100 Subject: [PATCH 38/39] Migrate Capabilities to new platform (#51438) * create service skeleton * move registerCapabilitiesModifier to capabilities service and rename to registerCapabilitiesSwitcher * starts to move capabilities logic to CapabilitiesService * move capabilities route to service * add initial integration test for capabilities route * capabilitiesMixin now delegates to capability service * use server-side Capabilities import in server code * update generated doc * remove capabilities from injectedMetadatas * use applications sent from client instead of server-registered navLinks * disable authRequired for capabilities route * (temp) exposes two endpoints for capabilities * Add fetch-mock on capabilities call for karma tests * adapt xpack Capabilities test - first attempt * adapt x-pack ui_capabilities test * add '/status' to the list of anonymous pages * Add documentation on Capabilities APIs * move Capabilities to core/types * update generated docs * add service tests * protecting resolveCapabilities against added/removed capabilities * update generated docs * adapt mocks due to rebase * add forgotten exports * improve capabilities routes registering * name capabilities registering methods * resolve conflicts due to merge * address review issues * add comment about reason for exposing two routes * extract createHttpServer test helper * fix merge conflicts * improve documentation * remove `/status` anon registration as now done in NP status plugin * fix merge conflicts --- .eslintrc.js | 1 + ...na-plugin-server.capabilities.catalogue.md | 13 + ...a-plugin-server.capabilities.management.md | 15 + .../kibana-plugin-server.capabilities.md | 22 + ...ana-plugin-server.capabilities.navlinks.md | 13 + ...bana-plugin-server.capabilitiesprovider.md | 13 + .../kibana-plugin-server.capabilitiessetup.md | 27 + ...rver.capabilitiessetup.registerprovider.md | 46 + ...rver.capabilitiessetup.registerswitcher.md | 47 + .../kibana-plugin-server.capabilitiesstart.md | 20 + ...r.capabilitiesstart.resolvecapabilities.md | 24 + ...bana-plugin-server.capabilitiesswitcher.md | 13 + ...na-plugin-server.coresetup.capabilities.md | 13 + .../server/kibana-plugin-server.coresetup.md | 1 + ...na-plugin-server.corestart.capabilities.md | 13 + .../server/kibana-plugin-server.corestart.md | 1 + .../core/server/kibana-plugin-server.md | 5 + .../application/application_service.test.tsx | 4 +- .../application/application_service.tsx | 2 +- .../capabilities/capabilities_service.test.ts | 50 +- .../capabilities/capabilities_service.tsx | 51 +- src/core/public/http/http_service.mock.ts | 4 +- .../injected_metadata_service.mock.ts | 2 - .../injected_metadata_service.ts | 7 - .../capabilities/capabilities_service.mock.ts | 50 + .../capabilities/capabilities_service.test.ts | 188 + .../capabilities/capabilities_service.ts | 156 + src/core/server/capabilities/index.ts | 21 + .../capabilities_service.test.ts | 95 + .../capabilities/merge_capabilities.test.ts | 76 + .../server/capabilities/merge_capabilities.ts | 31 +- .../capabilities/resolve_capabilities.test.ts | 164 + .../capabilities/resolve_capabilities.ts | 85 + src/core/server/capabilities/routes/index.ts | 27 + .../routes/resolve_capabilities.ts | 51 + .../capabilities/types.ts} | 35 +- src/core/server/http/http_service.mock.ts | 23 +- .../http/integration_tests/lifecycle.test.ts | 27 +- .../http/integration_tests/router.test.ts | 27 +- .../server/http/router/router.mock.ts} | 31 +- src/core/server/http/test_utils.ts | 63 + src/core/server/index.ts | 15 +- src/core/server/internal_types.ts | 3 + src/core/server/legacy/legacy_service.test.ts | 3 + src/core/server/legacy/legacy_service.ts | 2 + src/core/server/mocks.ts | 5 + src/core/server/plugins/plugin_context.ts | 7 + src/core/server/server.api.md | 3493 +++++++++-------- src/core/server/server.ts | 14 +- .../server/test_utils.ts} | 5 +- src/core/types/capabilities.ts | 41 + src/core/types/index.ts | 1 + .../tests_bundle/tests_entry_template.js | 4 +- .../plugin_spec/plugin_spec_options.d.ts | 2 +- src/legacy/plugin_discovery/types.ts | 2 +- .../capabilities/capabilities_mixin.test.ts | 84 +- .../server/capabilities/capabilities_mixin.ts | 51 +- .../capabilities/capabilities_route.test.ts | 137 - .../server/capabilities/capabilities_route.ts | 54 - src/legacy/server/capabilities/index.ts | 2 +- .../capabilities/merge_capabilities.test.ts | 84 - src/legacy/server/kbn_server.d.ts | 9 +- src/legacy/ui/ui_render/ui_render_mixin.js | 2 - x-pack/legacy/plugins/security/index.js | 1 - x-pack/legacy/plugins/spaces/index.ts | 3 - .../plugins/features/server/feature_schema.ts | 2 +- x-pack/plugins/features/server/plugin.ts | 2 +- .../server/ui_capabilities_for_features.ts | 2 +- .../server/authorization/actions/ui.ts | 2 +- x-pack/plugins/security/server/plugin.ts | 8 +- x-pack/plugins/spaces/server/plugin.ts | 24 +- .../api/__fixtures__/create_legacy_api.ts | 1 - .../common/services/ui_capabilities.ts | 56 +- .../security_and_spaces/tests/catalogue.ts | 25 +- .../security_and_spaces/tests/foo.ts | 25 +- .../security_and_spaces/tests/nav_links.ts | 15 +- .../security_only/tests/catalogue.ts | 12 +- .../security_only/tests/foo.ts | 15 +- .../security_only/tests/nav_links.ts | 10 +- 79 files changed, 3357 insertions(+), 2423 deletions(-) create mode 100644 docs/development/core/server/kibana-plugin-server.capabilities.catalogue.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilities.management.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilities.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilities.navlinks.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiesprovider.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiessetup.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerprovider.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerswitcher.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiesstart.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiesstart.resolvecapabilities.md create mode 100644 docs/development/core/server/kibana-plugin-server.capabilitiesswitcher.md create mode 100644 docs/development/core/server/kibana-plugin-server.coresetup.capabilities.md create mode 100644 docs/development/core/server/kibana-plugin-server.corestart.capabilities.md create mode 100644 src/core/server/capabilities/capabilities_service.mock.ts create mode 100644 src/core/server/capabilities/capabilities_service.test.ts create mode 100644 src/core/server/capabilities/capabilities_service.ts create mode 100644 src/core/server/capabilities/index.ts create mode 100644 src/core/server/capabilities/integration_tests/capabilities_service.test.ts create mode 100644 src/core/server/capabilities/merge_capabilities.test.ts rename src/{legacy => core}/server/capabilities/merge_capabilities.ts (60%) create mode 100644 src/core/server/capabilities/resolve_capabilities.test.ts create mode 100644 src/core/server/capabilities/resolve_capabilities.ts create mode 100644 src/core/server/capabilities/routes/index.ts create mode 100644 src/core/server/capabilities/routes/resolve_capabilities.ts rename src/core/{public/application/capabilities/merge_capabilities.ts => server/capabilities/types.ts} (63%) rename src/{legacy/server/capabilities/resolve_capabilities.ts => core/server/http/router/router.mock.ts} (61%) create mode 100644 src/core/server/http/test_utils.ts rename src/{legacy/server/capabilities/capabilities_mixin.test.mocks.ts => core/server/test_utils.ts} (82%) create mode 100644 src/core/types/capabilities.ts delete mode 100644 src/legacy/server/capabilities/capabilities_route.test.ts delete mode 100644 src/legacy/server/capabilities/capabilities_route.ts delete mode 100644 src/legacy/server/capabilities/merge_capabilities.test.ts diff --git a/.eslintrc.js b/.eslintrc.js index 58b74d0bf5c25b..0db97356148f43 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -337,6 +337,7 @@ module.exports = { '!src/core/server/index.ts', '!src/core/server/mocks.ts', '!src/core/server/types.ts', + '!src/core/server/test_utils.ts', // for absolute imports until fixed in // https://github.com/elastic/kibana/issues/36096 '!src/core/server/types', diff --git a/docs/development/core/server/kibana-plugin-server.capabilities.catalogue.md b/docs/development/core/server/kibana-plugin-server.capabilities.catalogue.md new file mode 100644 index 00000000000000..4eb012c78f0cbc --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilities.catalogue.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [Capabilities](./kibana-plugin-server.capabilities.md) > [catalogue](./kibana-plugin-server.capabilities.catalogue.md) + +## Capabilities.catalogue property + +Catalogue capabilities. Catalogue entries drive the visibility of the Kibana homepage options. + +Signature: + +```typescript +catalogue: Record; +``` diff --git a/docs/development/core/server/kibana-plugin-server.capabilities.management.md b/docs/development/core/server/kibana-plugin-server.capabilities.management.md new file mode 100644 index 00000000000000..d917c81dc37206 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilities.management.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [Capabilities](./kibana-plugin-server.capabilities.md) > [management](./kibana-plugin-server.capabilities.management.md) + +## Capabilities.management property + +Management section capabilities. + +Signature: + +```typescript +management: { + [sectionId: string]: Record; + }; +``` diff --git a/docs/development/core/server/kibana-plugin-server.capabilities.md b/docs/development/core/server/kibana-plugin-server.capabilities.md new file mode 100644 index 00000000000000..031282b9733acc --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilities.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [Capabilities](./kibana-plugin-server.capabilities.md) + +## Capabilities interface + +The read-only set of capabilities available for the current UI session. Capabilities are simple key-value pairs of (string, boolean), where the string denotes the capability ID, and the boolean is a flag indicating if the capability is enabled or disabled. + +Signature: + +```typescript +export interface Capabilities +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [catalogue](./kibana-plugin-server.capabilities.catalogue.md) | Record<string, boolean> | Catalogue capabilities. Catalogue entries drive the visibility of the Kibana homepage options. | +| [management](./kibana-plugin-server.capabilities.management.md) | {
    [sectionId: string]: Record<string, boolean>;
    } | Management section capabilities. | +| [navLinks](./kibana-plugin-server.capabilities.navlinks.md) | Record<string, boolean> | Navigation link capabilities. | + diff --git a/docs/development/core/server/kibana-plugin-server.capabilities.navlinks.md b/docs/development/core/server/kibana-plugin-server.capabilities.navlinks.md new file mode 100644 index 00000000000000..a1612ea840fbf7 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilities.navlinks.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [Capabilities](./kibana-plugin-server.capabilities.md) > [navLinks](./kibana-plugin-server.capabilities.navlinks.md) + +## Capabilities.navLinks property + +Navigation link capabilities. + +Signature: + +```typescript +navLinks: Record; +``` diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiesprovider.md b/docs/development/core/server/kibana-plugin-server.capabilitiesprovider.md new file mode 100644 index 00000000000000..66e5d256ada66b --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiesprovider.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesProvider](./kibana-plugin-server.capabilitiesprovider.md) + +## CapabilitiesProvider type + +See [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) + +Signature: + +```typescript +export declare type CapabilitiesProvider = () => Partial; +``` diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiessetup.md b/docs/development/core/server/kibana-plugin-server.capabilitiessetup.md new file mode 100644 index 00000000000000..27c42fe75e7517 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiessetup.md @@ -0,0 +1,27 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) + +## CapabilitiesSetup interface + +APIs to manage the [Capabilities](./kibana-plugin-server.capabilities.md) that will be used by the application. + +Plugins relying on capabilities to toggle some of their features should register them during the setup phase using the `registerProvider` method. + +Plugins having the responsibility to restrict capabilities depending on a given context should register their capabilities switcher using the `registerSwitcher` method. + +Refers to the methods documentation for complete description and examples. + +Signature: + +```typescript +export interface CapabilitiesSetup +``` + +## Methods + +| Method | Description | +| --- | --- | +| [registerProvider(provider)](./kibana-plugin-server.capabilitiessetup.registerprovider.md) | Register a [CapabilitiesProvider](./kibana-plugin-server.capabilitiesprovider.md) to be used to provide [Capabilities](./kibana-plugin-server.capabilities.md) when resolving them. | +| [registerSwitcher(switcher)](./kibana-plugin-server.capabilitiessetup.registerswitcher.md) | Register a [CapabilitiesSwitcher](./kibana-plugin-server.capabilitiesswitcher.md) to be used to change the default state of the [Capabilities](./kibana-plugin-server.capabilities.md) entries when resolving them.A capabilities switcher can only change the state of existing capabilities. Capabilities added or removed when invoking the switcher will be ignored. | + diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerprovider.md b/docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerprovider.md new file mode 100644 index 00000000000000..750913ee35895b --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerprovider.md @@ -0,0 +1,46 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) > [registerProvider](./kibana-plugin-server.capabilitiessetup.registerprovider.md) + +## CapabilitiesSetup.registerProvider() method + +Register a [CapabilitiesProvider](./kibana-plugin-server.capabilitiesprovider.md) to be used to provide [Capabilities](./kibana-plugin-server.capabilities.md) when resolving them. + +Signature: + +```typescript +registerProvider(provider: CapabilitiesProvider): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| provider | CapabilitiesProvider | | + +Returns: + +`void` + +## Example + +How to register a plugin's capabilities during setup + +```ts +// my-plugin/server/plugin.ts +public setup(core: CoreSetup, deps: {}) { + core.capabilities.registerProvider(() => { + return { + catalogue: { + myPlugin: true, + }, + myPlugin: { + someFeature: true, + featureDisabledByDefault: false, + }, + } + }); +} + +``` + diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerswitcher.md b/docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerswitcher.md new file mode 100644 index 00000000000000..fbaa2959c635c2 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiessetup.registerswitcher.md @@ -0,0 +1,47 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) > [registerSwitcher](./kibana-plugin-server.capabilitiessetup.registerswitcher.md) + +## CapabilitiesSetup.registerSwitcher() method + +Register a [CapabilitiesSwitcher](./kibana-plugin-server.capabilitiesswitcher.md) to be used to change the default state of the [Capabilities](./kibana-plugin-server.capabilities.md) entries when resolving them. + +A capabilities switcher can only change the state of existing capabilities. Capabilities added or removed when invoking the switcher will be ignored. + +Signature: + +```typescript +registerSwitcher(switcher: CapabilitiesSwitcher): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| switcher | CapabilitiesSwitcher | | + +Returns: + +`void` + +## Example + +How to restrict some capabilities + +```ts +// my-plugin/server/plugin.ts +public setup(core: CoreSetup, deps: {}) { + core.capabilities.registerSwitcher((request, capabilities) => { + if(myPluginApi.shouldRestrictSomePluginBecauseOf(request)) { + return { + somePlugin: { + featureEnabledByDefault: false // `featureEnabledByDefault` will be disabled. All other capabilities will remain unchanged. + } + } + } + return {}; // All capabilities will remain unchanged. + }); +} + +``` + diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiesstart.md b/docs/development/core/server/kibana-plugin-server.capabilitiesstart.md new file mode 100644 index 00000000000000..55cc1aed76b5b5 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiesstart.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesStart](./kibana-plugin-server.capabilitiesstart.md) + +## CapabilitiesStart interface + +APIs to access the application [Capabilities](./kibana-plugin-server.capabilities.md). + +Signature: + +```typescript +export interface CapabilitiesStart +``` + +## Methods + +| Method | Description | +| --- | --- | +| [resolveCapabilities(request)](./kibana-plugin-server.capabilitiesstart.resolvecapabilities.md) | Resolve the [Capabilities](./kibana-plugin-server.capabilities.md) to be used for given request | + diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiesstart.resolvecapabilities.md b/docs/development/core/server/kibana-plugin-server.capabilitiesstart.resolvecapabilities.md new file mode 100644 index 00000000000000..95b751dd4fc95f --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiesstart.resolvecapabilities.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesStart](./kibana-plugin-server.capabilitiesstart.md) > [resolveCapabilities](./kibana-plugin-server.capabilitiesstart.resolvecapabilities.md) + +## CapabilitiesStart.resolveCapabilities() method + +Resolve the [Capabilities](./kibana-plugin-server.capabilities.md) to be used for given request + +Signature: + +```typescript +resolveCapabilities(request: KibanaRequest): Promise; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| request | KibanaRequest | | + +Returns: + +`Promise` + diff --git a/docs/development/core/server/kibana-plugin-server.capabilitiesswitcher.md b/docs/development/core/server/kibana-plugin-server.capabilitiesswitcher.md new file mode 100644 index 00000000000000..dd6af543768965 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.capabilitiesswitcher.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CapabilitiesSwitcher](./kibana-plugin-server.capabilitiesswitcher.md) + +## CapabilitiesSwitcher type + +See [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) + +Signature: + +```typescript +export declare type CapabilitiesSwitcher = (request: KibanaRequest, uiCapabilities: Capabilities) => Partial | Promise>; +``` diff --git a/docs/development/core/server/kibana-plugin-server.coresetup.capabilities.md b/docs/development/core/server/kibana-plugin-server.coresetup.capabilities.md new file mode 100644 index 00000000000000..fe50347d97e3c4 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.coresetup.capabilities.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CoreSetup](./kibana-plugin-server.coresetup.md) > [capabilities](./kibana-plugin-server.coresetup.capabilities.md) + +## CoreSetup.capabilities property + +[CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) + +Signature: + +```typescript +capabilities: CapabilitiesSetup; +``` diff --git a/docs/development/core/server/kibana-plugin-server.coresetup.md b/docs/development/core/server/kibana-plugin-server.coresetup.md index 1ad1641beb83bf..3886b6e05e6570 100644 --- a/docs/development/core/server/kibana-plugin-server.coresetup.md +++ b/docs/development/core/server/kibana-plugin-server.coresetup.md @@ -16,6 +16,7 @@ export interface CoreSetup | Property | Type | Description | | --- | --- | --- | +| [capabilities](./kibana-plugin-server.coresetup.capabilities.md) | CapabilitiesSetup | [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) | | [context](./kibana-plugin-server.coresetup.context.md) | ContextSetup | [ContextSetup](./kibana-plugin-server.contextsetup.md) | | [elasticsearch](./kibana-plugin-server.coresetup.elasticsearch.md) | ElasticsearchServiceSetup | [ElasticsearchServiceSetup](./kibana-plugin-server.elasticsearchservicesetup.md) | | [http](./kibana-plugin-server.coresetup.http.md) | HttpServiceSetup | [HttpServiceSetup](./kibana-plugin-server.httpservicesetup.md) | diff --git a/docs/development/core/server/kibana-plugin-server.corestart.capabilities.md b/docs/development/core/server/kibana-plugin-server.corestart.capabilities.md new file mode 100644 index 00000000000000..03930d367ee75f --- /dev/null +++ b/docs/development/core/server/kibana-plugin-server.corestart.capabilities.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-server](./kibana-plugin-server.md) > [CoreStart](./kibana-plugin-server.corestart.md) > [capabilities](./kibana-plugin-server.corestart.capabilities.md) + +## CoreStart.capabilities property + +[CapabilitiesStart](./kibana-plugin-server.capabilitiesstart.md) + +Signature: + +```typescript +capabilities: CapabilitiesStart; +``` diff --git a/docs/development/core/server/kibana-plugin-server.corestart.md b/docs/development/core/server/kibana-plugin-server.corestart.md index a675c45a298201..e523717a37ac8e 100644 --- a/docs/development/core/server/kibana-plugin-server.corestart.md +++ b/docs/development/core/server/kibana-plugin-server.corestart.md @@ -16,5 +16,6 @@ export interface CoreStart | Property | Type | Description | | --- | --- | --- | +| [capabilities](./kibana-plugin-server.corestart.capabilities.md) | CapabilitiesStart | [CapabilitiesStart](./kibana-plugin-server.capabilitiesstart.md) | | [savedObjects](./kibana-plugin-server.corestart.savedobjects.md) | SavedObjectsServiceStart | [SavedObjectsServiceStart](./kibana-plugin-server.savedobjectsservicestart.md) | diff --git a/docs/development/core/server/kibana-plugin-server.md b/docs/development/core/server/kibana-plugin-server.md index 17c5136fdc3188..9144742c9bb73c 100644 --- a/docs/development/core/server/kibana-plugin-server.md +++ b/docs/development/core/server/kibana-plugin-server.md @@ -43,6 +43,9 @@ The plugin integrates with the core system via lifecycle events: `setup` | [AuthResultParams](./kibana-plugin-server.authresultparams.md) | Result of an incoming request authentication. | | [AuthToolkit](./kibana-plugin-server.authtoolkit.md) | A tool set defining an outcome of Auth interceptor for incoming request. | | [CallAPIOptions](./kibana-plugin-server.callapioptions.md) | The set of options that defines how API call should be made and result be processed. | +| [Capabilities](./kibana-plugin-server.capabilities.md) | The read-only set of capabilities available for the current UI session. Capabilities are simple key-value pairs of (string, boolean), where the string denotes the capability ID, and the boolean is a flag indicating if the capability is enabled or disabled. | +| [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) | APIs to manage the [Capabilities](./kibana-plugin-server.capabilities.md) that will be used by the application.Plugins relying on capabilities to toggle some of their features should register them during the setup phase using the registerProvider method.Plugins having the responsibility to restrict capabilities depending on a given context should register their capabilities switcher using the registerSwitcher method.Refers to the methods documentation for complete description and examples. | +| [CapabilitiesStart](./kibana-plugin-server.capabilitiesstart.md) | APIs to access the application [Capabilities](./kibana-plugin-server.capabilities.md). | | [ContextSetup](./kibana-plugin-server.contextsetup.md) | An object that handles registration of context providers and configuring handlers with context. | | [CoreSetup](./kibana-plugin-server.coresetup.md) | Context passed to the plugins setup method. | | [CoreStart](./kibana-plugin-server.corestart.md) | Context passed to the plugins start method. | @@ -144,6 +147,8 @@ The plugin integrates with the core system via lifecycle events: `setup` | [AuthenticationHandler](./kibana-plugin-server.authenticationhandler.md) | See [AuthToolkit](./kibana-plugin-server.authtoolkit.md). | | [AuthHeaders](./kibana-plugin-server.authheaders.md) | Auth Headers map | | [AuthResult](./kibana-plugin-server.authresult.md) | | +| [CapabilitiesProvider](./kibana-plugin-server.capabilitiesprovider.md) | See [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) | +| [CapabilitiesSwitcher](./kibana-plugin-server.capabilitiesswitcher.md) | See [CapabilitiesSetup](./kibana-plugin-server.capabilitiessetup.md) | | [ConfigPath](./kibana-plugin-server.configpath.md) | | | [ElasticsearchClientConfig](./kibana-plugin-server.elasticsearchclientconfig.md) | | | [GetAuthHeaders](./kibana-plugin-server.getauthheaders.md) | Get headers to authenticate a user against Elasticsearch. | diff --git a/src/core/public/application/application_service.test.tsx b/src/core/public/application/application_service.test.tsx index 5b374218a59324..19a208aeefb372 100644 --- a/src/core/public/application/application_service.test.tsx +++ b/src/core/public/application/application_service.test.tsx @@ -136,7 +136,7 @@ describe('#start()', () => { expect(MockCapabilitiesService.start).toHaveBeenCalledWith({ apps: new Map([['app1', { id: 'app1' }]]), legacyApps: new Map(), - injectedMetadata, + http, }); }); @@ -153,7 +153,7 @@ describe('#start()', () => { expect(MockCapabilitiesService.start).toHaveBeenCalledWith({ apps: new Map(), legacyApps: new Map([['legacyApp1', { id: 'legacyApp1' }]]), - injectedMetadata, + http, }); }); diff --git a/src/core/public/application/application_service.tsx b/src/core/public/application/application_service.tsx index 935844baddf86a..45ca7f3fe7f7b9 100644 --- a/src/core/public/application/application_service.tsx +++ b/src/core/public/application/application_service.tsx @@ -111,9 +111,9 @@ export class ApplicationService { const legacyMode = injectedMetadata.getLegacyMode(); const currentAppId$ = new BehaviorSubject(undefined); const { availableApps, availableLegacyApps, capabilities } = await this.capabilities.start({ + http, apps: new Map([...this.apps$.value].map(([id, { app }]) => [id, app])), legacyApps: this.legacyApps$.value, - injectedMetadata, }); // Only setup history if we're not in legacy mode diff --git a/src/core/public/application/capabilities/capabilities_service.test.ts b/src/core/public/application/capabilities/capabilities_service.test.ts index e80e9a7af321a8..3245be8dd502d9 100644 --- a/src/core/public/application/capabilities/capabilities_service.test.ts +++ b/src/core/public/application/capabilities/capabilities_service.test.ts @@ -17,32 +17,35 @@ * under the License. */ -import { InjectedMetadataService } from '../../injected_metadata'; +import { httpServiceMock, HttpSetupMock } from '../../http/http_service.mock'; import { CapabilitiesService } from './capabilities_service'; import { LegacyApp, App } from '../types'; +const mockedCapabilities = { + catalogue: {}, + management: {}, + navLinks: { + app1: true, + app2: false, + legacyApp1: true, + legacyApp2: false, + }, + foo: { feature: true }, + bar: { feature: true }, +}; + describe('#start', () => { - const injectedMetadata = new InjectedMetadataService({ - injectedMetadata: { - version: 'kibanaVersion', - capabilities: { - catalogue: {}, - management: {}, - navLinks: { - app1: true, - app2: false, - legacyApp1: true, - legacyApp2: false, - }, - foo: { feature: true }, - bar: { feature: true }, - }, - } as any, - }).start(); + let http: HttpSetupMock; + + beforeEach(() => { + http = httpServiceMock.createStartContract(); + http.post.mockReturnValue(Promise.resolve(mockedCapabilities)); + }); const apps = new Map([ ['app1', { id: 'app1' }], ['app2', { id: 'app2', capabilities: { app2: { feature: true } } }], + ['appMissingInCapabilities', { id: 'appMissingInCapabilities' }], ] as Array<[string, App]>); const legacyApps = new Map([ ['legacyApp1', { id: 'legacyApp1' }], @@ -51,8 +54,13 @@ describe('#start', () => { it('filters available apps based on returned navLinks', async () => { const service = new CapabilitiesService(); - const startContract = await service.start({ apps, legacyApps, injectedMetadata }); - expect(startContract.availableApps).toEqual(new Map([['app1', { id: 'app1' }]])); + const startContract = await service.start({ apps, legacyApps, http }); + expect(startContract.availableApps).toEqual( + new Map([ + ['app1', { id: 'app1' }], + ['appMissingInCapabilities', { id: 'appMissingInCapabilities' }], + ]) + ); expect(startContract.availableLegacyApps).toEqual( new Map([['legacyApp1', { id: 'legacyApp1' }]]) ); @@ -63,7 +71,7 @@ describe('#start', () => { const { capabilities } = await service.start({ apps, legacyApps, - injectedMetadata, + http, }); // @ts-ignore TypeScript knows this shouldn't be possible diff --git a/src/core/public/application/capabilities/capabilities_service.tsx b/src/core/public/application/capabilities/capabilities_service.tsx index b080f8c138cf28..e330a4b0326aeb 100644 --- a/src/core/public/application/capabilities/capabilities_service.tsx +++ b/src/core/public/application/capabilities/capabilities_service.tsx @@ -17,38 +17,18 @@ * under the License. */ +import { Capabilities } from '../../../types/capabilities'; import { deepFreeze, RecursiveReadonly } from '../../../utils'; import { LegacyApp, App } from '../types'; -import { InjectedMetadataStart } from '../../injected_metadata'; +import { HttpStart } from '../../http'; interface StartDeps { apps: ReadonlyMap; legacyApps: ReadonlyMap; - injectedMetadata: InjectedMetadataStart; + http: HttpStart; } -/** - * The read-only set of capabilities available for the current UI session. - * Capabilities are simple key-value pairs of (string, boolean), where the string denotes the capability ID, - * and the boolean is a flag indicating if the capability is enabled or disabled. - * - * @public - */ -export interface Capabilities { - /** Navigation link capabilities. */ - navLinks: Record; - - /** Management section capabilities. */ - management: { - [sectionId: string]: Record; - }; - - /** Catalogue capabilities. Catalogue entries drive the visibility of the Kibana homepage options. */ - catalogue: Record; - - /** Custom capabilities, registered by plugins. */ - [key: string]: Record>; -} +export { Capabilities }; /** @internal */ export interface CapabilitiesStart { @@ -62,12 +42,9 @@ export interface CapabilitiesStart { * @internal */ export class CapabilitiesService { - public async start({ - apps, - legacyApps, - injectedMetadata, - }: StartDeps): Promise { - const capabilities = deepFreeze(injectedMetadata.getCapabilities()); + public async start({ apps, legacyApps, http }: StartDeps): Promise { + const capabilities = await this.fetchCapabilities(http, [...apps.keys(), ...legacyApps.keys()]); + const availableApps = new Map( [...apps].filter( ([appId]) => @@ -88,4 +65,18 @@ export class CapabilitiesService { capabilities, }; } + + private async fetchCapabilities(http: HttpStart, appIds: string[]): Promise { + const payload = JSON.stringify({ + applications: appIds, + }); + + const url = http.anonymousPaths.isAnonymous(window.location.pathname) + ? '/api/core/capabilities/defaults' + : '/api/core/capabilities'; + const capabilities = await http.post(url, { + body: payload, + }); + return deepFreeze(capabilities); + } } diff --git a/src/core/public/http/http_service.mock.ts b/src/core/public/http/http_service.mock.ts index 52f188c7b20a0a..fe7c749091b03a 100644 --- a/src/core/public/http/http_service.mock.ts +++ b/src/core/public/http/http_service.mock.ts @@ -23,11 +23,11 @@ import { BehaviorSubject } from 'rxjs'; import { BasePath } from './base_path_service'; import { AnonymousPaths } from './anonymous_paths'; -type ServiceSetupMockType = jest.Mocked & { +export type HttpSetupMock = jest.Mocked & { basePath: BasePath; }; -const createServiceMock = ({ basePath = '' } = {}): ServiceSetupMockType => ({ +const createServiceMock = ({ basePath = '' } = {}): HttpSetupMock => ({ fetch: jest.fn(), get: jest.fn(), head: jest.fn(), diff --git a/src/core/public/injected_metadata/injected_metadata_service.mock.ts b/src/core/public/injected_metadata/injected_metadata_service.mock.ts index 9e1d5aeec7ff49..9dfe0191166697 100644 --- a/src/core/public/injected_metadata/injected_metadata_service.mock.ts +++ b/src/core/public/injected_metadata/injected_metadata_service.mock.ts @@ -23,7 +23,6 @@ const createSetupContractMock = () => { getBasePath: jest.fn(), getKibanaVersion: jest.fn(), getKibanaBranch: jest.fn(), - getCapabilities: jest.fn(), getCspConfig: jest.fn(), getLegacyMode: jest.fn(), getLegacyMetadata: jest.fn(), @@ -32,7 +31,6 @@ const createSetupContractMock = () => { getInjectedVars: jest.fn(), getKibanaBuildNumber: jest.fn(), }; - setupContract.getCapabilities.mockReturnValue({} as any); setupContract.getCspConfig.mockReturnValue({ warnLegacyBrowsers: true }); setupContract.getKibanaVersion.mockReturnValue('kibanaVersion'); setupContract.getLegacyMode.mockReturnValue(true); diff --git a/src/core/public/injected_metadata/injected_metadata_service.ts b/src/core/public/injected_metadata/injected_metadata_service.ts index 002f83d9feac47..0bde1b68e1876a 100644 --- a/src/core/public/injected_metadata/injected_metadata_service.ts +++ b/src/core/public/injected_metadata/injected_metadata_service.ts @@ -26,7 +26,6 @@ import { UserProvidedValues, } from '../../server/types'; import { deepFreeze } from '../../utils/'; -import { Capabilities } from '..'; /** @public */ export interface LegacyNavLink { @@ -64,7 +63,6 @@ export interface InjectedMetadataParams { packageInfo: Readonly; }; uiPlugins: InjectedPluginMetadata[]; - capabilities: Capabilities; legacyMode: boolean; legacyMetadata: { app: unknown; @@ -114,10 +112,6 @@ export class InjectedMetadataService { return this.state.version; }, - getCapabilities: () => { - return this.state.capabilities; - }, - getCspConfig: () => { return this.state.csp; }, @@ -163,7 +157,6 @@ export interface InjectedMetadataSetup { getKibanaBuildNumber: () => number; getKibanaBranch: () => string; getKibanaVersion: () => string; - getCapabilities: () => Capabilities; getCspConfig: () => { warnLegacyBrowsers: boolean; }; diff --git a/src/core/server/capabilities/capabilities_service.mock.ts b/src/core/server/capabilities/capabilities_service.mock.ts new file mode 100644 index 00000000000000..3f31eca8339d8d --- /dev/null +++ b/src/core/server/capabilities/capabilities_service.mock.ts @@ -0,0 +1,50 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CapabilitiesService, CapabilitiesSetup, CapabilitiesStart } from './capabilities_service'; + +const createSetupContractMock = () => { + const setupContract: jest.Mocked = { + registerProvider: jest.fn(), + registerSwitcher: jest.fn(), + }; + return setupContract; +}; + +const createStartContractMock = () => { + const setupContract: jest.Mocked = { + resolveCapabilities: jest.fn().mockReturnValue(Promise.resolve({})), + }; + return setupContract; +}; + +type CapabilitiesServiceContract = PublicMethodsOf; +const createMock = () => { + const mocked: jest.Mocked = { + setup: jest.fn().mockReturnValue(createSetupContractMock()), + start: jest.fn().mockReturnValue(createStartContractMock()), + }; + return mocked; +}; + +export const capabilitiesServiceMock = { + create: createMock, + createSetupContract: createSetupContractMock, + createStartContract: createStartContractMock, +}; diff --git a/src/core/server/capabilities/capabilities_service.test.ts b/src/core/server/capabilities/capabilities_service.test.ts new file mode 100644 index 00000000000000..aace0b9debf9c0 --- /dev/null +++ b/src/core/server/capabilities/capabilities_service.test.ts @@ -0,0 +1,188 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { httpServiceMock, HttpServiceSetupMock } from '../http/http_service.mock'; +import { mockRouter, RouterMock } from '../http/router/router.mock'; +import { CapabilitiesService, CapabilitiesSetup } from './capabilities_service'; +import { mockCoreContext } from '../core_context.mock'; + +describe('CapabilitiesService', () => { + let http: HttpServiceSetupMock; + let service: CapabilitiesService; + let setup: CapabilitiesSetup; + let router: RouterMock; + + beforeEach(() => { + http = httpServiceMock.createSetupContract(); + router = mockRouter.create(); + http.createRouter.mockReturnValue(router); + service = new CapabilitiesService(mockCoreContext.create()); + }); + + describe('#setup()', () => { + beforeEach(() => { + setup = service.setup({ http }); + }); + + it('registers the capabilities routes', async () => { + expect(http.createRouter).toHaveBeenCalledWith('/api/core/capabilities'); + expect(router.post).toHaveBeenCalledTimes(2); + expect(router.post).toHaveBeenCalledWith(expect.any(Object), expect.any(Function)); + }); + + it('allows to register a capabilities provider', async () => { + setup.registerProvider(() => ({ + navLinks: { myLink: true }, + catalogue: { myPlugin: true }, + })); + const start = service.start(); + expect(await start.resolveCapabilities({} as any)).toMatchInlineSnapshot(` + Object { + "catalogue": Object { + "myPlugin": true, + }, + "management": Object {}, + "navLinks": Object { + "myLink": true, + }, + } + `); + }); + + it('allows to register multiple capabilities providers', async () => { + setup.registerProvider(() => ({ + navLinks: { A: true }, + catalogue: { A: true }, + })); + setup.registerProvider(() => ({ + navLinks: { B: true }, + catalogue: { B: true }, + })); + setup.registerProvider(() => ({ + navLinks: { C: true }, + customSection: { + C: true, + }, + })); + const start = service.start(); + expect(await start.resolveCapabilities({} as any)).toMatchInlineSnapshot(` + Object { + "catalogue": Object { + "A": true, + "B": true, + }, + "customSection": Object { + "C": true, + }, + "management": Object {}, + "navLinks": Object { + "A": true, + "B": true, + "C": true, + }, + } + `); + }); + + it('allows to register capabilities switchers', async () => { + setup.registerProvider(() => ({ + catalogue: { a: true, b: true, c: true }, + })); + setup.registerSwitcher((req, capabilities) => { + return { + ...capabilities, + catalogue: { + ...capabilities.catalogue, + b: false, + }, + }; + }); + const start = service.start(); + expect(await start.resolveCapabilities({} as any)).toMatchInlineSnapshot(` + Object { + "catalogue": Object { + "a": true, + "b": false, + "c": true, + }, + "management": Object {}, + "navLinks": Object {}, + } + `); + }); + + it('allows to register multiple providers and switchers', async () => { + setup.registerProvider(() => ({ + navLinks: { a: true }, + catalogue: { a: true }, + })); + setup.registerProvider(() => ({ + navLinks: { b: true }, + catalogue: { b: true }, + })); + setup.registerProvider(() => ({ + navLinks: { c: true }, + catalogue: { c: true }, + customSection: { + c: true, + }, + })); + setup.registerSwitcher((req, capabilities) => { + return { + catalogue: { + b: false, + }, + }; + }); + + setup.registerSwitcher((req, capabilities) => { + return { + navLinks: { c: false }, + }; + }); + setup.registerSwitcher((req, capabilities) => { + return { + customSection: { + c: false, + }, + }; + }); + + const start = service.start(); + expect(await start.resolveCapabilities({} as any)).toMatchInlineSnapshot(` + Object { + "catalogue": Object { + "a": true, + "b": false, + "c": true, + }, + "customSection": Object { + "c": false, + }, + "management": Object {}, + "navLinks": Object { + "a": true, + "b": true, + "c": false, + }, + } + `); + }); + }); +}); diff --git a/src/core/server/capabilities/capabilities_service.ts b/src/core/server/capabilities/capabilities_service.ts new file mode 100644 index 00000000000000..d3d6b507da5230 --- /dev/null +++ b/src/core/server/capabilities/capabilities_service.ts @@ -0,0 +1,156 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Capabilities, CapabilitiesProvider, CapabilitiesSwitcher } from './types'; +import { CoreContext } from '../core_context'; +import { Logger } from '../logging'; +import { InternalHttpServiceSetup, KibanaRequest } from '../http'; +import { mergeCapabilities } from './merge_capabilities'; +import { getCapabilitiesResolver, CapabilitiesResolver } from './resolve_capabilities'; +import { registerRoutes } from './routes'; + +/** + * APIs to manage the {@link Capabilities} that will be used by the application. + * + * Plugins relying on capabilities to toggle some of their features should register them during the setup phase + * using the `registerProvider` method. + * + * Plugins having the responsibility to restrict capabilities depending on a given context should register + * their capabilities switcher using the `registerSwitcher` method. + * + * Refers to the methods documentation for complete description and examples. + * + * @public + */ +export interface CapabilitiesSetup { + /** + * Register a {@link CapabilitiesProvider} to be used to provide {@link Capabilities} + * when resolving them. + * + * @example + * How to register a plugin's capabilities during setup + * ```ts + * // my-plugin/server/plugin.ts + * public setup(core: CoreSetup, deps: {}) { + * core.capabilities.registerProvider(() => { + * return { + * catalogue: { + * myPlugin: true, + * }, + * myPlugin: { + * someFeature: true, + * featureDisabledByDefault: false, + * }, + * } + * }); + * } + * ``` + */ + registerProvider(provider: CapabilitiesProvider): void; + + /** + * Register a {@link CapabilitiesSwitcher} to be used to change the default state + * of the {@link Capabilities} entries when resolving them. + * + * A capabilities switcher can only change the state of existing capabilities. + * Capabilities added or removed when invoking the switcher will be ignored. + * + * @example + * How to restrict some capabilities + * ```ts + * // my-plugin/server/plugin.ts + * public setup(core: CoreSetup, deps: {}) { + * core.capabilities.registerSwitcher((request, capabilities) => { + * if(myPluginApi.shouldRestrictSomePluginBecauseOf(request)) { + * return { + * somePlugin: { + * featureEnabledByDefault: false // `featureEnabledByDefault` will be disabled. All other capabilities will remain unchanged. + * } + * } + * } + * return {}; // All capabilities will remain unchanged. + * }); + * } + * ``` + */ + registerSwitcher(switcher: CapabilitiesSwitcher): void; +} + +/** + * APIs to access the application {@link Capabilities}. + * + * @public + */ +export interface CapabilitiesStart { + /** + * Resolve the {@link Capabilities} to be used for given request + */ + resolveCapabilities(request: KibanaRequest): Promise; +} + +interface SetupDeps { + http: InternalHttpServiceSetup; +} + +const defaultCapabilities: Capabilities = { + navLinks: {}, + management: {}, + catalogue: {}, +}; + +/** @internal */ +export class CapabilitiesService { + private readonly logger: Logger; + private readonly capabilitiesProviders: CapabilitiesProvider[] = []; + private readonly capabilitiesSwitchers: CapabilitiesSwitcher[] = []; + private readonly resolveCapabilities: CapabilitiesResolver; + + constructor(core: CoreContext) { + this.logger = core.logger.get('capabilities-service'); + this.resolveCapabilities = getCapabilitiesResolver( + () => + mergeCapabilities( + defaultCapabilities, + ...this.capabilitiesProviders.map(provider => provider()) + ), + () => this.capabilitiesSwitchers + ); + } + + public setup(setupDeps: SetupDeps): CapabilitiesSetup { + this.logger.debug('Setting up capabilities service'); + + registerRoutes(setupDeps.http, this.resolveCapabilities); + + return { + registerProvider: (provider: CapabilitiesProvider) => { + this.capabilitiesProviders.push(provider); + }, + registerSwitcher: (switcher: CapabilitiesSwitcher) => { + this.capabilitiesSwitchers.push(switcher); + }, + }; + } + + public start(): CapabilitiesStart { + return { + resolveCapabilities: request => this.resolveCapabilities(request, []), + }; + } +} diff --git a/src/core/server/capabilities/index.ts b/src/core/server/capabilities/index.ts new file mode 100644 index 00000000000000..ac9454f01391c2 --- /dev/null +++ b/src/core/server/capabilities/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { CapabilitiesService, CapabilitiesSetup, CapabilitiesStart } from './capabilities_service'; +export { Capabilities, CapabilitiesSwitcher, CapabilitiesProvider } from './types'; diff --git a/src/core/server/capabilities/integration_tests/capabilities_service.test.ts b/src/core/server/capabilities/integration_tests/capabilities_service.test.ts new file mode 100644 index 00000000000000..6be9846f5a86a5 --- /dev/null +++ b/src/core/server/capabilities/integration_tests/capabilities_service.test.ts @@ -0,0 +1,95 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import supertest from 'supertest'; +import { HttpService, InternalHttpServiceSetup } from '../../http'; +import { contextServiceMock } from '../../context/context_service.mock'; +import { loggingServiceMock } from '../../logging/logging_service.mock'; +import { Env } from '../../config'; +import { getEnvOptions } from '../../config/__mocks__/env'; +import { CapabilitiesService, CapabilitiesSetup } from '..'; +import { createHttpServer } from '../../http/test_utils'; + +const coreId = Symbol('core'); +const env = Env.createDefault(getEnvOptions()); + +describe('CapabilitiesService', () => { + let server: HttpService; + let httpSetup: InternalHttpServiceSetup; + + let service: CapabilitiesService; + let serviceSetup: CapabilitiesSetup; + + beforeEach(async () => { + server = createHttpServer(); + httpSetup = await server.setup({ + context: contextServiceMock.createSetupContract(), + }); + service = new CapabilitiesService({ + coreId, + env, + logger: loggingServiceMock.create(), + configService: {} as any, + }); + serviceSetup = await service.setup({ http: httpSetup }); + await server.start(); + }); + + afterEach(async () => { + await server.stop(); + }); + + describe('/api/core/capabilities route', () => { + it('is exposed', async () => { + const result = await supertest(httpSetup.server.listener) + .post('/api/core/capabilities') + .send({ applications: [] }) + .expect(200); + expect(result.body).toMatchInlineSnapshot(` + Object { + "catalogue": Object {}, + "management": Object {}, + "navLinks": Object {}, + } + `); + }); + + it('uses the service capabilities providers', async () => { + serviceSetup.registerProvider(() => ({ + catalogue: { + something: true, + }, + })); + + const result = await supertest(httpSetup.server.listener) + .post('/api/core/capabilities') + .send({ applications: [] }) + .expect(200); + expect(result.body).toMatchInlineSnapshot(` + Object { + "catalogue": Object { + "something": true, + }, + "management": Object {}, + "navLinks": Object {}, + } + `); + }); + }); +}); diff --git a/src/core/server/capabilities/merge_capabilities.test.ts b/src/core/server/capabilities/merge_capabilities.test.ts new file mode 100644 index 00000000000000..ca30dc4bf2f81c --- /dev/null +++ b/src/core/server/capabilities/merge_capabilities.test.ts @@ -0,0 +1,76 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { mergeCapabilities } from './merge_capabilities'; + +describe('mergeCapabilities', () => { + it('merges empty object with non-empty object', () => { + const capabilities = mergeCapabilities({ foo: {} }, { foo: { bar: true } }); + expect(capabilities).toEqual({ foo: { bar: true } }); + }); + + it('merges nested object properties', () => { + const capabilities = mergeCapabilities({ foo: { baz: true } }, { foo: { bar: true } }); + expect(capabilities).toEqual({ foo: { bar: true, baz: true } }); + }); + + it('merges all object properties', () => { + const capabilities = mergeCapabilities({ foo: { bar: true } }, { hello: { dolly: true } }); + expect(capabilities).toEqual({ foo: { bar: true }, hello: { dolly: true } }); + }); + + it('merges boolean as same path if they are equals', () => { + const capabilities = mergeCapabilities( + { foo: { bar: true, dolly: false, a: true } }, + { foo: { bar: true, dolly: false, b: false } } + ); + expect(capabilities).toEqual({ foo: { bar: true, dolly: false, a: true, b: false } }); + }); + + it('throws if boolean at same path are not equals', () => { + expect(() => { + mergeCapabilities({ foo: { bar: false } }, { foo: { bar: true } }); + }).toThrowErrorMatchingInlineSnapshot( + `"conflict trying to merge booleans with different values"` + ); + + expect(() => { + mergeCapabilities({ foo: { bar: true } }, { foo: { bar: false } }); + }).toThrowErrorMatchingInlineSnapshot( + `"conflict trying to merge booleans with different values"` + ); + }); + + it('throws if value as same path is boolean on left and object on right', () => { + expect(() => { + mergeCapabilities({ foo: { bar: false } }, { foo: { bar: {} } }); + }).toThrowErrorMatchingInlineSnapshot(`"conflict trying to merge boolean with object"`); + expect(() => { + mergeCapabilities({ foo: { bar: false } }, { foo: { bar: { baz: false } } }); + }).toThrowErrorMatchingInlineSnapshot(`"conflict trying to merge boolean with object"`); + }); + + it('should not alter the input capabilities', () => { + const left = { foo: { bar: true } }; + const right = { hello: { dolly: true } }; + mergeCapabilities(left, right); + expect(left).toEqual({ foo: { bar: true } }); + expect(right).toEqual({ hello: { dolly: true } }); + }); +}); diff --git a/src/legacy/server/capabilities/merge_capabilities.ts b/src/core/server/capabilities/merge_capabilities.ts similarity index 60% rename from src/legacy/server/capabilities/merge_capabilities.ts rename to src/core/server/capabilities/merge_capabilities.ts index 5fe31775ba32d8..95296346ad8353 100644 --- a/src/legacy/server/capabilities/merge_capabilities.ts +++ b/src/core/server/capabilities/merge_capabilities.ts @@ -17,28 +17,19 @@ * under the License. */ -import typeDetect from 'type-detect'; import { merge } from 'lodash'; -import { Capabilities } from '../../../core/public'; +import { Capabilities } from './types'; export const mergeCapabilities = (...sources: Array>): Capabilities => - merge( - { - navLinks: {}, - management: {}, - catalogue: {}, - }, - ...sources, - (a: any, b: any) => { - if ( - (typeDetect(a) === 'boolean' && typeDetect(b) === 'Object') || - (typeDetect(b) === 'boolean' && typeDetect(a) === 'Object') - ) { - throw new Error(`a boolean and an object can't be merged`); - } + merge({}, ...sources, (a: any, b: any) => { + if ( + (typeof a === 'boolean' && typeof b === 'object') || + (typeof a === 'object' && typeof b === 'boolean') + ) { + throw new Error(`conflict trying to merge boolean with object`); + } - if (typeDetect(a) === 'boolean' && typeDetect(b) === 'boolean' && a !== b) { - throw new Error(`"true" and "false" can't be merged`); - } + if (typeof a === 'boolean' && typeof b === 'boolean' && a !== b) { + throw new Error(`conflict trying to merge booleans with different values`); } - ); + }); diff --git a/src/core/server/capabilities/resolve_capabilities.test.ts b/src/core/server/capabilities/resolve_capabilities.test.ts new file mode 100644 index 00000000000000..372efeff21ae26 --- /dev/null +++ b/src/core/server/capabilities/resolve_capabilities.test.ts @@ -0,0 +1,164 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Capabilities } from './types'; +import { resolveCapabilities } from './resolve_capabilities'; +import { KibanaRequest } from '../http'; +import { httpServerMock } from '../http/http_server.mocks'; + +describe('resolveCapabilities', () => { + let defaultCaps: Capabilities; + let request: KibanaRequest; + + beforeEach(() => { + defaultCaps = { + navLinks: {}, + catalogue: {}, + management: {}, + }; + request = httpServerMock.createKibanaRequest(); + }); + + it('returns the initial capabilities if no switcher are used', async () => { + const result = await resolveCapabilities(defaultCaps, [], request, []); + expect(result).toEqual(defaultCaps); + }); + + it('applies the switcher to the capabilities ', async () => { + const caps = { + ...defaultCaps, + catalogue: { + A: true, + B: true, + }, + }; + const switcher = (req: KibanaRequest, capabilities: Capabilities) => ({ + ...capabilities, + catalogue: { + ...capabilities.catalogue, + A: false, + }, + }); + const result = await resolveCapabilities(caps, [switcher], request, []); + expect(result).toMatchInlineSnapshot(` + Object { + "catalogue": Object { + "A": false, + "B": true, + }, + "management": Object {}, + "navLinks": Object {}, + } + `); + }); + + it('does not mutate the input capabilities', async () => { + const caps = { + ...defaultCaps, + catalogue: { + A: true, + B: true, + }, + }; + const switcher = (req: KibanaRequest, capabilities: Capabilities) => ({ + ...capabilities, + catalogue: { + ...capabilities.catalogue, + A: false, + }, + }); + await resolveCapabilities(caps, [switcher], request, []); + expect(caps.catalogue).toEqual({ + A: true, + B: true, + }); + }); + + it('ignores any added capability from the switcher', async () => { + const caps = { + ...defaultCaps, + catalogue: { + A: true, + B: true, + }, + }; + const switcher = (req: KibanaRequest, capabilities: Capabilities) => ({ + ...capabilities, + catalogue: { + ...capabilities.catalogue, + C: false, + }, + }); + const result = await resolveCapabilities(caps, [switcher], request, []); + expect(result.catalogue).toEqual({ + A: true, + B: true, + }); + }); + + it('ignores any removed capability from the switcher', async () => { + const caps = { + ...defaultCaps, + catalogue: { + A: true, + B: true, + C: true, + }, + }; + const switcher = (req: KibanaRequest, capabilities: Capabilities) => ({ + ...capabilities, + catalogue: Object.entries(capabilities.catalogue) + .filter(([key]) => key !== 'B') + .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}), + }); + const result = await resolveCapabilities(caps, [switcher], request, []); + expect(result.catalogue).toEqual({ + A: true, + B: true, + C: true, + }); + }); + + it('ignores any capability type mutation from the switcher', async () => { + const caps = { + ...defaultCaps, + section: { + boolean: true, + record: { + entry: true, + }, + }, + }; + const switcher = (req: KibanaRequest, capabilities: Capabilities) => ({ + section: { + boolean: { + entry: false, + }, + record: false, + }, + }); + const result = await resolveCapabilities(caps, [switcher], request, []); + expect(result.section).toEqual({ + boolean: true, + record: { + entry: true, + }, + }); + }); +}); diff --git a/src/core/server/capabilities/resolve_capabilities.ts b/src/core/server/capabilities/resolve_capabilities.ts new file mode 100644 index 00000000000000..dcb93bdca5f167 --- /dev/null +++ b/src/core/server/capabilities/resolve_capabilities.ts @@ -0,0 +1,85 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { cloneDeep } from 'lodash'; +import { Capabilities, CapabilitiesSwitcher } from './types'; +import { KibanaRequest } from '../http'; + +export type CapabilitiesResolver = ( + request: KibanaRequest, + applications: string[] +) => Promise; + +export const getCapabilitiesResolver = ( + capabilities: () => Capabilities, + switchers: () => CapabilitiesSwitcher[] +): CapabilitiesResolver => async ( + request: KibanaRequest, + applications: string[] +): Promise => { + return resolveCapabilities(capabilities(), switchers(), request, applications); +}; + +export const resolveCapabilities = async ( + capabilities: Capabilities, + switchers: CapabilitiesSwitcher[], + request: KibanaRequest, + applications: string[] +): Promise => { + const mergedCaps = cloneDeep({ + ...capabilities, + navLinks: applications.reduce( + (acc, app) => ({ + ...acc, + [app]: true, + }), + capabilities.navLinks + ), + }); + return switchers.reduce(async (caps, switcher) => { + const resolvedCaps = await caps; + const changes = await switcher(request, resolvedCaps); + return recursiveApplyChanges(resolvedCaps, changes); + }, Promise.resolve(mergedCaps)); +}; + +function recursiveApplyChanges< + TDestination extends Record, + TSource extends Record +>(destination: TDestination, source: TSource): TDestination { + return Object.keys(destination) + .map(key => { + const orig = destination[key]; + const changed = source[key]; + if (changed == null) { + return [key, orig]; + } + if (typeof orig === 'object' && typeof changed === 'object') { + return [key, recursiveApplyChanges(orig, changed)]; + } + return [key, typeof orig === typeof changed ? changed : orig]; + }) + .reduce( + (acc, [key, value]) => ({ + ...acc, + [key]: value, + }), + {} as TDestination + ); +} diff --git a/src/core/server/capabilities/routes/index.ts b/src/core/server/capabilities/routes/index.ts new file mode 100644 index 00000000000000..ccaa4621d70035 --- /dev/null +++ b/src/core/server/capabilities/routes/index.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CapabilitiesResolver } from '../resolve_capabilities'; +import { InternalHttpServiceSetup } from '../../http'; +import { registerCapabilitiesRoutes } from './resolve_capabilities'; + +export function registerRoutes(http: InternalHttpServiceSetup, resolver: CapabilitiesResolver) { + const router = http.createRouter('/api/core/capabilities'); + registerCapabilitiesRoutes(router, resolver); +} diff --git a/src/core/server/capabilities/routes/resolve_capabilities.ts b/src/core/server/capabilities/routes/resolve_capabilities.ts new file mode 100644 index 00000000000000..5e1d49b4b1b7e8 --- /dev/null +++ b/src/core/server/capabilities/routes/resolve_capabilities.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema } from '@kbn/config-schema'; +import { IRouter } from '../../http'; +import { CapabilitiesResolver } from '../resolve_capabilities'; + +export function registerCapabilitiesRoutes(router: IRouter, resolver: CapabilitiesResolver) { + // Capabilities are fetched on both authenticated and anonymous routes. + // However when `authRequired` is false, authentication is not performed + // and only default capabilities are returned (all disabled), even for authenticated users. + // So we need two endpoints to handle both scenarios. + [true, false].forEach(authRequired => { + router.post( + { + path: authRequired ? '' : '/defaults', + options: { + authRequired, + }, + validate: { + body: schema.object({ + applications: schema.arrayOf(schema.string()), + }), + }, + }, + async (ctx, req, res) => { + const { applications } = req.body; + const capabilities = await resolver(req, applications); + return res.ok({ + body: capabilities, + }); + } + ); + }); +} diff --git a/src/core/public/application/capabilities/merge_capabilities.ts b/src/core/server/capabilities/types.ts similarity index 63% rename from src/core/public/application/capabilities/merge_capabilities.ts rename to src/core/server/capabilities/types.ts index 55841717985b7e..105233761a4377 100644 --- a/src/core/public/application/capabilities/merge_capabilities.ts +++ b/src/core/server/capabilities/types.ts @@ -17,23 +17,22 @@ * under the License. */ -import { Capabilities } from './capabilities_service'; +import { Capabilities } from '../../types/capabilities'; +import { KibanaRequest } from '../http'; -export const mergeCapabilities = (...sources: Array>) => - sources.reduce( - (capabilities, source) => { - Object.entries(source).forEach(([key, value]) => { - capabilities[key] = { - ...value, - ...capabilities[key], - }; - }); +export { Capabilities }; - return capabilities; - }, - { - navLinks: {}, - management: {}, - catalogue: {}, - } - ); +/** + * See {@link CapabilitiesSetup} + * @public + */ +export type CapabilitiesProvider = () => Partial; + +/** + * See {@link CapabilitiesSetup} + * @public + */ +export type CapabilitiesSwitcher = ( + request: KibanaRequest, + uiCapabilities: Capabilities +) => Partial | Promise>; diff --git a/src/core/server/http/http_service.mock.ts b/src/core/server/http/http_service.mock.ts index 6dab120b20e50d..c7f6cdb2bb4227 100644 --- a/src/core/server/http/http_service.mock.ts +++ b/src/core/server/http/http_service.mock.ts @@ -18,15 +18,15 @@ */ import { Server } from 'hapi'; +import { mockRouter } from './router/router.mock'; import { InternalHttpServiceSetup } from './types'; import { HttpService } from './http_service'; import { OnPreAuthToolkit } from './lifecycle/on_pre_auth'; import { AuthToolkit } from './lifecycle/auth'; import { sessionStorageMock } from './cookie_session_storage.mocks'; -import { IRouter } from './router'; import { OnPostAuthToolkit } from './lifecycle/on_post_auth'; -type ServiceSetupMockType = jest.Mocked & { +export type HttpServiceSetupMock = jest.Mocked & { basePath: jest.Mocked; }; @@ -38,19 +38,8 @@ const createBasePathMock = (): jest.Mocked remove: jest.fn(), }); -const createRouterMock = (): jest.Mocked => ({ - routerPath: '/', - get: jest.fn(), - post: jest.fn(), - put: jest.fn(), - patch: jest.fn(), - delete: jest.fn(), - getRoutes: jest.fn(), - handleLegacyErrors: jest.fn().mockImplementation(handler => handler), -}); - const createSetupContractMock = () => { - const setupContract: ServiceSetupMockType = { + const setupContract: HttpServiceSetupMock = { // we can mock other hapi server methods when we need it server: ({ route: jest.fn(), @@ -62,7 +51,7 @@ const createSetupContractMock = () => { registerAuth: jest.fn(), registerOnPostAuth: jest.fn(), registerRouteHandlerContext: jest.fn(), - createRouter: jest.fn(), + createRouter: jest.fn().mockImplementation(() => mockRouter.create({})), basePath: createBasePathMock(), auth: { get: jest.fn(), @@ -75,7 +64,7 @@ const createSetupContractMock = () => { setupContract.createCookieSessionStorageFactory.mockResolvedValue( sessionStorageMock.createFactory() ); - setupContract.createRouter.mockImplementation(createRouterMock); + setupContract.createRouter.mockImplementation(() => mockRouter.create()); return setupContract; }; @@ -110,5 +99,5 @@ export const httpServiceMock = { createOnPreAuthToolkit: createOnPreAuthToolkitMock, createOnPostAuthToolkit: createOnPostAuthToolkitMock, createAuthToolkit: createAuthToolkitMock, - createRouter: createRouterMock, + createRouter: mockRouter.create, }; diff --git a/src/core/server/http/integration_tests/lifecycle.test.ts b/src/core/server/http/integration_tests/lifecycle.test.ts index d5f9343f3e9818..2a32db77377a44 100644 --- a/src/core/server/http/integration_tests/lifecycle.test.ts +++ b/src/core/server/http/integration_tests/lifecycle.test.ts @@ -18,49 +18,28 @@ */ import supertest from 'supertest'; -import { ByteSizeValue } from '@kbn/config-schema'; import request from 'request'; -import { BehaviorSubject } from 'rxjs'; import { ensureRawRequest } from '../router'; import { HttpService } from '../http_service'; -import { CoreContext } from '../../core_context'; -import { Env } from '../../config'; -import { getEnvOptions } from '../../config/__mocks__/env'; -import { configServiceMock } from '../../config/config_service.mock'; import { contextServiceMock } from '../../context/context_service.mock'; import { loggingServiceMock } from '../../logging/logging_service.mock'; +import { createHttpServer } from '../test_utils'; let server: HttpService; let logger: ReturnType; -let env: Env; -let coreContext: CoreContext; -const configService = configServiceMock.create(); + const contextSetup = contextServiceMock.createSetupContract(); const setupDeps = { context: contextSetup, }; -configService.atPath.mockReturnValue( - new BehaviorSubject({ - hosts: ['localhost'], - maxPayload: new ByteSizeValue(1024), - autoListen: true, - ssl: { - enabled: false, - }, - compression: { enabled: true }, - } as any) -); beforeEach(() => { logger = loggingServiceMock.create(); - env = Env.createDefault(getEnvOptions()); - - coreContext = { coreId: Symbol('core'), env, logger, configService: configService as any }; - server = new HttpService(coreContext); + server = createHttpServer({ logger }); }); afterEach(async () => { diff --git a/src/core/server/http/integration_tests/router.test.ts b/src/core/server/http/integration_tests/router.test.ts index 463f941ba84b4c..7d95110b98a129 100644 --- a/src/core/server/http/integration_tests/router.test.ts +++ b/src/core/server/http/integration_tests/router.test.ts @@ -18,49 +18,28 @@ */ import { Stream } from 'stream'; import Boom from 'boom'; - import supertest from 'supertest'; -import { BehaviorSubject } from 'rxjs'; -import { ByteSizeValue, schema } from '@kbn/config-schema'; +import { schema } from '@kbn/config-schema'; import { HttpService } from '../http_service'; -import { CoreContext } from '../../core_context'; -import { Env } from '../../config'; -import { getEnvOptions } from '../../config/__mocks__/env'; -import { configServiceMock } from '../../config/config_service.mock'; import { contextServiceMock } from '../../context/context_service.mock'; import { loggingServiceMock } from '../../logging/logging_service.mock'; +import { createHttpServer } from '../test_utils'; let server: HttpService; let logger: ReturnType; -let env: Env; -let coreContext: CoreContext; -const configService = configServiceMock.create(); const contextSetup = contextServiceMock.createSetupContract(); const setupDeps = { context: contextSetup, }; -configService.atPath.mockReturnValue( - new BehaviorSubject({ - hosts: ['localhost'], - maxPayload: new ByteSizeValue(1024), - autoListen: true, - ssl: { - enabled: false, - }, - compression: { enabled: true }, - } as any) -); beforeEach(() => { logger = loggingServiceMock.create(); - env = Env.createDefault(getEnvOptions()); - coreContext = { coreId: Symbol('core'), env, logger, configService: configService as any }; - server = new HttpService(coreContext); + server = createHttpServer({ logger }); }); afterEach(async () => { diff --git a/src/legacy/server/capabilities/resolve_capabilities.ts b/src/core/server/http/router/router.mock.ts similarity index 61% rename from src/legacy/server/capabilities/resolve_capabilities.ts rename to src/core/server/http/router/router.mock.ts index 0df4932099b547..b43db0ca7ed5ae 100644 --- a/src/legacy/server/capabilities/resolve_capabilities.ts +++ b/src/core/server/http/router/router.mock.ts @@ -17,18 +17,23 @@ * under the License. */ -import { Request } from 'hapi'; +import { IRouter } from './router'; -import { Capabilities } from '../../../core/public'; -import { mergeCapabilities } from './merge_capabilities'; -import { CapabilitiesModifier } from './capabilities_mixin'; +export type RouterMock = DeeplyMockedKeys; -export const resolveCapabilities = ( - request: Request, - modifiers: CapabilitiesModifier[], - ...capabilities: Array> -) => - modifiers.reduce( - async (resolvedCaps, modifier) => modifier(request, await resolvedCaps), - Promise.resolve(mergeCapabilities(...capabilities)) - ); +function create({ routerPath = '' }: { routerPath?: string } = {}): RouterMock { + return { + routerPath, + get: jest.fn(), + post: jest.fn(), + delete: jest.fn(), + put: jest.fn(), + patch: jest.fn(), + getRoutes: jest.fn(), + handleLegacyErrors: jest.fn().mockImplementation(handler => handler), + }; +} + +export const mockRouter = { + create, +}; diff --git a/src/core/server/http/test_utils.ts b/src/core/server/http/test_utils.ts new file mode 100644 index 00000000000000..e0a15cdc6e8391 --- /dev/null +++ b/src/core/server/http/test_utils.ts @@ -0,0 +1,63 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BehaviorSubject } from 'rxjs'; +import { ByteSizeValue } from '@kbn/config-schema'; +import { Env } from '../config'; +import { getEnvOptions } from '../config/__mocks__/env'; +import { HttpService } from './http_service'; +import { CoreContext } from '../core_context'; +import { configServiceMock } from '../config/config_service.mock'; +import { loggingServiceMock } from '../logging/logging_service.mock'; + +const coreId = Symbol('core'); +const env = Env.createDefault(getEnvOptions()); + +const logger = loggingServiceMock.create(); + +const configService = configServiceMock.create(); +configService.atPath.mockReturnValue( + new BehaviorSubject({ + hosts: ['localhost'], + maxPayload: new ByteSizeValue(1024), + autoListen: true, + ssl: { + enabled: false, + }, + compression: { enabled: true }, + } as any) +); + +const defaultContext: CoreContext = { + coreId, + env, + logger, + configService, +}; + +/** + * Creates a concrete HttpServer with a mocked context. + */ +export const createHttpServer = (overrides: Partial = {}): HttpService => { + const context = { + ...defaultContext, + ...overrides, + }; + return new HttpService(context); +}; diff --git a/src/core/server/index.ts b/src/core/server/index.ts index a54ada233bbc94..efff85142c3e40 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -46,8 +46,10 @@ import { ContextSetup } from './context'; import { IUiSettingsClient, UiSettingsServiceSetup } from './ui_settings'; import { SavedObjectsClientContract } from './saved_objects/types'; import { SavedObjectsServiceSetup, SavedObjectsServiceStart } from './saved_objects'; +import { CapabilitiesSetup, CapabilitiesStart } from './capabilities'; export { bootstrap } from './bootstrap'; +export { Capabilities, CapabilitiesProvider, CapabilitiesSwitcher } from './capabilities'; export { ConfigPath, ConfigService, EnvironmentMode, PackageInfo } from './config'; export { IContextContainer, @@ -240,6 +242,8 @@ export interface RequestHandlerContext { * @public */ export interface CoreSetup { + /** {@link CapabilitiesSetup} */ + capabilities: CapabilitiesSetup; /** {@link ContextSetup} */ context: ContextSetup; /** {@link ElasticsearchServiceSetup} */ @@ -258,8 +262,17 @@ export interface CoreSetup { * @public */ export interface CoreStart { + /** {@link CapabilitiesStart} */ + capabilities: CapabilitiesStart; /** {@link SavedObjectsServiceStart} */ savedObjects: SavedObjectsServiceStart; } -export { ContextSetup, PluginsServiceSetup, PluginsServiceStart, PluginOpaqueId }; +export { + CapabilitiesSetup, + CapabilitiesStart, + ContextSetup, + PluginsServiceSetup, + PluginsServiceStart, + PluginOpaqueId, +}; diff --git a/src/core/server/internal_types.ts b/src/core/server/internal_types.ts index d1a65c6f3437e2..07fd77f83d7749 100644 --- a/src/core/server/internal_types.ts +++ b/src/core/server/internal_types.ts @@ -25,9 +25,11 @@ import { InternalSavedObjectsServiceStart, InternalSavedObjectsServiceSetup, } from './saved_objects'; +import { CapabilitiesSetup, CapabilitiesStart } from './capabilities'; /** @internal */ export interface InternalCoreSetup { + capabilities: CapabilitiesSetup; context: ContextSetup; http: InternalHttpServiceSetup; elasticsearch: InternalElasticsearchServiceSetup; @@ -39,5 +41,6 @@ export interface InternalCoreSetup { * @internal */ export interface InternalCoreStart { + capabilities: CapabilitiesStart; savedObjects: InternalSavedObjectsServiceStart; } diff --git a/src/core/server/legacy/legacy_service.test.ts b/src/core/server/legacy/legacy_service.test.ts index 286e1a0612c948..0bd4eafe78ce16 100644 --- a/src/core/server/legacy/legacy_service.test.ts +++ b/src/core/server/legacy/legacy_service.test.ts @@ -46,6 +46,7 @@ import { DiscoveredPlugin } from '../plugins'; import { httpServiceMock } from '../http/http_service.mock'; import { uiSettingsServiceMock } from '../ui_settings/ui_settings_service.mock'; import { savedObjectsServiceMock } from '../saved_objects/saved_objects_service.mock'; +import { capabilitiesServiceMock } from '../capabilities/capabilities_service.mock'; const MockKbnServer: jest.Mock = KbnServer as any; @@ -69,6 +70,7 @@ beforeEach(() => { setupDeps = { core: { + capabilities: capabilitiesServiceMock.createSetupContract(), context: contextServiceMock.createSetupContract(), elasticsearch: { legacy: {} } as any, uiSettings: uiSettingsServiceMock.createSetupContract(), @@ -93,6 +95,7 @@ beforeEach(() => { startDeps = { core: { + capabilities: capabilitiesServiceMock.createStartContract(), savedObjects: savedObjectsServiceMock.createStartContract(), plugins: { contracts: new Map() }, }, diff --git a/src/core/server/legacy/legacy_service.ts b/src/core/server/legacy/legacy_service.ts index fd081b23a0ef2c..1c9467e4d60de1 100644 --- a/src/core/server/legacy/legacy_service.ts +++ b/src/core/server/legacy/legacy_service.ts @@ -241,6 +241,7 @@ export class LegacyService implements CoreService { } ) { const coreSetup: CoreSetup = { + capabilities: setupDeps.core.capabilities, context: setupDeps.core.context, elasticsearch: { adminClient$: setupDeps.core.elasticsearch.adminClient$, @@ -271,6 +272,7 @@ export class LegacyService implements CoreService { }, }; const coreStart: CoreStart = { + capabilities: startDeps.core.capabilities, savedObjects: { getScopedClient: startDeps.core.savedObjects.getScopedClient }, }; diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index a811efdf4b1b94..025ebce22e2c46 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -25,6 +25,7 @@ import { contextServiceMock } from './context/context_service.mock'; import { savedObjectsServiceMock } from './saved_objects/saved_objects_service.mock'; import { uiSettingsServiceMock } from './ui_settings/ui_settings_service.mock'; import { InternalCoreSetup, InternalCoreStart } from './internal_types'; +import { capabilitiesServiceMock } from './capabilities/capabilities_service.mock'; export { httpServerMock } from './http/http_server.mocks'; export { sessionStorageMock } from './http/cookie_session_storage.mocks'; @@ -86,6 +87,7 @@ function createCoreSetupMock() { register: uiSettingsServiceMock.createSetupContract().register, }; const mock: MockedKeys = { + capabilities: capabilitiesServiceMock.createSetupContract(), context: contextServiceMock.createSetupContract(), elasticsearch: elasticsearchServiceMock.createSetupContract(), http: httpMock, @@ -98,6 +100,7 @@ function createCoreSetupMock() { function createCoreStartMock() { const mock: MockedKeys = { + capabilities: capabilitiesServiceMock.createStartContract(), savedObjects: savedObjectsServiceMock.createStartContract(), }; @@ -106,6 +109,7 @@ function createCoreStartMock() { function createInternalCoreSetupMock() { const setupDeps: InternalCoreSetup = { + capabilities: capabilitiesServiceMock.createSetupContract(), context: contextServiceMock.createSetupContract(), elasticsearch: elasticsearchServiceMock.createSetupContract(), http: httpServiceMock.createSetupContract(), @@ -117,6 +121,7 @@ function createInternalCoreSetupMock() { function createInternalCoreStartMock() { const startDeps: InternalCoreStart = { + capabilities: capabilitiesServiceMock.createStartContract(), savedObjects: savedObjectsServiceMock.createStartContract(), }; return startDeps; diff --git a/src/core/server/plugins/plugin_context.ts b/src/core/server/plugins/plugin_context.ts index 6edce1b2533cb6..773b6e121ce5c2 100644 --- a/src/core/server/plugins/plugin_context.ts +++ b/src/core/server/plugins/plugin_context.ts @@ -102,6 +102,10 @@ export function createPluginSetupContext( plugin: PluginWrapper ): CoreSetup { return { + capabilities: { + registerProvider: deps.capabilities.registerProvider, + registerSwitcher: deps.capabilities.registerSwitcher, + }, context: { createContextContainer: deps.context.createContextContainer, }, @@ -153,6 +157,9 @@ export function createPluginStartContext( plugin: PluginWrapper ): CoreStart { return { + capabilities: { + resolveCapabilities: deps.capabilities.resolveCapabilities, + }, savedObjects: { getScopedClient: deps.savedObjects.getScopedClient }, }; } diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index e8cafe1e1334ec..26d1921e064469 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1,1731 +1,1762 @@ -## API Report File for "kibana" - -> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). - -```ts - -import Boom from 'boom'; -import { BulkIndexDocumentsParams } from 'elasticsearch'; -import { CatAliasesParams } from 'elasticsearch'; -import { CatAllocationParams } from 'elasticsearch'; -import { CatCommonParams } from 'elasticsearch'; -import { CatFielddataParams } from 'elasticsearch'; -import { CatHealthParams } from 'elasticsearch'; -import { CatHelpParams } from 'elasticsearch'; -import { CatIndicesParams } from 'elasticsearch'; -import { CatRecoveryParams } from 'elasticsearch'; -import { CatSegmentsParams } from 'elasticsearch'; -import { CatShardsParams } from 'elasticsearch'; -import { CatSnapshotsParams } from 'elasticsearch'; -import { CatTasksParams } from 'elasticsearch'; -import { CatThreadPoolParams } from 'elasticsearch'; -import { ClearScrollParams } from 'elasticsearch'; -import { Client } from 'elasticsearch'; -import { ClusterAllocationExplainParams } from 'elasticsearch'; -import { ClusterGetSettingsParams } from 'elasticsearch'; -import { ClusterHealthParams } from 'elasticsearch'; -import { ClusterPendingTasksParams } from 'elasticsearch'; -import { ClusterPutSettingsParams } from 'elasticsearch'; -import { ClusterRerouteParams } from 'elasticsearch'; -import { ClusterStateParams } from 'elasticsearch'; -import { ClusterStatsParams } from 'elasticsearch'; -import { ConfigOptions } from 'elasticsearch'; -import { CountParams } from 'elasticsearch'; -import { CreateDocumentParams } from 'elasticsearch'; -import { DeleteDocumentByQueryParams } from 'elasticsearch'; -import { DeleteDocumentParams } from 'elasticsearch'; -import { DeleteScriptParams } from 'elasticsearch'; -import { DeleteTemplateParams } from 'elasticsearch'; -import { DetailedPeerCertificate } from 'tls'; -import { Duration } from 'moment'; -import { ExistsParams } from 'elasticsearch'; -import { ExplainParams } from 'elasticsearch'; -import { FieldStatsParams } from 'elasticsearch'; -import { GenericParams } from 'elasticsearch'; -import { GetParams } from 'elasticsearch'; -import { GetResponse } from 'elasticsearch'; -import { GetScriptParams } from 'elasticsearch'; -import { GetSourceParams } from 'elasticsearch'; -import { GetTemplateParams } from 'elasticsearch'; -import { IncomingHttpHeaders } from 'http'; -import { IndexDocumentParams } from 'elasticsearch'; -import { IndicesAnalyzeParams } from 'elasticsearch'; -import { IndicesClearCacheParams } from 'elasticsearch'; -import { IndicesCloseParams } from 'elasticsearch'; -import { IndicesCreateParams } from 'elasticsearch'; -import { IndicesDeleteAliasParams } from 'elasticsearch'; -import { IndicesDeleteParams } from 'elasticsearch'; -import { IndicesDeleteTemplateParams } from 'elasticsearch'; -import { IndicesExistsAliasParams } from 'elasticsearch'; -import { IndicesExistsParams } from 'elasticsearch'; -import { IndicesExistsTemplateParams } from 'elasticsearch'; -import { IndicesExistsTypeParams } from 'elasticsearch'; -import { IndicesFlushParams } from 'elasticsearch'; -import { IndicesFlushSyncedParams } from 'elasticsearch'; -import { IndicesForcemergeParams } from 'elasticsearch'; -import { IndicesGetAliasParams } from 'elasticsearch'; -import { IndicesGetFieldMappingParams } from 'elasticsearch'; -import { IndicesGetMappingParams } from 'elasticsearch'; -import { IndicesGetParams } from 'elasticsearch'; -import { IndicesGetSettingsParams } from 'elasticsearch'; -import { IndicesGetTemplateParams } from 'elasticsearch'; -import { IndicesGetUpgradeParams } from 'elasticsearch'; -import { IndicesOpenParams } from 'elasticsearch'; -import { IndicesPutAliasParams } from 'elasticsearch'; -import { IndicesPutMappingParams } from 'elasticsearch'; -import { IndicesPutSettingsParams } from 'elasticsearch'; -import { IndicesPutTemplateParams } from 'elasticsearch'; -import { IndicesRecoveryParams } from 'elasticsearch'; -import { IndicesRefreshParams } from 'elasticsearch'; -import { IndicesRolloverParams } from 'elasticsearch'; -import { IndicesSegmentsParams } from 'elasticsearch'; -import { IndicesShardStoresParams } from 'elasticsearch'; -import { IndicesShrinkParams } from 'elasticsearch'; -import { IndicesStatsParams } from 'elasticsearch'; -import { IndicesUpdateAliasesParams } from 'elasticsearch'; -import { IndicesUpgradeParams } from 'elasticsearch'; -import { IndicesValidateQueryParams } from 'elasticsearch'; -import { InfoParams } from 'elasticsearch'; -import { IngestDeletePipelineParams } from 'elasticsearch'; -import { IngestGetPipelineParams } from 'elasticsearch'; -import { IngestPutPipelineParams } from 'elasticsearch'; -import { IngestSimulateParams } from 'elasticsearch'; -import { KibanaConfigType } from 'src/core/server/kibana_config'; -import { Logger as Logger_2 } from 'src/core/server/logging'; -import { MGetParams } from 'elasticsearch'; -import { MGetResponse } from 'elasticsearch'; -import { MSearchParams } from 'elasticsearch'; -import { MSearchResponse } from 'elasticsearch'; -import { MSearchTemplateParams } from 'elasticsearch'; -import { MTermVectorsParams } from 'elasticsearch'; -import { NodesHotThreadsParams } from 'elasticsearch'; -import { NodesInfoParams } from 'elasticsearch'; -import { NodesStatsParams } from 'elasticsearch'; -import { ObjectType } from '@kbn/config-schema'; -import { Observable } from 'rxjs'; -import { PeerCertificate } from 'tls'; -import { PingParams } from 'elasticsearch'; -import { PutScriptParams } from 'elasticsearch'; -import { PutTemplateParams } from 'elasticsearch'; -import { Readable } from 'stream'; -import { ReindexParams } from 'elasticsearch'; -import { ReindexRethrottleParams } from 'elasticsearch'; -import { RenderSearchTemplateParams } from 'elasticsearch'; -import { Request } from 'hapi'; -import { ResponseObject } from 'hapi'; -import { ResponseToolkit } from 'hapi'; -import { ScrollParams } from 'elasticsearch'; -import { SearchParams } from 'elasticsearch'; -import { SearchResponse } from 'elasticsearch'; -import { SearchShardsParams } from 'elasticsearch'; -import { SearchTemplateParams } from 'elasticsearch'; -import { Server } from 'hapi'; -import { ShallowPromise } from '@kbn/utility-types'; -import { SnapshotCreateParams } from 'elasticsearch'; -import { SnapshotCreateRepositoryParams } from 'elasticsearch'; -import { SnapshotDeleteParams } from 'elasticsearch'; -import { SnapshotDeleteRepositoryParams } from 'elasticsearch'; -import { SnapshotGetParams } from 'elasticsearch'; -import { SnapshotGetRepositoryParams } from 'elasticsearch'; -import { SnapshotRestoreParams } from 'elasticsearch'; -import { SnapshotStatusParams } from 'elasticsearch'; -import { SnapshotVerifyRepositoryParams } from 'elasticsearch'; -import { Stream } from 'stream'; -import { SuggestParams } from 'elasticsearch'; -import { TasksCancelParams } from 'elasticsearch'; -import { TasksGetParams } from 'elasticsearch'; -import { TasksListParams } from 'elasticsearch'; -import { TermvectorsParams } from 'elasticsearch'; -import { Type } from '@kbn/config-schema'; -import { TypeOf } from '@kbn/config-schema'; -import { UpdateDocumentByQueryParams } from 'elasticsearch'; -import { UpdateDocumentParams } from 'elasticsearch'; -import { Url } from 'url'; - -// @public (undocumented) -export interface APICaller { - // (undocumented) - (endpoint: 'cluster.state', params: ClusterStateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'bulk', params: BulkIndexDocumentsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'count', params: CountParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'create', params: CreateDocumentParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'delete', params: DeleteDocumentParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'deleteByQuery', params: DeleteDocumentByQueryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'deleteScript', params: DeleteScriptParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'deleteTemplate', params: DeleteTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'exists', params: ExistsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'explain', params: ExplainParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'fieldStats', params: FieldStatsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'get', params: GetParams, options?: CallAPIOptions): Promise>; - // (undocumented) - (endpoint: 'getScript', params: GetScriptParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'getSource', params: GetSourceParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'getTemplate', params: GetTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'index', params: IndexDocumentParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'info', params: InfoParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'mget', params: MGetParams, options?: CallAPIOptions): Promise>; - // (undocumented) - (endpoint: 'msearch', params: MSearchParams, options?: CallAPIOptions): Promise>; - // (undocumented) - (endpoint: 'msearchTemplate', params: MSearchTemplateParams, options?: CallAPIOptions): Promise>; - // (undocumented) - (endpoint: 'mtermvectors', params: MTermVectorsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'ping', params: PingParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'putScript', params: PutScriptParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'putTemplate', params: PutTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'reindex', params: ReindexParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'reindexRethrottle', params: ReindexRethrottleParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'renderSearchTemplate', params: RenderSearchTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'scroll', params: ScrollParams, options?: CallAPIOptions): Promise>; - // (undocumented) - (endpoint: 'search', params: SearchParams, options?: CallAPIOptions): Promise>; - // (undocumented) - (endpoint: 'searchShards', params: SearchShardsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'searchTemplate', params: SearchTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'suggest', params: SuggestParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'termvectors', params: TermvectorsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'update', params: UpdateDocumentParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'updateByQuery', params: UpdateDocumentByQueryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.aliases', params: CatAliasesParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.allocation', params: CatAllocationParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.count', params: CatAllocationParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.fielddata', params: CatFielddataParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.health', params: CatHealthParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.help', params: CatHelpParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.indices', params: CatIndicesParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.master', params: CatCommonParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.nodeattrs', params: CatCommonParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.nodes', params: CatCommonParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.pendingTasks', params: CatCommonParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.plugins', params: CatCommonParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.recovery', params: CatRecoveryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.repositories', params: CatCommonParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.segments', params: CatSegmentsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.shards', params: CatShardsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.snapshots', params: CatSnapshotsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.tasks', params: CatTasksParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cat.threadPool', params: CatThreadPoolParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.allocationExplain', params: ClusterAllocationExplainParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.getSettings', params: ClusterGetSettingsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.health', params: ClusterHealthParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.pendingTasks', params: ClusterPendingTasksParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.putSettings', params: ClusterPutSettingsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.reroute', params: ClusterRerouteParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'clearScroll', params: ClearScrollParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'cluster.stats', params: ClusterStatsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.analyze', params: IndicesAnalyzeParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.clearCache', params: IndicesClearCacheParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.close', params: IndicesCloseParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.create', params: IndicesCreateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.delete', params: IndicesDeleteParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.deleteAlias', params: IndicesDeleteAliasParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.deleteTemplate', params: IndicesDeleteTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.exists', params: IndicesExistsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.existsAlias', params: IndicesExistsAliasParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.existsTemplate', params: IndicesExistsTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.existsType', params: IndicesExistsTypeParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.flush', params: IndicesFlushParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.flushSynced', params: IndicesFlushSyncedParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.forcemerge', params: IndicesForcemergeParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.get', params: IndicesGetParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.getAlias', params: IndicesGetAliasParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.getFieldMapping', params: IndicesGetFieldMappingParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.getMapping', params: IndicesGetMappingParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.getSettings', params: IndicesGetSettingsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.getTemplate', params: IndicesGetTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.getUpgrade', params: IndicesGetUpgradeParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.open', params: IndicesOpenParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.putAlias', params: IndicesPutAliasParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.putMapping', params: IndicesPutMappingParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.putSettings', params: IndicesPutSettingsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.putTemplate', params: IndicesPutTemplateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.recovery', params: IndicesRecoveryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.refresh', params: IndicesRefreshParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.rollover', params: IndicesRolloverParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.segments', params: IndicesSegmentsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.shardStores', params: IndicesShardStoresParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.shrink', params: IndicesShrinkParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.stats', params: IndicesStatsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.updateAliases', params: IndicesUpdateAliasesParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.upgrade', params: IndicesUpgradeParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'indices.validateQuery', params: IndicesValidateQueryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'ingest.deletePipeline', params: IngestDeletePipelineParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'ingest.getPipeline', params: IngestGetPipelineParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'ingest.putPipeline', params: IngestPutPipelineParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'ingest.simulate', params: IngestSimulateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'nodes.hotThreads', params: NodesHotThreadsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'nodes.info', params: NodesInfoParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'nodes.stats', params: NodesStatsParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.create', params: SnapshotCreateParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.createRepository', params: SnapshotCreateRepositoryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.delete', params: SnapshotDeleteParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.deleteRepository', params: SnapshotDeleteRepositoryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.get', params: SnapshotGetParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.getRepository', params: SnapshotGetRepositoryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.restore', params: SnapshotRestoreParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.status', params: SnapshotStatusParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'snapshot.verifyRepository', params: SnapshotVerifyRepositoryParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'tasks.cancel', params: TasksCancelParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'tasks.get', params: TasksGetParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'tasks.list', params: TasksListParams, options?: CallAPIOptions): ReturnType; - // (undocumented) - (endpoint: 'transport.request', clientParams: AssistantAPIClientParams, options?: CallAPIOptions): Promise; - // (undocumented) - (endpoint: 'transport.request', clientParams: DeprecationAPIClientParams, options?: CallAPIOptions): Promise; - // (undocumented) - (endpoint: string, clientParams?: Record, options?: CallAPIOptions): Promise; -} - -// @public (undocumented) -export interface AssistanceAPIResponse { - // (undocumented) - indices: { - [indexName: string]: { - action_required: MIGRATION_ASSISTANCE_INDEX_ACTION; - }; - }; -} - -// @public (undocumented) -export interface AssistantAPIClientParams extends GenericParams { - // (undocumented) - method: 'GET'; - // (undocumented) - path: '/_migration/assistance'; -} - -// @public (undocumented) -export interface Authenticated extends AuthResultParams { - // (undocumented) - type: AuthResultType.authenticated; -} - -// @public -export type AuthenticationHandler = (request: KibanaRequest, response: LifecycleResponseFactory, toolkit: AuthToolkit) => AuthResult | IKibanaResponse | Promise; - -// @public -export type AuthHeaders = Record; - -// @public (undocumented) -export type AuthResult = Authenticated; - -// @public -export interface AuthResultParams { - requestHeaders?: AuthHeaders; - responseHeaders?: AuthHeaders; - state?: Record; -} - -// @public (undocumented) -export enum AuthResultType { - // (undocumented) - authenticated = "authenticated" -} - -// @public -export enum AuthStatus { - authenticated = "authenticated", - unauthenticated = "unauthenticated", - unknown = "unknown" -} - -// @public -export interface AuthToolkit { - authenticated: (data?: AuthResultParams) => AuthResult; -} - -// @public -export class BasePath { - // @internal - constructor(serverBasePath?: string); - get: (request: KibanaRequest | LegacyRequest) => string; - prepend: (path: string) => string; - remove: (path: string) => string; - readonly serverBasePath: string; - set: (request: KibanaRequest | LegacyRequest, requestSpecificBasePath: string) => void; -} - -// Warning: (ae-forgotten-export) The symbol "BootstrapArgs" needs to be exported by the entry point index.d.ts -// -// @internal (undocumented) -export function bootstrap({ configs, cliArgs, applyConfigOverrides, features, }: BootstrapArgs): Promise; - -// @public -export interface CallAPIOptions { - signal?: AbortSignal; - wrap401Errors?: boolean; -} - -// @public -export class ClusterClient implements IClusterClient { - constructor(config: ElasticsearchClientConfig, log: Logger, getAuthHeaders?: GetAuthHeaders); - asScoped(request?: KibanaRequest | LegacyRequest | FakeRequest): IScopedClusterClient; - callAsInternalUser: APICaller; - close(): void; - } - -// @public (undocumented) -export type ConfigPath = string | string[]; - -// @internal (undocumented) -export class ConfigService { - // Warning: (ae-forgotten-export) The symbol "Config" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "Env" needs to be exported by the entry point index.d.ts - constructor(config$: Observable, env: Env, logger: LoggerFactory); - atPath(path: ConfigPath): Observable; - getConfig$(): Observable; - // (undocumented) - getUnusedPaths(): Promise; - // (undocumented) - getUsedPaths(): Promise; - // (undocumented) - isEnabledAtPath(path: ConfigPath): Promise; - optionalAtPath(path: ConfigPath): Observable; - setSchema(path: ConfigPath, schema: Type): Promise; - } - -// @public -export interface ContextSetup { - createContextContainer>(): IContextContainer; -} - -// @internal (undocumented) -export type CoreId = symbol; - -// @public -export interface CoreSetup { - // (undocumented) - context: ContextSetup; - // (undocumented) - elasticsearch: ElasticsearchServiceSetup; - // (undocumented) - http: HttpServiceSetup; - // (undocumented) - savedObjects: SavedObjectsServiceSetup; - // (undocumented) - uiSettings: UiSettingsServiceSetup; -} - -// @public -export interface CoreStart { - // (undocumented) - savedObjects: SavedObjectsServiceStart; -} - -// @public -export interface CustomHttpResponseOptions { - body?: T; - headers?: ResponseHeaders; - // (undocumented) - statusCode: number; -} - -// @public (undocumented) -export interface DeprecationAPIClientParams extends GenericParams { - // (undocumented) - method: 'GET'; - // (undocumented) - path: '/_migration/deprecations'; -} - -// @public (undocumented) -export interface DeprecationAPIResponse { - // (undocumented) - cluster_settings: DeprecationInfo[]; - // (undocumented) - index_settings: IndexSettingsDeprecationInfo; - // (undocumented) - ml_settings: DeprecationInfo[]; - // (undocumented) - node_settings: DeprecationInfo[]; -} - -// @public (undocumented) -export interface DeprecationInfo { - // (undocumented) - details?: string; - // (undocumented) - level: MIGRATION_DEPRECATION_LEVEL; - // (undocumented) - message: string; - // (undocumented) - url: string; -} - -// @public -export interface DiscoveredPlugin { - readonly configPath: ConfigPath; - readonly id: PluginName; - readonly optionalPlugins: readonly PluginName[]; - readonly requiredPlugins: readonly PluginName[]; -} - -// Warning: (ae-forgotten-export) The symbol "ElasticsearchConfig" needs to be exported by the entry point index.d.ts -// -// @public (undocumented) -export type ElasticsearchClientConfig = Pick & Pick & { - pingTimeout?: ElasticsearchConfig['pingTimeout'] | ConfigOptions['pingTimeout']; - requestTimeout?: ElasticsearchConfig['requestTimeout'] | ConfigOptions['requestTimeout']; - sniffInterval?: ElasticsearchConfig['sniffInterval'] | ConfigOptions['sniffInterval']; - ssl?: Partial; -}; - -// @public (undocumented) -export interface ElasticsearchError extends Boom { - // (undocumented) - [code]?: string; -} - -// @public -export class ElasticsearchErrorHelpers { - // (undocumented) - static decorateNotAuthorizedError(error: Error, reason?: string): ElasticsearchError; - // (undocumented) - static isNotAuthorizedError(error: any): error is ElasticsearchError; -} - -// @public (undocumented) -export interface ElasticsearchServiceSetup { - readonly adminClient$: Observable; - readonly createClient: (type: string, clientConfig?: Partial) => IClusterClient; - readonly dataClient$: Observable; -} - -// @public (undocumented) -export interface EnvironmentMode { - // (undocumented) - dev: boolean; - // (undocumented) - name: 'development' | 'production'; - // (undocumented) - prod: boolean; -} - -// @public -export interface ErrorHttpResponseOptions { - body?: ResponseError; - headers?: ResponseHeaders; -} - -// @public -export interface FakeRequest { - headers: Headers; -} - -// @public -export type GetAuthHeaders = (request: KibanaRequest | LegacyRequest) => AuthHeaders | undefined; - -// @public -export type GetAuthState = (request: KibanaRequest | LegacyRequest) => { - status: AuthStatus; - state: unknown; -}; - -// @public -export type HandlerContextType> = T extends HandlerFunction ? U : never; - -// @public -export type HandlerFunction = (context: T, ...args: any[]) => any; - -// @public -export type HandlerParameters> = T extends (context: any, ...args: infer U) => any ? U : never; - -// @public -export type Headers = { - [header in KnownHeaders]?: string | string[] | undefined; -} & { - [header: string]: string | string[] | undefined; -}; - -// @public -export interface HttpResponseOptions { - body?: HttpResponsePayload; - headers?: ResponseHeaders; -} - -// @public -export type HttpResponsePayload = undefined | string | Record | Buffer | Stream; - -// @public -export interface HttpServiceSetup { - basePath: IBasePath; - createCookieSessionStorageFactory: (cookieOptions: SessionStorageCookieOptions) => Promise>; - createRouter: () => IRouter; - isTlsEnabled: boolean; - registerAuth: (handler: AuthenticationHandler) => void; - registerOnPostAuth: (handler: OnPostAuthHandler) => void; - registerOnPreAuth: (handler: OnPreAuthHandler) => void; - registerRouteHandlerContext: (contextName: T, provider: RequestHandlerContextProvider) => RequestHandlerContextContainer; -} - -// @public (undocumented) -export interface HttpServiceStart { - isListening: (port: number) => boolean; -} - -// @public -export type IBasePath = Pick; - -// @public -export type IClusterClient = Pick; - -// @public -export interface IContextContainer> { - createHandler(pluginOpaqueId: PluginOpaqueId, handler: THandler): (...rest: HandlerParameters) => ShallowPromise>; - registerContext>(pluginOpaqueId: PluginOpaqueId, contextName: TContextName, provider: IContextProvider): this; -} - -// @public -export type IContextProvider, TContextName extends keyof HandlerContextType> = (context: Partial>, ...rest: HandlerParameters) => Promise[TContextName]> | HandlerContextType[TContextName]; - -// @public -export interface IKibanaResponse { - // (undocumented) - readonly options: HttpResponseOptions; - // (undocumented) - readonly payload?: T; - // (undocumented) - readonly status: number; -} - -// @public -export interface IKibanaSocket { - readonly authorizationError?: Error; - readonly authorized?: boolean; - // (undocumented) - getPeerCertificate(detailed: true): DetailedPeerCertificate | null; - // (undocumented) - getPeerCertificate(detailed: false): PeerCertificate | null; - getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate | null; -} - -// @public (undocumented) -export interface IndexSettingsDeprecationInfo { - // (undocumented) - [indexName: string]: DeprecationInfo[]; -} - -// @public -export interface IRouter { - delete: RouteRegistrar<'delete'>; - get: RouteRegistrar<'get'>; - // Warning: (ae-forgotten-export) The symbol "RouterRoute" needs to be exported by the entry point index.d.ts - // - // @internal - getRoutes: () => RouterRoute[]; - handleLegacyErrors:

    (handler: RequestHandler) => RequestHandler; - patch: RouteRegistrar<'patch'>; - post: RouteRegistrar<'post'>; - put: RouteRegistrar<'put'>; - routerPath: string; -} - -// @public -export type IsAuthenticated = (request: KibanaRequest | LegacyRequest) => boolean; - -// @public -export type ISavedObjectsRepository = Pick; - -// @public -export type IScopedClusterClient = Pick; - -// @public -export interface IUiSettingsClient { - get: (key: string) => Promise; - getAll: () => Promise>; - getRegistered: () => Readonly>; - getUserProvided: () => Promise>>; - isOverridden: (key: string) => boolean; - remove: (key: string) => Promise; - removeMany: (keys: string[]) => Promise; - set: (key: string, value: any) => Promise; - setMany: (changes: Record) => Promise; -} - -// @public -export class KibanaRequest { - // @internal (undocumented) - protected readonly [requestSymbol]: Request; - constructor(request: Request, params: Params, query: Query, body: Body, withoutSecretHeaders: boolean); - // (undocumented) - readonly body: Body; - // @internal - static from

    | Type>(req: Request, routeSchemas?: RouteSchemas, withoutSecretHeaders?: boolean): KibanaRequest; - readonly headers: Headers; - // (undocumented) - readonly params: Params; - // (undocumented) - readonly query: Query; - readonly route: RecursiveReadonly>; - // (undocumented) - readonly socket: IKibanaSocket; - readonly url: Url; - } - -// @public -export interface KibanaRequestRoute { - // (undocumented) - method: Method; - // (undocumented) - options: KibanaRequestRouteOptions; - // (undocumented) - path: string; -} - -// @public -export type KibanaRequestRouteOptions = Method extends 'get' | 'options' ? Required, 'body'>> : Required>; - -// @public -export type KibanaResponseFactory = typeof kibanaResponseFactory; - -// @public -export const kibanaResponseFactory: { - custom: | Buffer | Stream | { - message: string | Error; - attributes?: Record | undefined; - } | undefined>(options: CustomHttpResponseOptions) => KibanaResponse; - badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse; - unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse; - forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse; - notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse; - conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse; - internalError: (options?: ErrorHttpResponseOptions) => KibanaResponse; - customError: (options: CustomHttpResponseOptions) => KibanaResponse; - redirected: (options: RedirectResponseOptions) => KibanaResponse | Buffer | Stream>; - ok: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; - accepted: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; - noContent: (options?: HttpResponseOptions) => KibanaResponse; -}; - -// Warning: (ae-forgotten-export) The symbol "KnownKeys" needs to be exported by the entry point index.d.ts -// -// @public -export type KnownHeaders = KnownKeys; - -// @public @deprecated (undocumented) -export interface LegacyRequest extends Request { -} - -// @public @deprecated (undocumented) -export interface LegacyServiceSetupDeps { - // Warning: (ae-forgotten-export) The symbol "InternalCoreSetup" needs to be exported by the entry point index.d.ts - // - // (undocumented) - core: InternalCoreSetup & { - plugins: PluginsServiceSetup; - }; - // (undocumented) - plugins: Record; -} - -// @public @deprecated (undocumented) -export interface LegacyServiceStartDeps { - // Warning: (ae-forgotten-export) The symbol "InternalCoreStart" needs to be exported by the entry point index.d.ts - // - // (undocumented) - core: InternalCoreStart & { - plugins: PluginsServiceStart; - }; - // (undocumented) - plugins: Record; -} - -// Warning: (ae-forgotten-export) The symbol "lifecycleResponseFactory" needs to be exported by the entry point index.d.ts -// -// @public -export type LifecycleResponseFactory = typeof lifecycleResponseFactory; - -// @public -export interface Logger { - debug(message: string, meta?: LogMeta): void; - error(errorOrMessage: string | Error, meta?: LogMeta): void; - fatal(errorOrMessage: string | Error, meta?: LogMeta): void; - info(message: string, meta?: LogMeta): void; - // @internal (undocumented) - log(record: LogRecord): void; - trace(message: string, meta?: LogMeta): void; - warn(errorOrMessage: string | Error, meta?: LogMeta): void; -} - -// @public -export interface LoggerFactory { - get(...contextParts: string[]): Logger; -} - -// @internal -export class LogLevel { - // (undocumented) - static readonly All: LogLevel; - // (undocumented) - static readonly Debug: LogLevel; - // (undocumented) - static readonly Error: LogLevel; - // (undocumented) - static readonly Fatal: LogLevel; - static fromId(level: LogLevelId): LogLevel; - // Warning: (ae-forgotten-export) The symbol "LogLevelId" needs to be exported by the entry point index.d.ts - // - // (undocumented) - readonly id: LogLevelId; - // (undocumented) - static readonly Info: LogLevel; - // (undocumented) - static readonly Off: LogLevel; - supports(level: LogLevel): boolean; - // (undocumented) - static readonly Trace: LogLevel; - // (undocumented) - readonly value: number; - // (undocumented) - static readonly Warn: LogLevel; -} - -// @public -export interface LogMeta { - // (undocumented) - [key: string]: any; -} - -// @internal -export interface LogRecord { - // (undocumented) - context: string; - // (undocumented) - error?: Error; - // (undocumented) - level: LogLevel; - // (undocumented) - message: string; - // (undocumented) - meta?: { - [name: string]: any; - }; - // (undocumented) - timestamp: Date; -} - -// @public (undocumented) -export type MIGRATION_ASSISTANCE_INDEX_ACTION = 'upgrade' | 'reindex'; - -// @public (undocumented) -export type MIGRATION_DEPRECATION_LEVEL = 'none' | 'info' | 'warning' | 'critical'; - -// @public -export type MutatingOperationRefreshSetting = boolean | 'wait_for'; - -// Warning: (ae-forgotten-export) The symbol "OnPostAuthResult" needs to be exported by the entry point index.d.ts -// -// @public -export type OnPostAuthHandler = (request: KibanaRequest, response: LifecycleResponseFactory, toolkit: OnPostAuthToolkit) => OnPostAuthResult | KibanaResponse | Promise; - -// @public -export interface OnPostAuthToolkit { - next: () => OnPostAuthResult; -} - -// Warning: (ae-forgotten-export) The symbol "OnPreAuthResult" needs to be exported by the entry point index.d.ts -// -// @public -export type OnPreAuthHandler = (request: KibanaRequest, response: LifecycleResponseFactory, toolkit: OnPreAuthToolkit) => OnPreAuthResult | KibanaResponse | Promise; - -// @public -export interface OnPreAuthToolkit { - next: () => OnPreAuthResult; - rewriteUrl: (url: string) => OnPreAuthResult; -} - -// @public (undocumented) -export interface PackageInfo { - // (undocumented) - branch: string; - // (undocumented) - buildNum: number; - // (undocumented) - buildSha: string; - // (undocumented) - dist: boolean; - // (undocumented) - version: string; -} - -// @public -export interface Plugin { - // (undocumented) - setup(core: CoreSetup, plugins: TPluginsSetup): TSetup | Promise; - // (undocumented) - start(core: CoreStart, plugins: TPluginsStart): TStart | Promise; - // (undocumented) - stop?(): void; -} - -// @public -export interface PluginConfigDescriptor { - exposeToBrowser?: { - [P in keyof T]?: boolean; - }; - schema: PluginConfigSchema; -} - -// @public -export type PluginConfigSchema = Type; - -// @public -export type PluginInitializer = (core: PluginInitializerContext) => Plugin; - -// @public -export interface PluginInitializerContext { - // (undocumented) - config: { - create: () => Observable; - createIfExists: () => Observable; - }; - // (undocumented) - env: { - mode: EnvironmentMode; - packageInfo: Readonly; - }; - // (undocumented) - logger: LoggerFactory; - // (undocumented) - opaqueId: PluginOpaqueId; -} - -// @public -export interface PluginManifest { - readonly configPath: ConfigPath; - readonly id: PluginName; - readonly kibanaVersion: string; - readonly optionalPlugins: readonly PluginName[]; - readonly requiredPlugins: readonly PluginName[]; - readonly server: boolean; - readonly ui: boolean; - readonly version: string; -} - -// @public -export type PluginName = string; - -// @public (undocumented) -export type PluginOpaqueId = symbol; - -// @public (undocumented) -export interface PluginsServiceSetup { - // (undocumented) - contracts: Map; - // (undocumented) - uiPlugins: { - internal: Map; - public: Map; - browserConfigs: Map>; - }; -} - -// @public (undocumented) -export interface PluginsServiceStart { - // (undocumented) - contracts: Map; -} - -// Warning: (ae-forgotten-export) The symbol "RecursiveReadonlyArray" needs to be exported by the entry point index.d.ts -// -// @public (undocumented) -export type RecursiveReadonly = T extends (...args: any[]) => any ? T : T extends any[] ? RecursiveReadonlyArray : T extends object ? Readonly<{ - [K in keyof T]: RecursiveReadonly; -}> : T; - -// @public -export type RedirectResponseOptions = HttpResponseOptions & { - headers: { - location: string; - }; -}; - -// @public -export type RequestHandler

    | Type, Method extends RouteMethod = any> = (context: RequestHandlerContext, request: KibanaRequest, TypeOf, TypeOf, Method>, response: KibanaResponseFactory) => IKibanaResponse | Promise>; - -// @public -export interface RequestHandlerContext { - // (undocumented) - core: { - savedObjects: { - client: SavedObjectsClientContract; - }; - elasticsearch: { - dataClient: IScopedClusterClient; - adminClient: IScopedClusterClient; - }; - uiSettings: { - client: IUiSettingsClient; - }; - }; -} - -// @public -export type RequestHandlerContextContainer = IContextContainer>; - -// @public -export type RequestHandlerContextProvider = IContextProvider, TContextName>; - -// @public -export type ResponseError = string | Error | { - message: string | Error; - attributes?: ResponseErrorAttributes; -}; - -// @public -export type ResponseErrorAttributes = Record; - -// @public -export type ResponseHeaders = { - [header in KnownHeaders]?: string | string[]; -} & { - [header: string]: string | string[]; -}; - -// @public -export interface RouteConfig

    | Type, Method extends RouteMethod> { - options?: RouteConfigOptions; - path: string; - validate: RouteSchemas | false; -} - -// @public -export interface RouteConfigOptions { - authRequired?: boolean; - body?: Method extends 'get' | 'options' ? undefined : RouteConfigOptionsBody; - tags?: readonly string[]; -} - -// @public -export interface RouteConfigOptionsBody { - accepts?: RouteContentType | RouteContentType[] | string | string[]; - maxBytes?: number; - output?: typeof validBodyOutput[number]; - parse?: boolean | 'gunzip'; -} - -// @public -export type RouteContentType = 'application/json' | 'application/*+json' | 'application/octet-stream' | 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/*'; - -// @public -export type RouteMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options'; - -// @public -export type RouteRegistrar =

    | Type>(route: RouteConfig, handler: RequestHandler) => void; - -// @public -export interface RouteSchemas

    | Type> { - // (undocumented) - body?: B; - // (undocumented) - params?: P; - // (undocumented) - query?: Q; -} - -// @public (undocumented) -export interface SavedObject { - attributes: T; - // (undocumented) - error?: { - message: string; - statusCode: number; - }; - id: string; - migrationVersion?: SavedObjectsMigrationVersion; - references: SavedObjectReference[]; - type: string; - updated_at?: string; - version?: string; -} - -// @public -export type SavedObjectAttribute = SavedObjectAttributeSingle | SavedObjectAttributeSingle[]; - -// @public -export interface SavedObjectAttributes { - // (undocumented) - [key: string]: SavedObjectAttribute; -} - -// @public -export type SavedObjectAttributeSingle = string | number | boolean | null | undefined | SavedObjectAttributes; - -// @public -export interface SavedObjectReference { - // (undocumented) - id: string; - // (undocumented) - name: string; - // (undocumented) - type: string; -} - -// @public (undocumented) -export interface SavedObjectsBaseOptions { - namespace?: string; -} - -// @public (undocumented) -export interface SavedObjectsBulkCreateObject { - // (undocumented) - attributes: T; - // (undocumented) - id?: string; - migrationVersion?: SavedObjectsMigrationVersion; - // (undocumented) - references?: SavedObjectReference[]; - // (undocumented) - type: string; -} - -// @public (undocumented) -export interface SavedObjectsBulkGetObject { - fields?: string[]; - // (undocumented) - id: string; - // (undocumented) - type: string; -} - -// @public (undocumented) -export interface SavedObjectsBulkResponse { - // (undocumented) - saved_objects: Array>; -} - -// @public (undocumented) -export interface SavedObjectsBulkResponse { - // (undocumented) - saved_objects: Array>; -} - -// @public (undocumented) -export interface SavedObjectsBulkUpdateObject extends Pick { - attributes: Partial; - id: string; - type: string; -} - -// @public (undocumented) -export interface SavedObjectsBulkUpdateOptions extends SavedObjectsBaseOptions { - refresh?: MutatingOperationRefreshSetting; -} - -// @public (undocumented) -export interface SavedObjectsBulkUpdateResponse { - // (undocumented) - saved_objects: Array>; -} - -// @public (undocumented) -export class SavedObjectsClient { - // @internal - constructor(repository: ISavedObjectsRepository); - bulkCreate(objects: Array>, options?: SavedObjectsCreateOptions): Promise>; - bulkGet(objects?: SavedObjectsBulkGetObject[], options?: SavedObjectsBaseOptions): Promise>; - bulkUpdate(objects: Array>, options?: SavedObjectsBulkUpdateOptions): Promise>; - create(type: string, attributes: T, options?: SavedObjectsCreateOptions): Promise>; - delete(type: string, id: string, options?: SavedObjectsDeleteOptions): Promise<{}>; - // (undocumented) - errors: typeof SavedObjectsErrorHelpers; - // (undocumented) - static errors: typeof SavedObjectsErrorHelpers; - find(options: SavedObjectsFindOptions): Promise>; - get(type: string, id: string, options?: SavedObjectsBaseOptions): Promise>; - update(type: string, id: string, attributes: Partial, options?: SavedObjectsUpdateOptions): Promise>; -} - -// @public -export type SavedObjectsClientContract = Pick; - -// @public -export type SavedObjectsClientFactory = ({ request, }: { - request: Request; -}) => SavedObjectsClientContract; - -// @public -export interface SavedObjectsClientProviderOptions { - // (undocumented) - excludedWrappers?: string[]; -} - -// @public -export type SavedObjectsClientWrapperFactory = (options: SavedObjectsClientWrapperOptions) => SavedObjectsClientContract; - -// @public -export interface SavedObjectsClientWrapperOptions { - // (undocumented) - client: SavedObjectsClientContract; - // (undocumented) - request: Request; -} - -// @public (undocumented) -export interface SavedObjectsCreateOptions extends SavedObjectsBaseOptions { - id?: string; - migrationVersion?: SavedObjectsMigrationVersion; - overwrite?: boolean; - // (undocumented) - references?: SavedObjectReference[]; - refresh?: MutatingOperationRefreshSetting; -} - -// @public (undocumented) -export interface SavedObjectsDeleteByNamespaceOptions extends SavedObjectsBaseOptions { - refresh?: MutatingOperationRefreshSetting; -} - -// @public (undocumented) -export interface SavedObjectsDeleteOptions extends SavedObjectsBaseOptions { - refresh?: MutatingOperationRefreshSetting; -} - -// @public (undocumented) -export class SavedObjectsErrorHelpers { - // (undocumented) - static createBadRequestError(reason?: string): DecoratedError; - // (undocumented) - static createEsAutoCreateIndexError(): DecoratedError; - // (undocumented) - static createGenericNotFoundError(type?: string | null, id?: string | null): DecoratedError; - // (undocumented) - static createInvalidVersionError(versionInput?: string): DecoratedError; - // (undocumented) - static createUnsupportedTypeError(type: string): DecoratedError; - // (undocumented) - static decorateBadRequestError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static decorateConflictError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static decorateEsUnavailableError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static decorateForbiddenError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static decorateGeneralError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static decorateNotAuthorizedError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static decorateRequestEntityTooLargeError(error: Error, reason?: string): DecoratedError; - // (undocumented) - static isBadRequestError(error: Error | DecoratedError): boolean; - // (undocumented) - static isConflictError(error: Error | DecoratedError): boolean; - // (undocumented) - static isEsAutoCreateIndexError(error: Error | DecoratedError): boolean; - // (undocumented) - static isEsUnavailableError(error: Error | DecoratedError): boolean; - // (undocumented) - static isForbiddenError(error: Error | DecoratedError): boolean; - // (undocumented) - static isInvalidVersionError(error: Error | DecoratedError): boolean; - // (undocumented) - static isNotAuthorizedError(error: Error | DecoratedError): boolean; - // (undocumented) - static isNotFoundError(error: Error | DecoratedError): boolean; - // (undocumented) - static isRequestEntityTooLargeError(error: Error | DecoratedError): boolean; - // Warning: (ae-forgotten-export) The symbol "DecoratedError" needs to be exported by the entry point index.d.ts - // - // (undocumented) - static isSavedObjectsClientError(error: any): error is DecoratedError; -} - -// @public -export interface SavedObjectsExportOptions { - excludeExportDetails?: boolean; - exportSizeLimit: number; - includeReferencesDeep?: boolean; - namespace?: string; - objects?: Array<{ - id: string; - type: string; - }>; - savedObjectsClient: SavedObjectsClientContract; - search?: string; - types?: string[]; -} - -// @public -export interface SavedObjectsExportResultDetails { - exportedCount: number; - missingRefCount: number; - missingReferences: Array<{ - id: string; - type: string; - }>; -} - -// @public (undocumented) -export interface SavedObjectsFindOptions extends SavedObjectsBaseOptions { - // (undocumented) - defaultSearchOperator?: 'AND' | 'OR'; - fields?: string[]; - // (undocumented) - filter?: string; - // (undocumented) - hasReference?: { - type: string; - id: string; - }; - // (undocumented) - page?: number; - // (undocumented) - perPage?: number; - search?: string; - searchFields?: string[]; - // (undocumented) - sortField?: string; - // (undocumented) - sortOrder?: string; - // (undocumented) - type: string | string[]; -} - -// @public -export interface SavedObjectsFindResponse { - // (undocumented) - page: number; - // (undocumented) - per_page: number; - // (undocumented) - saved_objects: Array>; - // (undocumented) - total: number; -} - -// @public -export interface SavedObjectsImportConflictError { - // (undocumented) - type: 'conflict'; -} - -// @public -export interface SavedObjectsImportError { - // (undocumented) - error: SavedObjectsImportConflictError | SavedObjectsImportUnsupportedTypeError | SavedObjectsImportMissingReferencesError | SavedObjectsImportUnknownError; - // (undocumented) - id: string; - // (undocumented) - title?: string; - // (undocumented) - type: string; -} - -// @public -export interface SavedObjectsImportMissingReferencesError { - // (undocumented) - blocking: Array<{ - type: string; - id: string; - }>; - // (undocumented) - references: Array<{ - type: string; - id: string; - }>; - // (undocumented) - type: 'missing_references'; -} - -// @public -export interface SavedObjectsImportOptions { - // (undocumented) - namespace?: string; - // (undocumented) - objectLimit: number; - // (undocumented) - overwrite: boolean; - // (undocumented) - readStream: Readable; - // (undocumented) - savedObjectsClient: SavedObjectsClientContract; - // (undocumented) - supportedTypes: string[]; -} - -// @public -export interface SavedObjectsImportResponse { - // (undocumented) - errors?: SavedObjectsImportError[]; - // (undocumented) - success: boolean; - // (undocumented) - successCount: number; -} - -// @public -export interface SavedObjectsImportRetry { - // (undocumented) - id: string; - // (undocumented) - overwrite: boolean; - // (undocumented) - replaceReferences: Array<{ - type: string; - from: string; - to: string; - }>; - // (undocumented) - type: string; -} - -// @public -export interface SavedObjectsImportUnknownError { - // (undocumented) - message: string; - // (undocumented) - statusCode: number; - // (undocumented) - type: 'unknown'; -} - -// @public -export interface SavedObjectsImportUnsupportedTypeError { - // (undocumented) - type: 'unsupported_type'; -} - -// @public (undocumented) -export interface SavedObjectsIncrementCounterOptions extends SavedObjectsBaseOptions { - // (undocumented) - migrationVersion?: SavedObjectsMigrationVersion; - refresh?: MutatingOperationRefreshSetting; -} - -// @internal @deprecated (undocumented) -export interface SavedObjectsLegacyService { - // Warning: (ae-forgotten-export) The symbol "SavedObjectsClientProvider" needs to be exported by the entry point index.d.ts - // - // (undocumented) - addScopedSavedObjectsClientWrapperFactory: SavedObjectsClientProvider['addClientWrapperFactory']; - // (undocumented) - getSavedObjectsRepository(...rest: any[]): any; - // (undocumented) - getScopedSavedObjectsClient: SavedObjectsClientProvider['getClient']; - // (undocumented) - importExport: { - objectLimit: number; - importSavedObjects(options: SavedObjectsImportOptions): Promise; - resolveImportErrors(options: SavedObjectsResolveImportErrorsOptions): Promise; - getSortedObjectsForExport(options: SavedObjectsExportOptions): Promise; - }; - // (undocumented) - SavedObjectsClient: typeof SavedObjectsClient; - // (undocumented) - schema: SavedObjectsSchema; - // (undocumented) - setScopedSavedObjectsClientFactory: SavedObjectsClientProvider['setClientFactory']; - // (undocumented) - types: string[]; -} - -// @public (undocumented) -export interface SavedObjectsMigrationLogger { - // (undocumented) - debug: (msg: string) => void; - // (undocumented) - info: (msg: string) => void; - // (undocumented) - warning: (msg: string) => void; -} - -// @public -export interface SavedObjectsMigrationVersion { - // (undocumented) - [pluginName: string]: string; -} - -// Warning: (ae-missing-release-tag) "RawDoc" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public -export interface SavedObjectsRawDoc { - // (undocumented) - _id: string; - // (undocumented) - _primary_term?: number; - // (undocumented) - _seq_no?: number; - // (undocumented) - _source: any; - // (undocumented) - _type?: string; -} - -// @public (undocumented) -export class SavedObjectsRepository { - // Warning: (ae-forgotten-export) The symbol "SavedObjectsRepositoryOptions" needs to be exported by the entry point index.d.ts - // - // @internal - constructor(options: SavedObjectsRepositoryOptions); - bulkCreate(objects: Array>, options?: SavedObjectsCreateOptions): Promise>; - bulkGet(objects?: SavedObjectsBulkGetObject[], options?: SavedObjectsBaseOptions): Promise>; - bulkUpdate(objects: Array>, options?: SavedObjectsBulkUpdateOptions): Promise>; - create(type: string, attributes: T, options?: SavedObjectsCreateOptions): Promise>; - delete(type: string, id: string, options?: SavedObjectsDeleteOptions): Promise<{}>; - deleteByNamespace(namespace: string, options?: SavedObjectsDeleteByNamespaceOptions): Promise; - // (undocumented) - find({ search, defaultSearchOperator, searchFields, hasReference, page, perPage, sortField, sortOrder, fields, namespace, type, filter, }: SavedObjectsFindOptions): Promise>; - get(type: string, id: string, options?: SavedObjectsBaseOptions): Promise>; - incrementCounter(type: string, id: string, counterFieldName: string, options?: SavedObjectsIncrementCounterOptions): Promise<{ - id: string; - type: string; - updated_at: string; - references: any; - version: string; - attributes: any; - }>; - update(type: string, id: string, attributes: Partial, options?: SavedObjectsUpdateOptions): Promise>; - } - -// @public -export interface SavedObjectsResolveImportErrorsOptions { - // (undocumented) - namespace?: string; - // (undocumented) - objectLimit: number; - // (undocumented) - readStream: Readable; - // (undocumented) - retries: SavedObjectsImportRetry[]; - // (undocumented) - savedObjectsClient: SavedObjectsClientContract; - // (undocumented) - supportedTypes: string[]; -} - -// @internal (undocumented) -export class SavedObjectsSchema { - // Warning: (ae-forgotten-export) The symbol "SavedObjectsSchemaDefinition" needs to be exported by the entry point index.d.ts - constructor(schemaDefinition?: SavedObjectsSchemaDefinition); - // (undocumented) - getConvertToAliasScript(type: string): string | undefined; - // (undocumented) - getIndexForType(config: Config, type: string): string | undefined; - // (undocumented) - isHiddenType(type: string): boolean; - // (undocumented) - isNamespaceAgnostic(type: string): boolean; -} - -// @internal (undocumented) -export class SavedObjectsSerializer { - constructor(schema: SavedObjectsSchema); - generateRawId(namespace: string | undefined, type: string, id?: string): string; - isRawSavedObject(rawDoc: SavedObjectsRawDoc): any; - // Warning: (ae-forgotten-export) The symbol "SanitizedSavedObjectDoc" needs to be exported by the entry point index.d.ts - rawToSavedObject(doc: SavedObjectsRawDoc): SanitizedSavedObjectDoc; - savedObjectToRaw(savedObj: SanitizedSavedObjectDoc): SavedObjectsRawDoc; - } - -// @public -export interface SavedObjectsServiceSetup { - addClientWrapper: (priority: number, id: string, factory: SavedObjectsClientWrapperFactory) => void; - createInternalRepository: (extraTypes?: string[]) => ISavedObjectsRepository; - createScopedRepository: (req: KibanaRequest, extraTypes?: string[]) => ISavedObjectsRepository; - setClientFactory: (customClientFactory: SavedObjectsClientFactory) => void; -} - -// @public -export interface SavedObjectsServiceStart { - getScopedClient: (req: KibanaRequest, options?: SavedObjectsClientProviderOptions) => SavedObjectsClientContract; -} - -// @public (undocumented) -export interface SavedObjectsUpdateOptions extends SavedObjectsBaseOptions { - references?: SavedObjectReference[]; - refresh?: MutatingOperationRefreshSetting; - version?: string; -} - -// @public (undocumented) -export interface SavedObjectsUpdateResponse extends Omit, 'attributes' | 'references'> { - // (undocumented) - attributes: Partial; - // (undocumented) - references: SavedObjectReference[] | undefined; -} - -// @public -export class ScopedClusterClient implements IScopedClusterClient { - constructor(internalAPICaller: APICaller, scopedAPICaller: APICaller, headers?: Headers | undefined); - callAsCurrentUser(endpoint: string, clientParams?: Record, options?: CallAPIOptions): Promise; - callAsInternalUser(endpoint: string, clientParams?: Record, options?: CallAPIOptions): Promise; - } - -// @public -export interface SessionCookieValidationResult { - isValid: boolean; - path?: string; -} - -// @public -export interface SessionStorage { - clear(): void; - get(): Promise; - set(sessionValue: T): void; -} - -// @public -export interface SessionStorageCookieOptions { - encryptionKey: string; - isSecure: boolean; - name: string; - validate: (sessionValue: T | T[]) => SessionCookieValidationResult; -} - -// @public -export interface SessionStorageFactory { - // (undocumented) - asScoped: (request: KibanaRequest) => SessionStorage; -} - -// @public -export interface UiSettingsParams { - category?: string[]; - description?: string; - name?: string; - optionLabels?: Record; - options?: string[]; - readonly?: boolean; - requiresPageReload?: boolean; - type?: UiSettingsType; - value?: SavedObjectAttribute; -} - -// @public (undocumented) -export interface UiSettingsServiceSetup { - register(settings: Record): void; -} - -// @public -export type UiSettingsType = 'json' | 'markdown' | 'number' | 'select' | 'boolean' | 'string'; - -// @public -export interface UserProvidedValues { - // (undocumented) - isOverridden?: boolean; - // (undocumented) - userValue?: T; -} - -// @public -export const validBodyOutput: readonly ["data", "stream"]; - - -// Warnings were encountered during analysis: -// -// src/core/server/http/router/response.ts:316:3 - (ae-forgotten-export) The symbol "KibanaResponse" needs to be exported by the entry point index.d.ts -// src/core/server/plugins/plugins_service.ts:43:5 - (ae-forgotten-export) The symbol "InternalPluginInfo" needs to be exported by the entry point index.d.ts - -``` +## API Report File for "kibana" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import Boom from 'boom'; +import { BulkIndexDocumentsParams } from 'elasticsearch'; +import { CatAliasesParams } from 'elasticsearch'; +import { CatAllocationParams } from 'elasticsearch'; +import { CatCommonParams } from 'elasticsearch'; +import { CatFielddataParams } from 'elasticsearch'; +import { CatHealthParams } from 'elasticsearch'; +import { CatHelpParams } from 'elasticsearch'; +import { CatIndicesParams } from 'elasticsearch'; +import { CatRecoveryParams } from 'elasticsearch'; +import { CatSegmentsParams } from 'elasticsearch'; +import { CatShardsParams } from 'elasticsearch'; +import { CatSnapshotsParams } from 'elasticsearch'; +import { CatTasksParams } from 'elasticsearch'; +import { CatThreadPoolParams } from 'elasticsearch'; +import { ClearScrollParams } from 'elasticsearch'; +import { Client } from 'elasticsearch'; +import { ClusterAllocationExplainParams } from 'elasticsearch'; +import { ClusterGetSettingsParams } from 'elasticsearch'; +import { ClusterHealthParams } from 'elasticsearch'; +import { ClusterPendingTasksParams } from 'elasticsearch'; +import { ClusterPutSettingsParams } from 'elasticsearch'; +import { ClusterRerouteParams } from 'elasticsearch'; +import { ClusterStateParams } from 'elasticsearch'; +import { ClusterStatsParams } from 'elasticsearch'; +import { ConfigOptions } from 'elasticsearch'; +import { CountParams } from 'elasticsearch'; +import { CreateDocumentParams } from 'elasticsearch'; +import { DeleteDocumentByQueryParams } from 'elasticsearch'; +import { DeleteDocumentParams } from 'elasticsearch'; +import { DeleteScriptParams } from 'elasticsearch'; +import { DeleteTemplateParams } from 'elasticsearch'; +import { DetailedPeerCertificate } from 'tls'; +import { Duration } from 'moment'; +import { ExistsParams } from 'elasticsearch'; +import { ExplainParams } from 'elasticsearch'; +import { FieldStatsParams } from 'elasticsearch'; +import { GenericParams } from 'elasticsearch'; +import { GetParams } from 'elasticsearch'; +import { GetResponse } from 'elasticsearch'; +import { GetScriptParams } from 'elasticsearch'; +import { GetSourceParams } from 'elasticsearch'; +import { GetTemplateParams } from 'elasticsearch'; +import { IncomingHttpHeaders } from 'http'; +import { IndexDocumentParams } from 'elasticsearch'; +import { IndicesAnalyzeParams } from 'elasticsearch'; +import { IndicesClearCacheParams } from 'elasticsearch'; +import { IndicesCloseParams } from 'elasticsearch'; +import { IndicesCreateParams } from 'elasticsearch'; +import { IndicesDeleteAliasParams } from 'elasticsearch'; +import { IndicesDeleteParams } from 'elasticsearch'; +import { IndicesDeleteTemplateParams } from 'elasticsearch'; +import { IndicesExistsAliasParams } from 'elasticsearch'; +import { IndicesExistsParams } from 'elasticsearch'; +import { IndicesExistsTemplateParams } from 'elasticsearch'; +import { IndicesExistsTypeParams } from 'elasticsearch'; +import { IndicesFlushParams } from 'elasticsearch'; +import { IndicesFlushSyncedParams } from 'elasticsearch'; +import { IndicesForcemergeParams } from 'elasticsearch'; +import { IndicesGetAliasParams } from 'elasticsearch'; +import { IndicesGetFieldMappingParams } from 'elasticsearch'; +import { IndicesGetMappingParams } from 'elasticsearch'; +import { IndicesGetParams } from 'elasticsearch'; +import { IndicesGetSettingsParams } from 'elasticsearch'; +import { IndicesGetTemplateParams } from 'elasticsearch'; +import { IndicesGetUpgradeParams } from 'elasticsearch'; +import { IndicesOpenParams } from 'elasticsearch'; +import { IndicesPutAliasParams } from 'elasticsearch'; +import { IndicesPutMappingParams } from 'elasticsearch'; +import { IndicesPutSettingsParams } from 'elasticsearch'; +import { IndicesPutTemplateParams } from 'elasticsearch'; +import { IndicesRecoveryParams } from 'elasticsearch'; +import { IndicesRefreshParams } from 'elasticsearch'; +import { IndicesRolloverParams } from 'elasticsearch'; +import { IndicesSegmentsParams } from 'elasticsearch'; +import { IndicesShardStoresParams } from 'elasticsearch'; +import { IndicesShrinkParams } from 'elasticsearch'; +import { IndicesStatsParams } from 'elasticsearch'; +import { IndicesUpdateAliasesParams } from 'elasticsearch'; +import { IndicesUpgradeParams } from 'elasticsearch'; +import { IndicesValidateQueryParams } from 'elasticsearch'; +import { InfoParams } from 'elasticsearch'; +import { IngestDeletePipelineParams } from 'elasticsearch'; +import { IngestGetPipelineParams } from 'elasticsearch'; +import { IngestPutPipelineParams } from 'elasticsearch'; +import { IngestSimulateParams } from 'elasticsearch'; +import { KibanaConfigType } from 'src/core/server/kibana_config'; +import { Logger as Logger_2 } from 'src/core/server/logging'; +import { MGetParams } from 'elasticsearch'; +import { MGetResponse } from 'elasticsearch'; +import { MSearchParams } from 'elasticsearch'; +import { MSearchResponse } from 'elasticsearch'; +import { MSearchTemplateParams } from 'elasticsearch'; +import { MTermVectorsParams } from 'elasticsearch'; +import { NodesHotThreadsParams } from 'elasticsearch'; +import { NodesInfoParams } from 'elasticsearch'; +import { NodesStatsParams } from 'elasticsearch'; +import { ObjectType } from '@kbn/config-schema'; +import { Observable } from 'rxjs'; +import { PeerCertificate } from 'tls'; +import { PingParams } from 'elasticsearch'; +import { PutScriptParams } from 'elasticsearch'; +import { PutTemplateParams } from 'elasticsearch'; +import { Readable } from 'stream'; +import { ReindexParams } from 'elasticsearch'; +import { ReindexRethrottleParams } from 'elasticsearch'; +import { RenderSearchTemplateParams } from 'elasticsearch'; +import { Request } from 'hapi'; +import { ResponseObject } from 'hapi'; +import { ResponseToolkit } from 'hapi'; +import { ScrollParams } from 'elasticsearch'; +import { SearchParams } from 'elasticsearch'; +import { SearchResponse } from 'elasticsearch'; +import { SearchShardsParams } from 'elasticsearch'; +import { SearchTemplateParams } from 'elasticsearch'; +import { Server } from 'hapi'; +import { ShallowPromise } from '@kbn/utility-types'; +import { SnapshotCreateParams } from 'elasticsearch'; +import { SnapshotCreateRepositoryParams } from 'elasticsearch'; +import { SnapshotDeleteParams } from 'elasticsearch'; +import { SnapshotDeleteRepositoryParams } from 'elasticsearch'; +import { SnapshotGetParams } from 'elasticsearch'; +import { SnapshotGetRepositoryParams } from 'elasticsearch'; +import { SnapshotRestoreParams } from 'elasticsearch'; +import { SnapshotStatusParams } from 'elasticsearch'; +import { SnapshotVerifyRepositoryParams } from 'elasticsearch'; +import { Stream } from 'stream'; +import { SuggestParams } from 'elasticsearch'; +import { TasksCancelParams } from 'elasticsearch'; +import { TasksGetParams } from 'elasticsearch'; +import { TasksListParams } from 'elasticsearch'; +import { TermvectorsParams } from 'elasticsearch'; +import { Type } from '@kbn/config-schema'; +import { TypeOf } from '@kbn/config-schema'; +import { UpdateDocumentByQueryParams } from 'elasticsearch'; +import { UpdateDocumentParams } from 'elasticsearch'; +import { Url } from 'url'; + +// @public (undocumented) +export interface APICaller { + // (undocumented) + (endpoint: 'cluster.state', params: ClusterStateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'bulk', params: BulkIndexDocumentsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'count', params: CountParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'create', params: CreateDocumentParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'delete', params: DeleteDocumentParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'deleteByQuery', params: DeleteDocumentByQueryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'deleteScript', params: DeleteScriptParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'deleteTemplate', params: DeleteTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'exists', params: ExistsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'explain', params: ExplainParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'fieldStats', params: FieldStatsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'get', params: GetParams, options?: CallAPIOptions): Promise>; + // (undocumented) + (endpoint: 'getScript', params: GetScriptParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'getSource', params: GetSourceParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'getTemplate', params: GetTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'index', params: IndexDocumentParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'info', params: InfoParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'mget', params: MGetParams, options?: CallAPIOptions): Promise>; + // (undocumented) + (endpoint: 'msearch', params: MSearchParams, options?: CallAPIOptions): Promise>; + // (undocumented) + (endpoint: 'msearchTemplate', params: MSearchTemplateParams, options?: CallAPIOptions): Promise>; + // (undocumented) + (endpoint: 'mtermvectors', params: MTermVectorsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'ping', params: PingParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'putScript', params: PutScriptParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'putTemplate', params: PutTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'reindex', params: ReindexParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'reindexRethrottle', params: ReindexRethrottleParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'renderSearchTemplate', params: RenderSearchTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'scroll', params: ScrollParams, options?: CallAPIOptions): Promise>; + // (undocumented) + (endpoint: 'search', params: SearchParams, options?: CallAPIOptions): Promise>; + // (undocumented) + (endpoint: 'searchShards', params: SearchShardsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'searchTemplate', params: SearchTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'suggest', params: SuggestParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'termvectors', params: TermvectorsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'update', params: UpdateDocumentParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'updateByQuery', params: UpdateDocumentByQueryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.aliases', params: CatAliasesParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.allocation', params: CatAllocationParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.count', params: CatAllocationParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.fielddata', params: CatFielddataParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.health', params: CatHealthParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.help', params: CatHelpParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.indices', params: CatIndicesParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.master', params: CatCommonParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.nodeattrs', params: CatCommonParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.nodes', params: CatCommonParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.pendingTasks', params: CatCommonParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.plugins', params: CatCommonParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.recovery', params: CatRecoveryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.repositories', params: CatCommonParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.segments', params: CatSegmentsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.shards', params: CatShardsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.snapshots', params: CatSnapshotsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.tasks', params: CatTasksParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cat.threadPool', params: CatThreadPoolParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.allocationExplain', params: ClusterAllocationExplainParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.getSettings', params: ClusterGetSettingsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.health', params: ClusterHealthParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.pendingTasks', params: ClusterPendingTasksParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.putSettings', params: ClusterPutSettingsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.reroute', params: ClusterRerouteParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'clearScroll', params: ClearScrollParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'cluster.stats', params: ClusterStatsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.analyze', params: IndicesAnalyzeParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.clearCache', params: IndicesClearCacheParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.close', params: IndicesCloseParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.create', params: IndicesCreateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.delete', params: IndicesDeleteParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.deleteAlias', params: IndicesDeleteAliasParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.deleteTemplate', params: IndicesDeleteTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.exists', params: IndicesExistsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.existsAlias', params: IndicesExistsAliasParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.existsTemplate', params: IndicesExistsTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.existsType', params: IndicesExistsTypeParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.flush', params: IndicesFlushParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.flushSynced', params: IndicesFlushSyncedParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.forcemerge', params: IndicesForcemergeParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.get', params: IndicesGetParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.getAlias', params: IndicesGetAliasParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.getFieldMapping', params: IndicesGetFieldMappingParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.getMapping', params: IndicesGetMappingParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.getSettings', params: IndicesGetSettingsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.getTemplate', params: IndicesGetTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.getUpgrade', params: IndicesGetUpgradeParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.open', params: IndicesOpenParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.putAlias', params: IndicesPutAliasParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.putMapping', params: IndicesPutMappingParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.putSettings', params: IndicesPutSettingsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.putTemplate', params: IndicesPutTemplateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.recovery', params: IndicesRecoveryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.refresh', params: IndicesRefreshParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.rollover', params: IndicesRolloverParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.segments', params: IndicesSegmentsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.shardStores', params: IndicesShardStoresParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.shrink', params: IndicesShrinkParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.stats', params: IndicesStatsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.updateAliases', params: IndicesUpdateAliasesParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.upgrade', params: IndicesUpgradeParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'indices.validateQuery', params: IndicesValidateQueryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'ingest.deletePipeline', params: IngestDeletePipelineParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'ingest.getPipeline', params: IngestGetPipelineParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'ingest.putPipeline', params: IngestPutPipelineParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'ingest.simulate', params: IngestSimulateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'nodes.hotThreads', params: NodesHotThreadsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'nodes.info', params: NodesInfoParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'nodes.stats', params: NodesStatsParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.create', params: SnapshotCreateParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.createRepository', params: SnapshotCreateRepositoryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.delete', params: SnapshotDeleteParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.deleteRepository', params: SnapshotDeleteRepositoryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.get', params: SnapshotGetParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.getRepository', params: SnapshotGetRepositoryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.restore', params: SnapshotRestoreParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.status', params: SnapshotStatusParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'snapshot.verifyRepository', params: SnapshotVerifyRepositoryParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'tasks.cancel', params: TasksCancelParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'tasks.get', params: TasksGetParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'tasks.list', params: TasksListParams, options?: CallAPIOptions): ReturnType; + // (undocumented) + (endpoint: 'transport.request', clientParams: AssistantAPIClientParams, options?: CallAPIOptions): Promise; + // (undocumented) + (endpoint: 'transport.request', clientParams: DeprecationAPIClientParams, options?: CallAPIOptions): Promise; + // (undocumented) + (endpoint: string, clientParams?: Record, options?: CallAPIOptions): Promise; +} + +// @public (undocumented) +export interface AssistanceAPIResponse { + // (undocumented) + indices: { + [indexName: string]: { + action_required: MIGRATION_ASSISTANCE_INDEX_ACTION; + }; + }; +} + +// @public (undocumented) +export interface AssistantAPIClientParams extends GenericParams { + // (undocumented) + method: 'GET'; + // (undocumented) + path: '/_migration/assistance'; +} + +// @public (undocumented) +export interface Authenticated extends AuthResultParams { + // (undocumented) + type: AuthResultType.authenticated; +} + +// @public +export type AuthenticationHandler = (request: KibanaRequest, response: LifecycleResponseFactory, toolkit: AuthToolkit) => AuthResult | IKibanaResponse | Promise; + +// @public +export type AuthHeaders = Record; + +// @public (undocumented) +export type AuthResult = Authenticated; + +// @public +export interface AuthResultParams { + requestHeaders?: AuthHeaders; + responseHeaders?: AuthHeaders; + state?: Record; +} + +// @public (undocumented) +export enum AuthResultType { + // (undocumented) + authenticated = "authenticated" +} + +// @public +export enum AuthStatus { + authenticated = "authenticated", + unauthenticated = "unauthenticated", + unknown = "unknown" +} + +// @public +export interface AuthToolkit { + authenticated: (data?: AuthResultParams) => AuthResult; +} + +// @public +export class BasePath { + // @internal + constructor(serverBasePath?: string); + get: (request: KibanaRequest | LegacyRequest) => string; + prepend: (path: string) => string; + remove: (path: string) => string; + readonly serverBasePath: string; + set: (request: KibanaRequest | LegacyRequest, requestSpecificBasePath: string) => void; +} + +// Warning: (ae-forgotten-export) The symbol "BootstrapArgs" needs to be exported by the entry point index.d.ts +// +// @internal (undocumented) +export function bootstrap({ configs, cliArgs, applyConfigOverrides, features, }: BootstrapArgs): Promise; + +// @public +export interface CallAPIOptions { + signal?: AbortSignal; + wrap401Errors?: boolean; +} + +// @public +export interface Capabilities { + [key: string]: Record>; + catalogue: Record; + management: { + [sectionId: string]: Record; + }; + navLinks: Record; +} + +// @public +export type CapabilitiesProvider = () => Partial; + +// @public +export interface CapabilitiesSetup { + registerProvider(provider: CapabilitiesProvider): void; + registerSwitcher(switcher: CapabilitiesSwitcher): void; +} + +// @public +export interface CapabilitiesStart { + resolveCapabilities(request: KibanaRequest): Promise; +} + +// @public +export type CapabilitiesSwitcher = (request: KibanaRequest, uiCapabilities: Capabilities) => Partial | Promise>; + +// @public +export class ClusterClient implements IClusterClient { + constructor(config: ElasticsearchClientConfig, log: Logger, getAuthHeaders?: GetAuthHeaders); + asScoped(request?: KibanaRequest | LegacyRequest | FakeRequest): IScopedClusterClient; + callAsInternalUser: APICaller; + close(): void; + } + +// @public (undocumented) +export type ConfigPath = string | string[]; + +// @internal (undocumented) +export class ConfigService { + // Warning: (ae-forgotten-export) The symbol "Config" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "Env" needs to be exported by the entry point index.d.ts + constructor(config$: Observable, env: Env, logger: LoggerFactory); + atPath(path: ConfigPath): Observable; + getConfig$(): Observable; + // (undocumented) + getUnusedPaths(): Promise; + // (undocumented) + getUsedPaths(): Promise; + // (undocumented) + isEnabledAtPath(path: ConfigPath): Promise; + optionalAtPath(path: ConfigPath): Observable; + setSchema(path: ConfigPath, schema: Type): Promise; + } + +// @public +export interface ContextSetup { + createContextContainer>(): IContextContainer; +} + +// @internal (undocumented) +export type CoreId = symbol; + +// @public +export interface CoreSetup { + // (undocumented) + capabilities: CapabilitiesSetup; + // (undocumented) + context: ContextSetup; + // (undocumented) + elasticsearch: ElasticsearchServiceSetup; + // (undocumented) + http: HttpServiceSetup; + // (undocumented) + savedObjects: SavedObjectsServiceSetup; + // (undocumented) + uiSettings: UiSettingsServiceSetup; +} + +// @public +export interface CoreStart { + // (undocumented) + capabilities: CapabilitiesStart; + // (undocumented) + savedObjects: SavedObjectsServiceStart; +} + +// @public +export interface CustomHttpResponseOptions { + body?: T; + headers?: ResponseHeaders; + // (undocumented) + statusCode: number; +} + +// @public (undocumented) +export interface DeprecationAPIClientParams extends GenericParams { + // (undocumented) + method: 'GET'; + // (undocumented) + path: '/_migration/deprecations'; +} + +// @public (undocumented) +export interface DeprecationAPIResponse { + // (undocumented) + cluster_settings: DeprecationInfo[]; + // (undocumented) + index_settings: IndexSettingsDeprecationInfo; + // (undocumented) + ml_settings: DeprecationInfo[]; + // (undocumented) + node_settings: DeprecationInfo[]; +} + +// @public (undocumented) +export interface DeprecationInfo { + // (undocumented) + details?: string; + // (undocumented) + level: MIGRATION_DEPRECATION_LEVEL; + // (undocumented) + message: string; + // (undocumented) + url: string; +} + +// @public +export interface DiscoveredPlugin { + readonly configPath: ConfigPath; + readonly id: PluginName; + readonly optionalPlugins: readonly PluginName[]; + readonly requiredPlugins: readonly PluginName[]; +} + +// Warning: (ae-forgotten-export) The symbol "ElasticsearchConfig" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export type ElasticsearchClientConfig = Pick & Pick & { + pingTimeout?: ElasticsearchConfig['pingTimeout'] | ConfigOptions['pingTimeout']; + requestTimeout?: ElasticsearchConfig['requestTimeout'] | ConfigOptions['requestTimeout']; + sniffInterval?: ElasticsearchConfig['sniffInterval'] | ConfigOptions['sniffInterval']; + ssl?: Partial; +}; + +// @public (undocumented) +export interface ElasticsearchError extends Boom { + // (undocumented) + [code]?: string; +} + +// @public +export class ElasticsearchErrorHelpers { + // (undocumented) + static decorateNotAuthorizedError(error: Error, reason?: string): ElasticsearchError; + // (undocumented) + static isNotAuthorizedError(error: any): error is ElasticsearchError; +} + +// @public (undocumented) +export interface ElasticsearchServiceSetup { + readonly adminClient$: Observable; + readonly createClient: (type: string, clientConfig?: Partial) => IClusterClient; + readonly dataClient$: Observable; +} + +// @public (undocumented) +export interface EnvironmentMode { + // (undocumented) + dev: boolean; + // (undocumented) + name: 'development' | 'production'; + // (undocumented) + prod: boolean; +} + +// @public +export interface ErrorHttpResponseOptions { + body?: ResponseError; + headers?: ResponseHeaders; +} + +// @public +export interface FakeRequest { + headers: Headers; +} + +// @public +export type GetAuthHeaders = (request: KibanaRequest | LegacyRequest) => AuthHeaders | undefined; + +// @public +export type GetAuthState = (request: KibanaRequest | LegacyRequest) => { + status: AuthStatus; + state: unknown; +}; + +// @public +export type HandlerContextType> = T extends HandlerFunction ? U : never; + +// @public +export type HandlerFunction = (context: T, ...args: any[]) => any; + +// @public +export type HandlerParameters> = T extends (context: any, ...args: infer U) => any ? U : never; + +// @public +export type Headers = { + [header in KnownHeaders]?: string | string[] | undefined; +} & { + [header: string]: string | string[] | undefined; +}; + +// @public +export interface HttpResponseOptions { + body?: HttpResponsePayload; + headers?: ResponseHeaders; +} + +// @public +export type HttpResponsePayload = undefined | string | Record | Buffer | Stream; + +// @public +export interface HttpServiceSetup { + basePath: IBasePath; + createCookieSessionStorageFactory: (cookieOptions: SessionStorageCookieOptions) => Promise>; + createRouter: () => IRouter; + isTlsEnabled: boolean; + registerAuth: (handler: AuthenticationHandler) => void; + registerOnPostAuth: (handler: OnPostAuthHandler) => void; + registerOnPreAuth: (handler: OnPreAuthHandler) => void; + registerRouteHandlerContext: (contextName: T, provider: RequestHandlerContextProvider) => RequestHandlerContextContainer; +} + +// @public (undocumented) +export interface HttpServiceStart { + isListening: (port: number) => boolean; +} + +// @public +export type IBasePath = Pick; + +// @public +export type IClusterClient = Pick; + +// @public +export interface IContextContainer> { + createHandler(pluginOpaqueId: PluginOpaqueId, handler: THandler): (...rest: HandlerParameters) => ShallowPromise>; + registerContext>(pluginOpaqueId: PluginOpaqueId, contextName: TContextName, provider: IContextProvider): this; +} + +// @public +export type IContextProvider, TContextName extends keyof HandlerContextType> = (context: Partial>, ...rest: HandlerParameters) => Promise[TContextName]> | HandlerContextType[TContextName]; + +// @public +export interface IKibanaResponse { + // (undocumented) + readonly options: HttpResponseOptions; + // (undocumented) + readonly payload?: T; + // (undocumented) + readonly status: number; +} + +// @public +export interface IKibanaSocket { + readonly authorizationError?: Error; + readonly authorized?: boolean; + // (undocumented) + getPeerCertificate(detailed: true): DetailedPeerCertificate | null; + // (undocumented) + getPeerCertificate(detailed: false): PeerCertificate | null; + getPeerCertificate(detailed?: boolean): PeerCertificate | DetailedPeerCertificate | null; +} + +// @public (undocumented) +export interface IndexSettingsDeprecationInfo { + // (undocumented) + [indexName: string]: DeprecationInfo[]; +} + +// @public +export interface IRouter { + delete: RouteRegistrar<'delete'>; + get: RouteRegistrar<'get'>; + // Warning: (ae-forgotten-export) The symbol "RouterRoute" needs to be exported by the entry point index.d.ts + // + // @internal + getRoutes: () => RouterRoute[]; + handleLegacyErrors:

    (handler: RequestHandler) => RequestHandler; + patch: RouteRegistrar<'patch'>; + post: RouteRegistrar<'post'>; + put: RouteRegistrar<'put'>; + routerPath: string; +} + +// @public +export type IsAuthenticated = (request: KibanaRequest | LegacyRequest) => boolean; + +// @public +export type ISavedObjectsRepository = Pick; + +// @public +export type IScopedClusterClient = Pick; + +// @public +export interface IUiSettingsClient { + get: (key: string) => Promise; + getAll: () => Promise>; + getRegistered: () => Readonly>; + getUserProvided: () => Promise>>; + isOverridden: (key: string) => boolean; + remove: (key: string) => Promise; + removeMany: (keys: string[]) => Promise; + set: (key: string, value: any) => Promise; + setMany: (changes: Record) => Promise; +} + +// @public +export class KibanaRequest { + // @internal (undocumented) + protected readonly [requestSymbol]: Request; + constructor(request: Request, params: Params, query: Query, body: Body, withoutSecretHeaders: boolean); + // (undocumented) + readonly body: Body; + // @internal + static from

    | Type>(req: Request, routeSchemas?: RouteSchemas, withoutSecretHeaders?: boolean): KibanaRequest; + readonly headers: Headers; + // (undocumented) + readonly params: Params; + // (undocumented) + readonly query: Query; + readonly route: RecursiveReadonly>; + // (undocumented) + readonly socket: IKibanaSocket; + readonly url: Url; + } + +// @public +export interface KibanaRequestRoute { + // (undocumented) + method: Method; + // (undocumented) + options: KibanaRequestRouteOptions; + // (undocumented) + path: string; +} + +// @public +export type KibanaRequestRouteOptions = Method extends 'get' | 'options' ? Required, 'body'>> : Required>; + +// @public +export type KibanaResponseFactory = typeof kibanaResponseFactory; + +// @public +export const kibanaResponseFactory: { + custom: | Buffer | Stream | { + message: string | Error; + attributes?: Record | undefined; + } | undefined>(options: CustomHttpResponseOptions) => KibanaResponse; + badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse; + unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse; + forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse; + notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse; + conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse; + internalError: (options?: ErrorHttpResponseOptions) => KibanaResponse; + customError: (options: CustomHttpResponseOptions) => KibanaResponse; + redirected: (options: RedirectResponseOptions) => KibanaResponse | Buffer | Stream>; + ok: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; + accepted: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; + noContent: (options?: HttpResponseOptions) => KibanaResponse; +}; + +// Warning: (ae-forgotten-export) The symbol "KnownKeys" needs to be exported by the entry point index.d.ts +// +// @public +export type KnownHeaders = KnownKeys; + +// @public @deprecated (undocumented) +export interface LegacyRequest extends Request { +} + +// @public @deprecated (undocumented) +export interface LegacyServiceSetupDeps { + // Warning: (ae-forgotten-export) The symbol "InternalCoreSetup" needs to be exported by the entry point index.d.ts + // + // (undocumented) + core: InternalCoreSetup & { + plugins: PluginsServiceSetup; + }; + // (undocumented) + plugins: Record; +} + +// @public @deprecated (undocumented) +export interface LegacyServiceStartDeps { + // Warning: (ae-forgotten-export) The symbol "InternalCoreStart" needs to be exported by the entry point index.d.ts + // + // (undocumented) + core: InternalCoreStart & { + plugins: PluginsServiceStart; + }; + // (undocumented) + plugins: Record; +} + +// Warning: (ae-forgotten-export) The symbol "lifecycleResponseFactory" needs to be exported by the entry point index.d.ts +// +// @public +export type LifecycleResponseFactory = typeof lifecycleResponseFactory; + +// @public +export interface Logger { + debug(message: string, meta?: LogMeta): void; + error(errorOrMessage: string | Error, meta?: LogMeta): void; + fatal(errorOrMessage: string | Error, meta?: LogMeta): void; + info(message: string, meta?: LogMeta): void; + // @internal (undocumented) + log(record: LogRecord): void; + trace(message: string, meta?: LogMeta): void; + warn(errorOrMessage: string | Error, meta?: LogMeta): void; +} + +// @public +export interface LoggerFactory { + get(...contextParts: string[]): Logger; +} + +// @internal +export class LogLevel { + // (undocumented) + static readonly All: LogLevel; + // (undocumented) + static readonly Debug: LogLevel; + // (undocumented) + static readonly Error: LogLevel; + // (undocumented) + static readonly Fatal: LogLevel; + static fromId(level: LogLevelId): LogLevel; + // Warning: (ae-forgotten-export) The symbol "LogLevelId" needs to be exported by the entry point index.d.ts + // + // (undocumented) + readonly id: LogLevelId; + // (undocumented) + static readonly Info: LogLevel; + // (undocumented) + static readonly Off: LogLevel; + supports(level: LogLevel): boolean; + // (undocumented) + static readonly Trace: LogLevel; + // (undocumented) + readonly value: number; + // (undocumented) + static readonly Warn: LogLevel; +} + +// @public +export interface LogMeta { + // (undocumented) + [key: string]: any; +} + +// @internal +export interface LogRecord { + // (undocumented) + context: string; + // (undocumented) + error?: Error; + // (undocumented) + level: LogLevel; + // (undocumented) + message: string; + // (undocumented) + meta?: { + [name: string]: any; + }; + // (undocumented) + timestamp: Date; +} + +// @public (undocumented) +export type MIGRATION_ASSISTANCE_INDEX_ACTION = 'upgrade' | 'reindex'; + +// @public (undocumented) +export type MIGRATION_DEPRECATION_LEVEL = 'none' | 'info' | 'warning' | 'critical'; + +// @public +export type MutatingOperationRefreshSetting = boolean | 'wait_for'; + +// Warning: (ae-forgotten-export) The symbol "OnPostAuthResult" needs to be exported by the entry point index.d.ts +// +// @public +export type OnPostAuthHandler = (request: KibanaRequest, response: LifecycleResponseFactory, toolkit: OnPostAuthToolkit) => OnPostAuthResult | KibanaResponse | Promise; + +// @public +export interface OnPostAuthToolkit { + next: () => OnPostAuthResult; +} + +// Warning: (ae-forgotten-export) The symbol "OnPreAuthResult" needs to be exported by the entry point index.d.ts +// +// @public +export type OnPreAuthHandler = (request: KibanaRequest, response: LifecycleResponseFactory, toolkit: OnPreAuthToolkit) => OnPreAuthResult | KibanaResponse | Promise; + +// @public +export interface OnPreAuthToolkit { + next: () => OnPreAuthResult; + rewriteUrl: (url: string) => OnPreAuthResult; +} + +// @public (undocumented) +export interface PackageInfo { + // (undocumented) + branch: string; + // (undocumented) + buildNum: number; + // (undocumented) + buildSha: string; + // (undocumented) + dist: boolean; + // (undocumented) + version: string; +} + +// @public +export interface Plugin { + // (undocumented) + setup(core: CoreSetup, plugins: TPluginsSetup): TSetup | Promise; + // (undocumented) + start(core: CoreStart, plugins: TPluginsStart): TStart | Promise; + // (undocumented) + stop?(): void; +} + +// @public +export interface PluginConfigDescriptor { + exposeToBrowser?: { + [P in keyof T]?: boolean; + }; + schema: PluginConfigSchema; +} + +// @public +export type PluginConfigSchema = Type; + +// @public +export type PluginInitializer = (core: PluginInitializerContext) => Plugin; + +// @public +export interface PluginInitializerContext { + // (undocumented) + config: { + create: () => Observable; + createIfExists: () => Observable; + }; + // (undocumented) + env: { + mode: EnvironmentMode; + packageInfo: Readonly; + }; + // (undocumented) + logger: LoggerFactory; + // (undocumented) + opaqueId: PluginOpaqueId; +} + +// @public +export interface PluginManifest { + readonly configPath: ConfigPath; + readonly id: PluginName; + readonly kibanaVersion: string; + readonly optionalPlugins: readonly PluginName[]; + readonly requiredPlugins: readonly PluginName[]; + readonly server: boolean; + readonly ui: boolean; + readonly version: string; +} + +// @public +export type PluginName = string; + +// @public (undocumented) +export type PluginOpaqueId = symbol; + +// @public (undocumented) +export interface PluginsServiceSetup { + // (undocumented) + contracts: Map; + // (undocumented) + uiPlugins: { + internal: Map; + public: Map; + browserConfigs: Map>; + }; +} + +// @public (undocumented) +export interface PluginsServiceStart { + // (undocumented) + contracts: Map; +} + +// Warning: (ae-forgotten-export) The symbol "RecursiveReadonlyArray" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export type RecursiveReadonly = T extends (...args: any[]) => any ? T : T extends any[] ? RecursiveReadonlyArray : T extends object ? Readonly<{ + [K in keyof T]: RecursiveReadonly; +}> : T; + +// @public +export type RedirectResponseOptions = HttpResponseOptions & { + headers: { + location: string; + }; +}; + +// @public +export type RequestHandler

    | Type, Method extends RouteMethod = any> = (context: RequestHandlerContext, request: KibanaRequest, TypeOf, TypeOf, Method>, response: KibanaResponseFactory) => IKibanaResponse | Promise>; + +// @public +export interface RequestHandlerContext { + // (undocumented) + core: { + savedObjects: { + client: SavedObjectsClientContract; + }; + elasticsearch: { + dataClient: IScopedClusterClient; + adminClient: IScopedClusterClient; + }; + uiSettings: { + client: IUiSettingsClient; + }; + }; +} + +// @public +export type RequestHandlerContextContainer = IContextContainer>; + +// @public +export type RequestHandlerContextProvider = IContextProvider, TContextName>; + +// @public +export type ResponseError = string | Error | { + message: string | Error; + attributes?: ResponseErrorAttributes; +}; + +// @public +export type ResponseErrorAttributes = Record; + +// @public +export type ResponseHeaders = { + [header in KnownHeaders]?: string | string[]; +} & { + [header: string]: string | string[]; +}; + +// @public +export interface RouteConfig

    | Type, Method extends RouteMethod> { + options?: RouteConfigOptions; + path: string; + validate: RouteSchemas | false; +} + +// @public +export interface RouteConfigOptions { + authRequired?: boolean; + body?: Method extends 'get' | 'options' ? undefined : RouteConfigOptionsBody; + tags?: readonly string[]; +} + +// @public +export interface RouteConfigOptionsBody { + accepts?: RouteContentType | RouteContentType[] | string | string[]; + maxBytes?: number; + output?: typeof validBodyOutput[number]; + parse?: boolean | 'gunzip'; +} + +// @public +export type RouteContentType = 'application/json' | 'application/*+json' | 'application/octet-stream' | 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/*'; + +// @public +export type RouteMethod = 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options'; + +// @public +export type RouteRegistrar =

    | Type>(route: RouteConfig, handler: RequestHandler) => void; + +// @public +export interface RouteSchemas

    | Type> { + // (undocumented) + body?: B; + // (undocumented) + params?: P; + // (undocumented) + query?: Q; +} + +// @public (undocumented) +export interface SavedObject { + attributes: T; + // (undocumented) + error?: { + message: string; + statusCode: number; + }; + id: string; + migrationVersion?: SavedObjectsMigrationVersion; + references: SavedObjectReference[]; + type: string; + updated_at?: string; + version?: string; +} + +// @public +export type SavedObjectAttribute = SavedObjectAttributeSingle | SavedObjectAttributeSingle[]; + +// @public +export interface SavedObjectAttributes { + // (undocumented) + [key: string]: SavedObjectAttribute; +} + +// @public +export type SavedObjectAttributeSingle = string | number | boolean | null | undefined | SavedObjectAttributes; + +// @public +export interface SavedObjectReference { + // (undocumented) + id: string; + // (undocumented) + name: string; + // (undocumented) + type: string; +} + +// @public (undocumented) +export interface SavedObjectsBaseOptions { + namespace?: string; +} + +// @public (undocumented) +export interface SavedObjectsBulkCreateObject { + // (undocumented) + attributes: T; + // (undocumented) + id?: string; + migrationVersion?: SavedObjectsMigrationVersion; + // (undocumented) + references?: SavedObjectReference[]; + // (undocumented) + type: string; +} + +// @public (undocumented) +export interface SavedObjectsBulkGetObject { + fields?: string[]; + // (undocumented) + id: string; + // (undocumented) + type: string; +} + +// @public (undocumented) +export interface SavedObjectsBulkResponse { + // (undocumented) + saved_objects: Array>; +} + +// @public (undocumented) +export interface SavedObjectsBulkResponse { + // (undocumented) + saved_objects: Array>; +} + +// @public (undocumented) +export interface SavedObjectsBulkUpdateObject extends Pick { + attributes: Partial; + id: string; + type: string; +} + +// @public (undocumented) +export interface SavedObjectsBulkUpdateOptions extends SavedObjectsBaseOptions { + refresh?: MutatingOperationRefreshSetting; +} + +// @public (undocumented) +export interface SavedObjectsBulkUpdateResponse { + // (undocumented) + saved_objects: Array>; +} + +// @public (undocumented) +export class SavedObjectsClient { + // @internal + constructor(repository: ISavedObjectsRepository); + bulkCreate(objects: Array>, options?: SavedObjectsCreateOptions): Promise>; + bulkGet(objects?: SavedObjectsBulkGetObject[], options?: SavedObjectsBaseOptions): Promise>; + bulkUpdate(objects: Array>, options?: SavedObjectsBulkUpdateOptions): Promise>; + create(type: string, attributes: T, options?: SavedObjectsCreateOptions): Promise>; + delete(type: string, id: string, options?: SavedObjectsDeleteOptions): Promise<{}>; + // (undocumented) + errors: typeof SavedObjectsErrorHelpers; + // (undocumented) + static errors: typeof SavedObjectsErrorHelpers; + find(options: SavedObjectsFindOptions): Promise>; + get(type: string, id: string, options?: SavedObjectsBaseOptions): Promise>; + update(type: string, id: string, attributes: Partial, options?: SavedObjectsUpdateOptions): Promise>; +} + +// @public +export type SavedObjectsClientContract = Pick; + +// @public +export type SavedObjectsClientFactory = ({ request, }: { + request: Request; +}) => SavedObjectsClientContract; + +// @public +export interface SavedObjectsClientProviderOptions { + // (undocumented) + excludedWrappers?: string[]; +} + +// @public +export type SavedObjectsClientWrapperFactory = (options: SavedObjectsClientWrapperOptions) => SavedObjectsClientContract; + +// @public +export interface SavedObjectsClientWrapperOptions { + // (undocumented) + client: SavedObjectsClientContract; + // (undocumented) + request: Request; +} + +// @public (undocumented) +export interface SavedObjectsCreateOptions extends SavedObjectsBaseOptions { + id?: string; + migrationVersion?: SavedObjectsMigrationVersion; + overwrite?: boolean; + // (undocumented) + references?: SavedObjectReference[]; + refresh?: MutatingOperationRefreshSetting; +} + +// @public (undocumented) +export interface SavedObjectsDeleteByNamespaceOptions extends SavedObjectsBaseOptions { + refresh?: MutatingOperationRefreshSetting; +} + +// @public (undocumented) +export interface SavedObjectsDeleteOptions extends SavedObjectsBaseOptions { + refresh?: MutatingOperationRefreshSetting; +} + +// @public (undocumented) +export class SavedObjectsErrorHelpers { + // (undocumented) + static createBadRequestError(reason?: string): DecoratedError; + // (undocumented) + static createEsAutoCreateIndexError(): DecoratedError; + // (undocumented) + static createGenericNotFoundError(type?: string | null, id?: string | null): DecoratedError; + // (undocumented) + static createInvalidVersionError(versionInput?: string): DecoratedError; + // (undocumented) + static createUnsupportedTypeError(type: string): DecoratedError; + // (undocumented) + static decorateBadRequestError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static decorateConflictError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static decorateEsUnavailableError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static decorateForbiddenError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static decorateGeneralError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static decorateNotAuthorizedError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static decorateRequestEntityTooLargeError(error: Error, reason?: string): DecoratedError; + // (undocumented) + static isBadRequestError(error: Error | DecoratedError): boolean; + // (undocumented) + static isConflictError(error: Error | DecoratedError): boolean; + // (undocumented) + static isEsAutoCreateIndexError(error: Error | DecoratedError): boolean; + // (undocumented) + static isEsUnavailableError(error: Error | DecoratedError): boolean; + // (undocumented) + static isForbiddenError(error: Error | DecoratedError): boolean; + // (undocumented) + static isInvalidVersionError(error: Error | DecoratedError): boolean; + // (undocumented) + static isNotAuthorizedError(error: Error | DecoratedError): boolean; + // (undocumented) + static isNotFoundError(error: Error | DecoratedError): boolean; + // (undocumented) + static isRequestEntityTooLargeError(error: Error | DecoratedError): boolean; + // Warning: (ae-forgotten-export) The symbol "DecoratedError" needs to be exported by the entry point index.d.ts + // + // (undocumented) + static isSavedObjectsClientError(error: any): error is DecoratedError; +} + +// @public +export interface SavedObjectsExportOptions { + excludeExportDetails?: boolean; + exportSizeLimit: number; + includeReferencesDeep?: boolean; + namespace?: string; + objects?: Array<{ + id: string; + type: string; + }>; + savedObjectsClient: SavedObjectsClientContract; + search?: string; + types?: string[]; +} + +// @public +export interface SavedObjectsExportResultDetails { + exportedCount: number; + missingRefCount: number; + missingReferences: Array<{ + id: string; + type: string; + }>; +} + +// @public (undocumented) +export interface SavedObjectsFindOptions extends SavedObjectsBaseOptions { + // (undocumented) + defaultSearchOperator?: 'AND' | 'OR'; + fields?: string[]; + // (undocumented) + filter?: string; + // (undocumented) + hasReference?: { + type: string; + id: string; + }; + // (undocumented) + page?: number; + // (undocumented) + perPage?: number; + search?: string; + searchFields?: string[]; + // (undocumented) + sortField?: string; + // (undocumented) + sortOrder?: string; + // (undocumented) + type: string | string[]; +} + +// @public +export interface SavedObjectsFindResponse { + // (undocumented) + page: number; + // (undocumented) + per_page: number; + // (undocumented) + saved_objects: Array>; + // (undocumented) + total: number; +} + +// @public +export interface SavedObjectsImportConflictError { + // (undocumented) + type: 'conflict'; +} + +// @public +export interface SavedObjectsImportError { + // (undocumented) + error: SavedObjectsImportConflictError | SavedObjectsImportUnsupportedTypeError | SavedObjectsImportMissingReferencesError | SavedObjectsImportUnknownError; + // (undocumented) + id: string; + // (undocumented) + title?: string; + // (undocumented) + type: string; +} + +// @public +export interface SavedObjectsImportMissingReferencesError { + // (undocumented) + blocking: Array<{ + type: string; + id: string; + }>; + // (undocumented) + references: Array<{ + type: string; + id: string; + }>; + // (undocumented) + type: 'missing_references'; +} + +// @public +export interface SavedObjectsImportOptions { + // (undocumented) + namespace?: string; + // (undocumented) + objectLimit: number; + // (undocumented) + overwrite: boolean; + // (undocumented) + readStream: Readable; + // (undocumented) + savedObjectsClient: SavedObjectsClientContract; + // (undocumented) + supportedTypes: string[]; +} + +// @public +export interface SavedObjectsImportResponse { + // (undocumented) + errors?: SavedObjectsImportError[]; + // (undocumented) + success: boolean; + // (undocumented) + successCount: number; +} + +// @public +export interface SavedObjectsImportRetry { + // (undocumented) + id: string; + // (undocumented) + overwrite: boolean; + // (undocumented) + replaceReferences: Array<{ + type: string; + from: string; + to: string; + }>; + // (undocumented) + type: string; +} + +// @public +export interface SavedObjectsImportUnknownError { + // (undocumented) + message: string; + // (undocumented) + statusCode: number; + // (undocumented) + type: 'unknown'; +} + +// @public +export interface SavedObjectsImportUnsupportedTypeError { + // (undocumented) + type: 'unsupported_type'; +} + +// @public (undocumented) +export interface SavedObjectsIncrementCounterOptions extends SavedObjectsBaseOptions { + // (undocumented) + migrationVersion?: SavedObjectsMigrationVersion; + refresh?: MutatingOperationRefreshSetting; +} + +// @internal @deprecated (undocumented) +export interface SavedObjectsLegacyService { + // Warning: (ae-forgotten-export) The symbol "SavedObjectsClientProvider" needs to be exported by the entry point index.d.ts + // + // (undocumented) + addScopedSavedObjectsClientWrapperFactory: SavedObjectsClientProvider['addClientWrapperFactory']; + // (undocumented) + getSavedObjectsRepository(...rest: any[]): any; + // (undocumented) + getScopedSavedObjectsClient: SavedObjectsClientProvider['getClient']; + // (undocumented) + importExport: { + objectLimit: number; + importSavedObjects(options: SavedObjectsImportOptions): Promise; + resolveImportErrors(options: SavedObjectsResolveImportErrorsOptions): Promise; + getSortedObjectsForExport(options: SavedObjectsExportOptions): Promise; + }; + // (undocumented) + SavedObjectsClient: typeof SavedObjectsClient; + // (undocumented) + schema: SavedObjectsSchema; + // (undocumented) + setScopedSavedObjectsClientFactory: SavedObjectsClientProvider['setClientFactory']; + // (undocumented) + types: string[]; +} + +// @public (undocumented) +export interface SavedObjectsMigrationLogger { + // (undocumented) + debug: (msg: string) => void; + // (undocumented) + info: (msg: string) => void; + // (undocumented) + warning: (msg: string) => void; +} + +// @public +export interface SavedObjectsMigrationVersion { + // (undocumented) + [pluginName: string]: string; +} + +// Warning: (ae-missing-release-tag) "RawDoc" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export interface SavedObjectsRawDoc { + // (undocumented) + _id: string; + // (undocumented) + _primary_term?: number; + // (undocumented) + _seq_no?: number; + // (undocumented) + _source: any; + // (undocumented) + _type?: string; +} + +// @public (undocumented) +export class SavedObjectsRepository { + // Warning: (ae-forgotten-export) The symbol "SavedObjectsRepositoryOptions" needs to be exported by the entry point index.d.ts + // + // @internal + constructor(options: SavedObjectsRepositoryOptions); + bulkCreate(objects: Array>, options?: SavedObjectsCreateOptions): Promise>; + bulkGet(objects?: SavedObjectsBulkGetObject[], options?: SavedObjectsBaseOptions): Promise>; + bulkUpdate(objects: Array>, options?: SavedObjectsBulkUpdateOptions): Promise>; + create(type: string, attributes: T, options?: SavedObjectsCreateOptions): Promise>; + delete(type: string, id: string, options?: SavedObjectsDeleteOptions): Promise<{}>; + deleteByNamespace(namespace: string, options?: SavedObjectsDeleteByNamespaceOptions): Promise; + // (undocumented) + find({ search, defaultSearchOperator, searchFields, hasReference, page, perPage, sortField, sortOrder, fields, namespace, type, filter, }: SavedObjectsFindOptions): Promise>; + get(type: string, id: string, options?: SavedObjectsBaseOptions): Promise>; + incrementCounter(type: string, id: string, counterFieldName: string, options?: SavedObjectsIncrementCounterOptions): Promise<{ + id: string; + type: string; + updated_at: string; + references: any; + version: string; + attributes: any; + }>; + update(type: string, id: string, attributes: Partial, options?: SavedObjectsUpdateOptions): Promise>; + } + +// @public +export interface SavedObjectsResolveImportErrorsOptions { + // (undocumented) + namespace?: string; + // (undocumented) + objectLimit: number; + // (undocumented) + readStream: Readable; + // (undocumented) + retries: SavedObjectsImportRetry[]; + // (undocumented) + savedObjectsClient: SavedObjectsClientContract; + // (undocumented) + supportedTypes: string[]; +} + +// @internal (undocumented) +export class SavedObjectsSchema { + // Warning: (ae-forgotten-export) The symbol "SavedObjectsSchemaDefinition" needs to be exported by the entry point index.d.ts + constructor(schemaDefinition?: SavedObjectsSchemaDefinition); + // (undocumented) + getConvertToAliasScript(type: string): string | undefined; + // (undocumented) + getIndexForType(config: Config, type: string): string | undefined; + // (undocumented) + isHiddenType(type: string): boolean; + // (undocumented) + isNamespaceAgnostic(type: string): boolean; +} + +// @internal (undocumented) +export class SavedObjectsSerializer { + constructor(schema: SavedObjectsSchema); + generateRawId(namespace: string | undefined, type: string, id?: string): string; + isRawSavedObject(rawDoc: SavedObjectsRawDoc): any; + // Warning: (ae-forgotten-export) The symbol "SanitizedSavedObjectDoc" needs to be exported by the entry point index.d.ts + rawToSavedObject(doc: SavedObjectsRawDoc): SanitizedSavedObjectDoc; + savedObjectToRaw(savedObj: SanitizedSavedObjectDoc): SavedObjectsRawDoc; + } + +// @public +export interface SavedObjectsServiceSetup { + addClientWrapper: (priority: number, id: string, factory: SavedObjectsClientWrapperFactory) => void; + createInternalRepository: (extraTypes?: string[]) => ISavedObjectsRepository; + createScopedRepository: (req: KibanaRequest, extraTypes?: string[]) => ISavedObjectsRepository; + setClientFactory: (customClientFactory: SavedObjectsClientFactory) => void; +} + +// @public +export interface SavedObjectsServiceStart { + getScopedClient: (req: KibanaRequest, options?: SavedObjectsClientProviderOptions) => SavedObjectsClientContract; +} + +// @public (undocumented) +export interface SavedObjectsUpdateOptions extends SavedObjectsBaseOptions { + references?: SavedObjectReference[]; + refresh?: MutatingOperationRefreshSetting; + version?: string; +} + +// @public (undocumented) +export interface SavedObjectsUpdateResponse extends Omit, 'attributes' | 'references'> { + // (undocumented) + attributes: Partial; + // (undocumented) + references: SavedObjectReference[] | undefined; +} + +// @public +export class ScopedClusterClient implements IScopedClusterClient { + constructor(internalAPICaller: APICaller, scopedAPICaller: APICaller, headers?: Headers | undefined); + callAsCurrentUser(endpoint: string, clientParams?: Record, options?: CallAPIOptions): Promise; + callAsInternalUser(endpoint: string, clientParams?: Record, options?: CallAPIOptions): Promise; + } + +// @public +export interface SessionCookieValidationResult { + isValid: boolean; + path?: string; +} + +// @public +export interface SessionStorage { + clear(): void; + get(): Promise; + set(sessionValue: T): void; +} + +// @public +export interface SessionStorageCookieOptions { + encryptionKey: string; + isSecure: boolean; + name: string; + validate: (sessionValue: T | T[]) => SessionCookieValidationResult; +} + +// @public +export interface SessionStorageFactory { + // (undocumented) + asScoped: (request: KibanaRequest) => SessionStorage; +} + +// @public +export interface UiSettingsParams { + category?: string[]; + description?: string; + name?: string; + optionLabels?: Record; + options?: string[]; + readonly?: boolean; + requiresPageReload?: boolean; + type?: UiSettingsType; + value?: SavedObjectAttribute; +} + +// @public (undocumented) +export interface UiSettingsServiceSetup { + register(settings: Record): void; +} + +// @public +export type UiSettingsType = 'json' | 'markdown' | 'number' | 'select' | 'boolean' | 'string'; + +// @public +export interface UserProvidedValues { + // (undocumented) + isOverridden?: boolean; + // (undocumented) + userValue?: T; +} + +// @public +export const validBodyOutput: readonly ["data", "stream"]; + + +// Warnings were encountered during analysis: +// +// src/core/server/http/router/response.ts:316:3 - (ae-forgotten-export) The symbol "KibanaResponse" needs to be exported by the entry point index.d.ts +// src/core/server/plugins/plugins_service.ts:43:5 - (ae-forgotten-export) The symbol "InternalPluginInfo" needs to be exported by the entry point index.d.ts + +``` diff --git a/src/core/server/server.ts b/src/core/server/server.ts index b36468b85d7a15..555714ee570434 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -40,11 +40,13 @@ import { mapToObject } from '../utils/'; import { ContextService } from './context'; import { RequestHandlerContext } from '.'; import { InternalCoreSetup } from './internal_types'; +import { CapabilitiesService } from './capabilities'; const coreId = Symbol('core'); export class Server { public readonly configService: ConfigService; + private readonly capabilities: CapabilitiesService; private readonly context: ContextService; private readonly elasticsearch: ElasticsearchService; private readonly http: HttpService; @@ -70,6 +72,7 @@ export class Server { this.elasticsearch = new ElasticsearchService(core); this.savedObjects = new SavedObjectsService(core); this.uiSettings = new UiSettingsService(core); + this.capabilities = new CapabilitiesService(core); } public async setup() { @@ -95,6 +98,8 @@ export class Server { this.registerDefaultRoute(httpSetup); + const capabilitiesSetup = this.capabilities.setup({ http: httpSetup }); + const elasticsearchServiceSetup = await this.elasticsearch.setup({ http: httpSetup, }); @@ -109,6 +114,7 @@ export class Server { }); const coreSetup: InternalCoreSetup = { + capabilities: capabilitiesSetup, context: contextServiceSetup, elasticsearch: elasticsearchServiceSetup, http: httpSetup, @@ -131,10 +137,14 @@ export class Server { public async start() { this.log.debug('starting server'); const savedObjectsStart = await this.savedObjects.start({}); - - const pluginsStart = await this.plugins.start({ savedObjects: savedObjectsStart }); + const capabilitiesStart = this.capabilities.start(); + const pluginsStart = await this.plugins.start({ + capabilities: capabilitiesStart, + savedObjects: savedObjectsStart, + }); const coreStart = { + capabilities: capabilitiesStart, savedObjects: savedObjectsStart, plugins: pluginsStart, }; diff --git a/src/legacy/server/capabilities/capabilities_mixin.test.mocks.ts b/src/core/server/test_utils.ts similarity index 82% rename from src/legacy/server/capabilities/capabilities_mixin.test.mocks.ts rename to src/core/server/test_utils.ts index 64300604b3e9d2..470b1c2d135b70 100644 --- a/src/legacy/server/capabilities/capabilities_mixin.test.mocks.ts +++ b/src/core/server/test_utils.ts @@ -17,7 +17,4 @@ * under the License. */ -export const mockRegisterCapabilitiesRoute = jest.fn(); -jest.mock('./capabilities_route', () => ({ - registerCapabilitiesRoute: mockRegisterCapabilitiesRoute, -})); +export { createHttpServer } from './http/test_utils'; diff --git a/src/core/types/capabilities.ts b/src/core/types/capabilities.ts new file mode 100644 index 00000000000000..c2ca09528f085e --- /dev/null +++ b/src/core/types/capabilities.ts @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * The read-only set of capabilities available for the current UI session. + * Capabilities are simple key-value pairs of (string, boolean), where the string denotes the capability ID, + * and the boolean is a flag indicating if the capability is enabled or disabled. + * + * @public + */ +export interface Capabilities { + /** Navigation link capabilities. */ + navLinks: Record; + + /** Management section capabilities. */ + management: { + [sectionId: string]: Record; + }; + + /** Catalogue capabilities. Catalogue entries drive the visibility of the Kibana homepage options. */ + catalogue: Record; + + /** Custom capabilities, registered by plugins. */ + [key: string]: Record>; +} diff --git a/src/core/types/index.ts b/src/core/types/index.ts index 3aae17e6ea5945..d01b514c770a77 100644 --- a/src/core/types/index.ts +++ b/src/core/types/index.ts @@ -22,3 +22,4 @@ * types are stripped. */ export * from './core_service'; +export * from './capabilities'; diff --git a/src/legacy/core_plugins/tests_bundle/tests_entry_template.js b/src/legacy/core_plugins/tests_bundle/tests_entry_template.js index 17632a2c0a405c..347968ecb80c54 100644 --- a/src/legacy/core_plugins/tests_bundle/tests_entry_template.js +++ b/src/legacy/core_plugins/tests_bundle/tests_entry_template.js @@ -70,9 +70,9 @@ const uiCapabilities = { // Mock fetch for CoreSystem calls. fetchMock.config.fallbackToNetwork = true; -fetchMock.post(/\\/api\\/capabilities/, { +fetchMock.post(/\\/api\\/core\\/capabilities/, { status: 200, - body: JSON.stringify({ capabilities: uiCapabilities }), + body: JSON.stringify(uiCapabilities), headers: { 'Content-Type': 'application/json' }, }); diff --git a/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts b/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts index 6e087e3ee7f870..228ef96f8c9f31 100644 --- a/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts +++ b/src/legacy/plugin_discovery/plugin_spec/plugin_spec_options.d.ts @@ -17,7 +17,7 @@ * under the License. */ import { Server } from '../../server/kbn_server'; -import { Capabilities } from '../../../core/public'; +import { Capabilities } from '../../../core/server'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SavedObjectsManagementDefinition } from '../../../core/server/saved_objects/management'; diff --git a/src/legacy/plugin_discovery/types.ts b/src/legacy/plugin_discovery/types.ts index d987260b099bd1..c32418e1aeb62e 100644 --- a/src/legacy/plugin_discovery/types.ts +++ b/src/legacy/plugin_discovery/types.ts @@ -18,7 +18,7 @@ */ import { Server } from '../server/kbn_server'; -import { Capabilities } from '../../core/public'; +import { Capabilities } from '../../core/server'; // Disable lint errors for imports from src/core/* until SavedObjects migration is complete // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SavedObjectsSchemaDefinition } from '../../core/server/saved_objects/schema'; diff --git a/src/legacy/server/capabilities/capabilities_mixin.test.ts b/src/legacy/server/capabilities/capabilities_mixin.test.ts index 9b6827e1bb380b..3422d6a8cbb346 100644 --- a/src/legacy/server/capabilities/capabilities_mixin.test.ts +++ b/src/legacy/server/capabilities/capabilities_mixin.test.ts @@ -19,81 +19,47 @@ import { Server } from 'hapi'; import KbnServer from '../kbn_server'; -import { mockRegisterCapabilitiesRoute } from './capabilities_mixin.test.mocks'; import { capabilitiesMixin } from './capabilities_mixin'; describe('capabilitiesMixin', () => { + let registerMock: jest.Mock; + const getKbnServer = (pluginSpecs: any[] = []) => { - return { + return ({ afterPluginsInit: (callback: () => void) => callback(), pluginSpecs, - } as KbnServer; + newPlatform: { + setup: { + core: { + capabilities: { + registerProvider: registerMock, + }, + }, + }, + }, + } as unknown) as KbnServer; }; let server: Server; beforeEach(() => { server = new Server(); + server.getUiNavLinks = () => []; + registerMock = jest.fn(); }); - afterEach(() => { - mockRegisterCapabilitiesRoute.mockClear(); - }); - - it('calls registerCapabilitiesRoute with merged uiCapabilitiesProviers', async () => { - const kbnServer = getKbnServer([ - { - getUiCapabilitiesProvider: () => () => ({ - app1: { read: true }, - management: { section1: { feature1: true } }, - }), - }, - { - getUiCapabilitiesProvider: () => () => ({ - app2: { write: true }, - catalogue: { feature3: true }, - management: { section2: { feature2: true } }, - }), - }, - ]); - - await capabilitiesMixin(kbnServer, server); - - expect(mockRegisterCapabilitiesRoute).toHaveBeenCalledWith( - server, - { - app1: { read: true }, - app2: { write: true }, - catalogue: { feature3: true }, - management: { - section1: { feature1: true }, - section2: { feature2: true }, - }, - navLinks: {}, - }, - [] - ); - }); + it('calls capabilities#registerCapabilitiesProvider for each legacy plugin specs', async () => { + const getPluginSpec = (provider: () => any) => ({ + getUiCapabilitiesProvider: () => provider, + }); - it('exposes server#registerCapabilitiesModifier for providing modifiers to the route', async () => { - const kbnServer = getKbnServer(); + const capaA = { catalogue: { A: true } }; + const capaB = { catalogue: { B: true } }; + const kbnServer = getKbnServer([getPluginSpec(() => capaA), getPluginSpec(() => capaB)]); await capabilitiesMixin(kbnServer, server); - const mockModifier1 = jest.fn(); - const mockModifier2 = jest.fn(); - server.registerCapabilitiesModifier(mockModifier1); - server.registerCapabilitiesModifier(mockModifier2); - - expect(mockRegisterCapabilitiesRoute.mock.calls[0][2]).toEqual([mockModifier1, mockModifier2]); - }); - it('exposes request#getCapabilities for retrieving legacy capabilities', async () => { - const kbnServer = getKbnServer(); - jest.spyOn(server, 'decorate'); - await capabilitiesMixin(kbnServer, server); - expect(server.decorate).toHaveBeenCalledWith( - 'request', - 'getCapabilities', - expect.any(Function) - ); + expect(registerMock).toHaveBeenCalledTimes(2); + expect(registerMock.mock.calls[0][0]()).toEqual(capaA); + expect(registerMock.mock.calls[1][0]()).toEqual(capaB); }); }); diff --git a/src/legacy/server/capabilities/capabilities_mixin.ts b/src/legacy/server/capabilities/capabilities_mixin.ts index b41dfe42c40b24..23a0c35414ae65 100644 --- a/src/legacy/server/capabilities/capabilities_mixin.ts +++ b/src/legacy/server/capabilities/capabilities_mixin.ts @@ -17,51 +17,26 @@ * under the License. */ -import { Server, Request } from 'hapi'; - -import { Capabilities } from '../../../core/public'; +import { Server } from 'hapi'; import KbnServer from '../kbn_server'; -import { registerCapabilitiesRoute } from './capabilities_route'; -import { mergeCapabilities } from './merge_capabilities'; -import { resolveCapabilities } from './resolve_capabilities'; - -export type CapabilitiesModifier = ( - request: Request, - uiCapabilities: Capabilities -) => Capabilities | Promise; export async function capabilitiesMixin(kbnServer: KbnServer, server: Server) { - const modifiers: CapabilitiesModifier[] = []; + const registerLegacyCapabilities = async () => { + const capabilitiesList = await Promise.all( + kbnServer.pluginSpecs + .map(spec => spec.getUiCapabilitiesProvider()) + .filter(provider => !!provider) + .map(provider => provider(server)) + ); - server.decorate('server', 'registerCapabilitiesModifier', (provider: CapabilitiesModifier) => { - modifiers.push(provider); - }); + capabilitiesList.forEach(capabilities => { + kbnServer.newPlatform.setup.core.capabilities.registerProvider(() => capabilities); + }); + }; // Some plugin capabilities are derived from data provided by other plugins, // so we need to wait until after all plugins have been init'd to fetch uiCapabilities. kbnServer.afterPluginsInit(async () => { - const defaultCapabilities = mergeCapabilities( - ...(await Promise.all( - kbnServer.pluginSpecs - .map(spec => spec.getUiCapabilitiesProvider()) - .filter(provider => !!provider) - .map(provider => provider(server)) - )) - ); - - server.decorate('request', 'getCapabilities', function() { - // Get legacy nav links - const navLinks = server.getUiNavLinks().reduce( - (acc, spec) => ({ - ...acc, - [spec._id]: true, - }), - {} as Record - ); - - return resolveCapabilities(this, modifiers, defaultCapabilities, { navLinks }); - }); - - registerCapabilitiesRoute(server, defaultCapabilities, modifiers); + await registerLegacyCapabilities(); }); } diff --git a/src/legacy/server/capabilities/capabilities_route.test.ts b/src/legacy/server/capabilities/capabilities_route.test.ts deleted file mode 100644 index 6f3f706379642d..00000000000000 --- a/src/legacy/server/capabilities/capabilities_route.test.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Server } from 'hapi'; -import { registerCapabilitiesRoute } from './capabilities_route'; -import { Capabilities } from '../../../core/public'; - -describe('capabilities api', () => { - const defaultCapabilities = { - catalogue: { - feature1: true, - feature2: true, - }, - management: { - section1: { - read: true, - }, - section2: { - write: true, - }, - }, - navLinks: { - app1: true, - app2: true, - }, - myApp: { - read: true, - write: true, - kioskMode: true, - }, - } as Capabilities; - - let server: Server; - - beforeEach(() => { - server = new Server(); - }); - - it('returns unmodified uiCapabilities if no modifiers are available', async () => { - registerCapabilitiesRoute(server, defaultCapabilities, []); - const resp = await server.inject({ - method: 'POST', - url: '/api/capabilities', - payload: { capabilities: {} }, - }); - expect(JSON.parse(resp.payload)).toEqual({ - capabilities: defaultCapabilities, - }); - }); - - it('merges payload capabilities with defaultCapabilities', async () => { - registerCapabilitiesRoute(server, defaultCapabilities, []); - const resp = await server.inject({ - method: 'POST', - url: '/api/capabilities', - payload: { capabilities: { navLinks: { app3: true } } }, - }); - expect(JSON.parse(resp.payload)).toEqual({ - capabilities: { - ...defaultCapabilities, - navLinks: { - ...defaultCapabilities.navLinks, - app3: true, - }, - }, - }); - }); - - it('allows a single provider to modify uiCapabilities', async () => { - registerCapabilitiesRoute(server, defaultCapabilities, [ - (req, caps) => { - caps.management.section2.write = false; - caps.myApp.write = false; - return caps; - }, - ]); - const resp = await server.inject({ - method: 'POST', - url: '/api/capabilities', - payload: { capabilities: {} }, - }); - const results = JSON.parse(resp.payload); - expect(results.capabilities.management.section2.write).toBe(false); - expect(results.capabilities.myApp.write).toBe(false); - }); - - it('allows multiple providers to modify uiCapabilities', async () => { - registerCapabilitiesRoute(server, defaultCapabilities, [ - (req, caps) => { - caps.management.section2.write = false; - return caps; - }, - (req, caps) => { - caps.myApp.write = false; - return caps; - }, - ]); - const resp = await server.inject({ - method: 'POST', - url: '/api/capabilities', - payload: { capabilities: {} }, - }); - const results = JSON.parse(resp.payload); - expect(results.capabilities.management.section2.write).toBe(false); - expect(results.capabilities.myApp.write).toBe(false); - }); - - it('returns an error if any providers fail', async () => { - registerCapabilitiesRoute(server, defaultCapabilities, [ - (req, caps) => { - throw new Error(`Couldn't fetch license`); - }, - ]); - const resp = await server.inject({ - method: 'POST', - url: '/api/capabilities', - payload: { capabilities: {} }, - }); - expect(resp.statusCode).toBe(500); - }); -}); diff --git a/src/legacy/server/capabilities/capabilities_route.ts b/src/legacy/server/capabilities/capabilities_route.ts deleted file mode 100644 index 5564fbb295a62e..00000000000000 --- a/src/legacy/server/capabilities/capabilities_route.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import Joi from 'joi'; -import { Server } from 'hapi'; - -import { Capabilities } from '../../../core/public'; -import { CapabilitiesModifier } from './capabilities_mixin'; -import { resolveCapabilities } from './resolve_capabilities'; - -export const registerCapabilitiesRoute = ( - server: Server, - defaultCapabilities: Capabilities, - modifiers: CapabilitiesModifier[] -) => { - server.route({ - path: '/api/capabilities', - method: 'POST', - options: { - validate: { - payload: Joi.object({ - capabilities: Joi.object().required(), - }).required(), - }, - }, - async handler(request) { - const { capabilities } = request.payload as { capabilities: Capabilities }; - return { - capabilities: await resolveCapabilities( - request, - modifiers, - defaultCapabilities, - capabilities - ), - }; - }, - }); -}; diff --git a/src/legacy/server/capabilities/index.ts b/src/legacy/server/capabilities/index.ts index 09461a40c008a3..8c5dea1226f2b6 100644 --- a/src/legacy/server/capabilities/index.ts +++ b/src/legacy/server/capabilities/index.ts @@ -17,4 +17,4 @@ * under the License. */ -export { CapabilitiesModifier, capabilitiesMixin } from './capabilities_mixin'; +export { capabilitiesMixin } from './capabilities_mixin'; diff --git a/src/legacy/server/capabilities/merge_capabilities.test.ts b/src/legacy/server/capabilities/merge_capabilities.test.ts deleted file mode 100644 index a73b81bdaf0a32..00000000000000 --- a/src/legacy/server/capabilities/merge_capabilities.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { mergeCapabilities } from './merge_capabilities'; - -const defaultProps = { - catalogue: {}, - management: {}, - navLinks: {}, -}; - -test(`"{ foo: {} }" doesn't clobber "{ foo: { bar: true } }"`, () => { - const output1 = mergeCapabilities({ foo: { bar: true } }, { foo: {} }); - expect(output1).toEqual({ ...defaultProps, foo: { bar: true } }); - - const output2 = mergeCapabilities({ foo: { bar: true } }, { foo: {} }); - expect(output2).toEqual({ ...defaultProps, foo: { bar: true } }); -}); - -test(`"{ foo: { bar: true } }" doesn't clobber "{ baz: { quz: true } }"`, () => { - const output1 = mergeCapabilities({ foo: { bar: true } }, { baz: { quz: true } }); - expect(output1).toEqual({ ...defaultProps, foo: { bar: true }, baz: { quz: true } }); - - const output2 = mergeCapabilities({ baz: { quz: true } }, { foo: { bar: true } }); - expect(output2).toEqual({ ...defaultProps, foo: { bar: true }, baz: { quz: true } }); -}); - -test(`"{ foo: { bar: { baz: true } } }" doesn't clobber "{ foo: { bar: { quz: true } } }"`, () => { - const output1 = mergeCapabilities( - { foo: { bar: { baz: true } } }, - { foo: { bar: { quz: true } } } - ); - expect(output1).toEqual({ ...defaultProps, foo: { bar: { baz: true, quz: true } } }); - - const output2 = mergeCapabilities( - { foo: { bar: { quz: true } } }, - { foo: { bar: { baz: true } } } - ); - expect(output2).toEqual({ ...defaultProps, foo: { bar: { baz: true, quz: true } } }); -}); - -test(`error is thrown if boolean and object clash`, () => { - expect(() => { - mergeCapabilities({ foo: { bar: { baz: true } } }, { foo: { bar: true } }); - }).toThrowErrorMatchingInlineSnapshot(`"a boolean and an object can't be merged"`); - - expect(() => { - mergeCapabilities({ foo: { bar: true } }, { foo: { bar: { baz: true } } }); - }).toThrowErrorMatchingInlineSnapshot(`"a boolean and an object can't be merged"`); -}); - -test(`supports duplicates as long as the booleans are the same`, () => { - const output1 = mergeCapabilities({ foo: { bar: true } }, { foo: { bar: true } }); - expect(output1).toEqual({ ...defaultProps, foo: { bar: true } }); - - const output2 = mergeCapabilities({ foo: { bar: false } }, { foo: { bar: false } }); - expect(output2).toEqual({ ...defaultProps, foo: { bar: false } }); -}); - -test(`error is thrown if merging "true" and "false"`, () => { - expect(() => { - mergeCapabilities({ foo: { bar: false } }, { foo: { bar: true } }); - }).toThrowErrorMatchingInlineSnapshot(`"\\"true\\" and \\"false\\" can't be merged"`); - - expect(() => { - mergeCapabilities({ foo: { bar: true } }, { foo: { bar: false } }); - }).toThrowErrorMatchingInlineSnapshot(`"\\"true\\" and \\"false\\" can't be merged"`); -}); diff --git a/src/legacy/server/kbn_server.d.ts b/src/legacy/server/kbn_server.d.ts index 6f2730476956ee..1eb9c6d87e6895 100644 --- a/src/legacy/server/kbn_server.d.ts +++ b/src/legacy/server/kbn_server.d.ts @@ -20,7 +20,7 @@ import { ResponseObject, Server } from 'hapi'; import { UnwrapPromise } from '@kbn/utility-types'; -import { SavedObjectsClientProviderOptions, CoreSetup } from 'src/core/server'; +import { SavedObjectsClientProviderOptions, CoreSetup, CoreStart } from 'src/core/server'; import { ConfigService, ElasticsearchServiceSetup, @@ -39,9 +39,8 @@ import { SavedObjectsManagement } from '../../core/server/saved_objects/manageme import { ApmOssPlugin } from '../core_plugins/apm_oss'; import { CallClusterWithRequest, ElasticsearchPlugin } from '../core_plugins/elasticsearch'; import { UsageCollectionSetup } from '../../plugins/usage_collection/server'; -import { CapabilitiesModifier } from './capabilities'; import { IndexPatternsServiceFactory } from './index_patterns'; -import { Capabilities } from '../../core/public'; +import { Capabilities } from '../../core/server'; import { UiSettingsServiceFactoryOptions } from '../../legacy/ui/ui_settings/ui_settings_service_factory'; export interface KibanaConfig { @@ -69,7 +68,6 @@ declare module 'hapi' { savedObjects: SavedObjectsLegacyService; injectUiAppVars: (pluginName: string, getAppVars: () => { [key: string]: any }) => void; getHiddenUiAppById(appId: string): UiApp; - registerCapabilitiesModifier: (provider: CapabilitiesModifier) => void; addScopedTutorialContextFactory: ( scopedTutorialContextFactory: (...args: any[]) => any ) => void; @@ -90,7 +88,6 @@ declare module 'hapi' { getBasePath(): string; getDefaultRoute(): Promise; getUiSettingsService(): IUiSettingsClient; - getCapabilities(): Promise; } interface ResponseToolkit { @@ -127,7 +124,7 @@ export default class KbnServer { plugins: PluginsSetup; }; start: { - core: CoreSetup; + core: CoreStart; plugins: Record; }; stop: null; diff --git a/src/legacy/ui/ui_render/ui_render_mixin.js b/src/legacy/ui/ui_render/ui_render_mixin.js index 763167c6b5ccf4..931f8b184421cf 100644 --- a/src/legacy/ui/ui_render/ui_render_mixin.js +++ b/src/legacy/ui/ui_render/ui_render_mixin.js @@ -279,8 +279,6 @@ export function uiRenderMixin(kbnServer, server, config) { uiPlugins, legacyMetadata, - - capabilities: await request.getCapabilities(), }, }); diff --git a/x-pack/legacy/plugins/security/index.js b/x-pack/legacy/plugins/security/index.js index 60374d562f96c5..fc83dc64aafab5 100644 --- a/x-pack/legacy/plugins/security/index.js +++ b/x-pack/legacy/plugins/security/index.js @@ -130,7 +130,6 @@ export const security = (kibana) => new kibana.Plugin({ isSystemAPIRequest: server.plugins.kibana.systemApi.isSystemApiRequest.bind( server.plugins.kibana.systemApi ), - capabilities: { registerCapabilitiesModifier: server.registerCapabilitiesModifier }, cspRules: createCSPRuleString(config.get('csp.rules')), kibanaIndexName: config.get('kibana.index'), }); diff --git a/x-pack/legacy/plugins/spaces/index.ts b/x-pack/legacy/plugins/spaces/index.ts index 8f995d3c12c2aa..6ea06f47b90120 100644 --- a/x-pack/legacy/plugins/spaces/index.ts +++ b/x-pack/legacy/plugins/spaces/index.ts @@ -129,9 +129,6 @@ export const spaces = (kibana: Record) => tutorial: { addScopedTutorialContextFactory: server.addScopedTutorialContextFactory, }, - capabilities: { - registerCapabilitiesModifier: server.registerCapabilitiesModifier, - }, auditLogger: { create: (pluginId: string) => new AuditLogger(server, pluginId, server.config(), server.plugins.xpack_main.info), diff --git a/x-pack/plugins/features/server/feature_schema.ts b/x-pack/plugins/features/server/feature_schema.ts index 9ae55a61c910fb..b5ba10f8d0300b 100644 --- a/x-pack/plugins/features/server/feature_schema.ts +++ b/x-pack/plugins/features/server/feature_schema.ts @@ -7,7 +7,7 @@ import Joi from 'joi'; import { difference } from 'lodash'; -import { Capabilities as UICapabilities } from '../../../../src/core/public'; +import { Capabilities as UICapabilities } from '../../../../src/core/server'; import { FeatureWithAllOrReadPrivileges } from './feature'; // Each feature gets its own property on the UICapabilities object, diff --git a/x-pack/plugins/features/server/plugin.ts b/x-pack/plugins/features/server/plugin.ts index ce7fea129bb6f2..f3a3375d1936ba 100644 --- a/x-pack/plugins/features/server/plugin.ts +++ b/x-pack/plugins/features/server/plugin.ts @@ -10,7 +10,7 @@ import { PluginInitializerContext, RecursiveReadonly, } from '../../../../src/core/server'; -import { Capabilities as UICapabilities } from '../../../../src/core/public'; +import { Capabilities as UICapabilities } from '../../../../src/core/server'; import { deepFreeze } from '../../../../src/core/utils'; import { XPackInfo } from '../../../legacy/plugins/xpack_main/server/lib/xpack_info'; import { PluginSetupContract as TimelionSetupContract } from '../../../../src/plugins/timelion/server'; diff --git a/x-pack/plugins/features/server/ui_capabilities_for_features.ts b/x-pack/plugins/features/server/ui_capabilities_for_features.ts index 22c9379686b348..368b38ce7df918 100644 --- a/x-pack/plugins/features/server/ui_capabilities_for_features.ts +++ b/x-pack/plugins/features/server/ui_capabilities_for_features.ts @@ -5,7 +5,7 @@ */ import _ from 'lodash'; -import { Capabilities as UICapabilities } from '../../../../src/core/public'; +import { Capabilities as UICapabilities } from '../../../../src/core/server'; import { Feature } from './feature'; const ELIGIBLE_FLAT_MERGE_KEYS = ['catalogue']; diff --git a/x-pack/plugins/security/server/authorization/actions/ui.ts b/x-pack/plugins/security/server/authorization/actions/ui.ts index c243b4f0bbdc18..9e77c319a9b3ab 100644 --- a/x-pack/plugins/security/server/authorization/actions/ui.ts +++ b/x-pack/plugins/security/server/authorization/actions/ui.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { isString } from 'lodash'; -import { Capabilities as UICapabilities } from '../../../../../../src/core/public'; +import { Capabilities as UICapabilities } from '../../../../../../src/core/server'; import { uiCapabilitiesRegex } from '../../../../features/server'; export class UIActions { diff --git a/x-pack/plugins/security/server/plugin.ts b/x-pack/plugins/security/server/plugin.ts index e9566035173497..cb197ecaf7e10a 100644 --- a/x-pack/plugins/security/server/plugin.ts +++ b/x-pack/plugins/security/server/plugin.ts @@ -20,7 +20,6 @@ import { deepFreeze } from '../../../../src/core/utils'; import { SpacesPluginSetup } from '../../spaces/server'; import { PluginSetupContract as FeaturesSetupContract } from '../../features/server'; import { LicensingPluginSetup } from '../../licensing/server'; -import { CapabilitiesModifier } from '../../../../src/legacy/server/capabilities'; import { Authentication, setupAuthentication } from './authentication'; import { Authorization, setupAuthorization } from './authorization'; @@ -43,7 +42,6 @@ export type FeaturesService = Pick; */ export interface LegacyAPI { isSystemAPIRequest: (request: KibanaRequest) => boolean; - capabilities: { registerCapabilitiesModifier: (provider: CapabilitiesModifier) => void }; kibanaIndexName: string; cspRules: string; savedObjects: SavedObjectsLegacyService; @@ -156,6 +154,8 @@ export class Plugin { featuresService: features, }); + core.capabilities.registerSwitcher(authz.disableUnauthorizedCapabilities); + defineRoutes({ router: core.http.createRouter(), basePath: core.http.basePath, @@ -195,10 +195,6 @@ export class Plugin { authz, legacyAPI, }); - - legacyAPI.capabilities.registerCapabilitiesModifier((request, capabilities) => - authz.disableUnauthorizedCapabilities(KibanaRequest.from(request), capabilities) - ); }, registerPrivilegesWithCluster: async () => await authz.registerPrivilegesWithCluster(), diff --git a/x-pack/plugins/spaces/server/plugin.ts b/x-pack/plugins/spaces/server/plugin.ts index 9d45dbb1b748d2..732731ac35ecd8 100644 --- a/x-pack/plugins/spaces/server/plugin.ts +++ b/x-pack/plugins/spaces/server/plugin.ts @@ -6,13 +6,11 @@ import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; -import { CapabilitiesModifier } from 'src/legacy/server/capabilities'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { HomeServerPluginSetup } from 'src/plugins/home/server'; import { SavedObjectsLegacyService, CoreSetup, - KibanaRequest, Logger, PluginInitializerContext, } from '../../../../src/core/server'; @@ -42,9 +40,6 @@ export interface LegacyAPI { tutorial: { addScopedTutorialContextFactory: (factory: any) => void; }; - capabilities: { - registerCapabilitiesModifier: (provider: CapabilitiesModifier) => void; - }; auditLogger: { create: (pluginId: string) => AuditLogger; }; @@ -132,6 +127,16 @@ export class Plugin { features: plugins.features, }); + core.capabilities.registerSwitcher(async (request, uiCapabilities) => { + try { + const activeSpace = await spacesService.getActiveSpace(request); + const features = plugins.features.getFeatures(); + return toggleUICapabilities(features, uiCapabilities, activeSpace); + } catch (e) { + return uiCapabilities; + } + }); + if (plugins.security) { plugins.security.registerSpacesService(spacesService); } @@ -189,14 +194,5 @@ export class Plugin { features: featuresSetup, licensing: licensingSetup, }); - legacyAPI.capabilities.registerCapabilitiesModifier(async (request, uiCapabilities) => { - try { - const activeSpace = await spacesService.getActiveSpace(KibanaRequest.from(request)); - const features = featuresSetup.getFeatures(); - return toggleUICapabilities(features, uiCapabilities, activeSpace); - } catch (e) { - return uiCapabilities; - } - }); } } diff --git a/x-pack/plugins/spaces/server/routes/api/__fixtures__/create_legacy_api.ts b/x-pack/plugins/spaces/server/routes/api/__fixtures__/create_legacy_api.ts index 62820466b571cb..cd2bcdcd5aa34b 100644 --- a/x-pack/plugins/spaces/server/routes/api/__fixtures__/create_legacy_api.ts +++ b/x-pack/plugins/spaces/server/routes/api/__fixtures__/create_legacy_api.ts @@ -104,7 +104,6 @@ export const createLegacyAPI = ({ kibanaIndex: '', }, auditLogger: {} as any, - capabilities: {} as any, tutorial: {} as any, xpackMain: {} as any, savedObjects: savedObjectsService, diff --git a/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts b/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts index 56969879b6322b..4af7d81e5a7b4f 100644 --- a/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts +++ b/x-pack/test/ui_capabilities/common/services/ui_capabilities.ts @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ import axios, { AxiosInstance } from 'axios'; -import cheerio from 'cheerio'; import { UICapabilities } from 'ui/capabilities'; import { format as formatUrl } from 'url'; import util from 'util'; import { ToolingLog } from '@kbn/dev-utils'; import { FtrProviderContext } from '../ftr_provider_context'; +import { FeaturesService, FeaturesProvider } from './features'; export interface BasicCredentials { username: string; @@ -30,8 +30,9 @@ interface GetUICapabilitiesResult { export class UICapabilitiesService { private readonly log: ToolingLog; private readonly axios: AxiosInstance; + private readonly featureService: FeaturesService; - constructor(url: string, log: ToolingLog) { + constructor(url: string, log: ToolingLog, featureService: FeaturesService) { this.log = log; this.axios = axios.create({ headers: { 'kbn-xsrf': 'x-pack/ftr/services/ui_capabilities' }, @@ -39,6 +40,7 @@ export class UICapabilitiesService { maxRedirects: 0, validateStatus: () => true, // we'll handle our own statusCodes and throw informative errors }); + this.featureService = featureService; } public async get({ @@ -48,8 +50,15 @@ export class UICapabilitiesService { credentials?: BasicCredentials; spaceId?: string; }): Promise { + const features = await this.featureService.get(); + const applications = Object.values(features) + .map(feature => feature.navLinkId) + .filter(link => !!link); + const spaceUrlPrefix = spaceId ? `/s/${spaceId}` : ''; - this.log.debug(`requesting ${spaceUrlPrefix}/app/kibana to parse the uiCapabilities`); + this.log.debug( + `requesting ${spaceUrlPrefix}/api/core/capabilities to parse the uiCapabilities` + ); const requestHeaders = credentials ? { Authorization: `Basic ${Buffer.from( @@ -57,9 +66,13 @@ export class UICapabilitiesService { ).toString('base64')}`, } : {}; - const response = await this.axios.get(`${spaceUrlPrefix}/app/kibana`, { - headers: requestHeaders, - }); + const response = await this.axios.post( + `${spaceUrlPrefix}/api/core/capabilities`, + { applications: [...applications, 'kibana:management'] }, + { + headers: requestHeaders, + } + ); if (response.status === 302 && response.headers.location === '/spaces/space_selector') { return { @@ -83,35 +96,20 @@ export class UICapabilitiesService { ); } - const dom = cheerio.load(response.data.toString()); - const element = dom('kbn-injected-metadata'); - if (!element) { - throw new Error('Unable to find "kbn-injected-metadata" element'); - } - - const dataAttrJson = element.attr('data'); - - try { - const dataAttr = JSON.parse(dataAttrJson); - return { - success: true, - value: dataAttr.capabilities as UICapabilities, - }; - } catch (err) { - throw new Error( - `Unable to parse JSON from the kbn-injected-metadata data attribute: ${dataAttrJson}` - ); - } + return { + success: true, + value: response.data, + }; } } -export function UICapabilitiesProvider({ getService }: FtrProviderContext) { - const log = getService('log'); - const config = getService('config'); +export function UICapabilitiesProvider(context: FtrProviderContext) { + const log = context.getService('log'); + const config = context.getService('config'); const noAuthUrl = formatUrl({ ...config.get('servers.kibana'), auth: undefined, }); - return new UICapabilitiesService(noAuthUrl, log); + return new UICapabilitiesService(noAuthUrl, log, FeaturesProvider(context)); } diff --git a/x-pack/test/ui_capabilities/security_and_spaces/tests/catalogue.ts b/x-pack/test/ui_capabilities/security_and_spaces/tests/catalogue.ts index 6b15d1bff42097..d7d15ddfeec9ca 100644 --- a/x-pack/test/ui_capabilities/security_and_spaces/tests/catalogue.ts +++ b/x-pack/test/ui_capabilities/security_and_spaces/tests/catalogue.ts @@ -7,10 +7,7 @@ import expect from '@kbn/expect'; import { mapValues } from 'lodash'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { - GetUICapabilitiesFailureReason, - UICapabilitiesService, -} from '../../common/services/ui_capabilities'; +import { UICapabilitiesService } from '../../common/services/ui_capabilities'; import { UserAtSpaceScenarios } from '../scenarios'; export default function catalogueTests({ getService }: FtrProviderContext) { @@ -58,15 +55,7 @@ export default function catalogueTests({ getService }: FtrProviderContext) { case 'dual_privileges_all at nothing_space': case 'dual_privileges_read at nothing_space': case 'nothing_space_all at nothing_space': - case 'nothing_space_read at nothing_space': { - expect(uiCapabilities.success).to.be(true); - expect(uiCapabilities.value).to.have.property('catalogue'); - // everything is disabled - const expected = mapValues(uiCapabilities.value!.catalogue, () => false); - expect(uiCapabilities.value!.catalogue).to.eql(expected); - break; - } - // if we don't have access at the space itself, security interceptor responds with 404. + case 'nothing_space_read at nothing_space': case 'no_kibana_privileges at everything_space': case 'no_kibana_privileges at nothing_space': case 'legacy_all at everything_space': @@ -74,10 +63,14 @@ export default function catalogueTests({ getService }: FtrProviderContext) { case 'everything_space_all at nothing_space': case 'everything_space_read at nothing_space': case 'nothing_space_all at everything_space': - case 'nothing_space_read at everything_space': - expect(uiCapabilities.success).to.be(false); - expect(uiCapabilities.failureReason).to.be(GetUICapabilitiesFailureReason.NotFound); + case 'nothing_space_read at everything_space': { + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('catalogue'); + // everything is disabled + const expected = mapValues(uiCapabilities.value!.catalogue, () => false); + expect(uiCapabilities.value!.catalogue).to.eql(expected); break; + } default: throw new UnreachableError(scenario); } diff --git a/x-pack/test/ui_capabilities/security_and_spaces/tests/foo.ts b/x-pack/test/ui_capabilities/security_and_spaces/tests/foo.ts index ad4c3582d468fe..d9cec21a41bc80 100644 --- a/x-pack/test/ui_capabilities/security_and_spaces/tests/foo.ts +++ b/x-pack/test/ui_capabilities/security_and_spaces/tests/foo.ts @@ -6,10 +6,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { - GetUICapabilitiesFailureReason, - UICapabilitiesService, -} from '../../common/services/ui_capabilities'; +import { UICapabilitiesService } from '../../common/services/ui_capabilities'; import { UserAtSpaceScenarios } from '../scenarios'; export default function fooTests({ getService }: FtrProviderContext) { @@ -61,16 +58,6 @@ export default function fooTests({ getService }: FtrProviderContext) { case 'dual_privileges_read at nothing_space': case 'nothing_space_all at nothing_space': case 'nothing_space_read at nothing_space': - expect(uiCapabilities.success).to.be(true); - expect(uiCapabilities.value).to.have.property('foo'); - expect(uiCapabilities.value!.foo).to.eql({ - create: false, - edit: false, - delete: false, - show: false, - }); - break; - // if we don't have access at the space itself, security interceptor responds with 404. case 'no_kibana_privileges at everything_space': case 'no_kibana_privileges at nothing_space': case 'legacy_all at everything_space': @@ -79,8 +66,14 @@ export default function fooTests({ getService }: FtrProviderContext) { case 'everything_space_read at nothing_space': case 'nothing_space_all at everything_space': case 'nothing_space_read at everything_space': - expect(uiCapabilities.success).to.be(false); - expect(uiCapabilities.failureReason).to.be(GetUICapabilitiesFailureReason.NotFound); + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('foo'); + expect(uiCapabilities.value!.foo).to.eql({ + create: false, + edit: false, + delete: false, + show: false, + }); break; default: throw new UnreachableError(scenario); diff --git a/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts b/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts index e9d0cf28e96eca..beb781fdfe8b67 100644 --- a/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts +++ b/x-pack/test/ui_capabilities/security_and_spaces/tests/nav_links.ts @@ -8,10 +8,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { NavLinksBuilder } from '../../common/nav_links_builder'; import { FeaturesService } from '../../common/services'; -import { - GetUICapabilitiesFailureReason, - UICapabilitiesService, -} from '../../common/services/ui_capabilities'; +import { UICapabilitiesService } from '../../common/services/ui_capabilities'; import { UserAtSpaceScenarios } from '../scenarios'; export default function navLinksTests({ getService }: FtrProviderContext) { @@ -58,11 +55,6 @@ export default function navLinksTests({ getService }: FtrProviderContext) { case 'global_read at nothing_space': case 'nothing_space_all at nothing_space': case 'nothing_space_read at nothing_space': - expect(uiCapabilities.success).to.be(true); - expect(uiCapabilities.value).to.have.property('navLinks'); - expect(uiCapabilities.value!.navLinks).to.eql(navLinksBuilder.only('management')); - break; - // if we don't have access at the space itself, security interceptor responds with 404. case 'no_kibana_privileges at everything_space': case 'no_kibana_privileges at nothing_space': case 'legacy_all at everything_space': @@ -71,8 +63,9 @@ export default function navLinksTests({ getService }: FtrProviderContext) { case 'everything_space_read at nothing_space': case 'nothing_space_all at everything_space': case 'nothing_space_read at everything_space': - expect(uiCapabilities.success).to.be(false); - expect(uiCapabilities.failureReason).to.be(GetUICapabilitiesFailureReason.NotFound); + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('navLinks'); + expect(uiCapabilities.value!.navLinks).to.eql(navLinksBuilder.only('management')); break; default: throw new UnreachableError(scenario); diff --git a/x-pack/test/ui_capabilities/security_only/tests/catalogue.ts b/x-pack/test/ui_capabilities/security_only/tests/catalogue.ts index 9a46820e87f3ae..232fd19c5c5b87 100644 --- a/x-pack/test/ui_capabilities/security_only/tests/catalogue.ts +++ b/x-pack/test/ui_capabilities/security_only/tests/catalogue.ts @@ -7,10 +7,7 @@ import expect from '@kbn/expect'; import { mapValues } from 'lodash'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { - GetUICapabilitiesFailureReason, - UICapabilitiesService, -} from '../../common/services/ui_capabilities'; +import { UICapabilitiesService } from '../../common/services/ui_capabilities'; import { UserScenarios } from '../scenarios'; export default function catalogueTests({ getService }: FtrProviderContext) { @@ -63,8 +60,11 @@ export default function catalogueTests({ getService }: FtrProviderContext) { // these users have no access to even get the ui capabilities case 'legacy_all': case 'no_kibana_privileges': - expect(uiCapabilities.success).to.be(false); - expect(uiCapabilities.failureReason).to.be(GetUICapabilitiesFailureReason.NotFound); + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('catalogue'); + // only foo is enabled + const expected = mapValues(uiCapabilities.value!.catalogue, () => false); + expect(uiCapabilities.value!.catalogue).to.eql(expected); break; default: throw new UnreachableError(scenario); diff --git a/x-pack/test/ui_capabilities/security_only/tests/foo.ts b/x-pack/test/ui_capabilities/security_only/tests/foo.ts index a2a663921e6ea9..f5f9ae3d5020e7 100644 --- a/x-pack/test/ui_capabilities/security_only/tests/foo.ts +++ b/x-pack/test/ui_capabilities/security_only/tests/foo.ts @@ -6,10 +6,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { - GetUICapabilitiesFailureReason, - UICapabilitiesService, -} from '../../common/services/ui_capabilities'; +import { UICapabilitiesService } from '../../common/services/ui_capabilities'; import { UserScenarios } from '../scenarios'; export default function fooTests({ getService }: FtrProviderContext) { @@ -55,8 +52,14 @@ export default function fooTests({ getService }: FtrProviderContext) { // these users have no access to even get the ui capabilities case 'legacy_all': case 'no_kibana_privileges': - expect(uiCapabilities.success).to.be(false); - expect(uiCapabilities.failureReason).to.be(GetUICapabilitiesFailureReason.NotFound); + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('foo'); + expect(uiCapabilities.value!.foo).to.eql({ + create: false, + edit: false, + delete: false, + show: false, + }); break; // all other users can't do anything with Foo default: diff --git a/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts b/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts index f643753a5c37cd..dd451bba3b5389 100644 --- a/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts +++ b/x-pack/test/ui_capabilities/security_only/tests/nav_links.ts @@ -8,10 +8,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../common/ftr_provider_context'; import { NavLinksBuilder } from '../../common/nav_links_builder'; import { FeaturesService } from '../../common/services'; -import { - GetUICapabilitiesFailureReason, - UICapabilitiesService, -} from '../../common/services/ui_capabilities'; +import { UICapabilitiesService } from '../../common/services/ui_capabilities'; import { UserScenarios } from '../scenarios'; export default function navLinksTests({ getService }: FtrProviderContext) { @@ -59,8 +56,9 @@ export default function navLinksTests({ getService }: FtrProviderContext) { break; case 'legacy_all': case 'no_kibana_privileges': - expect(uiCapabilities.success).to.be(false); - expect(uiCapabilities.failureReason).to.be(GetUICapabilitiesFailureReason.NotFound); + expect(uiCapabilities.success).to.be(true); + expect(uiCapabilities.value).to.have.property('navLinks'); + expect(uiCapabilities.value!.navLinks).to.eql(navLinksBuilder.only('management')); break; default: throw new UnreachableError(scenario); From a80366b36481c8efb3046a7766e90fe241f1b5e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Tue, 3 Dec 2019 09:49:46 +0100 Subject: [PATCH 39/39] [APM] Pagination of top 10 trace samples (#51911) * adding trace pagination * adding trace pagination * refactoring * refactoring --- .../__jest__/distribution.test.js | 54 ------- .../__test__/distribution.test.ts | 63 +++++++++ .../TransactionDetails/Distribution/index.tsx | 39 +++--- .../MaybeViewTraceLink.tsx | 87 ++++++++++++ .../WaterfallWithSummmary/index.tsx | 132 +++++++----------- .../app/TransactionDetails/index.tsx | 29 +++- .../Histogram/__test__/Histogram.test.js | 16 ++- .../charts/Histogram/__test__/response.json | 32 +++-- .../hooks/useTransactionDistribution.ts | 15 +- .../distribution/get_buckets/fetcher.ts | 18 ++- .../distribution/get_buckets/transform.ts | 18 ++- 11 files changed, 296 insertions(+), 207 deletions(-) delete mode 100644 x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__jest__/distribution.test.js create mode 100644 x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__test__/distribution.test.ts create mode 100644 x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/MaybeViewTraceLink.tsx diff --git a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__jest__/distribution.test.js b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__jest__/distribution.test.js deleted file mode 100644 index 75338c669d0b39..00000000000000 --- a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__jest__/distribution.test.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { getFormattedBuckets } from '../index'; - -describe('Distribution', () => { - it('getFormattedBuckets', () => { - const buckets = [ - { key: 0, count: 0 }, - { key: 20, count: 0 }, - { key: 40, count: 0 }, - { - key: 60, - count: 5, - sample: { - transactionId: 'someTransactionId' - } - }, - { - key: 80, - count: 100, - sample: { - transactionId: 'anotherTransactionId' - } - } - ]; - expect(getFormattedBuckets(buckets, 20)).toEqual([ - { x: 20, x0: 0, y: 0, style: { cursor: 'default' } }, - { x: 40, x0: 20, y: 0, style: { cursor: 'default' } }, - { x: 60, x0: 40, y: 0, style: { cursor: 'default' } }, - { - x: 80, - x0: 60, - y: 5, - sample: { - transactionId: 'someTransactionId' - }, - style: { cursor: 'pointer' } - }, - { - x: 100, - x0: 80, - y: 100, - sample: { - transactionId: 'anotherTransactionId' - }, - style: { cursor: 'pointer' } - } - ]); - }); -}); diff --git a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__test__/distribution.test.ts b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__test__/distribution.test.ts new file mode 100644 index 00000000000000..85398a1324f7b4 --- /dev/null +++ b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/__test__/distribution.test.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getFormattedBuckets } from '../index'; +import { IBucket } from '../../../../../../server/lib/transactions/distribution/get_buckets/transform'; + +describe('Distribution', () => { + it('getFormattedBuckets', () => { + const buckets = [ + { key: 0, count: 0, samples: [] }, + { key: 20, count: 0, samples: [] }, + { key: 40, count: 0, samples: [] }, + { + key: 60, + count: 5, + samples: [ + { + transactionId: 'someTransactionId' + } + ] + }, + { + key: 80, + count: 100, + samples: [ + { + transactionId: 'anotherTransactionId' + } + ] + } + ] as IBucket[]; + expect(getFormattedBuckets(buckets, 20)).toEqual([ + { x: 20, x0: 0, y: 0, style: { cursor: 'default' }, samples: [] }, + { x: 40, x0: 20, y: 0, style: { cursor: 'default' }, samples: [] }, + { x: 60, x0: 40, y: 0, style: { cursor: 'default' }, samples: [] }, + { + x: 80, + x0: 60, + y: 5, + style: { cursor: 'pointer' }, + samples: [ + { + transactionId: 'someTransactionId' + } + ] + }, + { + x: 100, + x0: 80, + y: 100, + style: { cursor: 'pointer' }, + samples: [ + { + transactionId: 'anotherTransactionId' + } + ] + } + ]); + }); +}); diff --git a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx index c9e5175a109219..acd50438b4d544 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/Distribution/index.tsx @@ -8,6 +8,7 @@ import { EuiIconTip, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import d3 from 'd3'; import React, { FunctionComponent, useCallback } from 'react'; +import { isEmpty } from 'lodash'; import { TransactionDistributionAPIResponse } from '../../../../../server/lib/transactions/distribution'; import { IBucket } from '../../../../../server/lib/transactions/distribution/get_buckets/transform'; import { IUrlParams } from '../../../../context/UrlParamsContext/types'; @@ -20,7 +21,7 @@ import { history } from '../../../../utils/history'; import { LoadingStatePrompt } from '../../../shared/LoadingStatePrompt'; interface IChartPoint { - sample?: IBucket['sample']; + samples: IBucket['samples']; x0: number; x: number; y: number; @@ -35,13 +36,15 @@ export function getFormattedBuckets(buckets: IBucket[], bucketSize: number) { } return buckets.map( - ({ sample, count, key }): IChartPoint => { + ({ samples, count, key }): IChartPoint => { return { - sample, + samples, x0: key, x: key + bucketSize, y: count, - style: { cursor: count > 0 && sample ? 'pointer' : 'default' } + style: { + cursor: isEmpty(samples) ? 'default' : 'pointer' + } }; } ); @@ -91,6 +94,7 @@ interface Props { distribution?: TransactionDistributionAPIResponse; urlParams: IUrlParams; isLoading: boolean; + bucketIndex: number; } export const TransactionDistribution: FunctionComponent = ( @@ -98,8 +102,9 @@ export const TransactionDistribution: FunctionComponent = ( ) => { const { distribution, - urlParams: { transactionId, traceId, transactionType }, - isLoading + urlParams: { transactionType }, + isLoading, + bucketIndex } = props; const formatYShort = useCallback(getFormatYShort(transactionType), [ @@ -134,13 +139,6 @@ export const TransactionDistribution: FunctionComponent = ( const xMax = d3.max(buckets, d => d.x) || 0; const timeFormatter = getDurationFormatter(xMax); - const bucketIndex = buckets.findIndex( - bucket => - bucket.sample != null && - bucket.sample.transactionId === transactionId && - bucket.sample.traceId === traceId - ); - return (

    @@ -175,13 +173,14 @@ export const TransactionDistribution: FunctionComponent = ( bucketSize={distribution.bucketSize} bucketIndex={bucketIndex} onClick={(bucket: IChartPoint) => { - if (bucket.sample && bucket.y > 0) { + if (!isEmpty(bucket.samples)) { + const sample = bucket.samples[0]; history.push({ ...history.location, search: fromQuery({ ...toQuery(history.location.search), - transactionId: bucket.sample.transactionId, - traceId: bucket.sample.traceId + transactionId: sample.transactionId, + traceId: sample.traceId }) }); } @@ -189,17 +188,15 @@ export const TransactionDistribution: FunctionComponent = ( formatX={(time: number) => timeFormatter(time).formatted} formatYShort={formatYShort} formatYLong={formatYLong} - verticalLineHover={(bucket: IChartPoint) => - bucket.y > 0 && !bucket.sample - } - backgroundHover={(bucket: IChartPoint) => bucket.y > 0 && bucket.sample} + verticalLineHover={(bucket: IChartPoint) => isEmpty(bucket.samples)} + backgroundHover={(bucket: IChartPoint) => !isEmpty(bucket.samples)} tooltipHeader={(bucket: IChartPoint) => { const xFormatted = timeFormatter(bucket.x); const x0Formatted = timeFormatter(bucket.x0); return `${x0Formatted.value} - ${xFormatted.value} ${xFormatted.unit}`; }} tooltipFooter={(bucket: IChartPoint) => - !bucket.sample && + isEmpty(bucket.samples) && i18n.translate( 'xpack.apm.transactionDetails.transactionsDurationDistributionChart.noSampleTooltip', { diff --git a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/MaybeViewTraceLink.tsx b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/MaybeViewTraceLink.tsx new file mode 100644 index 00000000000000..39e52be34a415a --- /dev/null +++ b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/MaybeViewTraceLink.tsx @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiButton, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { Transaction as ITransaction } from '../../../../../typings/es_schemas/ui/Transaction'; +import { TransactionDetailLink } from '../../../shared/Links/apm/TransactionDetailLink'; +import { IWaterfall } from './WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers'; + +export const MaybeViewTraceLink = ({ + transaction, + waterfall +}: { + transaction: ITransaction; + waterfall: IWaterfall; +}) => { + const viewFullTraceButtonLabel = i18n.translate( + 'xpack.apm.transactionDetails.viewFullTraceButtonLabel', + { + defaultMessage: 'View full trace' + } + ); + + // the traceroot cannot be found, so we cannot link to it + if (!waterfall.traceRoot) { + return ( + + + + {viewFullTraceButtonLabel} + + + + ); + } + + const isRoot = + transaction.transaction.id === waterfall.traceRoot.transaction.id; + + // the user is already viewing the full trace, so don't link to it + if (isRoot) { + return ( + + + + {viewFullTraceButtonLabel} + + + + ); + + // the user is viewing a zoomed in version of the trace. Link to the full trace + } else { + const traceRoot = waterfall.traceRoot; + return ( + + + {viewFullTraceButtonLabel} + + + ); + } +}; diff --git a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx index fb37bf44c2f32a..b56370a59c8e22 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/index.tsx @@ -5,102 +5,44 @@ */ import { - EuiButton, EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer, - EuiToolTip, EuiEmptyPrompt, - EuiTitle + EuiTitle, + EuiPagination } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Location } from 'history'; -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { sum } from 'lodash'; -import { Transaction as ITransaction } from '../../../../../typings/es_schemas/ui/Transaction'; +import styled from 'styled-components'; import { IUrlParams } from '../../../../context/UrlParamsContext/types'; -import { TransactionDetailLink } from '../../../shared/Links/apm/TransactionDetailLink'; import { TransactionActionMenu } from '../../../shared/TransactionActionMenu/TransactionActionMenu'; import { TransactionTabs } from './TransactionTabs'; import { IWaterfall } from './WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers'; import { LoadingStatePrompt } from '../../../shared/LoadingStatePrompt'; import { TransactionSummary } from '../../../shared/Summary/TransactionSummary'; +import { IBucket } from '../../../../../server/lib/transactions/distribution/get_buckets/transform'; +import { history } from '../../../../utils/history'; +import { fromQuery, toQuery } from '../../../shared/Links/url_helpers'; +import { MaybeViewTraceLink } from './MaybeViewTraceLink'; +import { units, px } from '../../../../style/variables'; -function MaybeViewTraceLink({ - transaction, - waterfall -}: { - transaction: ITransaction; - waterfall: IWaterfall; -}) { - const viewFullTraceButtonLabel = i18n.translate( - 'xpack.apm.transactionDetails.viewFullTraceButtonLabel', - { - defaultMessage: 'View full trace' - } - ); +const PaginationContainer = styled.div` + margin-left: ${px(units.quarter)}; + display: flex; + align-items: center; - // the traceroot cannot be found, so we cannot link to it - if (!waterfall.traceRoot) { - return ( - - - - {viewFullTraceButtonLabel} - - - - ); + > span:first-of-type { + font-weight: 600; } - const isRoot = - transaction.transaction.id === waterfall.traceRoot.transaction.id; - - // the user is already viewing the full trace, so don't link to it - if (isRoot) { - return ( - - - - {viewFullTraceButtonLabel} - - - - ); - - // the user is viewing a zoomed in version of the trace. Link to the full trace - } else { - const traceRoot = waterfall.traceRoot; - return ( - - - {viewFullTraceButtonLabel} - - - ); + > span:last-of-type { + margin-right: ${px(units.half)}; } -} +`; interface Props { urlParams: IUrlParams; @@ -108,6 +50,7 @@ interface Props { waterfall: IWaterfall; exceedsMax: boolean; isLoading: boolean; + traceSamples: IBucket['samples']; } export const WaterfallWithSummmary: React.FC = ({ @@ -115,8 +58,28 @@ export const WaterfallWithSummmary: React.FC = ({ location, waterfall, exceedsMax, - isLoading + isLoading, + traceSamples }) => { + const [sampleActivePage, setSampleActivePage] = useState(0); + + useEffect(() => { + setSampleActivePage(0); + }, [traceSamples]); + + const goToSample = (index: number) => { + setSampleActivePage(index); + const sample = traceSamples[index]; + history.push({ + ...history.location, + search: fromQuery({ + ...toQuery(history.location.search), + transactionId: sample.transactionId, + traceId: sample.traceId + }) + }); + }; + const { entryTransaction } = waterfall; if (!entryTransaction) { const content = isLoading ? ( @@ -140,7 +103,7 @@ export const WaterfallWithSummmary: React.FC = ({ return ( - +
    {i18n.translate('xpack.apm.transactionDetails.traceSampleTitle', { @@ -148,8 +111,19 @@ export const WaterfallWithSummmary: React.FC = ({ })}
    + {traceSamples && ( + + {sampleActivePage + 1} + /{traceSamples.length} + + + )}
    - diff --git a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/index.tsx index e4b2608343fac0..dbd0e9d3b9d221 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/TransactionDetails/index.tsx @@ -29,6 +29,7 @@ import { ChartsSyncContextProvider } from '../../../context/ChartsSyncContext'; import { useTrackPageview } from '../../../../../infra/public'; import { PROJECTION } from '../../../../common/projections/typings'; import { LocalUIFilters } from '../../shared/LocalUIFilters'; +import { HeightRetainer } from '../../shared/HeightRetainer'; export function TransactionDetails() { const location = useLocation(); @@ -60,6 +61,16 @@ export function TransactionDetails() { return config; }, [transactionName, transactionType, serviceName]); + const bucketIndex = distributionData.buckets.findIndex(bucket => + bucket.samples.some( + sample => + sample.transactionId === urlParams.transactionId && + sample.traceId === urlParams.traceId + ) + ); + + const traceSamples = distributionData.buckets[bucketIndex]?.samples; + return (
    @@ -93,18 +104,22 @@ export function TransactionDetails() { distribution={distributionData} isLoading={distributionStatus === FETCH_STATUS.LOADING} urlParams={urlParams} + bucketIndex={bucketIndex} /> - + + +
    diff --git a/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/Histogram.test.js b/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/Histogram.test.js index f76a27480137a2..ec704d7405019e 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/Histogram.test.js +++ b/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/Histogram.test.js @@ -95,9 +95,11 @@ describe('Histogram', () => { it('should update state with "hoveredBucket"', () => { expect(wrapper.state()).toEqual({ hoveredBucket: { - sample: { - transactionId: '99c50a5b-44b4-4289-a3d1-a2815d128192' - }, + samples: [ + { + transactionId: '99c50a5b-44b4-4289-a3d1-a2815d128192' + } + ], style: { cursor: 'pointer' }, xCenter: 869010, x0: 811076, @@ -123,9 +125,11 @@ describe('Histogram', () => { it('should call onClick with bucket', () => { expect(onClick).toHaveBeenCalledWith({ - sample: { - transactionId: '99c50a5b-44b4-4289-a3d1-a2815d128192' - }, + samples: [ + { + transactionId: '99c50a5b-44b4-4289-a3d1-a2815d128192' + } + ], style: { cursor: 'pointer' }, xCenter: 869010, x0: 811076, diff --git a/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/response.json b/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/response.json index f48213f72a9835..302e105dfa997a 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/response.json +++ b/x-pack/legacy/plugins/apm/public/components/shared/charts/Histogram/__test__/response.json @@ -8,23 +8,29 @@ { "key": 579340, "count": 8, - "sample": { - "transactionId": "99437ee4-08d4-41f5-9b2b-93cc32ec3dfb" - } + "samples": [ + { + "transactionId": "99437ee4-08d4-41f5-9b2b-93cc32ec3dfb" + } + ] }, { "key": 695208, "count": 23, - "sample": { - "transactionId": "d327611b-e999-4942-a94f-c60208940180" - } + "samples": [ + { + "transactionId": "d327611b-e999-4942-a94f-c60208940180" + } + ] }, { "key": 811076, "count": 49, - "sample": { - "transactionId": "99c50a5b-44b4-4289-a3d1-a2815d128192" - } + "samples": [ + { + "transactionId": "99c50a5b-44b4-4289-a3d1-a2815d128192" + } + ] }, { "key": 926944, @@ -39,9 +45,11 @@ { "key": 1158680, "count": 13, - "sample": { - "transactionId": "8486d3e2-7f15-48df-aa37-6ee9955adbd2" - } + "samples": [ + { + "transactionId": "8486d3e2-7f15-48df-aa37-6ee9955adbd2" + } + ] }, { "key": 1274548, diff --git a/x-pack/legacy/plugins/apm/public/hooks/useTransactionDistribution.ts b/x-pack/legacy/plugins/apm/public/hooks/useTransactionDistribution.ts index 4c7e337212e551..e50ea7eab187fc 100644 --- a/x-pack/legacy/plugins/apm/public/hooks/useTransactionDistribution.ts +++ b/x-pack/legacy/plugins/apm/public/hooks/useTransactionDistribution.ts @@ -49,19 +49,10 @@ export function useTransactionDistribution(urlParams: IUrlParams) { } }); } - // the histogram should not be refetched if the transactionId or traceId changes - // eslint-disable-next-line react-hooks/exhaustive-deps }, - [ - serviceName, - start, - end, - transactionType, - transactionName, - transactionId, - traceId, - uiFilters - ] + // the histogram should not be refetched if the transactionId or traceId changes + // eslint-disable-next-line react-hooks/exhaustive-deps + [serviceName, start, end, transactionType, transactionName, uiFilters] ); return { data, status, error }; diff --git a/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts b/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts index 32fa65722869d8..b2f0834107df4c 100644 --- a/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts +++ b/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/fetcher.ts @@ -50,8 +50,7 @@ export async function bucketFetcher( ], should: [ { term: { [TRACE_ID]: traceId } }, - { term: { [TRANSACTION_ID]: transactionId } }, - { term: { [TRANSACTION_SAMPLED]: true } } + { term: { [TRANSACTION_ID]: transactionId } } ] } }, @@ -67,10 +66,17 @@ export async function bucketFetcher( } }, aggs: { - sample: { - top_hits: { - _source: [TRANSACTION_ID, TRANSACTION_SAMPLED, TRACE_ID], - size: 1 + samples: { + filter: { + term: { [TRANSACTION_SAMPLED]: true } + }, + aggs: { + items: { + top_hits: { + _source: [TRANSACTION_ID, TRACE_ID], + size: 10 + } + } } } } diff --git a/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/transform.ts b/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/transform.ts index a16e08138b87f2..2e703dfb196809 100644 --- a/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/transform.ts +++ b/x-pack/legacy/plugins/apm/server/lib/transactions/distribution/get_buckets/transform.ts @@ -11,25 +11,23 @@ import { bucketFetcher } from './fetcher'; type DistributionBucketResponse = PromiseReturnType; export type IBucket = ReturnType; + function getBucket( bucket: Required< DistributionBucketResponse >['aggregations']['distribution']['buckets'][0] ) { - const sampleSource = bucket.sample.hits.hits[0]?._source as - | Transaction - | undefined; - - const isSampled = sampleSource?.transaction.sampled; - const sample = { - traceId: sampleSource?.trace.id, - transactionId: sampleSource?.transaction.id - }; + const samples = bucket.samples.items.hits.hits.map( + ({ _source }: { _source: Transaction }) => ({ + traceId: _source.trace.id, + transactionId: _source.transaction.id + }) + ); return { key: bucket.key, count: bucket.doc_count, - sample: isSampled ? sample : undefined + samples }; }

    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ȀtB6g5ZeZ|Qt-y;Cpq7)Rdvl4*8oGQ59r-?! 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 WyV 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 V>0H%^wd?~|BJV^(XWZ-Me*-0==(_*_ literal 0 HcmV?d00001 diff --git a/docs/user/monitoring/logstash-details.asciidoc b/docs/user/monitoring/logstash-details.asciidoc index 7f2dac9c47f501..1433a6a036ca8a 100644 --- a/docs/user/monitoring/logstash-details.asciidoc +++ b/docs/user/monitoring/logstash-details.asciidoc @@ -9,16 +9,19 @@ If you are monitoring Logstash nodes, click **Overview** in the Logstash section of the *Stack Monitoring* page in {kib}. You can view the overall health of the Logstash nodes. -image::user/monitoring/images/monitoring-logstash-overview.jpg["Logstash Overview",link="images/monitoring-logstash-overview.jpg"] +[role="screenshot"] +image::user/monitoring/images/monitoring-logstash-overview.png["Logstash Overview",link="images/monitoring-logstash-overview.png"] To view Logstash node metrics, click **Nodes**. The Nodes section shows the status of each Logstash node. -image::user/monitoring/images/monitoring-logstash-nodes.jpg["Logstash Nodes",link="images/monitoring-logstash-nodes.jpg"] +[role="screenshot"] +image::user/monitoring/images/monitoring-logstash-nodes.png["Logstash Nodes",link="images/monitoring-logstash-nodes.png"] Click the name of a node to view its statistics over time. -image::user/monitoring/images/monitoring-logstash-node.jpg["Logstash Node View",link="images/monitoring-logstash-node.jpg"] +[role="screenshot"] +image::user/monitoring/images/monitoring-logstash-node.png["Logstash Node View",link="images/monitoring-logstash-node.png"] For more information, see {logstash-ref}/monitoring-logstash.html[Monitoring Logstash]. From 139ebcf614c2ad4b1f4bc82423e48dab8ab37511 Mon Sep 17 00:00:00 2001 From: ffknob Date: Mon, 2 Dec 2019 20:39:57 -0300 Subject: [PATCH 34/39] Clear cache when updating indices via UI (#51767) * Clear cache when updating indices via UI * Removes .ts --- .../apm/public/components/app/Settings/ApmIndices/index.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x-pack/legacy/plugins/apm/public/components/app/Settings/ApmIndices/index.tsx b/x-pack/legacy/plugins/apm/public/components/app/Settings/ApmIndices/index.tsx index 6323599436ca8a..7ced0b6fdd5662 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Settings/ApmIndices/index.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Settings/ApmIndices/index.tsx @@ -22,6 +22,7 @@ import { import { useFetcher } from '../../../../hooks/useFetcher'; import { useCallApmApi } from '../../../../hooks/useCallApmApi'; import { APMClient } from '../../../../services/rest/createCallApmApi'; +import { clearCache } from '../../../../services/rest/callApi'; import { useKibanaCore } from '../../../../../../observability/public'; const APM_INDEX_LABELS = [ @@ -80,6 +81,8 @@ async function saveApmIndices({ body: apmIndices } }); + + clearCache(); } export function ApmIndices() { From d63595890eaefc497f74c72e0ad32a7a47fd0529 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Mon, 2 Dec 2019 16:57:27 -0700 Subject: [PATCH 35/39] Update App Arch CODEOWNERS with legacy plugins. (#51502) --- .github/CODEOWNERS | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d567f267afa9d1..610681e83798ee 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,9 +13,21 @@ /src/plugins/kibana_react/ @elastic/kibana-app-arch /src/plugins/kibana_utils/ @elastic/kibana-app-arch /src/plugins/navigation/ @elastic/kibana-app-arch +/src/plugins/share/ @elastic/kibana-app-arch /src/plugins/ui_actions/ @elastic/kibana-app-arch /src/plugins/visualizations/ @elastic/kibana-app-arch /x-pack/plugins/advanced_ui_actions/ @elastic/kibana-app-arch +/src/legacy/core_plugins/data/ @elastic/kibana-app-arch +/src/legacy/core_plugins/embeddable_api/ @elastic/kibana-app-arch +/src/legacy/core_plugins/interpreter/ @elastic/kibana-app-arch +/src/legacy/core_plugins/kibana_react/ @elastic/kibana-app-arch +/src/legacy/core_plugins/kibana/public/management/ @elastic/kibana-app-arch +/src/legacy/core_plugins/kibana/server/field_formats/ @elastic/kibana-app-arch +/src/legacy/core_plugins/kibana/server/routes/api/management/ @elastic/kibana-app-arch +/src/legacy/core_plugins/kibana/server/routes/api/suggestions/ @elastic/kibana-app-arch +/src/legacy/core_plugins/visualizations/ @elastic/kibana-app-arch +/src/legacy/server/index_patterns/ @elastic/kibana-app-arch +/src/legacy/server/url_shortening/ @elastic/kibana-app-arch # APM /x-pack/legacy/plugins/apm/ @elastic/apm-ui From be088a16ed833eb635fe851f12adf25a64ae5ebe Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Mon, 2 Dec 2019 17:12:20 -0700 Subject: [PATCH 36/39] [SIEM][Detection Engine] Switches actions/alerting on by default with SIEM (#51985) ## Summary * Removes environment variables to have alerting/actions be defaulted on within SIEM * Updates documentation * Removes unit tests for it ### Checklist Use ~~strikethroughs~~ to remove checklist items you don't feel are applicable to this PR. ~~- [ ] This was checked for cross-browser compatibility, [including a check against IE11](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility)~~ ~~- [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md)~~ ~~- [ ] [Documentation](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#writing-documentation) was added for features that require explanation or tutorials~~ - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios ~~- [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist)~~ ### For maintainers ~~- [ ] This was checked for breaking API changes and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process)~~ - [x] This includes a feature addition or change that requires a release note and was [labeled appropriately](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#release-notes-process) --- x-pack/legacy/plugins/siem/index.test.ts | 81 ------------- x-pack/legacy/plugins/siem/index.ts | 25 +--- .../plugins/siem/server/kibana.index.ts | 24 ++-- .../server/lib/detection_engine/README.md | 113 ++++-------------- .../lib/detection_engine/scripts/README.md | 39 ------ .../scripts/check_env_variables.sh | 14 +-- 6 files changed, 43 insertions(+), 253 deletions(-) delete mode 100644 x-pack/legacy/plugins/siem/index.test.ts delete mode 100644 x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/README.md diff --git a/x-pack/legacy/plugins/siem/index.test.ts b/x-pack/legacy/plugins/siem/index.test.ts deleted file mode 100644 index 5b7c488eb174c1..00000000000000 --- a/x-pack/legacy/plugins/siem/index.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { getRequiredPlugins } from '.'; - -// This test is a temporary test which is so we do not accidentally check-in -// feature flags turned on from "alerting" and "actions". If those get -// turned on during a check-in it will cause everyone's Kibana to not start. -// Once alerting and actions are part of the plugins by default this test -// should be removed. -describe('siem plugin tests', () => { - describe('getRequiredPlugins', () => { - test('null settings returns regular kibana and elasticsearch plugins', () => { - expect(getRequiredPlugins(null, null)).toEqual(['kibana', 'elasticsearch']); - }); - - test('undefined settings returns regular kibana and elasticsearch plugins', () => { - expect(getRequiredPlugins(undefined, undefined)).toEqual(['kibana', 'elasticsearch']); - }); - - test('alertingFeatureEnabled being false returns regular kibana and elasticsearch plugins', () => { - expect(getRequiredPlugins('false', undefined)).toEqual(['kibana', 'elasticsearch']); - }); - - test('alertingFeatureEnabled being true returns action and alerts', () => { - expect(getRequiredPlugins('true', undefined)).toEqual([ - 'kibana', - 'elasticsearch', - 'alerting', - 'actions', - ]); - }); - - test('alertingFeatureEnabled being false but a string for siemIndex returns alerting and actions', () => { - expect(getRequiredPlugins('false', '.siem-signals-frank')).toEqual([ - 'kibana', - 'elasticsearch', - 'alerting', - 'actions', - ]); - }); - - test('alertingFeatureEnabled being true and a string for siemIndex returns alerting and actions', () => { - expect(getRequiredPlugins('true', '.siem-signals-frank')).toEqual([ - 'kibana', - 'elasticsearch', - 'alerting', - 'actions', - ]); - }); - - test('alertingFeatureEnabled being true and an empty string for siemIndex returns regular kibana and elasticsearch plugins', () => { - expect(getRequiredPlugins(undefined, '')).toEqual(['kibana', 'elasticsearch']); - }); - - test('alertingFeatureEnabled being true and a string of spaces for siemIndex returns regular kibana and elasticsearch plugins', () => { - expect(getRequiredPlugins(undefined, ' ')).toEqual(['kibana', 'elasticsearch']); - }); - - test('alertingFeatureEnabled being null and a string for siemIndex returns alerting and actions', () => { - expect(getRequiredPlugins(null, '.siem-signals-frank')).toEqual([ - 'kibana', - 'elasticsearch', - 'alerting', - 'actions', - ]); - }); - - test('alertingFeatureEnabled being undefined and a string for siemIndex returns alerting and actions', () => { - expect(getRequiredPlugins(undefined, '.siem-signals-frank')).toEqual([ - 'kibana', - 'elasticsearch', - 'alerting', - 'actions', - ]); - }); - }); -}); diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 06aaec631be665..72b4ec588a5a4d 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -28,36 +28,13 @@ import { } from './common/constants'; import { defaultIndexPattern } from './default_index_pattern'; -// This is VERY TEMPORARY as we need a way to turn on alerting and actions -// for the server without having to manually edit this file. Once alerting -// and actions has their enabled true by default this can be removed. -// 'alerting', 'actions' are hidden behind feature flags at the moment so if you turn -// these on without the feature flags turned on then Kibana will crash since we are a legacy plugin -// and legacy plugins cannot have optional requirements. -// This returns ['alerting', 'actions', 'kibana', 'elasticsearch'] iff alertingFeatureEnabled is true -// or if the developer signalsIndex is setup. Otherwise this returns ['kibana', 'elasticsearch'] -export const getRequiredPlugins = ( - alertingFeatureEnabled: string | null | undefined, - signalsIndex: string | null | undefined -) => { - const baseRequire = ['kibana', 'elasticsearch']; - if ( - (signalsIndex != null && signalsIndex.trim() !== '') || - (alertingFeatureEnabled && alertingFeatureEnabled.toLowerCase() === 'true') - ) { - return [...baseRequire, 'alerting', 'actions']; - } else { - return baseRequire; - } -}; - // eslint-disable-next-line @typescript-eslint/no-explicit-any export const siem = (kibana: any) => { return new kibana.Plugin({ id: APP_ID, configPrefix: 'xpack.siem', publicDir: resolve(__dirname, 'public'), - require: getRequiredPlugins(process.env.ALERTING_FEATURE_ENABLED, process.env.SIGNALS_INDEX), + require: ['kibana', 'elasticsearch', 'alerting', 'actions'], uiExports: { app: { description: i18n.translate('xpack.siem.securityDescription', { diff --git a/x-pack/legacy/plugins/siem/server/kibana.index.ts b/x-pack/legacy/plugins/siem/server/kibana.index.ts index 2f1530a777042a..3d73b9f4d90b00 100644 --- a/x-pack/legacy/plugins/siem/server/kibana.index.ts +++ b/x-pack/legacy/plugins/siem/server/kibana.index.ts @@ -42,21 +42,15 @@ export const initServerWithKibana = ( const libs = compose(kbnServer, mode); initServer(libs); - if ( - kbnServer.config().has('xpack.actions.enabled') && - kbnServer.config().get('xpack.actions.enabled') === true && - kbnServer.config().has('xpack.alerting.enabled') && - kbnServer.config().has('xpack.alerting.enabled') === true - ) { - logger.info( - 'Detected feature flags for actions and alerting and enabling detection engine API endpoints' - ); - createRulesRoute(kbnServer); - readRulesRoute(kbnServer); - updateRulesRoute(kbnServer); - deleteRulesRoute(kbnServer); - findRulesRoute(kbnServer); - } + + // Signals/Alerting Rules routes for + // routes such as ${DETECTION_ENGINE_RULES_URL} + // that have the REST endpoints of /api/detection_engine/rules + createRulesRoute(kbnServer); + readRulesRoute(kbnServer); + updateRulesRoute(kbnServer); + deleteRulesRoute(kbnServer); + findRulesRoute(kbnServer); const xpackMainPlugin = kbnServer.plugins.xpack_main; xpackMainPlugin.registerFeature({ diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/README.md b/x-pack/legacy/plugins/siem/server/lib/detection_engine/README.md index 4b1dbf62d0dd4c..75757bbaa0c1f0 100644 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/README.md +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/README.md @@ -1,62 +1,20 @@ -Temporary README.md for users and developers working on the backend detection engine -for how to get started. +README.md for developers working on the backend detection engine on how to get started +using the CURL scripts in the scripts folder. -# Setup for Users +The scripts rely on CURL and jq: +* [CURL](https://curl.haxx.se) +* [jq](https://stedolan.github.io/jq/) -If you're just a user and want to enable the REST interfaces and UI screens do the following. -NOTE: this is very temporary and once alerting and actions is enabled by default you will no -longer have to do these steps - -Set the environment variable ALERTING_FEATURE_ENABLED to be true in your .profile or your windows -global environment variable. - -```sh -export ALERTING_FEATURE_ENABLED=true -``` - -In your `kibana.yml` file enable alerting and actions like so: - -```sh -# Feature flag to turn on alerting -xpack.alerting.enabled: true - -# Feature flag to turn on actions which goes with alerting -xpack.actions.enabled: true -``` - -Start Kibana and you will see these messages indicating detection engine is activated like so: - -```sh -server log [11:39:05.561] [info][siem] Detected feature flags for actions and alerting and enabling detection engine API endpoints -``` - -If you see crashes like this: - -```ts - FATAL Error: Unmet requirement "alerting" for plugin "siem" -``` - -It is because Kibana is not picking up your changes from `kibana.yml` and not seeing that alerting and actions is enabled. - -# For Developers - -See these two other pages for references: -https://github.com/elastic/kibana/blob/master/x-pack/legacy/plugins/alerting/README.md -https://github.com/elastic/kibana/tree/master/x-pack/legacy/plugins/actions - -Since there is no UI yet and a lot of backend areas that are not created, you -should install the kbn-action and kbn-alert project from here: -https://github.com/pmuellr/kbn-action - -The scripts rely on CURL and jq, ensure both of these are installed: +Install curl and jq ```sh brew update brew install curl brew install jq ``` -Open up your .zshrc/.bashrc and add these lines with the variables filled in: +Open `$HOME/.zshrc` or `${HOME}.bashrc` depending on your SHELL output from `echo $SHELL` +and add these environment variables: ```sh export ELASTICSEARCH_USERNAME=${user} @@ -66,52 +24,30 @@ export KIBANA_URL=http://localhost:5601 export SIGNALS_INDEX=.siem-signals-${your user id} export TASK_MANAGER_INDEX=.kibana-task-manager-${your user id} export KIBANA_INDEX=.kibana-${your user id} - -# This is for the kbn-action and kbn-alert tool -export KBN_URLBASE=http://${user}:${password}@localhost:5601 ``` -source your .zhsrc/.bashrc or open a new terminal to ensure you get the new values set. - -Optional env var when set to true will utilize `reindex` api for reindexing -instead of the scroll and bulk index combination. +source `$HOME/.zshrc` or `${HOME}.bashrc` to ensure variables are set: ```sh -export USE_REINDEX_API=true -``` - -Add these lines to your `kibana.dev.yml` to turn on the feature toggles of alerting and actions: - -```sh -# Feature flag to turn on alerting -xpack.alerting.enabled: true - -# Feature flag to turn on actions which goes with alerting -xpack.actions.enabled: true +source ~/.zshrc ``` Restart Kibana and ensure that you are using `--no-base-path` as changing the base path is a feature but will get in the way of the CURL scripts written as is. You should see alerting and actions starting up like so afterwards ```sh -server log [22:05:22.277] [info][status][plugin:alerting@8.0.0] Status changed from uninitialized to green - Ready -server log [22:05:22.270] [info][status][plugin:actions@8.0.0] Status changed from uninitialized to green - Ready -``` - -You should also see the SIEM detect the feature flags and start the API endpoints for detection engine - -```sh -server log [11:39:05.561] [info][siem] Detected feature flags for actions and alerting and enabling detection engine API endpoints +server log [22:05:22.277] [info][status][plugin:alerting@8.0.0] Status changed from uninitialized to green - Ready +server log [22:05:22.270] [info][status][plugin:actions@8.0.0] Status changed from uninitialized to green - Ready ``` Go into your SIEM Advanced settings and underneath the setting of `siem:defaultSignalsIndex`, set that to the same -value as you did with the environment variable of SIGNALS_INDEX, which should be `.siem-signals-${your user id}` +value as you did with the environment variable of `${SIGNALS_INDEX}`, which should be `.siem-signals-${your user id}` ``` .siem-signals-${your user id} ``` -Open a terminal and go into the scripts folder `cd kibana/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts` and run: +Go to the scripts folder `cd kibana/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts` and run: ```sh ./hard_reset.sh @@ -124,7 +60,7 @@ which will: - Delete any existing alerts you have - Delete any existing alert tasks you have - Delete any existing signal mapping you might have had. -- Add the latest signal index and its mappings using your settings from `SIGNALS_INDEX` environment variable. +- Add the latest signal index and its mappings using your settings from `${SIGNALS_INDEX}` environment variable. - Posts the sample rule from `rules/root_or_admin_1.json` by replacing its `output_index` with your `SIGNALS_INDEX` environment variable - The sample rule checks for root or admin every 5 minutes and reports that as a signal if it is a positive hit @@ -181,21 +117,20 @@ You should see the new rules created like so: Every 5 minutes if you get positive hits you will see messages on info like so: ```sh -server log [09:54:59.013] [info][plugins][siem] Total signals found from signal rule "id: a556065c-0656-4ba1-ad64-a77ca9d2013b", "ruleId: rule-1": 10000 +server log [09:54:59.013] [info][plugins][siem] Total signals found from signal rule "id: a556065c-0656-4ba1-ad64-a77ca9d2013b", "ruleId: rule-1": 10000 ``` -Rules are space aware and default to the "default" space for these scripts if you do not export -the variable of SPACE_URL. For example, if you want to post rules to the space `test-space` you would -set your SPACE_URL to be: +Rules are [space aware](https://www.elastic.co/guide/en/kibana/master/xpack-spaces.html) and default +to the "default" (empty) URL space if you do not export the variable of `SPACE_URL`. Example, if you want to +post rules to `test-space` you set `SPACE_URL` to be: ```sh export SPACE_URL=/s/test-space ``` -So that the scripts prepend a `/s/test-space` in front of all the APIs to correctly create, modify, delete, and update -them from within that space. - -See the scripts folder and the tools for more command line fun. +The `${SPACE_URL}` is in front of all the APIs to correctly create, modify, delete, and update +them from within the defined space. If this variable is not defined the default which is the url of an +empty string will be used. Add the `.siem-signals-${your user id}` to your advanced SIEM settings to see any signals created which should update once every 5 minutes at this point. @@ -216,3 +151,7 @@ logging.events: ops: __no-ops__, } ``` + +See these two README.md's pages for more references on the alerting and actions API: +https://github.com/elastic/kibana/blob/master/x-pack/legacy/plugins/alerting/README.md +https://github.com/elastic/kibana/tree/master/x-pack/legacy/plugins/actions diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/README.md b/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/README.md deleted file mode 100644 index 8d617a8de3fcde..00000000000000 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/README.md +++ /dev/null @@ -1,39 +0,0 @@ -A set of scripts for developers to utilize command line functionality of Kibana/Elastic -search which is not available in the DEV console for the detection engine. - -Before beginning ensure in your .zshrc/.bashrc you have your user, password, and url set: - -Open up your .zshrc/.bashrc and add these lines with the variables filled in: - -``` -export ELASTICSEARCH_USERNAME=${user} -export ELASTICSEARCH_PASSWORD=${password} -export ELASTICSEARCH_URL=https://${ip}:9200 -export KIBANA_URL=http://localhost:5601 -export SIGNALS_INDEX=.siem-signals-${your user id} -export TASK_MANAGER_INDEX=.kibana-task-manager-${your user id} -export KIBANA_INDEX=.kibana-${your user id} - -# This is for the kbn-action and kbn-alert tool -export KBN_URLBASE=http://${user}:${password}@localhost:5601 -``` - -And that you have the latest version of [NodeJS](https://nodejs.org/en/), -[CURL](https://curl.haxx.se), and [jq](https://stedolan.github.io/jq/) installed. - -If you have homebrew you can install using brew like so - -``` -brew install jq -``` - -After that you can execute scripts within this folder by first ensuring -your current working directory is `./scripts` and then running any scripts within -that folder. - -Example to add a rule to the system - -``` -cd ./scripts -./post_rule.sh ./rules/root_or_admin_1.json -``` diff --git a/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/check_env_variables.sh b/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/check_env_variables.sh index c534b33d284134..c2406dc7f62317 100755 --- a/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/check_env_variables.sh +++ b/x-pack/legacy/plugins/siem/server/lib/detection_engine/scripts/check_env_variables.sh @@ -11,36 +11,36 @@ set -e if [ -z "${ELASTICSEARCH_USERNAME}" ]; then - echo "Set ELASTICSEARCH_USERNAME in your enviornment" + echo "Set ELASTICSEARCH_USERNAME in your environment" exit 1 fi if [ -z "${ELASTICSEARCH_PASSWORD}" ]; then - echo "Set ELASTICSEARCH_PASSWORD in your enviornment" + echo "Set ELASTICSEARCH_PASSWORD in your environment" exit 1 fi if [ -z "${ELASTICSEARCH_URL}" ]; then - echo "Set ELASTICSEARCH_URL in your enviornment" + echo "Set ELASTICSEARCH_URL in your environment" exit 1 fi if [ -z "${KIBANA_URL}" ]; then - echo "Set KIBANA_URL in your enviornment" + echo "Set KIBANA_URL in your environment" exit 1 fi if [ -z "${SIGNALS_INDEX}" ]; then - echo "Set SIGNALS_INDEX in your enviornment" + echo "Set SIGNALS_INDEX in your environment" exit 1 fi if [ -z "${TASK_MANAGER_INDEX}" ]; then - echo "Set TASK_MANAGER_INDEX in your enviornment" + echo "Set TASK_MANAGER_INDEX in your environment" exit 1 fi if [ -z "${KIBANA_INDEX}" ]; then - echo "Set KIBANA_INDEX in your enviornment" + echo "Set KIBANA_INDEX in your environment" exit 1 fi From 609a7f5cfae31f2d49e1613d948dea1f92fa6476 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 2 Dec 2019 23:00:33 -0600 Subject: [PATCH 37/39] [APM] metadata.branch shim (#51770) Set up the APM public NP plugin to expose the stack version Since we're not yet running as an NP plugin, we don't get passed a pluginInitializerContext, so we use a shim in the plugin setup that gets the branch values from ui/metadata for the time being. Fixes #49327. --- .../public/components/app/Home/Home.test.tsx | 24 +-- .../app/Home/__snapshots__/Home.test.tsx.snap | 150 ++++-------------- .../Main/__test__/UpdateBreadcrumbs.test.js | 2 - .../shared/Links/ElasticDocsLink.tsx | 9 +- .../__test__/ErrorMetadata.test.tsx | 15 +- .../__test__/SpanMetadata.test.tsx | 13 +- .../__test__/TransactionMetadata.test.tsx | 27 +++- .../__test__/MetadataTable.test.tsx | 19 ++- .../apm/public/new-platform/plugin.tsx | 21 ++- .../stackVersionFromLegacyMetadata.ts | 9 ++ .../plugins/apm/public/utils/testHelpers.tsx | 27 +++- 11 files changed, 157 insertions(+), 159 deletions(-) create mode 100644 x-pack/legacy/plugins/apm/public/new-platform/stackVersionFromLegacyMetadata.ts diff --git a/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx b/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx index ad391510215d20..272e2561b7fd7d 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Home/Home.test.tsx @@ -7,20 +7,26 @@ import { shallow } from 'enzyme'; import React from 'react'; import { Home } from '../Home'; -import * as plugin from '../../../new-platform/plugin'; - -jest.spyOn(plugin, 'usePlugins').mockReturnValue(({ - apm: { config: {} as plugin.ConfigSchema } -} as unknown) as plugin.ApmPluginStartDeps & { - apm: { config: plugin.ConfigSchema }; -}); +import { MockPluginContextWrapper } from '../../../utils/testHelpers'; describe('Home component', () => { it('should render services', () => { - expect(shallow()).toMatchSnapshot(); + expect( + shallow( + + + + ) + ).toMatchSnapshot(); }); it('should render traces', () => { - expect(shallow()).toMatchSnapshot(); + expect( + shallow( + + + + ) + ).toMatchSnapshot(); }); }); diff --git a/x-pack/legacy/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap b/x-pack/legacy/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap index d876cada08d699..664a71c934a4e5 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap +++ b/x-pack/legacy/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap @@ -1,129 +1,35 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Home component should render services 1`] = ` -

    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