From 5665ce2cd2773f7db83d1de7d4b362470e9f8840 Mon Sep 17 00:00:00 2001 From: igoristic Date: Tue, 11 Aug 2020 06:40:22 -0400 Subject: [PATCH 01/25] Fixed grammar (#74725) --- TYPESCRIPT.md | 2 +- rfcs/text/0001_lifecycle_setup.md | 2 +- src/plugins/data/public/search/search_interceptor.ts | 2 +- .../plugins/data_enhanced/public/search/search_interceptor.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/TYPESCRIPT.md b/TYPESCRIPT.md index 7be9a5e4f3b1..ae23768558f9 100644 --- a/TYPESCRIPT.md +++ b/TYPESCRIPT.md @@ -62,7 +62,7 @@ declare module '@elastic/eui' { 1. Open up the file and see how easy it would be to convert to TypeScript. 2. If it's very straightforward, go for it. 3. If it's not and you wish to stay focused on your own PR, get around the error by adding a type definition file in the same folder as the dependency, with the same name. -4. Minimally you will need to type what you are using in your PR. No need to go crazy to fully type the thing or you might be there for awhile depending on what's available. +4. Minimally you will need to type what you are using in your PR. No need to go crazy to fully type the thing or you might be there for a while depending on what's available. For example: diff --git a/rfcs/text/0001_lifecycle_setup.md b/rfcs/text/0001_lifecycle_setup.md index 01343b42f9a2..bff200ca7647 100644 --- a/rfcs/text/0001_lifecycle_setup.md +++ b/rfcs/text/0001_lifecycle_setup.md @@ -124,7 +124,7 @@ all services and plugins, and then adding an empty `start` where it is necessary. Functionality can then be moved from `setup`->`start` on a case-by-case. -If this change doesn't happen for awhile, then it might make sense to follow +If this change doesn't happen for a while, then it might make sense to follow the reverse process to ensure the least impact. The migration guide will be updated to reflect the `setup` and `start` diff --git a/src/plugins/data/public/search/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor.ts index e6eca16c5ca4..677ad0ccea67 100644 --- a/src/plugins/data/public/search/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor.ts @@ -170,7 +170,7 @@ export class SearchInterceptor { if (this.longRunningToast) return; this.longRunningToast = this.deps.toasts.addInfo( { - title: 'Your query is taking awhile', + title: 'Your query is taking a while', text: getLongQueryNotification({ application: this.deps.application, }), diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts index 927dc91f365b..9662b9e17248 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts @@ -51,7 +51,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { if (this.longRunningToast) return; this.longRunningToast = this.deps.toasts.addInfo( { - title: 'Your query is taking awhile', + title: 'Your query is taking a while', text: getLongQueryNotification({ cancel: this.cancelPending, runBeyondTimeout: this.runBeyondTimeout, From 53828dab35a95191ffb3467c33f5731847bb22f2 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 11 Aug 2020 15:24:21 +0300 Subject: [PATCH 02/25] [telemetry] update README to downplay ui_metrics (#74635) Co-authored-by: Elastic Machine --- src/plugins/usage_collection/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/usage_collection/README.md b/src/plugins/usage_collection/README.md index a828096f8604..4f0f10703c5e 100644 --- a/src/plugins/usage_collection/README.md +++ b/src/plugins/usage_collection/README.md @@ -10,8 +10,6 @@ To integrate with the telemetry services for usage collection of your feature, t All you need to provide is a `type` for organizing your fields, `schema` field to define the expected types of usage fields reported, and a `fetch` method for returning your usage data. Then you need to make the Telemetry service aware of the collector by registering it. -### New Platform - 1. Make sure `usageCollection` is in your optional Plugins: ```json @@ -205,6 +203,10 @@ There are a few ways you can test that your usage collector is working properly. # UI Metric app +The UI metrics implementation in its current state is not useful. We are working on improving the implementation to enable teams to use the data to visualize and gather information from what is being reported. Please refer to the telemetry team if you are interested in adding ui_metrics to your plugin. + +**Until a better implementation is introduced, please defer from adding any new ui metrics.** + ## Purpose The purpose of the UI Metric app is to provide a tool for gathering data on how users interact with From d91e024f66b4a8c71749f599e392b8de7a5cd6e7 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Tue, 11 Aug 2020 08:52:38 -0400 Subject: [PATCH 03/25] [SECURITY] Bugs css/inspect (#74711) * Fix inspection button when using topN * css left over --- .../components/configure_cases/index.tsx | 3 +++ .../common/components/header_global/index.tsx | 6 ++++-- .../public/common/components/top_n/index.tsx | 2 +- .../containers/use_global_time/index.test.tsx | 21 ++++++++++++++++++- .../containers/use_global_time/index.tsx | 8 ++++--- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx index e2e3a600a95f..63b271b8cce7 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx @@ -42,6 +42,9 @@ const FormWrapper = styled.div` padding-top: ${theme.eui.paddingSizes.xl}; padding-bottom: ${theme.eui.paddingSizes.xl}; + .euiFlyout { + z-index: ${theme.eui.euiZNavigation + 1}; + } `} `; diff --git a/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx b/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx index fbc3d62768d0..e05e3c2e9aeb 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx @@ -41,14 +41,15 @@ const FlexItem = styled(EuiFlexItem)` `; FlexItem.displayName = 'FlexItem'; -const FlexGroup = styled(EuiFlexGroup)<{ $globalFullScreen: boolean }>` - ${({ $globalFullScreen, theme }) => ` +const FlexGroup = styled(EuiFlexGroup)<{ $globalFullScreen: boolean; $hasSibling: boolean }>` + ${({ $globalFullScreen, $hasSibling, theme }) => ` border-bottom: ${theme.eui.euiBorderThin}; margin-bottom: 1px; padding-bottom: 4px; padding-left: ${theme.eui.paddingSizes.l}; padding-right: ${gutterTimeline}; ${$globalFullScreen ? 'display: none;' : ''} + ${$hasSibling ? `border-bottom: ${theme.eui.euiBorderThin};` : 'border-bottom-width: 0px;'} `} `; FlexGroup.displayName = 'FlexGroup'; @@ -75,6 +76,7 @@ export const HeaderGlobal = React.memo(({ hideDetectionEngine diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx index 807f1839973f..d71242329bcd 100644 --- a/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/top_n/index.tsx @@ -104,7 +104,7 @@ const StatefulTopNComponent: React.FC = ({ value, }) => { const kibana = useKibana(); - const { from, deleteQuery, setQuery, to } = useGlobalTime(); + const { from, deleteQuery, setQuery, to } = useGlobalTime(false); const options = getOptions( timelineId === TimelineId.active ? activeTimelineEventType : undefined diff --git a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx index 9d5f1740b027..07ce3551e328 100644 --- a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.test.tsx @@ -8,17 +8,22 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { useGlobalTime } from '.'; +const mockDispatch = jest.fn(); + jest.mock('react-redux', () => { const originalModule = jest.requireActual('react-redux'); return { ...originalModule, - useDispatch: jest.fn().mockReturnValue(jest.fn()), + useDispatch: () => mockDispatch, useSelector: jest.fn().mockReturnValue({ from: 0, to: 0 }), }; }); describe('useGlobalTime', () => { + beforeEach(() => { + mockDispatch.mockReset(); + }); test('returns memoized value', () => { const { result, rerender } = renderHook(() => useGlobalTime()); @@ -30,4 +35,18 @@ describe('useGlobalTime', () => { expect(result1.from).toBe(0); expect(result1.to).toBe(0); }); + + test('clear all queries at unmount', () => { + const { rerender } = renderHook(() => useGlobalTime()); + act(() => rerender()); + expect(mockDispatch.mock.calls[0][0].type).toEqual( + 'x-pack/security_solution/local/inputs/DELETE_ALL_QUERY' + ); + }); + + test('do NOT clear all queries at unmount', () => { + const { rerender } = renderHook(() => useGlobalTime(false)); + act(() => rerender()); + expect(mockDispatch.mock.calls.length).toBe(0); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx index b63616ecbcf5..52825caf9ce7 100644 --- a/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/use_global_time/index.tsx @@ -11,7 +11,7 @@ import { inputsSelectors } from '../../store'; import { inputsActions } from '../../store/actions'; import { SetQuery, DeleteQuery } from './types'; -export const useGlobalTime = () => { +export const useGlobalTime = (clearAllQuery: boolean = true) => { const dispatch = useDispatch(); const { from, to } = useSelector(inputsSelectors.globalTimeRangeSelector); const [isInitializing, setIsInitializing] = useState(true); @@ -32,9 +32,11 @@ export const useGlobalTime = () => { setIsInitializing(false); } return () => { - dispatch(inputsActions.deleteAllQuery({ id: 'global' })); + if (clearAllQuery) { + dispatch(inputsActions.deleteAllQuery({ id: 'global' })); + } }; - }, [dispatch, isInitializing]); + }, [clearAllQuery, dispatch, isInitializing]); const memoizedReturn = useMemo( () => ({ From 6c63b0d40b2a83ba07822790622769bfd2f56d8d Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Tue, 11 Aug 2020 07:54:58 -0500 Subject: [PATCH 04/25] Index pattern field list - transition away from extending array - introduce and use getAll() (#74718) - Introduce `indexPattern.fields.getAll()` and use where possible - Rename `index_patterns/fields/fields.mocks.ts.ts => index_patterns/fields/fields.mocks.ts` - FieldSpec - make `count` and `scripted` fields optional - use `indexPattern.fields.getByName` instead of filter where possible --- ...in-plugins-data-public.fieldlist.getall.md | 11 ++ ...na-plugin-plugins-data-public.fieldlist.md | 1 + ...ta-public.iindexpatternfieldlist.getall.md | 15 +++ ...gins-data-public.iindexpatternfieldlist.md | 1 + .../es_query/filters/exists_filter.test.ts | 2 +- .../es_query/filters/get_filter_field.test.ts | 2 +- .../es_query/filters/phrases_filter.test.ts | 2 +- .../index_patterns/fields/field_list.ts | 2 + .../{fields.mocks.ts.ts => fields.mocks.ts} | 0 .../fields/index_pattern_field.ts | 4 +- .../index_patterns/index_pattern.ts | 4 +- .../data/common/index_patterns/mocks.ts | 2 +- .../data/common/index_patterns/types.ts | 4 +- src/plugins/data/public/public.api.md | 4 + .../lib/get_index_pattern_field_list.ts | 6 +- .../components/table/table.test.tsx | 68 ++++++------ .../application/components/table/table.tsx | 8 +- .../edit_index_pattern/edit_index_pattern.tsx | 6 +- .../edit_index_pattern/tabs/tabs.tsx | 2 +- .../edit_index_pattern/tabs/utils.ts | 4 +- .../__snapshots__/field_editor.test.tsx.snap | 101 ++++-------------- .../components/scripting_help/test_script.tsx | 1 + .../field_editor/field_editor.test.tsx | 21 ++-- .../components/field_editor/field_editor.tsx | 8 +- .../public/control/list_control_factory.ts | 2 +- .../public/test_utils/get_deps_mock.tsx | 1 + .../public/helpers/arg_value_suggestions.ts | 3 + .../components/autocomplete/field.test.tsx | 2 +- .../autocomplete/field_value_lists.test.tsx | 2 +- .../autocomplete/field_value_match.test.tsx | 2 +- .../field_value_match_any.test.tsx | 2 +- .../components/autocomplete/helpers.test.ts | 2 +- .../use_field_value_autocomplete.test.ts | 2 +- .../components/autocomplete/operator.test.tsx | 2 +- .../exceptions/builder/entry_item.test.tsx | 2 +- .../builder/exception_item.test.tsx | 2 +- .../exceptions/builder/helpers.test.tsx | 2 +- .../exceptions/builder/index.test.tsx | 2 +- 38 files changed, 143 insertions(+), 164 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md rename src/plugins/data/common/index_patterns/fields/{fields.mocks.ts.ts => fields.mocks.ts} (100%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md new file mode 100644 index 000000000000..da29a4de9acc --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.getall.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldList](./kibana-plugin-plugins-data-public.fieldlist.md) > [getAll](./kibana-plugin-plugins-data-public.fieldlist.getall.md) + +## FieldList.getAll property + +Signature: + +```typescript +readonly getAll: () => IndexPatternField[]; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md index ef740575dff4..012b06943029 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldlist.md @@ -21,6 +21,7 @@ export declare class FieldList extends Array implements IInde | Property | Modifiers | Type | Description | | --- | --- | --- | --- | | [add](./kibana-plugin-plugins-data-public.fieldlist.add.md) | | (field: FieldSpec) => void | | +| [getAll](./kibana-plugin-plugins-data-public.fieldlist.getall.md) | | () => IndexPatternField[] | | | [getByName](./kibana-plugin-plugins-data-public.fieldlist.getbyname.md) | | (name: IndexPatternField['name']) => IndexPatternField | undefined | | | [getByType](./kibana-plugin-plugins-data-public.fieldlist.getbytype.md) | | (type: IndexPatternField['type']) => any[] | | | [remove](./kibana-plugin-plugins-data-public.fieldlist.remove.md) | | (field: IFieldType) => void | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md new file mode 100644 index 000000000000..070e36e303a8 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IIndexPatternFieldList](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.md) > [getAll](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md) + +## IIndexPatternFieldList.getAll() method + +Signature: + +```typescript +getAll(): IndexPatternField[]; +``` +Returns: + +`IndexPatternField[]` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md index 4ab012a2601d..b068c4804c0d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iindexpatternfieldlist.md @@ -15,6 +15,7 @@ export interface IIndexPatternFieldList extends Array | Method | Description | | --- | --- | | [add(field)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.add.md) | | +| [getAll()](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getall.md) | | | [getByName(name)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbyname.md) | | | [getByType(type)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.getbytype.md) | | | [remove(field)](./kibana-plugin-plugins-data-public.iindexpatternfieldlist.remove.md) | | diff --git a/src/plugins/data/common/es_query/filters/exists_filter.test.ts b/src/plugins/data/common/es_query/filters/exists_filter.test.ts index 065301986726..298ea7f49da5 100644 --- a/src/plugins/data/common/es_query/filters/exists_filter.test.ts +++ b/src/plugins/data/common/es_query/filters/exists_filter.test.ts @@ -19,7 +19,7 @@ import { buildExistsFilter, getExistsFilterField } from './exists_filter'; import { IIndexPattern } from '../../index_patterns'; -import { fields } from '../../index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../index_patterns/fields/fields.mocks'; describe('exists filter', function () { const indexPattern: IIndexPattern = ({ diff --git a/src/plugins/data/common/es_query/filters/get_filter_field.test.ts b/src/plugins/data/common/es_query/filters/get_filter_field.test.ts index 4329a45f84ef..3b27aa98cf5f 100644 --- a/src/plugins/data/common/es_query/filters/get_filter_field.test.ts +++ b/src/plugins/data/common/es_query/filters/get_filter_field.test.ts @@ -21,7 +21,7 @@ import { buildPhraseFilter } from './phrase_filter'; import { buildQueryFilter } from './query_string_filter'; import { getFilterField } from './get_filter_field'; import { IIndexPattern } from '../../index_patterns'; -import { fields } from '../../index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../index_patterns/fields/fields.mocks'; describe('getFilterField', function () { const indexPattern: IIndexPattern = ({ diff --git a/src/plugins/data/common/es_query/filters/phrases_filter.test.ts b/src/plugins/data/common/es_query/filters/phrases_filter.test.ts index 7fbab263ac04..ed42b63be7ec 100644 --- a/src/plugins/data/common/es_query/filters/phrases_filter.test.ts +++ b/src/plugins/data/common/es_query/filters/phrases_filter.test.ts @@ -19,7 +19,7 @@ import { buildPhrasesFilter, getPhrasesFilterField } from './phrases_filter'; import { IIndexPattern } from '../../index_patterns'; -import { fields } from '../../index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../index_patterns/fields/fields.mocks'; describe('phrases filter', function () { const indexPattern: IIndexPattern = ({ diff --git a/src/plugins/data/common/index_patterns/fields/field_list.ts b/src/plugins/data/common/index_patterns/fields/field_list.ts index 207002f42bbc..172da9f9ca43 100644 --- a/src/plugins/data/common/index_patterns/fields/field_list.ts +++ b/src/plugins/data/common/index_patterns/fields/field_list.ts @@ -27,6 +27,7 @@ type FieldMap = Map; export interface IIndexPatternFieldList extends Array { add(field: FieldSpec): void; + getAll(): IndexPatternField[]; getByName(name: IndexPatternField['name']): IndexPatternField | undefined; getByType(type: IndexPatternField['type']): IndexPatternField[]; remove(field: IFieldType): void; @@ -72,6 +73,7 @@ export class FieldList extends Array implements IIndexPattern specs.map((field) => this.add(field)); } + public readonly getAll = () => [...this.byName.values()]; public readonly getByName = (name: IndexPatternField['name']) => this.byName.get(name); public readonly getByType = (type: IndexPatternField['type']) => [ ...(this.groups.get(type) || new Map()).values(), diff --git a/src/plugins/data/common/index_patterns/fields/fields.mocks.ts.ts b/src/plugins/data/common/index_patterns/fields/fields.mocks.ts similarity index 100% rename from src/plugins/data/common/index_patterns/fields/fields.mocks.ts.ts rename to src/plugins/data/common/index_patterns/fields/fields.mocks.ts diff --git a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts index 4e22332bef14..679de103f801 100644 --- a/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts +++ b/src/plugins/data/common/index_patterns/fields/index_pattern_field.ts @@ -62,7 +62,7 @@ export class IndexPatternField implements IFieldType { // writable attrs public get count() { - return this.spec.count; + return this.spec.count || 0; } public set count(count) { @@ -107,7 +107,7 @@ export class IndexPatternField implements IFieldType { } public get scripted() { - return this.spec.scripted; + return !!this.spec.scripted; } public get searchable() { diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts index 211919e8e6b5..4e484dce7826 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts @@ -403,11 +403,11 @@ export class IndexPattern implements IIndexPattern { } getNonScriptedFields() { - return [...this.fields.filter((field) => !field.scripted)]; + return [...this.fields.getAll().filter((field) => !field.scripted)]; } getScriptedFields() { - return [...this.fields.filter((field) => field.scripted)]; + return [...this.fields.getAll().filter((field) => field.scripted)]; } isTimeBased(): boolean { diff --git a/src/plugins/data/common/index_patterns/mocks.ts b/src/plugins/data/common/index_patterns/mocks.ts index 6036c08fa2b1..faf1b8307ea2 100644 --- a/src/plugins/data/common/index_patterns/mocks.ts +++ b/src/plugins/data/common/index_patterns/mocks.ts @@ -17,4 +17,4 @@ * under the License. */ -export * from './fields/fields.mocks.ts'; +export * from './fields/fields.mocks'; diff --git a/src/plugins/data/common/index_patterns/types.ts b/src/plugins/data/common/index_patterns/types.ts index 3a7cf54843df..a771113acd23 100644 --- a/src/plugins/data/common/index_patterns/types.ts +++ b/src/plugins/data/common/index_patterns/types.ts @@ -149,7 +149,7 @@ export interface FieldSpecExportFmt { } export interface FieldSpec { - count: number; + count?: number; script?: string; lang?: string; conflictDescriptions?: Record; @@ -158,7 +158,7 @@ export interface FieldSpec { name: string; type: string; esTypes?: string[]; - scripted: boolean; + scripted?: boolean; searchable: boolean; aggregatable: boolean; readFromDocValues?: boolean; diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 76f88df4dd6f..adff7b205b93 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -585,6 +585,8 @@ export class FieldList extends Array implements IIndexPattern // (undocumented) readonly add: (field: FieldSpec) => void; // (undocumented) + readonly getAll: () => IndexPatternField[]; + // (undocumented) readonly getByName: (name: IndexPatternField['name']) => IndexPatternField | undefined; // (undocumented) readonly getByType: (type: IndexPatternField['type']) => any[]; @@ -879,6 +881,8 @@ export interface IIndexPatternFieldList extends Array { // (undocumented) add(field: FieldSpec): void; // (undocumented) + getAll(): IndexPatternField[]; + // (undocumented) getByName(name: IndexPatternField['name']): IndexPatternField | undefined; // (undocumented) getByType(type: IndexPatternField['type']): IndexPatternField[]; diff --git a/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts b/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts index 751a59d98215..00e00aa8e299 100644 --- a/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts +++ b/src/plugins/discover/public/application/components/sidebar/lib/get_index_pattern_field_list.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { difference, map } from 'lodash'; +import { difference } from 'lodash'; import { IndexPattern, IndexPatternField } from 'src/plugins/data/public'; export function getIndexPatternFieldList( @@ -26,7 +26,7 @@ export function getIndexPatternFieldList( if (!indexPattern || !fieldCounts) return []; const fieldNamesInDocs = Object.keys(fieldCounts); - const fieldNamesInIndexPattern = map(indexPattern.fields, 'name'); + const fieldNamesInIndexPattern = indexPattern.fields.getAll().map((fld) => fld.name); const unknownTypes: IndexPatternField[] = []; difference(fieldNamesInDocs, fieldNamesInIndexPattern).forEach((unknownFieldName) => { @@ -36,5 +36,5 @@ export function getIndexPatternFieldList( } as IndexPatternField); }); - return [...indexPattern.fields, ...unknownTypes]; + return [...indexPattern.fields.getAll(), ...unknownTypes]; } diff --git a/src/plugins/discover/public/application/components/table/table.test.tsx b/src/plugins/discover/public/application/components/table/table.test.tsx index 0793072fd0cf..29659b396936 100644 --- a/src/plugins/discover/public/application/components/table/table.test.tsx +++ b/src/plugins/discover/public/application/components/table/table.test.tsx @@ -24,45 +24,47 @@ import { DocViewTable } from './table'; import { indexPatterns, IndexPattern } from '../../../../../data/public'; const indexPattern = { - fields: [ - { - name: '_index', - type: 'string', - scripted: false, - filterable: true, - }, - { - name: 'message', - type: 'string', - scripted: false, - filterable: false, - }, - { - name: 'extension', - type: 'string', - scripted: false, - filterable: true, - }, - { - name: 'bytes', - type: 'number', - scripted: false, - filterable: true, - }, - { - name: 'scripted', - type: 'number', - scripted: true, - filterable: false, - }, - ], + fields: { + getAll: () => [ + { + name: '_index', + type: 'string', + scripted: false, + filterable: true, + }, + { + name: 'message', + type: 'string', + scripted: false, + filterable: false, + }, + { + name: 'extension', + type: 'string', + scripted: false, + filterable: true, + }, + { + name: 'bytes', + type: 'number', + scripted: false, + filterable: true, + }, + { + name: 'scripted', + type: 'number', + scripted: true, + filterable: false, + }, + ], + }, metaFields: ['_index', '_score'], flattenHit: undefined, formatHit: jest.fn((hit) => hit._source), } as IndexPattern; indexPattern.fields.getByName = (name: string) => { - return indexPattern.fields.find((field) => field.name === name); + return indexPattern.fields.getAll().find((field) => field.name === name); }; indexPattern.flattenHit = indexPatterns.flattenHitWrapper(indexPattern, indexPattern.metaFields); diff --git a/src/plugins/discover/public/application/components/table/table.tsx b/src/plugins/discover/public/application/components/table/table.tsx index 9b95f2fc6bd2..628045bd32f6 100644 --- a/src/plugins/discover/public/application/components/table/table.tsx +++ b/src/plugins/discover/public/application/components/table/table.tsx @@ -104,15 +104,13 @@ export function DocViewTable({ // to the index pattern, but that has its own complications which you can read more about in the following // issue: https://github.com/elastic/kibana/issues/54957 const isNestedField = - !indexPattern.fields.find((patternField) => patternField.name === field) && - !!indexPattern.fields.find((patternField) => { + !indexPattern.fields.getByName(field) && + !!indexPattern.fields.getAll().find((patternField) => { // We only want to match a full path segment const nestedRootRegex = new RegExp(escapeRegExp(field) + '(\\.|$)'); return nestedRootRegex.test(patternField.subType?.nested?.path ?? ''); }); - const fieldType = isNestedField - ? 'nested' - : indexPattern.fields.find((patternField) => patternField.name === field)?.type; + const fieldType = isNestedField ? 'nested' : indexPattern.fields.getByName(field)?.type; return ( ().services; const [fields, setFields] = useState(indexPattern.getNonScriptedFields()); const [conflictedFields, setConflictedFields] = useState( - indexPattern.fields.filter((field) => field.type === 'conflict') + indexPattern.fields.getAll().filter((field) => field.type === 'conflict') ); const [defaultIndex, setDefaultIndex] = useState(uiSettings.get('defaultIndex')); const [tags, setTags] = useState([]); useEffect(() => { setFields(indexPattern.getNonScriptedFields()); - setConflictedFields(indexPattern.fields.filter((field) => field.type === 'conflict')); + setConflictedFields( + indexPattern.fields.getAll().filter((field) => field.type === 'conflict') + ); }, [indexPattern]); useEffect(() => { diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx index a59dca80a368..f32eb63ad04b 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx @@ -87,7 +87,7 @@ export function Tabs({ indexPattern, fields, history, location }: TabsProps) { const refreshFilters = useCallback(() => { const tempIndexedFieldTypes: string[] = []; const tempScriptedFieldLanguages: string[] = []; - indexPattern.fields.forEach((field) => { + indexPattern.fields.getAll().forEach((field) => { if (field.scripted) { if (field.lang) { tempScriptedFieldLanguages.push(field.lang); diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts index 5ab9c695caaa..b422de93de7a 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.ts @@ -84,9 +84,9 @@ export function getTabs( fieldFilter: string, indexPatternListProvider: IndexPatternManagementStart['list'] ) { - const totalCount = getCounts(indexPattern.fields, indexPattern.getSourceFiltering()); + const totalCount = getCounts(indexPattern.fields.getAll(), indexPattern.getSourceFiltering()); const filteredCount = getCounts( - indexPattern.fields, + indexPattern.fields.getAll(), indexPattern.getSourceFiltering(), fieldFilter ); diff --git a/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap b/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap index c22160bc4036..3f4190eed917 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap +++ b/src/plugins/index_pattern_management/public/components/field_editor/__snapshots__/field_editor.test.tsx.snap @@ -25,11 +25,10 @@ exports[`FieldEditor should render create new scripted field correctly 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -261,19 +260,10 @@ exports[`FieldEditor should render edit scripted field correctly 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -504,27 +494,10 @@ exports[`FieldEditor should show conflict field warning 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - Object { - "format": Format {}, - "lang": "testlang", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -784,27 +757,10 @@ exports[`FieldEditor should show deprecated lang warning 1`] = ` executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - Object { - "format": Format {}, - "lang": "testlang", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } @@ -1116,27 +1072,10 @@ exports[`FieldEditor should show multiple type field warning with a table contai executeScript={[Function]} indexPattern={ Object { - "fields": Array [ - Object { - "name": "foobar", - }, - Object { - "format": Format {}, - "lang": "painless", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - Object { - "format": Format {}, - "lang": "testlang", - "name": "test", - "script": "doc.test.value", - "scripted": true, - "type": "number", - }, - ], + "fields": Object { + "getAll": [Function], + "getByName": [Function], + }, "getFormatterForField": [Function], } } diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx index cb1d5a25c01a..77c6698fdc33 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/test_script.tsx @@ -188,6 +188,7 @@ export class TestScript extends Component { const fields: EuiComboBoxOptionOption[] = []; this.props.indexPattern.fields + .getAll() .filter((field) => { const isMultiField = field.subType && field.subType.multi; return !field.name.startsWith('_') && !isMultiField && !field.scripted; diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx index ba1f2ff4b665..96d3fc549ece 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx @@ -17,12 +17,7 @@ * under the License. */ -import { - IndexPattern, - IndexPatternField, - IIndexPatternFieldList, - FieldFormatInstanceType, -} from 'src/plugins/data/public'; +import { IndexPattern, IndexPatternField, FieldFormatInstanceType } from 'src/plugins/data/public'; jest.mock('brace/mode/groovy', () => ({})); @@ -71,15 +66,19 @@ jest.mock('./components/field_format_editor', () => ({ FieldFormatEditor: 'field-format-editor', })); -const fields: IndexPatternField[] = [ +const fieldList = [ { name: 'foobar', } as IndexPatternField, ]; +const fields = { + getAll: () => fieldList, +}; + // @ts-ignore fields.getByName = (name: string) => { - return fields.find((field) => field.name === name); + return fields.getAll().find((field) => field.name === name); }; class Format { @@ -112,7 +111,7 @@ describe('FieldEditor', () => { beforeEach(() => { indexPattern = ({ - fields: fields as IIndexPatternFieldList, + fields, getFormatterForField: () => ({ params: () => ({}) }), } as unknown) as IndexPattern; }); @@ -139,7 +138,7 @@ describe('FieldEditor', () => { name: 'test', script: 'doc.test.value', }; - indexPattern.fields.push(testField as IndexPatternField); + fieldList.push(testField as IndexPatternField); indexPattern.fields.getByName = (name) => { const flds = { [testField.name]: testField, @@ -169,7 +168,7 @@ describe('FieldEditor', () => { script: 'doc.test.value', lang: 'testlang', }; - indexPattern.fields.push((testField as unknown) as IndexPatternField); + fieldList.push((testField as unknown) as IndexPatternField); indexPattern.fields.getByName = (name) => { const flds = { [testField.name]: testField, diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx index d78e1e101458..6a3f632a9582 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.tsx @@ -155,7 +155,7 @@ export class FieldEditor extends PureComponent f.name), + existingFieldNames: indexPattern.fields.getAll().map((f: IFieldType) => f.name), fieldFormatId: undefined, fieldFormatParams: {}, showScriptingHelp: false, @@ -197,7 +197,7 @@ export class FieldEditor extends PureComponent f.name === spec.name), + isCreating: !indexPattern.fields.getByName(spec.name), isDeprecatedLang: this.deprecatedLangs.includes(spec.lang || ''), errors: [], scriptingLangs, @@ -804,11 +804,11 @@ export class FieldEditor extends PureComponent f.name === field.name); + const fieldExists = !!indexPattern.fields.getByName(field.name); let oldField: IndexPatternField['spec']; - if (index > -1) { + if (fieldExists) { oldField = indexPattern.fields.getByName(field.name)!.spec; indexPattern.fields.update(field); } else { diff --git a/src/plugins/input_control_vis/public/control/list_control_factory.ts b/src/plugins/input_control_vis/public/control/list_control_factory.ts index 65a3e37a93ed..acbbf08c7d00 100644 --- a/src/plugins/input_control_vis/public/control/list_control_factory.ts +++ b/src/plugins/input_control_vis/public/control/list_control_factory.ts @@ -216,7 +216,7 @@ export async function listControlFactory( // dynamic options are only allowed on String fields but the setting defaults to true so it could // be enabled for non-string fields (since UI input is hidden for non-string fields). // If field is not string, then disable dynamic options. - const field = indexPattern.fields.find(({ name }) => name === controlParams.fieldName); + const field = indexPattern.fields.getAll().find(({ name }) => name === controlParams.fieldName); if (field && field.type !== 'string') { controlParams.options.dynamicOptions = false; } diff --git a/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx b/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx index feedcab1850e..f72bc96f9e7c 100644 --- a/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx +++ b/src/plugins/input_control_vis/public/test_utils/get_deps_mock.tsx @@ -26,6 +26,7 @@ fields.push({ name: 'myField' } as any); fields.getByName = (name: any) => { return fields.find(({ name: n }: { name: string }) => n === name); }; +fields.getAll = () => [...fields]; export const getDepsMock = ({ searchSource = { diff --git a/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts b/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts index 19ec46bd7f65..85d41aab5859 100644 --- a/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts +++ b/src/plugins/vis_type_timelion/public/helpers/arg_value_suggestions.ts @@ -117,6 +117,7 @@ export function getArgValueSuggestions() { const valueSplit = partial.split(':'); return indexPattern.fields + .getAll() .filter((field) => { return ( field.aggregatable && @@ -136,6 +137,7 @@ export function getArgValueSuggestions() { } return indexPattern.fields + .getAll() .filter((field) => { return ( field.aggregatable && @@ -155,6 +157,7 @@ export function getArgValueSuggestions() { } return indexPattern.fields + .getAll() .filter((field) => { return ( 'date' === field.type && diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx index 30864f246071..a678deae4154 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field.test.tsx @@ -12,7 +12,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { fields, getField, -} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { FieldComponent } from './field'; describe('FieldComponent', () => { diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx index eca38b9effe1..eef6e09d496d 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_lists.test.tsx @@ -11,7 +11,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; // we don't have the types for waitFor just yet, so using "as waitFor" until when we do import { wait as waitFor } from '@testing-library/react'; -import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { ListSchema } from '../../../lists_plugin_deps'; import { getFoundListSchemaMock } from '../../../../../lists/common/schemas/response/found_list_schema.mock'; import { getListResponseMock } from '../../../../../lists/common/schemas/response/list_schema.mock'; diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx index 998ed1f3351c..94040ccb639b 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match.test.tsx @@ -12,7 +12,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { fields, getField, -} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { AutocompleteFieldMatchComponent } from './field_value_match'; import { useFieldValueAutocomplete } from './hooks/use_field_value_autocomplete'; jest.mock('./hooks/use_field_value_autocomplete'); diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx index 0a0281a9c4a5..4074150f76d0 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field_value_match_any.test.tsx @@ -12,7 +12,7 @@ import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; import { fields, getField, -} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { AutocompleteFieldMatchAnyComponent } from './field_value_match_any'; import { useFieldValueAutocomplete } from './hooks/use_field_value_autocomplete'; jest.mock('./hooks/use_field_value_autocomplete'); diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts b/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts index 289cdd5e87c0..bbcbcbcf928b 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.test.ts @@ -5,7 +5,7 @@ */ import '../../../common/mock/match_media'; -import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { EXCEPTION_OPERATORS, diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts b/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts index a76b50d11a87..82e9c21f6b83 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/hooks/use_field_value_autocomplete.test.ts @@ -13,7 +13,7 @@ import { } from './use_field_value_autocomplete'; import { useKibana } from '../../../../common/lib/kibana'; import { stubIndexPatternWithFields } from '../../../../../../../../src/plugins/data/common/index_patterns/index_pattern.stub'; -import { getField } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { OperatorTypeEnum } from '../../../../lists_plugin_deps'; jest.mock('../../../../common/lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx index 737be199e248..e6f622781108 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/operator.test.tsx @@ -9,7 +9,7 @@ import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { EuiComboBox, EuiComboBoxOptionOption } from '@elastic/eui'; -import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { getField } from '../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { OperatorComponent } from './operator'; import { isOperator, isNotOperator } from './operators'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx index 2a116c4cd8ac..59a5db2a0977 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.test.tsx @@ -22,7 +22,7 @@ import { import { fields, getField, -} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getFoundListSchemaMock } from '../../../../../../lists/common/schemas/response/found_list_schema.mock'; import { getEmptyValue } from '../../empty_value'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx index e90639a2c028..0f9be25e046b 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { useKibana } from '../../../../common/lib/kibana'; -import { fields } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +import { fields } from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getExceptionListItemSchemaMock } from '../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; import { getEntryMatchMock } from '../../../../../../lists/common/schemas/types/entry_match.mock'; import { getEntryMatchAnyMock } from '../../../../../../lists/common/schemas/types/entry_match_any.mock'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx index 04ab9ee7216f..9bfd04cc19d7 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx @@ -6,7 +6,7 @@ import { fields, getField, -} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getEntryNestedMock } from '../../../../../../lists/common/schemas/types/entry_nested.mock'; import { getEntryMatchMock } from '../../../../../../lists/common/schemas/types/entry_match.mock'; import { getEntryMatchAnyMock } from '../../../../../../lists/common/schemas/types/entry_match_any.mock'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx index 3fa0e59f9acb..2d389a7dbcee 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/index.test.tsx @@ -13,7 +13,7 @@ import { wait as waitFor } from '@testing-library/react'; import { fields, getField, -} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks.ts'; +} from '../../../../../../../../src/plugins/data/common/index_patterns/fields/fields.mocks'; import { getExceptionListItemSchemaMock } from '../../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; import { getEntryMatchAnyMock } from '../../../../../../lists/common/schemas/types/entry_match_any.mock'; From 9782ac4b7ff9374e32500afcf6c25470b7b4b00f Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 11 Aug 2020 06:47:33 -0700 Subject: [PATCH 05/25] Bump chalk to 4.1.0 (#73397) https://github.com/chalk/chalk/releases Signed-off-by: Tyler Smalley Co-authored-by: Elastic Machine --- packages/kbn-dev-utils/package.json | 2 +- packages/kbn-es/package.json | 2 +- packages/kbn-plugin-generator/package.json | 2 +- packages/kbn-pm/dist/index.js | 20099 +++++++++++-------- packages/kbn-pm/package.json | 2 +- packages/kbn-test/package.json | 2 +- packages/kbn-ui-framework/package.json | 2 +- src/dev/typescript/exec_in_projects.ts | 2 +- x-pack/package.json | 2 +- yarn.lock | 8 +- 10 files changed, 11448 insertions(+), 8675 deletions(-) diff --git a/packages/kbn-dev-utils/package.json b/packages/kbn-dev-utils/package.json index 83a7a7607816..7ce433f80bed 100644 --- a/packages/kbn-dev-utils/package.json +++ b/packages/kbn-dev-utils/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "axios": "^0.19.0", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "execa": "^4.0.2", "exit-hook": "^2.2.0", diff --git a/packages/kbn-es/package.json b/packages/kbn-es/package.json index f53eb694ec71..c3670f648d30 100644 --- a/packages/kbn-es/package.json +++ b/packages/kbn-es/package.json @@ -8,7 +8,7 @@ "@elastic/elasticsearch": "7.9.0-rc.1", "@kbn/dev-utils": "1.0.0", "abort-controller": "^2.0.3", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "del": "^5.1.0", "execa": "^4.0.2", diff --git a/packages/kbn-plugin-generator/package.json b/packages/kbn-plugin-generator/package.json index 5c1e98cd869d..0803e498279f 100644 --- a/packages/kbn-plugin-generator/package.json +++ b/packages/kbn-plugin-generator/package.json @@ -4,7 +4,7 @@ "private": true, "version": "1.0.0", "dependencies": { - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "execa": "^4.0.2", "getopts": "^2.2.4", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index b8794124ad19..ee141e1d8ab7 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,21 +94,21 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(498); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(511); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildProductionProjects"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return _utils_projects__WEBPACK_IMPORTED_MODULE_2__["getProjects"]; }); -/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(162); +/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(163); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return _utils_project__WEBPACK_IMPORTED_MODULE_3__["Project"]; }); -/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(271); +/* harmony import */ var _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(287); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return _utils_workspaces__WEBPACK_IMPORTED_MODULE_4__["copyWorkspacePackages"]; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(272); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(288); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return _config__WEBPACK_IMPORTED_MODULE_5__["getProjectPaths"]; }); /* @@ -151,9 +151,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(126); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(490); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(142); +/* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(127); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(503); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -568,10 +568,10 @@ var tooling_log_1 = __webpack_require__(6); Object.defineProperty(exports, "ToolingLog", { enumerable: true, get: function () { return tooling_log_1.ToolingLog; } }); var tooling_log_text_writer_1 = __webpack_require__(110); Object.defineProperty(exports, "ToolingLogTextWriter", { enumerable: true, get: function () { return tooling_log_text_writer_1.ToolingLogTextWriter; } }); -var log_levels_1 = __webpack_require__(124); +var log_levels_1 = __webpack_require__(125); Object.defineProperty(exports, "pickLevelFromFlags", { enumerable: true, get: function () { return log_levels_1.pickLevelFromFlags; } }); Object.defineProperty(exports, "parseLogLevel", { enumerable: true, get: function () { return log_levels_1.parseLogLevel; } }); -var tooling_log_collecting_writer_1 = __webpack_require__(125); +var tooling_log_collecting_writer_1 = __webpack_require__(126); Object.defineProperty(exports, "ToolingLogCollectingWriter", { enumerable: true, get: function () { return tooling_log_collecting_writer_1.ToolingLogCollectingWriter; } }); @@ -6594,7 +6594,7 @@ exports.ToolingLogTextWriter = void 0; const tslib_1 = __webpack_require__(7); const util_1 = __webpack_require__(111); const chalk_1 = tslib_1.__importDefault(__webpack_require__(112)); -const log_levels_1 = __webpack_require__(124); +const log_levels_1 = __webpack_require__(125); const { magentaBright, yellow, red, blue, green, dim } = chalk_1.default; const PREFIX_INDENT = ' '.repeat(6); const MSG_PREFIXES = { @@ -6672,233 +6672,234 @@ module.exports = require("util"); "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(114); -const stdoutColor = __webpack_require__(120).stdout; - -const template = __webpack_require__(123); +const ansiStyles = __webpack_require__(113); +const {stdout: stdoutColor, stderr: stderrColor} = __webpack_require__(119); +const { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex +} = __webpack_require__(123); -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); +const {isArray} = Array; // `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; - -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); +const levelMapping = [ + 'ansi', + 'ansi', + 'ansi256', + 'ansi16m' +]; const styles = Object.create(null); -function applyOptions(obj, options) { - options = options || {}; +const applyOptions = (object, options = {}) => { + if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) { + throw new Error('The `level` option should be an integer from 0 to 3'); + } // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; + const colorLevel = stdoutColor ? stdoutColor.level : 0; + object.level = options.level === undefined ? colorLevel : options.level; +}; + +class ChalkClass { + constructor(options) { + // eslint-disable-next-line no-constructor-return + return chalkFactory(options); + } } -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +const chalkFactory = options => { + const chalk = {}; + applyOptions(chalk, options); - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; + chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); - chalk.template.constructor = Chalk; + chalk.template.constructor = () => { + throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.'); + }; - return chalk.template; - } + chalk.template.Instance = ChalkClass; - applyOptions(this, options); -} + return chalk.template; +}; -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; +function Chalk(options) { + return chalkFactory(options); } -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - - styles[key] = { +for (const [styleName, style] of Object.entries(ansiStyles)) { + styles[styleName] = { get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty); + Object.defineProperty(this, styleName, {value: builder}); + return builder; } }; } styles.visible = { get() { - return build.call(this, this._styles || [], true, 'visible'); + const builder = createBuilder(this, this._styler, true); + Object.defineProperty(this, 'visible', {value: builder}); + return builder; } }; -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } +const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256']; +for (const model of usedModels) { styles[model] = { get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); + return createBuilder(this, styler, this._isEmpty); }; } }; } -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } - +for (const model of usedModels) { const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); styles[bgModel] = { get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); + return createBuilder(this, styler, this._isEmpty); }; } }; } -const proto = Object.defineProperties(() => {}, styles); - -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder._empty = _empty; - - const self = this; - - Object.defineProperty(builder, 'level', { +const proto = Object.defineProperties(() => {}, { + ...styles, + level: { enumerable: true, get() { - return self.level; + return this._generator.level; }, set(level) { - self.level = level; + this._generator.level = level; } - }); + } +}); - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; +const createStyler = (open, close, parent) => { + let openAll; + let closeAll; + if (parent === undefined) { + openAll = open; + closeAll = close; + } else { + openAll = parent.openAll + open; + closeAll = close + parent.closeAll; + } + + return { + open, + close, + openAll, + closeAll, + parent + }; +}; + +const createBuilder = (self, _styler, _isEmpty) => { + const builder = (...arguments_) => { + if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) { + // Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}` + return applyStyle(builder, chalkTag(builder, ...arguments_)); } - }); - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + // Single argument is hot path, implicit coercion is faster than anything + // eslint-disable-next-line no-implicit-coercion + return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); + }; - // `__proto__` is used because we must return a function, but there is + // We alter the prototype because we must return a function, but there is // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto + Object.setPrototypeOf(builder, proto); - return builder; -} + builder._generator = self; + builder._styler = _styler; + builder._isEmpty = _isEmpty; -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); + return builder; +}; - if (argsLen === 0) { - return ''; +const applyStyle = (self, string) => { + if (self.level <= 0 || !string) { + return self._isEmpty ? '' : string; } - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } + let styler = self._styler; - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; + if (styler === undefined) { + return string; } - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } + const {openAll, closeAll} = styler; + if (string.indexOf('\u001B') !== -1) { + while (styler !== undefined) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + string = stringReplaceAll(string, styler.close, styler.open); - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; + styler = styler.parent; + } + } - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + // We can move both next actions out of loop, because remaining actions in loop won't have + // any/visible effect on parts we add here. Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92 + const lfIndex = string.indexOf('\n'); + if (lfIndex !== -1) { + string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex); } - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; + return openAll + string + closeAll; +}; - return str; -} +let template; +const chalkTag = (chalk, ...strings) => { + const [firstString] = strings; -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { + if (!isArray(firstString) || !isArray(firstString.raw)) { // If chalk() was called by itself or with a string, // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); + return strings.join(' '); } - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; + const arguments_ = strings.slice(1); + const parts = [firstString.raw[0]]; - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); + for (let i = 1; i < firstString.length; i++) { + parts.push( + String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), + String(firstString.raw[i]) + ); + } + + if (template === undefined) { + template = __webpack_require__(124); } return template(chalk, parts.join('')); -} +}; Object.defineProperties(Chalk.prototype, styles); -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +const chalk = Chalk(); // eslint-disable-line new-cap +chalk.supportsColor = stdoutColor; +chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap +chalk.stderr.supportsColor = stderrColor; + +module.exports = chalk; /***/ }), @@ -6906,40 +6907,64 @@ module.exports.default = module.exports; // For TypeScript /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; - -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; - return str.replace(matchOperatorsRe, '\\$&'); +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; }; +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); -"use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; + return value; + }, + enumerable: true, + configurable: true + }); }; -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = __webpack_require__(115); + } -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; + const offset = isBackground ? 10 : 0; + const styles = {}; + + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } + + return styles; }; function assembleStyles() { @@ -6965,9 +6990,9 @@ function assembleStyles() { magenta: [35, 39], cyan: [36, 39], white: [37, 39], - gray: [90, 39], // Bright color + blackBright: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], @@ -6998,15 +7023,14 @@ function assembleStyles() { } }; - // Fix humans - styles.color.grey = styles.color.gray; - - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; - - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { styles[styleName] = { open: `\u001B[${style[0]}m`, close: `\u001B[${style[1]}m` @@ -7021,65 +7045,22 @@ function assembleStyles() { value: group, enumerable: false }); - - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); } - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); styles.color.close = '\u001B[39m'; styles.bgColor.close = '\u001B[49m'; - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; - - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; - - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } - - const suite = colorConvert[key]; - - if (key === 'ansi16') { - key = 'ansi'; - } - - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } - - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); return styles; } @@ -7090,10 +7071,10 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 115 */ +/* 114 */ /***/ (function(module, exports) { module.exports = function(module) { @@ -7121,30 +7102,31 @@ module.exports = function(module) { /***/ }), -/* 116 */ +/* 115 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(117); -var route = __webpack_require__(119); +const conversions = __webpack_require__(116); +const route = __webpack_require__(118); -var convert = {}; +const convert = {}; -var models = Object.keys(conversions); +const models = Object.keys(conversions); function wrapRaw(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; + const wrappedFn = function (...args) { + const arg0 = args[0]; + if (arg0 === undefined || arg0 === null) { + return arg0; } - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); + if (arg0.length > 1) { + args = arg0; } return fn(args); }; - // preserve .conversion property if there is one + // Preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } @@ -7153,22 +7135,24 @@ function wrapRaw(fn) { } function wrapRounded(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; + const wrappedFn = function (...args) { + const arg0 = args[0]; + + if (arg0 === undefined || arg0 === null) { + return arg0; } - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); + if (arg0.length > 1) { + args = arg0; } - var result = fn(args); + const result = fn(args); - // we're assuming the result is an array here. + // We're assuming the result is an array here. // see notice in conversions.js; don't use box types // in conversion functions. if (typeof result === 'object') { - for (var len = result.length, i = 0; i < len; i++) { + for (let len = result.length, i = 0; i < len; i++) { result[i] = Math.round(result[i]); } } @@ -7176,7 +7160,7 @@ function wrapRounded(fn) { return result; }; - // preserve .conversion property if there is one + // Preserve .conversion property if there is one if ('conversion' in fn) { wrappedFn.conversion = fn.conversion; } @@ -7184,17 +7168,17 @@ function wrapRounded(fn) { return wrappedFn; } -models.forEach(function (fromModel) { +models.forEach(fromModel => { convert[fromModel] = {}; Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - var routes = route(fromModel); - var routeModels = Object.keys(routes); + const routes = route(fromModel); + const routeModels = Object.keys(routes); - routeModels.forEach(function (toModel) { - var fn = routes[toModel]; + routeModels.forEach(toModel => { + const fn = routes[toModel]; convert[fromModel][toModel] = wrapRounded(fn); convert[fromModel][toModel].raw = wrapRaw(fn); @@ -7205,24 +7189,23 @@ module.exports = convert; /***/ }), -/* 117 */ +/* 116 */ /***/ (function(module, exports, __webpack_require__) { /* MIT license */ -var cssKeywords = __webpack_require__(118); +/* eslint-disable no-mixed-operators */ +const cssKeywords = __webpack_require__(117); // NOTE: conversions should only return primitive values (i.e. arrays, or // values that give correct `typeof` results). // do not use box values types (i.e. Number(), String(), etc.) -var reverseKeywords = {}; -for (var key in cssKeywords) { - if (cssKeywords.hasOwnProperty(key)) { - reverseKeywords[cssKeywords[key]] = key; - } +const reverseKeywords = {}; +for (const key of Object.keys(cssKeywords)) { + reverseKeywords[cssKeywords[key]] = key; } -var convert = module.exports = { +const convert = { rgb: {channels: 3, labels: 'rgb'}, hsl: {channels: 3, labels: 'hsl'}, hsv: {channels: 3, labels: 'hsv'}, @@ -7240,40 +7223,38 @@ var convert = module.exports = { gray: {channels: 1, labels: ['gray']} }; -// hide .channels and .labels properties -for (var model in convert) { - if (convert.hasOwnProperty(model)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } +module.exports = convert; - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } +// Hide .channels and .labels properties +for (const model of Object.keys(convert)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - var channels = convert[model].channels; - var labels = convert[model].labels; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); } + + const {channels, labels} = convert[model]; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); } convert.rgb.hsl = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var l; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; if (max === min) { h = 0; @@ -7291,7 +7272,7 @@ convert.rgb.hsl = function (rgb) { h += 360; } - l = (min + max) / 2; + const l = (min + max) / 2; if (max === min) { s = 0; @@ -7305,49 +7286,58 @@ convert.rgb.hsl = function (rgb) { }; convert.rgb.hsv = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var v; + let rdif; + let gdif; + let bdif; + let h; + let s; + + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const v = Math.max(r, g, b); + const diff = v - Math.min(r, g, b); + const diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; - if (max === 0) { + if (diff === 0) { + h = 0; s = 0; } else { - s = (delta / max * 1000) / 10; - } - - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } - - h = Math.min(h * 60, 360); + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } - if (h < 0) { - h += 360; + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } } - v = ((max / 255) * 1000) / 10; - - return [h, s, v]; + return [ + h * 360, + s * 100, + v * 100 + ]; }; convert.rgb.hwb = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var h = convert.rgb.hsl(rgb)[0]; - var w = 1 / 255 * Math.min(r, Math.min(g, b)); + const r = rgb[0]; + const g = rgb[1]; + let b = rgb[2]; + const h = convert.rgb.hsl(rgb)[0]; + const w = 1 / 255 * Math.min(r, Math.min(g, b)); b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); @@ -7355,54 +7345,48 @@ convert.rgb.hwb = function (rgb) { }; convert.rgb.cmyk = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var c; - var m; - var y; - var k; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; + const k = Math.min(1 - r, 1 - g, 1 - b); + const c = (1 - r - k) / (1 - k) || 0; + const m = (1 - g - k) / (1 - k) || 0; + const y = (1 - b - k) / (1 - k) || 0; return [c * 100, m * 100, y * 100, k * 100]; }; -/** - * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - * */ function comparativeDistance(x, y) { + /* + See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + */ return ( - Math.pow(x[0] - y[0], 2) + - Math.pow(x[1] - y[1], 2) + - Math.pow(x[2] - y[2], 2) + ((x[0] - y[0]) ** 2) + + ((x[1] - y[1]) ** 2) + + ((x[2] - y[2]) ** 2) ); } convert.rgb.keyword = function (rgb) { - var reversed = reverseKeywords[rgb]; + const reversed = reverseKeywords[rgb]; if (reversed) { return reversed; } - var currentClosestDistance = Infinity; - var currentClosestKeyword; + let currentClosestDistance = Infinity; + let currentClosestKeyword; - for (var keyword in cssKeywords) { - if (cssKeywords.hasOwnProperty(keyword)) { - var value = cssKeywords[keyword]; + for (const keyword of Object.keys(cssKeywords)) { + const value = cssKeywords[keyword]; - // Compute comparative distance - var distance = comparativeDistance(rgb, value); + // Compute comparative distance + const distance = comparativeDistance(rgb, value); - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; } } @@ -7414,55 +7398,50 @@ convert.keyword.rgb = function (keyword) { }; convert.rgb.xyz = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + // Assume sRGB + r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); + g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); + b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); return [x * 100, y * 100, z * 100]; }; convert.rgb.lab = function (rgb) { - var xyz = convert.rgb.xyz(rgb); - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + const xyz = convert.rgb.xyz(rgb); + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; x /= 95.047; y /= 100; z /= 108.883; - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); return [l, a, b]; }; convert.hsl.rgb = function (hsl) { - var h = hsl[0] / 360; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var t1; - var t2; - var t3; - var rgb; - var val; + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t2; + let t3; + let val; if (s === 0) { val = l * 255; @@ -7475,14 +7454,15 @@ convert.hsl.rgb = function (hsl) { t2 = l + s - l * s; } - t1 = 2 * l - t2; + const t1 = 2 * l - t2; - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { + const rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { t3 = h + 1 / 3 * -(i - 1); if (t3 < 0) { t3++; } + if (t3 > 1) { t3--; } @@ -7504,33 +7484,31 @@ convert.hsl.rgb = function (hsl) { }; convert.hsl.hsv = function (hsl) { - var h = hsl[0]; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var smin = s; - var lmin = Math.max(l, 0.01); - var sv; - var v; + const h = hsl[0]; + let s = hsl[1] / 100; + let l = hsl[2] / 100; + let smin = s; + const lmin = Math.max(l, 0.01); l *= 2; s *= (l <= 1) ? l : 2 - l; smin *= lmin <= 1 ? lmin : 2 - lmin; - v = (l + s) / 2; - sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); + const v = (l + s) / 2; + const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); return [h, sv * 100, v * 100]; }; convert.hsv.rgb = function (hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; - - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - (s * f)); - var t = 255 * v * (1 - (s * (1 - f))); + const h = hsv[0] / 60; + const s = hsv[1] / 100; + let v = hsv[2] / 100; + const hi = Math.floor(h) % 6; + + const f = h - Math.floor(h); + const p = 255 * v * (1 - s); + const q = 255 * v * (1 - (s * f)); + const t = 255 * v * (1 - (s * (1 - f))); v *= 255; switch (hi) { @@ -7550,16 +7528,15 @@ convert.hsv.rgb = function (hsv) { }; convert.hsv.hsl = function (hsv) { - var h = hsv[0]; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var vmin = Math.max(v, 0.01); - var lmin; - var sl; - var l; + const h = hsv[0]; + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const vmin = Math.max(v, 0.01); + let sl; + let l; l = (2 - s) * v; - lmin = (2 - s) * vmin; + const lmin = (2 - s) * vmin; sl = s * vmin; sl /= (lmin <= 1) ? lmin : 2 - lmin; sl = sl || 0; @@ -7570,87 +7547,83 @@ convert.hsv.hsl = function (hsv) { // http://dev.w3.org/csswg/css-color/#hwb-to-rgb convert.hwb.rgb = function (hwb) { - var h = hwb[0] / 360; - var wh = hwb[1] / 100; - var bl = hwb[2] / 100; - var ratio = wh + bl; - var i; - var v; - var f; - var n; + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let f; - // wh + bl cant be > 1 + // Wh + bl cant be > 1 if (ratio > 1) { wh /= ratio; bl /= ratio; } - i = Math.floor(6 * h); - v = 1 - bl; + const i = Math.floor(6 * h); + const v = 1 - bl; f = 6 * h - i; if ((i & 0x01) !== 0) { f = 1 - f; } - n = wh + f * (v - wh); // linear interpolation + const n = wh + f * (v - wh); // Linear interpolation - var r; - var g; - var b; + let r; + let g; + let b; + /* eslint-disable max-statements-per-line,no-multi-spaces */ switch (i) { default: case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; } + /* eslint-enable max-statements-per-line,no-multi-spaces */ return [r * 255, g * 255, b * 255]; }; convert.cmyk.rgb = function (cmyk) { - var c = cmyk[0] / 100; - var m = cmyk[1] / 100; - var y = cmyk[2] / 100; - var k = cmyk[3] / 100; - var r; - var g; - var b; + const c = cmyk[0] / 100; + const m = cmyk[1] / 100; + const y = cmyk[2] / 100; + const k = cmyk[3] / 100; - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); + const r = 1 - Math.min(1, c * (1 - k) + k); + const g = 1 - Math.min(1, m * (1 - k) + k); + const b = 1 - Math.min(1, y * (1 - k) + k); return [r * 255, g * 255, b * 255]; }; convert.xyz.rgb = function (xyz) { - var x = xyz[0] / 100; - var y = xyz[1] / 100; - var z = xyz[2] / 100; - var r; - var g; - var b; + const x = xyz[0] / 100; + const y = xyz[1] / 100; + const z = xyz[2] / 100; + let r; + let g; + let b; r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - // assume sRGB + // Assume sRGB r = r > 0.0031308 - ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055) : r * 12.92; g = g > 0.0031308 - ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055) : g * 12.92; b = b > 0.0031308 - ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055) : b * 12.92; r = Math.min(Math.max(0, r), 1); @@ -7661,43 +7634,40 @@ convert.xyz.rgb = function (xyz) { }; convert.xyz.lab = function (xyz) { - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; x /= 95.047; y /= 100; z /= 108.883; - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); return [l, a, b]; }; convert.lab.xyz = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var x; - var y; - var z; + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let x; + let y; + let z; y = (l + 16) / 116; x = a / 500 + y; z = y - b / 200; - var y2 = Math.pow(y, 3); - var x2 = Math.pow(x, 3); - var z2 = Math.pow(z, 3); + const y2 = y ** 3; + const x2 = x ** 3; + const z2 = z ** 3; y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; @@ -7710,45 +7680,38 @@ convert.lab.xyz = function (lab) { }; convert.lab.lch = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var hr; - var h; - var c; + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let h; - hr = Math.atan2(b, a); + const hr = Math.atan2(b, a); h = hr * 360 / 2 / Math.PI; if (h < 0) { h += 360; } - c = Math.sqrt(a * a + b * b); + const c = Math.sqrt(a * a + b * b); return [l, c, h]; }; convert.lch.lab = function (lch) { - var l = lch[0]; - var c = lch[1]; - var h = lch[2]; - var a; - var b; - var hr; + const l = lch[0]; + const c = lch[1]; + const h = lch[2]; - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); + const hr = h / 360 * 2 * Math.PI; + const a = c * Math.cos(hr); + const b = c * Math.sin(hr); return [l, a, b]; }; -convert.rgb.ansi16 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization +convert.rgb.ansi16 = function (args, saturation = null) { + const [r, g, b] = args; + let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization value = Math.round(value / 50); @@ -7756,7 +7719,7 @@ convert.rgb.ansi16 = function (args) { return 30; } - var ansi = 30 + let ansi = 30 + ((Math.round(b / 255) << 2) | (Math.round(g / 255) << 1) | Math.round(r / 255)); @@ -7769,17 +7732,17 @@ convert.rgb.ansi16 = function (args) { }; convert.hsv.ansi16 = function (args) { - // optimization here; we already know the value and don't need to get + // Optimization here; we already know the value and don't need to get // it converted for us. return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); }; convert.rgb.ansi256 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; + const r = args[0]; + const g = args[1]; + const b = args[2]; - // we use the extended greyscale palette here, with the exception of + // We use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (r === g && g === b) { if (r < 8) { @@ -7793,7 +7756,7 @@ convert.rgb.ansi256 = function (args) { return Math.round(((r - 8) / 247) * 24) + 232; } - var ansi = 16 + const ansi = 16 + (36 * Math.round(r / 255 * 5)) + (6 * Math.round(g / 255 * 5)) + Math.round(b / 255 * 5); @@ -7802,9 +7765,9 @@ convert.rgb.ansi256 = function (args) { }; convert.ansi16.rgb = function (args) { - var color = args % 10; + let color = args % 10; - // handle greyscale + // Handle greyscale if (color === 0 || color === 7) { if (args > 50) { color += 3.5; @@ -7815,71 +7778,71 @@ convert.ansi16.rgb = function (args) { return [color, color, color]; } - var mult = (~~(args > 50) + 1) * 0.5; - var r = ((color & 1) * mult) * 255; - var g = (((color >> 1) & 1) * mult) * 255; - var b = (((color >> 2) & 1) * mult) * 255; + const mult = (~~(args > 50) + 1) * 0.5; + const r = ((color & 1) * mult) * 255; + const g = (((color >> 1) & 1) * mult) * 255; + const b = (((color >> 2) & 1) * mult) * 255; return [r, g, b]; }; convert.ansi256.rgb = function (args) { - // handle greyscale + // Handle greyscale if (args >= 232) { - var c = (args - 232) * 10 + 8; + const c = (args - 232) * 10 + 8; return [c, c, c]; } args -= 16; - var rem; - var r = Math.floor(args / 36) / 5 * 255; - var g = Math.floor((rem = args % 36) / 6) / 5 * 255; - var b = (rem % 6) / 5 * 255; + let rem; + const r = Math.floor(args / 36) / 5 * 255; + const g = Math.floor((rem = args % 36) / 6) / 5 * 255; + const b = (rem % 6) / 5 * 255; return [r, g, b]; }; convert.rgb.hex = function (args) { - var integer = ((Math.round(args[0]) & 0xFF) << 16) + const integer = ((Math.round(args[0]) & 0xFF) << 16) + ((Math.round(args[1]) & 0xFF) << 8) + (Math.round(args[2]) & 0xFF); - var string = integer.toString(16).toUpperCase(); + const string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.hex.rgb = function (args) { - var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); if (!match) { return [0, 0, 0]; } - var colorString = match[0]; + let colorString = match[0]; if (match[0].length === 3) { - colorString = colorString.split('').map(function (char) { + colorString = colorString.split('').map(char => { return char + char; }).join(''); } - var integer = parseInt(colorString, 16); - var r = (integer >> 16) & 0xFF; - var g = (integer >> 8) & 0xFF; - var b = integer & 0xFF; + const integer = parseInt(colorString, 16); + const r = (integer >> 16) & 0xFF; + const g = (integer >> 8) & 0xFF; + const b = integer & 0xFF; return [r, g, b]; }; convert.rgb.hcg = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var max = Math.max(Math.max(r, g), b); - var min = Math.min(Math.min(r, g), b); - var chroma = (max - min); - var grayscale; - var hue; + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(Math.max(r, g), b); + const min = Math.min(Math.min(r, g), b); + const chroma = (max - min); + let grayscale; + let hue; if (chroma < 1) { grayscale = min / (1 - chroma); @@ -7896,7 +7859,7 @@ convert.rgb.hcg = function (rgb) { if (max === g) { hue = 2 + (b - r) / chroma; } else { - hue = 4 + (r - g) / chroma + 4; + hue = 4 + (r - g) / chroma; } hue /= 6; @@ -7906,17 +7869,12 @@ convert.rgb.hcg = function (rgb) { }; convert.hsl.hcg = function (hsl) { - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var c = 1; - var f = 0; + const s = hsl[1] / 100; + const l = hsl[2] / 100; - if (l < 0.5) { - c = 2.0 * s * l; - } else { - c = 2.0 * s * (1.0 - l); - } + const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l)); + let f = 0; if (c < 1.0) { f = (l - 0.5 * c) / (1.0 - c); } @@ -7925,11 +7883,11 @@ convert.hsl.hcg = function (hsl) { }; convert.hsv.hcg = function (hsv) { - var s = hsv[1] / 100; - var v = hsv[2] / 100; + const s = hsv[1] / 100; + const v = hsv[2] / 100; - var c = s * v; - var f = 0; + const c = s * v; + let f = 0; if (c < 1.0) { f = (v - c) / (1 - c); @@ -7939,20 +7897,21 @@ convert.hsv.hcg = function (hsv) { }; convert.hcg.rgb = function (hcg) { - var h = hcg[0] / 360; - var c = hcg[1] / 100; - var g = hcg[2] / 100; + const h = hcg[0] / 360; + const c = hcg[1] / 100; + const g = hcg[2] / 100; if (c === 0.0) { return [g * 255, g * 255, g * 255]; } - var pure = [0, 0, 0]; - var hi = (h % 1) * 6; - var v = hi % 1; - var w = 1 - v; - var mg = 0; + const pure = [0, 0, 0]; + const hi = (h % 1) * 6; + const v = hi % 1; + const w = 1 - v; + let mg = 0; + /* eslint-disable max-statements-per-line */ switch (Math.floor(hi)) { case 0: pure[0] = 1; pure[1] = v; pure[2] = 0; break; @@ -7967,6 +7926,7 @@ convert.hcg.rgb = function (hcg) { default: pure[0] = 1; pure[1] = 0; pure[2] = w; } + /* eslint-enable max-statements-per-line */ mg = (1.0 - c) * g; @@ -7978,11 +7938,11 @@ convert.hcg.rgb = function (hcg) { }; convert.hcg.hsv = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + const c = hcg[1] / 100; + const g = hcg[2] / 100; - var v = c + g * (1.0 - c); - var f = 0; + const v = c + g * (1.0 - c); + let f = 0; if (v > 0.0) { f = c / v; @@ -7992,11 +7952,11 @@ convert.hcg.hsv = function (hcg) { }; convert.hcg.hsl = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; + const c = hcg[1] / 100; + const g = hcg[2] / 100; - var l = g * (1.0 - c) + 0.5 * c; - var s = 0; + const l = g * (1.0 - c) + 0.5 * c; + let s = 0; if (l > 0.0 && l < 0.5) { s = c / (2 * l); @@ -8009,18 +7969,18 @@ convert.hcg.hsl = function (hcg) { }; convert.hcg.hwb = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - var v = c + g * (1.0 - c); + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1.0 - c); return [hcg[0], (v - c) * 100, (1 - v) * 100]; }; convert.hwb.hcg = function (hwb) { - var w = hwb[1] / 100; - var b = hwb[2] / 100; - var v = 1 - b; - var c = v - w; - var g = 0; + const w = hwb[1] / 100; + const b = hwb[2] / 100; + const v = 1 - b; + const c = v - w; + let g = 0; if (c < 1) { g = (v - c) / (1 - c); @@ -8041,10 +8001,12 @@ convert.gray.rgb = function (args) { return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; }; -convert.gray.hsl = convert.gray.hsv = function (args) { +convert.gray.hsl = function (args) { return [0, 0, args[0]]; }; +convert.gray.hsv = convert.gray.hsl; + convert.gray.hwb = function (gray) { return [0, 100, gray[0]]; }; @@ -8058,21 +8020,21 @@ convert.gray.lab = function (gray) { }; convert.gray.hex = function (gray) { - var val = Math.round(gray[0] / 100 * 255) & 0xFF; - var integer = (val << 16) + (val << 8) + val; + const val = Math.round(gray[0] / 100 * 255) & 0xFF; + const integer = (val << 16) + (val << 8) + val; - var string = integer.toString(16).toUpperCase(); + const string = integer.toString(16).toUpperCase(); return '000000'.substring(string.length) + string; }; convert.rgb.gray = function (rgb) { - var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + const val = (rgb[0] + rgb[1] + rgb[2]) / 3; return [val / 255 * 100]; }; /***/ }), -/* 118 */ +/* 117 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8231,13 +8193,13 @@ module.exports = { /***/ }), -/* 119 */ +/* 118 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(117); +const conversions = __webpack_require__(116); /* - this function routes a model to all other models. + This function routes a model to all other models. all functions that are routed have a property `.conversion` attached to the returned synthetic function. This property is an array @@ -8248,11 +8210,11 @@ var conversions = __webpack_require__(117); */ function buildGraph() { - var graph = {}; + const graph = {}; // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - var models = Object.keys(conversions); + const models = Object.keys(conversions); - for (var len = models.length, i = 0; i < len; i++) { + for (let len = models.length, i = 0; i < len; i++) { graph[models[i]] = { // http://jsperf.com/1-vs-infinity // micro-opt, but this is simple. @@ -8266,18 +8228,18 @@ function buildGraph() { // https://en.wikipedia.org/wiki/Breadth-first_search function deriveBFS(fromModel) { - var graph = buildGraph(); - var queue = [fromModel]; // unshift -> queue -> pop + const graph = buildGraph(); + const queue = [fromModel]; // Unshift -> queue -> pop graph[fromModel].distance = 0; while (queue.length) { - var current = queue.pop(); - var adjacents = Object.keys(conversions[current]); + const current = queue.pop(); + const adjacents = Object.keys(conversions[current]); - for (var len = adjacents.length, i = 0; i < len; i++) { - var adjacent = adjacents[i]; - var node = graph[adjacent]; + for (let len = adjacents.length, i = 0; i < len; i++) { + const adjacent = adjacents[i]; + const node = graph[adjacent]; if (node.distance === -1) { node.distance = graph[current].distance + 1; @@ -8297,10 +8259,10 @@ function link(from, to) { } function wrapConversion(toModel, graph) { - var path = [graph[toModel].parent, toModel]; - var fn = conversions[graph[toModel].parent][toModel]; + const path = [graph[toModel].parent, toModel]; + let fn = conversions[graph[toModel].parent][toModel]; - var cur = graph[toModel].parent; + let cur = graph[toModel].parent; while (graph[cur].parent) { path.unshift(graph[cur].parent); fn = link(conversions[graph[cur].parent][cur], fn); @@ -8312,16 +8274,16 @@ function wrapConversion(toModel, graph) { } module.exports = function (fromModel) { - var graph = deriveBFS(fromModel); - var conversion = {}; + const graph = deriveBFS(fromModel); + const conversion = {}; - var models = Object.keys(graph); - for (var len = models.length, i = 0; i < len; i++) { - var toModel = models[i]; - var node = graph[toModel]; + const models = Object.keys(graph); + for (let len = models.length, i = 0; i < len; i++) { + const toModel = models[i]; + const node = graph[toModel]; if (node.parent === null) { - // no possible conversion, or this node is the source model. + // No possible conversion, or this node is the source model. continue; } @@ -8334,29 +8296,38 @@ module.exports = function (fromModel) { /***/ }), -/* 120 */ +/* 119 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(121); +const os = __webpack_require__(120); +const tty = __webpack_require__(121); const hasFlag = __webpack_require__(122); -const env = process.env; +const {env} = process; let forceColor; if (hasFlag('no-color') || hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; } else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true') || hasFlag('color=always')) { - forceColor = true; + forceColor = 1; } + if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } } function translateLevel(level) { @@ -8372,8 +8343,8 @@ function translateLevel(level) { }; } -function supportsColor(stream) { - if (forceColor === false) { +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { return 0; } @@ -8387,26 +8358,21 @@ function supportsColor(stream) { return 2; } - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } + if (haveStream && !streamIsTTY && forceColor === undefined) { return 0; } - const min = forceColor ? 1 : 0; + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. const osRelease = os.release().split('.'); if ( - Number(process.versions.node.split('.')[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586 ) { @@ -8428,6 +8394,10 @@ function supportsColor(stream) { return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; } + if ('GITHUB_ACTIONS' in env) { + return 1; + } + if (env.COLORTERM === 'truecolor') { return 3; } @@ -8448,7 +8418,7 @@ function supportsColor(stream) { return 2; } - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { return 1; } @@ -8456,43 +8426,45 @@ function supportsColor(stream) { return 1; } - if (env.TERM === 'dumb') { - return min; - } - return min; } function getSupportLevel(stream) { - const level = supportsColor(stream); + const level = supportsColor(stream, stream && stream.isTTY); return translateLevel(level); } module.exports = { supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) }; /***/ }), -/* 121 */ +/* 120 */ /***/ (function(module, exports) { module.exports = require("os"); +/***/ }), +/* 121 */ +/***/ (function(module, exports) { + +module.exports = require("tty"); + /***/ }), /* 122 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = (flag, argv) => { - argv = argv || process.argv; + +module.exports = (flag, argv = process.argv) => { const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const pos = argv.indexOf(prefix + flag); - const terminatorPos = argv.indexOf('--'); - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); }; @@ -8502,10 +8474,56 @@ module.exports = (flag, argv) => { "use strict"; -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; + +const stringReplaceAll = (string, substring, replacer) => { + let index = string.indexOf(substring); + if (index === -1) { + return string; + } + + const substringLength = substring.length; + let endIndex = 0; + let returnValue = ''; + do { + returnValue += string.substr(endIndex, index - endIndex) + substring + replacer; + endIndex = index + substringLength; + index = string.indexOf(substring, endIndex); + } while (index !== -1); + + returnValue += string.substr(endIndex); + return returnValue; +}; + +const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { + let endIndex = 0; + let returnValue = ''; + do { + const gotCR = string[index - 1] === '\r'; + returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix; + endIndex = index + 1; + index = string.indexOf('\n', endIndex); + } while (index !== -1); + + returnValue += string.substr(endIndex); + return returnValue; +}; + +module.exports = { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex +}; + + +/***/ }), +/* 124 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; +const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi; const ESCAPES = new Map([ ['n', '\n'], @@ -8521,23 +8539,31 @@ const ESCAPES = new Map([ ]); function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + const u = c[0] === 'u'; + const bracket = c[1] === '{'; + + if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) { return String.fromCharCode(parseInt(c.slice(1), 16)); } + if (u && bracket) { + return String.fromCodePoint(parseInt(c.slice(2, -1), 16)); + } + return ESCAPES.get(c) || c; } -function parseArguments(name, args) { +function parseArguments(name, arguments_) { const results = []; - const chunks = args.trim().split(/\s*,\s*/g); + const chunks = arguments_.trim().split(/\s*,\s*/g); let matches; for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); + const number = Number(chunk); + if (!Number.isNaN(number)) { + results.push(number); } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character)); } else { throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); } @@ -8576,36 +8602,34 @@ function buildStyle(chalk, styles) { } let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + for (const [styleName, styles] of Object.entries(enabled)) { + if (!Array.isArray(styles)) { + continue; + } - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); } + + current = styles.length > 0 ? current[styleName](...styles) : current[styleName]; } return current; } -module.exports = (chalk, tmp) => { +module.exports = (chalk, temporary) => { const styles = []; const chunks = []; let chunk = []; // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); + temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => { + if (escapeCharacter) { + chunk.push(unescape(escapeCharacter)); } else if (style) { - const str = chunk.join(''); + const string = chunk.join(''); chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string)); styles.push({inverse, styles: parseStyle(style)}); } else if (close) { if (styles.length === 0) { @@ -8616,15 +8640,15 @@ module.exports = (chalk, tmp) => { chunk = []; styles.pop(); } else { - chunk.push(chr); + chunk.push(character); } }); chunks.push(chunk.join('')); if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); + const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMessage); } return chunks.join(''); @@ -8632,7 +8656,7 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 124 */ +/* 125 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8689,7 +8713,7 @@ exports.parseLogLevel = parseLogLevel; /***/ }), -/* 125 */ +/* 126 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -8733,16 +8757,16 @@ exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; /***/ }), -/* 126 */ +/* 127 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); -/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(127); -/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(280); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(389); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(390); +/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(128); +/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(295); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(402); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(403); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -8773,18 +8797,18 @@ const commands = { }; /***/ }), -/* 127 */ +/* 128 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCommand", function() { return BootstrapCommand; }); -/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(128); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); -/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(273); -/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(279); +/* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(129); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _utils_project_checksums__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(289); +/* harmony import */ var _utils_bootstrap_cache_file__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(294); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -8887,7 +8911,7 @@ const BootstrapCommand = { }; /***/ }), -/* 128 */ +/* 129 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -8895,8 +8919,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkProjectExecutables", function() { return linkProjectExecutables; }); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(129); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(142); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(130); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -8958,7 +8982,7 @@ async function linkProjectExecutables(projectsByName, projectGraph) { } /***/ }), -/* 129 */ +/* 130 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -8972,11 +8996,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDirectory", function() { return isDirectory; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFile", function() { return isFile; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSymlink", function() { return createSymlink; }); -/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(130); +/* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(131); /* harmony import */ var cmd_shim__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cmd_shim__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(141); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(142); /* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); @@ -9092,7 +9116,7 @@ async function forceCreate(src, dest, type) { } /***/ }), -/* 130 */ +/* 131 */ /***/ (function(module, exports, __webpack_require__) { // On windows, create a .cmd file. @@ -9108,11 +9132,11 @@ async function forceCreate(src, dest, type) { module.exports = cmdShim cmdShim.ifExists = cmdShimIfExists -var fs = __webpack_require__(131) +var fs = __webpack_require__(132) -var mkdir = __webpack_require__(139) +var mkdir = __webpack_require__(140) , path = __webpack_require__(4) - , toBatchSyntax = __webpack_require__(140) + , toBatchSyntax = __webpack_require__(141) , shebangExpr = /^#\!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+=[^ \t]+\s+)*\s*([^ \t]+)(.*)$/ function cmdShimIfExists (from, to, cb) { @@ -9345,13 +9369,13 @@ function times(n, ok, cb) { /***/ }), -/* 131 */ +/* 132 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) -var polyfills = __webpack_require__(133) -var legacy = __webpack_require__(135) -var clone = __webpack_require__(137) +var fs = __webpack_require__(133) +var polyfills = __webpack_require__(134) +var legacy = __webpack_require__(136) +var clone = __webpack_require__(138) var util = __webpack_require__(111) @@ -9430,7 +9454,7 @@ if (!global[gracefulQueue]) { if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { process.on('exit', function() { debug(global[gracefulQueue]) - __webpack_require__(138).equal(global[gracefulQueue].length, 0) + __webpack_require__(139).equal(global[gracefulQueue].length, 0) }) } } @@ -9697,16 +9721,16 @@ function retry () { /***/ }), -/* 132 */ +/* 133 */ /***/ (function(module, exports) { module.exports = require("fs"); /***/ }), -/* 133 */ +/* 134 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(134) +var constants = __webpack_require__(135) var origCwd = process.cwd var cwd = null @@ -10051,16 +10075,16 @@ function patch (fs) { /***/ }), -/* 134 */ +/* 135 */ /***/ (function(module, exports) { module.exports = require("constants"); /***/ }), -/* 135 */ +/* 136 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(136).Stream +var Stream = __webpack_require__(137).Stream module.exports = legacy @@ -10181,13 +10205,13 @@ function legacy (fs) { /***/ }), -/* 136 */ +/* 137 */ /***/ (function(module, exports) { module.exports = require("stream"); /***/ }), -/* 137 */ +/* 138 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -10213,17 +10237,17 @@ function clone (obj) { /***/ }), -/* 138 */ +/* 139 */ /***/ (function(module, exports) { module.exports = require("assert"); /***/ }), -/* 139 */ +/* 140 */ /***/ (function(module, exports, __webpack_require__) { var path = __webpack_require__(4); -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); var _0777 = parseInt('0777', 8); module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; @@ -10324,7 +10348,7 @@ mkdirP.sync = function sync (p, opts, made) { /***/ }), -/* 140 */ +/* 141 */ /***/ (function(module, exports) { exports.replaceDollarWithPercentPair = replaceDollarWithPercentPair @@ -10382,10 +10406,10 @@ function replaceDollarWithPercentPair(value) { /***/ }), -/* 141 */ +/* 142 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132), +var fs = __webpack_require__(133), path = __webpack_require__(4); module.exports = ncp; @@ -10649,7 +10673,7 @@ function ncp (source, dest, options, callback) { /***/ }), -/* 142 */ +/* 143 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -10709,7 +10733,7 @@ const log = new Log(); /***/ }), -/* 143 */ +/* 144 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -10775,7 +10799,7 @@ async function parallelize(items, fn, concurrency = 4) { } /***/ }), -/* 144 */ +/* 145 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -10784,15 +10808,15 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProjectGraph", function() { return buildProjectGraph; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "topologicallyBatchProjects", function() { return topologicallyBatchProjects; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "includeTransitiveProjects", function() { return includeTransitiveProjects; }); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(146); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(161); -/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(162); -/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(271); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(162); +/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(163); +/* harmony import */ var _workspaces__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(287); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -10991,7 +11015,7 @@ function includeTransitiveProjects(subsetOfProjects, allProjects, { } /***/ }), -/* 145 */ +/* 146 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -11036,27 +11060,27 @@ function includeTransitiveProjects(subsetOfProjects, allProjects, { module.exports = glob -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(152) -var EE = __webpack_require__(154).EventEmitter +var inherits = __webpack_require__(153) +var EE = __webpack_require__(155).EventEmitter var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var globSync = __webpack_require__(156) -var common = __webpack_require__(157) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var globSync = __webpack_require__(157) +var common = __webpack_require__(158) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp -var inflight = __webpack_require__(158) +var inflight = __webpack_require__(159) var util = __webpack_require__(111) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(160) +var once = __webpack_require__(161) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -11787,7 +11811,7 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 146 */ +/* 147 */ /***/ (function(module, exports, __webpack_require__) { module.exports = realpath @@ -11797,13 +11821,13 @@ realpath.realpathSync = realpathSync realpath.monkeypatch = monkeypatch realpath.unmonkeypatch = unmonkeypatch -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) var origRealpath = fs.realpath var origRealpathSync = fs.realpathSync var version = process.version var ok = /^v[0-5]\./.test(version) -var old = __webpack_require__(147) +var old = __webpack_require__(148) function newError (er) { return er && er.syscall === 'realpath' && ( @@ -11859,7 +11883,7 @@ function unmonkeypatch () { /***/ }), -/* 147 */ +/* 148 */ /***/ (function(module, exports, __webpack_require__) { // Copyright Joyent, Inc. and other Node contributors. @@ -11885,7 +11909,7 @@ function unmonkeypatch () { var pathModule = __webpack_require__(4); var isWindows = process.platform === 'win32'; -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); // JavaScript implementation of realpath, ported from node pre-v6 @@ -12168,7 +12192,7 @@ exports.realpath = function realpath(p, cache, cb) { /***/ }), -/* 148 */ +/* 149 */ /***/ (function(module, exports, __webpack_require__) { module.exports = minimatch @@ -12180,7 +12204,7 @@ try { } catch (er) {} var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = __webpack_require__(149) +var expand = __webpack_require__(150) var plTypes = { '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, @@ -13097,11 +13121,11 @@ function regExpEscape (s) { /***/ }), -/* 149 */ +/* 150 */ /***/ (function(module, exports, __webpack_require__) { -var concatMap = __webpack_require__(150); -var balanced = __webpack_require__(151); +var concatMap = __webpack_require__(151); +var balanced = __webpack_require__(152); module.exports = expandTop; @@ -13304,7 +13328,7 @@ function expand(str, isTop) { /***/ }), -/* 150 */ +/* 151 */ /***/ (function(module, exports) { module.exports = function (xs, fn) { @@ -13323,7 +13347,7 @@ var isArray = Array.isArray || function (xs) { /***/ }), -/* 151 */ +/* 152 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13389,7 +13413,7 @@ function range(a, b, str) { /***/ }), -/* 152 */ +/* 153 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -13399,12 +13423,12 @@ try { module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(153); + module.exports = __webpack_require__(154); } /***/ }), -/* 153 */ +/* 154 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -13437,13 +13461,13 @@ if (typeof Object.create === 'function') { /***/ }), -/* 154 */ +/* 155 */ /***/ (function(module, exports) { module.exports = require("events"); /***/ }), -/* 155 */ +/* 156 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -13470,22 +13494,22 @@ module.exports.win32 = win32; /***/ }), -/* 156 */ +/* 157 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(145).Glob +var Glob = __webpack_require__(146).Glob var util = __webpack_require__(111) var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var common = __webpack_require__(157) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var common = __webpack_require__(158) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -13962,7 +13986,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 157 */ +/* 158 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -13980,8 +14004,8 @@ function ownProp (obj, field) { } var path = __webpack_require__(4) -var minimatch = __webpack_require__(148) -var isAbsolute = __webpack_require__(155) +var minimatch = __webpack_require__(149) +var isAbsolute = __webpack_require__(156) var Minimatch = minimatch.Minimatch function alphasorti (a, b) { @@ -14208,12 +14232,12 @@ function childrenIgnored (self, path) { /***/ }), -/* 158 */ +/* 159 */ /***/ (function(module, exports, __webpack_require__) { -var wrappy = __webpack_require__(159) +var wrappy = __webpack_require__(160) var reqs = Object.create(null) -var once = __webpack_require__(160) +var once = __webpack_require__(161) module.exports = wrappy(inflight) @@ -14268,7 +14292,7 @@ function slice (args) { /***/ }), -/* 159 */ +/* 160 */ /***/ (function(module, exports) { // Returns a wrapper function that returns a wrapped callback @@ -14307,10 +14331,10 @@ function wrappy (fn, cb) { /***/ }), -/* 160 */ +/* 161 */ /***/ (function(module, exports, __webpack_require__) { -var wrappy = __webpack_require__(159) +var wrappy = __webpack_require__(160) module.exports = wrappy(once) module.exports.strict = wrappy(onceStrict) @@ -14355,7 +14379,7 @@ function onceStrict (fn) { /***/ }), -/* 161 */ +/* 162 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -14388,22 +14412,22 @@ class CliError extends Error { } /***/ }), -/* 162 */ +/* 163 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return Project; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(161); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(142); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163); -/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(226); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(162); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(143); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(164); +/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(233); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -14640,7 +14664,7 @@ function normalizePath(path) { } /***/ }), -/* 163 */ +/* 164 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -14648,9 +14672,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readPackageJson", function() { return readPackageJson; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "writePackageJson", function() { return writePackageJson; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(165); /* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(213); /* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); /* * Licensed to Elasticsearch B.V. under one or more contributor @@ -14684,15 +14708,15 @@ function writePackageJson(path, json) { const isLinkDependency = depVersion => depVersion.startsWith('link:'); /***/ }), -/* 164 */ +/* 165 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); -const parseJson = __webpack_require__(165); +const parseJson = __webpack_require__(166); const readFileAsync = promisify(fs.readFile); @@ -14707,7 +14731,7 @@ module.exports = async options => { const json = parseJson(await readFileAsync(filePath, 'utf8')); if (options.normalize) { - __webpack_require__(180)(json); + __webpack_require__(187)(json); } return json; @@ -14724,7 +14748,7 @@ module.exports.sync = options => { const json = parseJson(fs.readFileSync(filePath, 'utf8')); if (options.normalize) { - __webpack_require__(180)(json); + __webpack_require__(187)(json); } return json; @@ -14732,15 +14756,15 @@ module.exports.sync = options => { /***/ }), -/* 165 */ +/* 166 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const errorEx = __webpack_require__(166); -const fallback = __webpack_require__(168); -const {default: LinesAndColumns} = __webpack_require__(169); -const {codeFrameColumns} = __webpack_require__(170); +const errorEx = __webpack_require__(167); +const fallback = __webpack_require__(169); +const {default: LinesAndColumns} = __webpack_require__(170); +const {codeFrameColumns} = __webpack_require__(171); const JSONError = errorEx('JSONError', { fileName: errorEx.append('in %s'), @@ -14789,14 +14813,14 @@ module.exports = (string, reviver, filename) => { /***/ }), -/* 166 */ +/* 167 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var isArrayish = __webpack_require__(167); +var isArrayish = __webpack_require__(168); var errorEx = function errorEx(name, properties) { if (!name || name.constructor !== String) { @@ -14929,7 +14953,7 @@ module.exports = errorEx; /***/ }), -/* 167 */ +/* 168 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14946,7 +14970,7 @@ module.exports = function isArrayish(obj) { /***/ }), -/* 168 */ +/* 169 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14985,7 +15009,7 @@ function parseJson (txt, reviver, context) { /***/ }), -/* 169 */ +/* 170 */ /***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; @@ -15049,7 +15073,7 @@ var LinesAndColumns = (function () { /***/ }), -/* 170 */ +/* 171 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15061,7 +15085,7 @@ Object.defineProperty(exports, "__esModule", { exports.codeFrameColumns = codeFrameColumns; exports.default = _default; -var _highlight = _interopRequireWildcard(__webpack_require__(171)); +var _highlight = _interopRequireWildcard(__webpack_require__(172)); function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } @@ -15222,7 +15246,7 @@ function _default(rawLines, lineNumber, colNumber, opts = {}) { } /***/ }), -/* 171 */ +/* 172 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15235,11 +15259,11 @@ exports.shouldHighlight = shouldHighlight; exports.getChalk = getChalk; exports.default = highlight; -var _jsTokens = _interopRequireWildcard(__webpack_require__(172)); +var _jsTokens = _interopRequireWildcard(__webpack_require__(173)); -var _helperValidatorIdentifier = __webpack_require__(173); +var _helperValidatorIdentifier = __webpack_require__(174); -var _chalk = _interopRequireDefault(__webpack_require__(176)); +var _chalk = _interopRequireDefault(__webpack_require__(177)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -15335,7 +15359,7 @@ function highlight(code, options = {}) { } /***/ }), -/* 172 */ +/* 173 */ /***/ (function(module, exports) { // Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell @@ -15364,7 +15388,7 @@ exports.matchToToken = function(match) { /***/ }), -/* 173 */ +/* 174 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15422,12 +15446,12 @@ Object.defineProperty(exports, "isKeyword", { } }); -var _identifier = __webpack_require__(174); +var _identifier = __webpack_require__(175); -var _keyword = __webpack_require__(175); +var _keyword = __webpack_require__(176); /***/ }), -/* 174 */ +/* 175 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15510,7 +15534,7 @@ function isIdentifierName(name) { } /***/ }), -/* 175 */ +/* 176 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -15554,16 +15578,16 @@ function isKeyword(word) { } /***/ }), -/* 176 */ +/* 177 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(177); -const stdoutColor = __webpack_require__(178).stdout; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(179); +const stdoutColor = __webpack_require__(184).stdout; -const template = __webpack_require__(179); +const template = __webpack_require__(186); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -15789,12 +15813,30 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 177 */ +/* 178 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; + +module.exports = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + + return str.replace(matchOperatorsRe, '\\$&'); +}; + + +/***/ }), +/* 179 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); +const colorConvert = __webpack_require__(180); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -15959,3021 +16001,4252 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 178 */ +/* 180 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var conversions = __webpack_require__(181); +var route = __webpack_require__(183); -const os = __webpack_require__(121); -const hasFlag = __webpack_require__(122); +var convert = {}; -const env = process.env; +var models = Object.keys(conversions); -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -function translateLevel(level) { - if (level === 0) { - return false; - } + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 + return fn(args); }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; } - if (hasFlag('color=256')) { - return 2; - } + return wrappedFn; +} - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; } - return 0; - } - - const min = forceColor ? 1 : 0; - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); } - return 1; - } + var result = fn(args); - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } } - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + return result; + }; - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } + return wrappedFn; +} - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } +models.forEach(function (fromModel) { + convert[fromModel] = {}; - if ('COLORTERM' in env) { - return 1; - } + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - if (env.TERM === 'dumb') { - return min; - } + var routes = route(fromModel); + var routeModels = Object.keys(routes); - return min; -} + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; +module.exports = convert; /***/ }), -/* 179 */ +/* 181 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; +/* MIT license */ +var cssKeywords = __webpack_require__(182); -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); +var reverseKeywords = {}; +for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; } - - return ESCAPES.get(c) || c; } -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); } - } - - return results; -} - -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; - - const results = []; - let matches; - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); } - } - return results; + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } } -function buildStyle(chalk, styles) { - const enabled = {}; +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } + h = Math.min(h * 60, 360); - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } + if (h < 0) { + h += 360; } - return current; -} + l = (min + max) / 2; -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } + return [h, s * 100, l * 100]; +}; - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; - chunks.push(chunk.join('')); + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } } - return chunks.join(''); + return [ + h * 360, + s * 100, + v * 100 + ]; }; +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); -/***/ }), -/* 180 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = normalize + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); -var fixer = __webpack_require__(181) -normalize.fixer = fixer + return [h, w * 100, b * 100]; +}; -var makeWarning = __webpack_require__(204) +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; -var fieldsToFix = ['name','version','description','repository','modules','scripts' - ,'files','bin','man','bugs','keywords','readme','homepage','license'] -var otherThingsToFix = ['dependencies','people', 'typos'] + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; -var thingsToFix = fieldsToFix.map(function(fieldName) { - return ucFirst(fieldName) + "Field" -}) -// two ways to do this in CoffeeScript on only one line, sub-70 chars: -// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" -// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) -thingsToFix = thingsToFix.concat(otherThingsToFix) + return [c * 100, m * 100, y * 100, k * 100]; +}; -function normalize (data, warn, strict) { - if(warn === true) warn = null, strict = true - if(!strict) strict = false - if(!warn || data.private) warn = function(msg) { /* noop */ } - - if (data.scripts && - data.scripts.install === "node-gyp rebuild" && - !data.scripts.preinstall) { - data.gypfile = true - } - fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } - thingsToFix.forEach(function(thingName) { - fixer["fix" + ucFirst(thingName)](data, strict) - }) - data._id = data.name + "@" + data.version +/** + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); } -function ucFirst (string) { - return string.charAt(0).toUpperCase() + string.slice(1); -} +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + var currentClosestDistance = Infinity; + var currentClosestKeyword; -/***/ }), -/* 181 */ -/***/ (function(module, exports, __webpack_require__) { + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; -var semver = __webpack_require__(182) -var validateLicense = __webpack_require__(183); -var hostedGitInfo = __webpack_require__(188) -var isBuiltinModule = __webpack_require__(192).isCore -var depTypes = ["dependencies","devDependencies","optionalDependencies"] -var extractDescription = __webpack_require__(202) -var url = __webpack_require__(189) -var typos = __webpack_require__(203) + // Compute comparative distance + var distance = comparativeDistance(rgb, value); -var fixer = module.exports = { - // default warning function - warn: function() {}, + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } - fixRepositoryField: function(data) { - if (data.repositories) { - this.warn("repositories"); - data.repository = data.repositories[0] - } - if (!data.repository) return this.warn("missingRepository") - if (typeof data.repository === "string") { - data.repository = { - type: "git", - url: data.repository - } - } - var r = data.repository.url || "" - if (r) { - var hosted = hostedGitInfo.fromUrl(r) - if (hosted) { - r = data.repository.url - = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() - } - } + return currentClosestKeyword; +}; - if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { - this.warn("brokenGitUrl", r) - } - } +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; -, fixTypos: function(data) { - Object.keys(typos.topLevel).forEach(function (d) { - if (data.hasOwnProperty(d)) { - this.warn("typo", d, typos.topLevel[d]) - } - }, this) - } +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; -, fixScriptsField: function(data) { - if (!data.scripts) return - if (typeof data.scripts !== "object") { - this.warn("nonObjectScripts") - delete data.scripts - return - } - Object.keys(data.scripts).forEach(function (k) { - if (typeof data.scripts[k] !== "string") { - this.warn("nonStringScript") - delete data.scripts[k] - } else if (typos.script[k] && !data.scripts[typos.script[k]]) { - this.warn("typo", k, typos.script[k], "scripts") - } - }, this) - } + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); -, fixFilesField: function(data) { - var files = data.files - if (files && !Array.isArray(files)) { - this.warn("nonArrayFiles") - delete data.files - } else if (data.files) { - data.files = data.files.filter(function(file) { - if (!file || typeof file !== "string") { - this.warn("invalidFilename", file) - return false - } else { - return true - } - }, this) - } - } + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); -, fixBinField: function(data) { - if (!data.bin) return; - if (typeof data.bin === "string") { - var b = {} - var match - if (match = data.name.match(/^@[^/]+[/](.*)$/)) { - b[match[1]] = data.bin - } else { - b[data.name] = data.bin - } - data.bin = b - } - } + return [x * 100, y * 100, z * 100]; +}; -, fixManField: function(data) { - if (!data.man) return; - if (typeof data.man === "string") { - data.man = [ data.man ] - } - } -, fixBundleDependenciesField: function(data) { - var bdd = "bundledDependencies" - var bd = "bundleDependencies" - if (data[bdd] && !data[bd]) { - data[bd] = data[bdd] - delete data[bdd] - } - if (data[bd] && !Array.isArray(data[bd])) { - this.warn("nonArrayBundleDependencies") - delete data[bd] - } else if (data[bd]) { - data[bd] = data[bd].filter(function(bd) { - if (!bd || typeof bd !== 'string') { - this.warn("nonStringBundleDependency", bd) - return false - } else { - if (!data.dependencies) { - data.dependencies = {} - } - if (!data.dependencies.hasOwnProperty(bd)) { - this.warn("nonDependencyBundleDependency", bd) - data.dependencies[bd] = "*" - } - return true - } - }, this) - } - } +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -, fixDependencies: function(data, strict) { - var loose = !strict - objectifyDeps(data, this.warn) - addOptionalDepsToDeps(data, this.warn) - this.fixBundleDependenciesField(data) + x /= 95.047; + y /= 100; + z /= 108.883; - ;['dependencies','devDependencies'].forEach(function(deps) { - if (!(deps in data)) return - if (!data[deps] || typeof data[deps] !== "object") { - this.warn("nonObjectDependencies", deps) - delete data[deps] - return - } - Object.keys(data[deps]).forEach(function (d) { - var r = data[deps][d] - if (typeof r !== 'string') { - this.warn("nonStringDependency", d, JSON.stringify(r)) - delete data[deps][d] - } - var hosted = hostedGitInfo.fromUrl(data[deps][d]) - if (hosted) data[deps][d] = hosted.toString() - }, this) - }, this) - } + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -, fixModulesField: function (data) { - if (data.modules) { - this.warn("deprecatedModules") - delete data.modules - } - } + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -, fixKeywordsField: function (data) { - if (typeof data.keywords === "string") { - data.keywords = data.keywords.split(/,\s+/) - } - if (data.keywords && !Array.isArray(data.keywords)) { - delete data.keywords - this.warn("nonArrayKeywords") - } else if (data.keywords) { - data.keywords = data.keywords.filter(function(kw) { - if (typeof kw !== "string" || !kw) { - this.warn("nonStringKeyword"); - return false - } else { - return true - } - }, this) - } - } + return [l, a, b]; +}; -, fixVersionField: function(data, strict) { - // allow "loose" semver 1.0 versions in non-strict mode - // enforce strict semver 2.0 compliance in strict mode - var loose = !strict - if (!data.version) { - data.version = "" - return true - } - if (!semver.valid(data.version, loose)) { - throw new Error('Invalid version: "'+ data.version + '"') - } - data.version = semver.clean(data.version, loose) - return true - } +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; -, fixPeople: function(data) { - modifyPeople(data, unParsePerson) - modifyPeople(data, parsePerson) - } + if (s === 0) { + val = l * 255; + return [val, val, val]; + } -, fixNameField: function(data, options) { - if (typeof options === "boolean") options = {strict: options} - else if (typeof options === "undefined") options = {} - var strict = options.strict - if (!data.name && !strict) { - data.name = "" - return - } - if (typeof data.name !== "string") { - throw new Error("name field must be a string.") - } - if (!strict) - data.name = data.name.trim() - ensureValidName(data.name, strict, options.allowLegacyCase) - if (isBuiltinModule(data.name)) - this.warn("conflictingName", data.name) - } + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } + t1 = 2 * l - t2; -, fixDescriptionField: function (data) { - if (data.description && typeof data.description !== 'string') { - this.warn("nonStringDescription") - delete data.description - } - if (data.readme && !data.description) - data.description = extractDescription(data.readme) - if(data.description === undefined) delete data.description; - if (!data.description) this.warn("missingDescription") - } + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } -, fixReadmeField: function (data) { - if (!data.readme) { - this.warn("missingReadme") - data.readme = "ERROR: No README data found!" - } - } + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } -, fixBugsField: function(data) { - if (!data.bugs && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if(hosted && hosted.bugs()) { - data.bugs = {url: hosted.bugs()} - } - } - else if(data.bugs) { - var emailRe = /^.+@.*\..+$/ - if(typeof data.bugs == "string") { - if(emailRe.test(data.bugs)) - data.bugs = {email:data.bugs} - else if(url.parse(data.bugs).protocol) - data.bugs = {url: data.bugs} - else - this.warn("nonEmailUrlBugsString") - } - else { - bugsTypos(data.bugs, this.warn) - var oldBugs = data.bugs - data.bugs = {} - if(oldBugs.url) { - if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) - data.bugs.url = oldBugs.url - else - this.warn("nonUrlBugsUrlField") - } - if(oldBugs.email) { - if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) - data.bugs.email = oldBugs.email - else - this.warn("nonEmailBugsEmailField") - } - } - if(!data.bugs.email && !data.bugs.url) { - delete data.bugs - this.warn("emptyNormalizedBugs") - } - } - } + rgb[i] = val * 255; + } -, fixHomepageField: function(data) { - if (!data.homepage && data.repository && data.repository.url) { - var hosted = hostedGitInfo.fromUrl(data.repository.url) - if (hosted && hosted.docs()) data.homepage = hosted.docs() - } - if (!data.homepage) return + return rgb; +}; - if(typeof data.homepage !== "string") { - this.warn("nonUrlHomepage") - return delete data.homepage - } - if(!url.parse(data.homepage).protocol) { - data.homepage = "http://" + data.homepage - } - } +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; -, fixLicenseField: function(data) { - if (!data.license) { - return this.warn("missingLicense") - } else{ - if ( - typeof(data.license) !== 'string' || - data.license.length < 1 || - data.license.trim() === '' - ) { - this.warn("invalidLicense") - } else { - if (!validateLicense(data.license).validForNewPackages) - this.warn("invalidLicense") - } - } - } -} + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); -function isValidScopedPackageName(spec) { - if (spec.charAt(0) !== '@') return false + return [h, sv * 100, v * 100]; +}; - var rest = spec.slice(1).split('/') - if (rest.length !== 2) return false +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; - return rest[0] && rest[1] && - rest[0] === encodeURIComponent(rest[0]) && - rest[1] === encodeURIComponent(rest[1]) -} + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; -function isCorrectlyEncodedName(spec) { - return !spec.match(/[\/@\s\+%:]/) && - spec === encodeURIComponent(spec) -} + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; -function ensureValidName (name, strict, allowLegacyCase) { - if (name.charAt(0) === "." || - !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || - (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || - name.toLowerCase() === "node_modules" || - name.toLowerCase() === "favicon.ico") { - throw new Error("Invalid name: " + JSON.stringify(name)) - } -} +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; -function modifyPeople (data, fn) { - if (data.author) data.author = fn(data.author) - ;["maintainers", "contributors"].forEach(function (set) { - if (!Array.isArray(data[set])) return; - data[set] = data[set].map(fn) - }) - return data -} + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; -function unParsePerson (person) { - if (typeof person === "string") return person - var name = person.name || "" - var u = person.url || person.web - var url = u ? (" ("+u+")") : "" - var e = person.email || person.mail - var email = e ? (" <"+e+">") : "" - return name+email+url -} + return [h, sl * 100, l * 100]; +}; -function parsePerson (person) { - if (typeof person !== "string") return person - var name = person.match(/^([^\(<]+)/) - var url = person.match(/\(([^\)]+)\)/) - var email = person.match(/<([^>]+)>/) - var obj = {} - if (name && name[0].trim()) obj.name = name[0].trim() - if (email) obj.email = email[1]; - if (url) obj.url = url[1]; - return obj -} +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; -function addOptionalDepsToDeps (data, warn) { - var o = data.optionalDependencies - if (!o) return; - var d = data.dependencies || {} - Object.keys(o).forEach(function (k) { - d[k] = o[k] - }) - data.dependencies = d -} + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } -function depObjectify (deps, type, warn) { - if (!deps) return {} - if (typeof deps === "string") { - deps = deps.trim().split(/[\n\r\s\t ,]+/) - } - if (!Array.isArray(deps)) return deps - warn("deprecatedArrayDependencies", type) - var o = {} - deps.filter(function (d) { - return typeof d === "string" - }).forEach(function(d) { - d = d.trim().split(/(:?[@\s><=])/) - var dn = d.shift() - var dv = d.join("") - dv = dv.trim() - dv = dv.replace(/^@/, "") - o[dn] = dv - }) - return o -} + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; -function objectifyDeps (data, warn) { - depTypes.forEach(function (type) { - if (!data[type]) return; - data[type] = depObjectify(data[type], type, warn) - }) -} + if ((i & 0x01) !== 0) { + f = 1 - f; + } -function bugsTypos(bugs, warn) { - if (!bugs) return - Object.keys(bugs).forEach(function (k) { - if (typos.bugs[k]) { - warn("typo", k, typos.bugs[k], "bugs") - bugs[typos.bugs[k]] = bugs[k] - delete bugs[k] - } - }) -} + n = wh + f * (v - wh); // linear interpolation + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } -/***/ }), -/* 182 */ -/***/ (function(module, exports) { + return [r * 255, g * 255, b * 255]; +}; -exports = module.exports = SemVer +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) - } -} else { - debug = function () {} -} + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0' + return [r * 255, g * 255, b * 255]; +}; -var MAX_LENGTH = 256 -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); -// The actual regexps go on exports.re -var re = exports.re = [] -var src = exports.src = [] -var R = 0 + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; -var NUMERICIDENTIFIER = R++ -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' -var NUMERICIDENTIFIERLOOSE = R++ -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. + return [r * 255, g * 255, b * 255]; +}; -var NONNUMERICIDENTIFIER = R++ -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -// ## Main Version -// Three dot-separated numeric identifiers. + x /= 95.047; + y /= 100; + z /= 108.883; -var MAINVERSION = R++ -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')' + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -var MAINVERSIONLOOSE = R++ -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')' + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. + return [l, a, b]; +}; -var PRERELEASEIDENTIFIER = R++ -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')' +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; -var PRERELEASEIDENTIFIERLOOSE = R++ -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')' + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; -var PRERELEASE = R++ -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' + x *= 95.047; + y *= 100; + z *= 108.883; -var PRERELEASELOOSE = R++ -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' + return [x, y, z]; +}; -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; -var BUILDIDENTIFIER = R++ -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. + if (h < 0) { + h += 360; + } -var BUILD = R++ -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' + c = Math.sqrt(a * a + b * b); -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. + return [l, c, h]; +}; -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; -var FULL = R++ -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?' + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); -src[FULL] = '^' + FULLPLAIN + '$' + return [l, a, b]; +}; -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?' +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization -var LOOSE = R++ -src[LOOSE] = '^' + LOOSEPLAIN + '$' + value = Math.round(value / 50); -var GTLT = R++ -src[GTLT] = '((?:<|>)?=?)' + if (value === 0) { + return 30; + } -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++ -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' -var XRANGEIDENTIFIER = R++ -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); -var XRANGEPLAIN = R++ -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?' + if (value === 2) { + ansi += 60; + } -var XRANGEPLAINLOOSE = R++ -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?' + return ansi; +}; -var XRANGE = R++ -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' -var XRANGELOOSE = R++ -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++ -src[LONETILDE] = '(?:~>?)' + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } -var TILDETRIM = R++ -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') -var tildeTrimReplace = '$1~' + if (r > 248) { + return 231; + } -var TILDE = R++ -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' -var TILDELOOSE = R++ -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' + return Math.round(((r - 8) / 247) * 24) + 232; + } -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++ -src[LONECARET] = '(?:\\^)' + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); -var CARETTRIM = R++ -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') -var caretTrimReplace = '$1^' + return ansi; +}; -var CARET = R++ -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' -var CARETLOOSE = R++ -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' +convert.ansi16.rgb = function (args) { + var color = args % 10; -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++ -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' -var COMPARATOR = R++ -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++ -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + color = color / 10.5 * 255; -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') -var comparatorTrimReplace = '$1$2$3' + return [color, color, color]; + } -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++ -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$' + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; -var HYPHENRANGELOOSE = R++ -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$' + return [r, g, b]; +}; -// Star ranges basically just allow anything at all. -var STAR = R++ -src[STAR] = '(<|>)?=?\\s*\\*' +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]) - if (!re[i]) { - re[i] = new RegExp(src[i]) - } -} + args -= 16; -exports.parse = parse -function parse (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; - if (version instanceof SemVer) { - return version - } + return [r, g, b]; +}; - if (typeof version !== 'string') { - return null - } +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); - if (version.length > MAX_LENGTH) { - return null - } + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null - } +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} + var colorString = match[0]; -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null -} + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null -} - -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - } - - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose + return [r, g, b]; +}; - var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; - if (!m) { - throw new TypeError('Invalid Version: ' + version) - } + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } - this.raw = version + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] + hue /= 6; + hue %= 1; - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } + return [hue * 360, chroma * 100, grayscale * 100]; +}; - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) - } + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } - this.build = m[5] ? m[5].split('.') : [] - this.format() -} + return [hsl[0], c * 100, f * 100]; +}; -SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch - if (this.prerelease.length) { - this.version += '-' + this.prerelease.join('.') - } - return this.version -} +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; -SemVer.prototype.toString = function () { - return this.version -} + var c = s * v; + var f = 0; -SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + if (c < 1.0) { + f = (v - c) / (1 - c); + } - return this.compareMain(other) || this.comparePre(other) -} + return [hsv[0], c * 100, f * 100]; +}; -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) -} + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } -SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } - var i = 0 - do { - var a = this.prerelease[i] - var b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) -} + mg = (1.0 - c) * g; -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - var i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; - default: - throw new Error('invalid increment argument: ' + release) - } - this.format() - this.raw = this.version - return this -} + var v = c + g * (1.0 - c); + var f = 0; -exports.inc = inc -function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose - loose = undefined - } + if (v > 0.0) { + f = c / v; + } - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } -} + return [hcg[0], f * 100, v * 100]; +}; -exports.diff = diff -function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1) - var v2 = parse(version2) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; -exports.compareIdentifiers = compareIdentifiers + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; -var numeric = /^[0-9]+$/ -function compareIdentifiers (a, b) { - var anum = numeric.test(a) - var bnum = numeric.test(b) + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } - if (anum && bnum) { - a = +a - b = +b - } + return [hcg[0], s * 100, l * 100]; +}; - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -exports.rcompareIdentifiers = rcompareIdentifiers -function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) -} +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; -exports.major = major -function major (a, loose) { - return new SemVer(a, loose).major -} + if (c < 1) { + g = (v - c) / (1 - c); + } -exports.minor = minor -function minor (a, loose) { - return new SemVer(a, loose).minor -} + return [hwb[0], c * 100, g * 100]; +}; -exports.patch = patch -function patch (a, loose) { - return new SemVer(a, loose).patch -} +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; +}; -exports.compare = compare -function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) -} +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; -exports.compareLoose = compareLoose -function compareLoose (a, b) { - return compare(a, b, true) -} +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; -exports.rcompare = rcompare -function rcompare (a, b, loose) { - return compare(b, a, loose) -} +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; -exports.sort = sort -function sort (list, loose) { - return list.sort(function (a, b) { - return exports.compare(a, b, loose) - }) -} +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; -exports.rsort = rsort -function rsort (list, loose) { - return list.sort(function (a, b) { - return exports.rcompare(a, b, loose) - }) -} +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; -exports.gt = gt -function gt (a, b, loose) { - return compare(a, b, loose) > 0 -} +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; +}; -exports.lt = lt -function lt (a, b, loose) { - return compare(a, b, loose) < 0 -} +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; -exports.eq = eq -function eq (a, b, loose) { - return compare(a, b, loose) === 0 -} + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; -exports.neq = neq -function neq (a, b, loose) { - return compare(a, b, loose) !== 0 -} +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; -exports.gte = gte -function gte (a, b, loose) { - return compare(a, b, loose) >= 0 -} -exports.lte = lte -function lte (a, b, loose) { - return compare(a, b, loose) <= 0 -} +/***/ }), +/* 182 */ +/***/ (function(module, exports, __webpack_require__) { -exports.cmp = cmp -function cmp (a, op, b, loose) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b +"use strict"; + + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - case '': - case '=': - case '==': - return eq(a, b, loose) +/***/ }), +/* 183 */ +/***/ (function(module, exports, __webpack_require__) { - case '!=': - return neq(a, b, loose) +var conversions = __webpack_require__(181); - case '>': - return gt(a, b, loose) +/* + this function routes a model to all other models. - case '>=': - return gte(a, b, loose) + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). - case '<': - return lt(a, b, loose) + conversions that are not possible simply are not included. +*/ - case '<=': - return lte(a, b, loose) +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); - default: - throw new TypeError('Invalid operator: ' + op) - } + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; } -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } + graph[fromModel].distance = 0; - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } - debug('comp', this) + return graph; } -var ANY = {} -Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var m = comp.match(r) +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} - if (!m) { - throw new TypeError('Invalid comparator: ' + comp) - } +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; - this.operator = m[1] - if (this.operator === '=') { - this.operator = '' - } + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) - } + fn.conversion = path; + return fn; } -Comparator.prototype.toString = function () { - return this.value -} +module.exports = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; - if (this.semver === ANY) { - return true - } + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } + conversion[toModel] = wrapConversion(toModel, graph); + } - return cmp(version, this.operator, this.semver, this.options) -} + return conversion; +}; -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - var rangeTmp +/***/ }), +/* 184 */ +/***/ (function(module, exports, __webpack_require__) { - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) - } +"use strict"; - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) +const os = __webpack_require__(120); +const hasFlag = __webpack_require__(185); - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; } -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +function translateLevel(level) { + if (level === 0) { + return false; + } - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } - } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} - if (range instanceof Comparator) { - return new Range(range.value, options) - } +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } - if (!(this instanceof Range)) { - return new Range(range, options) - } + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease + if (hasFlag('color=256')) { + return 2; + } - // First, split based on boolean or || - this.raw = range - this.set = range.split(/\s*\|\|\s*/).map(function (range) { - return this.parseRange(range.trim()) - }, this).filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length - }) + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range) - } + const min = forceColor ? 1 : 0; - this.format() -} + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -Range.prototype.format = function () { - this.range = this.set.map(function (comps) { - return comps.join(' ').trim() - }).join('||').trim() - return this.range -} + return 1; + } -Range.prototype.toString = function () { - return this.range -} + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } -Range.prototype.parseRange = function (range) { - var loose = this.options.loose - range = range.trim() - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] - range = range.replace(hr, hyphenReplace) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[COMPARATORTRIM]) + return min; + } - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace) + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace) + if (env.COLORTERM === 'truecolor') { + return 3; + } - // normalize spaces - range = range.split(/\s+/).join(' ') + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - // At this point, the range is completely trimmed and - // ready to be split into comparators. + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var set = range.split(' ').map(function (comp) { - return parseComparator(comp, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe) - }) - } - set = set.map(function (comp) { - return new Comparator(comp, this.options) - }, this) + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } - return set -} + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } + if ('COLORTERM' in env) { + return 1; + } - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} + if (env.TERM === 'dumb') { + return min; + } -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).set.map(function (comp) { - return comp.map(function (c) { - return c.value - }).join(' ').trim().split(' ') - }) + return min; } -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator (comp, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); } -function isX (id) { - return !id || id.toLowerCase() === 'x' || id === '*' -} +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} -function replaceTilde (comp, options) { - var r = options.loose ? re[TILDELOOSE] : re[TILDE] - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr) - var ret +/***/ }), +/* 185 */ +/***/ (function(module, exports, __webpack_require__) { - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else if (pr) { - debug('replaceTilde pr', pr) - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } +"use strict"; - debug('tilde return', ret) - return ret - }) -} +module.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); +}; -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') -} -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.loose ? re[CARETLOOSE] : re[CARET] - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr) - var ret +/***/ }), +/* 186 */ +/***/ (function(module, exports, __webpack_require__) { - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0' - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0' - } - } +"use strict"; - debug('caret return', ret) - return ret - }) -} +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); + +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } + + return ESCAPES.get(c) || c; } -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - var xM = isX(M) - var xm = xM || isX(m) - var xp = xm || isX(p) - var anyX = xp +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; - if (gtlt === '=' && anyX) { - gtlt = '' - } + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 + return results; +} - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; - ret = gtlt + M + '.' + m + '.' + p - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } + const results = []; + let matches; - debug('xRange return', ret) + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; - return ret - }) -} + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars (comp, options) { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], '') + return results; } -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0 -function hyphenReplace ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = '>=' + fM + '.0.0' - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0' - } else { - from = '>=' + from - } +function buildStyle(chalk, styles) { + const enabled = {}; - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0' - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.0' - } else if (tpr) { - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr - } else { - to = '<=' + to - } + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } - return (from + ' ' + to).trim() + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } + + return current; } -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function (version) { - if (!version) { - return false - } +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false -} + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } + chunks.push(chunk.join('')); - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === ANY) { - continue - } + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } + return chunks.join(''); +}; - // Version has a -pre, but it's not one of the ones we like. - return false - } - return true -} +/***/ }), +/* 187 */ +/***/ (function(module, exports, __webpack_require__) { -exports.satisfies = satisfies -function satisfies (version, range, options) { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} +module.exports = normalize -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null +var fixer = __webpack_require__(188) +normalize.fixer = fixer + +var makeWarning = __webpack_require__(211) + +var fieldsToFix = ['name','version','description','repository','modules','scripts' + ,'files','bin','man','bugs','keywords','readme','homepage','license'] +var otherThingsToFix = ['dependencies','people', 'typos'] + +var thingsToFix = fieldsToFix.map(function(fieldName) { + return ucFirst(fieldName) + "Field" +}) +// two ways to do this in CoffeeScript on only one line, sub-70 chars: +// thingsToFix = fieldsToFix.map (name) -> ucFirst(name) + "Field" +// thingsToFix = (ucFirst(name) + "Field" for name in fieldsToFix) +thingsToFix = thingsToFix.concat(otherThingsToFix) + +function normalize (data, warn, strict) { + if(warn === true) warn = null, strict = true + if(!strict) strict = false + if(!warn || data.private) warn = function(msg) { /* noop */ } + + if (data.scripts && + data.scripts.install === "node-gyp rebuild" && + !data.scripts.preinstall) { + data.gypfile = true } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } + fixer.warn = function() { warn(makeWarning.apply(null, arguments)) } + thingsToFix.forEach(function(thingName) { + fixer["fix" + ucFirst(thingName)](data, strict) }) - return max + data._id = data.name + "@" + data.version } -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min +function ucFirst (string) { + return string.charAt(0).toUpperCase() + string.slice(1); } -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver +/***/ }), +/* 188 */ +/***/ (function(module, exports, __webpack_require__) { + +var semver = __webpack_require__(189) +var validateLicense = __webpack_require__(190); +var hostedGitInfo = __webpack_require__(195) +var isBuiltinModule = __webpack_require__(199).isCore +var depTypes = ["dependencies","devDependencies","optionalDependencies"] +var extractDescription = __webpack_require__(209) +var url = __webpack_require__(196) +var typos = __webpack_require__(210) + +var fixer = module.exports = { + // default warning function + warn: function() {}, + + fixRepositoryField: function(data) { + if (data.repositories) { + this.warn("repositories"); + data.repository = data.repositories[0] + } + if (!data.repository) return this.warn("missingRepository") + if (typeof data.repository === "string") { + data.repository = { + type: "git", + url: data.repository + } + } + var r = data.repository.url || "" + if (r) { + var hosted = hostedGitInfo.fromUrl(r) + if (hosted) { + r = data.repository.url + = hosted.getDefaultRepresentation() == "shortcut" ? hosted.https() : hosted.toString() + } + } + + if (r.match(/github.com\/[^\/]+\/[^\/]+\.git\.git$/)) { + this.warn("brokenGitUrl", r) + } } - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver +, fixTypos: function(data) { + Object.keys(typos.topLevel).forEach(function (d) { + if (data.hasOwnProperty(d)) { + this.warn("typo", d, typos.topLevel[d]) + } + }, this) } - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] +, fixScriptsField: function(data) { + if (!data.scripts) return + if (typeof data.scripts !== "object") { + this.warn("nonObjectScripts") + delete data.scripts + return + } + Object.keys(data.scripts).forEach(function (k) { + if (typeof data.scripts[k] !== "string") { + this.warn("nonStringScript") + delete data.scripts[k] + } else if (typos.script[k] && !data.scripts[typos.script[k]]) { + this.warn("typo", k, typos.script[k], "scripts") + } + }, this) + } - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) +, fixFilesField: function(data) { + var files = data.files + if (files && !Array.isArray(files)) { + this.warn("nonArrayFiles") + delete data.files + } else if (data.files) { + data.files = data.files.filter(function(file) { + if (!file || typeof file !== "string") { + this.warn("invalidFilename", file) + return false + } else { + return true + } + }, this) + } + } + +, fixBinField: function(data) { + if (!data.bin) return; + if (typeof data.bin === "string") { + var b = {} + var match + if (match = data.name.match(/^@[^/]+[/](.*)$/)) { + b[match[1]] = data.bin + } else { + b[data.name] = data.bin } - }) + data.bin = b + } } - if (minver && range.test(minver)) { - return minver +, fixManField: function(data) { + if (!data.man) return; + if (typeof data.man === "string") { + data.man = [ data.man ] + } + } +, fixBundleDependenciesField: function(data) { + var bdd = "bundledDependencies" + var bd = "bundleDependencies" + if (data[bdd] && !data[bd]) { + data[bd] = data[bdd] + delete data[bdd] + } + if (data[bd] && !Array.isArray(data[bd])) { + this.warn("nonArrayBundleDependencies") + delete data[bd] + } else if (data[bd]) { + data[bd] = data[bd].filter(function(bd) { + if (!bd || typeof bd !== 'string') { + this.warn("nonStringBundleDependency", bd) + return false + } else { + if (!data.dependencies) { + data.dependencies = {} + } + if (!data.dependencies.hasOwnProperty(bd)) { + this.warn("nonDependencyBundleDependency", bd) + data.dependencies[bd] = "*" + } + return true + } + }, this) + } } - return null -} +, fixDependencies: function(data, strict) { + var loose = !strict + objectifyDeps(data, this.warn) + addOptionalDepsToDeps(data, this.warn) + this.fixBundleDependenciesField(data) -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null + ;['dependencies','devDependencies'].forEach(function(deps) { + if (!(deps in data)) return + if (!data[deps] || typeof data[deps] !== "object") { + this.warn("nonObjectDependencies", deps) + delete data[deps] + return + } + Object.keys(data[deps]).forEach(function (d) { + var r = data[deps][d] + if (typeof r !== 'string') { + this.warn("nonStringDependency", d, JSON.stringify(r)) + delete data[deps][d] + } + var hosted = hostedGitInfo.fromUrl(data[deps][d]) + if (hosted) data[deps][d] = hosted.toString() + }, this) + }, this) } -} -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr -function ltr (version, range, options) { - return outside(version, range, '<', options) -} +, fixModulesField: function (data) { + if (data.modules) { + this.warn("deprecatedModules") + delete data.modules + } + } -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} +, fixKeywordsField: function (data) { + if (typeof data.keywords === "string") { + data.keywords = data.keywords.split(/,\s+/) + } + if (data.keywords && !Array.isArray(data.keywords)) { + delete data.keywords + this.warn("nonArrayKeywords") + } else if (data.keywords) { + data.keywords = data.keywords.filter(function(kw) { + if (typeof kw !== "string" || !kw) { + this.warn("nonStringKeyword"); + return false + } else { + return true + } + }, this) + } + } -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) +, fixVersionField: function(data, strict) { + // allow "loose" semver 1.0 versions in non-strict mode + // enforce strict semver 2.0 compliance in strict mode + var loose = !strict + if (!data.version) { + data.version = "" + return true + } + if (!semver.valid(data.version, loose)) { + throw new Error('Invalid version: "'+ data.version + '"') + } + data.version = semver.clean(data.version, loose) + return true + } - var gtfn, ltefn, ltfn, comp, ecomp - switch (hilo) { - case '>': - gtfn = gt - ltefn = lte - ltfn = lt - comp = '>' - ecomp = '>=' - break - case '<': - gtfn = lt - ltefn = gte - ltfn = gt - comp = '<' - ecomp = '<=' - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') +, fixPeople: function(data) { + modifyPeople(data, unParsePerson) + modifyPeople(data, parsePerson) } - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false +, fixNameField: function(data, options) { + if (typeof options === "boolean") options = {strict: options} + else if (typeof options === "undefined") options = {} + var strict = options.strict + if (!data.name && !strict) { + data.name = "" + return + } + if (typeof data.name !== "string") { + throw new Error("name field must be a string.") + } + if (!strict) + data.name = data.name.trim() + ensureValidName(data.name, strict, options.allowLegacyCase) + if (isBuiltinModule(data.name)) + this.warn("conflictingName", data.name) } - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] +, fixDescriptionField: function (data) { + if (data.description && typeof data.description !== 'string') { + this.warn("nonStringDescription") + delete data.description + } + if (data.readme && !data.description) + data.description = extractDescription(data.readme) + if(data.description === undefined) delete data.description; + if (!data.description) this.warn("missingDescription") + } - var high = null - var low = null +, fixReadmeField: function (data) { + if (!data.readme) { + this.warn("missingReadme") + data.readme = "ERROR: No README data found!" + } + } - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') +, fixBugsField: function(data) { + if (!data.bugs && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if(hosted && hosted.bugs()) { + data.bugs = {url: hosted.bugs()} } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator + } + else if(data.bugs) { + var emailRe = /^.+@.*\..+$/ + if(typeof data.bugs == "string") { + if(emailRe.test(data.bugs)) + data.bugs = {email:data.bugs} + else if(url.parse(data.bugs).protocol) + data.bugs = {url: data.bugs} + else + this.warn("nonEmailUrlBugsString") } - }) + else { + bugsTypos(data.bugs, this.warn) + var oldBugs = data.bugs + data.bugs = {} + if(oldBugs.url) { + if(typeof(oldBugs.url) == "string" && url.parse(oldBugs.url).protocol) + data.bugs.url = oldBugs.url + else + this.warn("nonUrlBugsUrlField") + } + if(oldBugs.email) { + if(typeof(oldBugs.email) == "string" && emailRe.test(oldBugs.email)) + data.bugs.email = oldBugs.email + else + this.warn("nonEmailBugsEmailField") + } + } + if(!data.bugs.email && !data.bugs.url) { + delete data.bugs + this.warn("emptyNormalizedBugs") + } + } + } - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false +, fixHomepageField: function(data) { + if (!data.homepage && data.repository && data.repository.url) { + var hosted = hostedGitInfo.fromUrl(data.repository.url) + if (hosted && hosted.docs()) data.homepage = hosted.docs() } + if (!data.homepage) return - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false + if(typeof data.homepage !== "string") { + this.warn("nonUrlHomepage") + return delete data.homepage + } + if(!url.parse(data.homepage).protocol) { + data.homepage = "http://" + data.homepage } } - return true -} -exports.prerelease = prerelease -function prerelease (version, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +, fixLicenseField: function(data) { + if (!data.license) { + return this.warn("missingLicense") + } else{ + if ( + typeof(data.license) !== 'string' || + data.license.length < 1 || + data.license.trim() === '' + ) { + this.warn("invalidLicense") + } else { + if (!validateLicense(data.license).validForNewPackages) + this.warn("invalidLicense") + } + } + } } -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} +function isValidScopedPackageName(spec) { + if (spec.charAt(0) !== '@') return false -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version - } + var rest = spec.slice(1).split('/') + if (rest.length !== 2) return false - if (typeof version !== 'string') { - return null - } + return rest[0] && rest[1] && + rest[0] === encodeURIComponent(rest[0]) && + rest[1] === encodeURIComponent(rest[1]) +} - var match = version.match(re[COERCE]) +function isCorrectlyEncodedName(spec) { + return !spec.match(/[\/@\s\+%:]/) && + spec === encodeURIComponent(spec) +} - if (match == null) { - return null +function ensureValidName (name, strict, allowLegacyCase) { + if (name.charAt(0) === "." || + !(isValidScopedPackageName(name) || isCorrectlyEncodedName(name)) || + (strict && (!allowLegacyCase) && name !== name.toLowerCase()) || + name.toLowerCase() === "node_modules" || + name.toLowerCase() === "favicon.ico") { + throw new Error("Invalid name: " + JSON.stringify(name)) } - - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) } +function modifyPeople (data, fn) { + if (data.author) data.author = fn(data.author) + ;["maintainers", "contributors"].forEach(function (set) { + if (!Array.isArray(data[set])) return; + data[set] = data[set].map(fn) + }) + return data +} -/***/ }), -/* 183 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(184); -var correct = __webpack_require__(186); - -var genericWarning = ( - 'license should be ' + - 'a valid SPDX license expression (without "LicenseRef"), ' + - '"UNLICENSED", or ' + - '"SEE LICENSE IN "' -); +function unParsePerson (person) { + if (typeof person === "string") return person + var name = person.name || "" + var u = person.url || person.web + var url = u ? (" ("+u+")") : "" + var e = person.email || person.mail + var email = e ? (" <"+e+">") : "" + return name+email+url +} -var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; +function parsePerson (person) { + if (typeof person !== "string") return person + var name = person.match(/^([^\(<]+)/) + var url = person.match(/\(([^\)]+)\)/) + var email = person.match(/<([^>]+)>/) + var obj = {} + if (name && name[0].trim()) obj.name = name[0].trim() + if (email) obj.email = email[1]; + if (url) obj.url = url[1]; + return obj +} -function startsWith(prefix, string) { - return string.slice(0, prefix.length) === prefix; +function addOptionalDepsToDeps (data, warn) { + var o = data.optionalDependencies + if (!o) return; + var d = data.dependencies || {} + Object.keys(o).forEach(function (k) { + d[k] = o[k] + }) + data.dependencies = d } -function usesLicenseRef(ast) { - if (ast.hasOwnProperty('license')) { - var license = ast.license; - return ( - startsWith('LicenseRef', license) || - startsWith('DocumentRef', license) - ); - } else { - return ( - usesLicenseRef(ast.left) || - usesLicenseRef(ast.right) - ); +function depObjectify (deps, type, warn) { + if (!deps) return {} + if (typeof deps === "string") { + deps = deps.trim().split(/[\n\r\s\t ,]+/) } + if (!Array.isArray(deps)) return deps + warn("deprecatedArrayDependencies", type) + var o = {} + deps.filter(function (d) { + return typeof d === "string" + }).forEach(function(d) { + d = d.trim().split(/(:?[@\s><=])/) + var dn = d.shift() + var dv = d.join("") + dv = dv.trim() + dv = dv.replace(/^@/, "") + o[dn] = dv + }) + return o } -module.exports = function(argument) { - var ast; +function objectifyDeps (data, warn) { + depTypes.forEach(function (type) { + if (!data[type]) return; + data[type] = depObjectify(data[type], type, warn) + }) +} - try { - ast = parse(argument); - } catch (e) { - var match - if ( - argument === 'UNLICENSED' || - argument === 'UNLICENCED' - ) { - return { - validForOldPackages: true, - validForNewPackages: true, - unlicensed: true - }; - } else if (match = fileReferenceRE.exec(argument)) { - return { - validForOldPackages: true, - validForNewPackages: true, - inFile: match[1] - }; - } else { - var result = { - validForOldPackages: false, - validForNewPackages: false, - warnings: [genericWarning] - }; - var corrected = correct(argument); - if (corrected) { - result.warnings.push( - 'license is similar to the valid expression "' + corrected + '"' - ); - } - return result; +function bugsTypos(bugs, warn) { + if (!bugs) return + Object.keys(bugs).forEach(function (k) { + if (typos.bugs[k]) { + warn("typo", k, typos.bugs[k], "bugs") + bugs[typos.bugs[k]] = bugs[k] + delete bugs[k] } - } - - if (usesLicenseRef(ast)) { - return { - validForNewPackages: false, - validForOldPackages: false, - spdx: true, - warnings: [genericWarning] - }; - } else { - return { - validForNewPackages: true, - validForOldPackages: true, - spdx: true - }; - } -}; + }) +} /***/ }), -/* 184 */ -/***/ (function(module, exports, __webpack_require__) { +/* 189 */ +/***/ (function(module, exports) { -var parser = __webpack_require__(185).parser +exports = module.exports = SemVer -module.exports = function (argument) { - return parser.parse(argument) +var debug +/* istanbul ignore next */ +if (typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG)) { + debug = function () { + var args = Array.prototype.slice.call(arguments, 0) + args.unshift('SEMVER') + console.log.apply(console, args) + } +} else { + debug = function () {} } +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0' -/***/ }), -/* 185 */ -/***/ (function(module, exports, __webpack_require__) { +var MAX_LENGTH = 256 +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || + /* istanbul ignore next */ 9007199254740991 -/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ -/* - Returns a Parser object of the following structure: +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16 - Parser: { - yy: {} - } +// The actual regexps go on exports.re +var re = exports.re = [] +var src = exports.src = [] +var R = 0 - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, +var NUMERICIDENTIFIER = R++ +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' +var NUMERICIDENTIFIERLOOSE = R++ +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, - } - } +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. +var NONNUMERICIDENTIFIER = R++ +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } +// ## Main Version +// Three dot-separated numeric identifiers. +var MAINVERSION = R++ +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')' - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var spdxparse = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, -terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, -productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ +var MAINVERSIONLOOSE = R++ +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')' -var $0 = $$.length - 1; -switch (yystate) { -case 1: -return this.$ = $$[$0-1] -break; -case 2: case 4: case 5: -this.$ = {license: yytext} -break; -case 3: -this.$ = {license: $$[$0-1], plus: true} -break; -case 6: -this.$ = $$[$0] -break; -case 7: -this.$ = {exception: $$[$0]} -this.$.license = $$[$0-2].license -if ($$[$0-2].hasOwnProperty('plus')) { - this.$.plus = $$[$0-2].plus -} -break; -case 8: -this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} -break; -case 9: -this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} -break; -case 10: -this.$ = $$[$0-1] -break; -} -}, -table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], -defaultActions: {8:[2,1]}, -parseError: function parseError(str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - function _parseError (msg, hash) { - this.message = msg; - this.hash = hash; - } - _parseError.prototype = Error; +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. - throw new _parseError(str, hash); - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; - } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -}}; -/* generated by jison-lex 0.3.4 */ -var lexer = (function(){ -var lexer = ({ +var PRERELEASEIDENTIFIER = R++ +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')' -EOF:1, +var PRERELEASEIDENTIFIERLOOSE = R++ +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')' -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. -// resets the lexer, sets new input -setInput:function (input, yy) { - this.yy = yy || this.yy || {}; - this._input = input; - this._more = this._backtrack = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = { - first_line: 1, - first_column: 0, - last_line: 1, - last_column: 0 - }; - if (this.options.ranges) { - this.yylloc.range = [0,0]; - } - this.offset = 0; - return this; - }, +var PRERELEASE = R++ +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' -// consumes and returns one char from the input -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) { - this.yylloc.range[1]++; - } +var PRERELEASELOOSE = R++ +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' - this._input = this._input.slice(1); - return ch; - }, +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. -// unshifts one char (or a string) into the input -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); +var BUILDIDENTIFIER = R++ +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. - if (lines.length - 1) { - this.yylineno -= lines.length - 1; - } - var r = this.yylloc.range; +var BUILD = R++ +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' - this.yylloc = { - first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) - + oldLines[oldLines.length - lines.length].length - lines[0].length : - this.yylloc.first_column - len - }; +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - this.yyleng = this.yytext.length; - return this; - }, +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. -// When called from action, caches matched text and appends it on next action -more:function () { - this._more = true; - return this; - }, +var FULL = R++ +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?' -// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. -reject:function () { - if (this.options.backtrack_lexer) { - this._backtrack = true; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); +src[FULL] = '^' + FULLPLAIN + '$' - } - return this; - }, +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?' -// retain first n characters of the match -less:function (n) { - this.unput(this.match.slice(n)); - }, +var LOOSE = R++ +src[LOOSE] = '^' + LOOSEPLAIN + '$' -// displays already matched input, i.e. for error messages -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, +var GTLT = R++ +src[GTLT] = '((?:<|>)?=?)' -// displays upcoming input, i.e. for error messages -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); - }, +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++ +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' +var XRANGEIDENTIFIER = R++ +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' -// displays the character position where the lexing error occurred, i.e. for error messages -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, +var XRANGEPLAIN = R++ +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?' -// test the lexed token: return FALSE when not a match, otherwise return token -test_match:function (match, indexed_rule) { - var token, - lines, - backup; +var XRANGEPLAINLOOSE = R++ +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?' - if (this.options.backtrack_lexer) { - // save context - backup = { - yylineno: this.yylineno, - yylloc: { - first_line: this.yylloc.first_line, - last_line: this.last_line, - first_column: this.yylloc.first_column, - last_column: this.yylloc.last_column - }, - yytext: this.yytext, - match: this.match, - matches: this.matches, - matched: this.matched, - yyleng: this.yyleng, - offset: this.offset, - _more: this._more, - _input: this._input, - yy: this.yy, - conditionStack: this.conditionStack.slice(0), - done: this.done - }; - if (this.options.ranges) { - backup.yylloc.range = this.yylloc.range.slice(0); - } - } +var XRANGE = R++ +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' +var XRANGELOOSE = R++ +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno += lines.length; - } - this.yylloc = { - first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? - lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : - this.yylloc.last_column + match[0].length - }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._backtrack = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) { - this.done = false; - } - if (token) { - return token; - } else if (this._backtrack) { - // recover context - for (var k in backup) { - this[k] = backup[k]; - } - return false; // rule action called reject() implying the next rule should be tested instead. - } - return false; - }, +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++ +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])' -// return next match in input -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) { - this.done = true; - } +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++ +src[LONETILDE] = '(?:~>?)' - var token, - match, - tempMatch, - index; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (this.options.backtrack_lexer) { - token = this.test_match(tempMatch, rules[i]); - if (token !== false) { - return token; - } else if (this._backtrack) { - match = false; - continue; // rule action called reject() implying a rule MISmatch. - } else { - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - } else if (!this.options.flex) { - break; - } - } - } - if (match) { - token = this.test_match(match, rules[index]); - if (token !== false) { - return token; - } - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - } - }, +var TILDETRIM = R++ +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') +var tildeTrimReplace = '$1~' -// return next match that has a token -lex:function lex() { - var r = this.next(); - if (r) { - return r; - } else { - return this.lex(); - } - }, +var TILDE = R++ +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' +var TILDELOOSE = R++ +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -begin:function begin(condition) { - this.conditionStack.push(condition); - }, +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++ +src[LONECARET] = '(?:\\^)' -// pop the previously active lexer condition state off the condition stack -popState:function popState() { - var n = this.conditionStack.length - 1; - if (n > 0) { - return this.conditionStack.pop(); - } else { - return this.conditionStack[0]; - } - }, +var CARETTRIM = R++ +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') +var caretTrimReplace = '$1^' -// produce the lexer rule set which is active for the currently active lexer condition state -_currentRules:function _currentRules() { - if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - } else { - return this.conditions["INITIAL"].rules; - } - }, +var CARET = R++ +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' +var CARETLOOSE = R++ +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' -// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available -topState:function topState(n) { - n = this.conditionStack.length - 1 - Math.abs(n || 0); - if (n >= 0) { - return this.conditionStack[n]; - } else { - return "INITIAL"; +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++ +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' +var COMPARATOR = R++ +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++ +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') +var comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++ +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$' + +var HYPHENRANGELOOSE = R++ +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$' + +// Star ranges basically just allow anything at all. +var STAR = R++ +src[STAR] = '(<|>)?=?\\s*\\*' + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]) + if (!re[i]) { + re[i] = new RegExp(src[i]) + } +} + +exports.parse = parse +function parse (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + if (version.length > MAX_LENGTH) { + return null + } + + var r = options.loose ? re[LOOSE] : re[FULL] + if (!r.test(version)) { + return null + } + + try { + return new SemVer(version, options) + } catch (er) { + return null + } +} + +exports.valid = valid +function valid (version, options) { + var v = parse(version, options) + return v ? v.version : null +} + +exports.clean = clean +function clean (version, options) { + var s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} + +exports.SemVer = SemVer + +function SemVer (version, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + if (version instanceof SemVer) { + if (version.loose === options.loose) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + } + + if (!(this instanceof SemVer)) { + return new SemVer(version, options) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + + var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + + if (!m) { + throw new TypeError('Invalid Version: ' + version) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map(function (id) { + if (/^[0-9]+$/.test(id)) { + var num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num } - }, + } + return id + }) + } -// alias for begin(condition) -pushState:function pushState(condition) { - this.begin(condition); - }, + this.build = m[5] ? m[5].split('.') : [] + this.format() +} -// return the number of states currently on the stack -stateStackSize:function stateStackSize() { - return this.conditionStack.length; - }, -options: {}, -performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { -var YYSTATE=YY_START; -switch($avoiding_name_collisions) { -case 0:return 5 -break; -case 1:/* skip whitespace */ -break; -case 2:return 8 -break; -case 3:return 16 -break; -case 4:return 17 -break; -case 5:return 11 -break; -case 6:return 10 -break; -case 7:return 9 -break; -case 8:return 14 -break; -case 9:return 15 -break; -case 10:return 12 -break; -case 11:return 7 -break; -case 12:return 7 -break; -case 13:return 7 -break; -case 14:return 7 -break; -case 15:return 7 -break; -case 16:return 7 -break; -case 17:return 7 -break; -case 18:return 7 -break; -case 19:return 7 -break; -case 20:return 7 -break; -case 21:return 7 -break; -case 22:return 7 -break; -case 23:return 7 -break; -case 24:return 13 -break; -case 25:return 13 -break; -case 26:return 13 -break; -case 27:return 13 -break; -case 28:return 13 -break; -case 29:return 13 -break; -case 30:return 13 -break; -case 31:return 13 -break; -case 32:return 7 -break; -case 33:return 13 -break; -case 34:return 7 -break; -case 35:return 13 -break; -case 36:return 7 -break; -case 37:return 13 -break; -case 38:return 13 -break; +SemVer.prototype.format = function () { + this.version = this.major + '.' + this.minor + '.' + this.patch + if (this.prerelease.length) { + this.version += '-' + this.prerelease.join('.') + } + return this.version +} + +SemVer.prototype.toString = function () { + return this.version +} + +SemVer.prototype.compare = function (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return this.compareMain(other) || this.comparePre(other) +} + +SemVer.prototype.compareMain = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) +} + +SemVer.prototype.comparePre = function (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + var i = 0 + do { + var a = this.prerelease[i] + var b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) +} + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function (release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier) + this.inc('pre', identifier) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier) + } + this.inc('pre', identifier) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) { + this.prerelease = [0] + } else { + var i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + this.prerelease.push(0) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) { + this.prerelease = [identifier, 0] + } + } else { + this.prerelease = [identifier, 0] + } + } + break + + default: + throw new Error('invalid increment argument: ' + release) + } + this.format() + this.raw = this.version + return this +} + +exports.inc = inc +function inc (version, release, loose, identifier) { + if (typeof (loose) === 'string') { + identifier = loose + loose = undefined + } + + try { + return new SemVer(version, loose).inc(release, identifier).version + } catch (er) { + return null + } +} + +exports.diff = diff +function diff (version1, version2) { + if (eq(version1, version2)) { + return null + } else { + var v1 = parse(version1) + var v2 = parse(version2) + var prefix = '' + if (v1.prerelease.length || v2.prerelease.length) { + prefix = 'pre' + var defaultResult = 'prerelease' + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return prefix + key + } + } + } + return defaultResult // may be undefined + } +} + +exports.compareIdentifiers = compareIdentifiers + +var numeric = /^[0-9]+$/ +function compareIdentifiers (a, b) { + var anum = numeric.test(a) + var bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +exports.rcompareIdentifiers = rcompareIdentifiers +function rcompareIdentifiers (a, b) { + return compareIdentifiers(b, a) +} + +exports.major = major +function major (a, loose) { + return new SemVer(a, loose).major +} + +exports.minor = minor +function minor (a, loose) { + return new SemVer(a, loose).minor +} + +exports.patch = patch +function patch (a, loose) { + return new SemVer(a, loose).patch +} + +exports.compare = compare +function compare (a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)) +} + +exports.compareLoose = compareLoose +function compareLoose (a, b) { + return compare(a, b, true) +} + +exports.rcompare = rcompare +function rcompare (a, b, loose) { + return compare(b, a, loose) +} + +exports.sort = sort +function sort (list, loose) { + return list.sort(function (a, b) { + return exports.compare(a, b, loose) + }) +} + +exports.rsort = rsort +function rsort (list, loose) { + return list.sort(function (a, b) { + return exports.rcompare(a, b, loose) + }) +} + +exports.gt = gt +function gt (a, b, loose) { + return compare(a, b, loose) > 0 +} + +exports.lt = lt +function lt (a, b, loose) { + return compare(a, b, loose) < 0 +} + +exports.eq = eq +function eq (a, b, loose) { + return compare(a, b, loose) === 0 +} + +exports.neq = neq +function neq (a, b, loose) { + return compare(a, b, loose) !== 0 +} + +exports.gte = gte +function gte (a, b, loose) { + return compare(a, b, loose) >= 0 +} + +exports.lte = lte +function lte (a, b, loose) { + return compare(a, b, loose) <= 0 +} + +exports.cmp = cmp +function cmp (a, op, b, loose) { + switch (op) { + case '===': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a === b + + case '!==': + if (typeof a === 'object') + a = a.version + if (typeof b === 'object') + b = b.version + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError('Invalid operator: ' + op) + } +} + +exports.Comparator = Comparator +function Comparator (comp, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + if (!(this instanceof Comparator)) { + return new Comparator(comp, options) + } + + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) +} + +var ANY = {} +Comparator.prototype.parse = function (comp) { + var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var m = comp.match(r) + + if (!m) { + throw new TypeError('Invalid comparator: ' + comp) + } + + this.operator = m[1] + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } +} + +Comparator.prototype.toString = function () { + return this.value +} + +Comparator.prototype.test = function (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY) { + return true + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + return cmp(version, this.operator, this.semver, this.options) +} + +Comparator.prototype.intersects = function (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + var rangeTmp + + if (this.operator === '') { + rangeTmp = new Range(comp.value, options) + return satisfies(this.value, rangeTmp, options) + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, options) + return satisfies(comp.semver, rangeTmp, options) + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>') + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<') + var sameSemVer = this.semver.version === comp.semver.version + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<=') + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, options) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')) + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, options) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')) + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan +} + +exports.Range = Range +function Range (range, options) { + if (!options || typeof options !== 'object') { + options = { + loose: !!options, + includePrerelease: false + } + } + + if (range instanceof Range) { + if (range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + return new Range(range.value, options) + } + + if (!(this instanceof Range)) { + return new Range(range, options) + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First, split based on boolean or || + this.raw = range + this.set = range.split(/\s*\|\|\s*/).map(function (range) { + return this.parseRange(range.trim()) + }, this).filter(function (c) { + // throw out any that are not relevant for whatever reason + return c.length + }) + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range) + } + + this.format() +} + +Range.prototype.format = function () { + this.range = this.set.map(function (comps) { + return comps.join(' ').trim() + }).join('||').trim() + return this.range +} + +Range.prototype.toString = function () { + return this.range +} + +Range.prototype.parseRange = function (range) { + var loose = this.options.loose + range = range.trim() + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] + range = range.replace(hr, hyphenReplace) + debug('hyphen replace', range) + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range, re[COMPARATORTRIM]) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace) + + // normalize spaces + range = range.split(/\s+/).join(' ') + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] + var set = range.split(' ').map(function (comp) { + return parseComparator(comp, this.options) + }, this).join(' ').split(/\s+/) + if (this.options.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function (comp) { + return !!comp.match(compRe) + }) + } + set = set.map(function (comp) { + return new Comparator(comp, this.options) + }, this) + + return set +} + +Range.prototype.intersects = function (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some(function (thisComparators) { + return thisComparators.every(function (thisComparator) { + return range.set.some(function (rangeComparators) { + return rangeComparators.every(function (rangeComparator) { + return thisComparator.intersects(rangeComparator, options) + }) + }) + }) + }) +} + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators +function toComparators (range, options) { + return new Range(range, options).set.map(function (comp) { + return comp.map(function (c) { + return c.value + }).join(' ').trim().split(' ') + }) +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator (comp, options) { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +function isX (id) { + return !id || id.toLowerCase() === 'x' || id === '*' +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceTilde(comp, options) + }).join(' ') +} + +function replaceTilde (comp, options) { + var r = options.loose ? re[TILDELOOSE] : re[TILDE] + return comp.replace(r, function (_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else if (pr) { + debug('replaceTilde pr', pr) + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } else { + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets (comp, options) { + return comp.trim().split(/\s+/).map(function (comp) { + return replaceCaret(comp, options) + }).join(' ') +} + +function replaceCaret (comp, options) { + debug('caret', comp, options) + var r = options.loose ? re[CARETLOOSE] : re[CARET] + return comp.replace(r, function (_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr) + var ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (isX(p)) { + if (M === '0') { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } else { + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + '-' + pr + + ' <' + (+M + 1) + '.0.0' + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1) + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0' + } + } else { + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0' + } + } + + debug('caret return', ret) + return ret + }) +} + +function replaceXRanges (comp, options) { + debug('replaceXRanges', comp, options) + return comp.split(/\s+/).map(function (comp) { + return replaceXRange(comp, options) + }).join(' ') +} + +function replaceXRange (comp, options) { + comp = comp.trim() + var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] + return comp.replace(r, function (ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + var xM = isX(M) + var xm = xM || isX(m) + var xp = xm || isX(p) + var anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } + + ret = gtlt + M + '.' + m + '.' + p + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + } + + debug('xRange return', ret) + + return ret + }) +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars (comp, options) { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], '') +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = '>=' + fM + '.0.0' + } else if (isX(fp)) { + from = '>=' + fM + '.' + fm + '.0' + } else { + from = '>=' + from + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = '<' + (+tM + 1) + '.0.0' + } else if (isX(tp)) { + to = '<' + tM + '.' + (+tm + 1) + '.0' + } else if (tpr) { + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr + } else { + to = '<=' + to + } + + return (from + ' ' + to).trim() +} + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + version = new SemVer(version, this.options) + } + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false +} + +function testSet (set, version, options) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true +} + +exports.satisfies = satisfies +function satisfies (version, range, options) { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} + +exports.maxSatisfying = maxSatisfying +function maxSatisfying (versions, range, options) { + var max = null + var maxSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} + +exports.minSatisfying = minSatisfying +function minSatisfying (versions, range, options) { + var min = null + var minSV = null + try { + var rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} + +exports.minVersion = minVersion +function minVersion (range, loose) { + range = new Range(range, loose) + + var minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + comparators.forEach(function (comparator) { + // Clone to avoid manipulating the comparator's semver object. + var compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!minver || gt(minver, compver)) { + minver = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error('Unexpected operation: ' + comparator.operator) + } + }) + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} + +exports.validRange = validRange +function validRange (range, options) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr +function ltr (version, range, options) { + return outside(version, range, '<', options) +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr +function gtr (version, range, options) { + return outside(version, range, '>', options) +} + +exports.outside = outside +function outside (version, range, hilo, options) { + version = new SemVer(version, options) + range = new Range(range, options) + + var gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i] + + var high = null + var low = null + + comparators.forEach(function (comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true +} + +exports.prerelease = prerelease +function prerelease (version, options) { + var parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} + +exports.intersects = intersects +function intersects (r1, r2, options) { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2) +} + +exports.coerce = coerce +function coerce (version) { + if (version instanceof SemVer) { + return version + } + + if (typeof version !== 'string') { + return null + } + + var match = version.match(re[COERCE]) + + if (match == null) { + return null + } + + return parse(match[1] + + '.' + (match[2] || '0') + + '.' + (match[3] || '0')) +} + + +/***/ }), +/* 190 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(191); +var correct = __webpack_require__(193); + +var genericWarning = ( + 'license should be ' + + 'a valid SPDX license expression (without "LicenseRef"), ' + + '"UNLICENSED", or ' + + '"SEE LICENSE IN "' +); + +var fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/; + +function startsWith(prefix, string) { + return string.slice(0, prefix.length) === prefix; +} + +function usesLicenseRef(ast) { + if (ast.hasOwnProperty('license')) { + var license = ast.license; + return ( + startsWith('LicenseRef', license) || + startsWith('DocumentRef', license) + ); + } else { + return ( + usesLicenseRef(ast.left) || + usesLicenseRef(ast.right) + ); + } +} + +module.exports = function(argument) { + var ast; + + try { + ast = parse(argument); + } catch (e) { + var match + if ( + argument === 'UNLICENSED' || + argument === 'UNLICENCED' + ) { + return { + validForOldPackages: true, + validForNewPackages: true, + unlicensed: true + }; + } else if (match = fileReferenceRE.exec(argument)) { + return { + validForOldPackages: true, + validForNewPackages: true, + inFile: match[1] + }; + } else { + var result = { + validForOldPackages: false, + validForNewPackages: false, + warnings: [genericWarning] + }; + var corrected = correct(argument); + if (corrected) { + result.warnings.push( + 'license is similar to the valid expression "' + corrected + '"' + ); + } + return result; + } + } + + if (usesLicenseRef(ast)) { + return { + validForNewPackages: false, + validForOldPackages: false, + spdx: true, + warnings: [genericWarning] + }; + } else { + return { + validForNewPackages: true, + validForOldPackages: true, + spdx: true + }; + } +}; + + +/***/ }), +/* 191 */ +/***/ (function(module, exports, __webpack_require__) { + +var parser = __webpack_require__(192).parser + +module.exports = function (argument) { + return parser.parse(argument) +} + + +/***/ }), +/* 192 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var spdxparse = (function(){ +var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,5],$V1=[1,6],$V2=[1,7],$V3=[1,4],$V4=[1,9],$V5=[1,10],$V6=[5,14,15,17],$V7=[5,12,14,15,17]; +var parser = {trace: function trace() { }, +yy: {}, +symbols_: {"error":2,"start":3,"expression":4,"EOS":5,"simpleExpression":6,"LICENSE":7,"PLUS":8,"LICENSEREF":9,"DOCUMENTREF":10,"COLON":11,"WITH":12,"EXCEPTION":13,"AND":14,"OR":15,"OPEN":16,"CLOSE":17,"$accept":0,"$end":1}, +terminals_: {2:"error",5:"EOS",7:"LICENSE",8:"PLUS",9:"LICENSEREF",10:"DOCUMENTREF",11:"COLON",12:"WITH",13:"EXCEPTION",14:"AND",15:"OR",16:"OPEN",17:"CLOSE"}, +productions_: [0,[3,2],[6,1],[6,2],[6,1],[6,3],[4,1],[4,3],[4,3],[4,3],[4,3]], +performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { +/* this == yyval */ + +var $0 = $$.length - 1; +switch (yystate) { +case 1: +return this.$ = $$[$0-1] +break; +case 2: case 4: case 5: +this.$ = {license: yytext} +break; +case 3: +this.$ = {license: $$[$0-1], plus: true} +break; +case 6: +this.$ = $$[$0] +break; +case 7: +this.$ = {exception: $$[$0]} +this.$.license = $$[$0-2].license +if ($$[$0-2].hasOwnProperty('plus')) { + this.$.plus = $$[$0-2].plus +} +break; +case 8: +this.$ = {conjunction: 'and', left: $$[$0-2], right: $$[$0]} +break; +case 9: +this.$ = {conjunction: 'or', left: $$[$0-2], right: $$[$0]} +break; +case 10: +this.$ = $$[$0-1] +break; +} +}, +table: [{3:1,4:2,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{1:[3]},{5:[1,8],14:$V4,15:$V5},o($V6,[2,6],{12:[1,11]}),{4:12,6:3,7:$V0,9:$V1,10:$V2,16:$V3},o($V7,[2,2],{8:[1,13]}),o($V7,[2,4]),{11:[1,14]},{1:[2,1]},{4:15,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{4:16,6:3,7:$V0,9:$V1,10:$V2,16:$V3},{13:[1,17]},{14:$V4,15:$V5,17:[1,18]},o($V7,[2,3]),{9:[1,19]},o($V6,[2,8]),o([5,15,17],[2,9],{14:$V4}),o($V6,[2,7]),o($V6,[2,10]),o($V7,[2,5])], +defaultActions: {8:[2,1]}, +parseError: function parseError(str, hash) { + if (hash.recoverable) { + this.trace(str); + } else { + function _parseError (msg, hash) { + this.message = msg; + this.hash = hash; + } + _parseError.prototype = Error; + + throw new _parseError(str, hash); + } +}, +parse: function parse(input) { + var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; + var args = lstack.slice.call(arguments, 1); + var lexer = Object.create(this.lexer); + var sharedState = { yy: {} }; + for (var k in this.yy) { + if (Object.prototype.hasOwnProperty.call(this.yy, k)) { + sharedState.yy[k] = this.yy[k]; + } + } + lexer.setInput(input, sharedState.yy); + sharedState.yy.lexer = lexer; + sharedState.yy.parser = this; + if (typeof lexer.yylloc == 'undefined') { + lexer.yylloc = {}; + } + var yyloc = lexer.yylloc; + lstack.push(yyloc); + var ranges = lexer.options && lexer.options.ranges; + if (typeof sharedState.yy.parseError === 'function') { + this.parseError = sharedState.yy.parseError; + } else { + this.parseError = Object.getPrototypeOf(this).parseError; + } + function popStack(n) { + stack.length = stack.length - 2 * n; + vstack.length = vstack.length - n; + lstack.length = lstack.length - n; + } + _token_stack: + var lex = function () { + var token; + token = lexer.lex() || EOF; + if (typeof token !== 'number') { + token = self.symbols_[token] || token; + } + return token; + }; + var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; + while (true) { + state = stack[stack.length - 1]; + if (this.defaultActions[state]) { + action = this.defaultActions[state]; + } else { + if (symbol === null || typeof symbol == 'undefined') { + symbol = lex(); + } + action = table[state] && table[state][symbol]; + } + if (typeof action === 'undefined' || !action.length || !action[0]) { + var errStr = ''; + expected = []; + for (p in table[state]) { + if (this.terminals_[p] && p > TERROR) { + expected.push('\'' + this.terminals_[p] + '\''); + } + } + if (lexer.showPosition) { + errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; + } else { + errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); + } + this.parseError(errStr, { + text: lexer.match, + token: this.terminals_[symbol] || symbol, + line: lexer.yylineno, + loc: yyloc, + expected: expected + }); + } + if (action[0] instanceof Array && action.length > 1) { + throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); + } + switch (action[0]) { + case 1: + stack.push(symbol); + vstack.push(lexer.yytext); + lstack.push(lexer.yylloc); + stack.push(action[1]); + symbol = null; + if (!preErrorSymbol) { + yyleng = lexer.yyleng; + yytext = lexer.yytext; + yylineno = lexer.yylineno; + yyloc = lexer.yylloc; + if (recovering > 0) { + recovering--; + } + } else { + symbol = preErrorSymbol; + preErrorSymbol = null; + } + break; + case 2: + len = this.productions_[action[1]][1]; + yyval.$ = vstack[vstack.length - len]; + yyval._$ = { + first_line: lstack[lstack.length - (len || 1)].first_line, + last_line: lstack[lstack.length - 1].last_line, + first_column: lstack[lstack.length - (len || 1)].first_column, + last_column: lstack[lstack.length - 1].last_column + }; + if (ranges) { + yyval._$.range = [ + lstack[lstack.length - (len || 1)].range[0], + lstack[lstack.length - 1].range[1] + ]; + } + r = this.performAction.apply(yyval, [ + yytext, + yyleng, + yylineno, + sharedState.yy, + action[1], + vstack, + lstack + ].concat(args)); + if (typeof r !== 'undefined') { + return r; + } + if (len) { + stack = stack.slice(0, -1 * len * 2); + vstack = vstack.slice(0, -1 * len); + lstack = lstack.slice(0, -1 * len); + } + stack.push(this.productions_[action[1]][0]); + vstack.push(yyval.$); + lstack.push(yyval._$); + newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; + stack.push(newState); + break; + case 3: + return true; + } + } + return true; +}}; +/* generated by jison-lex 0.3.4 */ +var lexer = (function(){ +var lexer = ({ + +EOF:1, + +parseError:function parseError(str, hash) { + if (this.yy.parser) { + this.yy.parser.parseError(str, hash); + } else { + throw new Error(str); + } + }, + +// resets the lexer, sets new input +setInput:function (input, yy) { + this.yy = yy || this.yy || {}; + this._input = input; + this._more = this._backtrack = this.done = false; + this.yylineno = this.yyleng = 0; + this.yytext = this.matched = this.match = ''; + this.conditionStack = ['INITIAL']; + this.yylloc = { + first_line: 1, + first_column: 0, + last_line: 1, + last_column: 0 + }; + if (this.options.ranges) { + this.yylloc.range = [0,0]; + } + this.offset = 0; + return this; + }, + +// consumes and returns one char from the input +input:function () { + var ch = this._input[0]; + this.yytext += ch; + this.yyleng++; + this.offset++; + this.match += ch; + this.matched += ch; + var lines = ch.match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno++; + this.yylloc.last_line++; + } else { + this.yylloc.last_column++; + } + if (this.options.ranges) { + this.yylloc.range[1]++; + } + + this._input = this._input.slice(1); + return ch; + }, + +// unshifts one char (or a string) into the input +unput:function (ch) { + var len = ch.length; + var lines = ch.split(/(?:\r\n?|\n)/g); + + this._input = ch + this._input; + this.yytext = this.yytext.substr(0, this.yytext.length - len); + //this.yyleng -= len; + this.offset -= len; + var oldLines = this.match.split(/(?:\r\n?|\n)/g); + this.match = this.match.substr(0, this.match.length - 1); + this.matched = this.matched.substr(0, this.matched.length - 1); + + if (lines.length - 1) { + this.yylineno -= lines.length - 1; + } + var r = this.yylloc.range; + + this.yylloc = { + first_line: this.yylloc.first_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.first_column, + last_column: lines ? + (lines.length === oldLines.length ? this.yylloc.first_column : 0) + + oldLines[oldLines.length - lines.length].length - lines[0].length : + this.yylloc.first_column - len + }; + + if (this.options.ranges) { + this.yylloc.range = [r[0], r[0] + this.yyleng - len]; + } + this.yyleng = this.yytext.length; + return this; + }, + +// When called from action, caches matched text and appends it on next action +more:function () { + this._more = true; + return this; + }, + +// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. +reject:function () { + if (this.options.backtrack_lexer) { + this._backtrack = true; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + + } + return this; + }, + +// retain first n characters of the match +less:function (n) { + this.unput(this.match.slice(n)); + }, + +// displays already matched input, i.e. for error messages +pastInput:function () { + var past = this.matched.substr(0, this.matched.length - this.match.length); + return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); + }, + +// displays upcoming input, i.e. for error messages +upcomingInput:function () { + var next = this.match; + if (next.length < 20) { + next += this._input.substr(0, 20-next.length); + } + return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); + }, + +// displays the character position where the lexing error occurred, i.e. for error messages +showPosition:function () { + var pre = this.pastInput(); + var c = new Array(pre.length + 1).join("-"); + return pre + this.upcomingInput() + "\n" + c + "^"; + }, + +// test the lexed token: return FALSE when not a match, otherwise return token +test_match:function (match, indexed_rule) { + var token, + lines, + backup; + + if (this.options.backtrack_lexer) { + // save context + backup = { + yylineno: this.yylineno, + yylloc: { + first_line: this.yylloc.first_line, + last_line: this.last_line, + first_column: this.yylloc.first_column, + last_column: this.yylloc.last_column + }, + yytext: this.yytext, + match: this.match, + matches: this.matches, + matched: this.matched, + yyleng: this.yyleng, + offset: this.offset, + _more: this._more, + _input: this._input, + yy: this.yy, + conditionStack: this.conditionStack.slice(0), + done: this.done + }; + if (this.options.ranges) { + backup.yylloc.range = this.yylloc.range.slice(0); + } + } + + lines = match[0].match(/(?:\r\n?|\n).*/g); + if (lines) { + this.yylineno += lines.length; + } + this.yylloc = { + first_line: this.yylloc.last_line, + last_line: this.yylineno + 1, + first_column: this.yylloc.last_column, + last_column: lines ? + lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : + this.yylloc.last_column + match[0].length + }; + this.yytext += match[0]; + this.match += match[0]; + this.matches = match; + this.yyleng = this.yytext.length; + if (this.options.ranges) { + this.yylloc.range = [this.offset, this.offset += this.yyleng]; + } + this._more = false; + this._backtrack = false; + this._input = this._input.slice(match[0].length); + this.matched += match[0]; + token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); + if (this.done && this._input) { + this.done = false; + } + if (token) { + return token; + } else if (this._backtrack) { + // recover context + for (var k in backup) { + this[k] = backup[k]; + } + return false; // rule action called reject() implying the next rule should be tested instead. + } + return false; + }, + +// return next match in input +next:function () { + if (this.done) { + return this.EOF; + } + if (!this._input) { + this.done = true; + } + + var token, + match, + tempMatch, + index; + if (!this._more) { + this.yytext = ''; + this.match = ''; + } + var rules = this._currentRules(); + for (var i = 0; i < rules.length; i++) { + tempMatch = this._input.match(this.rules[rules[i]]); + if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { + match = tempMatch; + index = i; + if (this.options.backtrack_lexer) { + token = this.test_match(tempMatch, rules[i]); + if (token !== false) { + return token; + } else if (this._backtrack) { + match = false; + continue; // rule action called reject() implying a rule MISmatch. + } else { + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + } else if (!this.options.flex) { + break; + } + } + } + if (match) { + token = this.test_match(match, rules[index]); + if (token !== false) { + return token; + } + // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) + return false; + } + if (this._input === "") { + return this.EOF; + } else { + return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { + text: "", + token: null, + line: this.yylineno + }); + } + }, + +// return next match that has a token +lex:function lex() { + var r = this.next(); + if (r) { + return r; + } else { + return this.lex(); + } + }, + +// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) +begin:function begin(condition) { + this.conditionStack.push(condition); + }, + +// pop the previously active lexer condition state off the condition stack +popState:function popState() { + var n = this.conditionStack.length - 1; + if (n > 0) { + return this.conditionStack.pop(); + } else { + return this.conditionStack[0]; + } + }, + +// produce the lexer rule set which is active for the currently active lexer condition state +_currentRules:function _currentRules() { + if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { + return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; + } else { + return this.conditions["INITIAL"].rules; + } + }, + +// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available +topState:function topState(n) { + n = this.conditionStack.length - 1 - Math.abs(n || 0); + if (n >= 0) { + return this.conditionStack[n]; + } else { + return "INITIAL"; + } + }, + +// alias for begin(condition) +pushState:function pushState(condition) { + this.begin(condition); + }, + +// return the number of states currently on the stack +stateStackSize:function stateStackSize() { + return this.conditionStack.length; + }, +options: {}, +performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { +var YYSTATE=YY_START; +switch($avoiding_name_collisions) { +case 0:return 5 +break; +case 1:/* skip whitespace */ +break; +case 2:return 8 +break; +case 3:return 16 +break; +case 4:return 17 +break; +case 5:return 11 +break; +case 6:return 10 +break; +case 7:return 9 +break; +case 8:return 14 +break; +case 9:return 15 +break; +case 10:return 12 +break; +case 11:return 7 +break; +case 12:return 7 +break; +case 13:return 7 +break; +case 14:return 7 +break; +case 15:return 7 +break; +case 16:return 7 +break; +case 17:return 7 +break; +case 18:return 7 +break; +case 19:return 7 +break; +case 20:return 7 +break; +case 21:return 7 +break; +case 22:return 7 +break; +case 23:return 7 +break; +case 24:return 13 +break; +case 25:return 13 +break; +case 26:return 13 +break; +case 27:return 13 +break; +case 28:return 13 +break; +case 29:return 13 +break; +case 30:return 13 +break; +case 31:return 13 +break; +case 32:return 7 +break; +case 33:return 13 +break; +case 34:return 7 +break; +case 35:return 13 +break; +case 36:return 7 +break; +case 37:return 13 +break; +case 38:return 13 +break; case 39:return 7 break; case 40:return 13 @@ -19627,4372 +20900,6162 @@ break; case 364:return 7 break; } -}, -rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} -}); -return lexer; -})(); -parser.lexer = lexer; -function Parser () { - this.yy = {}; +}, +rules: [/^(?:$)/,/^(?:\s+)/,/^(?:\+)/,/^(?:\()/,/^(?:\))/,/^(?::)/,/^(?:DocumentRef-([0-9A-Za-z-+.]+))/,/^(?:LicenseRef-([0-9A-Za-z-+.]+))/,/^(?:AND)/,/^(?:OR)/,/^(?:WITH)/,/^(?:BSD-3-Clause-No-Nuclear-License-2014)/,/^(?:BSD-3-Clause-No-Nuclear-Warranty)/,/^(?:GPL-2\.0-with-classpath-exception)/,/^(?:GPL-3\.0-with-autoconf-exception)/,/^(?:GPL-2\.0-with-autoconf-exception)/,/^(?:BSD-3-Clause-No-Nuclear-License)/,/^(?:MPL-2\.0-no-copyleft-exception)/,/^(?:GPL-2\.0-with-bison-exception)/,/^(?:GPL-2\.0-with-font-exception)/,/^(?:GPL-2\.0-with-GCC-exception)/,/^(?:CNRI-Python-GPL-Compatible)/,/^(?:GPL-3\.0-with-GCC-exception)/,/^(?:BSD-3-Clause-Attribution)/,/^(?:Classpath-exception-2\.0)/,/^(?:WxWindows-exception-3\.1)/,/^(?:freertos-exception-2\.0)/,/^(?:Autoconf-exception-3\.0)/,/^(?:i2p-gpl-java-exception)/,/^(?:gnu-javamail-exception)/,/^(?:Nokia-Qt-exception-1\.1)/,/^(?:Autoconf-exception-2\.0)/,/^(?:BSD-2-Clause-FreeBSD)/,/^(?:u-boot-exception-2\.0)/,/^(?:zlib-acknowledgement)/,/^(?:Bison-exception-2\.2)/,/^(?:BSD-2-Clause-NetBSD)/,/^(?:CLISP-exception-2\.0)/,/^(?:eCos-exception-2\.0)/,/^(?:BSD-3-Clause-Clear)/,/^(?:Font-exception-2\.0)/,/^(?:FLTK-exception-2\.0)/,/^(?:GCC-exception-2\.0)/,/^(?:Qwt-exception-1\.0)/,/^(?:Libtool-exception)/,/^(?:BSD-3-Clause-LBNL)/,/^(?:GCC-exception-3\.1)/,/^(?:Artistic-1\.0-Perl)/,/^(?:Artistic-1\.0-cl8)/,/^(?:CC-BY-NC-SA-2\.5)/,/^(?:MIT-advertising)/,/^(?:BSD-Source-Code)/,/^(?:CC-BY-NC-SA-4\.0)/,/^(?:LiLiQ-Rplus-1\.1)/,/^(?:CC-BY-NC-SA-3\.0)/,/^(?:BSD-4-Clause-UC)/,/^(?:CC-BY-NC-SA-2\.0)/,/^(?:CC-BY-NC-SA-1\.0)/,/^(?:CC-BY-NC-ND-4\.0)/,/^(?:CC-BY-NC-ND-3\.0)/,/^(?:CC-BY-NC-ND-2\.5)/,/^(?:CC-BY-NC-ND-2\.0)/,/^(?:CC-BY-NC-ND-1\.0)/,/^(?:LZMA-exception)/,/^(?:BitTorrent-1\.1)/,/^(?:CrystalStacker)/,/^(?:FLTK-exception)/,/^(?:SugarCRM-1\.1\.3)/,/^(?:BSD-Protection)/,/^(?:BitTorrent-1\.0)/,/^(?:HaskellReport)/,/^(?:Interbase-1\.0)/,/^(?:StandardML-NJ)/,/^(?:mif-exception)/,/^(?:Frameworx-1\.0)/,/^(?:389-exception)/,/^(?:CC-BY-NC-2\.0)/,/^(?:CC-BY-NC-2\.5)/,/^(?:CC-BY-NC-3\.0)/,/^(?:CC-BY-NC-4\.0)/,/^(?:W3C-19980720)/,/^(?:CC-BY-SA-1\.0)/,/^(?:CC-BY-SA-2\.0)/,/^(?:CC-BY-SA-2\.5)/,/^(?:CC-BY-ND-2\.0)/,/^(?:CC-BY-SA-4\.0)/,/^(?:CC-BY-SA-3\.0)/,/^(?:Artistic-1\.0)/,/^(?:Artistic-2\.0)/,/^(?:CC-BY-ND-2\.5)/,/^(?:CC-BY-ND-3\.0)/,/^(?:CC-BY-ND-4\.0)/,/^(?:CC-BY-ND-1\.0)/,/^(?:BSD-4-Clause)/,/^(?:BSD-3-Clause)/,/^(?:BSD-2-Clause)/,/^(?:CC-BY-NC-1\.0)/,/^(?:bzip2-1\.0\.6)/,/^(?:Unicode-TOU)/,/^(?:CNRI-Jython)/,/^(?:ImageMagick)/,/^(?:Adobe-Glyph)/,/^(?:CUA-OPL-1\.0)/,/^(?:OLDAP-2\.2\.2)/,/^(?:LiLiQ-R-1\.1)/,/^(?:bzip2-1\.0\.5)/,/^(?:LiLiQ-P-1\.1)/,/^(?:OLDAP-2\.0\.1)/,/^(?:OLDAP-2\.2\.1)/,/^(?:CNRI-Python)/,/^(?:XFree86-1\.1)/,/^(?:OSET-PL-2\.1)/,/^(?:Apache-2\.0)/,/^(?:Watcom-1\.0)/,/^(?:PostgreSQL)/,/^(?:Python-2\.0)/,/^(?:RHeCos-1\.1)/,/^(?:EUDatagrid)/,/^(?:Spencer-99)/,/^(?:Intel-ACPI)/,/^(?:CECILL-1\.0)/,/^(?:CECILL-1\.1)/,/^(?:JasPer-2\.0)/,/^(?:CECILL-2\.0)/,/^(?:CECILL-2\.1)/,/^(?:gSOAP-1\.3b)/,/^(?:Spencer-94)/,/^(?:Apache-1\.1)/,/^(?:Spencer-86)/,/^(?:Apache-1\.0)/,/^(?:ClArtistic)/,/^(?:TORQUE-1\.1)/,/^(?:CATOSL-1\.1)/,/^(?:Adobe-2006)/,/^(?:Zimbra-1\.4)/,/^(?:Zimbra-1\.3)/,/^(?:Condor-1\.1)/,/^(?:CC-BY-3\.0)/,/^(?:CC-BY-2\.5)/,/^(?:OLDAP-2\.4)/,/^(?:SGI-B-1\.1)/,/^(?:SISSL-1\.2)/,/^(?:SGI-B-1\.0)/,/^(?:OLDAP-2\.3)/,/^(?:CC-BY-4\.0)/,/^(?:Crossword)/,/^(?:SimPL-2\.0)/,/^(?:OLDAP-2\.2)/,/^(?:OLDAP-2\.1)/,/^(?:ErlPL-1\.1)/,/^(?:LPPL-1\.3a)/,/^(?:LPPL-1\.3c)/,/^(?:OLDAP-2\.0)/,/^(?:Leptonica)/,/^(?:CPOL-1\.02)/,/^(?:OLDAP-1\.4)/,/^(?:OLDAP-1\.3)/,/^(?:CC-BY-2\.0)/,/^(?:Unlicense)/,/^(?:OLDAP-2\.8)/,/^(?:OLDAP-1\.2)/,/^(?:MakeIndex)/,/^(?:OLDAP-2\.7)/,/^(?:OLDAP-1\.1)/,/^(?:Sleepycat)/,/^(?:D-FSL-1\.0)/,/^(?:CC-BY-1\.0)/,/^(?:OLDAP-2\.6)/,/^(?:WXwindows)/,/^(?:NPOSL-3\.0)/,/^(?:FreeImage)/,/^(?:SGI-B-2\.0)/,/^(?:OLDAP-2\.5)/,/^(?:Beerware)/,/^(?:Newsletr)/,/^(?:NBPL-1\.0)/,/^(?:NASA-1\.3)/,/^(?:NLOD-1\.0)/,/^(?:AGPL-1\.0)/,/^(?:OCLC-2\.0)/,/^(?:ODbL-1\.0)/,/^(?:PDDL-1\.0)/,/^(?:Motosoto)/,/^(?:Afmparse)/,/^(?:ANTLR-PD)/,/^(?:LPL-1\.02)/,/^(?:Abstyles)/,/^(?:eCos-2\.0)/,/^(?:APSL-1\.0)/,/^(?:LPPL-1\.2)/,/^(?:LPPL-1\.1)/,/^(?:LPPL-1\.0)/,/^(?:APSL-1\.1)/,/^(?:APSL-2\.0)/,/^(?:Info-ZIP)/,/^(?:Zend-2\.0)/,/^(?:IBM-pibs)/,/^(?:LGPL-2\.0)/,/^(?:LGPL-3\.0)/,/^(?:LGPL-2\.1)/,/^(?:GFDL-1\.3)/,/^(?:PHP-3\.01)/,/^(?:GFDL-1\.2)/,/^(?:GFDL-1\.1)/,/^(?:AGPL-3\.0)/,/^(?:Giftware)/,/^(?:EUPL-1\.1)/,/^(?:RPSL-1\.0)/,/^(?:EUPL-1\.0)/,/^(?:MIT-enna)/,/^(?:CECILL-B)/,/^(?:diffmark)/,/^(?:CECILL-C)/,/^(?:CDDL-1\.0)/,/^(?:Sendmail)/,/^(?:CDDL-1\.1)/,/^(?:CPAL-1\.0)/,/^(?:APSL-1\.2)/,/^(?:NPL-1\.1)/,/^(?:AFL-1\.2)/,/^(?:Caldera)/,/^(?:AFL-2\.0)/,/^(?:FSFULLR)/,/^(?:AFL-2\.1)/,/^(?:VSL-1\.0)/,/^(?:VOSTROM)/,/^(?:UPL-1\.0)/,/^(?:Dotseqn)/,/^(?:CPL-1\.0)/,/^(?:dvipdfm)/,/^(?:EPL-1\.0)/,/^(?:OCCT-PL)/,/^(?:ECL-1\.0)/,/^(?:Latex2e)/,/^(?:ECL-2\.0)/,/^(?:GPL-1\.0)/,/^(?:GPL-2\.0)/,/^(?:GPL-3\.0)/,/^(?:AFL-3\.0)/,/^(?:LAL-1\.2)/,/^(?:LAL-1\.3)/,/^(?:EFL-1\.0)/,/^(?:EFL-2\.0)/,/^(?:gnuplot)/,/^(?:Aladdin)/,/^(?:LPL-1\.0)/,/^(?:libtiff)/,/^(?:Entessa)/,/^(?:AMDPLPA)/,/^(?:IPL-1\.0)/,/^(?:OPL-1\.0)/,/^(?:OSL-1\.0)/,/^(?:OSL-1\.1)/,/^(?:OSL-2\.0)/,/^(?:OSL-2\.1)/,/^(?:OSL-3\.0)/,/^(?:OpenSSL)/,/^(?:ZPL-2\.1)/,/^(?:PHP-3\.0)/,/^(?:ZPL-2\.0)/,/^(?:ZPL-1\.1)/,/^(?:CC0-1\.0)/,/^(?:SPL-1\.0)/,/^(?:psutils)/,/^(?:MPL-1\.0)/,/^(?:QPL-1\.0)/,/^(?:MPL-1\.1)/,/^(?:MPL-2\.0)/,/^(?:APL-1\.0)/,/^(?:RPL-1\.1)/,/^(?:RPL-1\.5)/,/^(?:MIT-CMU)/,/^(?:Multics)/,/^(?:Eurosym)/,/^(?:BSL-1\.0)/,/^(?:MIT-feh)/,/^(?:Saxpath)/,/^(?:Borceux)/,/^(?:OFL-1\.1)/,/^(?:OFL-1\.0)/,/^(?:AFL-1\.1)/,/^(?:YPL-1\.1)/,/^(?:YPL-1\.0)/,/^(?:NPL-1\.0)/,/^(?:iMatix)/,/^(?:mpich2)/,/^(?:APAFML)/,/^(?:Bahyph)/,/^(?:RSA-MD)/,/^(?:psfrag)/,/^(?:Plexus)/,/^(?:eGenix)/,/^(?:Glulxe)/,/^(?:SAX-PD)/,/^(?:Imlib2)/,/^(?:Wsuipa)/,/^(?:LGPLLR)/,/^(?:Libpng)/,/^(?:xinetd)/,/^(?:MITNFA)/,/^(?:NetCDF)/,/^(?:Naumen)/,/^(?:SMPPL)/,/^(?:Nunit)/,/^(?:FSFUL)/,/^(?:GL2PS)/,/^(?:SMLNJ)/,/^(?:Rdisc)/,/^(?:Noweb)/,/^(?:Nokia)/,/^(?:SISSL)/,/^(?:Qhull)/,/^(?:Intel)/,/^(?:Glide)/,/^(?:Xerox)/,/^(?:AMPAS)/,/^(?:WTFPL)/,/^(?:MS-PL)/,/^(?:XSkat)/,/^(?:MS-RL)/,/^(?:MirOS)/,/^(?:RSCPL)/,/^(?:TMate)/,/^(?:OGTSL)/,/^(?:FSFAP)/,/^(?:NCSA)/,/^(?:Zlib)/,/^(?:SCEA)/,/^(?:SNIA)/,/^(?:NGPL)/,/^(?:NOSL)/,/^(?:ADSL)/,/^(?:MTLL)/,/^(?:NLPL)/,/^(?:Ruby)/,/^(?:JSON)/,/^(?:Barr)/,/^(?:0BSD)/,/^(?:Xnet)/,/^(?:Cube)/,/^(?:curl)/,/^(?:DSDP)/,/^(?:Fair)/,/^(?:HPND)/,/^(?:TOSL)/,/^(?:IJG)/,/^(?:SWL)/,/^(?:Vim)/,/^(?:FTL)/,/^(?:ICU)/,/^(?:OML)/,/^(?:NRL)/,/^(?:DOC)/,/^(?:TCL)/,/^(?:W3C)/,/^(?:NTP)/,/^(?:IPA)/,/^(?:ISC)/,/^(?:X11)/,/^(?:AAL)/,/^(?:AML)/,/^(?:xpp)/,/^(?:Zed)/,/^(?:MIT)/,/^(?:Mup)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364],"inclusive":true}} +}); +return lexer; +})(); +parser.lexer = lexer; +function Parser () { + this.yy = {}; +} +Parser.prototype = parser;parser.Parser = Parser; +return new Parser; +})(); + + +if (true) { +exports.parser = spdxparse; +exports.Parser = spdxparse.Parser; +exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; +exports.main = function commonjsMain(args) { + if (!args[1]) { + console.log('Usage: '+args[0]+' FILE'); + process.exit(1); + } + var source = __webpack_require__(133).readFileSync(__webpack_require__(4).normalize(args[1]), "utf8"); + return exports.parser.parse(source); +}; +if ( true && __webpack_require__.c[__webpack_require__.s] === module) { + exports.main(process.argv.slice(1)); +} +} + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) + +/***/ }), +/* 193 */ +/***/ (function(module, exports, __webpack_require__) { + +var licenseIDs = __webpack_require__(194); + +function valid(string) { + return licenseIDs.indexOf(string) > -1; +} + +// Common transpositions of license identifier acronyms +var transpositions = [ + ['APGL', 'AGPL'], + ['Gpl', 'GPL'], + ['GLP', 'GPL'], + ['APL', 'Apache'], + ['ISD', 'ISC'], + ['GLP', 'GPL'], + ['IST', 'ISC'], + ['Claude', 'Clause'], + [' or later', '+'], + [' International', ''], + ['GNU', 'GPL'], + ['GUN', 'GPL'], + ['+', ''], + ['GNU GPL', 'GPL'], + ['GNU/GPL', 'GPL'], + ['GNU GLP', 'GPL'], + ['GNU General Public License', 'GPL'], + ['Gnu public license', 'GPL'], + ['GNU Public License', 'GPL'], + ['GNU GENERAL PUBLIC LICENSE', 'GPL'], + ['MTI', 'MIT'], + ['Mozilla Public License', 'MPL'], + ['WTH', 'WTF'], + ['-License', ''] +]; + +var TRANSPOSED = 0; +var CORRECT = 1; + +// Simple corrections to nearly valid identifiers. +var transforms = [ + // e.g. 'mit' + function(argument) { + return argument.toUpperCase(); + }, + // e.g. 'MIT ' + function(argument) { + return argument.trim(); + }, + // e.g. 'M.I.T.' + function(argument) { + return argument.replace(/\./g, ''); + }, + // e.g. 'Apache- 2.0' + function(argument) { + return argument.replace(/\s+/g, ''); + }, + // e.g. 'CC BY 4.0'' + function(argument) { + return argument.replace(/\s+/g, '-'); + }, + // e.g. 'LGPLv2.1' + function(argument) { + return argument.replace('v', '-'); + }, + // e.g. 'Apache 2.0' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1'); + }, + // e.g. 'GPL 2' + function(argument) { + return argument.replace(/,?\s*(\d)/, '-$1.0'); + }, + // e.g. 'Apache Version 2.0' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); + }, + // e.g. 'Apache Version 2' + function(argument) { + return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); + }, + // e.g. 'ZLIB' + function(argument) { + return argument[0].toUpperCase() + argument.slice(1); + }, + // e.g. 'MPL/2.0' + function(argument) { + return argument.replace('/', '-'); + }, + // e.g. 'Apache 2' + function(argument) { + return argument + .replace(/\s*V\s*(\d)/, '-$1') + .replace(/(\d)$/, '$1.0'); + }, + // e.g. 'GPL-2.0-' + function(argument) { + return argument.slice(0, argument.length - 1); + }, + // e.g. 'GPL2' + function(argument) { + return argument.replace(/(\d)$/, '-$1.0'); + }, + // e.g. 'BSD 3' + function(argument) { + return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); + }, + // e.g. 'BSD clause 3' + function(argument) { + return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); + }, + // e.g. 'BY-NC-4.0' + function(argument) { + return 'CC-' + argument; + }, + // e.g. 'BY-NC' + function(argument) { + return 'CC-' + argument + '-4.0'; + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, ''); + }, + // e.g. 'Attribution-NonCommercial' + function(argument) { + return 'CC-' + + argument + .replace('Attribution', 'BY') + .replace('NonCommercial', 'NC') + .replace('NoDerivatives', 'ND') + .replace(/ (\d)/, '-$1') + .replace(/ ?International/, '') + + '-4.0'; + } +]; + +// If all else fails, guess that strings containing certain substrings +// meant to identify certain licenses. +var lastResorts = [ + ['UNLI', 'Unlicense'], + ['WTF', 'WTFPL'], + ['2 CLAUSE', 'BSD-2-Clause'], + ['2-CLAUSE', 'BSD-2-Clause'], + ['3 CLAUSE', 'BSD-3-Clause'], + ['3-CLAUSE', 'BSD-3-Clause'], + ['AFFERO', 'AGPL-3.0'], + ['AGPL', 'AGPL-3.0'], + ['APACHE', 'Apache-2.0'], + ['ARTISTIC', 'Artistic-2.0'], + ['Affero', 'AGPL-3.0'], + ['BEER', 'Beerware'], + ['BOOST', 'BSL-1.0'], + ['BSD', 'BSD-2-Clause'], + ['ECLIPSE', 'EPL-1.0'], + ['FUCK', 'WTFPL'], + ['GNU', 'GPL-3.0'], + ['LGPL', 'LGPL-3.0'], + ['GPL', 'GPL-3.0'], + ['MIT', 'MIT'], + ['MPL', 'MPL-2.0'], + ['X11', 'X11'], + ['ZLIB', 'Zlib'] +]; + +var SUBSTRING = 0; +var IDENTIFIER = 1; + +var validTransformation = function(identifier) { + for (var i = 0; i < transforms.length; i++) { + var transformed = transforms[i](identifier); + if (transformed !== identifier && valid(transformed)) { + return transformed; + } + } + return null; +}; + +var validLastResort = function(identifier) { + var upperCased = identifier.toUpperCase(); + for (var i = 0; i < lastResorts.length; i++) { + var lastResort = lastResorts[i]; + if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { + return lastResort[IDENTIFIER]; + } + } + return null; +}; + +var anyCorrection = function(identifier, check) { + for (var i = 0; i < transpositions.length; i++) { + var transposition = transpositions[i]; + var transposed = transposition[TRANSPOSED]; + if (identifier.indexOf(transposed) > -1) { + var corrected = identifier.replace( + transposed, + transposition[CORRECT] + ); + var checked = check(corrected); + if (checked !== null) { + return checked; + } + } + } + return null; +}; + +module.exports = function(identifier) { + identifier = identifier.replace(/\+$/, ''); + if (valid(identifier)) { + return identifier; + } + var transformed = validTransformation(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, function(argument) { + if (valid(argument)) { + return argument; + } + return validTransformation(argument); + }); + if (transformed !== null) { + return transformed; + } + transformed = validLastResort(identifier); + if (transformed !== null) { + return transformed; + } + transformed = anyCorrection(identifier, validLastResort); + if (transformed !== null) { + return transformed; + } + return null; +}; + + +/***/ }), +/* 194 */ +/***/ (function(module) { + +module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); + +/***/ }), +/* 195 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var url = __webpack_require__(196) +var gitHosts = __webpack_require__(197) +var GitHost = module.exports = __webpack_require__(198) + +var protocolToRepresentationMap = { + 'git+ssh': 'sshurl', + 'git+https': 'https', + 'ssh': 'sshurl', + 'git': 'git' +} + +function protocolToRepresentation (protocol) { + if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) + return protocolToRepresentationMap[protocol] || protocol +} + +var authProtocols = { + 'git:': true, + 'https:': true, + 'git+https:': true, + 'http:': true, + 'git+http:': true +} + +var cache = {} + +module.exports.fromUrl = function (giturl, opts) { + var key = giturl + JSON.stringify(opts || {}) + + if (!(key in cache)) { + cache[key] = fromUrl(giturl, opts) + } + + return cache[key] +} + +function fromUrl (giturl, opts) { + if (giturl == null || giturl === '') return + var url = fixupUnqualifiedGist( + isGitHubShorthand(giturl) ? 'github:' + giturl : giturl + ) + var parsed = parseGitUrl(url) + var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) + var matches = Object.keys(gitHosts).map(function (gitHostName) { + try { + var gitHostInfo = gitHosts[gitHostName] + var auth = null + if (parsed.auth && authProtocols[parsed.protocol]) { + auth = decodeURIComponent(parsed.auth) + } + var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null + var user = null + var project = null + var defaultRepresentation = null + if (shortcutMatch && shortcutMatch[1] === gitHostName) { + user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) + project = decodeURIComponent(shortcutMatch[3]) + defaultRepresentation = 'shortcut' + } else { + if (parsed.host !== gitHostInfo.domain) return + if (!gitHostInfo.protocols_re.test(parsed.protocol)) return + if (!parsed.path) return + var pathmatch = gitHostInfo.pathmatch + var matched = parsed.path.match(pathmatch) + if (!matched) return + if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) + if (matched[2] != null) project = decodeURIComponent(matched[2]) + defaultRepresentation = protocolToRepresentation(parsed.protocol) + } + return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) + } catch (ex) { + if (!(ex instanceof URIError)) throw ex + } + }).filter(function (gitHostInfo) { return gitHostInfo }) + if (matches.length !== 1) return + return matches[0] +} + +function isGitHubShorthand (arg) { + // Note: This does not fully test the git ref format. + // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html + // + // The only way to do this properly would be to shell out to + // git-check-ref-format, and as this is a fast sync function, + // we don't want to do that. Just let git fail if it turns + // out that the commit-ish is invalid. + // GH usernames cannot start with . or - + return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) +} + +function fixupUnqualifiedGist (giturl) { + // necessary for round-tripping gists + var parsed = url.parse(giturl) + if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { + return parsed.protocol + '/' + parsed.host + } else { + return giturl + } +} + +function parseGitUrl (giturl) { + if (typeof giturl !== 'string') giturl = '' + giturl + var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) + if (!matched) return url.parse(giturl) + return { + protocol: 'git+ssh:', + slashes: true, + auth: matched[1], + host: matched[2], + port: null, + hostname: matched[2], + hash: matched[4], + search: null, + query: null, + pathname: '/' + matched[3], + path: '/' + matched[3], + href: 'git+ssh://' + matched[1] + '@' + matched[2] + + '/' + matched[3] + (matched[4] || '') + } +} + + +/***/ }), +/* 196 */ +/***/ (function(module, exports) { + +module.exports = require("url"); + +/***/ }), +/* 197 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var gitHosts = module.exports = { + github: { + // First two are insecure and generally shouldn't be used any more, but + // they are still supported. + 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'github.com', + 'treepath': 'tree', + 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' + }, + bitbucket: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'bitbucket.org', + 'treepath': 'src', + 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' + }, + gitlab: { + 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gitlab.com', + 'treepath': 'tree', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', + 'bugstemplate': 'https://{domain}/{user}/{project}/issues', + 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' + }, + gist: { + 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], + 'domain': 'gist.github.com', + 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, + 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', + 'bugstemplate': 'https://{domain}/{project}', + 'gittemplate': 'git://{domain}/{project}.git{#committish}', + 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{project}{/committish}', + 'docstemplate': 'https://{domain}/{project}{/committish}', + 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', + 'shortcuttemplate': '{type}:{project}{#committish}', + 'pathtemplate': '{project}{#committish}', + 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' + } +} + +var gitHostDefaults = { + 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', + 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', + 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', + 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', + 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', + 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', + 'shortcuttemplate': '{type}:{user}/{project}{#committish}', + 'pathtemplate': '{user}/{project}{#committish}', + 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +} + +Object.keys(gitHosts).forEach(function (name) { + Object.keys(gitHostDefaults).forEach(function (key) { + if (gitHosts[name][key]) return + gitHosts[name][key] = gitHostDefaults[key] + }) + gitHosts[name].protocols_re = RegExp('^(' + + gitHosts[name].protocols.map(function (protocol) { + return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') + }).join('|') + '):$') +}) + + +/***/ }), +/* 198 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var gitHosts = __webpack_require__(197) +var extend = Object.assign || __webpack_require__(111)._extend + +var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { + var gitHostInfo = this + gitHostInfo.type = type + Object.keys(gitHosts[type]).forEach(function (key) { + gitHostInfo[key] = gitHosts[type][key] + }) + gitHostInfo.user = user + gitHostInfo.auth = auth + gitHostInfo.project = project + gitHostInfo.committish = committish + gitHostInfo.default = defaultRepresentation + gitHostInfo.opts = opts || {} +} +GitHost.prototype = {} + +GitHost.prototype.hash = function () { + return this.committish ? '#' + this.committish : '' +} + +GitHost.prototype._fill = function (template, opts) { + if (!template) return + var vars = extend({}, opts) + opts = extend(extend({}, this.opts), opts) + var self = this + Object.keys(this).forEach(function (key) { + if (self[key] != null && vars[key] == null) vars[key] = self[key] + }) + var rawAuth = vars.auth + var rawComittish = vars.committish + Object.keys(vars).forEach(function (key) { + vars[key] = encodeURIComponent(vars[key]) + }) + vars['auth@'] = rawAuth ? rawAuth + '@' : '' + if (opts.noCommittish) { + vars['#committish'] = '' + vars['/tree/committish'] = '' + vars['/comittish'] = '' + vars.comittish = '' + } else { + vars['#committish'] = rawComittish ? '#' + rawComittish : '' + vars['/tree/committish'] = vars.committish + ? '/' + vars.treepath + '/' + vars.committish + : '' + vars['/committish'] = vars.committish ? '/' + vars.committish : '' + vars.committish = vars.committish || 'master' + } + var res = template + Object.keys(vars).forEach(function (key) { + res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) + }) + if (opts.noGitPlus) { + return res.replace(/^git[+]/, '') + } else { + return res + } +} + +GitHost.prototype.ssh = function (opts) { + return this._fill(this.sshtemplate, opts) +} + +GitHost.prototype.sshurl = function (opts) { + return this._fill(this.sshurltemplate, opts) +} + +GitHost.prototype.browse = function (opts) { + return this._fill(this.browsetemplate, opts) +} + +GitHost.prototype.docs = function (opts) { + return this._fill(this.docstemplate, opts) +} + +GitHost.prototype.bugs = function (opts) { + return this._fill(this.bugstemplate, opts) +} + +GitHost.prototype.https = function (opts) { + return this._fill(this.httpstemplate, opts) +} + +GitHost.prototype.git = function (opts) { + return this._fill(this.gittemplate, opts) +} + +GitHost.prototype.shortcut = function (opts) { + return this._fill(this.shortcuttemplate, opts) +} + +GitHost.prototype.path = function (opts) { + return this._fill(this.pathtemplate, opts) +} + +GitHost.prototype.tarball = function (opts) { + return this._fill(this.tarballtemplate, opts) +} + +GitHost.prototype.file = function (P, opts) { + return this._fill(this.filetemplate, extend({ + path: P.replace(/^[/]+/g, '') + }, opts)) +} + +GitHost.prototype.getDefaultRepresentation = function () { + return this.default +} + +GitHost.prototype.toString = function (opts) { + return (this[this.default] || this.sshurl).call(this, opts) +} + + +/***/ }), +/* 199 */ +/***/ (function(module, exports, __webpack_require__) { + +var async = __webpack_require__(200); +async.core = __webpack_require__(206); +async.isCore = __webpack_require__(205); +async.sync = __webpack_require__(208); + +module.exports = async; + + +/***/ }), +/* 200 */ +/***/ (function(module, exports, __webpack_require__) { + +var fs = __webpack_require__(133); +var path = __webpack_require__(4); +var caller = __webpack_require__(201); +var nodeModulesPaths = __webpack_require__(202); +var normalizeOptions = __webpack_require__(204); +var isCore = __webpack_require__(205); + +var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; + +var defaultIsFile = function isFile(file, cb) { + fs.stat(file, function (err, stat) { + if (!err) { + return cb(null, stat.isFile() || stat.isFIFO()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; + +var defaultIsDir = function isDirectory(dir, cb) { + fs.stat(dir, function (err, stat) { + if (!err) { + return cb(null, stat.isDirectory()); + } + if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); + return cb(err); + }); +}; + +var defaultRealpath = function realpath(x, cb) { + realpathFS(x, function (realpathErr, realPath) { + if (realpathErr && realpathErr.code !== 'ENOENT') cb(realpathErr); + else cb(null, realpathErr ? x : realPath); + }); +}; + +var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) { + if (opts && opts.preserveSymlinks === false) { + realpath(x, cb); + } else { + cb(null, x); + } +}; + +var getPackageCandidates = function getPackageCandidates(x, start, opts) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + dirs[i] = path.join(dirs[i], x); + } + return dirs; +}; + +module.exports = function resolve(x, options, callback) { + var cb = callback; + var opts = options; + if (typeof options === 'function') { + cb = opts; + opts = {}; + } + if (typeof x !== 'string') { + var err = new TypeError('Path must be a string.'); + return process.nextTick(function () { + cb(err); + }); + } + + opts = normalizeOptions(x, opts); + + var isFile = opts.isFile || defaultIsFile; + var isDirectory = opts.isDirectory || defaultIsDir; + var readFile = opts.readFile || fs.readFile; + var realpath = opts.realpath || defaultRealpath; + var packageIterator = opts.packageIterator; + + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = path.resolve(basedir); + + maybeRealpath( + realpath, + absoluteStart, + opts, + function (err, realStart) { + if (err) cb(err); + else init(realStart); + } + ); + + var res; + function init(basedir) { + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + res = path.resolve(basedir, x); + if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; + if ((/\/$/).test(x) && res === basedir) { + loadAsDirectory(res, opts.package, onfile); + } else loadAsFile(res, opts.package, onfile); + } else if (isCore(x)) { + return cb(null, x); + } else loadNodeModules(x, basedir, function (err, n, pkg) { + if (err) cb(err); + else if (n) { + return maybeRealpath(realpath, n, opts, function (err, realN) { + if (err) { + cb(err); + } else { + cb(null, realN, pkg); + } + }); + } else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } + + function onfile(err, m, pkg) { + if (err) cb(err); + else if (m) cb(null, m, pkg); + else loadAsDirectory(res, function (err, d, pkg) { + if (err) cb(err); + else if (d) { + maybeRealpath(realpath, d, opts, function (err, realD) { + if (err) { + cb(err); + } else { + cb(null, realD, pkg); + } + }); + } else { + var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + moduleError.code = 'MODULE_NOT_FOUND'; + cb(moduleError); + } + }); + } + + function loadAsFile(x, thePackage, callback) { + var loadAsFilePackage = thePackage; + var cb = callback; + if (typeof loadAsFilePackage === 'function') { + cb = loadAsFilePackage; + loadAsFilePackage = undefined; + } + + var exts = [''].concat(extensions); + load(exts, x, loadAsFilePackage); + + function load(exts, x, loadPackage) { + if (exts.length === 0) return cb(null, undefined, loadPackage); + var file = x + exts[0]; + + var pkg = loadPackage; + if (pkg) onpkg(null, pkg); + else loadpkg(path.dirname(file), onpkg); + + function onpkg(err, pkg_, dir) { + pkg = pkg_; + if (err) return cb(err); + if (dir && pkg && opts.pathFilter) { + var rfile = path.relative(dir, file); + var rel = rfile.slice(0, rfile.length - exts[0].length); + var r = opts.pathFilter(pkg, x, rel); + if (r) return load( + [''].concat(extensions.slice()), + path.resolve(dir, r), + pkg + ); + } + isFile(file, onex); + } + function onex(err, ex) { + if (err) return cb(err); + if (ex) return cb(null, file, pkg); + load(exts.slice(1), x, pkg); + } + } + } + + function loadpkg(dir, cb) { + if (dir === '' || dir === '/') return cb(null); + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return cb(null); + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); + + maybeRealpath(realpath, dir, opts, function (unwrapErr, pkgdir) { + if (unwrapErr) return loadpkg(path.dirname(dir), cb); + var pkgfile = path.join(pkgdir, 'package.json'); + isFile(pkgfile, function (err, ex) { + // on err, ex is false + if (!ex) return loadpkg(path.dirname(dir), cb); + + readFile(pkgfile, function (err, body) { + if (err) cb(err); + try { var pkg = JSON.parse(body); } catch (jsonErr) {} + + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + cb(null, pkg, dir); + }); + }); + }); + } + + function loadAsDirectory(x, loadAsDirectoryPackage, callback) { + var cb = callback; + var fpkg = loadAsDirectoryPackage; + if (typeof fpkg === 'function') { + cb = fpkg; + fpkg = opts.package; + } + + maybeRealpath(realpath, x, opts, function (unwrapErr, pkgdir) { + if (unwrapErr) return cb(unwrapErr); + var pkgfile = path.join(pkgdir, 'package.json'); + isFile(pkgfile, function (err, ex) { + if (err) return cb(err); + if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); + + readFile(pkgfile, function (err, body) { + if (err) return cb(err); + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} + + if (pkg && opts.packageFilter) { + pkg = opts.packageFilter(pkg, pkgfile); + } + + if (pkg && pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + return cb(mainError); + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); + + var dir = path.resolve(x, pkg.main); + loadAsDirectory(dir, pkg, function (err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + loadAsFile(path.join(x, 'index'), pkg, cb); + }); + }); + return; + } + + loadAsFile(path.join(x, '/index'), pkg, cb); + }); + }); + }); + } + + function processDirs(cb, dirs) { + if (dirs.length === 0) return cb(null, undefined); + var dir = dirs[0]; + + isDirectory(path.dirname(dir), isdir); + + function isdir(err, isdir) { + if (err) return cb(err); + if (!isdir) return processDirs(cb, dirs.slice(1)); + loadAsFile(dir, opts.package, onfile); + } + + function onfile(err, m, pkg) { + if (err) return cb(err); + if (m) return cb(null, m, pkg); + loadAsDirectory(dir, opts.package, ondir); + } + + function ondir(err, n, pkg) { + if (err) return cb(err); + if (n) return cb(null, n, pkg); + processDirs(cb, dirs.slice(1)); + } + } + function loadNodeModules(x, start, cb) { + var thunk = function () { return getPackageCandidates(x, start, opts); }; + processDirs( + cb, + packageIterator ? packageIterator(x, start, thunk, opts) : thunk() + ); + } +}; + + +/***/ }), +/* 201 */ +/***/ (function(module, exports) { + +module.exports = function () { + // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi + var origPrepareStackTrace = Error.prepareStackTrace; + Error.prepareStackTrace = function (_, stack) { return stack; }; + var stack = (new Error()).stack; + Error.prepareStackTrace = origPrepareStackTrace; + return stack[2].getFileName(); +}; + + +/***/ }), +/* 202 */ +/***/ (function(module, exports, __webpack_require__) { + +var path = __webpack_require__(4); +var parse = path.parse || __webpack_require__(203); + +var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { + var prefix = '/'; + if ((/^([A-Za-z]:)/).test(absoluteStart)) { + prefix = ''; + } else if ((/^\\\\/).test(absoluteStart)) { + prefix = '\\\\'; + } + + var paths = [absoluteStart]; + var parsed = parse(absoluteStart); + while (parsed.dir !== paths[paths.length - 1]) { + paths.push(parsed.dir); + parsed = parse(parsed.dir); + } + + return paths.reduce(function (dirs, aPath) { + return dirs.concat(modules.map(function (moduleDir) { + return path.resolve(prefix, aPath, moduleDir); + })); + }, []); +}; + +module.exports = function nodeModulesPaths(start, opts, request) { + var modules = opts && opts.moduleDirectory + ? [].concat(opts.moduleDirectory) + : ['node_modules']; + + if (opts && typeof opts.paths === 'function') { + return opts.paths( + request, + start, + function () { return getNodeModulesDirs(start, modules); }, + opts + ); + } + + var dirs = getNodeModulesDirs(start, modules); + return opts && opts.paths ? dirs.concat(opts.paths) : dirs; +}; + + +/***/ }), +/* 203 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isWindows = process.platform === 'win32'; + +// Regex to split a windows path into three parts: [*, device, slash, +// tail] windows-only +var splitDeviceRe = + /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + +// Regex to split the tail part of the above into [*, dir, basename, ext] +var splitTailRe = + /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; + +var win32 = {}; + +// Function to split a filename into [root, dir, basename, ext] +function win32SplitPath(filename) { + // Separate device+slash from tail + var result = splitDeviceRe.exec(filename), + device = (result[1] || '') + (result[2] || ''), + tail = result[3] || ''; + // Split the tail into dir, basename and extension + var result2 = splitTailRe.exec(tail), + dir = result2[1], + basename = result2[2], + ext = result2[3]; + return [device, dir, basename, ext]; +} + +win32.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); + } + var allParts = win32SplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); + } + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; + + + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var posix = {}; + + +function posixSplitPath(filename) { + return splitPathRe.exec(filename).slice(1); +} + + +posix.parse = function(pathString) { + if (typeof pathString !== 'string') { + throw new TypeError( + "Parameter 'pathString' must be a string, not " + typeof pathString + ); + } + var allParts = posixSplitPath(pathString); + if (!allParts || allParts.length !== 4) { + throw new TypeError("Invalid path '" + pathString + "'"); + } + allParts[1] = allParts[1] || ''; + allParts[2] = allParts[2] || ''; + allParts[3] = allParts[3] || ''; + + return { + root: allParts[0], + dir: allParts[0] + allParts[1].slice(0, -1), + base: allParts[2], + ext: allParts[3], + name: allParts[2].slice(0, allParts[2].length - allParts[3].length) + }; +}; + + +if (isWindows) + module.exports = win32.parse; +else /* posix */ + module.exports = posix.parse; + +module.exports.posix = posix.parse; +module.exports.win32 = win32.parse; + + +/***/ }), +/* 204 */ +/***/ (function(module, exports) { + +module.exports = function (x, opts) { + /** + * This file is purposefully a passthrough. It's expected that third-party + * environments will override it at runtime in order to inject special logic + * into `resolve` (by manipulating the options). One such example is the PnP + * code path in Yarn. + */ + + return opts || {}; +}; + + +/***/ }), +/* 205 */ +/***/ (function(module, exports, __webpack_require__) { + +var core = __webpack_require__(206); + +module.exports = function isCore(x) { + return Object.prototype.hasOwnProperty.call(core, x); +}; + + +/***/ }), +/* 206 */ +/***/ (function(module, exports, __webpack_require__) { + +var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; + +function specifierIncluded(specifier) { + var parts = specifier.split(' '); + var op = parts.length > 1 ? parts[0] : '='; + var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); + + for (var i = 0; i < 3; ++i) { + var cur = Number(current[i] || 0); + var ver = Number(versionParts[i] || 0); + if (cur === ver) { + continue; // eslint-disable-line no-restricted-syntax, no-continue + } + if (op === '<') { + return cur < ver; + } else if (op === '>=') { + return cur >= ver; + } else { + return false; + } + } + return op === '>='; +} + +function matchesRange(range) { + var specifiers = range.split(/ ?&& ?/); + if (specifiers.length === 0) { return false; } + for (var i = 0; i < specifiers.length; ++i) { + if (!specifierIncluded(specifiers[i])) { return false; } + } + return true; +} + +function versionIncluded(specifierValue) { + if (typeof specifierValue === 'boolean') { return specifierValue; } + if (specifierValue && typeof specifierValue === 'object') { + for (var i = 0; i < specifierValue.length; ++i) { + if (matchesRange(specifierValue[i])) { return true; } + } + return false; + } + return matchesRange(specifierValue); +} + +var data = __webpack_require__(207); + +var core = {}; +for (var mod in data) { // eslint-disable-line no-restricted-syntax + if (Object.prototype.hasOwnProperty.call(data, mod)) { + core[mod] = versionIncluded(data[mod]); + } +} +module.exports = core; + + +/***/ }), +/* 207 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debug_agent\":\">= 1 && < 8\",\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":[\">= 10 && < 10.1\",\">= 14\"],\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0 && < 12\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0 && < 12\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0 && < 12\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10 && < 12\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8\":\">= 1\",\"vm\":true,\"wasi\":\">= 13.4 && < 13.5\",\"worker_threads\":\">= 11.7\",\"zlib\":true}"); + +/***/ }), +/* 208 */ +/***/ (function(module, exports, __webpack_require__) { + +var isCore = __webpack_require__(205); +var fs = __webpack_require__(133); +var path = __webpack_require__(4); +var caller = __webpack_require__(201); +var nodeModulesPaths = __webpack_require__(202); +var normalizeOptions = __webpack_require__(204); + +var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; + +var defaultIsFile = function isFile(file) { + try { + var stat = fs.statSync(file); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isFile() || stat.isFIFO(); +}; + +var defaultIsDir = function isDirectory(dir) { + try { + var stat = fs.statSync(dir); + } catch (e) { + if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; + throw e; + } + return stat.isDirectory(); +}; + +var defaultRealpathSync = function realpathSync(x) { + try { + return realpathFS(x); + } catch (realpathErr) { + if (realpathErr.code !== 'ENOENT') { + throw realpathErr; + } + } + return x; +}; + +var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) { + if (opts && opts.preserveSymlinks === false) { + return realpathSync(x); + } + return x; +}; + +var getPackageCandidates = function getPackageCandidates(x, start, opts) { + var dirs = nodeModulesPaths(start, opts, x); + for (var i = 0; i < dirs.length; i++) { + dirs[i] = path.join(dirs[i], x); + } + return dirs; +}; + +module.exports = function resolveSync(x, options) { + if (typeof x !== 'string') { + throw new TypeError('Path must be a string.'); + } + var opts = normalizeOptions(x, options); + + var isFile = opts.isFile || defaultIsFile; + var readFileSync = opts.readFileSync || fs.readFileSync; + var isDirectory = opts.isDirectory || defaultIsDir; + var realpathSync = opts.realpathSync || defaultRealpathSync; + var packageIterator = opts.packageIterator; + + var extensions = opts.extensions || ['.js']; + var basedir = opts.basedir || path.dirname(caller()); + var parent = opts.filename || basedir; + + opts.paths = opts.paths || []; + + // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory + var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts); + + if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { + var res = path.resolve(absoluteStart, x); + if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; + var m = loadAsFileSync(res) || loadAsDirectorySync(res); + if (m) return maybeRealpathSync(realpathSync, m, opts); + } else if (isCore(x)) { + return x; + } else { + var n = loadNodeModulesSync(x, absoluteStart); + if (n) return maybeRealpathSync(realpathSync, n, opts); + } + + var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); + err.code = 'MODULE_NOT_FOUND'; + throw err; + + function loadAsFileSync(x) { + var pkg = loadpkg(path.dirname(x)); + + if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { + var rfile = path.relative(pkg.dir, x); + var r = opts.pathFilter(pkg.pkg, x, rfile); + if (r) { + x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign + } + } + + if (isFile(x)) { + return x; + } + + for (var i = 0; i < extensions.length; i++) { + var file = x + extensions[i]; + if (isFile(file)) { + return file; + } + } + } + + function loadpkg(dir) { + if (dir === '' || dir === '/') return; + if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { + return; + } + if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; + + var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json'); + + if (!isFile(pkgfile)) { + return loadpkg(path.dirname(dir)); + } + + var body = readFileSync(pkgfile); + + try { + var pkg = JSON.parse(body); + } catch (jsonErr) {} + + if (pkg && opts.packageFilter) { + // v2 will pass pkgfile + pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment + } + + return { pkg: pkg, dir: dir }; + } + + function loadAsDirectorySync(x) { + var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json'); + if (isFile(pkgfile)) { + try { + var body = readFileSync(pkgfile, 'UTF8'); + var pkg = JSON.parse(body); + } catch (e) {} + + if (pkg && opts.packageFilter) { + // v2 will pass pkgfile + pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment + } + + if (pkg && pkg.main) { + if (typeof pkg.main !== 'string') { + var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); + mainError.code = 'INVALID_PACKAGE_MAIN'; + throw mainError; + } + if (pkg.main === '.' || pkg.main === './') { + pkg.main = 'index'; + } + try { + var m = loadAsFileSync(path.resolve(x, pkg.main)); + if (m) return m; + var n = loadAsDirectorySync(path.resolve(x, pkg.main)); + if (n) return n; + } catch (e) {} + } + } + + return loadAsFileSync(path.join(x, '/index')); + } + + function loadNodeModulesSync(x, start) { + var thunk = function () { return getPackageCandidates(x, start, opts); }; + var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk(); + + for (var i = 0; i < dirs.length; i++) { + var dir = dirs[i]; + if (isDirectory(path.dirname(dir))) { + var m = loadAsFileSync(dir); + if (m) return m; + var n = loadAsDirectorySync(dir); + if (n) return n; + } + } + } +}; + + +/***/ }), +/* 209 */ +/***/ (function(module, exports) { + +module.exports = extractDescription + +// Extracts description from contents of a readme file in markdown format +function extractDescription (d) { + if (!d) return; + if (d === "ERROR: No README data found!") return; + // the first block of text before the first heading + // that isn't the first line heading + d = d.trim().split('\n') + for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); + var l = d.length + for (var e = s + 1; e < l && d[e].trim(); e ++); + return d.slice(s, e).join(' ').trim() +} + + +/***/ }), +/* 210 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); + +/***/ }), +/* 211 */ +/***/ (function(module, exports, __webpack_require__) { + +var util = __webpack_require__(111) +var messages = __webpack_require__(212) + +module.exports = function() { + var args = Array.prototype.slice.call(arguments, 0) + var warningName = args.shift() + if (warningName == "typo") { + return makeTypoWarning.apply(null,args) + } + else { + var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" + args.unshift(msgTemplate) + return util.format.apply(null, args) + } } -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); +function makeTypoWarning (providedName, probableName, field) { + if (field) { + providedName = field + "['" + providedName + "']" + probableName = field + "['" + probableName + "']" + } + return util.format(messages.typo, providedName, probableName) +} + + +/***/ }), +/* 212 */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); + +/***/ }), +/* 213 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const path = __webpack_require__(4); +const writeJsonFile = __webpack_require__(214); +const sortKeys = __webpack_require__(228); + +const dependencyKeys = new Set([ + 'dependencies', + 'devDependencies', + 'optionalDependencies', + 'peerDependencies' +]); + +function normalize(packageJson) { + const result = {}; + + for (const key of Object.keys(packageJson)) { + if (!dependencyKeys.has(key)) { + result[key] = packageJson[key]; + } else if (Object.keys(packageJson[key]).length !== 0) { + result[key] = sortKeys(packageJson[key]); + } + } + + return result; +} + +module.exports = async (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } + + options = { + normalize: true, + ...options, + detectIndent: true + }; + + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); + + data = options.normalize ? normalize(data) : data; + + return writeJsonFile(filePath, data, options); +}; + +module.exports.sync = (filePath, data, options) => { + if (typeof filePath !== 'string') { + options = data; + data = filePath; + filePath = '.'; + } + + options = { + normalize: true, + ...options, + detectIndent: true + }; + + filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); + + data = options.normalize ? normalize(data) : data; + + writeJsonFile.sync(filePath, data, options); +}; + + +/***/ }), +/* 214 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const path = __webpack_require__(4); +const fs = __webpack_require__(215); +const writeFileAtomic = __webpack_require__(219); +const sortKeys = __webpack_require__(228); +const makeDir = __webpack_require__(230); +const pify = __webpack_require__(231); +const detectIndent = __webpack_require__(232); + +const init = (fn, filePath, data, options) => { + if (!filePath) { + throw new TypeError('Expected a filepath'); + } + + if (data === undefined) { + throw new TypeError('Expected data to stringify'); + } + + options = Object.assign({ + indent: '\t', + sortKeys: false + }, options); + + if (options.sortKeys) { + data = sortKeys(data, { + deep: true, + compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined + }); + } + + return fn(filePath, data, options); +}; + +const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); + +const main = (filePath, data, options) => { + return (options.detectIndent ? readFile(filePath) : Promise.resolve()) + .then(string => { + const indent = string ? detectIndent(string).indent : options.indent; + const json = JSON.stringify(data, options.replacer, indent); + + return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); + }); +}; + +const mainSync = (filePath, data, options) => { + let {indent} = options; + + if (options.detectIndent) { + try { + const file = fs.readFileSync(filePath, 'utf8'); + indent = detectIndent(file).indent; + } catch (error) { + if (error.code !== 'ENOENT') { + throw error; + } + } + } + + const json = JSON.stringify(data, options.replacer, indent); + + return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); +}; + +const writeJsonFile = (filePath, data, options) => { + return makeDir(path.dirname(filePath), {fs}) + .then(() => init(main, filePath, data, options)); +}; + +module.exports = writeJsonFile; +// TODO: Remove this for the next major release +module.exports.default = writeJsonFile; +module.exports.sync = (filePath, data, options) => { + makeDir.sync(path.dirname(filePath), {fs}); + init(mainSync, filePath, data, options); +}; + + +/***/ }), +/* 215 */ +/***/ (function(module, exports, __webpack_require__) { + +var fs = __webpack_require__(133) +var polyfills = __webpack_require__(216) +var legacy = __webpack_require__(217) +var clone = __webpack_require__(218) + +var queue = [] + +var util = __webpack_require__(111) + +function noop () {} + +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } + +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(139).equal(queue.length, 0) + }) +} + +module.exports = patch(clone(fs)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module.exports = patch(fs) + fs.__patched = true; +} + +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() + + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) + +module.exports.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) + +// Only patch fs once, otherwise we'll run into a memory leak if +// graceful-fs is loaded multiple times, such as in test environments that +// reset the loaded modules between tests. +// We look for the string `graceful-fs` from the comment above. This +// way we are not adding any extra properties and it will detect if older +// versions of graceful-fs are installed. +if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { + fs.closeSync = module.exports.closeSync; + fs.close = module.exports.close; +} + +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$readFile(path, options, cb) + + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$writeFile(path, data, options, cb) + + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null + + return go$appendFile(path, data, options, cb) + + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } + + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options + } + args.push(go$readdir$cb) + + return go$readdir(args) + + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() + + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } + + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } + + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } + + var fs$ReadStream = fs.ReadStream + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open + } + + var fs$WriteStream = fs.WriteStream + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open + } + + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream + + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } + + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() + + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } + + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } + + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } + + function createReadStream (path, options) { + return new ReadStream(path, options) + } -if (true) { -exports.parser = spdxparse; -exports.Parser = spdxparse.Parser; -exports.parse = function () { return spdxparse.parse.apply(spdxparse, arguments); }; -exports.main = function commonjsMain(args) { - if (!args[1]) { - console.log('Usage: '+args[0]+' FILE'); - process.exit(1); + function createWriteStream (path, options) { + return new WriteStream(path, options) + } + + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null + + return go$open(path, flags, mode, cb) + + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) } - var source = __webpack_require__(132).readFileSync(__webpack_require__(4).normalize(args[1]), "utf8"); - return exports.parser.parse(source); -}; -if ( true && __webpack_require__.c[__webpack_require__.s] === module) { - exports.main(process.argv.slice(1)); + } + + return fs +} + +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) } + +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } } -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) /***/ }), -/* 186 */ +/* 216 */ /***/ (function(module, exports, __webpack_require__) { -var licenseIDs = __webpack_require__(187); +var constants = __webpack_require__(135) -function valid(string) { - return licenseIDs.indexOf(string) > -1; +var origCwd = process.cwd +var cwd = null + +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform + +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd } +try { + process.cwd() +} catch (er) {} -// Common transpositions of license identifier acronyms -var transpositions = [ - ['APGL', 'AGPL'], - ['Gpl', 'GPL'], - ['GLP', 'GPL'], - ['APL', 'Apache'], - ['ISD', 'ISC'], - ['GLP', 'GPL'], - ['IST', 'ISC'], - ['Claude', 'Clause'], - [' or later', '+'], - [' International', ''], - ['GNU', 'GPL'], - ['GUN', 'GPL'], - ['+', ''], - ['GNU GPL', 'GPL'], - ['GNU/GPL', 'GPL'], - ['GNU GLP', 'GPL'], - ['GNU General Public License', 'GPL'], - ['Gnu public license', 'GPL'], - ['GNU Public License', 'GPL'], - ['GNU GENERAL PUBLIC LICENSE', 'GPL'], - ['MTI', 'MIT'], - ['Mozilla Public License', 'MPL'], - ['WTH', 'WTF'], - ['-License', ''] -]; +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} -var TRANSPOSED = 0; -var CORRECT = 1; +module.exports = patch -// Simple corrections to nearly valid identifiers. -var transforms = [ - // e.g. 'mit' - function(argument) { - return argument.toUpperCase(); - }, - // e.g. 'MIT ' - function(argument) { - return argument.trim(); - }, - // e.g. 'M.I.T.' - function(argument) { - return argument.replace(/\./g, ''); - }, - // e.g. 'Apache- 2.0' - function(argument) { - return argument.replace(/\s+/g, ''); - }, - // e.g. 'CC BY 4.0'' - function(argument) { - return argument.replace(/\s+/g, '-'); - }, - // e.g. 'LGPLv2.1' - function(argument) { - return argument.replace('v', '-'); - }, - // e.g. 'Apache 2.0' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1'); - }, - // e.g. 'GPL 2' - function(argument) { - return argument.replace(/,?\s*(\d)/, '-$1.0'); - }, - // e.g. 'Apache Version 2.0' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2'); - }, - // e.g. 'Apache Version 2' - function(argument) { - return argument.replace(/,?\s*(V\.|v\.|V|v|Version|version)\s*(\d)/, '-$2.0'); - }, - // e.g. 'ZLIB' - function(argument) { - return argument[0].toUpperCase() + argument.slice(1); - }, - // e.g. 'MPL/2.0' - function(argument) { - return argument.replace('/', '-'); - }, - // e.g. 'Apache 2' - function(argument) { - return argument - .replace(/\s*V\s*(\d)/, '-$1') - .replace(/(\d)$/, '$1.0'); - }, - // e.g. 'GPL-2.0-' - function(argument) { - return argument.slice(0, argument.length - 1); - }, - // e.g. 'GPL2' - function(argument) { - return argument.replace(/(\d)$/, '-$1.0'); - }, - // e.g. 'BSD 3' - function(argument) { - return argument.replace(/(-| )?(\d)$/, '-$2-Clause'); - }, - // e.g. 'BSD clause 3' - function(argument) { - return argument.replace(/(-| )clause(-| )(\d)/, '-$3-Clause'); - }, - // e.g. 'BY-NC-4.0' - function(argument) { - return 'CC-' + argument; - }, - // e.g. 'BY-NC' - function(argument) { - return 'CC-' + argument + '-4.0'; - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, ''); - }, - // e.g. 'Attribution-NonCommercial' - function(argument) { - return 'CC-' + - argument - .replace('Attribution', 'BY') - .replace('NonCommercial', 'NC') - .replace('NoDerivatives', 'ND') - .replace(/ (\d)/, '-$1') - .replace(/ ?International/, '') + - '-4.0'; +function patch (fs) { + // (re-)implement some things that are known busted or missing. + + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) } -]; -// If all else fails, guess that strings containing certain substrings -// meant to identify certain licenses. -var lastResorts = [ - ['UNLI', 'Unlicense'], - ['WTF', 'WTFPL'], - ['2 CLAUSE', 'BSD-2-Clause'], - ['2-CLAUSE', 'BSD-2-Clause'], - ['3 CLAUSE', 'BSD-3-Clause'], - ['3-CLAUSE', 'BSD-3-Clause'], - ['AFFERO', 'AGPL-3.0'], - ['AGPL', 'AGPL-3.0'], - ['APACHE', 'Apache-2.0'], - ['ARTISTIC', 'Artistic-2.0'], - ['Affero', 'AGPL-3.0'], - ['BEER', 'Beerware'], - ['BOOST', 'BSL-1.0'], - ['BSD', 'BSD-2-Clause'], - ['ECLIPSE', 'EPL-1.0'], - ['FUCK', 'WTFPL'], - ['GNU', 'GPL-3.0'], - ['LGPL', 'LGPL-3.0'], - ['GPL', 'GPL-3.0'], - ['MIT', 'MIT'], - ['MPL', 'MPL-2.0'], - ['X11', 'X11'], - ['ZLIB', 'Zlib'] -]; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } -var SUBSTRING = 0; -var IDENTIFIER = 1; + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. -var validTransformation = function(identifier) { - for (var i = 0; i < transforms.length; i++) { - var transformed = transforms[i](identifier); - if (transformed !== identifier && valid(transformed)) { - return transformed; + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) + + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) + + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) + + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) + + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) + + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) + + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) + } + fs.lchownSync = function () {} } - return null; -}; -var validLastResort = function(identifier) { - var upperCased = identifier.toUpperCase(); - for (var i = 0; i < lastResorts.length; i++) { - var lastResort = lastResorts[i]; - if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) { - return lastResort[IDENTIFIER]; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } + + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) + + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) + + function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret } } - return null; -}; -var anyCorrection = function(identifier, check) { - for (var i = 0; i < transpositions.length; i++) { - var transposition = transpositions[i]; - var transposed = transposition[TRANSPOSED]; - if (identifier.indexOf(transposed) > -1) { - var corrected = identifier.replace( - transposed, - transposition[CORRECT] - ); - var checked = check(corrected); - if (checked !== null) { - return checked; + function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } + } + + function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } + + function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } + } + } + + + function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } + } + + function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er } } } - return null; -}; -module.exports = function(identifier) { - identifier = identifier.replace(/\+$/, ''); - if (valid(identifier)) { - return identifier; - } - var transformed = validTransformation(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, function(argument) { - if (valid(argument)) { - return argument; + + function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } + } + + function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; } - return validTransformation(argument); - }); - if (transformed !== null) { - return transformed; - } - transformed = validLastResort(identifier); - if (transformed !== null) { - return transformed; - } - transformed = anyCorrection(identifier, validLastResort); - if (transformed !== null) { - return transformed; } - return null; -}; + // ENOSYS means that the fs doesn't support the op. Just ignore + // that, because it doesn't matter. + // + // if there's no getuid, or if getuid() is something other + // than 0, and the error is EINVAL or EPERM, then just ignore + // it. + // + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // + // When running as root, or if other types of errors are + // encountered, then it's strict. + function chownErOk (er) { + if (!er) + return true -/***/ }), -/* 187 */ -/***/ (function(module) { + if (er.code === "ENOSYS") + return true + + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false + } +} -module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); /***/ }), -/* 188 */ +/* 217 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var Stream = __webpack_require__(137).Stream -var url = __webpack_require__(189) -var gitHosts = __webpack_require__(190) -var GitHost = module.exports = __webpack_require__(191) +module.exports = legacy -var protocolToRepresentationMap = { - 'git+ssh': 'sshurl', - 'git+https': 'https', - 'ssh': 'sshurl', - 'git': 'git' -} +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } -function protocolToRepresentation (protocol) { - if (protocol.substr(-1) === ':') protocol = protocol.slice(0, -1) - return protocolToRepresentationMap[protocol] || protocol -} + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -var authProtocols = { - 'git:': true, - 'https:': true, - 'git+https:': true, - 'http:': true, - 'git+http:': true -} + Stream.call(this); -var cache = {} + var self = this; -module.exports.fromUrl = function (giturl, opts) { - var key = giturl + JSON.stringify(opts || {}) + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; - if (!(key in cache)) { - cache[key] = fromUrl(giturl, opts) - } + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; - return cache[key] -} + options = options || {}; -function fromUrl (giturl, opts) { - if (giturl == null || giturl === '') return - var url = fixupUnqualifiedGist( - isGitHubShorthand(giturl) ? 'github:' + giturl : giturl - ) - var parsed = parseGitUrl(url) - var shortcutMatch = url.match(new RegExp('^([^:]+):(?:(?:[^@:]+(?:[^@]+)?@)?([^/]*))[/](.+?)(?:[.]git)?($|#)')) - var matches = Object.keys(gitHosts).map(function (gitHostName) { - try { - var gitHostInfo = gitHosts[gitHostName] - var auth = null - if (parsed.auth && authProtocols[parsed.protocol]) { - auth = decodeURIComponent(parsed.auth) + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.encoding) this.setEncoding(this.encoding); + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); } - var committish = parsed.hash ? decodeURIComponent(parsed.hash.substr(1)) : null - var user = null - var project = null - var defaultRepresentation = null - if (shortcutMatch && shortcutMatch[1] === gitHostName) { - user = shortcutMatch[2] && decodeURIComponent(shortcutMatch[2]) - project = decodeURIComponent(shortcutMatch[3]) - defaultRepresentation = 'shortcut' - } else { - if (parsed.host !== gitHostInfo.domain) return - if (!gitHostInfo.protocols_re.test(parsed.protocol)) return - if (!parsed.path) return - var pathmatch = gitHostInfo.pathmatch - var matched = parsed.path.match(pathmatch) - if (!matched) return - if (matched[1] != null) user = decodeURIComponent(matched[1].replace(/^:/, '')) - if (matched[2] != null) project = decodeURIComponent(matched[2]) - defaultRepresentation = protocolToRepresentation(parsed.protocol) + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); } - return new GitHost(gitHostName, user, auth, project, committish, defaultRepresentation, opts) - } catch (ex) { - if (!(ex instanceof URIError)) throw ex + + if (this.start > this.end) { + throw new Error('start must be <= end'); + } + + this.pos = this.start; } - }).filter(function (gitHostInfo) { return gitHostInfo }) - if (matches.length !== 1) return - return matches[0] -} -function isGitHubShorthand (arg) { - // Note: This does not fully test the git ref format. - // See https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html - // - // The only way to do this properly would be to shell out to - // git-check-ref-format, and as this is a fast sync function, - // we don't want to do that. Just let git fail if it turns - // out that the commit-ish is invalid. - // GH usernames cannot start with . or - - return /^[^:@%/\s.-][^:@%/\s]*[/][^:@\s/%]+(?:#.*)?$/.test(arg) -} + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -function fixupUnqualifiedGist (giturl) { - // necessary for round-tripping gists - var parsed = url.parse(giturl) - if (parsed.protocol === 'gist:' && parsed.host && !parsed.path) { - return parsed.protocol + '/' + parsed.host - } else { - return giturl + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } + + self.fd = fd; + self.emit('open', fd); + self._read(); + }) } -} -function parseGitUrl (giturl) { - if (typeof giturl !== 'string') giturl = '' + giturl - var matched = giturl.match(/^([^@]+)@([^:/]+):[/]?((?:[^/]+[/])?[^/]+?)(?:[.]git)?(#.*)?$/) - if (!matched) return url.parse(giturl) - return { - protocol: 'git+ssh:', - slashes: true, - auth: matched[1], - host: matched[2], - port: null, - hostname: matched[2], - hash: matched[4], - search: null, - query: null, - pathname: '/' + matched[3], - path: '/' + matched[3], - href: 'git+ssh://' + matched[1] + '@' + matched[2] + - '/' + matched[3] + (matched[4] || '') + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); + + Stream.call(this); + + this.path = path; + this.fd = null; + this.writable = true; + + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; + + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } + + this.pos = this.start; + } + + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } } } /***/ }), -/* 189 */ -/***/ (function(module, exports) { +/* 218 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = clone + +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj + + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) + + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) + + return copy +} -module.exports = require("url"); /***/ }), -/* 190 */ +/* 219 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +module.exports = writeFile +module.exports.sync = writeFileSync +module.exports._getTmpname = getTmpname // for testing +module.exports._cleanupOnExit = cleanupOnExit -var gitHosts = module.exports = { - github: { - // First two are insecure and generally shouldn't be used any more, but - // they are still supported. - 'protocols': [ 'git', 'http', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'github.com', - 'treepath': 'tree', - 'filetemplate': 'https://{auth@}raw.githubusercontent.com/{user}/{project}/{committish}/{path}', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'gittemplate': 'git://{auth@}{domain}/{user}/{project}.git{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' - }, - bitbucket: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'bitbucket.org', - 'treepath': 'src', - 'tarballtemplate': 'https://{domain}/{user}/{project}/get/{committish}.tar.gz' - }, - gitlab: { - 'protocols': [ 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gitlab.com', - 'treepath': 'tree', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#README', - 'bugstemplate': 'https://{domain}/{user}/{project}/issues', - 'tarballtemplate': 'https://{domain}/{user}/{project}/repository/archive.tar.gz?ref={committish}' - }, - gist: { - 'protocols': [ 'git', 'git+ssh', 'git+https', 'ssh', 'https' ], - 'domain': 'gist.github.com', - 'pathmatch': /^[/](?:([^/]+)[/])?([a-z0-9]+)(?:[.]git)?$/, - 'filetemplate': 'https://gist.githubusercontent.com/{user}/{project}/raw{/committish}/{path}', - 'bugstemplate': 'https://{domain}/{project}', - 'gittemplate': 'git://{domain}/{project}.git{#committish}', - 'sshtemplate': 'git@{domain}:/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{project}{/committish}', - 'docstemplate': 'https://{domain}/{project}{/committish}', - 'httpstemplate': 'git+https://{domain}/{project}.git{#committish}', - 'shortcuttemplate': '{type}:{project}{#committish}', - 'pathtemplate': '{project}{#committish}', - 'tarballtemplate': 'https://{domain}/{user}/{project}/archive/{committish}.tar.gz' +var fs = __webpack_require__(220) +var MurmurHash3 = __webpack_require__(224) +var onExit = __webpack_require__(225) +var path = __webpack_require__(4) +var activeFiles = {} + +// if we run inside of a worker_thread, `process.pid` is not unique +/* istanbul ignore next */ +var threadId = (function getId () { + try { + var workerThreads = __webpack_require__(227) + + /// if we are in main thread, this is set to `0` + return workerThreads.threadId + } catch (e) { + // worker_threads are not available, fallback to 0 + return 0 } -} +})() -var gitHostDefaults = { - 'sshtemplate': 'git@{domain}:{user}/{project}.git{#committish}', - 'sshurltemplate': 'git+ssh://git@{domain}/{user}/{project}.git{#committish}', - 'browsetemplate': 'https://{domain}/{user}/{project}{/tree/committish}', - 'docstemplate': 'https://{domain}/{user}/{project}{/tree/committish}#readme', - 'httpstemplate': 'git+https://{auth@}{domain}/{user}/{project}.git{#committish}', - 'filetemplate': 'https://{domain}/{user}/{project}/raw/{committish}/{path}', - 'shortcuttemplate': '{type}:{user}/{project}{#committish}', - 'pathtemplate': '{user}/{project}{#committish}', - 'pathmatch': /^[/]([^/]+)[/]([^/]+?)(?:[.]git|[/])?$/ +var invocations = 0 +function getTmpname (filename) { + return filename + '.' + + MurmurHash3(__filename) + .hash(String(process.pid)) + .hash(String(threadId)) + .hash(String(++invocations)) + .result() } -Object.keys(gitHosts).forEach(function (name) { - Object.keys(gitHostDefaults).forEach(function (key) { - if (gitHosts[name][key]) return - gitHosts[name][key] = gitHostDefaults[key] - }) - gitHosts[name].protocols_re = RegExp('^(' + - gitHosts[name].protocols.map(function (protocol) { - return protocol.replace(/([\\+*{}()[\]$^|])/g, '\\$1') - }).join('|') + '):$') -}) +function cleanupOnExit (tmpfile) { + return function () { + try { + fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) + } catch (_) {} + } +} +function writeFile (filename, data, options, callback) { + if (options) { + if (options instanceof Function) { + callback = options + options = {} + } else if (typeof options === 'string') { + options = { encoding: options } + } + } else { + options = {} + } -/***/ }), -/* 191 */ -/***/ (function(module, exports, __webpack_require__) { + var Promise = options.Promise || global.Promise + var truename + var fd + var tmpfile + /* istanbul ignore next -- The closure only gets called when onExit triggers */ + var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) + var absoluteName = path.resolve(filename) -"use strict"; + new Promise(function serializeSameFile (resolve) { + // make a queue if it doesn't already exist + if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] -var gitHosts = __webpack_require__(190) -var extend = Object.assign || __webpack_require__(111)._extend + activeFiles[absoluteName].push(resolve) // add this job to the queue + if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one + }).then(function getRealPath () { + return new Promise(function (resolve) { + fs.realpath(filename, function (_, realname) { + truename = realname || filename + tmpfile = getTmpname(truename) + resolve() + }) + }) + }).then(function stat () { + return new Promise(function stat (resolve) { + if (options.mode && options.chown) resolve() + else { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + fs.stat(truename, function (err, stats) { + if (err || !stats) resolve() + else { + options = Object.assign({}, options) -var GitHost = module.exports = function (type, user, auth, project, committish, defaultRepresentation, opts) { - var gitHostInfo = this - gitHostInfo.type = type - Object.keys(gitHosts[type]).forEach(function (key) { - gitHostInfo[key] = gitHosts[type][key] + if (options.mode == null) { + options.mode = stats.mode + } + if (options.chown == null && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + resolve() + } + }) + } + }) + }).then(function thenWriteFile () { + return new Promise(function (resolve, reject) { + fs.open(tmpfile, 'w', options.mode, function (err, _fd) { + fd = _fd + if (err) reject(err) + else resolve() + }) + }) + }).then(function write () { + return new Promise(function (resolve, reject) { + if (Buffer.isBuffer(data)) { + fs.write(fd, data, 0, data.length, 0, function (err) { + if (err) reject(err) + else resolve() + }) + } else if (data != null) { + fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { + if (err) reject(err) + else resolve() + }) + } else resolve() + }) + }).then(function syncAndClose () { + return new Promise(function (resolve, reject) { + if (options.fsync !== false) { + fs.fsync(fd, function (err) { + if (err) fs.close(fd, () => reject(err)) + else fs.close(fd, resolve) + }) + } else { + fs.close(fd, resolve) + } + }) + }).then(function chown () { + fd = null + if (options.chown) { + return new Promise(function (resolve, reject) { + fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function chmod () { + if (options.mode) { + return new Promise(function (resolve, reject) { + fs.chmod(tmpfile, options.mode, function (err) { + if (err) reject(err) + else resolve() + }) + }) + } + }).then(function rename () { + return new Promise(function (resolve, reject) { + fs.rename(tmpfile, truename, function (err) { + if (err) reject(err) + else resolve() + }) + }) + }).then(function success () { + removeOnExitHandler() + callback() + }, function fail (err) { + return new Promise(resolve => { + return fd ? fs.close(fd, resolve) : resolve() + }).then(() => { + removeOnExitHandler() + fs.unlink(tmpfile, function () { + callback(err) + }) + }) + }).then(function checkQueue () { + activeFiles[absoluteName].shift() // remove the element added by serializeSameFile + if (activeFiles[absoluteName].length > 0) { + activeFiles[absoluteName][0]() // start next job if one is pending + } else delete activeFiles[absoluteName] }) - gitHostInfo.user = user - gitHostInfo.auth = auth - gitHostInfo.project = project - gitHostInfo.committish = committish - gitHostInfo.default = defaultRepresentation - gitHostInfo.opts = opts || {} -} -GitHost.prototype = {} - -GitHost.prototype.hash = function () { - return this.committish ? '#' + this.committish : '' } -GitHost.prototype._fill = function (template, opts) { - if (!template) return - var vars = extend({}, opts) - opts = extend(extend({}, this.opts), opts) - var self = this - Object.keys(this).forEach(function (key) { - if (self[key] != null && vars[key] == null) vars[key] = self[key] - }) - var rawAuth = vars.auth - var rawComittish = vars.committish - Object.keys(vars).forEach(function (key) { - vars[key] = encodeURIComponent(vars[key]) - }) - vars['auth@'] = rawAuth ? rawAuth + '@' : '' - if (opts.noCommittish) { - vars['#committish'] = '' - vars['/tree/committish'] = '' - vars['/comittish'] = '' - vars.comittish = '' - } else { - vars['#committish'] = rawComittish ? '#' + rawComittish : '' - vars['/tree/committish'] = vars.committish - ? '/' + vars.treepath + '/' + vars.committish - : '' - vars['/committish'] = vars.committish ? '/' + vars.committish : '' - vars.committish = vars.committish || 'master' - } - var res = template - Object.keys(vars).forEach(function (key) { - res = res.replace(new RegExp('[{]' + key + '[}]', 'g'), vars[key]) - }) - if (opts.noGitPlus) { - return res.replace(/^git[+]/, '') - } else { - return res +function writeFileSync (filename, data, options) { + if (typeof options === 'string') options = { encoding: options } + else if (!options) options = {} + try { + filename = fs.realpathSync(filename) + } catch (ex) { + // it's ok, it'll happen on a not yet existing file } -} - -GitHost.prototype.ssh = function (opts) { - return this._fill(this.sshtemplate, opts) -} - -GitHost.prototype.sshurl = function (opts) { - return this._fill(this.sshurltemplate, opts) -} + var tmpfile = getTmpname(filename) -GitHost.prototype.browse = function (opts) { - return this._fill(this.browsetemplate, opts) -} + if (!options.mode || !options.chown) { + // Either mode or chown is not explicitly set + // Default behavior is to copy it from original file + try { + var stats = fs.statSync(filename) + options = Object.assign({}, options) + if (!options.mode) { + options.mode = stats.mode + } + if (!options.chown && process.getuid) { + options.chown = { uid: stats.uid, gid: stats.gid } + } + } catch (ex) { + // ignore stat errors + } + } -GitHost.prototype.docs = function (opts) { - return this._fill(this.docstemplate, opts) -} + var fd + var cleanup = cleanupOnExit(tmpfile) + var removeOnExitHandler = onExit(cleanup) -GitHost.prototype.bugs = function (opts) { - return this._fill(this.bugstemplate, opts) + try { + fd = fs.openSync(tmpfile, 'w', options.mode) + if (Buffer.isBuffer(data)) { + fs.writeSync(fd, data, 0, data.length, 0) + } else if (data != null) { + fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) + } + if (options.fsync !== false) { + fs.fsyncSync(fd) + } + fs.closeSync(fd) + if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) + if (options.mode) fs.chmodSync(tmpfile, options.mode) + fs.renameSync(tmpfile, filename) + removeOnExitHandler() + } catch (err) { + if (fd) { + try { + fs.closeSync(fd) + } catch (ex) { + // ignore close errors at this stage, error may have closed fd already. + } + } + removeOnExitHandler() + cleanup() + throw err + } } -GitHost.prototype.https = function (opts) { - return this._fill(this.httpstemplate, opts) -} -GitHost.prototype.git = function (opts) { - return this._fill(this.gittemplate, opts) -} +/***/ }), +/* 220 */ +/***/ (function(module, exports, __webpack_require__) { -GitHost.prototype.shortcut = function (opts) { - return this._fill(this.shortcuttemplate, opts) -} +var fs = __webpack_require__(133) +var polyfills = __webpack_require__(221) +var legacy = __webpack_require__(223) +var queue = [] -GitHost.prototype.path = function (opts) { - return this._fill(this.pathtemplate, opts) -} +var util = __webpack_require__(111) -GitHost.prototype.tarball = function (opts) { - return this._fill(this.tarballtemplate, opts) -} +function noop () {} -GitHost.prototype.file = function (P, opts) { - return this._fill(this.filetemplate, extend({ - path: P.replace(/^[/]+/g, '') - }, opts)) -} +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs4') +else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') + console.error(m) + } -GitHost.prototype.getDefaultRepresentation = function () { - return this.default +if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug(queue) + __webpack_require__(139).equal(queue.length, 0) + }) } -GitHost.prototype.toString = function (opts) { - return (this[this.default] || this.sshurl).call(this, opts) +module.exports = patch(__webpack_require__(222)) +if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { + module.exports = patch(fs) } +// Always patch fs.close/closeSync, because we want to +// retry() whenever a close happens *anywhere* in the program. +// This is essential when multiple graceful-fs instances are +// in play at the same time. +module.exports.close = +fs.close = (function (fs$close) { return function (fd, cb) { + return fs$close.call(fs, fd, function (err) { + if (!err) + retry() -/***/ }), -/* 192 */ -/***/ (function(module, exports, __webpack_require__) { - -var async = __webpack_require__(193); -async.core = __webpack_require__(199); -async.isCore = __webpack_require__(198); -async.sync = __webpack_require__(201); + if (typeof cb === 'function') + cb.apply(this, arguments) + }) +}})(fs.close) -module.exports = async; +module.exports.closeSync = +fs.closeSync = (function (fs$closeSync) { return function (fd) { + // Note that graceful-fs also retries when fs.closeSync() fails. + // Looks like a bug to me, although it's probably a harmless one. + var rval = fs$closeSync.apply(fs, arguments) + retry() + return rval +}})(fs.closeSync) +function patch (fs) { + // Everything that references the open() function needs to be in here + polyfills(fs) + fs.gracefulify = patch + fs.FileReadStream = ReadStream; // Legacy name. + fs.FileWriteStream = WriteStream; // Legacy name. + fs.createReadStream = createReadStream + fs.createWriteStream = createWriteStream + var fs$readFile = fs.readFile + fs.readFile = readFile + function readFile (path, options, cb) { + if (typeof options === 'function') + cb = options, options = null -/***/ }), -/* 193 */ -/***/ (function(module, exports, __webpack_require__) { + return go$readFile(path, options, cb) -var fs = __webpack_require__(132); -var path = __webpack_require__(4); -var caller = __webpack_require__(194); -var nodeModulesPaths = __webpack_require__(195); -var normalizeOptions = __webpack_require__(197); -var isCore = __webpack_require__(198); + function go$readFile (path, options, cb) { + return fs$readFile(path, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readFile, [path, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) + } + } -var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; + var fs$writeFile = fs.writeFile + fs.writeFile = writeFile + function writeFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null -var defaultIsFile = function isFile(file, cb) { - fs.stat(file, function (err, stat) { - if (!err) { - return cb(null, stat.isFile() || stat.isFIFO()); - } - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); - return cb(err); - }); -}; + return go$writeFile(path, data, options, cb) -var defaultIsDir = function isDirectory(dir, cb) { - fs.stat(dir, function (err, stat) { - if (!err) { - return cb(null, stat.isDirectory()); + function go$writeFile (path, data, options, cb) { + return fs$writeFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$writeFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } - if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false); - return cb(err); - }); -}; + }) + } + } -var defaultRealpath = function realpath(x, cb) { - realpathFS(x, function (realpathErr, realPath) { - if (realpathErr && realpathErr.code !== 'ENOENT') cb(realpathErr); - else cb(null, realpathErr ? x : realPath); - }); -}; + var fs$appendFile = fs.appendFile + if (fs$appendFile) + fs.appendFile = appendFile + function appendFile (path, data, options, cb) { + if (typeof options === 'function') + cb = options, options = null -var maybeRealpath = function maybeRealpath(realpath, x, opts, cb) { - if (opts && opts.preserveSymlinks === false) { - realpath(x, cb); - } else { - cb(null, x); - } -}; + return go$appendFile(path, data, options, cb) -var getPackageCandidates = function getPackageCandidates(x, start, opts) { - var dirs = nodeModulesPaths(start, opts, x); - for (var i = 0; i < dirs.length; i++) { - dirs[i] = path.join(dirs[i], x); + function go$appendFile (path, data, options, cb) { + return fs$appendFile(path, data, options, function (err) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$appendFile, [path, data, options, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + }) } - return dirs; -}; + } -module.exports = function resolve(x, options, callback) { - var cb = callback; - var opts = options; - if (typeof options === 'function') { - cb = opts; - opts = {}; - } - if (typeof x !== 'string') { - var err = new TypeError('Path must be a string.'); - return process.nextTick(function () { - cb(err); - }); + var fs$readdir = fs.readdir + fs.readdir = readdir + function readdir (path, options, cb) { + var args = [path] + if (typeof options !== 'function') { + args.push(options) + } else { + cb = options } + args.push(go$readdir$cb) - opts = normalizeOptions(x, opts); + return go$readdir(args) - var isFile = opts.isFile || defaultIsFile; - var isDirectory = opts.isDirectory || defaultIsDir; - var readFile = opts.readFile || fs.readFile; - var realpath = opts.realpath || defaultRealpath; - var packageIterator = opts.packageIterator; + function go$readdir$cb (err, files) { + if (files && files.sort) + files.sort() - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$readdir, [args]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() + } + } + } - opts.paths = opts.paths || []; + function go$readdir (args) { + return fs$readdir.apply(fs, args) + } - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = path.resolve(basedir); + if (process.version.substr(0, 4) === 'v0.8') { + var legStreams = legacy(fs) + ReadStream = legStreams.ReadStream + WriteStream = legStreams.WriteStream + } - maybeRealpath( - realpath, - absoluteStart, - opts, - function (err, realStart) { - if (err) cb(err); - else init(realStart); - } - ); + var fs$ReadStream = fs.ReadStream + ReadStream.prototype = Object.create(fs$ReadStream.prototype) + ReadStream.prototype.open = ReadStream$open - var res; - function init(basedir) { - if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { - res = path.resolve(basedir, x); - if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; - if ((/\/$/).test(x) && res === basedir) { - loadAsDirectory(res, opts.package, onfile); - } else loadAsFile(res, opts.package, onfile); - } else if (isCore(x)) { - return cb(null, x); - } else loadNodeModules(x, basedir, function (err, n, pkg) { - if (err) cb(err); - else if (n) { - return maybeRealpath(realpath, n, opts, function (err, realN) { - if (err) { - cb(err); - } else { - cb(null, realN, pkg); - } - }); - } else { - var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - moduleError.code = 'MODULE_NOT_FOUND'; - cb(moduleError); - } - }); - } + var fs$WriteStream = fs.WriteStream + WriteStream.prototype = Object.create(fs$WriteStream.prototype) + WriteStream.prototype.open = WriteStream$open - function onfile(err, m, pkg) { - if (err) cb(err); - else if (m) cb(null, m, pkg); - else loadAsDirectory(res, function (err, d, pkg) { - if (err) cb(err); - else if (d) { - maybeRealpath(realpath, d, opts, function (err, realD) { - if (err) { - cb(err); - } else { - cb(null, realD, pkg); - } - }); - } else { - var moduleError = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - moduleError.code = 'MODULE_NOT_FOUND'; - cb(moduleError); - } - }); - } + fs.ReadStream = ReadStream + fs.WriteStream = WriteStream - function loadAsFile(x, thePackage, callback) { - var loadAsFilePackage = thePackage; - var cb = callback; - if (typeof loadAsFilePackage === 'function') { - cb = loadAsFilePackage; - loadAsFilePackage = undefined; - } + function ReadStream (path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments) + } - var exts = [''].concat(extensions); - load(exts, x, loadAsFilePackage); + function ReadStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + if (that.autoClose) + that.destroy() - function load(exts, x, loadPackage) { - if (exts.length === 0) return cb(null, undefined, loadPackage); - var file = x + exts[0]; + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + that.read() + } + }) + } - var pkg = loadPackage; - if (pkg) onpkg(null, pkg); - else loadpkg(path.dirname(file), onpkg); + function WriteStream (path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments) + } - function onpkg(err, pkg_, dir) { - pkg = pkg_; - if (err) return cb(err); - if (dir && pkg && opts.pathFilter) { - var rfile = path.relative(dir, file); - var rel = rfile.slice(0, rfile.length - exts[0].length); - var r = opts.pathFilter(pkg, x, rel); - if (r) return load( - [''].concat(extensions.slice()), - path.resolve(dir, r), - pkg - ); - } - isFile(file, onex); - } - function onex(err, ex) { - if (err) return cb(err); - if (ex) return cb(null, file, pkg); - load(exts.slice(1), x, pkg); - } - } - } + function WriteStream$open () { + var that = this + open(that.path, that.flags, that.mode, function (err, fd) { + if (err) { + that.destroy() + that.emit('error', err) + } else { + that.fd = fd + that.emit('open', fd) + } + }) + } - function loadpkg(dir, cb) { - if (dir === '' || dir === '/') return cb(null); - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return cb(null); - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return cb(null); + function createReadStream (path, options) { + return new ReadStream(path, options) + } - maybeRealpath(realpath, dir, opts, function (unwrapErr, pkgdir) { - if (unwrapErr) return loadpkg(path.dirname(dir), cb); - var pkgfile = path.join(pkgdir, 'package.json'); - isFile(pkgfile, function (err, ex) { - // on err, ex is false - if (!ex) return loadpkg(path.dirname(dir), cb); + function createWriteStream (path, options) { + return new WriteStream(path, options) + } - readFile(pkgfile, function (err, body) { - if (err) cb(err); - try { var pkg = JSON.parse(body); } catch (jsonErr) {} + var fs$open = fs.open + fs.open = open + function open (path, flags, mode, cb) { + if (typeof mode === 'function') + cb = mode, mode = null - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - cb(null, pkg, dir); - }); - }); - }); - } + return go$open(path, flags, mode, cb) - function loadAsDirectory(x, loadAsDirectoryPackage, callback) { - var cb = callback; - var fpkg = loadAsDirectoryPackage; - if (typeof fpkg === 'function') { - cb = fpkg; - fpkg = opts.package; + function go$open (path, flags, mode, cb) { + return fs$open(path, flags, mode, function (err, fd) { + if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) + enqueue([go$open, [path, flags, mode, cb]]) + else { + if (typeof cb === 'function') + cb.apply(this, arguments) + retry() } + }) + } + } - maybeRealpath(realpath, x, opts, function (unwrapErr, pkgdir) { - if (unwrapErr) return cb(unwrapErr); - var pkgfile = path.join(pkgdir, 'package.json'); - isFile(pkgfile, function (err, ex) { - if (err) return cb(err); - if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb); + return fs +} - readFile(pkgfile, function (err, body) { - if (err) return cb(err); - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} +function enqueue (elem) { + debug('ENQUEUE', elem[0].name, elem[1]) + queue.push(elem) +} - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } +function retry () { + var elem = queue.shift() + if (elem) { + debug('RETRY', elem[0].name, elem[1]) + elem[0].apply(null, elem[1]) + } +} - if (pkg && pkg.main) { - if (typeof pkg.main !== 'string') { - var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); - mainError.code = 'INVALID_PACKAGE_MAIN'; - return cb(mainError); - } - if (pkg.main === '.' || pkg.main === './') { - pkg.main = 'index'; - } - loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb); - var dir = path.resolve(x, pkg.main); - loadAsDirectory(dir, pkg, function (err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - loadAsFile(path.join(x, 'index'), pkg, cb); - }); - }); - return; - } +/***/ }), +/* 221 */ +/***/ (function(module, exports, __webpack_require__) { - loadAsFile(path.join(x, '/index'), pkg, cb); - }); - }); - }); - } +var fs = __webpack_require__(222) +var constants = __webpack_require__(135) - function processDirs(cb, dirs) { - if (dirs.length === 0) return cb(null, undefined); - var dir = dirs[0]; +var origCwd = process.cwd +var cwd = null - isDirectory(path.dirname(dir), isdir); +var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - function isdir(err, isdir) { - if (err) return cb(err); - if (!isdir) return processDirs(cb, dirs.slice(1)); - loadAsFile(dir, opts.package, onfile); - } +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +try { + process.cwd() +} catch (er) {} - function onfile(err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - loadAsDirectory(dir, opts.package, ondir); - } +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} - function ondir(err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - processDirs(cb, dirs.slice(1)); - } - } - function loadNodeModules(x, start, cb) { - var thunk = function () { return getPackageCandidates(x, start, opts); }; - processDirs( - cb, - packageIterator ? packageIterator(x, start, thunk, opts) : thunk() - ); - } -}; +module.exports = patch +function patch (fs) { + // (re-)implement some things that are known busted or missing. -/***/ }), -/* 194 */ -/***/ (function(module, exports) { + // lchmod, broken prior to 0.6.2 + // back-port the fix here. + if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs) + } -module.exports = function () { - // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi - var origPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = function (_, stack) { return stack; }; - var stack = (new Error()).stack; - Error.prepareStackTrace = origPrepareStackTrace; - return stack[2].getFileName(); -}; + // lutimes implementation, or no-op + if (!fs.lutimes) { + patchLutimes(fs) + } + // https://github.com/isaacs/node-graceful-fs/issues/4 + // Chown should not fail on einval or eperm if non-root. + // It should not fail on enosys ever, as this just indicates + // that a fs doesn't support the intended operation. -/***/ }), -/* 195 */ -/***/ (function(module, exports, __webpack_require__) { + fs.chown = chownFix(fs.chown) + fs.fchown = chownFix(fs.fchown) + fs.lchown = chownFix(fs.lchown) -var path = __webpack_require__(4); -var parse = path.parse || __webpack_require__(196); + fs.chmod = chmodFix(fs.chmod) + fs.fchmod = chmodFix(fs.fchmod) + fs.lchmod = chmodFix(fs.lchmod) -var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { - var prefix = '/'; - if ((/^([A-Za-z]:)/).test(absoluteStart)) { - prefix = ''; - } else if ((/^\\\\/).test(absoluteStart)) { - prefix = '\\\\'; - } + fs.chownSync = chownFixSync(fs.chownSync) + fs.fchownSync = chownFixSync(fs.fchownSync) + fs.lchownSync = chownFixSync(fs.lchownSync) - var paths = [absoluteStart]; - var parsed = parse(absoluteStart); - while (parsed.dir !== paths[paths.length - 1]) { - paths.push(parsed.dir); - parsed = parse(parsed.dir); - } + fs.chmodSync = chmodFixSync(fs.chmodSync) + fs.fchmodSync = chmodFixSync(fs.fchmodSync) + fs.lchmodSync = chmodFixSync(fs.lchmodSync) - return paths.reduce(function (dirs, aPath) { - return dirs.concat(modules.map(function (moduleDir) { - return path.resolve(prefix, aPath, moduleDir); - })); - }, []); -}; + fs.stat = statFix(fs.stat) + fs.fstat = statFix(fs.fstat) + fs.lstat = statFix(fs.lstat) -module.exports = function nodeModulesPaths(start, opts, request) { - var modules = opts && opts.moduleDirectory - ? [].concat(opts.moduleDirectory) - : ['node_modules']; + fs.statSync = statFixSync(fs.statSync) + fs.fstatSync = statFixSync(fs.fstatSync) + fs.lstatSync = statFixSync(fs.lstatSync) - if (opts && typeof opts.paths === 'function') { - return opts.paths( - request, - start, - function () { return getNodeModulesDirs(start, modules); }, - opts - ); + // if lchmod/lchown do not exist, then make them no-ops + if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + if (cb) process.nextTick(cb) + } + fs.lchmodSync = function () {} + } + if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + if (cb) process.nextTick(cb) } + fs.lchownSync = function () {} + } - var dirs = getNodeModulesDirs(start, modules); - return opts && opts.paths ? dirs.concat(opts.paths) : dirs; -}; + // on Windows, A/V software can lock the directory, causing this + // to fail with an EACCES or EPERM if the directory contains newly + // created files. Try again on failure, for up to 60 seconds. + + // Set the timeout this long because some Windows Anti-Virus, such as Parity + // bit9, may lock files for up to a minute, causing npm package install + // failures. Also, take care to yield the scheduler. Windows scheduling gives + // CPU to a busy looping process, which can cause the program causing the lock + // contention to be starved of CPU by node, so the contention doesn't resolve. + if (platform === "win32") { + fs.rename = (function (fs$rename) { return function (from, to, cb) { + var start = Date.now() + var backoff = 0; + fs$rename(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function (stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er) + }) + }, backoff) + if (backoff < 100) + backoff += 10; + return; + } + if (cb) cb(er) + }) + }})(fs.rename) + } + // if read() returns EAGAIN, then just try it again. + fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback) + }})(fs.read) -/***/ }), -/* 196 */ -/***/ (function(module, exports, __webpack_require__) { + fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } + }})(fs.readSync) +} -"use strict"; +function patchLchmod (fs) { + fs.lchmod = function (path, mode, callback) { + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + if (callback) callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + if (callback) callback(err || err2) + }) + }) + }) + } + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) -var isWindows = process.platform === 'win32'; + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var threw = true + var ret + try { + ret = fs.fchmodSync(fd, mode) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } +} -// Regex to split a windows path into three parts: [*, device, slash, -// tail] windows-only -var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; +function patchLutimes (fs) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + if (er) { + if (cb) cb(er) + return + } + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + if (cb) cb(er || er2) + }) + }) + }) + } -// Regex to split the tail part of the above into [*, dir, basename, ext] -var splitTailRe = - /^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/; + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + var ret + var threw = true + try { + ret = fs.futimesSync(fd, at, mt) + threw = false + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } else { + fs.closeSync(fd) + } + } + return ret + } -var win32 = {}; + } else { + fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} -// Function to split a filename into [root, dir, basename, ext] -function win32SplitPath(filename) { - // Separate device+slash from tail - var result = splitDeviceRe.exec(filename), - device = (result[1] || '') + (result[2] || ''), - tail = result[3] || ''; - // Split the tail into dir, basename and extension - var result2 = splitTailRe.exec(tail), - dir = result2[1], - basename = result2[2], - ext = result2[3]; - return [device, dir, basename, ext]; +function chmodFix (orig) { + if (!orig) return orig + return function (target, mode, cb) { + return orig.call(fs, target, mode, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) + } } -win32.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); +function chmodFixSync (orig) { + if (!orig) return orig + return function (target, mode) { + try { + return orig.call(fs, target, mode) + } catch (er) { + if (!chownErOk(er)) throw er + } } - var allParts = win32SplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); +} + + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er) { + if (chownErOk(er)) er = null + if (cb) cb.apply(this, arguments) + }) } - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; +} +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} -// Split a filename into [root, dir, basename, ext], unix version -// 'root' is just a slash, or nothing. -var splitPathRe = - /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; -var posix = {}; +function statFix (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target, cb) { + return orig.call(fs, target, function (er, stats) { + if (!stats) return cb.apply(this, arguments) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + if (cb) cb.apply(this, arguments) + }) + } +} + +function statFixSync (orig) { + if (!orig) return orig + // Older versions of Node erroneously returned signed integers for + // uid + gid. + return function (target) { + var stats = orig.call(fs, target) + if (stats.uid < 0) stats.uid += 0x100000000 + if (stats.gid < 0) stats.gid += 0x100000000 + return stats; + } +} + +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true + if (er.code === "ENOSYS") + return true -function posixSplitPath(filename) { - return splitPathRe.exec(filename).slice(1); + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false } -posix.parse = function(pathString) { - if (typeof pathString !== 'string') { - throw new TypeError( - "Parameter 'pathString' must be a string, not " + typeof pathString - ); - } - var allParts = posixSplitPath(pathString); - if (!allParts || allParts.length !== 4) { - throw new TypeError("Invalid path '" + pathString + "'"); - } - allParts[1] = allParts[1] || ''; - allParts[2] = allParts[2] || ''; - allParts[3] = allParts[3] || ''; +/***/ }), +/* 222 */ +/***/ (function(module, exports, __webpack_require__) { - return { - root: allParts[0], - dir: allParts[0] + allParts[1].slice(0, -1), - base: allParts[2], - ext: allParts[3], - name: allParts[2].slice(0, allParts[2].length - allParts[3].length) - }; -}; +"use strict"; -if (isWindows) - module.exports = win32.parse; -else /* posix */ - module.exports = posix.parse; +var fs = __webpack_require__(133) -module.exports.posix = posix.parse; -module.exports.win32 = win32.parse; +module.exports = clone(fs) +function clone (obj) { + if (obj === null || typeof obj !== 'object') + return obj -/***/ }), -/* 197 */ -/***/ (function(module, exports) { + if (obj instanceof Object) + var copy = { __proto__: obj.__proto__ } + else + var copy = Object.create(null) -module.exports = function (x, opts) { - /** - * This file is purposefully a passthrough. It's expected that third-party - * environments will override it at runtime in order to inject special logic - * into `resolve` (by manipulating the options). One such example is the PnP - * code path in Yarn. - */ + Object.getOwnPropertyNames(obj).forEach(function (key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) + }) - return opts || {}; -}; + return copy +} /***/ }), -/* 198 */ +/* 223 */ /***/ (function(module, exports, __webpack_require__) { -var core = __webpack_require__(199); +var Stream = __webpack_require__(137).Stream -module.exports = function isCore(x) { - return Object.prototype.hasOwnProperty.call(core, x); -}; +module.exports = legacy +function legacy (fs) { + return { + ReadStream: ReadStream, + WriteStream: WriteStream + } -/***/ }), -/* 199 */ -/***/ (function(module, exports, __webpack_require__) { + function ReadStream (path, options) { + if (!(this instanceof ReadStream)) return new ReadStream(path, options); -var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; + Stream.call(this); -function specifierIncluded(specifier) { - var parts = specifier.split(' '); - var op = parts.length > 1 ? parts[0] : '='; - var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.'); + var self = this; - for (var i = 0; i < 3; ++i) { - var cur = Number(current[i] || 0); - var ver = Number(versionParts[i] || 0); - if (cur === ver) { - continue; // eslint-disable-line no-restricted-syntax, no-continue - } - if (op === '<') { - return cur < ver; - } else if (op === '>=') { - return cur >= ver; - } else { - return false; - } - } - return op === '>='; -} + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; -function matchesRange(range) { - var specifiers = range.split(/ ?&& ?/); - if (specifiers.length === 0) { return false; } - for (var i = 0; i < specifiers.length; ++i) { - if (!specifierIncluded(specifiers[i])) { return false; } - } - return true; -} + this.flags = 'r'; + this.mode = 438; /*=0666*/ + this.bufferSize = 64 * 1024; -function versionIncluded(specifierValue) { - if (typeof specifierValue === 'boolean') { return specifierValue; } - if (specifierValue && typeof specifierValue === 'object') { - for (var i = 0; i < specifierValue.length; ++i) { - if (matchesRange(specifierValue[i])) { return true; } - } - return false; + options = options || {}; + + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; } - return matchesRange(specifierValue); -} -var data = __webpack_require__(200); + if (this.encoding) this.setEncoding(this.encoding); -var core = {}; -for (var mod in data) { // eslint-disable-line no-restricted-syntax - if (Object.prototype.hasOwnProperty.call(data, mod)) { - core[mod] = versionIncluded(data[mod]); + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.end === undefined) { + this.end = Infinity; + } else if ('number' !== typeof this.end) { + throw TypeError('end must be a Number'); + } + + if (this.start > this.end) { + throw new Error('start must be <= end'); + } + + this.pos = this.start; } -} -module.exports = core; + if (this.fd !== null) { + process.nextTick(function() { + self._read(); + }); + return; + } -/***/ }), -/* 200 */ -/***/ (function(module) { + fs.open(this.path, this.flags, this.mode, function (err, fd) { + if (err) { + self.emit('error', err); + self.readable = false; + return; + } -module.exports = JSON.parse("{\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debug_agent\":\">= 1 && < 8\",\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":[\">= 10 && < 10.1\",\">= 14\"],\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0 && < 12\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0 && < 12\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0 && < 12\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10 && < 12\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8\":\">= 1\",\"vm\":true,\"wasi\":\">= 13.4 && < 13.5\",\"worker_threads\":\">= 11.7\",\"zlib\":true}"); + self.fd = fd; + self.emit('open', fd); + self._read(); + }) + } -/***/ }), -/* 201 */ -/***/ (function(module, exports, __webpack_require__) { + function WriteStream (path, options) { + if (!(this instanceof WriteStream)) return new WriteStream(path, options); -var isCore = __webpack_require__(198); -var fs = __webpack_require__(132); -var path = __webpack_require__(4); -var caller = __webpack_require__(194); -var nodeModulesPaths = __webpack_require__(195); -var normalizeOptions = __webpack_require__(197); + Stream.call(this); -var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; + this.path = path; + this.fd = null; + this.writable = true; -var defaultIsFile = function isFile(file) { - try { - var stat = fs.statSync(file); - } catch (e) { - if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; - throw e; - } - return stat.isFile() || stat.isFIFO(); -}; + this.flags = 'w'; + this.encoding = 'binary'; + this.mode = 438; /*=0666*/ + this.bytesWritten = 0; -var defaultIsDir = function isDirectory(dir) { - try { - var stat = fs.statSync(dir); - } catch (e) { - if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false; - throw e; - } - return stat.isDirectory(); -}; + options = options || {}; -var defaultRealpathSync = function realpathSync(x) { - try { - return realpathFS(x); - } catch (realpathErr) { - if (realpathErr.code !== 'ENOENT') { - throw realpathErr; - } + // Mixin options into this + var keys = Object.keys(options); + for (var index = 0, length = keys.length; index < length; index++) { + var key = keys[index]; + this[key] = options[key]; } - return x; -}; -var maybeRealpathSync = function maybeRealpathSync(realpathSync, x, opts) { - if (opts && opts.preserveSymlinks === false) { - return realpathSync(x); - } - return x; -}; + if (this.start !== undefined) { + if ('number' !== typeof this.start) { + throw TypeError('start must be a Number'); + } + if (this.start < 0) { + throw new Error('start must be >= zero'); + } -var getPackageCandidates = function getPackageCandidates(x, start, opts) { - var dirs = nodeModulesPaths(start, opts, x); - for (var i = 0; i < dirs.length; i++) { - dirs[i] = path.join(dirs[i], x); + this.pos = this.start; } - return dirs; -}; -module.exports = function resolveSync(x, options) { - if (typeof x !== 'string') { - throw new TypeError('Path must be a string.'); + this.busy = false; + this._queue = []; + + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); } - var opts = normalizeOptions(x, options); + } +} - var isFile = opts.isFile || defaultIsFile; - var readFileSync = opts.readFileSync || fs.readFileSync; - var isDirectory = opts.isDirectory || defaultIsDir; - var realpathSync = opts.realpathSync || defaultRealpathSync; - var packageIterator = opts.packageIterator; - var extensions = opts.extensions || ['.js']; - var basedir = opts.basedir || path.dirname(caller()); - var parent = opts.filename || basedir; +/***/ }), +/* 224 */ +/***/ (function(module, exports, __webpack_require__) { - opts.paths = opts.paths || []; +/** + * @preserve + * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) + * + * @author Jens Taylor + * @see http://github.com/homebrewing/brauhaus-diff + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + */ +(function(){ + var cache; - // ensure that `basedir` is an absolute path at this point, resolving against the process' current working directory - var absoluteStart = maybeRealpathSync(realpathSync, path.resolve(basedir), opts); + // Call this function without `new` to use the cached object (good for + // single-threaded environments), or with `new` to create a new object. + // + // @param {string} key A UTF-16 or ASCII string + // @param {number} seed An optional positive integer + // @return {object} A MurmurHash3 object for incremental hashing + function MurmurHash3(key, seed) { + var m = this instanceof MurmurHash3 ? this : cache; + m.reset(seed) + if (typeof key === 'string' && key.length > 0) { + m.hash(key); + } - if ((/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[/\\])/).test(x)) { - var res = path.resolve(absoluteStart, x); - if (x === '.' || x === '..' || x.slice(-1) === '/') res += '/'; - var m = loadAsFileSync(res) || loadAsDirectorySync(res); - if (m) return maybeRealpathSync(realpathSync, m, opts); - } else if (isCore(x)) { - return x; - } else { - var n = loadNodeModulesSync(x, absoluteStart); - if (n) return maybeRealpathSync(realpathSync, n, opts); - } + if (m !== this) { + return m; + } + }; - var err = new Error("Cannot find module '" + x + "' from '" + parent + "'"); - err.code = 'MODULE_NOT_FOUND'; - throw err; + // Incrementally add a string to this hash + // + // @param {string} key A UTF-16 or ASCII string + // @return {object} this + MurmurHash3.prototype.hash = function(key) { + var h1, k1, i, top, len; - function loadAsFileSync(x) { - var pkg = loadpkg(path.dirname(x)); + len = key.length; + this.len += len; - if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) { - var rfile = path.relative(pkg.dir, x); - var r = opts.pathFilter(pkg.pkg, x, rfile); - if (r) { - x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign - } + k1 = this.k1; + i = 0; + switch (this.rem) { + case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; + case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; + case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; + case 3: + k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; + k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; } - if (isFile(x)) { - return x; - } + this.rem = (len + this.rem) & 3; // & 3 is same as % 4 + len -= this.rem; + if (len > 0) { + h1 = this.h1; + while (1) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - for (var i = 0; i < extensions.length; i++) { - var file = x + extensions[i]; - if (isFile(file)) { - return file; - } - } - } + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; - function loadpkg(dir) { - if (dir === '' || dir === '/') return; - if (process.platform === 'win32' && (/^\w:[/\\]*$/).test(dir)) { - return; - } - if ((/[/\\]node_modules[/\\]*$/).test(dir)) return; + if (i >= len) { + break; + } - var pkgfile = path.join(maybeRealpathSync(realpathSync, dir, opts), 'package.json'); + k1 = ((key.charCodeAt(i++) & 0xffff)) ^ + ((key.charCodeAt(i++) & 0xffff) << 8) ^ + ((key.charCodeAt(i++) & 0xffff) << 16); + top = key.charCodeAt(i++); + k1 ^= ((top & 0xff) << 24) ^ + ((top & 0xff00) >> 8); + } - if (!isFile(pkgfile)) { - return loadpkg(path.dirname(dir)); + k1 = 0; + switch (this.rem) { + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; + case 1: k1 ^= (key.charCodeAt(i) & 0xffff); + } + + this.h1 = h1; } - var body = readFileSync(pkgfile); + this.k1 = k1; + return this; + }; - try { - var pkg = JSON.parse(body); - } catch (jsonErr) {} + // Get the result of this hash + // + // @return {number} The 32-bit hash + MurmurHash3.prototype.result = function() { + var k1, h1; + + k1 = this.k1; + h1 = this.h1; - if (pkg && opts.packageFilter) { - // v2 will pass pkgfile - pkg = opts.packageFilter(pkg, /*pkgfile,*/ dir); // eslint-disable-line spaced-comment + if (k1 > 0) { + k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; + h1 ^= k1; } - return { pkg: pkg, dir: dir }; - } - - function loadAsDirectorySync(x) { - var pkgfile = path.join(maybeRealpathSync(realpathSync, x, opts), '/package.json'); - if (isFile(pkgfile)) { - try { - var body = readFileSync(pkgfile, 'UTF8'); - var pkg = JSON.parse(body); - } catch (e) {} + h1 ^= this.len; - if (pkg && opts.packageFilter) { - // v2 will pass pkgfile - pkg = opts.packageFilter(pkg, /*pkgfile,*/ x); // eslint-disable-line spaced-comment - } + h1 ^= h1 >>> 16; + h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; + h1 ^= h1 >>> 13; + h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; + h1 ^= h1 >>> 16; - if (pkg && pkg.main) { - if (typeof pkg.main !== 'string') { - var mainError = new TypeError('package “' + pkg.name + '” `main` must be a string'); - mainError.code = 'INVALID_PACKAGE_MAIN'; - throw mainError; - } - if (pkg.main === '.' || pkg.main === './') { - pkg.main = 'index'; - } - try { - var m = loadAsFileSync(path.resolve(x, pkg.main)); - if (m) return m; - var n = loadAsDirectorySync(path.resolve(x, pkg.main)); - if (n) return n; - } catch (e) {} - } - } + return h1 >>> 0; + }; - return loadAsFileSync(path.join(x, '/index')); - } + // Reset the hash object for reuse + // + // @param {number} seed An optional positive integer + MurmurHash3.prototype.reset = function(seed) { + this.h1 = typeof seed === 'number' ? seed : 0; + this.rem = this.k1 = this.len = 0; + return this; + }; - function loadNodeModulesSync(x, start) { - var thunk = function () { return getPackageCandidates(x, start, opts); }; - var dirs = packageIterator ? packageIterator(x, start, thunk, opts) : thunk(); + // A cached object to use. This can be safely used if you're in a single- + // threaded environment, otherwise you need to create new hashes to use. + cache = new MurmurHash3(); - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - if (isDirectory(path.dirname(dir))) { - var m = loadAsFileSync(dir); - if (m) return m; - var n = loadAsDirectorySync(dir); - if (n) return n; - } - } - } -}; + if (true) { + module.exports = MurmurHash3; + } else {} +}()); /***/ }), -/* 202 */ -/***/ (function(module, exports) { +/* 225 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = extractDescription +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = __webpack_require__(139) +var signals = __webpack_require__(226) -// Extracts description from contents of a readme file in markdown format -function extractDescription (d) { - if (!d) return; - if (d === "ERROR: No README data found!") return; - // the first block of text before the first heading - // that isn't the first line heading - d = d.trim().split('\n') - for (var s = 0; d[s] && d[s].trim().match(/^(#|$)/); s ++); - var l = d.length - for (var e = s + 1; e < l && d[e].trim(); e ++); - return d.slice(s, e).join(' ').trim() +var EE = __webpack_require__(155) +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} + +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} } +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} -/***/ }), -/* 203 */ -/***/ (function(module) { - -module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); - -/***/ }), -/* 204 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') -var util = __webpack_require__(111) -var messages = __webpack_require__(205) + if (loaded === false) { + load() + } -module.exports = function() { - var args = Array.prototype.slice.call(arguments, 0) - var warningName = args.shift() - if (warningName == "typo") { - return makeTypoWarning.apply(null,args) + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' } - else { - var msgTemplate = messages[warningName] ? messages[warningName] : warningName + ": '%s'" - args.unshift(msgTemplate) - return util.format.apply(null, args) + + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } } + emitter.on(ev, cb) + + return remove } -function makeTypoWarning (providedName, probableName, field) { - if (field) { - providedName = field + "['" + providedName + "']" - probableName = field + "['" + probableName + "']" +module.exports.unload = unload +function unload () { + if (!loaded) { + return } - return util.format(messages.typo, providedName, probableName) -} + loaded = false + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} -/***/ }), -/* 205 */ -/***/ (function(module) { +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} -module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } +}) -/***/ }), -/* 206 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports.signals = function () { + return signals +} -"use strict"; +module.exports.load = load -const path = __webpack_require__(4); -const writeJsonFile = __webpack_require__(207); -const sortKeys = __webpack_require__(221); +var loaded = false -const dependencyKeys = new Set([ - 'dependencies', - 'devDependencies', - 'optionalDependencies', - 'peerDependencies' -]); +function load () { + if (loaded) { + return + } + loaded = true -function normalize(packageJson) { - const result = {}; + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 - for (const key of Object.keys(packageJson)) { - if (!dependencyKeys.has(key)) { - result[key] = packageJson[key]; - } else if (Object.keys(packageJson[key]).length !== 0) { - result[key] = sortKeys(packageJson[key]); - } - } + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false + } + }) - return result; + process.emit = processEmit + process.reallyExit = processReallyExit } -module.exports = async (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } - - options = { - normalize: true, - ...options, - detectIndent: true - }; +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } +} - data = options.normalize ? normalize(data) : data; - return writeJsonFile(filePath, data, options); -}; +/***/ }), +/* 226 */ +/***/ (function(module, exports) { -module.exports.sync = (filePath, data, options) => { - if (typeof filePath !== 'string') { - options = data; - data = filePath; - filePath = '.'; - } +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] - options = { - normalize: true, - ...options, - detectIndent: true - }; +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} - filePath = path.basename(filePath) === 'package.json' ? filePath : path.join(filePath, 'package.json'); +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} - data = options.normalize ? normalize(data) : data; - writeJsonFile.sync(filePath, data, options); -}; +/***/ }), +/* 227 */ +/***/ (function(module, exports) { +module.exports = require(undefined); /***/ }), -/* 207 */ +/* 228 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(4); -const fs = __webpack_require__(208); -const writeFileAtomic = __webpack_require__(212); -const sortKeys = __webpack_require__(221); -const makeDir = __webpack_require__(223); -const pify = __webpack_require__(224); -const detectIndent = __webpack_require__(225); +const isPlainObj = __webpack_require__(229); -const init = (fn, filePath, data, options) => { - if (!filePath) { - throw new TypeError('Expected a filepath'); +module.exports = (obj, opts) => { + if (!isPlainObj(obj)) { + throw new TypeError('Expected a plain object'); } - if (data === undefined) { - throw new TypeError('Expected data to stringify'); + opts = opts || {}; + + // DEPRECATED + if (typeof opts === 'function') { + throw new TypeError('Specify the compare function as an option instead'); } - options = Object.assign({ - indent: '\t', - sortKeys: false - }, options); + const deep = opts.deep; + const seenInput = []; + const seenOutput = []; - if (options.sortKeys) { - data = sortKeys(data, { - deep: true, - compare: typeof options.sortKeys === 'function' ? options.sortKeys : undefined - }); - } + const sortKeys = x => { + const seenIndex = seenInput.indexOf(x); - return fn(filePath, data, options); -}; + if (seenIndex !== -1) { + return seenOutput[seenIndex]; + } -const readFile = filePath => pify(fs.readFile)(filePath, 'utf8').catch(() => {}); + const ret = {}; + const keys = Object.keys(x).sort(opts.compare); -const main = (filePath, data, options) => { - return (options.detectIndent ? readFile(filePath) : Promise.resolve()) - .then(string => { - const indent = string ? detectIndent(string).indent : options.indent; - const json = JSON.stringify(data, options.replacer, indent); + seenInput.push(x); + seenOutput.push(ret); - return pify(writeFileAtomic)(filePath, `${json}\n`, {mode: options.mode}); - }); -}; + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const val = x[key]; -const mainSync = (filePath, data, options) => { - let {indent} = options; + if (deep && Array.isArray(val)) { + const retArr = []; - if (options.detectIndent) { - try { - const file = fs.readFileSync(filePath, 'utf8'); - indent = detectIndent(file).indent; - } catch (error) { - if (error.code !== 'ENOENT') { - throw error; - } - } - } + for (let j = 0; j < val.length; j++) { + retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; + } - const json = JSON.stringify(data, options.replacer, indent); + ret[key] = retArr; + continue; + } - return writeFileAtomic.sync(filePath, `${json}\n`, {mode: options.mode}); -}; + ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; + } -const writeJsonFile = (filePath, data, options) => { - return makeDir(path.dirname(filePath), {fs}) - .then(() => init(main, filePath, data, options)); -}; + return ret; + }; -module.exports = writeJsonFile; -// TODO: Remove this for the next major release -module.exports.default = writeJsonFile; -module.exports.sync = (filePath, data, options) => { - makeDir.sync(path.dirname(filePath), {fs}); - init(mainSync, filePath, data, options); + return sortKeys(obj); }; /***/ }), -/* 208 */ +/* 229 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) -var polyfills = __webpack_require__(209) -var legacy = __webpack_require__(210) -var clone = __webpack_require__(211) - -var queue = [] - -var util = __webpack_require__(111) - -function noop () {} - -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } - -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(138).equal(queue.length, 0) - }) -} - -module.exports = patch(clone(fs)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { - module.exports = patch(fs) - fs.__patched = true; -} - -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() - - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) - -module.exports.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) +"use strict"; -// Only patch fs once, otherwise we'll run into a memory leak if -// graceful-fs is loaded multiple times, such as in test environments that -// reset the loaded modules between tests. -// We look for the string `graceful-fs` from the comment above. This -// way we are not adding any extra properties and it will detect if older -// versions of graceful-fs are installed. -if (!/\bgraceful-fs\b/.test(fs.closeSync.toString())) { - fs.closeSync = module.exports.closeSync; - fs.close = module.exports.close; -} +var toString = Object.prototype.toString; -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null +module.exports = function (x) { + var prototype; + return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +}; - return go$readFile(path, options, cb) - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +/***/ }), +/* 230 */ +/***/ (function(module, exports, __webpack_require__) { - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +"use strict"; - return go$writeFile(path, data, options, cb) +const fs = __webpack_require__(133); +const path = __webpack_require__(4); +const pify = __webpack_require__(231); +const semver = __webpack_require__(189); - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +const defaults = { + mode: 0o777 & (~process.umask()), + fs +}; - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); - return go$appendFile(path, data, options, cb) +// https://github.com/nodejs/node/issues/8987 +// https://github.com/libuv/libuv/pull/1088 +const checkPath = pth => { + if (process.platform === 'win32') { + const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + if (pathHasInvalidWinCharacters) { + const error = new Error(`Path contains invalid characters: ${pth}`); + error.code = 'EINVAL'; + throw error; + } + } +}; - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) +const permissionError = pth => { + // This replicates the exception of `fs.mkdir` with native the + // `recusive` option when run on an invalid drive under Windows. + const error = new Error(`operation not permitted, mkdir '${pth}'`); + error.code = 'EPERM'; + error.errno = -4048; + error.path = pth; + error.syscall = 'mkdir'; + return error; +}; - return go$readdir(args) +const makeDir = (input, options) => Promise.resolve().then(() => { + checkPath(input); + options = Object.assign({}, defaults, options); - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + // TODO: Use util.promisify when targeting Node.js 8 + const mkdir = pify(options.fs.mkdir); + const stat = pify(options.fs.stat); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) + if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { + const pth = path.resolve(input); - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + return mkdir(pth, { + mode: options.mode, + recursive: true + }).then(() => pth); + } - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + const make = pth => { + return mkdir(pth, options.mode) + .then(() => pth) + .catch(error => { + if (error.code === 'EPERM') { + throw error; + } - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - var fs$ReadStream = fs.ReadStream - if (fs$ReadStream) { - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open - } + if (error.message.includes('null bytes')) { + throw error; + } - var fs$WriteStream = fs.WriteStream - if (fs$WriteStream) { - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open - } + return make(path.dirname(pth)).then(() => make(pth)); + } - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream + return stat(pth) + .then(stats => stats.isDirectory() ? pth : Promise.reject()) + .catch(() => { + throw error; + }); + }); + }; - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } + return make(path.resolve(input)); +}); - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() +module.exports = makeDir; +module.exports.default = makeDir; - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } +module.exports.sync = (input, options) => { + checkPath(input); + options = Object.assign({}, defaults, options); - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } + if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { + const pth = path.resolve(input); - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + fs.mkdirSync(pth, { + mode: options.mode, + recursive: true + }); - function createReadStream (path, options) { - return new ReadStream(path, options) - } + return pth; + } - function createWriteStream (path, options) { - return new WriteStream(path, options) - } + const make = pth => { + try { + options.fs.mkdirSync(pth, options.mode); + } catch (error) { + if (error.code === 'EPERM') { + throw error; + } - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + if (error.code === 'ENOENT') { + if (path.dirname(pth) === pth) { + throw permissionError(pth); + } - return go$open(path, flags, mode, cb) + if (error.message.includes('null bytes')) { + throw error; + } - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + make(path.dirname(pth)); + return make(pth); + } - return fs -} + try { + if (!options.fs.statSync(pth).isDirectory()) { + throw new Error('The path is not a directory'); + } + } catch (_) { + throw error; + } + } -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} + return pth; + }; -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + return make(path.resolve(input)); +}; /***/ }), -/* 209 */ +/* 231 */ /***/ (function(module, exports, __webpack_require__) { -var constants = __webpack_require__(134) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform - -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +"use strict"; -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) -} -module.exports = patch +const processFn = (fn, options) => function (...args) { + const P = options.promiseModule; -function patch (fs) { - // (re-)implement some things that are known busted or missing. + return new P((resolve, reject) => { + if (options.multiArgs) { + args.push((...result) => { + if (options.errorFirst) { + if (result[0]) { + reject(result); + } else { + result.shift(); + resolve(result); + } + } else { + resolve(result); + } + }); + } else if (options.errorFirst) { + args.push((error, result) => { + if (error) { + reject(error); + } else { + resolve(result); + } + }); + } else { + args.push(resolve); + } - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } + fn.apply(this, args); + }); +}; - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } +module.exports = (input, options) => { + options = Object.assign({ + exclude: [/.+(Sync|Stream)$/], + errorFirst: true, + promiseModule: Promise + }, options); - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + const objType = typeof input; + if (!(input !== null && (objType === 'object' || objType === 'function'))) { + throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); + } - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + const filter = key => { + const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); + return options.include ? options.include.some(match) : !options.exclude.some(match); + }; - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) + let ret; + if (objType === 'function') { + ret = function (...args) { + return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); + }; + } else { + ret = Object.create(Object.getPrototypeOf(input)); + } - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) + for (const key in input) { // eslint-disable-line guard-for-in + const property = input[key]; + ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; + } - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) + return ret; +}; - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) +/***/ }), +/* 232 */ +/***/ (function(module, exports, __webpack_require__) { - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } +"use strict"; - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } +// detect either spaces or tabs but not both to properly handle tabs +// for indentation and spaces for alignment +const INDENT_RE = /^(?:( )+|\t+)/; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) +function getMostUsed(indents) { + let result = 0; + let maxUsed = 0; + let maxWeight = 0; - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) + for (const entry of indents) { + // TODO: use destructuring when targeting Node.js 6 + const key = entry[0]; + const val = entry[1]; - function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } + const u = val[0]; + const w = val[1]; - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + if (u > maxUsed || (u === maxUsed && w > maxWeight)) { + maxUsed = u; + maxWeight = w; + result = Number(key); + } + } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } - } + return result; +} - function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } +module.exports = str => { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } + // used to see if tabs or spaces are the most used + let tabs = 0; + let spaces = 0; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } - } + // remember the size of previous line's indentation + let prev = 0; - function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } + // remember how many indents/unindents as occurred for a given size + // and how much lines follow a given indentation + // + // indents = { + // 3: [1, 0], + // 4: [1, 5], + // 5: [1, 0], + // 12: [1, 0], + // } + const indents = new Map(); - function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } + // pointer to the array of last used indent + let current; + // whether the last action was an indent (opposed to an unindent) + let isIndent; - function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } - } + for (const line of str.split(/\n/g)) { + if (!line) { + // ignore empty lines + continue; + } - function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } - } + let indent; + const matches = line.match(INDENT_RE); + if (matches) { + indent = matches[0].length; - function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) - } - } + if (matches[1]) { + spaces++; + } else { + tabs++; + } + } else { + indent = 0; + } - function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } - } + const diff = indent - prev; + prev = indent; - // ENOSYS means that the fs doesn't support the op. Just ignore - // that, because it doesn't matter. - // - // if there's no getuid, or if getuid() is something other - // than 0, and the error is EINVAL or EPERM, then just ignore - // it. - // - // This specific case is a silent failure in cp, install, tar, - // and most other unix tools that manage permissions. - // - // When running as root, or if other types of errors are - // encountered, then it's strict. - function chownErOk (er) { - if (!er) - return true + if (diff) { + // an indent or unindent has been detected - if (er.code === "ENOSYS") - return true + isIndent = diff > 0; - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + current = indents.get(isIndent ? diff : -diff); - return false - } -} + if (current) { + current[0]++; + } else { + current = [1, 0]; + indents.set(diff, current); + } + } else if (current) { + // if the last action was an indent, increment the weight + current[1] += Number(isIndent); + } + } + const amount = getMostUsed(indents); -/***/ }), -/* 210 */ -/***/ (function(module, exports, __webpack_require__) { + let type; + let indent; + if (!amount) { + type = null; + indent = ''; + } else if (spaces >= tabs) { + type = 'space'; + indent = ' '.repeat(amount); + } else { + type = 'tab'; + indent = '\t'.repeat(amount); + } -var Stream = __webpack_require__(136).Stream + return { + amount, + type, + indent + }; +}; -module.exports = legacy -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } +/***/ }), +/* 233 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); +/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(234); +/* + * 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. + */ - Stream.call(this); +const YARN_EXEC = process.env.npm_execpath || 'yarn'; - var self = this; +/** + * Install all dependencies in the given directory + */ +async function installInDir(directory, extraArgs = []) { + const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any + // given time (e.g. to avoid conflicts). - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { + cwd: directory + }); +} +/** + * Run script in the given directory + */ - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; +async function runScriptInPackage(script, args, pkg) { + const execOpts = { + cwd: pkg.path + }; + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); +} +/** + * Run script in the given directory + */ - options = options || {}; +function runScriptInPackageStreaming({ + script, + args, + pkg, + debug +}) { + const execOpts = { + cwd: pkg.path + }; + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { + prefix: pkg.name, + debug + }); +} +async function yarnWorkspacesInfo(directory) { + const { + stdout + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { + cwd: directory, + stdio: 'pipe' + }); - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + try { + return JSON.parse(JSON.parse(stdout).data); + } catch (error) { + throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); + } +} - if (this.encoding) this.setEncoding(this.encoding); +/***/ }), +/* 234 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(137); +/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stream__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(235); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(279); +/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(143); +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } - if (this.start > this.end) { - throw new Error('start must be <= end'); - } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } - this.pos = this.start; - } +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } +/* + * 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. + */ - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); - Stream.call(this); - this.path = path; - this.fd = null; - this.writable = true; +const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_1___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green]; - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; +const getColor = () => { + const color = colorWheel.shift(); + colorWheel.push(color); + return color; +}; - options = options || {}; +function spawn(command, args, opts) { + return execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: 'inherit', + preferLocal: true + }, opts)); +} - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } +function streamToLog(debug = true) { + return new stream__WEBPACK_IMPORTED_MODULE_0__["Writable"]({ + objectMode: true, - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); + write(line, _, cb) { + if (line.endsWith('\n')) { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line.slice(0, -1)); + } else { + _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line); } - this.pos = this.start; + cb(); } - this.busy = false; - this._queue = []; - - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } + }); } +function spawnStreaming(command, args, opts, { + prefix, + debug +}) { + const spawned = execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ + stdio: ['ignore', 'pipe', 'pipe'], + preferLocal: true + }, opts)); + const color = getColor(); + const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + tag: color.bold(prefix) + }); + const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ + mergeMultiline: true, + tag: color.bold(prefix) + }); + spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); + spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); + return spawned; +} /***/ }), -/* 211 */ +/* 235 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const ansiStyles = __webpack_require__(236); +const {stdout: stdoutColor, stderr: stderrColor} = __webpack_require__(240); +const { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex +} = __webpack_require__(242); -module.exports = clone +const {isArray} = Array; -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = [ + 'ansi', + 'ansi', + 'ansi256', + 'ansi16m' +]; - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) +const styles = Object.create(null); - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) +const applyOptions = (object, options = {}) => { + if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) { + throw new Error('The `level` option should be an integer from 0 to 3'); + } - return copy + // Detect level if not set manually + const colorLevel = stdoutColor ? stdoutColor.level : 0; + object.level = options.level === undefined ? colorLevel : options.level; +}; + +class ChalkClass { + constructor(options) { + // eslint-disable-next-line no-constructor-return + return chalkFactory(options); + } } +const chalkFactory = options => { + const chalk = {}; + applyOptions(chalk, options); -/***/ }), -/* 212 */ -/***/ (function(module, exports, __webpack_require__) { + chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); -"use strict"; + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); -module.exports = writeFile -module.exports.sync = writeFileSync -module.exports._getTmpname = getTmpname // for testing -module.exports._cleanupOnExit = cleanupOnExit + chalk.template.constructor = () => { + throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.'); + }; -var fs = __webpack_require__(213) -var MurmurHash3 = __webpack_require__(217) -var onExit = __webpack_require__(218) -var path = __webpack_require__(4) -var activeFiles = {} + chalk.template.Instance = ChalkClass; -// if we run inside of a worker_thread, `process.pid` is not unique -/* istanbul ignore next */ -var threadId = (function getId () { - try { - var workerThreads = __webpack_require__(220) + return chalk.template; +}; - /// if we are in main thread, this is set to `0` - return workerThreads.threadId - } catch (e) { - // worker_threads are not available, fallback to 0 - return 0 - } -})() +function Chalk(options) { + return chalkFactory(options); +} -var invocations = 0 -function getTmpname (filename) { - return filename + '.' + - MurmurHash3(__filename) - .hash(String(process.pid)) - .hash(String(threadId)) - .hash(String(++invocations)) - .result() +for (const [styleName, style] of Object.entries(ansiStyles)) { + styles[styleName] = { + get() { + const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty); + Object.defineProperty(this, styleName, {value: builder}); + return builder; + } + }; } -function cleanupOnExit (tmpfile) { - return function () { - try { - fs.unlinkSync(typeof tmpfile === 'function' ? tmpfile() : tmpfile) - } catch (_) {} - } +styles.visible = { + get() { + const builder = createBuilder(this, this._styler, true); + Object.defineProperty(this, 'visible', {value: builder}); + return builder; + } +}; + +const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256']; + +for (const model of usedModels) { + styles[model] = { + get() { + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); + return createBuilder(this, styler, this._isEmpty); + }; + } + }; } -function writeFile (filename, data, options, callback) { - if (options) { - if (options instanceof Function) { - callback = options - options = {} - } else if (typeof options === 'string') { - options = { encoding: options } - } - } else { - options = {} - } +for (const model of usedModels) { + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const {level} = this; + return function (...arguments_) { + const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); + return createBuilder(this, styler, this._isEmpty); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, { + ...styles, + level: { + enumerable: true, + get() { + return this._generator.level; + }, + set(level) { + this._generator.level = level; + } + } +}); + +const createStyler = (open, close, parent) => { + let openAll; + let closeAll; + if (parent === undefined) { + openAll = open; + closeAll = close; + } else { + openAll = parent.openAll + open; + closeAll = close + parent.closeAll; + } + + return { + open, + close, + openAll, + closeAll, + parent + }; +}; + +const createBuilder = (self, _styler, _isEmpty) => { + const builder = (...arguments_) => { + if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) { + // Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}` + return applyStyle(builder, chalkTag(builder, ...arguments_)); + } + + // Single argument is hot path, implicit coercion is faster than anything + // eslint-disable-next-line no-implicit-coercion + return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); + }; + + // We alter the prototype because we must return a function, but there is + // no way to create a function with a different prototype + Object.setPrototypeOf(builder, proto); + + builder._generator = self; + builder._styler = _styler; + builder._isEmpty = _isEmpty; + + return builder; +}; + +const applyStyle = (self, string) => { + if (self.level <= 0 || !string) { + return self._isEmpty ? '' : string; + } + + let styler = self._styler; + + if (styler === undefined) { + return string; + } + + const {openAll, closeAll} = styler; + if (string.indexOf('\u001B') !== -1) { + while (styler !== undefined) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + string = stringReplaceAll(string, styler.close, styler.open); + + styler = styler.parent; + } + } - var Promise = options.Promise || global.Promise - var truename - var fd - var tmpfile - /* istanbul ignore next -- The closure only gets called when onExit triggers */ - var removeOnExitHandler = onExit(cleanupOnExit(() => tmpfile)) - var absoluteName = path.resolve(filename) + // We can move both next actions out of loop, because remaining actions in loop won't have + // any/visible effect on parts we add here. Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92 + const lfIndex = string.indexOf('\n'); + if (lfIndex !== -1) { + string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex); + } - new Promise(function serializeSameFile (resolve) { - // make a queue if it doesn't already exist - if (!activeFiles[absoluteName]) activeFiles[absoluteName] = [] + return openAll + string + closeAll; +}; - activeFiles[absoluteName].push(resolve) // add this job to the queue - if (activeFiles[absoluteName].length === 1) resolve() // kick off the first one - }).then(function getRealPath () { - return new Promise(function (resolve) { - fs.realpath(filename, function (_, realname) { - truename = realname || filename - tmpfile = getTmpname(truename) - resolve() - }) - }) - }).then(function stat () { - return new Promise(function stat (resolve) { - if (options.mode && options.chown) resolve() - else { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - fs.stat(truename, function (err, stats) { - if (err || !stats) resolve() - else { - options = Object.assign({}, options) +let template; +const chalkTag = (chalk, ...strings) => { + const [firstString] = strings; - if (options.mode == null) { - options.mode = stats.mode - } - if (options.chown == null && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - resolve() - } - }) - } - }) - }).then(function thenWriteFile () { - return new Promise(function (resolve, reject) { - fs.open(tmpfile, 'w', options.mode, function (err, _fd) { - fd = _fd - if (err) reject(err) - else resolve() - }) - }) - }).then(function write () { - return new Promise(function (resolve, reject) { - if (Buffer.isBuffer(data)) { - fs.write(fd, data, 0, data.length, 0, function (err) { - if (err) reject(err) - else resolve() - }) - } else if (data != null) { - fs.write(fd, String(data), 0, String(options.encoding || 'utf8'), function (err) { - if (err) reject(err) - else resolve() - }) - } else resolve() - }) - }).then(function syncAndClose () { - return new Promise(function (resolve, reject) { - if (options.fsync !== false) { - fs.fsync(fd, function (err) { - if (err) fs.close(fd, () => reject(err)) - else fs.close(fd, resolve) - }) - } else { - fs.close(fd, resolve) - } - }) - }).then(function chown () { - fd = null - if (options.chown) { - return new Promise(function (resolve, reject) { - fs.chown(tmpfile, options.chown.uid, options.chown.gid, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function chmod () { - if (options.mode) { - return new Promise(function (resolve, reject) { - fs.chmod(tmpfile, options.mode, function (err) { - if (err) reject(err) - else resolve() - }) - }) - } - }).then(function rename () { - return new Promise(function (resolve, reject) { - fs.rename(tmpfile, truename, function (err) { - if (err) reject(err) - else resolve() - }) - }) - }).then(function success () { - removeOnExitHandler() - callback() - }, function fail (err) { - return new Promise(resolve => { - return fd ? fs.close(fd, resolve) : resolve() - }).then(() => { - removeOnExitHandler() - fs.unlink(tmpfile, function () { - callback(err) - }) - }) - }).then(function checkQueue () { - activeFiles[absoluteName].shift() // remove the element added by serializeSameFile - if (activeFiles[absoluteName].length > 0) { - activeFiles[absoluteName][0]() // start next job if one is pending - } else delete activeFiles[absoluteName] - }) -} + if (!isArray(firstString) || !isArray(firstString.raw)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return strings.join(' '); + } -function writeFileSync (filename, data, options) { - if (typeof options === 'string') options = { encoding: options } - else if (!options) options = {} - try { - filename = fs.realpathSync(filename) - } catch (ex) { - // it's ok, it'll happen on a not yet existing file - } - var tmpfile = getTmpname(filename) + const arguments_ = strings.slice(1); + const parts = [firstString.raw[0]]; - if (!options.mode || !options.chown) { - // Either mode or chown is not explicitly set - // Default behavior is to copy it from original file - try { - var stats = fs.statSync(filename) - options = Object.assign({}, options) - if (!options.mode) { - options.mode = stats.mode - } - if (!options.chown && process.getuid) { - options.chown = { uid: stats.uid, gid: stats.gid } - } - } catch (ex) { - // ignore stat errors - } - } + for (let i = 1; i < firstString.length; i++) { + parts.push( + String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), + String(firstString.raw[i]) + ); + } - var fd - var cleanup = cleanupOnExit(tmpfile) - var removeOnExitHandler = onExit(cleanup) + if (template === undefined) { + template = __webpack_require__(243); + } - try { - fd = fs.openSync(tmpfile, 'w', options.mode) - if (Buffer.isBuffer(data)) { - fs.writeSync(fd, data, 0, data.length, 0) - } else if (data != null) { - fs.writeSync(fd, String(data), 0, String(options.encoding || 'utf8')) - } - if (options.fsync !== false) { - fs.fsyncSync(fd) - } - fs.closeSync(fd) - if (options.chown) fs.chownSync(tmpfile, options.chown.uid, options.chown.gid) - if (options.mode) fs.chmodSync(tmpfile, options.mode) - fs.renameSync(tmpfile, filename) - removeOnExitHandler() - } catch (err) { - if (fd) { - try { - fs.closeSync(fd) - } catch (ex) { - // ignore close errors at this stage, error may have closed fd already. - } - } - removeOnExitHandler() - cleanup() - throw err - } -} + return template(chalk, parts.join('')); +}; + +Object.defineProperties(Chalk.prototype, styles); + +const chalk = Chalk(); // eslint-disable-line new-cap +chalk.supportsColor = stdoutColor; +chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap +chalk.stderr.supportsColor = stderrColor; + +module.exports = chalk; /***/ }), -/* 213 */ +/* 236 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) -var polyfills = __webpack_require__(214) -var legacy = __webpack_require__(216) -var queue = [] +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { -var util = __webpack_require__(111) +const wrapAnsi16 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${code + offset}m`; +}; -function noop () {} +const wrapAnsi256 = (fn, offset) => (...args) => { + const code = fn(...args); + return `\u001B[${38 + offset};5;${code}m`; +}; -var debug = noop -if (util.debuglog) - debug = util.debuglog('gfs4') -else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) - debug = function() { - var m = util.format.apply(util, arguments) - m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ') - console.error(m) - } +const wrapAnsi16m = (fn, offset) => (...args) => { + const rgb = fn(...args); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; -if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) { - process.on('exit', function() { - debug(queue) - __webpack_require__(138).equal(queue.length, 0) - }) -} +const ansi2ansi = n => n; +const rgb2rgb = (r, g, b) => [r, g, b]; -module.exports = patch(__webpack_require__(215)) -if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) { - module.exports = patch(fs) -} +const setLazyProperty = (object, property, get) => { + Object.defineProperty(object, property, { + get: () => { + const value = get(); -// Always patch fs.close/closeSync, because we want to -// retry() whenever a close happens *anywhere* in the program. -// This is essential when multiple graceful-fs instances are -// in play at the same time. -module.exports.close = -fs.close = (function (fs$close) { return function (fd, cb) { - return fs$close.call(fs, fd, function (err) { - if (!err) - retry() + Object.defineProperty(object, property, { + value, + enumerable: true, + configurable: true + }); - if (typeof cb === 'function') - cb.apply(this, arguments) - }) -}})(fs.close) + return value; + }, + enumerable: true, + configurable: true + }); +}; -module.exports.closeSync = -fs.closeSync = (function (fs$closeSync) { return function (fd) { - // Note that graceful-fs also retries when fs.closeSync() fails. - // Looks like a bug to me, although it's probably a harmless one. - var rval = fs$closeSync.apply(fs, arguments) - retry() - return rval -}})(fs.closeSync) +/** @type {typeof import('color-convert')} */ +let colorConvert; +const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => { + if (colorConvert === undefined) { + colorConvert = __webpack_require__(237); + } -function patch (fs) { - // Everything that references the open() function needs to be in here - polyfills(fs) - fs.gracefulify = patch - fs.FileReadStream = ReadStream; // Legacy name. - fs.FileWriteStream = WriteStream; // Legacy name. - fs.createReadStream = createReadStream - fs.createWriteStream = createWriteStream - var fs$readFile = fs.readFile - fs.readFile = readFile - function readFile (path, options, cb) { - if (typeof options === 'function') - cb = options, options = null + const offset = isBackground ? 10 : 0; + const styles = {}; - return go$readFile(path, options, cb) + for (const [sourceSpace, suite] of Object.entries(colorConvert)) { + const name = sourceSpace === 'ansi16' ? 'ansi' : sourceSpace; + if (sourceSpace === targetSpace) { + styles[name] = wrap(identity, offset); + } else if (typeof suite === 'object') { + styles[name] = wrap(suite[targetSpace], offset); + } + } - function go$readFile (path, options, cb) { - return fs$readFile(path, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readFile, [path, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + return styles; +}; - var fs$writeFile = fs.writeFile - fs.writeFile = writeFile - function writeFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], - return go$writeFile(path, data, options, cb) + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], - function go$writeFile (path, data, options, cb) { - return fs$writeFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$writeFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; - var fs$appendFile = fs.appendFile - if (fs$appendFile) - fs.appendFile = appendFile - function appendFile (path, data, options, cb) { - if (typeof options === 'function') - cb = options, options = null + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; - return go$appendFile(path, data, options, cb) + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; - function go$appendFile (path, data, options, cb) { - return fs$appendFile(path, data, options, function (err) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$appendFile, [path, data, options, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } + group[styleName] = styles[styleName]; - var fs$readdir = fs.readdir - fs.readdir = readdir - function readdir (path, options, cb) { - var args = [path] - if (typeof options !== 'function') { - args.push(options) - } else { - cb = options - } - args.push(go$readdir$cb) + codes.set(style[0], style[1]); + } - return go$readdir(args) + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); + } - function go$readdir$cb (err, files) { - if (files && files.sort) - files.sort() + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$readdir, [args]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - } - } + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; - function go$readdir (args) { - return fs$readdir.apply(fs, args) - } + setLazyProperty(styles.color, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, false)); + setLazyProperty(styles.color, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, false)); + setLazyProperty(styles.bgColor, 'ansi', () => makeDynamicStyles(wrapAnsi16, 'ansi16', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi256', () => makeDynamicStyles(wrapAnsi256, 'ansi256', ansi2ansi, true)); + setLazyProperty(styles.bgColor, 'ansi16m', () => makeDynamicStyles(wrapAnsi16m, 'rgb', rgb2rgb, true)); - if (process.version.substr(0, 4) === 'v0.8') { - var legStreams = legacy(fs) - ReadStream = legStreams.ReadStream - WriteStream = legStreams.WriteStream - } + return styles; +} - var fs$ReadStream = fs.ReadStream - ReadStream.prototype = Object.create(fs$ReadStream.prototype) - ReadStream.prototype.open = ReadStream$open +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); - var fs$WriteStream = fs.WriteStream - WriteStream.prototype = Object.create(fs$WriteStream.prototype) - WriteStream.prototype.open = WriteStream$open +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) - fs.ReadStream = ReadStream - fs.WriteStream = WriteStream +/***/ }), +/* 237 */ +/***/ (function(module, exports, __webpack_require__) { - function ReadStream (path, options) { - if (this instanceof ReadStream) - return fs$ReadStream.apply(this, arguments), this - else - return ReadStream.apply(Object.create(ReadStream.prototype), arguments) - } +const conversions = __webpack_require__(238); +const route = __webpack_require__(239); - function ReadStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - if (that.autoClose) - that.destroy() +const convert = {}; - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - that.read() - } - }) - } +const models = Object.keys(conversions); - function WriteStream (path, options) { - if (this instanceof WriteStream) - return fs$WriteStream.apply(this, arguments), this - else - return WriteStream.apply(Object.create(WriteStream.prototype), arguments) - } +function wrapRaw(fn) { + const wrappedFn = function (...args) { + const arg0 = args[0]; + if (arg0 === undefined || arg0 === null) { + return arg0; + } - function WriteStream$open () { - var that = this - open(that.path, that.flags, that.mode, function (err, fd) { - if (err) { - that.destroy() - that.emit('error', err) - } else { - that.fd = fd - that.emit('open', fd) - } - }) - } + if (arg0.length > 1) { + args = arg0; + } - function createReadStream (path, options) { - return new ReadStream(path, options) - } + return fn(args); + }; - function createWriteStream (path, options) { - return new WriteStream(path, options) - } + // Preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } - var fs$open = fs.open - fs.open = open - function open (path, flags, mode, cb) { - if (typeof mode === 'function') - cb = mode, mode = null + return wrappedFn; +} + +function wrapRounded(fn) { + const wrappedFn = function (...args) { + const arg0 = args[0]; + + if (arg0 === undefined || arg0 === null) { + return arg0; + } + + if (arg0.length > 1) { + args = arg0; + } + + const result = fn(args); + + // We're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (let len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } + + return result; + }; + + // Preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } - return go$open(path, flags, mode, cb) + return wrappedFn; +} - function go$open (path, flags, mode, cb) { - return fs$open(path, flags, mode, function (err, fd) { - if (err && (err.code === 'EMFILE' || err.code === 'ENFILE')) - enqueue([go$open, [path, flags, mode, cb]]) - else { - if (typeof cb === 'function') - cb.apply(this, arguments) - retry() - } - }) - } - } +models.forEach(fromModel => { + convert[fromModel] = {}; - return fs -} + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); -function enqueue (elem) { - debug('ENQUEUE', elem[0].name, elem[1]) - queue.push(elem) -} + const routes = route(fromModel); + const routeModels = Object.keys(routes); -function retry () { - var elem = queue.shift() - if (elem) { - debug('RETRY', elem[0].name, elem[1]) - elem[0].apply(null, elem[1]) - } -} + routeModels.forEach(toModel => { + const fn = routes[toModel]; + + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); + +module.exports = convert; /***/ }), -/* 214 */ +/* 238 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(215) -var constants = __webpack_require__(134) - -var origCwd = process.cwd -var cwd = null - -var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform +/* MIT license */ +/* eslint-disable no-mixed-operators */ +const cssKeywords = __webpack_require__(117); -process.cwd = function() { - if (!cwd) - cwd = origCwd.call(process) - return cwd -} -try { - process.cwd() -} catch (er) {} +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) -var chdir = process.chdir -process.chdir = function(d) { - cwd = null - chdir.call(process, d) +const reverseKeywords = {}; +for (const key of Object.keys(cssKeywords)) { + reverseKeywords[cssKeywords[key]] = key; } -module.exports = patch +const convert = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; -function patch (fs) { - // (re-)implement some things that are known busted or missing. +module.exports = convert; - // lchmod, broken prior to 0.6.2 - // back-port the fix here. - if (constants.hasOwnProperty('O_SYMLINK') && - process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { - patchLchmod(fs) - } +// Hide .channels and .labels properties +for (const model of Object.keys(convert)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } - // lutimes implementation, or no-op - if (!fs.lutimes) { - patchLutimes(fs) - } + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } - // https://github.com/isaacs/node-graceful-fs/issues/4 - // Chown should not fail on einval or eperm if non-root. - // It should not fail on enosys ever, as this just indicates - // that a fs doesn't support the intended operation. + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } - fs.chown = chownFix(fs.chown) - fs.fchown = chownFix(fs.fchown) - fs.lchown = chownFix(fs.lchown) + const {channels, labels} = convert[model]; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); +} - fs.chmod = chmodFix(fs.chmod) - fs.fchmod = chmodFix(fs.fchmod) - fs.lchmod = chmodFix(fs.lchmod) +convert.rgb.hsl = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const min = Math.min(r, g, b); + const max = Math.max(r, g, b); + const delta = max - min; + let h; + let s; - fs.chownSync = chownFixSync(fs.chownSync) - fs.fchownSync = chownFixSync(fs.fchownSync) - fs.lchownSync = chownFixSync(fs.lchownSync) + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } - fs.chmodSync = chmodFixSync(fs.chmodSync) - fs.fchmodSync = chmodFixSync(fs.fchmodSync) - fs.lchmodSync = chmodFixSync(fs.lchmodSync) + h = Math.min(h * 60, 360); - fs.stat = statFix(fs.stat) - fs.fstat = statFix(fs.fstat) - fs.lstat = statFix(fs.lstat) + if (h < 0) { + h += 360; + } - fs.statSync = statFixSync(fs.statSync) - fs.fstatSync = statFixSync(fs.fstatSync) - fs.lstatSync = statFixSync(fs.lstatSync) + const l = (min + max) / 2; - // if lchmod/lchown do not exist, then make them no-ops - if (!fs.lchmod) { - fs.lchmod = function (path, mode, cb) { - if (cb) process.nextTick(cb) - } - fs.lchmodSync = function () {} - } - if (!fs.lchown) { - fs.lchown = function (path, uid, gid, cb) { - if (cb) process.nextTick(cb) - } - fs.lchownSync = function () {} - } + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } - // on Windows, A/V software can lock the directory, causing this - // to fail with an EACCES or EPERM if the directory contains newly - // created files. Try again on failure, for up to 60 seconds. + return [h, s * 100, l * 100]; +}; - // Set the timeout this long because some Windows Anti-Virus, such as Parity - // bit9, may lock files for up to a minute, causing npm package install - // failures. Also, take care to yield the scheduler. Windows scheduling gives - // CPU to a busy looping process, which can cause the program causing the lock - // contention to be starved of CPU by node, so the contention doesn't resolve. - if (platform === "win32") { - fs.rename = (function (fs$rename) { return function (from, to, cb) { - var start = Date.now() - var backoff = 0; - fs$rename(from, to, function CB (er) { - if (er - && (er.code === "EACCES" || er.code === "EPERM") - && Date.now() - start < 60000) { - setTimeout(function() { - fs.stat(to, function (stater, st) { - if (stater && stater.code === "ENOENT") - fs$rename(from, to, CB); - else - cb(er) - }) - }, backoff) - if (backoff < 100) - backoff += 10; - return; - } - if (cb) cb(er) - }) - }})(fs.rename) - } +convert.rgb.hsv = function (rgb) { + let rdif; + let gdif; + let bdif; + let h; + let s; + + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const v = Math.max(r, g, b); + const diff = v - Math.min(r, g, b); + const diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; - // if read() returns EAGAIN, then just try it again. - fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) { - var callback - if (callback_ && typeof callback_ === 'function') { - var eagCounter = 0 - callback = function (er, _, __) { - if (er && er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - } - callback_.apply(this, arguments) - } - } - return fs$read.call(fs, fd, buffer, offset, length, position, callback) - }})(fs.read) + if (diff === 0) { + h = 0; + s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } - fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) { - var eagCounter = 0 - while (true) { - try { - return fs$readSync.call(fs, fd, buffer, offset, length, position) - } catch (er) { - if (er.code === 'EAGAIN' && eagCounter < 10) { - eagCounter ++ - continue - } - throw er - } - } - }})(fs.readSync) -} + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } -function patchLchmod (fs) { - fs.lchmod = function (path, mode, callback) { - fs.open( path - , constants.O_WRONLY | constants.O_SYMLINK - , mode - , function (err, fd) { - if (err) { - if (callback) callback(err) - return - } - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - fs.fchmod(fd, mode, function (err) { - fs.close(fd, function(err2) { - if (callback) callback(err || err2) - }) - }) - }) - } + return [ + h * 360, + s * 100, + v * 100 + ]; +}; - fs.lchmodSync = function (path, mode) { - var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) +convert.rgb.hwb = function (rgb) { + const r = rgb[0]; + const g = rgb[1]; + let b = rgb[2]; + const h = convert.rgb.hsl(rgb)[0]; + const w = 1 / 255 * Math.min(r, Math.min(g, b)); - // prefer to return the chmod error, if one occurs, - // but still try to close, and report closing errors if they occur. - var threw = true - var ret - try { - ret = fs.fchmodSync(fd, mode) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } -} + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); -function patchLutimes (fs) { - if (constants.hasOwnProperty("O_SYMLINK")) { - fs.lutimes = function (path, at, mt, cb) { - fs.open(path, constants.O_SYMLINK, function (er, fd) { - if (er) { - if (cb) cb(er) - return - } - fs.futimes(fd, at, mt, function (er) { - fs.close(fd, function (er2) { - if (cb) cb(er || er2) - }) - }) - }) - } + return [h, w * 100, b * 100]; +}; - fs.lutimesSync = function (path, at, mt) { - var fd = fs.openSync(path, constants.O_SYMLINK) - var ret - var threw = true - try { - ret = fs.futimesSync(fd, at, mt) - threw = false - } finally { - if (threw) { - try { - fs.closeSync(fd) - } catch (er) {} - } else { - fs.closeSync(fd) - } - } - return ret - } +convert.rgb.cmyk = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; - } else { - fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) } - fs.lutimesSync = function () {} - } -} + const k = Math.min(1 - r, 1 - g, 1 - b); + const c = (1 - r - k) / (1 - k) || 0; + const m = (1 - g - k) / (1 - k) || 0; + const y = (1 - b - k) / (1 - k) || 0; -function chmodFix (orig) { - if (!orig) return orig - return function (target, mode, cb) { - return orig.call(fs, target, mode, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } -} + return [c * 100, m * 100, y * 100, k * 100]; +}; -function chmodFixSync (orig) { - if (!orig) return orig - return function (target, mode) { - try { - return orig.call(fs, target, mode) - } catch (er) { - if (!chownErOk(er)) throw er - } - } +function comparativeDistance(x, y) { + /* + See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + */ + return ( + ((x[0] - y[0]) ** 2) + + ((x[1] - y[1]) ** 2) + + ((x[2] - y[2]) ** 2) + ); } +convert.rgb.keyword = function (rgb) { + const reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } -function chownFix (orig) { - if (!orig) return orig - return function (target, uid, gid, cb) { - return orig.call(fs, target, uid, gid, function (er) { - if (chownErOk(er)) er = null - if (cb) cb.apply(this, arguments) - }) - } -} + let currentClosestDistance = Infinity; + let currentClosestKeyword; -function chownFixSync (orig) { - if (!orig) return orig - return function (target, uid, gid) { - try { - return orig.call(fs, target, uid, gid) - } catch (er) { - if (!chownErOk(er)) throw er - } - } -} + for (const keyword of Object.keys(cssKeywords)) { + const value = cssKeywords[keyword]; + // Compute comparative distance + const distance = comparativeDistance(rgb, value); -function statFix (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target, cb) { - return orig.call(fs, target, function (er, stats) { - if (!stats) return cb.apply(this, arguments) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - if (cb) cb.apply(this, arguments) - }) - } -} + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } -function statFixSync (orig) { - if (!orig) return orig - // Older versions of Node erroneously returned signed integers for - // uid + gid. - return function (target) { - var stats = orig.call(fs, target) - if (stats.uid < 0) stats.uid += 0x100000000 - if (stats.gid < 0) stats.gid += 0x100000000 - return stats; - } -} + return currentClosestKeyword; +}; -// ENOSYS means that the fs doesn't support the op. Just ignore -// that, because it doesn't matter. -// -// if there's no getuid, or if getuid() is something other -// than 0, and the error is EINVAL or EPERM, then just ignore -// it. -// -// This specific case is a silent failure in cp, install, tar, -// and most other unix tools that manage permissions. -// -// When running as root, or if other types of errors are -// encountered, then it's strict. -function chownErOk (er) { - if (!er) - return true +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; - if (er.code === "ENOSYS") - return true +convert.rgb.xyz = function (rgb) { + let r = rgb[0] / 255; + let g = rgb[1] / 255; + let b = rgb[2] / 255; - var nonroot = !process.getuid || process.getuid() !== 0 - if (nonroot) { - if (er.code === "EINVAL" || er.code === "EPERM") - return true - } + // Assume sRGB + r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92); + g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92); + b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92); - return false -} + const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + return [x * 100, y * 100, z * 100]; +}; -/***/ }), -/* 215 */ -/***/ (function(module, exports, __webpack_require__) { +convert.rgb.lab = function (rgb) { + const xyz = convert.rgb.xyz(rgb); + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; -"use strict"; + x /= 95.047; + y /= 100; + z /= 108.883; + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); -var fs = __webpack_require__(132) + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); -module.exports = clone(fs) + return [l, a, b]; +}; -function clone (obj) { - if (obj === null || typeof obj !== 'object') - return obj +convert.hsl.rgb = function (hsl) { + const h = hsl[0] / 360; + const s = hsl[1] / 100; + const l = hsl[2] / 100; + let t2; + let t3; + let val; - if (obj instanceof Object) - var copy = { __proto__: obj.__proto__ } - else - var copy = Object.create(null) + if (s === 0) { + val = l * 255; + return [val, val, val]; + } - Object.getOwnPropertyNames(obj).forEach(function (key) { - Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)) - }) + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } - return copy -} + const t1 = 2 * l - t2; + const rgb = [0, 0, 0]; + for (let i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } -/***/ }), -/* 216 */ -/***/ (function(module, exports, __webpack_require__) { + if (t3 > 1) { + t3--; + } -var Stream = __webpack_require__(136).Stream + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } -module.exports = legacy + rgb[i] = val * 255; + } -function legacy (fs) { - return { - ReadStream: ReadStream, - WriteStream: WriteStream - } + return rgb; +}; - function ReadStream (path, options) { - if (!(this instanceof ReadStream)) return new ReadStream(path, options); +convert.hsl.hsv = function (hsl) { + const h = hsl[0]; + let s = hsl[1] / 100; + let l = hsl[2] / 100; + let smin = s; + const lmin = Math.max(l, 0.01); - Stream.call(this); + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + const v = (l + s) / 2; + const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); - var self = this; + return [h, sv * 100, v * 100]; +}; - this.path = path; - this.fd = null; - this.readable = true; - this.paused = false; +convert.hsv.rgb = function (hsv) { + const h = hsv[0] / 60; + const s = hsv[1] / 100; + let v = hsv[2] / 100; + const hi = Math.floor(h) % 6; + + const f = h - Math.floor(h); + const p = 255 * v * (1 - s); + const q = 255 * v * (1 - (s * f)); + const t = 255 * v * (1 - (s * (1 - f))); + v *= 255; - this.flags = 'r'; - this.mode = 438; /*=0666*/ - this.bufferSize = 64 * 1024; + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; - options = options || {}; +convert.hsv.hsl = function (hsv) { + const h = hsv[0]; + const s = hsv[1] / 100; + const v = hsv[2] / 100; + const vmin = Math.max(v, 0.01); + let sl; + let l; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + l = (2 - s) * v; + const lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; - if (this.encoding) this.setEncoding(this.encoding); + return [h, sl * 100, l * 100]; +}; - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.end === undefined) { - this.end = Infinity; - } else if ('number' !== typeof this.end) { - throw TypeError('end must be a Number'); - } +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + const h = hwb[0] / 360; + let wh = hwb[1] / 100; + let bl = hwb[2] / 100; + const ratio = wh + bl; + let f; - if (this.start > this.end) { - throw new Error('start must be <= end'); - } + // Wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } - this.pos = this.start; - } + const i = Math.floor(6 * h); + const v = 1 - bl; + f = 6 * h - i; - if (this.fd !== null) { - process.nextTick(function() { - self._read(); - }); - return; - } + if ((i & 0x01) !== 0) { + f = 1 - f; + } - fs.open(this.path, this.flags, this.mode, function (err, fd) { - if (err) { - self.emit('error', err); - self.readable = false; - return; - } + const n = wh + f * (v - wh); // Linear interpolation - self.fd = fd; - self.emit('open', fd); - self._read(); - }) - } + let r; + let g; + let b; + /* eslint-disable max-statements-per-line,no-multi-spaces */ + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + /* eslint-enable max-statements-per-line,no-multi-spaces */ - function WriteStream (path, options) { - if (!(this instanceof WriteStream)) return new WriteStream(path, options); + return [r * 255, g * 255, b * 255]; +}; - Stream.call(this); +convert.cmyk.rgb = function (cmyk) { + const c = cmyk[0] / 100; + const m = cmyk[1] / 100; + const y = cmyk[2] / 100; + const k = cmyk[3] / 100; - this.path = path; - this.fd = null; - this.writable = true; + const r = 1 - Math.min(1, c * (1 - k) + k); + const g = 1 - Math.min(1, m * (1 - k) + k); + const b = 1 - Math.min(1, y * (1 - k) + k); - this.flags = 'w'; - this.encoding = 'binary'; - this.mode = 438; /*=0666*/ - this.bytesWritten = 0; + return [r * 255, g * 255, b * 255]; +}; - options = options || {}; +convert.xyz.rgb = function (xyz) { + const x = xyz[0] / 100; + const y = xyz[1] / 100; + const z = xyz[2] / 100; + let r; + let g; + let b; - // Mixin options into this - var keys = Object.keys(options); - for (var index = 0, length = keys.length; index < length; index++) { - var key = keys[index]; - this[key] = options[key]; - } + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); - if (this.start !== undefined) { - if ('number' !== typeof this.start) { - throw TypeError('start must be a Number'); - } - if (this.start < 0) { - throw new Error('start must be >= zero'); - } + // Assume sRGB + r = r > 0.0031308 + ? ((1.055 * (r ** (1.0 / 2.4))) - 0.055) + : r * 12.92; - this.pos = this.start; - } + g = g > 0.0031308 + ? ((1.055 * (g ** (1.0 / 2.4))) - 0.055) + : g * 12.92; - this.busy = false; - this._queue = []; + b = b > 0.0031308 + ? ((1.055 * (b ** (1.0 / 2.4))) - 0.055) + : b * 12.92; - if (this.fd === null) { - this._open = fs.open; - this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); - this.flush(); - } - } -} + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + return [r * 255, g * 255, b * 255]; +}; -/***/ }), -/* 217 */ -/***/ (function(module, exports, __webpack_require__) { +convert.xyz.lab = function (xyz) { + let x = xyz[0]; + let y = xyz[1]; + let z = xyz[2]; -/** - * @preserve - * JS Implementation of incremental MurmurHash3 (r150) (as of May 10, 2013) - * - * @author Jens Taylor - * @see http://github.com/homebrewing/brauhaus-diff - * @author Gary Court - * @see http://github.com/garycourt/murmurhash-js - * @author Austin Appleby - * @see http://sites.google.com/site/murmurhash/ - */ -(function(){ - var cache; + x /= 95.047; + y /= 100; + z /= 108.883; - // Call this function without `new` to use the cached object (good for - // single-threaded environments), or with `new` to create a new object. - // - // @param {string} key A UTF-16 or ASCII string - // @param {number} seed An optional positive integer - // @return {object} A MurmurHash3 object for incremental hashing - function MurmurHash3(key, seed) { - var m = this instanceof MurmurHash3 ? this : cache; - m.reset(seed) - if (typeof key === 'string' && key.length > 0) { - m.hash(key); - } + x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116); - if (m !== this) { - return m; - } - }; + const l = (116 * y) - 16; + const a = 500 * (x - y); + const b = 200 * (y - z); - // Incrementally add a string to this hash - // - // @param {string} key A UTF-16 or ASCII string - // @return {object} this - MurmurHash3.prototype.hash = function(key) { - var h1, k1, i, top, len; + return [l, a, b]; +}; - len = key.length; - this.len += len; +convert.lab.xyz = function (lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let x; + let y; + let z; - k1 = this.k1; - i = 0; - switch (this.rem) { - case 0: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) : 0; - case 1: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 8 : 0; - case 2: k1 ^= len > i ? (key.charCodeAt(i++) & 0xffff) << 16 : 0; - case 3: - k1 ^= len > i ? (key.charCodeAt(i) & 0xff) << 24 : 0; - k1 ^= len > i ? (key.charCodeAt(i++) & 0xff00) >> 8 : 0; - } + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; - this.rem = (len + this.rem) & 3; // & 3 is same as % 4 - len -= this.rem; - if (len > 0) { - h1 = this.h1; - while (1) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; + const y2 = y ** 3; + const x2 = x ** 3; + const z2 = z ** 3; + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; - h1 ^= k1; - h1 = (h1 << 13) | (h1 >>> 19); - h1 = (h1 * 5 + 0xe6546b64) & 0xffffffff; + x *= 95.047; + y *= 100; + z *= 108.883; - if (i >= len) { - break; - } + return [x, y, z]; +}; - k1 = ((key.charCodeAt(i++) & 0xffff)) ^ - ((key.charCodeAt(i++) & 0xffff) << 8) ^ - ((key.charCodeAt(i++) & 0xffff) << 16); - top = key.charCodeAt(i++); - k1 ^= ((top & 0xff) << 24) ^ - ((top & 0xff00) >> 8); - } +convert.lab.lch = function (lab) { + const l = lab[0]; + const a = lab[1]; + const b = lab[2]; + let h; - k1 = 0; - switch (this.rem) { - case 3: k1 ^= (key.charCodeAt(i + 2) & 0xffff) << 16; - case 2: k1 ^= (key.charCodeAt(i + 1) & 0xffff) << 8; - case 1: k1 ^= (key.charCodeAt(i) & 0xffff); - } + const hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; - this.h1 = h1; - } + if (h < 0) { + h += 360; + } - this.k1 = k1; - return this; - }; + const c = Math.sqrt(a * a + b * b); - // Get the result of this hash - // - // @return {number} The 32-bit hash - MurmurHash3.prototype.result = function() { - var k1, h1; - - k1 = this.k1; - h1 = this.h1; + return [l, c, h]; +}; - if (k1 > 0) { - k1 = (k1 * 0x2d51 + (k1 & 0xffff) * 0xcc9e0000) & 0xffffffff; - k1 = (k1 << 15) | (k1 >>> 17); - k1 = (k1 * 0x3593 + (k1 & 0xffff) * 0x1b870000) & 0xffffffff; - h1 ^= k1; - } +convert.lch.lab = function (lch) { + const l = lch[0]; + const c = lch[1]; + const h = lch[2]; - h1 ^= this.len; + const hr = h / 360 * 2 * Math.PI; + const a = c * Math.cos(hr); + const b = c * Math.sin(hr); - h1 ^= h1 >>> 16; - h1 = (h1 * 0xca6b + (h1 & 0xffff) * 0x85eb0000) & 0xffffffff; - h1 ^= h1 >>> 13; - h1 = (h1 * 0xae35 + (h1 & 0xffff) * 0xc2b20000) & 0xffffffff; - h1 ^= h1 >>> 16; + return [l, a, b]; +}; - return h1 >>> 0; - }; +convert.rgb.ansi16 = function (args, saturation = null) { + const [r, g, b] = args; + let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization - // Reset the hash object for reuse - // - // @param {number} seed An optional positive integer - MurmurHash3.prototype.reset = function(seed) { - this.h1 = typeof seed === 'number' ? seed : 0; - this.rem = this.k1 = this.len = 0; - return this; - }; + value = Math.round(value / 50); - // A cached object to use. This can be safely used if you're in a single- - // threaded environment, otherwise you need to create new hashes to use. - cache = new MurmurHash3(); + if (value === 0) { + return 30; + } - if (true) { - module.exports = MurmurHash3; - } else {} -}()); + let ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); + if (value === 2) { + ansi += 60; + } -/***/ }), -/* 218 */ -/***/ (function(module, exports, __webpack_require__) { + return ansi; +}; -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -var assert = __webpack_require__(138) -var signals = __webpack_require__(219) +convert.hsv.ansi16 = function (args) { + // Optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; -var EE = __webpack_require__(154) -/* istanbul ignore if */ -if (typeof EE !== 'function') { - EE = EE.EventEmitter -} +convert.rgb.ansi256 = function (args) { + const r = args[0]; + const g = args[1]; + const b = args[2]; -var emitter -if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ -} else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} -} + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } -// Because this emitter is a global, we have to check to see if a -// previous version of this library failed to enable infinite listeners. -// I know what you're about to say. But literally everything about -// signal-exit is a compromise with evil. Get used to it. -if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true -} + if (r > 248) { + return 231; + } -module.exports = function (cb, opts) { - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + return Math.round(((r - 8) / 247) * 24) + 232; + } - if (loaded === false) { - load() - } + const ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } + return ansi; +}; - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) +convert.ansi16.rgb = function (args) { + let color = args % 10; - return remove -} + // Handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } -module.exports.unload = unload -function unload () { - if (!loaded) { - return - } - loaded = false + color = color / 10.5 * 255; - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 -} + return [color, color, color]; + } -function emit (event, code, signal) { - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) -} + const mult = (~~(args > 50) + 1) * 0.5; + const r = ((color & 1) * mult) * 255; + const g = (((color >> 1) & 1) * mult) * 255; + const b = (((color >> 2) & 1) * mult) * 255; -// { : , ... } -var sigListeners = {} -signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } -}) + return [r, g, b]; +}; -module.exports.signals = function () { - return signals -} +convert.ansi256.rgb = function (args) { + // Handle greyscale + if (args >= 232) { + const c = (args - 232) * 10 + 8; + return [c, c, c]; + } -module.exports.load = load + args -= 16; -var loaded = false + let rem; + const r = Math.floor(args / 36) / 5 * 255; + const g = Math.floor((rem = args % 36) / 6) / 5 * 255; + const b = (rem % 6) / 5 * 255; -function load () { - if (loaded) { - return - } - loaded = true + return [r, g, b]; +}; - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 +convert.rgb.hex = function (args) { + const integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) + const string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; - process.emit = processEmit - process.reallyExit = processReallyExit -} +convert.hex.rgb = function (args) { + const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } -var originalProcessReallyExit = process.reallyExit -function processReallyExit (code) { - process.exitCode = code || 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) -} + let colorString = match[0]; -var originalProcessEmit = process.emit -function processEmit (ev, arg) { - if (ev === 'exit') { - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } -} + if (match[0].length === 3) { + colorString = colorString.split('').map(char => { + return char + char; + }).join(''); + } + const integer = parseInt(colorString, 16); + const r = (integer >> 16) & 0xFF; + const g = (integer >> 8) & 0xFF; + const b = integer & 0xFF; -/***/ }), -/* 219 */ -/***/ (function(module, exports) { + return [r, g, b]; +}; -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] +convert.rgb.hcg = function (rgb) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(Math.max(r, g), b); + const min = Math.min(Math.min(r, g), b); + const chroma = (max - min); + let grayscale; + let hue; -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma; + } + hue /= 6; + hue %= 1; -/***/ }), -/* 220 */ -/***/ (function(module, exports) { + return [hue * 360, chroma * 100, grayscale * 100]; +}; -module.exports = require(undefined); +convert.hsl.hcg = function (hsl) { + const s = hsl[1] / 100; + const l = hsl[2] / 100; -/***/ }), -/* 221 */ -/***/ (function(module, exports, __webpack_require__) { + const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l)); -"use strict"; + let f = 0; + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } -const isPlainObj = __webpack_require__(222); + return [hsl[0], c * 100, f * 100]; +}; -module.exports = (obj, opts) => { - if (!isPlainObj(obj)) { - throw new TypeError('Expected a plain object'); +convert.hsv.hcg = function (hsv) { + const s = hsv[1] / 100; + const v = hsv[2] / 100; + + const c = s * v; + let f = 0; + + if (c < 1.0) { + f = (v - c) / (1 - c); } - opts = opts || {}; + return [hsv[0], c * 100, f * 100]; +}; - // DEPRECATED - if (typeof opts === 'function') { - throw new TypeError('Specify the compare function as an option instead'); +convert.hcg.rgb = function (hcg) { + const h = hcg[0] / 360; + const c = hcg[1] / 100; + const g = hcg[2] / 100; + + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; } - const deep = opts.deep; - const seenInput = []; - const seenOutput = []; + const pure = [0, 0, 0]; + const hi = (h % 1) * 6; + const v = hi % 1; + const w = 1 - v; + let mg = 0; - const sortKeys = x => { - const seenIndex = seenInput.indexOf(x); + /* eslint-disable max-statements-per-line */ + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } + /* eslint-enable max-statements-per-line */ - if (seenIndex !== -1) { - return seenOutput[seenIndex]; - } + mg = (1.0 - c) * g; - const ret = {}; - const keys = Object.keys(x).sort(opts.compare); + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; - seenInput.push(x); - seenOutput.push(ret); +convert.hcg.hsv = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const val = x[key]; + const v = c + g * (1.0 - c); + let f = 0; - if (deep && Array.isArray(val)) { - const retArr = []; + if (v > 0.0) { + f = c / v; + } - for (let j = 0; j < val.length; j++) { - retArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j]; - } + return [hcg[0], f * 100, v * 100]; +}; - ret[key] = retArr; - continue; - } +convert.hcg.hsl = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; - ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; - } + const l = g * (1.0 - c) + 0.5 * c; + let s = 0; - return ret; - }; + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } - return sortKeys(obj); + return [hcg[0], s * 100, l * 100]; }; +convert.hcg.hwb = function (hcg) { + const c = hcg[1] / 100; + const g = hcg[2] / 100; + const v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -/***/ }), -/* 222 */ -/***/ (function(module, exports, __webpack_require__) { +convert.hwb.hcg = function (hwb) { + const w = hwb[1] / 100; + const b = hwb[2] / 100; + const v = 1 - b; + const c = v - w; + let g = 0; -"use strict"; + if (c < 1) { + g = (v - c) / (1 - c); + } -var toString = Object.prototype.toString; + return [hwb[0], c * 100, g * 100]; +}; -module.exports = function (x) { - var prototype; - return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; }; +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; -/***/ }), -/* 223 */ -/***/ (function(module, exports, __webpack_require__) { +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; -"use strict"; +convert.gray.hsl = function (args) { + return [0, 0, args[0]]; +}; -const fs = __webpack_require__(132); -const path = __webpack_require__(4); -const pify = __webpack_require__(224); -const semver = __webpack_require__(182); +convert.gray.hsv = convert.gray.hsl; -const defaults = { - mode: 0o777 & (~process.umask()), - fs +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; }; -const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); - -// https://github.com/nodejs/node/issues/8987 -// https://github.com/libuv/libuv/pull/1088 -const checkPath = pth => { - if (process.platform === 'win32') { - const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, '')); +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; - if (pathHasInvalidWinCharacters) { - const error = new Error(`Path contains invalid characters: ${pth}`); - error.code = 'EINVAL'; - throw error; - } - } +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; }; -const permissionError = pth => { - // This replicates the exception of `fs.mkdir` with native the - // `recusive` option when run on an invalid drive under Windows. - const error = new Error(`operation not permitted, mkdir '${pth}'`); - error.code = 'EPERM'; - error.errno = -4048; - error.path = pth; - error.syscall = 'mkdir'; - return error; +convert.gray.hex = function (gray) { + const val = Math.round(gray[0] / 100 * 255) & 0xFF; + const integer = (val << 16) + (val << 8) + val; + + const string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; }; -const makeDir = (input, options) => Promise.resolve().then(() => { - checkPath(input); - options = Object.assign({}, defaults, options); +convert.rgb.gray = function (rgb) { + const val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; - // TODO: Use util.promisify when targeting Node.js 8 - const mkdir = pify(options.fs.mkdir); - const stat = pify(options.fs.stat); - if (useNativeRecursiveOption && options.fs.mkdir === fs.mkdir) { - const pth = path.resolve(input); +/***/ }), +/* 239 */ +/***/ (function(module, exports, __webpack_require__) { - return mkdir(pth, { - mode: options.mode, - recursive: true - }).then(() => pth); - } +const conversions = __webpack_require__(238); - const make = pth => { - return mkdir(pth, options.mode) - .then(() => pth) - .catch(error => { - if (error.code === 'EPERM') { - throw error; - } +/* + This function routes a model to all other models. - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). - if (error.message.includes('null bytes')) { - throw error; - } + conversions that are not possible simply are not included. +*/ - return make(path.dirname(pth)).then(() => make(pth)); - } +function buildGraph() { + const graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + const models = Object.keys(conversions); - return stat(pth) - .then(stats => stats.isDirectory() ? pth : Promise.reject()) - .catch(() => { - throw error; - }); - }); - }; + for (let len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } - return make(path.resolve(input)); -}); + return graph; +} -module.exports = makeDir; -module.exports.default = makeDir; +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + const graph = buildGraph(); + const queue = [fromModel]; // Unshift -> queue -> pop -module.exports.sync = (input, options) => { - checkPath(input); - options = Object.assign({}, defaults, options); + graph[fromModel].distance = 0; - if (useNativeRecursiveOption && options.fs.mkdirSync === fs.mkdirSync) { - const pth = path.resolve(input); + while (queue.length) { + const current = queue.pop(); + const adjacents = Object.keys(conversions[current]); - fs.mkdirSync(pth, { - mode: options.mode, - recursive: true - }); + for (let len = adjacents.length, i = 0; i < len; i++) { + const adjacent = adjacents[i]; + const node = graph[adjacent]; - return pth; + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } } - const make = pth => { - try { - options.fs.mkdirSync(pth, options.mode); - } catch (error) { - if (error.code === 'EPERM') { - throw error; - } + return graph; +} - if (error.code === 'ENOENT') { - if (path.dirname(pth) === pth) { - throw permissionError(pth); - } +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} - if (error.message.includes('null bytes')) { - throw error; - } +function wrapConversion(toModel, graph) { + const path = [graph[toModel].parent, toModel]; + let fn = conversions[graph[toModel].parent][toModel]; - make(path.dirname(pth)); - return make(pth); - } + let cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } - try { - if (!options.fs.statSync(pth).isDirectory()) { - throw new Error('The path is not a directory'); - } - } catch (_) { - throw error; - } + fn.conversion = path; + return fn; +} + +module.exports = function (fromModel) { + const graph = deriveBFS(fromModel); + const conversion = {}; + + const models = Object.keys(graph); + for (let len = models.length, i = 0; i < len; i++) { + const toModel = models[i]; + const node = graph[toModel]; + + if (node.parent === null) { + // No possible conversion, or this node is the source model. + continue; } - return pth; - }; + conversion[toModel] = wrapConversion(toModel, graph); + } - return make(path.resolve(input)); + return conversion; }; + /***/ }), -/* 224 */ +/* 240 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const os = __webpack_require__(120); +const tty = __webpack_require__(121); +const hasFlag = __webpack_require__(241); -const processFn = (fn, options) => function (...args) { - const P = options.promiseModule; - - return new P((resolve, reject) => { - if (options.multiArgs) { - args.push((...result) => { - if (options.errorFirst) { - if (result[0]) { - reject(result); - } else { - result.shift(); - resolve(result); - } - } else { - resolve(result); - } - }); - } else if (options.errorFirst) { - args.push((error, result) => { - if (error) { - reject(error); - } else { - resolve(result); - } - }); - } else { - args.push(resolve); - } +const {env} = process; - fn.apply(this, args); - }); -}; +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false') || + hasFlag('color=never')) { + forceColor = 0; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = 1; +} -module.exports = (input, options) => { - options = Object.assign({ - exclude: [/.+(Sync|Stream)$/], - errorFirst: true, - promiseModule: Promise - }, options); +if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + forceColor = 1; + } else if (env.FORCE_COLOR === 'false') { + forceColor = 0; + } else { + forceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3); + } +} - const objType = typeof input; - if (!(input !== null && (objType === 'object' || objType === 'function'))) { - throw new TypeError(`Expected \`input\` to be a \`Function\` or \`Object\`, got \`${input === null ? 'null' : objType}\``); +function translateLevel(level) { + if (level === 0) { + return false; } - const filter = key => { - const match = pattern => typeof pattern === 'string' ? key === pattern : pattern.test(key); - return options.include ? options.include.some(match) : !options.exclude.some(match); + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 }; +} - let ret; - if (objType === 'function') { - ret = function (...args) { - return options.excludeMain ? input(...args) : processFn(input, options).apply(this, args); - }; - } else { - ret = Object.create(Object.getPrototypeOf(input)); +function supportsColor(haveStream, streamIsTTY) { + if (forceColor === 0) { + return 0; } - for (const key in input) { // eslint-disable-line guard-for-in - const property = input[key]; - ret[key] = typeof property === 'function' && filter(key) ? processFn(property, options) : property; + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; } - return ret; -}; + if (hasFlag('color=256')) { + return 2; + } + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } -/***/ }), -/* 225 */ -/***/ (function(module, exports, __webpack_require__) { + const min = forceColor || 0; -"use strict"; + if (env.TERM === 'dumb') { + return min; + } + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -// detect either spaces or tabs but not both to properly handle tabs -// for indentation and spaces for alignment -const INDENT_RE = /^(?:( )+|\t+)/; + return 1; + } -function getMostUsed(indents) { - let result = 0; - let maxUsed = 0; - let maxWeight = 0; + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } - for (const entry of indents) { - // TODO: use destructuring when targeting Node.js 6 - const key = entry[0]; - const val = entry[1]; + return min; + } - const u = val[0]; - const w = val[1]; + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } - if (u > maxUsed || (u === maxUsed && w > maxWeight)) { - maxUsed = u; - maxWeight = w; - result = Number(key); + if ('GITHUB_ACTIONS' in env) { + return 1; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default } } - return result; -} + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -module.exports = str => { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; } - // used to see if tabs or spaces are the most used - let tabs = 0; - let spaces = 0; + if ('COLORTERM' in env) { + return 1; + } - // remember the size of previous line's indentation - let prev = 0; + return min; +} - // remember how many indents/unindents as occurred for a given size - // and how much lines follow a given indentation - // - // indents = { - // 3: [1, 0], - // 4: [1, 5], - // 5: [1, 0], - // 12: [1, 0], - // } - const indents = new Map(); +function getSupportLevel(stream) { + const level = supportsColor(stream, stream && stream.isTTY); + return translateLevel(level); +} - // pointer to the array of last used indent - let current; +module.exports = { + supportsColor: getSupportLevel, + stdout: translateLevel(supportsColor(true, tty.isatty(1))), + stderr: translateLevel(supportsColor(true, tty.isatty(2))) +}; + + +/***/ }), +/* 241 */ +/***/ (function(module, exports, __webpack_require__) { - // whether the last action was an indent (opposed to an unindent) - let isIndent; +"use strict"; - for (const line of str.split(/\n/g)) { - if (!line) { - // ignore empty lines - continue; - } - let indent; - const matches = line.match(INDENT_RE); +module.exports = (flag, argv = process.argv) => { + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +}; - if (matches) { - indent = matches[0].length; - if (matches[1]) { - spaces++; - } else { - tabs++; - } - } else { - indent = 0; - } +/***/ }), +/* 242 */ +/***/ (function(module, exports, __webpack_require__) { - const diff = indent - prev; - prev = indent; +"use strict"; - if (diff) { - // an indent or unindent has been detected - isIndent = diff > 0; +const stringReplaceAll = (string, substring, replacer) => { + let index = string.indexOf(substring); + if (index === -1) { + return string; + } - current = indents.get(isIndent ? diff : -diff); + const substringLength = substring.length; + let endIndex = 0; + let returnValue = ''; + do { + returnValue += string.substr(endIndex, index - endIndex) + substring + replacer; + endIndex = index + substringLength; + index = string.indexOf(substring, endIndex); + } while (index !== -1); - if (current) { - current[0]++; - } else { - current = [1, 0]; - indents.set(diff, current); - } - } else if (current) { - // if the last action was an indent, increment the weight - current[1] += Number(isIndent); - } - } + returnValue += string.substr(endIndex); + return returnValue; +}; - const amount = getMostUsed(indents); +const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { + let endIndex = 0; + let returnValue = ''; + do { + const gotCR = string[index - 1] === '\r'; + returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix; + endIndex = index + 1; + index = string.indexOf('\n', endIndex); + } while (index !== -1); - let type; - let indent; - if (!amount) { - type = null; - indent = ''; - } else if (spaces >= tabs) { - type = 'space'; - indent = ' '.repeat(amount); - } else { - type = 'tab'; - indent = '\t'.repeat(amount); - } + returnValue += string.substr(endIndex); + return returnValue; +}; - return { - amount, - type, - indent - }; +module.exports = { + stringReplaceAll, + stringEncaseCRLFWithFirstIndex }; /***/ }), -/* 226 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 243 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "installInDir", function() { return installInDir; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackage", function() { return runScriptInPackage; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runScriptInPackageStreaming", function() { return runScriptInPackageStreaming; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yarnWorkspacesInfo", function() { return yarnWorkspacesInfo; }); -/* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(227); -/* - * 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. - */ -const YARN_EXEC = process.env.npm_execpath || 'yarn'; +const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi; -/** - * Install all dependencies in the given directory - */ -async function installInDir(directory, extraArgs = []) { - const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any - // given time (e.g. to avoid conflicts). +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { - cwd: directory - }); -} -/** - * Run script in the given directory - */ +function unescape(c) { + const u = c[0] === 'u'; + const bracket = c[1] === '{'; -async function runScriptInPackage(script, args, pkg) { - const execOpts = { - cwd: pkg.path - }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); -} -/** - * Run script in the given directory - */ + if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -function runScriptInPackageStreaming({ - script, - args, - pkg, - debug -}) { - const execOpts = { - cwd: pkg.path - }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { - prefix: pkg.name, - debug - }); -} -async function yarnWorkspacesInfo(directory) { - const { - stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { - cwd: directory, - stdio: 'pipe' - }); + if (u && bracket) { + return String.fromCodePoint(parseInt(c.slice(2, -1), 16)); + } - try { - return JSON.parse(JSON.parse(stdout).data); - } catch (error) { - throw new Error(`'yarn workspaces info --json' produced unexpected output: \n${stdout}`); - } + return ESCAPES.get(c) || c; } -/***/ }), -/* 227 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +function parseArguments(name, arguments_) { + const results = []; + const chunks = arguments_.trim().split(/\s*,\s*/g); + let matches; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawn", function() { return spawn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); -/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(136); -/* harmony import */ var stream__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stream__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(112); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(228); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(263); -/* harmony import */ var strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(strong_log_transformer__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(142); -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + for (const chunk of chunks) { + const number = Number(chunk); + if (!Number.isNaN(number)) { + results.push(number); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + return results; +} -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function parseStyle(style) { + STYLE_REGEX.lastIndex = 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. - */ + const results = []; + let matches; + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } + return results; +} +function buildStyle(chalk, styles) { + const enabled = {}; -const colorWheel = [chalk__WEBPACK_IMPORTED_MODULE_1___default.a.cyan, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.magenta, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.blue, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.yellow, chalk__WEBPACK_IMPORTED_MODULE_1___default.a.green]; + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } -const getColor = () => { - const color = colorWheel.shift(); - colorWheel.push(color); - return color; -}; + let current = chalk; + for (const [styleName, styles] of Object.entries(enabled)) { + if (!Array.isArray(styles)) { + continue; + } -function spawn(command, args, opts) { - return execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ - stdio: 'inherit', - preferLocal: true - }, opts)); + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } + + current = styles.length > 0 ? current[styleName](...styles) : current[styleName]; + } + + return current; } -function streamToLog(debug = true) { - return new stream__WEBPACK_IMPORTED_MODULE_0__["Writable"]({ - objectMode: true, +module.exports = (chalk, temporary) => { + const styles = []; + const chunks = []; + let chunk = []; - write(line, _, cb) { - if (line.endsWith('\n')) { - _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line.slice(0, -1)); - } else { - _log__WEBPACK_IMPORTED_MODULE_4__["log"][debug ? 'debug' : 'write'](line); - } + // eslint-disable-next-line max-params + temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => { + if (escapeCharacter) { + chunk.push(unescape(escapeCharacter)); + } else if (style) { + const string = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } - cb(); - } + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(character); + } + }); - }); -} + chunks.push(chunk.join('')); + + if (styles.length > 0) { + const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMessage); + } + + return chunks.join(''); +}; -function spawnStreaming(command, args, opts, { - prefix, - debug -}) { - const spawned = execa__WEBPACK_IMPORTED_MODULE_2___default()(command, args, _objectSpread({ - stdio: ['ignore', 'pipe', 'pipe'], - preferLocal: true - }, opts)); - const color = getColor(); - const prefixedStdout = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - tag: color.bold(prefix) - }); - const prefixedStderr = strong_log_transformer__WEBPACK_IMPORTED_MODULE_3___default()({ - mergeMultiline: true, - tag: color.bold(prefix) - }); - spawned.stdout.pipe(prefixedStdout).pipe(streamToLog(debug)); - spawned.stderr.pipe(prefixedStderr).pipe(streamToLog(debug)); - return spawned; -} /***/ }), -/* 228 */ +/* 244 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const childProcess = __webpack_require__(229); -const crossSpawn = __webpack_require__(230); -const stripFinalNewline = __webpack_require__(243); -const npmRunPath = __webpack_require__(244); -const onetime = __webpack_require__(245); -const makeError = __webpack_require__(247); -const normalizeStdio = __webpack_require__(252); -const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(253); -const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(254); -const {mergePromise, getSpawnedPromise} = __webpack_require__(261); -const {joinCommand, parseCommand} = __webpack_require__(262); +const childProcess = __webpack_require__(245); +const crossSpawn = __webpack_require__(246); +const stripFinalNewline = __webpack_require__(259); +const npmRunPath = __webpack_require__(260); +const onetime = __webpack_require__(261); +const makeError = __webpack_require__(263); +const normalizeStdio = __webpack_require__(268); +const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(269); +const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(270); +const {mergePromise, getSpawnedPromise} = __webpack_require__(277); +const {joinCommand, parseCommand} = __webpack_require__(278); const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; @@ -24239,21 +27302,21 @@ module.exports.node = (scriptPath, args, options = {}) => { /***/ }), -/* 229 */ +/* 245 */ /***/ (function(module, exports) { module.exports = require("child_process"); /***/ }), -/* 230 */ +/* 246 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const cp = __webpack_require__(229); -const parse = __webpack_require__(231); -const enoent = __webpack_require__(242); +const cp = __webpack_require__(245); +const parse = __webpack_require__(247); +const enoent = __webpack_require__(258); function spawn(command, args, options) { // Parse the arguments @@ -24291,16 +27354,16 @@ module.exports._enoent = enoent; /***/ }), -/* 231 */ +/* 247 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const resolveCommand = __webpack_require__(232); -const escape = __webpack_require__(238); -const readShebang = __webpack_require__(239); +const resolveCommand = __webpack_require__(248); +const escape = __webpack_require__(254); +const readShebang = __webpack_require__(255); const isWin = process.platform === 'win32'; const isExecutableRegExp = /\.(?:com|exe)$/i; @@ -24389,15 +27452,15 @@ module.exports = parse; /***/ }), -/* 232 */ +/* 248 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const which = __webpack_require__(233); -const pathKey = __webpack_require__(237)(); +const which = __webpack_require__(249); +const pathKey = __webpack_require__(253)(); function resolveCommandAttempt(parsed, withoutPathExt) { const cwd = process.cwd(); @@ -24447,7 +27510,7 @@ module.exports = resolveCommand; /***/ }), -/* 233 */ +/* 249 */ /***/ (function(module, exports, __webpack_require__) { const isWindows = process.platform === 'win32' || @@ -24456,7 +27519,7 @@ const isWindows = process.platform === 'win32' || const path = __webpack_require__(4) const COLON = isWindows ? ';' : ':' -const isexe = __webpack_require__(234) +const isexe = __webpack_require__(250) const getNotFoundError = (cmd) => Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) @@ -24578,15 +27641,15 @@ which.sync = whichSync /***/ }), -/* 234 */ +/* 250 */ /***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) var core if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = __webpack_require__(235) + core = __webpack_require__(251) } else { - core = __webpack_require__(236) + core = __webpack_require__(252) } module.exports = isexe @@ -24641,13 +27704,13 @@ function sync (path, options) { /***/ }), -/* 235 */ +/* 251 */ /***/ (function(module, exports, __webpack_require__) { module.exports = isexe isexe.sync = sync -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) function checkPathExt (path, options) { var pathext = options.pathExt !== undefined ? @@ -24689,13 +27752,13 @@ function sync (path, options) { /***/ }), -/* 236 */ +/* 252 */ /***/ (function(module, exports, __webpack_require__) { module.exports = isexe isexe.sync = sync -var fs = __webpack_require__(132) +var fs = __webpack_require__(133) function isexe (path, options, cb) { fs.stat(path, function (er, stat) { @@ -24736,7 +27799,7 @@ function checkMode (stat, options) { /***/ }), -/* 237 */ +/* 253 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24759,7 +27822,7 @@ module.exports.default = pathKey; /***/ }), -/* 238 */ +/* 254 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24811,14 +27874,14 @@ module.exports.argument = escapeArgument; /***/ }), -/* 239 */ +/* 255 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const shebangCommand = __webpack_require__(240); +const fs = __webpack_require__(133); +const shebangCommand = __webpack_require__(256); function readShebang(command) { // Read the first 150 bytes from the file @@ -24841,12 +27904,12 @@ module.exports = readShebang; /***/ }), -/* 240 */ +/* 256 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const shebangRegex = __webpack_require__(241); +const shebangRegex = __webpack_require__(257); module.exports = (string = '') => { const match = string.match(shebangRegex); @@ -24867,7 +27930,7 @@ module.exports = (string = '') => { /***/ }), -/* 241 */ +/* 257 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24876,7 +27939,7 @@ module.exports = /^#!(.*)/; /***/ }), -/* 242 */ +/* 258 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24942,7 +28005,7 @@ module.exports = { /***/ }), -/* 243 */ +/* 259 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -24965,13 +28028,13 @@ module.exports = input => { /***/ }), -/* 244 */ +/* 260 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathKey = __webpack_require__(237); +const pathKey = __webpack_require__(253); const npmRunPath = options => { options = { @@ -25019,12 +28082,12 @@ module.exports.env = options => { /***/ }), -/* 245 */ +/* 261 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(246); +const mimicFn = __webpack_require__(262); const calledFunctions = new WeakMap(); @@ -25076,7 +28139,7 @@ module.exports.callCount = fn => { /***/ }), -/* 246 */ +/* 262 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25096,12 +28159,12 @@ module.exports.default = mimicFn; /***/ }), -/* 247 */ +/* 263 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {signalsByName} = __webpack_require__(248); +const {signalsByName} = __webpack_require__(264); const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { if (timedOut) { @@ -25189,14 +28252,14 @@ module.exports = makeError; /***/ }), -/* 248 */ +/* 264 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(121); +Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(120); -var _signals=__webpack_require__(249); -var _realtime=__webpack_require__(251); +var _signals=__webpack_require__(265); +var _realtime=__webpack_require__(267); @@ -25266,14 +28329,14 @@ const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumb //# sourceMappingURL=main.js.map /***/ }), -/* 249 */ +/* 265 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(121); +Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(120); -var _core=__webpack_require__(250); -var _realtime=__webpack_require__(251); +var _core=__webpack_require__(266); +var _realtime=__webpack_require__(267); @@ -25307,7 +28370,7 @@ return{name,number,description,supported,action,forced,standard}; //# sourceMappingURL=signals.js.map /***/ }), -/* 250 */ +/* 266 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25586,7 +28649,7 @@ standard:"other"}];exports.SIGNALS=SIGNALS; //# sourceMappingURL=core.js.map /***/ }), -/* 251 */ +/* 267 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25611,7 +28674,7 @@ const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; //# sourceMappingURL=realtime.js.map /***/ }), -/* 252 */ +/* 268 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25670,13 +28733,13 @@ module.exports.node = opts => { /***/ }), -/* 253 */ +/* 269 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(121); -const onExit = __webpack_require__(218); +const os = __webpack_require__(120); +const onExit = __webpack_require__(225); const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; @@ -25789,14 +28852,14 @@ module.exports = { /***/ }), -/* 254 */ +/* 270 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isStream = __webpack_require__(255); -const getStream = __webpack_require__(256); -const mergeStream = __webpack_require__(260); +const isStream = __webpack_require__(271); +const getStream = __webpack_require__(272); +const mergeStream = __webpack_require__(276); // `input` option const handleInput = (spawned, input) => { @@ -25893,7 +28956,7 @@ module.exports = { /***/ }), -/* 255 */ +/* 271 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -25929,13 +28992,13 @@ module.exports = isStream; /***/ }), -/* 256 */ +/* 272 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pump = __webpack_require__(257); -const bufferStream = __webpack_require__(259); +const pump = __webpack_require__(273); +const bufferStream = __webpack_require__(275); class MaxBufferError extends Error { constructor() { @@ -25994,12 +29057,12 @@ module.exports.MaxBufferError = MaxBufferError; /***/ }), -/* 257 */ +/* 273 */ /***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(160) -var eos = __webpack_require__(258) -var fs = __webpack_require__(132) // we only need fs to get the ReadStream and WriteStream prototypes +var once = __webpack_require__(161) +var eos = __webpack_require__(274) +var fs = __webpack_require__(133) // we only need fs to get the ReadStream and WriteStream prototypes var noop = function () {} var ancient = /^v?\.0/.test(process.version) @@ -26082,10 +29145,10 @@ module.exports = pump /***/ }), -/* 258 */ +/* 274 */ /***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(160); +var once = __webpack_require__(161); var noop = function() {}; @@ -26175,12 +29238,12 @@ module.exports = eos; /***/ }), -/* 259 */ +/* 275 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {PassThrough: PassThroughStream} = __webpack_require__(136); +const {PassThrough: PassThroughStream} = __webpack_require__(137); module.exports = options => { options = {...options}; @@ -26234,13 +29297,13 @@ module.exports = options => { /***/ }), -/* 260 */ +/* 276 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const { PassThrough } = __webpack_require__(136); +const { PassThrough } = __webpack_require__(137); module.exports = function (/*streams...*/) { var sources = [] @@ -26282,7 +29345,7 @@ module.exports = function (/*streams...*/) { /***/ }), -/* 261 */ +/* 277 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26335,7 +29398,7 @@ module.exports = { /***/ }), -/* 262 */ +/* 278 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26380,7 +29443,7 @@ module.exports = { /***/ }), -/* 263 */ +/* 279 */ /***/ (function(module, exports, __webpack_require__) { // Copyright IBM Corp. 2014,2018. All Rights Reserved. @@ -26388,12 +29451,12 @@ module.exports = { // This file is licensed under the Apache License 2.0. // License text available at https://opensource.org/licenses/Apache-2.0 -module.exports = __webpack_require__(264); -module.exports.cli = __webpack_require__(268); +module.exports = __webpack_require__(280); +module.exports.cli = __webpack_require__(284); /***/ }), -/* 264 */ +/* 280 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26404,13 +29467,13 @@ module.exports.cli = __webpack_require__(268); -var stream = __webpack_require__(136); +var stream = __webpack_require__(137); var util = __webpack_require__(111); -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); -var through = __webpack_require__(265); -var duplexer = __webpack_require__(266); -var StringDecoder = __webpack_require__(267).StringDecoder; +var through = __webpack_require__(281); +var duplexer = __webpack_require__(282); +var StringDecoder = __webpack_require__(283).StringDecoder; module.exports = Logger; @@ -26599,10 +29662,10 @@ function lineMerger(host) { /***/ }), -/* 265 */ +/* 281 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(136) +var Stream = __webpack_require__(137) // through // @@ -26713,10 +29776,10 @@ function through (write, end, opts) { /***/ }), -/* 266 */ +/* 282 */ /***/ (function(module, exports, __webpack_require__) { -var Stream = __webpack_require__(136) +var Stream = __webpack_require__(137) var writeMethods = ["write", "end", "destroy"] var readMethods = ["resume", "pause"] var readEvents = ["data", "close"] @@ -26806,13 +29869,13 @@ function duplex(writer, reader) { /***/ }), -/* 267 */ +/* 283 */ /***/ (function(module, exports) { module.exports = require("string_decoder"); /***/ }), -/* 268 */ +/* 284 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -26823,11 +29886,11 @@ module.exports = require("string_decoder"); -var minimist = __webpack_require__(269); +var minimist = __webpack_require__(285); var path = __webpack_require__(4); -var Logger = __webpack_require__(264); -var pkg = __webpack_require__(270); +var Logger = __webpack_require__(280); +var pkg = __webpack_require__(286); module.exports = cli; @@ -26881,7 +29944,7 @@ function usage($0, p) { /***/ }), -/* 269 */ +/* 285 */ /***/ (function(module, exports) { module.exports = function (args, opts) { @@ -27123,29 +30186,29 @@ function isNumber (x) { /***/ }), -/* 270 */ +/* 286 */ /***/ (function(module) { module.exports = JSON.parse("{\"name\":\"strong-log-transformer\",\"version\":\"2.1.0\",\"description\":\"Stream transformer that prefixes lines with timestamps and other things.\",\"author\":\"Ryan Graham \",\"license\":\"Apache-2.0\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/strongloop/strong-log-transformer\"},\"keywords\":[\"logging\",\"streams\"],\"bugs\":{\"url\":\"https://github.com/strongloop/strong-log-transformer/issues\"},\"homepage\":\"https://github.com/strongloop/strong-log-transformer\",\"directories\":{\"test\":\"test\"},\"bin\":{\"sl-log-transformer\":\"bin/sl-log-transformer.js\"},\"main\":\"index.js\",\"scripts\":{\"test\":\"tap --100 test/test-*\"},\"dependencies\":{\"duplexer\":\"^0.1.1\",\"minimist\":\"^1.2.0\",\"through\":\"^2.3.4\"},\"devDependencies\":{\"tap\":\"^12.0.1\"},\"engines\":{\"node\":\">=4\"}}"); /***/ }), -/* 271 */ +/* 287 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "workspacePackagePaths", function() { return workspacePackagePaths; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyWorkspacePackages", function() { return copyWorkspacePackages; }); -/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(145); +/* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(146); /* harmony import */ var glob__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(glob__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(272); -/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(163); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(144); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(288); +/* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(130); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(164); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(145); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -27237,7 +30300,7 @@ function packagesFromGlobPattern({ } /***/ }), -/* 272 */ +/* 288 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -27307,21 +30370,21 @@ function getProjectPaths({ } /***/ }), -/* 273 */ +/* 289 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAllChecksums", function() { return getAllChecksums; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(274); +/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(290); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(228); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(244); /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(275); +/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(291); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -27550,21 +30613,21 @@ async function getAllChecksums(kbn, log) { } /***/ }), -/* 274 */ +/* 290 */ /***/ (function(module, exports) { module.exports = require("crypto"); /***/ }), -/* 275 */ +/* 291 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readYarnLock", function() { return readYarnLock; }); -/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(276); +/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(292); /* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(129); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(130); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -27606,7 +30669,7 @@ async function readYarnLock(kbn) { } /***/ }), -/* 276 */ +/* 292 */ /***/ (function(module, exports, __webpack_require__) { module.exports = @@ -27738,7 +30801,7 @@ module.exports = __webpack_require__(111); /* 3 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(132); +module.exports = __webpack_require__(133); /***/ }), /* 4 */ @@ -29165,7 +32228,7 @@ module.exports = invariant; /* 9 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(274); +module.exports = __webpack_require__(290); /***/ }), /* 10 */, @@ -29591,7 +32654,7 @@ exports.default = Lockfile; /* 17 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(136); +module.exports = __webpack_require__(137); /***/ }), /* 18 */, @@ -29643,7 +32706,7 @@ function nullify(obj = {}) { /* 22 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(138); +module.exports = __webpack_require__(139); /***/ }), /* 23 */ @@ -29830,7 +32893,7 @@ module.exports = {}; /* 36 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(121); +module.exports = __webpack_require__(120); /***/ }), /* 37 */, @@ -30115,7 +33178,7 @@ exports.f = __webpack_require__(33) ? Object.defineProperty : function definePro /* 54 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(154); +module.exports = __webpack_require__(155); /***/ }), /* 55 */ @@ -31489,7 +34552,7 @@ function onceStrict (fn) { /* 63 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(277); +module.exports = __webpack_require__(293); /***/ }), /* 64 */, @@ -32427,7 +35490,7 @@ module.exports.win32 = win32; /* 79 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(278); +module.exports = __webpack_require__(121); /***/ }), /* 80 */, @@ -37884,25 +40947,19 @@ module.exports = process && support(supportLevel); /******/ ]); /***/ }), -/* 277 */ +/* 293 */ /***/ (function(module, exports) { module.exports = require("buffer"); /***/ }), -/* 278 */ -/***/ (function(module, exports) { - -module.exports = require("tty"); - -/***/ }), -/* 279 */ +/* 294 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BootstrapCacheFile", function() { return BootstrapCacheFile; }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(132); +/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(133); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); @@ -37993,20 +41050,20 @@ class BootstrapCacheFile { } /***/ }), -/* 280 */ +/* 295 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CleanCommand", function() { return CleanCommand; }); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(281); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(296); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(373); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(388); /* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(129); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(142); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(130); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(143); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -38101,21 +41158,21 @@ const CleanCommand = { }; /***/ }), -/* 281 */ +/* 296 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); const path = __webpack_require__(4); -const globby = __webpack_require__(282); -const isGlob = __webpack_require__(365); -const slash = __webpack_require__(363); -const gracefulFs = __webpack_require__(131); -const isPathCwd = __webpack_require__(366); -const isPathInside = __webpack_require__(367); -const rimraf = __webpack_require__(368); -const pMap = __webpack_require__(369); +const globby = __webpack_require__(297); +const isGlob = __webpack_require__(380); +const slash = __webpack_require__(378); +const gracefulFs = __webpack_require__(132); +const isPathCwd = __webpack_require__(381); +const isPathInside = __webpack_require__(382); +const rimraf = __webpack_require__(383); +const pMap = __webpack_require__(384); const rimrafP = promisify(rimraf); @@ -38229,19 +41286,19 @@ module.exports.sync = (patterns, {force, dryRun, cwd = process.cwd(), ...options /***/ }), -/* 282 */ +/* 297 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const arrayUnion = __webpack_require__(283); -const merge2 = __webpack_require__(284); -const glob = __webpack_require__(285); -const fastGlob = __webpack_require__(290); -const dirGlob = __webpack_require__(359); -const gitignore = __webpack_require__(361); -const {FilterStream, UniqueStream} = __webpack_require__(364); +const fs = __webpack_require__(133); +const arrayUnion = __webpack_require__(298); +const merge2 = __webpack_require__(299); +const glob = __webpack_require__(300); +const fastGlob = __webpack_require__(305); +const dirGlob = __webpack_require__(374); +const gitignore = __webpack_require__(376); +const {FilterStream, UniqueStream} = __webpack_require__(379); const DEFAULT_FILTER = () => false; @@ -38414,7 +41471,7 @@ module.exports.gitignore = gitignore; /***/ }), -/* 283 */ +/* 298 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -38426,7 +41483,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 284 */ +/* 299 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -38438,7 +41495,7 @@ module.exports = (...arguments_) => { * Copyright (c) 2014-2020 Teambition * Licensed under the MIT license. */ -const Stream = __webpack_require__(136) +const Stream = __webpack_require__(137) const PassThrough = Stream.PassThrough const slice = Array.prototype.slice @@ -38577,7 +41634,7 @@ function pauseStreams (streams, options) { /***/ }), -/* 285 */ +/* 300 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -38622,27 +41679,27 @@ function pauseStreams (streams, options) { module.exports = glob -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(286) -var EE = __webpack_require__(154).EventEmitter +var inherits = __webpack_require__(301) +var EE = __webpack_require__(155).EventEmitter var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var globSync = __webpack_require__(288) -var common = __webpack_require__(289) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var globSync = __webpack_require__(303) +var common = __webpack_require__(304) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp -var inflight = __webpack_require__(158) +var inflight = __webpack_require__(159) var util = __webpack_require__(111) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(160) +var once = __webpack_require__(161) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -39373,7 +42430,7 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 286 */ +/* 301 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -39383,12 +42440,12 @@ try { module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(287); + module.exports = __webpack_require__(302); } /***/ }), -/* 287 */ +/* 302 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -39421,22 +42478,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 288 */ +/* 303 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(285).Glob +var Glob = __webpack_require__(300).Glob var util = __webpack_require__(111) var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var common = __webpack_require__(289) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var common = __webpack_require__(304) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -39913,7 +42970,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 289 */ +/* 304 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -39931,8 +42988,8 @@ function ownProp (obj, field) { } var path = __webpack_require__(4) -var minimatch = __webpack_require__(148) -var isAbsolute = __webpack_require__(155) +var minimatch = __webpack_require__(149) +var isAbsolute = __webpack_require__(156) var Minimatch = minimatch.Minimatch function alphasorti (a, b) { @@ -40159,17 +43216,17 @@ function childrenIgnored (self, path) { /***/ }), -/* 290 */ +/* 305 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const taskManager = __webpack_require__(291); -const async_1 = __webpack_require__(320); -const stream_1 = __webpack_require__(355); -const sync_1 = __webpack_require__(356); -const settings_1 = __webpack_require__(358); -const utils = __webpack_require__(292); +const taskManager = __webpack_require__(306); +const async_1 = __webpack_require__(335); +const stream_1 = __webpack_require__(370); +const sync_1 = __webpack_require__(371); +const settings_1 = __webpack_require__(373); +const utils = __webpack_require__(307); async function FastGlob(source, options) { assertPatternsInput(source); const works = getWorks(source, async_1.default, options); @@ -40233,13 +43290,13 @@ module.exports = FastGlob; /***/ }), -/* 291 */ +/* 306 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); function generate(patterns, settings) { const positivePatterns = getPositivePatterns(patterns); const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); @@ -40304,30 +43361,30 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 292 */ +/* 307 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const array = __webpack_require__(293); +const array = __webpack_require__(308); exports.array = array; -const errno = __webpack_require__(294); +const errno = __webpack_require__(309); exports.errno = errno; -const fs = __webpack_require__(295); +const fs = __webpack_require__(310); exports.fs = fs; -const path = __webpack_require__(296); +const path = __webpack_require__(311); exports.path = path; -const pattern = __webpack_require__(297); +const pattern = __webpack_require__(312); exports.pattern = pattern; -const stream = __webpack_require__(318); +const stream = __webpack_require__(333); exports.stream = stream; -const string = __webpack_require__(319); +const string = __webpack_require__(334); exports.string = string; /***/ }), -/* 293 */ +/* 308 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40355,7 +43412,7 @@ exports.splitWhen = splitWhen; /***/ }), -/* 294 */ +/* 309 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40368,7 +43425,7 @@ exports.isEnoentCodeError = isEnoentCodeError; /***/ }), -/* 295 */ +/* 310 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40393,7 +43450,7 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 296 */ +/* 311 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40432,16 +43489,16 @@ exports.removeLeadingDotSegment = removeLeadingDotSegment; /***/ }), -/* 297 */ +/* 312 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const globParent = __webpack_require__(298); -const micromatch = __webpack_require__(301); -const picomatch = __webpack_require__(312); +const globParent = __webpack_require__(313); +const micromatch = __webpack_require__(316); +const picomatch = __webpack_require__(327); const GLOBSTAR = '**'; const ESCAPE_SYMBOL = '\\'; const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; @@ -40551,15 +43608,15 @@ exports.matchAny = matchAny; /***/ }), -/* 298 */ +/* 313 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isGlob = __webpack_require__(299); +var isGlob = __webpack_require__(314); var pathPosixDirname = __webpack_require__(4).posix.dirname; -var isWin32 = __webpack_require__(121).platform() === 'win32'; +var isWin32 = __webpack_require__(120).platform() === 'win32'; var slash = '/'; var backslash = /\\/g; @@ -40599,7 +43656,7 @@ module.exports = function globParent(str, opts) { /***/ }), -/* 299 */ +/* 314 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -40609,7 +43666,7 @@ module.exports = function globParent(str, opts) { * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -40653,7 +43710,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 300 */ +/* 315 */ /***/ (function(module, exports) { /*! @@ -40679,16 +43736,16 @@ module.exports = function isExtglob(str) { /***/ }), -/* 301 */ +/* 316 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const util = __webpack_require__(111); -const braces = __webpack_require__(302); -const picomatch = __webpack_require__(312); -const utils = __webpack_require__(315); +const braces = __webpack_require__(317); +const picomatch = __webpack_require__(327); +const utils = __webpack_require__(330); const isEmptyString = val => typeof val === 'string' && (val === '' || val === './'); /** @@ -41153,16 +44210,16 @@ module.exports = micromatch; /***/ }), -/* 302 */ +/* 317 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(303); -const compile = __webpack_require__(305); -const expand = __webpack_require__(309); -const parse = __webpack_require__(310); +const stringify = __webpack_require__(318); +const compile = __webpack_require__(320); +const expand = __webpack_require__(324); +const parse = __webpack_require__(325); /** * Expand the given pattern or create a regex-compatible string. @@ -41330,13 +44387,13 @@ module.exports = braces; /***/ }), -/* 303 */ +/* 318 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(304); +const utils = __webpack_require__(319); module.exports = (ast, options = {}) => { let stringify = (node, parent = {}) => { @@ -41369,7 +44426,7 @@ module.exports = (ast, options = {}) => { /***/ }), -/* 304 */ +/* 319 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41488,14 +44545,14 @@ exports.flatten = (...args) => { /***/ }), -/* 305 */ +/* 320 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(306); -const utils = __webpack_require__(304); +const fill = __webpack_require__(321); +const utils = __webpack_require__(319); const compile = (ast, options = {}) => { let walk = (node, parent = {}) => { @@ -41552,7 +44609,7 @@ module.exports = compile; /***/ }), -/* 306 */ +/* 321 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41566,7 +44623,7 @@ module.exports = compile; const util = __webpack_require__(111); -const toRegexRange = __webpack_require__(307); +const toRegexRange = __webpack_require__(322); const isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); @@ -41808,7 +44865,7 @@ module.exports = fill; /***/ }), -/* 307 */ +/* 322 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41821,7 +44878,7 @@ module.exports = fill; -const isNumber = __webpack_require__(308); +const isNumber = __webpack_require__(323); const toRegexRange = (min, max, options) => { if (isNumber(min) === false) { @@ -42103,7 +45160,7 @@ module.exports = toRegexRange; /***/ }), -/* 308 */ +/* 323 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -42128,15 +45185,15 @@ module.exports = function(num) { /***/ }), -/* 309 */ +/* 324 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fill = __webpack_require__(306); -const stringify = __webpack_require__(303); -const utils = __webpack_require__(304); +const fill = __webpack_require__(321); +const stringify = __webpack_require__(318); +const utils = __webpack_require__(319); const append = (queue = '', stash = '', enclose = false) => { let result = []; @@ -42248,13 +45305,13 @@ module.exports = expand; /***/ }), -/* 310 */ +/* 325 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const stringify = __webpack_require__(303); +const stringify = __webpack_require__(318); /** * Constants @@ -42276,7 +45333,7 @@ const { CHAR_SINGLE_QUOTE, /* ' */ CHAR_NO_BREAK_SPACE, CHAR_ZERO_WIDTH_NOBREAK_SPACE -} = __webpack_require__(311); +} = __webpack_require__(326); /** * parse @@ -42588,7 +45645,7 @@ module.exports = parse; /***/ }), -/* 311 */ +/* 326 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -42652,27 +45709,27 @@ module.exports = { /***/ }), -/* 312 */ +/* 327 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(313); +module.exports = __webpack_require__(328); /***/ }), -/* 313 */ +/* 328 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const scan = __webpack_require__(314); -const parse = __webpack_require__(317); -const utils = __webpack_require__(315); -const constants = __webpack_require__(316); +const scan = __webpack_require__(329); +const parse = __webpack_require__(332); +const utils = __webpack_require__(330); +const constants = __webpack_require__(331); const isObject = val => val && typeof val === 'object' && !Array.isArray(val); /** @@ -43008,13 +46065,13 @@ module.exports = picomatch; /***/ }), -/* 314 */ +/* 329 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(315); +const utils = __webpack_require__(330); const { CHAR_ASTERISK, /* * */ CHAR_AT, /* @ */ @@ -43031,7 +46088,7 @@ const { CHAR_RIGHT_CURLY_BRACE, /* } */ CHAR_RIGHT_PARENTHESES, /* ) */ CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(316); +} = __webpack_require__(331); const isPathSeparator = code => { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; @@ -43398,7 +46455,7 @@ module.exports = scan; /***/ }), -/* 315 */ +/* 330 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -43411,7 +46468,7 @@ const { REGEX_REMOVE_BACKSLASH, REGEX_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_GLOBAL -} = __webpack_require__(316); +} = __webpack_require__(331); exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); @@ -43469,7 +46526,7 @@ exports.wrapOutput = (input, state = {}, options = {}) => { /***/ }), -/* 316 */ +/* 331 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -43655,14 +46712,14 @@ module.exports = { /***/ }), -/* 317 */ +/* 332 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const constants = __webpack_require__(316); -const utils = __webpack_require__(315); +const constants = __webpack_require__(331); +const utils = __webpack_require__(330); /** * Constants @@ -44740,13 +47797,13 @@ module.exports = parse; /***/ }), -/* 318 */ +/* 333 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const merge2 = __webpack_require__(284); +const merge2 = __webpack_require__(299); function merge(streams) { const mergedStream = merge2(streams); streams.forEach((stream) => { @@ -44763,7 +47820,7 @@ function propagateCloseEventToSources(streams) { /***/ }), -/* 319 */ +/* 334 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -44780,14 +47837,14 @@ exports.isEmpty = isEmpty; /***/ }), -/* 320 */ +/* 335 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(321); -const provider_1 = __webpack_require__(348); +const stream_1 = __webpack_require__(336); +const provider_1 = __webpack_require__(363); class ProviderAsync extends provider_1.default { constructor() { super(...arguments); @@ -44815,16 +47872,16 @@ exports.default = ProviderAsync; /***/ }), -/* 321 */ +/* 336 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(136); -const fsStat = __webpack_require__(322); -const fsWalk = __webpack_require__(327); -const reader_1 = __webpack_require__(347); +const stream_1 = __webpack_require__(137); +const fsStat = __webpack_require__(337); +const fsWalk = __webpack_require__(342); +const reader_1 = __webpack_require__(362); class ReaderStream extends reader_1.default { constructor() { super(...arguments); @@ -44877,15 +47934,15 @@ exports.default = ReaderStream; /***/ }), -/* 322 */ +/* 337 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(323); -const sync = __webpack_require__(324); -const settings_1 = __webpack_require__(325); +const async = __webpack_require__(338); +const sync = __webpack_require__(339); +const settings_1 = __webpack_require__(340); exports.Settings = settings_1.default; function stat(path, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -44908,7 +47965,7 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 323 */ +/* 338 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -44946,7 +48003,7 @@ function callSuccessCallback(callback, result) { /***/ }), -/* 324 */ +/* 339 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -44975,13 +48032,13 @@ exports.read = read; /***/ }), -/* 325 */ +/* 340 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(326); +const fs = __webpack_require__(341); class Settings { constructor(_options = {}) { this._options = _options; @@ -44998,13 +48055,13 @@ exports.default = Settings; /***/ }), -/* 326 */ +/* 341 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -45021,16 +48078,16 @@ exports.createFileSystemAdapter = createFileSystemAdapter; /***/ }), -/* 327 */ +/* 342 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(328); -const stream_1 = __webpack_require__(343); -const sync_1 = __webpack_require__(344); -const settings_1 = __webpack_require__(346); +const async_1 = __webpack_require__(343); +const stream_1 = __webpack_require__(358); +const sync_1 = __webpack_require__(359); +const settings_1 = __webpack_require__(361); exports.Settings = settings_1.default; function walk(directory, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -45060,13 +48117,13 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 328 */ +/* 343 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(329); +const async_1 = __webpack_require__(344); class AsyncProvider { constructor(_root, _settings) { this._root = _root; @@ -45097,17 +48154,17 @@ function callSuccessCallback(callback, entries) { /***/ }), -/* 329 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(154); -const fsScandir = __webpack_require__(330); -const fastq = __webpack_require__(339); -const common = __webpack_require__(341); -const reader_1 = __webpack_require__(342); +const events_1 = __webpack_require__(155); +const fsScandir = __webpack_require__(345); +const fastq = __webpack_require__(354); +const common = __webpack_require__(356); +const reader_1 = __webpack_require__(357); class AsyncReader extends reader_1.default { constructor(_root, _settings) { super(_root, _settings); @@ -45197,15 +48254,15 @@ exports.default = AsyncReader; /***/ }), -/* 330 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(331); -const sync = __webpack_require__(336); -const settings_1 = __webpack_require__(337); +const async = __webpack_require__(346); +const sync = __webpack_require__(351); +const settings_1 = __webpack_require__(352); exports.Settings = settings_1.default; function scandir(path, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -45228,16 +48285,16 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 331 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(322); -const rpl = __webpack_require__(332); -const constants_1 = __webpack_require__(333); -const utils = __webpack_require__(334); +const fsStat = __webpack_require__(337); +const rpl = __webpack_require__(347); +const constants_1 = __webpack_require__(348); +const utils = __webpack_require__(349); function read(directory, settings, callback) { if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { return readdirWithFileTypes(directory, settings, callback); @@ -45325,7 +48382,7 @@ function callSuccessCallback(callback, result) { /***/ }), -/* 332 */ +/* 347 */ /***/ (function(module, exports) { module.exports = runParallel @@ -45379,7 +48436,7 @@ function runParallel (tasks, cb) { /***/ }), -/* 333 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45399,18 +48456,18 @@ exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_B /***/ }), -/* 334 */ +/* 349 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(335); +const fs = __webpack_require__(350); exports.fs = fs; /***/ }), -/* 335 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45435,15 +48492,15 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 336 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(322); -const constants_1 = __webpack_require__(333); -const utils = __webpack_require__(334); +const fsStat = __webpack_require__(337); +const constants_1 = __webpack_require__(348); +const utils = __webpack_require__(349); function read(directory, settings) { if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { return readdirWithFileTypes(directory, settings); @@ -45494,15 +48551,15 @@ exports.readdir = readdir; /***/ }), -/* 337 */ +/* 352 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsStat = __webpack_require__(322); -const fs = __webpack_require__(338); +const fsStat = __webpack_require__(337); +const fs = __webpack_require__(353); class Settings { constructor(_options = {}) { this._options = _options; @@ -45525,13 +48582,13 @@ exports.default = Settings; /***/ }), -/* 338 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -45550,13 +48607,13 @@ exports.createFileSystemAdapter = createFileSystemAdapter; /***/ }), -/* 339 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var reusify = __webpack_require__(340) +var reusify = __webpack_require__(355) function fastqueue (context, worker, concurrency) { if (typeof context === 'function') { @@ -45730,7 +48787,7 @@ module.exports = fastqueue /***/ }), -/* 340 */ +/* 355 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45770,7 +48827,7 @@ module.exports = reusify /***/ }), -/* 341 */ +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -45801,13 +48858,13 @@ exports.joinPathSegments = joinPathSegments; /***/ }), -/* 342 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(341); +const common = __webpack_require__(356); class Reader { constructor(_root, _settings) { this._root = _root; @@ -45819,14 +48876,14 @@ exports.default = Reader; /***/ }), -/* 343 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(136); -const async_1 = __webpack_require__(329); +const stream_1 = __webpack_require__(137); +const async_1 = __webpack_require__(344); class StreamProvider { constructor(_root, _settings) { this._root = _root; @@ -45856,13 +48913,13 @@ exports.default = StreamProvider; /***/ }), -/* 344 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(345); +const sync_1 = __webpack_require__(360); class SyncProvider { constructor(_root, _settings) { this._root = _root; @@ -45877,15 +48934,15 @@ exports.default = SyncProvider; /***/ }), -/* 345 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(330); -const common = __webpack_require__(341); -const reader_1 = __webpack_require__(342); +const fsScandir = __webpack_require__(345); +const common = __webpack_require__(356); +const reader_1 = __webpack_require__(357); class SyncReader extends reader_1.default { constructor() { super(...arguments); @@ -45943,14 +49000,14 @@ exports.default = SyncReader; /***/ }), -/* 346 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsScandir = __webpack_require__(330); +const fsScandir = __webpack_require__(345); class Settings { constructor(_options = {}) { this._options = _options; @@ -45976,15 +49033,15 @@ exports.default = Settings; /***/ }), -/* 347 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsStat = __webpack_require__(322); -const utils = __webpack_require__(292); +const fsStat = __webpack_require__(337); +const utils = __webpack_require__(307); class Reader { constructor(_settings) { this._settings = _settings; @@ -46016,17 +49073,17 @@ exports.default = Reader; /***/ }), -/* 348 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const deep_1 = __webpack_require__(349); -const entry_1 = __webpack_require__(352); -const error_1 = __webpack_require__(353); -const entry_2 = __webpack_require__(354); +const deep_1 = __webpack_require__(364); +const entry_1 = __webpack_require__(367); +const error_1 = __webpack_require__(368); +const entry_2 = __webpack_require__(369); class Provider { constructor(_settings) { this._settings = _settings; @@ -46071,14 +49128,14 @@ exports.default = Provider; /***/ }), -/* 349 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); -const partial_1 = __webpack_require__(350); +const utils = __webpack_require__(307); +const partial_1 = __webpack_require__(365); class DeepFilter { constructor(_settings, _micromatchOptions) { this._settings = _settings; @@ -46132,13 +49189,13 @@ exports.default = DeepFilter; /***/ }), -/* 350 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const matcher_1 = __webpack_require__(351); +const matcher_1 = __webpack_require__(366); class PartialMatcher extends matcher_1.default { match(filepath) { const parts = filepath.split('/'); @@ -46177,13 +49234,13 @@ exports.default = PartialMatcher; /***/ }), -/* 351 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class Matcher { constructor(_patterns, _settings, _micromatchOptions) { this._patterns = _patterns; @@ -46234,13 +49291,13 @@ exports.default = Matcher; /***/ }), -/* 352 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class EntryFilter { constructor(_settings, _micromatchOptions) { this._settings = _settings; @@ -46296,13 +49353,13 @@ exports.default = EntryFilter; /***/ }), -/* 353 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class ErrorFilter { constructor(_settings) { this._settings = _settings; @@ -46318,13 +49375,13 @@ exports.default = ErrorFilter; /***/ }), -/* 354 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(292); +const utils = __webpack_require__(307); class EntryTransformer { constructor(_settings) { this._settings = _settings; @@ -46351,15 +49408,15 @@ exports.default = EntryTransformer; /***/ }), -/* 355 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(136); -const stream_2 = __webpack_require__(321); -const provider_1 = __webpack_require__(348); +const stream_1 = __webpack_require__(137); +const stream_2 = __webpack_require__(336); +const provider_1 = __webpack_require__(363); class ProviderStream extends provider_1.default { constructor() { super(...arguments); @@ -46389,14 +49446,14 @@ exports.default = ProviderStream; /***/ }), -/* 356 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(357); -const provider_1 = __webpack_require__(348); +const sync_1 = __webpack_require__(372); +const provider_1 = __webpack_require__(363); class ProviderSync extends provider_1.default { constructor() { super(...arguments); @@ -46419,15 +49476,15 @@ exports.default = ProviderSync; /***/ }), -/* 357 */ +/* 372 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(322); -const fsWalk = __webpack_require__(327); -const reader_1 = __webpack_require__(347); +const fsStat = __webpack_require__(337); +const fsWalk = __webpack_require__(342); +const reader_1 = __webpack_require__(362); class ReaderSync extends reader_1.default { constructor() { super(...arguments); @@ -46469,14 +49526,14 @@ exports.default = ReaderSync; /***/ }), -/* 358 */ +/* 373 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); -const os = __webpack_require__(121); +const fs = __webpack_require__(133); +const os = __webpack_require__(120); const CPU_COUNT = os.cpus().length; exports.DEFAULT_FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, @@ -46528,13 +49585,13 @@ exports.default = Settings; /***/ }), -/* 359 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(360); +const pathType = __webpack_require__(375); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -46610,13 +49667,13 @@ module.exports.sync = (input, options) => { /***/ }), -/* 360 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); async function isType(fsStatType, statsMethodName, filePath) { if (typeof filePath !== 'string') { @@ -46660,17 +49717,17 @@ exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 361 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(290); -const gitIgnore = __webpack_require__(362); -const slash = __webpack_require__(363); +const fastGlob = __webpack_require__(305); +const gitIgnore = __webpack_require__(377); +const slash = __webpack_require__(378); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -46784,7 +49841,7 @@ module.exports.sync = options => { /***/ }), -/* 362 */ +/* 377 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -47387,7 +50444,7 @@ if ( /***/ }), -/* 363 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47405,12 +50462,12 @@ module.exports = path => { /***/ }), -/* 364 */ +/* 379 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const {Transform} = __webpack_require__(136); +const {Transform} = __webpack_require__(137); class ObjectTransform extends Transform { constructor() { @@ -47458,7 +50515,7 @@ module.exports = { /***/ }), -/* 365 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -47468,7 +50525,7 @@ module.exports = { * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -47512,7 +50569,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 366 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47534,7 +50591,7 @@ module.exports = path_ => { /***/ }), -/* 367 */ +/* 382 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -47562,15 +50619,15 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 368 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { -const assert = __webpack_require__(138) +const assert = __webpack_require__(139) const path = __webpack_require__(4) -const fs = __webpack_require__(132) +const fs = __webpack_require__(133) let glob = undefined try { - glob = __webpack_require__(285) + glob = __webpack_require__(300) } catch (_err) { // treat glob as optional. } @@ -47936,12 +50993,12 @@ rimraf.sync = rimrafSync /***/ }), -/* 369 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const AggregateError = __webpack_require__(370); +const AggregateError = __webpack_require__(385); module.exports = async ( iterable, @@ -48024,13 +51081,13 @@ module.exports = async ( /***/ }), -/* 370 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const indentString = __webpack_require__(371); -const cleanStack = __webpack_require__(372); +const indentString = __webpack_require__(386); +const cleanStack = __webpack_require__(387); const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); @@ -48078,7 +51135,7 @@ module.exports = AggregateError; /***/ }), -/* 371 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -48120,12 +51177,12 @@ module.exports = (string, count = 1, options) => { /***/ }), -/* 372 */ +/* 387 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(121); +const os = __webpack_require__(120); const extractPathRegex = /\s+at.*(?:\(|\s)(.*)\)?/; const pathRegex = /^(?:(?:(?:node|(?:internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)\.js:\d+:\d+)|native)/; @@ -48167,15 +51224,15 @@ module.exports = (stack, options) => { /***/ }), -/* 373 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(374); -const cliCursor = __webpack_require__(378); -const cliSpinners = __webpack_require__(382); -const logSymbols = __webpack_require__(384); +const chalk = __webpack_require__(389); +const cliCursor = __webpack_require__(392); +const cliSpinners = __webpack_require__(396); +const logSymbols = __webpack_require__(398); class Ora { constructor(options) { @@ -48322,16 +51379,16 @@ module.exports.promise = (action, options) => { /***/ }), -/* 374 */ +/* 389 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(375); -const stdoutColor = __webpack_require__(376).stdout; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(390); +const stdoutColor = __webpack_require__(184).stdout; -const template = __webpack_require__(377); +const template = __webpack_require__(391); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -48557,12 +51614,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 375 */ +/* 390 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); +const colorConvert = __webpack_require__(180); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -48727,152 +51784,10 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) - -/***/ }), -/* 376 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(121); -const hasFlag = __webpack_require__(122); - -const env = process.env; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } - - const min = forceColor ? 1 : 0; - - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } - - if (env.TERM === 'dumb') { - return min; - } - - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; - +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 377 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49007,12 +51922,12 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 378 */ +/* 392 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const restoreCursor = __webpack_require__(379); +const restoreCursor = __webpack_require__(393); let hidden = false; @@ -49053,13 +51968,13 @@ exports.toggle = (force, stream) => { /***/ }), -/* 379 */ +/* 393 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const onetime = __webpack_require__(380); -const signalExit = __webpack_require__(218); +const onetime = __webpack_require__(394); +const signalExit = __webpack_require__(225); module.exports = onetime(() => { signalExit(() => { @@ -49069,12 +51984,12 @@ module.exports = onetime(() => { /***/ }), -/* 380 */ +/* 394 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const mimicFn = __webpack_require__(381); +const mimicFn = __webpack_require__(395); module.exports = (fn, opts) => { // TODO: Remove this in v3 @@ -49115,7 +52030,7 @@ module.exports = (fn, opts) => { /***/ }), -/* 381 */ +/* 395 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49131,27 +52046,27 @@ module.exports = (to, from) => { /***/ }), -/* 382 */ +/* 396 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(383); +module.exports = __webpack_require__(397); /***/ }), -/* 383 */ +/* 397 */ /***/ (function(module) { module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]}}"); /***/ }), -/* 384 */ +/* 398 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(385); +const chalk = __webpack_require__(399); const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; @@ -49173,16 +52088,16 @@ module.exports = isSupported ? main : fallbacks; /***/ }), -/* 385 */ +/* 399 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(113); -const ansiStyles = __webpack_require__(386); -const stdoutColor = __webpack_require__(387).stdout; +const escapeStringRegexp = __webpack_require__(178); +const ansiStyles = __webpack_require__(400); +const stdoutColor = __webpack_require__(184).stdout; -const template = __webpack_require__(388); +const template = __webpack_require__(401); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -49408,12 +52323,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 386 */ +/* 400 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(116); +const colorConvert = __webpack_require__(180); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -49578,152 +52493,10 @@ Object.defineProperty(module, 'exports', { get: assembleStyles }); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)(module))) +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(114)(module))) /***/ }), -/* 387 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(121); -const hasFlag = __webpack_require__(122); - -const env = process.env; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - // VS code debugger doesn't have isTTY set - if (env.VSCODE_PID) { - return 1; - } - return 0; - } - - const min = forceColor ? 1 : 0; - - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - - if (env.COLORTERM === 'truecolor') { - return 3; - } - - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); - - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - - if ('COLORTERM' in env) { - return 1; - } - - if (env.TERM === 'dumb') { - return min; - } - - return min; -} - -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); -} - -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; - - -/***/ }), -/* 388 */ +/* 401 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -49858,16 +52631,16 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 389 */ +/* 402 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(161); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -49919,17 +52692,17 @@ const RunCommand = { }; /***/ }), -/* 390 */ +/* 403 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(161); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(143); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); -/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(391); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _utils_watch__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(404); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -50014,14 +52787,14 @@ const WatchCommand = { }; /***/ }), -/* 391 */ +/* 404 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); /* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(392); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(405); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -50088,141 +52861,141 @@ function waitUntilWatchIsReady(stream, opts = {}) { } /***/ }), -/* 392 */ +/* 405 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(393); +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(406); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); -/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(394); +/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(407); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); -/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(395); +/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(408); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); -/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(396); +/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); -/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(397); +/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(410); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); -/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(398); +/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(411); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); -/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(399); +/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(412); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); -/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(400); +/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(413); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); -/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(401); +/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(414); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); -/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(402); +/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(415); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); -/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(403); +/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(416); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); /* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(80); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); -/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(404); +/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(417); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); -/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(405); +/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(418); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); -/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(406); +/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(419); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(407); +/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(420); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); -/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(408); +/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(421); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(409); +/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(422); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); -/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(410); +/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(423); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); -/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(412); +/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(425); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(413); +/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(426); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); -/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(414); +/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(427); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(415); +/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(428); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); -/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(416); +/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(429); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); -/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(417); +/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(430); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); -/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(420); +/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(433); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(421); +/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(434); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); -/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(422); +/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(435); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); -/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(423); +/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(436); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(424); +/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(437); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); /* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(104); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(425); +/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(438); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); -/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(426); +/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(439); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); -/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(427); +/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(440); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(428); +/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(441); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); /* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(31); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); -/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(429); +/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(442); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); -/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(430); +/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(443); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); -/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(431); +/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(444); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); /* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(66); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); -/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(433); +/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(446); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(434); +/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(447); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); -/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(435); +/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(448); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); -/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(438); +/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(451); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); /* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(81); @@ -50233,175 +53006,175 @@ __webpack_require__.r(__webpack_exports__); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(439); +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(452); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(440); +/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(453); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(441); +/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(454); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(442); +/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(455); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); /* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(41); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(443); +/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(456); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(444); +/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(457); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(445); +/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(458); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(446); +/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(459); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(447); +/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(460); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(448); +/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(461); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(449); +/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(462); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(450); +/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(463); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(451); +/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(464); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(436); +/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(449); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(452); +/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(465); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(453); +/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(466); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(454); +/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(467); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(455); +/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(468); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); /* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(30); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(456); +/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(469); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(457); +/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(470); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(437); +/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(450); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(458); +/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(471); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(459); +/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(472); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(460); +/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(473); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(461); +/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(474); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(462); +/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(475); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(463); +/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(476); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(464); +/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(477); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(465); +/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(478); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(466); +/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(479); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(467); +/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(480); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(469); +/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(482); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(470); +/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(483); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(471); +/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(484); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(419); +/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(432); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(432); +/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(445); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(472); +/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(485); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(473); +/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(486); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(474); +/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(487); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(475); +/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(488); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(476); +/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(489); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(418); +/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(431); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(477); +/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(490); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(478); +/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(491); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(479); +/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(492); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(480); +/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(493); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(481); +/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(494); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(482); +/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(495); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(483); +/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(496); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(484); +/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(497); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(485); +/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(498); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(486); +/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(499); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(487); +/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(500); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(488); +/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(501); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(489); +/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(502); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ @@ -50513,7 +53286,7 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 393 */ +/* 406 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50594,14 +53367,14 @@ var AuditSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 394 */ +/* 407 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(393); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(406); /* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107); /** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ @@ -50617,7 +53390,7 @@ function auditTime(duration, scheduler) { /***/ }), -/* 395 */ +/* 408 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50666,7 +53439,7 @@ var BufferSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 396 */ +/* 409 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50767,7 +53540,7 @@ var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 397 */ +/* 410 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -50928,7 +53701,7 @@ function dispatchBufferClose(arg) { /***/ }), -/* 398 */ +/* 411 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51048,7 +53821,7 @@ var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 399 */ +/* 412 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51143,7 +53916,7 @@ var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 400 */ +/* 413 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51207,7 +53980,7 @@ var CatchSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 401 */ +/* 414 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51223,7 +53996,7 @@ function combineAll(project) { /***/ }), -/* 402 */ +/* 415 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51255,7 +54028,7 @@ function combineLatest() { /***/ }), -/* 403 */ +/* 416 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51275,7 +54048,7 @@ function concat() { /***/ }), -/* 404 */ +/* 417 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51291,13 +54064,13 @@ function concatMap(project, resultSelector) { /***/ }), -/* 405 */ +/* 418 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); -/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(404); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(417); /** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ function concatMapTo(innerObservable, resultSelector) { @@ -51307,7 +54080,7 @@ function concatMapTo(innerObservable, resultSelector) { /***/ }), -/* 406 */ +/* 419 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51372,7 +54145,7 @@ var CountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 407 */ +/* 420 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51460,7 +54233,7 @@ var DebounceSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 408 */ +/* 421 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51536,7 +54309,7 @@ function dispatchNext(subscriber) { /***/ }), -/* 409 */ +/* 422 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51586,7 +54359,7 @@ var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 410 */ +/* 423 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51594,7 +54367,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(411); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11); /* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(42); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ @@ -51693,7 +54466,7 @@ var DelayMessage = /*@__PURE__*/ (function () { /***/ }), -/* 411 */ +/* 424 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51707,7 +54480,7 @@ function isDate(value) { /***/ }), -/* 412 */ +/* 425 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51853,7 +54626,7 @@ var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 413 */ +/* 426 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51891,7 +54664,7 @@ var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 414 */ +/* 427 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -51969,7 +54742,7 @@ var DistinctSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 415 */ +/* 428 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52040,13 +54813,13 @@ var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 416 */ +/* 429 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); -/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(415); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(428); /** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ function distinctUntilKeyChanged(key, compare) { @@ -52056,7 +54829,7 @@ function distinctUntilKeyChanged(key, compare) { /***/ }), -/* 417 */ +/* 430 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52064,9 +54837,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); /* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(418); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(419); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(431); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(422); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(432); /** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ @@ -52088,7 +54861,7 @@ function elementAt(index, defaultValue) { /***/ }), -/* 418 */ +/* 431 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52154,7 +54927,7 @@ function defaultErrorFactory() { /***/ }), -/* 419 */ +/* 432 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52216,7 +54989,7 @@ var TakeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 420 */ +/* 433 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52238,7 +55011,7 @@ function endWith() { /***/ }), -/* 421 */ +/* 434 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52300,7 +55073,7 @@ var EverySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 422 */ +/* 435 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52357,7 +55130,7 @@ var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 423 */ +/* 436 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52457,7 +55230,7 @@ var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 424 */ +/* 437 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52576,7 +55349,7 @@ var ExpandSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 425 */ +/* 438 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52614,7 +55387,7 @@ var FinallySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 426 */ +/* 439 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52686,13 +55459,13 @@ var FindValueSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 427 */ +/* 440 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); -/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(426); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(439); /** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ function findIndex(predicate, thisArg) { @@ -52702,7 +55475,7 @@ function findIndex(predicate, thisArg) { /***/ }), -/* 428 */ +/* 441 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52710,9 +55483,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); /* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(419); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(409); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(418); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(432); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(422); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(431); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); /** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -52729,7 +55502,7 @@ function first(predicate, defaultValue) { /***/ }), -/* 429 */ +/* 442 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52766,7 +55539,7 @@ var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 430 */ +/* 443 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52810,7 +55583,7 @@ var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 431 */ +/* 444 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52818,9 +55591,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); /* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(104); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(432); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(418); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(409); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(445); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(431); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(422); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(25); /** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -52837,7 +55610,7 @@ function last(predicate, defaultValue) { /***/ }), -/* 432 */ +/* 445 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52914,7 +55687,7 @@ var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 433 */ +/* 446 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -52953,7 +55726,7 @@ var MapToSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 434 */ +/* 447 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53003,13 +55776,13 @@ var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 435 */ +/* 448 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(436); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function max(comparer) { @@ -53022,15 +55795,15 @@ function max(comparer) { /***/ }), -/* 436 */ +/* 449 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(437); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(432); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(409); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(450); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(445); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(422); /* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24); /** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ @@ -53051,7 +55824,7 @@ function reduce(accumulator, seed) { /***/ }), -/* 437 */ +/* 450 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53133,7 +55906,7 @@ var ScanSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 438 */ +/* 451 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53153,7 +55926,7 @@ function merge() { /***/ }), -/* 439 */ +/* 452 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53178,7 +55951,7 @@ function mergeMapTo(innerObservable, resultSelector, concurrent) { /***/ }), -/* 440 */ +/* 453 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53293,13 +56066,13 @@ var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 441 */ +/* 454 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(436); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function min(comparer) { @@ -53312,7 +56085,7 @@ function min(comparer) { /***/ }), -/* 442 */ +/* 455 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53361,7 +56134,7 @@ var MulticastOperator = /*@__PURE__*/ (function () { /***/ }), -/* 443 */ +/* 456 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53455,7 +56228,7 @@ var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 444 */ +/* 457 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53503,7 +56276,7 @@ var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 445 */ +/* 458 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53526,7 +56299,7 @@ function partition(predicate, thisArg) { /***/ }), -/* 446 */ +/* 459 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53566,14 +56339,14 @@ function plucker(props, length) { /***/ }), -/* 447 */ +/* 460 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); /* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(27); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ @@ -53586,14 +56359,14 @@ function publish(selector) { /***/ }), -/* 448 */ +/* 461 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); /* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(32); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ @@ -53604,14 +56377,14 @@ function publishBehavior(value) { /***/ }), -/* 449 */ +/* 462 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); /* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(50); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ @@ -53622,14 +56395,14 @@ function publishLast() { /***/ }), -/* 450 */ +/* 463 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); /* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(455); /** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ @@ -53645,7 +56418,7 @@ function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { /***/ }), -/* 451 */ +/* 464 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53672,7 +56445,7 @@ function race() { /***/ }), -/* 452 */ +/* 465 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53737,7 +56510,7 @@ var RepeatSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 453 */ +/* 466 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53833,7 +56606,7 @@ var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 454 */ +/* 467 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53886,7 +56659,7 @@ var RetrySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 455 */ +/* 468 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -53974,7 +56747,7 @@ var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 456 */ +/* 469 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54031,7 +56804,7 @@ var SampleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 457 */ +/* 470 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54091,7 +56864,7 @@ function dispatchNotification(state) { /***/ }), -/* 458 */ +/* 471 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54214,13 +56987,13 @@ var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 459 */ +/* 472 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(442); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(455); /* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); /* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); /** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ @@ -54237,7 +57010,7 @@ function share() { /***/ }), -/* 460 */ +/* 473 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54302,7 +57075,7 @@ function shareReplayOperator(_a) { /***/ }), -/* 461 */ +/* 474 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54382,7 +57155,7 @@ var SingleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 462 */ +/* 475 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54424,7 +57197,7 @@ var SkipSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 463 */ +/* 476 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54486,7 +57259,7 @@ var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 464 */ +/* 477 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54547,7 +57320,7 @@ var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 465 */ +/* 478 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54603,7 +57376,7 @@ var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 466 */ +/* 479 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54632,13 +57405,13 @@ function startWith() { /***/ }), -/* 467 */ +/* 480 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); -/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(468); +/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(481); /** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ function subscribeOn(scheduler, delay) { @@ -54663,7 +57436,7 @@ var SubscribeOnOperator = /*@__PURE__*/ (function () { /***/ }), -/* 468 */ +/* 481 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54727,13 +57500,13 @@ var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { /***/ }), -/* 469 */ +/* 482 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(483); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); /** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ @@ -54745,7 +57518,7 @@ function switchAll() { /***/ }), -/* 470 */ +/* 483 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54839,13 +57612,13 @@ var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 471 */ +/* 484 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(483); /** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ function switchMapTo(innerObservable, resultSelector) { @@ -54855,7 +57628,7 @@ function switchMapTo(innerObservable, resultSelector) { /***/ }), -/* 472 */ +/* 485 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54905,7 +57678,7 @@ var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 473 */ +/* 486 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54973,7 +57746,7 @@ var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 474 */ +/* 487 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55061,7 +57834,7 @@ var TapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 475 */ +/* 488 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55165,7 +57938,7 @@ var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 476 */ +/* 489 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55174,7 +57947,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(55); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(475); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(488); /** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ @@ -55263,7 +58036,7 @@ function dispatchNext(arg) { /***/ }), -/* 477 */ +/* 490 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55271,7 +58044,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(437); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(450); /* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(90); /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(66); /** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ @@ -55307,7 +58080,7 @@ var TimeInterval = /*@__PURE__*/ (function () { /***/ }), -/* 478 */ +/* 491 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55315,7 +58088,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(55); /* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(479); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(492); /* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(49); /** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ @@ -55332,7 +58105,7 @@ function timeout(due, scheduler) { /***/ }), -/* 479 */ +/* 492 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55340,7 +58113,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(411); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); /* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); /* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ @@ -55414,7 +58187,7 @@ var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 480 */ +/* 493 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55444,13 +58217,13 @@ var Timestamp = /*@__PURE__*/ (function () { /***/ }), -/* 481 */ +/* 494 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(436); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function toArrayReducer(arr, item, index) { @@ -55467,7 +58240,7 @@ function toArray() { /***/ }), -/* 482 */ +/* 495 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55547,7 +58320,7 @@ var WindowSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 483 */ +/* 496 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55637,7 +58410,7 @@ var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 484 */ +/* 497 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55807,7 +58580,7 @@ function dispatchWindowClose(state) { /***/ }), -/* 485 */ +/* 498 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55950,7 +58723,7 @@ var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 486 */ +/* 499 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56047,7 +58820,7 @@ var WindowSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 487 */ +/* 500 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56142,7 +58915,7 @@ var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 488 */ +/* 501 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56164,7 +58937,7 @@ function zip() { /***/ }), -/* 489 */ +/* 502 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56180,17 +58953,17 @@ function zipAll(project) { /***/ }), -/* 490 */ +/* 503 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(161); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(142); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(491); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(492); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(162); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(143); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(145); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(504); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(505); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -56272,13 +59045,13 @@ function toArray(value) { } /***/ }), -/* 491 */ +/* 504 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderProjectsTree", function() { return renderProjectsTree; }); -/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(112); +/* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); @@ -56425,7 +59198,7 @@ function addProjectToTree(tree, pathParts, project) { } /***/ }), -/* 492 */ +/* 505 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56433,12 +59206,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Kibana", function() { return Kibana; }); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(493); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(506); /* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(497); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(510); /* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(272); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(145); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(288); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -56579,15 +59352,15 @@ class Kibana { } /***/ }), -/* 493 */ +/* 506 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const minimatch = __webpack_require__(148); -const arrayUnion = __webpack_require__(494); -const arrayDiffer = __webpack_require__(495); -const arrify = __webpack_require__(496); +const minimatch = __webpack_require__(149); +const arrayUnion = __webpack_require__(507); +const arrayDiffer = __webpack_require__(508); +const arrify = __webpack_require__(509); module.exports = (list, patterns, options = {}) => { list = arrify(list); @@ -56611,7 +59384,7 @@ module.exports = (list, patterns, options = {}) => { /***/ }), -/* 494 */ +/* 507 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56623,7 +59396,7 @@ module.exports = (...arguments_) => { /***/ }), -/* 495 */ +/* 508 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56638,7 +59411,7 @@ module.exports = arrayDiffer; /***/ }), -/* 496 */ +/* 509 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56668,7 +59441,7 @@ module.exports = arrify; /***/ }), -/* 497 */ +/* 510 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -56696,15 +59469,15 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 498 */ +/* 511 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(499); +/* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(512); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(735); +/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(748); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); /* @@ -56729,23 +59502,23 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 499 */ +/* 512 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return buildProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(500); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(513); /* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(281); +/* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(296); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(272); -/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129); -/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(142); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(163); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(144); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(288); +/* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(130); +/* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(143); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(145); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -56877,21 +59650,21 @@ async function copyToBuild(project, kibanaRoot, buildRoot) { } /***/ }), -/* 500 */ +/* 513 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(154); +const EventEmitter = __webpack_require__(155); const path = __webpack_require__(4); -const os = __webpack_require__(121); -const pAll = __webpack_require__(501); -const arrify = __webpack_require__(503); -const globby = __webpack_require__(504); -const isGlob = __webpack_require__(719); -const cpFile = __webpack_require__(720); -const junk = __webpack_require__(732); -const CpyError = __webpack_require__(733); +const os = __webpack_require__(120); +const pAll = __webpack_require__(514); +const arrify = __webpack_require__(516); +const globby = __webpack_require__(517); +const isGlob = __webpack_require__(732); +const cpFile = __webpack_require__(733); +const junk = __webpack_require__(745); +const CpyError = __webpack_require__(746); const defaultOptions = { ignoreJunk: true @@ -57010,12 +59783,12 @@ module.exports = (source, destination, { /***/ }), -/* 501 */ +/* 514 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pMap = __webpack_require__(502); +const pMap = __webpack_require__(515); module.exports = (iterable, options) => pMap(iterable, element => element(), options); // TODO: Remove this for the next major release @@ -57023,7 +59796,7 @@ module.exports.default = module.exports; /***/ }), -/* 502 */ +/* 515 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57102,7 +59875,7 @@ module.exports.default = pMap; /***/ }), -/* 503 */ +/* 516 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57132,17 +59905,17 @@ module.exports = arrify; /***/ }), -/* 504 */ +/* 517 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const arrayUnion = __webpack_require__(505); -const glob = __webpack_require__(507); -const fastGlob = __webpack_require__(512); -const dirGlob = __webpack_require__(712); -const gitignore = __webpack_require__(715); +const fs = __webpack_require__(133); +const arrayUnion = __webpack_require__(518); +const glob = __webpack_require__(520); +const fastGlob = __webpack_require__(525); +const dirGlob = __webpack_require__(725); +const gitignore = __webpack_require__(728); const DEFAULT_FILTER = () => false; @@ -57287,12 +60060,12 @@ module.exports.gitignore = gitignore; /***/ }), -/* 505 */ +/* 518 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var arrayUniq = __webpack_require__(506); +var arrayUniq = __webpack_require__(519); module.exports = function () { return arrayUniq([].concat.apply([], arguments)); @@ -57300,7 +60073,7 @@ module.exports = function () { /***/ }), -/* 506 */ +/* 519 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -57369,7 +60142,7 @@ if ('Set' in global) { /***/ }), -/* 507 */ +/* 520 */ /***/ (function(module, exports, __webpack_require__) { // Approach: @@ -57414,27 +60187,27 @@ if ('Set' in global) { module.exports = glob -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var inherits = __webpack_require__(508) -var EE = __webpack_require__(154).EventEmitter +var inherits = __webpack_require__(521) +var EE = __webpack_require__(155).EventEmitter var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var globSync = __webpack_require__(510) -var common = __webpack_require__(511) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var globSync = __webpack_require__(523) +var common = __webpack_require__(524) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts var ownProp = common.ownProp -var inflight = __webpack_require__(158) +var inflight = __webpack_require__(159) var util = __webpack_require__(111) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(160) +var once = __webpack_require__(161) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -58165,7 +60938,7 @@ Glob.prototype._stat2 = function (f, abs, er, stat, cb) { /***/ }), -/* 508 */ +/* 521 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -58175,12 +60948,12 @@ try { module.exports = util.inherits; } catch (e) { /* istanbul ignore next */ - module.exports = __webpack_require__(509); + module.exports = __webpack_require__(522); } /***/ }), -/* 509 */ +/* 522 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -58213,22 +60986,22 @@ if (typeof Object.create === 'function') { /***/ }), -/* 510 */ +/* 523 */ /***/ (function(module, exports, __webpack_require__) { module.exports = globSync globSync.GlobSync = GlobSync -var fs = __webpack_require__(132) -var rp = __webpack_require__(146) -var minimatch = __webpack_require__(148) +var fs = __webpack_require__(133) +var rp = __webpack_require__(147) +var minimatch = __webpack_require__(149) var Minimatch = minimatch.Minimatch -var Glob = __webpack_require__(507).Glob +var Glob = __webpack_require__(520).Glob var util = __webpack_require__(111) var path = __webpack_require__(4) -var assert = __webpack_require__(138) -var isAbsolute = __webpack_require__(155) -var common = __webpack_require__(511) +var assert = __webpack_require__(139) +var isAbsolute = __webpack_require__(156) +var common = __webpack_require__(524) var alphasort = common.alphasort var alphasorti = common.alphasorti var setopts = common.setopts @@ -58705,7 +61478,7 @@ GlobSync.prototype._makeAbs = function (f) { /***/ }), -/* 511 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { exports.alphasort = alphasort @@ -58723,8 +61496,8 @@ function ownProp (obj, field) { } var path = __webpack_require__(4) -var minimatch = __webpack_require__(148) -var isAbsolute = __webpack_require__(155) +var minimatch = __webpack_require__(149) +var isAbsolute = __webpack_require__(156) var Minimatch = minimatch.Minimatch function alphasorti (a, b) { @@ -58951,10 +61724,10 @@ function childrenIgnored (self, path) { /***/ }), -/* 512 */ +/* 525 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(513); +const pkg = __webpack_require__(526); module.exports = pkg.async; module.exports.default = pkg.async; @@ -58967,19 +61740,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 513 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(514); -var taskManager = __webpack_require__(515); -var reader_async_1 = __webpack_require__(683); -var reader_stream_1 = __webpack_require__(707); -var reader_sync_1 = __webpack_require__(708); -var arrayUtils = __webpack_require__(710); -var streamUtils = __webpack_require__(711); +var optionsManager = __webpack_require__(527); +var taskManager = __webpack_require__(528); +var reader_async_1 = __webpack_require__(696); +var reader_stream_1 = __webpack_require__(720); +var reader_sync_1 = __webpack_require__(721); +var arrayUtils = __webpack_require__(723); +var streamUtils = __webpack_require__(724); /** * Synchronous API. */ @@ -59045,7 +61818,7 @@ function isString(source) { /***/ }), -/* 514 */ +/* 527 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -59083,13 +61856,13 @@ exports.prepare = prepare; /***/ }), -/* 515 */ +/* 528 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(516); +var patternUtils = __webpack_require__(529); /** * Generate tasks based on parent directory of each pattern. */ @@ -59180,16 +61953,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 516 */ +/* 529 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var globParent = __webpack_require__(517); -var isGlob = __webpack_require__(520); -var micromatch = __webpack_require__(521); +var globParent = __webpack_require__(530); +var isGlob = __webpack_require__(533); +var micromatch = __webpack_require__(534); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -59335,16 +62108,16 @@ exports.matchAny = matchAny; /***/ }), -/* 517 */ +/* 530 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var path = __webpack_require__(4); -var isglob = __webpack_require__(518); -var pathDirname = __webpack_require__(519); -var isWin32 = __webpack_require__(121).platform() === 'win32'; +var isglob = __webpack_require__(531); +var pathDirname = __webpack_require__(532); +var isWin32 = __webpack_require__(120).platform() === 'win32'; module.exports = function globParent(str) { // flip windows path separators @@ -59366,7 +62139,7 @@ module.exports = function globParent(str) { /***/ }), -/* 518 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -59376,7 +62149,7 @@ module.exports = function globParent(str) { * Licensed under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); module.exports = function isGlob(str) { if (typeof str !== 'string' || str === '') { @@ -59397,7 +62170,7 @@ module.exports = function isGlob(str) { /***/ }), -/* 519 */ +/* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -59547,7 +62320,7 @@ module.exports.win32 = win32; /***/ }), -/* 520 */ +/* 533 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -59557,7 +62330,7 @@ module.exports.win32 = win32; * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; module.exports = function isGlob(str, options) { @@ -59599,7 +62372,7 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 521 */ +/* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -59610,18 +62383,18 @@ module.exports = function isGlob(str, options) { */ var util = __webpack_require__(111); -var braces = __webpack_require__(522); -var toRegex = __webpack_require__(635); -var extend = __webpack_require__(643); +var braces = __webpack_require__(535); +var toRegex = __webpack_require__(648); +var extend = __webpack_require__(656); /** * Local dependencies */ -var compilers = __webpack_require__(646); -var parsers = __webpack_require__(679); -var cache = __webpack_require__(680); -var utils = __webpack_require__(681); +var compilers = __webpack_require__(659); +var parsers = __webpack_require__(692); +var cache = __webpack_require__(693); +var utils = __webpack_require__(694); var MAX_LENGTH = 1024 * 64; /** @@ -60483,7 +63256,7 @@ module.exports = micromatch; /***/ }), -/* 522 */ +/* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60493,18 +63266,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(523); -var unique = __webpack_require__(537); -var extend = __webpack_require__(532); +var toRegex = __webpack_require__(536); +var unique = __webpack_require__(550); +var extend = __webpack_require__(545); /** * Local dependencies */ -var compilers = __webpack_require__(538); -var parsers = __webpack_require__(555); -var Braces = __webpack_require__(565); -var utils = __webpack_require__(539); +var compilers = __webpack_require__(551); +var parsers = __webpack_require__(568); +var Braces = __webpack_require__(578); +var utils = __webpack_require__(552); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -60808,15 +63581,15 @@ module.exports = braces; /***/ }), -/* 523 */ +/* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(524); -var extend = __webpack_require__(532); -var not = __webpack_require__(534); +var define = __webpack_require__(537); +var extend = __webpack_require__(545); +var not = __webpack_require__(547); var MAX_LENGTH = 1024 * 64; /** @@ -60963,7 +63736,7 @@ module.exports.makeRe = makeRe; /***/ }), -/* 524 */ +/* 537 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60976,7 +63749,7 @@ module.exports.makeRe = makeRe; -var isDescriptor = __webpack_require__(525); +var isDescriptor = __webpack_require__(538); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -61001,7 +63774,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 525 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61014,9 +63787,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(526); -var isAccessor = __webpack_require__(527); -var isData = __webpack_require__(530); +var typeOf = __webpack_require__(539); +var isAccessor = __webpack_require__(540); +var isData = __webpack_require__(543); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -61030,7 +63803,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 526 */ +/* 539 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -61183,7 +63956,7 @@ function isBuffer(val) { /***/ }), -/* 527 */ +/* 540 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61196,7 +63969,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(528); +var typeOf = __webpack_require__(541); // accessor descriptor properties var accessor = { @@ -61259,10 +64032,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 528 */ +/* 541 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -61381,7 +64154,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 529 */ +/* 542 */ /***/ (function(module, exports) { /*! @@ -61408,7 +64181,7 @@ function isSlowBuffer (obj) { /***/ }), -/* 530 */ +/* 543 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61421,7 +64194,7 @@ function isSlowBuffer (obj) { -var typeOf = __webpack_require__(531); +var typeOf = __webpack_require__(544); // data descriptor properties var data = { @@ -61470,10 +64243,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 531 */ +/* 544 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -61592,13 +64365,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 532 */ +/* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(533); +var isObject = __webpack_require__(546); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -61632,7 +64405,7 @@ function hasOwn(obj, key) { /***/ }), -/* 533 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61652,13 +64425,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 534 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(535); +var extend = __webpack_require__(548); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -61725,13 +64498,13 @@ module.exports = toRegex; /***/ }), -/* 535 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(536); +var isObject = __webpack_require__(549); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -61765,7 +64538,7 @@ function hasOwn(obj, key) { /***/ }), -/* 536 */ +/* 549 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61785,7 +64558,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 537 */ +/* 550 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61835,13 +64608,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 538 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(539); +var utils = __webpack_require__(552); module.exports = function(braces, options) { braces.compiler @@ -62124,25 +64897,25 @@ function hasQueue(node) { /***/ }), -/* 539 */ +/* 552 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(540); +var splitString = __webpack_require__(553); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(532); -utils.flatten = __webpack_require__(546); -utils.isObject = __webpack_require__(544); -utils.fillRange = __webpack_require__(547); -utils.repeat = __webpack_require__(554); -utils.unique = __webpack_require__(537); +utils.extend = __webpack_require__(545); +utils.flatten = __webpack_require__(559); +utils.isObject = __webpack_require__(557); +utils.fillRange = __webpack_require__(560); +utils.repeat = __webpack_require__(567); +utils.unique = __webpack_require__(550); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -62474,7 +65247,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 540 */ +/* 553 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62487,7 +65260,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(541); +var extend = __webpack_require__(554); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -62652,14 +65425,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 541 */ +/* 554 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(542); -var assignSymbols = __webpack_require__(545); +var isExtendable = __webpack_require__(555); +var assignSymbols = __webpack_require__(558); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -62719,7 +65492,7 @@ function isEnum(obj, key) { /***/ }), -/* 542 */ +/* 555 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62732,7 +65505,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -62740,7 +65513,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 543 */ +/* 556 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62753,7 +65526,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(544); +var isObject = __webpack_require__(557); function isObjectObject(o) { return isObject(o) === true @@ -62784,7 +65557,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 544 */ +/* 557 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62803,7 +65576,7 @@ module.exports = function isObject(val) { /***/ }), -/* 545 */ +/* 558 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62850,7 +65623,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 546 */ +/* 559 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62879,7 +65652,7 @@ function flat(arr, res) { /***/ }), -/* 547 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62893,10 +65666,10 @@ function flat(arr, res) { var util = __webpack_require__(111); -var isNumber = __webpack_require__(548); -var extend = __webpack_require__(550); -var repeat = __webpack_require__(552); -var toRegex = __webpack_require__(553); +var isNumber = __webpack_require__(561); +var extend = __webpack_require__(563); +var repeat = __webpack_require__(565); +var toRegex = __webpack_require__(566); /** * Return a range of numbers or letters. @@ -63094,7 +65867,7 @@ module.exports = fillRange; /***/ }), -/* 548 */ +/* 561 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63107,7 +65880,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(549); +var typeOf = __webpack_require__(562); module.exports = function isNumber(num) { var type = typeOf(num); @@ -63123,10 +65896,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 549 */ +/* 562 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -63245,13 +66018,13 @@ module.exports = function kindOf(val) { /***/ }), -/* 550 */ +/* 563 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(551); +var isObject = __webpack_require__(564); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -63285,7 +66058,7 @@ function hasOwn(obj, key) { /***/ }), -/* 551 */ +/* 564 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63305,7 +66078,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 552 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63382,7 +66155,7 @@ function repeat(str, num) { /***/ }), -/* 553 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63395,8 +66168,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(552); -var isNumber = __webpack_require__(548); +var repeat = __webpack_require__(565); +var isNumber = __webpack_require__(561); var cache = {}; function toRegexRange(min, max, options) { @@ -63683,7 +66456,7 @@ module.exports = toRegexRange; /***/ }), -/* 554 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63708,14 +66481,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 555 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(556); -var utils = __webpack_require__(539); +var Node = __webpack_require__(569); +var utils = __webpack_require__(552); /** * Braces parsers @@ -64075,15 +66848,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 556 */ +/* 569 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(544); -var define = __webpack_require__(557); -var utils = __webpack_require__(564); +var isObject = __webpack_require__(557); +var define = __webpack_require__(570); +var utils = __webpack_require__(577); var ownNames; /** @@ -64574,7 +67347,7 @@ exports = module.exports = Node; /***/ }), -/* 557 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64587,7 +67360,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(558); +var isDescriptor = __webpack_require__(571); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -64612,7 +67385,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 558 */ +/* 571 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64625,9 +67398,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(559); -var isAccessor = __webpack_require__(560); -var isData = __webpack_require__(562); +var typeOf = __webpack_require__(572); +var isAccessor = __webpack_require__(573); +var isData = __webpack_require__(575); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -64641,7 +67414,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 559 */ +/* 572 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -64776,7 +67549,7 @@ function isBuffer(val) { /***/ }), -/* 560 */ +/* 573 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64789,7 +67562,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(561); +var typeOf = __webpack_require__(574); // accessor descriptor properties var accessor = { @@ -64852,7 +67625,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 561 */ +/* 574 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -64987,7 +67760,7 @@ function isBuffer(val) { /***/ }), -/* 562 */ +/* 575 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65000,7 +67773,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(563); +var typeOf = __webpack_require__(576); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -65043,7 +67816,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 563 */ +/* 576 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -65178,13 +67951,13 @@ function isBuffer(val) { /***/ }), -/* 564 */ +/* 577 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(549); +var typeOf = __webpack_require__(562); var utils = module.exports; /** @@ -66204,17 +68977,17 @@ function assert(val, message) { /***/ }), -/* 565 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(532); -var Snapdragon = __webpack_require__(566); -var compilers = __webpack_require__(538); -var parsers = __webpack_require__(555); -var utils = __webpack_require__(539); +var extend = __webpack_require__(545); +var Snapdragon = __webpack_require__(579); +var compilers = __webpack_require__(551); +var parsers = __webpack_require__(568); +var utils = __webpack_require__(552); /** * Customize Snapdragon parser and renderer @@ -66315,17 +69088,17 @@ module.exports = Braces; /***/ }), -/* 566 */ +/* 579 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(567); -var define = __webpack_require__(593); -var Compiler = __webpack_require__(603); -var Parser = __webpack_require__(632); -var utils = __webpack_require__(612); +var Base = __webpack_require__(580); +var define = __webpack_require__(606); +var Compiler = __webpack_require__(616); +var Parser = __webpack_require__(645); +var utils = __webpack_require__(625); var regexCache = {}; var cache = {}; @@ -66496,20 +69269,20 @@ module.exports.Parser = Parser; /***/ }), -/* 567 */ +/* 580 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var define = __webpack_require__(568); -var CacheBase = __webpack_require__(569); -var Emitter = __webpack_require__(570); -var isObject = __webpack_require__(544); -var merge = __webpack_require__(587); -var pascal = __webpack_require__(590); -var cu = __webpack_require__(591); +var define = __webpack_require__(581); +var CacheBase = __webpack_require__(582); +var Emitter = __webpack_require__(583); +var isObject = __webpack_require__(557); +var merge = __webpack_require__(600); +var pascal = __webpack_require__(603); +var cu = __webpack_require__(604); /** * Optionally define a custom `cache` namespace to use. @@ -66938,7 +69711,7 @@ module.exports.namespace = namespace; /***/ }), -/* 568 */ +/* 581 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66951,7 +69724,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(558); +var isDescriptor = __webpack_require__(571); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -66976,21 +69749,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 569 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(544); -var Emitter = __webpack_require__(570); -var visit = __webpack_require__(571); -var toPath = __webpack_require__(574); -var union = __webpack_require__(575); -var del = __webpack_require__(579); -var get = __webpack_require__(577); -var has = __webpack_require__(584); -var set = __webpack_require__(578); +var isObject = __webpack_require__(557); +var Emitter = __webpack_require__(583); +var visit = __webpack_require__(584); +var toPath = __webpack_require__(587); +var union = __webpack_require__(588); +var del = __webpack_require__(592); +var get = __webpack_require__(590); +var has = __webpack_require__(597); +var set = __webpack_require__(591); /** * Create a `Cache` constructor that when instantiated will @@ -67244,7 +70017,7 @@ module.exports.namespace = namespace; /***/ }), -/* 570 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { @@ -67413,7 +70186,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 571 */ +/* 584 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67426,8 +70199,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(572); -var mapVisit = __webpack_require__(573); +var visit = __webpack_require__(585); +var mapVisit = __webpack_require__(586); module.exports = function(collection, method, val) { var result; @@ -67450,7 +70223,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 572 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67463,7 +70236,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(544); +var isObject = __webpack_require__(557); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -67490,14 +70263,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 573 */ +/* 586 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var visit = __webpack_require__(572); +var visit = __webpack_require__(585); /** * Map `visit` over an array of objects. @@ -67534,7 +70307,7 @@ function isObject(val) { /***/ }), -/* 574 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67547,7 +70320,7 @@ function isObject(val) { -var typeOf = __webpack_require__(549); +var typeOf = __webpack_require__(562); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -67574,16 +70347,16 @@ function filter(arr) { /***/ }), -/* 575 */ +/* 588 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(536); -var union = __webpack_require__(576); -var get = __webpack_require__(577); -var set = __webpack_require__(578); +var isObject = __webpack_require__(549); +var union = __webpack_require__(589); +var get = __webpack_require__(590); +var set = __webpack_require__(591); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -67611,7 +70384,7 @@ function arrayify(val) { /***/ }), -/* 576 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67647,7 +70420,7 @@ module.exports = function union(init) { /***/ }), -/* 577 */ +/* 590 */ /***/ (function(module, exports) { /*! @@ -67703,7 +70476,7 @@ function toString(val) { /***/ }), -/* 578 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67716,10 +70489,10 @@ function toString(val) { -var split = __webpack_require__(540); -var extend = __webpack_require__(535); -var isPlainObject = __webpack_require__(543); -var isObject = __webpack_require__(536); +var split = __webpack_require__(553); +var extend = __webpack_require__(548); +var isPlainObject = __webpack_require__(556); +var isObject = __webpack_require__(549); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -67765,7 +70538,7 @@ function isValidKey(key) { /***/ }), -/* 579 */ +/* 592 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67778,8 +70551,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(544); -var has = __webpack_require__(580); +var isObject = __webpack_require__(557); +var has = __webpack_require__(593); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -67804,7 +70577,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 580 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67817,9 +70590,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(581); -var hasValues = __webpack_require__(583); -var get = __webpack_require__(577); +var isObject = __webpack_require__(594); +var hasValues = __webpack_require__(596); +var get = __webpack_require__(590); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -67830,7 +70603,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 581 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67843,7 +70616,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(582); +var isArray = __webpack_require__(595); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -67851,7 +70624,7 @@ module.exports = function isObject(val) { /***/ }), -/* 582 */ +/* 595 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -67862,7 +70635,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 583 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67905,7 +70678,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 584 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67918,9 +70691,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(544); -var hasValues = __webpack_require__(585); -var get = __webpack_require__(577); +var isObject = __webpack_require__(557); +var hasValues = __webpack_require__(598); +var get = __webpack_require__(590); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -67928,7 +70701,7 @@ module.exports = function(val, prop) { /***/ }), -/* 585 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67941,8 +70714,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(586); -var isNumber = __webpack_require__(548); +var typeOf = __webpack_require__(599); +var isNumber = __webpack_require__(561); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -67995,10 +70768,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 586 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -68120,14 +70893,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 587 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(588); -var forIn = __webpack_require__(589); +var isExtendable = __webpack_require__(601); +var forIn = __webpack_require__(602); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -68191,7 +70964,7 @@ module.exports = mixinDeep; /***/ }), -/* 588 */ +/* 601 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68204,7 +70977,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -68212,7 +70985,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 589 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68235,7 +71008,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 590 */ +/* 603 */ /***/ (function(module, exports) { /*! @@ -68262,14 +71035,14 @@ module.exports = pascalcase; /***/ }), -/* 591 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(111); -var utils = __webpack_require__(592); +var utils = __webpack_require__(605); /** * Expose class utils @@ -68634,7 +71407,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 592 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68648,10 +71421,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(576); -utils.define = __webpack_require__(593); -utils.isObj = __webpack_require__(544); -utils.staticExtend = __webpack_require__(600); +utils.union = __webpack_require__(589); +utils.define = __webpack_require__(606); +utils.isObj = __webpack_require__(557); +utils.staticExtend = __webpack_require__(613); /** @@ -68662,7 +71435,7 @@ module.exports = utils; /***/ }), -/* 593 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68675,7 +71448,7 @@ module.exports = utils; -var isDescriptor = __webpack_require__(594); +var isDescriptor = __webpack_require__(607); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -68700,7 +71473,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 594 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68713,9 +71486,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(595); -var isAccessor = __webpack_require__(596); -var isData = __webpack_require__(598); +var typeOf = __webpack_require__(608); +var isAccessor = __webpack_require__(609); +var isData = __webpack_require__(611); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -68729,7 +71502,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 595 */ +/* 608 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -68882,7 +71655,7 @@ function isBuffer(val) { /***/ }), -/* 596 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68895,7 +71668,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(597); +var typeOf = __webpack_require__(610); // accessor descriptor properties var accessor = { @@ -68958,10 +71731,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 597 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -69080,7 +71853,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 598 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69093,7 +71866,7 @@ module.exports = function kindOf(val) { -var typeOf = __webpack_require__(599); +var typeOf = __webpack_require__(612); // data descriptor properties var data = { @@ -69142,10 +71915,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 599 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(529); +var isBuffer = __webpack_require__(542); var toString = Object.prototype.toString; /** @@ -69264,7 +72037,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 600 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69277,8 +72050,8 @@ module.exports = function kindOf(val) { -var copy = __webpack_require__(601); -var define = __webpack_require__(593); +var copy = __webpack_require__(614); +var define = __webpack_require__(606); var util = __webpack_require__(111); /** @@ -69361,15 +72134,15 @@ module.exports = extend; /***/ }), -/* 601 */ +/* 614 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(549); -var copyDescriptor = __webpack_require__(602); -var define = __webpack_require__(593); +var typeOf = __webpack_require__(562); +var copyDescriptor = __webpack_require__(615); +var define = __webpack_require__(606); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -69542,7 +72315,7 @@ module.exports.has = has; /***/ }), -/* 602 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69630,16 +72403,16 @@ function isObject(val) { /***/ }), -/* 603 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(604); -var define = __webpack_require__(593); -var debug = __webpack_require__(606)('snapdragon:compiler'); -var utils = __webpack_require__(612); +var use = __webpack_require__(617); +var define = __webpack_require__(606); +var debug = __webpack_require__(619)('snapdragon:compiler'); +var utils = __webpack_require__(625); /** * Create a new `Compiler` with the given `options`. @@ -69793,7 +72566,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(631); + var sourcemaps = __webpack_require__(644); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -69814,7 +72587,7 @@ module.exports = Compiler; /***/ }), -/* 604 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69827,7 +72600,7 @@ module.exports = Compiler; -var utils = __webpack_require__(605); +var utils = __webpack_require__(618); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -69942,7 +72715,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 605 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69956,8 +72729,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(593); -utils.isObject = __webpack_require__(544); +utils.define = __webpack_require__(606); +utils.isObject = __webpack_require__(557); utils.isString = function(val) { @@ -69972,7 +72745,7 @@ module.exports = utils; /***/ }), -/* 606 */ +/* 619 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -69981,14 +72754,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(607); + module.exports = __webpack_require__(620); } else { - module.exports = __webpack_require__(610); + module.exports = __webpack_require__(623); } /***/ }), -/* 607 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -69997,7 +72770,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(608); +exports = module.exports = __webpack_require__(621); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -70179,7 +72952,7 @@ function localstorage() { /***/ }), -/* 608 */ +/* 621 */ /***/ (function(module, exports, __webpack_require__) { @@ -70195,7 +72968,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(609); +exports.humanize = __webpack_require__(622); /** * The currently active debug mode names, and names to skip. @@ -70387,7 +73160,7 @@ function coerce(val) { /***/ }), -/* 609 */ +/* 622 */ /***/ (function(module, exports) { /** @@ -70545,14 +73318,14 @@ function plural(ms, n, name) { /***/ }), -/* 610 */ +/* 623 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(278); +var tty = __webpack_require__(121); var util = __webpack_require__(111); /** @@ -70561,7 +73334,7 @@ var util = __webpack_require__(111); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(608); +exports = module.exports = __webpack_require__(621); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -70733,14 +73506,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(132); + var fs = __webpack_require__(133); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(611); + var net = __webpack_require__(624); stream = new net.Socket({ fd: fd, readable: false, @@ -70799,13 +73572,13 @@ exports.enable(load()); /***/ }), -/* 611 */ +/* 624 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 612 */ +/* 625 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70815,9 +73588,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(535); -exports.SourceMap = __webpack_require__(613); -exports.sourceMapResolve = __webpack_require__(624); +exports.extend = __webpack_require__(548); +exports.SourceMap = __webpack_require__(626); +exports.sourceMapResolve = __webpack_require__(637); /** * Convert backslash in the given string to forward slashes @@ -70860,7 +73633,7 @@ exports.last = function(arr, n) { /***/ }), -/* 613 */ +/* 626 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -70868,13 +73641,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(614).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(620).SourceMapConsumer; -exports.SourceNode = __webpack_require__(623).SourceNode; +exports.SourceMapGenerator = __webpack_require__(627).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(633).SourceMapConsumer; +exports.SourceNode = __webpack_require__(636).SourceNode; /***/ }), -/* 614 */ +/* 627 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -70884,10 +73657,10 @@ exports.SourceNode = __webpack_require__(623).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(615); -var util = __webpack_require__(617); -var ArraySet = __webpack_require__(618).ArraySet; -var MappingList = __webpack_require__(619).MappingList; +var base64VLQ = __webpack_require__(628); +var util = __webpack_require__(630); +var ArraySet = __webpack_require__(631).ArraySet; +var MappingList = __webpack_require__(632).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -71296,7 +74069,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 615 */ +/* 628 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71336,7 +74109,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(616); +var base64 = __webpack_require__(629); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -71442,7 +74215,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 616 */ +/* 629 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71515,7 +74288,7 @@ exports.decode = function (charCode) { /***/ }), -/* 617 */ +/* 630 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71938,7 +74711,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 618 */ +/* 631 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -71948,7 +74721,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(617); +var util = __webpack_require__(630); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -72065,7 +74838,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 619 */ +/* 632 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -72075,7 +74848,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(617); +var util = __webpack_require__(630); /** * Determine whether mappingB is after mappingA with respect to generated @@ -72150,7 +74923,7 @@ exports.MappingList = MappingList; /***/ }), -/* 620 */ +/* 633 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -72160,11 +74933,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(617); -var binarySearch = __webpack_require__(621); -var ArraySet = __webpack_require__(618).ArraySet; -var base64VLQ = __webpack_require__(615); -var quickSort = __webpack_require__(622).quickSort; +var util = __webpack_require__(630); +var binarySearch = __webpack_require__(634); +var ArraySet = __webpack_require__(631).ArraySet; +var base64VLQ = __webpack_require__(628); +var quickSort = __webpack_require__(635).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -73238,7 +76011,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 621 */ +/* 634 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73355,7 +76128,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 622 */ +/* 635 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73475,7 +76248,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 623 */ +/* 636 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -73485,8 +76258,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(614).SourceMapGenerator; -var util = __webpack_require__(617); +var SourceMapGenerator = __webpack_require__(627).SourceMapGenerator; +var util = __webpack_require__(630); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -73894,17 +76667,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 624 */ +/* 637 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(625) -var resolveUrl = __webpack_require__(626) -var decodeUriComponent = __webpack_require__(627) -var urix = __webpack_require__(629) -var atob = __webpack_require__(630) +var sourceMappingURL = __webpack_require__(638) +var resolveUrl = __webpack_require__(639) +var decodeUriComponent = __webpack_require__(640) +var urix = __webpack_require__(642) +var atob = __webpack_require__(643) @@ -74202,7 +76975,7 @@ module.exports = { /***/ }), -/* 625 */ +/* 638 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -74265,13 +77038,13 @@ void (function(root, factory) { /***/ }), -/* 626 */ +/* 639 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var url = __webpack_require__(189) +var url = __webpack_require__(196) function resolveUrl(/* ...urls */) { return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { @@ -74283,13 +77056,13 @@ module.exports = resolveUrl /***/ }), -/* 627 */ +/* 640 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(628) +var decodeUriComponent = __webpack_require__(641) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -74300,7 +77073,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 628 */ +/* 641 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74401,7 +77174,7 @@ module.exports = function (encodedURI) { /***/ }), -/* 629 */ +/* 642 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -74424,7 +77197,7 @@ module.exports = urix /***/ }), -/* 630 */ +/* 643 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74438,16 +77211,16 @@ module.exports = atob.atob = atob; /***/ }), -/* 631 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var fs = __webpack_require__(132); +var fs = __webpack_require__(133); var path = __webpack_require__(4); -var define = __webpack_require__(593); -var utils = __webpack_require__(612); +var define = __webpack_require__(606); +var utils = __webpack_require__(625); /** * Expose `mixin()`. @@ -74590,19 +77363,19 @@ exports.comment = function(node) { /***/ }), -/* 632 */ +/* 645 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(604); +var use = __webpack_require__(617); var util = __webpack_require__(111); -var Cache = __webpack_require__(633); -var define = __webpack_require__(593); -var debug = __webpack_require__(606)('snapdragon:parser'); -var Position = __webpack_require__(634); -var utils = __webpack_require__(612); +var Cache = __webpack_require__(646); +var define = __webpack_require__(606); +var debug = __webpack_require__(619)('snapdragon:parser'); +var Position = __webpack_require__(647); +var utils = __webpack_require__(625); /** * Create a new `Parser` with the given `input` and `options`. @@ -75130,7 +77903,7 @@ module.exports = Parser; /***/ }), -/* 633 */ +/* 646 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75237,13 +78010,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 634 */ +/* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(593); +var define = __webpack_require__(606); /** * Store position for a node @@ -75258,16 +78031,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 635 */ +/* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(636); -var define = __webpack_require__(642); -var extend = __webpack_require__(643); -var not = __webpack_require__(645); +var safe = __webpack_require__(649); +var define = __webpack_require__(655); +var extend = __webpack_require__(656); +var not = __webpack_require__(658); var MAX_LENGTH = 1024 * 64; /** @@ -75420,10 +78193,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 636 */ +/* 649 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(637); +var parse = __webpack_require__(650); var types = parse.types; module.exports = function (re, opts) { @@ -75469,13 +78242,13 @@ function isRegExp (x) { /***/ }), -/* 637 */ +/* 650 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(638); -var types = __webpack_require__(639); -var sets = __webpack_require__(640); -var positions = __webpack_require__(641); +var util = __webpack_require__(651); +var types = __webpack_require__(652); +var sets = __webpack_require__(653); +var positions = __webpack_require__(654); module.exports = function(regexpStr) { @@ -75757,11 +78530,11 @@ module.exports.types = types; /***/ }), -/* 638 */ +/* 651 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(639); -var sets = __webpack_require__(640); +var types = __webpack_require__(652); +var sets = __webpack_require__(653); // All of these are private and only used by randexp. @@ -75874,7 +78647,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 639 */ +/* 652 */ /***/ (function(module, exports) { module.exports = { @@ -75890,10 +78663,10 @@ module.exports = { /***/ }), -/* 640 */ +/* 653 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(639); +var types = __webpack_require__(652); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -75978,10 +78751,10 @@ exports.anyChar = function() { /***/ }), -/* 641 */ +/* 654 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(639); +var types = __webpack_require__(652); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -76001,7 +78774,7 @@ exports.end = function() { /***/ }), -/* 642 */ +/* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76014,8 +78787,8 @@ exports.end = function() { -var isobject = __webpack_require__(544); -var isDescriptor = __webpack_require__(558); +var isobject = __webpack_require__(557); +var isDescriptor = __webpack_require__(571); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -76046,14 +78819,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 643 */ +/* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(644); -var assignSymbols = __webpack_require__(545); +var isExtendable = __webpack_require__(657); +var assignSymbols = __webpack_require__(558); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -76113,7 +78886,7 @@ function isEnum(obj, key) { /***/ }), -/* 644 */ +/* 657 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76126,7 +78899,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -76134,14 +78907,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 645 */ +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(643); -var safe = __webpack_require__(636); +var extend = __webpack_require__(656); +var safe = __webpack_require__(649); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -76213,14 +78986,14 @@ module.exports = toRegex; /***/ }), -/* 646 */ +/* 659 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(647); -var extglob = __webpack_require__(663); +var nanomatch = __webpack_require__(660); +var extglob = __webpack_require__(676); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -76297,7 +79070,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 647 */ +/* 660 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76308,17 +79081,17 @@ function escapeExtglobs(compiler) { */ var util = __webpack_require__(111); -var toRegex = __webpack_require__(648); -var extend = __webpack_require__(649); +var toRegex = __webpack_require__(661); +var extend = __webpack_require__(662); /** * Local dependencies */ -var compilers = __webpack_require__(651); -var parsers = __webpack_require__(652); -var cache = __webpack_require__(655); -var utils = __webpack_require__(657); +var compilers = __webpack_require__(664); +var parsers = __webpack_require__(665); +var cache = __webpack_require__(668); +var utils = __webpack_require__(670); var MAX_LENGTH = 1024 * 64; /** @@ -77142,15 +79915,15 @@ module.exports = nanomatch; /***/ }), -/* 648 */ +/* 661 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(593); -var extend = __webpack_require__(535); -var not = __webpack_require__(534); +var define = __webpack_require__(606); +var extend = __webpack_require__(548); +var not = __webpack_require__(547); var MAX_LENGTH = 1024 * 64; /** @@ -77297,14 +80070,14 @@ module.exports.makeRe = makeRe; /***/ }), -/* 649 */ +/* 662 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(650); -var assignSymbols = __webpack_require__(545); +var isExtendable = __webpack_require__(663); +var assignSymbols = __webpack_require__(558); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -77364,7 +80137,7 @@ function isEnum(obj, key) { /***/ }), -/* 650 */ +/* 663 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77377,7 +80150,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(543); +var isPlainObject = __webpack_require__(556); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -77385,7 +80158,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 651 */ +/* 664 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -77731,15 +80504,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 652 */ +/* 665 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(534); -var toRegex = __webpack_require__(648); -var isOdd = __webpack_require__(653); +var regexNot = __webpack_require__(547); +var toRegex = __webpack_require__(661); +var isOdd = __webpack_require__(666); /** * Characters to use in negation regex (we want to "not" match @@ -78125,7 +80898,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 653 */ +/* 666 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78138,7 +80911,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(654); +var isNumber = __webpack_require__(667); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -78152,7 +80925,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 654 */ +/* 667 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78180,14 +80953,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 655 */ +/* 668 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(656))(); +module.exports = new (__webpack_require__(669))(); /***/ }), -/* 656 */ +/* 669 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78200,7 +80973,7 @@ module.exports = new (__webpack_require__(656))(); -var MapCache = __webpack_require__(633); +var MapCache = __webpack_require__(646); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -78322,7 +81095,7 @@ exports = module.exports = FragmentCache; /***/ }), -/* 657 */ +/* 670 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78335,14 +81108,14 @@ var path = __webpack_require__(4); * Module dependencies */ -var isWindows = __webpack_require__(658)(); -var Snapdragon = __webpack_require__(566); -utils.define = __webpack_require__(659); -utils.diff = __webpack_require__(660); -utils.extend = __webpack_require__(649); -utils.pick = __webpack_require__(661); -utils.typeOf = __webpack_require__(662); -utils.unique = __webpack_require__(537); +var isWindows = __webpack_require__(671)(); +var Snapdragon = __webpack_require__(579); +utils.define = __webpack_require__(672); +utils.diff = __webpack_require__(673); +utils.extend = __webpack_require__(662); +utils.pick = __webpack_require__(674); +utils.typeOf = __webpack_require__(675); +utils.unique = __webpack_require__(550); /** * Returns true if the given value is effectively an empty string @@ -78708,7 +81481,7 @@ utils.unixify = function(options) { /***/ }), -/* 658 */ +/* 671 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -78736,7 +81509,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 659 */ +/* 672 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78749,8 +81522,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(544); -var isDescriptor = __webpack_require__(558); +var isobject = __webpack_require__(557); +var isDescriptor = __webpack_require__(571); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -78781,7 +81554,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 660 */ +/* 673 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78835,7 +81608,7 @@ function diffArray(one, two) { /***/ }), -/* 661 */ +/* 674 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -78848,7 +81621,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(544); +var isObject = __webpack_require__(557); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -78877,7 +81650,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 662 */ +/* 675 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -79012,7 +81785,7 @@ function isBuffer(val) { /***/ }), -/* 663 */ +/* 676 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79022,18 +81795,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(535); -var unique = __webpack_require__(537); -var toRegex = __webpack_require__(648); +var extend = __webpack_require__(548); +var unique = __webpack_require__(550); +var toRegex = __webpack_require__(661); /** * Local dependencies */ -var compilers = __webpack_require__(664); -var parsers = __webpack_require__(675); -var Extglob = __webpack_require__(678); -var utils = __webpack_require__(677); +var compilers = __webpack_require__(677); +var parsers = __webpack_require__(688); +var Extglob = __webpack_require__(691); +var utils = __webpack_require__(690); var MAX_LENGTH = 1024 * 64; /** @@ -79350,13 +82123,13 @@ module.exports = extglob; /***/ }), -/* 664 */ +/* 677 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(665); +var brackets = __webpack_require__(678); /** * Extglob compilers @@ -79526,7 +82299,7 @@ module.exports = function(extglob) { /***/ }), -/* 665 */ +/* 678 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79536,17 +82309,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(666); -var parsers = __webpack_require__(668); +var compilers = __webpack_require__(679); +var parsers = __webpack_require__(681); /** * Module dependencies */ -var debug = __webpack_require__(670)('expand-brackets'); -var extend = __webpack_require__(535); -var Snapdragon = __webpack_require__(566); -var toRegex = __webpack_require__(648); +var debug = __webpack_require__(683)('expand-brackets'); +var extend = __webpack_require__(548); +var Snapdragon = __webpack_require__(579); +var toRegex = __webpack_require__(661); /** * Parses the given POSIX character class `pattern` and returns a @@ -79744,13 +82517,13 @@ module.exports = brackets; /***/ }), -/* 666 */ +/* 679 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(667); +var posix = __webpack_require__(680); module.exports = function(brackets) { brackets.compiler @@ -79838,7 +82611,7 @@ module.exports = function(brackets) { /***/ }), -/* 667 */ +/* 680 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79867,14 +82640,14 @@ module.exports = { /***/ }), -/* 668 */ +/* 681 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(669); -var define = __webpack_require__(593); +var utils = __webpack_require__(682); +var define = __webpack_require__(606); /** * Text regex @@ -80093,14 +82866,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 669 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(648); -var regexNot = __webpack_require__(534); +var toRegex = __webpack_require__(661); +var regexNot = __webpack_require__(547); var cached; /** @@ -80134,7 +82907,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 670 */ +/* 683 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -80143,14 +82916,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(671); + module.exports = __webpack_require__(684); } else { - module.exports = __webpack_require__(674); + module.exports = __webpack_require__(687); } /***/ }), -/* 671 */ +/* 684 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -80159,7 +82932,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(672); +exports = module.exports = __webpack_require__(685); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -80341,7 +83114,7 @@ function localstorage() { /***/ }), -/* 672 */ +/* 685 */ /***/ (function(module, exports, __webpack_require__) { @@ -80357,7 +83130,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(673); +exports.humanize = __webpack_require__(686); /** * The currently active debug mode names, and names to skip. @@ -80549,7 +83322,7 @@ function coerce(val) { /***/ }), -/* 673 */ +/* 686 */ /***/ (function(module, exports) { /** @@ -80707,14 +83480,14 @@ function plural(ms, n, name) { /***/ }), -/* 674 */ +/* 687 */ /***/ (function(module, exports, __webpack_require__) { /** * Module dependencies. */ -var tty = __webpack_require__(278); +var tty = __webpack_require__(121); var util = __webpack_require__(111); /** @@ -80723,7 +83496,7 @@ var util = __webpack_require__(111); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(672); +exports = module.exports = __webpack_require__(685); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -80895,14 +83668,14 @@ function createWritableStdioStream (fd) { break; case 'FILE': - var fs = __webpack_require__(132); + var fs = __webpack_require__(133); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': - var net = __webpack_require__(611); + var net = __webpack_require__(624); stream = new net.Socket({ fd: fd, readable: false, @@ -80961,15 +83734,15 @@ exports.enable(load()); /***/ }), -/* 675 */ +/* 688 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(665); -var define = __webpack_require__(676); -var utils = __webpack_require__(677); +var brackets = __webpack_require__(678); +var define = __webpack_require__(689); +var utils = __webpack_require__(690); /** * Characters to use in text regex (we want to "not" match @@ -81124,7 +83897,7 @@ module.exports = parsers; /***/ }), -/* 676 */ +/* 689 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81137,7 +83910,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(558); +var isDescriptor = __webpack_require__(571); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -81162,14 +83935,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 677 */ +/* 690 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(534); -var Cache = __webpack_require__(656); +var regex = __webpack_require__(547); +var Cache = __webpack_require__(669); /** * Utils @@ -81238,7 +84011,7 @@ utils.createRegex = function(str) { /***/ }), -/* 678 */ +/* 691 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81248,16 +84021,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(566); -var define = __webpack_require__(676); -var extend = __webpack_require__(535); +var Snapdragon = __webpack_require__(579); +var define = __webpack_require__(689); +var extend = __webpack_require__(548); /** * Local dependencies */ -var compilers = __webpack_require__(664); -var parsers = __webpack_require__(675); +var compilers = __webpack_require__(677); +var parsers = __webpack_require__(688); /** * Customize Snapdragon parser and renderer @@ -81323,16 +84096,16 @@ module.exports = Extglob; /***/ }), -/* 679 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(663); -var nanomatch = __webpack_require__(647); -var regexNot = __webpack_require__(534); -var toRegex = __webpack_require__(635); +var extglob = __webpack_require__(676); +var nanomatch = __webpack_require__(660); +var regexNot = __webpack_require__(547); +var toRegex = __webpack_require__(648); var not; /** @@ -81413,14 +84186,14 @@ function textRegex(pattern) { /***/ }), -/* 680 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(656))(); +module.exports = new (__webpack_require__(669))(); /***/ }), -/* 681 */ +/* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81433,13 +84206,13 @@ var path = __webpack_require__(4); * Module dependencies */ -var Snapdragon = __webpack_require__(566); -utils.define = __webpack_require__(642); -utils.diff = __webpack_require__(660); -utils.extend = __webpack_require__(643); -utils.pick = __webpack_require__(661); -utils.typeOf = __webpack_require__(682); -utils.unique = __webpack_require__(537); +var Snapdragon = __webpack_require__(579); +utils.define = __webpack_require__(655); +utils.diff = __webpack_require__(673); +utils.extend = __webpack_require__(656); +utils.pick = __webpack_require__(674); +utils.typeOf = __webpack_require__(695); +utils.unique = __webpack_require__(550); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -81736,7 +84509,7 @@ utils.unixify = function(options) { /***/ }), -/* 682 */ +/* 695 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -81871,7 +84644,7 @@ function isBuffer(val) { /***/ }), -/* 683 */ +/* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81890,9 +84663,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(684); -var reader_1 = __webpack_require__(697); -var fs_stream_1 = __webpack_require__(701); +var readdir = __webpack_require__(697); +var reader_1 = __webpack_require__(710); +var fs_stream_1 = __webpack_require__(714); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -81953,15 +84726,15 @@ exports.default = ReaderAsync; /***/ }), -/* 684 */ +/* 697 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(685); -const readdirAsync = __webpack_require__(693); -const readdirStream = __webpack_require__(696); +const readdirSync = __webpack_require__(698); +const readdirAsync = __webpack_require__(706); +const readdirStream = __webpack_require__(709); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -82045,7 +84818,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 685 */ +/* 698 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82053,11 +84826,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(686); +const DirectoryReader = __webpack_require__(699); let syncFacade = { - fs: __webpack_require__(691), - forEach: __webpack_require__(692), + fs: __webpack_require__(704), + forEach: __webpack_require__(705), sync: true }; @@ -82086,18 +84859,18 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 686 */ +/* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const Readable = __webpack_require__(136).Readable; -const EventEmitter = __webpack_require__(154).EventEmitter; +const Readable = __webpack_require__(137).Readable; +const EventEmitter = __webpack_require__(155).EventEmitter; const path = __webpack_require__(4); -const normalizeOptions = __webpack_require__(687); -const stat = __webpack_require__(689); -const call = __webpack_require__(690); +const normalizeOptions = __webpack_require__(700); +const stat = __webpack_require__(702); +const call = __webpack_require__(703); /** * Asynchronously reads the contents of a directory and streams the results @@ -82473,14 +85246,14 @@ module.exports = DirectoryReader; /***/ }), -/* 687 */ +/* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const globToRegExp = __webpack_require__(688); +const globToRegExp = __webpack_require__(701); module.exports = normalizeOptions; @@ -82657,7 +85430,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 688 */ +/* 701 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -82794,13 +85567,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 689 */ +/* 702 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(690); +const call = __webpack_require__(703); module.exports = stat; @@ -82875,7 +85648,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 690 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82936,14 +85709,14 @@ function callOnce (fn) { /***/ }), -/* 691 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const call = __webpack_require__(690); +const fs = __webpack_require__(133); +const call = __webpack_require__(703); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -83007,7 +85780,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 692 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83036,7 +85809,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 693 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83044,12 +85817,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(694); -const DirectoryReader = __webpack_require__(686); +const maybe = __webpack_require__(707); +const DirectoryReader = __webpack_require__(699); let asyncFacade = { - fs: __webpack_require__(132), - forEach: __webpack_require__(695), + fs: __webpack_require__(133), + forEach: __webpack_require__(708), async: true }; @@ -83091,7 +85864,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 694 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83118,7 +85891,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 695 */ +/* 708 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83154,7 +85927,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 696 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83162,11 +85935,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(686); +const DirectoryReader = __webpack_require__(699); let streamFacade = { - fs: __webpack_require__(132), - forEach: __webpack_require__(695), + fs: __webpack_require__(133), + forEach: __webpack_require__(708), async: true }; @@ -83186,16 +85959,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 697 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var deep_1 = __webpack_require__(698); -var entry_1 = __webpack_require__(700); -var pathUtil = __webpack_require__(699); +var deep_1 = __webpack_require__(711); +var entry_1 = __webpack_require__(713); +var pathUtil = __webpack_require__(712); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -83261,14 +86034,14 @@ exports.default = Reader; /***/ }), -/* 698 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(699); -var patternUtils = __webpack_require__(516); +var pathUtils = __webpack_require__(712); +var patternUtils = __webpack_require__(529); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -83351,7 +86124,7 @@ exports.default = DeepFilter; /***/ }), -/* 699 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83382,14 +86155,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 700 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(699); -var patternUtils = __webpack_require__(516); +var pathUtils = __webpack_require__(712); +var patternUtils = __webpack_require__(529); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -83474,7 +86247,7 @@ exports.default = EntryFilter; /***/ }), -/* 701 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83493,9 +86266,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(136); -var fsStat = __webpack_require__(702); -var fs_1 = __webpack_require__(706); +var stream = __webpack_require__(137); +var fsStat = __webpack_require__(715); +var fs_1 = __webpack_require__(719); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -83545,14 +86318,14 @@ exports.default = FileSystemStream; /***/ }), -/* 702 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(703); -const statProvider = __webpack_require__(705); +const optionsManager = __webpack_require__(716); +const statProvider = __webpack_require__(718); /** * Asynchronous API. */ @@ -83583,13 +86356,13 @@ exports.statSync = statSync; /***/ }), -/* 703 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(704); +const fsAdapter = __webpack_require__(717); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -83602,13 +86375,13 @@ exports.prepare = prepare; /***/ }), -/* 704 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); exports.FILE_SYSTEM_ADAPTER = { lstat: fs.lstat, stat: fs.stat, @@ -83625,7 +86398,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 705 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83677,7 +86450,7 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 706 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83708,7 +86481,7 @@ exports.default = FileSystem; /***/ }), -/* 707 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83727,10 +86500,10 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var stream = __webpack_require__(136); -var readdir = __webpack_require__(684); -var reader_1 = __webpack_require__(697); -var fs_stream_1 = __webpack_require__(701); +var stream = __webpack_require__(137); +var readdir = __webpack_require__(697); +var reader_1 = __webpack_require__(710); +var fs_stream_1 = __webpack_require__(714); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -83798,7 +86571,7 @@ exports.default = ReaderStream; /***/ }), -/* 708 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83817,9 +86590,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(684); -var reader_1 = __webpack_require__(697); -var fs_sync_1 = __webpack_require__(709); +var readdir = __webpack_require__(697); +var reader_1 = __webpack_require__(710); +var fs_sync_1 = __webpack_require__(722); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -83879,7 +86652,7 @@ exports.default = ReaderSync; /***/ }), -/* 709 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83898,8 +86671,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(702); -var fs_1 = __webpack_require__(706); +var fsStat = __webpack_require__(715); +var fs_1 = __webpack_require__(719); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -83945,7 +86718,7 @@ exports.default = FileSystemSync; /***/ }), -/* 710 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83961,13 +86734,13 @@ exports.flatten = flatten; /***/ }), -/* 711 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var merge2 = __webpack_require__(284); +var merge2 = __webpack_require__(299); /** * Merge multiple streams and propagate their errors into one stream in parallel. */ @@ -83982,13 +86755,13 @@ exports.merge = merge; /***/ }), -/* 712 */ +/* 725 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(713); +const pathType = __webpack_require__(726); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -84054,13 +86827,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 713 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); -const pify = __webpack_require__(714); +const fs = __webpack_require__(133); +const pify = __webpack_require__(727); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -84103,7 +86876,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 714 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84194,17 +86967,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 715 */ +/* 728 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(512); -const gitIgnore = __webpack_require__(716); -const pify = __webpack_require__(717); -const slash = __webpack_require__(718); +const fastGlob = __webpack_require__(525); +const gitIgnore = __webpack_require__(729); +const pify = __webpack_require__(730); +const slash = __webpack_require__(731); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -84302,7 +87075,7 @@ module.exports.sync = options => { /***/ }), -/* 716 */ +/* 729 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -84771,7 +87544,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 717 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84846,7 +87619,7 @@ module.exports = (input, options) => { /***/ }), -/* 718 */ +/* 731 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84864,7 +87637,7 @@ module.exports = input => { /***/ }), -/* 719 */ +/* 732 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -84874,7 +87647,7 @@ module.exports = input => { * Released under the MIT License. */ -var isExtglob = __webpack_require__(300); +var isExtglob = __webpack_require__(315); var chars = { '{': '}', '(': ')', '[': ']'}; var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; @@ -84918,17 +87691,17 @@ module.exports = function isGlob(str, options) { /***/ }), -/* 720 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const {constants: fsConstants} = __webpack_require__(132); -const pEvent = __webpack_require__(721); -const CpFileError = __webpack_require__(724); -const fs = __webpack_require__(728); -const ProgressEmitter = __webpack_require__(731); +const {constants: fsConstants} = __webpack_require__(133); +const pEvent = __webpack_require__(734); +const CpFileError = __webpack_require__(737); +const fs = __webpack_require__(741); +const ProgressEmitter = __webpack_require__(744); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -85042,12 +87815,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 721 */ +/* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(722); +const pTimeout = __webpack_require__(735); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -85338,12 +88111,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 722 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(723); +const pFinally = __webpack_require__(736); class TimeoutError extends Error { constructor(message) { @@ -85389,7 +88162,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 723 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85411,12 +88184,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 724 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(725); +const NestedError = __webpack_require__(738); class CpFileError extends NestedError { constructor(message, nested) { @@ -85430,10 +88203,10 @@ module.exports = CpFileError; /***/ }), -/* 725 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(726); +var inherits = __webpack_require__(739); var NestedError = function (message, nested) { this.nested = nested; @@ -85484,7 +88257,7 @@ module.exports = NestedError; /***/ }), -/* 726 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -85492,12 +88265,12 @@ try { if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(727); + module.exports = __webpack_require__(740); } /***/ }), -/* 727 */ +/* 740 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -85526,16 +88299,16 @@ if (typeof Object.create === 'function') { /***/ }), -/* 728 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(111); -const fs = __webpack_require__(131); -const makeDir = __webpack_require__(729); -const pEvent = __webpack_require__(721); -const CpFileError = __webpack_require__(724); +const fs = __webpack_require__(132); +const makeDir = __webpack_require__(742); +const pEvent = __webpack_require__(734); +const CpFileError = __webpack_require__(737); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -85632,15 +88405,15 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 729 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const fs = __webpack_require__(132); +const fs = __webpack_require__(133); const path = __webpack_require__(4); const {promisify} = __webpack_require__(111); -const semver = __webpack_require__(730); +const semver = __webpack_require__(743); const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); @@ -85795,7 +88568,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 730 */ +/* 743 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -87397,12 +90170,12 @@ function coerce (version, options) { /***/ }), -/* 731 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const EventEmitter = __webpack_require__(154); +const EventEmitter = __webpack_require__(155); const written = new WeakMap(); @@ -87438,7 +90211,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 732 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87484,12 +90257,12 @@ exports.default = module.exports; /***/ }), -/* 733 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(734); +const NestedError = __webpack_require__(747); class CpyError extends NestedError { constructor(message, nested) { @@ -87503,7 +90276,7 @@ module.exports = CpyError; /***/ }), -/* 734 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(111).inherits; @@ -87559,14 +90332,14 @@ module.exports = NestedError; /***/ }), -/* 735 */ +/* 748 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return prepareExternalProjectDependencies; }); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(163); -/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(162); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(164); +/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(163); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with diff --git a/packages/kbn-pm/package.json b/packages/kbn-pm/package.json index 3e40bf40222e..78fa48979c1b 100644 --- a/packages/kbn-pm/package.json +++ b/packages/kbn-pm/package.json @@ -35,7 +35,7 @@ "@kbn/dev-utils": "1.0.0", "@yarnpkg/lockfile": "^1.1.0", "babel-loader": "^8.0.6", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "cmd-shim": "^2.1.0", "cpy": "^8.0.0", "dedent": "^0.7.0", diff --git a/packages/kbn-test/package.json b/packages/kbn-test/package.json index 9482ea83cc25..f86bcfd2bb7b 100644 --- a/packages/kbn-test/package.json +++ b/packages/kbn-test/package.json @@ -21,7 +21,7 @@ "diff": "^4.0.1" }, "dependencies": { - "chalk": "^2.4.2", + "chalk": "^4.1.0", "dedent": "^0.7.0", "del": "^5.1.0", "exit-hook": "^2.2.0", diff --git a/packages/kbn-ui-framework/package.json b/packages/kbn-ui-framework/package.json index a095d9ac2a77..a2151ca3381b 100644 --- a/packages/kbn-ui-framework/package.json +++ b/packages/kbn-ui-framework/package.json @@ -36,7 +36,7 @@ "@kbn/optimizer": "1.0.0", "babel-loader": "^8.0.6", "brace": "0.11.1", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "chokidar": "3.2.1", "core-js": "^3.6.4", "css-loader": "^3.4.2", diff --git a/src/dev/typescript/exec_in_projects.ts b/src/dev/typescript/exec_in_projects.ts index 5197aa67c726..92f71b9bb864 100644 --- a/src/dev/typescript/exec_in_projects.ts +++ b/src/dev/typescript/exec_in_projects.ts @@ -43,7 +43,7 @@ export function execInProjects( // execute in the current working directory so that relative paths in errors // are relative from the right location cwd: process.cwd(), - env: chalk.enabled ? { FORCE_COLOR: 'true' } : {}, + env: chalk.level > 0 ? { FORCE_COLOR: 'true' } : {}, stdio: ['ignore', 'pipe', 'pipe'], preferLocal: true, }).catch((error) => { diff --git a/x-pack/package.json b/x-pack/package.json index 7533741391f8..962233a3a397 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -131,7 +131,7 @@ "base64-js": "^1.3.1", "base64url": "^3.0.1", "canvas": "^2.6.1", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "chance": "1.0.18", "cheerio": "0.22.0", "commander": "3.0.2", diff --git a/yarn.lock b/yarn.lock index 6f82c8126ac0..101f735355f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9905,14 +9905,14 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.8.2, color-convert@^1.9.0: +color-convert@^1.8.2: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== dependencies: color-name "^1.1.1" -color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -28888,14 +28888,14 @@ supports-color@^3.1.2: dependencies: has-flag "^1.0.0" -supports-color@^5.0.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^5.2.0, supports-color@^5.3.0: +supports-color@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" integrity sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg== From 67025579ba6650154e5b565f6d8e2c6d35c8fec0 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Tue, 11 Aug 2020 15:00:02 +0100 Subject: [PATCH 06/25] [Event log] Use Alerts client & Actions client when fetching these types of SOs (#73257) Introduces a pluggable API to Event Log which allows custom Providers for Saved Objects which is used to ensure a user is authorised to get the Saved Object referenced in the Event Log whenever the find api is called. --- x-pack/.i18nrc.json | 1 + x-pack/plugins/actions/server/plugin.ts | 7 ++ x-pack/plugins/alerts/server/plugin.ts | 7 ++ .../event_log/server/event_log_client.test.ts | 55 ++++++----- .../event_log/server/event_log_client.ts | 18 ++-- .../server/event_log_service.mock.ts | 1 + .../server/event_log_service.test.ts | 25 +++++ .../event_log/server/event_log_service.ts | 16 ++- .../server/event_log_start_service.test.ts | 11 +-- .../server/event_log_start_service.ts | 29 +++--- .../event_log/server/event_logger.test.ts | 2 + x-pack/plugins/event_log/server/plugin.ts | 11 ++- .../saved_object_provider_registry.mock.ts | 19 ++++ .../saved_object_provider_registry.test.ts | 98 +++++++++++++++++++ .../server/saved_object_provider_registry.ts | 68 +++++++++++++ x-pack/plugins/event_log/server/types.ts | 3 +- .../plugins/alerts/server/alert_types.ts | 4 +- .../fixtures/plugins/alerts/server/plugin.ts | 6 ++ 18 files changed, 319 insertions(+), 62 deletions(-) create mode 100644 x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts create mode 100644 x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts create mode 100644 x-pack/plugins/event_log/server/saved_object_provider_registry.ts diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index d0055008eb9b..69ad9ad33bf7 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -4,6 +4,7 @@ "xpack.actions": "plugins/actions", "xpack.uiActionsEnhanced": ["plugins/ui_actions_enhanced", "examples/ui_actions_enhanced_examples"], "xpack.alerts": "plugins/alerts", + "xpack.eventLog": "plugins/event_log", "xpack.alertingBuiltins": "plugins/alerting_builtins", "xpack.apm": ["legacy/plugins/apm", "plugins/apm"], "xpack.beatsManagement": ["legacy/plugins/beats_management", "plugins/beats_management"], diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index 54d137cc0f61..ee50ee81d507 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -123,6 +123,7 @@ export class ActionsPlugin implements Plugin, Plugi private licenseState: ILicenseState | null = null; private spaces?: SpacesServiceSetup; private security?: SecurityPluginSetup; + private eventLogService?: IEventLogService; private eventLogger?: IEventLogger; private isESOUsingEphemeralEncryptionKey?: boolean; private readonly telemetryLogger: Logger; @@ -160,6 +161,7 @@ export class ActionsPlugin implements Plugin, Plugi plugins.features.registerFeature(ACTIONS_FEATURE); setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects); + this.eventLogService = plugins.eventLog; plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS)); this.eventLogger = plugins.eventLog.getLogger({ event: { provider: EVENT_LOG_PROVIDER }, @@ -295,6 +297,11 @@ export class ActionsPlugin implements Plugin, Plugi }); }; + this.eventLogService!.registerSavedObjectProvider('action', (request) => { + const client = getActionsClientWithRequest(request); + return async (type: string, id: string) => (await client).get({ id }); + }); + const getScopedSavedObjectsClientWithoutAccessToActions = (request: KibanaRequest) => core.savedObjects.getScopedClient(request); diff --git a/x-pack/plugins/alerts/server/plugin.ts b/x-pack/plugins/alerts/server/plugin.ts index 2f0df4419755..5d69887bd5bf 100644 --- a/x-pack/plugins/alerts/server/plugin.ts +++ b/x-pack/plugins/alerts/server/plugin.ts @@ -106,6 +106,7 @@ export class AlertingPlugin { private readonly alertsClientFactory: AlertsClientFactory; private readonly telemetryLogger: Logger; private readonly kibanaIndex: Promise; + private eventLogService?: IEventLogService; private eventLogger?: IEventLogger; constructor(initializerContext: PluginInitializerContext) { @@ -150,6 +151,7 @@ export class AlertingPlugin { setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects); + this.eventLogService = plugins.eventLog; plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS)); this.eventLogger = plugins.eventLog.getLogger({ event: { provider: EVENT_LOG_PROVIDER }, @@ -255,6 +257,11 @@ export class AlertingPlugin { eventLogger: this.eventLogger!, }); + this.eventLogService!.registerSavedObjectProvider('alert', (request) => { + const client = getAlertsClientWithRequest(request); + return (type: string, id: string) => client.get({ id }); + }); + scheduleAlertingTelemetry(this.telemetryLogger, plugins.taskManager); return { diff --git a/x-pack/plugins/event_log/server/event_log_client.test.ts b/x-pack/plugins/event_log/server/event_log_client.test.ts index 917d517a6e27..3273fe847080 100644 --- a/x-pack/plugins/event_log/server/event_log_client.test.ts +++ b/x-pack/plugins/event_log/server/event_log_client.test.ts @@ -7,7 +7,6 @@ import { KibanaRequest } from 'src/core/server'; import { EventLogClient } from './event_log_client'; import { contextMock } from './es/context.mock'; -import { savedObjectsClientMock } from 'src/core/server/mocks'; import { merge } from 'lodash'; import moment from 'moment'; @@ -15,14 +14,15 @@ describe('EventLogStart', () => { describe('findEventsBySavedObject', () => { test('verifies that the user can access the specified saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -31,19 +31,21 @@ describe('EventLogStart', () => { await eventLogClient.findEventsBySavedObject('saved-object-type', 'saved-object-id'); - expect(savedObjectsClient.get).toHaveBeenCalledWith('saved-object-type', 'saved-object-id'); + expect(savedObjectGetter).toHaveBeenCalledWith('saved-object-type', 'saved-object-id'); }); test('throws when the user doesnt have permission to access the specified saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockRejectedValue(new Error('Fail')); + savedObjectGetter.mockRejectedValue(new Error('Fail')); expect( eventLogClient.findEventsBySavedObject('saved-object-type', 'saved-object-id') @@ -52,14 +54,16 @@ describe('EventLogStart', () => { test('fetches all event that reference the saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -125,14 +129,16 @@ describe('EventLogStart', () => { test('fetches all events in time frame that reference the saved object', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -206,14 +212,16 @@ describe('EventLogStart', () => { test('validates that the start date is valid', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -236,14 +244,16 @@ describe('EventLogStart', () => { test('validates that the end date is valid', async () => { const esContext = contextMock.create(); - const savedObjectsClient = savedObjectsClientMock.create(); + + const savedObjectGetter = jest.fn(); + const eventLogClient = new EventLogClient({ esContext, - savedObjectsClient, + savedObjectGetter, request: FakeRequest(), }); - savedObjectsClient.get.mockResolvedValueOnce({ + savedObjectGetter.mockResolvedValueOnce({ id: 'saved-object-id', type: 'saved-object-type', attributes: {}, @@ -297,7 +307,8 @@ function fakeEvent(overrides = {}) { } function FakeRequest(): KibanaRequest { - const savedObjectsClient = savedObjectsClientMock.create(); + const savedObjectGetter = jest.fn(); + return ({ headers: {}, getBasePath: () => '', @@ -311,6 +322,6 @@ function FakeRequest(): KibanaRequest { url: '/', }, }, - getSavedObjectsClient: () => savedObjectsClient, + getSavedObjectsClient: () => savedObjectGetter, } as unknown) as KibanaRequest; } diff --git a/x-pack/plugins/event_log/server/event_log_client.ts b/x-pack/plugins/event_log/server/event_log_client.ts index f4115e06160d..32fd99d17002 100644 --- a/x-pack/plugins/event_log/server/event_log_client.ts +++ b/x-pack/plugins/event_log/server/event_log_client.ts @@ -6,12 +6,13 @@ import { Observable } from 'rxjs'; import { schema, TypeOf } from '@kbn/config-schema'; -import { LegacyClusterClient, SavedObjectsClientContract, KibanaRequest } from 'src/core/server'; +import { LegacyClusterClient, KibanaRequest } from 'src/core/server'; import { SpacesServiceSetup } from '../../spaces/server'; import { EsContext } from './es'; import { IEventLogClient } from './types'; import { QueryEventsBySavedObjectResult } from './es/cluster_client_adapter'; +import { SavedObjectGetter } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; export type AdminClusterClient$ = Observable; @@ -58,7 +59,7 @@ export type FindOptionsType = Pick< interface EventLogServiceCtorParams { esContext: EsContext; - savedObjectsClient: SavedObjectsClientContract; + savedObjectGetter: SavedObjectGetter; spacesService?: SpacesServiceSetup; request: KibanaRequest; } @@ -66,18 +67,13 @@ interface EventLogServiceCtorParams { // note that clusterClient may be null, indicating we can't write to ES export class EventLogClient implements IEventLogClient { private esContext: EsContext; - private savedObjectsClient: SavedObjectsClientContract; + private savedObjectGetter: SavedObjectGetter; private spacesService?: SpacesServiceSetup; private request: KibanaRequest; - constructor({ - esContext, - savedObjectsClient, - spacesService, - request, - }: EventLogServiceCtorParams) { + constructor({ esContext, savedObjectGetter, spacesService, request }: EventLogServiceCtorParams) { this.esContext = esContext; - this.savedObjectsClient = savedObjectsClient; + this.savedObjectGetter = savedObjectGetter; this.spacesService = spacesService; this.request = request; } @@ -93,7 +89,7 @@ export class EventLogClient implements IEventLogClient { const namespace = space && this.spacesService?.spaceIdToNamespace(space.id); // verify the user has the required permissions to view this saved object - await this.savedObjectsClient.get(type, id); + await this.savedObjectGetter(type, id); return await this.esContext.esAdapter.queryEventsBySavedObject( this.esContext.esNames.alias, diff --git a/x-pack/plugins/event_log/server/event_log_service.mock.ts b/x-pack/plugins/event_log/server/event_log_service.mock.ts index 805c241414a2..877e5d59a183 100644 --- a/x-pack/plugins/event_log/server/event_log_service.mock.ts +++ b/x-pack/plugins/event_log/server/event_log_service.mock.ts @@ -15,6 +15,7 @@ const createEventLogServiceMock = () => { registerProviderActions: jest.fn(), isProviderActionRegistered: jest.fn(), getProviderActions: jest.fn(), + registerSavedObjectProvider: jest.fn(), getLogger: jest.fn().mockReturnValue(eventLoggerMock.create()), }; return mock; diff --git a/x-pack/plugins/event_log/server/event_log_service.test.ts b/x-pack/plugins/event_log/server/event_log_service.test.ts index 2cf68592f2fa..2b92443569f4 100644 --- a/x-pack/plugins/event_log/server/event_log_service.test.ts +++ b/x-pack/plugins/event_log/server/event_log_service.test.ts @@ -8,9 +8,11 @@ import { IEventLogConfig } from './types'; import { EventLogService } from './event_log_service'; import { contextMock } from './es/context.mock'; import { loggingSystemMock } from 'src/core/server/mocks'; +import { savedObjectProviderRegistryMock } from './saved_object_provider_registry.mock'; const loggingService = loggingSystemMock.create(); const systemLogger = loggingService.get(); +const savedObjectProviderRegistry = savedObjectProviderRegistryMock.create(); describe('EventLogService', () => { const esContext = contextMock.create(); @@ -21,6 +23,7 @@ describe('EventLogService', () => { esContext, systemLogger, kibanaUUID: '42', + savedObjectProviderRegistry, config: { enabled, logEntries, @@ -65,6 +68,7 @@ describe('EventLogService', () => { esContext, systemLogger, kibanaUUID: '42', + savedObjectProviderRegistry, config: { enabled: true, logEntries: true, @@ -102,6 +106,7 @@ describe('EventLogService', () => { esContext, systemLogger, kibanaUUID: '42', + savedObjectProviderRegistry, config: { enabled: true, logEntries: true, @@ -112,4 +117,24 @@ describe('EventLogService', () => { const eventLogger = service.getLogger({}); expect(eventLogger).toBeTruthy(); }); + + describe('registerSavedObjectProvider', () => { + test('register SavedObject Providers in the registry', () => { + const params = { + esContext, + systemLogger, + kibanaUUID: '42', + savedObjectProviderRegistry, + config: { + enabled: true, + logEntries: true, + indexEntries: true, + }, + }; + const service = new EventLogService(params); + const provider = jest.fn(); + service.registerSavedObjectProvider('myType', provider); + expect(savedObjectProviderRegistry.registerProvider).toHaveBeenCalledWith('myType', provider); + }); + }); }); diff --git a/x-pack/plugins/event_log/server/event_log_service.ts b/x-pack/plugins/event_log/server/event_log_service.ts index f7f915f1cf0e..9249288d3393 100644 --- a/x-pack/plugins/event_log/server/event_log_service.ts +++ b/x-pack/plugins/event_log/server/event_log_service.ts @@ -11,6 +11,7 @@ import { Plugin } from './plugin'; import { EsContext } from './es'; import { IEvent, IEventLogger, IEventLogService, IEventLogConfig } from './types'; import { EventLogger } from './event_logger'; +import { SavedObjectProvider, SavedObjectProviderRegistry } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; export type AdminClusterClient$ = Observable; @@ -21,6 +22,7 @@ interface EventLogServiceCtorParams { esContext: EsContext; kibanaUUID: string; systemLogger: SystemLogger; + savedObjectProviderRegistry: SavedObjectProviderRegistry; } // note that clusterClient may be null, indicating we can't write to ES @@ -29,15 +31,23 @@ export class EventLogService implements IEventLogService { private esContext: EsContext; private systemLogger: SystemLogger; private registeredProviderActions: Map>; + private savedObjectProviderRegistry: SavedObjectProviderRegistry; public readonly kibanaUUID: string; - constructor({ config, esContext, kibanaUUID, systemLogger }: EventLogServiceCtorParams) { + constructor({ + config, + esContext, + kibanaUUID, + systemLogger, + savedObjectProviderRegistry, + }: EventLogServiceCtorParams) { this.config = config; this.esContext = esContext; this.kibanaUUID = kibanaUUID; this.systemLogger = systemLogger; this.registeredProviderActions = new Map>(); + this.savedObjectProviderRegistry = savedObjectProviderRegistry; } public isEnabled(): boolean { @@ -77,6 +87,10 @@ export class EventLogService implements IEventLogService { return new Map(this.registeredProviderActions.entries()); } + registerSavedObjectProvider(type: string, provider: SavedObjectProvider) { + return this.savedObjectProviderRegistry.registerProvider(type, provider); + } + getLogger(initialProperties: IEvent): IEventLogger { return new EventLogger({ esContext: this.esContext, diff --git a/x-pack/plugins/event_log/server/event_log_start_service.test.ts b/x-pack/plugins/event_log/server/event_log_start_service.test.ts index 3bd5ef7c0b3b..cbdc168a8ffd 100644 --- a/x-pack/plugins/event_log/server/event_log_start_service.test.ts +++ b/x-pack/plugins/event_log/server/event_log_start_service.test.ts @@ -5,10 +5,11 @@ */ import { KibanaRequest } from 'src/core/server'; -import { savedObjectsClientMock, savedObjectsServiceMock } from 'src/core/server/mocks'; +import { savedObjectsClientMock } from 'src/core/server/mocks'; import { EventLogClientService } from './event_log_start_service'; import { contextMock } from './es/context.mock'; +import { savedObjectProviderRegistryMock } from './saved_object_provider_registry.mock'; jest.mock('./event_log_client'); @@ -17,19 +18,17 @@ describe('EventLogClientService', () => { describe('getClient', () => { test('creates a client with a scoped SavedObjects client', () => { - const savedObjectsService = savedObjectsServiceMock.createStartContract(); + const savedObjectProviderRegistry = savedObjectProviderRegistryMock.create(); const request = fakeRequest(); const eventLogStartService = new EventLogClientService({ esContext, - savedObjectsService, + savedObjectProviderRegistry, }); eventLogStartService.getClient(request); - expect(savedObjectsService.getScopedClient).toHaveBeenCalledWith(request, { - includedHiddenTypes: ['action', 'alert'], - }); + expect(savedObjectProviderRegistry.getProvidersClient).toHaveBeenCalledWith(request); }); }); }); diff --git a/x-pack/plugins/event_log/server/event_log_start_service.ts b/x-pack/plugins/event_log/server/event_log_start_service.ts index 8b752684c1cc..5cadab4df3ed 100644 --- a/x-pack/plugins/event_log/server/event_log_start_service.ts +++ b/x-pack/plugins/event_log/server/event_log_start_service.ts @@ -5,49 +5,42 @@ */ import { Observable } from 'rxjs'; -import { - LegacyClusterClient, - KibanaRequest, - SavedObjectsServiceStart, - SavedObjectsClientContract, -} from 'src/core/server'; +import { LegacyClusterClient, KibanaRequest } from 'src/core/server'; import { SpacesServiceSetup } from '../../spaces/server'; import { EsContext } from './es'; import { IEventLogClientService } from './types'; import { EventLogClient } from './event_log_client'; +import { SavedObjectProviderRegistry } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; export type AdminClusterClient$ = Observable; -const includedHiddenTypes = ['action', 'alert']; - interface EventLogServiceCtorParams { esContext: EsContext; - savedObjectsService: SavedObjectsServiceStart; + savedObjectProviderRegistry: SavedObjectProviderRegistry; spacesService?: SpacesServiceSetup; } // note that clusterClient may be null, indicating we can't write to ES export class EventLogClientService implements IEventLogClientService { private esContext: EsContext; - private savedObjectsService: SavedObjectsServiceStart; + private savedObjectProviderRegistry: SavedObjectProviderRegistry; private spacesService?: SpacesServiceSetup; - constructor({ esContext, savedObjectsService, spacesService }: EventLogServiceCtorParams) { + constructor({ + esContext, + savedObjectProviderRegistry, + spacesService, + }: EventLogServiceCtorParams) { this.esContext = esContext; - this.savedObjectsService = savedObjectsService; + this.savedObjectProviderRegistry = savedObjectProviderRegistry; this.spacesService = spacesService; } getClient(request: KibanaRequest) { - const savedObjectsClient: SavedObjectsClientContract = this.savedObjectsService.getScopedClient( - request, - { includedHiddenTypes } - ); - return new EventLogClient({ esContext: this.esContext, - savedObjectsClient, + savedObjectGetter: this.savedObjectProviderRegistry.getProvidersClient(request), spacesService: this.spacesService, request, }); diff --git a/x-pack/plugins/event_log/server/event_logger.test.ts b/x-pack/plugins/event_log/server/event_logger.test.ts index fde3b2de8dd3..0ab3071f70ef 100644 --- a/x-pack/plugins/event_log/server/event_logger.test.ts +++ b/x-pack/plugins/event_log/server/event_logger.test.ts @@ -12,6 +12,7 @@ import { contextMock } from './es/context.mock'; import { loggingSystemMock } from 'src/core/server/mocks'; import { delay } from './lib/delay'; import { EVENT_LOGGED_PREFIX } from './event_logger'; +import { savedObjectProviderRegistryMock } from './saved_object_provider_registry.mock'; const KIBANA_SERVER_UUID = '424-24-2424'; const WRITE_LOG_WAIT_MILLIS = 3000; @@ -31,6 +32,7 @@ describe('EventLogger', () => { systemLogger, config: { enabled: true, logEntries: true, indexEntries: true }, kibanaUUID: KIBANA_SERVER_UUID, + savedObjectProviderRegistry: savedObjectProviderRegistryMock.create(), }); eventLogger = service.getLogger({}); }); diff --git a/x-pack/plugins/event_log/server/plugin.ts b/x-pack/plugins/event_log/server/plugin.ts index 9e36ca10b71f..1353877fa462 100644 --- a/x-pack/plugins/event_log/server/plugin.ts +++ b/x-pack/plugins/event_log/server/plugin.ts @@ -30,6 +30,7 @@ import { findRoute } from './routes'; import { EventLogService } from './event_log_service'; import { createEsContext, EsContext } from './es'; import { EventLogClientService } from './event_log_start_service'; +import { SavedObjectProviderRegistry } from './saved_object_provider_registry'; export type PluginClusterClient = Pick; @@ -53,11 +54,13 @@ export class Plugin implements CorePlugin; private eventLogClientService?: EventLogClientService; private spacesService?: SpacesServiceSetup; + private savedObjectProviderRegistry: SavedObjectProviderRegistry; constructor(private readonly context: PluginInitializerContext) { this.systemLogger = this.context.logger.get(); this.config$ = this.context.config.create(); this.globalConfig$ = this.context.config.legacy.globalConfig$; + this.savedObjectProviderRegistry = new SavedObjectProviderRegistry(); } async setup(core: CoreSetup, { spaces }: PluginSetupDeps): Promise { @@ -83,6 +86,7 @@ export class Plugin implements CorePlugin { + const client = core.savedObjects.getScopedClient(request); + return client.get.bind(client); + }); + this.eventLogClientService = new EventLogClientService({ esContext: this.esContext, - savedObjectsService: core.savedObjects, + savedObjectProviderRegistry: this.savedObjectProviderRegistry, spacesService: this.spacesService, }); return this.eventLogClientService; diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts new file mode 100644 index 000000000000..433deaf7bff7 --- /dev/null +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.mock.ts @@ -0,0 +1,19 @@ +/* + * 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 { SavedObjectProviderRegistry } from './saved_object_provider_registry'; + +const createSavedObjectProviderRegistryMock = () => { + return ({ + registerProvider: jest.fn(), + registerDefaultProvider: jest.fn(), + getProvidersClient: jest.fn(), + } as unknown) as jest.Mocked; +}; + +export const savedObjectProviderRegistryMock = { + create: createSavedObjectProviderRegistryMock, +}; diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts new file mode 100644 index 000000000000..6a02d54c8751 --- /dev/null +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts @@ -0,0 +1,98 @@ +/* + * 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 { SavedObjectProviderRegistry } from './saved_object_provider_registry'; +import uuid from 'uuid'; +import { KibanaRequest } from 'src/core/server'; +import { savedObjectsClientMock } from 'src/core/server/mocks'; + +describe('SavedObjectProviderRegistry', () => { + beforeEach(() => jest.resetAllMocks()); + + describe('registerProvider()', () => { + test('should register providers', () => { + const registry = new SavedObjectProviderRegistry(); + registry.registerProvider('alert', jest.fn()); + }); + + test('should throw an error if type is already registered', () => { + const registry = new SavedObjectProviderRegistry(); + registry.registerProvider('alert', jest.fn()); + expect(() => + registry.registerProvider('alert', jest.fn()) + ).toThrowErrorMatchingInlineSnapshot( + `"The Event Log has already registered a Provider for the Save Object type \\"alert\\"."` + ); + }); + }); + + describe('getProvidersClient()', () => { + test('should get SavedObject using the registered provider by type', async () => { + const registry = new SavedObjectProviderRegistry(); + registry.registerDefaultProvider(jest.fn()); + + const getter = jest.fn(); + const provider = jest.fn().mockReturnValue(getter); + registry.registerProvider('alert', provider); + + const request = fakeRequest(); + const alert = { + id: uuid.v4(), + }; + + getter.mockResolvedValue(alert); + + expect(await registry.getProvidersClient(request)('alert', alert.id)).toMatchObject(alert); + + expect(provider).toHaveBeenCalledWith(request); + expect(getter).toHaveBeenCalledWith('alert', alert.id); + }); + + test('should get SavedObject using the default provider for unregistered types', async () => { + const registry = new SavedObjectProviderRegistry(); + const defaultProvider = jest.fn(); + registry.registerDefaultProvider(defaultProvider); + + registry.registerProvider('alert', jest.fn().mockReturnValue(jest.fn())); + + const request = fakeRequest(); + const action = { + id: uuid.v4(), + type: 'action', + attributes: {}, + references: [], + }; + + const getter = jest.fn(); + defaultProvider.mockReturnValue(getter); + getter.mockResolvedValue(action); + + expect(await registry.getProvidersClient(request)('action', action.id)).toMatchObject(action); + + expect(getter).toHaveBeenCalledWith('action', action.id); + expect(defaultProvider).toHaveBeenCalledWith(request); + }); + }); +}); + +function fakeRequest(): KibanaRequest { + const savedObjectsClient = savedObjectsClientMock.create(); + return ({ + headers: {}, + getBasePath: () => '', + path: '/', + route: { settings: {} }, + url: { + href: '/', + }, + raw: { + req: { + url: '/', + }, + }, + getSavedObjectsClient: () => savedObjectsClient, + } as unknown) as KibanaRequest; +} diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.ts new file mode 100644 index 000000000000..87a1da5dd6f4 --- /dev/null +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.ts @@ -0,0 +1,68 @@ +/* + * 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 { KibanaRequest, SavedObjectsClientContract } from 'src/core/server'; + +import { fromNullable, getOrElse } from 'fp-ts/lib/Option'; +import { pipe } from 'fp-ts/lib/pipeable'; + +export type SavedObjectGetter = ( + ...params: Parameters +) => Promise; +export type SavedObjectProvider = (request: KibanaRequest) => SavedObjectGetter; + +export class SavedObjectProviderRegistry { + private providers = new Map(); + private defaultProvider?: SavedObjectProvider; + + constructor() {} + + public registerDefaultProvider(provider: SavedObjectProvider) { + this.defaultProvider = provider; + } + + public registerProvider(type: string, provider: SavedObjectProvider) { + if (this.providers.has(type)) { + throw new Error( + `The Event Log has already registered a Provider for the Save Object type "${type}".` + ); + } + this.providers.set(type, provider); + } + + public getProvidersClient(request: KibanaRequest): SavedObjectGetter { + if (!this.defaultProvider) { + throw new Error( + i18n.translate( + 'xpack.eventLog.savedObjectProviderRegistry.getProvidersClient.noDefaultProvider', + { + defaultMessage: 'The Event Log requires a default Provider.', + } + ) + ); + } + + // `scopedProviders` is a cache of providers which are scoped t othe current request. + // The client will only instantiate a provider on-demand and it will cache each + // one to enable the request to reuse each provider. + const scopedProviders = new Map(); + const defaultGetter = this.defaultProvider(request); + return (type: string, id: string) => { + const getter = pipe( + fromNullable(scopedProviders.get(type)), + getOrElse(() => { + const client = this.providers.has(type) + ? this.providers.get(type)!(request) + : defaultGetter; + scopedProviders.set(type, client); + return client; + }) + ); + return getter(type, id); + }; + } +} diff --git a/x-pack/plugins/event_log/server/types.ts b/x-pack/plugins/event_log/server/types.ts index 1a37c4e58d07..cda957922062 100644 --- a/x-pack/plugins/event_log/server/types.ts +++ b/x-pack/plugins/event_log/server/types.ts @@ -12,6 +12,7 @@ export { IEvent, IValidatedEvent, EventSchema, ECS_VERSION } from '../generated/ import { IEvent } from '../generated/schemas'; import { FindOptionsType } from './event_log_client'; import { QueryEventsBySavedObjectResult } from './es/cluster_client_adapter'; +import { SavedObjectProvider } from './saved_object_provider_registry'; export const SAVED_OBJECT_REL_PRIMARY = 'primary'; @@ -40,7 +41,7 @@ export interface IEventLogService { registerProviderActions(provider: string, actions: string[]): void; isProviderActionRegistered(provider: string, action: string): boolean; getProviderActions(): Map>; - + registerSavedObjectProvider(type: string, provider: SavedObjectProvider): void; getLogger(properties: IEvent): IEventLogger; } diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts index ebf639067518..269a9d3a504a 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/alert_types.ts @@ -296,7 +296,7 @@ export function defineAlertTypes( name: 'Default', }, ], - producer: 'alerting', + producer: 'alertsFixture', defaultActionGroupId: 'default', async executor({ services, params, state }: AlertExecutorOptions) { throw new Error('this alert is intended to fail'); @@ -306,7 +306,7 @@ export function defineAlertTypes( id: 'test.patternFiring', name: 'Test: Firing on a Pattern', actionGroups: [{ id: 'default', name: 'Default' }], - producer: 'alerting', + producer: 'alertsFixture', defaultActionGroupId: 'default', async executor(alertExecutorOptions: AlertExecutorOptions) { const { services, state, params } = alertExecutorOptions; diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts index 5881201a82e0..1b8a380eaaeb 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/server/plugin.ts @@ -40,6 +40,8 @@ export class FixturePlugin implements Plugin Date: Tue, 11 Aug 2020 10:03:41 -0400 Subject: [PATCH 07/25] [Ingest pipelines] Implement tabs in processor flyout (#74469) --- .../pipeline_processors_editor.test.tsx | 2 +- .../components/index.ts | 6 +- .../documentation_button.tsx | 0 .../field_components/index.ts | 0 .../field_components/xjson_editor.tsx | 0 .../index.ts | 6 +- .../manage_processor_form.container.tsx} | 8 +- .../manage_processor_form.tsx} | 122 +++++++++++------- .../processor_settings_fields.tsx | 52 ++++++++ .../common_fields/common_processor_fields.tsx | 0 .../processors/common_fields/index.ts | 0 .../common_fields/processor_type_field.tsx | 0 .../processors/custom.tsx | 0 .../processors/gsub.tsx | 0 .../processors/set.tsx | 0 .../pipeline_processors_editor_item.tsx | 43 +++--- .../context/processors_context.tsx | 10 +- .../pipeline_processors_editor/types.ts | 2 +- .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 20 files changed, 159 insertions(+), 98 deletions(-) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/documentation_button.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/field_components/index.ts (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/field_components/xjson_editor.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/index.ts (71%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form/processor_settings_form.container.tsx => manage_processor_form/manage_processor_form.container.tsx} (85%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form/processor_settings_form.tsx => manage_processor_form/manage_processor_form.tsx} (60%) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/common_fields/common_processor_fields.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/common_fields/index.ts (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/common_fields/processor_type_field.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/custom.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/gsub.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/{processor_settings_form => manage_processor_form}/processors/set.tsx (100%) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx index a45a677846b2..d3c5df02c837 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx @@ -186,7 +186,7 @@ describe('Pipeline Editor', () => { it('prevents moving a processor while in edit mode', () => { const { find, exists } = testBed; - find('processors>0.editItemButton').simulate('click'); + find('processors>0.manageItemButton').simulate('click'); expect(exists('processorSettingsForm')).toBe(true); expect(find('processors>0.moveItemButton').props().disabled).toBe(true); expect(find('processors>1.moveItemButton').props().disabled).toBe(true); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts index bf724be950fd..3b0ae477c871 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts @@ -5,10 +5,10 @@ */ export { - ProcessorSettingsForm, - ProcessorSettingsFromOnSubmitArg, + ManageProcessorForm, + ManageProcessorFormOnSubmitArg, OnSubmitHandler, -} from './processor_settings_form'; +} from './manage_processor_form'; export { ProcessorsTree, ProcessorInfo, OnActionHandler } from './processors_tree'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/documentation_button.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/documentation_button.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/documentation_button.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/documentation_button.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/index.ts diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/xjson_editor.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/field_components/xjson_editor.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/field_components/xjson_editor.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/index.ts similarity index 71% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/index.ts index 1a7da4891967..986bd52e911b 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/index.ts @@ -5,7 +5,7 @@ */ export { - ProcessorSettingsForm, - ProcessorSettingsFromOnSubmitArg, + ManageProcessorForm, + ManageProcessorFormOnSubmitArg, OnSubmitHandler, -} from './processor_settings_form.container'; +} from './manage_processor_form.container'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.container.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx similarity index 85% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.container.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx index 2a537ba082ee..ea137b87e66d 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.container.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.container.tsx @@ -9,12 +9,12 @@ import React, { FunctionComponent, useCallback, useEffect } from 'react'; import { useForm, OnFormUpdateArg, FormData } from '../../../../../shared_imports'; import { ProcessorInternal } from '../../types'; -import { ProcessorSettingsForm as ViewComponent } from './processor_settings_form'; +import { ManageProcessorForm as ViewComponent } from './manage_processor_form'; import { usePipelineProcessorsContext } from '../../context'; -export type ProcessorSettingsFromOnSubmitArg = Omit; +export type ManageProcessorFormOnSubmitArg = Omit; -export type OnSubmitHandler = (processor: ProcessorSettingsFromOnSubmitArg) => void; +export type OnSubmitHandler = (processor: ManageProcessorFormOnSubmitArg) => void; export type OnFormUpdateHandler = (form: OnFormUpdateArg) => void; @@ -27,7 +27,7 @@ interface Props { processor?: ProcessorInternal; } -export const ProcessorSettingsForm: FunctionComponent = ({ +export const ManageProcessorForm: FunctionComponent = ({ processor, onFormUpdate, onSubmit, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx similarity index 60% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx index b5b3a38bb6a6..4e172cce6302 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processor_settings_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/manage_processor_form.tsx @@ -6,15 +6,17 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import React, { FunctionComponent, memo, useEffect } from 'react'; +import React, { FunctionComponent, memo, useEffect, useState } from 'react'; import { EuiButton, EuiButtonEmpty, - EuiHorizontalRule, EuiFlyout, EuiFlyoutHeader, EuiFlyoutBody, EuiFlyoutFooter, + EuiSpacer, + EuiTabs, + EuiTab, EuiTitle, EuiFlexGroup, EuiFlexItem, @@ -22,12 +24,10 @@ import { import { Form, FormDataProvider, FormHook } from '../../../../../shared_imports'; import { ProcessorInternal } from '../../types'; - import { getProcessorDescriptor } from '../shared'; +import { ProcessorSettingsFields } from './processor_settings_fields'; import { DocumentationButton } from './documentation_button'; -import { CommonProcessorFields, ProcessorTypeField } from './processors/common_fields'; -import { Custom } from './processors/custom'; export interface Props { isOnFailure: boolean; @@ -42,6 +42,7 @@ const updateButtonLabel = i18n.translate( 'xpack.ingestPipelines.settingsFormOnFailureFlyout.updateButtonLabel', { defaultMessage: 'Update' } ); + const addButtonLabel = i18n.translate( 'xpack.ingestPipelines.settingsFormOnFailureFlyout.addButtonLabel', { defaultMessage: 'Add' } @@ -52,20 +53,55 @@ const cancelButtonLabel = i18n.translate( { defaultMessage: 'Cancel' } ); -export const ProcessorSettingsForm: FunctionComponent = memo( - ({ processor, form, isOnFailure, onClose, onOpen, esDocsBasePath }) => { - const flyoutTitleContent = isOnFailure ? ( +export type TabType = 'configuration'; + +interface Tab { + id: TabType; + name: string; +} + +const tabs: Tab[] = [ + { + id: 'configuration', + name: i18n.translate( + 'xpack.ingestPipelines.settingsFormOnFailureFlyout.configurationTabTitle', + { + defaultMessage: 'Configuration', + } + ), + }, +]; + +const getFlyoutTitle = (isOnFailure: boolean, isExistingProcessor: boolean) => { + if (isExistingProcessor) { + return isOnFailure ? ( ) : ( ); + } + return isOnFailure ? ( + + ) : ( + + ); +}; + +export const ManageProcessorForm: FunctionComponent = memo( + ({ processor, form, isOnFailure, onClose, onOpen, esDocsBasePath }) => { useEffect( () => { onOpen(); @@ -73,6 +109,10 @@ export const ProcessorSettingsForm: FunctionComponent = memo( [] /* eslint-disable-line react-hooks/exhaustive-deps */ ); + const [activeTab, setActiveTab] = useState('configuration'); + + const flyoutContent = ; + return (
@@ -81,11 +121,10 @@ export const ProcessorSettingsForm: FunctionComponent = memo(
-

{flyoutTitleContent}

+

{getFlyoutTitle(isOnFailure, Boolean(processor))}

- {({ type }) => { @@ -106,32 +145,27 @@ export const ProcessorSettingsForm: FunctionComponent = memo( - - - - - - {(arg: any) => { - const { type } = arg; - - if (type?.length) { - const formDescriptor = getProcessorDescriptor(type as any); - - if (formDescriptor?.FieldsComponent) { - return ( - <> - - - - ); - } - return ; - } - - // If the user has not yet defined a type, we do not show any settings fields - return null; - }} - + {processor ? ( + <> + + {tabs.map((tab) => ( + { + setActiveTab(tab.id); + }} + isSelected={tab.id === activeTab} + key={tab.id} + data-test-subj={`${tab.id}Tab`} + > + {tab.name} + + ))} + + + + ) : undefined} + + {flyoutContent} @@ -139,13 +173,7 @@ export const ProcessorSettingsForm: FunctionComponent = memo( {cancelButtonLabel} - { - form.submit(); - }} - > + {processor ? updateButtonLabel : addButtonLabel} diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx new file mode 100644 index 000000000000..6b2568bad3af --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processor_settings_fields.tsx @@ -0,0 +1,52 @@ +/* + * 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, { FunctionComponent } from 'react'; +import { EuiHorizontalRule } from '@elastic/eui'; + +import { FormDataProvider } from '../../../../../shared_imports'; +import { ProcessorInternal } from '../../types'; + +import { getProcessorDescriptor } from '../shared'; +import { CommonProcessorFields, ProcessorTypeField } from './processors/common_fields'; +import { Custom } from './processors/custom'; + +export interface Props { + processor?: ProcessorInternal; +} + +export const ProcessorSettingsFields: FunctionComponent = ({ processor }) => { + return ( + <> + + + + + + {(arg: any) => { + const { type } = arg; + + if (type?.length) { + const formDescriptor = getProcessorDescriptor(type as any); + + if (formDescriptor?.FieldsComponent) { + return ( + <> + + + + ); + } + return ; + } + + // If the user has not yet defined a type, we do not show any settings fields + return null; + }} + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/common_processor_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/common_processor_fields.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/common_processor_fields.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/index.ts similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/index.ts diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/common_fields/processor_type_field.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/common_fields/processor_type_field.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/custom.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/custom.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/custom.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/custom.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/gsub.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/gsub.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/gsub.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/set.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_settings_form/processors/set.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/manage_processor_form/processors/set.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx index edabbe277e5d..a13321c38c19 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx @@ -7,10 +7,10 @@ import classNames from 'classnames'; import React, { FunctionComponent, memo } from 'react'; import { - EuiButtonIcon, EuiButtonToggle, EuiFlexGroup, EuiFlexItem, + EuiLink, EuiPanel, EuiText, EuiToolTip, @@ -57,9 +57,9 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( const isInMoveMode = Boolean(movingProcessor); const isMovingThisProcessor = processor.id === movingProcessor?.id; const isEditingThisProcessor = - editor.mode.id === 'editingProcessor' && processor.id === editor.mode.arg.processor.id; + editor.mode.id === 'managingProcessor' && processor.id === editor.mode.arg.processor.id; const isEditingOtherProcessor = - editor.mode.id === 'editingProcessor' && !isEditingThisProcessor; + editor.mode.id === 'managingProcessor' && !isEditingThisProcessor; const isMovingOtherProcessor = editor.mode.id === 'movingProcessor' && !isMovingThisProcessor; const isDimmed = isEditingOtherProcessor || isMovingOtherProcessor; @@ -70,11 +70,6 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( 'pipelineProcessorsEditor__item--dimmed': isDimmed, }); - const actionElementClasses = classNames({ - // eslint-disable-next-line @typescript-eslint/naming-convention - 'pipelineProcessorsEditor__item--displayNone': isInMoveMode, - }); - const inlineTextInputContainerClasses = classNames({ // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--displayNone': isInMoveMode && !processor.options.description, @@ -141,7 +136,18 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( className="pipelineProcessorsEditor__item__processorTypeLabel" color={isDimmed ? 'subdued' : undefined} > - {getProcessorDescriptor(processor.type)?.label ?? processor.type} + { + editor.setMode({ + id: 'managingProcessor', + arg: { processor, selector }, + }); + }} + data-test-subj="manageItemButton" + > + {getProcessorDescriptor(processor.type)?.label ?? processor.type} + @@ -174,25 +180,6 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( placeholder={i18nTexts.descriptionPlaceholder} /> - - {!isInMoveMode && ( - - { - editor.setMode({ - id: 'editingProcessor', - arg: { processor, selector }, - }); - }} - /> - - )} - diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx index db4629823ef5..7124efc4905a 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx @@ -42,7 +42,7 @@ import { OnActionHandler } from '../components/processors_tree'; import { ProcessorRemoveModal, PipelineProcessorsItemTooltip, - ProcessorSettingsForm, + ManageProcessorForm, OnSubmitHandler, } from '../components'; @@ -148,7 +148,7 @@ export const PipelineProcessorsContextProvider: FunctionComponent = ({ }, }); break; - case 'editingProcessor': + case 'managingProcessor': processorsDispatch({ type: 'updateProcessor', payload: { @@ -229,10 +229,10 @@ export const PipelineProcessorsContextProvider: FunctionComponent = ({ /> )} - {mode.id === 'editingProcessor' || mode.id === 'creatingProcessor' ? ( - void; export type EditorMode = | { id: 'creatingProcessor'; arg: { selector: ProcessorSelector } } | { id: 'movingProcessor'; arg: ProcessorInfo } - | { id: 'editingProcessor'; arg: { processor: ProcessorInternal; selector: ProcessorSelector } } + | { id: 'managingProcessor'; arg: { processor: ProcessorInternal; selector: ProcessorSelector } } | { id: 'removingProcessor'; arg: { selector: ProcessorSelector } } | { id: 'idle' }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c796aacda10a..720ec2892093 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9837,11 +9837,8 @@ "xpack.ingestPipelines.requestFlyout.descriptionText": "このElasticsearchリクエストは、このパイプラインを作成または更新します。", "xpack.ingestPipelines.requestFlyout.namedTitle": "「{name}」のリクエスト", "xpack.ingestPipelines.requestFlyout.unnamedTitle": "リクエスト", - "xpack.ingestPipelines.settingsFormFlyout.title": "プロセッサーの構成", "xpack.ingestPipelines.settingsFormOnFailureFlyout.addButtonLabel": "追加", "xpack.ingestPipelines.settingsFormOnFailureFlyout.cancelButtonLabel": "キャンセル", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.title": "エラープロセッサーの構成", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.updateButtonLabel": "更新", "xpack.ingestPipelines.tabs.documentsTabTitle": "ドキュメント", "xpack.ingestPipelines.tabs.outputTabTitle": "アウトプット", "xpack.ingestPipelines.testPipelineFlyout.documentsForm.documentsFieldLabel": "ドキュメント", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 4c48a66b3c3c..69820834cad5 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9839,11 +9839,8 @@ "xpack.ingestPipelines.requestFlyout.descriptionText": "此 Elasticsearch 请求将创建或更新管道。", "xpack.ingestPipelines.requestFlyout.namedTitle": "对“{name}”的请求", "xpack.ingestPipelines.requestFlyout.unnamedTitle": "请求", - "xpack.ingestPipelines.settingsFormFlyout.title": "配置处理器", "xpack.ingestPipelines.settingsFormOnFailureFlyout.addButtonLabel": "添加", "xpack.ingestPipelines.settingsFormOnFailureFlyout.cancelButtonLabel": "取消", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.title": "配置失败时处理器", - "xpack.ingestPipelines.settingsFormOnFailureFlyout.updateButtonLabel": "更新", "xpack.ingestPipelines.tabs.documentsTabTitle": "文档", "xpack.ingestPipelines.tabs.outputTabTitle": "输出", "xpack.ingestPipelines.testPipelineFlyout.documentsForm.documentsFieldLabel": "文档", From f9c303675978934efa41c50aecf7c8ade3cc02ce Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Tue, 11 Aug 2020 10:18:12 -0400 Subject: [PATCH 08/25] Update links that pointed to CONTRIBUTING.md (#74757) * Update links that pointed to CONTRIBUTING.md * Update .github/PULL_REQUEST_TEMPLATE.md point to master instead of 7.x --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 754043ee0ef7..534b1cea6242 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,12 +7,12 @@ Summarize your PR. If it involves visual changes include a screenshot or gif. Delete any items that are not applicable to this PR. - [ ] 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 -- [ ] [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 +- [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials +- [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) 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) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### 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) +- [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) From f621b0e2b68cd47341074a93c96ab7a5ede3d9bc Mon Sep 17 00:00:00 2001 From: Brittany Joiner Date: Tue, 11 Aug 2020 09:20:15 -0500 Subject: [PATCH 09/25] pluralized for occurrences vs occurrence (#74564) Co-authored-by: Elastic Machine --- .../components/app/ErrorGroupDetails/Distribution/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx b/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx index 80c749e58c88..ecdd52e31730 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/Distribution/index.tsx @@ -107,7 +107,8 @@ export function ErrorDistribution({ distribution, title }: Props) { } formatYLong={(value: number) => i18n.translate('xpack.apm.errorGroupDetails.occurrencesLongLabel', { - defaultMessage: '{occCount} occurrences', + defaultMessage: + '{occCount} {occCount, plural, one {occurrence} other {occurrences}}', values: { occCount: value }, }) } From 461d68418c01e2b9e822c971d875993a80524e84 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Tue, 11 Aug 2020 09:25:04 -0600 Subject: [PATCH 10/25] [security solutions][lists] Adds end to end tests (#74473) ## Summary Adds initial set of end to end tests for lists You can run all of these with the command from kibana root: ```ts node scripts/functional_tests --config x-pack/test/lists_api_integration/security_and_spaces/config.ts ``` Fixes a few minor bugs found such as... * Validation for importing lists was not checking if the indexes were created first * Some wording for the error messages had duplicate words within them ### Checklist - [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 --- x-pack/plugins/lists/common/constants.mock.ts | 1 + .../request/create_list_item_schema.mock.ts | 17 ++ .../request/create_list_schema.mock.ts | 19 +++ .../request/import_list_item_schema.mock.ts | 9 + .../request/update_list_item_schema.mock.ts | 10 +- .../request/update_list_schema.mock.ts | 27 +++ .../request/update_list_schema.test.ts | 48 ++++++ .../schemas/response/list_item_schema.mock.ts | 13 ++ .../schemas/response/list_schema.mock.ts | 15 ++ .../server/routes/create_list_item_route.ts | 9 + .../server/routes/delete_list_item_route.ts | 2 +- .../server/routes/import_list_item_route.ts | 7 + .../lists/server/routes/patch_list_route.ts | 2 +- .../routes/update_exception_list_route.ts | 2 +- .../lists/server/routes/update_list_route.ts | 2 +- .../common/config.ts | 1 - .../lists_api_integration/common/config.ts | 69 ++++++++ .../common/ftr_provider_context.d.ts | 11 ++ .../lists_api_integration/common/services.ts | 7 + .../security_and_spaces/config.ts | 14 ++ .../tests/create_list_items.ts | 115 +++++++++++++ .../security_and_spaces/tests/create_lists.ts | 95 +++++++++++ .../tests/delete_list_items.ts | 98 +++++++++++ .../security_and_spaces/tests/delete_lists.ts | 83 ++++++++++ .../tests/export_list_items.ts | 104 ++++++++++++ .../tests/find_list_items.ts | 116 +++++++++++++ .../security_and_spaces/tests/find_lists.ts | 77 +++++++++ .../tests/import_list_items.ts | 112 +++++++++++++ .../security_and_spaces/tests/index.ts | 27 +++ .../tests/read_list_items.ts | 98 +++++++++++ .../security_and_spaces/tests/read_lists.ts | 84 ++++++++++ .../tests/update_list_items.ts | 154 ++++++++++++++++++ .../security_and_spaces/tests/update_lists.ts | 141 ++++++++++++++++ x-pack/test/lists_api_integration/utils.ts | 126 ++++++++++++++ 34 files changed, 1709 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts create mode 100644 x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts create mode 100644 x-pack/test/lists_api_integration/common/config.ts create mode 100644 x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts create mode 100644 x-pack/test/lists_api_integration/common/services.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/config.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts create mode 100644 x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts create mode 100644 x-pack/test/lists_api_integration/utils.ts diff --git a/x-pack/plugins/lists/common/constants.mock.ts b/x-pack/plugins/lists/common/constants.mock.ts index b7609b5a3602..428cc90d2908 100644 --- a/x-pack/plugins/lists/common/constants.mock.ts +++ b/x-pack/plugins/lists/common/constants.mock.ts @@ -9,6 +9,7 @@ import { EntriesArray } from './schemas/types'; export const DATE_NOW = '2020-04-20T15:25:31.830Z'; export const OLD_DATE_RELATIVE_TO_DATE_NOW = '2020-04-19T15:25:31.830Z'; export const USER = 'some user'; +export const ELASTIC_USER = 'elastic'; export const LIST_INDEX = '.lists'; export const LIST_ITEM_INDEX = '.items'; export const NAME = 'some name'; diff --git a/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts index f0d4af520bdb..5a9e50554865 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.mock.ts @@ -14,3 +14,20 @@ export const getCreateListItemSchemaMock = (): CreateListItemSchema => ({ meta: META, value: VALUE, }); + +/** + * Useful for end to end testing + */ +export const getCreateMinimalListItemSchemaMock = (): CreateListItemSchema => ({ + id: LIST_ITEM_ID, + list_id: LIST_ID, + value: VALUE, +}); + +/** + * Useful for end to end testing + */ +export const getCreateMinimalListItemSchemaMockWithoutId = (): CreateListItemSchema => ({ + list_id: LIST_ID, + value: VALUE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts index 461890b944bf..194625c09fb7 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_list_schema.mock.ts @@ -18,3 +18,22 @@ export const getCreateListSchemaMock = (): CreateListSchema => ({ type: TYPE, version: VERSION, }); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + */ +export const getCreateMinimalListSchemaMock = (): CreateListSchema => ({ + description: DESCRIPTION, + id: LIST_ID, + name: NAME, + type: TYPE, +}); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + */ +export const getCreateMinimalListSchemaMockWithoutId = (): CreateListSchema => ({ + description: DESCRIPTION, + name: NAME, + type: TYPE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts index 69e4d2f8293c..57bb66f746f6 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.mock.ts @@ -9,3 +9,12 @@ import { ImportListItemSchema } from './import_list_item_schema'; export const getImportListItemSchemaMock = (): ImportListItemSchema => ({ file: {}, }); + +/** + * This is useful for end to end tests, it will return a buffer given a string array + * of things to import. + * @param input Array of strings of things to import + */ +export const getImportListItemAsBuffer = (input: string[]): Buffer => { + return Buffer.from(input.join('\r\n')); +}; diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts index c95de1e99b4f..be8ba3516a75 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ID, META, VALUE } from '../../constants.mock'; +import { ID, LIST_ITEM_ID, META, VALUE } from '../../constants.mock'; import { UpdateListItemSchema } from './update_list_item_schema'; @@ -13,3 +13,11 @@ export const getUpdateListItemSchemaMock = (): UpdateListItemSchema => ({ meta: META, value: VALUE, }); + +/** + * Useful for end to end testing + */ +export const getUpdateMinimalListItemSchemaMock = (): UpdateListItemSchema => ({ + id: LIST_ITEM_ID, + value: VALUE, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts new file mode 100644 index 000000000000..b044d40a5d88 --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/request/update_list_schema.mock.ts @@ -0,0 +1,27 @@ +/* + * 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 { DESCRIPTION, LIST_ID, META, NAME, _VERSION } from '../../constants.mock'; + +import { UpdateListSchema } from './update_list_schema'; + +export const getUpdateListSchemaMock = (): UpdateListSchema => ({ + _version: _VERSION, + description: DESCRIPTION, + id: LIST_ID, + meta: META, + name: NAME, +}); + +/** + * Useful for end to end tests and other mechanisms which want to fill in the values + * after doing a get of the structure. + */ +export const getUpdateMinimalListSchemaMock = (): UpdateListSchema => ({ + description: DESCRIPTION, + id: LIST_ID, + name: NAME, +}); diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts b/x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts new file mode 100644 index 000000000000..21d20a6b85bc --- /dev/null +++ b/x-pack/plugins/lists/common/schemas/request/update_list_schema.test.ts @@ -0,0 +1,48 @@ +/* + * 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 { left } from 'fp-ts/lib/Either'; +import { pipe } from 'fp-ts/lib/pipeable'; + +import { exactCheck, foldLeftRight, getPaths } from '../../shared_imports'; + +import { UpdateListSchema, updateListSchema } from './update_list_schema'; +import { getUpdateListSchemaMock } from './update_list_schema.mock'; + +describe('update_list_schema', () => { + test('it should validate a typical list request', () => { + const payload = getUpdateListSchemaMock(); + const decoded = updateListSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should accept an undefined for "meta" but strip it out', () => { + const payload = getUpdateListSchemaMock(); + const outputPayload = getUpdateListSchemaMock(); + delete payload.meta; + const decoded = updateListSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + delete outputPayload.meta; + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(outputPayload); + }); + + test('it should not allow an extra key to be sent in', () => { + const payload: UpdateListSchema & { + extraKey?: string; + } = getUpdateListSchemaMock(); + payload.extraKey = 'some new value'; + const decoded = updateListSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual(['invalid keys "extraKey"']); + expect(message.schema).toEqual({}); + }); +}); diff --git a/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts b/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts index e122f6a2bbe3..f4e36d1d060c 100644 --- a/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/response/list_item_schema.mock.ts @@ -7,6 +7,7 @@ import { ListItemSchema } from '../../../common/schemas'; import { DATE_NOW, + ELASTIC_USER, LIST_ID, LIST_ITEM_ID, META, @@ -31,3 +32,15 @@ export const getListItemResponseMock = (): ListItemSchema => ({ updated_by: USER, value: VALUE, }); + +/** + * This is useful for end to end tests where we remove the auto generated parts for comparisons + * such as created_at, updated_at, and id. + */ +export const getListItemResponseMockWithoutAutoGeneratedValues = (): Partial => ({ + created_by: ELASTIC_USER, + list_id: LIST_ID, + type: TYPE, + updated_by: ELASTIC_USER, + value: VALUE, +}); diff --git a/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts b/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts index 900c7ea4322a..4ae77e12a829 100644 --- a/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts +++ b/x-pack/plugins/lists/common/schemas/response/list_schema.mock.ts @@ -8,6 +8,7 @@ import { ListSchema } from '../../../common/schemas'; import { DATE_NOW, DESCRIPTION, + ELASTIC_USER, IMMUTABLE, LIST_ID, META, @@ -35,3 +36,17 @@ export const getListResponseMock = (): ListSchema => ({ updated_by: USER, version: VERSION, }); + +/** + * This is useful for end to end tests where we remove the auto generated parts for comparisons + * such as created_at, updated_at, and id. + */ +export const getListResponseMockWithoutAutoGeneratedValues = (): Partial => ({ + created_by: ELASTIC_USER, + description: DESCRIPTION, + immutable: IMMUTABLE, + name: NAME, + type: TYPE, + updated_by: ELASTIC_USER, + version: VERSION, +}); diff --git a/x-pack/plugins/lists/server/routes/create_list_item_route.ts b/x-pack/plugins/lists/server/routes/create_list_item_route.ts index 0a4a1c739ae7..bd2828d331d8 100644 --- a/x-pack/plugins/lists/server/routes/create_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/create_list_item_route.ts @@ -36,6 +36,15 @@ export const createListItemRoute = (router: IRouter): void => { statusCode: 404, }); } else { + if (id != null) { + const listItem = await lists.getListItem({ id }); + if (listItem != null) { + return siemResponse.error({ + body: `list item id: "${id}" already exists`, + statusCode: 409, + }); + } + } const createdListItem = await lists.createListItem({ deserializer: list.deserializer, id, diff --git a/x-pack/plugins/lists/server/routes/delete_list_item_route.ts b/x-pack/plugins/lists/server/routes/delete_list_item_route.ts index 228406855248..fa1adf8a39ed 100644 --- a/x-pack/plugins/lists/server/routes/delete_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/delete_list_item_route.ts @@ -33,7 +33,7 @@ export const deleteListItemRoute = (router: IRouter): void => { const deleted = await lists.deleteListItem({ id }); if (deleted == null) { return siemResponse.error({ - body: `list item with id: "${id}" item not found`, + body: `list item with id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/import_list_item_route.ts b/x-pack/plugins/lists/server/routes/import_list_item_route.ts index ce5fdaccae25..d46c943d95fe 100644 --- a/x-pack/plugins/lists/server/routes/import_list_item_route.ts +++ b/x-pack/plugins/lists/server/routes/import_list_item_route.ts @@ -41,6 +41,13 @@ export const importListItemRoute = (router: IRouter, config: ConfigType): void = const stream = createStreamFromBuffer(request.body); const { deserializer, list_id: listId, serializer, type } = request.query; const lists = getListClient(context); + const listExists = await lists.getListIndexExists(); + if (!listExists) { + return siemResponse.error({ + body: `To import a list item, the index must exist first. Index "${lists.getListIndex()}" does not exist`, + statusCode: 400, + }); + } if (listId != null) { const list = await lists.getList({ id: listId }); if (list == null) { diff --git a/x-pack/plugins/lists/server/routes/patch_list_route.ts b/x-pack/plugins/lists/server/routes/patch_list_route.ts index e33d8d7c9c59..763f3f495ca1 100644 --- a/x-pack/plugins/lists/server/routes/patch_list_route.ts +++ b/x-pack/plugins/lists/server/routes/patch_list_route.ts @@ -32,7 +32,7 @@ export const patchListRoute = (router: IRouter): void => { const list = await lists.updateList({ _version, description, id, meta, name, version }); if (list == null) { return siemResponse.error({ - body: `list id: "${id}" found found`, + body: `list id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/update_exception_list_route.ts b/x-pack/plugins/lists/server/routes/update_exception_list_route.ts index bead10802df4..8102210b8430 100644 --- a/x-pack/plugins/lists/server/routes/update_exception_list_route.ts +++ b/x-pack/plugins/lists/server/routes/update_exception_list_route.ts @@ -69,7 +69,7 @@ export const updateExceptionListRoute = (router: IRouter): void => { }); if (list == null) { return siemResponse.error({ - body: `exception list id: "${id}" found found`, + body: `exception list id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/plugins/lists/server/routes/update_list_route.ts b/x-pack/plugins/lists/server/routes/update_list_route.ts index 816ad13d3770..8d7d08be4130 100644 --- a/x-pack/plugins/lists/server/routes/update_list_route.ts +++ b/x-pack/plugins/lists/server/routes/update_list_route.ts @@ -32,7 +32,7 @@ export const updateListRoute = (router: IRouter): void => { const list = await lists.updateList({ _version, description, id, meta, name, version }); if (list == null) { return siemResponse.error({ - body: `list id: "${id}" found found`, + body: `list id: "${id}" not found`, statusCode: 404, }); } else { diff --git a/x-pack/test/detection_engine_api_integration/common/config.ts b/x-pack/test/detection_engine_api_integration/common/config.ts index bb9b3d9e9666..46fb877e94f2 100644 --- a/x-pack/test/detection_engine_api_integration/common/config.ts +++ b/x-pack/test/detection_engine_api_integration/common/config.ts @@ -73,7 +73,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ])}`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, '--xpack.eventLog.logEntries=true', - '--xpack.lists.enabled=true', ...disabledPlugins.map((key) => `--xpack.${key}.enabled=false`), `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`, `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions')}`, diff --git a/x-pack/test/lists_api_integration/common/config.ts b/x-pack/test/lists_api_integration/common/config.ts new file mode 100644 index 000000000000..ca3cc3a5eee2 --- /dev/null +++ b/x-pack/test/lists_api_integration/common/config.ts @@ -0,0 +1,69 @@ +/* + * 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 path from 'path'; +import { CA_CERT_PATH } from '@kbn/dev-utils'; +import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; +import { services } from './services'; + +interface CreateTestConfigOptions { + license: string; + disabledPlugins?: string[]; + ssl?: boolean; +} + +export function createTestConfig(name: string, options: CreateTestConfigOptions) { + const { license = 'trial', disabledPlugins = [], ssl = false } = options; + + return async ({ readConfigFile }: FtrConfigProviderContext) => { + const xPackApiIntegrationTestsConfig = await readConfigFile( + require.resolve('../../api_integration/config.ts') + ); + const servers = { + ...xPackApiIntegrationTestsConfig.get('servers'), + elasticsearch: { + ...xPackApiIntegrationTestsConfig.get('servers.elasticsearch'), + protocol: ssl ? 'https' : 'http', + }, + }; + + return { + testFiles: [require.resolve(`../${name}/tests/`)], + servers, + services, + junit: { + reportName: 'X-Pack Lists Integration Tests', + }, + esArchiver: xPackApiIntegrationTestsConfig.get('esArchiver'), + esTestCluster: { + ...xPackApiIntegrationTestsConfig.get('esTestCluster'), + license, + ssl, + serverArgs: [ + `xpack.license.self_generated.type=${license}`, + `xpack.security.enabled=${!disabledPlugins.includes('security')}`, + ], + }, + kbnTestServer: { + ...xPackApiIntegrationTestsConfig.get('kbnTestServer'), + serverArgs: [ + ...xPackApiIntegrationTestsConfig.get('kbnTestServer.serverArgs'), + ...disabledPlugins.map((key) => `--xpack.${key}.enabled=false`), + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`, + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions')}`, + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'task_manager')}`, + `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'aad')}`, + ...(ssl + ? [ + `--elasticsearch.hosts=${servers.elasticsearch.protocol}://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, + `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, + ] + : []), + ], + }, + }; + }; +} diff --git a/x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts b/x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts new file mode 100644 index 000000000000..e3add3748f56 --- /dev/null +++ b/x-pack/test/lists_api_integration/common/ftr_provider_context.d.ts @@ -0,0 +1,11 @@ +/* + * 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 { GenericFtrProviderContext } from '@kbn/test/types/ftr'; + +import { services } from './services'; + +export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/lists_api_integration/common/services.ts b/x-pack/test/lists_api_integration/common/services.ts new file mode 100644 index 000000000000..a927a31469ba --- /dev/null +++ b/x-pack/test/lists_api_integration/common/services.ts @@ -0,0 +1,7 @@ +/* + * 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 { services } from '../../api_integration/services'; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/config.ts b/x-pack/test/lists_api_integration/security_and_spaces/config.ts new file mode 100644 index 000000000000..081b901c47fc --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/config.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 { createTestConfig } from '../common/config'; + +// eslint-disable-next-line import/no-default-export +export default createTestConfig('security_and_spaces', { + disabledPlugins: [], + license: 'trial', + ssl: true, +}); diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts new file mode 100644 index 000000000000..906e9a9ef445 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_list_items.ts @@ -0,0 +1,115 @@ +/* + * 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 { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; + +import { + getCreateMinimalListItemSchemaMock, + getCreateMinimalListItemSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; + +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('create_list_items', () => { + describe('validation errors', () => { + it('should give a 404 error that the list must exist first before being able to add a list item', async () => { + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(404); + + expect(body).to.eql({ + message: 'list id: "some-list-id" does not exist', + status_code: 404, + }); + }); + }); + + describe('creating list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should create a simple list item with a list item id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should create a simple list item without an id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMockWithoutId()) + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should cause a 409 conflict if we attempt to create the same list item twice', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(409); + + expect(body).to.eql({ + message: 'list item id: "some-list-item-id" already exists', + status_code: 409, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts new file mode 100644 index 000000000000..b9d61eeacfee --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/create_lists.ts @@ -0,0 +1,95 @@ +/* + * 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 { LIST_URL } from '../../../../plugins/lists/common/constants'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + getCreateMinimalListSchemaMock, + getCreateMinimalListSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('create_lists', () => { + describe('validation errors', () => { + it('should give an error that the index must exist first if it does not exist before creating a list', async () => { + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(400); + + expect(body).to.eql({ + message: + 'To create a list, the index must exist first. Index ".lists-default" does not exist', + status_code: 400, + }); + }); + }); + + describe('creating lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should create a simple list with a list_id', async () => { + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should create a simple list without a list_id', async () => { + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMockWithoutId()) + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should cause a 409 conflict if we attempt to create the same list_id twice', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(409); + + expect(body).to.eql({ + message: 'list id: "some-list-id" already exists', + status_code: 409, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts new file mode 100644 index 000000000000..83ba9728efdc --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_list_items.ts @@ -0,0 +1,98 @@ +/* + * 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 { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('delete_list_items', () => { + describe('deleting list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should delete a single list item with a list item id', async () => { + // create a list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a list item + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // delete the list item by its list item id + const { body } = await supertest + .delete(`${LIST_ITEM_URL}?id=${getCreateMinimalListItemSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should delete a single list using an auto generated id', async () => { + // create a list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a list item + const { body: bodyWithCreateListItem } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // delete that list by its auto-generated id + const { body } = await supertest + .delete(`${LIST_ITEM_URL}?id=${bodyWithCreateListItem.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return an error if the id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'list item with id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" not found', + status_code: 404, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts new file mode 100644 index 000000000000..3703e1b6ca30 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/delete_lists.ts @@ -0,0 +1,83 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('delete_lists', () => { + describe('deleting lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should delete a single list with a list id', async () => { + // create a list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // delete the list by its list id + const { body } = await supertest + .delete(`${LIST_URL}?id=${getCreateMinimalListSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should delete a single list using an auto generated id', async () => { + // add a list + const { body: bodyWithCreatedList } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // delete that list by its auto-generated id + const { body } = await supertest + .delete(`${LIST_URL}?id=${bodyWithCreatedList.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return an error if the id does not exist when trying to delete it', async () => { + const { body } = await supertest + .delete(`${LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + message: 'list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" was not found', + status_code: 404, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts new file mode 100644 index 000000000000..6fe783fc497f --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/export_list_items.ts @@ -0,0 +1,104 @@ +/* + * 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 { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { LIST_ID, NAME } from '../../../../plugins/lists/common/constants.mock'; +import { CreateListItemSchema } from '../../../../plugins/lists/common/schemas'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { LIST_ITEM_URL, LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { createListsIndex, deleteListsIndex, binaryToString } from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('export_list_items', () => { + describe('exporting lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should set the response content types to be expected', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + await supertest + .post(`${LIST_ITEM_URL}/_export?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .expect('Content-Disposition', `attachment; filename="${NAME}"`) + .expect(200); + }); + + it('should export a single list item with a list id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_export?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .expect(200) + .parse(binaryToString); + + expect(body.toString()).to.eql('127.0.0.1\n'); + }); + + it('should export two list items with a list id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const secondList: CreateListItemSchema = { + ...getCreateMinimalListItemSchemaMock(), + id: 'list-item-2', + value: '127.0.0.2', + }; + await supertest.post(LIST_ITEM_URL).set('kbn-xsrf', 'true').send(secondList).expect(200); + + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_export?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .expect(200) + .parse(binaryToString); + + expect(body.toString()).to.eql('127.0.0.2\n127.0.0.1\n'); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts new file mode 100644 index 000000000000..4c1f3dfdb670 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_list_items.ts @@ -0,0 +1,116 @@ +/* + * 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 { LIST_ITEM_ID, LIST_ID } from '../../../../plugins/lists/common/constants.mock'; +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('find_list_items', () => { + describe('find list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should give a validation error if the list_id is not supplied', async () => { + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(400); + + expect(body).to.eql({ + error: 'Bad Request', + message: '[request query]: Invalid value "undefined" supplied to "list_id"', + statusCode: 400, + }); + }); + + it('should give a 404 if the list has not been created yet', async () => { + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find?list_id=${LIST_ITEM_ID}`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + + expect(body).to.eql({ + message: 'list id: "some-list-item-id" does not exist', + status_code: 404, + }); + }); + + it('should return an empty find body correctly if no list items are loaded', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + cursor: 'WzBd', + data: [], + page: 1, + per_page: 20, + total: 0, + }); + }); + + it('should return a single list item when a single list item is loaded from a find with defaults added', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}/_find?list_id=${LIST_ID}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + body.data = [removeListItemServerGeneratedProperties(body.data[0])]; + // cursor is a constant changing value so we have to delete it as well. + delete body.cursor; + expect(body).to.eql({ + data: [getListItemResponseMockWithoutAutoGeneratedValues()], + page: 1, + per_page: 20, + total: 1, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts new file mode 100644 index 000000000000..7efe28a0b01a --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/find_lists.ts @@ -0,0 +1,77 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('find_lists', () => { + describe('find lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should return an empty find body correctly if no lists are loaded', async () => { + const { body } = await supertest + .get(`${LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + cursor: 'WzBd', + data: [], + page: 1, + per_page: 20, + total: 0, + }); + }); + + it('should return a single list when a single list is loaded from a find with defaults added', async () => { + // add a single list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // query the single list from _find + const { body } = await supertest + .get(`${LIST_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + body.data = [removeListServerGeneratedProperties(body.data[0])]; + // cursor is a constant changing value so we have to delete it as well. + delete body.cursor; + expect(body).to.eql({ + data: [getListResponseMockWithoutAutoGeneratedValues()], + page: 1, + per_page: 20, + total: 1, + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts new file mode 100644 index 000000000000..4befb6bbaf05 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/import_list_items.ts @@ -0,0 +1,112 @@ +/* + * 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 { ListItemSchema } from '../../../../plugins/lists/common/schemas'; +import { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { ListSchema } from '../../../../plugins/lists/common'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; + +import { LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, + removeListItemServerGeneratedProperties, + waitFor, +} from '../../utils'; + +import { getImportListItemAsBuffer } from '../../../../plugins/lists/common/schemas/request/import_list_item_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + + describe('import_list_items', () => { + describe('importing list items without an index', () => { + it('should not import a list item if the index does not exist yet', async () => { + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect('Content-Type', 'application/json; charset=utf-8') + .expect(400); + + expect(body).to.eql({ + status_code: 400, + message: + 'To import a list item, the index must exist first. Index ".lists-default" does not exist', + }); + }); + }); + + describe('importing rules with an index', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should set the response content types to be expected when importing two items', async () => { + await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect('Content-Type', 'application/json; charset=utf-8') + .expect(200); + }); + + it('should report that it imported a simple list successfully', async () => { + const { body } = await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect('Content-Type', 'application/json; charset=utf-8') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + const outputtedList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'list_items.txt', + description: 'File uploaded from file system of list_items.txt', + }; + expect(bodyToCompare).to.eql(outputtedList); + }); + + it('should be able to read imported list items back out correctly', async () => { + await supertest + .post(`${LIST_ITEM_URL}/_import?type=ip`) + .set('kbn-xsrf', 'true') + .attach('file', getImportListItemAsBuffer(['127.0.0.1', '127.0.0.2']), 'list_items.txt') + .expect(200); + + // Although we try to be aggressive with waitFor in the lists code base, there is still not guarantees + // that we will have the data just yet so we have to do a waitFor here for when it shows up + await waitFor(async () => { + const { status } = await supertest + .get(`${LIST_ITEM_URL}?list_id=list_items.txt&value=127.0.0.1`) + .send(); + return status !== 404; + }); + const { body } = await supertest + .get(`${LIST_ITEM_URL}?list_id=list_items.txt&value=127.0.0.1`) + .send() + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body[0]); + const outputtedList: Partial = { + ...getListItemResponseMockWithoutAutoGeneratedValues(), + list_id: 'list_items.txt', + }; + expect(bodyToCompare).to.eql(outputtedList); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts new file mode 100644 index 000000000000..302877a680aa --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/index.ts @@ -0,0 +1,27 @@ +/* + * 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 '../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default ({ loadTestFile }: FtrProviderContext): void => { + describe('lists api security and spaces enabled', function () { + this.tags('ciGroup1'); + + loadTestFile(require.resolve('./create_lists')); + loadTestFile(require.resolve('./create_list_items')); + loadTestFile(require.resolve('./read_lists')); + loadTestFile(require.resolve('./read_list_items')); + loadTestFile(require.resolve('./update_lists')); + loadTestFile(require.resolve('./update_list_items')); + loadTestFile(require.resolve('./delete_lists')); + loadTestFile(require.resolve('./delete_list_items')); + loadTestFile(require.resolve('./find_lists')); + loadTestFile(require.resolve('./find_list_items')); + loadTestFile(require.resolve('./import_list_items')); + loadTestFile(require.resolve('./export_list_items')); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts new file mode 100644 index 000000000000..5469973d70e5 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_list_items.ts @@ -0,0 +1,98 @@ +/* + * 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 { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('read_list_items', () => { + describe('reading list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should be able to read a single list item using id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}?id=${getCreateMinimalListItemSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single list item with an auto-generated list id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body: createListBody } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListItemResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return 404 if given a fake id', async () => { + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_ITEM_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list item id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts new file mode 100644 index 000000000000..c3c8cb39d023 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/read_lists.ts @@ -0,0 +1,84 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { + getCreateMinimalListSchemaMock, + getCreateMinimalListSchemaMockWithoutId, +} from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('read_lists', () => { + describe('reading lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should be able to read a single list using id', async () => { + // create a simple list to read + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_URL}?id=${getCreateMinimalListSchemaMock().id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should be able to read a single list with an auto-generated list id', async () => { + // create a simple list to read + const { body: createListBody } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMockWithoutId()) + .expect(200); + + const { body } = await supertest + .get(`${LIST_URL}?id=${createListBody.id}`) + .set('kbn-xsrf', 'true') + .expect(200); + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(getListResponseMockWithoutAutoGeneratedValues()); + }); + + it('should return 404 if given a fake id', async () => { + const { body } = await supertest + .get(`${LIST_URL}?id=c1e1b359-7ac1-4e96-bc81-c683c092436f`) + .set('kbn-xsrf', 'true') + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list id: "c1e1b359-7ac1-4e96-bc81-c683c092436f" does not exist', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts new file mode 100644 index 000000000000..3ff496216eb7 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_list_items.ts @@ -0,0 +1,154 @@ +/* + * 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 { getListItemResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_item_schema.mock'; +import { getCreateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_item_schema.mock'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { LIST_URL, LIST_ITEM_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListItemServerGeneratedProperties, +} from '../../utils'; +import { getUpdateMinimalListItemSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_list_item_schema.mock'; +import { + UpdateListItemSchema, + CreateListItemSchema, + ListItemSchema, +} from '../../../../plugins/lists/common/schemas'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('update_list_items', () => { + describe('update list items', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should update a single list item property of value using an id', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a simple list item + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // update a simple list item's value + const updatedListItem: UpdateListItemSchema = { + ...getUpdateMinimalListItemSchemaMock(), + value: '192.168.0.2', + }; + + const { body } = await supertest + .put(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedListItem) + .expect(200); + + const outputListItem: Partial = { + ...getListItemResponseMockWithoutAutoGeneratedValues(), + value: '192.168.0.2', + }; + const bodyToCompare = removeListItemServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputListItem); + }); + + it('should update a single list item of value using an auto-generated id of both list and list item', async () => { + const { id, ...listNoId } = getCreateMinimalListSchemaMock(); + // create a simple list with no id which will use an auto-generated id + const { body: createListBody } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(200); + + // create a simple list item also with an auto-generated id using the list's auto-generated id + const listItem: CreateListItemSchema = { + ...getCreateMinimalListItemSchemaMock(), + list_id: createListBody.id, + }; + const { body: createListItemBody } = await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(listItem) + .expect(200); + + // update a simple list item's value + const updatedList: UpdateListItemSchema = { + ...getUpdateMinimalListItemSchemaMock(), + id: createListItemBody.id, + value: '192.168.0.2', + }; + const { body } = await supertest + .put(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputListItem: Partial = { + ...getListItemResponseMockWithoutAutoGeneratedValues(), + value: '192.168.0.2', + }; + const bodyToCompare = { + ...removeListItemServerGeneratedProperties(body), + list_id: outputListItem.list_id, + }; + expect(bodyToCompare).to.eql(outputListItem); + }); + + it('should give a 404 if it is given a fake id', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // create a simple list item + await supertest + .post(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListItemSchemaMock()) + .expect(200); + + // update a simple list item's value + const updatedListItem: UpdateListItemSchema = { + ...getUpdateMinimalListItemSchemaMock(), + id: 'some-other-id', + value: '192.168.0.2', + }; + + const { body } = await supertest + .put(LIST_ITEM_URL) + .set('kbn-xsrf', 'true') + .send(updatedListItem) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list item id: "some-other-id" not found', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts new file mode 100644 index 000000000000..04d77ffe2137 --- /dev/null +++ b/x-pack/test/lists_api_integration/security_and_spaces/tests/update_lists.ts @@ -0,0 +1,141 @@ +/* + * 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 '../../common/ftr_provider_context'; +import { LIST_URL } from '../../../../plugins/lists/common/constants'; + +import { getCreateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/create_list_schema.mock'; +import { + createListsIndex, + deleteListsIndex, + removeListServerGeneratedProperties, +} from '../../utils'; +import { getListResponseMockWithoutAutoGeneratedValues } from '../../../../plugins/lists/common/schemas/response/list_schema.mock'; +import { getUpdateMinimalListSchemaMock } from '../../../../plugins/lists/common/schemas/request/update_list_schema.mock'; +import { UpdateListSchema, ListSchema } from '../../../../plugins/lists/common/schemas'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + + describe('update_lists', () => { + describe('update lists', () => { + beforeEach(async () => { + await createListsIndex(supertest); + }); + + afterEach(async () => { + await deleteListsIndex(supertest); + }); + + it('should update a single list property of name using an id', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // update a simple list's name + const updatedList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + name: 'some other name', + }; + + const { body } = await supertest + .put(LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + version: 2, + }; + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should update a single list property of name using an auto-generated id', async () => { + const { id, ...listNoId } = getCreateMinimalListSchemaMock(); + // create a simple list with no id which will use an auto-generated id + const { body: createListBody } = await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(listNoId) + .expect(200); + + // update a simple list's name + const updatedList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + id: createListBody.id, + name: 'some other name', + }; + const { body } = await supertest + .put(LIST_URL) + .set('kbn-xsrf', 'true') + .send(updatedList) + .expect(200); + + const outputList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + version: 2, + }; + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should change the version of a list when it updates a property', async () => { + // create a simple list + await supertest + .post(LIST_URL) + .set('kbn-xsrf', 'true') + .send(getCreateMinimalListSchemaMock()) + .expect(200); + + // update a simple list property of name and description + const updatedList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + name: 'some other name', + description: 'some other description', + }; + + const { body } = await supertest.put(LIST_URL).set('kbn-xsrf', 'true').send(updatedList); + + const outputList: Partial = { + ...getListResponseMockWithoutAutoGeneratedValues(), + name: 'some other name', + description: 'some other description', + version: 2, + }; + + const bodyToCompare = removeListServerGeneratedProperties(body); + expect(bodyToCompare).to.eql(outputList); + }); + + it('should give a 404 if it is given a fake id', async () => { + const simpleList: UpdateListSchema = { + ...getUpdateMinimalListSchemaMock(), + id: '5096dec6-b6b9-4d8d-8f93-6c2602079d9d', + }; + const { body } = await supertest + .put(LIST_URL) + .set('kbn-xsrf', 'true') + .send(simpleList) + .expect(404); + + expect(body).to.eql({ + status_code: 404, + message: 'list id: "5096dec6-b6b9-4d8d-8f93-6c2602079d9d" not found', + }); + }); + }); + }); +}; diff --git a/x-pack/test/lists_api_integration/utils.ts b/x-pack/test/lists_api_integration/utils.ts new file mode 100644 index 000000000000..272768fdf50b --- /dev/null +++ b/x-pack/test/lists_api_integration/utils.ts @@ -0,0 +1,126 @@ +/* + * 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 { SuperTest } from 'supertest'; +import supertestAsPromised from 'supertest-as-promised'; + +import { ListItemSchema } from '../../plugins/lists/common/schemas'; +import { ListSchema } from '../../plugins/lists/common'; +import { LIST_INDEX } from '../../plugins/lists/common/constants'; + +/** + * Creates the lists and lists items index for use inside of beforeEach blocks of tests + * This will retry 20 times before giving up and hopefully still not interfere with other tests + * @param supertest The supertest client library + */ +export const createListsIndex = async ( + supertest: SuperTest, + retryCount = 20 +): Promise => { + if (retryCount > 0) { + try { + await supertest.post(LIST_INDEX).set('kbn-xsrf', 'true').send(); + } catch (err) { + // eslint-disable-next-line no-console + console.log( + `Failure trying to create the lists index, retries left are: ${retryCount - 1}`, + err + ); + await createListsIndex(supertest, retryCount - 1); + } + } else { + // eslint-disable-next-line no-console + console.log('Could not createListsIndex, no retries are left'); + } +}; + +/** + * Deletes the lists index for use inside of afterEach blocks of tests + * @param supertest The supertest client library + */ +export const deleteListsIndex = async ( + supertest: SuperTest, + retryCount = 20 +): Promise => { + if (retryCount > 0) { + try { + await supertest.delete(LIST_INDEX).set('kbn-xsrf', 'true').send(); + } catch (err) { + // eslint-disable-next-line no-console + console.log(`Failure trying to deleteListsIndex, retries left are: ${retryCount - 1}`, err); + await deleteListsIndex(supertest, retryCount - 1); + } + } else { + // eslint-disable-next-line no-console + console.log('Could not deleteListsIndex, no retries are left'); + } +}; + +/** + * This will remove server generated properties such as date times, etc... + * @param list List to pass in to remove typical server generated properties + */ +export const removeListServerGeneratedProperties = ( + list: Partial +): Partial => { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list; + return removedProperties; +}; + +/** + * This will remove server generated properties such as date times, etc... + * @param list List to pass in to remove typical server generated properties + */ +export const removeListItemServerGeneratedProperties = ( + list: Partial +): Partial => { + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { created_at, updated_at, id, tie_breaker_id, _version, ...removedProperties } = list; + return removedProperties; +}; + +// Similar to ReactJs's waitFor from here: https://testing-library.com/docs/dom-testing-library/api-async#waitfor +export const waitFor = async ( + functionToTest: () => Promise, + maxTimeout: number = 5000, + timeoutWait: number = 10 +) => { + await new Promise(async (resolve, reject) => { + let found = false; + let numberOfTries = 0; + while (!found && numberOfTries < Math.floor(maxTimeout / timeoutWait)) { + const itPasses = await functionToTest(); + if (itPasses) { + found = true; + } else { + numberOfTries++; + } + await new Promise((resolveTimeout) => setTimeout(resolveTimeout, timeoutWait)); + } + if (found) { + resolve(); + } else { + reject(new Error('timed out waiting for function condition to be true')); + } + }); +}; + +/** + * Useful for export_api testing to convert from a multi-part binary back to a string + * @param res Response + * @param callback Callback + */ +export const binaryToString = (res: any, callback: any): void => { + res.setEncoding('binary'); + res.data = ''; + res.on('data', (chunk: any) => { + res.data += chunk; + }); + res.on('end', () => { + callback(null, Buffer.from(res.data)); + }); +}; From bc0b4821ad747aeae82422316da5505d361be46f Mon Sep 17 00:00:00 2001 From: Corey Robertson Date: Tue, 11 Aug 2020 11:36:08 -0400 Subject: [PATCH 11/25] [Canvas][tech-debt] Convert renderers (#74134) * Convert renderers to typescript * Fix typo * Fix type issues * Fixes * Fix issue with data table render Co-authored-by: Elastic Machine --- .../functions/browser/markdown.ts | 2 +- .../functions/common/containerStyle.ts | 1 - .../functions/common/image.ts | 3 +- .../functions/common/index.ts | 2 +- .../canvas_plugin_src/functions/common/pie.ts | 2 +- .../functions/common/progress.ts | 6 ++- .../functions/common/repeat_image.test.js | 2 +- .../{repeatImage.ts => repeat_image.ts} | 9 +++- .../functions/common/revealImage.ts | 10 +++- .../functions/common/shape.ts | 2 +- .../functions/common/table.ts | 4 +- .../lib/{elastic_logo.js => elastic_logo.ts} | 0 ...{elastic_outline.js => elastic_outline.ts} | 0 .../canvas/canvas_plugin_src/plugin.ts | 1 - .../renderers/{core.js => core.ts} | 0 .../renderers/{debug.js => debug.tsx} | 3 +- .../renderers/embeddable/embeddable.tsx | 13 +++-- .../renderers/error/{index.js => index.tsx} | 11 +++-- .../filters/advanced_filter/index.tsx | 2 +- .../renderers/filters/{index.js => index.ts} | 0 .../renderers/{image.js => image.tsx} | 4 +- .../renderers/{index.js => index.ts} | 0 .../markdown/{index.js => index.tsx} | 8 +-- .../renderers/pie/{index.js => index.tsx} | 26 +++++++--- .../renderers/plot/{index.js => index.ts} | 12 +++-- .../renderers/progress/{index.js => index.ts} | 49 ++++++++++--------- .../progress/shapes/{index.js => index.ts} | 0 .../{repeat_image.js => repeat_image.ts} | 14 +++--- .../reveal_image/{index.js => index.ts} | 19 ++++--- .../renderers/shape/{index.js => index.ts} | 28 ++++++----- .../renderers/{table.js => table.tsx} | 20 +++++--- .../renderers/{text.js => text.tsx} | 7 +-- x-pack/plugins/canvas/common/lib/index.ts | 2 - .../{missing_asset.js => missing_asset.ts} | 0 .../common/lib/{url.test.js => url.test.ts} | 0 .../canvas/common/lib/{url.js => url.ts} | 2 +- .../i18n/functions/dict/repeat_image.ts | 2 +- .../components/error/{error.js => error.tsx} | 10 +++- .../components/error/{index.js => index.ts} | 0 .../{show_debugging.js => show_debugging.tsx} | 17 +++---- x-pack/plugins/canvas/public/plugin_api.ts | 12 +++-- .../public/services/stubs/expressions.ts | 13 ++--- .../__stories__/rendered_element.stories.tsx | 1 - .../components/rendered_element.tsx | 4 +- x-pack/plugins/canvas/types/renderers.ts | 3 ++ 45 files changed, 197 insertions(+), 129 deletions(-) rename x-pack/plugins/canvas/canvas_plugin_src/functions/common/{repeatImage.ts => repeat_image.ts} (93%) rename x-pack/plugins/canvas/canvas_plugin_src/lib/{elastic_logo.js => elastic_logo.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/lib/{elastic_outline.js => elastic_outline.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{core.js => core.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{debug.js => debug.tsx} (91%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/error/{index.js => index.tsx} (84%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{image.js => image.tsx} (86%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/{index.js => index.tsx} (78%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/{index.js => index.tsx} (74%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/{index.js => index.ts} (82%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/{index.js => index.ts} (64%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{repeat_image.js => repeat_image.ts} (81%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/{index.js => index.ts} (80%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/{index.js => index.ts} (73%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{table.js => table.tsx} (61%) rename x-pack/plugins/canvas/canvas_plugin_src/renderers/{text.js => text.tsx} (71%) rename x-pack/plugins/canvas/common/lib/{missing_asset.js => missing_asset.ts} (100%) rename x-pack/plugins/canvas/common/lib/{url.test.js => url.test.ts} (100%) rename x-pack/plugins/canvas/common/lib/{url.js => url.ts} (90%) rename x-pack/plugins/canvas/public/components/error/{error.js => error.tsx} (86%) rename x-pack/plugins/canvas/public/components/error/{index.js => index.ts} (100%) rename x-pack/plugins/canvas/public/components/error/{show_debugging.js => show_debugging.tsx} (64%) diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts index e44fb903ef04..947106fd9397 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts @@ -22,7 +22,7 @@ interface Arguments { openLinksInNewTab: boolean; } -interface Return { +export interface Return { content: string; font: Style; openLinksInNewTab: boolean; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts index 09ce2b2bf175..93e4a3636b91 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts @@ -6,7 +6,6 @@ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; import { ContainerStyle, Overflow, BackgroundRepeat, BackgroundSize } from '../../../types'; import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; -// @ts-expect-error untyped local import { isValidUrl } from '../../../common/lib/url'; interface Output extends ContainerStyle { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts index 3ef956b41ce2..21157660ed41 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts @@ -8,7 +8,6 @@ import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; // @ts-expect-error untyped local import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -// @ts-expect-error .png file import { elasticLogo } from '../../lib/elastic_logo'; export enum ImageMode { @@ -22,7 +21,7 @@ interface Arguments { mode: ImageMode | null; } -interface Return { +export interface Return { type: 'image'; mode: string; dataurl: string; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts index 79538941bbbf..5ec831efbe35 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts @@ -46,7 +46,7 @@ import { render } from './render'; import { replace } from './replace'; import { rounddate } from './rounddate'; import { rowCount } from './rowCount'; -import { repeatImage } from './repeatImage'; +import { repeatImage } from './repeat_image'; import { revealImage } from './revealImage'; import { seriesStyle } from './seriesStyle'; import { shape } from './shape'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts index c32c553fffc1..16eee349475e 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/pie.ts @@ -57,7 +57,7 @@ interface PieData { color?: string; } -interface Pie { +export interface Pie { font: Style; data: PieData[]; options: PieOptions; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts index 6fc1e509cd5e..4c4dba3ef7a3 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.ts @@ -20,7 +20,7 @@ export enum Shape { WHEEL = 'wheel', } -interface Arguments { +export interface Arguments { barColor: string; barWeight: number; font: Style; @@ -31,6 +31,10 @@ interface Arguments { valueWeight: number; } +export type Output = Arguments & { + value: number; +}; + export function progress(): ExpressionFunctionDefinition< 'progress', number, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js index 723c5eb4c682..f7c1ecc94a24 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js @@ -7,7 +7,7 @@ import { functionWrapper } from '../../../__tests__/helpers/function_wrapper'; import { elasticOutline } from '../../lib/elastic_outline'; import { elasticLogo } from '../../lib/elastic_logo'; -import { repeatImage } from './repeatImage'; +import { repeatImage } from './repeat_image'; describe('repeatImage', () => { const fn = functionWrapper(repeatImage); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeatImage.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts similarity index 93% rename from x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeatImage.ts rename to x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts index 9e296f2b9a92..cbb118c0db80 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeatImage.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts @@ -7,7 +7,6 @@ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; // @ts-expect-error untyped local import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -// @ts-expect-error .png file import { elasticOutline } from '../../lib/elastic_outline'; import { Render } from '../../../types'; import { getFunctionHelp } from '../../../i18n'; @@ -19,6 +18,14 @@ interface Arguments { emptyImage: string | null; } +export interface Return { + count: number; + image: string; + size: number; + max: number; + emptyImage: string | null; +} + export function repeatImage(): ExpressionFunctionDefinition< 'repeatImage', number, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts index 3e721cc49b41..9288a417f9d2 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts @@ -7,7 +7,6 @@ import { ExpressionFunctionDefinition, ExpressionValueRender } from 'src/plugins/expressions'; // @ts-expect-error untyped local import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -// @ts-expect-error .png file import { elasticOutline } from '../../lib/elastic_outline'; import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; @@ -24,11 +23,18 @@ interface Arguments { origin: Origin; } +export interface Output { + image: string; + emptyImage: string; + origin: Origin; + percent: number; +} + export function revealImage(): ExpressionFunctionDefinition< 'revealImage', number, Arguments, - ExpressionValueRender + ExpressionValueRender > { const { help, args: argHelp } = getFunctionHelp().revealImage; const errors = getFunctionErrors().revealImage; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts index a3fedebd36cf..e7178ab4eef5 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/shape.ts @@ -34,7 +34,7 @@ interface Arguments { maintainAspect: boolean; } -interface Output extends Arguments { +export interface Output extends Arguments { type: 'shape'; } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts index 689f3f969d1c..744d426d3bc6 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.ts @@ -15,11 +15,13 @@ interface Arguments { showHeader: boolean; } +export type Return = { datatable: Datatable } & Arguments; + export function table(): ExpressionFunctionDefinition< 'table', Datatable, Arguments, - Render + Render > { const { help, args: argHelp } = getFunctionHelp().table; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.js b/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.js rename to x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.js b/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.js rename to x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts b/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts index 59f0287805ea..55f5319bbadb 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/plugin.ts @@ -12,7 +12,6 @@ import { Start as InspectorStart } from '../../../../src/plugins/inspector/publi import { functions } from './functions/browser'; import { typeFunctions } from './expression_types'; -// @ts-expect-error: untyped local import { renderFunctions, renderFunctionFactories } from './renderers'; import { initializeElements } from './elements'; // @ts-expect-error untyped local diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/core.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.tsx similarity index 91% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.tsx index 79ec0078fa98..b4fbba96e8df 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/debug.tsx @@ -8,10 +8,11 @@ import ReactDOM from 'react-dom'; import React from 'react'; import { Debug } from '../../public/components/debug'; import { RendererStrings } from '../../i18n'; +import { RendererFactory } from '../../types'; const { debug: strings } = RendererStrings; -export const debug = () => ({ +export const debug: RendererFactory = () => ({ name: 'debug', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx index ad368a912cd8..641580d9c58a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.tsx @@ -17,7 +17,7 @@ import { EmbeddableExpression } from '../../expression_types/embeddable'; import { RendererStrings } from '../../../i18n'; import { embeddableInputToExpression } from './embeddable_input_to_expression'; import { EmbeddableInput } from '../../expression_types'; -import { RendererHandlers } from '../../../types'; +import { RendererFactory } from '../../../types'; import { CANVAS_EMBEDDABLE_CLASSNAME } from '../../../common/lib'; const { embeddable: strings } = RendererStrings; @@ -43,18 +43,17 @@ const renderEmbeddableFactory = (core: CoreStart, plugins: StartDeps) => { }; }; -export const embeddableRendererFactory = (core: CoreStart, plugins: StartDeps) => { +export const embeddableRendererFactory = ( + core: CoreStart, + plugins: StartDeps +): RendererFactory> => { const renderEmbeddable = renderEmbeddableFactory(core, plugins); return () => ({ name: 'embeddable', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, - render: async ( - domNode: HTMLElement, - { input, embeddableType }: EmbeddableExpression, - handlers: RendererHandlers - ) => { + render: async (domNode, { input, embeddableType }, handlers) => { const uniqueId = handlers.getElementId(); if (!embeddablesRegistry[uniqueId]) { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.tsx similarity index 84% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.tsx index b7e3fc300a18..a9296bd9a124 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/error/index.tsx @@ -5,15 +5,20 @@ */ import ReactDOM from 'react-dom'; -import React from 'react'; +import React, { MouseEventHandler } from 'react'; import { EuiIcon } from '@elastic/eui'; import { Error } from '../../../public/components/error'; import { Popover } from '../../../public/components/popover'; import { RendererStrings } from '../../../i18n'; +import { RendererFactory } from '../../../types'; + +interface Config { + error: Error; +} const { error: strings } = RendererStrings; -export const error = () => ({ +export const error: RendererFactory = () => ({ name: 'error', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -21,7 +26,7 @@ export const error = () => ({ render(domNode, config, handlers) { const draw = () => { const buttonSize = Math.min(domNode.clientHeight, domNode.clientWidth); - const button = (handleClick) => ( + const button = (handleClick: MouseEventHandler) => ( ({ +export const advancedFilter: RendererFactory<{}> = () => ({ name: 'advanced_filter', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/index.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx similarity index 86% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/image.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx index fd76f0106f7d..cbd81f0143da 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx @@ -8,11 +8,13 @@ import ReactDOM from 'react-dom'; import React from 'react'; import { elasticLogo } from '../lib/elastic_logo'; import { isValidUrl } from '../../common/lib/url'; +import { Return as Arguments } from '../functions/common/image'; import { RendererStrings } from '../../i18n'; +import { RendererFactory } from '../../types'; const { image: strings } = RendererStrings; -export const image = () => ({ +export const image: RendererFactory = () => ({ name: 'image', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx similarity index 78% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx index a7b0f620cf71..1ce05b77a510 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { CSSProperties } from 'react'; import ReactDOM from 'react-dom'; import { RendererStrings } from '../../../i18n'; +import { Return as Config } from '../../functions/browser/markdown'; import { Markdown } from '../../../../../../src/plugins/kibana_react/public'; +import { RendererFactory } from '../../../types'; const { markdown: strings } = RendererStrings; -export const markdown = () => ({ +export const markdown: RendererFactory = () => ({ name: 'markdown', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -22,7 +24,7 @@ export const markdown = () => ({ ReactDOM.render( , diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx similarity index 74% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx index cb423af30094..622e73ccf222 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/pie/index.tsx @@ -10,11 +10,14 @@ import '../../lib/flot-charts'; import { debounce, includes } from 'lodash'; import { RendererStrings } from '../../../i18n'; +// @ts-expect-error Untyped local: Will not convert import { pie as piePlugin } from './plugins/pie'; +import { Pie } from '../../functions/common/pie'; +import { RendererFactory } from '../../../types'; const { pie: strings } = RendererStrings; -export const pie = () => ({ +export const pie: RendererFactory = () => ({ name: 'pie', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -27,7 +30,10 @@ export const pie = () => ({ config.options.legend.labelBoxBorderColor = 'transparent'; if (config.font) { - const labelFormatter = (label, slice) => { + const labelFormatter = ( + label: string, + slice: jquery.flot.dataSeries & { percent: number } + ) => { // font color defaults to slice color if not specified const fontSpec = { ...config.font.spec, color: config.font.spec.color || slice.color }; const labelDiv = document.createElement('div'); @@ -36,23 +42,28 @@ export const pie = () => ({ const lineBreak = document.createElement('br'); const percentText = document.createTextNode(`${Math.round(slice.percent)}%`); - labelDiv.appendChild(labelSpan); + if (labelSpan) { + labelDiv.appendChild(labelSpan); + } labelDiv.appendChild(lineBreak); labelDiv.appendChild(percentText); return labelDiv.outerHTML; }; + // @ts-ignore ignoring missing propery config.options.series.pie.label.formatter = labelFormatter; - const legendFormatter = (label) => { + const legendFormatter = (label: string) => { const labelSpan = document.createElement('span'); Object.assign(labelSpan.style, config.font.spec); labelSpan.textContent = label; return labelSpan.outerHTML; }; + // @ts-ignore ignoring missing propery config.options.legend.labelFormatter = legendFormatter; } - let plot; + let plot: jquery.flot.plot; + function draw() { if (domNode.clientHeight < 1 || domNode.clientWidth < 1) { return; @@ -63,10 +74,11 @@ export const pie = () => ({ if (!config.data || !config.data.length) { $(domNode).empty(); } else { - plot = $.plot($(domNode), config.data, config.options); + // Casting config.options to any here as the flot typings do not appear to be accurate. + // For example, it does not have colors as a valid option. + plot = $.plot($(domNode), config.data, config.options as any); } } catch (e) { - console.log(e); // Nope } } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts similarity index 82% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts index ab523f1526e1..8c84f54f8746 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/plot/index.ts @@ -10,12 +10,15 @@ import '../../lib/flot-charts'; import { debounce, includes } from 'lodash'; import { RendererStrings } from '../../../i18n'; +import { RendererFactory, RendererSpec } from '../../../types'; +// @ts-expect-error Not going to convert import { size } from './plugins/size'; +// @ts-expect-error Not going to convert import { text } from './plugins/text'; const { plot: strings } = RendererStrings; -const render = (domNode, config, handlers) => { +const render: RendererSpec['render'] = (domNode, config, handlers) => { // TODO: OH NOES if (!includes($.plot.plugins, size)) { $.plot.plugins.push(size); @@ -24,14 +27,14 @@ const render = (domNode, config, handlers) => { $.plot.plugins.push(text); } - let plot; + let plot: jquery.flot.plot; function draw() { if (domNode.clientHeight < 1 || domNode.clientWidth < 1) { return; } if (config.font) { - const legendFormatter = (label) => { + const legendFormatter = (label: string) => { const labelSpan = document.createElement('span'); Object.assign(labelSpan.style, config.font.spec); labelSpan.textContent = label; @@ -67,9 +70,10 @@ const render = (domNode, config, handlers) => { return handlers.done(); }; -export const plot = () => ({ +export const plot: RendererFactory = () => ({ name: 'plot', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), + reuseDomNode: false, render, }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.ts similarity index 64% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.ts index 67d0abb65837..ea57655c230b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/index.ts @@ -7,10 +7,12 @@ import { getId } from '../../../public/lib/get_id'; import { RendererStrings } from '../../../i18n'; import { shapes } from './shapes'; +import { Output as Arguments } from '../../functions/common/progress'; +import { RendererFactory } from '../../../types'; const { progress: strings } = RendererStrings; -export const progress = () => ({ +export const progress: RendererFactory = () => ({ name: 'progress', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -23,12 +25,13 @@ export const progress = () => ({ if (shapeDef) { const parser = new DOMParser(); - const [shapeSvg] = parser - .parseFromString(shapes[shape], 'image/svg+xml') - .getElementsByTagName('svg'); + const shapeSvg = parser + .parseFromString(shapeDef, 'image/svg+xml') + .getElementsByTagName('svg') + .item(0)!; const initialViewBox = shapeSvg - .getAttribute('viewBox') + .getAttribute('viewBox')! .split(' ') .map((v) => parseInt(v, 10)); let [minX, minY, width, height] = initialViewBox; @@ -51,35 +54,35 @@ export const progress = () => ({ const svgId = getId('svg'); shapeSvg.id = svgId; - const [bar] = shapeSvg.getElementsByTagName('path'); + const bar = shapeSvg.getElementsByTagName('path').item(0)!; bar.setAttribute('className', 'canvasProgress__background'); bar.setAttribute('fill', 'none'); bar.setAttribute('stroke', barColor); bar.setAttribute('stroke-width', `${barWeight}px`); - const value = bar.cloneNode(true); - value.setAttribute('className', 'canvasProgress__value'); - value.setAttribute('stroke', valueColor); - value.setAttribute('stroke-width', `${valueWeight}px`); + const valueSvg = bar.cloneNode(true) as SVGPathElement; + valueSvg.setAttribute('className', 'canvasProgress__value'); + valueSvg.setAttribute('stroke', valueColor); + valueSvg.setAttribute('stroke-width', `${valueWeight}px`); - const length = value.getTotalLength(); + const length = valueSvg.getTotalLength(); const to = length * (1 - percent); - value.setAttribute('stroke-dasharray', length); - value.setAttribute('stroke-dashoffset', Math.max(0, to)); + valueSvg.setAttribute('stroke-dasharray', String(length)); + valueSvg.setAttribute('stroke-dashoffset', String(Math.max(0, to))); - shapeSvg.appendChild(value); + shapeSvg.appendChild(valueSvg); - const [text] = shapeSvg.getElementsByTagName('text'); + const text = shapeSvg.getElementsByTagName('text').item(0); if (label && text) { - text.textContent = label; + text.textContent = String(label); text.setAttribute('className', 'canvasProgress__label'); if (shape === 'horizontalPill') { - text.setAttribute('x', parseInt(text.getAttribute('x'), 10) + offset / 2); + text.setAttribute('x', String(parseInt(text.getAttribute('x')!, 10) + offset / 2)); } if (shape === 'verticalPill') { - text.setAttribute('y', parseInt(text.getAttribute('y'), 10) - offset / 2); + text.setAttribute('y', String(parseInt(text.getAttribute('y')!, 10) - offset / 2)); } Object.assign(text.style, font.spec); @@ -89,7 +92,7 @@ export const progress = () => ({ const { width: labelWidth, height: labelHeight } = text.getBBox(); if (shape === 'horizontalBar' || shape === 'horizontalPill') { - text.setAttribute('x', parseInt(text.getAttribute('x'), 10)); + text.setAttribute('x', String(parseInt(text.getAttribute('x')!, 10))); width += labelWidth; } if (shape === 'verticalBar' || shape === 'verticalPill') { @@ -103,8 +106,8 @@ export const progress = () => ({ } shapeSvg.setAttribute('viewBox', [minX, minY, width, height].join(' ')); - shapeSvg.setAttribute('width', domNode.offsetWidth); - shapeSvg.setAttribute('height', domNode.offsetHeight); + shapeSvg.setAttribute('width', String(domNode.offsetWidth)); + shapeSvg.setAttribute('height', String(domNode.offsetHeight)); if (domNode.firstChild) { domNode.removeChild(domNode.firstChild); @@ -112,8 +115,8 @@ export const progress = () => ({ domNode.appendChild(shapeSvg); handlers.onResize(() => { - shapeSvg.setAttribute('width', domNode.offsetWidth); - shapeSvg.setAttribute('height', domNode.offsetHeight); + shapeSvg.setAttribute('width', String(domNode.offsetWidth)); + shapeSvg.setAttribute('height', String(domNode.offsetHeight)); }); } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.ts similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/progress/shapes/index.ts diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts similarity index 81% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts index 2e48c8a2d5ec..ff37ca7a0e3d 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts @@ -9,25 +9,27 @@ import { times } from 'lodash'; import { elasticOutline } from '../lib/elastic_outline'; import { isValidUrl } from '../../common/lib/url'; import { RendererStrings, ErrorStrings } from '../../i18n'; +import { Return as Arguments } from '../functions/common/repeat_image'; +import { RendererFactory } from '../../types'; const { repeatImage: strings } = RendererStrings; const { RepeatImage: errors } = ErrorStrings; -export const repeatImage = () => ({ +export const repeatImage: RendererFactory = () => ({ name: 'repeatImage', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, render(domNode, config, handlers) { const settings = { - count: 10, ...config, image: isValidUrl(config.image) ? config.image : elasticOutline, + emptyImage: config.emptyImage || '', }; const container = $('
'); - function setSize(img) { + function setSize(img: HTMLImageElement) { if (img.naturalHeight > img.naturalWidth) { img.height = settings.size; } else { @@ -36,7 +38,7 @@ export const repeatImage = () => ({ } function finish() { - $(domNode).html(container); + $(domNode).append(container); handlers.done(); } @@ -46,7 +48,7 @@ export const repeatImage = () => ({ if (settings.max && settings.count > settings.max) { settings.count = settings.max; } - times(settings.count, () => container.append(img.cloneNode(true))); + times(settings.count, () => container.append($(img).clone())); if (isValidUrl(settings.emptyImage)) { if (settings.max == null) { @@ -56,7 +58,7 @@ export const repeatImage = () => ({ const emptyImage = new Image(); emptyImage.onload = function () { setSize(emptyImage); - times(settings.max - settings.count, () => container.append(emptyImage.cloneNode(true))); + times(settings.max - settings.count, () => container.append($(emptyImage).clone())); finish(); }; emptyImage.src = settings.emptyImage; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts similarity index 80% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts index 96c8d80794c0..c52556f8564c 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts @@ -7,10 +7,12 @@ import { elasticOutline } from '../../lib/elastic_outline'; import { isValidUrl } from '../../../common/lib/url'; import { RendererStrings } from '../../../i18n'; +import { RendererFactory } from '../../../types'; +import { Output as Arguments } from '../../functions/common/revealImage'; const { revealImage: strings } = RendererStrings; -export const revealImage = () => ({ +export const revealImage: RendererFactory = () => ({ name: 'revealImage', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), @@ -23,16 +25,17 @@ export const revealImage = () => ({ domNode.className = 'revealImage'; // set up the overlay image - img.onload = function () { + function onLoad() { setSize(); finish(); - }; + } + img.onload = onLoad; img.className = 'revealImage__image'; img.style.clipPath = getClipPath(config.percent, config.origin); - img.style['-webkit-clip-path'] = getClipPath(config.percent, config.origin); + img.style.setProperty('-webkit-clip-path', getClipPath(config.percent, config.origin)); img.src = isValidUrl(config.image) ? config.image : elasticOutline; - handlers.onResize(img.onload); + handlers.onResize(onLoad); // set up the underlay, "empty" image aligner.className = 'revealImageAligner'; @@ -52,9 +55,9 @@ export const revealImage = () => ({ handlers.done(); } - function getClipPath(percent, origin = 'bottom') { - const directions = { bottom: 0, left: 1, top: 2, right: 3 }; - const values = [0, 0, 0, 0]; + function getClipPath(percent: number, origin = 'bottom') { + const directions: Record = { bottom: 0, left: 1, top: 2, right: 3 }; + const values: Array = [0, 0, 0, 0]; values[directions[origin]] = `${100 - percent * 100}%`; return `inset(${values.join(' ')})`; } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.ts similarity index 73% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.ts index 5684c8c4602b..7c61ff69b18e 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/shape/index.ts @@ -6,22 +6,26 @@ import { RendererStrings } from '../../../i18n'; import { shapes } from './shapes'; +import { RendererFactory } from '../../../types'; +import { Output } from '../../functions/common/shape'; const { shape: strings } = RendererStrings; -export const shape = () => ({ +export const shape: RendererFactory = () => ({ name: 'shape', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, render(domNode, config, handlers) { - const { shape, fill, border, borderWidth, maintainAspect } = config; + const { shape: shapeType, fill, border, borderWidth, maintainAspect } = config; + const parser = new DOMParser(); - const [shapeSvg] = parser - .parseFromString(shapes[shape], 'image/svg+xml') - .getElementsByTagName('svg'); + const shapeSvg = parser + .parseFromString(shapes[shapeType], 'image/svg+xml') + .getElementsByTagName('svg') + .item(0)!; - const shapeContent = shapeSvg.firstElementChild; + const shapeContent = shapeSvg.firstElementChild!; if (fill) { shapeContent.setAttribute('fill', fill); @@ -30,15 +34,15 @@ export const shape = () => ({ shapeContent.setAttribute('stroke', border); } const strokeWidth = Math.max(borderWidth, 0); - shapeContent.setAttribute('stroke-width', strokeWidth); - shapeContent.setAttribute('stroke-miterlimit', 999); + shapeContent.setAttribute('stroke-width', String(strokeWidth)); + shapeContent.setAttribute('stroke-miterlimit', '999'); shapeContent.setAttribute('vector-effect', 'non-scaling-stroke'); shapeSvg.setAttribute('preserveAspectRatio', maintainAspect ? 'xMidYMid meet' : 'none'); shapeSvg.setAttribute('overflow', 'visible'); const initialViewBox = shapeSvg - .getAttribute('viewBox') + .getAttribute('viewBox')! .split(' ') .map((v) => parseInt(v, 10)); @@ -66,8 +70,8 @@ export const shape = () => ({ shapeHeight = 0; } - shapeSvg.setAttribute('width', width); - shapeSvg.setAttribute('height', height); + shapeSvg.setAttribute('width', String(width)); + shapeSvg.setAttribute('height', String(height)); shapeSvg.setAttribute('viewBox', [minX, minY, shapeWidth, shapeHeight].join(' ')); const oldShape = domNode.firstElementChild; @@ -75,7 +79,7 @@ export const shape = () => ({ domNode.removeChild(oldShape); } - domNode.style.lineHeight = 0; + domNode.style.lineHeight = '0'; domNode.appendChild(shapeSvg); }; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.js b/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx similarity index 61% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/table.js rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx index 971ba577643e..ada159e07f6a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx @@ -6,22 +6,30 @@ import ReactDOM from 'react-dom'; import React from 'react'; -import { get } from 'lodash'; -import { Datatable } from '../../public/components/datatable'; +import { Datatable as DatatableComponent } from '../../public/components/datatable'; import { RendererStrings } from '../../i18n'; +import { RendererFactory, Style, Datatable } from '../../types'; const { dropdownFilter: strings } = RendererStrings; -export const table = () => ({ +interface TableArguments { + font?: Style; + paginate: boolean; + perPage: number; + showHeader: boolean; + datatable: Datatable; +} + +export const table: RendererFactory = () => ({ name: 'table', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, render(domNode, config, handlers) { - const { datatable, paginate, perPage, font, showHeader } = config; + const { datatable, paginate, perPage, font = { spec: {} }, showHeader } = config; ReactDOM.render( -
- + ({ +export const text: RendererFactory<{ text: string }> = () => ({ name: 'text', displayName: strings.getDisplayName(), help: strings.getHelpDescription(), reuseDomNode: true, - render(domNode, { text }, handlers) { - ReactDOM.render(
{text}
, domNode, () => handlers.done()); + render(domNode, { text: textString }, handlers) { + ReactDOM.render(
{textString}
, domNode, () => handlers.done()); handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); }, }); diff --git a/x-pack/plugins/canvas/common/lib/index.ts b/x-pack/plugins/canvas/common/lib/index.ts index 6bd7e0bc9948..055f6ce7739b 100644 --- a/x-pack/plugins/canvas/common/lib/index.ts +++ b/x-pack/plugins/canvas/common/lib/index.ts @@ -24,12 +24,10 @@ export * from './get_legend_config'; export * from './handlebars'; export * from './hex_to_rgb'; export * from './httpurl'; -// @ts-expect-error missing local definition export * from './missing_asset'; export * from './palettes'; export * from './pivot_object_array'; // @ts-expect-error missing local definition export * from './resolve_dataurl'; export * from './unquote_string'; -// @ts-expect-error missing local definition export * from './url'; diff --git a/x-pack/plugins/canvas/common/lib/missing_asset.js b/x-pack/plugins/canvas/common/lib/missing_asset.ts similarity index 100% rename from x-pack/plugins/canvas/common/lib/missing_asset.js rename to x-pack/plugins/canvas/common/lib/missing_asset.ts diff --git a/x-pack/plugins/canvas/common/lib/url.test.js b/x-pack/plugins/canvas/common/lib/url.test.ts similarity index 100% rename from x-pack/plugins/canvas/common/lib/url.test.js rename to x-pack/plugins/canvas/common/lib/url.test.ts diff --git a/x-pack/plugins/canvas/common/lib/url.js b/x-pack/plugins/canvas/common/lib/url.ts similarity index 90% rename from x-pack/plugins/canvas/common/lib/url.js rename to x-pack/plugins/canvas/common/lib/url.ts index bed5e30cbff3..d2e031159d96 100644 --- a/x-pack/plugins/canvas/common/lib/url.js +++ b/x-pack/plugins/canvas/common/lib/url.ts @@ -7,6 +7,6 @@ import { isValidDataUrl } from '../../common/lib/dataurl'; import { isValidHttpUrl } from '../../common/lib/httpurl'; -export function isValidUrl(url) { +export function isValidUrl(url: string) { return isValidDataUrl(url) || isValidHttpUrl(url); } diff --git a/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts b/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts index aafaec11c4d1..222947779a75 100644 --- a/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts +++ b/x-pack/plugins/canvas/i18n/functions/dict/repeat_image.ts @@ -5,7 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { repeatImage } from '../../../canvas_plugin_src/functions/common/repeatImage'; +import { repeatImage } from '../../../canvas_plugin_src/functions/common/repeat_image'; import { FunctionHelp } from '../function_help'; import { FunctionFactory } from '../../../types'; import { CONTEXT, BASE64, URL } from '../../constants'; diff --git a/x-pack/plugins/canvas/public/components/error/error.js b/x-pack/plugins/canvas/public/components/error/error.tsx similarity index 86% rename from x-pack/plugins/canvas/public/components/error/error.js rename to x-pack/plugins/canvas/public/components/error/error.tsx index 2f82e7d669bd..93650df93cbe 100644 --- a/x-pack/plugins/canvas/public/components/error/error.js +++ b/x-pack/plugins/canvas/public/components/error/error.tsx @@ -4,16 +4,22 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC } from 'react'; import PropTypes from 'prop-types'; import { EuiCallOut } from '@elastic/eui'; import { get } from 'lodash'; import { ComponentStrings } from '../../../i18n'; import { ShowDebugging } from './show_debugging'; +export interface Props { + payload: { + error: Error; + }; +} + const { Error: strings } = ComponentStrings; -export const Error = ({ payload }) => { +export const Error: FC = ({ payload }) => { const message = get(payload, 'error.message'); return ( diff --git a/x-pack/plugins/canvas/public/components/error/index.js b/x-pack/plugins/canvas/public/components/error/index.ts similarity index 100% rename from x-pack/plugins/canvas/public/components/error/index.js rename to x-pack/plugins/canvas/public/components/error/index.ts diff --git a/x-pack/plugins/canvas/public/components/error/show_debugging.js b/x-pack/plugins/canvas/public/components/error/show_debugging.tsx similarity index 64% rename from x-pack/plugins/canvas/public/components/error/show_debugging.js rename to x-pack/plugins/canvas/public/components/error/show_debugging.tsx index 102ebc3f8a7e..0d5d74903828 100644 --- a/x-pack/plugins/canvas/public/components/error/show_debugging.js +++ b/x-pack/plugins/canvas/public/components/error/show_debugging.tsx @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { FC, useState } from 'react'; import PropTypes from 'prop-types'; -import { withState } from 'recompose'; import { EuiButtonEmpty } from '@elastic/eui'; import { Debug } from '../debug'; +import { Props } from './error'; -const ShowDebuggingComponent = ({ payload, expanded, setExpanded }) => - process.env.NODE_ENV === 'production' ? null : ( +export const ShowDebugging: FC = ({ payload }) => { + const [expanded, setExpanded] = useState(false); + + return process.env.NODE_ENV === 'production' ? null : (
)}
); +}; -ShowDebuggingComponent.propTypes = { - expanded: PropTypes.bool.isRequired, - setExpanded: PropTypes.func.isRequired, +ShowDebugging.propTypes = { payload: PropTypes.object.isRequired, }; - -export const ShowDebugging = withState('expanded', 'setExpanded', false)(ShowDebuggingComponent); diff --git a/x-pack/plugins/canvas/public/plugin_api.ts b/x-pack/plugins/canvas/public/plugin_api.ts index 4074d240c06e..62e82df4b0d0 100644 --- a/x-pack/plugins/canvas/public/plugin_api.ts +++ b/x-pack/plugins/canvas/public/plugin_api.ts @@ -6,7 +6,8 @@ import { AnyExpressionFunctionDefinition, AnyExpressionTypeDefinition, - RendererFactory, + AnyExpressionRenderDefinition, + AnyRendererFactory, } from '../types'; import { ElementFactory } from '../types'; import { ExpressionsSetup } from '../../../../src/plugins/expressions/public'; @@ -19,7 +20,7 @@ export interface CanvasApi { addElements: AddToRegistry; addFunctions: AddToRegistry<() => AnyExpressionFunctionDefinition>; addModelUIs: AddToRegistry; - addRenderers: AddToRegistry; + addRenderers: AddToRegistry; addTagUIs: AddToRegistry; addTransformUIs: AddToRegistry; addTransitions: AddToRegistry; @@ -65,8 +66,11 @@ export function getPluginApi( }); }, addRenderers: (renderers) => { - renderers.forEach((r: any) => { - expressionsPluginSetup.registerRenderer(r); + renderers.forEach((r) => { + // There is an issue of the canvas render definition not matching the expression render definition + // due to our handlers needing additional methods. For now, we are going to cast to get to the proper + // type, but we should work with AppArch to figure out how the Handlers can be genericized + expressionsPluginSetup.registerRenderer((r as unknown) as AnyExpressionRenderDefinition); }); }, diff --git a/x-pack/plugins/canvas/public/services/stubs/expressions.ts b/x-pack/plugins/canvas/public/services/stubs/expressions.ts index 26a90670106d..ee332e20c4ca 100644 --- a/x-pack/plugins/canvas/public/services/stubs/expressions.ts +++ b/x-pack/plugins/canvas/public/services/stubs/expressions.ts @@ -4,13 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AnyExpressionRenderDefinition } from 'src/plugins/expressions'; import { ExpressionsService } from '../'; -import { - plugin, - ExpressionRenderDefinition, -} from '../../../../../../src/plugins/expressions/public'; +import { plugin } from '../../../../../../src/plugins/expressions/public'; import { functions as functionDefinitions } from '../../../canvas_plugin_src/functions/common'; -// @ts-expect-error untyped local import { renderFunctions } from '../../../canvas_plugin_src/renderers/core'; const placeholder = {} as any; @@ -22,6 +19,6 @@ const setup = expressionsPlugin.setup(placeholder, { export const expressionsService: ExpressionsService = setup.fork(); functionDefinitions.forEach((fn) => expressionsService.registerFunction(fn)); -renderFunctions.forEach((fn: ExpressionRenderDefinition) => - expressionsService.registerRenderer(fn) -); +renderFunctions.forEach((fn) => { + expressionsService.registerRenderer((fn as unknown) as AnyExpressionRenderDefinition); +}); diff --git a/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx b/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx index 899edee7f048..aba510b8e736 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/__stories__/rendered_element.stories.tsx @@ -7,7 +7,6 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ExampleContext } from '../../test/context_example'; -// @ts-expect-error import { image } from '../../../canvas_plugin_src/renderers/image'; import { sharedWorkpads } from '../../test'; import { RenderedElement, RenderedElementComponent } from '../rendered_element'; diff --git a/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx b/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx index 6bcc0db92f1c..2291eff0db0e 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/rendered_element.tsx @@ -12,7 +12,7 @@ import { Positionable } from '../../public/components/positionable/positionable' import { elementToShape } from '../../public/components/workpad_page/utils'; import { CanvasRenderedElement } from '../types'; import { CanvasShareableContext, useCanvasShareableState } from '../context'; -import { RendererSpec } from '../../types'; +import { AnyRendererSpec } from '../../types'; import { createHandlers } from '../../public/lib/create_handlers'; import css from './rendered_element.module.scss'; @@ -33,7 +33,7 @@ export interface Props { * The Expression function that evaluates the state of the Element and renders * it to the Page. */ - fn: RendererSpec; + fn: AnyRendererSpec; } /** diff --git a/x-pack/plugins/canvas/types/renderers.ts b/x-pack/plugins/canvas/types/renderers.ts index 772a16aa94c6..7dcb94507b63 100644 --- a/x-pack/plugins/canvas/types/renderers.ts +++ b/x-pack/plugins/canvas/types/renderers.ts @@ -47,3 +47,6 @@ export interface RendererSpec { } export type RendererFactory = () => RendererSpec; + +export type AnyRendererFactory = RendererFactory; +export type AnyRendererSpec = RendererSpec; From d84777f053f6e2be1a6b7b8f19ba498cc6972730 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Tue, 11 Aug 2020 09:53:42 -0600 Subject: [PATCH 12/25] [data.search.SearchSource] Move some SearchSource dependencies to the server. (#74607) --- ...-plugins-data-public.getsearcherrortype.md | 22 ------- .../kibana-plugin-plugins-data-public.md | 3 +- ...s-data-public.searcherror._constructor_.md | 20 ------ ...-plugin-plugins-data-public.searcherror.md | 26 +++----- src/plugins/data/public/index.ts | 1 - src/plugins/data/public/public.api.md | 39 +++++------- src/plugins/data/public/search/fetch/index.ts | 1 - .../data/public/search/fetch/request_error.ts | 4 +- .../data/public/search/fetch/search_error.ts | 62 ------------------- src/plugins/data/public/search/fetch/types.ts | 9 +++ src/plugins/data/public/search/index.ts | 1 - .../search_source/create_search_source.ts | 2 +- .../public/search/search_source/parse_json.ts | 2 +- .../search/search_source/search_source.ts | 2 +- .../common}/index.ts | 3 +- .../utils => common}/migrate_legacy_query.ts | 0 src/plugins/kibana_legacy/kibana.json | 2 +- src/plugins/kibana_legacy/public/index.ts | 2 +- .../kibana_legacy/public/utils/index.ts | 1 - src/plugins/kibana_legacy/server/index.ts | 2 +- .../field_wildcard.test.ts | 0 .../field_wildcard.ts | 1 + src/plugins/kibana_utils/common/index.ts | 1 + src/plugins/kibana_utils/public/index.ts | 3 +- src/plugins/kibana_utils/server/index.ts | 9 ++- 25 files changed, 58 insertions(+), 160 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md delete mode 100644 src/plugins/data/public/search/fetch/search_error.ts rename src/plugins/{kibana_utils/public/field_wildcard => kibana_legacy/common}/index.ts (91%) rename src/plugins/kibana_legacy/{public/utils => common}/migrate_legacy_query.ts (100%) rename src/plugins/kibana_utils/{public/field_wildcard => common}/field_wildcard.test.ts (100%) rename src/plugins/kibana_utils/{public/field_wildcard => common}/field_wildcard.ts (99%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md deleted file mode 100644 index b46728c09379..000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearcherrortype.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [getSearchErrorType](./kibana-plugin-plugins-data-public.getsearcherrortype.md) - -## getSearchErrorType() function - -Signature: - -```typescript -export declare function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| { message } | Pick<SearchError, 'message'> | | - -Returns: - -`"UNSUPPORTED_QUERY" | undefined` - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index c8d45804a372..53c30b52cb98 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -18,7 +18,6 @@ | [OptionedParamType](./kibana-plugin-plugins-data-public.optionedparamtype.md) | | | [Plugin](./kibana-plugin-plugins-data-public.plugin.md) | | | [RequestTimeoutError](./kibana-plugin-plugins-data-public.requesttimeouterror.md) | Class used to signify that a request timed out. Useful for applications to conditionally handle this type of error differently than other errors. | -| [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) | | | [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) | | | [TimeHistory](./kibana-plugin-plugins-data-public.timehistory.md) | | @@ -39,7 +38,6 @@ | --- | --- | | [getDefaultQuery(language)](./kibana-plugin-plugins-data-public.getdefaultquery.md) | | | [getEsPreference(uiSettings, sessionId)](./kibana-plugin-plugins-data-public.getespreference.md) | | -| [getSearchErrorType({ message })](./kibana-plugin-plugins-data-public.getsearcherrortype.md) | | | [getSearchParamsFromRequest(searchRequest, dependencies)](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) | | | [getTime(indexPattern, timeRange, options)](./kibana-plugin-plugins-data-public.gettime.md) | | | [plugin(initializerContext)](./kibana-plugin-plugins-data-public.plugin.md) | | @@ -80,6 +78,7 @@ | [RefreshInterval](./kibana-plugin-plugins-data-public.refreshinterval.md) | | | [SavedQuery](./kibana-plugin-plugins-data-public.savedquery.md) | | | [SavedQueryService](./kibana-plugin-plugins-data-public.savedqueryservice.md) | | +| [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) | | | [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) | | | [SearchSourceFields](./kibana-plugin-plugins-data-public.searchsourcefields.md) | | | [TabbedAggColumn](./kibana-plugin-plugins-data-public.tabbedaggcolumn.md) | \* | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md deleted file mode 100644 index 4d7691d24a79..000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror._constructor_.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) > [(constructor)](./kibana-plugin-plugins-data-public.searcherror._constructor_.md) - -## SearchError.(constructor) - -Constructs a new instance of the `SearchError` class - -Signature: - -```typescript -constructor({ status, title, message, path, type }: SearchErrorOptions); -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| { status, title, message, path, type } | SearchErrorOptions | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md index 06e60cadf4a8..65b46bf6cba4 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searcherror.md @@ -2,28 +2,22 @@ [Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchError](./kibana-plugin-plugins-data-public.searcherror.md) -## SearchError class +## SearchError interface Signature: ```typescript -export declare class SearchError extends Error +export interface SearchError ``` -## Constructors - -| Constructor | Modifiers | Description | -| --- | --- | --- | -| [(constructor)({ status, title, message, path, type })](./kibana-plugin-plugins-data-public.searcherror._constructor_.md) | | Constructs a new instance of the SearchError class | - ## Properties -| Property | Modifiers | Type | Description | -| --- | --- | --- | --- | -| [message](./kibana-plugin-plugins-data-public.searcherror.message.md) | | string | | -| [name](./kibana-plugin-plugins-data-public.searcherror.name.md) | | string | | -| [path](./kibana-plugin-plugins-data-public.searcherror.path.md) | | string | | -| [status](./kibana-plugin-plugins-data-public.searcherror.status.md) | | string | | -| [title](./kibana-plugin-plugins-data-public.searcherror.title.md) | | string | | -| [type](./kibana-plugin-plugins-data-public.searcherror.type.md) | | string | | +| Property | Type | Description | +| --- | --- | --- | +| [message](./kibana-plugin-plugins-data-public.searcherror.message.md) | string | | +| [name](./kibana-plugin-plugins-data-public.searcherror.name.md) | string | | +| [path](./kibana-plugin-plugins-data-public.searcherror.path.md) | string | | +| [status](./kibana-plugin-plugins-data-public.searcherror.status.md) | string | | +| [title](./kibana-plugin-plugins-data-public.searcherror.title.md) | string | | +| [type](./kibana-plugin-plugins-data-public.searcherror.type.md) | string | | diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 5a9930d2b6b5..f036d5f30a0e 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -337,7 +337,6 @@ export { // search ES_SEARCH_STRATEGY, getEsPreference, - getSearchErrorType, ISearch, ISearchOptions, ISearchGeneric, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index adff7b205b93..216ed018957e 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -703,11 +703,6 @@ export function getEsPreference(uiSettings: IUiSettingsClient_2, sessionId?: str // @public export const getKbnTypeNames: () => string[]; -// Warning: (ae-missing-release-tag) "getSearchErrorType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; - // Warning: (ae-forgotten-export) The symbol "ISearchRequestParams" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "getSearchParamsFromRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1696,9 +1691,7 @@ export type SearchBarProps = SearchBarOwnProps & SearchBarInjectedDeps; // Warning: (ae-missing-release-tag) "SearchError" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class SearchError extends Error { - // Warning: (ae-forgotten-export) The symbol "SearchErrorOptions" needs to be exported by the entry point index.d.ts - constructor({ status, title, message, path, type }: SearchErrorOptions); +export interface SearchError { // (undocumented) message: string; // (undocumented) @@ -1968,21 +1961,21 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:370:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:373:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:385:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:369:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:371:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:372:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:381:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:382:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:384:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:392:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:45:5 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:54:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:55:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/fetch/index.ts b/src/plugins/data/public/search/fetch/index.ts index ab856d681ba1..79cdad1897f9 100644 --- a/src/plugins/data/public/search/fetch/index.ts +++ b/src/plugins/data/public/search/fetch/index.ts @@ -27,6 +27,5 @@ export { getMaxConcurrentShardRequests, } from './get_search_params'; -export { SearchError, getSearchErrorType } from './search_error'; export { RequestFailure } from './request_error'; export { handleResponse } from './handle_response'; diff --git a/src/plugins/data/public/search/fetch/request_error.ts b/src/plugins/data/public/search/fetch/request_error.ts index e216d32e127c..5e42a6fcf5b6 100644 --- a/src/plugins/data/public/search/fetch/request_error.ts +++ b/src/plugins/data/public/search/fetch/request_error.ts @@ -17,8 +17,8 @@ * under the License. */ -import { KbnError } from '../../../../kibana_utils/public'; -import { SearchResponse, SearchError } from '..'; +import { KbnError } from '../../../../kibana_utils/common'; +import { SearchError, SearchResponse } from './types'; /** * Request Failure - When an entire multi request fails diff --git a/src/plugins/data/public/search/fetch/search_error.ts b/src/plugins/data/public/search/fetch/search_error.ts deleted file mode 100644 index d4042fb17499..000000000000 --- a/src/plugins/data/public/search/fetch/search_error.ts +++ /dev/null @@ -1,62 +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. - */ - -interface SearchErrorOptions { - status: string; - title: string; - message: string; - path: string; - type: string; -} - -export class SearchError extends Error { - public name: string; - public status: string; - public title: string; - public message: string; - public path: string; - public type: string; - - constructor({ status, title, message, path, type }: SearchErrorOptions) { - super(message); - this.name = 'SearchError'; - this.status = status; - this.title = title; - this.message = message; - this.path = path; - this.type = type; - - // captureStackTrace is only available in the V8 engine, so any browser using - // a different JS engine won't have access to this method. - if (Error.captureStackTrace) { - Error.captureStackTrace(this, SearchError); - } - - // Babel doesn't support traditional `extends` syntax for built-in classes. - // https://babeljs.io/docs/en/caveats/#classes - Object.setPrototypeOf(this, SearchError.prototype); - } -} - -export function getSearchErrorType({ message }: Pick) { - const msg = message.toLowerCase(); - if (msg.indexOf('unsupported query') > -1) { - return 'UNSUPPORTED_QUERY'; - } -} diff --git a/src/plugins/data/public/search/fetch/types.ts b/src/plugins/data/public/search/fetch/types.ts index 1aba4f66bb4d..dda66d6b5238 100644 --- a/src/plugins/data/public/search/fetch/types.ts +++ b/src/plugins/data/public/search/fetch/types.ts @@ -33,3 +33,12 @@ export interface FetchHandlers { config: IUiSettingsClient; esShardTimeout: number; } + +export interface SearchError { + name: string; + status: string; + title: string; + message: string; + path: string; + type: string; +} diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 40d45ab88ea9..96445e536714 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -34,7 +34,6 @@ export { FetchOptions, SearchRequest, SearchResponse, - getSearchErrorType, getSearchParamsFromRequest, } from './fetch'; diff --git a/src/plugins/data/public/search/search_source/create_search_source.ts b/src/plugins/data/public/search/search_source/create_search_source.ts index 3466d60e5dd7..4c44f4d62d46 100644 --- a/src/plugins/data/public/search/search_source/create_search_source.ts +++ b/src/plugins/data/public/search/search_source/create_search_source.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { migrateLegacyQuery } from '../../../../kibana_legacy/public'; +import { migrateLegacyQuery } from '../../../../kibana_legacy/common'; import { SearchSource, SearchSourceDependencies } from './search_source'; import { IndexPatternsContract } from '../../index_patterns/index_patterns'; import { SearchSourceFields } from './types'; diff --git a/src/plugins/data/public/search/search_source/parse_json.ts b/src/plugins/data/public/search/search_source/parse_json.ts index f0eb377cedc7..8f4652531142 100644 --- a/src/plugins/data/public/search/search_source/parse_json.ts +++ b/src/plugins/data/public/search/search_source/parse_json.ts @@ -18,7 +18,7 @@ */ import { SearchSourceFields } from './types'; -import { InvalidJSONProperty } from '../../../../kibana_utils/public'; +import { InvalidJSONProperty } from '../../../../kibana_utils/common'; export const parseSearchSourceJSON = (searchSourceJSON: string) => { // if we have a searchSource, set its values based on the searchSourceJson field diff --git a/src/plugins/data/public/search/search_source/search_source.ts b/src/plugins/data/public/search/search_source/search_source.ts index c97a5d0638a6..847dc8853d6b 100644 --- a/src/plugins/data/public/search/search_source/search_source.ts +++ b/src/plugins/data/public/search/search_source/search_source.ts @@ -75,7 +75,7 @@ import { map } from 'rxjs/operators'; import { CoreStart } from 'kibana/public'; import { normalizeSortRequest } from './normalize_sort_request'; import { filterDocvalueFields } from './filter_docvalue_fields'; -import { fieldWildcardFilter } from '../../../../kibana_utils/public'; +import { fieldWildcardFilter } from '../../../../kibana_utils/common'; import { IIndexPattern, ISearchGeneric, SearchRequest } from '../..'; import { SearchSourceOptions, SearchSourceFields } from './types'; import { FetchOptions, RequestFailure, handleResponse, getSearchParamsFromRequest } from '../fetch'; diff --git a/src/plugins/kibana_utils/public/field_wildcard/index.ts b/src/plugins/kibana_legacy/common/index.ts similarity index 91% rename from src/plugins/kibana_utils/public/field_wildcard/index.ts rename to src/plugins/kibana_legacy/common/index.ts index db9f830e450b..9c16d7b27386 100644 --- a/src/plugins/kibana_utils/public/field_wildcard/index.ts +++ b/src/plugins/kibana_legacy/common/index.ts @@ -17,4 +17,5 @@ * under the License. */ -export * from './field_wildcard'; +export * from './kbn_base_url'; +export * from './migrate_legacy_query'; diff --git a/src/plugins/kibana_legacy/public/utils/migrate_legacy_query.ts b/src/plugins/kibana_legacy/common/migrate_legacy_query.ts similarity index 100% rename from src/plugins/kibana_legacy/public/utils/migrate_legacy_query.ts rename to src/plugins/kibana_legacy/common/migrate_legacy_query.ts diff --git a/src/plugins/kibana_legacy/kibana.json b/src/plugins/kibana_legacy/kibana.json index 606acd8b88b0..79264d95dcc2 100644 --- a/src/plugins/kibana_legacy/kibana.json +++ b/src/plugins/kibana_legacy/kibana.json @@ -3,5 +3,5 @@ "version": "kibana", "server": true, "ui": true, - "extraPublicDirs": ["common/kbn_base_url"] + "extraPublicDirs": ["common", "common/kbn_base_url"] } diff --git a/src/plugins/kibana_legacy/public/index.ts b/src/plugins/kibana_legacy/public/index.ts index 75e81b050574..27b940b0a456 100644 --- a/src/plugins/kibana_legacy/public/index.ts +++ b/src/plugins/kibana_legacy/public/index.ts @@ -24,7 +24,7 @@ export const plugin = (initializerContext: PluginInitializerContext) => new KibanaLegacyPlugin(initializerContext); export * from './plugin'; -export { kbnBaseUrl } from '../common/kbn_base_url'; +export { kbnBaseUrl, migrateLegacyQuery } from '../common'; export { initAngularBootstrap } from './angular_bootstrap'; export { PaginateDirectiveProvider, PaginateControlsDirectiveProvider } from './paginate/paginate'; diff --git a/src/plugins/kibana_legacy/public/utils/index.ts b/src/plugins/kibana_legacy/public/utils/index.ts index e7dd55ec5582..a32cd5e40a04 100644 --- a/src/plugins/kibana_legacy/public/utils/index.ts +++ b/src/plugins/kibana_legacy/public/utils/index.ts @@ -17,7 +17,6 @@ * under the License. */ -export * from './migrate_legacy_query'; export * from './system_api'; export * from './normalize_path'; // @ts-ignore diff --git a/src/plugins/kibana_legacy/server/index.ts b/src/plugins/kibana_legacy/server/index.ts index 0188f9b1ec51..3ddcac1517f7 100644 --- a/src/plugins/kibana_legacy/server/index.ts +++ b/src/plugins/kibana_legacy/server/index.ts @@ -50,7 +50,7 @@ export const config: PluginConfigDescriptor = { ], }; -export { kbnBaseUrl } from '../common/kbn_base_url'; +export { kbnBaseUrl, migrateLegacyQuery } from '../common'; class Plugin { public setup(core: CoreSetup) {} diff --git a/src/plugins/kibana_utils/public/field_wildcard/field_wildcard.test.ts b/src/plugins/kibana_utils/common/field_wildcard.test.ts similarity index 100% rename from src/plugins/kibana_utils/public/field_wildcard/field_wildcard.test.ts rename to src/plugins/kibana_utils/common/field_wildcard.test.ts diff --git a/src/plugins/kibana_utils/public/field_wildcard/field_wildcard.ts b/src/plugins/kibana_utils/common/field_wildcard.ts similarity index 99% rename from src/plugins/kibana_utils/public/field_wildcard/field_wildcard.ts rename to src/plugins/kibana_utils/common/field_wildcard.ts index 2aa9a255bd5c..bfe5a0f3a0a8 100644 --- a/src/plugins/kibana_utils/public/field_wildcard/field_wildcard.ts +++ b/src/plugins/kibana_utils/common/field_wildcard.ts @@ -19,6 +19,7 @@ import { escapeRegExp, memoize } from 'lodash'; +// @internal export const makeRegEx = memoize(function makeRegEx(glob: string) { const globRegex = glob.split('*').map(escapeRegExp).join('.*'); return new RegExp(`^${globRegex}$`); diff --git a/src/plugins/kibana_utils/common/index.ts b/src/plugins/kibana_utils/common/index.ts index c94021872b4e..1ec5737c5a38 100644 --- a/src/plugins/kibana_utils/common/index.ts +++ b/src/plugins/kibana_utils/common/index.ts @@ -18,6 +18,7 @@ */ export * from './defer'; +export * from './field_wildcard'; export * from './of'; export * from './ui'; export * from './state_containers'; diff --git a/src/plugins/kibana_utils/public/index.ts b/src/plugins/kibana_utils/public/index.ts index d1c9eec0e990..7edf62ce04e8 100644 --- a/src/plugins/kibana_utils/public/index.ts +++ b/src/plugins/kibana_utils/public/index.ts @@ -21,6 +21,8 @@ export { calculateObjectHash, defer, Defer, + fieldWildcardFilter, + fieldWildcardMatcher, Get, JsonArray, JsonObject, @@ -34,7 +36,6 @@ export { } from '../common'; export * from './core'; export * from '../common/errors'; -export * from './field_wildcard'; export * from './render_complete'; export * from './resize_checker'; export * from '../common/state_containers'; diff --git a/src/plugins/kibana_utils/server/index.ts b/src/plugins/kibana_utils/server/index.ts index b8b768da0192..bf3361d1e536 100644 --- a/src/plugins/kibana_utils/server/index.ts +++ b/src/plugins/kibana_utils/server/index.ts @@ -17,4 +17,11 @@ * under the License. */ -export { Get, Set, createGetterSetter, url } from '../common'; +export { + createGetterSetter, + fieldWildcardFilter, + fieldWildcardMatcher, + Get, + Set, + url, +} from '../common'; From 910c8836078264a7a6f362271f7185887be0ab83 Mon Sep 17 00:00:00 2001 From: Luke Elmers Date: Tue, 11 Aug 2020 09:55:09 -0600 Subject: [PATCH 13/25] [data.ui.query] Write filters to query log from default editor. (#74474) --- .../query_string_input.test.tsx | 38 +++++++++++++++++++ .../query_string_input/query_string_input.tsx | 5 ++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx b/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx index 0397c34d0c2b..bb0a8b848c89 100644 --- a/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_string_input.test.tsx @@ -186,6 +186,44 @@ describe('QueryStringInput', () => { expect(mockCallback).toHaveBeenCalledWith({ query: 'response:200', language: 'kuery' }); }); + it('Should fire onBlur callback on input blur', () => { + const mockCallback = jest.fn(); + + const component = mount( + wrapQueryStringInputInContext({ + query: kqlQuery, + onBlur: mockCallback, + indexPatterns: [stubIndexPatternWithFields], + disableAutoFocus: true, + }) + ); + + const inputWrapper = component.find(EuiTextArea).find('textarea'); + inputWrapper.simulate('blur'); + + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith(); + }); + + it('Should fire onChangeQueryInputFocus callback on input blur', () => { + const mockCallback = jest.fn(); + + const component = mount( + wrapQueryStringInputInContext({ + query: kqlQuery, + onChangeQueryInputFocus: mockCallback, + indexPatterns: [stubIndexPatternWithFields], + disableAutoFocus: true, + }) + ); + + const inputWrapper = component.find(EuiTextArea).find('textarea'); + inputWrapper.simulate('blur'); + + expect(mockCallback).toHaveBeenCalledTimes(1); + expect(mockCallback).toHaveBeenCalledWith(false); + }); + it('Should use PersistedLog for recent search suggestions', async () => { const component = mount( wrapQueryStringInputInContext({ diff --git a/src/plugins/data/public/ui/query_string_input/query_string_input.tsx b/src/plugins/data/public/ui/query_string_input/query_string_input.tsx index 6f72aa829d8f..86ee98b7af9d 100644 --- a/src/plugins/data/public/ui/query_string_input/query_string_input.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_string_input.tsx @@ -33,7 +33,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { debounce, compact, isEqual } from 'lodash'; +import { debounce, compact, isEqual, isFunction } from 'lodash'; import { Toast } from 'src/core/public'; import { IDataPluginServices, IIndexPattern, Query } from '../..'; import { QuerySuggestion, QuerySuggestionTypes } from '../../autocomplete'; @@ -460,6 +460,9 @@ export class QueryStringInputUI extends Component { if (this.props.onChangeQueryInputFocus) { this.props.onChangeQueryInputFocus(false); } + if (isFunction(this.props.onBlur)) { + this.props.onBlur(); + } }; private onClickSuggestion = (suggestion: QuerySuggestion) => { From 0ef17f92a61b406e13b67af7752af7d2a146a270 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Tue, 11 Aug 2020 17:58:47 +0200 Subject: [PATCH 14/25] theme function (#73451) --- .../common/expression_functions/specs/font.ts | 15 +-- .../expression_functions/specs/index.ts | 3 + .../specs/tests/font.test.ts | 97 ++++++------------- .../specs/tests/theme.test.ts | 63 ++++++++++++ .../expression_functions/specs/theme.ts | 65 +++++++++++++ .../common/expression_functions/types.ts | 2 + 6 files changed, 172 insertions(+), 73 deletions(-) create mode 100644 src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts create mode 100644 src/plugins/expressions/common/expression_functions/specs/theme.ts diff --git a/src/plugins/expressions/common/expression_functions/specs/font.ts b/src/plugins/expressions/common/expression_functions/specs/font.ts index c46ce0adadef..52692f72cebb 100644 --- a/src/plugins/expressions/common/expression_functions/specs/font.ts +++ b/src/plugins/expressions/common/expression_functions/specs/font.ts @@ -64,7 +64,7 @@ export const font: ExpressionFunctionFont = { inputTypes: ['null'], args: { align: { - default: 'left', + default: '{ theme "font.align" default="left" }', help: i18n.translate('expressions.functions.font.args.alignHelpText', { defaultMessage: 'The horizontal text alignment.', }), @@ -72,13 +72,14 @@ export const font: ExpressionFunctionFont = { types: ['string'], }, color: { + default: `{ theme "font.color" }`, help: i18n.translate('expressions.functions.font.args.colorHelpText', { defaultMessage: 'The text color.', }), types: ['string'], }, family: { - default: `"${openSans.value}"`, + default: `{ theme "font.family" default="${openSans.value}" }`, help: i18n.translate('expressions.functions.font.args.familyHelpText', { defaultMessage: 'An acceptable {css} web font string', values: { @@ -88,7 +89,7 @@ export const font: ExpressionFunctionFont = { types: ['string'], }, italic: { - default: false, + default: `{ theme "font.italic" default=false }`, help: i18n.translate('expressions.functions.font.args.italicHelpText', { defaultMessage: 'Italicize the text?', }), @@ -96,7 +97,7 @@ export const font: ExpressionFunctionFont = { types: ['boolean'], }, lHeight: { - default: null, + default: `{ theme "font.lHeight" }`, aliases: ['lineHeight'], help: i18n.translate('expressions.functions.font.args.lHeightHelpText', { defaultMessage: 'The line height in pixels', @@ -104,14 +105,14 @@ export const font: ExpressionFunctionFont = { types: ['number', 'null'], }, size: { - default: 14, + default: `{ theme "font.size" default=14 }`, help: i18n.translate('expressions.functions.font.args.sizeHelpText', { defaultMessage: 'The font size in pixels', }), types: ['number'], }, underline: { - default: false, + default: `{ theme "font.underline" default=false }`, help: i18n.translate('expressions.functions.font.args.underlineHelpText', { defaultMessage: 'Underline the text?', }), @@ -119,7 +120,7 @@ export const font: ExpressionFunctionFont = { types: ['boolean'], }, weight: { - default: 'normal', + default: `{ theme "font.weight" default="normal" }`, help: i18n.translate('expressions.functions.font.args.weightHelpText', { defaultMessage: 'The font weight. For example, {list}, or {end}.', values: { diff --git a/src/plugins/expressions/common/expression_functions/specs/index.ts b/src/plugins/expressions/common/expression_functions/specs/index.ts index f7471a8fd9d7..5b9562dae5f2 100644 --- a/src/plugins/expressions/common/expression_functions/specs/index.ts +++ b/src/plugins/expressions/common/expression_functions/specs/index.ts @@ -24,6 +24,7 @@ import { kibanaContextFunction } from './kibana_context'; import { variableSet } from './var_set'; import { variable } from './var'; import { AnyExpressionFunctionDefinition } from '../types'; +import { theme } from './theme'; export const functionSpecs: AnyExpressionFunctionDefinition[] = [ clog, @@ -32,6 +33,7 @@ export const functionSpecs: AnyExpressionFunctionDefinition[] = [ kibanaContextFunction, variableSet, variable, + theme, ]; export * from './clog'; @@ -40,3 +42,4 @@ export * from './kibana'; export * from './kibana_context'; export * from './var_set'; export * from './var'; +export * from './theme'; diff --git a/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts b/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts index 62e5fd4e0b66..ca4570e9589c 100644 --- a/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts +++ b/src/plugins/expressions/common/expression_functions/specs/tests/font.test.ts @@ -24,8 +24,19 @@ import { functionWrapper } from './utils'; describe('font', () => { const fn = functionWrapper(font); + const args = { + align: 'left', + color: null, + family: openSans.value, + italic: false, + lHeight: null, + size: 14, + underline: false, + weight: 'normal', + }; + describe('default output', () => { - const result = fn(null); + const result = fn(null, args); it('returns a style', () => { expect(result).toMatchObject({ @@ -39,7 +50,7 @@ describe('font', () => { describe('args', () => { describe('size', () => { it('sets font size', () => { - const result = fn(null, { size: 20 }); + const result = fn(null, { ...args, size: 20 }); expect(result).toMatchObject({ spec: { fontSize: '20px', @@ -47,21 +58,11 @@ describe('font', () => { }); expect(result.css).toContain('font-size:20px'); }); - - it('defaults to 14px', () => { - const result = fn(null); - expect(result).toMatchObject({ - spec: { - fontSize: '14px', - }, - }); - expect(result.css).toContain('font-size:14px'); - }); }); describe('lHeight', () => { it('sets line height', () => { - const result = fn(null, { lHeight: 30 }); + const result = fn(null, { ...args, lHeight: 30 }); expect(result).toMatchObject({ spec: { lineHeight: '30px', @@ -69,31 +70,19 @@ describe('font', () => { }); expect(result.css).toContain('line-height:30px'); }); - - it('defaults to 1', () => { - const result = fn(null); - expect(result.spec.lineHeight).toBe('1'); - expect(result.css).toContain('line-height:1'); - }); }); describe('family', () => { it('sets font family', () => { - const result = fn(null, { family: 'Optima, serif' }); + const result = fn(null, { ...args, family: 'Optima, serif' }); expect(result.spec.fontFamily).toBe('Optima, serif'); expect(result.css).toContain('font-family:Optima, serif'); }); - - it(`defaults to "${openSans.value}"`, () => { - const result = fn(null); - expect(result.spec.fontFamily).toBe(`"${openSans.value}"`); - expect(result.css).toContain(`font-family:"${openSans.value}"`); - }); }); describe('color', () => { it('sets font color', () => { - const result = fn(null, { color: 'blue' }); + const result = fn(null, { ...args, color: 'blue' }); expect(result.spec.color).toBe('blue'); expect(result.css).toContain('color:blue'); }); @@ -101,51 +90,39 @@ describe('font', () => { describe('weight', () => { it('sets font weight', () => { - let result = fn(null, { weight: 'normal' }); + let result = fn(null, { ...args, weight: 'normal' }); expect(result.spec.fontWeight).toBe('normal'); expect(result.css).toContain('font-weight:normal'); - result = fn(null, { weight: 'bold' }); + result = fn(null, { ...args, weight: 'bold' }); expect(result.spec.fontWeight).toBe('bold'); expect(result.css).toContain('font-weight:bold'); - result = fn(null, { weight: 'bolder' }); + result = fn(null, { ...args, weight: 'bolder' }); expect(result.spec.fontWeight).toBe('bolder'); expect(result.css).toContain('font-weight:bolder'); - result = fn(null, { weight: 'lighter' }); + result = fn(null, { ...args, weight: 'lighter' }); expect(result.spec.fontWeight).toBe('lighter'); expect(result.css).toContain('font-weight:lighter'); - result = fn(null, { weight: '400' }); + result = fn(null, { ...args, weight: '400' }); expect(result.spec.fontWeight).toBe('400'); expect(result.css).toContain('font-weight:400'); }); - it("defaults to 'normal'", () => { - const result = fn(null); - expect(result.spec.fontWeight).toBe('normal'); - expect(result.css).toContain('font-weight:normal'); - }); - it('throws when provided an invalid weight', () => { - expect(() => fn(null, { weight: 'foo' })).toThrow(); + expect(() => fn(null, { ...args, weight: 'foo' })).toThrow(); }); }); describe('underline', () => { it('sets text underline', () => { - let result = fn(null, { underline: true }); + let result = fn(null, { ...args, underline: true }); expect(result.spec.textDecoration).toBe('underline'); expect(result.css).toContain('text-decoration:underline'); - result = fn(null, { underline: false }); - expect(result.spec.textDecoration).toBe('none'); - expect(result.css).toContain('text-decoration:none'); - }); - - it('defaults to false', () => { - const result = fn(null); + result = fn(null, { ...args, underline: false }); expect(result.spec.textDecoration).toBe('none'); expect(result.css).toContain('text-decoration:none'); }); @@ -153,17 +130,11 @@ describe('font', () => { describe('italic', () => { it('sets italic', () => { - let result = fn(null, { italic: true }); + let result = fn(null, { ...args, italic: true }); expect(result.spec.fontStyle).toBe('italic'); expect(result.css).toContain('font-style:italic'); - result = fn(null, { italic: false }); - expect(result.spec.fontStyle).toBe('normal'); - expect(result.css).toContain('font-style:normal'); - }); - - it('defaults to false', () => { - const result = fn(null); + result = fn(null, { ...args, italic: false }); expect(result.spec.fontStyle).toBe('normal'); expect(result.css).toContain('font-style:normal'); }); @@ -171,31 +142,25 @@ describe('font', () => { describe('align', () => { it('sets text alignment', () => { - let result = fn(null, { align: 'left' }); + let result = fn(null, { ...args, align: 'left' }); expect(result.spec.textAlign).toBe('left'); expect(result.css).toContain('text-align:left'); - result = fn(null, { align: 'center' }); + result = fn(null, { ...args, align: 'center' }); expect(result.spec.textAlign).toBe('center'); expect(result.css).toContain('text-align:center'); - result = fn(null, { align: 'right' }); + result = fn(null, { ...args, align: 'right' }); expect(result.spec.textAlign).toBe('right'); expect(result.css).toContain('text-align:right'); - result = fn(null, { align: 'justify' }); + result = fn(null, { ...args, align: 'justify' }); expect(result.spec.textAlign).toBe('justify'); expect(result.css).toContain('text-align:justify'); }); - it(`defaults to 'left'`, () => { - const result = fn(null); - expect(result.spec.textAlign).toBe('left'); - expect(result.css).toContain('text-align:left'); - }); - it('throws when provided an invalid alignment', () => { - expect(() => fn(null, { align: 'foo' })).toThrow(); + expect(() => fn(null, { ...args, align: 'foo' })).toThrow(); }); }); }); diff --git a/src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts b/src/plugins/expressions/common/expression_functions/specs/tests/theme.test.ts new file mode 100644 index 000000000000..263409f0caca --- /dev/null +++ b/src/plugins/expressions/common/expression_functions/specs/tests/theme.test.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 { functionWrapper } from './utils'; +import { theme } from '../theme'; +import { ExecutionContext } from '../../../execution/types'; + +describe('expression_functions', () => { + describe('theme', () => { + const fn = functionWrapper(theme); + let context: ExecutionContext; + + let themeProps; + + beforeEach(() => { + themeProps = { + font: { + family: 'Arial', + size: 14, + }, + }; + + context = { + getInitialInput: () => {}, + types: {}, + variables: { theme: themeProps }, + abortSignal: {} as any, + inspectorAdapters: {} as any, + }; + }); + + it('returns the selected variable', () => { + const actual = fn(null, { variable: 'font.family' }, context); + expect(actual).toEqual('Arial'); + }); + + it('returns undefined if variable does not exist', () => { + const actual = fn(null, { variable: 'font.weight' }, context); + expect(actual).toEqual(undefined); + }); + + it('returns default if variable does not exist and default is provided', () => { + const actual = fn(null, { variable: 'font.weight', default: 'normal' }, context); + expect(actual).toEqual('normal'); + }); + }); +}); diff --git a/src/plugins/expressions/common/expression_functions/specs/theme.ts b/src/plugins/expressions/common/expression_functions/specs/theme.ts new file mode 100644 index 000000000000..e27b01674cb5 --- /dev/null +++ b/src/plugins/expressions/common/expression_functions/specs/theme.ts @@ -0,0 +1,65 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { get } from 'lodash'; +import { ExpressionFunctionDefinition } from '../types'; + +interface Arguments { + variable: string; + default: string | number | boolean; +} + +type Output = any; + +export type ExpressionFunctionTheme = ExpressionFunctionDefinition< + 'theme', + null, + Arguments, + Output +>; + +export const theme: ExpressionFunctionTheme = { + name: 'theme', + aliases: [], + help: i18n.translate('expressions.functions.themeHelpText', { + defaultMessage: 'Reads a theme setting.', + }), + inputTypes: ['null'], + args: { + variable: { + aliases: ['_'], + help: i18n.translate('expressions.functions.theme.args.variableHelpText', { + defaultMessage: 'Name of the theme variable to read.', + }), + required: true, + types: ['string'], + }, + default: { + help: i18n.translate('expressions.functions.theme.args.defaultHelpText', { + defaultMessage: 'default value in case theming info is not available.', + }), + }, + }, + fn: (input, args, handlers) => { + // currently we use variable `theme`, but external theme service would be preferable + const vars = handlers.variables.theme || {}; + return get(vars, args.variable, args.default); + }, +}; diff --git a/src/plugins/expressions/common/expression_functions/types.ts b/src/plugins/expressions/common/expression_functions/types.ts index 5979bcffb317..d58d872aff72 100644 --- a/src/plugins/expressions/common/expression_functions/types.ts +++ b/src/plugins/expressions/common/expression_functions/types.ts @@ -28,6 +28,7 @@ import { ExpressionFunctionKibana, ExpressionFunctionVarSet, ExpressionFunctionVar, + ExpressionFunctionTheme, } from './specs'; /** @@ -122,4 +123,5 @@ export interface ExpressionFunctionDefinitions { kibana: ExpressionFunctionKibana; var_set: ExpressionFunctionVarSet; var: ExpressionFunctionVar; + theme: ExpressionFunctionTheme; } From 75b8a3cb710eb13c05b61c85bf345dd3e6d92cb3 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 11 Aug 2020 10:18:36 -0600 Subject: [PATCH 15/25] [Maps] add initial location option that fits to data bounds (#74583) * [Maps] add initial location option that fits to data bounds * update navigation_panel snapshot * add functional test to ensure sync is called when auto fit to bounds with no data * add functional test for auto fit to bounds on map load Co-authored-by: Elastic Machine --- x-pack/plugins/maps/common/constants.ts | 1 + .../public/actions/data_request_actions.ts | 34 +++++++++++++++- .../maps/public/actions/layer_actions.ts | 2 - .../maps/public/actions/map_actions.ts | 40 ++++++++----------- .../map/mb/get_initial_view.ts | 5 +++ .../navigation_panel.test.tsx.snap | 12 ++++++ .../map_settings_panel/navigation_panel.tsx | 11 ++++- .../apps/maps/auto_fit_to_bounds.js | 27 +++++++++++++ .../es_archives/maps/kibana/data.json | 29 ++++++++++++++ 9 files changed, 132 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/maps/common/constants.ts b/x-pack/plugins/maps/common/constants.ts index cf67ac4dd999..eec23f95bb17 100644 --- a/x-pack/plugins/maps/common/constants.ts +++ b/x-pack/plugins/maps/common/constants.ts @@ -234,6 +234,7 @@ export enum INITIAL_LOCATION { LAST_SAVED_LOCATION = 'LAST_SAVED_LOCATION', FIXED_LOCATION = 'FIXED_LOCATION', BROWSER_LOCATION = 'BROWSER_LOCATION', + AUTO_FIT_TO_BOUNDS = 'AUTO_FIT_TO_BOUNDS', } export enum LAYER_WIZARD_CATEGORY { diff --git a/x-pack/plugins/maps/public/actions/data_request_actions.ts b/x-pack/plugins/maps/public/actions/data_request_actions.ts index 4c829f8e75c2..a22e8d582bc5 100644 --- a/x-pack/plugins/maps/public/actions/data_request_actions.ts +++ b/x-pack/plugins/maps/public/actions/data_request_actions.ts @@ -7,6 +7,7 @@ import { Dispatch } from 'redux'; import bbox from '@turf/bbox'; +import uuid from 'uuid/v4'; import { multiPoint } from '@turf/helpers'; import { FeatureCollection } from 'geojson'; import { MapStoreState } from '../reducers/store'; @@ -133,7 +134,7 @@ export function syncDataForAllLayers() { }; } -export function syncDataForAllJoinLayers() { +function syncDataForAllJoinLayers() { return async (dispatch: Dispatch, getState: () => MapStoreState) => { const syncPromises = getLayerList(getState()) .filter((layer) => { @@ -318,7 +319,7 @@ export function fitToLayerExtent(layerId: string) { }; } -export function fitToDataBounds() { +export function fitToDataBounds(onNoBounds?: () => void) { return async (dispatch: Dispatch, getState: () => MapStoreState) => { const layerList = getFittableLayers(getState()); @@ -365,6 +366,9 @@ export function fitToDataBounds() { } if (!corners.length) { + if (onNoBounds) { + onNoBounds(); + } return; } @@ -374,6 +378,32 @@ export function fitToDataBounds() { }; } +let lastSetQueryCallId: string = ''; +export function autoFitToBounds() { + return async (dispatch: Dispatch) => { + // Method can be triggered before async actions complete + // Use localSetQueryCallId to only continue execution path if method has not been re-triggered. + const localSetQueryCallId = uuid(); + lastSetQueryCallId = localSetQueryCallId; + + // Joins are performed on the client. + // As a result, bounds for join layers must also be performed on the client. + // Therefore join layers need to fetch data prior to auto fitting bounds. + await dispatch(syncDataForAllJoinLayers()); + + if (localSetQueryCallId === lastSetQueryCallId) { + // In cases where there are no bounds, such as no matching documents, fitToDataBounds does not trigger setGotoWithBounds. + // Ensure layer syncing occurs when setGotoWithBounds is not triggered. + function onNoBounds() { + if (localSetQueryCallId === lastSetQueryCallId) { + dispatch(syncDataForAllLayers()); + } + } + dispatch(fitToDataBounds(onNoBounds)); + } + }; +} + function setGotoWithBounds(bounds: MapExtent) { return { type: SET_GOTO, diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index 208f6dc6c6f8..472e42129816 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -125,8 +125,6 @@ export function addLayer(layerDescriptor: LayerDescriptor) { }; } -// Do not use when rendering a map. Method exists to enable selectors for getLayerList when -// rendering is not needed. export function addLayerWithoutDataSync(layerDescriptor: LayerDescriptor) { return { type: ADD_LAYER, diff --git a/x-pack/plugins/maps/public/actions/map_actions.ts b/x-pack/plugins/maps/public/actions/map_actions.ts index 7191fb312b21..08826276c12a 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.ts @@ -6,7 +6,6 @@ import { Dispatch } from 'redux'; import turfBboxPolygon from '@turf/bbox-polygon'; import turfBooleanContains from '@turf/boolean-contains'; -import uuid from 'uuid/v4'; import { Filter, Query, TimeRange } from 'src/plugins/data/public'; import { MapStoreState } from '../reducers/store'; @@ -44,12 +43,8 @@ import { UPDATE_DRAW_STATE, UPDATE_MAP_SETTING, } from './map_action_constants'; -import { - fitToDataBounds, - syncDataForAllJoinLayers, - syncDataForAllLayers, -} from './data_request_actions'; -import { addLayer } from './layer_actions'; +import { autoFitToBounds, syncDataForAllLayers } from './data_request_actions'; +import { addLayer, addLayerWithoutDataSync } from './layer_actions'; import { MapSettings } from '../reducers/map'; import { DrawState, @@ -57,6 +52,7 @@ import { MapExtent, MapRefreshConfig, } from '../../common/descriptor_types'; +import { INITIAL_LOCATION } from '../../common/constants'; import { scaleBounds } from '../elasticsearch_geo_utils'; export function setMapInitError(errorMessage: string) { @@ -98,13 +94,21 @@ export function mapReady() { type: MAP_READY, }); - getWaitingForMapReadyLayerListRaw(getState()).forEach((layerDescriptor) => { - dispatch(addLayer(layerDescriptor)); - }); - + const waitingForMapReadyLayerList = getWaitingForMapReadyLayerListRaw(getState()); dispatch({ type: CLEAR_WAITING_FOR_MAP_READY_LAYER_LIST, }); + + if (getMapSettings(getState()).initialLocation === INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS) { + waitingForMapReadyLayerList.forEach((layerDescriptor) => { + dispatch(addLayerWithoutDataSync(layerDescriptor)); + }); + dispatch(autoFitToBounds()); + } else { + waitingForMapReadyLayerList.forEach((layerDescriptor) => { + dispatch(addLayer(layerDescriptor)); + }); + } }; } @@ -196,7 +200,6 @@ function generateQueryTimestamp() { return new Date().toISOString(); } -let lastSetQueryCallId: string = ''; export function setQuery({ query, timeFilters, @@ -227,18 +230,7 @@ export function setQuery({ }); if (getMapSettings(getState()).autoFitToDataBounds) { - // Joins are performed on the client. - // As a result, bounds for join layers must also be performed on the client. - // Therefore join layers need to fetch data prior to auto fitting bounds. - const localSetQueryCallId = uuid(); - lastSetQueryCallId = localSetQueryCallId; - await dispatch(syncDataForAllJoinLayers()); - - // setQuery can be triggered before async data fetching completes - // Only continue execution path if setQuery has not been re-triggered. - if (localSetQueryCallId === lastSetQueryCallId) { - dispatch(fitToDataBounds()); - } + dispatch(autoFitToBounds()); } else { await dispatch(syncDataForAllLayers()); } diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts b/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts index b9d446d390ff..20fb8186f987 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts +++ b/x-pack/plugins/maps/public/connected_components/map/mb/get_initial_view.ts @@ -41,5 +41,10 @@ export async function getInitialView( }); } + if (settings.initialLocation === INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS) { + // map bounds pulled from data sources. Just use default map location + return null; + } + return goto && goto.center ? goto.center : null; } diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap index 18e30d9446e0..1859c7d8177f 100644 --- a/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap @@ -75,6 +75,10 @@ exports[`should render 1`] = ` "id": "LAST_SAVED_LOCATION", "label": "Map location at save", }, + Object { + "id": "AUTO_FIT_TO_BOUNDS", + "label": "Auto fit map to data bounds", + }, Object { "id": "FIXED_LOCATION", "label": "Fixed location", @@ -165,6 +169,10 @@ exports[`should render browser location form when initialLocation is BROWSER_LOC "id": "LAST_SAVED_LOCATION", "label": "Map location at save", }, + Object { + "id": "AUTO_FIT_TO_BOUNDS", + "label": "Auto fit map to data bounds", + }, Object { "id": "FIXED_LOCATION", "label": "Fixed location", @@ -275,6 +283,10 @@ exports[`should render fixed location form when initialLocation is FIXED_LOCATIO "id": "LAST_SAVED_LOCATION", "label": "Map location at save", }, + Object { + "id": "AUTO_FIT_TO_BOUNDS", + "label": "Auto fit map to data bounds", + }, Object { "id": "FIXED_LOCATION", "label": "Fixed location", diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx index 428a50e03515..161c0c3576f8 100644 --- a/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx @@ -41,6 +41,12 @@ const initialLocationOptions = [ defaultMessage: 'Map location at save', }), }, + { + id: INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS, + label: i18n.translate('xpack.maps.mapSettingsPanel.autoFitToBoundsLocationLabel', { + defaultMessage: 'Auto fit map to data bounds', + }), + }, { id: INITIAL_LOCATION.FIXED_LOCATION, label: i18n.translate('xpack.maps.mapSettingsPanel.fixedLocationLabel', { @@ -125,7 +131,10 @@ export function NavigationPanel({ center, settings, updateMapSetting, zoom }: Pr }; function renderInitialLocationInputs() { - if (settings.initialLocation === INITIAL_LOCATION.LAST_SAVED_LOCATION) { + if ( + settings.initialLocation === INITIAL_LOCATION.LAST_SAVED_LOCATION || + settings.initialLocation === INITIAL_LOCATION.AUTO_FIT_TO_BOUNDS + ) { return null; } diff --git a/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js b/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js index c8e8db84df96..d3d4fe054ec3 100644 --- a/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js +++ b/x-pack/test/functional/apps/maps/auto_fit_to_bounds.js @@ -10,6 +10,23 @@ export default function ({ getPageObjects }) { const PageObjects = getPageObjects(['maps']); describe('auto fit map to bounds', () => { + describe('initial location', () => { + before(async () => { + await PageObjects.maps.loadSavedMap( + 'document example - auto fit to bounds for initial location' + ); + }); + + it('should automatically fit to bounds on initial map load', async () => { + const hits = await PageObjects.maps.getHits(); + expect(hits).to.equal('6'); + + const { lat, lon } = await PageObjects.maps.getView(); + expect(Math.round(lat)).to.equal(41); + expect(Math.round(lon)).to.equal(-99); + }); + }); + describe('without joins', () => { before(async () => { await PageObjects.maps.loadSavedMap('document example'); @@ -25,10 +42,20 @@ export default function ({ getPageObjects }) { await PageObjects.maps.setAndSubmitQuery('machine.os.raw : "ios"'); await PageObjects.maps.waitForMapPanAndZoom(origView); + const hits = await PageObjects.maps.getHits(); + expect(hits).to.equal('2'); + const { lat, lon } = await PageObjects.maps.getView(); expect(Math.round(lat)).to.equal(43); expect(Math.round(lon)).to.equal(-102); }); + + it('should sync layers even when there is not data', async () => { + await PageObjects.maps.setAndSubmitQuery('machine.os.raw : "fake_os_with_no_matches"'); + + const hits = await PageObjects.maps.getHits(); + expect(hits).to.equal('0'); + }); }); describe('with joins', () => { diff --git a/x-pack/test/functional/es_archives/maps/kibana/data.json b/x-pack/test/functional/es_archives/maps/kibana/data.json index 7690c9258931..198174bccb28 100644 --- a/x-pack/test/functional/es_archives/maps/kibana/data.json +++ b/x-pack/test/functional/es_archives/maps/kibana/data.json @@ -979,6 +979,35 @@ } } +{ + "type": "doc", + "value": { + "id": "map:13776f20-db37-11ea-8fbb-3da39bb9bff2", + "index": ".kibana", + "source": { + "map" : { + "title" : "document example - auto fit to bounds for initial location", + "description" : "", + "mapStateJSON" : "{\"zoom\":5.2,\"center\":{\"lon\":-67.80052,\"lat\":-55.25331},\"timeFilters\":{\"from\":\"2015-09-20T00:00:00.000Z\",\"to\":\"2015-09-20T01:00:00.000Z\"},\"refreshConfig\":{\"isPaused\":true,\"interval\":1000},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"settings\":{\"autoFitToDataBounds\":false,\"initialLocation\":\"AUTO_FIT_TO_BOUNDS\",\"fixedLocation\":{\"lat\":0,\"lon\":0,\"zoom\":2},\"browserLocation\":{\"zoom\":2},\"maxZoom\":24,\"minZoom\":0,\"showSpatialFilters\":true,\"spatialFiltersAlpa\":0.3,\"spatialFiltersFillColor\":\"#DA8B45\",\"spatialFiltersLineColor\":\"#DA8B45\"}}", + "layerListJSON" : "[{\"id\":\"0hmz5\",\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"VECTOR_TILE\",\"minZoom\":0,\"maxZoom\":24},{\"id\":\"z52lq\",\"label\":\"logstash\",\"minZoom\":0,\"maxZoom\":24,\"sourceDescriptor\":{\"id\":\"e1a5e1a6-676c-4a89-8ea9-0d91d64b73c6\",\"type\":\"ES_SEARCH\",\"geoField\":\"geo.coordinates\",\"limit\":2048,\"filterByMapBounds\":true,\"showTooltip\":true,\"tooltipProperties\":[],\"applyGlobalQuery\":true,\"scalingType\":\"LIMIT\",\"indexPatternRefName\":\"layer_1_source_index_pattern\"},\"visible\":true,\"temporary\":false,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#e6194b\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}},\"icon\":{\"type\":\"STATIC\",\"options\":{\"value\":\"marker\"}}},\"previousStyle\":null},\"type\":\"VECTOR\"}]", + "uiStateJSON" : "{\"isLayerTOCOpen\":true,\"openTOCDetails\":[]}" + }, + "type" : "map", + "references" : [ + { + "name" : "layer_1_source_index_pattern", + "type" : "index-pattern", + "id" : "c698b940-e149-11e8-a35a-370a8516603a" + } + ], + "migrationVersion" : { + "map" : "7.9.0" + }, + "updated_at" : "2020-08-10T18:27:39.805Z" + } + } +} + { "type": "doc", "value": { From 0cfc7b464c329858effc6cef952c2d311c0aab52 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 11 Aug 2020 20:10:35 +0300 Subject: [PATCH 16/25] [Lens] Add styling options for x and y axes on the settings popover (#71829) * [Lens] Add styling options for x axis on the settings popover * ts related changes * Changes to the popover's design and y-axis implementatin * fix types and add unit tests * Add extra translations * Fix functional test and change the logic of the yTitle * fixes * fix showTitle settings bug * Fix ticklabels bug on y axes * fix some tests * Change the user flow on x and y titles on settings popover and enable the gridlines by default * disable linter warning * PR Comments * Add a comment to callback to explain the decision to listen only to open changes Co-authored-by: Elastic Machine --- .../__snapshots__/to_expression.test.ts.snap | 48 +++- .../__snapshots__/xy_expression.test.tsx.snap | 49 +++- .../lens/public/xy_visualization/index.ts | 4 +- .../xy_visualization/to_expression.test.ts | 77 +++++- .../public/xy_visualization/to_expression.ts | 63 +++-- .../lens/public/xy_visualization/types.ts | 85 ++++++ .../xy_visualization/xy_config_panel.test.tsx | 69 ++++- .../xy_visualization/xy_config_panel.tsx | 261 ++++++++++++++++-- .../xy_visualization/xy_expression.test.tsx | 173 +++++++++++- .../public/xy_visualization/xy_expression.tsx | 68 +++-- .../xy_visualization/xy_suggestions.test.ts | 20 ++ .../public/xy_visualization/xy_suggestions.ts | 12 + 12 files changed, 852 insertions(+), 77 deletions(-) diff --git a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap index b5783803b803..19ea75239ddb 100644 --- a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap +++ b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/to_expression.test.ts.snap @@ -8,6 +8,25 @@ Object { "fittingFunction": Array [ "Carry", ], + "gridlinesVisibilitySettings": Array [ + Object { + "chain": Array [ + Object { + "arguments": Object { + "x": Array [ + false, + ], + "y": Array [ + true, + ], + }, + "function": "lens_xy_gridlinesConfig", + "type": "function", + }, + ], + "type": "expression", + }, + ], "layers": Array [ Object { "chain": Array [ @@ -73,11 +92,36 @@ Object { "type": "expression", }, ], + "showXAxisTitle": Array [ + true, + ], + "showYAxisTitle": Array [ + true, + ], + "tickLabelsVisibilitySettings": Array [ + Object { + "chain": Array [ + Object { + "arguments": Object { + "x": Array [ + false, + ], + "y": Array [ + true, + ], + }, + "function": "lens_xy_tickLabelsConfig", + "type": "function", + }, + ], + "type": "expression", + }, + ], "xTitle": Array [ - "col_a", + "", ], "yTitle": Array [ - "col_b", + "", ], }, "function": "lens_xy_chart", diff --git a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap index c7c173f87ad7..f0c233b44a28 100644 --- a/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap +++ b/x-pack/plugins/lens/public/xy_visualization/__snapshots__/xy_expression.test.tsx.snap @@ -20,9 +20,14 @@ exports[`xy_expression XYChart component it renders area 1`] = ` } /> @@ -146,9 +151,14 @@ exports[`xy_expression XYChart component it renders bar 1`] = ` } /> @@ -262,9 +272,14 @@ exports[`xy_expression XYChart component it renders horizontal bar 1`] = ` } /> @@ -378,9 +393,14 @@ exports[`xy_expression XYChart component it renders line 1`] = ` } /> @@ -504,9 +524,14 @@ exports[`xy_expression XYChart component it renders stacked area 1`] = ` } /> @@ -628,9 +653,14 @@ exports[`xy_expression XYChart component it renders stacked bar 1`] = ` } /> @@ -752,9 +782,14 @@ exports[`xy_expression XYChart component it renders stacked horizontal bar 1`] = } /> diff --git a/x-pack/plugins/lens/public/xy_visualization/index.ts b/x-pack/plugins/lens/public/xy_visualization/index.ts index 77cab1ee2134..fddcad7989b2 100644 --- a/x-pack/plugins/lens/public/xy_visualization/index.ts +++ b/x-pack/plugins/lens/public/xy_visualization/index.ts @@ -10,7 +10,7 @@ import { ExpressionsSetup } from '../../../../../src/plugins/expressions/public' import { UI_SETTINGS } from '../../../../../src/plugins/data/public'; import { xyVisualization } from './xy_visualization'; import { xyChart, getXyChartRenderer } from './xy_expression'; -import { legendConfig, layerConfig, yAxisConfig } from './types'; +import { legendConfig, layerConfig, yAxisConfig, tickLabelsConfig, gridlinesConfig } from './types'; import { EditorFrameSetup, FormatFactory } from '../types'; import { ChartsPluginSetup } from '../../../../../src/plugins/charts/public'; @@ -39,6 +39,8 @@ export class XyVisualization { ) { expressions.registerFunction(() => legendConfig); expressions.registerFunction(() => yAxisConfig); + expressions.registerFunction(() => tickLabelsConfig); + expressions.registerFunction(() => gridlinesConfig); expressions.registerFunction(() => layerConfig); expressions.registerFunction(() => xyChart); diff --git a/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts index 31b34e41e82d..876d1141740e 100644 --- a/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts +++ b/x-pack/plugins/lens/public/xy_visualization/to_expression.test.ts @@ -41,6 +41,8 @@ describe('#toExpression', () => { legend: { position: Position.Bottom, isVisible: true }, preferredSeriesType: 'bar', fittingFunction: 'Carry', + tickLabelsVisibilitySettings: { x: false, y: true }, + gridlinesVisibilitySettings: { x: false, y: true }, layers: [ { layerId: 'first', @@ -77,6 +79,27 @@ describe('#toExpression', () => { ).toEqual('None'); }); + it('should default the showXAxisTitle and showYAxisTitle to true', () => { + const expression = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }, + frame + ) as Ast; + expect(expression.chain[0].arguments.showXAxisTitle[0]).toBe(true); + expect(expression.chain[0].arguments.showYAxisTitle[0]).toBe(true); + }); + it('should not generate an expression when missing x', () => { expect( xyVisualization.toExpression( @@ -140,8 +163,8 @@ describe('#toExpression', () => { expect(mockDatasource.publicAPIMock.getOperationForColumnId).toHaveBeenCalledWith('b'); expect(mockDatasource.publicAPIMock.getOperationForColumnId).toHaveBeenCalledWith('c'); expect(mockDatasource.publicAPIMock.getOperationForColumnId).toHaveBeenCalledWith('d'); - expect(expression.chain[0].arguments.xTitle).toEqual(['col_a']); - expect(expression.chain[0].arguments.yTitle).toEqual(['col_b']); + expect(expression.chain[0].arguments.xTitle).toEqual(['']); + expect(expression.chain[0].arguments.yTitle).toEqual(['']); expect( (expression.chain[0].arguments.layers[0] as Ast).chain[0].arguments.columnToLabel ).toEqual([ @@ -152,4 +175,54 @@ describe('#toExpression', () => { }), ]); }); + + it('should default the tick labels visibility settings to true', () => { + const expression = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }, + frame + ) as Ast; + expect( + (expression.chain[0].arguments.tickLabelsVisibilitySettings[0] as Ast).chain[0].arguments + ).toEqual({ + x: [true], + y: [true], + }); + }); + + it('should default the gridlines visibility settings to true', () => { + const expression = xyVisualization.toExpression( + { + legend: { position: Position.Bottom, isVisible: true }, + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }, + frame + ) as Ast; + expect( + (expression.chain[0].arguments.gridlinesVisibilitySettings[0] as Ast).chain[0].arguments + ).toEqual({ + x: [true], + y: [true], + }); + }); }); diff --git a/x-pack/plugins/lens/public/xy_visualization/to_expression.ts b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts index b17704b38cde..9b9c159af265 100644 --- a/x-pack/plugins/lens/public/xy_visualization/to_expression.ts +++ b/x-pack/plugins/lens/public/xy_visualization/to_expression.ts @@ -13,28 +13,6 @@ interface ValidLayer extends LayerConfig { xAccessor: NonNullable; } -function xyTitles(layer: LayerConfig, frame: FramePublicAPI) { - const defaults = { - xTitle: 'x', - yTitle: 'y', - }; - - if (!layer || !layer.accessors.length) { - return defaults; - } - const datasource = frame.datasourceLayers[layer.layerId]; - if (!datasource) { - return defaults; - } - const x = layer.xAccessor ? datasource.getOperationForColumnId(layer.xAccessor) : null; - const y = layer.accessors[0] ? datasource.getOperationForColumnId(layer.accessors[0]) : null; - - return { - xTitle: x ? x.label : defaults.xTitle, - yTitle: y ? y.label : defaults.yTitle, - }; -} - export const toExpression = (state: State, frame: FramePublicAPI): Ast | null => { if (!state || !state.layers.length) { return null; @@ -52,7 +30,7 @@ export const toExpression = (state: State, frame: FramePublicAPI): Ast | null => }); }); - return buildExpression(state, metadata, frame, xyTitles(state.layers[0], frame)); + return buildExpression(state, metadata, frame); }; export function toPreviewExpression(state: State, frame: FramePublicAPI) { @@ -99,8 +77,7 @@ export function getScaleType(metadata: OperationMetadata | null, defaultScale: S export const buildExpression = ( state: State, metadata: Record>, - frame?: FramePublicAPI, - { xTitle, yTitle }: { xTitle: string; yTitle: string } = { xTitle: '', yTitle: '' } + frame?: FramePublicAPI ): Ast | null => { const validLayers = state.layers.filter((layer): layer is ValidLayer => Boolean(layer.xAccessor && layer.accessors.length) @@ -116,8 +93,8 @@ export const buildExpression = ( type: 'function', function: 'lens_xy_chart', arguments: { - xTitle: [xTitle], - yTitle: [yTitle], + xTitle: [state.xTitle || ''], + yTitle: [state.yTitle || ''], legend: [ { type: 'expression', @@ -137,6 +114,38 @@ export const buildExpression = ( }, ], fittingFunction: [state.fittingFunction || 'None'], + showXAxisTitle: [state.showXAxisTitle ?? true], + showYAxisTitle: [state.showYAxisTitle ?? true], + tickLabelsVisibilitySettings: [ + { + type: 'expression', + chain: [ + { + type: 'function', + function: 'lens_xy_tickLabelsConfig', + arguments: { + x: [state?.tickLabelsVisibilitySettings?.x ?? true], + y: [state?.tickLabelsVisibilitySettings?.y ?? true], + }, + }, + ], + }, + ], + gridlinesVisibilitySettings: [ + { + type: 'expression', + chain: [ + { + type: 'function', + function: 'lens_xy_gridlinesConfig', + arguments: { + x: [state?.gridlinesVisibilitySettings?.x ?? true], + y: [state?.gridlinesVisibilitySettings?.y ?? true], + }, + }, + ], + }, + ], layers: validLayers.map((layer) => { const columnToLabel: Record = {}; diff --git a/x-pack/plugins/lens/public/xy_visualization/types.ts b/x-pack/plugins/lens/public/xy_visualization/types.ts index 605119535d1f..ab689ceb183b 100644 --- a/x-pack/plugins/lens/public/xy_visualization/types.ts +++ b/x-pack/plugins/lens/public/xy_visualization/types.ts @@ -75,6 +75,81 @@ export const legendConfig: ExpressionFunctionDefinition< }, }; +export interface AxesSettingsConfig { + x: boolean; + y: boolean; +} + +type TickLabelsConfigResult = AxesSettingsConfig & { type: 'lens_xy_tickLabelsConfig' }; + +export const tickLabelsConfig: ExpressionFunctionDefinition< + 'lens_xy_tickLabelsConfig', + null, + AxesSettingsConfig, + TickLabelsConfigResult +> = { + name: 'lens_xy_tickLabelsConfig', + aliases: [], + type: 'lens_xy_tickLabelsConfig', + help: `Configure the xy chart's tick labels appearance`, + inputTypes: ['null'], + args: { + x: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.xAxisTickLabels.help', { + defaultMessage: 'Specifies whether or not the tick labels of the x-axis are visible.', + }), + }, + y: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.yAxisTickLabels.help', { + defaultMessage: 'Specifies whether or not the tick labels of the y-axis are visible.', + }), + }, + }, + fn: function fn(input: unknown, args: AxesSettingsConfig) { + return { + type: 'lens_xy_tickLabelsConfig', + ...args, + }; + }, +}; + +type GridlinesConfigResult = AxesSettingsConfig & { type: 'lens_xy_gridlinesConfig' }; + +export const gridlinesConfig: ExpressionFunctionDefinition< + 'lens_xy_gridlinesConfig', + null, + AxesSettingsConfig, + GridlinesConfigResult +> = { + name: 'lens_xy_gridlinesConfig', + aliases: [], + type: 'lens_xy_gridlinesConfig', + help: `Configure the xy chart's gridlines appearance`, + inputTypes: ['null'], + args: { + x: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.xAxisGridlines.help', { + defaultMessage: 'Specifies whether or not the gridlines of the x-axis are visible.', + }), + }, + y: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.yAxisgridlines.help', { + defaultMessage: 'Specifies whether or not the gridlines of the y-axis are visible.', + }), + }, + }, + fn: function fn(input: unknown, args: AxesSettingsConfig) { + return { + type: 'lens_xy_gridlinesConfig', + ...args, + }; + }, +}; + interface AxisConfig { title: string; hide?: boolean; @@ -243,6 +318,10 @@ export interface XYArgs { legend: LegendConfig & { type: 'lens_xy_legendConfig' }; layers: LayerArgs[]; fittingFunction?: FittingFunction; + showXAxisTitle?: boolean; + showYAxisTitle?: boolean; + tickLabelsVisibilitySettings?: AxesSettingsConfig & { type: 'lens_xy_tickLabelsConfig' }; + gridlinesVisibilitySettings?: AxesSettingsConfig & { type: 'lens_xy_gridlinesConfig' }; } // Persisted parts of the state @@ -251,6 +330,12 @@ export interface XYState { legend: LegendConfig; fittingFunction?: FittingFunction; layers: LayerConfig[]; + xTitle?: string; + yTitle?: string; + showXAxisTitle?: boolean; + showYAxisTitle?: boolean; + tickLabelsVisibilitySettings?: AxesSettingsConfig; + gridlinesVisibilitySettings?: AxesSettingsConfig; } export type State = XYState; diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx index 375eaf736cc9..31ba1bc83d97 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.test.tsx @@ -109,7 +109,6 @@ describe('XY Config panels', () => { it('should disable the select if there is no unstacked area or line series', () => { const state = testState(); - const component = shallow( { expect(component.find(EuiSuperSelect).prop('disabled')).toEqual(true); }); + + it('should show the values of the X and Y axes titles on the corresponding input text', () => { + const state = testState(); + const component = shallow( + + ); + + expect(component.find('[data-test-subj="lnsXAxisTitle"]').prop('value')).toBe( + 'My custom X axis title' + ); + expect(component.find('[data-test-subj="lnsYAxisTitle"]').prop('value')).toBe( + 'My custom Y axis title' + ); + }); + + it('should disable the input texts if the switch is off', () => { + const state = testState(); + const component = shallow( + + ); + + expect(component.find('[data-test-subj="lnsXAxisTitle"]').prop('disabled')).toBe(true); + expect(component.find('[data-test-subj="lnsYAxisTitle"]').prop('disabled')).toBe(true); + }); + + it('has the tick labels buttons enabled', () => { + const state = testState(); + const component = shallow(); + + const options = component + .find('[data-test-subj="lnsTickLabelsSettings"]') + .prop('options') as EuiButtonGroupProps['options']; + + expect(options!.map(({ label }) => label)).toEqual(['X-axis', 'Y-axis']); + + const selections = component + .find('[data-test-subj="lnsTickLabelsSettings"]') + .prop('idToSelectedMap'); + + expect(selections!).toEqual({ x: true, y: true }); + }); + + it('has the gridlines buttons enabled', () => { + const state = testState(); + const component = shallow(); + + const selections = component + .find('[data-test-subj="lnsGridlinesSettings"]') + .prop('idToSelectedMap'); + + expect(selections!).toEqual({ x: true, y: true }); + }); }); }); diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx index e4bc6de5cc68..d64eb9451a50 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_config_panel.tsx @@ -5,7 +5,7 @@ */ import './xy_config_panel.scss'; -import React, { useState } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { Position } from '@elastic/charts'; import { debounce } from 'lodash'; @@ -24,14 +24,17 @@ import { EuiColorPickerProps, EuiToolTip, EuiIcon, + EuiFieldText, + EuiSwitch, EuiHorizontalRule, + EuiTitle, } from '@elastic/eui'; import { VisualizationLayerWidgetProps, VisualizationDimensionEditorProps, VisualizationToolbarProps, } from '../types'; -import { State, SeriesType, visualizationTypes, YAxisMode } from './types'; +import { State, SeriesType, visualizationTypes, YAxisMode, AxesSettingsConfig } from './types'; import { isHorizontalChart, isHorizontalSeries, getSeriesColor } from './state_helpers'; import { trackUiEvent } from '../lens_ui_telemetry'; import { fittingFunctionDefinitions } from './fitting_functions'; @@ -118,14 +121,117 @@ export function LayerContextMenu(props: VisualizationLayerWidgetProps) { } export function XyToolbar(props: VisualizationToolbarProps) { + const axes = [ + { + id: 'x', + label: 'X-axis', + }, + { + id: 'y', + label: 'Y-axis', + }, + ]; + + const { frame, state, setState } = props; + const [open, setOpen] = useState(false); - const hasNonBarSeries = props.state?.layers.some( + const hasNonBarSeries = state?.layers.some( (layer) => layer.seriesType === 'line' || layer.seriesType === 'area' ); + + const [xAxisTitle, setXAxisTitle] = useState(state?.xTitle); + const [yAxisTitle, setYAxisTitle] = useState(state?.yTitle); + + const xyTitles = useCallback(() => { + const defaults = { + xTitle: xAxisTitle, + yTitle: yAxisTitle, + }; + const layer = state?.layers[0]; + if (!layer || !layer.accessors.length) { + return defaults; + } + const datasource = frame.datasourceLayers[layer.layerId]; + if (!datasource) { + return defaults; + } + const x = layer.xAccessor ? datasource.getOperationForColumnId(layer.xAccessor) : null; + const y = layer.accessors[0] ? datasource.getOperationForColumnId(layer.accessors[0]) : null; + + return { + xTitle: defaults.xTitle || x?.label, + yTitle: defaults.yTitle || y?.label, + }; + /* We want this callback to run only if open changes its state. What we want to accomplish here is to give the user a better UX. + By default these input fields have the axis legends. If the user changes the input text, the axis legends should also change. + BUT if the user cleans up the input text, it should remain empty until the user closes and reopens the panel. + In that case, the default axes legend should appear. */ + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open]); + + useEffect(() => { + const { + xTitle, + yTitle, + }: { xTitle: string | undefined; yTitle: string | undefined } = xyTitles(); + setXAxisTitle(xTitle); + setYAxisTitle(yTitle); + }, [xyTitles]); + + const onXTitleChange = (value: string): void => { + setXAxisTitle(value); + setState({ ...state, xTitle: value }); + }; + + const onYTitleChange = (value: string): void => { + setYAxisTitle(value); + setState({ ...state, yTitle: value }); + }; + + type AxesSettingsConfigKeys = keyof AxesSettingsConfig; + + const tickLabelsVisibilitySettings = { + x: state?.tickLabelsVisibilitySettings?.x ?? true, + y: state?.tickLabelsVisibilitySettings?.y ?? true, + }; + + const onTickLabelsVisibilitySettingsChange = (optionId: string): void => { + const id = optionId as AxesSettingsConfigKeys; + const newTickLabelsVisibilitySettings = { + ...tickLabelsVisibilitySettings, + ...{ + [id]: !tickLabelsVisibilitySettings[id], + }, + }; + setState({ + ...state, + tickLabelsVisibilitySettings: newTickLabelsVisibilitySettings, + }); + }; + + const gridlinesVisibilitySettings = { + x: state?.gridlinesVisibilitySettings?.x ?? true, + y: state?.gridlinesVisibilitySettings?.y ?? true, + }; + + const onGridlinesVisibilitySettingsChange = (optionId: string): void => { + const id = optionId as AxesSettingsConfigKeys; + const newGridlinesVisibilitySettings = { + ...gridlinesVisibilitySettings, + ...{ + [id]: !gridlinesVisibilitySettings[id], + }, + }; + setState({ + ...state, + gridlinesVisibilitySettings: newGridlinesVisibilitySettings, + }); + }; + const legendMode = - props.state?.legend.isVisible && !props.state?.legend.showSingleSeries + state?.legend.isVisible && !state?.legend.showSingleSeries ? 'auto' - : !props.state?.legend.isVisible + : !state?.legend.isVisible ? 'hide' : 'show'; return ( @@ -183,8 +289,8 @@ export function XyToolbar(props: VisualizationToolbarProps) { inputDisplay: title, }; })} - valueOfSelected={props.state?.fittingFunction || 'None'} - onChange={(value) => props.setState({ ...props.state, fittingFunction: value })} + valueOfSelected={state?.fittingFunction || 'None'} + onChange={(value) => setState({ ...state, fittingFunction: value })} itemLayoutAlign="top" hasDividers /> @@ -209,19 +315,19 @@ export function XyToolbar(props: VisualizationToolbarProps) { onChange={(optionId) => { const newMode = legendOptions.find(({ id }) => id === optionId)!.value; if (newMode === 'auto') { - props.setState({ - ...props.state, - legend: { ...props.state.legend, isVisible: true, showSingleSeries: false }, + setState({ + ...state, + legend: { ...state.legend, isVisible: true, showSingleSeries: false }, }); } else if (newMode === 'show') { - props.setState({ - ...props.state, - legend: { ...props.state.legend, isVisible: true, showSingleSeries: true }, + setState({ + ...state, + legend: { ...state.legend, isVisible: true, showSingleSeries: true }, }); } else if (newMode === 'hide') { - props.setState({ - ...props.state, - legend: { ...props.state.legend, isVisible: false, showSingleSeries: false }, + setState({ + ...state, + legend: { ...state.legend, isVisible: false, showSingleSeries: false }, }); } }} @@ -242,15 +348,130 @@ export function XyToolbar(props: VisualizationToolbarProps) { { value: Position.Right, text: 'Right' }, { value: Position.Bottom, text: 'Bottom' }, ]} - value={props.state?.legend.position} + value={state?.legend.position} onChange={(e) => { - props.setState({ - ...props.state, - legend: { ...props.state.legend, position: e.target.value as Position }, + setState({ + ...state, + legend: { ...state.legend, position: e.target.value as Position }, }); }} /> + + + onTickLabelsVisibilitySettingsChange(id)} + buttonSize="compressed" + isFullWidth + type="multi" + /> + + + onGridlinesVisibilitySettingsChange(id)} + buttonSize="compressed" + isFullWidth + type="multi" + /> + + + + + {i18n.translate('xpack.lens.xyChart.axisTitles', { defaultMessage: 'Axis titles' })} + + + + X-axis + + + setState({ ...state, showXAxisTitle: target.checked }) + } + checked={state?.showXAxisTitle ?? true} + /> + + + } + > + onXTitleChange(target.value)} + aria-label={i18n.translate('xpack.lens.xyChart.overwriteXaxis', { + defaultMessage: 'Overwrite X-axis title', + })} + /> + + + Y-axis + + + setState({ ...state, showYAxisTitle: target.checked }) + } + checked={state?.showYAxisTitle ?? true} + /> + + + } + > + onYTitleChange(target.value)} + aria-label={i18n.translate('xpack.lens.xyChart.overwriteYaxis', { + defaultMessage: 'Overwrite Y-axis title', + })} + /> + diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx index c880cbb641e5..ba1ff6a1df03 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx @@ -22,7 +22,16 @@ import { LensMultiTable } from '../types'; import { KibanaDatatable, KibanaDatatableRow } from '../../../../../src/plugins/expressions/public'; import React from 'react'; import { shallow } from 'enzyme'; -import { XYArgs, LegendConfig, legendConfig, layerConfig, LayerArgs } from './types'; +import { + XYArgs, + LegendConfig, + legendConfig, + layerConfig, + LayerArgs, + AxesSettingsConfig, + tickLabelsConfig, + gridlinesConfig, +} from './types'; import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { chartPluginMock } from '../../../../../src/plugins/charts/public/mocks'; @@ -211,6 +220,18 @@ const createArgsWithLayers = (layers: LayerArgs[] = [sampleLayer]): XYArgs => ({ isVisible: false, position: Position.Top, }, + showXAxisTitle: true, + showYAxisTitle: true, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: false, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers, }); @@ -267,6 +288,34 @@ describe('xy_expression', () => { }); }); + test('tickLabelsConfig produces the correct arguments', () => { + const args: AxesSettingsConfig = { + x: true, + y: false, + }; + + const result = tickLabelsConfig.fn(null, args, createMockExecutionContext()); + + expect(result).toEqual({ + type: 'lens_xy_tickLabelsConfig', + ...args, + }); + }); + + test('gridlinesConfig produces the correct arguments', () => { + const args: AxesSettingsConfig = { + x: true, + y: false, + }; + + const result = gridlinesConfig.fn(null, args, createMockExecutionContext()); + + expect(result).toEqual({ + type: 'lens_xy_gridlinesConfig', + ...args, + }); + }); + describe('xyChart', () => { test('it renders with the specified data and args', () => { const { data, args } = sampleArgs(); @@ -1365,6 +1414,35 @@ describe('xy_expression', () => { expect(convertSpy).toHaveBeenCalledWith('I'); }); + test('it should not pass the formatter function to the x axis if the visibility of the tick labels is off', () => { + const { data, args } = sampleArgs(); + + args.tickLabelsVisibilitySettings = { x: false, y: true, type: 'lens_xy_tickLabelsConfig' }; + + const instance = shallow( + + ); + + const tickFormatter = instance.find(Axis).first().prop('tickFormat'); + + if (!tickFormatter) { + throw new Error('tickFormatter prop not found'); + } + + tickFormatter('I'); + + expect(convertSpy).toHaveBeenCalledTimes(0); + }); + test('it should remove invalid rows', () => { const data: LensMultiTable = { type: 'lens_multitable', @@ -1400,6 +1478,16 @@ describe('xy_expression', () => { xTitle: '', yTitle: '', legend: { type: 'lens_xy_legendConfig', isVisible: false, position: Position.Top }, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: true, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers: [ { layerId: 'first', @@ -1469,6 +1557,16 @@ describe('xy_expression', () => { xTitle: '', yTitle: '', legend: { type: 'lens_xy_legendConfig', isVisible: false, position: Position.Top }, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: false, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers: [ { layerId: 'first', @@ -1525,6 +1623,16 @@ describe('xy_expression', () => { xTitle: '', yTitle: '', legend: { type: 'lens_xy_legendConfig', isVisible: true, position: Position.Top }, + tickLabelsVisibilitySettings: { + type: 'lens_xy_tickLabelsConfig', + x: true, + y: false, + }, + gridlinesVisibilitySettings: { + type: 'lens_xy_gridlinesConfig', + x: true, + y: false, + }, layers: [ { layerId: 'first', @@ -1683,5 +1791,68 @@ describe('xy_expression', () => { expect(component.find(LineSeries).prop('fit')).toEqual({ type: Fit.None }); }); + + test('it should apply the xTitle if is specified', () => { + const { data, args } = sampleArgs(); + + args.xTitle = 'My custom x-axis title'; + + const component = shallow( + + ); + + expect(component.find(Axis).at(0).prop('title')).toEqual('My custom x-axis title'); + }); + + test('it should hide the X axis title if the corresponding switch is off', () => { + const { data, args } = sampleArgs(); + + args.showXAxisTitle = false; + + const component = shallow( + + ); + + expect(component.find(Axis).at(0).prop('title')).toEqual(undefined); + }); + + test('it should show the X axis gridlines if the setting is on', () => { + const { data, args } = sampleArgs(); + + args.gridlinesVisibilitySettings = { x: true, y: false, type: 'lens_xy_gridlinesConfig' }; + + const component = shallow( + + ); + + expect(component.find(Axis).at(0).prop('showGridLines')).toBeTruthy(); + }); }); }); diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx index a3468e109e75..2037a3dbe662 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -102,6 +102,30 @@ export const xyChart: ExpressionFunctionDefinition< defaultMessage: 'Define how missing values are treated', }), }, + tickLabelsVisibilitySettings: { + types: ['lens_xy_tickLabelsConfig'], + help: i18n.translate('xpack.lens.xyChart.tickLabelsSettings.help', { + defaultMessage: 'Show x and y axes tick labels', + }), + }, + gridlinesVisibilitySettings: { + types: ['lens_xy_gridlinesConfig'], + help: i18n.translate('xpack.lens.xyChart.gridlinesSettings.help', { + defaultMessage: 'Show x and y axes gridlines', + }), + }, + showXAxisTitle: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.showXAxisTitle.help', { + defaultMessage: 'Show x axis title', + }), + }, + showYAxisTitle: { + types: ['boolean'], + help: i18n.translate('xpack.lens.xyChart.showYAxisTitle.help', { + defaultMessage: 'Show y axis title', + }), + }, layers: { // eslint-disable-next-line @typescript-eslint/no-explicit-any types: ['lens_xy_layer'] as any, @@ -199,7 +223,7 @@ export function XYChart({ onClickValue, onSelectRange, }: XYChartRenderProps) { - const { legend, layers, fittingFunction } = args; + const { legend, layers, fittingFunction, gridlinesVisibilitySettings } = args; const chartTheme = chartsThemeService.useChartsTheme(); const chartBaseTheme = chartsThemeService.useChartsBaseTheme(); @@ -237,7 +261,10 @@ export function XYChart({ shouldRotate ); - const xTitle = (xAxisColumn && xAxisColumn.name) || args.xTitle; + const xTitle = args.xTitle || (xAxisColumn && xAxisColumn.name); + const showXAxisTitle = args.showXAxisTitle ?? true; + const showYAxisTitle = args.showYAxisTitle ?? true; + const tickLabelsVisibilitySettings = args.tickLabelsVisibilitySettings || { x: true, y: true }; function calculateMinInterval() { // check all the tables to see if all of the rows have the same timestamp @@ -279,6 +306,22 @@ export function XYChart({ } : undefined; + const getYAxesTitles = ( + axisSeries: Array<{ layer: string; accessor: string }>, + index: number + ) => { + if (index > 0 && args.yTitle) return; + return ( + args.yTitle || + axisSeries + .map( + (series) => + data.tables[series.layer].columns.find((column) => column.id === series.accessor)?.name + ) + .filter((name) => Boolean(name))[0] + ); + }; + return ( xAxisFormatter.convert(d)} + tickFormat={tickLabelsVisibilitySettings?.x ? (d) => xAxisFormatter.convert(d) : () => ''} /> {yAxesConfiguration.map((axis, index) => ( @@ -389,18 +433,10 @@ export function XYChart({ id={axis.groupId} groupId={axis.groupId} position={axis.position} - title={ - axis.series - .map( - (series) => - data.tables[series.layer].columns.find((column) => column.id === series.accessor) - ?.name - ) - .filter((name) => Boolean(name))[0] || args.yTitle - } - showGridLines={false} + title={showYAxisTitle ? getYAxesTitles(axis.series, index) : undefined} + showGridLines={gridlinesVisibilitySettings?.y} hide={filteredLayers[0].hide} - tickFormat={(d) => axis.formatter.convert(d)} + tickFormat={tickLabelsVisibilitySettings?.y ? (d) => axis.formatter.convert(d) : () => ''} /> ))} diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts index 7b3398658a50..632f6fc8861a 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts +++ b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.test.ts @@ -445,6 +445,10 @@ describe('xy_suggestions', () => { const currentState: XYState = { legend: { isVisible: true, position: 'bottom' }, fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, preferredSeriesType: 'bar', layers: [ { @@ -483,6 +487,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price', 'quantity'], @@ -592,6 +600,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price', 'quantity'], @@ -631,6 +643,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price'], @@ -671,6 +687,10 @@ describe('xy_suggestions', () => { legend: { isVisible: true, position: 'bottom' }, preferredSeriesType: 'bar', fittingFunction: 'None', + showXAxisTitle: true, + showYAxisTitle: true, + gridlinesVisibilitySettings: { x: true, y: true }, + tickLabelsVisibilitySettings: { x: true, y: false }, layers: [ { accessors: ['price', 'quantity'], diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts index 1be8d566a8b6..387d56c03e31 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts +++ b/x-pack/plugins/lens/public/xy_visualization/xy_suggestions.ts @@ -407,6 +407,18 @@ function buildSuggestion({ const state: State = { legend: currentState ? currentState.legend : { isVisible: true, position: Position.Right }, fittingFunction: currentState?.fittingFunction || 'None', + xTitle: currentState?.xTitle, + yTitle: currentState?.yTitle, + showXAxisTitle: currentState?.showXAxisTitle ?? true, + showYAxisTitle: currentState?.showYAxisTitle ?? true, + tickLabelsVisibilitySettings: currentState?.tickLabelsVisibilitySettings || { + x: true, + y: true, + }, + gridlinesVisibilitySettings: currentState?.gridlinesVisibilitySettings || { + x: true, + y: true, + }, preferredSeriesType: seriesType, layers: Object.keys(existingLayer).length ? keptLayers : [...keptLayers, newLayer], }; From 78689b7ecd3d1e50ebb1a9269c80f1eeb2e8ef1d Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 11 Aug 2020 20:17:08 +0300 Subject: [PATCH 17/25] [Functional Tests] Adds a wait time between setting the index pattern and the time field on TSVB (#74736) * Adds a wait time between setting the index pattern and the time field on tsvb * Char by char to set indexpattern to give more time to load the time field * Add more time * uncomment commented lines --- test/functional/apps/visualize/_tsvb_chart.ts | 9 ++++++++- test/functional/page_objects/visual_builder_page.ts | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/test/functional/apps/visualize/_tsvb_chart.ts b/test/functional/apps/visualize/_tsvb_chart.ts index ab76598ae2ea..18d6e93090e8 100644 --- a/test/functional/apps/visualize/_tsvb_chart.ts +++ b/test/functional/apps/visualize/_tsvb_chart.ts @@ -26,7 +26,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const inspector = getService('inspector'); const retry = getService('retry'); const security = getService('security'); - const PageObjects = getPageObjects(['visualize', 'visualBuilder', 'timePicker', 'visChart']); + const PageObjects = getPageObjects([ + 'visualize', + 'visualBuilder', + 'timePicker', + 'visChart', + 'common', + ]); describe('visual builder', function describeIndexTests() { this.tags('includeFirefox'); @@ -132,6 +138,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.tryForTime(20000, async () => { await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); await PageObjects.visualBuilder.setIndexPatternValue('kibana_sample_data_flights'); + await PageObjects.common.sleep(3000); await PageObjects.visualBuilder.selectIndexPatternTimeField('timestamp'); }); const newValue = await PageObjects.visualBuilder.getMetricValue(); diff --git a/test/functional/page_objects/visual_builder_page.ts b/test/functional/page_objects/visual_builder_page.ts index 2771982fecde..f376c39ff67b 100644 --- a/test/functional/page_objects/visual_builder_page.ts +++ b/test/functional/page_objects/visual_builder_page.ts @@ -420,7 +420,7 @@ export function VisualBuilderPageProvider({ getService, getPageObjects }: FtrPro public async setIndexPatternValue(value: string) { const el = await testSubjects.find('metricsIndexPatternInput'); await el.clearValue(); - await el.type(value); + await el.type(value, { charByChar: true }); await PageObjects.header.waitUntilLoadingHasFinished(); } From 7b5df7ce3be9bdcd9d0e8bb943c181458e5956ca Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 11 Aug 2020 20:22:46 +0300 Subject: [PATCH 18/25] Timelion deprecation doc (#74508) * timelion deprecation doc wip * Create Timelion Deprecation section to Visualize * Code review changes * minor changes * Make some changes in order to give priotization on how to replace an existing timelion worksheet to a dashboard * Syntax related improvements * Final touch * Remove extra lines and some minor changes --- docs/user/visualize.asciidoc | 1 + .../images/timelion-add-to-dashboard.png | Bin 0 -> 269400 bytes docs/visualize/images/timelion-app.png | Bin 0 -> 331761 bytes .../images/timelion-copy-expression.png | Bin 0 -> 228148 bytes .../images/timelion-create-new-dashboard.png | Bin 0 -> 423440 bytes docs/visualize/images/timelion-dashboard.png | Bin 0 -> 347125 bytes .../images/timelion-vis-paste-expression.png | Bin 0 -> 520063 bytes docs/visualize/timelion.asciidoc | 41 ++++++++++++++++++ 8 files changed, 42 insertions(+) create mode 100644 docs/visualize/images/timelion-add-to-dashboard.png create mode 100644 docs/visualize/images/timelion-app.png create mode 100644 docs/visualize/images/timelion-copy-expression.png create mode 100644 docs/visualize/images/timelion-create-new-dashboard.png create mode 100644 docs/visualize/images/timelion-dashboard.png create mode 100644 docs/visualize/images/timelion-vis-paste-expression.png diff --git a/docs/user/visualize.asciidoc b/docs/user/visualize.asciidoc index 6919b5a8772e..dc116962f9e9 100644 --- a/docs/user/visualize.asciidoc +++ b/docs/user/visualize.asciidoc @@ -132,6 +132,7 @@ include::{kib-repo-dir}/visualize/lens.asciidoc[] include::{kib-repo-dir}/visualize/most-frequent.asciidoc[] include::{kib-repo-dir}/visualize/tsvb.asciidoc[] + include::{kib-repo-dir}/visualize/timelion.asciidoc[] include::{kib-repo-dir}/visualize/tilemap.asciidoc[] diff --git a/docs/visualize/images/timelion-add-to-dashboard.png b/docs/visualize/images/timelion-add-to-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..a0ccc0af735a808c814bcc0624e3503f789c4695 GIT binary patch literal 269400 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 pfY7D(<$MU0ATpX2t-U}@ykxCH0^M3%{0`dR= literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-app.png b/docs/visualize/images/timelion-app.png new file mode 100644 index 0000000000000000000000000000000000000000..236f9f2d41808b1097ccb7df8cef2c1f549bbb0d GIT binary patch literal 331761 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

Jnc(AxZw7GK|}X7 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

@l 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

eqhY&x`V**eiB=)(ynIFjasnOY)7Y2Nu*=r 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%0Do5Hp` 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

6+T;J1Xy%$ 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 F`hQDPuZREu literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-create-new-dashboard.png b/docs/visualize/images/timelion-create-new-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..4049b6d77cca674590834142e6841917b8b11a45 GIT binary patch literal 423440 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�*^ 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


BchU@4Tc(gdVaKqd*!8eLureGCzK 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�`I>Wxhm7r~qfRZ?o|jy{!Z4G>5$c%h;wWV*u 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 rA`g;iDy^L%315YTXh}%r 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 Cac*h= literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-vis-paste-expression.png b/docs/visualize/images/timelion-vis-paste-expression.png new file mode 100644 index 0000000000000000000000000000000000000000..86e175e40815bfd1f04129525db0804b0a1459ba GIT binary patch literal 520063 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ℑI^>Or5(W z6h84owl1dPpglE*0RpJ14HTjxlwCR>b)V0wKHMrFaP2tso*I6!?xz!}$Mxj+i2rFo zLmcge^pK`RtYdD3r2aUR`?7kJpI@Z`^g;)y;I&uHTzgnx96s z$W(==IPGQQ8%%IQ$Bnh4=?D+2S&dO|ynqOG>(!E@p_Y8-V$Wx7d*H~Ob|%jKkt^#4 znuhV{FUDQBT8H(c%=(mVJD*(EQ2iT?fRRcS3ApfXB1GrZmJ|S$zPP`E8vOFH0wM4w ze9iU`a4Al}Xu#BG$vb{HBd3fbT+Mzip$SwQP7N)X`-AhV3I`Oywl=?O3PMNo3w*2n zW{|cV?wyaWIty8BE$MJ`oU{)sX2t6GN?JCLHP3Rq35J(%`@eTePxIcsHC(^VztQok z5FEi~kku{cz=a-+zoaa`RNVK)YJ`B##bL3iq3YY`)hGDT#5C_U%G4cuH?7tgif1LM zV;oFPs|M?L?dR500@q?7BRBHf*u+=6bRC=13>p#xc!P?U_Q3`;K4-Wl&seA+3_9wj zlV#iny-Iw0e;Hz!Yi)OX80|`{QUzpaU@wPTIF9e|MTj4}r@Yj%`ojBv1*2<{K+GYw zhjrrU7YhnJL=;}HFFK>QXCEqn9pW{m_dUCe+wkpq=@daA>ubCVgQvPr?LXZ- z8GW>C=t0BuWex@7HgLnvBC|-p0ZXJD|Jf$-#|rRh0^X+M+WQ85sJ9n5j|djjFcsR} z-X52{e-833Gv7aZLT%3-GH#=l^wCrmY;Y6rAROKT8*#9s%&Rn#&MfCk^YawR6WW}uw>r3|z`?Lh0pqq)3b_EpXNDy~Yp2EF^@VHp+hC)zY3ZiaZlyo>*2>NT zn_A!PL^5jzOzuD6elke`0u0}SrQ%y_YgbnHYeySyDJ<;X^t2y_-^$XD)A7|gJ+~D| z;fJSyRg8!>|4L*23YauCRm1^OR84$s`H@`?Z=*ckU+V@+-N#8m3m9V@JAsMoI#b|) zxd(=pBaTYNhEWQsgN~_7^OYU1AEX?W^KXcZSWcNaew%!x)j$f-HO=3gc{7@uExpr_ zwhEK)=u02s>ANC^nO)eP;)uP6fJl5>-h7zIQd?JZ-E54Fs^%BYn9gT{uwnB`HZI0I z%cUrN=d|1Fz#*o^2F1`8gpMvty7XcoIELTrUZa;|ul?fy>n6nnSkRe*257L@hoQiBn<6y97&6a#6tqf z+tA2q6E+gu$u4!_JxdamPlAB=CVaYgSuV+&TyjnXH~F&nB{{}R_bU4ZL@I5lmOn== z>a#cL=jZRo?2jzA8rihZ!d&ABcdW?u3gx{G3{&ySozk`yGi0SLj=Fq0#5?-SxEA+1 z_#2XYZI(9n;vescb{oWX!bkChVz=9_mZu8f3fY%XJ|jc6YCtw*bB_Q`9kL3c zGO-R?$GN)ssF0!dJbW(!wt+OU(I=)Xc#*Ar>LhIprlh;e!=vt|T0Jr;r@*1~#K~Es%fn88-{1gs{$!=H}_ni8aOX$I+{;X;@2! z^zdr#VpJ~9UD(vETZtE)XFvygQfV~Gx4TG%{aoZ@)3=k{;9}U0M=#;iudo^xmXvbT zGvh`wN&2$J?>&Bt+24XezHrqArRm^lGcMBWVCTo`3JC1+ut`r z?U}P;?cwge5l1En+hE`FVs{|-tav_&#j^EE+BQdl?xyJSNa^BGnq~Iox%8H(myPTe zW1(=UG9#-&TUbj(&Mli9)#PAX$K*=4yj}>f%q;0*5qT$7700ryuyFEs1y}eeed?jmXx0^B}isvlb_es}g(1e)M0g zdOgYVq`u*!4pjg#x0Q3Cg{Ir*CVHIH#v>J~HLZfMByF9p2F=5^dKgM`k`l1T83Q5 zv65e#Zlh?6V(%QTVAqePKXQw7Ld!S{JI3-d!WY(jgw0@)9LajR7`Co((AbSjYI2zpJ zXA(v>V5^f5)E%B+j@PMjMeY1qqlSL{WmDRGwEKNJ!snMUp>zxXEXo7=UZKVP82;@E5(HA(7LQeg`p5+!j= zs*rRPBPFM>5N{j0wqagsJsnEWO)VP#65aG|E+283Nd#tBnhtlR<{O{#?VpL`5%;W$ zTR*HOzkWRs`-x{eYIm(^hiQXtbD=*dh+^!1y=L(;H35t1>!SnPS59kNYL9*8g8;o? z-5pe3^A@Ee#6sr#FQ_?Pc06y;DGJ?mVIN+*&4)V2UnKCjicjVlJ*ifMq*hG_dMl`D zzjS99i*zA*E91ZgqViWuX9ppH7Gi3lfTc zW=bVy8F+u28zB*(hn`_{f~nEO@=0!yCf@*>ft4fmGF!1Q57rp@Sk0NBg>Lt>u^4L4 z9u^@G6L|Z1UG6u{uvfOo@+!})#Z2Uy?G0>+s=WwC(-|E38$Q$UKZ_BofzgWxwDfE3~ z+om1ifwVs>UC4gKHa$OCzUu?4wTh#pQ9=h@xI*`&dxJWv-zW5!b9+`mj|Ck|AG1e6 zGVX7NHf_!7bO&BU&Jigw*aBq4K#Ec+7#~w0wFBcN2ODfot4k`=-WKEj;hs^&lydvN zUS5R>CL$seERaX1t^2Yuc95yN`df$~tfYj4 z*ONz_8)ti_E$XdCwmPTY^J7i91R*QODzl4~BV3-Dm+O5Gm2WbrlFx^ZGg13T@Hkp8 zEOjlkWNSc;QyKX`5kE2Cho2oe+0n3Q@i@Q)qpB={b`Jj*wGCwHMWMyTYR<^p5#pOyYwP}>^ zSM%iqkCO8$dBz36`hl4$`ANzgaVlqQO$88U)RvAlOU7MsuXXKVByC2vX6Jp1fU*ETvdQ}1`F)L}K4gjQ+4 z`ORNrJQ=8N(iuURZ_n)LZ#%-1{X)>vo4^i@658Sd`M};Vb|uB8SO$qltR|^GgGYXR zYTkc6M)$oy#a68ZZ0T01{ZzPmiOb_S;rI4j)<+eb*WUz$U{T--wSQ)SeM`f$yeTBL zRI>5-jC`i88S*RuR2D?)_ejvS+2B#nZ!Vsrn*i+?o$u(jh&D#PVigT~RQlxb2_HVH zVM8|2hE`0TI9(ShejSgPPE`6SmFHrcbHj)nqPsYrq3yrziu2f(KHyEo_gO9>pA=|( z)&i3}LuPI1lOdLC+_yE+dv{>Z;17vWF}fxnjn>x%w&Qr1jJ`e{7})wnk(z=V zlfs5P&tTiDxKt3BS%laGX#X)iG6ld;^533PBYCaH3~lU&P!Zp?L2Ib&zFj@L`B->G zX&%^5GdNmgegU=b{n_(8cPzKQJ}muss2=i==h+&pnVi;(Xl2~zT!FJQ=#lA68|n!9 zSnKADkx;$+Yn@J(d#3<=7B{AO6Zshx_R0*Ibwypv9BTw67n_uraq69SR=4vosuJIm zBdLNw6Xh$)Qco~3FNZ!tw>G+?yATqX1&42td%85dz01*!8C1RqbNj zP5mw2=SN8HM9gTS9Bp-|gKZx(u1{K!QSM&x`3uJU{kKv~;7RmpRP7?54X%E@S7YqhoiQY( zQNIF)m4YY2=ow9;<%VJMU4}*Jli|=Nv(;~o7)GyP^~{udeABD@$R?O9uNZoTnIHKn z0`M)#pJR~YgJ#Q{q)X3W+|?`J_V~2PUN%Yzq&@wk5dQj&9M17S=xjT*!W1u`g4(AY{MooP2e;|nPYlT!-?VUVZZ z4)_1>r@I5@sk(>+Vh>+D1oLLvldq-aE7_4r3AGQvamW1sdN6(oz@OD|uSSod=Mc2U zv#R$7_bzilSH)Z`Qv{lB+_)<^lv;*%uCSx#jHtsNQ*9=605j>xZZ>B1*{j#kO(RFq zulz>^4Bc8a|F+*xjCg^X*I>$$B}Nhir^4@`)>xO$*|c16FQj&v>|0eQFzuZ$%v+spbL!T9 zyeHn5sS<6!Z~8UDdVYg|Mj`LD?Q&1M`ToFw@?e2c#^Nwk0GMa@oVS)k%9m;HO}9jZ zuxyXh^=2pp0WCbdBz^}~piddzz4ZJg@+gz)_Y9{W?!>yYpAYKw&C6YAo_tqO2>}s zwo0XSF047MJ56C2pSuaDTiDV5auC?JOKk*Q8nSa-Sc2%a^eu_b)1%MxlKK);PLsOS z$kiEKxJ<;gQ5?*5{6iHmtuu3uApFLqqWJP_doL2TvnuXIbKaCQlNC6~7Az56kHL88w(& zE8bNq&yCS_1aGwdR#(?}fx(w&(GRkbu(D#QQtA>9j0)8cE0G{}6vTQaM(H;)AZ7V6 z_`ubWRps(2)!)kjTGJH!iT>8i;7)h1^U>%*g|N>G_R7xWo~8+-Z8d57y4ajtTu)i_ znv>9BX7U>})9*Qq(k0?n3&$j5UPsX>Nu@q6aLo-N;&TyNuI^y-B+5Zwq*HK|gC85d zc{lCT!Eb%5D2~N0MIw^xu?4r@n!%dPuC>&7lXkc=@O)Hv*o6(=Jv##n}S&1*)EK!#o3IH z<%j~?-)}cV-V-`rsJ2X_K`Z)wAVv^Ir@amciT0K$M27nf@ZuxBjWdNz(am9d3z z^>)1G(d0$A7%+%K3S_6YNO#_9W}A{i7iAOM2rc|WAHO>ezp%L=7B#EZl<-Ylx1oJp zZ+*thi4bqYye~7CXY^yNB!_y;bJvN9W7y*0y7l^uWTlzcbx0o@q`kn_j_qd6H6(?9 z!^C@4z&2^c0Zm8|#kvGSRUVSM7^urM(F?e((#g4%n^XEi5WD%v-E$Wzjqt_MgU6k0 z00L%RN}0`a3A^=EpgjNxb9>A>=>j)3%-g8=+NX^}cKo8i@lA3rZkL;FQZ>hFPRF)>C&ddJhe~rqTfNW`uLTZ)Xn91r zGD(O_dgTXR6YJoQt7V&ndZ3Ag)4t<)EB3zwBYb8 zt*+VOyl?r|Dpy|Tbo(x9T#IuPdt1$0_esu1!N%U!Y_QS6y*O>O}{4p6U=(| z=`T$JK!ZgQc(C<*>-MN@x#9|VwW_*-An%bhdJxtTJg}l?S*oN^wXj(((MiE8ARt6? z$g6n1M-9)iFxt?BIGERFCi;QVUi4&lxe}Jqa7x(fVmn#h?EqC~$^^V+8r zSF<1Wbf-#&Mi0^Sg|}!3>b5w{Z_Lzp@GuPK8-(yW9|f0=w-!HZ+L0cMpbaDKkAp1k zXpobW>rN(6<{kFOI7MFO%%Hpbpw2KAe+B*D7PTcA*sF8)>Ng}exxWJ{&H2)Y{@*qo z_{4quGGMylEa~w#0Hrct=5{t9+?@LgLM?0RQCsyi%~O0X zN?1M%*FZ%65UWLZ!+C0h8c!~k$EZSfsh!L^q+Yt^`<+8Gsl>6Jb$x>SE7uNPjrpHe zM_D=*>7nV=yV3g;+|L_|>!rh2^Zu`ph&m#8dL7pfsRBK0aY0zgyx^)Ys+n}@7aNM; zpOrozghjlkrsww zFafePxWszX!|sxi=~3U!Sg~EACY)oHS&!yhx>By=!g6$FS7)1K>Bjv1$dx$`-cOlQ zH{A*i_$w^{Aye7-Lb`cB7D!*wE_y~v?&G|%5BzjHggA3*t^f*ujQGhH6 zC|Mygo-*MYTtOHfom=Q6ydqWF;WX-HPklUk@NI3fM0&HVPEfa;_=rv-0LUE|Bcmp$ zu)sRp_yJV&-N;7{4kaY%ZbzjzMd#(@K1z{mmM>FBve><~x}7_p^RjNV+&&msJY_s1 zGi}33($#mI_H%W{f`$rBN=CNxF|?W&ImhRhs{Eth2kj#fEuFNgTYX!R~QRgP(B z8V;*gLzJ*f)l2i%dV4ySs+@a%V(B&oM(W&#iG>K2Ej2tDlY(Q)0y{4M<&ab=q$%dWeO-04oL|mq?Njw$xK(MD@ zTC^y;ctoq(?eTn%NhW`hV^#9TTnx6Dy%M&{n^XnQp)oz;@FTn73sF?(gUmSO4lQ-I zuJU>kkrF2d;9y^;9W1kr`1phJ5=E+N*gt(0eQYvM)3+Kgkk=<#5N4DkM1>HQ91gF5 zFJm!)P8$7+`eh@p<^mlzWI1>rUM{TP7QHBAb$s+{&HA0WQ)MxFP!@HT)P2qDm^B`d zb$Pma;Fu3vF88_JVN^PpI|U)Q|5LKmaXp34my5u$UI|y@w%nWd)zLf}78z1k6{#uiSxre}sAMc}r;1Ddkq{P87 zZ<*C8kd5-rc%4r6_)7kX?Ql^4*`q6Iwc9JI=^9bw{em9N9Z9Y=JNeH$M<*jx^JfLCrQ1_)|{e20?}(; z8yZg#%tx5BV@fejnNs{k>I`btcaM*pA6+6>6XH2`bZ((4Ep$q*(DXBh&gvooMB9{5z5xn~%#97xp$6+lD?@p1c3s+6NjUur#5@NCe9gwt9g)*@=8+h$Fb z4rb9?&Yw#qQOs7Qu)reCiU2JAHDnSLMX|bEdH)YU6Sx2@f_4EHO+VxZhJZxfTW0rX z7c2^@GYC_#f*+dPwSs+21w+@D*4ySWNsssO{fZD~ zKO)-CU(Iam{=lf~`zLXie7yzxxlx19ng?RDTWeyo5xDGDJ4Cp+6efMo2UDeM`wfedV3={wQ@~i zPsa&8sJ6D2vNWWa!Df;*%^g%LSf)AOZCPg$c|KMl$}Rg6Nk(L3Apl|K2l?p|oNC+W zst5%z%msd|C$j&h;~BIggaJot&v~xzrx%&EP@SY>f)s_0-4*=SpoAxv2|MPWqU&75 zDz#y;`a!lf*KM#dVLr&RE&k0rU|>T5>r};ewV3o~QXx_;cp`;WKc=Rhp!-$7=jgqs zS!L=0Yl&)b7%PUm7r+NJpo*#2r4N4KMmdSsvKq8EO~hOH80Tbn)I-U_XcY>cQSa}D z*jul>BXy+$E*kq#+L=5qjh!?nX))lA`mXhiRE#-)1jg@UxUq$1AN6g1)k$qLKhgy= zixJO2>V+{3uZ}o&@#U)WPi;50jtaH7?C0YnKp%Q}MMJmn-PmeN+1tF`ayjw~yG~or zqIh?#+MFDx+JfpGmNChpY?I=Vyt8VqE)R1m6!(oQLZfuiiO_>ydEW@3Um6lmaoG)7 zlKxw<0`01Q6X=|oQJv*eQcqj~to+1&aYwQ}mN&z~pwt>mWc3H61tgaAhPSk);ne{m zP1nB_j(hHXf^|S=;il~|{7lv6;H3YXeR0!ZKR0U?UR5-QU^P?X;h}Mw9HpPN9WDU@ zO%$71kk0V|#r&D%cONk&Y6H6_RUXD>IWvk0&sp5%4rn;So6qJjXLxwC;uRWaa*pevs$?X+~v2O~QX*=@_+j@faea34i$AF!50x zZI4LofgJifckbl5?n~|3kD*Q7n1KjaQX=eT->iA(t=rFAv!1LQBpdfO z6!N=!hP4gxF{l^R-GTr$pKLm~?^i|pb5xXjS2ac^i?OhSsdA;_=;9@A`y<8{rA)S= zbVA6*AW-E%<+^vRb3Fd*d`F=%%TiMgmPj{1?=pN~?`=`|xKqjoaXV-FqyE*! zYk{#jltgt&^8kvo4*U9#5-@4RTq?hBIT9Q$i!8wz;6%~7#CuuC&v?^hCUG1sT9p$s zXywmN59U|1HTx5dCpOwuh;hB$x@T|cS-04X8> z;}dQpVlwR-PF%#ocAwNzi@;91=M1KVFE$|di7y+g505}ZXh`(-!*r&|SFd91M6C`z z&K-BxHa6LrW}(~dZ!Bv^8=4xG+YX8maL%`rk|;N4@$>Il7Cg&|-OyrDi@RqwI%a*` z?y0@jHw>Q-0Kkv|H5%R9-D0Db%)mc9=uW?}6rh)Vv_nv;9V3*jMQ6pHJxm{m3v5+~ z-?4;W=J<*%KwZAFT>2}gp0fl6KwCD?Otk87nY>C#^Pcg`i^dQ7Q(t z;zIUl*}hC8++Em|)ze#pTpJl^bzbLM<*B4^Y(_m(D>BycW!_$hl*`b+2J-gy2cY2U zmaEp>i0s?y!?&8i2}18mg$pERB}UnqC^a2!k7g*Tb$F5GQ7|{7WYI)uL9{dtgVG#( zMHgEohAs1DW4=DrB$_HS{G;1_;(_Xj(0j7#u@=LEcwTncDo_#-eC?8&QlKV=a#~fu znnKhpB6fWCzCgMnw3_m!Gfc;{jg-pmugztnyNidG49n?mv(j>@hBIp12}y0eFLkEK z{F9V!wnj!7&#}6Ag!H4LjboGXv%o49ZHng1Prj$Y2RSZPqLTcO@-8+@>tkQ`qwx+l zBV7$sn;fanh;;Q7OjmpwOosy4AJ5ren;Iob`MNX?LV6#;DbCs0dF%tCgpw zj!sfvTu!itM- zTr|4{iP6}i3L?Mka(|2WPNaswZfbWYgV_+s+%pBLUmhu3&jnV;Mnix1Nv-092w^aE=s6p79f5M zVdvMoh~&BT8qBEFb}sk^qq_3to2@w=2aQ2Gn6DbszickB3mtwZ!p5GkO`g~4CE<6I zJJx3BqEf|T#P1vnqZBXcuIjr6j02#KGpzSE2zUe4lSH(aE*^eW-QoCN7O6C@Rc5Qg z&9Ij#WI~lJ9%eg827LGSSZ->Aj@a&gHJSY|vEB7q8^yxb-T)O~l$F#L3s zS>?iQQMIuUXQ>>Rer(dg$ot%scu!&J!Umior*f#4gIOgkZK0A`NAK$_#-st>v$4%# z`ziP(VMC7}P4ZP;!)Y=b;KYKB>h(&O-MoX(x{*ZOTLDD-v!nz^eS~rqJ2B^y%WRkK z0G-mcpN5;D;I5*9Sfb33zoKywAnI0LCq%(|h2si&l%rWI@mW^Difpxv%)-Az11C%B zu>pco(VBU_K1h%*p*q1N7dY>BSVQmeqT4*k<72%^LeqjAae8i z28!?WTnVh2#?8yFqTqj~B`OoTvVFFs%?gHnFUzbwIuiD=J^#m zKqhc;W0Hx=jRx-TrbXIoov^+mP5o2n(<5iW8OT%ra3*SLNqs5|1t8VeJCQF!AX_Rz z(64vaEQ0^rs$R8@BYz?NGZ(~fWDMYj?gU{iBx{i^Aucd^X4=oj3zLL^G0qeAR%=8ey z$rh=X4u)U1v$k%J=ALM93CpbxI z_Tiq9v(j^in;2=Tl3#B>%vF*kKuUzWJ0X}}Drj>KFGuex9v9G|b~`f4a!dc5{Jc3d zM|X!ikv<@}#I3${kY&-Ycyq7Z2QTEwm03~2rHN0W7lLNpSfwvqC3;cOU@c#+D7ov@ zezhg>h|}R`6pQm#|K4Hc_6Ws7e-_K5?@BqEVIK+?Zl`j96^s8*SvVQKIv$9S1AFS9 zbNQ!uup$IV4STnrm^)czy{|qz1NSZIJvGG(*XEhRNT3o}8*C<>s{TZr#sxjiph@1GFa!x%h^p%7A~I`T-6Wpwq|(K4Xw6Ldi|;jVYfc?Xn|bnJQ(Q<2 zgDF}Sn_uBYyq!bsRWusS1M^DSWI^5DG@aD!yuF5pPSBQ!bNlwu&})gGPf;de*E?CyqywK#eT6%C(?MI2i`5>I3w| z&KrMA`kAvf7Jo&Qg;+nan!PP8jgaPb@)TU_|&|8I~a3pL(Mg`g3!<}-_lD1M^9;0$(7lPU*ga3 zh&Ag{uG(>_U{2X=o2-Sl4A%-bOA|ubyszNV-eW3o)ocze)#9>SPKn6Ki>Ws6gv+y1 z>sXqjPe2*@LU#mZN=#qYqZWEfD#a|LtlUY za8`p3vG5i8V2~xpxO7QmZ77P}VxF2p_{kH|t;NC36)PE;l)Fnj3YNQTdaiuNj8D98 zZ1tEp{!VR!cz_!v0QsDvsBZ{5#o~FE+bd*CN0a3mNDaF(QYwi9y+;NLJuCSM|=A>yZnle{71MI#7{nCy+}Y!3_X_vD@irVk%9;izDHE_5!ici z{^L;v&<#gA z-kQMi9?U3y*YtbJV0iAR*>m?|L{_seMq3kg;D|Lxr2S}&#(ulO13>0X$KU*}j6NZ1 zjRrvXQOYKclW&WjH@6tPTdbH9T4JIU(v$Xb(eW z(MU-+sbLZjL#W(mzFU9Yat5smVMg}bhi)Q6kb~e+QDzPAnNZN@(tAm;l!NxZy9oMI zT?b{U?OkPly4fGJA53ApLGzDLwJQ}FO` zv6u^tp}eK>4=on^(Z26%J+GSNCxqn)y%a$(jEISO~;v(U@r!cQ8SHwlBTJ90k-KI)R8%->bzp6Ab> z7cmqG)NQ#<3+kYgBVUtQf50I4CCVT(tt-qD`ZpL}+Ciilp#yq-$b}qZoL~~v#e2jD zUA=Ht*W&oCt{ZX;i17xwU%orr67sMOQTMM|kS2jh=dC>SK%l&FN8EK%Vm*kFifVCC zD;}+wfQaX)(`D2JLJZ|!P@r{^%lg)WV@=1R`t|EeO0{qqjH_2y!WeXkQQl29q3;2* zccmmaG{xpd{EuH>5RX+?>Dsse@&!Kt&q9il(GwL9`=AwlX1qxyZ}51Jy_ zoRTiKCrl+G1%TR`s|OW-0hM;j08zEZwfm5@z53XQY@JuP(#F!g_x$AqMQ{F66Yltz zqB$XwaZiFCadtld`?65x1AN;_$q%9;)9Kf-Z-$TD|L42No{IriNf}|ILZ+$s5IE4l z7CQY$>;ZEQ1EeeW3-&l+;4bkR6>QEVv4@D_Vzm6!C5PjU5ByUo`euU7hUI9rmSh=v`gj9%U&gS5F@|9?rXDL%LA0O$o(tNVS!El{7YEnPCljsY!T&ysF z*Hjh8Wg=hGN&}`CyQP0Oph%UR>7|kB$DHzvY!c>nfD;#nx3XUTFK|y*mo&qROw{UVqQ~u9gjT6DCNw z1QD_~w!!hKRKyJ1hOUog>IH*F?gBOJ=YM2tgbY`khN_t;ajVP7tOf@sZ>|TYeb>Mo zmidF4flh!3X~l`ue}PF6;I#2EEky*Uz1IZ9pDPYT|FiHV2q%S*nc(tST#UL{Zn|Q{ ztiVqi)tu1}1$Ey&_%lFr9AFOIe0l*TiE`#F=?!r4RaA2@f`D2GgF(E!38hxHix#*Q z(WM8q*T;5LFj}LSvT{E11B?Lfs4mmUjT9s}xlx1Ff)_=jqhgP{4**Av*9j+%pFll8 z)b?ADu|Jv>fahvZ&~*^L9@(?f3vL3P-5)(Vi^hjATvLlez99uz6rpcyr{1%nk|hc3 zB7oUa&-^OeHv*H3zRA1yhrM@#1xCW?u9uqo37HSQ*Hr- z8F;^mI>!hU#Hg3!S;QL!R1wC=lYpu}KvQ)$P#v4|=kky1iq-MwBWM=H#q}93k*$FG zTiq(WQ)WE#E3&uhTyqt91;MB_++aG+pf@EQf@?jF&nIjz2YEhOr(9m6d`Iv)jE=8bn66o>bZkPrcD&|c&*Y9Ym?9fUo~e|+KjE|`LQ z@s*LWJW=y3O&Y8IY_4e9zuDx{P9V6MbVwrnrNCu`v|;$AnU-fUFfrGHBb^%_ z017nl-M?}ow-*7I5ZB23DMp)sAZkijr<>^F?c#z1n-vb*-=I@WV1fG%wIft0PT9Z# zv5&-J{LTy#f)Q)gjLxW4%D9h7682cwU);r|Li`-in2o%YK4OFWVj|hmgX;5B3x2?I z-NVf1Lo5djEgRGZL@-cKGN_6_Uml^-V(3P(U~6&(tOa2;M4XfbQoI;hvMsA;K(@@? z2*H!~3-6J89R5%ZNGXzWsXpuU^9`0Ci+rGO4x^zA;FY72)Y*At0FdspPbMNVx1xPk z>1Ctf6K~OQ`z1;?tS{$fXY$I$6Y*Qf!ebZ(Klk99)B zUq8C2K1vB5=?#-wuXgnoT-(rsSCra_Y&K)T)}9f zw=-4@McX}CFD?a})fb9!U!CaB5;ZdGS}rg3YQ-Ps>JW|x)a2Yr@qac*0T1+rKXI5^ zhLYHZhpW93o@##4YjzW(Vt?RM-Y*8rZ38FGM=s7dD6(24+;5~sp_kIcT9`?m^^#)o zyFi8nTHgcP7+N<+7Es0A0y+DuBwUjQ#T2#Y;D6bOY4qujHL!9A$QfTjBt5#v4IoNV zcW$*Ir|Mw~-WZMf=_*R(&;25Lc;?;{M$NJh*%qx)-0vQk%TQ>HPx`$AdtB-@w10Up zZ^6)Cy+qkr$d7M%TPRyq4m`q|#!IWKm_b7ft6)3@aS>r#x-86PiSluvki)y+#G`N9;CS=P);sKhVF0R>4 zd4$J#fKU_s%UmXZ)b?lU33^m;@6d!a1A(XmD=b;zD1lU~E>D34G*q-!=M~bmS888R zW)^Ef$?I&-8r!`-^RrXOdg|%x^ZJ)VFE;Nfk=^ChAo%UG-1n)Ort638!BJ8r}f?6SOUBuMKhKOt;10<=AB5 z>gD=IPL*%1kgIz3e8scp>szC1)ztycw)WfMv{b#cVcS2sS=aOcFv!J0PIMXvB3u*d zc>yWhAizRC@xW8PDEc*Tw-DGu)*>yWOoettfo-$lDde)9RTs-SZP^K+t?Q45FL?q; zIZpt#f+suruvssUI7SKb9ZYC|aDSepiW3juH!Owv-{{(U2OE!=LaRe-+BQ#tHax^y zPi)>}+E2}X&`c|1p2FH9Eg=tbj5AnflQYT|{?*<6jAOilD~8k*e}(gAVU_hvs|vyT z*rn3h*sk!&?hQxK?~Q;5W=5m@`J)S;w)%(qJX^3sJZR!1%T_~&&`Z-r_i28wgvV8E z;2C3OG~4S?i|f~r=tGe z|9j5=oE;9^p56OApYE%8;+4#3-3^D@PpthI1<-D{VEX9l`c2Q!eW-+KMD5R8R+0?e za)Sq?l2elSLT#{VbjcLs>sujf+of4|_1M(wKDW4QGAC48=3_!j&3p3#1BS??G-wc- zhHH#Ko50uC@av`nU#bfgTC4!mS}EA_r|%mHMIU1fg}qPrk@wU~YO%r~W@6BuC?|0` zA^Nv(v;pO)YP!TZ(ah-qJo1WG=MQtO03Im+!51pe?O}9T@OmD(DL68B}$f-E+m0@=p6H7CVH5!$v8;#iv*@@ zijatiWsTS7v62Z;{TtU#YCBmGR|iz#_s5YtLH6=StbtMPCXmB*{?1qy*d10KEui&C zRSw2xW!3)IF!aU7;IW-$4Jw{1p=0Aiw1| zrwgMYW`uiNqRtj=!9QL1CPqO2oVN0mVExACBf!Q$4BHx+B5d8VUdp4YQSY$mfE&)8 zvmR>Kh_{Ez9ua?)2-t@KMgO)g+k6|539Hyd zXNbQIq-SQ9dm;MVN3WZ@)LcoH@S#DSYcMe3*;PK8F10s-C+_0hBltvpQtvNI&ai(r z9bpHwpE`^ofzP4f3w*Vv@|j9{qm$V914oBwUYFZeQy&7}=#0G^S!okC*kB37yZnS1 zD4P06N!6Vb;vNt=A_q884XI^6nGk*rpzC|SeJuY73sveDNVe*7o8VRhK6@8$KYoau zWwJY=PI}x=N4TjD5TCuZEVFK?Wi#`ab?MtsmQl3*bo>$1@iRT9b1tcqGetu}24q{XrW%EfVr6;@H z?1=|Mi$Js7zKK)K?%P`=3;m)e!y}zOC@A> zD@WqR7kCO5P5v<<*tyL5SBS**Ef6I#GN>QOgAnQ-&`n?2z;V$ILk2d+iDp{6#lONF$KokE1`?`1s;~kdd zNqInV)4TaGzJX8IAUTzU??3ub`Ph1buhWw-FqXH#@MAKBBr4>lW7waZE!uE-A(N|8pO+b;d?nVe zp|Rh2Uu#r86&~X3W`3w7QQ@exk_)GyiO;lsm;G>h`fx>#bUd2IwEPjE4<-$67?uuv zznTT`GZF1jDK=G}5Aphe5iA_NZCw~e4wN-T4}HA-*IXq*bsUb6Nm!4@ZJV=tJ+DTY z(*=M`(tQqe^#8V2O#xR15!2$b{7v!peW45&y#||)s6JHlNS9ek7NC}4w3|VZf_-(^ zbgf(M2?9lfmuM~fnl5gcZ_4a1(+(cnY*yNxs-GN?r@@>?l^~mzOLP{AxBn^KHqB{@ zQg4K}$!qE-Nc;eLoA2kZ&8WI~OL)kAfxEq0ifqSyQMJDr!z0HQy1s&6k{}4|Xp?&5 zr$7;6z(*C@zZaG;?oWMnqV!jF{nTGZ5J37c%!*}2h>@XOP_&4`E2R4-qCUXcg+tSK zf5;~vC^7pAK@hsKH-KSo`kY=THuZJdL+zYKV)ltVK)oAK>aHpUbpBmz4x|UlZ|H=# zfU=cRp>eE+UnhC&N5Ln^Ei*2Qf69vLrs-cn}bZrN&1`Y?u3zxh_Qh5FM7 z_-L|6SVg$qCabzao;veZjzI51a0}d|y)He1-*sCzZ52>gndcP|5p+Q2)5;rGiUt(l z5vAQn;g7ln*t!L&F#A6`MjYh@(L`v*ZCfPDi@8>j6#6pJ_=>$ii4u+QKha6wQ`D(@ zAcGlJoYseWFu}Lhq8)686=LGz;-MnIIr|MiYl&RAzP_00XY{0t0Ghf`O_scNV7S^r z;&K}<*>H5_3`J5EcK;P1ub~^zZ6gPWcK1d_llqopVT2dFDK9K3#VZ^YD5O$2J%Tg4 zzGtthmAF0+JlM?ne4AD`VyP3q#2tvBT6=B&L}Q&CU^ZylVn+WBt-y^?CyMVDefT{r zHMXhlnA5eQ4mkc4Dyo&75PDVPkCg$07faUcP;++>+Df3ZWgaVtPdW z6U5tFK9Mh}yz-EV+v9vdrQ~xH9H$|lrbmG3k(l#&Z-QIic6GRAqMRJ@sZx4n0ch%r zW(Xr^urgudbJ+G7EH-gD-+5cn-R{xs)f0?=mP^BoE8_%*<7VbK{o9EHY+yR zw6zcrL`=-L?rUBH2Ih6`n(WE!o3zS+brV;l#X4R#6ak==Az83~9SEqfz5}YXuI$G( z068AhagS*J2m(KxJ3&)bPwc!KAC2Dw42!rxISd6tjvCVRkB_w*}Tqk932}Qn`3o2OyK+GN!g zDgU^gTX(8F7iv5kjnkzW$I4V#J7Z}RrDx-z?6g5i(385KjvKW$aE{L1r+=N?ISW*X zMEx3nfwu%Uo7!l(4vhQq1L&`}Q{s zRg!?ck<-N|MY$SbKsyu&uw5Td=-P>#JEj4pZhjX>M(vc9^PtDH}~28Z>`JA zZvi*|^1v`EXWeUeuv*UfBN@35V4fQ$Qg7%qu`}xv(Y#cvpBeFTO#f|$dbjzB7f@Oc zOa;4C*l-E}x&KJfA$TzPK%fNWsZVFpxLT%ZC*g?~!0`JkTr%F%JBicSF-)&gA6rd5ouN7{ zHn86UBl0ziI=eS&mp_`VJ;_o$7k}o{?KIzxyE3ui#P7aOC9e{tOzfT_u<(k>piV1F z;O1WruG0nLL~B5t=q_LwC$kaZ0ud|au}`3Ch^ahmr{3);kn*S#?7;=})%GiZ9lS4a zn|A;D05%vv02Xr*&h*h~Rn{_0hsVne2q3)z5Y20d~+J)+{uL1%{N$@YqddRH_-?z*}WeOnA(hGSUn90A>@KrHDYPxbc|$ zKtN^!ZDAV=GamAcx#@olK(QtYbc=q&C?|547taw7DwVX}My?GPJh;BQ;Jj94elL`| zMB6#U4HZQ9eh?W&4T&4Ir2`_&g!qI%0#zSg4L1Q|L{um?Xkjar!dM4RU9lz3bQK_+ zlLbzlGVFX-xVOX(-JZ8wmO_0RheGgL%1Zuiv(4az#3jHh7OJm~=Y~iT|CE z@ZCb$?bG#UW`FtSg5`sf^o+}P4ut?j4@mavzkb@NKA#dLnYr#oPp8>u!*;N9AO$pz zdIf4z0q`|4{x?mZo&P6IuexJhm2_L_pAZ@brxx{Q7jdv&r4)$Q)=_}ymucy{0^lvt zuKWF?-{?B}0C+f5Q_teAVvfM>ntV`p!R}UPDP(b7vfA}HZ>s90T3Q*WliBUtaRu5f zbjpPks-MN~Gig-$VqjvPk457F@#OfeU-vH}4tkFa18+<)?Nr(eCeuDK%?3aI8()2d z>Np{?zpo|@jEMkZ(!Ox~D~O1Zq3k_^$g2*fpGNRpDX_}R*;<xE5z6G=6^d z>-+nDF&I#Zve`R?qZzpvi|~~c7#A?D#I)+CbJy8}C-gvD(4}|#nDZa+0l3lWkHQj$ zzqAH;dx5~t{>DU5sSXm28-K>Q;6M5(Cig!!okEpr7Lc_#1YkO;_7Ugm^4kT#b^6`+ zc>cZkqX^)`y>())pRrh!(Kl<$f9tPi`7^-aC>U5MI&K+vrGNjQ6+r*nxENUn_&Er# zoWFbBrb0pG%~rkP7cvprCoUvNDr$`o-w1$N4|j0Q-F}1I=q3QqtZxhqS2z3l`8}W) zkN>}~Za-^Xe67(5N-boDQ$*=S1iGvOAAXvYS-eS1PfgcqrAziFQU>6L2X)K8R)S5p zDUdOn69bO=A8E)R?!!az0X0w2|5O~Sq3XRxoH?`skTo@4RhYV10pU}9YbMVJ59Qs zkSq2CJAX`!Q&eZ*=jnc0HHjvv?|;GqmG}QQ8~f+p!$0#EufJM&U_>I@u}yqd5!5!Mjoz_`u+W*YK4uT_66iLkK`v*+K8xuRcJzwR6${ zJDgjVYBQtQ;U~x?@}5P1KEb7bBz?P-H5y3TT)Ds0bEv)$H4qtUURrT6VYvrv>b-Ew z3K^H^_6O6AsSzu|e-M}f1V15Ny~}^o(ZGc+fXR8|qKEP7sHJ+J;P*XNs3X&; zA)^I^Ct!VSuM#_f9)B7FF<@Te4gmqgV~wG@+B0_uD3|^>z)$@@^~Apcv;7h{y+}jz zLp*?u{y*g-0CQ%efVx`$k=t6{wKQ%s3Ec#65N`l<(?{)U@W{d&_ith|!P$%{mt` zrvH)sxx}bqk4`R4dJz$W-KAazAV8P9kcJY{f1rO9ET*SdmsIPZkB*L>;m};RP;nvP zD5uF1BN}LW6KB|)0eiS(B;aD}=GPQfBnWMZ-5?mR@6Lnx*RSbhPM^V6=_c^Fu$8et z5eZDM6foqUPnmGPf00dW3CmN1U1X41!7>$mfSLo~mcGEF+CYis`R^b6*?=!5@R7&0 zcunfLOyC^#jwbK#{{HeP*|!k`%5D%IsS6z-ynFZIc!@uu)M4$G zNY!q7&^zEr)ME*42|UpLon$kdB_^Gg@)k(Fl}+^y1_oMlNPQa6(EXsEcI373@f`x< zJKzxN57a@|$yG7XRzB=|6CW*#K6=grLqtuX$!>}^Zpk}aSh!fEjE{#+ac#A?$w0;3 z&S%FZWJBQhKRkMeA>)f7L+y%w2l~dMLs%AgbM*p6hX&IDnvLGc zPzMrx2uf-ZNb03WBc%TM!qP_Pmjo**3Nq9lQjDrVB`UbIIDUWkYX!AmB#_-~ZVN#~ z3vsAu=aEPv9)6$iqZ301UYi&XK($2Q1+XKpUA@GV7$Pec*<};BB?fuzcW?bCY1;Ux z7$4jJI$8+)`G8^p-Jg}WsUy|ErjGQc2#LUGdVcz3amekeigED&+#f6M8U~{3n`LJz zJ6ks)=c*V1|F@Jm?_c-7kNp&U81y#&*SlYT`D4UZOJ?b<+F=kIBwHgEu;LccEvT3l z{)ZrnyVI?5QCE9KTtnxV1^1y%cQX9>?AJm3se#SXd}AsgL~Yie3wZZ^%A-K=YU{ui z#GHw?89+;YiOO^WI^k5`w)o6?-jc|AMw=6QsYptTXadOi5^+ruvAxDM`u++v)SSSM z!+X5V^8euK*FWNcz|yZPw?_R@OF^&2CPEe%+*9h=gj@$ z{~nhPUkRfw1Ri{yUQ_@Ao+=#AtDjvdcsjQtZIe%G)v9%?_7ebo>(kBN6wPVyVC z|6u+-Apqel%8nP&Vmtt_lW_6fu>Rr_egh!XQZx|W6BOnA`w~In2rV%27bMUb0Ter! zPrbQ<8H&gu*ses-bh#wPYU6o2uRSU0`Sg%Gu~h+KbcYFR6vuirXoOgz!1Y^-`n621 z?&$}o11`mR8v6-!Meo0yEVqkoLrles^j2+G!F+@zA;m#n@t#drN zXFG)9o`ruwjao~G`XzQfoF`Ju0boPSjxdkEXa%SfK)^KEP3Q_3R}gRjkhG3y=KlG) z-$USClBDlc^1r}N!vcV9!dCF0nvjsr>6la6<5gR`>=Z68UBgcAuYLGap;%(fqJZP- zJYuFO?8l#XY5d*A&(r(g29|ytA}PQ|Ed^uvA?%mrcX{^^N8csF4mTtqC;K0n+B% zrFpPafB7Vs+29MbpZI^^7leV{d8;ut-Ow}TBhwuy7xnWS*kB4j;8${8X>X$*+bd<+ zzAJR_L)7ot1v6_i50yOpm(=k|0Z{nu7+d|%MFA4TiUBq!7F;a!6Pmut0C{@-_%8L& zGCv9_>IVeJHEZ-2qmy(1tKUvG%#J-|P zBP?9-{}OPKzJ|aTr*DJb{({aKy%@o`q3T2Fe;6~825=0L=?+V*8$SzcF~2g?H`2+f&tKnZ|GKpUQy96a-@EY zS{mkU#EJqEwK4E6{C%OR#4nKj`di}X%TBhPhgZhhCwtmR!|x`vl(!MS>E zKk3JB8w8xH?&MwhAGI5#hdOX1sU*av-%i@wF&+|yyuhT-bH)CpZT@bHnh>>Be*;r;8EQV@PH*Ph>;L(- z7GRM+yEGvKB^rmLZ30<2C8#mbH5S8An*1-!o}d_-j&D=yC%EV0o0`8%(0Q%J;gIjm zj7vo|CbI)l%F!l0XuYZVUpDcR0Y#>;b>3=#rgJqqmN9GEB(+X|6*Feb?FoY4=G3F{ zgQEaaauWRs5Zk|r!w{Wc1w2#g()jRrhve8|{_c30TRw$mvq@JB8xu*Ap;BS>E+>;Z zr^oA-3@Ske+V(nDU`&1_=4Q2`T#BZUC;OezsV7EzakiYMt%(9#eUo-j_c6nbZ+$;^ z24_S6e)dqi%rw_~=A`9EL#?jtit5s_+G9}nS?Tjqg%klb$U+x=vY{*I`oz&#g46Dr zeYe@PXrgKVjMs}OC4y?ik6VZk9q#=t7DHT}a`#VXb^Cb79@97YGZ>Cz*fn*S)$7FU zYKp^K+uBYh4hn2qxGovh8@a77p_k5^qqg~aE8^8BT?wj%HdaMWOF6SRsBl7V`l z=IBNkU6vfNY{F@I##tF%%VE_GURk|l_umqp1SR1|3=3HQNO%Mx+zP~L3M;l({<>RS zY4G+jPBmRV6Ft4Ufa69s-q6L0bjAAqm(-9x$31lPdnhjg1rfQ zpFZFf<*4g-#W5|2eLe~_M9j+$Io^LSax$kMzM+S0kB< z=801>LmI8=S2~$b-QqC*d%ioYT{2fobvAL(*|8bBs?NTXZ$o!ir{awL9&!deT{b42 za<+kgd&A%6v~9o0Y^IWND?Vj4)FPvDmg?5s^9R6mgZ;9^J8UsInd`s|Tem519?na> z9a!DLW~cX#V}ocvYD@vD^B`+On9nVlgb!8OPk(ov&xp8R`Y!RX7&l#iZW`(75G!vQ1EWqP=g5#tp8s|e|)CI$jsXSDr zUkg^4)TT!T-O!vHKO|JI38hVC`IqldB8-z5YCX)y#LV9HfLRTE8#!ZfE-U5_;w(b{ zD=@HdQRb^uS;N@Onb@0%uwL4*XBqVn=G7U$H-V02HN^R&GCDdnGZ*mxT+I2&baUV) zMUC7B)J78SR;MzFU#qsie7L(Ih#VM`NEFoVIv6wfp7Zj>i#!F@AHxIbor8IjCd8D* zpG^ccza(A*aUN3b=GlQ~VFEHx(AzJyPiV9}4Ch%e@;#LD?=bgA8BvoG+#`5uZ#x5D zqG78o%Oh02b@Gs?le`6ZG#O-3D4uHz(Fi;b#6Ur^^b_k+>;r~c=Pjre*W&7|)^ep1 zyATa=7k@G=HSU6Ko>6IF`sPa2#}j>x42LJ$#gH)S1Rhmmzq7$c%?_NwycyR3(a}7t z-gE;W<b@@ z41C_U)%#RI+p5;XW8Ea)_70SYUT&J?r9JqL<3XcZr@`IMa_jyJA`X>mdSD(#+6XV9 zbJSEd0x{7ktbBiNzmG2`fo_iPb5Pe)?8(S|vYWZ4yZbjqe~H&G0lvHh)nb8c5XZre zs0OE30Tp+aziOv-$8|^c&2%z5)wPKRXWnI`+skmEG0-l@C3(twtvB2mxy+?-x%k>LD^8q6Gb^CS!l|+)N;jGk;kX0fxO&t zI?US?QJeLFt4?5f@7)0p{S-!!OylvUv`&STpI^P8ys@$OSi{E>e4EMXwN&r*_xtOD zdh(Oo76eRW!5~gaQ>69VwO_pQ1ZDnWJl+)l#~8qeVsH{c_w?Li>DZ5?q857~WumYX z%*HBrUYRpiR?1&~0y{cdFuW~9-ZMHYDm#wrrnYPO`@gCg(7|*lw={@~-Ek$Kc4{UI z{GL1(f1Zg(V74Q=aTwJ58EqPCpZJ8n>M((Z5Y4l9qm<@8HePv*bCzph7;%!3l_?91FwU%r^1Ml`(Blx~ zb&3Z!%pa32J8|*PFRXed$*vUTbZHZVOI|6Xpb#3v%&iJbPK4i?YaSysr3FmJ%A5YESFZWWwR?3u5W+Y}85FN7aO10+W=2rAp zDGHbN=>c?$-K)JU+)S|x&%!ks3mvLL@7oSIx`7T4@2evH)mLlUTxHe9T%qD`_nk-z za_%aK#<1wh>C@6v9(=h;YJB#At;&09C`I_xbbj&E$wkl_#XRL$-R&9Iyw9TZ-6Dnh zmlCTfx-ydVpIo0`XVR=F(^p`hoF_Elj>u~{IY=Bnw@3~#)&Y-=FIvtfI$Rd0d@5<} z=rH3e%nscUyoe4L=qwq1g8s25mZ{+77(h3Qeg^;E%w=dve6=Py2_@OLmLO<-&zOoTB%;ygE;5V7GtT zza|73xK6yEL4P`>Rk3A3`k(GIs(J759lyP2Mef1jCum(Ap)e?k0nA#SeWZ;M7Jgy7Pov%d%j(+99T>WBi#FHZsxp2 zlQ1L-<(^uqb#b4V$$-7=pQ&@IwNV|zLCk((PJqP9vkfkFJ>?4u-K-CI;a9Q18kV8* zM&MrfBd<}Rcwv{14UPMo12g4btNZ+%TZwJ%UafO5E+OOw$MkmlTBiD5d!g6H8fIg8 zMc%AO{>6!|Vc=2kYwNCzmKUM(mDKGxDa7h5n)^qg+zbC5->%r$Tsks78RJAIO4eLd zvS@n@E^#>$_<&7ArS%v|v)e|tpz_0{2m9n-&XYdYH9$6;_3NYBm_UIL(PBH4+`+$# z5l$sU9oXK$&~Y*SJ;%OKs91Hbngju7B)Ug1{v_akG&xj(nu~zHLP=lt!p@H(`9%8$ z&P%6NdGWPLE(8}4-=OwHIT)!8#)^M^kwh^i0w_(4$f+^=bo@bKqt0gCMx3wU-7me{ z9P^I*BFJRa=suU(89nJxkSGva{75I@`v2v|$r#@8H@l#&9 z=K^DJ%1?>>C1JyF_ncnLYBU;9dKoi<`PX;9MC;tnu56?ce-d=F!d?Xy zxLK>;-Fx_Qqo(2LY@X9|f3h&gFN=b%%{gMWNYXeOHeOk@cHP!zr@Etz+Lo$g-*7LH z9Ih;vHdSq1Y5l5&Jmyj633n;Nx!%ruF{3KxpIAz7y_L+UjK0bA8xj%iH(i z+;#G@d-a&1k81@Q23+v7*YEU@Rv;^3FC$KDRv&6t9We?{maj7<iJ^{Ei3l$p?;yA57O1cDo;Nd z4R##`t2sK4kxW|ojn(6rjw9QZ2gidxE^cDam!#KVicLK3w1b^L z+!>`Z7ky>ee6mJ+8gFyHu{QHmPIeq`)+caIFrSH(;MkttGQ#^@*z1Mz*pCb*F0=1x zR0oH@Osv>}?&eUM7W`;M2gN7MGq-dM-VQlGshAu`o)xe&9<6Zej&|%|0BKfiR6;IB8gE7eK$zmVN*2k;RM) zXtj3KY=pvOkOJ8q|H|o}9^-$fjy&VWbOu2!8}}RgW9`{Py*yrDcp(~!s=cX2*>xM_ zlwCg~^Hnwo-NYreQjiy%S~?ViBWHgBGi-L9vYQU zdbfa%386GzTWZM5%ooOy9xp}_QdSd3H<0U}wIlcljvJF}5w%-BcYD02YBmhdC*t3Y z^pN|bH>PRerc%BckDAS;63&mc4aWqTPP)BO`TrprfPe%Yl5J87JsuUR`M;>h%0u90KuP9^@7)^N;Ueq4w3^#A>8sbifwe*gtHdr4D-YBv!>I2dKW` z4PX$^kHF=ZyJ58=j4z9e-Dj0WQw!7dsbXg@v_6g% z)6;kotjVLy`tACwTe*Dtf@MCu35;-}{7;+@^ju=~vDbLjb7A_gJdWzDU#&?ATnIkx z1cjv3OGzF|iHlPI;4b9Vb;fhXsbyZOc%B{cgQuXy@IK{ z%NTB*p$M+5kTgAQ@VCCH%82p!RjQbw)7nwYroB%)N#ENX#Cc%DYR%FQZ&jtROdlQ_ zh@zC(tWb8VlwQ8fVbx=k`%CRkz9;W7zTZKDLeC+q_d~3SPC?(jM~ar--AntP=+(<> z+DlS=3{UD|$8g@?O5(#cWXPQe?w zWdt^*phB+W^TXUKPFy|R(C2XZ zhCOf%iy%LOfqvzJld)lIQvJuNDpg~?yjTjn@E%wDh&dW8c4#_fGH_KOfZ!&NRAAX%K^z=X@ zcxkvPsAnf3jl&{utH<|>K3H52@U z?Jf7}U8YyL$&RC_d}1R+&czL>4(UktgdUI4ZK_G$B2l$>{APN)h*sG|KSKXNZ?-Tc z;(gU~RqDo~9uYrp59?a~+otAc0j;mDc{8OwH`xso1(h6A`g1roA1{oMvxcu)w^5u{ zJL6fbuo5itE&UKo1Dp0dYU(8;sm;cqy>DKZjq!4PX#I9fo8sQ}0}1}p%cnbzdW)#A zx|k9wa>jVTGb#6v+Y@;Y%?FH#p?|lqOp@A-eSlZ)98$kZCTlsa1EHt;Hm=72xSO;n zcQdC{Oa00V^$TK%j0T&+%}r+bj>#MxnGI;X!=eK7@`Ie5V}z9{MLc^Z1-_A7@Pr4I zGoaIUO%R;g6vGpRZn&8u^0$_U#G0Nwdrmv}M3p=f^aS*X6eIMaUO>*#v5f6>WbBqH z;E5kVPzHIY;=w+r2tLy&oRW96R_WF|^Z7OVu(4g>slE9!lhPCK*A*H`^5NM*kdWcI zfC)%`h`Gfo_AyxrPLxNC9_@e;d0N#>RvNp+56Rbb{ttX*#`IrR$2snYL`1a6A--@l z6LAu!Mcie3_H@gy4m(xBNwy_IbgG?Lb|P;3DJk?R0q$hR0*hvM;+AKICJWQcT>$j) ziYK*ROCma!5Lou-0o~b&F;ahSxcbYNjMpvdcrIcG?5(u1C{FA4U*}Ug>(kIUyMO$| zqKXQRG%$oV@s#=SHX@ob8v726TZNmbsBDUC8zXav?MhmGCBSt)3!{v=}f3kPUT{B>Ko zZ%kYY8Az4K_-=Vs(sHvmib-{oQlW*M>&oEz7LVIc6(|p%i z6EzKOu%iYaJ{@>_E~~u~CI%HsDqB9yluJnRGgg%jPI6)SNYr^Brd3(Q5wsrp1CV3eJAqrHNCvD| zLH^d8MU?6o2Ya!h3EJ++H_8X~m?qBOnl=joFI8SiX&{X=&R&Cv4!@Y(YRZF(<-237 zf%lIAj|{2uF86y>&M^xXBj;G+yiwDI>-f-@hE3;ao#zcf*5m_0&HP_20z^JcN`D6J zs&L=?;IZ}bXN`eFUT zhlI!>mpMx>Wr0RWfp~s2F9DrG2S2lLf;_NXJ?d!5c&8={;N$o6lQqMz^r3AcBMpiqtxl$6;u>~Y z&P4*I^TnJ(m z(Gg;4qQp!2l9v4+@ghTu5-Q;T6bz%J*Z@%E(fxH+Vb1gl;d- zeox0P*~)8VLbIkU^TiR#!a+A>ea(_Uh!^z=V#)&tGjJDMZD5v=W_PJBJ``q z)366CpX^1CmR}to!$ixT`d84V6(_GZ)Yq%4Ju!VjS6hhBPvba&trCh^zZ=lE+uFot z9oKt+{{7-Q{a7`l?qKcOM(Aper&-3J9r33e_gpEY&F2G;u&fzuszoIsDZ?p#MHB=;=F|a%WEDL&W%idU3cl zk%|KJepPn4p4Wnz`}kPk#`EW)&kN#B-?=-34TGY5K4~+qtR|Gxo33LXmwPQW)UZ{^ zSXOp>$GNWJz4G>)L=x-Ta3gQnqvr@$w?{v;Or0nw-vP}vx6ToZ0{waZXG_j<#@iir^Dy#XPs;xQl-q8Ki$@8#l-)=a&7Sb3O zC-(?nLt0N&*3%Q|lM<|~<L5ZIa-V>wK&ZL<6hI5okQ4>l$s2K8($nL@uz04Au4v zrJHgM3?s{CPq7}sOFNz5qe5g+H2w-EfFFSNnE(0|D7Rt=Biwe98CAkDywI&=k(aqV zXhvW7lBiSdT=iqnx>yS_VbBBg4rd!!M*I-H)55O8B(ZuyRV%L*v)c=OsFn8Jf3JrX zDyBpPeS-O8bJi&OQ2v zjavcIS4H4QG3!Vb)liUeRw$)D(Jtg3yYaizm!DIJ3C4$ZsAt4-yzI|R&*dOkw16k* zOw3K#tFAd5gSl1T8*6_zv~Hmxb$s)}7R&(-**Ng8Z-kvILKyVlO-VoI*JOPpuAj>O8v2BuUb=lTU*(|=p35~lZK78 z>jWa~Wf-z*H)gZK4%g-t$!*-=GaX|kR+#N*?IE>bgzaokUvN%HP$3roZ78E~<_=Nz za!^S_*ZXtM+5j#h=$m^ji&K7{5<1hhE{#3!&%^Fc6>mj)>vM(8rHpuEfx#6;+(EBg zZwaDMD-&fAw{IC4l)~5VD%zV9ZRXKONr3I|)(jC2t&sO>2iy>=7pvV4}bhY}2 zrL9xswj5{s1j6s&LGV-Kv5T7bl}6D);h}~b?J>Qf>rheTK^u-a zY1kYtU+dNUkX_YY^_m*eU#1;z#-o;HmA!(z`G|*mW}5-izH^F2r`)n&w#gT=81HL_ zb$~mfOMa8#Zqw>L<)EWbcq=Ka3bwyGYCuS|SKDW;Od*cp0WLwttOv_Z3ktIWq2KIx z@oODJrXfx*j62|JDiIqpUl)(&XA*N5slTbT_ExMP^%ZO^QY^aMPHV$kACi@16TSC+ z){x-1tD8L*2scer^c~>35Z`8rx<^|W_Phk20|ePZqrG1AvUyEA!4<2~wjWd`;XR)f zfXR5@5qEVgZgjPrY168!Y@E}l8F?a2XTXb3;;}md+FYnoLYd(F$w2KulK1t`=l^O< z9>4uC@-kp#sC#TOD^QUo<2j#2s8$`4@kx(H+QOR&|L(>ewaf&%$JR6|nR4S-7WxYL z1(Y^g1bAqKKu2XZ15gzOe(U!4x{<;dkhCD1=r;xbaiAB`Nyo@Vugknr%kGD|%_fB= z+{*o;CZ|Gp?;K$yet`pWAqA3uh2yw6?+y{kC$d1y)p?ExW6YWACaB z0`S~B4_2L#uO*~HV|#Tg-m$7ATNI$a!zYlP|j@CUJGtLhr!1Se;+IQ;0 zo^YApB$2xlltcN)^>_oz(gw#g%g3W7)2HeK4=a^AVL4 zIN&pO@Puy2yLYia+LEAeRGhaO{u|7{#2VWp?zs0gUo9Z#`(l+}_{SbnGC**8x$NLI z!aJg~_!+1_-e2@yl%?Z7I5YoFczpJ*s0{vsfzQmv=Qm~FjXK3*$KWrpd| zY3dnB04bW$`JIvkw|&bf9MZ#tL-rl=+eGiD7z4)Vsi1W%>UB-?R$~R~COcu#CIcx( z#)VYM{YEm!k$ccbXgH0H>!zT#RBVFr)QWUA^WFP#951n=-ze;Af)5W*caUZ*3&}{) zfxx{(-OePIXN|N{;69wsZmePoWeM>-i2a_&T(5{uCqFiA%#S~B+wil8edqj@GNlFW zk^QTwsL>LAfn3H(R#? z?-T?jB_w2}G5LH*SE)(Gvp1G{{a{5Ad`LH7lqx1^N{h*3Kk*dPpoL>9y0?7jma@!S zh#3W8%8ESl{Ii{DP5`eSdr*~S6uSy%X#=;@qmGhB;e$*@wB8xaZoeRSO5b;Hp#pNN z&hV}k`PaLSID-8YTgLPT!bKPlebmgC9z$Q8^WR5wY2G;aD*2{9z$+MjSiY$2)kE4> zunyx|$}8T{4=~2pyY*naX9{*k0PTM!dKAS&1CrR4jCm>eJ>_}?7D3Yn!rC+bWO6LC zzDV1-k=K0N~-jvx15# z#{uBR%O)CD%@ihraotuOHB6+v!bKBZq){{hbf>4uKhkJ$?z?@}jKQ3>&~>f=PyL}B zYYi~s#Ho;=Zlp=AL|O`TArz6*x&Ms9&|eCJoN@;mN9br;*ySc8WN08Zb^s0RjRp_h4koL z*!ZjC`n9!790XLI2l-R-qgEy~SZ%f;G5l?qUI5XoqlXi0ktdT;x_xo*Ik__Z#R z!W(HTJ6khejLULez%g#QWP$T%n&_Y6$S?7Lx^dVP9!*Bn5PrIv1%Oea1VocZ@9kp! zAz`{mN`R~dnF{qQpGehTr1W_LS(Js>d)=J{{Igv^s>t&DUBa*;|Hcj45XLA*roQkW zZett0nR1!$JSml^?b|v!ut7BqobE|%f}Wp49LSq=L*5WWH!MRIy5gb$C+05r@k5QW z&*1!P7KThK4gn#L+_NMR-%V!Xe4hDh*%z(exT9-#FBiS&JNI10@LR0v6n{FwiL}~B z2>F=(;Yz;ISCk&s!T3cV8dq=j??MUo05_CDxK=p(bht2|m2M?0TLh?ECa8D+2Cv*t zd2`|nML*sf4}`EHDIZH+OjgUUj@4^yT8=zhI*t0EC+M#I$fQk^PFK0s+*wKQl=Qzy zZCz%@HqEZ|4CSF2qoU`AAjoHvZ<@)PIm=Zhv+*C^8TGVOS8u=Gg{0I-;WIh6FmPW; zCsSNr1i`g8Fzp8(5Cju~-g|&eYi*5?l{FD;hQ$*EW*0#AGp1|wyl?F2^;aA>0%&Tz zq+%c`QXJNBGK`AS=V>&2n-?A{Oe6r+Q;xYR`+>pjJKuFbPFIOgd2O?C5Y$bdv&3w0 zIh3tWm6N{{(0P2=d|v*v8N3k?Z!IhcHYJKAT;fC$pK9-_!Yr;gGkayemP3Tzrbcf( zE$%sI(;^se;7u@bv6cyptgOt=!;Q<%9{$-Xfs=7(yiR%&!yG|Us>LkpODt#Gvb#Na!vZfDdZrBw0*#56 zKqwK9kU^Dff3vn;v$PAG^?nC}gx7I?v%HEupb^63F-qt_FgDtkVRmss+(MT?l#S3V zU-ti5{fWxB`Wzke9=p$gScM&34+n4{{wv>EC!OJQnloSX7wwnwFAdm>!o3WoD=CBv zU>7_KUS1wi>MGt%U&l;O!!KJk{SA@xpsH_s$tTO}jQ8t1=xx6(P@mG#Gp_NF5fDuR ztmA=4n)y0@gTP)zcJ|VtR2#4_;fZzGXWv9Z)#{_p6w73HaX%CBOh)hp=-hGj{GsuvAGiVl4>K^m@tY7HR;z1N*cRbmC?JThbE)QnfpfWY$+jUoC*f?D zgrrb$khf7ZIv^%7we<||SG#8Z+n?Rp{H4l^hp^SLpUq9O4^ne+1e&0(poZtaB*nR~ zCbZu6S)*sT#kkOE79a6{Nan+ls&bVBtz`JBKd2vL=JZRicx*S(XtW(Xe3cI5!An zwB@6O=xlO)9jit%rqFgHJW@aXEzy~UwMYCgB8nd`p8FqS0>YUT&gE<2V^O27r9f43 zAL_6i`3nxaJS(01bW;~MRGYO*c_9bHJ0SR zHr~2#g(4_cdKH=}S+$uH|Iq!LLwDx=FEPN{Gb7sZG`te-&yn>oLH-$aZJ>wR)!Uag z=sCs&JcA1C4sKV0WE7;Ph_Hst^e?5n-v{ZRiZ6Qyn;Mf4$<}CS^#Kg6!;g{*ZuHv?kawJ&e)AD35OQrlmGa<*=CoIN?y z1u7x>VJE`wAM-2d*%EbOaVUJ3yGw@<$BIjDxPCA4yh3JEOX>!fh=tC)pi$u!6Sb11 ztCJ({c%ZUyYu*3VLoVyhk|!Tq83Y9EKW5;cX5LzIt4KkuBnLXB?j3GA0y7b$c*1F1 zckj@g-|D(SX4!=I}fB zCp78t4nSBbl`lv2-g28&f2y)=_0GE;yQTHQhjIoC6wTC)?Js~a@CUi|=SCYtZ? z_E^q8^W}+>a-R^Pec!vbZ0g^HDW+a%peI5b$DEBYp|`a7fXPCETQBE;E8Hp80O(!9(}awOO~c&?>f2liv6PrpICKRH+7N3GWb}fF8hd zYf$@LvQ&CI==!;P=Nv!vtVDb=eIY}x1Metu>eIMB3H2T!0~v#(eVo_*Swf2+m&HoS z+FG=R;u;$H5M%Zq9H3Sw+I?rX&IJ>Xvw=(bWt8^a~>ZL1u z+r;2y-M(a;`z%82@HyKlX_C%E_$fr3F(^`|rA?r9y#D+}g*iH>KIbVJ16ha;lR|Xr z+%vOb0g)eL`m$Q-Q}tw=!II%A0ji!yCDxI|$>e1NQ_>ucAdT1m&eH$lo9{C8={{gc zTfjs%dJ9y2A9w|Hy7;HZ*=M9Tl`_IMUX+N zBgyoRn!Kgj%e#)&Z3C+}2O^^Jo^w@)5?#1^ruRF$4BX>$xv~W1(L}+_E0$s~q`_e7 z`MaBX+iETgv>zvcCH93VwsQ)$B^t9E9{9?4d?Y95h*JK}8NAKQ4H^xD_KR;D=@)Uf zMqJ(!dnKp($(ATT=9LlvVX(9l1*ht=S5KqMUkVitC)GiP*DU|%bBhV zFh5bHDe;dkX)hcp1(J!zAKdzC`O=iAKjP6`MtVe4dI%@_85N&}lg_2`A;?kpc=Hf;cMpJn@fy7+JQGrziQ-LcByD>9SREy zq}&yyaasYac~q+7$h42Gwy`psw?~!8W=S!`CS>S`9*G2R-*vtC zg-xDp1)EvAt3)A|ctfvYmRIiaA_Q{x=g>RL<1FRq_a&-Zn;bK})rN*eHP0v_i{H<& zU=_C2vkiu9boQLtFqtbJQ}-B^B&goIs~~dAVShx7-bAo}oa)wfMkg|msFw71b^EAy zP>FKT^p3J|f8I=?b>GHLs;e{yj*L_#7Fo3%h9kIK6CTP{a;1BZ;L?a5<;yADs1;tw z^Io+3vG*V%hhTh zU;U?)9&ygX7l0AkVK=z2+1FZnXqk(0w0%k=EHb|U0LW^ys`Uz8RP3`orW_22+eLu3 zio6Sy_gaZq5R@NFY3KVZ6kK=A%3Kv+>t17qT^11$ktgRC{d7(IA8wpV25x_R?#)V1 zjjdud-&C$fN&AL4Ja+IyIe?&8YAnmEk+L5-MP(OXOHwh(0#zZcR{EOL*jv z_XXMgr5c%izn8g0H|_|;^CnPbtILL(=s9O+vebfHB<3?CtV*|HLSs7{wIs;Gxt+O? zS9i;5-R~{^k1?5QKTFErMfRX&)g7f+ZezSr@^Rag@A3tr^Vn8?J^|J4g*?;Yyj%x+ z<~vrYKl+(ytPa|!_HLOY?~i~Ei-*cgQmEo-oEaPhn;t2>&ONH+211&H;8X6O8NV;>a*Aw~%34TNQxA8C73g@Htq#?g5uF$< z!RCcm`v!fNgPW*{s&$aJp#>_-Kt!{QyJ~M4H6O-yb@6-~iS*eWUfC%oCL>E#pq}Rm zh#Pg>qGJfky?N(zZ(Dj&mFC=sz(>8OvT#se7kD0~T%40D9=_?+uS3KiEJM8pruwiUA6pQA(fs))Ag%w=xzTp@1RxvbN-I1@kTN(SnlMBU!87v26!n@QI}j|$?w+cCU! zb<}msBaqdkrM&m_j)I6?uI#j6=HiDq$8$I8i$o_CQq<`X6?W@+pUd@0*z?B(>VzL1 z9eO-qr0z>Ah~M_mB3h{US#RL9(yEoveaq&Z?zEg=Q}E78MXiQa(Bp+UewYyyJ|)tk z#NsAq%teN6F=aofQn@4lYI>V}teR%=6m`6Vob3GO&8PloW(;ZP3t@(UowR|GT#vMY zLAM9H-T?{QWmj8;YUih7_9#g|sfkTE3`ug!!r}yLZZH=-&RL)yED2u&-5=RY!}dt8 zz)N#0u70=DB@H(s&T@Zfo}Zp`xRmANTs&w#Fm~wj2BjzW&M~9o>aGoxY|*r>PhCtq zAHCsoF~qFJEq5?cXUbh@@6ikOJ31`2qX(i_=3Vkk4Ho+L$|HU2Y(YPA-&<1>{8)bI zo~P2d68-m{mxAx()tQbm;)@xm2Co`2+&4co(25fY%9Xvd5k{CRXwvH&ECUTd*q(+E=F4eQ0&$66k6UtA)fR z>2B$RJiw2e4B`|S^&HRBTV5)MH8adAuN2Qe!_QmFt!KPd<$Ci0_gP2@q{Gtro zarkjM*K#T*tzQ1v_GUv>`TY-gd;PewcG>HpOLA8XQG)na5-Pdi` zuZD5bZIu{9jZFsm>%7?Zs5Q_&e#Z9AF5YcaLp7}LO~os*C* zupSJ5bPt|C-1<)MokDPQ{%#M^ivjs)VO*?*Tx25yqj`Yyf|eEo$}$J|5L&_st);vQ z`|AXt9o3+*;EY-Jy|QFbgS^0guGCyKMnG1QO#RAG#!bF`uiVx=;Sj7iRq*v6YOY z3Cq!ePt6;c7Bix5YLj}GkBk; zj?iPcMt(0ju;Sg!+&_Kjy}&pb_kfq7Q)FArWV-{Rf+b?4L#YF<`+b(|o?|?V@uBPp zO8g6tJ0r3OadHhr6(qXqN<{GwUS755=;rl}-hAOAgqj&l!)9MM%uDtZmXWmE;Vv@O z;mpfytM|Xy{Do%@Ev%%Z)O~62Evk`}C1b+Gr>Q>#c0k%IirofUR5PxtHNAF6CtU3_ zxik+CW1^>@#*5gz-ez@8w{L##@WoBD;bL+5bi&kdA45qZJI=W!$7=`w;BPM{(cMc# ziUg5x3&l~|HoB0FUb-4Z|4pIA)LAV3HVu{Xfi~Pt+ofaU#`lj2)}Hq$0thu5OTEcB zRp=9){G9}0V!Mgu3XLoY|2)pB!QaD(=6oNzTb3H-82>}*<)cal)NOewyoC~jSl{at zFTB&7?L$ZdO3aQ_r5B}l)n81%j}{&mrY3j5Y?5!{>uHW{5yod@G{yP6W!n<&EpHwt?_N!r>BjA(mtS0y}K4tB79LmJbId!`#L@e zS-YJ;q?stCSv@v|9P4{}vb{DO!|@?ZJRJh1cWI?yiv6ou%~W7SXjIfFoi{Bj{WgdQ zb!Ykeu@>%}Erbo6v$!`%jx9mtZ7fNV1GRf@ zM-sjbEP*d>-w+WnJ1e1wOYtxI4HOp$VTTM=m{Q{FLAjU70JURYiJxtt?PoBttcV1{ zVxh(|hHug+krJLUz(4@quZTGJ3LmPO1w!x5N2@Z8i>Garo$Q>n30l7^F3qRw${X#~ zNq1p~Ob*kD8RFK=i`+)}G(Ei|(;JCva`Q#^9R7nFCQ+C!sQ>$jHh0!}E4=}DG34=%`*d@j+o;f0_|(VMn(d)+iomv?ZKs%*ARV+O^RKKZs0Z373sG`Cyc_!F zPWZTFTrTE?GMdmAZTWUWew}J(dOf-nN|5?N3^LYJobWu`S(*JicW&jeWc}Q&W2Jn~ z1NP$4uuE1Ybp5-${|?5CLe)mxx7-n{6dzutdi+j8ZC(K`T12X@=U_X3(t?L~P11;6 zp7`(TGTLDYB3gvU^1Hj}=7u{OJo9gJ(pie0sDy(iwy<%gz}BT!m6iz>Zd*Jn(o4x_ z;@By3)rxL6R11qO`S*GbjlL;@8u4$MjWCjkM6(LoFLVwL2)ibLUPfuowV!MBoyw;{SeOnY`qur9#`xd3wZ|Zo_EO#aR`B%$8hbim|HWqOR$*Rn} zZ4pDYy8p5fm5KD<3hYNHAOe?cFTTAD1D}8D`{PGHci$f0=*g)29{S|`0d=pKsSSE*uk`2{sNhnE))~gENMh-}Ym~PFLhuIp4DY0drvaOK$??@4YeBpAm}#Zv+ z!JG*o@>IgBUmhD93OtB~5YVw}^jfHkTJ2|I7D>Xl`h737d|!b-Bw`jGy48L&G_8ls z%4UF6`d~qoKO}VC(usq|-}`5q(C=(6!qdIxPfbEfw)PJrN1L*<(1llbKj$ay5b`P1 z(7hveHjBR53yQS-%@ZK_-m)Pu-JxyY%+uRIDySH zqEo-MB}AG=3Du7DrudsBMq-7?0NG91WE+&gIwV3CuF;W*1dn@P&@UHXd|pZHq-Exd z?m_(jx@_%i_OAQ_;oT$ z{MoD({a7vI>qft-t!lca{-j6vE(SNNPq3OEwscjFK;-L0srmdqN_XsMP+J7E>CnG- z7@X%mBjB|`-)ECLR@Pt&%tMI@h(!gkM$xM}I~$~Zvpcak;K5M-CHSd^n1`OLl$5Oo z(e!aPuT9CUCVS=xu}#RcF`FAk7zm*`}l}`6v5fi73%i0 z{a!!j9UXY4`SJiV&`xslnee#5kJe_@s%b%Q0B}nyHOECw|CiD01ihOc zRLz&gJwfyn3ZQ@Cf}lsY{k)&hnSU$XKlo3jf`>E2r?LOLlNeKIcLx<$ktdZC`uQ zV9en0F~qtKCwEth3FhMyyF15eWwT3ewg27~7v#L3$T+V>5Gxl({nVc%1#s}wTSO*5 zRRJ>exuGYcIQXRU2VH*3NUR_@!VYSu_~VEG!Vm0;&#e4Suaghsk1d~)Cfo81Ju&@> zlUlNcjEvoK10A-l@qlktDe{0;n)^+2-f#ug4rvHAU+FEZM-t%AtJ#uYmHmBf!ajga zkhGY}H~!BP(~5x~m9jZ~^_VE`JGAcYEm{q*;y+)(F4%!fqd#?W%rnqq5~$<~;bm#l zxbi?}zozq4fMm!AqEbSXhrIYBt6;1vkm*E{e(V#Q2M!Mt3{ZkUrNTQLqO8I!(}Gvd zyM8=>=$gPM@U3BEk%e^i=DtkHHINzDEedR@*R%+!8y%8M=FI#lQ^;wcYE-)}b(jBa z=)}2WUZYC=nEk@_3+e@%G&|@ia~73CpZhsBNt!PDcL0@ujUu(^VwG<``skGL*Tfu6 zJLB%e!0*OspkKIUU44xnee0Rf+Jr~EU+kKYj_nZW;&I;Xx6x{Z>>`aA-qng~h#6#l zq(Bw$itBwuOkvkA9(B zi%tyooynp3dU^D1J2Ift{Tnlh(;aXHe7SGM#3*oV3;j6+B-VEs_(LLxuGB@E3%*0?yUqQ9ATA{&g=__!&ZftEv9(`{^~d!bB!*z3pF9Cy3c^F66`eL zEOMF`$xtZ@?OhnTY2#`fOvP_?|3Qf<0#xE|s<0*QXM>WAU?OzO%6MZ@z~1b#$f*Ul zn`aGG8pGWV*wF!dpOwQw1;Nz}fsvv`vs3we1LpT?;;B$@Zzq;s=dm5RzIoaTL( zO_)uNf#|1f(#k_TEhfEY!FO|O(wtI$QPYqSmc5(bwom)C{iK?T@2M1eZv7)*`PPhf zcjN#yQx3+`$YzEY-;PT-=6n5OT~(?g4^1VhiHsgy$rm(@FXhIb4xUqP1bF% zt0)|iPk=-I7ox!35Dawm+WZZbV~xE95Mx4do~-BOb@)w_2=6{hWOJz|RLH(KWq;HE zb<14|KN(Gr+r&-_pz$B_Z=OTeMbfBb)*tHv*$xM7JQMgd3LxovcxM%`#z2W{Ih(?_ zFJCI%OEIh=63DbXDDQ0n4N2w2I|ad7h}GhSqn7uNat-?SQi8++r_} z_}+ZL#02TgSKY)wY_nC6T_E273xeSGkOVtjo7bymczlT4GV1T9jI0N{Tju%x8C1=A&+8AE@OvQTi9;&3E@!^JQc{^3;@6_VB#x_)z@uQ$p_QIYe_WSi*cTYk?Uow} zXgpe=!b4DFnCe(0OP_~yZRQ|y=omQwyklxC_ev8rA5{4P5-`Y70gbaG)#IXCL6Duh zqu&}l>gTBS9wW9)KmlhFRtMLx2 zVi}q<2sTH#fZa)uXhUl*|H-{dwa#8O|6q|Qm?wk^MW%Y}LB9Kd6edlK(QP?@e>c@J~=9CV@Y4Hm)qjy#_m^&Dg zvO8?&v+2&hc75%&8J3>TT%dlQhM!eS`*KR}Qsu(M4Euxb9J3E>Pv6o7>iai&5-_xk zxZoB(KS$B8F$?NGplJyN-@SMx^w5P-3MVcS*m+1E#5wZRap0Ff-^7y5A-wNe%H~Y93Gmi{fGKCtIrLQ25I*?!7OaB)voPW59hoYzamd zuF2%=`&!M9E&x^yaMQX!KVf(WvqM`qe<7>dqoK)7&|bQ`g}hbCY{`DXYJc03;^r)S zf8~#frLR#@MrGT{1bSQXF6BacI`my?O%8 zx!Y8?8xpIvQXoPcur*QRWs+tMd8R}=fjwt4&C@+xPP`L(u_s$oglYfopP z9oZ^5qW(D2-ji0>M_+&^7PIU<;gAJzD+;`VEmEnxIAITb%Oc?`w)LlX5!SdD$!Q%c zSZ<^4Ychmdy55ti>^phOgYRVAl0)N0T0N~al$7Q_t{ub(uo;Q?T&=U=x! zR)+Qp9)?e~v#u+Ba6k?mzOi(J5y7Ppp(2jn-1s}A`4WN7+oJr%CTXwb{%^F6n)oT` zAvn~ZRoMNO>W&YGj@TF_Z+KLTGS!Y+l27a@d~PYYDP%?t=IGY{IU)o=f4z`jcjFVW zVh|-rfmjk8%XLdmg@(muJs)k6*{*5?b;U|=+9Gxcs(W_~l~D1A-OkYm8(3n`Cqu*? z%O{LT`pZDc1?1)5OOc|T*}I3URYSrg-$bCbD+7q+ZW!O!c{MtOoHG1T3tDP6LJsuy z>sX$xu2@=f*&unZccxe#ihBo1fmqdCrn~NoC*i4E?jeqGi2R247fx7Qm}?M2sGMM6 zH-!8cMF_#ZIzHc^1+RX8@kL_iE1?3bHXWsnY-1+;eEB2qjFo{W#)7Q6f7IAc^uHTM zA?3+Kwg88X3+{`Eu(12SfC{gwyeP7+Zl7b;JBTWrgOl*f-0#$y88-pn?Vyp`_1S*X z5GY)E2DFbPl*oEBrE2znv6?UnwOPFWIUM)HWn&9KULvZa-4FFmQ|?5x&yCC&vuMo< zRmFw}f&S`>cF<^k`$-R}kc=Ds4+-b(A z1qeVxhTv7{U7yg@J2vAW>BO?+#-|Ro&!C80%a*R@+mD`d_!i$|1xnePff=f|Ipi72 zi+*-)VYE$239Fp|R5pLWJ?C;q@`(uOx1QN{)^HI)Jy}dnrhUz>+LK9pVc5-kexNFn zDCG1a;o=Fi5sD}RoPC`8P9DNpm>2ZwQCeOL^y>GQVE}keZm$SjM$9|t%-PC)!~c4R zwAfaeP@e^(xMVep;NftFQ~9v&mUK~OIM@0vfQcXD%{ou+?sR{5;WFi=03?SYg@rc! zgNRkh1Xo%JTx7!8XoUqt>3(zSW$0`@D0{7}6fI;M!M44KTL$PJ0ZSs~3?Ppgo}9}m z(_E~YQ&Bo#bHQar906ONLUhI2rCmf=I~eqSw}K{Ty?H?r8*M=3Bi+xH3f#L4)l%-0 z2IqgxZ(x2l#5HC@(VE|1dV;|G>JJRVrN_L3A{trc{^5U|5FZQ3l@M{=FAV_PKI&T? zjG%^UcvvQ08Q-z`6vL7!8=gxb<3I9E+@R@UZC+X}LN~(mHKng&QW+8-5(BVq-BkexlxSaj6!t3B^m$YTUo^0VI~; zX}(RtUPL_GpiRiu(2((bT56i?o;(vBEy%M8-+TSw$2sz5h)i$!I(pBx@|>Vy=y%!G z`kdg*1l5gN``2e|C+2qiZPq6{YaM6MPEH=XMf!)&mZ%50`KxqdT)HiP=(x2~j*EP4 zba2rV?Ol;eF~Iu*bs<7!HiNKKiq2Od%m|Zn`+pz{eDiMy6AuT=Tbq)7hO!6Z7Ctru0zJSiU0^6Z zFsmF`tc0@r2FmvScZB-1kUJ%v&=KtE@Ajn%FklHAcV<0$Bm9E7c5jO&tPX1@wWF1q z{`SG0MtR+aYEF|w?c4$`l9+{qef3R-omU5qAeyd{^*~p}HboaDbQ7QGB@usr$`fT) z>59fB?zifPo63@C#At%27`=Utg~sAm_-3C0816JGeO#gI6_ z5RiULNxr*${Av;V{COJ0j7Eu`(d{vRE&5D3^*9A0{?k_s{^$Yt2E~k7w>43asWLP#>YaIUKHow>#xmS+&)~ z7OP)-_L{TYO9__cJN%wDs`rse$+n+0@_yJPsJ$%9Pi5femtedTO)JWNP-{zNPvkJT z>83v$X}!LA)4n(i;Ym>5vRm*?c9myue1DwD)m+84Vph{W)x@PUGUem!jN?g z?CFp} zGM>t$_OFXl5gxqTxDLGO(mTe!x*Cgh&xm`!G5Wq$ z>iEez{TaGtZT7r){&=!Y4#(#DMAO|FK=xT9SgN~MY~{N15~KI73%D!#AChUb_UIg! zR+P{mJ^_dA;lcY4;$s|$LE^RFhNSLx0pwwXg|SgrT(F=v2XsOAuI0I#xEx_TzJOw% z-rcLGour(dV@(d^dO9P0_NV-6CbI3B%4a((8VT-Y89nM1kkBJP%W?9opF@KN9*tnK zj-&j~&q8cAAROA1#H$mjD_AU;8F%%j{8^zv?PQrq%l{D;4M!>hi})Z^$SsGS^TD*y zO^~cRpA-DQoA&_2;=hd&c|{-RbZ)&u70SOuOvJ2iz=7ETOmI7kdkI=tTsI>C`(!*I z?11oezP~^LBy8kB;-;Z!w2(rlwReqN+SK$4#r17{)#@4oh=F2BVO!3>J@@?5xNQk7 zT|*1VIi^}9p=NpubiJ%Nw_GGP7X=d${E?v?)C2s*3C#jIplnFn&7@Lf6i~SFw-daH zE58s1n9(v6s{?ERM}_Vl;Pg!Gbq^7^V0LQ|loFpbB&Zy zz7W2i9m8Fii1cnJ)+*NYa{iY-1ta+&I`6=$27#BzO`>H6gk+p5i16?u8V_ydzq}}0 zMl=sjiZpAb7;P#)mpnNzAvhL+FjQ4dd-JBntzxqYA4D^r<|Px8lh3Vv2EEtJkPRNG z>6|1qxJa9z-_hM*kv?AbxOVN|(I-2Q%7~>Vb@;`C%W&z!-DfKi=je%#0L8XD|J?-_ zs-v`d#{RQ1N-!eSDT!2dW<(V}^QIql-a~Xr`qscxva4rRV5aVm(|nm(t;|Rz>dwkY zD)zk^Hf<3!w9qwpId4$FP|$22FKOQ%&CNaKEFa-H&uM60Dq)&^=vqiFHgOHX`ggKj zs3JTbZiUpK&Cr{{9n-!s3V)n8Sl?fgP%2MlmYxQt(@c{2F!`9GyHvOoM3qeU4yst= z93-VWet!hUiw+4ZGoQ+IW*F;gjAeG&qf#p2^r&UoLh(D>tFws^+Xwa_P)tX?v-5o?d^mqlgcV&zi)}+Wq~#P&Kf`{4wU8rx~O* zD-WUq3OevZuTOq`=LnwTeJmE3y2H=8e)iWmt$RvfEYWaVMaR@jeBP0a(QomBfcfQx z)$F2yrFI$Z`t|lC%gcYp-hd%RU^2DotBgcCXfBQec1uqVQAh7v39M7nORj}|gT*AW z4<39y@5pNwmP{T`KH5G?Xf~hyKz4G6+$Y<(;GwYC1RO{3?-(CxHZWDnmnkxd7UtpZ zwq?$;W8oX-od5Onz(9Il-yjuz^}=A$QSs%#JVZXm0}IQS?DH+CSaR8!YG`f{-(5t?QCvdjzW< zaaM%XwCy5|{tR^7YUJhOF#h`r)>=s89m-_yWgJUDx&5FK3 z8btqi&NWrZ8A2?)X*aZ8%|>~c^RBd_xNwGoOHC%u%|4hSSnk}St)kj}HrDA1g>g;e zku2lk;q)`A=6EhyAC~#Zew{ZYCrV)U+RgeKpYfq_U_w|p3JPRPL84OcrwHv@da}y& zw49^Ub3<-EYYMraF8*h_p_D%6sYlanGyS6dDDh}c+?ncix_?qv54kG|YQY zKa%uXPe))xQGwPL2Mpv|9OAY*v7NAV8ZcdIWBijASUKhlU9hNe^3x(od6gk6bfvN> zyM{8DGL0QVmw#fQYVb#_)B!)!dURD%_UFm#%zRFpM7`1jEe*!TUc0MUViQ*Q)rimU zz+dB?-+8^2!JZgT{6^)5ssan%a8`f+*kvwFs;b@RDg{CRVBuf%Aw{WZ<@0HM*{;SV z9uhQ1Ujz#>h{oUj*CelIFu;&s-7vxu8e(O67Da$CjJGUKv7ceQ=uJ1@f*n#Tl@96g zPd$~g#DoTkgpKh|d9m;XEiq9rB@nCVXp6zhG@s?--7p1zfzau2+T{tsw*5lr$LKCp z)hJmx5$b&RLz+`-c&G~q!PL$Ld*AvWTndIW(jUPvDyD#V%Hx5$zeZ#s{h$eZA-)Dt zK--X6Kt6QClc`T=awiUuR42C`^&x^u>3&X83Xb@m&4-qRl(d^3gOsx@K)?CH7R6X= zPm^Kgfe#Cm@V$u_g?hh4zLZNz@3va|h&n$-kltyC>@j+fWBw9Z1~kfdV=|WLU+XwH z3q$4TpclQsOtYv5$b;m<<^Ht#5^G5{QR>Exi@l$}KW=Nr7kqO?c}BYs38dajH!x?o zo@bRl@8%QItPZzj*A?@dIn1xmPindq^j$EbHf=nA;yDP_;fwH9bj@s#2j||QVD0ik z_TaP|jlx`Cv!Vi+TK)-|2_3t3D;MS?@xH{?e?r(oM@{MNRdK4SAoAX2lG?z#;3V;h zKZE&aOKmtELKHn<`ybJ>XoX}1_e}nYYMpJWgbXR?eiJ@BL z_*n!^?_BP(mHDzG7!F7}|94m!J($WkK_9Q_<%K*4odhx&AB&O9=ORiasbQT%i(&1P zwcLPpxhL}M+4~n!#c94KP1h{XQ^h{JcCIWL{Hh-!?9YThNQ5v0WN;tNig-tX`3TU7R&F2BK5`e-YS0) zunEhOZDguWSciWHyGtU1WAjJTpf!g=qxV7;uGKUdaai{&3IxT z@NTGq|0T4Wo#q4YD(+$Fiyko75BPCbiyrwrT^XW8lWDZ7JZi*4c!wzdg&cr!r*c)n z9QcqihowuT;GW=9nC8qOk))UvCjbLGdHN&)3d2z5rPh)iN*eEVf;ksG*CeWXl`RWW zQl$qT#W9>m(FOhH0x+4EAiHq)_CFXD{(WN9#XO%POI>4|JvWkW!9^1USRmu8bLD?$ z83T-y25QC6k`^uo0p1FJm}|M*kpHCrZmMhwyM|MM)S+4sKK6RaQ6m~ zo>V?!U_0_(UmSui^J}R{Wih?p&owH1?b}YCx;!v2YBW|}0E~wIy*@bR6_^+rDJ!DQ zT92;0*yCiFKtiwkDdW)wzy(|%bbTVNlqY`J)TqZaLE@dDyX8ka4& zhtk?Lx$m94z@-8pJSnwS1#i9&!&1fxfncBPcJbuIrCkMB|9de2(m$_7B)lFn0k#R; zztbh+*O8&j2jq@;?Hzj;FCpBK&#-~*D>ZU@OQK3pY$E*z6%tO1rFkGqLKmmP~ zM$q&1pqN+3lYu9n#sBNDt$-@Xw>#+HhYnj4`mKshSZ{jg<2EzBQV}t|)3`Xl*YFR9 zlpO98JI48sSCBj7x4}wjzfo857T4X*Z;#OZGE|M5Vfh<1&vSji_~M5Wr!bD>%X{^} z;A~FVxA>|-f(n$WJ%vq-P}GO@$1~>8*4FV`Slrreywe5_uV2VoOySqF9zzryx?-88 zD!Ev}pNDgt5>~9V^28QOCF&@l`TT&Zqe9X2PR!*%l7B;z6g16~M=fbk{ET_Q$)_yGFY`(DqHJm3&jNdhMEqL9CUHq~Y)KfQ|9 zhbr9bG#))FF%zDzmi1V48s1#CTmJu9OtC}8ACJ@j5zJHA=dh~VV(Jb?ZmneP3@D<} z4(@#3=fc<9B`?ojy{JZ1mW-#5eK{Vi%Zt}={n9D7>We6C6f9a53yV-Xu?3!g^OAoT z!;2-SL|Q`s>K+XEK>_5C&|i4*6WNeH;9b}`J78~M?vwj4_{2Ii^oNe5#;8#R!d1-x zPto;RJxi)VB{mM#++|(W&wU50Bw#jpF8pv_G5ydrtM0#^(})YAzlU_)A+JPrjttyhH&+zwKfGA zI8Rt4^23BAaQGbYw-4@iyf2$tGixCpJ zt;mET_?i&Q-VRgk=dOV(Y&nnU>Rc_H#DxJGTuT6Iu-1kzd@GR^qxP(+=k^PRwXiPw zg=MGReX<3=cNY{%9wf{{9?w8!MlI$@;?A$@R3sy;7xaRoMaq7 z@jco9I=df%;Csg?dLT2Q%e08Xu(BB%6HQ?day{i0Qcg_I>DA_`XOG6H`1rb?UPAvB ztv`tW4@Lk6Oj+D?O=9q#Q94#0_DNHA{n4)LD6MCQF#D{@w1LThTs}v&oN1c|aLy3< zVjv*!d&x*H2;m#l_2uyHD*$!hs5E+kOvb^|*S`l$QI=T#>@PX*5LT%|RH(!eu(q(0GBrgpOWnBng@)U#t&Qg^aCrYbYhn`q*Bd_bgVkCxBRce{SF3NF({gF*;4$(^ zv7h@D9UuYWm1_PZNxb`vi5~;vm9K)xT5C8D$+M>LRSOunYAIE0v|R?|>$NihMd6RSRCH`r-B`>{#Cj40`X zkP0f0Uh=QMie$xm>UJm%;wF%>&Pw{r*cOZu5PpxkU z0gE>wAy@c=Np(7tgL1L@7is`uZ}s9GC_7Etl9C%p z(9Q9z&rBx(7be9Bp0@c$OaKnpp>zzg5NVkrYhV(TCo8zFNED-$9486m52dpGErmja&pl60h%XX!<3%IqbV`v zSMfHLkG&}le2PE%n$!g5`x75C&$n_IH>q&}Ac_n~_B zfdh*XrYJVCFG)i@TFf54dAlkoj{EzWyoDOK)CIn%N(hkc%_%7Us3W*jqr}05%|D6J zhK?PdJY62fue*N9lFB+(O_PIV&+Y|j)nVqg{gLq{565|%N%bio+fha@#|gfp-^zm2p%nsV)=-Vw7Z#=-N)OGli@hj;r+@!?s3HIg17_q^8LYi#@U|1>od2e48TT=VTy$Ie0`V`Z~In{)SdQMW(%*g$O53B8jc z0Ju6cW4Merjio>8N{7=SO#LRrRn2f=Mr=xE<|qP0rMi-^Fd(CFu*>>m=OvAA#_8gN z2QrIoCG}q;ZUgNu!MctcvS19HKe^b`xV>iHrRBzuyxBdOzI0Mz=zRh7(nm{qL2mBX z`-uW#dV8m`8P+NZ>U#=}i#(d*!*!%r1kt{39p>VZU4qmc6lt-HJuaL717-mV7;)cr zBT9Dx+FOKfAtOq^ia{D@JXOgK298~$4Z*Xf>(@K+Fpfk%{63}yzT;8xp_T&_8(%oh zAOFEOu!=vB)yx3ywX(^VozOd$1YcEQ{T0S9Nvp1DISab+u6K{fc*ZpPWvg2s+YWz@ z`SL5I8Fq;9Xx7D&%~K-BfRILG8CH5b@S?`cH$S5X91xzqy5Q&m;VE%RnCoFQX$^l# zzQG6GpJAk63rv(plgir^+i7O?$Uuds2{XvYP{^+#t^)DbLU2dULKZ+=nL!FzH!>Bg z8z1qO;K#_*w|x(aGdKO307%B2Isf-J=ph4;J__Xp{9kY$y|CaeBH;G9xmK5wxAl&W z`~4^ev8ubtgjgGNFcX+Mn@S#yP4I-Ki`IcnKt+^1(C?Wy&(A{vfZrR1422AVe0+UA zXbBK5jE9d4odDDTtl6a=5SgXLa0PvLFEFIBjJt804GPRk;Q+`_xkZgd2s}8e+UTo} ze!u|JK8<%n6MFms82e9;-b+x;QJW6z8PC|b-ic2JYAplaRVMC)bWDm6Gsdg^@(ZU3 z`37H$TJb0D_K0(?S)O0 z0OUbqW^qE|zD#dc)Qwqn>s}}eR|lsSqt7^v`)9+z*3rKO$DkLd-T=Ao_mvWjdSu7c zi@4YnsTR1fLtZy4f-v;2{SBVQDk4H{9-rdfO2=iuAs{}iY0 z^N6KE6j!4*J+NU^?bHKl-H}=Z+Xny{JwP&v?~NdIGYT)B%_}h@S8}?{5DAtt@k-&g z$Dcn54tMg8Q3B5N7IrdDNH%{NF*9qZdxyz%WWne^mK!wm_29x&LEZeU_(%3(Ajzu^Neg8%M+^ zImnU<><38^A!c~+wNvaqS%*2A%b#9ex5dD%zYCX`wKzoYNU&_ZUs zZ7(i)ZH#epaA_j4wVaxT=BO-dj;@I5d7L{De7Fz!4YRrbGz7Wh0rAJdyKxQ!@<^Kp zzBTH?Nq-~p5kPPAzBS1u@Gj;7 z3G-7&zo%~dcdrJE$9m)O~(v6Y@Ku|X6F#?C(fh#^>{bjUzFJ{gz2m3fUp*?vo^#TN>o$hNB5cxCsO16K7r3+#zaTiHOd)OcG zHVGUdEIFf?s^bLDHD>Xbg$f_CvbdTRKkdzpM7~G!#k2(>f9B{IW_{@nHp%PU5f zlDZ$GQ=hfz)`LtK6tT`=Rov~jV%gcITRE!MGR-~@GaNk}=%@%Bcp{fmDz)#nPrF!8 zu#pgVu|n(1c|pyuxP)JI4f=oG^oe#jPw0HIMDWz|CtO%|^fHpHdxmb0QC*XYb=kdq z9OW*9Fu_D*nh>iK8_Uyk>=3!i*a^zWLDVFzm);F78HT%1qJmydZm1h8`mMH z0&F0#6+6BW?%837P;TybI-P{VYc)V9);frU1K{7{w*tf14v<(Q`QPsDiJ39%<*!)c z7Cs|?jEf7a}X7VV_J8NH(DIk0_?>^_k`i?c5_pW}RLtu0> z`-4YMmMMFd8zzO?%IIB=fS`o6Hc^MFj!fbw5}`KBPnKhs`A}JRUSZGm{qjXHukf)e zwOO>vQAg@m92quz?5FS#>TSo;KhLJ`0c`tX0ir*&AT}T-M-qnu$)6pNQy0C}$0tc8 z>}2Bqa6*#rHY_^wJk}c+SZUA2w|SE{FCN8jXyS?iFE=29ZE z9EG&~Mjez0WX%aGWH~^RfrJ(2ql|R<_GaC!wNB^09v>8FENXmbPcHkQJgGYK*#p8d zfY$dm*Mhv>6kptvo-{V}t1=V(YXkV`ysweW*4vK{W83SqASw#YGkO2ea-DxfktQ3+ z^{aCmK)-?56Y9oKGn@!&>%M^R(8o*)?;+}x7M&8({b9v1sHx4YU~BLhK+#lj9_2N9*mDSQB(U8dhSqN6e{5RkS- zlWh`Q0x`}5F5Ts0pthw~oD$Pps4ZzfJiT!=YlNqH@f7wG=-}DmR`}SnV()XS(v*M3 zlWq*P6{D4!FIoFtR6L9Ty9WZH*FxMonBu#yrY_f0c*(10-ISjD3?h6bUfF)8mVETb zk@uQMo>vJ^r+|=BCU!_}>FQ+`HrA}-PEqqJbpac``-^VhXdTw`8aLL01Xl5)w-#f% zt5viT6jf9hBLgdL?Ypt7*v_@_%B0Ct>j!NneXA9)CmcEa5osVbI=+Y9I-e5%zNs^< zsU`gFI!2*%_iUMjQ}(;R#?#k0aQBuM{AjUdhW5l|g%5c>>V}~k1g(nTu z*Y9O|hPk-SpB487*+arLno6C@m=`twi?O$kihBK`hZRu}R610;8wEj;R6szaJBRKP zM7kve1!+OLySqjtrMpAAn;`}U-e)kr_xHwH??2bI?p+s$`8>}#`|Pv#{```I@r=&0 zfG(e_#f>Vj4!)PyGJ-y0NGJprSml7Ny+cdR9tkiJCf-{xEn$kq|CyGADP-rP26_d< z!8ZEA^E74McO-6~4B}jKBHX}YFu|q6QPV|`c`G25X5$?5&-jG;XM9Q#ct-wrEp3N^ zTJ}iqXUggP2w?~MG|SPGw?`X={P#Ckim;Y60L;k0N$m7oHA~fOGxIg}X0ZUTG5BQ1D* zpUO!7nf9%FWMp~JgJ6%J>Cu|_ET!SJ{*=kCN$Og#Anw_=7~>XiNM^FsWf z7Zw=XSgG&=SZdxDnoA+emZa>)82eZY6aS$Kw{o%$470C<+#S2}D5C&M0X@e@LVY_eqECe~l#s8V&9&g^NKxnMXYzLksqp-Gr{X@Kze+&AVSB$uive6Y|y5?zJ(K>tl>wfD%*H7h)^f1XBiOnfy-TiRTytZ#xQB~ z2WOeZ6<2D?{>W~;Y(O2HqZ^|5Vg~+Z1 zVKxOh76S&57(_>q-$G7b4eWYYXlU~2S=n(~XBk0TytJ_@FQ+0{!Yd<~nV6!wy6W{G z3wx{y>)m_}C^S}9DVMJtG78e0Z)_a?G+gnU;B#j`>Xdl)%DY|SS@s>qWaN?yVO5FW zJ*50*#!&Myk9y|T|3pv$Qh=5*NXGR_5}GTO`DnZqt5fZoSpl>)HEKj!Ol$EWEYO>f zKSemn4|!P8+t<+lO>19pQLeLQEvc2i3^amT5L-L-JzH2*0NaTx^^jMNcYD;6T72kP zMe-maYryie(X|mI<#5Y`0(xD@KDoy@=DIz?nJ2U zkV-kJqmKF7)Ob}JVJzkL5FXC|QOh1Jo`rrz!aWrlrJJfgu^^Lnf#;u`*B?fyaa?E|f#7-p^lNHl8 zn!enLj^{XUt2OQFB;npwPg%T_U+iUOA0>M=yF*>@4SH6Ojq# zhdcaK?fT!{1t7+VxgKP>DG4R4DhV=*=~?5Ld0 z8&Y|oe4O2Lo*m>^FAxJ?9OT%$BtzHce7AD4;L@2I!pG1Zdx1z0<6HSe;uc8w0Fn-Y zujjUQ=2uSPJAX5SlD*W5Xq-P@?rfLSHyAAtyfez5ytC(gIjmXy4;N(9fQKJx#4FLd zK3So(Pwt{R^st4Xax6x?|0`?Rq^8mh45c;qHO6Sal=Q<|XYWdE2%81Vuh}mYB#VNa< z!1vEo3zb(t;}6~A?t4E}uN{A2Yh%CI{jIY7aU1M5clFZpLxUf~D(i*>tMz9I9~<>M zqgjVlqzYEkP}-oTxhi54iUF<{b(P+Yvwh$5%?gA4Z*{UatfHLmcvy|1v~r>&|V>zs&~|TcWrIW`I}=;HcJ3W??!Tpq+#K00(B4Dj>W8ng@3%smruz4 z`BpjH^$l`E|7(p=9lM&wBJH;lkb>@dZy_0QjX=ZC>! z%s_BQC(Mshe0%6UcD2P;r99t`r5yQkc9o$iGkcnYK#3lg;hz>1pzyuYDZFY{gCT(n z@~}YX_g*-Eq*n_IunUwoQ6B&*ZPAZI;gECqX3DM5QoAeuB6y3@Q1BuNNkJ&HUZkcBwlg>5W^ioTI?S#_#44Tnq@i&Cksd#m@8qx#_<<9cRM9e{ z0Fz{(85(!Hb6JS05-1BS91eoFVUPUOu!btQ2hLnNgHsDBZA6P}i-{`_3Iju|G9B8*zJ7le{iO-Cot#kMy2@9eiC=4c_0@ zsDF7eYH52~Ri8`de=D@};olyvo&Q^`|E>PFk=6e;eIzBVX42uHOc{X= zVE~k3wvR}xcV>cJ+b@WVUJU5?!b{4{Md}+hhF@Vp+ZULi<~zcE!2KQeOws&gOcXh6qGaj}7UWm*pW;V?$=|G08`5 zQ2D3*sL{Ww0mvI;?B77STj}XBDh*bvT0`MKUOt@^ID6e1vmzc#$bDovP343&MdYkH zTe&qVZ)@GanwNk97*Rp5DxdaynNMmK*ovz(VWVo>5lGZm{!ql-Y<NsWCb1%V*n?7&LKeowLu1Uz_&ws|t%sj?DbE=SQ81if{ z?Uy~scJL+>U@vsk>j+mTc8M-C>3@mkn)}_3ZzXF3bjh|e=d4u@gIx+aUDKeJ6bDHD zex9-w+iZr6i~23B2ddhO%>Q`fLu4^>4-B{V1bA+6FIiw(N_4|ZeoVJzE!xOIp*qI8EUH_{*CWNNfqHKA5y6RK&ucA_(_VODjD$e^ zC-1>4?3tTKav}l2-~EoZj`|92xDJJiwbwb!KIt+|Y`9^7fZui2YT4b)QObo8_;<=M zU{MJQF5Em_fo?Mt7VK|47CZhjy3$kd9{Uv8qLL`7y+=dv2?1u3UK@aY)%mus0Z_Y|hXU=_-l_Ixi9h=H+r_1r~SSn^|_|^(P zE$7%NTS>sk$FPI12wH_Qw}x<*ogVZ~51h7JHP)PM*Gu*Y?!*;Q*q$gJHE7hsPM889pl9Lb2~KTM!mFcS>D*i0-$))36~e z$E*T4w?7~wn+kl1N=DB=wn_jK4PAKh*H;u#6t-*ohR*0eAYUMcP@uFNP_ZmuCKjyM zcBlGne85&q67Xp+(4`M7Rk1EMxIn0ux7VitHtp)+=>eGmNf53j_SLof$q)U+=7b6$ z!?87E_0#DLtOyF*{jR6f5&~XKU?-Qeyj`gs9VR3A_|A-8We|{i0oA%iR_2!}aKttq z2e{5o+iq7Iqd{cB0_3uKgUkuOw&J~&Ga<*k;(pSYQsil=#7xER?(tF6W-h(4Q$=%F zl{BmB^>!K>U5A=+0$cKnMe*yKv)pDc7PaY73$>K6oqqkAE3ukBZah-j(tN)rYTLGT z$??PmV2i~ljZ4!kmy_hPrNcpKt|28&94B~Lrr~aqmmjy6kkIpY&tGC-9;90t zxcsdE3zO;+)L;Wc!v{T|9WI7M_xJY?vEdJ`8!W4gOkSMk68Hl6p-tM$6AHGCPW*~@ zsKji6rtf*s=AYT@ukK04d(T~QOKb3hjkjgQeVC7;Gm*8x3~5&kBA^S9xK;ytK$#Txy;XS(a9V4=!A z`KgZ_bsYjAI^vt17-|kPHUsnE>;_XDPq$4@ixJTorN8)*p~@<(!BT_vvL8+KCYkV4 zjUWWgO6^~h7|8M@eHQ|e6@fvW_?FrlabSL7Zw z5Gs5{1@sXOSW-2iTmbCKx~5h0QS_|2*kSM$V=RxBYwdewr*1%^_)gd>7FEw5zg=E4 zmH-lDI3lO+_FZgoJ@9xW_^R(*l{<>Hn`WF~=rMZ-t(4`P&Eu}h7Hh4&buaXAoBs|{ zYVw@~+=TAOScfQH9jJ<){iSBU6~9_K{fvNG@JL%#0oAy_L!=8I+p)H@!bOs$1iVOwzK;*e!j^UtV9fx+yC;R4O;9Io@m1t33j;X z;7wYtP&_*u6F7UqRv0#{PI3CFwC8R?pX>Qv{ZeGK(X9}b<2dmbi?MZN=u~K#-lTuV z8zBm$2PS|;G4?O^x=+c0{!-@1pv$dsh4!Q^Zo z<@huY3s08(j?Ggc#X9h>p51Q{GJyv1K|;v$l^zfC#)bOp zQ~WMR?YlViAJrR`eXZE*7xk+5{LGQK>MbqNLZKH%pSd&o8{OYH&CA{AH!~=zgKt4J}Fk_EamcheCz`?eWx^2b_Pn&V9ch*K{N=Mq7Dw^Qn$a zk&M~!s&Tns(*lo})+2drwPAo@16r2a+4#Mgm1o^X<5RRpE&g5N9Hf{fGDbS(Ev|@k z%1;A^3>=_F&U^mt$^ob}o-+ZMc-rQ-ptyoj*{TWW_i1_H?RmVC*qqOgQnMMIcz0UL zd{i5$kEow+^n-VRV#hoE0#wV7-X5-} zMgvOK5g0O=kgX1_oM86IGR)z!o&au%W1jkIU^TdwX-MIX5hw@Cz(_GVS+>TxI9qv1 ze=?vzsY6gVUGEao1u2rPu$(00JAzM*+jjNy&tp&(svYFtAr)Y9WG&|eB#DHKWH{J) zJXkk|?x!4XPb(DWZc&tAOlUj7xc0Ye4}6YE9=m3}+n!Q$zc@8kt6Htsp-}gI2ZifZ z8yFi0&F(}$&P=IPx9MXr30B*A3vIdasY)}#sdAB#N>7)Gt5AsM+8-}#AFgXXH8w7j~XFs77 z-wMT~6HF-_cz}MwOzMY(2uEwV`9-n!i%FS(bC+746ddfRe;!|jr}KHK%gp5bWclEu zFNf5%;;kQ3nud^~byWi2x!0OMA)bvdbs@+i!a&vuVCx)Y6@jTI`@T*#Rr z_)zn%Q%`Q;Py5lGySH;&my#{YFNal_4G$qQwz5n9#-A+nHZz&{xJY@cFg-CAr4+eCL4SlXY#_pzTQzA ztGEgr`e*Tqf7D!m-Ja4Jy5P2Cj2o~R;V{HKmg*>j)S-5C+|fdcLM3(vq<{}k8}j7L za4!#pq{w6^Yqh-0I5LuU9)u4hisE#jpR)>KpIT!c{njv;1falhMS8k$jiJ|p za3PBlx8E2wO#Ay~8{1oUVAm47bm3y>G6BmS;B+Z^h9s4M6~r5W;ZkwIyix-#4z}OJ zzt(l=kyr9>!Bpzpj|#VMub0O#Tik`r>w#h23+Nj&aQ`PV^>fcYF0rGVqNqR|M+=#L zT$HL)Id{2uQXw%qp;=n_dG4BT8iDu{#eQlCKO2*5Zp96a%BZD8w&7!H1iSh!x4PRY z7yOWvVq?_0FX+v(g7YP?%9{0MtU6MYTs!-g~1iSGfe|b+uE=)V&pu zhUwoqtfHlhj@AbDUB{<~gO@*VU!u#7Gv--0n2PER4+yI_63)Cw<#Tbc$hk#08{~(a zmNZzrCig4W&Fz(7>Tr=DMQActSwzvklU=$ z{B3Yuqx&e3B|q$-hd0v|-Swa0Jxm*1+yR-l`**(peBaGT{kl#F7_B~9=kDFr7|#7; zLTtPTAe4NOk5K&WAqQ+8M3&Y3gXc&!{?Pc>sz<-MhHM(-@VBJAzbDV=zEJ+?B@8v} z)8kCvVFe)S{7Cda@B54xee`krNLlrT!w#?u!7}d>bjPIgbGVzI>LSe5Ykg=B^6Xl2 ze4~JrCTaWc!WpRxo}yt1h>ND*c9@A6Ab>oWP%9UU&87F|`Kye9gMK_$H+>mUHc>38 zv2}92p4#liXK(sU6F~=$$M3qr64-#B9>2E2j6=f=J;9K# z$KIVv!={f(LkP!|DSv%_`1Iqn6&B`)ws&(3pXcMD$Zig{VTU&RFVM>SNmHh%RKZ}; z7*4(UbqR)@Y_9lkth)=A%CixfRoG=E|RW@})5 z(V`f+n)cxA3W%Gh{p=Z}x}uA(ot^~%?I-ASOLG*zpGgLglv%(TQ+&{es)eM0pMl%5 z+(RLeu>$caw|Uqpv-&y;BQUy^sO{59-Fa9JLM6gn1}z(%VPs$7I$q8)EbpiTNOBql zP(I=Wum)^~{#Z#Ibk8gs>64IDk6o3yu{qKNkSMY!)9*}il(Zw&ZlM|qLI1dLPoZw` zA4jLYFb|aiBi{?U1c z0sEJ&{2OW?aii;&EuuSx8?+w#)Vis_!1C(lO(4qzzKFbhZuLL2&8Mc6eAFCeE{EUa zC{l=u6sW5ifNmYCmG$r71IZZpH}=MzksIRRFCcBS9giRk;0oBBE|Uv1k|qL*-AL!+ zKfV!pq}$na3oG(dKYdWXVeacfxjn#){WE9(`&l?94B#((*zu;nSCIhtZ32Ojlra`j z;`Kdj`^z7{w>K;=fFw-^?fT&DX5hFb5V=^r!3bXEEquv3p}+@%|gM9ad+8CGkYHj+wv-tPghSz z=rgJrZ@{M7X(T=rk#TZxL=2B~ZXz@u&<6?-L66PiapSoeFYfE)xi>?wKpsj>X| zvZgTS6~;#Ys!fqWQBr~8Jbt`!wKCjO%>zQ=3AqyXht~h+=Lfa1?TAmn(PkYlM4~sL z?dE@IZm@Hh1YerDM#RQ&HPYB^4D|x#MU!Q1&3*>U3ix%=vmjq`zze%TrigF}mnEHA z^d~%x(&a|Dki^GD!K0#+3d`Fgq7y&s=Ln0-pHmD_)))N8*3BK0nMk{)RU6bYhXn8x zk$|Gi9I)V2M&b@H1NOMr!);_v1}LeJzL(37mBn zMlmE4CW_-f3)o0|tS2GKIi#Yr3-mC70SoB=Q*!HI2Rsnz>A@NOqC3AjOg|=olyd^n z6cD*JJ}<{Jg&7Fn0Asf73d-Y~q2=0HN_`Hq?-f)%hR`q`%syqzO9=e0@8}OIyb2is zLog@NA&RdQ??e|lq z3EPVKTjp&=>$%ae#ou3to!B4$xH-YJ#QVcf9VGLV`C#FUu7jzV3?NhOoEGJYgdj zUv#*Br__9vPHKH&;IHst`Yq9p=r=2)jSOKxYqdt^{!c@XtW!(ifp*fKOz5EgR>={G zZn9s^t5mYtLiRrGfEFSID;M0|h*$MiV4R1o{(lc+O!IFR0BqfD z6LiY}hbDIL(Dfx`qJb4=KjG^OS|{MM`v3O%C<4QeEmx6AAjr4?BI!STvKT_hvxfG? zBJnR%Zy|h8Y~^&aULj>^LP=ieV6{1ZHd#0^h`TH~emr|0bu)j`gna%Xohd06p#H(d zYzD)f^f^i24KQZ!g1{fAa5_J(KSVLNs}Rt{5#td6uaOWK!Jy-KxJ`w|DDUk5A2}TIh#;^0KXK!GWN#{~zyt-(f;+?hoF9MU_2~7@XnleBcs#6^k(xE@bcBK5<-pmOq-lI4E-` zzI1F0nU(+yGa!qFCKI&HljZWNG?oTD9?X9i3(2;#>~@dl8urAE>NfrSW zJw=J{@RwWvy%t3oY#utg2Qd=Jt(}oi1C5VR_R+08mwxXeo#IquYs6<&bLn8+uSm?E zGFtv?e_QY_Z0V-Ppi!9po?(h|=*NmRT_gM6b3S3bw&MCSrD?y1$_bC3BzX#9AP00W z38R3k11bTA2A=H9=tfHHaPVP40`UhR%sSL5KAKUU>%wT%`=+(&Pr@`Fji?Vab3${w zvhvSC1B!ny2=nXi1Ibg8z|9;ykt64HgE_vp>}nRPlt`XrfCvZ}o&pEeg53hk?>l~V z(anT)n&6PdHDlwU)^xp^)>JHC=q176M-MI_UM6Loi2Z9BrwK(~!~Z!q@5?pL^{C?n}ZEAslkJr6~jF3GwRz#k%GaI|POYHGXdSYj^?}(%aE1H(J z%ERyJr)A4HQrm}96-{?FRu(LYBDg(9$!vTutX zi1Oz%gJ=&VFJuFFAyW1H9lU?fl|CSk)pHRHzx&(J%9l`9J6Qa7wO48KR@WT-EBluIjd8Z$=ZVM6e3J>-8T@iOMy}@7@Hriafry|_8nU56#2E31m@7yUf z3rw+`l9;cy-0UjqlIx{3K>E*{;;l*#Cj#Wma!|#WSx~+iIf(D}AoNXaYQo zO|pf6mqP|*fola!Yv%Pz&$fB?_K;_rNU_<(Ts$>dkTTdb zB25cdjQ?!-TVHip>EI}?BgG&6KFmv#Bei^ zprV;79aScL@5;34HG#8hIm>oaf!@EKUKG3fy=yfF3XB%4x5C3j0pK<$o{J)MiLLUx zgSYa%(a*UYU92%&p$rQJp_f$&UL^x|!Ywlu@yQ7<_rabl*jieFHsE~H`kTR~Z}f&Z zUcm!;{nk%`Sb4F=)2paEMc;8 z#aP;Yd22~UJ2ErTNt-12UCimZ!a$u<>3W>>q%-!ei3fY_uOE9Q_8Z)5gDcOfHv}(p z{A)*gSWoP#-ji(XGkrX{zqRLRu(-;ZRyIUUpZG3ClT+7K>t3iiwQM%v8-bI*LFkz( zCwNF)2MZRcRJWV)L`Hm?C)nRm-=rmNLlDsQd?cfz3m`G2%M#Wp^aNz6JRB<10#U>d z{qQ@6=L*C8FCP-bUV$W{$yn||!K809aU}2tZ&HwnypnGSDv=gADK3| zYcQX7GDg=69!8DIkv{9IN&eRFN&fVzA7y6aiZrY(d;An5_h7nz|NefDMkx(1FRwt6 zSpsa2zH_Pd+eLOFtk7eICH2)k@Lh(bo>GTMhYDUiDNrqZWmGx76g)|NiO5U-R5!L2 z1$2|FKtCIr8vOiag1fCX1rHA5(x_Yg^fVJUD~Jw*gZlmFc)-kqxad0Iw#Rh^N|>ixc^kd6AU@MhtGe2r-5 zolqcudG+E&^5UXF(6HI((~FPic8;AC|tB>-H912bHNzTHsx7+)LLsL@7y;4toMyC=HR=1a8h9v{>4 z-yv;Fe{jf1pJ*FwFa&R{=Wc*^5)cwh zSxy*0c+PjF;nhw~rzN(-qj2}i09_oP~^!| z@E5O4VY`mvaO?`^y!?Ha zi}APG*>ed;Q)MxYp1BWN;#6kQ?`2S;g(~Sd_I>GxtIn(4Rmy~zAe=}yr6ve)Cwb?do$7IC3&^SyvJSpWZ#J@znU3xk8{SRS8*v2_}A20u`RpR z`td??uWT6s=D|b{38oiu~{P_`}5hbphCGYkAN@XXa+A!)(YXLAwTSD*SUt0B@B^MV7qH%M3qCoGYT8>qxHr&3Mw&9rBF9g6 z8tAyUgmJU$;@^(=HV#WYw8eJ%TW}SeR!A#gkvhyUV-m8BsL*OZ zyRWr@^wXfF!)d9h>KEA`QotIvMJ{mY(;b|I9llihu{aVza$jx-&#NWqK4Ab^G0 z<<+pOxeMgntzocb4Qs4|_4D=37~5Z7XdlRo1h0drC9zvr{AwQYS)ON;);%M7H~S$W zNMl=}2h2^jq1>VxdbsZN>4Lx5?d;y^+6t`knpqiz-D&l@dCCO|Xs6FH=gyKnZnc8y zAPm-_^cj43up9Wv9#MX?kL#A{w|Z;rdTK=klP>P4ctn*_%FcpH56Z%^Ia~TRklv=?a!5gfc_1rM~{dQztG1Dvet0)i~*gQg9#@oWsnY(mB3OHH9$Q~2WnU0g?@xBIgAW~{cufZslGl12!yHm<8b z$wU$yFPrw^8!jrZ6ZcPq2kKp-Pm;_Wl~)6U*86wNZuTn9gi!*i%Oc-WnVn&0R6bnM zy~-fLz{p6^Tpbbvi{(3S$Aj}6lzBQ2(w)7g!2aTXLwd+3vG~LM)Hd$gr1e+#&+B;| zuCNc^77y4P26`1Jd)vtBA@@v%2l_k+`XXIAkWFL+)K%?OBezDHQ42_F? zm3WVt7@&Gwc!^b-c+KmW(1YRcIHN70LOyAZx-Yh+Eu;=Us1JYWDFcyq2r1PTOfj*38sZT7kSIz{b! z1SRyc!QpNFI@k)^zx1GERX_1N7j#*w;@iIp_n8uXbn;nUV&A z>VtH4D0Ea%MM9bCj|+4fA%W=VfqpYM;^Mt@mvwkXG2>C=-4@^6mTLswOAD?Dl$Ivi z^zv5XGoC=#Bo3PB(X%M8;oPSxiQPc8ucNt!GcIXkatp-@-I1Eg&Osu)RpDq&;U2%R z$a^90JJ`DcLKGqfl5IT(R#PAD6koV)#fj<2-bZ~W^xb*+PP(P0nA%I4a!tw!36VD} zqED?QmS6oimiaOx9G5}T3D0Zj_+LC>LlSc? z4GA2VCtCgC*>89_DtCnB%GVk8hv_&dsd7bqohh*KQ7NdLcG!(kOBEWmLndX1{Y;Vj!2M~$uY zEzP{Wc@%mmAL%T1j^7k@h=4HB&3@BEOqu>^2QJw`5xEucg6}8qPW1J(H%3@ZrfLhB zJDON2qZ?jwQSDy{-W%A(2?^2|EwE(PJMA7^s9u3&kn(z@>@Rip&-<1(FJE4`e1hL4 zrb>Vwtp^QN4@yxEs$FKH;?x)yqBW;*|0stg1e$MTVN1RL?$gxFO|taltDz_S*QsRm}RZ|-usxs9m=9Bea^0?GWHtbaC@Atr6+ns}o z6tE<7C}=BayvX?ccJEb7TpWpdgDck-!c7oyx&nDO-zEFKO-kUzt1z2 zlJhSU2LgxdG4u@x*sKFvFl{i zu$3bxBIJ4Rys@PL*nmh(LokU!{IAA)+27kgyqA2Lq+J8Z!PpHqsYFK>i=^x6<_vvA-eqlYa(30)s4D~RoupkU&6>^Z41+mf&`@=fvzYd$FiH_$ zM&(<_d3p+h%j6fZ8M47*(dHRIQlSyzd-lb%lFGKj+o@TO*p8DEztkrn?>mSgc6zfrY3Pr@0T<~Rm^`~TtoxgQAx&1*f z*4h57J|ywEnrrHp;s^?>+o3X2kxb!@CTXj5-4s;J;_K|!amH);hvh|#PAyw2?JUB= zOYbY?sd}|yaunuf#i|r)r_NC)7D*`gz<<>dC3pk^FV=RBYS-oaWzE=g!vuy7s^x1h za`ulHvI4pmz`N`iCn~L>&wQQi8s0OY;jx8yxM7aDiL9!HLQDT0qgL+*AmTs zDP~>A6Z{?l|0Wz0(a)G%kIf1P}sdkFw%QSOF+zhu=W!7)~CvUAMjDt*_(#B#qGi2>w;MzMBT^q{| zIv!2JCsiXG9-elTzmMrXSy=$y!I$}t-%jtKH4>kEM|)l6NkeE~3YIZK`qG(D>deef zHEr2tJ1<1GNB=fr3%sD_ykOsb-+r=AO+T}9XrHVjWfOhQy-RG6?(?dT#Ljb4g@kP1 zfI6Fg`8i&A%owYn=I+*0NQXZ|Uo~{6$rdLjeb&cYl})1g2vfJAYy9Hb{^;ys-}iGv zi|xx6qQtkSLbs2ZcXBmGQP-!cQ!PWb+Lp@Pnw`s!$+@s_Oimwa$>PM2|VnIXZP3L@4FPgyph*u8@3TqVb7UvJ(;)4^8=ToeRs&)@_DT=Dhpr0f#C}=5dp7?D4TZKsx%MIFh7LowN;-u9*p?tp2 z2*2{4hcOUQt-oxzAPxna$ z+X}5PTs#?&mLVuHKGfi5?tIp*Vqxk)pAgv2BJ8mFj?;|27r5f-UcR#|C02?^ZGA1~ zZm~qgAtt9?Yn3_{QTVh$JJq+c@xtjOfOu&Tl$7vr$zyIa+Pf0G4i;%y?cy2}<3A&F zRk9(MloeFLR7|9GWNS8&g3B$&+3DEX;m4nRJ=UtCA}oRex)3(aHm5ibALa%GbYb0j zVm6?hM*`6eJn0+l=|*sl*D*VB2d`n=)PxrDe}`L$%C`i$^W=tpuVN8-Ep z&y${f>Xcy>S=6d^$J=gUA8S21FO`_*?~Ic3#PgW-U!p2`V!3u_62Gh8q%J^m71QQ0mtX+Y@4SPi>)w9T9}7j}Dwq$lT6PZtp#f?KJ9* zeKl<5K(5#{IBT*!I!t+aNxoBuU@FI>I(KotL-J(cNTbrG@lB4+w*&vL{98n@7eaTh z2ee~{4r|h9Ezo*x3}#};RFS7lk>n1NQSD?=@@)x3-1*_5`s>$JWiIefK)WoE-T&s?skU<`&MbqU^YXxJPyB(IGZ>MIh(pbNW)hWMKaGK0E7hZW+nJm`oWmpMiNnT=Bj(hoKn`tk=Ts* zO0f^C_xLilIjr(3=w)54K-K1A_TZ4@n7+VJKrIoQCceRs20a9!_n4-}mj{9fi@>iH zmp-B`DiAWMmO#c!Db*l>&9<-sTRGsQnwS?xm5)gf3`b3_Ge35(*kKYoZh%^|w{Y=z zG~&Wn7uZGaxLU)F;6y2DEN}baWF4VDjC+5c%}C%>rx$CwnNd<5G%;({Ok3+W>c2%@ zRnCu9KseirsErJtfVWdaFE6UFIz1jbS)FS%rq~pxR0b+^cXgzwXuC}wJ@P8uc{EET zaAv^-+n)ZsU46zj$wiqDJ3qxt$zr+P!ubJxz+vWOD{NgnaepT|q7BQy=5TLpjF?dp z-*%-J^2WL@;aK(>(K!=e-tGxrZ;<`^P=N%*buYQeEo!C6c36FmGUfffU!&Slnbh>aSK{dUPMAKh%>HOj7#v~G=PFi<3|`4;a!vj zTn13>^!Eg(47MjFM>sP-lA{LXD5wlGZ&FaX)F@<;OQW7tvK{;)XN%s<4zS>Nh>|Dl zaR|VsCI`1E?pDu>?+&Qvv{VnRSzkrQl> zhwz6xAGg%d-7l)?TkIegdlw%9LA^Lo10*f5yVWOqkn$;!J zlbxLW1fl;IV_yLk<<^BQ;~+y15*9HG(xoU}0}P>bmx>Y=UDBP>B_Yx&AV{Z#5(6j* zC@76migbtYpBKIN>bL&&uYWDpy|ZR;-uFFcpS_>`>}PMtiTbjFNIbCP0nR;{!d}aI zeDOkdQf(pBt()h<CPV ziB0v|BFtNegFoV_NMNpP3~F4R6*6pHxkfqR7+kez;cF0#8(ki>lzg99S|WNuI;?dh z!{Y)-&XHVf;r8w zWi4qVDA0w$5ChP|h&H#S%OF1kGVb~leiq1;7>tyxDQ^&SFm60Xrrrh>l@?4p@SIq7 zqN6X=M0-k&8C`89-}mmRCct^x9+{^R-rjR?yW*QU6;Ha^O?s`#!cAN^SnSJb$aZ(l zOz9-B4;F^hw^p&T+QB#?S_N-!BM8#nwdJt<>e@Bhq*_XEvKnLhU?es3{CEyd9tOvt zUP9@Ayrdifo-TA-Xg_x(LLA(yjCC(e+yva%qBjk|C1Zd8SEt$kDc^I(eFukGl1G zys-FqqjS`*RQW~R!sB3f1>`+~3FJND^J_&(0~Yo%X*k&i;D+B1sETv&R;6?=lwun# zI>kc5w45vzQgE_2BA#|i=d%VqJ7+`?)5`NWZPz1m+Qfwe-CZK{JS{_pJ~Nu>)JW#S z((vYmS8NLD{f^cQDf*!j*`r$FsH4SgG8?TZt2-@z4P54^K{UB+fCLJp69m@<>L~a-+r{o#2szKMsmxvWnDG{JLgT6) z2KZrdq`(eZ17S#nFs$)(^zNO&4en%ikB&$9vB9rpaiay{y5v{bM5KZBU^KzC_}d=$ zU@%vpS2B+yFsMn$qTGq4t-w34M)&{%{OLuTJ;g-7?F<8*^4J&3YH}~0gqDxqDM=m6 zzvEZuFqgtF7J>Ynsm+?KP;1$JzRi5@qf)$)%+c6U`P?eS;ERmx>S}<6*+Uhgy$jq7 zGQ<=v{RC;JCz5xa*TWO?O@fk}%-2e7$Y78?0qUE#m~+F$?*!KL1`#Tq+o!1MDD%Uv zedpeUnQTY2c7cXP69M~|K||_Y17;+JK4;9ld?c`q1zX)xP%B#t2!2+&PH=ss;W6-N z>L@v^DL&anOmhjmEb@>W%V8v=e?+Stc0s?E190AG%^8jm_ewxRKD?GekAM^S6iJfz zZ(28HjJ_pl^9P-L=`}5Ha7b$9LE^c9{WgQH(RxGm4!xq9m8jb=*^k!w$L=m2GR`y4 z7+p{J+=ha(-XpZbEX0_+>X*iX)QidXqONM>y;M)7D3^7AnddLW3bNu@J<2v92CMGq z@RnAw#X0tonLM%A`GO^N_k?ZUJtf_USgCuo+tNQ`UJ{<6!K{cYUl%v3v!D+5I+7_( zr75ZGwQdG%r+SG5`Qwj2Wcv?>?S$n6>4lu*^eO?8yK33R%9Gp~P{y6Cqmd!K6mV4) zJH0&1n+rx*Nz=Mb2QyxE|Afg~7kYF6hXADBtko+!!kyI)x&G#$J<-M9o3qSP@yaWh z_;+vLWO>b?dL zfc5XjwNK%(cpWlA=$uyZP+miWukyjr$N0*HxfcR`nxPUFbR#JT`^%TV3*HV+TnL}G z9J;A+Q8i6MQQVbu#kp8H`D!LP%d5isc{Ac#Ja-${2RT0!-!yO2>p9(sjGp;=k<}>A zDB%8P`5cd$Lg#Yh`qQ0#RLR1R(O<^9gh#d85J=+bP4D7dW4U+mvLo3#GLQ5^)u*-5 zlzi&wMC|InW#E-%CZX8^xz$5*+v~;cm~l}Nmo$l(T}VT;rH=&qe#k1 zGBBuOl)3RtJ|BQef8r-n&Af2F?Zuo5e$KWa^68UuAD_!#PN~#>zkL(kmdLrWY4@ zt6*GQo>|A@g zJtjT;(zcL0v(zKVNO?aD;Oqx!FBBqwvwDewZi80~9=U1D*4DT7q(}~Qq9yhjL$ohz_nE_?TeDXIJzLMd_?VpDP;k29C zdg79IUf2&cR?R;%*Wu0tqLDhfc1j8tz(RiOW*=xf9DV%eUeB|fCGmAr6{lzki0+`9 zoqv-`ztxvJ6H{E?_#^9sNa0tG5c?zZWv#$`Rx$p7l+EGN%`ozIQT z*^2s~F~qaxI=s2Yvg^Kv5Bdlq7k@;_S3P1G7BQ#%?jj#aWVhqza$1D=+48IXrv=Po zt_w%c#)m5Eg1WLcB#uTYKUAysy3bYG4(Pbfe5`JB1p^GzZI>IDDo8_jc*A0r9t zlMpaG428&Eq4~abWQz%--~Srf^y%Tt z`3jpurI6rDpVoe;3We~<56sBCuyLJiX57OfK{LA-#-c-Gk}@(fyH_HO<$53ObGzk6 zNsF}$3HJWuS&M~sa{5gN*-C99`n#WsjJQ3sj8xqJ7`%S;$b^I zM!K+eOSq)U-X(4@gqric@A6$C%csf7irb?@T{>V&baLnYtHb?0DgZppP*gACi@Qt^ zkkjQd$}murFV)sFdTc%Ci>cJo-}Y%=;IFNnwKN=5vnX1h&sh}RO6Sxq4!L4jbDKrG=0$^Zu`GkJyvm_o zg|o2ov$!)JZlB)!TzzPI%fXaY+cEaZ)2G+DJQO=hnk-^fh&S}#yRl7_>@>Co89Z=I zem~oG!BQ`gPI5^(&wS@_KV{=}Xi13KlD}DAxV34q!K;XIPgdT{l6toJHHiZchIoJn z28G=skPmj&8x-EGRpV!8XKQp13YL&YDD_f&UnCb+b=oEYFrzrt#l71wvow*ZOWiy7t&c41!KEm#(KQ0;5mC#OprFCP& zGW+7Lvk(Eq$$6ir5Ef((;PV{6_S{^DT_lXnE_CODmDRWgWS8EU77!zNgk&~Oz*?kH zg52T74I93197t%0$JSEqYu{$@@x6wOeYtAn7WP)1Df-JiOh`C7f zNDt=Q5_s&tOIS00*WZmn-jPe%e2Cyf3@SqS?)-l1(m}JBiyrEVzF_`=j6MI$pS^` zuLHj3WV%aUDKE>vHqdath3kg(Si^NaBY&Ct?u4VPh!oeyyA2Etyt{NK>1nNE2Olkc zQc#bM=1I2kzaF9086?{0u~5Zu|Lv!S`9kqJr`%GLRQq9&u9S&gXP5Ud>wN#QrOdMc zMYUGyx_BxkdvEBLM>Ll-c7RrD)^qnsb*o)`e!WvYJN;UvV+UPzs9Dcpl-JP*EOu5R zdm*WJ#`khw4wJmI+vclq1I255o+Bbn}g}n4~zRr`o?;PCA zX?SnPAUB<-!t*=0tjk;91-bW*dNj@T7_v!V-&l?kwi|@t#Nr)Z;zXUsVaZA_W?fe| z1P#u2f6hB-T9XF!=CkO&xv;eNL%FX2Nk@lS(4P{LlPZc^sZ z6{FSl8-o>iHl|Z zk(Jex${((GxZbupy3RXti=g-QmC)W|vRYIji@_|YBP4;e}6){x?25A$C%{_IS;a__lYFP?E#UfEVhn$niDYW6CF z$AR$PVzsz2Uz11NFitYZ(SH0NoYkNwmOwnZgr?}e(3KU#qc0ZJ^@N*=SLazb(-r%c z*>FyFiN>f*GS>FS0~X8AWjEh?ZA4F9byiDFXS<6#d=Kcb(B369e|I2_YL0ngmMiZq zA;q_`iZ<2_0`aF$ufc8ht9ts!gCTYnY-lR)qwO#Ac_|Y2ZFX=IS8d)altz>X4;ySu zS%|OA_ZbS7m!>mo<~M#|wmPb>%=J(6=7kC~1(Ih{ydfC5 zF5D#&y0R;)bF_K%XyB`=7;lw5tGFT^kdFYXbD>vEc$-u9`VIb?ACoSt!;+=jOIgo% zYcj;WVuCtFOW!5lEDB54SE%|Rqg{Nr`c~INe=L5pu6UO8(?v>l+Hpa!Z^62O^-*^d z-N6Ollkfvjx8uW_dfl?VBS?dtemP>t^{E3`$o|<&bp&|4P*jDTf9j1vK*k13_GkC? zJ_SBDKS6QR+nWr0JlMiwOt{B%`(17klRVolrx}%;UmrGiq)u=_Yw!7MMmeIJr(B#mUc_RZUl@ytm<{GERrs?L)DPVWh z^s_1flydY()FzaUe1(RyezruLCUD)9k~t-r&t}}``n}?u@h!hSN7-}292{LbbHkMv z&x>tPh;UMS1Kj4(BdZ z$eVDtwr4G8J>TJ*hWmG$`^@M(1Vw~l)zZbS-u>Po6RdyB9Wj?v#D3fSR!ny{7YF=O zy_T-6y6=X3+!(JRZ?(Udnb|xvH~Z%jJu3N!2JQ9@V?!V zjzT(s3lWUP-j#M8;8G6b(KWDk4n1bq!cE`Un@RJNcs}7 zV!&78fm-`Hw$)FB2KA3l{%kxt@$rRWa<1|&_VTyi?AVzc2(+rd6EzP;(-Wt;;U^_B z(UhgP2My=Hw!0iX_a-{@mGJ0e+{3*Kzv^eIUxr_Lo*UE14t{#qIK>xG+%1aI{-53n zqVesYW{tc*wOTGHJ+k}p$@V*_L~!SM>1tCFyAoGu?|0y1B_b;|7G2hBP=A3HO!l&7?ertga`V{bo{jW_L7W z)@s~4Ge2t;-_V!PrZw1LTwVbRywi$L+}$@?gpAL9j+Hs|NEq(S>b~yMc)*3*-V7J) z=o@ytU^!qS)dU1cTGF2wBIw<|e|RtqighE~yB&1NR2l`mOBr0m_Hhp-cJ_~;qVl@E zW7+*xyQf0mW`CwIG)y|Swza=E@_pOY7gchjmP25UfGJmX{|4i#;=&}6ng4u?lkGT{NHYvT1QhuI>RDv6r$GUoLgAtN_>lOpM8 zmAT;7Nj|Lnz6A})GXrVpf-db34=uO}e0p7U>HW*>#A!guh{pmjRr3Y!DXC^cACO%L zC-C%b>QAU`U7L~FY&Q(m_>rFBoIg%zZ|dXC3m$5V`KHGfDd6=yK3>Pp_6a{-=`Lxo zq|_XHhf4v8Op2DkZ{~yj+gfaveU=Rv9iMrR}aZRE)L)UF&e29zCqMnf^)ix%t$nDz@L z;f^&+yBQ}UJ}oTWUQL*>kZ|Wl*C!Js09Be)RJUY~bO4cU|Kil5^#&*)IgFGvL^0er z_w)6@8duwHe-7t^1AnoWLr^oqLST>rf>v^~0*h>~ z{SX{dq{!HlK1jw%O$wJIiR*@yzB`_1Nff&K!6Yr*7tq|(lb;CQ!r;^3TaVw9P6O|~ zpOEn?0pQ-L6~Ob7JTH?_1&&P|j4ssSVZ_D;$(G9BwJ$gZx z{V`Pf;$TVRo=$LU-9S!JTjt;;#sb>_qUz3iM>ifX%b(egmo>_B!$$|5betzA(~LLT zx}@PakpHD<+a_%nBVRZLAS+|Y@Aap22MQ8Rs~hLkrT!qS?tJ%-diG^t^_ zwHAW?+PK|_!*$+QTYGL*`91w&JLPxY?D>ib%7qnh_UhU_U>~))7NZ`EjV+-xN_+e9aFVUlny6n)p3>3j zejmYhFGa7B*H>{{w)j)}^cx$K<}&nj@mY(WSAG(!*0Zbq^z}5_t*?^Hsw(q#q0;0n`kL{IrPFXT<=HYP}} zeqzhpCXH}yP_ALAwmg!eNE-3vieQs4ZoU0w-_BD$ed*1?DQ^mrT%i@D0@8fxb7ap?2|LzRyeh zV>y3R%1e}l^|B`Bg>0U;Wo~*BS!?&>5rIBh@@gs|I`cJ(H zIlG{+7-DUITiv~_Y}Zs^pC>r&=Z=D(H})9ye=}&#YloLn9_36wh{dN69y9AjM&Hbo z!b1o_Ss^=(sV}A(u_KM`5pnj`7%IBBH1g3W7*~t~WJ?9pZE<_K1D?BdB9rf**FLc4 ztF}_42nZF5tL;`8sY&gxwtTdA6v>FLXA0s&uF&~}F*vDx4>5~Nc3j`I7JFK&u36@= zd@T^CP(siPP7S~4RXCm(qzbbBa+Vyv1`w67ms~y`ECbxD9owRg&0A`yRp2%+x+C$` zk+s1tiC*s4`_DTf(ohj=`dYzihDCbn95)NHWh&%dM87?o=^~ci2fPK72^Ri@P5s$* zLd#Gpb}nu8pGnctQm^*JE;d%BFwOQPZ9Y-_tmv4>!P&(OLZ8ThqDh+O=YFS;&XN&n zLf0UGV+iz`Iru)|p9_RzVq@6>&MLLkm-04Y95udN_@Lkc9SzUXPu6G+__^ZDOF?!s zT~X{9>+o2418vR+4~b;_di2^wZNE_c+_%m|A!%|)IO3c*wL~wJp*(PA%@8kp;4Q)b*sAzIesyHjrHrLs5q3-R78X-q(|Ct~|K)b6Z1S}tzG1iGzbLwaM?<6BH zTwr48nsIqK79>pM`lZywfooOh3H8!VE{(!kFWZetP)zE(HdTL~8&~#mIe+$}b*7>k z2XXeY$dSa6(+p7?5&79CZ2C8%G8El5-H^D6`N{=>{tMO-l)8t5$-J6DTb5cH82(?h zZ7^>5miqiVIpD%b@m2n);{rtf5VWi$Z&7h8gi^dV;>!Qki$ZGN={nWW{r$Hc-j_oy z^vc9ld2*Yj3C+I0w;>*m>(>ds#nmwQIhM(B_w@B6&*T9XWORzL6boYK*$FS!-TDV! ziOH4OiS)02l#5@N!EPbWaQI;`Aa0Yfd6JO9RKTlWeJN#-2mdjMZ}A1xl4X`TK}7$& zQ~WXa-N^im?)YhfL{PH*5}bJ`G)-YJMAT=ek8976ge|M?=!G42aT=CCjAje_ZvCXu zuy451mt;pLm1L)n;A_6^S2uC`A3LkDALb5|qem`$C;@8yL)=%-_szn1F4K#LKV1i| zsLshMJh~-XV`s}iR{YaOAQ^KYSAKC~?oi73>hyX3C1hrv>eh(N^`5gR-iBi!MLRxm zf}xlmT}D2Yx$u%XYU8tfTuLHagA==aOZt19JlooqsDksxjp!1ye^Zx))!qme&Du4x zUEB#D8&tX+Hlkq2n~Ux=POrhA<02>--H~QSt_b5fq3x#W_*<7Nzf}>@zdMO8ldk~{ zLc0z^(P9Q9Oju9+e*UaG5X1 zT`;ID;_yYHD>mAYtxA_6q)6ZJmd@`f)xy)?7YNX4B;O!e7kk;qL#cA!OAzf-*Hy_eh$!)4J zHb-Y}FH5qiRNsAfURvvpqtsn#Gmpm9dzr{{@v^!RL~gy}q_56f{T2XPTIP9e3PU^< zcX+HXrI5`e@@9Sf#ak2ZDM4L6`!*}fS}4yfee8JUf*^%TTS)a|YXXF)MqQt9)D358rp zLzYNexU(L#*q1=oIDV603XOJ?CwKuA)6xOWATO7>AYeg}Hv-x{=D$X^2X%e8tP0RG z*vCu2-=0I;C3@kzSG$9R(n2p>x9TmJiSnMk@qF_Mqhh zm|6(QniL8SzKN_wnfM?MVhsp@d;1!w1J>uipLBe%0?6pfnuzy75Id5Bk)lCRd1I_x zMVLL-7(vdZzVRAnbD-H9U8?m!wsG)rT)>3-Z0Z=9dJkYyl+XVRI1Robqrxze6X6Uw z_3)_h|aNZ$(9brxz-uHq!FjQ-6HfeFD0&OP~}ntHT>)TQ-rVW z8QWdp2;8Y}Tec{qr=#txRoQ|0CI^`#| zlcpu(sbX5=y!+59`?7Bs3uThOszeQi>{&M6CqsNCe#zmr1EV)GPU?4Hr2}nj&M_E= za1sW^v9hcXAQ12m!8i(8tBlvYVazg0B#AyJ5YwQG#7@FnjRb~=imIIxyl&VOUv!4I zhE^OT^JNYSC?NahS-=qstvL^$%IGDYoB2#OXDcJGru9Muia(&H8|d96YiiP|LB$lT z63uUJUVdT&217;h`aCP7Ep=wfSw4_bPhg@kG^oy+&wWR=n+o~}-L8{tN}(J4hi{_utR4E|TIO0|3!)_HK2m|Lt^6@hz#Ore(*v6JKAnwayo+J1z)w z%d-HHei4yoP(j>ClX#*xiF;Qn!u~2LAQ&g8KS=@~g-&k- zSr-QEEsP!A;jnP6Z+le!R4DVM(2jgmx;-qZ{wT6vz!J5vYfr|>Pct*$HpW(S64%i3gx|;2(qU@|Qb%y@&5h5KazXJ5{|GsAh zp9TjP^>T_LbU-?Z5Wv%X4{1s2hE=%aSRt1ZtzD?DG_+*OWvKG809fm5|Lc&X^pGZ+ z$=DdzpCc+eF@l>je{%u^Di>fvU$28_yA5{Hmd+bvbNc121_k!=d&nk6CC?QZpVE^- zQO|FNH1%9To zploW&bcu8f>{LoNG_qUid+pZVrkWuJUvuMHa(kNG|gWnQ|d>f1f zF<{r-@+@#Us7P-~tm)wq(R0oOQLJuc!A)J~o%9Q(N)Rskf61VI@3ezU-#K%M;IFkj zfu{;A6%@ugH+}2q!A7Pz10m1E` zuCw_hxBvhTHnr&mtk5}^CU%rUd4V_A@A;ocOMFHp<1yYM`{UaFab)W7Cdzl?<4d$kjFx9fL8=RY4B&@ zjA(+Hs@od>A(dm)V)bh^X4f$4QizMn=T!%<++!0I?64F(cIc(HRto^6VZ7NKKO1-L zIG&lw&11LG6LCP>56qedKUSYMPf^g{p)*_htXzBUTS&19q(E}J5Zz*|KFx#&n*tSd zJE0$ZgJ+AujRY<9n2b$fQTux6oEJul`tpZbTq6#K_>f=^_njYl7_cBR(6cmwU*As< zlsk!63BO7a4VdceNLE6xgeMti2lX1@)UF%XLfCE`yL@kNYiOlNbzf~0QRpv=hHd`s zG7pa*v8bs~L_x=4bLI>?D?jtZXAtbpP;hvAE1=8{Zvfe8klmFhN6x3+j!uMtOpc_l zPlEZ$>VV2GpHj@;{$F-pw_W)O-SEWgKQ`HrJYY$vF@vkmy@ zS(+C&;tVlaRIi?4@P$^*#>+ zO%lSdy$X%ec1g|B#4^tIJDaPA&|QsFn(5;FRp=tc^E~U_6sqq})nL7&y5Co*hTEEoARGKC~xw#jMkh>8mY(%M$6t91SFWZ z_apcLBl;eLWc(RN{Tc!sxuy%__p%jHdVRY7fM>)#QYa*3w!R|m@c$BFOg<81ZZ6+V zffQ8!vKdV@vG_sa_n>X+@aXsAkTaYx<^q=b$60d#sV}I(kKO#xQU){`EoGF6LAQW0 z40fv+)476HBz@KT$CcjRG2WsSN#^Yv^U45A$Ayn(14W*X9~y~3LdP2xc}EI`1OJSy zjI_l8GkFTUSp)PQlHe8>?(zPtJspfY%nmR8^UC0L#V@fn%@D<&4Fp^$*>Er)7;rc@ zPB`Buf=PhOf0n=9$BlsFfiIMLNtg&j>?8um$#7C`8-+xJZx6!B-FbRPzS(t;>SprQ z@jGL=d}i#2yO+s!d-&{lj4~IlG-dpVWuwqV7hmj~uJ^0ku1whx75M~{zLF@sQ6RG_vJV$uHPD%R4a<#hEqpE>Z zm&ILUYxRlq%zF6B$rw&w%yW$M5bM(~O}u9{8ur$5SREUU=2=LGPPHg>s_j7&(C@a4 zwpJ#hGmQ3y0`z0@RCIu&K&77phVV24E00QN$5Y0FnR?fangaU+f)-}v|0OAsyUK0J zfD2#(PvrsEnH!VF4(^^Zarw)wr^_5a^TJ9Q*+I;28k${DTzsPQU#|yF1`iyGkbnWP zw`KxwPS{OJ;--uTR%d9nt9{O9ywl6f9&u%ZgF1NxG*5x-OL_waV^N4)# zN}rqk!%3e>h>70WW;=TiK_PtB3Ev*}_r}@$I=xOq1YLg)>H!?%Ndj3E5(V9PiI;dd zANh}7Cjc|nW&MdzYA6^G=r9#(pP|2`fYJ;I!G9`x9(3F0Gey-}^R8OgZuZN{`sIsk zvgO+A9;c?u${;lr{P6x1{6G;Hke7?eRiqm9%0MHZ0M?=k;@8Tu`lTKu+V0X4(JcJ0 zJQy_zqCJ2*OU2}IE`abTOPG8Q5I6)YPLYLRP#6fC1?JxmxgZvYE}VG&F#h4MJZ&V8 zA&Em<=OZr%h*f`N`Oz2*7%4BrS8bs@J7_6GK{rbRtAjk1?#Sb|`CxD{I!l)L(_8SJ zcS%qIZLmC#nv10GZiv@+eZF{(7to1>oX8D=zYO98ECZYlFseYU{;rHMSU4HugV^vLgHxda zRxZ|=U|+LzyS4HlY z6#%G)ToA&>4#~|0F@1%20>BPkys4=b-dJ6_1G-CJ2T%ik1S14?g_f*7j6aYQ?}h9% zFnG)3DH9-1ymTFrMF_MV z(gK#7&It~zV`Yk7SOg;bZJIn(SRXA?sxFkqnpQijAz)J1P@rA5U&04sM_Md&_>aO; zB-MszmE-IeL%R2J?W&`pWOZD9%#4l-0QCD1>-&hSj}qa}2fRu~gIi*~6`@`^`vQ*Q z`r&uQw$r3?lu1@4a-fwW6X)~<_wH@_+gEOE01L@d|L#KUh48Pi@l7&de#hkApQ)X9 zG59nvxM+b`OfB>)?)h`hcnzyux67e(PTitkJCPU823E`OZ+rT)^gfSTSdH)gBqmo--t5(NIlaSIX@>keKxgTRiS_$2H2HmHPW|Sc8C0P3_q-tc` z$zm&WB}HfTMP6xDLm>^|zEWW7#=oPWh@5lFX4tnfq)fSPNkc&xq?VxH_+_`ANewhQ zrdTx6F^Ce+>oM-jNe|8hVv4>Jjup9&#ftGfV>rEv#9!U}M-ZoNG=7#8{sEX!QQ+zC z-k5pFZbjUvm979Rrd01!`)7U)UjH%BObi67&oa03$zZ$SA3Y;SQTbuKA>@K|CLxA- zLhXd)QJ3Kec%t_N=fxe3QJRmL=pxcib zp;@^G4&n~Y?Y|x12^c;29L(Q(qj>7$$A50x+x3`a(9pG|sx%Lg>myw{ot6LGgS#QK zG>8z3-9nx%2*QUbTMF9%wk;nYDi`_9m$$=Z0eXatPS7@t0CvcFoYUVdeLJNrF)OFs z+5d|59GZzgNs9$*sw|XA`KzCz5gqC&)$9fX0xr`^jll_dHUJUZOi6%w7mTX}$cYym zw~#eM^4$Hv!g05N;G%81_PxLM9piQEX9g#<>EN884gpX0W}go^p?LatTaoe2zVN3} zIUX?C)(*}!k7%$<#0B$LJ`lpe#GXgLxwwo7igf~?bO4xP3mr!)?o= z_ouI2PZIY7tTS7k;Qx%YqlNN0!(URd09~EKEFuQ1sdl0oAzX}Q62xRsEH?gjx#=X@ z&eLCw3^ok*qKHm$0}jhj@-{ltd&Ds6x)f%7E;r-}Ta~IL04bK;XBK!)e^0F}G?dC8 z(bXRsM6d#zrl-VRyMB6tC2DnDMRp`udi7UTE}3m@jJfEZ%0T7gue1ec72`8^@=}@n zKL1b)BmqW53e0a1dDqzy@L~;H7YgzJ0+HgtA%PVlAF_S_0uOEX-ja}o>I+AI*|bxOY0_PU!OjXaLSo=gzg zeSbQBi>^~Ix2V8H3ab-9_ypo!z}N{x)wIlt@CA1JBZ;;>pfvrfo&<)B{pZ}@YhZh7 z-5(eC9t4)DrmB%xHdL~;k)6K|iY5?P`FA|bn><^4?kLkNZL+eY26E75K^h5 z-*Fqn<~SNQH7sI2wgPK(P--?p+x1iy#x9YQMM#BVdd_ zyDwz<0PX<{*HM$ELn0_312xU^wSEfj#ai_e)8D5XZ~NFBA9)3&e}I6_tJi^Ys7XMf znkL*=11do#Bni4K$K)O#aY;6RYde0}$y2BB#7`sgga0EAHiBu)VLs`Mze`1G-=AuS z2%igM;j6wc3nqO~@8Vwr%|Hn83jBXY;DA3U@Vf^ipByFyrtR1vtyOGPNzryT%j9^)tRjoAar^j!st4G8f0I07KhJ&1Y~Uc2dDZPF!h6K!V9&TQ!VKwQ6B|SC-oC(}mOATkDW)1ikv`e}t21__$I-F27ZD{VT7FRd&PIi9XCfim< z3k2mcP&R`0`BmQj_pte>9rx7O<=-e|(v+@ z){b+z-DK>`GSzZJafqJE#f|@0sb!o3OuVF_FH$wEea83bD9xCUB7i6wir|7)zYqc7 z*=qIm;~G7=b1cWQ=Re&Jp=$J_>m1EZfv{K<*!y^eNy@(+D@qHz9T-f@G4xR39VOaM z!SW2t1sJgIpk|gkA$I`iw)8g#f##2CCM-^ChPA=U}!amqL^|8z_E;bpAF)cZlWa zegC}?4EgwfGF~qs#_J_dWi|sUGd*V} z*0qT9nKqDL=oVS?{V=1*_H*BIjVo_1`eVV|reQ|rfSoC*?A(Wdg#c|IF=8IDKBnS7 z(1YoM;1nEYeP9k{151Vz0%hhOctV{3oLOAQhkS(caO~Y5Hz$0j_S zE@<>zZm!1nF0;7Og?kAWZl8`W&c}Nh0yE+!uOh%om57Eq{!Ju%f=@xpGf^n&%?WhZ zn4Pl*3E<`y>k#N9QPuh9D0w(-0ikn@W(Hvb-Kh9#7yRrQQlx+KPeCJ6c&m8@@ zADP*=V;3=h0e&EhI{W85l8vFV%VY?Dd^~nW^)RpjoYEFW5q~zssy~d2Fy(hZ zggBWhu{X~JK|rh+(c}E|sYTj%2ac}%T7fSJ#wTe2Yz zgA-or!(C>+D_$DW%N)R1sLxINVOkJy;9}5Rh9ZdQ_(Co2PiRos#WZu{6|NX2SJ{f2 z9j?}Arv5qGnfNKrKlp~4|9x_p1OU9B@7?dajBr-QXi^AY@#EWG%81*wr(VB|mDSW5 z+k>Xf{qkkQz?_S?du_gh*d??mFi7-Q?ArT9G)ojuqYUt|)2Lw*CD}8OSsGs`MbMp| z)Gf+;VYGmJG5T498!(a%12j|=49i8I;uC7`3FcTL_o&brg~Fg-l;JOeniPhzvUWq^ zemh;Mko>vb);?%p48PA0lgD3{od=^OsV$YNwNZ-u{teYzY}bk60ik`#^FAr85lR>n z9Qp(i&Jg!-tU>Yxhj{w-=#%$}l-TL_pIG0X{@a~SvK*g#>szEk1E9ahRQVFf>i(%H zLjg7wFpit&5fmzvkgjfoACP~c1OZST9)OU*^Cx{E8Lc6Z(b^^U4;JVCpzNSBk0`o` zm0AvFn4^Z4q zrGDs($p=W7_MvFtt}ht>1f6gONtVV$Qd zz%YZY`08(fLK4CCuqvq{Nr1prS4xnbmL`{!11K62`}}|2 z_R%?WIJnuJrrOx1)LFHpqhwL59X8oUFtzad#LEc2t%F>gAPpza;h4_<1hpr!`UK<% z3jHP>r9eMp>|p*iTfZRo<6714kpzL7)Bwerc$v z!oXAduF9Ar5%|EyWbPzfl859bpu{s3rjBW*gbfbl%@1dH4fw-|b~TGagT#MZ6rh%YMZIqd@w34HW+?Eu z-_%Mcw;<^skA=DP7&nxsno;y7h<)hki%-!t1O%F_gOA!je_JKTQj?WRJ64$UA9Z1+a2J7C=ummi?fG#%B=RlNHoIaW~_i(PEc*|97<5 ze_BIOc?G6;JZ<~{ydpTF$6p`;Rpf=9+qeEa8sK&DF)aG=eHhaSMMO73vUiwfe4pE= zqcv$f0h{?q6e||FIFhzQT@g5c|4bo90C6l5__@fg1Baake5`4yo|!$K~U5_9)G07QD&!I=I{fX+cn&132qH`1;|RZphf)n z=r$h;1-wNV_{)<2hqW({r*i%JK6Zo#wz)D-nL<(KVUsdNO2}LynX}Dvo61mTl8hxu zrp(D$h{zDiOqpkyXWn)1I_LPk&-=d5^T+$w>9dc0@B6y0b*=SX-}PPBwT$2?@71J zv?CA#knqJ+N6J$;F%db1-dhef%V8DtEOMG6_@xkj_k#p>h$DT%(1XMLLj0Pi2PLmC zFlD@w58VDY%@0DCoL6{~P2_2b_|l6kUyqXXv4jcv2$;?FpD&3$e&}TG4pTDZ6ra(I zS>Sn~03$g0Vjkgu#5#FLLdQ$p8y_5&pOT zHmwPP1V=I)C%b?$+_OBS`v49~{Wp!qCqd}eu;0SVO%PrtURkyb5YYtXWdx$U1f3NN zj0At=|Nh+i9u%4p)C)k;+EFmZ#jdV|X> z#HX;-^QhyGV(#jTI<(k=U;xy6&3seGfvV^mG4-#Xh-dB{_ZHG>TU}WQ`VbD9U=H*h zAoGh3AU5pR&G2wJ*A#IwK9B0lcq@uu3K)*O#Q;S|-JTzclt%s{+&*7LMIp|`qr7f+ zZ=T0y>0s>$TTq`oXa?&0%2I!G$MXnJGj33^yf@QN98WV^zPB(qX%j<~%1&|}O<_U% zGBDtQZD9YMj_W425pgD}w%9#UwUm<28< z&)8kvmi+wDWnqWr@iL=|RjEqhr7yzs=GwHYk}XQp{Vpmd?R5?JNZ9xo&Z4;=VI-&{ z5@g@?v=%pwM;ggie%464S7ikEsCaN9SMB`1$qu>BPMd-y;1ar9{`t)3e7e(has?A<3#v)WT<(U=>df61AGEc**jvTU>TX4|8PLqw&F zEOH~Zfn9$QXp&xod$kj!)XIb}Q+u=|zQW!-P0|qomp|z}Q)?!|4G}JqvZeXS1y*do zxL;6t*tBwH_nzxXHQK@Wjc&66_Inr{iZJ}}{ad1hm*4`a?)#A@;j9!2MfD12F73Ml z6@3S8^s$a$Sp>Z|XHNM-QQ6uD#XJv}j2T(eu*VGc$(LdsU!GmLV;%Q)M%1Tb?@ae{ z;HFsGOv}oe;$umJ5LsL7me8!wAxByTXEJ($&%yLZ3C!S*tN0`Dvq@o+&YcO4S2%ho z3NCT|ZOx@HS>}&{%5~Ej2yk3v?NLvaZO?>s0>r?$^{I8PCVh)d>g) z57Ds%7`$WjV7oyBuc93bDjduP+#nn?_>`R`EEFSgBD$;R8|8LmQgr_^y?y^Mm(q_+ zhiG?!qrUYe+_^_lqhMzSOr7o%(JWZ$FGAx1{~9622CkFKhFg|CFPfVzSRo&G% z+<{FqZSCglg$m^M_{M3~`4z6WTRz@dS@+)?6^zzIN6s$<+dXoaI89M%m>!c)QMM-& zn5D}<`P!XI>Bkp`0^@^>tRkUl@&0LcgqJwOE~C4@`Xm!JOX)AC9dKM>3+Rg`OJda! zhZ%^@A5$W^rkZ?0&U9ydqVF%#I9-$Rv0`a>&}@K9=N7+j|J_SY_Mp%p)Ji94$moq;h6SdrNGMid()|R~J*B zDJSK;UHXd&clFRUxP)@kiqd=gin8tCtN255rVsoMqG%AyvB#1HU}8{aq-@0nN~YZ= zfp;#mGddWUIBRp1Yh@H3MJGs}nHxO$v_$$&X zHJ7z@^|;*|K6u9aU54^inCs4gcfX`{(URYS} za9nQ|VslkYU{?mDBu_Qr#%1yG2Ul1%4&e;o%INgEptW_Xnt_h|#%fB1xd?x9iq}Dy zkqvXs<%#nTZ+WCKa_wqXt``$mAG|;f*AV0CvPq(@z~UXZpF9B`96q}DNr2?(b$D(d zSKY{Y_5kZeQWMvI!ww0{4LF>~pq3@?rbrKs?}sphjI5{eDybun+sEpc)2Vukt{1FZ z=6ezV+@KR4d&!0OnFj82Qx-0Hkl*Ca&OI>(t z{uY68?Ri*`>77GAwx{J_SC6cF%&WLA3`eZH`pM6n@J@C$Z=&eL5&!n}#}N-;KgLZm z!izzR>+lqvuR@`E=2t1FWh444cLbf@ij+=V{%dNX$u7f5kHi%GTl2>s{QJzA&Tp@~o{k*#)%j z&*UpyC>nCMoIMT7`EstwYgZ|3#pY38lO$Nk{I90r{z5%Ce4oi%qZBt+Vk>#$!tY?- zehBXGj_-OWx25YISTpFYYHv?=oVOzKcHngD6_td8uwji^7>}qZ?0L*Z)J6MsA0Sv@ z5We8)FvjELwKdTwsB&k4E!B3-s`ql6ZEJ$Cae6ykkh@LP0JjVh>kEs1_b-f_&Np7g z__-F=3NP=uvfjfS2en?_ZoXY3V=;F^?+lqeqtMk80_F1XRTh01deOo8eQ^;}bqH2X z?Sz8S$|4_ja3|C(`}u~0dRXLbb@8MxV`ls~udP&zR9~Ji6oiT_-Gi%xX~5j!M67KH$LLX91iwIVSHqL%2}B@m`57 z+mrT$u+c|FwWtCS<1#b`Lvz=Ovh}XG`t9mnDyY|Vd-x)1q{rG+%J;BwZ z#(k%|zp5K$3GVfLi=7{yX^HF!zEEV^rV)CSiS0Ri$P|OYVB393VC3~4##V+mbx|OH~0XxL1f+2(!V+A zaKOh$SNwXzaCH51f8{$v9H|4{s}?p}cZqxXB#{-4C$wI8_YO{aIFaOYv0G-=QTdvO zJ0@e*vE0)*Rz}wK@`)t<=QGbHm+l=%b^1j5+me(pTZYlo!@+F@*UEn?7SM#RRIbf6 z4^XOkp_Aj!0<}th(|49`s&UI2mzUnM0`VdFzo*vlK4j z(Sk~PhxJV>%X)ZeDy~<^zwF6sor!%d?W?^dQ>5eiU@Rz6iuinT0%n@ASjD=Ze)bKcDB}*X%8xJkwc^&U zb@bcD=gLM%zg9v?XsWJTa4@qZ!q)c5(<1jxXBUPVs`&>k~lW*!LQmcZ37 zwWv&d^*_Ssj*m!}MLSflC|UO<@0=>&5fLOmuFK1E4iQ7K8kwZpJOAdyyaof#3#wi*a{{sg6o*; zr!*>3*fP@prrkc+MelLP$EcY$baide(|GdwH502&rMo}N8?r@;6}MtN$_SgqFXP=E zCFvaqCcSpbh(}}W`5$^TYK8AQ;=3EcdwdHD@&@W@+Y?)Ryj#nbyb}^Vc}{WL>zjk7 zt2<+z0udC%E{xke6D%{PXeIyZw(a&kMRYgIc>>%=BnppxG9tMKkp{~dC4La~4Z+}y zE+Ih}P6T0Gjl0Eq1IY=;66h~#S0eGxWlntQ1hNPGBK1l%0f~xRh1~xKhXM>sg-1Z* zg=7Xs^JOX5-jPy@O&jF8N#T7#K+T}fW%(XU{?9&h z8e-QeAbjC4S}+`)2MK;`8WixxG&jdsNUo`|Wc6<|c-cNEdXfGf^`_}3_5AYjSenm` zXT-D>1pIlu*#61Na9Ct_;y>bq?`!$y1Ou|k4t5(k^*hDFAkgbI7yLiSv;3Cc|}d9#Ny!bGdF_zelNHY>+Np;g-UY`GO?XA{EpQu%~YoTI$59%oXN2mofrdY5O;r<+pAM+m)xP{1E zY|F|*5|G8%TZ1yOEH7aeT?}{kD23NknAk$mM>2P$Xk%q3Jo`Trf zLwYiUYkF$}H#+Y*oMDpR-Lv}Duc5Mh#nx@DJhTR)dyeh;&0g~|o*ej%#mzR49VDZy z6d!+_#g1fgW2;KlIs&wv^;ZlNS>#3p+}6>!AkvW&3agK0<;!}SoI`dEWk09pv*gV~ z__iG2{90L_86Vd_Pd8YmStD#8fyYR2|ExAzch5T%prrGyj}8riU2*O~E}t$fsK;gh zm$}gOt?yxpNb=%s5;e3tMkZ%^fRu<(g$oAi_{6D;N^V3V-ckKHg7@*D|1W|^kgjK& zpmoWQ?2V0;j_i<&nhKlxn@QBFg7AaOua>VP*ZNL-?23Ch93G)k_}=nz zA)>Lysq3d<;x!$)5l3#0@U*0;kyRTN=ERf`ia}DYpmG;xyk#7st3MYoBQetYg^D14 zi+pzRMgmdzPFlP`dcs~*{nDpz5j%&~sbJ?Bt~UCEi+u`f@UgG!FiwxUUNqp;=a)4` z9$I?yC8|H)mh=sMx79cl@0E?8&`+iNSdlAR}A2t{dlb8S6O@Xw}@W5^Q8qa3#!w~cHj)gPGG9aP|;*;k5=<9U*8&4!%iorDa}ON zhcYIS%1dlIm9tF`%x(Z#)(@{aHxR&&ewzo;n6HKDmSS=N%8fX@u)40ZoQL0~&*WHu zN5>tD^{G+3sn=fykLzt@9eghq-aXFE`HL*v)BAsdEhD@K!}oH>oHnYZ$zKb%DL2{{ zH|}kZ`y7+`rX%aUkdsrNZCKhXL*H6yciU_<^0L?yG&WAfYyd3fv9Mw~Gq|f2;m-K< z74VMwcFo7mph^zGoN5KlqTjxPm$ho9Pq~^MLvRAHjzw^7en14BSqF!ZG+P&6<=r;tTptHN)A`L$~-aX#8 z4}l}Uf($~{?Xv>gmF^-h|K-_seJLgvp3+x2QiLxAvm#n=k*iA3YOXG-KV!?Tu2Y$2 z_7~j5iN-sC9;v?DT$(k~i=K6f@#Pm+>TrhI| z{x*1byo9MBKx*)V`EOf&=*113%K}WyBhi<{gq9az#j?I|j9*bjeYWZ4aBVS+=vvOj z>V*t=aoqiIVF>OsO&{-3vh8N$7v1~x%TCX|@@R|^Ye>Zob`~ZZ!=eaFAugY*>kp5V zG=2Ub`1B+#L{xUbsK&RP&K1-Lr3tatIvN~h+q(UQdOYC#%M}6OJDlY1=3O`pj3imS zSK_<65W2WJ&E+$TlPtLwnqx6?pKbJ``{TEchF8T1j>L!r9SYW?RVpk}`W5OEw!Ssb zn`Yr)C3>DSB0`-r`u)J2vJoMh(O1<+S7zj==j|f9;&RMmgy!i5Dy~h7vi>wvUgp8jahDF^O;>U?Y~e0TBJy2-Z>yK~gl%&{$Fo>s`uea)9s@kW1Zpnsrqa^|~w@pHGs? zmRvHiD|r>88|6y6(@b{!_=Eme@f>+@S;rC`jFp}`P zvzR+#90`}W4+h5=@?`rd2HXjC$Qj|wwTL8y*b&iN#Ov=gC#rxluFzoc+Cq4k zjyITdzV#t8UYyHS@_|0f&p%F0$YN0D@tn;+iFxs){8LQ2Uw!&)FUN8XTVQ#S_VKV3 z7v_bgSi#Bfw7!4F2sXL>iGhG1gM_2l_H*A;w0^1H@w}AFvI_}Ps(r(u8dL7<6?1A9 zCBwAm`=u=l&U&t3&nKWz&>5jo#Ih*6$Ma!pE_|JMp6@_g(j~Om&L#U`8G}DNq%HR; z;ohQoV3ym3$uDDARUpM{r9Z5XXXdd6zen6cXM4+M_I*^ZGJbma-F`lEYJKiM7c*gO z9N{Q`RBh9|g{p4%eCkTJBnKlYU$qO=ErMgb)Rv=}+*t43<8Ae9Uy0bB(JXvj_$>Rq zI>Q0t<5QyofO(5g@92Yf%hS3YWX~2>iII^Tx%AX^4rL#Dymt~u!sen_`w&?_huO1{dnP%F{KTgQPld$edU!qlt_YgJPnrzk1oh33&X$?K5HocK|A~X8!Q# zzb@!rH_;m!1=`uqa^ZA|k*&j_Cj!beLumFU&5un{1HV&-xB)0%kWjOQZ7)+W{L5~|E6m93h}R6v`S;0_mxUP zr2GD9hDI1#(Ka;}b&j`H3*F5`qO`cw!a;L{*L)sv?UAnn)V9h}=;TI1uDxc(yS-@9 z@c@!*ddZe@rn3s{d`U5ovmaBBWy!@4GZ)a*Oa1c=+y)_FJ1D zC=^6?sLx>bVK(#~0Kc&;*iu#B+h^blkG|eACcK7o@qk! z{FjtX#=_6=nKy-_xr@OgVGnmY?*Y-{;Vmw?@4YO6xE6x=RhFIMtWFr7aj^wwrNNRr zd5d%)>w&k6wPtg(xNE>!gS)w19&6fD(RaW;?hDnu^+mwo7s^`-$)~|~9+c$Lp|mNL zJbzW(kKuo^?$69!?aX*LZ2fi<#W(>m@5)t?>l7tX&z2wji#k;JHL_W-60}e{J4b2Y znj>TiJ7z9-nDcJ4+wb%ZLGP~B?sGU;-xitikbUcW?)UnRMO(F9f%ToNIekhMwo}na z!I=pOih#aw*p~8R~-e2qU4?WYt1CVJK6&Os<0Sr%I<(hi2q@?>A z#b6)N5R-6GyNzaVvGPRV1xg?n^VDt+iZ9hxw8(gbtj+aKjrXio_%ut|GdjP+Lyg+Q zHAaSfH+Nd>XSam6Mwx`ww;c-SRcAd)4FrAbMBagt-Finl&D!k*YS7eRuIH>p9m{=8DeCKCGL9E_$|G2`|}i znkh8jtWI6X%L#0nMts3*7Xsmf;gR~qmU8vI93`U;X6`f6&t5JBbQQaHl0;R8B7x+Uu5c(6BPK`IN#hY% zzLmYUI2Yk6Nt8rD{Q9p0q=JU0>}L-?n2B+y-yMoOr?Y%Izv82W+=w;f0J{dl1C6ev zx)5e^XedFJn=idS?!mFq!q|}hp6moGPSEGVOmHyXDo0=+i^~cYU99?on$%Eo-u+=& zjkb|VTHf4HL-L>hTfzozgC<+E@o_jyp4qD)oE`?E64A*(*6&%cIo~I^tCx`>@_^nQ zf(3ptEh$B{nQJH82NyXbpajwV>72>Sb@fF4)rS}VYv87)Rv36|jDCvB2J z!T@ES*c9nYO>=@|1PnvmM|c%el?jv5Bq99$7#(CrU#L76^hePiZ^XnBR%lO1!pQhG+)8TU%aOt z{#HDGNXqp-k`1LM>afQ~t#9cK77t|3-Oh(cyZV>M&ho)rq7z4)4v}=^W76bClr>i~ zle@Z7c%|UQJ~qp#A!T1vs*iWk+|Mz!e)Z+<%IgakC=GX9Mo-PCN!QA{;NFFbUH!ko zer>|Gudi#qXFvI2yqg&x(KJi3wvMOtQWNdiH@ef>0GvGRXE<{_r^LSLheWB=dI18W^vmmba{GfD`=bEVQDRd<;eD0r^ZpSp1lMyDNj=F=n01_GE{o+MIm zD*%RIwVd($AESMFmfT%-i;~&f`~eJC-0ksT(2z$YCx#`D?fd~;HjKe#wmOaEnr1Qs z@XuTG%C5k+uA4?;Ewc}h(+>J-)|L$3AQg0zM^bd44!b`g)FJTm`pI(mW!{EIjN5%; zBDt=H*%Oys?qYvP?@<<+X6ZAQcv2)L!#a&xccTodhE=VV=0h9{NvoW*U47R~tDZv@ z555~i5tB{94SO6*aA(H%ULbrF=ZZab8eBK+Q;vuKk;Xv&XzE+vKqQxP7bfRHZ!Q;# zk@P;3o5l;Dy||mv_Jf}tY9v>#=WgsU&T6mr%SzXEosY#%9tJtU+WsK@oAWR=+1LEx6>F&j8(8(BB}ao6K96v zT!Q{ld6c0xE6pY^Gb(%U#$s7^Ub*k2vxg8IfIM8u`g+c+L(;_MgN@$e{+3(u-3v0^ zy$ir)Nzie7pf{G9^0q3yc{c6yjDbpcxzJ!2RG!XL`o#lc#qWg9sX`K{!pgtIy!Jts zQ=p9kZ%QPn??49sMN0R&IxO#g83kq;vQIwUYz(jJ9uM@GaRo|UOB`5Pt()V?C#eE< zS2zQuc3yJ0SnFIIV-l5HHoh_Sd}yS|8D}yp3`~G<5})Lbu^$Uok+%c=x(uwlALIk8xGleH;@__Y;~V-J+phT^@TJa zxAVewMgEb`MD+0yoiZFa%1LvGH*G#i_;Sr~G>9{PX9jOWkQ^^p)F`rk(JW%!G1B+P zi8DeD4!+_Z2CSX^-;o{X0q*BHFutt_r{F=+^B+TT z#t)^*J6P|wCpax(ts@<5i1!k@awJ~>c0uQ8fkT@U8ya?x!m`HQrR@0TE}yBG8c7@X zwB9MvllOI`EG9r1boe-PC6_61BAPM~LQcUW8b7L}kz5D6$m2{4mg{^A>vJN}Ks{?0 z@ri@+G3$>>*-y(1Y{ zBtP;eQj9v3f1OSf4d8FR0mNT&BJ#FNGY)gN!B1MR9yjqMp%w_ULw8HwdbJ)B$5Zq$ z#ODcTfWf-KTQ1ZnB5e`S-Mmoc4!@WsYX10L5z*CB7gg78%D{>;74a(`x5yU~&gx4= zrg5)$(x)@_rs8d9@|KxST}3%(^3GPF!!PvjL=q8)5Hgic!J|sZ_K&9uiKV1$`m@i@ z&AP5c4}WZoQITNM{4~-2@%R8z*&IEI$7RV@1Uq!>3r==-1~u)?&P#XApE#$tm5Ak8 zQ8}kqST|Wa=%(2A`98M(;Zh}A_E&!>i6Z*O*B4;*3dJ(wsZbt-i)3t9#Yulx4>h3kgN8=s~*OExsCEzTM`C5Rm)6YAj8 zA{p>W0?#Fq>CGgz#9$vPE3d!Pr#8y z=&mF`!0?lTek6172bDKAmZR8Oo4eniFG>{EL>Xu-2ivXmx9{ zG}q8L)(Y{ZX!msb{T|oqzk1w13GxWcq`2{!BE_m27$ZQ1@5exr_x}QSSK#j+4c#&) zJOckX%0Z1j4eBgB-zb+ng8D|nRyXJ-ncw4PGVDI;X~2H*w)SlYGR9Z1+wWn1qS6gZ zIr4^-12f&_CP5#i>M48~-4bP?Qr>~^VYI2Tgh5E!g75|!mM|mukKTa0E(uyMw7&zk zbtW{P=pV507ixtApSDOF&YMZ=fCP0kb!ndn0k%2UKdLgt0K?4Zk0l#0-cCzmZQk+6^KW6Lm_pxrktAaP^VDlM zQzV%(8#zIuR6Dlfye+Oph(1m7a@aobls?-}^Tew%`QnB{k`_-~%@be$x6bv6wddsB z>+MLWp}g9=DEzDWru4ZZ40PoE!~~f zQzp{Smu)VaUumbWp}m8kMU5O(pc=F4FNkC%w@T%I0NIZxl*&E$R#Zfgv?BLh1}9@M zxBt<2w~%*r%&a1pC%t(x8SWiKodmaM{o?ZtZjvZayI}+6CdmjQVU6&F3*mdJ){k`y zYXi}ULUd!}b}m%F+I)R?OOVvKqJOr3cASVPyx2CpeleBOa4D#*GUc){@Q#v8YbK)y zK;#gXk16r12L;3n&;0G6VI9W~gk4~*5K7SW z5Jzfd_paH`h+YTydOt>r6;yr46B&L$>JB*EG?5_;5@Y#LDeg^}Z-;=@V-uQ{9L>+G z^BT(({{j`J#9_AHg1R%Rya{d`p3cRIDO`c`_o-?t?CLJ_kw`CwDHyqmc*K11*yBk9 z)$6d(Jn%QFN{3I?85yQnk9QS^t{2cS_us1ft$BQhDfFw~O!^7MIHAi_4Kjy!TCju4 z`L#|HuV;kjDPDWvY8083e&H%jwa+(yYTaYxyE_n5JJ9;nuz5@RxAVf~9Rdy|@`tpG znXP=i48p~e8r%(^xO|9jOv@TF=c1H75DbiM)gJNlqIi86Jd)FyCNpVeykFce7(jFT z;Zp{)cbQ+h&8BB7BiAMER3)OX9-NTeC0wwq{PpENU)1GAE7%JykFqExRA6uFNO(TP ztPs6F#MZmkuX9-S6t#3m*iM^|?s2gtYe=CI4Q)M=RMEOV3{FbZlDl91ZMG)u78d9UI{$*wVP*PEG4f97T5m#?0=@Hk16q~lBW8b-s!_Ot)k?)J0i>R!hbas!g6tmnk~si1`4oE{Gb( zJQ*Ck-KADZ`tD~&4E>Zlu(Ajs%ZZ}dyUdC<`h zseev7s!XO#dUOWe`oRKpuJcZB;lnzEY5KLz$)hHR&vI{l-3QsV0iszy&^38XLJizb z$!XD5`KrG&Dk_{b3V~POOKnB(ifyjY!9GR;)C-=PG zd__C@qVr6C4q*j05E#bKxm+UWlVy55%`dotPN*DM7; ztEka$-(sLeh0<`v_ho@%m3d`ZT@&@-<5&}`*G6|`@w)DTa#fJ8AIbk=e77etsr_h@2Iv~(2`TBn9fV3YBe6VQ>Za&ZO-~S8oyk#(`n8O$hW2 zfPucvr(<@1%8U1wazt?>X-P^;f_A6liyT_L+lDBU6-1 z0UalrUXr!-Ic6!iQx&_E_ORuj8gcX~fHN;e>Vz`D3FbE+8J16W#a%rZzOR-eblQJa z%nds9hL|L?vzXkMZw5;3UDEfMr{D7hjfK~zfs@7*m}Dh*s|%<+NfZt3#HoNx*{_Yl z3&+0h#h)6h4f;FWL2Bf#>8_Bh2P>JuX)IX>?17}i=h%G&tcD=oVmccO1^S7?rH4b& zd$5&2u-wbRNYrZn)(_-(r-vCzcE{WbG9D|1M z89I0}T=TUqt|MfYvTXh`<=(FYqYT0sYzYqDV=ZMr4jkqLB6VeH_W20m*Rc+(5n0PX8~heZPm`tJHfQbmbR+5Xb1Yb5UEmm&{7I*%T`J5xGpfsYR()Dez^O)fcD3T-|)2RqIH=gJ(iDIyjyR3 z@lf%12!kvXL~80P{(o2Ht;VW=xW3IRPO*ep;L*F%$-6V(K*;Ip1$G9}3(xCE9s)pyf;?q9>X%1VmYGOc3u=PWlwQNB{j} z?!UaN2is@Wq&e?y#txkTaH2*&{^;-G_%Ioa-sPS=>A#{U0(`w3h@f=A)~jR!F)Y~X z4Z0wpZ7KZObIwyKG(UP2OfiA*z%f#u;CqSQA7+z0cr@a>?6%R6U1jRyZ~qEgRlMx{ zSQd>)E7&xoaUkb>UdQxgVsP&bbnRgS%^S`t&vrq*3Q_fBa%s%6+gq@~qYghGd7W?Uy@kUkm=C>9i%Z{%T8Ny@v%TdDOVP%uBpo z-L{{NVs@-=;+alV3!~TOZQEui;HU7#gFd25GzzvhpcLVxbhA&zqM&RC+#lc4+5vo8 zi*OOzVt1$!8RuVTo#ply;@;pzAqL+Lzl|UsTp4CowoKc7J?@z1zoMSVTS1f-)HFKh z7#AYL63`cZ=-j?CF%NDILBrLlDQ+5N4nW#ON9i>G96IAClNTS1kOdx3`-2v&9i{>JH0iUhK*H<6m0i8%y4* z7o*#hvhrNlt0Myd6xY?IN?w0siYBvQ(HIABHNB1cvCPkP;}fVEjz#_H{HkrABM&f- zSY0!jz0HnveEcm8CJ;ud2*a7ztu6sAdCvIpJ{=$dp#olE6F2W?;9D(s( z{RjOI{;dEr6a-ap*aJ4mBRHriebx*uN_JdSj79u4S*jo6q*WK8&WU$ zkA>~ziJrwbqr?jF<10Lf9;Sqmq^S(>;keo-vVBgFMZ*k?3Sy)usrKBjl7r#&mF^FK zn&CAm9+wi6MyKYqJ`Jgh@+xz`dsYAW*D+`Fsm)vC!**Gbj=bsCovxopJwhh$aw8(S zlzUo!^^oEP_za+O*JiXr+dqkSh65IqcxJ6$I0sItvp>q=qZ5*xkZ~nw78PJ(+7iVj(nCzLawzkJ3>YRjc-xzsIZp7- zg)-Hnva;aaMaM|~V?cWN0jYXih<#TKJ*E}MxdPTkx=kEPurhHViRCEs45U>E;oDlj z{bjqd0%|*_LG>livRv;+xwB==$r#A3zoDMUj+X6z0_>r{Bf^gsGCD-WL zaDv9%WV10J%FwTo*(;PPjn^+fjHn;F-d*{q%G{~#?4kJFX_@(*IZ<8p#o}*J>k0N1 zC5Zx9h1GSNWB}9{buJ+OlFH1t!nQX%J0e?V`I0r~ZfAn{=ZbU5tTZ26@s(c(aS>p@ z0z6y^tQyFOwUSVcU+VY5{Y`J(B5!I&~L8o9jk2;B;&eYe2j(4Lw_H z76v+odJdh2Z0Heh@4;r7%YC=%##hSI9W`DYgkA}`wqP?b4SnaSV`3mKqo!0S5?!I* z+tw`5>Ipf$%|^jsF2S8djD z1z7Khj~v;Lo<;F1Iz9HR2}&EBHi7R%DZ$H?5oyr#Y&yL^oh`p~t7~I|JeHwx49Wk#p{UYt zSm~?z4F6`o0@MzxBTaW736bn_j6bZ#pIK?-!T6Dct;;(Ru4!tb9i(_+Ff5VRO8c*& z3om>s%`5v-E}F~xLv1#{k<%v$8a=|z6GgTw6)Mv|WXN85?Y9>b<%xC-xOaiD?dMws z@Q3%AJl<7Pn4_ve9A~%MM-~W0=N)|gH!h5*JaUlACxz6K4X@m`$q+gVEmN^H>Wp4n6nG`V4Mvd zU6tHJ_te8MoBYiSUrqu#!H!IFapo<$A^ppDJnNEJm~3b+z<~+)+8`DYZIsgJv)#}F z1Jq6s|6~}70-$Ikz<O zNR&(1X)OO;AE>q8#_!uEPp>DA)^HvOD8!eyzlPS1EsdUi2xXI|?dq#81h=4_!9MQ_ zcEU`1yN+AC z-4SfCL}nHk0^Y$I!2EtzoF)56L5{F- z+tSGZgRANi=l7$+L-^{I0j}{2gMU3p??T_zRc>d9`5&dr?JY$FL;aMw1SoM*4iT?Y za{P~<_T?IO5A4@%e!ByS?n8;Xvyn)f+UFKg)nB_0BChW}$G!>KJpiR6$o{-B`Uxyp zdLlbCcL`?5Z;i9eF}Fr`6EoQ>Zu)xtcFQ+gT31arL8&y)SEAc#-pXa|ujr>X4{0En zE7#s{G1jW4{>z~;;NW|vKy}Vp;2I7x$97PTiT&P=3dSq(2&fW7AUFqQ>|W@7CZCSG zLIXT?L3_)>cpXayMqO^?Jb7f*1G>PbgkGxhJbqmYaecovl555+g&r*~U4?gtDgKg3A)_L!@ z1r6k28Gsp1vs&Blpsg#Rnk?)kZOEO)oeXSL~}WY z7XAL@-)8~z4Hsw)U`eE1#Qq8*=?K7V@2qjS4wgssl$;l52XX)zH{z7EM#p~utN^@e zx>EyHyHnxgNoV3yptoWuL8cmxV)_g9Pw(67CxFE)KRXxzF9&0gm}8*9<$(T;dLmvpBT*uu>BTtaLH|^pNWrFaC$#wcMI_s$H*TeZs%RPTEz&;gw-Dd0toZSv-#NTO;s|wa_mLzs5CS3nfsp@zf!o$4l3YWo zJ*h9n$xzXB69P~v9JdJsLIzYXLSnFEg!yQD%ZyS7bV0~s_RKX@_R5U32XF5myQPJf zGrO6pN!Y*^2F0LC3hhdZPH9{Dfm=$%ew1z&(NKxYp0NVX5$H8Y5ibK_G_iHT*!zn7 zBf43Bvx*+juU=|fi_5`F25gZ?sw%{@Kt2%pM1NODoB$+h%?HSzeB!J4-871<|EVJb zw1@>GNc-Ql{tIUb{t}#FmQ~JB-R!A=zUgsM<;K}!C6j9Ra7UHnF%^1w2wgDCe7)3t zcKgG*2r{Cham$;Nf;F@x1%KmPNA4RBSg_b>ZHw|HXXGTGc)xN*=qWoL8%Gy)8BA6m z^^J^;OT;#;m7P3j7vWO!D%Sx@-Of5=u$YlPH42q)!C`GP^lN?VgO$``p%WTxNdi7Lok(z#$Tr zw~By@bmU1PD#rX3F0gOaG089R_N}w*n=$qQu$_OQmca`jFI~{;2r10JOdpaQy#`fu zm2xjA=pfQ7>XT@Y&V%?g-0{>K#~-qzj7YDDX|(;WNTr8Y*&-v=tkN@oJkX_$dh{gY z&eF(u9H;A^ymIE=X%7cbv$5cWn`y^?9q5_bEP75%tFoOEQY5X~yINIb%Nn)Bm+x5CV^x><2F;Gb#}=v7$DPoyg&c1Hyc-n8F^VvC zl2@NU+>gf)butthzI2)^*L~MQi|>AyAl)5piGb|!))Zgd>iU?=`=ij+Nwd-AfXWK}>)jxuSzYAGoOk8rN4lU#<`}Yh16cE90 ze9Cxnkt#4Or{ugEM9Z&WD{*On>iX1|cbvRT)C3}`5D)0bOl$eOJ?BJTXU_S`vhJ zZjNjl0KUlh`edfF1a)PZ?TN@Y@+$=?DLId0FYZj~?@8B*!za01?h;ZYuSB zD^>d7#~Y==KWY1GmT}_9oh;mNLHA2mGW<&s=;9kEjbHrGl5#|H=J#x~7lJhhX{2I` zphxINZH7%3QmozW#Gyjk%}%jNp|7w6eCFSI*v{}kCFf4unVUZzJ58ii%FiKk7w5C+ zKV3er*EA&bei^lgLMWX>f!fp1+(+c~k_4sPR{D8+hq)rlm@f<(+Oz#Mdf3+9F&P*Q zp=>|M`wnIS!Ay}DTDGc9<*~r9TEJl1g;=Ee8ZB`_05a!-I>Y>55-4oJ8wsU<6!;Un z3A5k=RdM?W;CawboLlL63UJz4?|*DTw5J<<7cvIum`UnOPUo)6eIeJ!Qr}An5|bfm zJ)r6yizsrkzg~MmK>&T8gpi=BYV8Phd8SX;9c7y%K#aX)YS z0k&Ug`o-RK;u3$|6wxAXaD)%)y_J5;HW2OXM7AQTEQMf@f@IOgFS}JFsMin-A*ko& zKd&LOi|KfKe(wLRUPMyzRnf`BLPoG-W2fH3!lV_HkD+}ZnbuZvnPq;!+7ZSUrHaGn z>NbkRNMjBGw90$X@F%?(fl^?i7>g9=uE+qyXt&A!AS)3sKvp7BrHP0CLRKQbkyVS? zP(NSn`iz2A#p+F!hG+dZnrK-pN$YmD_!SHcN1yh!*&j;S36pnn;|p2knEzU7+StF_ z{QZ32)G3L*3{5r zchql3hEm8AOP^w^t_HM%1F-QCd>yVx%(h;rc7rkETP~Nj52COq>BD5~hvizR0 zw?O*yLQI*+l9gL4*VPNg!-yH&%u$HLsd-NknLgMc>!dS6dzk#@tOqA1I`)%Q7_R?br z*$fKO;~h0MLtnn4eh*T65e|pE`6A<9#Z+V11xQ=Y(Si-#mcPdEw=Xya@=9!7xDzuD9Pp0;3a@lQd- zcwbSucHvDpG$N}KZl(Lc1uMZQ56{%oJ;lZ>1rAW_?I4X4(TSwIE==euPbinnu*df~F z?Eyf)&x1fUAIe_*$@lA3Rb-e(M{rNuOH&W?8qy|#6ifT|kgC_u)yTGjlHP7GTiAd4 z=KR5pqZqxb57#w(8-9+^9mxh=X1kQRA=00~EGf@eQR0Zx9JB zU)1U+d-TK?ISss*pbj#h8J@sd{QlhDfE-E}W~_$o&@nt;oa#iEX7uUTv=V1;cgb%u zhEbyVFP^14bszRl=i=VG5V(=4f*%gj?Lb>y+KzwX&*4hcA8SXZGQb4Da8g8Je*H8O zm7ncw8my`LEh+7`36J9tVbu&W6cLe`{KYNqid})6SYJ9h-0n;R8|n-40H^G92B$A$ z1^Be|bH-oZO%ac|R-FUM4%GMp$tE1C1>ZrS>K635yd-1>O(0Q-SlQIruI{9e9#*vZ z;;Be$NIQ@e84GhO!2v%?@rgC8l7__g3};{?6*=y^-ud}_iIRpa99}kpSNCtE_jU;W2QRTnCD1VgFX7H~ zqU?@O=dzL84glg3pe(dwfqOvF3kjq>oTJd8CcAIMg zJn0e94}-mGY00t7`S`P#<*lm@b5Fr*fR|SHi8Qr?hwMoviF~lza^rV3VW7zLOn^CwGEy6kZSnIAIKyo<;e>0SiE&h4s)<#(r^fS?Nj!ZYT}cP`r~!kCm}#DlUAU6uu% zti{-+_8<6U`Pnv1zJ;nAG6nPFqQvpdDCqwcKPax8sIXSpFY%>z7HQ<)YV|qZmdNRR zT;wavn*QG+oB+dxo<&T-%N!1FV2NehlSXTdI>#Sg{RERa%ctYGMH7|`K?l{j@D z3;+qYJf}V~R`O?C@6VR`pKYxhZ*ri8+txtn-R2_0R-5-$#^{?xiKSb_6t@eq3YNxX z*4msKU->$JHM1U=o;q5Rva&u>8sv$g%4U;F-|ZQ&N^=$uUh6LQUt4+Wtx)?@r#;Yb z`w`5I66;E7`AXl%#f@XNPk44|YE=L-o47r{K z_@n7yrbEY$+CJl$*DU(j-n)VCHp(k6$?-Vi1KFzzt182apf z6Dd$Mrb^gu?uT&%OqC#l4tUubvql0~n5jnmaJ3a#AoU{B$s84#of}5pDl5bwU3^D+ zisjoDwW2vu1fb7#Dv(dl>=d5rGKeARlusptrC0M;X8tWZRJIOg5Ar>~8Bbum5et(} zP@{PgFt{xmG8_N@LREx7xQkP8mzF$aPFD5 zFeZZU}6KCWTT=sZ6R;g&kss`b6D}S`JoYi z0_ms#$wJ;qP)&V&X_;IE{o-vVr|AFkM0Ab63l&2Jhr%3UpeydT)<$`yaNZo47mjO- zr4QDG(#y&ofR+uZfjuJwS)k6uw~>b~CZ-XIAQZcH!;co0j}N%>rus(GDYp>a6iB#F*`e1f~m%)3p@+SE5g zZpMxphb?F**qxoCAK?O;&p6|u>-8#QZ-m@SrBb-A9EY*P z`)oT~b?Zrh`T9-?>;R+&$MaQJHQ<)`&UqO2BsAez(gSmef4|fdhc{-RC>L4jaOrWK zI4s_%Rd|yN^8OI32anW2FnbF6iXRys??8ep6j%S7Y)*1HHToPOn#qVlZu>D-e@8(A zSEbaoW4WmQHvQO3?EE9In>QHuk)FsphI{sk)S91Da4z9hNvK+-XxUnl)DGOQHR!N& zdwRqMicE%!E`#>@`ST<8b5vO;t)-|aNEbr0QvJ1bZ+uDKXkhNSOwh+0+UQ-z5?I^P z7)L|qy%$4_vOFj6>9$lE1X>!H*CadGM%UkOQ(aosU%j4_!*lH@gQV9Rro|ArdQVg9 zOQIXvA7`6s{g9e$fLH4@+WE5X`RVYu#>6{zd$017nP|L?MLR20@r0M(=jqMwnDNTB z`PBOLX~?4z597U9LfOoV7CSPy{z$K*I{qNqdDL+_ht7Ww8Rs4n3i&;7v$}jAB`2C2 z?Y_0()Q(SL#9z)N$H)_2ve?Cr6YFgzrcBYvS6*NuaYKQDj1(?md(h71-)6KY&I$>Dey!p74s!n*HO<#Sb*us7OtXbw8gH8^gtS?g>ZsFLQEwOL27>p+> zWGXY9I+mk6y%f|g=CALk5jC$oD(w@_7t9(d!%owlIvj9ejG++*PN*?6vB50m6uF<2eaR#3VK&$d5ie|T>ZKs z=USse)YeUhs|KWe;jy!<_OaIvPM>HhCIXYR_0DVHv>DbSg8c4Bj6d$865(Uj=CIi9 z)ra%dgMPQ-AM?@UN#u4)F&cYF>nPy1+_dutV5R=IXfK3GuohSgsnL`h&G|3U&a?Sq zn6+B&D9wzLquvTZsx>v+Qp9^71c;wOmTf)hsbJJvR@<$*D$=Lo_({CVYbl30LT>3~ zjJJ`T!+PLx`uNjo42h+WPW#L6qm#!L_@jjt_2CaUMV5FnvQYY4-an74{3{HmlIK8*V>g!>as)-YqOw&SL{bs)+clR7{2YC~8BQFK(Q6 zAM=mBX|Z&cQe9H>&6ahkhj$ZNrTVp=bJ2bQ_IL@U_YAzDd`9_oEO0j1xZ$3Q^Gbxs zVg9)<7fCC&HtT*RSK60~k~qxo3Aq>#y&6@o-2ydeRYMvB7&N0!Og`N|+RiO`=Ym_X zzZB)lE1a!zEwPRoQ+ng&el3;S%P*%?#|Szl9^vjr4G|n`uQCbe_hUFJ3pOwF^pGzExPhnf4p}EPthRsb;kPb-Q zkiWii1ZzQaX0H+h*o(`C?IUS)v7PEU^xx*{FHipajDOd2TC;~U-eY_4*H7lC{tBG~ z9}E(_TihK)%tWl-xD8ATPvRPnu=b29i=TC}~;l8g^G8MfdY{OUT z!&jc%HJ#QG;km_=q;4p@@St4G`VwYpZ`FOWtq+l+>CX-65Bq3eee6o1dorLE*El;p zHxtu`b02$4yR3b%IoEISrhDnEwe&B85HsH!9R>9*d`eh*-ginA(ZTYv@zLN2c-Gdr z2PkFUJtV%}6rWt)v=$gKzUvGlcpR$nLF5aMK1I$O{e-0LXEmf#`O(gEPsw>!*Y-DAu4**ksWVkQ>Q55MNO`HS7JMTpf~^=> zyIU^B2Ex{?He6Z_{;*PMT*@Z>E>(B*`|xuylEcQ`{7RAzM5OR>VQky{=JW4o>61N@?+GQI93ct5<+LCCa|6X^xZEg-g+VC)tndD| zTPg``Z9<7?_8RlBI4^l6f-}Px@4sRMU;A;?o!TO8*9~tXn{4_P!_JL^SORU@H6@A_ zaS|-yG*~oyP0K5JA@HjUik}6m521_0!kWAPiwJOh$Fz5kuV7W_s+FrER-?d}KcY=W zV8caKDn2UH+J2+jo4p6ht_*ddi)RlpikTfu*!sy&qxgNLi2gJ?(-O!^m@FYM zxrF<(VF?82MKj-cMp#?yilWsN*MG0`JgnT$Prz&eB4b5}v#b0eQ_Mli$6}DoJk~F&+QHCnI}O+?Bq)%zn)e2v}|lH(eEOi2nx^&$LjhD!I{mj?wRmgyXJ zA;~KucZCKvqk6pcGFSU$(s)fde7$9I)F;cqL7DqIjcGj29T+%N>ux{nMxK^Sp)G9r(eSm8eIA)N2Wp{@dy*DeJXK{@MCv6HfsZbSt_}k}x$Mrw2lbQg(j>1>o zp_Z8ZUVv+~zPY*6C#P(mGFuCRjc1 z;TpQ=_5BFhHJjy8nzhE)tTVEkm+UUYeZlRnDI6e^<1sgrHIS8Dp^B0NfC4u(;fB`O z-s@!|{>XD*Q%xs@h3pwg3c1x+fC_BgXR8$s3Uf@*M6&cPRJTZdR>bOUkX=aO5uvuX z(TI3JmnBZ>#)x0ej!qXXi2Iy&&_;wvc9&k-E)QE+tru1<(&)1saaP(f#lp>iqac;r z*_iNo3JXi2k@sZF`2x1gT)mOvpObtmVGsHY+Ii3&r&i{68EgM)T2Q5?Qhli+@4_?d zH51Atzo#C*Nc!D3AMlJG?kdZD=P%`pNxr2U#*MZSKP(Tu(GVgo6<%wrV}%vKc)vRo zVj`|6-P42Ya7diK%C#8cz1_q&R+vO*ogPr4ZtJd;cyw6(kyCHr_Bomz31C6Lcf2dt}3dd>N+o*H|Hksddp)QlG#+1@(1-|I?5WTVWU z7@dJ2xDaaBsn5`X(a>JK#z*lg5MGN7Z|cM?9KuVw@uvUP^M$^e_K?FgHsD@j1~|5{ z4}=5dDd90NZ|Q>mF>YHm#JKy*#4IHkzUAN&Px0W^i!o7c>7_2De37xU-yE1UkKM!N z;o)!>pl~v4N-A~+LL0i;Qs-Q@MS`-<_Wm;I5?vv3ZVX5++bAr^C&jA3&2*FR-ooGu z{II^xO|pRVq+brcuOI8`_4_;@$P4n#j(&inkYU<2 zxvDaDk0HbJUA|EwOhpE7AgCB5{tphhqQ84g+^WQypXhsjlj{6FwiQHp+}R3~P4l|F z7dJ5&rI&Y!i@w|&7U!i}86uT;{MJ(@LUg&%HWsk^Ht<4~^$}^D?St@_SAuxoUHL`& zTbkI`%r1JrHO(jw*ZkPWe00&kQmfv2UmNS8uSn>gQjhYunr$IF+Tko%+L`<|Z+<9( zgbiOw@<72(6E1vQ!=TSm+#-|YMti08&>xYzgnl`7Yxp>b2)iv~EXIpEDc%gZ1pk^mzJ%~2OM{cW#zU()p0aS?h>4X-r6ukg=c%U{HG5#lYS5S*aZSR8DJA=GO_!69_@% z3KB#h8qtf=2FjqDs8EZh!?)cKIozRE_z+^sjnSP~ zY$!wS4|_b{+2XdWS z>$Du`j^@HcJ2*UIu$=9(B$#9M%(DDVs}9yuUOCS$luxShxb*hl9GXWvFV$?@x>%U; z_RCa?&{hZB{UrDZNpAoXIMTy9^IZ-z;o|IMK^e+?W|!PNx=gc=?M7b$8-BUyah9Kw zn4oX)Cn=*4n&XUejzh)e=!c(3Ng5F6>`gg;2H7v&KA(?mC?kV2!+un;VPFtjnD&Gs=Af+2{6nPgcVU4AT zoGejQKBSy@zfHxu>w+Cs^|`y4Gw#V`nli)Tm1bC9*Zf*@6G6bzF0=r{4(@N|f#C7! zHQx0L{Y*G6@7O*~3H2OE@2+0KHL_i(i=>-zB8?G5dyyYS_lOOh+`g*xL)=DiPXIdv zouNq_{}(vlG1^vBlz-CM-M#z)arOe%t!;Ry{vy0VCN%8_kuS!1pU5_SH|Xcz;p$X< z_Sg82C{5lHyX|rA^r_gzFutR`6SEJbSO3_)!@!Q{^_|~=jx*J)!*gtO`#~0MW;q7GP*N@(djUheD2>Cp+vs1JTU=)mbrYpP~2 z+*y*u_jT^;S|Mhq&AWdzz0Vl0uEeaiK7aqP!px^j;DTkjj)0Tv)`iJmh>4eN&~jXp z=5fhbR|@Z*IKa6lV2u(v1>R+*6KYHOn9f1{UnE|{GcpWTJ=s5h*tzej!UZ7bOcRV@3RH`v0; zOK(I(+yp5r&ZPoKzKo5v)$8P_7Fu=R$`o~f(8jloZ%}E;_sjUl1xTWq>&~}lgQrX~ zk{J9FfwQfQdPw(A&}gRxtHu)C>{0Hv3jlH{x_26Cl&88hc^rPxXFFbE>(F-iWw;dY za`p3}yct{`7sSaZ_(HX3SND?HDsh%>tLwaPTi7;g77)Lgczk^GK!CD9MUZER%t~rH z+_f^;W^BscVN)0flt_suzL_r&vDbK#*)mem8C4^Yeg zSz?<8nX{Lh+ON7VQQniT0s?>X&|R`elg8O~6H{b;pGU7I&-A_Vp!s`d4gB}?8d+)%GiMAr0Z>3_jWO3lI!998(+`wFJz>wQ9J-WQbW= zvZb0)0Y-;J*ugc{fU%R=FQ_ zHE~xY)Mq9?Bz!AWl}+fF%J&_AviXxgEcK$21r5VqiV_t#Nb1tI_x$rI5I#snY-m$T z#jfABsb*@*n8&er2y)gi0bFBU z7F{k6JZ-S@Dvel}-{+1PUAL)OZPE>wfnUkY=Bv*{6&}cO;=c-Gq;EVyV6rx17UEyYtkrYMQk-h>O8aY{TXs;^z(7BV4e(jzBdT0<4N-f2h-IK?H;blwLFZVB%k#}l_Vl`2 z%YLWvj636ZS^#2HL8;vE15(AdWfza2`eSc!9sf5kq1oMXyCL?4{%%--a)%Tm)$0^B zS=1ukq5oC@n3ZuN14jCKtcT6d{z%AF=T*<2ufo0+L_5pIM1Q_p6W87AUJ~yW$OX<0 z1OzU{y9s28W@;MR*}LO*l*b09IpKWHO>>^{WuZgF&6Y4sUta9`M`o<6tboaT20j&! zrL)AfMf1b4Bwx`Q6#G9W?fmUWue=jH-lOdN z_S0pNk=oPa?_O_vm{YNQpu$=n6CEj`$4OF&Yozk|u=PXPdU-JRgzo4o`M}KNn;{I4 z3=i1MH*A8x(osp955}ao}Yw)c8L)ms(kQH&{=t?Ng*4tEP zxLaXbW40yRNq}MnR)@g;&Ir$^h%IO=7Pk6(?Zlt#p1U-Mu}EHXT9m|E``#&j!cxC& zWn6@bc-QzeRypD1Tb~M= zV+FoY!_j+yu`K3*o!soX7tYzvM4}(k7<87+{Ee3O1?H)1VLLP9^i@kIh%_ulw!)_= zUIA19kMYf6iRuX_+Ib&iWpHLFZs>!*gv>v#RLgDmT-~V2p7VI`jB9LiwaFk>WMWb@ zN~IJbrlE@Vk{MCdvTvrPi{=3$>ZjM?@7U;51`1}1-?EfO^f26*oJx`2&If*LlT3>F zzI-8|Df{<;iTTS}nZI(w_xq3~H=j=pBU1&#wQdokvydGuNa~jwqoXuGW%zzNIkQfU z#`7h2@z0+OUK5v^7Je1qlKej?iqOK0E|rzOIlx*7ITfnY0c)Xko9pjwl23&jWP!D4 zcH!^eJo|+X-@~Cs`)g26O*Y%zPC)cFmT*lMcMiBVEMdX~cm8c8e0tu1(K%554jddY zCoER5ZL8LB4njqLvMU!qMKt>1NU`CO?eG3yo|>-mvhSS!fGJvIoY!(FF*-lVr)trA zRKUy{f^6skCyEt-vJn19YQDX?rir8_$BSd!&9H=zxe~&EC({01yNRjP7W;zMHu8}7 z*LDj1KuF|MZ&cm#EtVd?OnlWnOneY!6K>T2117%i>};iZ9fUPkD{Ty>&{%ddmvf2SctnueHy4h8kJxb4fPmQ{5@j%kA*%#Tii>b2{^Z0f1~Q z>TQV}Qk~&^&}$SDBcxhjUsGo8F>!}JS-NMgJxi45x1S506KneHVASk8pt61DmiL;K z%A4Yk#o5*)8T7I{=hfaM!Xi3%5=`8H?Y1oseRvR#`@?~fOGkYD3U6e-#o;G7Tmx(4 z1Ut(l46zUZbkSXws*XeP1Bs9xYg2qS#J0{4^V2|=O+1??v)d@wUX16K`UHoYOXZD^ znc7h4LE=KzO!e$HeT$zbDU+nKXWRn+FNbL!sX(I#D`hRn|A~(VyDMwFNX2~NBL*!t zbUQA6beMO;q)c5k18d>hzMZmd0F-?*5t7ynk8tzX#qz106o5RaCs*^#4W65B-c7+d z%%EalvB46$Wsyp(?1T5LPHh$8YL`OnmM>fsOE8>}`*~Oxg(YNH>ChFB2C#DiT;HoD zfg$sJC~pbj^P$(w+-RJh)UQk+I&YMSs)x<>&d4H!c-sf6jG54A?g-fy8O45e~#Wg(&`Q^OV2M0q6}UA z!a%ezo4r;Rn`3wzW8q@6Ohy_zOotbM>uV8Pr>Y@&T%ATy%Pc3AS3N3A~vDPuPsht{MAbT7C`q(T});`BsaP3>2|n|Zvipie$i)nfl~_=cJiVS%3D zAqAOZ*=^TG8d5#d3@l+RJ2N5aE~~HKgDv6og*XhV7%nhh5^@A5hIT=839! z`p#qXBfUzVvFV{xXy;2O$=FmmQ!a*X?0>5%+j(=0GAMnjcZV0!uo3{O(NOH%J%qcp z$v^4P+k#zhFz@LQD^lnj(ipEPE9w^#t;sv^sc>p)QDv;QLlJWfOAzfSDtb>rn4L}E z7TXbo@?hu91f!m4^oq{=l+l&$CZ^PfQp zm{UJ_1V*HBLWUN~9X0|EEVxgJ+~bt0p;H2TTk_T^0wU>N05xG!IWQBuw#!RvFVdhY zoW@^XC@*6ia7`e;e0xg818BK~JKsC*z(XhL3!f>lMFMV@@d*B>*Ww97ElG47_CpXA zm)2Lv7Z1g@$6KoO+|bumu8V)30A^oV@w!S%4BXF`mY#p}@&#CX$ji4)3I4*-YFIs; zVT81Fc%xB}zYkR*AZdH|?K#qTwiJ~)D9Km4x4la(nv%1AtZVM~$b+1=bHa@UTzdvR zp<|HD^ZYI|QN+jo=whzM>DhDlX1*-f$xVEI)&;&Z^gbuq>x-#FXy-{`zo^>TxRV>Y zrrz=Q+A81D3mt%ZXy+9+(l6Xsm{Afb%E}WlapA4Fu+pYGzkH#rW}Y);mIw8-RBcKZ z6)d|?F}ASgl5St!TI|RiLadmHd^Y<^R&4Gq=(@9_M!kOrr3CfTog&OgLcq{S)zpU% z@oa;o%|B^bZh2Q#sQmg6**j6UepAi{7?k0YkLOc{AZQ92h-zZtJGw3%BjN0 zt7@t&ML>u_^*w*aQ`=tN%A_fNtsaFJkv_oLZb>G20-ZVHsWTxY_-IbQvc#k(cZ|Es zGPLa>rW>KKuI?c*rh5^F%e%q@{y0KY&T1T~5}q-z;O+2$Roz zV+Bn}>lM5&*MIP4yHiPrcIJ}kh*GQU{ut(zPKV&>; z1(5h(<=eGdx3Bs5Z)QerNNAQ>HG>ID(6+!S$n!lkDX))?cV1l`*pE3LWci87K|O-0 zycxkr;>pSK$mV#^nY}d_BC~GajjHDB z-w8SiuLWVOpeyN((6fTxdi1$^hh&U<5|Kz*IwK0Ph%^8wNuFv8e2H(V=h){-o-?;0 z`D5$1>4FLaB66UG!p7X#1YVL%65b06LyyW2R1Q7{`-=#hd;u24rgy6I{$G2vhl~vQ z7+RJF$p7g{r~aLqonXRb1g4)0IsW^B{iVZ;96i8!#S2!XObA7JKD8Nn@`Pf-nI6{- z20Ph+OMpx2Pg*U!&a*q&1*>_HQzAluG97w<)}Kwo0WXg=|6X$X8P;nt^_-#yZrO#TJ_zkfL5WOV@j$g0&eBIABq|}VqyB7C-gZar$=}7%y z(ir)-y=doQUn}ofN);A!VJc>a9TNJgpGK5N#d1!WxX9@H$xpP&@i&Q$9(z3uj_dy^ zAxxKy%aMCMb=%NRyQ8@PNLK~~7mbXhZp&?7K9k~Wn<%93(zh+Qr9@;uqg6XuWIMXk z#lc#b?eLn+(Zf*+GyZ|E&x+Mna3Z6a&q1VnuMR%7=g znwyinO?|y8lM~aWCe-93Ia$Qb3L;c7L$4rQ`HNEAkd_eTB-gupM7@{q>x@mWSLgGb zb<)22YQ}RR!6AJ-VDqHIjawsNB=KY%!}9P;G?z;njslRqL|zO@*I&M061YS7+@yQh z-5<8Erpup6=9V%A+b|8C2w=Dn=24aOBx#lu@4a=o$x>MH0jpy};el*%BNx`)Xv-h% zKZ}bVcwx4boqi#8cA}YQCI5CU1Femd6bFqri@;VA;pPr4=P#7uLA#Po{BHphryLSQCzh&XFp>`+C}3c~kOvoB2e7JXIO?JUJ)Ta6>TE6&v}3i+oq z)U)byEgC}k4qI=M`MhF8RU90@{Z*Fx3Li?MbX*{fdWgOWuIaAl_V{VA?Al%Zfwpg# z)-0nu)_x4J+0%!&}VuLmU% z>n*o=pcG=YnHAvq`54G@Vm+?P%gATR)_@M;_yM&m-62!c?#m)25jT!Nc1X#SS%g76 zZS4JYPFM^$(>-;dVb6$(I%P5TUa=~J&wJs{P4b=h9^YIsKZt`~pjp`SOAq}~_n<6V>lQVj*CrW1*=SN2AN zv(hHBBV_(`llRi4ar+4=ZyZ)AMQ9t z33~&|C`&MCrNYNTA+ABnZ(Q(hQM~xiGh=c#k+5Fi2GsAJCj0r&pIBdosB)@^7i!+u zO)iJ|bsx(%bTq#Ds;}=h$Z}4x(_hRpPBR^ZgDs0Y{6t(OjG2{Cy>a0P`>QsOm!H?J zCA1tyJFA?vbvz6U7tHvn{wpLpuf)^$|C0k8f&u|ZfmZ4rjb99*izjYF89w?`tB~T7 z1hpX6f|?%8TXpPh%}$tw+!l5zU-p4@^$#C#vL9~+Pw;ytvIV+e%M=(JpO#ae{lkM+ z*zRhnnlf)Wfij4EFU99%c?s}>!F~19DR@GPdDqnZX|oCwkwtAvb!q*ua(2Sn9KOD; zO%0T4c8@%VD`#J1Nv8Y&STm$!AyLSNEZtKo0u+WA9K&#lxpJIMFk*RoqB!bNCO7hm zSdL$H}E=`X-#-N=Yw5E>yJzbp(ed zL=oRlW1BAB4?E71YhMTV3t$DwK1h<;Vj+rLsN)2kra$5^RwG7Zx~IxB#<#srT2duD zKhYg6`3u4CR;`%k)rSni+<(ot$`h~l%(Di#jmS+%17Z!vsQ~nYAC8y5*O|1@|T<4r01a|05c09}>g4p?cS80=enF8fzY?5+qlYAdO({RCKt`|= zb0r@9>bQ223HNOwrqQu?yA)M~eD%|F^xt|99~=?reZC+vlFsgCsm1%X^@dL*K z(1#iG3?S>k7FHFsEXKHf!{zbP9rlUpKKV*Lff~wAq$HJLjk7iv!Lx+G)jxW)n#XLV z4-*AIALfj}(cx0HSzlMBB6We&SOU|bJn=+`K_94ZrL90pr+YyAUs0AM*f-!H1+maB z_u1pSO3}_Mxaf-4l6xR|RUv@FD@p z`Hd#{&7+65eT*h%r{^0>Sf0uDHCGYBgVT;M3q^GYiG?LUi9~9+E_5WuA&m(mv9CG; zq$@4UFVLY3KfFr~q;$bzTMx^TH-x7^TV36KwJWtnHya3L)%s{OGyQcoC@8-zLOY*2 z_O7d5b!FCOaNlPX3gJ|aDEbTva7Tkf3TGIW&}trYUCY8ijVfr4fLE`tEF z&IB=)xvzWzftRijoan1&r6yzubjCVQxr_6g6`W;Yq2HqEz*!ly6r#iD|8zYAKnd;2Vi2|Zf4JBU z_BI@6+pt+YC$UX2;r$c&U*q))Y?!~* z!)vg97w;}Yj~C}zk&Pq6tw_Ck)}Mp@Q_jNhb&Ne)#lS39ysA$!qhQcwlJBhH1M8Mr|YFo<&4%DJXEV%UJ}#f__|F(`9jz%8dV}{N!N#T(`$lBzQ`;BN%KDlMZs>komwahXghU$`1~9HQuhTw1j|E5rxqTwC98EnhO&1__<)@@P_s`D24a-1N*-tY$ zHQWR`(bfG|8tAn}-cE_U+H%-YBGMi`HbLB#vG4}~pnJC6Tz918xMT)*G5whyo5|(= z@L0dqQZePRXdT6^b3yw^?SYw|D+@itL2;DliWtfe#OziXJbKl)HVnByEJGhJY5L~w zevU+WmR<;9d+<7+pU6Wq1*ZDDVUvic^_`&lBrBIADSRUX+en(6t?rOeVew_FV<)!G?z!*Ez#rrm-)^t(|aHd@b{-*(Irn` zQR1-H|G{=f>zTeOKWH1QoK`oUN|xMk2Zh6BOVOUE>aNy0YSvrE^ybyrVsqwxhu1}; zSJgMI_)hQdHU-JU3z{I8JMa3IDF|z4|VpQsAqy#Ii+_fFs^H zEW7hQcHx7B!V%rg=c0Dq8Z*M_V~vSn;RUy@^8k;waVM#NJG)GC>@&W8ddIf8kJ>IX z@SOEBugaSjx@S@rkKsbe!rK-bKSib}Nxg~y6wm7TnLtH~=p`p_YZ_017K}9e_4*mL zH+*~l@D>5!`dM=tA-g!> z$I)s1-iI+a$Hf!qVlSKKPl=$=>8~i|UjE4QaCjr*7>V5S*M=i|Mjt*6T9-2a^+D+` zfIQiysd}x2KUO*y&hX)IEcUSxQBM)$+)+pWvsWTRk#LFc$w4$C z4q!93ez;*Gg*%TL~&Zo(S1kuwv$5pDT&Ru&T z-F;IXg&(Z_a3K>R$y76r;`z|U+#j(~f4Ni8F_Y{jc!7iOs&a9S3;6=Vw*}!p)4h?O z_#c7Kx4@jKW&c%`URIsPh;`K|{HNTmjV`^#m<@%J;IMgEE2+S1_F7rt zrWEQt2@_G1k%9t%t_?4=Y+U-NbB-Z)*GX`B{s6U*G$ToinSN zSP3XU^#j_u#t4z2Qzm;FebYG=J&jwJt zwD?nV6WQ#-uZm+uMXQ~Qg*zI*lsK-JI4zZpSmYMX9>|rfo_a(nP&mV=ui`i-PQ3RX z0ZfS+Z|xz6>v!Cdi5mD-w$E-gf_i;2<31G$1qe(c0gZ`ozdxh$rsVt*<<_R%@A8W2 zo2|`qnIa8aMeG9ENjFz06++Bhh* zyRA2;>agLZjzKVD7X(U$ezl&Fi9(m2WDsgor;DZBRfm)0UPgm-i!OVsV;;x`Sd!w7 z7MU|XvG-b&bUnns(K#}~Z&~&2q7Y$4xJ}Y^?426*NXxfE}6g$>UYTQUg93oDpfes`cAh`Q>;iLZyFC*{Hzz()qhKsYk$1HpEe2{&1!i9bC_HyZOL zJ*>MYAekP|z;AZSoHBoV-RKpTSMyPO`f}Z1q4`weFh#ihW360Fc@7^;^&!@Empq|G z)TM8q^^4!YTCg$)|I_2L2l`?WkwMtVVS8#cx-$RSr-rX&pf~~=RAqHlETnJ7`PPqp zsQv{;bd58^Odc-L*Yf3AL9=81rsme!WSWwS=$F%>Aes|qH!oI>f~&1e^3Dwk0rPgR zLGzI2*_=9R;N*9uBtH;&qTb6;A;V)(UR9NS)WOS=>{vjw9{f5nKWZN4?g~bB+4<=7 zA%uGU(-;*sQg->nG>2Qs@n7T@Qqqx{S|=iT(}4DcYkt4(5{}G@U;`#2yRTt7;v@KW1pRHZq|4SzOU-|M^fVSR{ScV?Q;Rtc+N|0g=*L8oSPQ<^NEzn-Z@++TMv!mm8^&bw4ljXjhsw85ApqY z3|f=oa80%Kt%tR*Md;1T3_d)S3aDQ!HCl8vi^~)dP(kC^ZW15OtEB;n>xP}mNps$KA-7x1 z2Y|-GK5v;R5zl)qlhc|FokJb1nS`7ZXKRp`7`$w4dzZ?rd0rl>-$0odM;m0-F7YN?I zjSfif@3#v1vRd?8nOEjvV{I!ZfVCKm!;v*#gfQpaWd9KYy~lej@i5z@0f>MjQO7bN zhkiLQ=Mf7$gQ>K%QxxcZh1tbt3+o11fqy)0{xx~vmDykq1BGgjBC}efxPwG25U`?@ zZTXTFVkuJKOw#r)pCq!H@)~lE{U#KTNI*O4DwBV0SThEi1&)v|`YZ5wzq6oB@k(ZC zv)$3{{_!0;s!F$h)en-QnN87fSo$Vf_DZ6~9*uF6{Y2E)IyBvFYmjm)uRK{?@wwEv zhtw2&#*m`pQ9WRC5V-=^KdKE@;E#aCB+eUFL)ovnAxijM>QPwY=5sI>2pTt#7F4&> zA3^+E>3D07g+5tU2NJR8b?Q$29_lX7W7?;sytA-CKZD@m)0W!D+6!?ytB!$uM|xU~ z#gE-N39Jw=l!CcPlTdhuT)o4E`es}e26x>SzSk}v=4JRJb+K zugg~rQ%V$w2>#h`A|uUkbg(3)tm814A_#m+tn4RSZIcAAQ@ncO&wwQ)5*@Ky!|p0> zKlF_Ry!Vo;tOgF&x)LO_U>CGm*v=>o0ThV(4O-Z|C*?#g-^A4vlmIBQcPS=w~^FKSJDHwh_VTE7=elof~|Zp*dE$(<7^>3d9sL z=WX5jNtAGnUO!Yn-2I_;GkC;j*u7Cc#LVx}dN7-5vGi}RdY^15JGz$L58J)iPQ|Qw z>Xvl0UnyC`*PSxKp=w4U&ab-zl#9mD*VQ{=3IY)K`$rnYLjZ_9%26zc(MTOc7ZYWqL92YP z+EwFHG{g@`W{>#>(zV0-h>e3_#?APYs0QR#)_alM7UmfN7t4nt&@Z?uPpdB&M&NzuFQf(Lam3(_dApsr# zH|Pyrz^sN$8;V`yuVQ^vZp8&;<@9F|%zba|LC+YIcD{=Dw$2?HYcIfgSnr=TXdvlc zo8*lo>)WxA%;~e7hoF7a_tPmh05Kz0D!99#@wfjl z@dw(%Z`*k3;?i(_o5-4KJ+SiU%t+CuM`%L8vPolr7q61=mM64-q+lNG&r)M`pC2a9 z5H$7ge7M-~8f?i3x~>tx)vp@oLIe`^gIULl*fr_aUMOJ&?Zgy@W0kVZ{}2FFeYMAx z5cfs2^1)s&5HL2sW#s?s{XmRRP^HXxh4*Ct34stZr7JleSBC*Z6f`IJPL$;y=A6pk z*-ai5#0k*jY|?uE87W|46o7ezmtacfPReI5JAT~gYaAA{j9INNT@SbVK+Pel5`B^m zjaZZh;QBbo!<|y!O@X&AP2sX9{?sWF+K((d1v*|ELRv}uAb-tK4g5!JnVbVcllLNv zrS^);qc>i49>!!A;89GzjG$b|WO-K^BoZ{;skgGstpJI8IUksK{rsTSG^NL%F}#&> z>vReCj%oj>v41F`!;8^c{?XB-H6mv+&`0FE`ua-%_NUeZ$D@t1BHpL3u7iD>q`Q%k z!3|tPNam0Kj=y!k$52NZRda`+Z8IcKDAL3{M92^vubkaH-K_g26CB%34gi(A)Zq72 zb6ko9mr-M-!Qr+NqdZ%AQOqanf-xaA)h#-`&5Dm~Gx9n_MM3+1{pOz6f3#@*xUk{i zB+&QX8VicMl*)}j15xu3NgR0qlhz7AXa8wn2=$D_?e84TX3|})xQr12fHqHqclH^8 zD&32R@crv^2Lmz@=*Q;roh`w#$LLzCtFvU?hIi04npgSl+iCwjE+I%LFC`iH9Vl;t z?D3kU_&?k6XCiXUd2&2~uRg8XtjMWe?omP7$nBDtr9bLJ680KUpwt)<^R_S_sv7mY zI+q4Z8j1zBkZ&w9Ob)Tf;AJKOO^OjgBt#0tD{wy?TYik}CNIGMB(554yz*p^s5SX|I@JfppG(ytC)@~Q#df6Ng+tut`t-l)Vm2#fG@@60u!oQ zzaGl};gT@Fw)AUYK_DC{V4_3N5TzFnT>(1u|7Ttj5sEAOlj>JS5YcG0*uOrO;)3dO zFxw{fTa;F6IV`1l%FgK@LziFA6n>&Eu{gTMBm)c*O|@jByiZKVWjrOB*Sat$03GVKSf z%Y2xT`euB$)5;RSWN745B0H(z?KEF(gSi%njQff^_3g<();uIja@DS}1T86WnE)I( zu!jGYM(gwlIKQ{kMkqQMOj^RLhH=LivtI!8q@{YxSr%loEkgR29isf;xLxJm^PmFp ztUx!~pDSI;7N8xk4sQ1BcV>{I_~`@e+!X`5;ZoT0>FfhSf%;-EYT*iNoVzG2>o)cFvcIe8!GJfw`lGK^-o3H}vQ&$;!WTJbi2 zCe8)`?xIj*|6#2U1==HGZ4|1g?r6gq+{=)}tTsmK>taT>+0EkmJaV3wF19bqgLn6e zxv!3TntJ%%T5!oy?}1L`j@z*DO0cps|pQPs1L*Cp!v8hxhTcwF_Hq%||iXNCrhYFf-@}t|pjHv1xr+jmg zI(Xf#xF3dsJ~`)*?C8qt&%Kmiux8ctyA|$8$vlt+>qc1QLDV^<|w#ML0z%YPJ^x3xLJ}Yha3cX4D zp0%8<0`)8^jX5B$$0pp9WP?)uy@BpJaHX3v;?zH)J=3q#TX7)(KZQ7CKsGewsrrwZ z2mRmW4qbAhwv$H$Uq@}v?chgxBf+eOePFFt6QSdkm zX+QTgWAef4UEnf9FQEK@d@R4?=t0&CT;}L}Ox&D0scA4BzB!2`ej)toMoFpdZ`t(A z4rMTi1`@V)Qn2mSUnTNygQi$My&G^-{?#iAD?)RS!>RG983BY91x4~Jk=Wo-IrP*J zf9``mu`PmYQ?(=UH?T(FcNJhFC-07kgH8=U_@Aac^Sz7SvWf6GyVC|Sz=4HI$j@r- zd1_I<%z&abA|MkTo|_E%3Ah`)a#l%-{vTujf~vKh68%j7H-f6xc+#*ZF5G1Ox;>dU z=@Y@pL**Sg%&s^-M3mtSy^FmYGLFdkDpUs~K0z?vg>=SaZ#J})9Q;*s7DRvE*g4Vz z818?z98kV&f5^=hY-EAxEM*(G;fR2B`SM1isQm#@w3c_fnHE4v%cx^Doflr!v?A;I z?{x?c{;loXEpxWOf(?hsSu4k~^dJ1xh9sLG*hofbAQXIPF>B^k5#VIgT1A&>R|2!o z)j{+79KYgdSifwT@Gi$SUng=Vfl8J?lN%O?#_c+1DE?(9o8Rw##DoWQ1s5<`aD>$m z>ZgYuN+kw7Kq>x~@{)#x?t4H?1|}kJycMv4P(T^di;lLGFERoZIUt6`GKQtyaTk@w z8A<`iCcRkJk*EUfxoSQ}Obj9Lhabhuw9ZJKN$1y~)hTtli-qz36(gYf-OUJ`cQbi( z=|M4AUD0F%yB)ZA@G26}o za3%vL5VzyOC%qUY|B*}$;%Ym7ri-K|Tx32we$n}9^bE+3oL_>WO?k(_pEBlLz2vcq z?7mGX-v^Bk8($2IfcPt_A2IeXVkLkk?txGMg2FgOSrj9@p)6Om`yKc%v?gL&<#te% zHw|RnaK%(7K_xj4)E@Zkyvu+8)f-b9I?&T@pSiAjdDFt`+6srhgg`%La7(Mq4s+Rp zdROozuo|Mm-o2dB4d9Ha+F9e7LxWJ}AC#si$vh7tUy=P*9=#Ypev1!Hr6EqzB2;|c z_Ci>tV>2y4Tg=&-ila@=<3?Z_uFnEd}V4;)q7me@}mz_LZ6A4;N)4#m}8x zzUR|lyQx*g)1vj=_`(Yc0FMLOPXg#%4>vX4%9eB3NClaf3awg(jjss~Ud+)*cyX!b zoNTIxsSZQ!L_TJo^fsl+^ik#t`{hrNe)xwXBK*(r`G$@wSZHP{!9NPZx%gYK--XLx zxVO=HysjC$>SzXl28cWL4Uz@90S(&M1kW|XKzQ>@1%nw+e86dY%ZDD&25$}Wvq3C)6(6E@tLz$ifG!IGLZ&GHcT{Zi^ zdfEZj!`NjSL6Hopy&YOGe*J!Yd_66Cqk^$>;gdUVta#3ivDuZn`jZ5Mw=$qq`cXDl zy2iU468?`on<@lI^)j3hGLyFzig=p8KPndjG7(}_lkT0Z??1>-n!xtY(}B$XfB_(< zb#n}m>b4ol0hka=gPIFeg99^Rpr4hYDrtBjCE*n4RD86{`}4kUgh48Sz z9X+r*{x?Gue}(Oei%`pCB{~)%o^cWG8pkvbDwG=_6`eaq4M7r%(vQ-7MC@FUf_yn7 z8{(e7-KFIw1XE-d_dSt>L-Z^i1?t;|BY*BkmTWUq^V)+rJ~Kl}w^%UzHodmqe;e)^ zaij97ENjUMNU1!axZB{l$g-mg8Q z!z-BjP@ufqTVpWuyB+`s8+3)XuMn{iGQ-3G`_roNyf7x(4?ek~J zt$rDS9jVJp6?DOj6L47@w18P(Cw(yB1~R|H#Hb~@4^AdI9kD;`#lHJ+UQNDQiGo5t8tB8ogbz&#OMJg0wYG>i;Ji;{Y}2o2Nka6 zo9WUDm>I4KnVI%tf`Oq%7BCic{Oow&S>@JTD9UD1x3#VDhM$5gy?SA!y|@ z^Y;Xqvf6W>Gt$}sH$Fb?alGPxh-;#N1qg9}R)Fhi&_Po!{?ZL6_gkDMMJ;YQTbw_> z$@w?Guc(`F-q>IU)_5#tmhRSg*T#pTq2=m_uITkw^!JZ$MYiwYqYexJORRtM$d8*Z zcclDR=OtpX-8c6lh=A0`2xYO>=E$azzT3)eCFT)L}*YkTX0U_ z0&X%}A5}VK>!SqT0OK^7r+vvqbrcW5Ah7Tj<{U9wAQ2H#pCO>ny0uG=f@{QsU4pJvzzM(+>LrW81;88(L(&E4%pejoj$XQuV zEZYW8rPvB&0&^p0$VOt}`$xtUI9xPWGxslx5}Y@`X)<+`WA%@at3N*S@%~fzQ395y zvU0~{lP)G(x(TWFzm!SU`j8H**`pfBdK3^px^DzaO%j21C{biFGh+cNP{p#B(ibUi z@7UvNr1BKWy4eDRsjvT@c>xTt*h&sq{%Dh=DSR^3 zWyWJ*{K)M@zl;wv{P1~;j8}1c*CUJrU^^{9p{@FrzOkTVKq~SZujw{t#3bxzs zM_)i?NRd#HSy2BfbmLJl2?)fZFO_3I0utMuIk@59O$FdbMI%>#XkL#=wIQ_F2f9?2^J!)Rha8e)k?#g z-$gw6MJu&ZJAw-{l3Z+wCxsoE1bW;%|-CYFx0N-`!FU@ z>yjsNh&+>W9jBU2da4rL7q&Y>lNf(3|!u<9&Bpm``V1XZ=Qa9Lm9%RmE!L>K3g_F8SxRVQv6FK;VLr zi3bBgy13bQY9cKsrwaS1PXLc8i2E`#P6ngZqeAoA+pAr+u_0IvyDsC9mfTz#L-$I=BgGxkf0G?=P@N1R8>An<8lb1wU-oEdVH#bcbv?jCvIgU!bPOXZ&S2o3v3*o^M;GZ|WZTnD@DT zWDOaJ-%$jkX@K`OyhO%)rp(k2%)CFeE;}%TCR;!Un94ov{%J@Ic;`_Cf=&rQ@AKo{ z10u0Qomb6=v;E-2{}Mdm}Y&ByNnr{t6#xMe0nV?Ge0z)0tI zT^^*!=P7241qf5oXnjGw(K$V<1S^dbUYznzRhDwjix0U1wvNfP(1mYaG$HCy-R5h2 z6B2K9w5TV)&OZQidFS_$38$ME9}3Oo#5jJ`H)CmLlzr<1IBv$c!oYLy`1L;wk@x>F zL~5^qnJBQvDaGQW++iFZ%FO5o3jv53BiCkQE($@6J-ay2S32%3q5D`?l_m*5$kaBy7KGdi55{8=Tk_{Ni;acas?_=$ zAa;n>OfGuT0Lxfd4u9@1iS*Mcafb#_xydigX){~9>+7bc;ZXpRJR`vmuHfJmIdu5t zS;k0~1cRD-*@0Z9^U_8Q7ah|#jXN6{SMGbKN7I8qza{gEMn(}dvWJXt*I@TV|01j1 zg$zRh-q66-lL1Vbhf%IFIPNJ@t6wCkXkSG4<$=r4V;7Gf0`6vs_ajDb$9;_7==dBn z#JOmiqrHF2Og4S|Fig;NAc^DG8dpcqsv=bBfKG1l4blXVG9d9CuoYw50lGZ^VXJuV z4<92=iY<=(0r&S2}N2zAAOoUtnHpw}1*0Vrei)w$79Oan9LS@%$! zpe_K1DecIn9B7c*zus39AJPmM$0rtEO4Q@G08#u6D-=3tCl5Yp%L{EM8)tr8^cFMP z?o1{0Re_97E!~4}p{Gxd-T-r$K7mV@flkAyu~d5Yy{+1-y6+Od-Hb57=VjB0q+xW9 zmnx7$dylP#j~$GC!`8T0;)4mS=Ui;GBW4}}Lzqi948o-7iO*dtB~Eg4tL=YOZ4wBB zCfEk0z?oz*{|HU){uz2?cL3=$5V!*A^!HT6JwkB?P`Tb0 z0hZs-7CnTX0Bd0Y=m4%lfKui|QHc9VQiLv{fuYiMd8__b(h{L!{IZld9bKbfsPO}( z5aeoS5g%Itv7Psngc3lywo~2+h5^$`!TM(z_U;d_*ts+iLdwQxlH{+_j!xDH+a*`+ z8VWQ5L1P2WG3OUHfH|+_Z*yK#+%#b$5anlpj$-@m+k~i&7qatR-6eIzf@ZLEQD>=p zzyu8#4t%XHj#d8Bvk(RNOh%308JgWI3(E>cW|O{$sVtVfW)btKFO;0A0!;5bkQ{_6 zfg~p&uA<`*D#guZZ8Qxb7f?XsVFsN!^KuMhFWw(zn-lnUr@<>yz}*V_Vg#(aKpXf< zQi7gbzGrNf5Hf1R{Xaw!`oM#i(KI4o9q%W7vhBe(e=!@hW4r~}GNzMTBQCq9p>vB$cwDJ-RVB}S8-ouuJ z0Xyp}vatq#7-UzmzAree;>un-{b{*o4-!i6px6< z{YgYX%!dUxqYn?7&jyKwe|UdX5I=a2i9tcM2nkL)7KqIcN`SHF%R5)1#mtI;JAN}$ z+}D}B%gWVu{@X4}LB}tvqiX8qv-N`tth#I*Y(a+sIrXY_IB6jCoE(v#QrM=I7W6mA z-+xb6W_aro+D;+PJKWUpmg65nnQv`jO>+AS{oE}e$4JK45Ys5)X&3`~FyLYw4=7=P z(aQ|X9gI=qH(&i z?913VNFZ(1Il1GgAsx#zF@t10)hUnKk9P)iY-1yE~&3abf$;(j0jw~7x`Km z(*}N55N4={OcJ87n!U-Q7P3V$wf-$xh@4$#=muYiRwTGSSdt_udV!%SDD#oRMA|I1 zAZBc}Lz1^cO#jYjhDr<537(Oa$_?w8JKxtE9j=0pp##f8nsiL-z^lf30Ol;ARdeOq znG-waB{{T;@BN*Ti6Y&cIJQa~0r*C9jOyH-xsmlKo)D*>yUuSMOWTJTFt}jxnGfd{ zMwg?GW-@Rlc21TpO1U!$h|`5AfR-a^EmqLs?dKos69MX-sXB=DAGD`mW{J{Ic)+#m zX{%37T;4b`{km;(ED`XE*ftdFlX9yfP|!?aYzeKgp(L_SPuJ~+uSkP`dl4A)nMOQ& zTn7aJedQ|-X7nZt>DY&6i48+0j>M4OcmF(L{yi$m?z0+C9CIJ<^sPk<%B}`u_7~CDHi73mKhKYFTIgi_8xpTms49dkR z8M)i@$HL&QJoshCNx@5U=oKe~{RB;W#|B;SB< zh_Jm@)BX3umD*+>`639JZtV^?TCRpLj5YZ(Rl8TZUIi%&oBA>nc)+{3{8C=v0U4B5 z;s5i1GQn^@IV)?K=atg1;b_CT=h2D`Z&w~Z?w}xFlEqG17yZ19%sP1go`GNXVGQ4_5>KKN%ZV^>V65-=)j#ADU9VQhLTc zrj7de!Cu|_cb&{o)MXy&aMx1r+AmYk>WhV}HqYUFS3va96q8DRmXvY-f*F=fdMbAE zt4-+M_YdAr^%40DdC^jOw%e0@u(F*7P8UJ&JDQmoE(H%I#5Lm`yY))0vwCBjJ*7wvkpZqOx(}_M zDp_&HadzDw_<*f)v$l>{a{RI!`Ws94Y$;m1Q&dC0!>yt`S* zlBv6)SnhJIRd821yo2yK#6i-1pF`(24iVefLFp8>!B{`l8K@(ty36UhSMqxoWOpJ0 zu@8AEhzs#Bo^*S>><9q6@86I2Q!1DY#Q|TjpnLX)kQAlzB$loTJIBQAyr|Aw+iA<2@8-VXEc=& zKcHYirJ>DiKbDeL2B4~#`BTKZ5n&>I^ zH$ig9p=GSDv4wOpN&#ae;T=xqeod@p7I;(?n_!v3VqL*b{g)wlm2K;Qlvr%{s#j9; z&R6*l>~CWb|x4(!R4qaP2ueT!=f!Ed8$+tC+QZo=wV* zN^TCpe(&tTH^3%9Le6Ubs#UBmr{zzivO@FC!M2G{-jD7c#0ArZ2M;%rMT-B2zKzM#!%xAlFpGkGG?`AIEaBd3lJ?hv3${o2X)` ziUglaQtlu|KPlkNgN~W~omTD|&MldkpQk6t-txMln_$_#Ut_~aI!}Ac(RX{gp%@_I z_iI&D&MII&tO<@m%V`or!u2x!l!WowO3k4%=hgtitLHNlj$Z$ z=2dI!aB9odw*9aQ<|1i2{TB4D$rnNi5mr5O0TcD%=@+=y!0ir!TZD+o^pNlCKbjH+jXq?;k!i!E(&Fa9AfyO~6#`&ynqB!+A7xQQG^L>7_~J z7v)CHP|#cRML(6=!cqk;)whwe8sd>ZPn)ig`u&LjWKX)UTob&i2BOBxZv{Pl+K3<4 zMnfEbtp`Jh5soH^hbBEgZ*;M8NXpwZhS_tzy4wA%f%mvZ^>Oc--b|ijZu1Dw>4hV# zs>(uF4%-DcO~J#6ibMbN^M;4P|D=11tfvV0hv{Z;z*DV9TxrgjF5;Nbu)=3J`)xQM&?6D*dU?5AMl+#2t{c%Jj~y((lFVUE>WJfZddA9{H)#63KlkwG`1* zLMe8F{T?`l$Hyl#@vYE$G)P`p!ezY!q3cR&it(YYH6D}r`=<%F&CyU>qH4Pt%0&)lI_1OQxgW8qcmBnsTMX8sY$nHO36b++~K=+ycEwP1}xB=t*B$o%)&(er9DtZ5u{ zk%uvS?g|ZiIAiX3X$zir&ZBw-yejP?De6%9hA8;kZ9d=VvK7SKB}2WQjxW@!C;d|Q znv{7@iYNobQR9_@|U&iARF2%sDx~hi8VMgzTac7SfMW_p6?pK6w zXT94r6(y~{TOkc}36t`GvHPIQbFQ(hjKVH1%ga+jA(G+&sCy9MF0YAhBp_GoD@2cT zI$OU?Uwu8bAgq|xhqcTNSI99EKzEBeaSXnx8*|=oA`MA(%0rgKTZCf0h?lw@hF-{= zKKQ1=nO-51=Ipulr0RpD&WzeP$aqYGPO-Ja7Li}czGBWt%uE#q8&{x;xqZMX|&*=3v{p8~M?pF3PFh&RecS(3l~fn#WiC z=P`f$w)}2~qz#Rj{?E|fh2rK&2jYtBA@+PB-J?N+oK$)dQ}kX>_i*-?U4~;L6)L;P zn<7-_zPu1z=r|sn#Mu}K-JU6+&O-XvWBD}d;w;`lsIQGNIx;^G1$RCwQ=xN)0@~zT z2TB{DBV2-j(w|l0P%Yidg^a$oxpkMDkDjjQAk!4WF^KJ`Fo(TqA_aJWhu=GKtkW_#i`e%j{EaQ|)%luW6GVR)J z$KG%1n1Nf?x_!G`QvULz*9%o#Q?$3Q#_E;EytuNLiba(s^=k?P(eb%zdAr#^ z{Xjl0479!iX4+3ewHOlN7B@kAcaPnLo|v6BWGG@I$2UyJM_@zu;uN)?>{Ea80;Ea3 z|IVjQHq9$A!;dHL8rCl*aI`<;m2>Y?y_6_U^tfPBH(uxx`D?2-i#7RtsBj!#JH7CR zjd;jj(S9V$-tCQJj;^|g>5v*t0}aY>gMDr(L%(ceIw*Thcm4P${V2U;xhro&D&IrHS1nw9=Pa;mlP{;-w}22F%4bqq25pra9-pZ zwrG2T^@#`GBZKvUJC!lhAhAL5ruIZMI1Wsp6~AF3bPF82aP>?_Q4N@3%`1zpf45cO z&sRWOsS2xW{eDB^IlRip^#kf!Du{iS3vo>~f*3iG-CFfX)gamrYom$n!=ctVs*SQo zU$uu@FXI|O*bneQKvZu=wZdgVTt^|?p64^ft1-tL>_)PZED$J4OpK2g3t`qwCQ@Z*oStXBnVjKw_ik_($965v%b z;rL7>pz%eoF4b&+sw9plnFBs3#;;16hqTYOa%B%^1+7p2lH~%odaE70 zN;SEpo|)@|t~ur`TkH5fUpKF09SBhu!0WNWkh5y0`lJqG_b~sbt&~V9K~fp}VPeEW zuU@z{A=Y%=gA4v`3Y=TZ_=h_2i;Z=PCB~)p2^y_D_u70PoB69R z<=EHqtj1Oy1wMyb+)wi0FLxCrmpy(O2lF{nV<8iaqsUOsDh;) z3=ZP7Y|?ymVR7%}*X zkbS-spx%#nRpUbUZZ)3#q7W;uato37pX)+$rteXyX8uxX6^9$QYD5lhZJ z-C_+lS@6;YRZ_4n?zJWed6WivEW|yBw_Ts3Qq%lrY;e8GC*<;g2j-pUwNFE!*YCVN za^an%rgtwa@iOjc5vgEWe zt<&A3ofmKoVxVvo4Z_jLraogTF1~emd=|T#Azckl}Kpq5IsmisMfavwLva3KUw*1%E)dIUThKb_G$HikpZyq2igM%s=<%BPMiG+6d>fVxP`&wX3l@PY z;#4QJo$&3nm*)UJF+jc3M(Qqp5qS*|0NaB0c{_07-+X85`0GKA{n8ZzQq+oa^pPBWE2 zE#PL6i1mc!t}o0`EKgC-KbE^#=@uOZI98zTPrp8#(E8@vbz$!_Xh3EeNk*o>jdffihxq+6az_*cUj zlzHko7TgXmp7l-AlX2RUsssZ&kK9`Nzq3HF*?A*Xl3Zs{6$rW-N~4VDSWiIuuCvn_ zLt(iqWr6X{@z!A$8u3#t@=RHf zj-l5PLGh`l;iYu(N6yDVUXwl1;VCC9A(t8Z8363!Dvd4`0zGfUSGL2QaV9fkP!=k) z!beRUhs5Y~T42LAUacNmEI1P$RW{_AJZ|xddBS58E<~Yt6)YWH-_A@LcL-DrAG;n|_=*?Ig!=&t3@=wH6wJ20f zX4zs6D`F`G?n;?aI7mox(xoIoCC2|7*dSDiY;F>4Tk(+M z=Y|)@$5gU1BC4p4t%)NQ;0HZgxwGP=Nq%+em?zz3I8Xe`+M}JHx4K?5f_#%Ic4_qj zE+{zIFmSJ>g4V){gZ^~6Fas-a_< ztozLVUDkO^B`>9SA+|3ym5sBGXYul+2h-H5yJw6dI~;HpV@N`!$BFwvfAvbNNLMDB z`&4t>fYSQr_v%Y{4|OK3>57ec1UL zC+^12&p;x%@X z_Gx@F`Qi7M+vdm0k=h77=L!o~5WLkgrdX-y)Fo;^SE$aYUTXyu;IwEurXkfs18@E~#Xpq^Q#89;ZNyWOV1a+h| z_KPWJ^7nQ+8(oss>IuO}E7=4Q%k4|3<(y!?JQmE(zzs_Sl)n$wn)%$!PpPobxo&Oob?{9E~SyKqC zU#cP^ga7Q}r;PpPXQgEenW54b%O8JUXsdQGx2PU^_Q7gus}|g>-txF-Ni0Q|@@&`X zj3lWm_F*MPwySI0x~a?J=AG-LWCG4xGFR?sebW-pQUbE|HvzJK7OQdpcx z443H@)mr>@vnC5Szr6As5a{pxi?E}hXWI#CSa`gr-V>$hSiX}0}JL6vp?mmT;>57C4Bnn z=|_Pp0_<=Kcw4P5$Y@}`F;M5!=>qCmOTE-URq*T**sB?r-@ID;jutWWp6Q)=? z@$e`=lVEz)dbJNDW#f}GUnIp}b_Cu!ByivGJpHg%Jm}c&#@qbzty8lFX&IgK;RlCl zMbaSe)z2?-#~OY3kEbOA16@;-^x5IYB1be0W;o9c5zhw9KNjC`hL_Rwn%q?TjM!DB6 zBd2J++6HFfP@nr(UG>A8Um;HB)QrZs+JLf_l(;E0;=QO{1+i0!e7@Gtm6NcMr+BXA z_y2Qv)f}I%FoO`0M~ZUb5lXZ5cwE|;2CuTVA;m7z$4qI9fcZT1ogjIGk6xkY@ z)tFi_os`iN%eWEv>BCyw@mBf4{Akl+e=~RBZfl%Ir$&iA(1xFGqw$P(%mcj%t=?J} z^McYVO5qL1leA%K)r*AXeH0bsR!or{Gny&UqpC?z~#t#QJm{9x>^S4`8GC zn65;zOPw0Q4I1V{Vqurm<}Lt8xeH51Lo)Jl;dPS$j-%5PXOE3L;w5iVjS$b$amCNB z5>x-+I7z@id+xFcCO?8(I#&Sd0nONo`82?kt^C5n=myXam|*~0yv?8VL(B{SQo!{z z`+fmB@6Xy)?Z<-q-8AN6hQ8!;)7Yjd!9?P~c%Z))>nrvi)A5W>u4hoG$2THd8dKu4D zs+;JM(`dz$Rg=3+k!t0hjuQMER$WIkQi9pi&% zdp!}bIJWl6ruIr9^qS>csl_F>qM{@lzK{Jq?exJW6z&&SJy|BMfod&AI%Tk*1mmzH z)Zgl%V3JNfS>wY5)|(?HJS>j6mjT>s9Tfn`0y$CL05*o1S2J(0G8py_gBF>l)Oe5r zKaL5bjl_-=R%eP08ciN0-I`DDLXpU>KDHladal!e%pu`2`?5jbiN)+s#O##<-7RHR z_f3OHsSk4KXQk72gFNL|ib)gSa^^K1k;WLGW|*5ca=KUKc%&BXL{WRrC5&v5y?1JS z0?@l8*|hXN`Kf1-&Tlrdpz7*1tfB;Yol^pPBZGM&Vg!Vn(cJ1~Zx8|mc39|zwGZ{YtHPcvVtWZ{>25)Lf#%cC$%h0QcD;@ART`xLJd#P74TvVUePg zX~AFQ&|ty?mHi+|E3<-={wQcH#u3Gfd1i|B zI18$ig($XP6QOvURR05Q^Fw5Z@awKu!B1-byC@~~2XKCMRaK)f02xTAnKfN8^(av3 zw4(Q+$=5Gux`&5>I;TAm+cQ_=gL$BK!`kRmKNxV@bi=#;PE$YNVCowI-^N7^@o?@+ zY)b~kR#jyQat%6-Jt@fWlQTY(JUf(}b{Bq-R_fIEJd{wvDC8M8=Vn91>D$hL64G3x zeV)Bri7)6{49in2S`@Q{G36;xdH%59ku?A65Z!gzyEC-TrtBHZ*w<^P-X%M^ls9L^mIJV+Uz~6(c1^0m{&7pybyGLXHT~eL7c2W3sS8y_D+*HcH-p zVNl`=5!m9Hg#i`u(>}(h|E^|&-$9F%f^2l};B5TWDLV3oiXR|o_>|tRPXcPuma0Jy z1#`2G7bH*itQvoPd?cr`*;jJOStR|ST=G<5w>RIh2bY^mX@RHLrUh@mtURQIs+>lG zO6d-eVE2wU-T7fGadykT(r)4{!MHf3VJ0s$GQE~A)v?0cc4tjRT_m4LNCROcc6+>A zWvXp|dVG&?C;`{{S{F8f%uHihcm4SJTo)c<<7V@|X{WfcjGjbNg~ZmYFKXfPi{2EL z*zpYNuRr2Ug|19|u5NA0$#-BvE&4l7+}y<<(o#y~er|3lDRc2MW8k~6?kAtsz*zAK zmWikr149w6=>CRwcqS298&k4btj?&XvRDm_=ux86Z2g#K%*sgJFSGDO?_*bvXTk9= z16Bsn>9_r@gAjgueNls?&XJQ8$B#mbjRv}xk2>pjrE>T4x{=BW;PyYj9^{pZ73-?;>%miC82o-P{aSvD+K7TLXRo3PNs zo5)y@S|ep}ET)#`)lAI$-I?Y#vh^dGKwxb7(sTEnD~R^P*_r*JdldVz<^A^SpRzqQ zq6)|mzszC}4s{ojXRnr+Wb7YF4FqP>FPLk7_o*X+*byg-cW(JP(WPPUbIHb+hgiyn zGjbPUt~gZc)5+Bx90kuV!tx$cg1hVTys0An=|w7s;^<{ly!lWo!MB@L4f%Blnh5T1 z`GwDRTj(_IeT|e=Kjr%DhW;U{UR@`HSmt1Bli}S% zV(%Kq5N?>h7P~dlE-uQ4DPATFp9{jwlE5_qdM|c=P;<#yt<0q{2?~Z>CPBr~gq(eg z+j%@M<4$FYAScd0(`GbrIx<-zJ_j>dS??;s4xh(IQIIA?Mc~yPi2A&MS4Fb%M&uJ! zT7tkB@y7XiOOaC6xpoyo zSF@?K*JntR$V0uxFE+g6`d3xr8WGWYfa|=!gqPY?4CNapVjS@kW@2N(Igh5*qZ!-# z`*c2AV^V*bkg@n`Gr=W^cKyKUcGkDIbH=VU?n~72)(dYu{{}cL{*M>2qvBy?$*vTi zt@T^Eiqu4mYWna2m*KiBL!AeI_Rc(fcbCBW)3#gHMm@~g^R{v1f*{)4G!rB-(=^h1X8x+{w9aPIoH08#A@UH4%0#IsK?WpN@~w(>mJbn55r zz7U517+hN-U^7!iUPqizEkMx8{P*BJca3XugOfhspq-KJENMewuEl@RDwXRTE3nc! z@*#(&VX1-zDn~x^v|>8v05f1)m|W*rSNIEeW6q)g1)2u~d_&TiC{Fc|D`BSZezN!V z1EWQQ$h}s z_SEFU z%G4%()qdIW1YUKNVDK^n9D*aU1N;^TAl`v$Y7}9NAv; zJ$eaOQo@sU4Wr9!lWttTX4i`je^eaL@5jydPctogD0%sxt>X%;T9gvWSv{Of%^9Ev ze;=rtg}8=u>WSIIkgL=;jTF0$5xZY_lh(n4401jZ{Vbvnh^V3P?ImL1y}`o3Mb+~p zciM6#+^%yZWnQHUBGApjuZx0E8`@Hgm!!N zE92SEuBXoG3-9AhdTd@F9JWY4 zDmVgG$MVTgFawQK$NQy`xl*2`%r~UKq(~WbrH?}KiP=TK&*>s(Gs_V6@5FKm=?arX z@vPnh*WsguHWRtxjduC^UucuzG_ov>!4x$667P7H+ojboBEw7_r9PmlqltenZ?jx*+?= zv)eq4j9Q5q&01ppctHt(7ZrWQ-CiKoRt))wS_=q9PiN8qB=I~1cKY>`FO%u>qY2NN zI~a@1fPn$w^z|&{`tn^`pad03dl4ZW+kW{DqRfJ;VA5B1OXi^k{naUwTjWnv{?&O{5L5YOHr$7LXE!CJ@Ez>VG6ot*G zD;Q7yQ`G~1-vPR*3?DObjm771w`6*yE>@&a=b}j;{rc>K>rZ(s0) zy>&F)sHLkDExqA;`SEJQxnfuX!}f}4<;9omsqxRmNkaWba#P+D+lGsMdhT1U%F>sE zKkV|G&}j_6jdL}uE^YiMVsYOl`@68r#AA!nPuQ@;3G{(9k2CQ2K>aju!2G$($Y<|@ z+v|*PFrGS*dtCO*;4NF7jfeE^#u6sunIpgAZz}fEA5$H1Xv06!TEH1c&)9|Y#^9R)rLEW=pg?qIb8<{IReYvp!C@E z?F~*o;kiFrt+g3V@$7K(8=rhyS!Txk_VjnTNEu%#P3fMWkQG_RT$IInDhGM>dronI zk!xeo>i|pU8}in8giF?t2-1Sed!DvdeD7GlA+NKg&xVLL_949aj&4$}*6A4KjWB*V;SoPjQNm6LTr zl^=vY^yGwpUBz{@tGy;j7{nO}QB}2vX{}m6BFeo^#o~7K@CJUwe8^78-ckYeE&>Ag&Y07K) zSmIjcnpoC0Uw6ly=acdejPG?jnph54Um-I2RLdhYa;T6uOiSWlL(6*HoeWu);t9su z->N8GTm@8_rYH!XnOVbxT#j{YO)(xc)_*O62I>TA2&5S8WWs#`VDZR9}V;oA*2BL`8aLRo}As6n|YMT_+> zhKw{Dk@YFlqkF}aeV@r^b@f#&AA9V5>}yjK!Lr2|*CX<9={9lSiI^79mMWTkWf{ip z^&LL$FO38{vVW>8Z$TBpV=Z}NgjJ@_2_O1!{msQ_%I-vas@^h#@70t1g8xLPr{zAb zqwRxZ#*2iZM56l5kZCE?`x>VE=iouLKEY_`*MaeI>2h~7*he|tKr{BRwXA5V{wYGz zzoIo_;CPt^1W>e%kjMkS1%_SACN`PX-dsN3Ar<{#;tFaaU;jAb5hw z7zfLYB>eV^POJ5O--a(Q6u-Jj`+X8|VY41@yp*L2lHwqe66!d3c1H7O?j=B|l7kxa zqRFaRf)KB2V7?(bzqEs4@5`I8YTm@VX#s8=QbRUZu*@jK3qW2!-+NbpV`8d%$}td4 zGfeWqIiE5!AW_MGUY40&X5#kY*2;$zUy#wX92|Q3rn}>&6FuFxF@e*cAb9+P=zk@Z zNk_Lqe_G*o;fa5Q#Qkvd0j@6=x>vLUHbD1_kl`EDMIRuMi!mAi$j^0$RQ{)y$L?$4 z4U9N5ddb)ret|Gi)M+>ZP66)sGVqS+^}3f2X$ocVUaF5P;QUroo+$o9P5HcN9QNI2&df_?4@xLb}8@^ETX;T0xf1hmQuyj23EB(g)3%>TqLIJuh!rBM{n*O-CI z=plt$`j^BH#{8tRZgut;vr31{ELw%`AUnI(cahH9S~RpazWc?CUz}gRPpH>Gy$${S zCJb|KtgLi!L%$kc$F`KUVY&9%7h)uDNfU7Y5jOolV;!jQ>S}ZTO^IhaV5PlkLzg`y z%YXH^^i!c6C%YJCX;ZG$}|-lZ;lj*eqkrlIGrtFRjNjxdap_2#IJUjaI*7vp=W0KrXT zuG!OQGPJk*j$C)2)rm&=)c5#Int4*-!59dawYV2&hp9$@Mz-jZ z4b-y509oi(moK{A+mU-Bzy8@|-Eig3N7lB%;xT5ApoZ>(8h-p^PZ`j=dDWIoHk(8wE5GgABC@9jsI#+tK=m-Lk2^fvw>Rjcy|cA{1mHaP^|~%I zVST~x7b_j(>L$p6t0^zX>#P>!9C4Os zteuY7oBqRJM+K>KNc3f3VQ2K$rh|y%NSmcYy!P&;JHQ1uK8On8Cq{Vn%b4QBP;GVk zH<~w%;`i65?>jAMh&A)$p9wT^5@$N!}XNZ#PU8I7- zo8AGse~us|Sq8xkmCP$by*?u2x>r-Y_yk8 zCv)zyyUW}3hx|~LNUJpkcZvuSWj})apFE^D=jyNS*r<>`zE7nkBq6rFqU@tUi7WEG{JRu3>u6rJc!8WB zg1cXQWg_=qN&W$7{1NL^eI|5obsC)C!yncM?aRh_*~hGlKitb8dXnr;u-X)3&61=4 z+Pc$yAeQUCAd-q0Yhc}ICHzO+D1AS<8z01t-bdobZ@@gIn}zOk`+3D-CZH07WZxKd z87kPMxAdKSS!CbMy?E?P7zM?r=4Z`vpIDn4IfK%$V- z>6JPH>enMUG2_8S|?Lz&V!T}-QAO#qisyjEP{BUMw1@$bW1pQko8Mm64X zjT-$!mz`Q-6c7X}_|=~}2l9he35d^ygt%Wb$i3E5*>w3n>ngM-Fl=4f_z6WF3?B0K zWRr0vyzaXv?<@Yx%KszF`lpmO`}WaW&$~Rzw~|2sG$ytsS*(*sI$Ar(qDfpm$Jh%1 z9*znq^&tZL*mLVfA2VsTucS|K!%@j#_meSQ?o-asf>GqEbFZ6VwYUpQdGOuj=*fh0 z-8Vx5SvM!RK}iE8_ukI!--q7W^c1Y_n+~6QV&twc8`-kxw;M46%4>sQtLV^R*wwZY z53bL7*VNmlBc|v7!@vFmdzsAvhQxa(@;1X?v9#6EweDZ%g@O%4aXSahAUHkYrXdW3+2e-4s3dxJnbXt(s|Lwjfb_P6S7pCXJ>fX+g#VKJ$NNt$%C1~j|juAVxQ z1^$LFbROFDy_>H;pMu41paljh3gnzD*3{3CV>l6`91z6ge`C}mo#``zL?k0fgz!-v z*zcoQ2K81Q`4n!9vY&=4@+dNK>n%v(jg=$hiE1umD>9&2B@R!I#Tt6O{j6)j{wiQ7 zS8R{5{v&84CRagtZ?`wg8uk2d`8Sx?RY|Vs_`YUHk>h$|XykzUyEddj0=Vp*J-}rv zUj197@V_y|-xQ&1$tBQQPr3KcE(#noygpWEsHr)>BHJ&I>Sv2Hk(ihMcnxj;X!$&5 z#ErI*r-Yr2Mk?fwvMDbLyysUjDmDYz?j!PxnzjTHQqfzky%Y~3K@HE@>@**Gsc7-k z^#^uNBW)7qS*=oGXNY=nhT~7GfY2Rd-ip+SWDx&%vjh?VDgOf`i0WIgX9O&WR`6m8 zj1tK05`CS7s1a;D$x%qb#W$=hrU4SjQ?B;nl8Ty zyD*I|x?O?wv3mpSm)}#bf;Az<519~J#AjbLqr?h)V1>}oo&K*It76w5dq%k^D!kED z=7&d9_DiPfx#S%Y&;VTFYEOc^du96fh6D_TQldt>O^i^7;)=5!QX4F?e5s|SsqFR- zVSITkKZP0Nu|LXK5_xHx%M?-li4P~UL#}@0K-(jQ(AotA{VvxOt{LxP zm+r13mC%UDHXQy3|Bd24Ez)diZ)>Iyq`||XV}^Zd%jDz39qO^!UL%Nem`ZF=(E-!+ z%oCYX!NYW3w#^$q^*!#S8K{UPzYK62IQVOy zT_1G*b>4apDrx#E6CsmR(~R!F!eErv_bbrx;(|gW& z;<`BMa)ZTJY$TFW-N+vR_O^Cjc^McP4+i1V*5yaSS<~;Cj0Le~eQ-&Vwuumlj=OW= zUBc0s_fQ(F4r~0f*qwnRsioCbd2%T$$?Dq~2GaGfgaR`F!kw&ZjEoBd3rxlmEq(cl zHw>kY^T9XSIeD*?@Adu-_G&hNtbe1x!v$~8$^%-%Z)&5=mx57G$oRkJZErAo}i z{w`$Dasj~!#8yxs-z)1s_!dg3?V~}vnKDvB75z*+QGgJDix+#b#FKSrA$UbKd@&I` z_%<50bGM?CYuoX|pEx8pylby7sHM>cyib!zZuZT{H{>>>)JFNVFvcCju)pnWK12VqSG&*Ji16vFRAx84d5l_ z1|$v@qEOc#a#ct)>`L z&5sSK?Z8$ATST-1}lBA0XFZ_T$nWJnt1y6Vh9s zi9iyV8b!0L6%~gR$bIaewMOK` z;M=BD_~p!XAXY@m z@%9Uq_|I>4$7Sy)J$(J**wv56Nmx(b(MZ3>@woXr&27FHvbR?qmlpSiFRfK>Ehqev zs}L#K9a*ZKCnxQ?+pdYas)o69`4V0b+d0;gj6Rpizr|&FE~|SBzu6SJnf1E$-In;W z$NB8aDzUdkBeqGe)w4z_V}7ii@Gm$YtFCWTQd*R^Gv#>KD2d3DOUV9`+)}W#ZgtRR zH$(s1gDcM3yQ-rdSUV#|K4lReHw-UmeV0&239kDrEAmrbDSXv7e8?6m`H>_~mVPxw zReq0{ni*2mZk)UivTkIofi-|SlGB4;v1MzBYqm1wZ2YKWFLB+K87AqW*WL}CSxg7@ zy-d_Mt9!Aj^x3OU@pM-8V&@E886Z3!D8BW!)@YDEPF_0=l~^I^MrA2cAjQBuQWZ9` z7WX6t`Vxz8XYZ#yp8S}&J)R<1*0oFdq4bHd>1X9GbT ztWEl`gK>vIZat2`99s@r`;B=X@9k4{B9GpZ+8Q-j^vV(Fr+6AJ8Lm+VI5(H>-PhTQ zT(*s!`3mi_f83s|N-pqMGM=KbOW_Bx8V4pujPd=IH>YTCnBXKlDIf|gVHON&=%MnAl&S*v7h3-=pb=1YtmSP6U*E6TF7e0n> z*fj3XROFgvpIo47WU1|#Fe5Sj>>h|DGPb8B#56?@x*v=mv)uWl8XDX04foOX_9dZ5 zhdf1XAHI#s(27^{dHm30-sisi#iN78fkZy@GQ~al%h5~g2RWWtw)-M3nw&F}*H{=W z7e|x#Tgv9;k}OlI*Bl9+kp11{p9tUW*O zZkhQ?5h2vMGdB3%ZJRqWyE1b+sNmJCc0eAao8tNb~g$2zL9kmjcFoDei_Ht_Tj+)YlcRpNrKriwvp z^lA^WoS?z_?p9;?;l{Ip3HnPoncTVp2Q8x^lufFE`d$PQ|=!9D?FmdT~N$nQ~?>(a5#(sMNJ^$tfP357uf@hVgf`660e9hu0d9T;;f#&&v3-w#%&nI0zN?Pt5Jd2(u z38$bTzaV=I)o+4dpzVMP=Zd))f9kIe&3H&l+C?K6BU7w;iI(pYH0;Efk`b%MYocKr zNUz$R!@d9$OUkZT#!XEnVpAM;(TTLY;MT^TY9?F$wI(bUOGa-@2`gaMh`s0~X^G9j zf?ghE?YPOw^nUW`W5QQa0Sl-7YMncn@SF9Fv$bL`-5!{eT4_m$0z#F5h=8BT*b=q< z@wnx7OHIT;rFvtCQbLZH<66%6dC`|jXnWa;(T-hD_MHn~w-Y?7{X`t!KQ#7u?vD2y z>A3%@^H#+dSZ3}FN4)=O$PQEGjz+Ut?_LcJu-+x_x*AC;zc|7?R!6LWBv!sl>i+UI zEhPc!WDghe>%jJ1UwoDo$JnA6>qdn}b4s#lN5CNOiC^Vf%sZ<}5l~;==)e5bh{bYD*uaSOdJswQyrQM!eBjc0KDS#;ZYYaTeSGm$ z+zBIj(`|?N=NXD>i)~#^Fzhy)gjWQXy1+bO^Qt7X8uUzbm)LMNKC6sb%3qSyavr-GW?1y=Z@<&Cf(sOLedolVyS@vpOrfLyKARk-*ga@ARRPXzFg-fK z@qXu9ZlnWxVqdM$_`!7mqM#xjm1xdnGZ0HX1{^>k(xk;RN z7B6%M4IFq|=P*Sb`hXnfHU$vX)2qQyE_-Tf7-UbmpaX4`^Ed3xGAJ3*dhB|I6o2mV z(EvP{%Xbj%_3tJlFU3FG{!+()seN_ONXdRaAwoGTnv>e5T;{{=FL%3q%A;I%r5?4J zlX{GAMeIzZZ~7C&JlOsuVV5r`mG-#a^&AGX#C|omgv|S!Kb`#g_GHA~FX;@urBBjV zP?pIvyadk0GRYn{Oa>N$>i97eCZ++>sgJ-!y{V6nr&lAwq96+=!&msQ!ivxHu(|yj z#`FXX|H)?aUN`p)XFS~XRDjNCb9RKnI*;~amn{mScB4z<2;xrQzMK>wR=Qgv?DPK3 zGCpbfcF)l1FHkX(v7MZ9E`IUcMYZ^DZBWK*ZN-hN{AK;~Xi4g1nn zpO?MPo~d8hucijW!&Kmfbp6$C+&lhgzjL?g-#VUvd1lJbccoKdb_I+8{LJW+-Hlf$ zdOw9}WZ2BY=|}G}d0V!_>6J~m{hJsz>5rn=5rd=Q;GT=_ggLW4{n}VlFckpq4m9{) z0r~+1m++nkOCs?|`NG*oi-PCVwpIAkO2!9LcKjQy#99v|iX7x@GGM-_bM&KOAO8tW zj-Mek8DPv(&*Nz*VtV?SM@BecN`~!6ZD^P1Ot)fmS$U7j=x(-F3I%_$y>G36?Tyf~ zosC$pO~cwZ?kOfdUbOfxC5E|L4&9!mSuI7Xh8ubwx=RmTgBRkx<5T=C%4_qZ$7MY41^`4uaF;ogDj9@$lBivr2Bh;HqN|t*@yP1a@TN3*r23&_CeqU zJr1x8U+qSpoML(>Np}9x6?QvLs`azXHPxOP>Q0$c1^iZhuq5#xtH3(#-|z30gLsKd0f+CW0xx)~km_mRzgAl{U|nx& zpAy(WpXm%oNIoMgg&i*)(_ z+FyVf1aA<|at{AbyMQ-=Lhev2HPPmvvgc-8ar3Z*Rnt&ibgNKNzjl1pR(d>_1C`#I ziOpu2_2sm}CePXRp%5OTJS`+5qrk82&FeN3a2@%Ht8!S&KHh7_Z_m%K`(6)cFtO7t zA73J0yK{Goy&iSsmK2fEc7UM;if+3qc&w*Ipn5-EB`u$78W-O`&8%|#sDbuS{BUkS z!;X)}@x?TpQ5>p)hZgMu3GkG~I#RQti})HhFe>hQ;ZIUr^w+m)x2e(g;)I(FNF+cR zzA>6ZW_vIEXZkZX`i-`V%G+NQX8aPOT&CKuTI%eD6)QHWFfT21X`Q1SX4&Duw8Y|LJvF`(?4bkk7eUeF zA^Uf!<#-#GBxYAR-*?$k{lJ>hGD&aA5iEe^(h4*A$uB)loV| zn?idHwoKd8TZ*qyFrMgIBKGkU#|@-HVO)1$?;(A^28Z)dx2hh2`zI;oCA!;!M#OMO zOrSZmpeWuzfLEN%#I?0sfjK%{?~C%-YLm*J2;M9Im1X$iA3Fl4V0kbrN54>tRBuF0 ztq1JNXf7+?p~rdkW#*xcGn=6ekv9=OM(aXk-_C=Gr?OFNSOwF8o~s&m z*glFwUwyx2Rb1(?x3f9BXW*&6cJ}TvK-^T6kA)I!^|Lw;l?Lpz4}p-etSuz zOyYZqQKxq7ue~m_fPzDaw>918oJ{m$iD(gld_zr0G{EWzr` zqfCFFSd2?Tzh_@FTs!jJpu)|gtZK<^B{ZS^mU}=0?f6(KAriUL2Rf$Z;=%Q5bzAY} zKe56Qc(`)K*U}l(HQ|h;Mq786lD`tJ5#$~W_+00m4sibb@L@*}%(?)F_dp8bMXnAQ z0db+PfD&3r#YL{BTN!GcTe|ORU#(gY6#Cd#N&tzuPn?UD{Hrbdm7}Ai-*sGj_ABZi zM=ai(iwB`=l}S@_05@!rnW8q%MS zKHTc)Ez+_2GFM>@NrtxxI^TJ{Z|IsyZlntT`m1xi==p+6^Sp6oD&lo&o@EfbPNEy# ze~|xGNlT5^JA57iLH{eyOUQh%#lHYpG)8*Bj73m1&Vllo2@of$K3#C$`=1IfMZ(*SH z=ekCc22?}f2P@6#k&04ZhpobKfys*_!x%1akTZJ?owrDcQ za%#axD<{&#pY#^R0%LZ2z<%LdwslLfLjQ*5rdittU=Lj)fSQ&B5y?ymb>pV zmEZMcD*g~|m5judJO*qY_i#=aJX!b(@hOFF;wf)UtQ~2`vHAn)2s-yv`VMmz;^uh9 zs=&zT(tZL+Uz+e1Um+udb;I*gVEpAgYwtSwU%SF^WaVPt>%XIec?IuDo=8HQGu{i# zqx~%X8aH0$jZF>K^3KuNxrizb&G|A`mulUpa6Vh!F)uPo;q0x$M#xI)<)wfR#bmUG z5UKB!yU2!Ic-75CJj@e#Pftm>WUNP|)^%wnqIGdefveg>&GA$Ee&$xAh?({7#XES~ zk0mdGAw4N3Xq)CD8+v&?orV|9h^BrA-#QDIDS?}r4-bo$G`le1tyZ!!6Vrab5fk+C zE>)#P=U(*@wpM@d1EcU7Nc<)3ux7-xrQX!Y4PerUf0d`POLwtKGPtlT?b4VI>F)AD^ z$<9y#>FBy##CR46`6_mKbXrQfaNDA z3EnuH!m4_+{K-)S&w$mheJyn4P)Wgk^?m1E|F#r8hBo(si~n0+0xoj=mh1$PKR&Lq z%Ew%^JtQooqwiEMk5Mw800&SfVHqTN?p%~04xYBRq%(B69MEDaHY+lXC+0Nx=DYWC zy{Yb@lmtZb#(rnRH=JaW-Gv3#ba(krUcn!P&~Ecq#@inYGgSxO&%d{LVDk`V2Zb1DPm(gkwzHC#qi{%z(K zHvFV9U^baohi*(h7k9Y3wBNAjtC)y|{Z>WNvt?#EWn(LOJE7|CbMtRyo%h#rwr{B~ z#Tr2G8|H%@I;PccWQv}&=WT83UbJgfXCnK00gg~h1paRE37BtQmSO(q(35wZNN!_V z5xS^f4O6_6428|@!CvIxOJVr8B{Lq)U=<+~gm!7#vGAf4B~#AwWr|&-GAPq8t37*{BxUoXzVW6$ zv*ElHJGhw%q0aleNxlj3DoQ5vdY!9-{?R|mT^7%ZeIdP(*?FIUWaf$F)b~$`_Y+*E z?@eAamrnncrQCZywc=V}!u!;wSRuP#v#ilmvjrdLIK#2cT9*bw8g@>c`5nb(Z%Jb` zUDPhp!P~7(*4l7El&U8?OZ;b)x}b_om+kLKr}>{qY$%={jxVuBd@lpsMxvGbBv_ef zwQHCj>a*oL!ZoA~k7z)uNMAPjJ`PnDjdM5{2`)lxO)+mlA$193%JsC-c{Dtoc<*bN zT3f*NPM3NCLOU3sbJ=^n%Dr>-=Y9mD5A;*g3uJQH*Q#^)5~ny6;ycv5XloM#o?AVB z`sW<)nP*h)G7*3U4oFj2MgQ12K>_FUbam{+l7GP4cQ1?yVSjoWBBS*Jk?s>6PJh~q zZ>&e#srSqcW2%=G+Zy*=655sF^LWT3(xx286k$w4$4pE_%p)!CLdmfPo+XOP(M5ry z{8cXynU_>rMZVO;qX2X4h3pLyPG!=90&2Gs!G>f4N68GQJ;UG`9!zF%AwW1 zSE}Ng<8=fOix-_uHzyalMuU|JL%poaquS~5$dQoG?0dKDW`I;^Pm992evi_X7% zfvqpZi(9_7=WWbPFlThKkiLy_X9|mV*{LX(qEm5GHD#N#qt8|a%+;5BnCCW@4XjBZ zwS?HNQT7Pt6vH!3zmCL)i@al5QAD#6k;CRGTu)2%ZlAo5F=ciqpL;IJe=fY{@aHIE zp2=yvz19yJB?1nj39-b$r4Erj(*GNg{Py@LZsz)8&^^Zo^S;`Ooz@SG&WgXZC#H?j zbBZ8-^_m}(oh^kucO65-^H85OK>&eOvi))^4L^{zcAdX?@$fCbVhy{bIFAXnHWC-8^SvGP)UsZ{M*1Grbw~|E}ftBLGRiFQ`Z!#?csThSV0dg~F;{jM{xj z^IS|o!g^r86*KYi15VEV(0X|%uK8`A4lT}=WM^;Ew&CR*E>gh0nUi-9E}6Z3Qnhmh zaTR6^VNWp=?a!7j^VOs96jLgeuhioIzYz`#1mUP_YGF`|LZG&D|3Gb$WiY9t>yUk= z_t4noSe6*-H~y3Ah=gEdw$@);3I{y=R&H|<8`>59;;CBKes5v~F}hz2wO%5kU8J?O z9)3gma1Q^3<>5pyv&%-2pWtzros7UCiN+5*m^$ieO&~$Pbh&m>mVSTR1OL$J{Y&xT z496CLE}!IHuKG3&s=v5pH@5!^|y6Md!z!!5{0LLS$s}76r+e7_R8%aI=i)Dtsz=<4;m{n>Wl& zHB|B~yw4te#V~`nJrEHTO-xmGKBk|!XnVA{pb6L#e;~IJ%d5777lrk_t2FqnNj#82 zX#O@Euqcs(qtP?3DPR(6Iz0Ni+rjo?)E3qsL62Sn$ zshH$H=dFLtJqn-}g^L~b!3jKgG@BTB1irj{InCTKo!|y*fqDLm#Yjdq+f8jP{+Va*dcN_WW zG|OjF>;r%CBydBx1fA%QL$@Ld6OxO>h$EVK90Sxd^0HAdNmTotxjPhv!KEAx`xznE z-71(kE_ClXpU19kcWI!~B%m_6b8p`89qwg8e+v~FdS!`UfebKQ6JcARA4OjUFf5y` zJe59wj4KAf51C>%Xs1uNOom>yBVUkAeGMxxc;El`ohS2e8>KWQ#-d~h+gsZuHP|WS zclep57%XO<%=O7vD`TSma%fs^IKU&lKpzwEU*^xU^B z-EdlTwlq3I{vy1pOtc**2?DE&uUb~u(2w0dKU&4zGj4U<^Ydrihy>0?gZ!-|eM0oQd5XfC#J=aE?mUTkig@R4^}ck4 zpbVZPOpmnhjkCk~)A7@*>A@aAQbg-bkqZ-`KYNvlVFy9>WplzOVCc(Zv3ZpIhxhEP z(-{(@d3+-R2cj!&iHx~qsv6+q{>clr@h}GtfwhGc_yqSLDW(WNF|Z|Z2tneQ6V+$s z(-1YlQoMF-KZEC}_|XX}Zg^IdlR3Pb%qbRK@7A*pTzLO1u&gsfB)>84#0JD|E>}UBLjKD0PFfhGjEfVDfQs6mEo={tg8d+dNf;-{0Gx zWNZ^pnpfI&Jz3h*v*zX&$L=ceuOt_#;o213d9o>)dK)W-EIbk+4E&yW z9@626OwD<|m?8e@$fSctQ(@%V&9FOD_GLo%mJjdzYHoNiE@@f1=(NZ%dOT(h=ACDB z%G~C>3SbMVMwvO15ifeFJ^AC_9K*i$I~-j1DP$!CY6D*^*H>~2{|Vi05|HQC+PYU9 z_n(f_3K-HD+HTp}baFZD4l^Kt?PU=7a>3ey_PS_)zlMMngHqKGL80|Jx8r- zQ=!72g@3n#_J?;rd#o;&WK4z|QC}=o6}tIoe|YP(T>)f@Ey)Z6T6VAu2!21{`c@Tb5Z$KLo0n ziBj@d_Ejw-YJiZuL&7{H?XU2Ib`%m#wMeJy?ATvrQlXh0BsrMaa9%lG2``Z^oky@^ z{F@eze#Z;7T6o$BjC$vWj5GuN1~9xT1dzzK&PMW*e9gR(;Bp@##4hl(D3 zq`S0%4TJ)t94%XW&F#eQJ=2Dx+cuwYvAcFR71!E4b$`ZZ((Tofz^F8Y8OnV~Fqd{b zpkX8I&dy&`;arc{fa2Z&o8E-yEQ}Z}n82oSLx{B9OlHkWNm^L+JhNdA7TUf@UR^Z@ ziA=-gj$**mm5M*~V9@1T%5` zM8@o{1b3gcN5Z)r?rO*ze<6;nYPpdWJD z4)6IhNjU&$2im)P18r9|GRC4Q!wvR#l#EBPRzlBaebWn+QUxCQ%Lb{tUGy#fNt4BO z13sOEI}bAjcga)kl=T(WGN|2yN9blzaVMEM3-8YF0iG0aQ-1ID^l&Vfh0PK(e3HYrZ?EJ=;wT00uF930ke<2Y< z{rrmD-T+1rz!-orCXz`f9{qXXB~u5EVu?3mQ?GUDpiaw9{VaAUnMKvKjl%N&g3ETF zN|%8|;bQ)4XzrHZtR;eaR}es>vr|}m`0hHix{JvF{+QFD;EOQU@uQfORgLra{6C#y z4N|>PK6=Qx=^2iBzeWz4usz2U$!B+Cuj;jNjz<)>A zf*d;tvISAL_pw?^*894XH0F6ME2@>+3Aa}4nQi=}R+H}GFe_EwEBB%)U*e<{4}(C} z??R`aBC5f!hE#9sHAX8(?e%>Z(QzU3LO!=eN@kmAh}>>omJ#6uGQaGGX_>7!?4aAZ zg+Is7AH&l8jTigc4J`7b(azMgR8pyONO<&<;YdUC2>Ue`+O=Le>|?Xg__>RztNCC|>nEvodpHO95$3-Uw{Pq=!?<1rN2rd7S+#!|VHW)Z>rn9cEII(CS8o6HF0u z-%+f2F<2|+5&%K1H^S`ZJ~%m-?tz)uY2dB=(?5D8fuVx9(o&Rq2L{4Qg8t_wl9KxM zi!6!aw;Bb!{pR;X>=cSEHsI|k*`3pBi-+?4=W$@PGdhYvO&Ip#0ja_MVfgz^V~!dn++=t&lc&?bc~<0L?8+*mZoeO z#f5NvI)L(TnG?s+WqE+C!6#R&*j=Ridx%ggGZ!sKfWUidOolJ;~jvy;@w=VZ_7?-lET%J#Wq@m z*@HhKhZbHpZk2EjI}i&glkJ%WoBxt$HVg*0!JhbPx1M*FK5u$8aT zQ$Mr13=F~0K`uCuURK13CWogZ27<7> zvVo$zg`Ft>CN5A_PM`15BGS%Q)4Ch@Wzc4x3_%#V{1pz5Aay*b^u@!!LeUb`*H4XClYhyM684kI1B~Q_H`)r zM|8 zN8%7=V511Zu1?L(EUd}f&IE%#u5Q`OVx9O79L1lUOuKZX6uyw-i56i|a4 z4YrDaw>cW*4_CJ$TwLEg{sh6oV=W`rk&fHQ?jdBXeGac0-3E~Ka>=vIe}(}I04V@y zs`8`1o$4RSjv#U?CW44Bb7Y@`7k-_ViN;$GkmQdGgD`i>OrO(;G#4D` zb6d*&0`$$YhguOjx-^;q^63I#WhjDymEky(n0E4B-HZPCQg?)v`QMs83f8c`^+zi5Uo8saCTvF> zWT(w8*=;T*(G|CN%ykWudYHa{xdqme<&`4_ptntnf?}NCsuo@>dgwqq+a?h^lW$&l zwswSLU@Eb>;5)%e@}O{nwk}yf`p)Tli`e5s57(&f7KA?KdX%?!0%FwUt~TrF6jcev z!-)TTBp8nkTv}7O(a>#+51`ex+?yH=5FgCDDS&~l@}W+#!LYk!^7bjAa5bDU{liIN^1CWHcCSTP3cc3<(HkSXWmRxih?+XO)By5f zr$(mz23BKG+{2id;`Mn_P^et>h?O}^zdsYt6I?+s{_@5p9K3ZeNoARdsTxxE&9i|e zdiJ`@q2|9DhEAISH?@)KoM8|@wCS|8FSmPk`a^mvMKynL{O-3;GPdNSrG_tfa!K8{ z7jE#6%0x0>ybU4YI{Tz!tGA>wJZ>+!M6`5j6XM0g{`KPdE2T_@TlEksy?W{_Sm!Ws z(Q$Q_l&j-$EmPxpMHQ$jchKu*?dNhUK6;tcEE97));4hc2r>@2ob+ zR6x%XU2mIpPY$z0j$)NeU4Y*M#A?AOh`J{Pmb9f^{StOLCN&0v-1depRYmJXPCtIF zn-~wz3XGQck=AkXXW|uotN|Z28|7bY#SCaFM(H6U_@2cunH@D%>;*^wAbk%x&j_}3 z;1Oq4fBBoMTfh1F1*g`TFGbw!J5`S1*m2q>7iE-F(AVSQ@^o;i9H-?~krEh+q7$!5xo6pNoPQ^IeE9&!Wm=e&mfmNVth<6}xoU zb;tk;`CF-;XNGqnAwgUl0;{94wV+!WV^_zn2m7p;=k?CXpW7L|qkCF*N%pUgK7lx2 zsTd1JY>Xl*{DDf^n>@17iC03VvpnK(T{0rTFg(5}u={<_cbryCGtgP%Um+xd=M+t< zE|Sb}92W^}C=bh4s`Y+&O1L(xTbw$$y7)S}jq7G>lYu8lTP&89`sj_Xz#ZID`c)E~ zv458qEGkoWb?$1l&ZA4&A}Z7BiX6CFA8a2~X}&zmw95$Ds6x9weRo zK8?bSvW$w6CqR+nIpC-lyea2lm$z9TW1v{QA(gl6rZwc_e`Xw;-q;CV&a91O(MJ;D z>cW|L(QEczl2_qh5oX=X5?>p_A%OD0=**ay9QXw!s`~6dVhlTI%Cet0+zW=Gff@6; zWVnho_ez52YmX}q-Sstr`3D{|qr~fN*!!_9Y%T=g3~Qy@|4|cAUm-;G%Qn8`{L?mM zlff^7^!fZ8{Gq~=#LNDt*o5n}foHl){ZlG;C-Mp#FbXZ!`NY^7GINO5<2o-Pkd&`5I!u{`X?s)CvIBd6GeJ*} z>rL;dd!Bor{UmpAL)uCF=6DCU2Qizp+#G0JpYdu9vgcVwBL}2kNwSetFMd2P0aP^e zEZvTODH)1?D;W|#>1Q(@Ns)ad@4%z*GTPsfJL8Y|2XTNA`sb@F}GKyE5)ubs!FgUg08KOQ;@1NUvwxg^-nev)LfEOHN%8naFsQ& z(xi@`5V9(rK`Q{m7JWOpptWb`iri3*%8?9P7E6;dT#Qjx;r1Vmrv|F zuOUi7L7MZnOAKTG(9Efs*!en*kkt8m?u-()+{b?0IlbhH(4YUiI0zL^==0d?4*q|H zwx0hH+M0Mzh}bHbZeOmsV7b^v+#JVq5Exm9A}Es32nYF?%scz8b0lmxF`KHDOeIYD z1+PjV;$ybleEeO49CZQJToX-nvR}QX)C?7T% z5^0J8*@Pyjg($OTE4y9~R!wB8=K7x=QSzhPk*#YH;ArYYV?3aXYj0}`lUyIBg!Eu2I%znOhD;* z{~j06KzZ$)aF&oGko!cnJF>6H_5ai1ju1Ol* zV%=Hj0@r>bBLU&g?}HjKL|85`AuUznCkbeNW(qz|**5?701RP-{>;To-9v3fd*ULZ z=T{PWbIOg zZTUz}W6$aQNhM4A04s zUYXdH;hhtF%r;P{CUe+pI46hsKa_oUIF|qac1fXBZbD?-~O>^L3u*iw#8=e>27n zm)OiS0BQL)zl}?=4qW}k0OT#6t(E)3Sxivlx$#-Q4H2G-JlfL?PWwi3~;Fhd)5g~JtG&WJY}83XNXBU=72Nyzu& z!Y-L7lcj%sU~2sy!gz4oQ9z*xG%cg-8maI9e&!VNp-fGUVSD0yjk$Xz%fQtqjLYq5 zNMH9iW5gpF<5KVPKakq$KEmV|p#G7Z_4GDib0%TNVo_0s!ZEZl`56?rrmOTv4JC;#Ba*&Sj3eljo#f!v+iH)4WO37m!=wbYbKhl?hilgmhgR zRx}#66nIowiU{Sj$waTPuC{mu8VG(?cSG*>p~J6)m9+AA`fV8&DyGrlpI6_W3yiq* zwJ(q!N|-1d7<9z2iE6X5Y_65Y_UPHoayxOlSMV2i3*Mo?`NZfC{wS(g@MQje&jjE5 z=$EN`Nx50>yE9)#%O1@>ivRs2iAVjj*`GO_sPbbtI%2-LAhZjT^hi;sZ{}oYuD8q; z03!8U+)Pr!E=24BBeIw(fqxZrh5!bNiKLF%B|B)8i;TcX>x|z86-=wj3Kw-U5w^eX z@pxYBZEOdeOF=u~$2A-Vm>>;81UURC)#6lzFWs#oRSCepKnG(ku<>xJB&x%R9$G0{dKB&`5FjQ`%diH@v;U(puv= zK~DHo=VNO55iMGl(fC*S?`fb4;CNd{p#sV~;E8XhHVVc!O2nOb_h;my94HJE@8(L) z-A^TAJHW9A)z?y~Ko9gsC_%Q@!tDfIQX(`CZ(pWvc|sy+yCg0$B8xJ2JBqLU%UsfU z;G+}Q@|zabzj#X%;4QiGHYk-R@AotZwwIzQ6LJrXyt5z_sk1DuD6^w2c19y<4x+l> zrm(3fMesGhu@KtA-Hr#}H67xR^Nls}c;g$NzMRx>ECPt&;;Co>-Qv4^;@>;q2k^T2 zN~{_LaivHDqGXB~6YB3INarbrqc&P5iQjN(KtLyT_ra)}mnq1LA-iE1Heohrrk>Wv znG>0@`j(*XU2>V@Jt$zYgTfW02=AbI>3L)2C3qsqKhFaK2F;lnIqcwxJtee@h5b^L z^|9N-5!V!PGHTYAG!kQu9Tgd&6poi_h3LyA!)!cAB%<9L|K`*|(D9oM_Tfyp6PEa2 zB5~abUjbktsCGuhDL56po(o3YuT7&39@***Vg4^!R$-W$w8e2%0@#L(E7juEQ5PV? zl<#Y|PBpT0-qaOgBbS`JZ-f))S>?e0LRo`l_Y!%SA}B=GZ<^XHjEK`xiN8M)@|`7> zc<|$;$|oUxH$_qzH0Cr+5yY;DrsTqJJaYBB+03Yb+Sh^SZpJX6z2&neIv>^iD*1YVed#;#w2m1UDh|tek6&pf@^5FLv{Ey#jNeH$3WL&$ zE&L;GKY}V#8>+V=s?q-U6`TiqkmtgzP<;a|WwEVTXbPay`A<0bOt{1mnw_Cn}m9CrZ74c z0Gaa7Nc&;Fjo^C)RrV0yT~)oRHfbOKn(maEX%Axr#<&$hH@AHfaCtHfg|>i?%ZHm- z=!INRC!oXPSdxRPAkoW~^%)=9;t`t&{X-=jB}8zaSf~OJ@1GQ0#xb0Ekt`sgv-q@Q%nk zb@WC??v#P;Nh${V*&zae);l(sVz!j%<&6N5yw639GUqEFS{rv~Dfat&eE_}!p(6v2 zZ84ABgmNe)oEf)(2w`9VeP%|};swh}bA^B`$o7Up%_+3SrC^>)1YPmc!$;-uob!F) z_ZMVUTbX_mw{R+2i?U>ab@ox@qyJU8?fMIMN<*Y0Y|uMZ{m~m#&;Gz!EjxVH_lO=I z4k?5D2~^&nEUk-Ez}%IQt@d}gnvX_rfrLhYibDfo8El2G6mq>7Iu*ABy;xSXie;IA zb^Prb`{EnS+DW2<7UWP0l`jv`uK8J(Vu_T1%{ zs2#?W{xH3-b^LXzQ3r_43s0Lw;HAj~6Gm_!MRku6d~!T^bG{&S0hk+~n$Bj!f@G(0 z+Od_2x{tXSbvwPhEJ`JsQQ(jAh|l<0X^Jf{I-059-EVjS+52O45rXund@Mj)C=No5boK=r>c}A9B5i473Z}Pt^(#{^WJEOU#-6 zeS-yzWyVT-lF-SF*{h^+>@a1>!@IbQ#{@+JjCCOV%&v?4kftHovGw1Uak;|0JbJE- zbK)bmJz#WofP9EMQ6k4ZxReoS(R?12x98C^y_c6f#gZD_c2zbB8Btq@ufDaS1lQWG z#D7|Oq6uVhE;2$xNV}xvi80=#YQE)&!lXX9@O5RHAz6}tL+xRYccjQq{8x*m*}ZyV z+P!g^sr(A?V(_{bn|1=bva@c3CJkgibTGbz$X^U<-YY^Efk}F%7^ZC=TizUuMJ}|+ zp6FY=_!G4})5-d09E2-@Rf)?M%{pM-bNsMQ7idck1*i$fcwz&4GEZMZQXO*IkFbiu zEZJ^Wh*-ksOk1o9NmH&KRn6Sa;P4*i))$4~9 z6W;=a@`vA!ER@w;m*Xk(cPk?A4E=Vf)r=1}#UPtXnnK?ZC*XlhViWXc!)|U?P%eAe z&g8y(3{!7~SHj97+Vc}%-;VG|x8N1~cO``cZqD3~^MM0znelasgGkk2dJY-vD%GSr z_4EW_W@h@u5v`rs@JPB9O!h9H%_G1~f+iBsLBkh5o;9-2Px9Oo85uU_c`SgFk9juY zviIYPS4ru3ScTa$X%K*CXvXV*y@WtL*I2I~|EGPP0BtlRJ-pJ=O?MDFMBjFJ$O<3( zoJB_Oq|39KL69-DeN08B)mR$UeG=r+4o%F$?uI$Cv_X17l&;J=2 zU%-AlqieqtGB4x8a7I$Q`<^5if3=83lYlP)=P>VhUwYe<(1?#~bKqd%taJ|~Ptrfi zB!PAJhliTkae#+f0RLWrwD0u41+prZQRh`B~qX^)*n8sT!fCv zI1nLK!Ys6fd~kiKEKSlI%TkLXRi()<`B_)G(aG88;12yv6m8Nv@P?rKyh#ej2n6iP zk7DkMc4OJSA?xf>Y~PP62geDDjHEw=4PD3}2d+xeNiJq){=+-A z2>uULumVs)JBP$p!5_pU_5Y_B*53hrrr&m}K+nA{7gV+GnPW20vYSUeOUINVl4Fpd zSiNW8XyB^;6ewkRyK|6f!2DPF&bnpvdU9P@l_z$GfO2MC%8C*%>NSM z$P8W>`1JfV^E1>Ip(44c;&@OoPPSIM9huR#{_jHx2S03Y)#YDNwi92(T#$v;M(D_mAOEz z{xpuq?IsLW-2^!b1aCV6$}hFDSvRw5&{_`k0A&7bvrnuYUocrK28_S)3Sg^xrKo9y zG^g3{x##izAm(5R8{>>EYkD1)BUD5>^j^2c1%PemNX$Yue;LQ)U`%b?{>$0d{j>{F zP0gC-PrHBclCv2E-;~hb=e;2EM7Jmc|6@$I#5{^e7(q?L2>@!Mf-xU5Yh#R%KbjJA z;rRyJTL!SlsWbRs0)n-PKulkni|o@j+PBT+LK=ta2Dk6Cq4soIMad7PWGX%ugQ&vd zbI2$w3-}NGrfwk4?xcYU+ArU7O_lRNy{DM_RkD7M0Eo`?n#gGB@1!|7`eLp-VMtS$ zS%Oz1Ngdw>1La9L{1!m77da_dIdfsrslLiG`h*cvQXCs|H?>1qBDC!Sz5-UNp|cO^tllg?X(Sc{KQvJ@ z`k|35oFIqk^AV8ZyR;~nU%$?TU;^h|5&8zq+9hdkG#M2z<2k3G}2lzFVC>82q>xusBTVqy7#?Eb?^|gn`JUA^B=ULM-3@A30hQ z;;3*Rrxiz%Jnd~XRi7Au*$C?(@fK=B4~80t#+)U;7uFC^O#2UMw8L~|j z^GBfkh@f|NwQHbGK~ASP?vxBx0gI*ZD}L`8|D=uDn7Hd9xaD2Oy>mD3RmS_fF#LK| zyi|gWuwpLYwirkj=VzmE-CFy|f=-t`5B@Od?#t-(3O9;?*}csxPfnu(+CNX6 zzKaMrK;9J$9~bZv`HQ$yN?1M#h@98QWTZY>vheD|p7B3EGVoloA{|OkKnD-Rk@=Y` z)X*|@hmv`us?vX5F$&q@y?qkVM1%Gj;k(O|;E0N9huOXM^9Spr&ypDlZSUX<&4w#G z96ivuALhp*W!X#XWPg-8-hY%jRbMU_ChtA(bN>Q3hfK%tBKO6WOK6LYM2kvQR027W zL|eRg7cNiD2<|o+)2b_yCu|>%*iuDgIJ^kv7gJw6M#&?wKk~6s5qak#ntE)3AFbJp;*t0IKC^xKY3oAEMX-)8az=8{NtMH(s| ze{iAoN>xu??i{l5lG}17-JUKbskwQa=nFEkvJvvzT4@xZnuvN@EW;t2Gb2K`6DBuW zwYNcDUGYRJr!Sr`RMW*aj5y;qJ?vly($@nZ2H12_V}oTAqP|E8y(*nUj_Piij9vKW zbMI3J zLdi!*=0?Qi0Vk5>0$>dWxlaQL@XNIJVnxD)SU^fEsur6jNTmK$r}b{6Uv5bro4+@j)WSbBCDRo!}8!zL1?^qCjp_DI=0~o<+ z|C7&rHG6<~zW1)!~-rriY(^=t3qk5_rWNdAA*(I|jIg zS|3S28+Ve#0mnE%Buba~_%T={^7c1%Y@Vp+L>tIp(T7hVBp!eQz1zlJL;jd(oaiY(agwod%w9SLl8qe@uY!xqx&H|8i4s7bkIc2a3zFLHC-4SY zd6phW7wp}oausgxxtjp9p<4m(rTQ5zx4EyPR5-p%&MM!VcG&RbZ|pc6+} zR78A5L|pvNI87dfHtnIjqr3%JY-pt-X$@g08Qm;$o(3YxU|*}{!Liu`a1;O{iDIRx zE<)<3s$Ltc zWj!3VIr1wzCL6)5*BeTNL0TayqEsc%gy(usM7!~K0P!0EggvmFAO-F2(67h%3Q@wa zWDPuB8S*!eB9fa&b5oADWCej@Ex8|S+oFIHcIzxC=Omri$4|B1O~-sr>sssx?Gsos zoA_;4&W{z-Wg(q-0s%5Hf0))Q1@jNC6)UQPF*OuxOJUsoT}`SK6(Ie-jF*TBQuBzC zFQ5n%a(!{D*mGzkbll)(BJ${x*3fE;jNB8a7!L^&24%40#1#{=rtV>0M-jgyvH!ry zZ6L_~x(;OPh4F?Iz+WhRERasjQUrpl0Skypm`dHM=9wo{KOhw?z} z@*^@c*dJX^BJq!xk-R(hS1}QoLG3G_ui+rVwruAp?O0Ttj;jGjnUG074;Va}c0#A4 z!J*~?5;7QBl-xDzry&R6P%n~E#l+)Rn_e_?6bsk=bmx1&YmCYu=Z!u~J_GSJ@KTS8 zCuRmR8ctXv@q8|U01j9zoPVZHh$VT$KeZVX`y(Bx3%!X^c~{6kbTIh0>(2RJc9I%C z*U3WNq&Ihptx)P&&;=H#TL0%30Swz+^9&1Py3IoV^@9jApWqDAM~%6g6oA~Xx2;2? zQk5oGj(FabW4T~q+SXIAjrX;k-r=1`uhuJ01`_0)xuHm&daF~DeeO{_`3=p)m|X!D z;Im2^_ZlXAKU z{By_#tk=I`ZIzNh1BdDcWfSfvt<-A5`wndoB>o&zY?I%PM@<^)1F7RtFq9{GL|GSH zjW1sipWllEd(8)v&;JV;{LjMp-%^ndy=P6Bd1Kv$abv)y`ja9-(n7WwMlUxz)8;UN z=g^VE9K=vxspt)+uhUBwW|jLN!!jH%AS$Z2Z*sFQTY*ndAn!AY>R_|sGX!Q-Mf zcHo1)!ylC*X{yv)E?0c5($>>CZLHshyNNJ5;$}~Ws5ejvUItH0RPPt1JTY=NE8anu zNgb)e&{tjHng@FQ*B90=YF+-GoQ7yp|EpIt8BDt)c8}JDL40>dt38!3a=4i$+hjXp zFR8*rz9u_U0_M=OP8Ip59D$Aw_Hn8}LrX6w)?FAwBOImcvp$G`!r{n{Zx-ki5+%2JTU4ddGX^1>lxT^ zi}VJ`zWsqcFw-HvAnPWq0)`}>7l3>rDI+=R4CIS5^SKMdzYSaNQ$rH4_8;M!L?eh( z6rr`66~|(Il6OAPQ?&}c*v@w0DZxNT%@4&DxSER(>BP5eE+!iMu~5a5SL zV3f8(ss_q}>HwFGi>3AI7f<>B6;ByLyOYYbu$g)qw%#qt&HwWRqSz-;qRL^+fyz-^ zArjw}2L8UODAX>$-j|)cb1S9?^1^RvXELJFTNboRsm&47JJ+}yX%yuiUw{L8@* zi@A;3_<7SK%}F$UQbDp_7g+LlHodEMYjsDI95E?QDv#nDWzW6Ik>9@0jx?L{Ac7hB z5&U>sGX!`5XHRWrsl0!otcCcUf}D0l_elS8KH{1-`L1-bCgs|hd{}R48h`7rO$QZ_ zbQV?RoWOzW-E5$!_AJ>SGg{6*@c4TEQrHJy`#g$wIktc>iy!Ca`!=%9+A1c4B*!oz5g*45)5nKT6kva~>lK)!X*+dP{?VsQ;R6cb z8+p9;P7M4nBC7wWkl7NIAmiT2$9xv@_U~HFu9z1+QV_$2Hu`Yw9B#f;4D`oHmZfSy z8vlG%nYm{y^?%hWJ->@;9Oupw=(C&w2hVx3BW!NZL-4gBwPrtxnwXba;?_&J`7G#@ z#KYCT?Jq^Etp*@+lvZ`#`qIL#@ndzLy_$p|0>+3?!?)am*Z^#j`C z3WJlgjbD3#_?8S}xvEX@p7-E|eJ&i2P0jq&3`&A9RH^BXomGP7tnV$b{gQpud(<$( zV-t4~m%KpQ!Za!yuIpG|LEdR&Mop=kJ0n~3qs82DkZgEgV<7@Dgf1ny{3;~S z&eAg8HiZSHLP8W<`z~OaJeoxvYaMGW8e9Bzl7+hz{V55BMBtBjTF6Sga>?cm9KWj{7(^=Y<&Q z`DW-7z^0DR#DlF7?~~TM2!gEEpc9b~6Da_jI-%_^Uj&f^YMh*_X7RfKGBjR5TbOfE zeWiiGF+EyW!wSBt7OVRF2ao?07^*;poFZNv4(Hrs9Pzr2xWmNzTZ>O1hcFYdGJ|SQ z_pfY(QNau~POwwgx1FBNy4!QiM7MnWWUbT|;+~w1xF;umUNPsuS8x+9@~GPU9Grh9 z6!>18-Dtwn2RxoI|NUkmKmo$Vgv zdtaKsA$Lt({2$jhq69f?c*v&N_|u!CAb4eK1JMyIp!4C^RkL)*824XQH)92bX*~}I zy0f<`N7tnQjppy8G0}CNz1iMvS6sM#pWhlzyDOmzwes+5ooLWO3lQz6FZJF zj%qf%uIOvD!1AQ{&!l_2%2NCv67WE($7+nu>YW;RH*Z<+DWvmtVIZ%kk7Rqd&1 z(C92lL$_S0o$4#aMllZ0H0~T)B*n z^_{;Ks++W${}+j2+6jROb4>YwRP@#m*nq^599rrZqwjI&#m9CqG{Njm(D5arlJm$J zoXWIBOvi)HA49z#C2lebfk-`4R~axVDn2GwFWNx3CN(GjFZEy&j6@ML z0g{^{x@Z0+5+b1+h=f^Jd*fC?bxA;e@peov?l7<`KveR9T{OI83DxGQ5lIM@P!kix`kbMh?1d!tkmARS z{V;VF!ju8-0m;{NamhH}PGo@JHMF zL-Lab1{gmk^~Wa_ChHzN?u|%aeVWuwlec)udmzjpxJHNS3Kj zD$mZAySdDJj=8%8Q^j~&=C&yOL(h&G8_&})+NB1Mt*xE=C=hlk=v!U)aIxJNR43pw zCx~%GFZgddav7q6IaY!Z;((}eYjXEm9aM1ti(@PS&Y^Z}=LXV~xWI|r1U-BVzsplN1;{}CrtRdDCy zTt{!Yz%ntvEQynwu&40$??(izPD&rrX0Ks*3ZgE4Kg#XZz%{VE95gk(>{YR146pDy z>EOvHF{_kZh*qiNnbIvYuv2;zI&uDB z?Lg;`)gtj)3MjPOUpo^>;<6_o`MNaJ+(PKmJFD)V~S-wQh-29XQo!-+T zfJipjX^g|OtE3|sGi|aMWU07Q>CxwSn9leMvjOfP*fGdaIpAEYFQX@Q>P{3}u{nvi zo#3lT^x`+KMr{=uE_Ae^l*MV-^mC;ZQ;%(*d!Ko<6e+=N&~yLw)Uk}?*~_-Uy{sAT zOw0ve+Mw5>eiBRWv}ctg`y0bHw`hpgp1XV8)lC1!HR z%tSwpod`3J>@NsA8oB#K&#Lp3bT82B8E}oo=x9;AnHG63wfg9)F)K%l>W2JLyfXW@ z_y@6m4n}=YRA=xV+it{#tb+6HbZE!dT5Je1+rH;!;}?xbCvO1R6h6F3eaqnW!#nrX zT3f~$@|}$M5*n6Ih{CiVnN_0FLT_zn9I;pwA8h2M+6fG?9brl=n0^H4#fHfsUkIsM4G0AW+i2|NK22%XtfQ=;+(u32;4Sg-<;D%B>j&0Z-q{yUKt{ zTSPYFXWcHYCq24yz)t3ED0|4dt6T;Se%-r^yXPvrVpG|sS03X*ktp+K(@PY2@WO?o z1Rxsl2)d{``&wK_Tt?><4NpS*){Mi|Y+E_Q$^azrYApMsx_{n$Ux*7PTLX8Ww51B% z^eD`%Zn?Sl@e*;QO9tbBQcR%8$k^$Du%@XH;@+j#S1(6xT)FZj+fGc~6e&0;vFAeh zSAJ^9)$-G{ffZWpfn$C`*I&;}wX4ngu3Q{0ob@eYm=yE-QbAiTk|Wqi?c-TS^Dd%x)Ce%f|S&$ zH@_iEPf!7~In0xHi{XzML55}snmj}0(E}#r=>lW#LmgZ(>e3nY4-S@K^3>R$OMb$r zM*$`UWK1vV*DAnaA1F=<#z1?%V<^ z{2qmy;z)X5^M{Is>DTn3kyYmOm|3ZcQq>&$cT+xr-`m1 zj|eVU#cI?_E+}-OL4$7hQtM^VN9lV#Z;&0xTvn+y0msGi_O$50;4q2dHpyT44WU$# z9CDEY4wMVoAhk6?4fEm704oA2R!x?`flS1y#YPoV)tyI_atDWxqH@yR`IF`sZrh*c z>)S1(-_1O?hQEjKUU4u%B$C-tlzhhy4x#Z!upGe1Ck6`6K-pRx_eUulbH((q-8GAi z)aNm=>T)bsBraUBX})E_3W$2v_1<>=j;6PYAB3_=;^in_5Z;Lj=sDirot2DgjDNW1 zUB!1qM|MilhdqP%nPyN-eRZ#Jukho(PJbawh+Vdcv8tw_$caS``S>rdxjDBf?VO< zqC*@49O~BNo1-3(h$Xha#aDFo9l?|Ar?yQD$4X!#csI94+mu9(QE6U{Y94I93s zR9ysh_egi_{6F=D%zk}Q0KZ|fjUmOGdi)9Fs^+L(Ruz#WLGg(3cviVpRK0_G-yBp3 z8buD$J3Cq=%7f13vxl;7#~i}7;u4Fx$=Ted-$oY6v3JMj=c#AvU^vVK7xE#Tv{t4k zj%yP7?NSELgLU$wc~);G!j7lwBzP8Ps@yVCmL4u!uo9gDwCLN-_s?-vVX{yvF7cq~ zEJ^QPYV!xjriWRt^*qMYhr|j~a3}(L(Ph^7U9d^wr{2_bmuFjJXSjgn$|Q>`MTSU8 zuzbDvHV5bKs5HaorsF&Y?C1Hjv9`*{dAohl@ zWYv$_LhtK#(J%F%3oo{R;b&W*^6W{}dB}DC>7w}F{o&|v3NI`2>3K(C9kv1>O!>hJ z+MbKt45O7^67TpNq*1b@VSf7TgY8pIIJkU}b9hhsL-Ztz><$vvL@)AhF%(*ai<%nq zLdPHP5lI>l+nX(=-%ly|`u3#P)a97;dz?MGH8;P`>u{{G`eBQ@htLbPPjf38Bt%$q&fmuqDlp59%B*A zPZpVtDn_O&r5}R*rp^32XAB4a$W16`RlNA#b0%NzmWOIJ>|5L9@HuXJKeCn_NT~I0 zfOp_vv014H@yl0{-8s{>>u-bapC~ibBOYA$=>DFCL8EgH-D*~XvuVOf&Dl%=1HCu8 z#}00|a7}`e9C+l4C-^L{0B`p?54d6Di*T7Kgi9$&eHhAYey%qWch9!7U#fw35Ys6I zR)lzMxIwB z&Z}zS2p&V`<3wv|+m(fLVDVZ0Vf0NYbFaBX5yoHO*MgOY=^%_*h$%-;ku)v-2?YSz&!dA--4BS)B!%vek=W)a&z?nFxQdL(ODxY*MzpOh zhr91;R;OuJ9j}XuMt&bgMt?%iYLAjV+R$ifYS-shTXTD*(n*X_K0W$i9m_Qqe)pgn zBj)XX6V~d$RRKJapD~AAKM?6VY)bB@gCAl$n|?=}Ll(+Z2Fnk;5f5n8)b`VxBwd)c zI=rCa36z0qs>ld+uXnY@%ETo^0LX9Xjp}^$DX!78LB4kpzd(r?4eJ2)EwKgeHUJqzQTtB z8;M`P{3r;iXwvM&HCe5-c0D1vx!xm|;Nq-aDA|#g4)T2%Wwp2Khvct`%Wz8?h)3)X zj=F_o+OR2Bx@b(Q13Kzz`BwRpBs?oYE}`qNFX&qM6{fa+`y9J88rD;3o&T?w1)E3L z)Jtxh8Q6ZD{32l);TxyOvXh%YJV15Zmf8`RJ-8?%{Vr>{1N^6O#|Mo)a>!tC;B%^z z?x7GisIRJpEHi20)YCdK#P60fqx0FR=rs0zFtd%RrS;DPjcALox#SkKNNfx;Q#D9F z6%5YB`}e*>B7yM{e@dm>>QPi)3{N5<4jInE3%t0Yp=fD!9a>|1tF77+Qsok7)>6*< zkYK_SQ+r&w1eV&ujmL-luU7o5&+(k^nJybLbK#0#cRkXwK4KQPQDlp>F`8Upw81sbx&q9LxXtqwdN$(U+61>+#VNt?7(N+1DIj2X@yu z=xY=KK1Xl8zl^&`9Kc;n_dc#sGM!g5`19b3r{;>L>) zZBe|t-G>bv48N8Q^y?8;w#P@e^*a>gx@$h(uMZxZ71O_OXZffyEAMY_2em(fzX?2i z$Q#zVt0EhCSaT^AIKMYm>SD9P2VXB&|OTLunfi%;$)+Mk+qq@Yu z)h5kV+uoUN>#f&!gk33`R@bA!%`_}_wn!A;c_A4E2gLa>M3FYArG-*k|;NW`R5k5gY z#2UdsVR%h-(Jz9|nNg5;y5Q`BD)V*0YzgSlL$xm(5*F;vIhI?FN|@UfA${D8SPTrG zcGrJv3aFNiGM_kw(6{58afqsvMNXxuogX6akpA$MUN3oMpM6}wrWoLk z@$UC#Z;>o)Q~;4Td?HO6LL=|hD@F}@VJEJojq>@;_0iLZTorI${$lP0EffLNs}1iq zr0d0wiZYc6Z9KSTq$FvzCL3#`JTC}}x!Z+L(m0V}nh&m_hKMW`KQsNxj?~B~YsGSY z!#w?NVr#kW4$panAB~pJKrb%*x@5q!+R&>K4-Fs-nOleiU3f4Y@S5tql^0}1wwR^u zrP0Fq9T(Q&GxSaNa7Lr_Bu*Zz+F*kowlE2^DG&L=32(Q4em1Q2^p1KUYj%yJa7c8Ky`yur*w`-FL|gMS14_lkv?V(B$CRbw*n2JSCR(pu4{n{;yzat^#0l0Y z-tM*phLNz32Hlnw+k7vqhYRMw+(Hehk-o{|8iIs|>-t9C_EN`O^JSwqD~c zwdoq!WmOpCo4242Z<{Z9Vm2GlTC#pRRvf{rOBEl7rwQsKhnWbshd7{QC1p=qHo391 zM0MG}Sv@t^JczmMZGFjfW?^b=&G*i|&b|BN)e5`;5)$e=wm+My6}A_pH{*9lUHTXD6xJrQ#~1oQ5Gq6Rx7?4XVK}O z+J9HwCU$bNReFl4QbE>-M8H4Q3S(}-8Nvk!GTA5^$r^P^89D`0i-FMP^vO=#r`i$z zvVH8Z7=9Pl6+NAm3>`H=1gVJ%ZLzi#w_A+2IM7TVkC|DG3=o*#Q*|G6cc*JIKu(sJ z#L?M{O`({+UCR24AfloP{#S|7fQ=7x+sx?(;JM5dbv9p-6!(K+?Zl_}=uB-ztCgwP zYYr~AO_utSnJc=RZvvhdOx4)^N|@ENYV-6vA3xR_W~t7>t>=*LbiyXz(-K|5A7Md@ z=M;aqwv`&X{{BV9QutA*f(@_*T*ePn6(dD-waqgz5y2o%d!L#Llj8z>u@4_kSuOZP z_}hX6W=X8vhv*BIe5b8;S%j~d9v)TECYv)YQ7 zk7BXJaScRL-6c~>{@aiNLJs}Y4Jz!*KBUw#?AL&3Y^KnM?`lJWFI2Kxw>oDy-Bwr1 zy{ej}F?Guv)+bS<=0U=E8?l&l?kPN`1MxXB0d%tl|K%mvO91Cg40n+O7_IUN{V+1LxY(uPo+gwlcW;_8O_p&@bDKcXFN^oE3-`J}UF9i5Q zn)kC4PouiI?%xzo@)s^;ccE9+m*T4QZa#`olU{m2gz<L2{Q#MY35Tyu?T}I^qTs zOjg;xcX4c6Kp*R5dJbxH9bece`4_K3L7(4|@(O%uKQT6{QiARr{e6R5Z5Y{+ln0w* zo(o`uQ?I2?OL8_o!+8|cu*^PQ(N|2Z*SEpGNNmcqq!pulAFAfJxkrlEx-!QT5a$Y8SyH zw?!JVe^_ChWm$b4Nd~Ww zP7B`?c0nC{;NU=P1%IhiO|thE_P8d~13Ke)KkzZsz)#v5Ovfd|%$(KKiyY4_s9wG< zu;%Eoy`Urc`mOiSG@(uLbZXj$ck{6`$Ft893H>%;4!RHH5eg^EmFei3kr5iJukife z!O5fbeo0VOvP-b`bwfhw6CTCWm5F}+SR98R$)Ucqf|sG9l3LEv;4SdMM2fw@0-Zz1 z-JMPoeXk?UU_SM+IoG!BEI~u~MW}*&>{4;i7Hrqb=pXLSX;;<5my-~s8h|$`s8nS^ z_`EgIrBYOf(H4viluidFEy5=IWk`?TArLo2sUB0(#R;fC$C&95$3Q82PGCXPJOtOQ zNF&olumc53}cbnjC3Xzd>uTT?KEnvNd3Z&- zs~!2(ehuM}S#f>F76L>5cas4a&z@Zpds0#e2r4 zHpup~N`p^Aty`4X39P|kp0Kosp_B-n7K+z=_@%z2@(JHOUvOmpTnT60$i}1BRoJS4 z*jqW1^=##8QA)P6CjHl)`Lq2ULM+F08;Bt{At!+%z%qay+Av~$=QU~r1%9gsno4JH zD7fYH(?i~x>0Y?C!c0TH^FypOjh55UibrEO&+ud0pkv8Cl9*tC;-!+EWo}!p3sQ+M zZI4g0+L|t@bzoH{Lh+JQ3}ffAvYT1GfTYbf2%L96AdeD`gE$YJNLyB~Zi%HwmFp#` z(8#NR?#Q_H9dez)mEE1#3KjC6;z!_{8|PD*wknlYHN&_(G3u%VnMx1#W2eU5HYH=6 z4bQ54S{d-48mea>o4E%#44~MGu#NPRJ(|Q506Ad0U4&{Xs7l%}>_t{GgZZ%C80&C> zb0O}hdLq5GIpplAp7&3~eAZGunWBVV9LVvW0{1H_C>O194K+oSIFd@zcz1p`vRY14 zINMLfIn^G8wK<1f-;xEy-fdEHKf*NxryHRXr5{k=l_dsMeBP*(QJ@%%$K2l;3Oa&gb6#Eo#T%p9 zu{3yHh03|4|8=;nOHU9Sm}Sg$R;^FzB4(UZwn%H=4XwQcAv*o$>sxvR*w9f9;7xE> zM!$ZGy{0VzjCusKYUKp+C<2z=mkAL4l`?%6b7-M~4{;PUlh|PnW|vwUfN5uEW&$_I zZ{Luvkcq%mo8j`wDcj+%0%nx6lY<_eE~CyNk-sedSJ4%P)0~o)z}g6o!;|+bFao#P zL-GselvEBkat~+CX5Nqd>jj_+L;m*gG+*;hAc((8Yf2*hkmFW=qYz96ACApT4W8n+ zY>HGSbe%|zBG$~f_f}}9Y$Bt9DxuS4jCQKG218Z2p#=DCbwYg0@mFL4_oK;!iIRl4 zb!ieCPjKjZBx~&7q~W z;e_s^%eRF{iYz6^hQLy=_Ql|twelAnrIEK|=-@P*a0`(7x11x!-VL@P3l@|6Fvl8| zG0M6reBw@k@*Wf436ZfOWtHx2DI1Fp+iJqj8D8*qlyy=hEZo>x`#2eXF>WLFw9i5= z-l@Q!tT`0-V$E;Uym~E86F4zlz-pVnxf+z;Tg(7kkS}*iQNWR8H0fbJP;eG4`JQVYJ%T%A~6E@j590T6B}uJ(>|Wjlr&oLl*%+`y=^?> zXW=X4+9d^GGbv~4wCdUW!^@M;fahGzP(=& zh-}QTVH5E}G`+dc5~=@zLYQt~fyEzb%n@y%A`kM2Ij1Q4vrTSyqpkx}{qkxmOisz> z+hc)iPPw28+vYo`>Xa*U0oeWYu>gwxis#Q_D?PO&ZLuSI$Kx_3E~@CX?VEu^{tHm} zyS~7|?Sb(|cbVb@g7sX`l8QP{WIyUhtXeFBz^0@dsT*#vPn}zfN}m1f#7f^{)3y6g zck5Y8Rche`OSPttUuLJB@E$<)THP6X9pg2m-o^t=K632Y*XL&7qzGK^mhtk>Pow_A{@+3Lf1{tMpL9FL4lj}R`yscLJ(E@`7}`GOy^f>NM;zoeaEI|uOO=)ig{?QA4|TN$ct}w#Xf316h_h+CLC|2k z{}-{4MVIhTifamPwtbALn$+aHKF6T}!^ic!gmzcD98x8%#?ajLaJg>|oer}Q;z$8G zb#it6WEN5qsd^9w=$APP`H#vXa+Y0>M?dxam=mxD7GxB z-&f@_tzvqq^?+TbQ2;`eqI$aS^$R%MZqsc>nrf6RwevF1bSSw^r#1!?d?JcOZCY61R0sJG#q*DAUrPDYM3w5wpt`;z&}R(L?G%_*rStez z`SDTnc|9BLTDz9+oo9(9^M_%8@dh<|1}BalL5izgHeHdqJ*Cz9k(L$EsuJ*FXH87F za6)d$e>`=tirt5XKm?OFAk{+#V|(+~2PcW}VaNqYkI3FI=hAOLdUgTiQW<3AP;VW_ zRB;OIkP6u$zoMsB87J3sc%HA^gYvy%X$mfFEK7II!w#Zq!cQ0dCF!Bh{Q~ZsMgMYcK zDTnG(f9IRr-Jw+hw^Dh0I54kbzPHPtVcw#$xrq-_x0+r1)0R2HqP-G#r8J4^ z-{G-O0q6mou*|aiciqzt_@x74?6xTvCU2VLYS$%W__jzm)~jnME&OwHwbc?TUM zJ#IrUUyDwEcVwrft(w+p@ESEWX+Y4)lZo@LKO(p(t@);>+P$7{$@>&aPt4})k7K;6^u7QLFuh3k;1JF$q5uu2 zElF4gv*1hFs_O?P$0B7XiN0XnB(>F8CHR84u}8X)`~pbp<$KQYfE%V9ZPY&% zq0D|o*z*c}d9v=;eyb6t%Qj0x>S4)99@EUZsebYNXS3&qXS!=Koet2Kb|?$$_?3i; zY8M@~`t`&MnJ3mVbo@avJV>4k=MiMWup4QTbQ%E*Z1~)t3LP@Qi7%lo*0#*JT7l5i zqp!(OnXcv8VMiXtcRuiEzw??T0cj21D;#2d0K!V`62z%Utb zd>p9{WtZD9eM9GJ&?+h&sdrjrB!gi+=M3)hTf!8Ll;TsSTyHHqY$YWZ0R%a>5Q(;! z+MOIOF$gqw$%doP#SBaBwXjdHsu8vPnG)_WUAs zVcn$wR}VS#5&bCPYnMEph>w;D?UsaYQT?xOBw(kTVQm-pCh-CZIVsea*%J$#*3v}x zh`pf9rEmIOt0gg0&#hqd{Y`V+w;B6kTA`a%t}&>zm0R0Q^aksrr62ar2HEoz*aWei zcD}E^!(K&bdFrqlHZ5kiyM5#^LB4aO0{aMVSJ0aAXC^^M~Aq)7M^m<>TIpJ!j{@8IKxYchv-n<&|BU{H$+?#rVR7S@U za|wBd#D8Z!O#3#i_foO~bDr3uRF3d2*t(chA5Z+%zc=JQoRHQTPesJU@2bsnIevGg z^26Sjmc@xhA2ScV2}Z-ymddr#oLYh_>_VYqeu7_~PHaZadpdp-mImMF8IaEc#>Hk7 z;5;H8BY;j%{R-72W8tKz^eEsNm%f@mD%UfHfz%z=!x2PG378wZVgw0(%I=k|QxjN{ zq$qxuFP0q-`%b895VH+m?<&{l>y?Qbl5KNRv%G;PPZFyZ-9loRAMf-OIHiZKU+BZ) zx)Vs{;``J#Y|sDO;e^bcg=o{WCfYBd2{h~;GtyMy^xfdLyC zJ=JqJzz~X;R;uraYc_$1!m&W$P6YzJrEjKan3-U}p+KKLyc7Vq?wXepIz$MIjpmAk zTTUPIoa>94Q%kKU#Kl)r)5SI^) z7PmDHYg%L^7IG;2Kcu~PJlE~}K3-B$GK)~Q$SjoX(aSD`$gb?Y_a@oO&Xy6fvNv_x zJ1f~`kB~hwzUPzf_q#s7&mX_X_xr~!-49+ppVxI>=Qz&eJT84SgaiU=U-t#gevR$y zXhkMg^F^uMu+glLiksceh{>NJ5l6VblM{3_uHWP*2@kAxWVnrzZ!HPykHm7c=iG={auI=&k5cgUIUA;a;L=l3wZl_+&V8XA=1<1 zfsVVfCohf%JNgE>a0;}9+kPZ@-0ZCvFnABHQ82emlk%ha_$&W`y0i42&bAC=f~UQs>LZRrv)R z@~&mFm9Q%Cqp+L-=0j+zKC+&Mw?T0{#6-C)2I?dwxtlPLpKMMOUUhN*RBdtT2 zGRSzn)%4>NOboH&`VeZ%z3+(uGp`-2?@<>F#nZnNAU_<)W6vV^AKkwHi-Tmo=5s{9 z>XoQ$-#5Pfcr~z0?SS&5R=KDkI$rc+*-Rwi7b`WB(jhe2Jr5JxlIqMG!`SFC3hzFA z7^+U1eze^%TxjYAlMx5k7*JDI^!IL_J{>>GUZfj=vNPpWvD#ds^O!FL`altowd4JG zid6iX8QAS+9u=Ro_okHn$hqRU)PzuX&1Ey5!-=7SyhM)mDXPTmjxP7+KjDrN%{((C zC-#HTY4THgKFmEbIGj79#eIy^FuW0DBMfW4xR_?pAg6U1yHsqS69n4h9RB}#QZHXM z%PEd0-smv``+^6zzvD?<6VMIpgzHiUR-6Y22c?372Q#26nbMNPxCBJp;Uj!zEIO@6 zljRjWHQ9$h1#U!mH_IG{FYxs-86Y?49Ge+46HyfB+C9=_mssn^&`h;F0Tt6*+u4o{KtU z++03mqiuP%m!{kWZvz5OYE0+dqVint^G0bt^DCv3#ROzTfmqJ% zsbMtc7>{K*dN}<%b|p)s{Wru25JJ`4FFTS3hd*7ku4X>)0wIX8!|G7TK_nBZ7nYsG z;H>s7CK}aAe(2%_zFSyF2maX4suwESroEdxW^pv1yfxdidkAN{vHhD{#GiotSxjr{ z5AIqYkmR203y?2y7osynGU4+gQ}${TVn8uIv}^c|;|sCXV#oPT`OB-;4#$mvD81=! z!%X-#%AaGY2-e^@i2q49{2q?*(4(u`kbDM%y~k!Ay7Q^42<@IIwtEuiTd?Rvd18! zgB+D1o!8HIMDpWyJR_#78AJ>lT?~+9{J6!mcgmv*%9&D4lyu{B{Ly@Ml0scuKc z6BLr#v)P2SwqPe+ zT7YO09W4T2i}C}o-j`z=BkcH2zjCbPv(se8?+i%(3@A+uut4*8j<0_>cfXkNi-2;B zx#m5=io*s?m5F}B=9^S@0-6heRgauGS7OxMqOb70(oV9@?O@2h^ZTm5-BiEa_H-Un z`2HursUZOl!QcN}(XS^89O?tQ>A(7a{_LXN`a&jgKeQo);!25+uJIv$4rGqN>?^lR7R){!PUDjUqrHo%*Y7bzR}4( zg^$^;`E^+!nIr-fTJbQ7ppBGOJevBYOk*+H=l9%+MubFB=qq4gV;1*2={Ks&@Cw_eC@J(dy^Y^{BTPM}C(JmjU zE?%YdN-=qhnc>WagI>r_R&>M-!YW(-SgP)UHhO5FXy9)Dc;&#TQ|-M z&+NtP@fIGCJwuzMT#zF3+~4pZT+0a91rRXgIA8dx8BP=_nV`o!zA=SNB24Vu*3ySY z59;DUX98c)y|XatS&T_{ zIzD}K!)gZ>(nw-{JF?NYY@1n8=O-lnyLjc2m*RH0YU%Qb@f_Ag4V)bB2l$x4DI0Ky~GP$+_w2+bI8X8`Rk+#ktc z|7i#F7@3Kr0fYQD1IP^iP`s1qpZ4w{c|zaHG%D?I1ua`YUs8(C3?6Er-IeTNXe1J$ zJhxAl!>_prcg7-B@bXRoa0edfJe1+P3H0YK9Tw}%E?Sr*<0(}2Xf;<@rcU?G{^js1 zK2+*5qg|~*tt}?l_m@^ha~6&xy@XxlPNU3apK;CZTfls#$9tZ}QJbjB!p|f4 zZ!MfW96?k2Jo7O<*)dAzC*Q(72-kPxtwc~iZrt*oSmqtkPc)PwYu0 zI~dBOW(WO*rqCEeuwBd98NfZQ_U$X2krZz6kpVFmcoRQzUV2BP$6X)3Gu)Tc#3L1N z*2`Qp{t3_}Oxqu*x~-g}Ph zj7lz^ySqBPMONaK7?Ow=`=K1nPMvRV=zWlO9vDs1kbGj!LUyzvZ{WC0>{os8rTpt4 zLG>A7^H0oGD0@PTBf<#5j)3Nv+|ZCssp{?l+jQ3wyUnFo$B>K^7{23?44(BzZc)Cf zkjYLCkF_g1LH4J6MUs%?h+af?afk>t`GHDj81bS2T zfh=SpJp&IcMy6p3P5E1+@})qw25T^J$20%OjzAF6>m zJJq6KyZy8Ak}~6VP_?2br`w}zl20M|LT<4zO@t=nd&8an6r{k5)&Md%{+rvXKu*h7 zqdw&!jC2V(9!=l*_i*`d2A>~2oN+>C*)AiSdV5~Z&IsN?HKp#(-)|Ot@@8c$7kfa9 z$@6JyC<$^?YIzGzj>gT9hpdvqI)-h$XuW!VZWBQh8ChM&AP77YKl`P(kK1SqbizVO zRGjxae~(3UHRUlAGR2F7aor^XeW4bwP!~v+O8JPOF~$c?cUc`7o6Xv!rN;6zXm_Em zi>vjG3v8gN(5mD(ZifQP!{7U92$FJ=F;Q85kCxMFf}OXEyDno3K!N4#&ML=Wb-t`4 zY#B7XG;L@N@$kw~Ne1r>kzX)1q-Hh4W2UB)PPoM&X+oE!Evi?#9tau$U*TfqwP>iw zOX>_$adsh3xGO<<48!^e`iN*3H#q1w^z_-zMyDK;6Lh<-R2vDEP(#oB#XwHT&&Z%g zomq!b+FLp?;14+9GI1mvlJjOXmZ?yIR~&LF#eaR!s|WErBYOZ-_@gPT@j6k+X4l~N zON&rf?`8MS{cx>0#sn`-7HZI8czEK8)1*2a@mMaT9}Q>se81fFjk0H2)lIkY<}^S$ zT&xd96sX`mY0)0C6T+V`diFm~^9f+Pi@#*Q4S;QDFdbzQraoTMd}c%FJ)53W$l%gR zGH%B?arps!#0?zD2(bFyc3u&UU9T4dxgk3t_Z#aCLT)B$(3o#7=^@OyIC%7jd&fV# zMfv#=V7k=@3)3Z6@P~gz-oCn>6aa8ciT%q=yi>bnzL#qjxP6N^Df;(HUSfEDxzHVeSL^VH}%I0mfE~ zSYQ0MD;6IsZg>x}5O@iG`jcw3VEqTxNWS?M{JLvgSr!L8sZ?FGVmADl^T7Adg!~lR z)`@!U%9SC%F-j^sG_qI1f_T2hV{i8AT!B&Y4PjdN*;~~gPxZV(-kB_%0kGJ$Xb1o0 zkzD?xoba7bXBz8|2OGb-yAxiDO>h$3i0R-hawd3UAFz|VE38{~qjQ*=N=##j>1}Zq zt;IyyCs92atOv1_+*ZZ_6GsHuMx(-?hB}lvZamOQ*$gI&MacSGm@g2DGhoeZgzU?! zGG&j@B*U%jc}4e)-@XHy-*XEw5$%r8+h=L1TvzWl3^)EU3TmS*c{RfVsrS$^ajJb#i_UIsA3%dQXh^4tjg`4_&pW)Lix? zMsrF7oaShe(zz92%$*M}pncbJZf;>v3K?+QZVj1UP#GKo!B$d75>qch`vYzRIr2Pa z9H8ppE0E`vL!1l&)HoQcHJYhfNiB_^e2fWd6E^60e~g4JS-%`IX|Y+|Wood~Pt7%p zhsQ-n!gBcyY`=$xtHyO0Z!eQGYQmr)C7s?GKZuxq=Hqy}?ANxNHUjFuMf{0B&F0@` zk#;f+^1fJc%@(XDIPP2)a_iyj4G<1QLLe{vvt8z|+-wD75>%M-?Y4;tJdmdS(=)Ij zUnIbRuu(q8f$vSayj=05xH=+SUD3zB&BV9vF~eNURDq08hb@FN-Sh;H zzeb*(!_UHX>pvz;vL=6z-Kii~PjM%fBag%LXU#spSb0@g4-EPBt6dd?2Ze4Wbb{ODuQhFP|u@ z0viKyLEVDZ7*r8nd@y*=a2yxl8eN{ISLto{DJo2|Ui6V~PWp7Td)9Po!4+L4Wsch{ zGEJ?Y4eOG{Xex|+(x&&E$Z?_hf1IeEM?hkmW1x78Le>z*o40XtlxYFF!#b5qR*fj@ z?bMi8Tu`Jpj$$mkxuDW?v@eQShxPR&ffL2Ev;?fNFheR zUX#RayKHV$O@-$;Mi&c1_++^(QJ4Tpq2-={TO@ucdtMnZ&Nmm<-LquIk4ZA1|2367 zk+z0RN|&PfNd48EbU(RMWZ3c%INQ*@HX;?BSadhCH>Vh2i>VMvn1aPFfJoLn#2&PSk@NEQD$NB4(KNnqV;$f z+6aqV8J}IGG7_p( zmd0JNk_v~)dmh*HmW9014%;;G^tuwbmMO425I*xVZ=LZSnqcy%mm;;e2h~Cdv8V(#E)9>BV-dxi;P5N~G(u9k8GiUY(O4`r)BdtISCnFC|{ws-C3 zhAvc8vvgFItYo3jf0R$jc~L^r;|DM7co)Vn7guVOsNC!&Vj}rtT`8KPojy`zR!*{5 zY_23uV*i6X2W*(BPWE<1nAwAX(u#DH)TRuG@S^YhRX`E0oRD0!TRorFCNFwoSArC(|#;tKzUrm zWht5ghLi*EdGCWA&o=p0N&=C*oFmSl;iQ3r@t0?LYIf{dwlvOb z<}?2dkuZVtFU;5-HGph(_WzxrL7NS4&4in0oDBJ{JVs z5}2Hq5_mn?-d~xAKJz~6HJk1IW(&q=7}jsx4;{mY9?s&Z26D%#S7zp^7pk}nHru;< zLgt6e<+j6qweg<5Gr~({c}a%<{$IUy?_&fl_jB5?Z7EzVrdxj<2pI6NM%F_$0QB9Z zUj9IiY;YXnScDlPCD-Z5)4dkjPvD|At)2R6z;9!Ne4#{G42hL;uCQ>s9YXmi?a>O? z5c;y8gx$&+T!`p|Z}Yse0muXc?U01bK|Hiu9692-3Dt6}x9yuW!u~hQ6s8DyJ#(cU-*j`0rbUXivC3q27wYqVVEE@prS3V==1>nsg@t zpNh4X=DST6t?Q4B?$hHolQg$%D(*RL+?wcD^F{Iig_2@~$@8pYZzHTi)r@HSvlLQN zgd=nL5ssgr=Q}N39S-a+98s-ICOf!=0Y>DIpU{S6D=x_Yj^YEjOL0REnxM*%KIdE_ z@NmBbMwd=U30iKTMzJIMDg?Y>x|!)T%xYe_r^W!1JyV`l^=hYvB`` zK&ZYU2RAP0FgXvrBKR%AB8|7ZPljK0Aib(~H#^3s>nj5Y{1wL0g0wdZtSXzKnTEH_@l*>YT3mEFq1W*#QGT6a>7QX7MIX; zkR=r*hf;)t_kAImSTCHigDXG!8F^HG2+{^z2Z;g%%o50?v}T3tVpqM*cai94os>@z^}`ts4kkyMtZxb@ zU`em;}jnF5)oWHzz;uWS+@Yz-D@qM{?KD;>mKVf1qwr6L)w`Aa_Hz@W^xH(H6Wp(+y@ z$k>`8eIH~Dg!kL(H``-m5q3(;+tvu)-_XoWlsW|tDkC|?}`5bN= z9@E0mM^gf5Tm_+EnIcPw1wsXj%T;2|T8(QqL-it=SV-#m8Sli83a&f->e8lj{l%QZ z4#~k|+lfIF-9a&wqVhv19!3vXaeYE@v{tH2K72Vl{>F&LzAYznF){!?9C^`s%w}4u z^p#s(YJ5(a#w%Vl1xt@70m1O_5s>P)<1cP#3`h4U7! zDJ;-Qp&=m&yr@Egv;l+n9Fg{A+KnVl{fjvol-%q9@IoOEms>m70_iyArDlh_CvU{*%JmyGs|i}h*RI@lOr5kKxI z3az!ue$)F2cuL~>9j(^13lH>!x7Dq3fKYmjmY<9ecUY_YA_@l)$bG`mbV((#pqa3= ztGDrI#+iWtdcasLGhJVRX&#L?pg4f^U1m{X+n~4v6HzG-VdY|x3TiD$TL9t56c@fE zoH4rn%hd@r1p`Nt_I2EC^$W}+He3CLVu%b*mFv>rM7f(6Tt(;BT4bdoP4OCGh_JBf zR`F3;LeC6ej=T=qGJ%p+a4ARvV_xW7R^F2Ws>(fe3XgfXiENX8k{EOd&LClm33y%7 zaEn0Rm9A+e5Q}h)%$-_iKR^?XI$vvWQX~QklIWoNx%Dr_6iI-1hua(a3<{#>|;;3R$Fut@sW8yMbzjZUv67!H#WJ_c96U27cGED z&cgC8frX}Z2wwVYau01SuQ?*GI$+e`q}D`sy`hCsS`wto1WdH41;Y6#_L#_Z;Rl89*zOT-cK%|1PA-{q$k|N0Lnkk$SDOq z^5bkrup2eCN}t8blw@We{cSyGNA8|pwH1{Cl+KE8S zhB4Us7FIcGVYylpUkqDn(#(~4RcmHeV%uFv&aO!v>E@1}(!-^vfE`Esr#<5W9@m+3 z={mHp14U@F3#@#;kOP zB9qz-lu6T-|MtdE$Bb#0?ErZbx7O~v(511A5;$0y=tfKF9kit#IqiXuuW!F2K(jZq z7)e;^yh%DyzJEcgYUs=#Ju*O@R(ax$Cn#)*c^yxzpqD&4R@WE zn2^6FE{U^4LBF$D3^G^=5E{I?Ilm%w2HNvZ&9c;{KEh6HaNRmE5UO*gmeP9mKRGpi z=2%2@1c@IxjSpO9wehfmgK8(dBNGb3udKL8@7L_QN_Rjyv<4&?yxZ3=s zBII$W;%{WVgkN~}uHg5$H?WdKy?+mU``4`i(ED%PoNKqf^h)3cjMH2tx~2gV1ul8^ zc~z}Q&WPMIrbh>k0|bTE@O(|j-=%&_`x4lg(wGt0xL!Y47t?*OuoSxEDLi)K`q7=q z&i4x6hZjXL1{7Fm5nu2IST50(3TA&0xa4+dcpsO6|BhLVF#;ctz{G$+*z4A^tE1(k zbN*Q}nh_Qjk@o$w0V-T_OntL?Fkhm2y`XT|A@h~a!78wU7#LUxVY#o^XMfee$^5-LVIjQbblTSASkC2b5!$I&ivEJ!thi+ zJ=cZlkCz1^&hqUIu}n%UnbBHy#iuV58z74z3(s;zHA6nu7;_E+=xyu>W%Sw4;$C&NO8)@PVx~x9UJX%wdQ=XRZ%GRI^ zfy$Xt4ynWxMCS)5t~&)GP3nIEDl%kTBW(?VtH_;HM1kS+H^Lfmtjc_=n0#glYzLCdR z|Bs8z2p{O?!?uJlkXE>Q{qx%Mr(e`o)hsiQ+vf<(*4rh9vPC8j*BD^j!J`i@`!sNk zivS*=rG-7HXa9ZHUgMRUGi74_-Soe7-1P6sE@CV4^i?}I$Dw=&*+2FOaDv~(nbV;5 zFxG*)iA!AFEWBu><2hLNnjYfT4jqmBp`+|%&CC8v4s~T+qeo~^G2KKYiB{FN%ligQkERR&TOG4c04V-s zTS0pkU=HVnw2vPHl{3!+wvfv2_CixFF;_f3zT8ZhfwAC(|3Gor(qy?X?nVV_9vR*L zD(W2E2~0VFw;%2br1M9Rk$Y;HcMv6-U5kmos6B!o`QgWa`&3ABafARO%bB!_7%JSs zs@t1Q2QNZTv*C9avTgP&Hd(-+EypK|$;%j!d!V!$neuTvZyGM`3w> zdSA_{H5k3;I+qsKze_?3`YD#Olr*BB(qD?`u7Y$A@P4I9!9a+Tr~e(Ps$Y`}Sczd3 z7nJ%mT2VYyKC`_grC*G1wq2t$GD~J{A(`8@b*BPfM4Rv4ftC1VZ$Oa6f~VVl5dQvz zNv1ta$Gdb3ZWcQnqxBW65zidzqKW+FJi3l%%_}25W-O?hTj{>B!UzY>jU|a2Kj?(& z<@L=9tb8?+!?_U~LxUVLgZaXF|GsGUCv;rv6YrlBE9 zD$|KgL;`f=F8c;qj7C2)vb0-MEpo=>bAbJjWur^1bQ1%LCYy7z@irZgG&TKA6`V(_X2|Qg(ia$|B_d+o5!KHK<*+dnIMvba(QZ&j6i`-N;Rt2?Amb#$|+` zM`<8O^moB^0Y3Wf<&feR`-@G9Axfo7k~tn{tlU6GoFY(LDdHhfNy!cUeLbMOGK)( z1WuYFYd;S1o%)QgRxN38sZp1`1H;zPayUAffOB(|T}FjnutT238Nif~-WG{HSQwBH zVcOd)!HGW8Re)r4&!0A>;;=eqd!ZYY%J^oNr_s^8!9LW)W9BQM-W;NR7RHfzot6zp z@75c~kTwAuN5o<;2e}{aS?;|}^mDy^Yu)_6Qi=#fAu9{dd$vJB=kHL23Bhq#9K~v;zQJzf;G3JfTNI#*_hkZ)5#YL%`T4BYLXMX4t}<>>F<$1 zXsw$@^261O%r$H{@x)SQ+si*4k0)5Q5m)NPy|zYJ9JD1V5y$&XVXkudWnWVnqyqm5 zM?43>=~>?=%Y4wC(DqWt?KM5Rq#(uq#5qhe`>{QnnLP{qH*60 zBC8zLT4m&B$U_vr?S88B%F2<_!q|%ItPnBBH{mv`VltRg-n{a02N5|bXW!`QqC!9# zT{qac^4Sa+@dKQ!&hkEtC#JJyDQge ze0vhYGau|tU}dgX`n-ISJ}FHzvv{A%K6 z183!zBG#waB}H4I75m6fN+$$r20Cy?oek8inb)zurIQRrt z_BA;kkCk{Mrx(Nj3wKLhgz3Lp0FYQiPX>|9b13UwAcj}VM*sgJ!%7*xRoc7U%GJva z3OA(wyeL z9@&5C%YP+85M{TEUMS|gZjKBJ)z`medI7FK;-wEqTHLlXc$;jG#U)}Ru^Kra$Px#p zXBlV0)qsU5)GFv`j@Ms)$&CaV?x3OgO?A2FRY0*ho;OtP3lQLZkCjoH_7jLorZBAo zLo8umYf3Lw<+>8Zwb19d)_nhuk%6lG_w@j?AH@r4Uc4A*3{2|I=6tZW~-zmWK__~-U5!U*W z?C6JkH}%RDC5fk~|6rB*mCdT+J))1qsb?U9GC2ZSZ$Vu?!MTdjJ z9lKgYJW=_~Ircgb%y2^ZO(0+gUY>$Q>;-rteOXqfUG<8tjM1JQg#*WTNw4V5_tFP6~Rzj%7 zf~QwF67#9naE|79*rvjTg6w9w%tg^dt_$k=Yrtm@CP>AOREWU!M3-}#=MtSY4sU;6 zcBLC;$4jAj>LqB|)`qWIs={`@|AWcXRt3zMXTu&HyX!9`Vn=EoKQ|f>pAk%deOE}E zbeZ>Mh6p_JfFpWHrR`f4au3I|Ap~9gVK|F3atj2~XhaX$U9r^}a?Q*5DRgv~Y>Owy zb9^EGE5NmaQv36C;UOa~GNIqv2X~+57u4xb;aj8}$>Xb5zh7s;RI|5mP1A{bMOSnA zyR5l_JH;B&2(4H1{g))<_sT?_wVGTkKCWnhetCG=>UMN}WK_6I!s#;&&Y^y83%io> z=g^8T;G%LLfA}?tNo8kNN2YfcgNkRd!}$FvA?> z-;%W1l%qK;s@^bCxYa~6(#A60h>ax{KJ3Oh8lJ6;SvW!uiCwT<*ENCdF~-r~tHVj1 zT&}EF^Ug6}Pq_PliqqvGuh)5^NQWRnb@)f^x)R3@O7Lb>DCcp;l(-$v;e`0EKG9#9 zyNx`hG$t-;StSM*kwsyVS~icua=#@A-(}}*GUxRwb2R1CAQiiJM(F}ZPz8L*p=XT(?x0=cRX^uVLW|N8S7dqcP%Kn$la$>l z3izLTHt!h|55@@QrrgIqn)4AkU;Yo?{I-&tyh6IWdpuaxQlB;xIau6i>YWjb`RP#ZO^!6_GpEzhJ@bsCer_>O zEMLwJco;{MZ`BoMEEOQ1-Xpt?uIcvppGK{M(d$dC4h@|#^!e-WNLX?v?kYYGs`?p+ zKIR}bA7-$`c%4XtrscMlOrMuo)s1Ib{q}ZZ!+tTlRIXnJ@#8IPv@0?0-@IwN!$o{)2BglE-SQg?!W0X*KMz)%)f*GI-Y1hLr`vJkp~klJ zH(aK^C*$fYgi~4?clW%+e1wl$p0`t5;XC4QoP2PwQcD*q!DtprQSi^B5+U4jCcNt; z$Omr|)m;ye2w1%+do;G)C*64dWpGE0aA+f|@E~r654eQfesCR2!o~b(w&)=p>^LUl zF*rAEU5Rc}+YjH)x%Xs5-mBR|9d4+9r&k~0%V^fW|5Tx=Xnw+UrPLmTmd($-f6iJUh8aaQ;I!~d1hWq|*^ zv$;U;cIy85^Z0tfi)%}jDUVu?us$^Ge02My`?BHrWM^o`D&LDsr+L7;3}+4+FnKn| z3+jK7f_JK(iXOO3;oI)=--rR<@jX0Q$8>h$-GieQx7n2@R?S+4ck0#}GL@W0+~Y<0 zp+>{kOQl$%WgAyXgx-D`u3=$50 z%j^I>_;81{!I{H&HfIIr=mD>2QeqC9#|CIxHI3RyG-B{yHXZAIDKYg9z@eYt{$b0* z%g7S!d17!|*BOISD|<@4>}+5^iC1HyM1qIcg|>&=6$iOIv$7L%#(4*x^Bmgm)I81S7|iKu^4 z#x#7c4(Ce0S5!yn&mJTHg&;X`5*U6|%zfSd)~ogAZcxP7eI;UYhG3DP+WUEteX(Zr zzpCrR#P!D_CfF4jRt%+9Mq`h-==u$G3|BsU->r4Bvr|*jdURjVM{qBGv}g6(LFizu z4DlGJVbP1c%9{B@vIIU$)C8!Y`8|{&Jt~R1T$;b&@GaS(aodB|U*;LL9y$bIv&gyk zSG=e9^A7`9B0u~#6-&PtG(qX+*1YC3mgnYw`!N=^Gu_*j`nb- zDWdX+irjk2@psph!nrS@TVqafb5H$z<@$u9s%^(Ab6oS_;iGsoG+T(SCGuhUf5Z#H zkCPaavZ)S?;#SzKSt@i>h|B_8y$u5W)n+9$7N^*Vpae8Sc6 z4HpI#XM5T=lw$@2W+#?w@Z}nD12KG3T0GBkx$1)ywYw?S9A_?h1hC=}y=qiY)4xY8 zh+A%?=h>`YDVy_3aBq~a$*a(8NkRG}45H%2sZ-SCtLOd5w7yG%9s(!0hE9K*1wKz* zO-3uk`$xW3s0oj*^W3a9L`mE3`2c*ODOM)?=|K4RgF4HzQw4SegAWd5A|%wvUfGKg zUkq~I{)L3<3Umyr#Za9QN%&JK8Abl5r_!f6d3ED4K{rHQ{MGjL*N>=u+T4!JO8wiW zxh*uKg{IwVCY1^nbNKKvcBb_N4%Z2O#Y~?Sn$j)rsghAg0&obeukkDDlzY^#?M(~o z2lB$&;ZA3Qb1W4oVXMF^s9&4|lSx<5Q=aA4=;t;^nwTlsMpG7i+aR7WGq8WAH#x*?K-vOjA%-JTwB{a~?{eqoaM-jlsUgY|=&6bw&K zYIyGJ&vZjgVNvYP+$a7wc|g(#5=C%3kU*H(KM&(AvNSntCVrfAy&zzEDD5K2*10~L=jb6eEo`QR7+_-ecReB;vK(7*CrserSrEfMN{o;USu%?Rq*+`nobzm322Utj@Tc zK7%I&kQa6Yj5#9qVxiO5irC8xiuEshxrW#ahi{y8`ZN(7mAu;gtl`S}{q-9yO11m6 zI>l3_Jlh4=A=Mu|JH2#|1(J5MH8m<0lcNnc+Jo-%B4@UC>&SiWc6^h$&!R8T!htAq zw)~~2^?2$|DAxy>`ME?6W#M%q-`Q}=<1`Zk<+ko#pXgGd|GqgYQsU#2%t~cW&*l!t zY0`BUSYcar>$4#px8(O%Z9?sLMW$cyHlFuu$1z1`iO%gap!imVoX&bos^Q6I`Up(z zS7dyLQ*pDLH_w;-+KBjE#YlTANI>=S)qqQ$&4i!ka-l3JAXGe;BMTPbEo*)MKS`zF zDUX+U6uu)Lg{A}!GzCIZnufGnk{PG`2cv8qdf#M`n>ilpa9K`$^*gvPO-wWUFoAx3 zR^v-Jr8a>l#TrOn5@9GHZ_7}^g2TO4m?*jDwH>f^oaf5w!J4MA3fc*2j}vRr6xrV- zXQJWKAH|ff2Tq5Rz%8QQIJzf>J|U~ z>z)B)bk<`$^MeS$yMMXHES0H4#;2U9;@`x|hJC#Uk7fNbcT|gyr*}0uaLa5X5~>bKJq! z{#Q)|mOnqIv*~|3g^9keh`kiyf=RXA+SVFtDNbSa&AsSoLX&oVo>E7&E9q0uUdM{B z)5lY3(kZZ;Q$74YOb{zf%M;N(;`igo_}q1r(DcwMU3|`ecjC6If$?%cjw`DDv(|UrTvM_N%aEO}XzS#-ug2(tb_>1D8E{p>4EA+LT>! z#?4x%yK8R7<+?^$*__^n1}SQ6^PTn8tWS1ho{bDYpK0CMS-$JpJlY~_cKP^#`fZGD zr%l#4(G;#w>j?JL8NdUnMavgggX3Xr zvM7P_up}td<2~}f<4MIR|40r655PMSpmN7Y(=Bv8n@KE)D+VsYk8k6HQy2*A-hkg_ zF*9-%r`~NXNe*Ui)Jo{Ma&r*ZTm??{z{H=irsHv|7Ne5*%x9r#!6Ov4uW`11!pQ2& z`Y*i6KdjDr;#V2J%a7R=PSg1MRAfr{k_Klo;!|=ZXP|(tv-g+SJFts5U7d~{_F?yO zSg#m^4GBgc6&!WK>a`|(cnA~@vK4pEusd_XmQKI;`s&X^5p+WkH=4pSWi+fL4o65^ z^(t|y1d<;+eFvwt*rLA&?-^CP#NvBR*)X==$t-6UgXW6FCuj|#EYFJ zYRV{25&$5pLV!B^FgJGX&#mHw@RlE2%+ z*<<_xb|hCMZ$BSBq>Z%uej&VU$44wpY53>3D7UEp+=CQY$v1Zc}HkKQ+O$POsSw} zubyvKnh03EU@2l`-v8Dw=pi}fJY=ZgqNy|OaF<5YHV-y(OD8$ zAU6(R#FhP>j}%n5njEdY3U$;g6=%u98rcgn^D`S!rqalhOZO10Mm8m?D=)WX-k_zV zlrbKYit!o;DDwJ_+$k9qnu04{5h$u>W%<#Kjd-pvPt+|u?8V~W9{Z7}sYv84Lp1WYFHw_Kt#oVloUOF#P>ub8k>yV62XAN>^+ zwwiqiO{rN}eH$x7`VX%1T6Ddxh>u0{lGRq!`SZl{_CF6hbugtX75*7e*F*r4Fj$eL z?qwF=AIo+HFJ{ypZT)(|r}v4zgX%S(<&)$rvdF0~Q4ys-_%jn<IHj$DFe#@iHcX4_o)8ddulKf*n5oaw@b61$UX})8X9L1ni{%9{0S*HrsKn4c4wUY7~kxt$E1pCO7TI0hk7C43CC-L z6khpaWRYqNX>o!-d)jEVvm@u$cEcU*g5F_LkqT+8uTZIb2f?Ycvy)vxo^z?(|L+5q z_v3qAkLv*II=L{zwYvSMkJ|>!uB_jeG{(@sLgAYo5%sAJ+%Mwn{z?~_;5pDkNEd^P z=8a(q(OYgkL_E+~n>6mAhKy)09qe+IiR1P#zIwTE58Os?y#-emgcwEn*=<}!FtAa0 zm`Xx0wBsbGo->zKCAyb4>{~Whqt-B^W^@=u0U*Y2@6A>59 z^l#b+4y`?NNCQGn#N@q7bj!@t`XHRUPq zOcWFZL`B=PnR_{_;*|t$`Eryy!Q3Zgg{tl0%ceGm3;d;RSa)kBY|aZud?CIxq7yyj z3N{HgRGP~qvA+>gc^1LPKI?;JjB4#KD(@z<2N$ONU`Kr^+JI(;=O&0_=9r;Fr&50r^mR zS7^?|JqX#MMw;I{gqS+)Z46Ph(<{NX{-vJ7m0Bjp`-fJY5s`W0DhlbJs|5{bu?;FG zx012ZLjuI<`{?0WML)9n5TIDj)SE8B#}yN>3n8Yh;|~1sKM?OrU@mY<>PEwD<8Xzv zc`g&DC?Chl>62LLh+be~(qpl$9_r{6#pY3&_Lxd@w_=rkgFV8LofAoWLi3Cnsq}Xj zm?s46B#~;U0^PD3+wX9T6R93_F09|q|DFYMF%41lo4SU$DARXYqdO}R6a~dbsqDUS zBQ+0`8C|IdQ^dl<))HNUUl7JJGT_J|F+&d4%w-5nqEI`v2i`&IS6@XGg=LQCHO(xD zX)0&AY82s>iZ595{_#c__h6@@DGGYGQ>I<4$A# zU4(97kXnqU=J2+knd2U+!}&WB9CRVhY!FLUhmfRsHs^{%of|R$ROBFj?WGW!M|W zTJ(GvoqvX2S+KO!D)iRjB8@(Jr5ZEyzi^2iYwTdD%=0WIi5`sWgr*7dFU9pgQQf{j zl&Q|suTnpfdM2og87N7}%?p#XdBVF)KciBW0L0^Z9i zIf@@v6dESwZ186USNFxgfDJKs3O1ps#&S{<-mt02sMN_rr-uEeFCQJ)UKRSiUTqU_5)z{;y>V}n&X3Mm zIpt^uEb(%poaFaO<7#i!qD2&>NCO&R0JO4xCWKFCmxa#%bzeAjPY zjE=i8cqaF2vOqKDORb@Fqbm8w?g}rIE$GO@R!1lRFr@dewkifLYb@jp==^?r$%;KW+g?b)lx z3?ZvO$a;;(2Wx&V|1m#siZxorM=+c9rx;?t%YJtn;-1MOV{{6w)bA zuy_9;H@a3KlQ-g(7j2H~FB1BDR~ZgLgM3mLLQltlLMN9!mzRcbSRe9RA1ty8?6Ow! zEn{phtmQcs`*fY?5~FugBDq=A&Osldz+|(F4e{DZP5HlM+MbuJ@m!aPW{G{S;<>uykHxMK)GQzVM{3~>9!9ILl0t3w z^`J3%6_l1%7Q4PXrRet?2q(tFICS#as@n*4|2;1anr$_l(SzsTQ^7FEP#d!Nezb;VTrD1H;QP%j<%Np!ei z>+nRy#P|s7gb6`Az(^g(zt2=w(F$Qs@7fe3^!6q`;wlSa;O#wM%3X<4=yq_79cH&H za#-Pe%Bk)BF{#nMHRp;vA>>2^HlIhiQ!;Gcz z`Ew}CK!C|_>#O|KjN zM39&3Oc25-A7N!Z7>=K3%2N4rJ$?4$k$GkwsYk=+uX@Gj7CK0^t(H9<n^zt^z4RqTO5D8y-@`prTe(AY>1vD&*aM}nmTyd9 z6Cl}zTRQ$z-YuX&$R(!t((JNf(ixAbG~S$L4!3xb9ocG{cAcen8#{9i<<>Q?6w_Pjt=}Z&n{^WYaL*^OR|&dIQLvgTpY8}J%33wQ$A3UN0(+54U%4M~c=8i_@B+>a z{9JTmdXjI#5<-!dt$uw6vr(_il*)2N)7(15^OW8{y!33;m#1h`Cy=zg{a8emSX86V zaZ>U4rEB_PgO;lqAtzC+bQ<2WSOs9#l4Fh$)(h!Nfp()rq^ZQiHn{p%OJ-LkfedzFJTWyvQ{zXge< z#y`ZEzm|f`GK8(JDwjWdK#KGmV{upr3J=*Op+K5Ifj6jh_GJ}oo7(bshKvwA(MS=i z^~b~lvTC*ZdA}*rfG1>@3usi5{myN1x1$=Qohk0xX|%0#EFK!_*J)sQmP8#^lbO|IrC?gVrAJU7?YCCEFh`!8)FLL|%lKk5UorlfV zHN^jQ$Ki8&z)0F~`;MWbm@e_fzDw?X=;1n3oz5v+d2p3gpf0#zTd_W{DtlNa@`Vj( zKx-Y}S8e1O0cZO2GtPd4IRSeP@q_cM=*=85@mAd04>yq<^w!?k%RHeL*YVaEN)Mjt z8Vq6En?VP$7!I0JpANd)Dk`LP|il z>3NLQ)hOQT>Wr{66Q6ZHE@yNisyrkhKbp6fn0$wYy}CJ-0ivoAG@phG?ye0sqzBgorQeh)~u z@4pY1d%WfxEfY!8Vo%mGKWR%g>*2p1yy-kx!L}@6qE6v&&*=@mV@_BYwC5*4Y8a6oj#q_o-e%w;0Z)-a9(sk)u zoLq*5_y#m?pJ-vBzYF-FUh#EGqWwqxXwNrp(x%p~fp7d;pHL$D`DjaCpG}e;&=o#W z&we0jUdYoZ-^-f+DCPSyQJ^eUOgxd7TB*7>tmn>cK*fezPr53-9psS1`=jM{eAzm9 zx3a`r#Nx_)4<4M9nzsL@8s=zoo4%LV<*M+52Zv1GK7N(4m0s=>EH7XVHr!{{*qSkG zUCmRdG-GU2`)=nW!n(*Lr#=Rl2JUa0h*PbiP&PV9Zi}Jq)6_uxlFsr(BT8EvEPUsRY7m zj6bK&-Gad8YSYbd*d5c{qnfc`cMivnz4$A628l<>bGNr`6agg9mnl=j5Uk~z2SyBv zhXElPr7V!?w2QDXVD8?gU#a>ADO8SL{OKD1kqIwU##UjB`xRc|Z)_gA;<&4*AfT;s zPIE_8_#9vXzR2qzhXYJh0t9O1UM4qAb-IRkORfredewNeV2kP(d;dZorMz?#SZE#r zh9dmd_+y-rhLHK24N@l4@io=O4D65yDG*Z9Y2M9&pbdct>2S39W(Lay0GWLsGyik? z4TubvdVfiBe}3qIl>*IK$6K{qLQs${U1t#4Agi{`rQl!Md`0&vH8JtM9L)ZP9a|ow z-RzKO+WxY6{pl*yBc*aORn?wdjpcyJ_P4T3CYlY>}F4EK>`{0!|mp3)gmx*kM z5M|v*_zpk2?LW_D@Q;uWm)ga=>mbA!yX&`WLolz_zyx7pW$^83RL$+l9*o)z0)&?_ zwE7(W%S?3#C-U)IQjnj0M(Anc^?%O_)-3>q6SE2uAxMw1x7#i_j>TksT{4n3c`QxY z{nIt(*@zAb$03{|P=!x6QTpNF`aiM4CED=*QL;CP)%@7vI|0z?_^2-o)yS&?$i>k> zHQ+~O`Qn{}&!4|IgdXvBEuR0Pt4{k|;n2WE{g}onHb%bD!9k~Udp2x#9} z07l!_pRP}yojgwp?K3EXi3V}l(TrQzoji&eCAHK|98U7i9960zEc&EPc*@oGWvC{K z?0*Nr)@~+(nTB)`%dxyBS-ZtAG(W{ndRdv5vl|7;oMC2ZW~B*;S71T`YZqWSs18t} z35oa2e%pP^4jvc`kPF!aAN=de9m*U^(6GrOpf)TQa-}#U@zSW^&1ewe5q4biu(Fs7 zkY(aC_AQj3$%JP?#%-uMZrHu5DVU9Mr+gz$?1xfaU1tARA9}0ULz(FW?We`%O14AF zeaM9s9c|f?`l*E~RQs)C?Hf)-W+wGH@|KZ4Flq~z5dl*yQHBTIdD_Xm3g0xhFYJ^{ zc$(U$O+9@4GK%#Jn|JU{=17hF+0oOa6)!!m(0pJ)QJ|i#Bf=MfRCnuSE0HZ!WkpJ6S#D@_y_WCL(*tuwEGw@FPP3 z($Xa#wK{hvMS`Ac3A^qz>{Nx8#r;_xvfcl!_5uL-f$ISo0b`W&6*~1Qssm5HvfmZV zzodt2-R-;q38B^>`=-nb+uS-1__wr4k5TnhUlPq!^d){eleq{k@&791o)kK--(-2| zthC?O|N42ILgoQDvDN9+U$vK^Qd7O#5!jihI6fiNLvV_kZNZiH!c4W8-l9*KEA#kT z-N72isg(ZH!UJoY!p2usii^`o#AgDY-;YF2-1Wd-X#gA3fB8G6PdogEZEZ9##VL!;dJ$c~sUesi;}!9I%YMA18xr9ozT|RX0#HBA zFTY2%K5n@##p=ioBvO2LT6)-jvUEe8P}Aae$KVmahaqi{;yD|hN>!lxa)_Je`->-X zNcC*~wGJaPo{`rqMt;Eek%=y4;9sPiLTqH^24o3#^Ppy0#=?*SkE%p;ntf05A$*hL zg60&--IdCTGaLo>FOLQbi>#65$sIX>ycSeK827_6sEhzcVe*)A<`+l=WTPHCBC98) z@|r%IRz*Sy??(#})**{@JKld;OZU3!rVh!jn&B&ZLFS1_o!spKo$p64+xDuPm)vwB z^VaR~!sXgrrS2t?GFsKB5r#RZq(!!2_L6>xar6PAEUSmNVU5o1lR%&vnuuW2BI$tf zxyXW8UmugHyGcI-{)$~IU$7nHs z$?`daOvwi*@!pEhMrYZ>yc!Cj@&L6!Mz-77bJ1YfaM^FbHktmWZHPNTE-nZ6DQ8J4 zOOO0~T0^}o|K=RREh<&Nr~4PkKrpCCceSFXIm+!In~MOzitpm$pTavV-%YZmI*=`3 z#!1!vr`Uip79!7JoRLOXX z6lI-TqIfH$;tnmKwUaF_$Ajf8h9q4v9lk4ZGut}@l~D0wNl_FPO+v!(@pM_Ke1L{_ zh$bcjeBaC=xD1;$bZefQ^tcFcg;x7F~TV%(q zl7p;l-HvbsKr}mlK*q#&;tta)Dv7GScB48HIhydXt8{rf{L3oKMlnwx09 zh_?fP3Ru6^s=_s&pJu}MU6Qgk9`K|_s7&&fF_c;kUhg(b)NVK=HsmnDZHGufk=Lgl zf>#C>nG8q<$8@|dr6HZEHQl7L^p5jy9za3H&p`ihR@J0 z*Yq6nuk;QMF?W*HbbAuzNtwrj+*sKUSTi;EHN=)=vS=Sho--*S41a$pJ_U$BBv=`a z$*~n@Ji2d%J`Eff!^x8LX({IwVklC*!9NLnRz^PO7lo)&5&s9JPUV63%v)Eoz9cqe z^oy^81Aa_o(oLoFUn84j3YB9!eXZi~yx1TMOZ2RYEtSul64q}j)VnyG>l4XZ)=!)n z7ZJUBpDqjeg1N@&N^3SiY2)=g%!@uK}pzu()>h2BdUo1PlX)HleYKIjwRxpUhQVD zR>}8V_uGE10i_D4KXLi7a)@Wmy`|5_JO5Fcy-|y}L*RY_Npq3hr*ALp1Z>0C8Qo5s zpO`lPmpLKVUkD_zp{j*&MvLBc3@y+50St{SNz!}vCE6!#QIZ1=EN>jo1Jj4;-Tjf zUk33{Ef|#Qf(`AGs21I?{J&p=z_?c(?=h;E1Gb2oxxu6mQX@@S082C}mB`0{r9jDb zscazBu6%sr03LV}yi+H&D_S#7a!QKsQ*zPWBbbHzE#YPtFnJx@+5ptGp zyt}h z@p}l&qrOO)vRA{hq}i|PzW^|XN{d5}qxvWlwmj~bg;a|o^p7`7IfgM55n>!^b1`ZV zsCg0H~i|knY>) zLqtwW6&Uf}RM2TFQ7qs#1^EM)c@L_v*PY~RfVue%@nw@kE-%0vZmNhr3ax<%Ri z-(^z&#$w1ZK_CLW&^t;o)1w8l;OUH-9)$TlF-I2lw9vZ;(P~vwo2pl4%2b+X%TlKr zG7~{WWhX? z9kBEJApgp$h!V4P(Ratr3*(D@t}(3-&)kIqKrr-Aok(l1Sgv``5iS2C=`NmO17c$Q zpSjw2qFrTDPC@1()jMJIPAv+Anu0eqV?Tg!iC)G5M_QMK%3t$7(T&3&0CLkyelJB_ zggJZVA=o)hs@8gXD~{lRb_O;8eaUJP)^)COYMMO0uB=Z?Rf0&w%c07K#QfVcw4UjY z#TCrU5+h>l+UK0!!{wMJ2nl1x&5m|HJI~xI+pT)+lZEvv+^$6#N_j7d?Qrd_mUT{?9>p@5$D=6_AOdwZy<$enq&>Qz<@vv)5K06{3cKw(M;SfR zBHs`?B#UmA?J6h;^uE@-lKANx*plzAGkTWm5L`&;<9LqpKqO67O)C^fLtOaa?YvYw z-hE;9x5wPn!O69;KGf5j=~w0)(TW=ovEUF4zFj&au?SP!*zgtq2#dzjRp&|3ab z&MT~a>7jiSsq!~gh1k1?#|SXtgB8*3^i9EKmvvY*_Mmf{(va@b7J`P%fFDWt!NQ26 z*-p?3en~pDx*j|LU4p=nBtHzC=kl$)*QT;A*O1IusBTfn1 zu=DZc<~I>C9GgfbR&yXGc6&v&90@v%kqqezBD(M<)y}pT3{8&I@bu7%>G}ml;I0nS zyH_2?KZXJ(*>53-G5DNeQ93rwTZ=^&*3|On2mlsy?TR*)0+p+ zxej1qBNPv&KFhI(DE`&mM+MMklWiJw^bYX7hN$NFPVD#S6F_AI*htGvuqTidn`V?K zp$wi)7MsDR-~b(9#48fWvYu=-w~4sa(X+C0KuYt*%a;oFHdKNgcxyMJF!OZ{GFDwD z^@-(o50I)`1g|BX$P@&EYHZwXH&KTMfpzBl3B8@kODn!KHcm`^sFsij^@7SoKo1=% z8#9?9&TO>~22Ty-^g&obWDx{i0)s!!@4>6@`M{!dJhnF2PlI(sSr#0}^l_ucc%ZqA zJ@3z@+Jhj(|11DyEzI!Pk+%$dXW-R#%+{aez)TT2E~Ct>w=jU*-+7Q(s$KOO|`3^9F5(`Jnx!^56g&%6+jF;B4AqP1azY;L^dU;$T8eGrzU^sB`Q(Wr))I z*$Z@)O}%B6$wRZ`v}7w_Ttz%0zWE5~7xMLX-;eIp16F$0W2(DnB`KVn+mg^wy$UXRsv=-=^No|-RaJUQz~`d^*O4<5pAnC(@iO@ zJeG{$=;vf7<9_q4HBS^E;&n-(q}9^QM;Ge8%9b(q-Zn(2PCF2@igM5Hv(1At?p1(G zF+OTR45bGTG453%g=165jXO6cM+ziN`*yuLJLhwnGrhn$6Tme$89XjJ=W~@i<8+Ln z9&9h|Uq+ox@7q0SiRTXH#RdtT_27F%18*~{BKSA&-CtVxtOkAwj-q6c=B*EX_O-?v zKPTZxCW{gvP$=Y@puh=prjxC7UX^l~b<{a=L>uqjjo{x~coM3Hx5Sp$YJt?S;OE-_ z#;HSP;#8t8880M(vP-T%m*bvKBMsq$S9le{G(B~{^)sYtW zbF{dRVwN%MvzbzOon(kdE0 z`jIxdk)PLUPDH_+_T}(ClGP_r!j$-z&AumfsmtfE+$$$`cyrmwu(AujLix%d8!V@{ zN9FuKKOU96KUsUd?9K`_oW|m*P?p^hmglc95mym9Kkws5(emw8h?K=jH_CSv%x44I zJ6rA_3OK?GC3{kUETOHNJcP|9vO8btzF)@qjj*0i1>cTPjJg`k@_0CPoG0Wgc{flr z(UKKFZ)LG@ba4D&?fGbom|m?O&F?2jovOx5W=ErG0y|dyxjgOG2pFVnviPG43em@0~k$ zeo3t4$fHRCOnJsh+24AaG5*wMq7;L~XK| z3pAsHXA>EYqJ#f4mjG=6*`>9CFh&!?evXT-ZVH8u<*Cp9DI=po*yn6Gs9L@J(~W>7 z1P-mFUmwhK8a@eg@f8r!S_`MCPmq4zFq(skHoDhQ9m5W&L)pT^W>2eeY;Wr!rw6vKGHDb z-MZVjuInmUHPb-NGiW$XoQ>WoQiwWYmjP(!k17gESjxE1aJ4-C5ZA%k!2O{tCr` zJO-iom2TUOByizl!o7PyK|J&v#Qt z>LNMaWDPxv^ZXQ&ViEl7+dZdG_=YX*vEal3Xtt7uoqZ^UMKe=%L^X)l^HiAj+6xqW zpY2XrGv?m)e9A(HVCtZh6xF`u z{YcQ>wJB@F-ha~U90K1^-Oc$c0v5OBLK-93Qg(#nX1ytkBnk9#0(x^ae79>wQj#Y3 z6A6?MtHbEZ@if$@;`4;Y>=nERbhqH{cZH~90^p)AU3Eptptpu~H%cTwZ#{QKG%Uxd z_Y3cwbnAmqj?$AEt&nuP2#%;GeM~J<^rqMl@Y&0)!~@rDrTeXP+EJInc{*c=U#<@2&qpg7h6+sMl}WDE(2NsW35%9;Y;g}gu{RO#owRw z30XHc+TNKkM^u^r4o=vd+g)=T8pw)U-`rl7_X(!Ic753a_zrD~(M3nVT2L6ZZ(dof zW=1^t*FScgYd(VkM`nq3_sO&DmxplnSen^6yx5X_Eu;uT&FYX-0S!*ZXf!;ab325~ z!|oSlg(Ce)L_m`1*%y>lycBfL89fO&04UprBfXZvb!Y~bu1IOdQh}5L8F_>lP80R& zJTd_;f~Th4H7w^HqI6frEJ+neo z{u;6d3pxcOJM|DL)MIjM zu@C-h8y>u;>qC;=;e@`9NTN!+o!=?5-c6*XD-JGEY4h1hwllBuQElTny%h=J^TWv0 z6X;)qViy87_e}jDeK`EO>u8O|eoc*mXdhsKX7kX&Ep4zJ+`jccF0b10aAqcUCcb3)YfoK<73J zx!Lyn>pNgl0QOk6lRroYZ9i_D$CFw={EOmCb0ohYL0r|5iMt%GHf3Yx?YvWSp3uK> z>QnW*R7Q^}kxd#xc1;t(&h-=5lcp(lS(8tjpSzsXTGGm9>QWf{Z$mO>c8-L!Xh-7ThGg`pR##W1 znLSLRnHba%zvMrs1>D(>lQm-dbh1l}Q+*l0Ofv{8uByVpIB=d8(<>>h6Lw${)7#g{ zQb+*ZlOfcQcE~Q-WN$f8YSCHdY?PLNOhnKIqr8qTpXn0{HVl+Of`ah zfg)Zm;NY!yoCXfDs_}#3=c9Gyw7kmfE;DNS?M|xp8Cgd2&=}bx6Auw9@4YyZJKAkF zw;r!(5}rEKE74bzj@UCzne?NENGFso8gCP#UIDwuZYCNUJJ&=YSw0sDq=yQ8-w`Ru zf05gEgDD)O&T}qU>JEy>o@JJ3Z;jqSAnGo-%6cXEHAgE*)lPC_#R z)7Fr}%l*JD0dzOJ_mvDxOf%2%1H8$_PSjx6<>J9u6mu~5Qwo-=rq5rQ_u*GW(9vE+ zY_Al6Xped802l)GR9AmA>~cD5omW+!7M*WCmb~-sIfH>P&|ztvL;;D{Q00j_!M(p< zU>G-B(oe=@+DKZkOnQ7`=BEmj3)99AO4dBN#MsspRp2YKnH$&dE6&IV;S*=cjej4& zR+>u=CD6uAgK$B`f3l9z)FB8}mJ4Td8vxJ~xJb5i6?@*Sf6jYn(r%NdIx(O};RD91 z;L_!3FmYsb_$n-~`R#AruaN1!&h~U!NcyX62FdOai;{1*<8h$OIcDg~J2At@6&ry= zG#lKEC~8iil*q7U0FpFKX@#gn38Hi?N>P&Kb9m3bnMrhqhiUBjK zEcAe%0TubU@4kL^l9PP5+&Y5a|4;jY%o1L3$OJ~PW?60c_LSnd{cmmQ>CWVcXQM+qq}sMm=iiUcBYeOXa4C*VD3N?3 z5n3V~1LoC$rKh>Q=KaYw7W2>KN2Q@bh%mx6w%o@VXn*H6dzhC48>fm8aGA_|KOP3b zaXP_6dPNQ?d5Eh_iQ18MeN&sa=YgyVIO9*K6=X&7jaD8 z==_G~yZxF=#*W#%mEoMHla6JH{uSZqu29SXFO z{sU0n;T5v&+~vA#9?)Hy_uzL(W;bT1S`o#O??G;?9*begy0P-2hQu9$lV~#3$AyCH z=JfXKCWKV6AERi+c@Am=-h_q>zUqyKF)4%h`sL*9&rPVtfz!u5UX0*)HBLtks^Id) zaHfw&&$;{sXin}v|H)_~c+>sZ0X9(2^am}i(0XXIJ>Sf%tu&3m!$ijSkLrkOf$U|RCKUa zvVJKScj!k;gdQ@c?VVykCeB=A$~NKmJF9Z%qdBmsdtV4SAiHe`z(=nK?FMeMV=sT{ zz>G$5kTguuJWbT(dphY?IwU95sV9Nv;Lz1r=7yC*zW)-pyu*P7;GO!Eh9Fy@NBq^% zb!U&+dU^HcH@csJ?p3FE*Xh=kPFRQK4p0@%8xYg)&>!T9y&E|3Bf6fXJFN< z$3d!fb`2sT>8;jN!3<+17hGap{x7epQh!6Kxtiw#)Yb+qfnd6zS?E0^+u3K^`;K*i zDw7k)+?`lQA!G^j=dltf4`o}2LPie>#T^uq!^DMU1a`?gk4Wqbkll=6U%)Yrls;V3 z1=zR4X~@K6nhFf0m$AhN4Pl)QJt!Rt& z%3gl~f}MG~6wo9fX{_HobUe+06xu|7TE^_zwIeTXPIsR%wd>Zt#lO?MFRYh=p*S=! zci80zCx zIE#XLA;hB9^WHsNfY^o>Gg}-g>NoeoVy_|`?f#J6Coe6%i*?EX9}7o+XUh9zhTh6$ z3;K(;l6`7CKf;hA7&8j_Pzd5XAT9p*{5lwFUbA=e(MPu}Gm z8eM_X1t4Z0_E-r5$HH9f{2pz!xt?(DL!%k~@Nfi9i;=m_z-if;>#ovb4VpF+PSG8O zfr`M)`_yf0JzB!iZ{$l4Q;8_%oWUL;b5Pj9{c#wAo&j*G-%P$&f$`|R5b91geg+4? zcUjc@wK8W|L+SX^=QT_byVlJdod!d(C_IF>G^Amo=Ft7y!@m*n2+OzoiriiBVO2uR zW`%b!Owp6uih~AEHYJW8KP;iF6JZiuKhda@Zq?=7#StJVSyiyATu-G2=FN@k#WHR~ zsa;I@8@Hh~E6MvewTReN6^=`^9m1N)8m364OqQc!U3HH@O_Zr=bJiabe3&N$bYY@i zN$=X-IcTN%_VLNOIqm6H$_ijC9fz>MqVfG6X@KWZEfZ;g(>NZMx%vQRA_BVpdY3jC z$Wc#_;G2r-5omxF>iSwm|CiuHFC;_;$9v7{Z(b+v;5RmyIE@5fr?T9-f}scQrJsTs zrh0C#-buqqMaxwoX)seU3J2KsNAy34q8*Hr%DrDZZRjpjEUbTC2uS^IJ@GI&Nc1GM6`4caZUNov|wZOm(#JNa^k76SOfG&)zWQsz{%(;UABchPI@XmGN4k4!| zqZz|domvSLNwcpKRq{kVS?_PUY)uxRv)RWyj{Zfk_l2Mh4BObT(O-IyJO>y= z^&;oH8;tPVLN&wpOfV2&K|z>a=R`~-my)}LXw*NZ`gTfIn>^nv^Ym6y*>pCTZ`Qju zK2e%twN6mMR-|$OvBECyJrF}I`oBXieVvq3IP=p*=sRK56O_0DsJnuBxx~uYZBKJ2 zP2g)KM@0SU3bv>xm+3KL5Gl=4cR=hB+JKvGZ#fX z)CwOTIu_Cx_kAFmFB!4dWnf7h)w+`ah~-;xsXj;B{VXor7Iv!BGi;xSI)IBBz(7+* zG*T|UfLQ!gn_JEpKUNah0QU3=w|Rl)3{5o!R}A*8hBD2aV!I##b6q~g*H@wXc1Ri; z@4$9HF3<;uQkQ&j3^+2&Bh)qTqYgZU5ogIH@AxH?d5s~P&Cy=pD4TUS1Q!U@hrnDL zX&|s4er8u*we?ch3EN9#3PkXaV;83oNviRvqI|gaPoPC+c=|oP40fsYN$0~VXdWg- z^NcF+FCO8Q-*u~4t$>!py~4veRM=+pOBaBmVomj3a@d0mVlOikOB*vA;Ow`RXtod_ zIpOBX8$_W(PO82;bvn`yQvXwmX5{EV;ceAaS16yG_@ z%Fy=aqR07~aukxf{+N65qRj-PCwmzt(z*Mhxw%48W z5<8Qch{Q)oW$=HJ=Ey}^65C9rwCLjBTL&3dH+_J^IA`%@5{AQYcr2P zQ$>_h{%}5O+9KA4I84$sCnz0Kf@8fl-tHxQcB^7Cnp=G_S=NJd-&F*-OZCux`5%Rl+(Ai~EU>^_hL%kvIO^^$;wCx*jSZDJtik zIe&3=b&1@cDKZ4+wt7%DUJ@~x5;A?WR?pu?uuXKQ*E-J!8YdG5zihrb&a0x~`v?5I z0>?i2OGp^jjrQQ$2;7y^F0y^C33IA9Hc5JNbyrl=twJ3)o>_+)MjftCEO%SO^fc>C zEpq{D_o|XQNYI;hvnO zzQ|Q}|D$=ged^EUnjNU-4eL*5nZr1R9a+d@%PhI;Uhmw^qycQ!t2cW!x4(JRZ>R9R zT=7q-;MzqFyvl1Tt-iKJ9Xw1mVSQ6bU)kRV3>TTH)0zo zzC(?hV_3xC|2Gx(fmGOR=|=ZcBqC)n-e;Mbck(Day6Z4x3cFO7x+viZro6!R{P5IX zLC4wmYlZ~O3N&%%f$qcDv}|4MDP`7xZ&ex5lZ3%!w&%EBD7k40a+r#gY5gGDB{$0u zy`^5Ztu^mUqlC@s;kCx``giwRqDDq6SNxqus>?SBaHEB|S2dAhWojY*PRk{(m&aKH z*8wJ+JI3o}_?v!@cR?D?EA8}6H(-70r`K^7O%i^CwAMF&n)tH%pTF`^3f$}Bd-#a` z_2nr6+CmkDVq4bJg3vE8mrY#`dBJ~m!?4?B$vq6D*zDN|l55RZ+WIir4sAj(03;bd zs(oR$()2C8qp5Hf>0V7bdufaJUn8zQVsoBW8}k-ZO&G5cZ#X~;J#}ik-(}&RoJZZx zp?bpnF*im)g~iP_-r64`+S%=JBzwS?!hLU3XwhPp{FcE}g7>1ASl?e{jdLe(r@uH& z9QdZ3(O~RR(&pru_058|zP^d2zVV^WkB&CGo;sH6^M>9W=78tz+hpXw_;8s| z;1i2|7Km7nD4Y23I%hU4r9OE)!oi50BCoG=v!^(!V6L~;xt@bb?jVi?;n7SrrVhze z{eeb*-9)}i=MrzIOOyZ9K0~RKoqN8F0mJs7)97fgRgPYCw?c6I>RV%`D~4uDaBW}b znI|45-n5wPi*ifZaHB@{@{RQRH|yIBTuyC~3N^z)zp{v2#RKSyui`YlCrvtVKmaaY z>5^W(YbLI@NxAv(khtDxijT(>jj_R%8~>23UpP|V&Gf`$io?}l|HbM5;QoNiA|%9l zc7NGB;bO8YkCZP6!nGD1JK6Ad4egoSzsUVzW?Hk`L8ao;44AIP1o-{8;IusWxV8~4 zE-w$k00Pq_m>-ETrn8XE)M4&0j8Zm}-hHAm^h_bi*%RtZuU-yJAscMRLF6L=_Gr|Z@APz(|jm@TUudq zlc{W*d{}+xSy+JTr#oMN8lJPH+Bti-z(cdUOum`gRdHvhBp`QZO2U99NvI2M{0qKo z6v2RLdvdkvGJM!dJm)bY*~iRFEoI7QkDLu86!m z#eJKC4447}-+MO+f06my@Mp}ebSVga z(5WVgaxhsB9_(kSlroxTtrlFcXvwIq)@Nh1ZRIB&>%T^D_|qY{UGp;U!n!EtWVLF7awxa^C*T3&^ufvU~{-v>W+54>{!VB#5n7`TJ}rhI4)D1^M&-; zR2{{^+|IL4Ji2+VlD=Vt9Uwi`V~Wm_TAg(Nec=D#@L+c$f4s?xlO2=oI2Bf8jU-P; z0INJUFC5?o#F_DczWKK&RzAhY5Z-)yUP#4B^J}HtHF4#t+%~D6F3yijd{!@&oRfaF ze_AJG){tw0q&-+jk43QgJ2<{B0=ST}9At^e0()}_4Xi{E}*YfFt<;a3A zA-JND>HW0T&X1p5pEk@`KILdgpA;Iu7N9zRo6v_k6VCdx9LR!gv(OuASb2p@SZq+W zlx^)G*Q3$t8g~5qmY(%O>03GZR&Ekqpb}jYQaFL|{U%O)u_=5vy(WAA?^|uo!rQ_9 zb3*DfiPyz#{e-yfIN*RbjbD10i0GEpgK_YwVZb=XA9qp1!(?a4Fkq+$#W{^(V>D`i zW|+XU_%oTa!CPy@8kil$WbKmPLuOl1Ls7076DxtCnyein!c6OJ+DaLC zc`DylH5b)9XJITDLIg_C&~qiZaHPKm5h~#6vUsm`WOaH}PiK zvk9R6U?Zk$;9ejKwT1kv@UY}YBNcG9_u%!}4Oq!!PS)gMOtzL@wT7SQ!v|6;TD!|B zwQhQT-s_>Rsa|Bj$%0o+V`R1eTFPg1DLU+jkVeKZY~?W_GP?_CD_^O!muMVveH3`Y zcKXiQpE{e}j?)y3mn;L2fsV(W@T_ufb5?665{{9sX;4m_*!&vGwD5&Y|Mxp;aSAF) zTIcB90C73Nhk9>p55gxL`)yHeh0{^FOAiWieK*l*m_$h5mytsq6I(5*^1|8C*JG-y zx!7UQ>{V5Nya@gG)!x9Z$xId+Oyy}#Po`Q%!9hNznKlWRO|}5_0%a@C(inOId437f zSD_2eudhCTk&b&9uiEVK)kEf+(k+*o0_B5y8(d0R`ZD{`)M)p{O}9wl3;~trJv<%z;Amn4WItLrx0B^MdGjFY%3^m zoTMWs@!mb!vlhQK`hvc86{jfkO-!~K3oOf}d67Lp7vCFqpK5s{%0R-uxGBlBTA7r1 z=lnTohm4H`@zJQWPep{+&fpHmwceE+@)v(wkRxx#e&i;Doe<~jtztcv;wWB8DIzlX zJfAOD#d#_`wOdKgO*zSKI((4JmN!)*eOciP_ExuO=Kwj|aq*#*a~MoPrC(DkSjT){ z{rDRmRX$@Dbw}X{6UkcIOMMCWG^F4eX_J3+XNq~ar!n}I`azP% zjQ%5ViSCH^*uB&6$-3uB{CzCrLi2E!q9tnurb|EEl%|Q|(E=fs(Hl9>)N6E*q)5pM zzw*rg>t`qSFS%_AviR!@XR4?;kMcu!xQH=*c6dnR$DP5)NIE#Ohc3&4pE{q_x&hwv z|AJtky|cvbU6PvD!Gm0nYU=_VVMcxa(-P*%}0tfR3KK@IyP0s*&Vo#~1ApYh>Ph+IOzZhb6k4E+8-fmv)OM2AgddQEn z@YVpu`8xxbIzcwNg|BhFK~C3~qGTF&X7zRiarU+W7lg{|>a&)O>$O*bY~H(L+4D0DCSCd^ESx~~`xlY~1utWzX>Gggr` z>skyBWhC~InKdk<_gBja=JTn*JzQ*CJqJ+iOd>^)Z!BRT<9b#tlhqcXOvIr-VRck6 z#!8K&Wykfcqh&bPWBbmd(&yD!{mBeiAx?u0>88wUOMJKVVmaXP7Ez7+wZXGePE8Pi z4&Fdfy)9CYS0*;S-O*8@ZnLfh6Ib;{OvX2xqgB2W!q9cM0k?z0(OKMnX38A+ey5l` zzf;IgO+A*0kl4gMJUbP#y0co47$nVBeO0%zn#6U{hOm4P`)ufwIm9Y7u7e1%1`N6V zv){l*KuG89G4(5Fq+QUX$~V>^jst!(b>kul(yS!4P7;5Hq==O1p-0g}I$as`Y_dQ0 zA{NDgOH`nhW@4yj|a|!Cd;g44`1t{Q*?_Ls{Yv&#{p`J5fluG>Lyt zLPK|?RLtB82j!>nT`4g#6IQ?9@0*%eM|A=l3oV21)ptRt(S1npMJt#iO|n;Tr>>sL zhfP}r(BZ@eGv})cWko6=I8;=xHA}O%WTw?4NszBoe)U8VW3^Jv4(W)=g$2hob>n7T zk1AHUnlu=neH9c*ppurPgTJ*$kPI$>ZGmVYswmU&{0YX@Eo-j1Z?kNtaK5}2H*me> zAhLTMyFYLS`GFioXZ|^`FQyQHcY^F{UbE;e8A*o{6w}>smrh?l1Ke*ejreEv~T%H zby?Om>BLzF8j)3}>a86TTNJyP;i^Gu|_Y@6~2K%)FG7%RuEQ>MsFPpb0N zKJ)1ICT{Zq_2#)+-6`x*)w;l_K?ZMq^B>C&Y4|SJZ1BI`!F?Eh>rtgFC>d4b-@8UF zovyt7m(SLUir()E>VzOU7Fj|%0j-UU&1|^j5pAb32w48x z2is29%GQeXqU|+h!g8CFM;B6SG9R_+B-R}`z>WLXv+85F@S{r8woMjvfM#8Kua}Ob$i~)Na4)4!g6kP0 zF?E9I?*s{Gkv_)W|8Qd8xe|zeCWhUCy(E%hwn<^eFrVZISc5Ex;H8j_fJapn>q}0G zryf(99iYa#)1hGtnPzRaf~AUG^J_N4AvR5gqcy3u#U=}$uXt2N-ewj_ zBPHo5Vr2lS{TOa|Rou4pqeoRe_v*5@M^!0DS(_QivN8ERp}!**ZtNk|!DQ)TUyp7} zCfzR_uJ=sHFSZi_^&YTxj-O0Zq8$#uuW#2gN2t+e4B8j^lX44)j!k z5HIESI2ITcGnuPo1T&4W33K%8Cb3vj)q(BjH54Z@Mowwa<8PSR zSZ&>Ca`jXPEW@*MB#OgwdbV`u)t%$kxR1`<2z~4I^k9vsxE>z6H=HJYdr3_O|M;EnB>v<#-cfl} zy|ZX4I);qe?|+S2!fY4)x3?aG3my=)IqGlL`1gl&!9%aX0PCWK?2ysP3OA3c9@Uom zV#t|BjY0qeIlBG7NPF{eD%-Db{7woDv`HdU+Y~|>6H?mdQ07^a6lDyVqs+qIrpyf_ zbChJR$eejdrc6;p=9zb$TYaC~^E-a;^S;OX5BK5Dc3tOno@=eou-3IE%01z#5iRUm zulb{3#+*XsjJ|*C{j+@V(RnYw9D(=BMhSFjkpL`j`RZG*5i80=M}mLJe#qqbw09s8 z^&w7CwQ$&HTTO!wN|4{}D!UPLRmjKFLQZ6m9UZc6mZ!V(MfXc%liOYirt&9OG@Ldd zp|EhM)*!TwnZqCL;}O8-=KpN|oPG`paieX8cr+B^@RvlDp1gEBaj{=fs^r!KLH6yi z4R%s~LonVKzO&pIXrssGY9vL=L-ks3_l*NS-#Bfz#rE@WbIwMjW4aeV$9%1&Bu0bOHAR%XMU#&&R1QXcE2q2t4UDV}Bj z(y8PAT`)H9%ue&f%T|fug3&VqdOT#W*=#xX+l@N&wUm{p?U|a?+FiK?ag}fO+(UUT z6Bb5P4ge#>2|a`{^b;Izz`8>v@re3Zaf$LA)oatlo@e_gR35+lRs2r#nca6d$(iV6 z#WS%{!S^%uA5(?a`vui4CL`;wmFc`_+f-r8ky*W5wlFJ7Mw;=5Gt@;)+n#{of4}Mt$ z;6&=;%%0_TnazFD397%NO@|5i^Iw6vu8*zUnmzGHQH zKBrfcG$x}{Oz+M2s^2rqx2rXB|y+Q{cUR13;DvQgyAyctMwtQvs zBv${ii1_z8LneEsKl{ElB14Lk^SS znwtzY=DAm1vk~!t5r1<*O8bOuW2{PX8Z;VoO- zuw~i{vB^(%#15Odv^PBqgKRXBVaNWYBIqi2s@V`OsG8oY*bC!0`k zRK-jLb;4;a6vPl8^9bKMGBDsGjBy&LQ6YnZL>5Q3lQdv;fvG2X3GW-;_o4Y3d(O?A ziiU&~xJ!s0=cm5u0%Jl?c`Q&lsTYq=owj*@$P zJ1jnEwE@K7ldYR&e_(@ljb3xBJA7Xdy0LqE$%_szeD;}3%+(#Yu(`pvH|P692b(U_ zmYm#NOWW{iuxZ9mcaI;MxD?64dNr*Dy&k^=2H-B+f9Y< zq-MpsWMVU_#?jMCKY-1(%UBm|egCLGtY@}StJkvM-XyYmf~L-9J?hv4F&O(vx1rgd zt<73++Z*zhJc-mqwMn4b^TSwMw$p~M2`I+JY{j_043_h>BpO~&5p?a4HKNb<=N zGVhN=l)F|@?^g}PisIFp7N0U*W~hQ&VnsDo5)knxV5mvU^-Y>2IH3B$PC}{GgQThc z>*ROWigytVouZ$Xy8j68&pD6ew8b8wT0Y+tMmGOX${e7%^IS%QZH2g{j@FPmP<1LMz3zdA_V9(E$IcYu@Vfkm8PcDb>=7SV^F2Kn`T z4I3J`iokZTU86w4ldd2 zZtaB+C5wOR_*la4G0-^~2OEyI_~@IUILdhIO;Hj?D3k+m%?s{trwJ0v!%t)m^?p9e6@6kQfPuDQJvreMwg0!2r9EBQfj#1*?tNkQL9o? z7Z7Z;Dhov ztZl^}N ztwz9Ol6Iur!r)8v?txs=ksPb-?RUEvB|WGZ7)Vz5{Zlvc)V~zTD;@?)kv+-?`{8*d z&$PplF0Onq75q$FmisOX3fl1HBbWkFx@Qdt6b6f-%v)s73Bipg&~Jj$v8+L#fq~%G z=~41?;Xw^E{kp)WHZ9jbf1EH;J==oDeI{bi_;oMK@Uy?)1dluC)Cm&Upf%q@JdS;G zo8sZ6f;pfiiOX@MA(HC;tv5r?URkuHUu#xT|B|Pnc#uKN*g1RMi_=|AeNdRS$?rZr zMjYfg)1?Fv^?L?x3+5wc^27R?K~?ZDUq3UmfWP+H=7{n7_)KuhXE|Bb#~gqQW%~=> z_MI%g5s@Tz=Vf8szjGkab6R$|;f6Gw{H(XXJ7NhfrD~057K3a9pHk4&Numz~Xw1gZp64e^Q;0s!Y0KbXOT9?^UwBmHy+n*@X#e@6|H-C&Z@%mLW>7R=HwFkEN zXinK8OFt%lwR-4})@pzKu_)Jx0(sMS6&XPR^yi}gR<>sRfo@Mgj6`%|*omTLpO zB}!gj=*^T|o3A!Y-+R9$CB-5s3Dll$6vLUNQ{;h=Q;AzP$5fZC5%#Um1gBA@gVTkp zM!JYVmEPgiadjW2K-PMn3s`n$R*x}Cox?dC%%9>qk6T!0`^F8dVge6Y;CA@EZwr3^ zetcJ(4y_Vhx_uPv^4T>AIc9yCLSK(!$(~*Mu|7e^E@vkOAEU60Y`-Q@GNMh@A_z=zp*E|TZozJeS?Zb32XSvtHs;cIJ zv@kH)sfR(NmsKBZL9y|VX{`UI?mbbi!r;fHnV6h+VG7Rgt;#h52sa_=0IMABI35H> zhRl*mr@Vvkf|{PI$P-jNCkPD6%KE!zCj9v@PUS{gmZ;x3t$i$Y{^F1vzTa!^Mwrm9 z9`?}mGe;NFmc=`v19|Cbgo;Kf6Y4sFh_meK_L=c#kuIU1?k4ccQLS8<2vMx@72iKw zeQC6!gG<)7vFZb!#LgZV2nBe8bu0`SaUx&3xj?|?^SJp+utA(u4$c;{VnwtlHdiPv zdW04JZUU(QEX;zsi0*%jjSq<>1b#H>`3fu6QL{idqYmypUI0Ca`Xc+viJ=gt9w$c_ zM#)zR%-S?K5QHt`s9E0q*j*#Fm_dD{i}<%(!OsFNt3M(k(MMt#a@Gjr^ue0|;!DY} zh#c}lUBznFCULC4pJHz>lcT34_pNJryYYdak{qRu#+o}S0h2*SdJOw%UE|jB{b%T(Q_s*AQGiKaB$Z`Lg2YY3D%)Y_VI`(y}2r@Mv_^tnHv3piSe+dU3BJ~d?2f4AW8s9?{L77W*dk0*FLiw+mA>Fv4FkZ z+d7QD00k^JY26q(m`65P%b~~_eD6~0d@aR8m-?&a*$<^`;9XdNVn4qzbRQXfcbQc@ zHu06C+_9ItAj;_yJz5ZM#2)YG_XjiW#yBgazO7j9rOuBH0 zT%KLfLtbb-5so~#^rh9Mg+vW_vIQ=3e!4S#gp9Y>5DggcV?4&EO6eoC2zg1ub zNcGj%uS3zj%0kJf+J;MEaL|-G;mmpe)e=v?iAApW1*-yot$BG=++mT9Y#r<{Qdkj( z)4rJB29cBE$b;huSRSqC1YsifpFvv?PV_mhig{G@R1g&gNx+Y*3D+Cvtbr9>o?J zlN@R~M+`X~O=?#7iB>g5?kFwJsr8B!4%-=SYCkz5DgssD-s_~P)kg>WdeiTMza*Ib zjS<}gdFJE_AjTQriu??y)|Vpa7;@mFU*Cz1t=M3_sDn#zySjX5_rSFmD?1;4D8k`H z$pb9!KxJ-u(WL0cM12(S+1cRvZ2Bh@kisg`$THIqQLWIw%l_m3ao zCk7p`+z{<4YhtMYJ{eMiRBcl|Tgz^3x2pN>)Uy+ zJ+usn7kK-?{8tHdlWnXdtq=Hjx!hZU zIIYKpu)X%s#j7Clo2*_5qu1|$CU3x)d$K>}__Jb~^=BN^j6!n$t-t9!!8KBAV)hzr zO_q|v4sjLGBLMu7=AgFl9;;$^>jtv~%g6k}R|xEHM8G=L@hXu;;JdH`NMKnj8^@em zeA#mbpSzx_3!(BZUj(9?(Hf4DuH!g_(n+mDm@cV>(io_Wbw(y1#>(O*AM)h4wY09+xmV{HK0{c}VLK)8`#~_?J81cFKCe8?_## z?p@*S1A|Ybx_O1=?APGOIZm@2U%D-LSmKXf1Y}h}keh{S9(mZdVCU(0;5lv$){DV5 znNh$lytVUiHr`#j*_);a&q%pHYNHtWw92Z;;ySjddoV6qx#Gnl5T=iegh~Py|phU zf6*Da9|v73@B%BASMuf?q(C!@L6R>X>pkt+6WGmOl4WAsZK6$hn4&_rzPSmJGW;Fw zqrr`JLf<>%7ASD!7u^wsJ;Vcb zG_#AzXV_oqwvHb^14|(jq06={%%dfv#}v#sjRnA}WgTM^8$hlJ-?KUwKt$N_p!F^J zzMdti8mUb~t>8X26W(U3cr5iE?#=+0#pWfV*C@!&QjM!@*>O)d~t5?!y2mXaC(a< z`Ds==@9I~b6?K2tU36cgfg;5#odl;j40p0mL`_(oj?zTNYmQI_B)z|sf0E$W@SJURQ9JPVj==W-H z%&_NKW)2&>p3{?qVvWo(_slf=mSLv4IVo{v`ET| zEvo8M6Y8YJvt9bNist`V;}fl|vzZ|}O?YBok!}nA?++4lwFcD%uDfzu5i%QX(NgMY zc~NEa_0!zUU$QSS1BWuAbAwF&kv7D_iy`-!u(q~cdsO_Sfhm`of5BmS|13Zi_Vw=7 zw1{U5Jz0GqKj!`stSxt9)SI{0V)gqG=N&7a&$h3rTYG<^ZrB|2JP7zDV{Hn$& zz=6FkBmf((O{GKwe$xEa@J6Sq??KfMA$ zAy@n|5&0F_lUVvyubBVwDx1Hv#tpCBLr(R90F=q&2V8F+!VRBiUwTaou`=`G>l+tr z8kwD@HdhsYgLOIH6*Xy`O9k;wiBbQRvS<=aZNHnk{6h0A}Yd zCxhEd&Nw&e5wHkgYygtDa7%6y4uh(7A0N?5EJ^UQ`!!hVCb%@jq5!pPZ4%(#+M+7o zkZ7X!ZEI1k1;xW!foI)v`xd1nCM*X@oviOYiyrHl;VnPXM1qz(rxaKdUIw@zT;Tt0F2^%Jlk&T3G6bk-mj?1`x>9aO*VbZxvc|hEfKPH3#YEx zTt4e#S)gYtQ1-IN_*K4|^BK2HT(E?(Ka2S*wwa^U3md6rBdpMEG-Fkob>U#NP4Qda z?@APErum$^_U+doZ7EyLO!9CsX}9pN!)9_y?v{Tf7?IsAaikZcM<+YPP$maa7Syft zxXF4m$bLfO9V+S2Y4jF2zlNE~w_SUzN{>#hFM23(KexP(IkN(qD4hp~r*3h#WtY$* z_}`+{@6O8{z!w!3GdbA-Po*b%X#c-MsR{AKO%|2`J7lDzZdok{Pg3+_W*AtsC=Y*p zL4MGol;gZ~nTiYFkM!Die_X>cW6l}W(rwjerXM4V#z%=FD(`S=D7xvA~0a*$v zhQlwyK+$A4l1q1C9j*p_5GIi$F6~PIKswE@O{$SOndu-wTGX=A(xh7W&+Z(`QxkOYKRLhg>&5?G*w9t zjGvJflti5=tvW!$WqC~yc?bixCuOOuB{n5VEbmMd5BPDh=KwJzP^{o@&{h2(Ywtke zt#W9~1B~onA7hjsVj^&mit*T#VB$tE=dN?V{Vq|LU4B~8XhLKFkn2X9=1!cz;-Dz~ z+6SmYZ-fWqhs*%KWwkoId4vocF98i2DwcPFRBPt6YX4T9lMTuy&aO;&5dpM#u)`Rz zt7eVhM`pb&20ONhB8+7_q6J0-G^+N-@bP5;Tmn1xjvXNJ&UdW&_GnWcvehMRMn)0+ zm5ntEKs>7ct*?9_Zi+CjCw$_^6im&U5UTyTmYJ-&7ek0GV8W25dj3&;q`V@4pYK)O zTjbF3&iND+3BG#PHxlmiS0#yNMAfrVaX)zQyh`C}^Hqan?};!2_B@BYg9~Z>tvdXq zP{{c>2NP8_#K@UNk2)4>yT870Wi+<70-$1K|8bfa*Ea~jqgpsZI8F*cVPw9E8E>+N zp!LvxLjOj97b^%g|5juFPn{hyXE%5C{D+^W+{RD8@;SRPLYHUa+DDXWAL4&hDbA#& zi|lYMMpvUxs!xlb&9;mhFj<$GGkMZ+8ny16WJ&*z@fR!9g>RA6l4AtO;p+D=N7}AC zA*!upoP9HGrEVAxxlo?^=^dZ@olyRct6u%V@hs4Rkp~t5e9uHirjA$?^@<*W20B{Q zP*#$71Nb$KJc%J=3^-0zGpM&c-BaMWq{l4(Zf)W)gF~#YU|H?}Yxb5cOZ?oxqfXP` z9R^9ST%v5H);zgeW@{Q1Zhj<11xp_J8y;*_6&e@-oHTDH!k;bb*2urxpKLqa?D9E} zI$p>T(bxOne2NC8^#EnZDBzqg_kJ8}`(L*8w+;`CB==wn0t35`=0ml5`zfT;k={G6 z5!|^%ggdtY?nrAD2~E;M5c^rdvmNe~Lr%fqsigNC+4}hPaCi@k-UfF4w!~lz%@!zT z_nc{{1P;wf<#x8DOc-aB2{$9OOPVgNLs`3c>5Dtag%Vf$RpFPi=C;zk2+2xkCul?j zH}iA?>o(vDicd*WM^@y=J}LWFEVfgY?cX%o8R5NH2;FO4K<5u@ztj`jjp=m_Gn645YNHy8x z(s#*{PjvCFzknX+Q=6girKfTziMY?O)s)PAd>T5#C4uEV_0=3GMDLIf`ytzi-PahR z#@g;b_V74YsK?02Oy@|?-tO?8fm^K{IrmbDB9=C|N4uZv>EI@RM0|0ggEKd{z_U8E6gNHKS;ECJXc7q82)4K`SVbwdz4Gm!FB8I0IP zNufPHzu*zwkvFs>!41dglE<(&rTJy330b%9C%8;@#ehc`?H!2B9Jlugo`n_qCngP9MWsdC2PFK!+GH zva+Y}1}|67L1L(AD_MUgJw6{imTJcV<`vSa;LOfXozU@Q64gH+3vul&DKVYD=u(Of zx}Gn|f8Mb#t4EvlP}IwX8_yDWm%as%R1W%VIB>0-O(27z;JCC7mv%-tRPhMe+yw8o zEpOZ5Yg`aTBz_Q%Yzq%awS?f$)EJR2j=>v!Y8+<5AwJhM`o$^Xml>zs8(dM7j%S}S z_|LY?19L8sAhNin^z{G{n5uj6#Lu$#;|1SeKl3>3`P_{pb$*qQCS$50U#xD`_uToOhZV;f9)$$Sd1+Ej2*vCrNBY+^g$)nn~ zJ?i^>#7BL{=~d4KfXAF}-zVA8G1T1q=NL+0ZMT}MUmf)IJ$U@7VpyJ0++W9hCX%fl z9eExDyXjvD7xqf%V*t3`B`)FI&+Jq?9k8W1FZr%~nvsRq9(a}k zfc5PI2Yb`tfDA_Nc1m6Ar*6?O)GyyOC5rcEhuE9`%ng0GBn*`oZ!BfJP#dF51yC_uR zl2FqMGHB{+7Snh`n$ z)wD`9R{WZtoxKUqCLKDA`8~?&`xJ1@pbLMe+t-ug3zy;Y^6>Fp+xFcF98vOadeEX6 z4~-J3`Wfvi=vg#-Oi7ortq7czXO>@^?^j%UoXS@I=IBM)Ct1VJ&D8#%CDgp!+_bJy z?n13Yf?vlk1n!(-+7q#PUHRS z^b5U!4%8p?6A(PbN0orD2Oko<J%n8@w=KeMmzow`qxjp!-(l8CN3oM4$ZzYy&{W zo@LPfnI_$1X)#?^w9sUW#k!QqWgOVH4i{mgvSHKJaCC1VmOk<8@nVBb%JjhyhRqUV zDeDOkuCKGW=?0XauYCy?Um|Joq(n5g5AQa3vRU?qo8x3Hh#&;H)lmSt=5ed(4$>hB zf+=fncREO0CFYn2?c1CQ&V3_1v*B{a!F%D{!)3PeQmZ2v{LTSC_DB<+>E%(e;fU^q zl$riJQ zKTC<@!BZt@+K>8GYbh}92iz3Uoga1-yZUx6p#-8|W2BGwxov#DJ!~XUD4m2)i-BXT zAn)1;(V-COIC2}+fTygs0$m&v0Gs1h(w{*b%=!w5w&~I}j-0y%h<-jHj!qh-W|hCy<8 z9S;rXziq~Uh}IP_t>rHA!pU1_u>ZLSga53R^~x?KsUtJfd6$bRuog-TarrV&viyp_ zeax+IQ&N3?EdXAvj`xz?w9md(~LBPsa5)rxE;_BjPb~a;=T6UXEAOT z90lnE>I9p(Ikyo3+Ea+tse&*a%(gfJF4)rJMJZNb32Pm>VzVvap4|^e+OJxKIk189 zDAv&d>_>K}9Ul?YF0>Wv)h;@WFMp;_i|zpIhr0R)#N5L}K&48;3maOKaFC>MAqd)dktGw`=RsXDR= zfqRQxrW@&~uPch%SukA&^S@iop#aSW<$bokMDiMt8P7IX>#Ny>-M!{qe+p4=yboU# zp#6_1JhlGVof^r)Ub58E9-hE&Z*?9MGDYE(gE_PiiaXFL>i2Cg`GDGmk}r>|s{A<^ z{|p%;zjLGb76F=q)IzVIodh;_V{hBj#5Dz5fs!ZR{I*!e1M6CE7=O|HQHAwBi6iMm z+Mxg!Ed6v{vHF`be8%@$@P2~qZGem){|V4*`IJCeSRnP>PM}d&4M!Qwz(?$X&9Lh; zai4y_12qjr%ZrtRV_^8Zb|M4b zG1|X&xwj1|%!4fktl=0j~*p-KcGiB`yW%X>K{{b`rtfC;S;*CA9r~8JCCRpBRX>B_PZ8fxv$%; z5jo?0Clct*WzV}(a-G>pfj*<`3hQ5^d#2@KYJ8&sYfVIyo|Jv(aBEqLQl=5da(n2KQO6H5-too`}E?5<6BP_caws$vnP_)CA!Iy7iUet{lNN- z6h52lm=M{v;{P%S{1kVcH<7E;Zp6e%55yEBZqs%q?0FilI*iA>7`5LgLz8QnyTEJJ zWIUChWo}jnj*3W=DLOwni~Vf7J>SAU%lFRC{BT~nL^fAVT5I01bde@8vbrXP++(!+ z<9Of)ZU5@h`y(wXa62KAN`Dk%BYpZ-2O{fE3&bW+ncpei@nfkd6;?|36G}ZadOuZx zA1Jq3U^q_N`OHe=VXSeqOu{LR}AZ3+|1vAD!2Aqqx-XZ`t4@T$B0j0px^mFZ5rFRFxCco z-Jw%mN4Nl5=tihdmiUs7mEEoZqgMDEkDHm2E2V2%{`IGf*$<}ev$H(vIbgD82-ahM zm|Ioz6^tv?@h+!}T6r{Y{;?h}Uj3^%^JV;NdKK!H5|#O34Xsk;$4|ZXz2A+^b=TSQ zINMtR{^F0B*@YXfbbV*e0*`U^OGh1;)Ix$b2b1sW=Nd3a9sSjBX3n${yPr^}W4W)5ucQbGn=!Xapm0tdJyCDmWDS;#+MaKk;2Xg-MmOhBmmaUm4GeZ1rx6YOAZgF6XlAqf!l%ZS4=cB5e# zOYp9AhstQBo?xh^T{JOZ@~9f?fQXdekkyU{rj9UPYNH}MoM7x9?~?FVXyele0#1wc zK-xu>3EYs!EyzYo{NenqV%D`EA@sl7a0y(?j%kt_~09q#D1+A9U zn1WWGO6P4c86CvotQ7;u0$L-(H*TZ-DD-Xj4-Edu`vJmHxDlTd1$_{t=Be+FfWGoM z0t!(eXkt;6ONj22BX(G9=utr?%mdmup+Lv%HYav`oD%vBS4x*?DVR?xL8VahJ4TDp z3p%ed^12nQslx;$BcK7d#{AT11A;{SLk}{8JM4PAom@Nt{#;;jCxnK6Ky*&vrwW`! zPT<8oP!2J#T0YkE*tOQwXce{=tOJG`qAAFjZy>b_kn1EyA+x}sCFFLbI#2R(nf{|f zqEm*@DT_GI6UfU?o?PyB08jP$TRk(}?1HtuAQ;ZV-bAN^umkF&Sp#UI13eV4A)KNx z0B;g{lATF z17r_Q#?|_Jh0@sEl)CakNu=YJco9?K5n$sc<9J>G@m+tOO2NkZtRC2rV4w{JN%Fu^ z`i*%b;&h9b;3bS?zse$R;NN;6M;*sM@s%6wxd=||`P%f*p8(^w{S$0qaL51^NdaBH zqO%bgyUH?ptdTo;(}N{iT-m?7SpfizkIs6U<O_Ra=HTyd?2Q6=(~S(*?Z=;&x|clUM3Z!01p`rRe|-Hh zw4>RjK@Yol-p}xeLw!#2>ggVQXkc9=BZGu7HLteP+<7k0b2|d63)?aRtD`a5!<0-S z+SJM-m}ni_)fs%NNpqGo-L7BDFD0*joqZxrckb8ntJUf=1+wZEIy#vHO~uGD+qUug z-naY6$+v11*0KX84xB6BjSlqLI|MjE6s#;p{FKEhZsexVlRQ#3%F3wEu~J8j)ubpi za!G#%8T+y!ScM#R6gIwSOUwachOqHVZlq!7fWmS)xxZ;0vN@eXeVP=t^*gqed%8p^ zy{mS#X5R3RoNs`8lWnF4X&(X2bsFox*hNg zEj0-P)E5mN`v6Cm`NTVujhIb&u5v*Ct?k|qC?wihE?b2CXI|MC5sCn^g{b6mXkQj9 zPWj!eku)Vx%DK|t`P9G)zjj0-eB?cqiCr(e~p$T67M-THN_3=-hN>YuSXaJmZw&ix`V5fVNaV zfLXV9RPZZa(Zro$X8;E??mC?X04S_$;st0936pXBatD}C-4D9_+ln7ngl3H9JAvy> zudVs~1x5sP$-UbRqY#eV$3+#wT8uxN?m=osovq@PPF2%8FxD^Ju?^x{1|nOwdi~5z ztuwjH@J)dA1F{NrRfaq6z zDls7ni7eyt@&BI40P1C}So}=~h&y64+?k5O?}ry28j*k@nlIHwTY2D@krIoWeB*F3 zOGMM~bJ){po(d}B&7dgH%!PDnb1nQN$&Xdh>fc|rwBmi7cpRd zwgU6>=eFtDLkhMdrXtyxgTMGV$k^RB-M)In9%TH$Ca1XO<-G-%cI?<*b(N%Cf+m_k z<+(Sl9PWLPcrDKy^!6Gyc2eA3y4YXK1Cv`g{To9|v)7VAQ`xcQL3&3(7Cs4jzO!$Gu?38}2XaiDl~{-K-im329*+ci zHe`)}M)PsAg3-iwhiqfsWib<-NCv>j?84%FlJmMKuzZH+EXJm}3bQ!w@Z&O%e%l3} zu#{0@{{`lnvJL%qm0d9PqtyD6lUaXSAZZ_0D9iz+U-{J7Z^d%jADnN_{AE8chDjg2 z%nd87Y{Q_WT|0u?eD$sAj`XFK@uE(7wP-e}#CKo}95W`7{l!O8Ubd2aJ<;XG4;7zE zwPPN9D!s4e0;ZTQuK0#*+@D+jWHN1)zlYWZENTnZ9OLI8QcF@8!@iyPl=g~qTS!3z zIHB5+Ym~1t8rQ^#!=O+4chkGMlQs6tf@LCks!%|g6^}Ap6Tj!gHIL8%5l3a4Z&Dmu z6LVC`S3fCHEHD9=^`~3Ny$*yVaoWz2|47h*lq!$eYeJwx7*ZpCN)VI~LNa*>2Yi=l zV<0g;@RzJ7bT7EVQptzlA97-=zJJaxl>2r9Vh>c@b|~T5W$>ESuK#eNU)pfwJwGyA zUEkHRm@J(gKr^NavTA?i)5Hzk8LO8p44L-%E1fNf_lI+%6;-YgjAz@Z>W6Vwx=2QH zesTTJz?+6*XbkI;$h*w3ee<7$6@&JkgmB6q-hMqty{|@R(Ns$=-B0RRRJOT!QBQd- zZkeE)t4UH)0vkRL4p8REk9+{J@ftReF;cZsG5~q!DM5yTp=qBfh*tP5{QZLw@HdQq z9qFZs*eeP{1iHxrw}y;uRgbjL&Y1b+%d&XAU$rMr{bLxH^5jTVnk6HqV2}SDcv#&{ z1YM+u+l~cyvlq=%c+0agL<}cK`ENw-qa;6tnhC&|x4pyd4Y61(=rya>7y^Dwi}KLW z6}ZL8LonFHXe0g%@I#}T0AuXT+qrpVAy}ysgO#S;zp?ZW!#;0#(~XMmDS7|ycHrt0 z!5s`9v&(3luhR|fAP|MTu8xkL;J}hSz~WzW^1Mj@|6aDb$F<~*@3pmT2SO~YGS&jX zkC(mAj&g@QoFNIXXvJ;VXUAS5J7TbOsvr?Gq;-Z@UJb~sWf>1$tjE9~VYCOPpYQd* zAgxN!G2#Pd4^hLlsQn!!jB4<|&VdIVrqmAs zF?R6B@^A_VLb+OOHW0{`l5hXPGu5wB2XS9JU2N;#^Re4663XR~|6iyHm$M zYmllhW<<`NrwZ5z$%v4@3UiuGUWGDg@jm@x4ea1fO_pRFZZhL4_=B}eic7!t1PUma z_ey~;A~(0~ciR>ruKE}%QAUWj^*ctd*P{{Aaq9Lt zfQ<@vAB>fOGTf8nPBf%9Dlaq?2rRBKXkB>Qbv1hM5B*kJl zCL_>DS!8d~Dr!Z;UC~rq690!fk+r7_p-C*a$Q#PUD36pzD1r58FZ>11<`tB4bVkQ> z>_(Me04`x`v{sz1})D^UT|OVxDD1kozqnaGt|yaoaeU<=Hr=0+nH zyd53H3>{bx33wdH91TckSQvV?Rl_Poeudlu{oOzRhbH)PHZ+FYUBr?*QAayk_npF^ za-s#J_ICgbNL!9sG7b_cx46|MU;i?il5sRm}sn0#p`~07#{^~GYXMfTVhV+VG$TOk_?F6tD{|sE` zl^ZtcAL6u!M1dgmf_nrLoT$kgzSXw3NmXJO8C_?M{{{>`*^yIiV zxvcN?T1=ynM1=Rl%0~j5Gf7>+LA9(5rEDjxhZfOjCfUo{ue*CJm>yHv z_kk}=3MKOzd0;Mj6`$b!Tq{gA^1>Y(HU<`t^hqM6G13GFqhh!zc*%vS@$#E>Wm1j}qV40(ItR1izwd$PC=otRROuzk?%-~J4PPY-R| zw`DKeqJ*=;fD)!W%;K#KvtLZgech++MzZRzPTxvVZXD53w3#xd-)I*|JM%yc|I>>Mr)uGvCouSu68D@UEgH20s2vu5%6X$?+|vxgkVQ&f{j5>}Zb zen~jgw$+%`QB=`xygI?GR=wt}Z2H-Ed?ajtY*KQ8VzA`eMe$#4G^TBr$L3Wy8Sgw7O z!=o|W=aO`-*LTluN4r2_kD=H>sbU)zIraND+s5uqsZqO3>iy_>bE&4*@yh^p%m(c= zr8Eu=;&O!4UG!XI4JIYoh%%-k;A^^ew~zs&mtrog$`9tpR1s(`4)gt^t$wyX z%3WR948I_F>4cl3Mi^;je1zNV*$*`2+AvAZR?DVEj}C6n=zdchLJ@~dSt+*P{62K^ ze$^(odpV~(UKt;W55)Pi@h4&m5T< zX7S}TUIDz2DpN^*wp`aaoMpI@P@@uhu1c?F#-Z2K?2DgNlBfqK-j{{Yu%Csub#cPu zzOa!yhkCk1qB-68)o(=YF4te;h^7P>1T8a1#2_GWIBKyIGzg!>ZAX|f->ByvZ z8$LI5?pxk2%)8aO&q~#vC$H^g=F&x}yM08_>W`II3W|*JOJup*m1ZRXbs3;muV$Ok zV`mDB(`c#j{jTF7wvBEfHyY!eYP@YbmfTo;WS^ac7bO%)@p3PYcgk;!B)W%!6@4d6 z`prHun~p49=J*LWY1pl1oz*&6Y#fMMLaDor~0g zc!J~gw+cJL0z<{dOP6KaGgExR@j@3K{KO^?<#~Y14Y!VR#uJ)ch*+3$q&a54Z}_iORwumlVzP>K6I;WT#WEFN99LL zZ+_yNwf0R+tw0M zl>u9q3dgx)w>COVkUJFdjk#J$^xIj;m#~Mf!|Pt~hD5Q^>M7@@kcwU0K)BY(_NnAccn&?4b@ z%*dIFng4UAA(!Q~WU{wkY5XLuv)TKN`J#i91a)USvkvu7a|P5*0qkPE45{aBzuUzN zpy09`QxVEOp#AcViOP6%PC>5K+Nb5pa$I+WFiA=r=LfqKKeMrm9I8XgBuo~4jkTQd zEZG8n&_BR>$V&?9smUFopDAH5PR3-hV`_rfhvitV_RdC1g`)_uQ1utE{rv`B%kxD{8hCSA44-H&+V1Mo)>{ z)WLKetaIq!NW5CgaKdpGqSV~-_*4KdW5fQ}RGtB_&vYJUo6|wxwmo%a?dk7(Bnk{# zO``%ghc!OY?)&c3<$D&%uToYI7hI+=cFDC_2D9y*0UmQTM#wE0e%5swdrhQo*VR3C z1qRk1aTKbjb$Z-Z;TJd2R0B(IeOR5WUF|FL{(gqi3y&m0=XXm>6zvNQHQK-Uc|?gM z!SeyTuzk$ZBeLQzaVk$3G2-)|MyU%tBJa8vo}}7?wPhy6>=wi?OqBI5)hUPD^r)y% z#|f%<4K<=}>x+UAgb0^xo^6qipKoq2` zoZ(HI-<&i!tbhJcD(=`n>lyXsb)$m$s;KF)so&>cUuEL`&8s^D8Ouq5TvLHHOt{bW z+FECCza7YQ4}0qBFnAY=hI3I7Y}gb7gZ<0%;)=y@kB2~RKq~~HEg(Nf0$N=sRxBi4 zaMvFNo;TmV7>M^4rN*1+uf#|$_>S)DZ{y3~9OT-y*L=6hJ)2a?^@+WMv(6*Z9vf=1 zjdp{ca@6=R-v02hiIj@9p@JeSX^O+VFLyV_V);GZ`zM>KYC+9!DEpZ9t~cP>;@zdf z1y>7>N`1zM=LG0XMy@ko&iH4TUhGngn)NmN;g9L2Q&RYN zA223l$S=eE#Fr0xb0M}Ed@8M{!*nIsx1O}X4fkm!b791V=Se6Mg!Bw6AH+%BY3@=} zb{$wNZv9BtP`!Y6ynmngs*LP6{-y%T5M5_E4;>a#jk#frr{ns^GmErdD>SUmB&vES zJ)n z8E42|zvr8-`{uqspYQkk`{#Pxm%A(H`+dG%&v87D<9JHY&^4)PhZXR{80Se{4p^o? zc$Y`@?gEiUtKp=2fojj}%J#z8Q|}nB#J5PTIAl5vLjws7Xvq|Zm+#`X`oHZ2C@KMO7FvOoQ3kT177OqOY`>Yjw;diS_w zjk=B3=|k1WSA_bRSUp9C13zGrtuNTW{~*V&*4o6nlLWa~wV6H<3ZGH)nyVj($#B`| z4(6R_+M*i2e9w-?{o^s5jQuL*PJ zyQ-I0$DT-{4E(uQVl{uOcisKIvV1{%QNQawR$f@?K4WY!8RHMlLt{8SxiObK!#A9D zftyPa6U@mnUp`faLSZw&8lAgbwB2^PUNKg5ImA1%<^4~1CL#A9@mowyGUrCAyr1){ z_OwKW?tZgS_j$N%_jqPLY$f}qYGVo3GJXLo(SBLHpo9;b=1%tIr9o;LR zUd(YXarw~L-3SnWd*=(uWoq8vF7w%cV%O98Rfd}qeV%&B^nRE$DwStlkV`p6p%Z^Y zO9+#y#DB^d92xXZUc7?0|A49N#-FZ?ZLF)qIxdIjV~gvWU2E$tb*{qYPmCi0q-lC9 z?+=f9xjE^on4j+#Fg{DvU9oi7(82It+{f?toNG(hpZL*}9RH=wGM`50{)0wMrp=dU zzH0e9#}}FQGvp<{I2+lHZ=zsOR$R&*4bJRMUpqexzgWFDDPZnb(r{P;IKtJlwQvob z)KuX{S`4So;=d$ZjzmSDK1Hu0?4WZLZQi5>D;B z3tZYon)OrRVJBHlri(}QrR+2kIxm!OX9zbqxfnSAJfs`fBJ;Mvw^n;tbS!+z{H)r` zFjCe_u``~W+p$$-WlWQ7Y0O8z$iMj7Zs@QaJ;U%Y#N$nkaXg86<_lR=re2?Q_vn!D zs@l?0hwTXRYiM6+7TvgS6&KdNWLlqixTgMlf+3l&(~pag zNjz5t8McO;eJBajXS+42v*ujJ(oKZe;>{IaZj;fzP+!Wy`p17OF>~h_PBhfl-84@b503g z)bGV+tl_oR;BM*15}UKB@h_j(DQK$jSpitGJ4Oyl{c&Q4yW!RpgruWpakQdIlc~m4 zPG3J2-6I;tH9|!hl0VpA#52oz&iyy#;KJ(GdormeJIMWV3T{A-?7m?7{X`S4vs8qn6tekEDuLp78}fU?9DTBt1JS(5}cnaCBfWp4ze_c3W_tpxJ6p7|xuO?_*k zYg3Om3b=8N0gBA-_fa|BS*s3##1|pHxD41?OS_q1 zI4g>hq_OILcSRC<@HTVg!}gVurkB&p>PnLOxd;b>JBHFC^ffA{g*}0JeBq-Z-N4zX zMsgyJkQ*MR~qFekB-k)aEVEeb~fO4+;I{DO18Fx_EI zZ5bt@M6&qZn$Pg>VL#m%Zow-iz5Rt8Gc~`c)8LfUTbzx`3FmI(W=5)oqeMk^eTAt` zhxmPK`wbeu#X;Cu#(ED65;3V^Gr6u25KLD{l2&`nN2~Fb5dn=2Z%E2s+g5$B{BI#M*LIkiI|+_+D+sy7bU zzy`Cc+8kXrQ*Ki&RULil9=*8L4C~VMK#rDBVjd84Ky_GHHBX#GqCYt+iD7}^X-B(wGqb%>cyiR~{L`#Pl1~u8f315p_whCu{=E+{J+_$+V zVBXsJE)}nsB*;aA8Z8&$rqXx#=qwcpkpue)89S&Wt20KytK&A<$tRu(a>7>Omm%1; z%p*-zEBI*K5{(D;m(^kLT6<-&SEtM~?VZ19Ez9u7ve^sxU$gY+v))vxiB_jH=GG$- z@71aZZ|25Hy*(KnK2^aAI7jF0_gF0aQIhn7aM&#eD@w$!t=J56JnLC}CmVHp6v*e^!_r$=g{rGcYmoX_R)6E-F9d3;l#8DR6 zuumDNsTaS7iHv(H&@VMAwPw#&W_nfGeJ3I=H+efJu)O8;oEC)>yEhrQs*18Adb%Q` zQ*L3_@?%!WB_O_uQR>kUpVN(v!34Zp@utD~0)Xhxsy^_HJ4_H7UQsI5=;SUZ3~z9) zql%dv7NsNwHzOx=!KmJUFUjGDHT)S0-`efp3fpXe&*}ZeE7|P{T}yu|IsE>aJd)cK zj}xRmadh;9lKhJXwmAJu4|`r>qOSUS_t}1#X)Q9#pw-Mp%@4R8m=48$+_?L}rL#YH zph%Q&@QU8M4}HH)EeJ1wDzP1CG|+VO7a0IXtIAXKi`Azonr@86p(uLWgQQwhtRr{( zV9~uL=yTx@-sI}1p6DyQj%1p^vm@246D07|Y3n;4dl z@egxnAEuyu@hn#Yn|~(%spk!Bz5xfoR2n=~xd=?9(%M@f^{1#i*m8eQ;PePQ0#mAT_A1o-C2Eh&q*4k(^77@F<(-^nESsVN&u&G9hrj3ZVr zXv|!jee32IUvS!qwRKa|6{;IGm$U}p(X2PadR%x3ddutxzY_MWc;%1n?*Uj8EhLx) zrCD4xAaDl#){XpYD|Eze4-B=9#_C-@%^8q4usSXT5}mn@9bmK;OHj z_(G~G%Q?zn_dS)cPy#yluMSt{kul{uEqIV~S?N`Ab1f??1+ z)MLDZ0kHgPRIF|or)LMhKg;f5=IOCc5z%c%z~nn&I15#*`ndD`A8 z<-kG28WdJQxpj3ssuBlghVX56(~8Xiz5Cyu&}-~~ZEkQ1@1K&3X1lKYfI*E3590@a z(H*>=dzByhZM>{Ym(2#!Z<`fLIZHgR_apiD<02IZtg}NZ5Q{^Tu>$C;ZkaEITSm=h zT{qEO4ym*l|EANq<|K!xa21$rXv@b9qC@>%=$?mz%zudQ_eF%)sD*FMh>GS^`qAE& zYmVx%qC%>i&Mi>;-5%f%^z=^GRdH+v4!VJO%r}8Uk@m7V@fh;>k`c49%B``%-cql? zT0q?nHXt9_Gs=Dc#bkkcUmTm+nvp2M<6VpT>Bk-d;e2R*^$*htjfY|v=YMPlYi@?? z@drz5%c*Ijw@AeOR(~=@bK~)MxiAHJxv{61>M$K%6TiUr6O(ziD+ZmEcyV5^ zR8lBGbk=70iZ~S=8~dS>LvK9;+LI}hHn*J6i`C~IoW)%~CezkcK^vE_z9ZQ{^6`QY zbWg~|1p^^F6>v?W;>iRDK4j)1Km%)htrq{(_HRUHZ4Q+9F$_ZhFf9HRRYrJ#4n-!W zf=oELtJ7S@BkeVVF*`VSn5LHds}%(yv8b(~6KHu+8hEd3?Vk-Jfy0sUx;YZGEmlT# zvU|VMuS{^aiGrwXvUtE3qr5*>Hrh6HO01B9YGV5R-1l1>W=uEnSek`CFvt}w zAlmZk6Y(|kR6Kb>LBQz{X=ZPtB1Lj{i1)O>^l^Nht8FX&PTSL$fN`!Q3*y2@T@RG8 zdRi>Nmre|wi7@cRD7Mxb}%Ww6URLhG51p9%9>k7|Oa)Jb7@IdKKz9fXS0JQ^d zuVg=Ju3mGVl%1opNJQ9y_u(b`1x*SK#ClJY^Ge=md+WEI7*c{8X^|iblKDKc62jk= zb;Xr2nvRMl{pQ#&L2D0>x3VOIwQs-y$_c>fe2G}=<{U<%Zl_v!UXyDcS553~q0(GT z0ckW$BRN@6Ic#A}!a!S^kF*dogx@DKT&1x)`RAkCZ_gOEdx@tBTBm^tNMyyG|Jz@t ziuCwHRjSq$o`Y8C<|Pd~8OLz~H0grq*D-TV#@U01!K}FlMiH5;I>}4GscWf+L0YaE zzdjhHm83$=A4sW23IjXMn1I;l@ck4yI*ts4c$)}$oQvX@+hB|fl>_RSkPY}u6WVEs z1HT}NcyxScIF`wT?3gx;;cak)^V)gE0K0!ex=RrX>%ShQ)qfnkbO@hI4Rt&So}6Zq z9Mrs*Ji10%O-ev^P5!+F{!2{0nCrI4KpJ@LPFX3y*W*Mx@_f@ zyDzw0HjOyc?&-CKK%$AW$<{>*)ijEKBCmICb@%tx?m;cBI?|J5q42TCi<(C_Yf^4!BhsV6U`wH_6#`fm=_ZTEa>Xi(X z99b}ffy`#yp!Am#oFqdSOD$Y?n9m$_uWChit4Su)&764tqYxkdXGv5v2;%;}bjBrZ zW$eKA0mI@AX_!@4`Lx+q#Q-_trZ_7D*teB%{__>w75YIIEg-=!d^je`+P2WUH#PvaiP}F5y?(L$#}OZP$D6I+ye&xqBd*-Vh^el?k|P%x zFy9#LnG6SE502%Dcb|Znrb>*6<>(2YCI{79y#>sSN96g%ZnUwTUH*6-;)dYyM7sig zHyz)K4~kOf5yjJ+{fM!j8R*1aNWDl^VBQp-lbl6+c@bxNwq%VEhdY28~;u9=rYth zdFU5CYtLR1o=eO(Q9U|;iW=3_ky(-Bbs+e9sH4j1U}^V z)tx7YN(rucUZ#k;s_^Mu@3>SAG>_4XX2z8hnsfXFK&xE*Pp zt+rG!oqez!%bRX(2wO^D(N zNEain+w+Vp1yDM zm~>ksrpm7U8&a3}!hg;t{&w8{54k8-`@=;X7MbJVNh93IL-dq!kTEM?8-`jIq2?pT z*||Mx$3r#r)a0lIv~P?fj&;fi!`jB7Ck0Gx1ynG?;N$7cfMr3#B%i3`yVLMoJ&%&q z_CJ^H?sM7MbtD*IN7xfUbMbR5_tT3E;dKKkmvS_FTlycz-swMrRg@ivyC>>y`L~N}Rl33Un;oSNJWy;O8fJj% zXBsYW>GLB_VNhpf#v}v^0uMu-bbUlQ6*B8Q69k*I8cLr-z&U|blM1Bsvf3^;O~|la zuYy5fhe`O7R}BZAj83$406zAV*1?+n>d<;Pg^*fj1>Y>L%990M$$t4^t3iRD$`F?i z<$V8;;rFN2*pYIcK@`+Q+?OI8PJj=TFXRW88+<*3ul0v?j>ZnW=Mvz)0mDDlUj!!P#4bydrSb@J zJMr1CYIFha=_|z9W79a%$`kEZ>qSNTvq9gtqzE==1RjBPh;$qLgaO`~ z;2hV;r{>e~lI!Uu=rSuWPB*9?S}iN(hNyX=+1d3EjEUuxwyd^9I{OsUJ7LU6Pcyq0JqXIAQ48m~1?PaYBz z8<7e@Uvu$f9TN#&#pCqxsER11&*sYwdzvYt2=nORuSa(HIwQm|-e01A^vZ%=i+Ii-0>GK>f(7G zNQOeWX@rHFyGb~E(Xb6IO{gY(M7LtA62K+jn>rsv0)0aMy7Z zYD$fy{<0Z=WcGqorfXWS zyIeO1*QDlLyggXk6(kxtf#xUQ*=APoAHd$V_@-3b6+L0-4k(8NC-$5eW;ikbM+ggC zYl^?bvLQ9^W!1Y*+MIRR0;thu&nbvf%U;q7)+%GCGE^I*xxhnP;uxP+1h45|2lfOK zaUenC)+S#F!Yo_`PKQ5@8jkLTnK2l|I1ua1x0b)k9zWqpZ$0Zke9a&S>|&6k4EadD zJNy!ghg;@upFMt{04!e&JTkrVDB#2PY-VXiRwPD+$8Czen)G-(hk$1$qGi3^n&C1C zY*&N6M|66e!95?OZoAFpvMJg57<@c1x&9{J+NaH9XKiJMZjVFXO-u$Kb(%NF!$UcIO)Q`@Um_ zDiW+Q;Cz!qn9OwSp~%M@@V?J|)@Ry#h(%tp?Btj%KCGKZ%OPw<;XLb@SAt3Bzi3NZQ>`0$ zY1MWcKJC?O!4CyrGuOP#dZIA%J#&PdcUAfCm<^t`?0A*FFxo=&c0<*D>H9xV8t5f) zt1<1UfuTYk$;8$hlkGs>4{GnWRXI&~2lG#>FSstTlEl(vs5LKB@o}z)k^Y!<> z@lgLhxhCTC|Cf3MVaU*mux0Juvn2EVXXV^(Jz}BLk)e?6S39%3p~^qt!l=M7a{_WT zhN$PC!h{ez7;R3}@^uqxxZQ0*2Fd5^k&}KExeZi5 znmm6_?f0ts1AZC6|6(_%5@Z*}Zsh>y*Kr_zv7V*BhsAVzGd{Q{Uq$K@>2c|J+@|6+ z(Ur?u2X*g(kJXLu1m{8SI3NZh2fIz{S|G^hu)sU;?R>A8RZe3bYvt!UN{B9IQCnnl8UOr9`XYqu3E@!;UdLq+HAs z&C;K-+x|7~kP>ysIKE;Nf!ej9t_b|{zWs1D&UEuwG9n9!X$bx0_3ciZ(}|2#mfsDGA;2g<6$sz)$qOY}yGOVbh6Dv=(-RP2`~}0*zUE{!zRF zL5*8f=F9#tk1!UXSf1!iRVaX3^Y4tHlTOphCU%EAz}q)m6!XLR(3p{F(4g=O#sRH*Wt(x7_zuRMEKXyk9JUx1{QG^1$YJL~^( zq=0KS`&NH0p7*vUtBX2OkvtqvsNqg~0s`~uIB6o>fP>fASP{eC%Ve(+9%Se1Q}p}o zJVF5@g@)e0S8Q7;_7W<&*S29cep|Nno8FLnxQ1T`XKR1_Qh`rTnwpC*@Bs^ER=bf&^?br;3tbw?^Al%Y{FqoCV^=uRhk=3W+^k={Q z3N{|CA+&9Lt;=BK^N*!&lluPC#l3U7)P{vx-x4zV)sE5B_qwiA)>XY0oQGl3&O31U zEhGgKZ-m5)+wIe9SY%x*kR>qg6IT?Zhw{`GwzRzd3Hy(}7wesuayn#cHxR^lF-oeS z?@`D~Aa#<j&-oEy9dcG?_PBx!t}H#Jah!1n!Xh z?-IIO!hD5dA#Oh4JT1rYy}Z6AO;*0kw$4kg4FS12yCi+XH_lruIoiGmg)&!qT^ z+$8EA=h;%VD#vSy)a*W>dD{I1yc@Lx&t>+f(&F7z+7O_YcAY3_IcR3Nt+%SbHHZD9 zb|v&@odth<)O0wis>T;oCArahN-S2(Gs))jdit>6Qt!TbdI=Sz zq$=k#tVKpimQmz{a*+&M-xvXd??As;8?y2dT=%EnF1$VY9j30?YolUA!dqbZT}h57 z`}6(qOh@b1kFt6XO=|O{p95o4W)KJeKpafhk(-Vqf^939iD_j0qn3{TKJh*yJRs;c z+g)b#h>C`va<{q;Zc8&zV^Z{C?0L_~JLI-`iAp13cd;3QNa!wB-9xe2b%}mpMJ%?6 z9(tVu3p*TWoBlg*UPR$^e^v?ZOe>=JB88{&2A%8%?v7DP8Y6o3tIC2T&Y+c$8 z0-TnjAMhtXqb8bROme7cwEjF0nR5uKRuuT;po%=|E_;n_Yi@dE^N(@9J6n z?P^juN3KXlN%QHy0#j3`BeAiNU2~@zruV{HKd=xbkp?0Qg2ERv_WI12+rNJCBR|Q* zM9D&3iEAqGUZrKcvkB*;>v*n3Sw9~nm|2jUr%9W3rzdJ&0$2RIsTx3k(|?#Z z3wYnud}t^T>ZD%srXaeS2Oo!&8vy3H6Bu)F|JghNKZWkg{^X=hQLNa=1PNfuc?hPg z_zD;pvM>P*s|v0LXHRm9q%#wJzkNRZW$q_OXHl9K{bYdIJZy~Hb9v%xY&rAU4KqY@_VjH*%JUK+)oll{i{_ONx9$AB(`_82 zr3r|N=w)M+kHV4Xylat)u*6vOtQfs3Aik4P;GZ+G1xX7hqA_(c4sWQ3_lzA^4Z4;`sMUgZYvfB zRP_C9gYCogMMe*#d;lZ%NEr%&+bjOCfdEF`8duSi)>CXg*X%2-oxvETWPK?F;w0zR zRZduT`&dK)30kPCIY+oWnT#$q`*))|?!wAE%K`aayc*a*kW9QhBn=35WKoRv;2&1ZgGJ>C-1o}W?w%>Bw2nTPWZpxn{% zAu~=aFc0}2V}Q=Kd}iru@Z%!BT!|up$MD8@{T{D+KH2T~gE={X>5*X75`u`Qcu%hr zN#e}>b6b`E@d5~2c}<4iYQ2GWSUA|cX8@sbsOIpn52DvuULHRy^Wk zqSNUpNJv#Kk_1qg`@Ez>R0VHyuk>ozk`AAI>jxqpv|Y0=kcBKqd?2@6O5K!>2 zK#cGlj@1N`wQL=ehE^}Eof7juL>$ANKgdMB z3`vR-2)s%UBnoQyJX#n6<9M~!QXmkH)6yy)f)7l5(a;vqHvJ>nOjL+*e%GV(*b$1) zre8BbD)Hg>Rb+9p+zGL$eW?NJAS69InIC1GhN1z8B|Fig%dt1Zb7akd`U#-!Pe!67 zs*zFHV&e=y3YDXUDPT88Dy;8Q;7bbB^Ry+9_jWKCWo_Mx7QUj|={jIPTzf})=->T1 zvf~gT%z>bifP9%AwH|n$Ip_;bP@!wtn;h1nyk4cGc!zzA&l!ONlTOKtA1qE1C(an0a0;p-0w0#X(Y5N*< zP3hr!ZY~Nhgd~~xmsS}0!S4GbgcoPAjPwz^rdngRRIsNeGpsj)2RRmpxG=QD(LtD8w^;~KIzF_N6)Vxqwf|Iu>k0~O|62hTsM%_ zp6WVG4-k_7&`C0H=DJZcr26EY)U;ThiG~P=#0F!$PKJJ{#uF7u6C-`F^yT&mRbwqm zjvN&_$C~-?+z3fV)T5X25fxbB9Qca{be+A3w5`0W*X9TW=u4s;Ejy$~?Gr#VM$6Ix z1XZ>86e>qqV79&{6sD(|>SCFU+E$IuTuHSj6u1HXF(~GM4xQ~J4kYQUSGfy7lD2h; zq}n@piUGq#F#F?J&I=LKgP9Vs%P;&o`XT8uXNiE|A0D~DJ<`~zU>Sg0P~EMP-xg$h zMDkIe$8_2os1NpD4mhH>`MAv&W{y6?3mr?#BHf+{=?F2r{^}$|0XC6e?K_}>oF_NU zAHSwpIsjvpIOnPPQR@qN<~#meg81~|WtW1!P&dm6UDl7`YAQvs!z$4f5E$uD2B!_) zx@+$_%bt)j?zj5b`F2B4|pNvG4f7s5-6kn^{?+(6%Ouurat16+v>)6h+8%d*H z-kKDQ%`CgnNZK1@^;nm2=}0{(ar8oZV!pW&@kxk69&fdnX5F76JRL}#z~=fDX`_J3 z!TqK~Z`I!tRdvn$!Uakmta2C$Ov9givyFvBkg4Z@Pq!1^L3t9_?Gn`UpH!q^na+pz;{pNMWjA#ChJp{|Ng{k>$ zdwjcpV%B64hGv>NTecKn2ru8k5{KEbHJAk7Da#iBbY1{NPSmdjx_hUao2EvRgMi=g zs<@7zZ|$4Fu#x#L^!y5);343p5#3aghXi^;yw?T*-ICx@v`MCRw7o+LHr`2`Zww|p zytXkOY%yReDDsN&P`^*@=GN$-V{y#znRj512(rE;tNj`G=x)Y+bf+U(2H=!ndB4?r z57iRdHHrA_JL$VO7kcSUuaynjOznaOt=zID*AY z=fKOs!%s*UeV`*HAROv8-==OE^%#I!Z&px1KnG@B(JS+Rw6X>A?s*J(>`Et(ar zOT2YrZOnY&BCvmJGie4dq4U4zC zzqr|ZU!@`PVCT!klsx4^j54&)ZI@1?a>RKaQr%)^KrNT8p5xG2u77(B`9!~7Il-qW zR(tmWoc|Gu+B4{h$;R&6fIP)$$T5J-&7vF|@50ZX^25WYCha3TG1Qsx#0Z4Yo29?l z{N1@yZaOkKvC{tWHM<3B`xhQ><;dda4mbb{lh|Q{h$Crq_9}K{c0w5kV)aG!o|NQv zgXqMWW&!%L5*4Xlr;pcLHzIg^N)%||bo{0I&jQuIx9mxCGq7a47a!Q}eY{5~q&Lv} z($}?vb`(XXT_#$1`t>hGE{SJnn*Vg}XZ=Ta-~|4KI%35E>QKt_9rp!B+-V6%XvF%i z&|#Y4PCv;h*F8%b#3+Z5cGno>^&h}ZXFEy8NC_NS*N2id&!vA^sc^!4!^49;nmG<6 zo6xVx{HbGvNdRL%=gxGtg8+q6JDrrl&$+FtzjgZU)EL!O&9#jg!eUQDW5^2{m9M{F zLu2)#$-e%agkV|vQI>FTuq5~!EPEkXS`LMw?{6jKO?58QY)M^vdbDmXaAOSjELIqJCi*Vr|K%)X%A3iK2H+EbJE3ggj2-#) z$fO*x}V+iRG~A-WzYH_tFhVF!v;hE9%2L77l|1RN|` z<5H=o?Y9LDq2ife`x9{O_HDC`G@v!CBWHnV)@Z;T;A4Ei?<|1UXGMim06@(F|`-A?Cc zedmrU${%oh@&VFQQWJd(^!Ckqa4^d8_y<P|vD_limhb#Y~2}kf^z-n+PImbspToTmtNWAKLKixLwmZZ~C zug;qDIEcLoPGXQz{&~FD&na7ne7jB?awPnQMQdyaMa6BO!6M;*UtK6X2`25g`%6Rb z{F|izKfaBB5B6W5GS3X81X&Y6hblm}MEuCg^U~DDkdUj>4IwvdE_b*C4q|!~tN_fZ zf2#Tn&%fo)KTaf*wWCXV+nt>o85PL7k-OaROldw>sP~;^MaZS_q|!KA)69Yr?-)cF z8t;0GQ%dCm_p{+Yz@=k|RaK9EV%cz-hvJ5zI*M?Bu}%epZtG5oA^F!-UjdL`A@^y) zY{xL*>DTK;@6$^@7g_HIwjS`GQ?^~BD;%D#$bD*`%Fwa&PY1r5o~iWBn<(#E(x1jF zesGhEj=au|4`2Db>VW@@J?2wtp@VV^oLO6WR;MU@l%;|P??9Lc7$rH#wXRT=L3%CL z&itSO#LSy*PzuY<8Flj^BQs_UGZ3gASy=u90rJCNl4*7DJoVn7b%rT=XEfW*6Oc*v zT?;$A@v!W}=2BO%Pqp-o7z{#UIiqCui-qGDV;o&VO53SPF2!5%F(VgX#L~wWJJmIo zk=XA%vp7U)<6rpVP9C%EpKLGm+}H`-#b1TNO8<5gfnq)YVLg)DK-n!$HO1|RjBoA( zYw}nNF#DK3~1_t z!2r#;Co?z6UdGj9T}Xux(#Q18xQM!i*YpgdRy)!Yy`l8&Ei@uAESpi4BF7lo^{)*$ z`$5&+1*H=r-kv%>C=R0Y-goN#i6B8ceSu(6^5S2?(13$nM04oJLVO2{LwN{9ic|nG zJsTQJKU+qA6@+pLK0PY)yEKKEchP$1vIC-Vr^NArb}FnMGt0pGsPvGfGuC5k}g>u`N7((j|mFV zg;ElTaMFWrD>t=c4&eDh0%G&^JnRVVeCHbiz5f`a!uT56+dm~@3s;DO;v-}^6O@^E zr|LFpC;IzKb*$EpG^2PWHL zN%++|0dLP&c*~2-Fs%{Fd(R23ZWzNZyGuJSXLusXw>G8aDk6DnotqU9ORoDLzAX&j z!s$n2(LajKkXQ9}7Aa#930OIDf*Rt#?ZYkH=Xb^^5pG=%9mU@G)Fv#jhyJLNg0W2! z4EGr1Z^F25`-Cz*XgCgu_pX}7C#}WmRUg+UE6O_mNEZ-+l zXk8Ws`sr9oAyvyir_R&M=~Ucq3_IUFjjWlVwrS-Cs=W&fTq6b6^hP|QZt0#ysx+7p zqpz+TPI4uF>uchfe+Y~EXyXnO)*~t=W)18>4tibjwq-~C>vmv%zfM_$vyw{JQ7nqp z%VLZ3JK8=|W`=n$Erz6s0`$lJu>4VAU?t2>~ctb`S6wqN6%~o*>EX1-axoW=w zi@4EL5g|8APpB-z{`Ft;A7sqODqXXSto#SdI+>ZH3Gtr&O9rw|jOaRt#4|#)R5KQ- zxnyrB1>B~wN_SzD7~`f@O!ba|`%x7vMtrC6)kDy|{MSXqz(qu2?5@RKCC6!aWMf6V zTl-zt5R?Zx%+Awq7V5lf)8Y9x4Ih}z9buPr{&q-8qJuOCx~B9Sle)C1i00IrEnu=M zKME62r3Od%MvAE0Pd|1eBBIe$>iL9A%qOc#Hs%BK*yc5@V6- zvcQT%Ay9s038?R496h1vE#iqYG>=%p$OL#%#Pw266$4o!Ome0tmd1@f=-6!2dhslk z>pL#DP0Atas;ZxKe&^;WT#fjW>~av2AdE0Iskd|~^sUyTDnr8e zKD?yy&Y6Vqlt%pR2}pZ6nPJSr>^n-FY9R+0=JghWLHr0){1DuwZntDGs$(Vr*eW9I1ptAN#nvDobrxK;ZAgFTJ-uL1!3HCH zlLF?TtV;Oq1=3&1?lU?&4fJLNP%3cnn(Jv_(pVm;ix?0k3<;++=NxHx+-WuQH{ssT ze5+L7iR*-MeqXR)N9o%|9XFQArTkKv_04wPtkH&rc>>}`V9>7T6xN|Bh`EY$;1E9B z&<||4$jz@k8;brJ2>V_jc?(w5r92SSf8wo4`0Lph5SlkuPs09@WHtLi=nt2(?`9bs z0t$=1`Iu-WI0>kI&;@yc^g`Ysi(|~;4kS|vhTBfSRwn`#7FG%9QF$#?|DkvNjhOxf z`>*mY$hc7=-iAQ{AiZ)v82c)7o+4MsJeI6|ku6KjXR7lZY~UKtnWEX&ZZ(B=wIh#u z^}~Q|+Do@kT=C-S>~ggL(u(&lo|)l?R}7=N=u-jSCLuS%Ug&cWb=&>nAda(5uqWUz z^w8!_x``Y>B?kyyM)w{tAj-K+94O}&N6ibqHIN1gfEgXcL!IB(Ev;suHSa&Tqq(^U znj5NA#n=k~8&w8rW6uN?owPPYO(58$VDjo-W&BoO_-m=EWiOFDahhF5!@27k7qg&BaEv_7m4;` zMY}u$^Z?6Re5WL=TYNzT^!b3H6VH~=C2{iU&OxV_mOC$ebxawn8#z$Uh?a z%6jGVX*H1ij8A>P*B`-(a{HkDT0w|5mQt8m@(@V3!lUqDa`Z%{SDq*+k5#VQ2jXIY z|4CoSBW#B}-(Q9QG>`d+&wdyW4TnY?%QmO_ZTo{bP}R2Q2hod@ApA)TyT5DMHT`IZ zC-sN{VbA{?xc|}U(`ye68EE#!Qb2@^*Yo5a&;lM$|DZ+kK6w26SKjZPc-wbgXCt_Z zj8*ZL-SQ;nQ!axvI08ubZ8%(p@`qk6LwN|b$Z+JvBT?QEsyG8$zm(# zw!FTO;s}ik(6|42R|W8{W>m9l8i1xZXVmP!w<@@62VW-CVHIA>V}ld0Y(lUiEYNP7 zK2mvHn_*1;@2np3K1;JHeRu_1wm}>W8KXI+px2gJ$!VzGxEw0Ct9TIoVuF|sN#iWR zr53cYYsm0c$nMa-r%eA7ICH;KpnUoPnn+>Wo%q_gCcZxvSif*xb%!AoakQ~_H2}~e z{{Yb2RUx7FMpLRj>@OL8c(j%N>)BIU3M5C|ost&X0;F%p(XLA^s0^NIxxO|A;}b2WEaqKMG-^tKw*}!OoqRZh;hHts0X; zd^suUJG3M7u?1m=XUjKpgh|#U(t<-Qi33uRu8IHFjDT!G-h=8-AdnB$)cW+oqgk-! zg%TrR4@(R$2KtTC&DM7;OJ(UxKF|DPS^6d$KNN#9=;_^ot+ibuYRSA)GTa0zXkk}DHw6!x9zhT#9=;qo)6vsGU&VBY7MhNkbRsBvU>+M?lHF`5IE>!k>I*L^ zT0i{)W=O=mRwfA97{OQ^4zkJv_ILk>$_1d^0Q2-KFi%hWD&O}7DCNn}2Wou1-AQ^Y zsCz~=tyE^hDb0w1#tXRradl*Ui_wt(J_guv<=v><>LeLGMX3dR73&K6K}RLd*jQ<~ z&ty6bV<+m_;*nmQ!M*nBGI^GV)(&&<(_e)jse=}uyLkU`>y1e&AEDJkWZ+==8|>IV zM`$wa3>*S#=F$g<1oUoYdYd%YZNwsN`3d>wq(LX|r$}9fFhuMyL^QdvLYL%*b3Z1v(i(aE z;R(`p9=P&4m4a7*^RvU&0>*?5~_8mUt1l13YHsQ7Qn{q8=lH6)GgY84LRN9`XdhlNQxU%;|`~wV?TMrn3_}&{u9Uc>*JRo`en+m z76HZYIfUuPlJ~2>jH`v$Mi9jlLMvD-CWM05XSGD4xJ*v!67NqF{5S!zK2~rh^xQ-= z^x-ZOSBlnHA8;bWNc(}aP+%hidvo{&pg`*AUIw65vp^M`Ur=LtT0Ahil}@xZ1)h0! zM>a@VsM1zph{1|9vAh7fiXzWlSuOqG0i4?}%!KM$}}d zs$t2dT5wOf9C_ux81tUc&Hn9>`3+$7WMxy|0%HbeeNFh6UO})s^M&CmsnV0${zEX% zemJjev5bqS)E_(u0D0CG>3`KVbI1V`? zHFGYTZ6lER167REV}N6kHqdx(FA|09sDN3c$2zZo7Z{M;{ljI5dOzE4aGx?KL)<`64*a!lO{Q{a2=Z| zs2eK|pDBf6ZTyxjB7FE~Fwhc>{go?6>|&M=)>ZNY9I88=0(9(6UyZsgfTz0>tpN%F z_i(-tWn^{Kv!XMs$QqZ`#=_6H;om#w^||(!T9)urfGP*YqW*l9L|Inc0hh4cwfgbq z=fc7HC9bTI>dGnJMJE&*7J0y)7vfBe#7E5p*7>iS!DjtQvIKzaC1@Qc(kKaj7y$xq zTXYH&Eq28BclXecEIq2uZs6+3YhfQCa3DHOdje|x^qg}OHd`qfchF0XA>FQ40&}M* zPziqJ!BliS&8~kP76QxYK$jZUGpgrG^_*S%VY;)B0(n(``z80>=H^W2%nPsX86TRY z>P4@PotT6s888{|?e@0Q4)ztn`zXYNy-0S0F}`OCI5JKFnG7JP?7~ayjEy4Ps2*z$LU?-)j)a1ZD}3wDa{Gpp8sCyKmwvIMlgu3^&@%DcyNJsU`58ye_Ojx;NZgbf!}|!yqAB|E!7nF zP6q6O3NB_DBbsLJlTd4%$_S?dYMDm3HX0VFVN5iYAH!ie$mH<>FoARxKFOnd@4y)* z_Z>7AzraUOKD)%*U>Xnw$U)EDAfRX(a~ zaoEo~0OqIc6VU_pbyz6(ICvXZY9!x898gS}bCFOZh1m}_K*QI)#eM0)Q7Sh_2~>rf z$f|%p=4|*6#D+}hO(?8^K96(qmej#IVH zZIw7M=kIC+!pIn3@f=jLl`1dlQ)g8pZ2;y-6rMbv+!l=!?x2B+&8(Yna@W11ldX71 zl9>80UPOucqTW6J{=VAr|D)`^!?FI`|M61FNSRp)mz^21x69r;St%<-naOOBk-f5$ zkR3vH$++x@xMV~&k-hnym)@WIe%En)KgZ{H9397f|MBkX^?JU}@i-sn<2;{^qts)9 zm4eeG-XtVyPR`2*GqqcZtU*+8$Hv7(m$!a&+Of z6@mq}^&$K5IDw*Y@Z$*IUILj*p{s=8G?xoYMgf-P$FfOq!|V;;Co*9i3*HzBpJa83 z9p@2gSfwStV`OsaBq2}Y38Y0vP=+MoiIe~O^Qf8FFA%OYDDIBn9}sjUN~o{&oo{7f zHPI=^Q|c$th^&2;z!m0Kh6B^%6{*=r-OH?%%j_d35)XbUOfGso;tG@cf&go}u@S~$ zqFQ`yd9KcMuaHtBmHkM!m7#m;2{rOG!s*G|*q;bs8D-gj zhSDQcj1o(jU~8hiO=ji&-9Dw@x;25l3hnslydFdp1nzh_y-?*%`Y>fB)xuKxRdGwy~IngNwz#m@rnbpp`N-HL!Inz4{ zGPVNG`1YI}e~s?>3sE_dD5goMnQtN#yuK;OyxMmkJ7g1#-Yb!ixkNySQu3?4lzKCb zJU7i#U(CL=w5Vl9rp`8)#~iy4mH9?QiA7mM!1zy5q?g%3)P5S%|5H8+vPg;=|h z?6t3@Y#@t_o2%sKB@aZ&_j27e1HQlgi?X{4jhJFOy7a}HIs=NhA2o5RVK1b+xJ=-| zR!RHhyi}<#iRhs;4S+>AE+($OaMbrV!HNwnzJCYNQ2a?oE3T-iJ=zm3Iu%aMPOYH(>RicwguV z()Q96D+JL*Dc_pjRr`G*_dxm&e{3K7p68>swi5r9-4KJvyS6 z^(*2s6kiLE*>?)RN1c>ZV8uTtzj}_6xv}TONj~ryfhQunr~mD5CkbuN!9&4KS!?@> zuAE4VjzEt7Q+H%|ArAPNzTyJ3gYz2Ok!0-sBZLaM)_l_KhS_bW9*J`M(hRkO(s#Jz zugpc@2eRT{=HnvA44bTUZz#=u$#yvq5_NC&8Lp~w9iYkMju@;=>HPZcMUNIGrjH-OcJVD-3z=&!6V{SF zCRS^^Z_q~@IKqRcPYg)((mkeu$IhiG|eX_o8{H;{Tc4hJfWblCpFfR0s@L!KXgc-CW=fUb=`_N&+t zi}K>|M`Yh?&6MvWTancUj)5pFvW08v2fOhxA`g**Z`%}T?LPDVs-mXX6o3P7576JC zUPDLRw$mqxXL^^kb)`=Cmtu*5{+&;Q27d66*ui~)qzlB6J9l@8i(u7-vk$F-K?Q)Z zSGV`C!sU5$s< zpz{*(@ALN|B1Bwxs^=B=GYW)B+~3_*s4FHxjZ~O*{TRCGwP2O&vEp%;wR(B!OZa2= zk-QKFx(i^(t9`GA6Tl(`&2KMXAVOas)n5#)H%9rog>&4XJJ&sZ&#Hd&tV6v{V8%%- zD|+ea3(SJkQ>T`IWo`;fL5b@1vBuVjW@>PmR<5y6|Jb+!D?DgVPmgAs3_ zAtDsXAp@8wwZ&((_wbaA?sndtVS`*PJ zGUWpCNwtCe5_^2r_f8NH@&v(u68#~==wFE*-0#sDNG_1;KVAs8C!Z#XWMA?OG>%`V zEBR)rViamg_ThoX1j*kApsDwnS;6e{>(dv>-tIeAcVzSSo z!CCK8>_x%H=P;CRdvQK(M55$rfk2~$#m{B~iizIznc(yxo=qmqH(JGFi!cqSUG!az zm&{h>M_AZFG@3Yk7JTSo@*bCpPE!VKMFoeX0_)Fk#PbwRED#kSW+U&?tBahpI@+p_ zEcM?k3(Ztnm+RRKoi&oZB z%RSMkIbHXAs2Z))xoHPa90D%-dd2O4>z5sSt^R^FD2je{&s*temt0j!Z(-U`1f%D=mW>0?+%R_kU}y)4&<21 zxN}__AiS)}Y8ZTrOF2vqFGLn{XGB?UDra`KFrfRkx2Dbk`Y*?lV9N2Xkg&YB4L zt;Sx)$F1IGT9`Pn9^~l1A|mRV_1$EQ#dB>MUab;dEiUhJiAD6_0j~c{t#pp;S^t>i zlxoeJZTwCyv#gChni$k{ZNBd_2R__EE$$iZj>*1@y7z!S#h1541;H_XM?O$Eht^FDCgbJrlcQAs7sP4{E z|CN8~f9GG6GsDz1HP{(p`Z@N>l5d2)gl`uW6foij=a`N*1S2{ZIz4C}&qE;1cO$_3 zYxPc+v}5n-*~K&KgqdB&DS6=L2bPEoJ$8UDAj(7JX=Mjk8G;nare9>wJ0Wi?^FN>c z#bB}c-cIGFed3a-Dz9}~T1aFEff7Xuf3VbUBW^H?6~{_i*;~VK zIEjV+m~d8-a11aTaat@>fK@>PM0Vv+^_Lb_%3~7=lasmL_LBd$9k45=pY7mS^7pCtaH zPCQA-8U_D0^du#CS5wauC9qa*sZ3nrjeM*5CjWyMEy;_6N^Glf3;q~5U&Gdt6csAO zsxawb4`E<|iEJcUy9-|mtk9CuzDEvoD01vPmJ)mh+o8gw-)f3S*|Bu8qpeYIA9jm+ z!k(W}#>wrp?(5ywEowfM3W})ygIlZjp_%Is_ErY)RlnMYpi^R{RXv#Fg+l9-vrmoQ zb1g|921TQK>YhL>CBT~d(GpbufySh|s_SVf@3*NZt-fFSM7mXIM3sA{RM?uI3jLh6 zK_}MSE~LLueO90nmr(*O*WWEspc3VqZy>gsI$n!-?${+nc+b zlQnOX;2&_nNb%nWmiWGjn6Be-N@NvA#=_~X6kcu=X3;bimew9VM0}PF7 zv0Z>N9Uhtn%lKYkhiCMJXnB9qJI9XetEShY>>o+h&a9FE%lEYPEi|I318xLEJX6s+ z^C|i}U#dbp$E)qGpE6@z=TlIE4p^0g=Vk}{7$Wv)w$NFa$0lfB+e89!eZ8hUrTyY<1u)(2)m2=Pt>*}7Vh z{7{E5aXq*29_=ZJB?2c( z{ritp3yX!{GzDoZYuTFT$1 zmUykoamD2%k>Q7QV+Pl4o|PeHi6dROjnvdWblz`yKE3L^AKw&YGBrApY^ zH*$U{Sej(cyT}M|AwBLDLm)~!=Ho9$IJ>ani1Q?(vPKVqKny_Hi_A7Ay^@4`FVv5gm)TrrUq-}t{z(7u&ImQ)`|>zOF++@6#Cz%c zR~otn#t+lii+l_}cL*bc;5+R-h!Y3AZmD4W_53k0P$F35vw5L09=oVkZ}^C(^5J?u zjl2;Nm>n6L?x|i5*ucPh674?n`mto(j%rAcr3$OZFTaR{JcXjgj^r-&6bKPhP?J~I zcv)7%mMHXXaOaRV3HT_c8yxCuLaBh?@Ooc~Ffx|gT>2C+QH0Ev>W>5S zRdXhl`J>adFnZjTscNccDhgCPN-qd!)h81|G zLAk601?vCyPOA^8%BjmHT7(g^)s8wY z{dmf05=_aABS!F9DV zsDWu0qBNYx^{mecPFnzdXILIgNBfuk??Qk8`yb(Xiov294NYko*|3;R)!&qA^?X?&0gH%#~kk|x}-k2TP>T5v;xt4TVyeh ztiMl9((uJyD)`ptDS>fP%7@^jviFll4fPdG+N{JZX@3lLqKo-; z$l>Kso*`G4Evl25BWbzTvtR8Whytu+X~3-PwUTg;!Fum}qnVJ?3VCa>k{bMlz9}|C zr+t6vL(d;Wc_BhW@rx~`c}80gox$6=5waQ(iCG=Kh^j2@Aoi{augp2nlUv8*m$HYyuQKCk?0JiU z^5G@9R+$2c zN&+5mDo;t6SJ|g5Uj67$(xt-9ZCANm)E!o9he=d=N#;@>DcK{1wZqVD#YhTI0>zq zhMby*QYhcy=Y#3v+#y`j%>r_YbBN_ZT>IuM{XeZrf(UJDC>Nus2@C>n>E5Zy`ulj5 z=oVLRYS0_wPS3>!doDWY z0)7h}0$+&Z8=N${7w^=QK#uR4b&#)ih^Zt`2+ZN9?Pn&cVKF!eIK8uxj+NZ2q>#ry z4Hrle8Ai#_5&Y#mkAEkRU!M?rL73OyohoX*od2ej^jh~(5V7b^ew)&G4TfGy;-&^( z_4}<@=v0)k;}RME+>K@Ml%RHk>U5&_soPo@h0?y6zJ1^24|Tk!c~^w|4|fqw72dDg zg@t}NIBikC3}JYA=8+eoB=1|(;_b=+?Pup_&rGDbFnBy8U~v+0ZFvWlaf51lSr#c! ze@5O40*d0$>U!+qrjVQgSN81CH5r)s=0u6w@_PiBvNiTZBuUMG{M@RH^b3HQ}(i#1g^fTj^qaz02Kb57MPoZPAD&ZQz>Jz1e6m0&Z2e2I%B$l|O z4JkA||24(yM-hW{e4$K@+bK+CI1S}dQv2BKC_RE&%{UB@S-aLVZOf1KX9jBaA1}ET zsyuufi(B|=FyI1kaI^fOQchzAqz^6Q9H#KBTe?VJ_^=CiIgas5UH6KCRBG_OuZO{9 zexSaOpra?3K<{w!8CS!#47cs;FV2g$rWfhQWKH?*1#F7)rMy}w69MR$`9p8QOM zyun{4#suyPnO*5JBc;PFS0c2Bw83Ub@!8htJWs1{pY!9PlpwK;QcCAICZ9rhA_h)# z>EFQ=K~Y{8JAWk=Y0Ym7Hb`xABpy;{N7Txxz}MWs)s@^kJEF?z)kk(gOch@42CZL{ z0?-VJ*wdv}t7yK;nyir;26^Hm39j;K6Xmx|!(~aexxzavBiCn2miN8DKW+c^Pi!K? z)EoQ)(W;E9#btJ^HTUZ7u_t|!UV0QC4RkqMi3@ngBlR!vYz|aq0fF|lB2b%~sS5dJ{(DjE|$k1SpEbKsq!%xlu09->wXgGm4)ol zV;`jLxd@jcu7^=H#Ze{sSu$n%Mp0v!oq+q%Q@H>>(C19JwdZHe>6xsbg+bR)-Ra#O zcE~~kk6c`@`EN%>nguo>($HcLmQPL2`xKX*DPOnr<*ZF$BiQNwBsBmSc8`flqO9SUR%FQOoH_BHhR!+|*uv4SFiY(S!=0j!|Yt zm=|eIh5}oa7cRhL)^lx_^XcI7&`EP%-Xn2km!GyP4=l-`nRm0jEd1icki6Hz^rH6i z5XBe>P!&E_FBJez$FP%39LhmDZO9B#>#--#Op`c=(bFqY)*qx+HBz|#L#8mw#sOVY z8?o-=hJ|xiLZJGIvAAdPSm{U+!EM^puQAkQt`i;QUnv0VH-7qX`&BcWJ~`ZVbVl>$ z5U0i3!vzi;Sg*TseG?*0nF{`K$QRk``}l-3Q9LASZxgS=?VVkk$>l+GPAOz)aSVjW zGo+^+V8WDIa>f12S^zv_g5>S%;U)oK)LxhWv*y>U#erE=Ns|n- zwVdVH;EIefWWxN+^l1s;lNR(CAO=Do@AFL(`+m4ruhM%!_pNoUmVMrPPVqes!5tjr=#2>H=G$XW zgV32Hm9q`jdTL7}43j{SCGHPsFdHnlKYd>gNnGXAzBgc`fe)y2U?fULsbDMZIw8## z4O2e`cU?(+Zig)ic=hLee_qXIq62Gg6|(2xiyGB~WfU0R2Kbq8*QyY!q%;5Fq{v2E zegDYN(gn?_ZXb1lG%8=gUV;;kn599_6AcQ*Kl}M{$Msf;d9xlp{U*_Qlm9feXpMLjqaTfR*i*|x3#|m z%|ZxwAqN*2WvGbpxQciLoNMp;K$^ODrb%+>m85lB=OpFBOfDY*Lc^MfSIc#>UWSH0 zr>R{#6P7QWl7@zfC74iUhaXclEJkd_yQL|Tpc&{rY9bdorQ(12=i*wyOfJzRHJ^H5 z20hE8^_3r_CS}R57WeFaHrEfVo}=#4XQW6w7*VqSxrgZjdg6Ir?T}4vKU-=TosD<@ zE<>Fw-%2c(t>co!0qcW-+OkhJDvAJop31S^SB4hLIo+sl(#W{igeBRLs@nGL%;mfd z?J`*cU!Xd%E?U)p>Xx;q)tYuXQAvlWh84 zpCJhb6BRFh^n$HX8R3x`uGH;e->v{SwvSbgv$`~n?aX%gQAD|PilHp&A8L$T`JE=| z$g{wFoAG(2Y7kbKT~6H-iT-S$!yHSxG)*lYSHm!fZ*A|fZEUn%h9>p)EnCv`<7DfW zyJFu=tmso4jtCih1r@tY%P|oKZLO7Mbg^Lo_+NWW$?T(F@tXQ>S| z5k-Vct>)E|nvWT=)NLCph84+wx8$v~{yc?#kgTM9jk}gE`4crr)zKwCLFi+BiZHS} zN^=V;g88q7pF8Lgn40*mu4!+C#)f!cSlA1I0ABqwZw+LNx+em z7%C5?I@|%+&m;xFV+aEyP3oI1fGW7UKKWjt*qhqlbcZ@q_L_`LVIg^xD&yq1eV4yk9Qqd3qny(aT@`P|qJNz%qt(?(BV8O(9hbI;Y}+aqxb#_rGK zlhlIJ)XjCT;XGAtydchsm2izhs9e-qd{Wk6@-tS?5Et#-r1_r~1B*^+hehDgu-j^@ z*=+CIoqgS%qVTBN+{z^ifLSD%lh8X=`8Uk^&AG{>k}!1@R|Ohxw3~rsOUsdyw+AQX z;VQ23fG+;bP>n?H{@f3XqBlpE8~klpAzYRaTjuh$emRl1Zm%%1$v$LClx(z)0r#%G9-n*=G^WYh@re6Nx7dm*$&i3z8l*Y7L5{0O|B9X}_R+UxF&2)rYQLWrFw1$LwYuB7^<2026XG-<#Pg3m zER-BJa z`!<#kQ)lo#B}1-#G5_vw?UyZvX|NiZZxdms=)V1U<-8V;+dEse!v#k=gJqR&lgo)~ zc=sy{Hm8$#B5OVsA(C2*_TVDRuk=^10b0=A4{$$EguXY~>w+>!mCzr4D z`->kc#Lge>h-VHuIS+*%_12;#OU>#k>~jcin`wjpGjTrucxUQ2#kX$M3efZ;WqP#} z7>V)u-09I$3ZjJW4vK#wS=1&^Pm`z>hwzOGqKO*77S9^{;8k>1s7Hk{)wRkOsIKoQ z_q;?Br!BtzoL9;Qs<3;trC+cotxM@ex#!)u&J*oi3TCc=1yQ?9fN49avNcj)CXyfK z8yR+(_9s7f_ob~DEw)03Q0XxfrymPZM#URkq5HNU?LgNZVUFoAM?}KEN}2aK`EN`5 zP4Jp@Khti>=Rk;Z&nlB`Nh*5b_Q(i;N?o(0OBll}`tEf3;uej(e@jubuxH^oYW$xd zLGk2Eu;YHj``3xL_?+(u3L0GmE^lMfCWD-`Y{uM-0HfTwo&t)pw?Yf4)f#52p(#>f zZZmmT2`xOrq^=^I$`6kvbdQ_|)@ZC}xE6nSA&xsB|Lb8*BnfJDwsX%Gx^7j))P8rT zMnC@O46Id}Y|o?{28m7n7m2YcG#PLStqf|oR80Ds-D$S!Y+g2Tu_283zdF~KqmAX5 zq53r5gmri6@`1%jU#RuYBi*W@B)JO)(O)=*UZe+QUeCLu-z;4l7lFMaI`_`064Wf< z9qJKie`Ex; zf1yQMc-U&$GyjXGi(fS)6d$ARs2f!$n}A(3mBSR?TQnn4%h1)Itev-A4ZFm-{wN?B z!gsr2ytY-W#0sZBc}K=}oLa-(pPk+9U13X0f>Qs{KD55$&|yQ6$A6G9IQLp~2}h$e|+nyZPMN0Ce+tec0n6RZEQd1&$zVRY9?%i1ssahK3 z-NVp#)>}Jm7tsV|!f16daKPF`IYDn8WsY~SA*Wmt?hO6gk+{e1 z!%AW2Y0AtO*)aqj!k?F|QxzfI|acm6yg?lBeh0uI@COsbJ#!1B)Hv;M%qFrQ0Jw@p&kO z((ie2K3#*NPw3C0Pun$aur9P=ZH)1-B*@Jf9LsBQ##tfnD@Npmh}gCl^qjLkfB&Rb zweUB0#<4OIkTzrss2bk)n7b7`5C`iz@sslhfirH(4ZaOhmDRV(_=pm{D~74}EnaD1 zWO(IxJ?iPFlD>7C@=$f_b5by1ptvE}Q(PG@3ja?iPDcyJ2I?(w>b9l=4otb(p7eWRVwn5+D;ntM{A=Y{AuZ z+2IY&zrnSBXKfcHxSO~ba;o7ZKZhKA^s1@nj-$wH-1RT1{T8AwlfHO}?>RmrHckP> zl|uA!XqhC{>coRloWOE6*kBt9{&3L~pguXk7 zc;>n^GOX~1bYx~oAUC>TB$zBxw$wBW{5nR7xvV1n17}4vK;e@98%st)xCB!;j1nVi zHPdDB=P)gdkJWV=o72~Mulv8k$i_IaYodACR(=Rzx_Q%lZsR}n{domMTIQ`&vl^F7 zs`hlne(_Xt5m`HYNqOqWi*Zh!+{YxG`bhPqgD8X}=gY>KG(7LYyu?yH9tR8V%YiB% z{yaJFiPM(WJZ4*UpR;S{#a2!D;=~Njk^Ljry0(xI^pvgKjliG0i~P(@XCajMFDE?J zdbPkcVE$>Mm@&Qf18pGjtU#m>;u0oGJrT8>Cue6tIil|_>Pe@lSHBy|6?Os#1&kdG zAxNA49ixs3r{ra{CYOUHq~oV^bAm5#60JP{T=N3A^J;q7C{adNNB-gp28}TjnjCP+ zC45M=Diya8gmvuJ^PN7e!D>EOFq>zg2HmZAPtcCE3JWxU)TXl%9C7 zH&^oPFz5<*m14qhq|GOAD+eJ_<3HI8x|^70E;QObR@*-3ks&81<2~Q(YWTiZovgO} zWPh0(`1lL0JxgAQ>RLJ{Oe^0aAsXYw7;YQ9`1#}RLE>ZPua4N^hs{80=dc_5ieXo= z;S;IVwQkm$o0s!8OwFab!ctI@JIqdQwVJ>pNItqHXCd(l^~#^rdzoegpLH}(K5A=T z%c3a19_54AjX{{kD7C!B?96u+#&uo=n>)YNyqOpq zY`~e#nnY$;ZJ9ZdSJ>qf+TXn6qiZ^`C+_kG(9QTC_ zz*VQH;#rZC%`2b!|1#lb@B)ynZf6&&ir;`+<89s}FB#Q`X}5$$W~foGhF(^I%O&tr z33e965h_<1oDwcyn{xmLwJM6Al|B$f&|sAlLR>AG{%crpaMAXx|9xRm_w)}jcP3{) zYeD|!dek@miPYzZp0d|w4iAn(Qu$>4oqwb!C=I&J@rS{M*W2oRMXxX}P_B!whSdc? zpBm@>Xkcx9fcIEMvNq6&VU-UzySlzU*ql0bC~j_Xm_#~uSbQ%v!_scmL^5Gm6|cbx zW8uxK0;O<8xmB-VJqXCB2VT-szCKSQ#;3Ca>A9We?v82`$>6fVF7EwNo4~*hGYxWdbeUE6XI#L#A7J_{b$tOspZtDE59ISMkDFvK)%!>VrTwacB+ujC|xKp9iOL2{_ zK=qaAXVrK}W9AcvY5q(@FV`Xb0abgTW7$hnfI!4!(OMz7u;pBr0L!P`=#PbMX;sj- zxqV;Y+Z~J6Tgo(&%;yIAZffc$zOAqaDTrn~Sct1#JonnHXx<>Lh=De=(Z)%a1ARLj zh8H^)n}?nlBf~jN6}{xn0k{Arl7uCCf%frLXadj(Z_-1<=qy7CSm$X=k39e+j(6wV zI_!ziuI7TPYwzv+Q! zQ-wY8!?%^b9$%YQiOM6_x~nzFcU$bJ>AzxkQSFh9-en`T8`Jn z%$x*0t;a7Bm*CU*4+Z%b&RaUVTJGgy(Zs8qwyp06HRuQPAc*WLF~bxmsRoAjv-6ehASV(B1z;#SG~Ev6bAs%yi*0;i|LA@RM2|-k?iA zMImTU(nSm%UGpc0R8*KEBjef`*x~C=Y}6ii-%Lp3eSnGzhA|{#&w{!VCCC7hO`0n? zr(O^l&acKW3d0_OkE|nVz1bQ%7}jlUGcqDc{CcFxwSXekCk1zizngu@vzCx;t)0NH z7f1^~FqxzWIe9K41yD9|1wBeIF2OG|{I6jmOy2%*69Ni!`Sww^r3KbEsA|2mxW~=kz%tWt#7z*uvJ`del?ns+-*18KshAUXpiuLpe-g>nM zqtuuzV5zM%URc*NK$xb6zK8>0@MI_{!LjNqf)Qxx$A&}dQD(~-tVTnkb zi?(EirnMOCN~q{np43p(o!%Gu2`Dg!kp#^St1Av)^aIoGHdfeYCB~;peiPfOuXgms z8};a}+(gp^qO6tP97sYZX2C#l6N9l{j|u~MTfn+;QEs4yh0*cCX_TlNmPb*Ia$rV} z3(l|Zh3uoPtwsaI&!7`5<9}O(2i~5mi|6t9Pwp%Ec-U$cZ7scXgrO^BFy~`~=jnAO z0?0s2SNIdbTgj3t^f@|#a0Lu848P;_wF#A9LfcL)sL6bhtjZrm2yc-9|C!oY&%H`V zIMpo-d+$arC*GeFst2n1(Ys4Z1398R>yFz4+b$KKQ-JlgM)oa{!w^J12Dc?{ z!1boPRWxIpSMPdmQrddVS@!KcI;%4FD99adQ$u(?se-RXX!E4{QJ_7~J^w0|0o^aH zEtmT(?X9_Y^f4{O_g7AK1m-JeDkrhPnxoamk-u9QW<4SZIXlUH`Ae%& z&BAp3Aq~1l;#5gQHjLe__B8~m%J_N)aW2%w@&>*CZ1M{` zKGSzV6P3A8GV$nHtE-X*=;vKAsJ6mwhc}$VOs3d}-+k!{eKzk1Fyyn|T208ka@p%e&LA06R;*whG8_z6ZK0oghOl|hzviKX(g#hswHT`h z_K--=yM+6w-naQRozp+g}yb0* zOOMp*62KvqIiZrGl!BLsl&*DmlinP>)U}B3`_U64<9H(rCMr_K%l}0;cw%v(^zioR zM~P|lfVIEm^i_tEbd4zf6liZ`kt&}4^O#>s9fu$C?KdcIDp;cAtuArMnwcj@l#r&k z(Ws+}bjYedL1c-sn{pSK3BpM1OKOFYA`kq2PYxI~41y}p${!b_UARQBf!kNJjs+Q` zmw@p<+8R2+M*+boFWqtBQglaEp6jXg(E6~>EV0ME*?9^1`&sJxZtv{X>K0g{lQ^Tp zIx&;Rq1F!a;eZEUa%rT2xGG2PYQiL0BzntWe=pz52-rZj{oPB-G{TI@6IE|SJ%w$k zgonz>CRPemjeV{@dq12_i@jWBAY`xs>7$>0&}FR~`qN|Y9?2ASUZfioGhIDLq3E;O zODFKpce3n;?}R4GICUFdR3J|9;i*5zZEVCKu)qxD5vkI>vw^5x1nhF)E4BqZeC-Mh z2T{4&&$7a#-p?VOo4W;*i+z>p70s^yv<0YM=-)<8LK24=Q)T8$X~Yk=&ebH>+-@dD zFT!#1Izc)Gafg%jNutW(r&DzhNGlhjxgi(qp!mgLmCg9#z068L6G`p$$+Z9}SWH}( zI}O^Ob9k`B@_si`uO|BCz{ts@dnp3>eG*nk{aoXJ+5;2ve}Tg@VD$hFUn&&TjKC|b z`3L4(-|EK!zCag-y@4p%d1|FJUfob zR~pL*AS`Cm!)U}skC&PM(RD&oNhSYIa+(1!X03vdKNQ0BFP=tPSgH)XX@t>bJX)?Z ze|{z&OoKTP#VqEQxeWYA>fGGXuDkNjF^vS(8$yGB@NXtq{l43d%04UDmc4A|grFW` z0F8u&v&er5oab#<(gGJ@K*H+>b40Brdxo~OB<27yLB8tFb12e~Gun2?<7{piN^Tf= zo|#c$x?XAJCoO&p4X07`@^0&7-8wHs<*V@hs6U|>P2n?|oOIp;K9=h!U_Dg>Sq|kI zpS@6YMDt87CvvjJ2Gxsj;#Xc#qh^H}`jdX0KbX2dNKd9YVT25v;2Zt923OHCNUi|= zFT#Q(xH=mh)~p!4rA^X+!beJXOJ5DHOPX&0Wv1VX<$B9CuPIWG}yS za)%)vjrY?#l3KTB&bPgeYWVoi#3tgI>@nQe(Kv{L;$ilT=FaTxNt;kZUDun85RKyA z@tnyd0}b)55}ld08GT%nAs=l$8w(+54VPaYsZKMfFhW z7L~_fiMu%b#6xENP*6U|TLL+e5k^2G_u$YtxX4Up?%wtH{=YlFG6MBxaOx89cjpIw zE#gqIBi8niaom}MPy@{PeMWzSK|kZG&vDhfS<9`i0eX491Ly@52Z84%k_1wTBEx+d zTxNdjRTw-&;^08+h+uVqTu+68c8s^rSBGQ9_o42l<<+~F_NGY`X~Z!jCamQvvhANVMtYUsnJ$GUG)BHNU4d{k-J-+Ur+>)kO#N^7snKF z`So0Ne?@=XN#WaCtDu9ITluYVzbq|qd%5h{#4Xkmm&ob!NErES?fPVBM)LIiJSK`g z#7=TJoYP?`O(S{#Jbz?6ShlYCM=P{Gfzic-*paVUd`>mC==r_XVg*<6p;OYiyZw$X z_haGc^m6s*ocsfgMdIF*{3-kK!$c3zo=z*VJ9ERvD8K(wc>Yfw89A^BCVgz5cKI(7 zyThlkIH*1@XqKT{K)E#xBWy>_Y%lI>;I}{C>+cp*3mU0*Vfa_0*c&SndyTbf$$LWO znXTZFYcz__f)(xc0^6uvZu$Ur>$KLIX+PyYd$g0?ptguq`3F5q{9d;6>)nFczIUqTCSe6*S|Jf8oYh51kRg27|`Xce4jo{{L? z>6`;I9cT!Zpm{FXeVSbSe0A?EDUcfQG7E(N=IUPBI|yPgd!Hyx!PCwE^4%=swmq}B z#O-jmHIq+P(^XDFNm@lR(2{68txOMO13g~-3RRQ9-Or&h_$^-3a&X-+f7TfY{=s8! zyP(<&xX~5{t#ZRSk!Xx+9DzS=CCB(PXx}<_@d}psYW??k5ErkEWgy4Q3Tk7vJ92=z zLy0=AR|;7nC7v}9i(+;`Y?Nv&G*48$Kdbk90&E`BZ&oh|?gSSoZcO~J0|PMbOD_{= ztnr?d314dT%{o8oSx;zC0B%?o9LsEm*_shp{a2fv;#gW`@gudI7eKq=1(<*P%MIoK zga6WmzU5??cmfF<%k%Ay?3*_D$QCI;z zuHnIzC~vMa!1M=|E5{V;F};?n<5ed7C%skym2_oPETcK5$PY~V`%It{458^1ZN;i9 z$V$5bETsmKF&G=?dyIEurZy>3LD!QD(uuvQ!z)CVeDG+5lH6S69P~Us<#wFwK{9Z6l?E9xZBg)-CEXVrC4Rhg1S2Kb(|{ zDJk*MFz_am<23_|2WX8FmO$>FWlNEUkF@xaAXu&thzezTvA6pJ^v8F*C1g3dYo9-q z{B?6Fnluc0`0pQVyap6`SqhI9h{Jm;Z7~m-FI!8-*JE-5p7^i+W)Sq@uv6o(u=axe zD5fhXGsAs#r<#8LU7o5Rm!~C?7V<7oUui&fhB*XSWg+pz_E+I@bghRo`}uEC(8IBB zExE}5X1nTY zOJn>)9tNi$evpkXNgCh13?E>+nA^P@*jlygwR_gDv^K>*jDb2iI-;iYC;icD>Q+9B zH~)W~LGWL4I_Vi~lbnehFclxy6*Y#7M%4ib_PDF&6GrB6SqAo{ zI6KT2S5jd@to0LYFV4bj0O{$on2ueW8!>E)Nspax*4o?<-v8=lqF$$U8|6O22$iHA z5$dT7skb|sTpTyq8LJDYTb=uHRzoRS8hd!sq`cOcb3JyjO%O{yr(gn;%fy)ad%b8- zfu%|ncXBoX3Hb}Lc;E1SK{Ziw4HzcX+B9wy$d@GlAsQA}&?-7j<#u?Jz7W$KohP%e z+F1+l|HWR)T0G-?66@$Xfoi>fGPxVcf2+$YI)|<`52yKJhS}=|?bdb%$7C)epz@Q? z)Q z%7z^q%|)|IE5CPH{F+cKmLe0T#dJ!q&~<7Dp=$De)d;ed?}`Ib-Pi<{(G+PZ4vPc~ zSCpNBeCUm7c!%7^znv~zG`owzNmyU97AA0BsJy(2;O!Q}47t{<*EkSDpO)>xjQGq% z&ZlRC!OS5p+!usl_LDvFIg3wSEa(^XbFIEmsr*m-cIoH_#rq6bBfQc3EW#o#r2jgQ zFX#4BhUShA#52#+kXFI`{&y+atMIO5>=eD&e-1-P?p#GLf$UFqHkCkZvCm#crI2Y0D<|&Q6%V*TMTj4CEBm z?u4j%W(gnZGmNs!2=yGb54){IT+n{~au$bsd|Y{1VZIC}?zt_=eEhb|=-G}zk**k) zCR@MB3XiDr`mL{$k|sK8EVQ1wf|_+va{Wa<86kNWKRid}>gDtAKygB#FpT{t(eOd& z*aWDz-o+Nf4xfkb0m!K4Q^512YO1oN*jC{I=8mCMlAoC0+^q`x&A~7Kqxw4 zef#;tq0W(P?q~xRQl=u?qL#Xq)2pqYMu`|&VFy!*U>=81PGi?k^bBHWqwZl5+{4WM zssv{LD)S#?R)S>aj53 zHGwtD?0B`jA)w8ZI`MsRFahg}BU8)HPfU~Uj}*({WTqw|ZuM@Bm)v#o-| z^6zAM?;h=ky*D=fL&1jG0}?`7f-;AINc^HPJ6;=#AJN2vs>@@C_iGto`tbjK3=p|J z-#!*IFqNybYwq{#u0inb?TCD^YA&lBL3{opZv_P((UFgOH8=;u*!z{qrEk#O^P$D0 zLOt4BK-uaS9@ct)R|;H@j? z?w|cr{&^BZxBzduNMevR3fmjbc&@G}u$gcMqxL&;SyFEycu)5a_w@zK8`P`xWQMTP z;Nb>&J|nR9J&__MP`-aj;2*opY~y$Rbz)^I!w!Eo>>?-Iy>I7$dcT30(ryLIjmxJC zRm_e-@Mace~Rt-K^f4&i0 zDV(5k;#92x^lKWe)3jk$DMkcQczqmrrya*c`LOc4rB6V?HF|@}+x@VV!U`#nSatP4 z8iRu=F*x{1Riig(R^JOL7GPk!V8G?VzXAgfX5R#~xy0O=mPrs!4zIxsor|?02*l

lgy4t*>)d1{Ys|0@GQQ!FqOHF!@Z~O$ge_Kg@*Z_wub~iTjrGFcj+W_FpFi7YE$v z=dkBr38gKOjN{1aTe;nU?NGj7x;(Vd+LILu<1Qj_?hs>l8qE*SYAp9>phojc-h6DX za7bq*F^;xxUax|X@7lw51e57g*7j}}yeugXi&6DsP%YoY_DJZPrIEm3dpWRG{p`2! zDavQ84e*_|=8Tqa;*mv0r}@gK5196MCwoD2O=Fyor6R9_J60XTwHap4=q1^KwAy8N z>nNSTa%%^_{-4Rv8>c};@;S%sNIRaNyo23$_dSe@y5a)SIpWY(c%9Gb-Rl2G*;|HH z*+pHW5=u#Ix{*x_h=?=-!lscF5Ge(uyCp>wHmQJsNJRr+@p1FN z(_J4&7!dN^cr@@e7f|N9BkLWlqKZ4<Ik%tMjX5Cfx5%RkSpeKFabkK9-=jtc4EyQI3B((#z&U+vTNb#c(FO9y0z`J>IKJMt=6>7x z=_|(g1g;y1M!7lTB9fufbfnEs2Zy!5GQjR;()9bD%%zPnE~=K0R#e(~D&$O?r6}!p zLX3IR)BofoKpSu(qcOYIqe-B=&Gr*_x3fb}Js;XnNh15?pI-;QbFQa;*FYk?KWqp2 z6PCRQ1TP2>3)|c5dP5)^Ol5M<(YSJs#CP{OfBK#P{5ubGu6_F8b)c1d;{rzutS+C3 zaNK830x;WxOAy492(rxU%damTX2tLDg6SH-P?I(uH_VZ zEaK49fWl@j$&*O1QXfp&c^f011?(4nOFQXEbek^uu?h|J#FK^6V<1J!k$xp)wQTUA zo9N%+WUXyrIN3qpE^cFtPYW}KZ=-2t5!X&y7&R%OgLCD30CSm;wY!KGn2tfPO?LGd z$7mE6y3_J?eZ(|#K0QWt6N9!trJxb?V_lBtL5>SDjJ6SbXlsn!(Cq zz>paev5P<^eQMCf{H~-8ko5eqYDUR_Wc4Q$eEucYlkTZj zUbT(8e~V8crfYrh_az&s+A^Ja39fo0+@LMn$K#uQj9?Z{t-aEaf_tm&m4QzbVUpL) zkhcnVK&2ZFx~ISiu0n68hqmy0%7&9D1S0J3O{owIbR$$5)F_?pPrw29U-QTkS+S2SKenyYAP53;C zOkjKb;-ecVEM~6eM0s~P^00wQZKB2MvNI-?MU^OFqMDRhfj2wp`3J&E*X8Di+us`I zDqamx$05b05+(BvdML}Gw_LcCmHE-*l!|DePI2PSg6>ADp7ABx%f8s|i%Y+%uJ-n0 zWY>nygJfxe&e{w-#RR2;-EJa)=-xxXbRmFl*B$-tKXeCgE1gRETjDokTtt}=~U;PQR!lUTquy% z$_27<)4RZyS45ykH5|-;18z)!nUOWVX1iqTy-nY!`XfS4YXeV zn4(SvcCj_nZCr^g;Py4~ab2KwD+fRc7d6)G-AvA>k3%LnSYv-nYcEmxijmo}(wnJ6 zGz!e*p?SD_rU)hi2Y|*;_kyYX39d#BYw!)l4xt@XP>0#0X^THn{uPv2@c#iaJX6>5 z2XA}P9~&abPsT0<%B8FiFi<&a^qfdX{w73bg}JP=-9Fa@gEEoR9R6Cpm0{JOUqghj z&>a44PI&Fc9s0NNtAovS69vf`IbHzT0ne4eW1emb44TP2z(GNl$*x@j4)`zMn;75g zTmi;Z?YZF1QbuqE4sO$6Rg3lFT93;RV zkmbPVb~_gK(r|UslxwGkdAwo4E&@y@#2)99glCU}vu6PuUHtzaj;`zXBw*dRBme>3 z(hLGclNv8rjqDHmZ!GcMq&s{ngE(j0=xSbnaML)j_!>o1yK|4)!TOVGU@h* zfFjoU%vLmtFl&BKr6%5$*Z1Yk{tN$H>ZWjTx!nzA23&|B3k9-HcN8U$Kn|?aPbN$Q zvvAM}IPGvQ3TWN;H$l{sBL^%e3I=5mFnWU)y|;XSJj~svm+?VoW*ell$`B-VzTYXP z#!N`6WOq5F&Eu_=cP%(M_fRtuPngofXnL6@*TU%{ix}b_448nCAmaMJJ4hpt4$`=` zEWUg#fa3X3M1f!Imqm&k2)8H!�DdYtz5S*Q(D%>eZ94``)-}Q=Xt(?T(xS%BTWX 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

+

{loading ? : details?.host?.hostname}

@@ -93,8 +96,8 @@ export const HostDetailsFlyout = memo(() => { <> {show === 'details' && ( <> - - + + )} @@ -105,31 +108,31 @@ export const HostDetailsFlyout = memo(() => { ); }); -HostDetailsFlyout.displayName = 'HostDetailsFlyout'; +EndpointDetailsFlyout.displayName = 'EndpointDetailsFlyout'; const PolicyResponseFlyoutPanel = memo<{ hostMeta: HostMetadata; }>(({ hostMeta }) => { - const { show, ...queryParams } = useHostSelector(uiQueryParams); - const responseConfig = useHostSelector(policyResponseConfigurations); - const responseActions = useHostSelector(policyResponseActions); - const responseAttentionCount = useHostSelector(policyResponseFailedOrWarningActionCount); - const loading = useHostSelector(policyResponseLoading); - const error = useHostSelector(policyResponseError); + const { show, ...queryParams } = useEndpointSelector(uiQueryParams); + const responseConfig = useEndpointSelector(policyResponseConfigurations); + const responseActions = useEndpointSelector(policyResponseActions); + const responseAttentionCount = useEndpointSelector(policyResponseFailedOrWarningActionCount); + const loading = useEndpointSelector(policyResponseLoading); + const error = useEndpointSelector(policyResponseError); const { formatUrl } = useFormatUrl(SecurityPageName.administration); const [detailsUri, detailsRoutePath] = useMemo( () => [ formatUrl( - getHostListPath({ - name: 'hostList', + getEndpointListPath({ + name: 'endpointList', ...queryParams, - selected_host: hostMeta.host.id, + selected_endpoint: hostMeta.host.id, }) ), - getHostListPath({ - name: 'hostList', + getEndpointListPath({ + name: 'endpointList', ...queryParams, - selected_host: hostMeta.host.id, + selected_endpoint: hostMeta.host.id, }), ], [hostMeta.host.id, formatUrl, queryParams] @@ -137,7 +140,7 @@ const PolicyResponseFlyoutPanel = memo<{ const backToDetailsClickHandler = useNavigateByRouterEventHandler(detailsRoutePath); const backButtonProp = useMemo((): FlyoutSubHeaderProps['backButton'] => { return { - title: i18n.translate('xpack.securitySolution.endpoint.host.policyResponse.backLinkTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.policyResponse.backLinkTitle', { defaultMessage: 'Endpoint Details', }), href: detailsUri, @@ -149,13 +152,13 @@ const PolicyResponseFlyoutPanel = memo<{ <> - - + +

@@ -164,7 +167,7 @@ const PolicyResponseFlyoutPanel = memo<{ } diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx index 3a1dd180405e..231e301a93aa 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response.tsx @@ -90,7 +90,7 @@ const ResponseActions = memo(

{formatResponse(key)}

@@ -162,7 +162,7 @@ export const PolicyResponse = memo( attentionCount > 0 && ( {attentionCount} diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts index 020e8c9e38ad..07ab38fd5277 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/policy_response_friendly_names.ts @@ -9,198 +9,189 @@ import { i18n } from '@kbn/i18n'; const policyResponses: Array<[string, string]> = [ [ 'configure_dns_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_dns_events', - { defaultMessage: 'Configure DNS Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_dns_events', { + defaultMessage: 'Configure DNS Events', + }), ], [ 'configure_elasticsearch_connection', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_elasticsearch_connection', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_elasticsearch_connection', { defaultMessage: 'Configure Elastic Search Connection' } ), ], [ 'configure_file_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_file_events', - { defaultMessage: 'Configure File Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_file_events', { + defaultMessage: 'Configure File Events', + }), ], [ 'configure_imageload_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_imageload_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_imageload_events', { defaultMessage: 'Configure Image Load Events' } ), ], [ 'configure_kernel', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_kernel', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_kernel', { defaultMessage: 'Configure Kernel', }), ], [ 'configure_logging', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_logging', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_logging', { defaultMessage: 'Configure Logging', }), ], [ 'configure_malware', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_malware', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.configure_malware', { defaultMessage: 'Configure Malware', }), ], [ 'configure_network_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_network_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_network_events', { defaultMessage: 'Configure Network Events' } ), ], [ 'configure_process_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_process_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_process_events', { defaultMessage: 'Configure Process Events' } ), ], [ 'configure_registry_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_registry_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_registry_events', { defaultMessage: 'Configure Registry Events' } ), ], [ 'configure_security_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_security_events', + 'xpack.securitySolution.endpoint.details.policyResponse.configure_security_events', { defaultMessage: 'Configure Security Events' } ), ], [ 'connect_kernel', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.connect_kernel', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.connect_kernel', { defaultMessage: 'Connect Kernel', }), ], [ 'detect_async_image_load_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_async_image_load_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_async_image_load_events', { defaultMessage: 'Detect Async Image Load Events' } ), ], [ 'detect_file_open_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_open_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_file_open_events', { defaultMessage: 'Detect File Open Events' } ), ], [ 'detect_file_write_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_write_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_file_write_events', { defaultMessage: 'Detect File Write Events' } ), ], [ 'detect_network_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_network_events', - { defaultMessage: 'Detect Network Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.detect_network_events', { + defaultMessage: 'Detect Network Events', + }), ], [ 'detect_process_events', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_process_events', - { defaultMessage: 'Detect Process Events' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.detect_process_events', { + defaultMessage: 'Detect Process Events', + }), ], [ 'detect_registry_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_registry_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_registry_events', { defaultMessage: 'Detect Registry Events' } ), ], [ 'detect_sync_image_load_events', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_sync_image_load_events', + 'xpack.securitySolution.endpoint.details.policyResponse.detect_sync_image_load_events', { defaultMessage: 'Detect Sync Image Load Events' } ), ], [ 'download_global_artifacts', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.download_global_artifacts', + 'xpack.securitySolution.endpoint.details.policyResponse.download_global_artifacts', { defaultMessage: 'Download Global Artifacts' } ), ], [ 'download_user_artifacts', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.download_user_artifacts', + 'xpack.securitySolution.endpoint.details.policyResponse.download_user_artifacts', { defaultMessage: 'Download User Artifacts' } ), ], [ 'load_config', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.load_config', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.load_config', { defaultMessage: 'Load Config', }), ], [ 'load_malware_model', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.load_malware_model', - { defaultMessage: 'Load Malware Model' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.load_malware_model', { + defaultMessage: 'Load Malware Model', + }), ], [ 'read_elasticsearch_config', i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_elasticsearch_config', + 'xpack.securitySolution.endpoint.details.policyResponse.read_elasticsearch_config', { defaultMessage: 'Read ElasticSearch Config' } ), ], [ 'read_events_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_events_config', - { defaultMessage: 'Read Events Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_events_config', { + defaultMessage: 'Read Events Config', + }), ], [ 'read_kernel_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_kernel_config', - { defaultMessage: 'Read Kernel Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_kernel_config', { + defaultMessage: 'Read Kernel Config', + }), ], [ 'read_logging_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_logging_config', - { defaultMessage: 'Read Logging Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_logging_config', { + defaultMessage: 'Read Logging Config', + }), ], [ 'read_malware_config', - i18n.translate( - 'xpack.securitySolution.endpoint.hostDetails.policyResponse.read_malware_config', - { defaultMessage: 'Read Malware Config' } - ), + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.read_malware_config', { + defaultMessage: 'Read Malware Config', + }), ], [ 'workflow', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.workflow', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.workflow', { defaultMessage: 'Workflow', }), ], @@ -211,43 +202,43 @@ const responseMap = new Map(policyResponses); // Additional values used in the Policy Response UI responseMap.set( 'success', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.success', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.success', { defaultMessage: 'Success', }) ); responseMap.set( 'warning', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.warning', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.warning', { defaultMessage: 'Warning', }) ); responseMap.set( 'failure', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.failed', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.failed', { defaultMessage: 'Failed', }) ); responseMap.set( 'logging', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.logging', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.logging', { defaultMessage: 'Logging', }) ); responseMap.set( 'streaming', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.streaming', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.streaming', { defaultMessage: 'Streaming', }) ); responseMap.set( 'malware', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.malware', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.malware', { defaultMessage: 'Malware', }) ); responseMap.set( 'events', - i18n.translate('xpack.securitySolution.endpoint.hostDetails.policyResponse.events', { + i18n.translate('xpack.securitySolution.endpoint.details.policyResponse.events', { defaultMessage: 'Events', }) ); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts index d11335df875e..a9c84678c88a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks.ts @@ -7,16 +7,18 @@ import { useSelector } from 'react-redux'; import { useMemo } from 'react'; import { useKibana } from '../../../../common/lib/kibana'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; import { - MANAGEMENT_STORE_HOSTS_NAMESPACE, + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_GLOBAL_NAMESPACE, } from '../../../common/constants'; import { State } from '../../../../common/store'; -export function useHostSelector(selector: (state: HostState) => TSelected) { +export function useEndpointSelector(selector: (state: EndpointState) => TSelected) { return useSelector(function (state: State) { return selector( - state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_HOSTS_NAMESPACE] as HostState + state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][ + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE + ] as EndpointState ); }); } diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index bb6003f73714..09df6d6ece04 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -7,12 +7,12 @@ import React from 'react'; import * as reactTestingLibrary from '@testing-library/react'; -import { HostList } from './index'; +import { EndpointList } from './index'; import { - mockHostDetailsApiResult, - mockHostResultList, - setHostListApiMockImplementation, -} from '../store/mock_host_result_list'; + mockEndpointDetailsApiResult, + mockEndpointResultList, + setEndpointListApiMockImplementation, +} from '../store/mock_endpoint_result_list'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; import { HostInfo, @@ -27,7 +27,7 @@ import { mockPolicyResultList } from '../../policy/store/policy_list/test_mock_u jest.mock('../../../../common/components/link_to'); -describe('when on the hosts page', () => { +describe('when on the list page', () => { const docGenerator = new EndpointDocGenerator(); let render: () => ReturnType; let history: AppContextTestRender['history']; @@ -38,9 +38,9 @@ describe('when on the hosts page', () => { beforeEach(() => { const mockedContext = createAppRootMockRenderer(); ({ history, store, coreStart, middlewareSpy } = mockedContext); - render = () => mockedContext.render(); + render = () => mockedContext.render(); reactTestingLibrary.act(() => { - history.push('/hosts'); + history.push('/endpoints'); }); }); @@ -50,10 +50,10 @@ describe('when on the hosts page', () => { expect(timelineFlyout).toBeNull(); }); - describe('when there are no hosts or polices', () => { + describe('when there are no endpoints or polices', () => { beforeEach(() => { - setHostListApiMockImplementation(coreStart.http, { - hostsResults: [], + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: [], }); }); @@ -70,8 +70,8 @@ describe('when on the hosts page', () => { describe('when there are policies, but no hosts', () => { beforeEach(async () => { - setHostListApiMockImplementation(coreStart.http, { - hostsResults: [], + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: [], endpointPackageConfigs: mockPolicyResultList({ total: 3 }).items, }); }); @@ -111,7 +111,7 @@ describe('when on the hosts page', () => { it('should not show the flyout', () => { const renderResult = render(); expect.assertions(1); - return renderResult.findByTestId('hostDetailsFlyout').catch((e) => { + return renderResult.findByTestId('endpointDetailsFlyout').catch((e) => { expect(e).not.toBeNull(); }); }); @@ -122,7 +122,7 @@ describe('when on the hosts page', () => { let firstPolicyID: string; beforeEach(() => { reactTestingLibrary.act(() => { - const hostListData = mockHostResultList({ total: 4 }).hosts; + const hostListData = mockEndpointResultList({ total: 4 }).hosts; firstPolicyID = hostListData[0].metadata.Endpoint.policy.applied.id; @@ -142,8 +142,8 @@ describe('when on the hosts page', () => { const ingestPackageConfigs = mockPolicyResultList({ total: 1 }).items; ingestPackageConfigs[0].id = firstPolicyID; - setHostListApiMockImplementation(coreStart.http, { - hostsResults: hostListData, + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: hostListData, endpointPackageConfigs: ingestPackageConfigs, }); }); @@ -152,7 +152,7 @@ describe('when on the hosts page', () => { it('should display rows in the table', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const rows = await renderResult.findAllByRole('row'); expect(rows).toHaveLength(5); @@ -160,15 +160,15 @@ describe('when on the hosts page', () => { it('should show total', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); - const total = await renderResult.findByTestId('hostListTableTotal'); + const total = await renderResult.findByTestId('endpointListTableTotal'); expect(total.textContent).toEqual('4 Hosts'); }); it('should display correct status', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const hostStatuses = await renderResult.findAllByTestId('rowHostStatus'); @@ -194,7 +194,7 @@ describe('when on the hosts page', () => { it('should display correct policy status', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const policyStatuses = await renderResult.findAllByTestId('rowPolicyStatus'); @@ -213,7 +213,7 @@ describe('when on the hosts page', () => { it('should display policy name as a link', async () => { const renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const firstPolicyName = (await renderResult.findAllByTestId('policyNameCellLink'))[0]; expect(firstPolicyName).not.toBeNull(); @@ -225,7 +225,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { renderResult = render(); await reactTestingLibrary.act(async () => { - await middlewareSpy.waitForAction('serverReturnedHostList'); + await middlewareSpy.waitForAction('serverReturnedEndpointList'); }); const hostNameLinks = await renderResult.findAllByTestId('hostnameCellLink'); if (hostNameLinks.length) { @@ -234,7 +234,7 @@ describe('when on the hosts page', () => { }); it('should show the flyout', () => { - return renderResult.findByTestId('hostDetailsFlyout').then((flyout) => { + return renderResult.findByTestId('endpointDetailsFlyout').then((flyout) => { expect(flyout).not.toBeNull(); }); }); @@ -298,12 +298,12 @@ describe('when on the hosts page', () => { return policyResponse; }; - const dispatchServerReturnedHostPolicyResponse = ( + const dispatchServerReturnedEndpointPolicyResponse = ( overallStatus: HostPolicyResponseActionStatus = HostPolicyResponseActionStatus.success ) => { reactTestingLibrary.act(() => { store.dispatch({ - type: 'serverReturnedHostPolicyResponse', + type: 'serverReturnedEndpointPolicyResponse', payload: { policy_response: createPolicyResponse(overallStatus), }, @@ -316,7 +316,7 @@ describe('when on the hosts page', () => { // eslint-disable-next-line @typescript-eslint/naming-convention host_status, metadata: { host, ...details }, - } = mockHostDetailsApiResult(); + } = mockEndpointDetailsApiResult(); hostDetails = { host_status, @@ -334,18 +334,18 @@ describe('when on the hosts page', () => { const policy = docGenerator.generatePolicyPackageConfig(); policy.id = hostDetails.metadata.Endpoint.policy.applied.id; - setHostListApiMockImplementation(coreStart.http, { - hostsResults: [hostDetails], + setEndpointListApiMockImplementation(coreStart.http, { + endpointsResults: [hostDetails], endpointPackageConfigs: [policy], }); reactTestingLibrary.act(() => { - history.push('/hosts?selected_host=1'); + history.push('/endpoints?selected_endpoint=1'); }); renderAndWaitForData = async () => { const renderResult = render(); - await middlewareSpy.waitForAction('serverReturnedHostDetails'); + await middlewareSpy.waitForAction('serverReturnedEndpointDetails'); return renderResult; }; }); @@ -355,7 +355,7 @@ describe('when on the hosts page', () => { it('should show the flyout', async () => { const renderResult = await renderAndWaitForData(); - return renderResult.findByTestId('hostDetailsFlyout').then((flyout) => { + return renderResult.findByTestId('endpointDetailsFlyout').then((flyout) => { expect(flyout).not.toBeNull(); }); }); @@ -387,7 +387,7 @@ describe('when on the hosts page', () => { const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink).not.toBeNull(); expect(policyStatusLink.getAttribute('href')).toEqual( - '/hosts?page_index=0&page_size=10&selected_host=1&show=policy_response' + '/endpoints?page_index=0&page_size=10&selected_endpoint=1&show=policy_response' ); }); @@ -400,14 +400,14 @@ describe('when on the hosts page', () => { }); const changedUrlAction = await userChangedUrlChecker; expect(changedUrlAction.payload.search).toEqual( - '?page_index=0&page_size=10&selected_host=1&show=policy_response' + '?page_index=0&page_size=10&selected_endpoint=1&show=policy_response' ); }); it('should display Success overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.success); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.success); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Success'); @@ -421,7 +421,7 @@ describe('when on the hosts page', () => { it('should display Warning overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.warning); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.warning); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Warning'); @@ -435,7 +435,7 @@ describe('when on the hosts page', () => { it('should display Failed overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.failure); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.failure); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Failed'); @@ -449,7 +449,7 @@ describe('when on the hosts page', () => { it('should display Unknown overall policy status', async () => { const renderResult = await renderAndWaitForData(); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse('' as HostPolicyResponseActionStatus); + dispatchServerReturnedEndpointPolicyResponse('' as HostPolicyResponseActionStatus); }); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusLink.textContent).toEqual('Unknown'); @@ -463,7 +463,7 @@ describe('when on the hosts page', () => { it('should include the link to reassignment in Ingest', async () => { coreStart.application.getUrlForApp.mockReturnValue('/app/ingestManager'); const renderResult = await renderAndWaitForData(); - const linkToReassign = await renderResult.findByTestId('hostDetailsLinkToIngest'); + const linkToReassign = await renderResult.findByTestId('endpointDetailsLinkToIngest'); expect(linkToReassign).not.toBeNull(); expect(linkToReassign.textContent).toEqual('Reassign Configuration'); expect(linkToReassign.getAttribute('href')).toEqual( @@ -475,7 +475,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { coreStart.application.getUrlForApp.mockReturnValue('/app/ingestManager'); const renderResult = await renderAndWaitForData(); - const linkToReassign = await renderResult.findByTestId('hostDetailsLinkToIngest'); + const linkToReassign = await renderResult.findByTestId('endpointDetailsLinkToIngest'); reactTestingLibrary.act(() => { reactTestingLibrary.fireEvent.click(linkToReassign); }); @@ -491,7 +491,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { coreStart.http.post.mockImplementation(async (requestOptions) => { if (requestOptions.path === '/api/endpoint/metadata') { - return mockHostResultList({ total: 0 }); + return mockEndpointResultList({ total: 0 }); } throw new Error(`POST to '${requestOptions.path}' does not have a mock response!`); }); @@ -502,44 +502,44 @@ describe('when on the hosts page', () => { reactTestingLibrary.fireEvent.click(policyStatusLink); }); await userChangedUrlChecker; - await middlewareSpy.waitForAction('serverReturnedHostPolicyResponse'); + await middlewareSpy.waitForAction('serverReturnedEndpointPolicyResponse'); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(); + dispatchServerReturnedEndpointPolicyResponse(); }); }); afterEach(reactTestingLibrary.cleanup); it('should hide the host details panel', async () => { - const hostDetailsFlyout = await renderResult.queryByTestId('hostDetailsFlyoutBody'); - expect(hostDetailsFlyout).toBeNull(); + const endpointDetailsFlyout = await renderResult.queryByTestId('endpointDetailsFlyoutBody'); + expect(endpointDetailsFlyout).toBeNull(); }); it('should display policy response sub-panel', async () => { expect( - await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutHeader') + await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutHeader') ).not.toBeNull(); expect( - await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutBody') + await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutBody') ).not.toBeNull(); }); it('should include the sub-panel title', async () => { expect( - (await renderResult.findByTestId('hostDetailsPolicyResponseFlyoutTitle')).textContent + (await renderResult.findByTestId('endpointDetailsPolicyResponseFlyoutTitle')).textContent ).toBe('Configuration Response'); }); it('should show a configuration section for each protection', async () => { const configAccordions = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseConfigAccordion' + 'endpointDetailsPolicyResponseConfigAccordion' ); expect(configAccordions).not.toBeNull(); }); it('should show an actions section for each configuration', async () => { const actionAccordions = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseActionsAccordion' + 'endpointDetailsPolicyResponseActionsAccordion' ); const action = await renderResult.findAllByTestId('policyResponseAction'); const statusHealth = await renderResult.findAllByTestId('policyResponseStatusHealth'); @@ -557,14 +557,14 @@ describe('when on the hosts page', () => { ); reactTestingLibrary.act(() => { store.dispatch({ - type: 'serverReturnedHostPolicyResponse', + type: 'serverReturnedEndpointPolicyResponse', payload: { policy_response: policyResponse, }, }); }); return renderResult - .findAllByTestId('hostDetailsPolicyResponseAttentionBadge') + .findAllByTestId('endpointDetailsPolicyResponseAttentionBadge') .catch((e) => { expect(e).not.toBeNull(); }); @@ -572,28 +572,28 @@ describe('when on the hosts page', () => { it('should show a numbered badge if at least one action failed', async () => { const policyResponseActionDispatched = middlewareSpy.waitForAction( - 'serverReturnedHostPolicyResponse' + 'serverReturnedEndpointPolicyResponse' ); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.failure); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.failure); }); await policyResponseActionDispatched; const attentionBadge = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseAttentionBadge' + 'endpointDetailsPolicyResponseAttentionBadge' ); expect(attentionBadge).not.toBeNull(); }); it('should show a numbered badge if at least one action has a warning', async () => { const policyResponseActionDispatched = middlewareSpy.waitForAction( - 'serverReturnedHostPolicyResponse' + 'serverReturnedEndpointPolicyResponse' ); reactTestingLibrary.act(() => { - dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.warning); + dispatchServerReturnedEndpointPolicyResponse(HostPolicyResponseActionStatus.warning); }); await policyResponseActionDispatched; const attentionBadge = await renderResult.findAllByTestId( - 'hostDetailsPolicyResponseAttentionBadge' + 'endpointDetailsPolicyResponseAttentionBadge' ); expect(attentionBadge).not.toBeNull(); }); @@ -602,7 +602,7 @@ describe('when on the hosts page', () => { const subHeaderBackLink = await renderResult.findByTestId('flyoutSubHeaderBackButton'); expect(subHeaderBackLink.textContent).toBe('Endpoint Details'); expect(subHeaderBackLink.getAttribute('href')).toBe( - '/hosts?page_index=0&page_size=10&selected_host=1' + '/endpoints?page_index=0&page_size=10&selected_endpoint=1' ); }); @@ -614,7 +614,7 @@ describe('when on the hosts page', () => { }); const changedUrlAction = await userChangedUrlChecker; expect(changedUrlAction.payload.search).toEqual( - '?page_index=0&page_size=10&selected_host=1' + '?page_index=0&page_size=10&selected_endpoint=1' ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index cdea4bfcf9f8..a923d49012d7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -25,9 +25,9 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { createStructuredSelector } from 'reselect'; import { useDispatch } from 'react-redux'; -import { HostDetailsFlyout } from './details'; +import { EndpointDetailsFlyout } from './details'; import * as selectors from '../store/selectors'; -import { useHostSelector } from './hooks'; +import { useEndpointSelector } from './hooks'; import { HOST_STATUS_TO_HEALTH_COLOR, POLICY_STATUS_TO_HEALTH_COLOR, @@ -46,12 +46,12 @@ import { AgentConfigDetailsDeployAgentAction, } from '../../../../../../ingest_manager/public'; import { SecurityPageName } from '../../../../app/types'; -import { getHostListPath, getHostDetailsPath } from '../../../common/routing'; +import { getEndpointListPath, getEndpointDetailsPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; -import { HostAction } from '../store/action'; -import { HostPolicyLink } from './components/host_policy_link'; +import { EndpointAction } from '../store/action'; +import { EndpointPolicyLink } from './components/endpoint_policy_link'; -const HostListNavLink = memo<{ +const EndpointListNavLink = memo<{ name: string; href: string; route: string; @@ -71,10 +71,10 @@ const HostListNavLink = memo<{ ); }); -HostListNavLink.displayName = 'HostListNavLink'; +EndpointListNavLink.displayName = 'EndpointListNavLink'; const selector = (createStructuredSelector as CreateStructuredSelector)(selectors); -export const HostList = () => { +export const EndpointList = () => { const history = useHistory(); const { listData, @@ -84,16 +84,16 @@ export const HostList = () => { listLoading: loading, listError, uiQueryParams: queryParams, - hasSelectedHost, + hasSelectedEndpoint, policyItems, selectedPolicyId, policyItemsLoading, endpointPackageVersion, - hostsExist, - } = useHostSelector(selector); + endpointsExist, + } = useEndpointSelector(selector); const { formatUrl, search } = useFormatUrl(SecurityPageName.administration); - const dispatch = useDispatch<(a: HostAction) => void>(); + const dispatch = useDispatch<(a: EndpointAction) => void>(); const paginationSetup = useMemo(() => { return { @@ -108,10 +108,10 @@ export const HostList = () => { const onTableChange = useCallback( ({ page }: { page: { index: number; size: number } }) => { const { index, size } = page; - // FIXME: PT: if host details is open, table is not displaying correct number of rows + // FIXME: PT: if endpoint details is open, table is not displaying correct number of rows history.push( - getHostListPath({ - name: 'hostList', + getEndpointListPath({ + name: 'endpointList', ...queryParams, page_index: JSON.stringify(index), page_size: JSON.stringify(size), @@ -130,12 +130,12 @@ export const HostList = () => { state: { onCancelNavigateTo: [ 'securitySolution:administration', - { path: getHostListPath({ name: 'hostList' }) }, + { path: getEndpointListPath({ name: 'endpointList' }) }, ], - onCancelUrl: formatUrl(getHostListPath({ name: 'hostList' })), + onCancelUrl: formatUrl(getEndpointListPath({ name: 'endpointList' })), onSaveNavigateTo: [ 'securitySolution:administration', - { path: getHostListPath({ name: 'hostList' }) }, + { path: getEndpointListPath({ name: 'endpointList' }) }, ], }, } @@ -148,7 +148,7 @@ export const HostList = () => { state: { onDoneNavigateTo: [ 'securitySolution:administration', - { path: getHostListPath({ name: 'hostList' }) }, + { path: getEndpointListPath({ name: 'endpointList' }) }, ], }, }); @@ -183,28 +183,28 @@ export const HostList = () => { ); const columns: Array>> = useMemo(() => { - const lastActiveColumnName = i18n.translate('xpack.securitySolution.endpointList.lastActive', { + const lastActiveColumnName = i18n.translate('xpack.securitySolution.endpoint.list.lastActive', { defaultMessage: 'Last Active', }); return [ { field: 'metadata.host', - name: i18n.translate('xpack.securitySolution.endpointList.hostname', { + name: i18n.translate('xpack.securitySolution.endpoint.list.hostname', { defaultMessage: 'Hostname', }), render: ({ hostname, id }: HostInfo['metadata']['host']) => { - const toRoutePath = getHostDetailsPath( + const toRoutePath = getEndpointDetailsPath( { ...queryParams, - name: 'hostDetails', - selected_host: id, + name: 'endpointDetails', + selected_endpoint: id, }, search ); const toRouteUrl = formatUrl(toRoutePath); return ( - { }, { field: 'host_status', - name: i18n.translate('xpack.securitySolution.endpointList.hostStatus', { - defaultMessage: 'Host Status', + name: i18n.translate('xpack.securitySolution.endpoint.list.hostStatus', { + defaultMessage: 'Agent Status', }), // eslint-disable-next-line react/display-name render: (hostStatus: HostInfo['host_status']) => { @@ -227,7 +227,7 @@ export const HostList = () => { className="eui-textTruncate" > @@ -237,33 +237,33 @@ export const HostList = () => { }, { field: 'metadata.Endpoint.policy.applied', - name: i18n.translate('xpack.securitySolution.endpointList.policy', { + name: i18n.translate('xpack.securitySolution.endpoint.list.policy', { defaultMessage: 'Integration', }), truncateText: true, // eslint-disable-next-line react/display-name render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied']) => { return ( - {policy.name} - + ); }, }, { field: 'metadata.Endpoint.policy.applied', - name: i18n.translate('xpack.securitySolution.endpointList.policyStatus', { + name: i18n.translate('xpack.securitySolution.endpoint.list.policyStatus', { defaultMessage: 'Configuration Status', }), render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { - const toRoutePath = getHostDetailsPath({ - name: 'hostPolicyResponse', + const toRoutePath = getEndpointDetailsPath({ + name: 'endpointPolicyResponse', ...queryParams, - selected_host: item.metadata.host.id, + selected_endpoint: item.metadata.host.id, }); const toRouteUrl = formatUrl(toRoutePath); return ( @@ -272,7 +272,7 @@ export const HostList = () => { className="eui-textTruncate" data-test-subj="rowPolicyStatus" > - { }, { field: 'metadata.host.os.name', - name: i18n.translate('xpack.securitySolution.endpointList.os', { + name: i18n.translate('xpack.securitySolution.endpoint.list.os', { defaultMessage: 'Operating System', }), truncateText: true, }, { field: 'metadata.host.ip', - name: i18n.translate('xpack.securitySolution.endpointList.ip', { + name: i18n.translate('xpack.securitySolution.endpoint.list.ip', { defaultMessage: 'IP Address', }), // eslint-disable-next-line react/display-name @@ -309,7 +309,7 @@ export const HostList = () => { }, { field: 'metadata.agent.version', - name: i18n.translate('xpack.securitySolution.endpointList.endpointVersion', { + name: i18n.translate('xpack.securitySolution.endpoint.list.endpointVersion', { defaultMessage: 'Version', }), }, @@ -330,10 +330,10 @@ export const HostList = () => { }, [formatUrl, queryParams, search]); const renderTableOrEmptyState = useMemo(() => { - if (hostsExist) { + if (endpointsExist) { return ( { } }, [ loading, - hostsExist, + endpointsExist, policyItemsLoading, policyItems, listData, @@ -377,7 +377,7 @@ export const HostList = () => { return ( @@ -385,15 +385,15 @@ export const HostList = () => {

@@ -403,7 +403,7 @@ export const HostList = () => {

@@ -411,12 +411,12 @@ export const HostList = () => { } > - {hasSelectedHost && } + {hasSelectedEndpoint && } {listData && listData.length > 0 && ( <> - + diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts index a14f1d0d0dd6..c421f513556f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/url_from_query_params.ts @@ -7,10 +7,10 @@ // eslint-disable-next-line import/no-nodejs-modules import querystring from 'querystring'; -import { HostIndexUIQueryParams } from '../types'; +import { EndpointIndexUIQueryParams } from '../types'; import { AppLocation } from '../../../../../common/endpoint/types'; -export function urlFromQueryParams(queryParams: HostIndexUIQueryParams): Partial { +export function urlFromQueryParams(queryParams: EndpointIndexUIQueryParams): Partial { const search = querystring.stringify(queryParams); return { search, diff --git a/x-pack/plugins/security_solution/public/management/pages/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/index.test.tsx index 5ec42671ec3d..9e496ce6c0b5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.test.tsx @@ -30,7 +30,7 @@ describe('when in the Admistration tab', () => { it('should display the Management view when Ingest is ON', async () => { (useIngestEnabledCheck as jest.Mock).mockReturnValue({ allEnabled: true }); const renderResult = render(); - const hostPage = await renderResult.findByTestId('hostPage'); - expect(hostPage).not.toBeNull(); + const endpointPage = await renderResult.findByTestId('endpointPage'); + expect(endpointPage).not.toBeNull(); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/index.tsx b/x-pack/plugins/security_solution/public/management/pages/index.tsx index 3e1c0743fb4f..c20a3dd31d6a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/index.tsx @@ -13,24 +13,24 @@ import { EuiText, EuiEmptyPrompt } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { PolicyContainer } from './policy'; import { - MANAGEMENT_ROUTING_HOSTS_PATH, + MANAGEMENT_ROUTING_ENDPOINTS_PATH, MANAGEMENT_ROUTING_POLICIES_PATH, MANAGEMENT_ROUTING_ROOT_PATH, } from '../common/constants'; import { NotFoundPage } from '../../app/404'; -import { HostsContainer } from './endpoint_hosts'; -import { getHostListPath } from '../common/routing'; +import { EndpointsContainer } from './endpoint_hosts'; +import { getEndpointListPath } from '../common/routing'; import { APP_ID, SecurityPageName } from '../../../common/constants'; import { GetUrlForApp } from '../../common/components/navigation/types'; import { AdministrationRouteSpyState } from '../../common/utils/route/types'; import { ADMINISTRATION } from '../../app/home/translations'; import { AdministrationSubTab } from '../types'; -import { HOSTS_TAB, POLICIES_TAB } from '../common/translations'; +import { ENDPOINTS_TAB, POLICIES_TAB } from '../common/translations'; import { SpyRoute } from '../../common/utils/route/spy_routes'; import { useIngestEnabledCheck } from '../../common/hooks/endpoint/ingest_enabled'; const TabNameMappedToI18nKey: Record = { - [AdministrationSubTab.hosts]: HOSTS_TAB, + [AdministrationSubTab.endpoints]: ENDPOINTS_TAB, [AdministrationSubTab.policies]: POLICIES_TAB, }; @@ -102,13 +102,13 @@ export const ManagementContainer = memo(() => { return ( - + { - history.replace(getHostListPath({ name: 'hostList' })); + history.replace(getEndpointListPath({ name: 'endpointList' })); return null; }} /> diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx index 921493e239c0..5dbd1b6ff491 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/agents_summary.tsx @@ -34,7 +34,7 @@ export const AgentsSummary = memo((props) => { title: i18n.translate( 'xpack.securitySolution.endpoint.policyDetails.agentsSummary.totalTitle', { - defaultMessage: 'Hosts', + defaultMessage: 'Endpoints', } ), health: '', diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx index c81ffb0060c8..c934cfb94fc7 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import { PolicyDetails } from './policy_details'; import { EndpointDocGenerator } from '../../../../../common/endpoint/generate_data'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../../common/mock/endpoint'; -import { getPolicyDetailPath, getHostListPath } from '../../../common/routing'; +import { getPolicyDetailPath, getEndpointListPath } from '../../../common/routing'; import { policyListApiPathHandlers } from '../store/policy_list/test_mock_utils'; jest.mock('../../../../common/components/link_to'); @@ -19,7 +19,7 @@ describe('Policy Details', () => { type FindReactWrapperResponse = ReturnType['find']>; const policyDetailsPathUrl = getPolicyDetailPath('1'); - const hostListPath = getHostListPath({ name: 'hostList' }); + const endpointListPath = getEndpointListPath({ name: 'endpointList' }); const sleep = (ms = 100) => new Promise((wakeup) => setTimeout(wakeup, ms)); const generator = new EndpointDocGenerator(); let history: AppContextTestRender['history']; @@ -129,7 +129,7 @@ describe('Policy Details', () => { const backToListButton = pageHeaderLeft.find('EuiButtonEmpty'); expect(backToListButton.prop('iconType')).toBe('arrowLeft'); - expect(backToListButton.prop('href')).toBe(hostListPath); + expect(backToListButton.prop('href')).toBe(endpointListPath); expect(backToListButton.text()).toBe('Back to endpoint hosts'); const pageTitle = pageHeaderLeft.find('[data-test-subj="pageViewHeaderLeftTitle"]'); @@ -143,7 +143,7 @@ describe('Policy Details', () => { ); expect(history.location.pathname).toEqual(policyDetailsPathUrl); backToListButton.simulate('click', { button: 0 }); - expect(history.location.pathname).toEqual(hostListPath); + expect(history.location.pathname).toEqual(endpointListPath); }); it('should display agent stats', async () => { await asyncActions; @@ -153,7 +153,7 @@ describe('Policy Details', () => { ); const agentsSummary = headerRight.find('EuiFlexGroup[data-test-subj="policyAgentsSummary"]'); expect(agentsSummary).toHaveLength(1); - expect(agentsSummary.text()).toBe('Hosts5Online3Offline1Error1'); + expect(agentsSummary.text()).toBe('Endpoints5Online3Offline1Error1'); }); it('should display cancel button', async () => { await asyncActions; @@ -175,7 +175,7 @@ describe('Policy Details', () => { const navigateToAppMockedCalls = coreStart.application.navigateToApp.mock.calls; expect(navigateToAppMockedCalls[navigateToAppMockedCalls.length - 1]).toEqual([ 'securitySolution:administration', - { path: hostListPath }, + { path: endpointListPath }, ]); }); it('should display save button', async () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index d309faf59d04..e54e684d788c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -43,7 +43,7 @@ import { PageViewHeaderTitle } from '../../../../common/components/endpoint/page import { ManagementPageView } from '../../../components/management_page_view'; import { SpyRoute } from '../../../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../../app/types'; -import { getHostListPath } from '../../../common/routing'; +import { getEndpointListPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { MANAGEMENT_APP_ID } from '../../../common/constants'; @@ -71,7 +71,7 @@ export const PolicyDetails = React.memo(() => { const [showConfirm, setShowConfirm] = useState(false); const [routeState, setRouteState] = useState(); const policyName = policyItem?.name ?? ''; - const hostListRouterPath = getHostListPath({ name: 'hostList' }); + const hostListRouterPath = getEndpointListPath({ name: 'endpointList' }); // Handle showing update statuses useEffect(() => { diff --git a/x-pack/plugins/security_solution/public/management/store/middleware.ts b/x-pack/plugins/security_solution/public/management/store/middleware.ts index a29da9bef587..c7a7d2cad062 100644 --- a/x-pack/plugins/security_solution/public/management/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/store/middleware.ts @@ -12,19 +12,19 @@ import { import { policyListMiddlewareFactory } from '../pages/policy/store/policy_list'; import { policyDetailsMiddlewareFactory } from '../pages/policy/store/policy_details'; import { - MANAGEMENT_STORE_HOSTS_NAMESPACE, + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_GLOBAL_NAMESPACE, MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE, MANAGEMENT_STORE_POLICY_LIST_NAMESPACE, } from '../common/constants'; -import { hostMiddlewareFactory } from '../pages/endpoint_hosts/store/middleware'; +import { endpointMiddlewareFactory } from '../pages/endpoint_hosts/store/middleware'; const policyListSelector = (state: State) => state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_POLICY_LIST_NAMESPACE]; const policyDetailsSelector = (state: State) => state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE]; const endpointsSelector = (state: State) => - state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_HOSTS_NAMESPACE]; + state[MANAGEMENT_STORE_GLOBAL_NAMESPACE][MANAGEMENT_STORE_ENDPOINTS_NAMESPACE]; export const managementMiddlewareFactory: SecuritySubPluginMiddlewareFactory = ( coreStart, @@ -39,6 +39,6 @@ export const managementMiddlewareFactory: SecuritySubPluginMiddlewareFactory = ( policyDetailsSelector, policyDetailsMiddlewareFactory(coreStart, depsStart) ), - substateMiddlewareFactory(endpointsSelector, hostMiddlewareFactory(coreStart, depsStart)), + substateMiddlewareFactory(endpointsSelector, endpointMiddlewareFactory(coreStart, depsStart)), ]; }; diff --git a/x-pack/plugins/security_solution/public/management/store/reducer.ts b/x-pack/plugins/security_solution/public/management/store/reducer.ts index f3c470fb1e8a..eafd69c875ff 100644 --- a/x-pack/plugins/security_solution/public/management/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/store/reducer.ts @@ -14,14 +14,17 @@ import { initialPolicyListState, } from '../pages/policy/store/policy_list/reducer'; import { - MANAGEMENT_STORE_HOSTS_NAMESPACE, + MANAGEMENT_STORE_ENDPOINTS_NAMESPACE, MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE, MANAGEMENT_STORE_POLICY_LIST_NAMESPACE, } from '../common/constants'; import { ImmutableCombineReducers } from '../../common/store'; import { Immutable } from '../../../common/endpoint/types'; import { ManagementState } from '../types'; -import { hostListReducer, initialHostListState } from '../pages/endpoint_hosts/store/reducer'; +import { + endpointListReducer, + initialEndpointListState, +} from '../pages/endpoint_hosts/store/reducer'; const immutableCombineReducers: ImmutableCombineReducers = combineReducers; @@ -31,7 +34,7 @@ const immutableCombineReducers: ImmutableCombineReducers = combineReducers; export const mockManagementState: Immutable = { [MANAGEMENT_STORE_POLICY_LIST_NAMESPACE]: initialPolicyListState(), [MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE]: initialPolicyDetailsState(), - [MANAGEMENT_STORE_HOSTS_NAMESPACE]: initialHostListState, + [MANAGEMENT_STORE_ENDPOINTS_NAMESPACE]: initialEndpointListState, }; /** @@ -40,5 +43,5 @@ export const mockManagementState: Immutable = { export const managementReducer = immutableCombineReducers({ [MANAGEMENT_STORE_POLICY_LIST_NAMESPACE]: policyListReducer, [MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE]: policyDetailsReducer, - [MANAGEMENT_STORE_HOSTS_NAMESPACE]: hostListReducer, + [MANAGEMENT_STORE_ENDPOINTS_NAMESPACE]: endpointListReducer, }); diff --git a/x-pack/plugins/security_solution/public/management/types.ts b/x-pack/plugins/security_solution/public/management/types.ts index 86959caaba4f..c35c9277b448 100644 --- a/x-pack/plugins/security_solution/public/management/types.ts +++ b/x-pack/plugins/security_solution/public/management/types.ts @@ -7,7 +7,7 @@ import { CombinedState } from 'redux'; import { SecurityPageName } from '../app/types'; import { PolicyListState, PolicyDetailsState } from './pages/policy/types'; -import { HostState } from './pages/endpoint_hosts/types'; +import { EndpointState } from './pages/endpoint_hosts/types'; /** * The type for the management store global namespace. Used mostly internally to reference @@ -18,14 +18,14 @@ export type ManagementStoreGlobalNamespace = 'management'; export type ManagementState = CombinedState<{ policyList: PolicyListState; policyDetails: PolicyDetailsState; - hosts: HostState; + endpoints: EndpointState; }>; /** * The management list of sub-tabs. Changes to these will impact the Router routes. */ export enum AdministrationSubTab { - hosts = 'hosts', + endpoints = 'endpoints', policies = 'policy', } diff --git a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx index 1d726a7dbd90..8b73253157ed 100644 --- a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx @@ -7,13 +7,13 @@ import React, { memo } from 'react'; import { EuiCallOut, EuiButton, EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { getHostListPath } from '../../../management/common/routing'; +import { getEndpointListPath } from '../../../management/common/routing'; import { useNavigateToAppEventHandler } from '../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { useManagementFormatUrl } from '../../../management/components/hooks/use_management_format_url'; import { MANAGEMENT_APP_ID } from '../../../management/common/constants'; export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => { - const endpointsPath = getHostListPath({ name: 'hostList' }); + const endpointsPath = getEndpointListPath({ name: 'endpointList' }); const endpointsLink = useManagementFormatUrl(endpointsPath); const handleGetStartedClick = useNavigateToAppEventHandler(MANAGEMENT_APP_ID, { path: endpointsPath, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 720ec2892093..f6d818df0d0f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16233,65 +16233,65 @@ "xpack.securitySolution.editDataProvider.valuePlaceholder": "値", "xpack.securitySolution.emptyMessage": "Elastic セキュリティは無料かつオープンのElastic SIEMに、Elastic Endpointを搭載。脅威の防御と検知、脅威への対応を支援します。開始するには、セキュリティソリューション関連データをElastic Stackに追加する必要があります。詳細については、ご覧ください ", "xpack.securitySolution.emptyString.emptyStringDescription": "空の文字列", - "xpack.securitySolution.endpoint.host.details.endpointVersion": "エンドポイントバージョン", - "xpack.securitySolution.endpoint.host.details.errorBody": "フライアウトを終了して、利用可能なホストを選択してください。", - "xpack.securitySolution.endpoint.host.details.errorTitle": "ホストが見つかりませんでした", - "xpack.securitySolution.endpoint.host.details.hostname": "ホスト名", - "xpack.securitySolution.endpoint.host.details.ipAddress": "IP アドレス", - "xpack.securitySolution.endpoint.host.details.lastSeen": "前回の認識", - "xpack.securitySolution.endpoint.host.details.linkToIngestTitle": "ポリシーの再割り当て", - "xpack.securitySolution.endpoint.host.details.os": "OS", - "xpack.securitySolution.endpoint.host.details.policy": "ポリシー", - "xpack.securitySolution.endpoint.host.details.policyStatus": "ポリシーステータス", - "xpack.securitySolution.endpoint.host.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失敗} other {不明}}", - "xpack.securitySolution.endpoint.host.policyResponse.backLinkTitle": "エンドポイント詳細", - "xpack.securitySolution.endpoint.host.policyResponse.title": "ポリシー応答", - "xpack.securitySolution.endpoint.hostDetails.noPolicyResponse": "ポリシー応答がありません", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_dns_events": "DNSイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_elasticsearch_connection": "Elastic Search接続の構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_file_events": "ファイルイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_imageload_events": "画像読み込みイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_kernel": "カーネルの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_logging": "ロギングの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_malware": "マルウェアの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_network_events": "ネットワークイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_process_events": "プロセスイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_registry_events": "レジストリイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_security_events": "セキュリティイベントの構成", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.connect_kernel": "カーネルを接続", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_async_image_load_events": "非同期画像読み込みイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_open_events": "ファイルオープンイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_write_events": "ファイル書き込みイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_network_events": "ネットワークイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_process_events": "プロセスイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_registry_events": "レジストリイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_sync_image_load_events": "同期画像読み込みイベントを検出", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_global_artifacts": "グローバルアーチファクトをダウンロード", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_user_artifacts": "ユーザーアーチファクトをダウンロード", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.events": "イベント", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.failed": "失敗", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_config": "構成の読み込み", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_malware_model": "マルウェアモデルの読み込み", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.logging": "ログ", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.malware": "マルウェア", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_elasticsearch_config": "Elasticsearch構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_events_config": "イベント構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_kernel_config": "カーネル構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_logging_config": "ロギング構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_malware_config": "マルウェア構成を読み取る", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.streaming": "ストリーム中…", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.success": "成功", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.warning": "警告", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.workflow": "ワークフロー", - "xpack.securitySolution.endpoint.hostList.beta": "ベータ", - "xpack.securitySolution.endpoint.hostList.loadingPolicies": "ポリシー構成を読み込んでいます…", - "xpack.securitySolution.endpoint.hostList.noEndpointsInstructions": "セキュリティポリシーを作成しました。以下のステップに従い、エージェントでElastic Endpoint Security機能を有効にする必要があります。", - "xpack.securitySolution.endpoint.hostList.noEndpointsPrompt": "エージェントでElastic Endpoint Securityを有効にする", - "xpack.securitySolution.endpoint.hostList.noPolicies": "ポリシーがありません。", - "xpack.securitySolution.endpoint.hostList.stepOne": "既存のポリシーは以下のリストのとおりです。これは後から変更できます。", - "xpack.securitySolution.endpoint.hostList.stepOneTitle": "ホストの保護で使用するポリシーを選択", - "xpack.securitySolution.endpoint.hostList.stepTwo": "開始するために必要なコマンドが提供されます。", - "xpack.securitySolution.endpoint.hostList.stepTwoTitle": "Ingest Manager経由でEndpoint Securityによって有効にされたエージェントを登録", + "xpack.securitySolution.endpoint.details.endpointVersion": "エンドポイントバージョン", + "xpack.securitySolution.endpoint.details.errorBody": "フライアウトを終了して、利用可能なホストを選択してください。", + "xpack.securitySolution.endpoint.details.errorTitle": "ホストが見つかりませんでした", + "xpack.securitySolution.endpoint.details.hostname": "ホスト名", + "xpack.securitySolution.endpoint.details.ipAddress": "IP アドレス", + "xpack.securitySolution.endpoint.details.lastSeen": "前回の認識", + "xpack.securitySolution.endpoint.details.linkToIngestTitle": "ポリシーの再割り当て", + "xpack.securitySolution.endpoint.details.os": "OS", + "xpack.securitySolution.endpoint.details.policy": "ポリシー", + "xpack.securitySolution.endpoint.details.policyStatus": "ポリシーステータス", + "xpack.securitySolution.endpoint.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失敗} other {不明}}", + "xpack.securitySolution.endpoint.policyResponse.backLinkTitle": "エンドポイント詳細", + "xpack.securitySolution.endpoint.policyResponse.title": "ポリシー応答", + "xpack.securitySolution.endpoint.details.noPolicyResponse": "ポリシー応答がありません", + "xpack.securitySolution.endpoint.details.policyResponse.configure_dns_events": "DNSイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_elasticsearch_connection": "Elastic Search接続の構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_file_events": "ファイルイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_imageload_events": "画像読み込みイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_kernel": "カーネルの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_logging": "ロギングの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_malware": "マルウェアの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_network_events": "ネットワークイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_process_events": "プロセスイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_registry_events": "レジストリイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.configure_security_events": "セキュリティイベントの構成", + "xpack.securitySolution.endpoint.details.policyResponse.connect_kernel": "カーネルを接続", + "xpack.securitySolution.endpoint.details.policyResponse.detect_async_image_load_events": "非同期画像読み込みイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_open_events": "ファイルオープンイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_write_events": "ファイル書き込みイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_network_events": "ネットワークイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_process_events": "プロセスイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_registry_events": "レジストリイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.detect_sync_image_load_events": "同期画像読み込みイベントを検出", + "xpack.securitySolution.endpoint.details.policyResponse.download_global_artifacts": "グローバルアーチファクトをダウンロード", + "xpack.securitySolution.endpoint.details.policyResponse.download_user_artifacts": "ユーザーアーチファクトをダウンロード", + "xpack.securitySolution.endpoint.details.policyResponse.events": "イベント", + "xpack.securitySolution.endpoint.details.policyResponse.failed": "失敗", + "xpack.securitySolution.endpoint.details.policyResponse.load_config": "構成の読み込み", + "xpack.securitySolution.endpoint.details.policyResponse.load_malware_model": "マルウェアモデルの読み込み", + "xpack.securitySolution.endpoint.details.policyResponse.logging": "ログ", + "xpack.securitySolution.endpoint.details.policyResponse.malware": "マルウェア", + "xpack.securitySolution.endpoint.details.policyResponse.read_elasticsearch_config": "Elasticsearch構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_events_config": "イベント構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_kernel_config": "カーネル構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_logging_config": "ロギング構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.read_malware_config": "マルウェア構成を読み取る", + "xpack.securitySolution.endpoint.details.policyResponse.streaming": "ストリーム中…", + "xpack.securitySolution.endpoint.details.policyResponse.success": "成功", + "xpack.securitySolution.endpoint.details.policyResponse.warning": "警告", + "xpack.securitySolution.endpoint.details.policyResponse.workflow": "ワークフロー", + "xpack.securitySolution.endpoint.list.beta": "ベータ", + "xpack.securitySolution.endpoint.list.loadingPolicies": "ポリシー構成を読み込んでいます…", + "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "セキュリティポリシーを作成しました。以下のステップに従い、エージェントでElastic Endpoint Security機能を有効にする必要があります。", + "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "エージェントでElastic Endpoint Securityを有効にする", + "xpack.securitySolution.endpoint.list.noPolicies": "ポリシーがありません。", + "xpack.securitySolution.endpoint.list.stepOne": "既存のポリシーは以下のリストのとおりです。これは後から変更できます。", + "xpack.securitySolution.endpoint.list.stepOneTitle": "ホストの保護で使用するポリシーを選択", + "xpack.securitySolution.endpoint.list.stepTwo": "開始するために必要なコマンドが提供されます。", + "xpack.securitySolution.endpoint.list.stepTwoTitle": "Ingest Manager経由でEndpoint Securityによって有効にされたエージェントを登録", "xpack.securitySolution.endpoint.ingestManager.createPackageConfig.endpointConfiguration": "このエージェント構成を使用するすべてのエージェントは基本ポリシーを使用します。セキュリティアプリでこのポリシーを変更できます。Fleetはこれらの変更をエージェントにデプロイします。", "xpack.securitySolution.endpoint.ingestToastMessage": "Ingest Managerが設定中に失敗しました。", "xpack.securitySolution.endpoint.ingestToastTitle": "アプリを初期化できませんでした", @@ -16412,16 +16412,16 @@ "xpack.securitySolution.endpoint.resolver.runningTrigger": "トリガーの実行中", "xpack.securitySolution.endpoint.resolver.terminatedProcess": "プロセスを中断しました", "xpack.securitySolution.endpoint.resolver.terminatedTrigger": "トリガーを中断しました", - "xpack.securitySolution.endpointList.endpointVersion": "バージョン", - "xpack.securitySolution.endpointList.hostname": "ホスト名", - "xpack.securitySolution.endpointList.hostStatus": "ホストステータス", - "xpack.securitySolution.endpointList.hostStatusValue": "{hostStatus, select, online {オンライン} error {エラー} other {オフライン}}", - "xpack.securitySolution.endpointList.ip": "IP アドレス", - "xpack.securitySolution.endpointList.lastActive": "前回のアーカイブ", - "xpack.securitySolution.endpointList.os": "オペレーティングシステム", - "xpack.securitySolution.endpointList.policy": "ポリシー", - "xpack.securitySolution.endpointList.policyStatus": "ポリシーステータス", - "xpack.securitySolution.endpointList.totalCount": "{totalItemCount, plural, one {# ホスト} other {# ホスト}}", + "xpack.securitySolution.endpoint.list.endpointVersion": "バージョン", + "xpack.securitySolution.endpoint.list.hostname": "ホスト名", + "xpack.securitySolution.endpoint.list.hostStatus": "ホストステータス", + "xpack.securitySolution.endpoint.list.hostStatusValue": "{hostStatus, select, online {オンライン} error {エラー} other {オフライン}}", + "xpack.securitySolution.endpoint.list.ip": "IP アドレス", + "xpack.securitySolution.endpoint.list.lastActive": "前回のアーカイブ", + "xpack.securitySolution.endpoint.list.os": "オペレーティングシステム", + "xpack.securitySolution.endpoint.list.policy": "ポリシー", + "xpack.securitySolution.endpoint.list.policyStatus": "ポリシーステータス", + "xpack.securitySolution.endpoint.list.totalCount": "{totalItemCount, plural, one {# ホスト} other {# ホスト}}", "xpack.securitySolution.endpointManagement.noPermissionsSubText": "Ingest Managerが無効である可能性があります。この機能を使用するには、Ingest Managerを有効にする必要があります。Ingest Managerを有効にする権限がない場合は、Kibana管理者に連絡してください。", "xpack.securitySolution.endpointManagemnet.noPermissionsText": "Elastic Security Administrationを使用するために必要なKibana権限がありません。", "xpack.securitySolution.enpdoint.resolver.panelutils.betaBadgeLabel": "BETA", @@ -16610,8 +16610,8 @@ "xpack.securitySolution.host.details.overview.platformTitle": "プラットフォーム", "xpack.securitySolution.host.details.overview.regionTitle": "地域", "xpack.securitySolution.host.details.versionLabel": "バージョン", - "xpack.securitySolution.hostList.pageSubTitle": "Elastic Endpoint Securityを実行しているホスト", - "xpack.securitySolution.hostList.pageTitle": "ホスト", + "xpack.securitySolution.endpoint.list.pageSubTitle": "Elastic Endpoint Securityを実行しているホスト", + "xpack.securitySolution.endpoint.list.pageTitle": "ホスト", "xpack.securitySolution.hosts.kqlPlaceholder": "例:host.name: \"foo\"", "xpack.securitySolution.hosts.navigation.alertsTitle": "外部アラート", "xpack.securitySolution.hosts.navigation.allHostsTitle": "すべてのホスト", @@ -16623,7 +16623,7 @@ "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingAuthenticationsData": "認証データをクエリできませんでした", "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingEventsData": "イベントデータをクエリできませんでした", "xpack.securitySolution.hosts.pageTitle": "ホスト", - "xpack.securitySolution.hostsTab": "ホスト", + "xpack.securitySolution.endpointsTab": "ホスト", "xpack.securitySolution.hostsTable.firstLastSeenToolTip": "選択された日付範囲との相関付けです", "xpack.securitySolution.hostsTable.hostsTitle": "すべてのホスト", "xpack.securitySolution.hostsTable.lastSeenTitle": "前回の認識", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 69820834cad5..590b27db5b19 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16238,65 +16238,65 @@ "xpack.securitySolution.editDataProvider.valuePlaceholder": "值", "xpack.securitySolution.emptyMessage": "Elastic Security 将免费且开放的 Elastic SIEM 和 Elastic Endpoint Security 整合在一起,从而防御、检测并响应威胁。首先,您需要将安全解决方案相关数据添加到 Elastic Stack。有关更多信息,请查看我们的 ", "xpack.securitySolution.emptyString.emptyStringDescription": "空字符串", - "xpack.securitySolution.endpoint.host.details.endpointVersion": "Endpoint 版本", - "xpack.securitySolution.endpoint.host.details.errorBody": "请退出浮出控件并选择可用主机。", - "xpack.securitySolution.endpoint.host.details.errorTitle": "找不到主机", - "xpack.securitySolution.endpoint.host.details.hostname": "主机名", - "xpack.securitySolution.endpoint.host.details.ipAddress": "IP 地址", - "xpack.securitySolution.endpoint.host.details.lastSeen": "最后看到时间", - "xpack.securitySolution.endpoint.host.details.linkToIngestTitle": "重新分配策略", - "xpack.securitySolution.endpoint.host.details.os": "OS", - "xpack.securitySolution.endpoint.host.details.policy": "政策", - "xpack.securitySolution.endpoint.host.details.policyStatus": "策略状态", - "xpack.securitySolution.endpoint.host.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失败} other {未知}}", - "xpack.securitySolution.endpoint.host.policyResponse.backLinkTitle": "终端详情", - "xpack.securitySolution.endpoint.host.policyResponse.title": "策略响应", - "xpack.securitySolution.endpoint.hostDetails.noPolicyResponse": "没有可用的策略响应", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_dns_events": "配置 DNS 事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_elasticsearch_connection": "配置 Elastic 搜索连接", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_file_events": "配置文件事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_imageload_events": "配置映像加载事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_kernel": "配置内核", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_logging": "配置日志记录", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_malware": "配置恶意软件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_network_events": "配置网络事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_process_events": "配置进程事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_registry_events": "配置注册表事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.configure_security_events": "配置安全事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.connect_kernel": "连接内核", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_async_image_load_events": "检测异步映像加载事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_open_events": "检测文件打开事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_file_write_events": "检测文件写入事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_network_events": "检测网络事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_process_events": "检测进程事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_registry_events": "检测注册表事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.detect_sync_image_load_events": "检测同步映像加载事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_global_artifacts": "下载全局项目", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.download_user_artifacts": "下面用户项目", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.events": "事件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.failed": "失败", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_config": "加载配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.load_malware_model": "加载恶意软件模型", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.logging": "日志", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.malware": "恶意软件", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_elasticsearch_config": "读取 ElasticSearch 配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_events_config": "读取时间配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_kernel_config": "读取内核配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_logging_config": "读取日志配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.read_malware_config": "读取恶意软件配置", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.streaming": "流式传输", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.success": "成功", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.warning": "警告", - "xpack.securitySolution.endpoint.hostDetails.policyResponse.workflow": "工作流", - "xpack.securitySolution.endpoint.hostList.beta": "公测版", - "xpack.securitySolution.endpoint.hostList.loadingPolicies": "正在加载政策配置", - "xpack.securitySolution.endpoint.hostList.noEndpointsInstructions": "您已创建安全策略。现在您需要按照下面的步骤在代理上启用 Elastic Endpoint Security 功能。", - "xpack.securitySolution.endpoint.hostList.noEndpointsPrompt": "在您的代理上启用 Elastic Endpoint Security", - "xpack.securitySolution.endpoint.hostList.noPolicies": "没有策略。", - "xpack.securitySolution.endpoint.hostList.stepOne": "现有策略在下面列出。之后可以对其进行更改。", - "xpack.securitySolution.endpoint.hostList.stepOneTitle": "选择要用于保护主机的策略", - "xpack.securitySolution.endpoint.hostList.stepTwo": "为了让您入门,将会为您提供必要的命令。", - "xpack.securitySolution.endpoint.hostList.stepTwoTitle": "通过采集管理器注册启用 Endpoint Security 的代理", + "xpack.securitySolution.endpoint.details.endpointVersion": "Endpoint 版本", + "xpack.securitySolution.endpoint.details.errorBody": "请退出浮出控件并选择可用主机。", + "xpack.securitySolution.endpoint.details.errorTitle": "找不到主机", + "xpack.securitySolution.endpoint.details.hostname": "主机名", + "xpack.securitySolution.endpoint.details.ipAddress": "IP 地址", + "xpack.securitySolution.endpoint.details.lastSeen": "最后看到时间", + "xpack.securitySolution.endpoint.details.linkToIngestTitle": "重新分配策略", + "xpack.securitySolution.endpoint.details.os": "OS", + "xpack.securitySolution.endpoint.details.policy": "政策", + "xpack.securitySolution.endpoint.details.policyStatus": "策略状态", + "xpack.securitySolution.endpoint.details.policyStatusValue": "{policyStatus, select, success {成功} warning {警告} failure {失败} other {未知}}", + "xpack.securitySolution.endpoint.policyResponse.backLinkTitle": "终端详情", + "xpack.securitySolution.endpoint.policyResponse.title": "策略响应", + "xpack.securitySolution.endpoint.details.noPolicyResponse": "没有可用的策略响应", + "xpack.securitySolution.endpoint.details.policyResponse.configure_dns_events": "配置 DNS 事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_elasticsearch_connection": "配置 Elastic 搜索连接", + "xpack.securitySolution.endpoint.details.policyResponse.configure_file_events": "配置文件事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_imageload_events": "配置映像加载事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_kernel": "配置内核", + "xpack.securitySolution.endpoint.details.policyResponse.configure_logging": "配置日志记录", + "xpack.securitySolution.endpoint.details.policyResponse.configure_malware": "配置恶意软件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_network_events": "配置网络事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_process_events": "配置进程事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_registry_events": "配置注册表事件", + "xpack.securitySolution.endpoint.details.policyResponse.configure_security_events": "配置安全事件", + "xpack.securitySolution.endpoint.details.policyResponse.connect_kernel": "连接内核", + "xpack.securitySolution.endpoint.details.policyResponse.detect_async_image_load_events": "检测异步映像加载事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_open_events": "检测文件打开事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_file_write_events": "检测文件写入事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_network_events": "检测网络事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_process_events": "检测进程事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_registry_events": "检测注册表事件", + "xpack.securitySolution.endpoint.details.policyResponse.detect_sync_image_load_events": "检测同步映像加载事件", + "xpack.securitySolution.endpoint.details.policyResponse.download_global_artifacts": "下载全局项目", + "xpack.securitySolution.endpoint.details.policyResponse.download_user_artifacts": "下面用户项目", + "xpack.securitySolution.endpoint.details.policyResponse.events": "事件", + "xpack.securitySolution.endpoint.details.policyResponse.failed": "失败", + "xpack.securitySolution.endpoint.details.policyResponse.load_config": "加载配置", + "xpack.securitySolution.endpoint.details.policyResponse.load_malware_model": "加载恶意软件模型", + "xpack.securitySolution.endpoint.details.policyResponse.logging": "日志", + "xpack.securitySolution.endpoint.details.policyResponse.malware": "恶意软件", + "xpack.securitySolution.endpoint.details.policyResponse.read_elasticsearch_config": "读取 ElasticSearch 配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_events_config": "读取时间配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_kernel_config": "读取内核配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_logging_config": "读取日志配置", + "xpack.securitySolution.endpoint.details.policyResponse.read_malware_config": "读取恶意软件配置", + "xpack.securitySolution.endpoint.details.policyResponse.streaming": "流式传输", + "xpack.securitySolution.endpoint.details.policyResponse.success": "成功", + "xpack.securitySolution.endpoint.details.policyResponse.warning": "警告", + "xpack.securitySolution.endpoint.details.policyResponse.workflow": "工作流", + "xpack.securitySolution.endpoint.list.beta": "公测版", + "xpack.securitySolution.endpoint.list.loadingPolicies": "正在加载政策配置", + "xpack.securitySolution.endpoint.list.noEndpointsInstructions": "您已创建安全策略。现在您需要按照下面的步骤在代理上启用 Elastic Endpoint Security 功能。", + "xpack.securitySolution.endpoint.list.noEndpointsPrompt": "在您的代理上启用 Elastic Endpoint Security", + "xpack.securitySolution.endpoint.list.noPolicies": "没有策略。", + "xpack.securitySolution.endpoint.list.stepOne": "现有策略在下面列出。之后可以对其进行更改。", + "xpack.securitySolution.endpoint.list.stepOneTitle": "选择要用于保护主机的策略", + "xpack.securitySolution.endpoint.list.stepTwo": "为了让您入门,将会为您提供必要的命令。", + "xpack.securitySolution.endpoint.list.stepTwoTitle": "通过采集管理器注册启用 Endpoint Security 的代理", "xpack.securitySolution.endpoint.ingestManager.createPackageConfig.endpointConfiguration": "使用此代理配置的任何代理都会使用基本策略。可以在 Security 应用中对此策略进行更改,Fleet 会将这些更改部署到代理。", "xpack.securitySolution.endpoint.ingestToastMessage": "采集管理器在其设置期间失败。", "xpack.securitySolution.endpoint.ingestToastTitle": "应用无法初始化", @@ -16418,16 +16418,16 @@ "xpack.securitySolution.endpoint.resolver.runningTrigger": "正在运行的触发器", "xpack.securitySolution.endpoint.resolver.terminatedProcess": "已终止进程", "xpack.securitySolution.endpoint.resolver.terminatedTrigger": "已终止触发器", - "xpack.securitySolution.endpointList.endpointVersion": "版本", - "xpack.securitySolution.endpointList.hostname": "主机名", - "xpack.securitySolution.endpointList.hostStatus": "主机状态", - "xpack.securitySolution.endpointList.hostStatusValue": "{hostStatus, select, online {联机} error {错误} other {脱机}}", - "xpack.securitySolution.endpointList.ip": "IP 地址", - "xpack.securitySolution.endpointList.lastActive": "上次活动时间", - "xpack.securitySolution.endpointList.os": "操作系统", - "xpack.securitySolution.endpointList.policy": "政策", - "xpack.securitySolution.endpointList.policyStatus": "策略状态", - "xpack.securitySolution.endpointList.totalCount": "{totalItemCount, plural, one {# 个主机} other {# 个主机}}", + "xpack.securitySolution.endpoint.list.endpointVersion": "版本", + "xpack.securitySolution.endpoint.list.hostname": "主机名", + "xpack.securitySolution.endpoint.list.hostStatus": "主机状态", + "xpack.securitySolution.endpoint.list.hostStatusValue": "{hostStatus, select, online {联机} error {错误} other {脱机}}", + "xpack.securitySolution.endpoint.list.ip": "IP 地址", + "xpack.securitySolution.endpoint.list.lastActive": "上次活动时间", + "xpack.securitySolution.endpoint.list.os": "操作系统", + "xpack.securitySolution.endpoint.list.policy": "政策", + "xpack.securitySolution.endpoint.list.policyStatus": "策略状态", + "xpack.securitySolution.endpoint.list.totalCount": "{totalItemCount, plural, one {# 个主机} other {# 个主机}}", "xpack.securitySolution.endpointManagement.noPermissionsSubText": "似乎采集管理器已禁用。必须启用采集管理器,才能使用此功能。如果您无权启用采集管理器,请联系您的 Kibana 管理员。", "xpack.securitySolution.endpointManagemnet.noPermissionsText": "您没有所需的 Kibana 权限,无法使用 Elastic Security 管理", "xpack.securitySolution.enpdoint.resolver.panelutils.betaBadgeLabel": "公测版", @@ -16616,8 +16616,8 @@ "xpack.securitySolution.host.details.overview.platformTitle": "平台", "xpack.securitySolution.host.details.overview.regionTitle": "地区", "xpack.securitySolution.host.details.versionLabel": "版本", - "xpack.securitySolution.hostList.pageSubTitle": "运行 Elastic Endpoint Security 的主机", - "xpack.securitySolution.hostList.pageTitle": "主机", + "xpack.securitySolution.endpoint.list.pageSubTitle": "运行 Elastic Endpoint Security 的主机", + "xpack.securitySolution.endpoint.list.pageTitle": "主机", "xpack.securitySolution.hosts.kqlPlaceholder": "例如 host.name:“foo”", "xpack.securitySolution.hosts.navigation.alertsTitle": "外部告警", "xpack.securitySolution.hosts.navigation.allHostsTitle": "所有主机", @@ -16629,7 +16629,7 @@ "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingAuthenticationsData": "无法查询身份验证数据", "xpack.securitySolution.hosts.navigaton.matrixHistogram.errorFetchingEventsData": "无法查询事件数据", "xpack.securitySolution.hosts.pageTitle": "主机", - "xpack.securitySolution.hostsTab": "主机", + "xpack.securitySolution.endpointsTab": "主机", "xpack.securitySolution.hostsTable.firstLastSeenToolTip": "相对于选定日期范围", "xpack.securitySolution.hostsTable.hostsTitle": "所有主机", "xpack.securitySolution.hostsTable.lastSeenTitle": "最后看到时间", diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index 85d0e5623164..0037c39b8fed 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -13,14 +13,14 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); - describe('host list', function () { + describe('endpoint list', function () { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms)); describe('when there is data,', () => { before(async () => { await esArchiver.load('endpoint/metadata/api_feature', { useCreate: true }); - await pageObjects.endpoint.navigateToHostList(); + await pageObjects.endpoint.navigateToEndpointList(); }); after(async () => { await deleteMetadataStream(getService); @@ -28,14 +28,14 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('finds page title', async () => { const title = await testSubjects.getVisibleText('pageViewHeaderLeftTitle'); - expect(title).to.equal('Hosts'); + expect(title).to.equal('Endpoints'); }); it('displays table data', async () => { const expectedData = [ [ 'Hostname', - 'Host Status', + 'Agent Status', 'Integration', 'Configuration Status', 'Operating System', @@ -74,70 +74,76 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Jan 24, 2020 @ 16:06:09.541', ], ]; - const tableData = await pageObjects.endpointPageUtils.tableData('hostListTable'); + const tableData = await pageObjects.endpointPageUtils.tableData('endpointListTable'); expect(tableData).to.eql(expectedData); }); it('does not show the details flyout initially', async () => { - await testSubjects.missingOrFail('hostDetailsFlyout'); + await testSubjects.missingOrFail('endpointDetailsFlyout'); }); describe('when the hostname is clicked on,', () => { it('display the details flyout', async () => { await (await testSubjects.find('hostnameCellLink')).click(); - await testSubjects.existOrFail('hostDetailsUpperList'); - await testSubjects.existOrFail('hostDetailsLowerList'); + await testSubjects.existOrFail('endpointDetailsUpperList'); + await testSubjects.existOrFail('endpointDetailsLowerList'); }); it('updates the details flyout when a new hostname is selected from the list', async () => { - // display flyout for the first host in the list + // display flyout for the first endpoint in the list await (await testSubjects.findAll('hostnameCellLink'))[0].click(); - await testSubjects.existOrFail('hostDetailsFlyoutTitle'); - const hostDetailTitle0 = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - // select the 2nd host in the host list + await testSubjects.existOrFail('endpointDetailsFlyoutTitle'); + const endpointDetailTitle0 = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' + ); + // select the 2nd endpoint in the endpoint list await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await pageObjects.endpoint.waitForVisibleTextToChange( - 'hostDetailsFlyoutTitle', - hostDetailTitle0 + 'endpointDetailsFlyoutTitle', + endpointDetailTitle0 + ); + const endpointDetailTitle1 = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' ); - const hostDetailTitle1 = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitle1).to.not.eql(hostDetailTitle0); + expect(endpointDetailTitle1).to.not.eql(endpointDetailTitle0); }); it('has the same flyout info when the same hostname is selected', async () => { - // display flyout for the first host in the list + // display flyout for the first endpoint in the list await (await testSubjects.findAll('hostnameCellLink'))[1].click(); - await testSubjects.existOrFail('hostDetailsFlyoutTitle'); - const hostDetailTitleInitial = await testSubjects.getVisibleText( - 'hostDetailsFlyoutTitle' + await testSubjects.existOrFail('endpointDetailsFlyoutTitle'); + const endpointDetailTitleInitial = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' ); - // select the same host in the host list + // select the same endpoint in the endpoint list await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await sleep(500); // give page time to refresh and verify it did not change - const hostDetailTitleNew = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitleNew).to.equal(hostDetailTitleInitial); + const endpointDetailTitleNew = await testSubjects.getVisibleText( + 'endpointDetailsFlyoutTitle' + ); + expect(endpointDetailTitleNew).to.equal(endpointDetailTitleInitial); }); // The integration does not work properly yet. Skipping this test for now. it.skip('navigates to ingest fleet when the Reassign Configuration link is clicked', async () => { await (await testSubjects.find('hostnameCellLink')).click(); - await (await testSubjects.find('hostDetailsLinkToIngest')).click(); + await (await testSubjects.find('endpointDetailsLinkToIngest')).click(); await testSubjects.existOrFail('fleetAgentListTable'); }); }); // This set of tests fails the flyout does not open in the before() and will be fixed in soon - describe.skip('has a url with a host id', () => { + describe.skip("has a url with an endpoint host's id", () => { before(async () => { - await pageObjects.endpoint.navigateToHostList( + await pageObjects.endpoint.navigateToEndpointList( 'selected_host=fc0ff548-feba-41b6-8367-65e8790d0eaf' ); }); it('shows a flyout', async () => { - await testSubjects.existOrFail('hostDetailsFlyoutBody'); - await testSubjects.existOrFail('hostDetailsUpperList'); - await testSubjects.existOrFail('hostDetailsLowerList'); + await testSubjects.existOrFail('endpointDetailsFlyoutBody'); + await testSubjects.existOrFail('endpointDetailsUpperList'); + await testSubjects.existOrFail('endpointDetailsLowerList'); }); it('displays details row headers', async () => { @@ -151,13 +157,15 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { 'Hostname', 'Sensor Version', ]; - const keys = await pageObjects.endpoint.hostFlyoutDescriptionKeys('hostDetailsFlyout'); + const keys = await pageObjects.endpoint.endpointFlyoutDescriptionKeys( + 'endpointDetailsFlyout' + ); expect(keys).to.eql(expectedData); }); it('displays details row descriptions', async () => { - const values = await pageObjects.endpoint.hostFlyoutDescriptionValues( - 'hostDetailsFlyout' + const values = await pageObjects.endpoint.endpointFlyoutDescriptionValues( + 'endpointDetailsFlyout' ); expect(values).to.eql([ @@ -178,7 +186,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { before(async () => { // clear out the data and reload the page await deleteMetadataStream(getService); - await pageObjects.endpoint.navigateToHostList(); + await pageObjects.endpoint.navigateToEndpointList(); }); it('displays empty Policy Table page.', async () => { await testSubjects.existOrFail('emptyPolicyTable'); diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 02f893029f81..1119906ba5cf 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -81,7 +81,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.policy.confirmAndSave(); await testSubjects.existOrFail('policyDetailsSuccessMessage'); - await pageObjects.endpoint.navigateToHostList(); + await pageObjects.endpoint.navigateToEndpointList(); await pageObjects.policy.navigateToPolicyDetails(policyInfo.packageConfig.id); expect(await (await testSubjects.find('policyWindowsEvent_process')).isSelected()).to.equal( diff --git a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts b/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts index ae4320fc5395..f89ee5fe2729 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/endpoint_page.ts @@ -14,12 +14,12 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider return { /** - * Navigate to the Hosts list page + * Navigate to the Endpoints list page */ - async navigateToHostList(searchParams?: string) { + async navigateToEndpointList(searchParams?: string) { await pageObjects.common.navigateToUrlWithBrowserHistory( 'securitySolutionManagement', - `/hosts${searchParams ? `?${searchParams}` : ''}` + `/endpoints${searchParams ? `?${searchParams}` : ''}` ); await pageObjects.header.waitUntilLoadingHasFinished(); }, @@ -51,7 +51,7 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider }); }, - async hostFlyoutDescriptionKeys(dataTestSubj: string) { + async endpointFlyoutDescriptionKeys(dataTestSubj: string) { await testSubjects.exists(dataTestSubj); const detailsData: WebElementWrapper = await testSubjects.find(dataTestSubj); const $ = await detailsData.parseDomContent(); @@ -65,7 +65,7 @@ export function EndpointPageProvider({ getService, getPageObjects }: FtrProvider ); }, - async hostFlyoutDescriptionValues(dataTestSubj: string) { + async endpointFlyoutDescriptionValues(dataTestSubj: string) { await testSubjects.exists(dataTestSubj); const detailsData: WebElementWrapper = await testSubjects.find(dataTestSubj); const $ = await detailsData.parseDomContent(); From 489b1349278c34d23f564aa12fd32ab8bdf93392 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 11 Aug 2020 20:47:20 +0300 Subject: [PATCH 20/25] Deprecate schema-less specs in Vega (#73805) * Deprecate schema-less specs in Vega Closes #30951 * update an error Message * update tests * update error message * Update vega_parser.ts Co-authored-by: Elastic Machine --- .../public/data_model/vega_parser.test.js | 27 +++++++----- .../public/data_model/vega_parser.ts | 44 +++++++++++-------- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 62563dce2a18..ac92f31b890e 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -28,6 +28,18 @@ jest.mock('../lib/vega', () => ({ vegaLite: jest.requireActual('vega-lite'), })); +describe(`VegaParser.parseAsync`, () => { + test(`should throw an error in case of $spec is not defined`, async () => { + const vp = new VegaParser('{}'); + + await vp.parseAsync(); + + expect( + vp.error.startsWith('Your specification requires a "$schema" field with a valid URL') + ).toBeTruthy(); + }); +}); + describe(`VegaParser._setDefaultValue`, () => { function check(spec, expected, ...params) { return () => { @@ -149,23 +161,14 @@ describe('VegaParser._resolveEsQueries', () => { ); }); -describe('VegaParser._parseSchema', () => { - function check(schema, isVegaLite, warningCount) { +describe('VegaParser.parseSchema', () => { + function check(schema, isVegaLite) { return () => { const vp = new VegaParser({ $schema: schema }); - expect(vp._parseSchema()).toBe(isVegaLite); - expect(vp.spec).toEqual({ $schema: schema }); - expect(vp.warnings).toHaveLength(warningCount); + expect(vp.parseSchema(vp.spec).isVegaLite).toBe(isVegaLite); }; } - test('should warn on no vega version specified', () => { - const vp = new VegaParser({}); - expect(vp._parseSchema()).toBe(false); - expect(vp.spec).toEqual({ $schema: 'https://vega.github.io/schema/vega/v5.json' }); - expect(vp.warnings).toHaveLength(1); - }); - test( 'should not warn on current vega version', check('https://vega.github.io/schema/vega/v5.json', false, 0) diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts index 94d79071b8ef..aceeefd95365 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts @@ -55,7 +55,6 @@ const locToDirMap: Record = { top: 'column-reverse', bottom: 'column', }; -const DEFAULT_SCHEMA: string = 'https://vega.github.io/schema/vega/v5.json'; // If there is no "%type%" parameter, use this parser const DEFAULT_PARSER: string = 'elasticsearch'; @@ -117,8 +116,27 @@ export class VegaParser { if (this.isVegaLite !== undefined) throw new Error(); if (typeof this.spec === 'string') { - this.spec = hjson.parse(this.spec, { legacyRoot: false }); + const spec = hjson.parse(this.spec, { legacyRoot: false }); + + if (!spec.$schema) { + throw new Error( + i18n.translate('visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaErrorMessage', { + defaultMessage: `Your specification requires a {schemaParam} field with a valid URL for +Vega (see {vegaSchemaUrl}) or +Vega-Lite (see {vegaLiteSchemaUrl}). +The URL is an identifier only. Kibana and your browser will never access this URL.`, + values: { + schemaParam: '"$schema"', + vegaLiteSchemaUrl: 'https://vega.github.io/vega-lite/docs/spec.html#top-level', + vegaSchemaUrl: + 'https://vega.github.io/vega/docs/specification/#top-level-specification-properties', + }, + }) + ); + } + this.spec = spec; } + if (!_.isPlainObject(this.spec)) { throw new Error( i18n.translate('visTypeVega.vegaParser.invalidVegaSpecErrorMessage', { @@ -126,7 +144,7 @@ export class VegaParser { }) ); } - this.isVegaLite = this._parseSchema(); + this.isVegaLite = this.parseSchema(this.spec).isVegaLite; this.useHover = !this.isVegaLite; this._config = this._parseConfig(); @@ -497,23 +515,11 @@ export class VegaParser { /** * Parse Vega schema element - * @returns {boolean} is this a VegaLite schema? + * @returns {object} isVegaLite, libVersion * @private */ - _parseSchema() { - if (!this.spec) return false; - if (!this.spec.$schema) { - this._onWarning( - i18n.translate('visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaWarningMessage', { - defaultMessage: - 'The input spec does not specify a {schemaParam}, defaulting to {defaultSchema}', - values: { defaultSchema: `"${DEFAULT_SCHEMA}"`, schemaParam: '"$schema"' }, - }) - ); - this.spec.$schema = DEFAULT_SCHEMA; - } - - const schema = schemaParser(this.spec.$schema); + private parseSchema(spec: VegaSpec) { + const schema = schemaParser(spec.$schema); const isVegaLite = schema.library === 'vega-lite'; const libVersion = isVegaLite ? vegaLite.version : vega.version; @@ -531,7 +537,7 @@ export class VegaParser { ); } - return isVegaLite; + return { isVegaLite, libVersion }; } /** diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f6d818df0d0f..7321dde4647c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4283,7 +4283,6 @@ "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "データには {urlParam}、{valuesParam}、 {sourceParam} の内複数を含めることができません", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} は廃止されました。代わりに {newConfigName} を使用してください。", "visTypeVega.vegaParser.hostConfigValueTypeErrorMessage": "{configName} が含まれている場合、オブジェクトでなければなりません", - "visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaWarningMessage": "インプット仕様で {schemaParam} が指定されていないため、デフォルトで {defaultSchema} になります", "visTypeVega.vegaParser.invalidVegaSpecErrorMessage": "無効な Vega 仕様", "visTypeVega.vegaParser.kibanaConfigValueTypeErrorMessage": "{configName} が含まれている場合、オブジェクトでなければなりません", "visTypeVega.vegaParser.mapStyleValueTypeWarningMessage": "{mapStyleConfigName} は {mapStyleConfigFirstAllowedValue} か {mapStyleConfigSecondAllowedValue} のどちらかです", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 590b27db5b19..525008fac223 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4284,7 +4284,6 @@ "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "数据不得包含 {urlParam}、{valuesParam} 和 {sourceParam} 中的多个值", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} 已弃用。请改用 {newConfigName}。", "visTypeVega.vegaParser.hostConfigValueTypeErrorMessage": "如果存在,{configName} 必须为对象", - "visTypeVega.vegaParser.inputSpecDoesNotSpecifySchemaWarningMessage": "输入规范未指定 {schemaParam},其默认值为 {defaultSchema}", "visTypeVega.vegaParser.invalidVegaSpecErrorMessage": "Vega 规范无效", "visTypeVega.vegaParser.kibanaConfigValueTypeErrorMessage": "如果存在,{configName} 必须为对象", "visTypeVega.vegaParser.mapStyleValueTypeWarningMessage": "{mapStyleConfigName} 可能为 {mapStyleConfigFirstAllowedValue} 或 {mapStyleConfigSecondAllowedValue}", From bd8761ee15ba8bfd39ae9b01dac8b9b478eeb63b Mon Sep 17 00:00:00 2001 From: Robert Austin Date: Tue, 11 Aug 2020 13:57:56 -0400 Subject: [PATCH 21/25] [Resolver] Improve simulator. Add more click-through tests and panel tests. (#74601) ### Improved the simulator. * Replace `mapStateTransitions` with `map`. The usage and interface are the same, but `map` is not dependent on redux state. This will work for parts of the app that don't use redux (aka EUI). `map` also forces any `AutoSizer` instances used by EUI to show their full contents. `AutoSizer` works but it doesn't behave as expected in JSDOM. With this hack in place, we can bypass `AutoSizer`. Going forward, we should make sure to use something other than `EuiSelectable` for the dropdowns * Removed the `connectEnzymeWrapperAndStore` test helper. The new `map` simulator method doesn't rely on redux so we no longer need this explicit sync. * The simulator can receive a memory history instance. This allows tests to pass in a precreated / controlled memory instance. Useful for testing the query string. This design is not final. Instead we could have an 'intiialHistorySearch' parameter that sets the query string on instantiation as well as 'pushHistory' and 'replaceHistory' methods? * `findInDom` is now called `domNodes`. * `processNodeElementLooksSelected` and `processNodeElementLooksUnselected` are gone. Instead use `selectedProcessNode` and `unselectedProcessNode` to find the wrappers and assert that they wrappers contain the nodes you are interested in. * Added `processNodeSubmenu` method that gets the submenu that comes up when you click the events button on a process node. * Added `nodeListElement` method. This returns the list of nodes that shows up in the panel. Name is not final. * Added `nodeListItems` method. This returns the list item elements in the node list. Name is not final. * Added `nodeListNodeLinks` method. This returns the links in the items in the node list. Name is not final. * Added `nodeDetailElement` method. This gets the element that contains details about a node. Name is not final. * Added `nodeDetailBreadcrumbNodeListLink` method. Returns the link rendered in the breadcrumbs of the node detail view. Takes the user to the node list. Name is not final. * Added `nodeDetailViewTitle` method. This returns the title of the node detail view. Name is not final. * Added `nodeDetailDescriptionListEntries` method. This returns an entries list of the details in the node detail view. Name is not final * Added `resolveWrapper` method. Pass this a function that returns a `ReactWrapper`. The method will evaluate the returned wrapper after each event loop and return it once it isn't empty. ### Improved our mocks * We had a DataAccessLayer and ResolverTree mock named 'one_ancestor_two_children` that actually had no ancestors. Renamed them to `no_ancestors_two_children`. * New DataAccessLayer mock called `noAncestorsTwoChildrenWithRelatedEventsOnOrigin` ### Added new 'clickthrough' suite test * Added new test in the 'clickthrough' suite that asserts that a user can click the 'related events' button on a node and see the list of related event categories in the submenu. ### Improved the Resolver event model * Added `timestampAsDateSafeVersion` to the event model. This gets a `Date` object for the timestamp. (We still need make it clear that this model is ResolverSpecific) ### New `urlSearch` test helper. Use `urlSearch` when testing Resolver's interaction with the browser location. It calculates the expected 'search' value based on some Resolver specific parameters. * Use this to calculate a URL and then populate the memory history with this URL. This will allow you to see if Resolver loads correctly based on the URL state. * Use this to calculate the expected URL based on Resolver's current state. ### Added new 'panel' test * If Resolver is loaded with a url search parameter that selects a node, the node's details are shown in the panel. * When a history.push occurs that sets a search parameter that selects a node, the details of that node are shown. * Check that the url search is updated when the user interacts with the panel * Check that the panel shows the correct details for a node. (except for the timestamp. See TODO) ### Changed `data-test-subj`s * Removed `resolver:panel`. This was used on a wrapper element that we expect to remove soon. * Added `resolver:node-detail:breadcrumbs:node-list-link` for the buttons in the breadcrumb in the panel. * Added `resolver:node-detail:title` for the title element in the node detail view. * Added `resolver:node-detail:entry-title` and `resolver:node-detail:entry-description` for the details shown about a process in the node detail view. * Added `resolver:node-list:node-link`. This is the link shown for each node in the node list. * added `resolver:node-list:item` to each list item in the node list view. ### Removed dead code * `map.tsx` wasn't being used. It was renamed but the old version wasn't deleted. ### Improved the node detail view * Show the timestamp for a node's process event even if the timestamp is the unix epoch. Note: this is technically a bug fix but the bug is very obscure. * Show the PID for a node's process event when the PID is 0. Note: this is a bug fix. --- .../common/endpoint/models/event.ts | 19 +++ .../public/resolver/mocks/endpoint_event.ts | 4 +- .../public/resolver/mocks/resolver_tree.ts | 3 + .../connect_enzyme_wrapper_and_store.ts | 20 --- .../test_utilities/simulator/index.tsx | 69 +++++--- .../resolver/test_utilities/url_search.ts | 26 +++ .../public/resolver/view/assets.tsx | 14 +- .../resolver/view/clickthrough.test.tsx | 20 ++- .../public/resolver/view/map.tsx | 129 -------------- .../public/resolver/view/panel.test.tsx | 158 +++++++++++++++--- .../resolver/view/panels/cube_for_process.tsx | 67 +++++--- .../public/resolver/view/panels/index.tsx | 2 +- .../resolver/view/panels/process_details.tsx | 14 +- .../view/panels/process_list_with_counts.tsx | 26 +-- .../public/resolver/view/submenu.tsx | 32 ++-- .../translations/translations/ja-JP.json | 2 +- .../translations/translations/zh-CN.json | 2 +- 17 files changed, 336 insertions(+), 271 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts create mode 100644 x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts delete mode 100644 x-pack/plugins/security_solution/public/resolver/view/map.tsx diff --git a/x-pack/plugins/security_solution/common/endpoint/models/event.ts b/x-pack/plugins/security_solution/common/endpoint/models/event.ts index 30e11819c027..a0e9be58911c 100644 --- a/x-pack/plugins/security_solution/common/endpoint/models/event.ts +++ b/x-pack/plugins/security_solution/common/endpoint/models/event.ts @@ -55,6 +55,25 @@ export function timestampSafeVersion(event: SafeResolverEvent): string | undefin : firstNonNullValue(event?.['@timestamp']); } +/** + * The `@timestamp` for the event, as a `Date` object. + * If `@timestamp` couldn't be parsed as a `Date`, returns `undefined`. + */ +export function timestampAsDateSafeVersion(event: SafeResolverEvent): Date | undefined { + const value = timestampSafeVersion(event); + if (value === undefined) { + return undefined; + } + + const date = new Date(value); + // Check if the date is valid + if (isFinite(date.getTime())) { + return date; + } else { + return undefined; + } +} + export function eventTimestamp(event: ResolverEvent): string | undefined | number { if (isLegacyEvent(event)) { return event.endgame.timestamp_utc; diff --git a/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts b/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts index c822fdf647c1..083f6b8baa59 100644 --- a/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts +++ b/x-pack/plugins/security_solution/public/resolver/mocks/endpoint_event.ts @@ -15,12 +15,14 @@ export function mockEndpointEvent({ parentEntityId, timestamp, lifecycleType, + pid = 0, }: { entityID: string; name: string; parentEntityId?: string; timestamp: number; lifecycleType?: string; + pid?: number; }): EndpointEvent { return { '@timestamp': timestamp, @@ -45,7 +47,7 @@ export function mockEndpointEvent({ executable: 'executable', args: 'args', name, - pid: 0, + pid, hash: { md5: 'hash.md5', }, diff --git a/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts b/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts index 5d2cbb2eab0d..7edf4f8071ed 100644 --- a/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts +++ b/x-pack/plugins/security_solution/public/resolver/mocks/resolver_tree.ts @@ -175,18 +175,21 @@ export function mockTreeWithNoAncestorsAnd2Children({ secondChildID: string; }): ResolverTree { const origin: ResolverEvent = mockEndpointEvent({ + pid: 0, entityID: originID, name: 'c', parentEntityId: 'none', timestamp: 0, }); const firstChild: ResolverEvent = mockEndpointEvent({ + pid: 1, entityID: firstChildID, name: 'd', parentEntityId: originID, timestamp: 1, }); const secondChild: ResolverEvent = mockEndpointEvent({ + pid: 2, entityID: secondChildID, name: 'e', parentEntityId: originID, diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts deleted file mode 100644 index 3a4a1f7d634d..000000000000 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/connect_enzyme_wrapper_and_store.ts +++ /dev/null @@ -1,20 +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 { Store } from 'redux'; -import { ReactWrapper } from 'enzyme'; - -/** - * We use the full-DOM emulation mode of `enzyme` via `mount`. Even though we use `react-redux`, `enzyme` - * does not update the DOM after state transitions. This subscribes to the `redux` store and after any state - * transition it asks `enzyme` to update the DOM to match the React state. - */ -export function connectEnzymeWrapperAndStore(store: Store, wrapper: ReactWrapper): void { - store.subscribe(() => { - // See https://enzymejs.github.io/enzyme/docs/api/ReactWrapper/update.html - return wrapper.update(); - }); -} diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx index 6f44c5aee7ca..cae6a18576eb 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -10,7 +10,6 @@ import { mount, ReactWrapper } from 'enzyme'; import { createMemoryHistory, History as HistoryPackageHistoryInterface } from 'history'; import { CoreStart } from '../../../../../../../src/core/public'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -import { connectEnzymeWrapperAndStore } from '../connect_enzyme_wrapper_and_store'; import { spyMiddlewareFactory } from '../spy_middleware_factory'; import { resolverMiddlewareFactory } from '../../store/middleware'; import { resolverReducer } from '../../store/reducer'; @@ -48,6 +47,7 @@ export class Simulator { dataAccessLayer, resolverComponentInstanceID, databaseDocumentID, + history, }: { /** * A (mock) data access layer that will be used to create the Resolver store. @@ -61,6 +61,7 @@ export class Simulator { * a databaseDocumentID to pass to Resolver. Resolver will use this in requests to the mock data layer. */ databaseDocumentID?: string; + history?: HistoryPackageHistoryInterface; }) { this.resolverComponentInstanceID = resolverComponentInstanceID; // create the spy middleware (for debugging tests) @@ -79,8 +80,9 @@ export class Simulator { // Create a redux store w/ the top level Resolver reducer and the enhancer that includes the Resolver middleware and the `spyMiddleware` this.store = createStore(resolverReducer, middlewareEnhancer); - // Create a fake 'history' instance that Resolver will use to read and write query string values - this.history = createMemoryHistory(); + // If needed, create a fake 'history' instance. + // Resolver will use to read and write query string values. + this.history = history ?? createMemoryHistory(); // Used for `KibanaContextProvider` const coreStart: CoreStart = coreMock.createStart(); @@ -95,9 +97,6 @@ export class Simulator { databaseDocumentID={databaseDocumentID} /> ); - - // Update the enzyme wrapper after each state transition - connectEnzymeWrapperAndStore(this.store, this.wrapper); } /** @@ -112,6 +111,16 @@ export class Simulator { return this.spyMiddleware.debugActions(); } + /** + * EUI uses a component called `AutoSizer` that won't render its children unless it has sufficient size. + * This forces any `AutoSizer` instances to have a large size. + */ + private forceAutoSizerOpen() { + this.wrapper + .find('AutoSizer') + .forEach((wrapper) => wrapper.setState({ width: 10000, height: 10000 })); + } + /** * Yield the result of `mapper` over and over, once per event-loop cycle. * After 10 times, quit. @@ -124,6 +133,7 @@ export class Simulator { yield mapper(); await new Promise((resolve) => { setTimeout(() => { + this.forceAutoSizerOpen(); this.wrapper.update(); resolve(); }, 0); @@ -174,6 +184,13 @@ export class Simulator { ); } + /** + * The items in the submenu that is opened by expanding a node in the map. + */ + public processNodeSubmenuItems(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:map:node-submenu-item"]'); + } + /** * Return the selected node query string values. */ @@ -206,38 +223,38 @@ export class Simulator { } /** - * An element with a list of all nodes. + * The titles of the links that select a node in the node list view. */ - public nodeListElement(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-list"]'); + public nodeListNodeLinkText(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-list:node-link:title"]'); } /** - * Return the items in the node list (the default panel view.) + * The icons in the links that select a node in the node list view. */ - public nodeListItems(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-list:item"]'); + public nodeListNodeLinkIcons(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-list:node-link:icon"]'); } /** - * The element containing the details for the selected node. + * Link rendered in the breadcrumbs of the node detail view. Takes the user to the node list. */ - public nodeDetailElement(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail"]'); + public nodeDetailBreadcrumbNodeListLink(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:breadcrumbs:node-list-link"]'); } /** - * The details of the selected node are shown in a description list. This returns the title elements of the description list. + * The title element for the node detail view. */ - private nodeDetailEntryTitle(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail:entry-title"]'); + public nodeDetailViewTitle(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:title"]'); } /** - * The details of the selected node are shown in a description list. This returns the description elements of the description list. + * The icon element for the node detail title. */ - private nodeDetailEntryDescription(): ReactWrapper { - return this.domNodes('[data-test-subj="resolver:node-detail:entry-description"]'); + public nodeDetailViewTitleIcon(): ReactWrapper { + return this.domNodes('[data-test-subj="resolver:node-detail:title-icon"]'); } /** @@ -253,8 +270,14 @@ export class Simulator { * The titles and descriptions (as text) from the node detail panel. */ public nodeDetailDescriptionListEntries(): Array<[string, string]> { - const titles = this.nodeDetailEntryTitle(); - const descriptions = this.nodeDetailEntryDescription(); + /** + * The details of the selected node are shown in a description list. This returns the title elements of the description list. + */ + const titles = this.domNodes('[data-test-subj="resolver:node-detail:entry-title"]'); + /** + * The details of the selected node are shown in a description list. This returns the description elements of the description list. + */ + const descriptions = this.domNodes('[data-test-subj="resolver:node-detail:entry-description"]'); const entries: Array<[string, string]> = []; for (let index = 0; index < Math.min(titles.length, descriptions.length); index++) { const title = titles.at(index).text(); diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts b/x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts new file mode 100644 index 000000000000..1a26e29d22da --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/url_search.ts @@ -0,0 +1,26 @@ +/* + * 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. + */ + +interface Options { + /** + * The entity_id of the selected node. + */ + selectedEntityID?: string; +} + +/** + * Calculate the expected URL search based on options. + */ +export function urlSearch(resolverComponentInstanceID: string, options?: Options): string { + if (!options) { + return ''; + } + const params = new URLSearchParams(); + if (options.selectedEntityID !== undefined) { + params.set(`resolver-${resolverComponentInstanceID}-id`, options.selectedEntityID); + } + return params.toString(); +} diff --git a/x-pack/plugins/security_solution/public/resolver/view/assets.tsx b/x-pack/plugins/security_solution/public/resolver/view/assets.tsx index fc4a9daf17ad..6962d300f707 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/assets.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/assets.tsx @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +/* eslint-disable react/display-name */ + import React, { memo } from 'react'; import euiThemeAmsterdamDark from '@elastic/eui/dist/eui_theme_amsterdam_dark.json'; import euiThemeAmsterdamLight from '@elastic/eui/dist/eui_theme_amsterdam_light.json'; @@ -11,7 +13,7 @@ import { htmlIdGenerator, ButtonColor } from '@elastic/eui'; import styled from 'styled-components'; import { i18n } from '@kbn/i18n'; import { useUiSetting } from '../../common/lib/kibana'; -import { DEFAULT_DARK_MODE } from '../../../common/constants'; +import { DEFAULT_DARK_MODE as defaultDarkMode } from '../../../common/constants'; import { ResolverProcessType } from '../types'; type ResolverColorNames = @@ -141,8 +143,6 @@ const PaintServers = memo(({ isDarkMode }: { isDarkMode: boolean }) => ( )); -PaintServers.displayName = 'PaintServers'; - /** * Ids of symbols to be linked by elements */ @@ -376,8 +376,6 @@ const SymbolsAndShapes = memo(({ isDarkMode }: { isDarkMode: boolean }) => ( )); -SymbolsAndShapes.displayName = 'SymbolsAndShapes'; - /** * This `` element is used to define the reusable assets for the Resolver * It confers several advantages, including but not limited to: @@ -386,7 +384,7 @@ SymbolsAndShapes.displayName = 'SymbolsAndShapes'; * 3. `` elements can be handled by compositor (faster) */ const SymbolDefinitionsComponent = memo(({ className }: { className?: string }) => { - const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); + const isDarkMode = useUiSetting(defaultDarkMode); return ( @@ -397,8 +395,6 @@ const SymbolDefinitionsComponent = memo(({ className }: { className?: string }) ); }); -SymbolDefinitionsComponent.displayName = 'SymbolDefinitions'; - export const SymbolDefinitions = styled(SymbolDefinitionsComponent)` position: absolute; left: 100%; @@ -424,7 +420,7 @@ export const useResolverTheme = (): { nodeAssets: NodeStyleMap; cubeAssetsForNode: (isProcessTerimnated: boolean, isProcessTrigger: boolean) => NodeStyleConfig; } => { - const isDarkMode = useUiSetting(DEFAULT_DARK_MODE); + const isDarkMode = useUiSetting(defaultDarkMode); const theme = isDarkMode ? euiThemeAmsterdamDark : euiThemeAmsterdamLight; const getThemedOption = (lightOption: string, darkOption: string): string => { diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx index 98ea235d3524..296e5b253c0b 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx @@ -71,8 +71,9 @@ describe('Resolver, when analyzing a tree that has no ancestors and 2 children', }); }); - it(`should show the node list`, async () => { - await expect(simulator.map(() => simulator.nodeListElement().length)).toYieldEqualTo(1); + it(`should show links to the 3 nodes (with icons) in the node list.`, async () => { + await expect(simulator.map(() => simulator.nodeListNodeLinkText().length)).toYieldEqualTo(3); + await expect(simulator.map(() => simulator.nodeListNodeLinkIcons().length)).toYieldEqualTo(3); }); describe("when the second child node's first button has been clicked", () => { @@ -152,5 +153,20 @@ describe('Resolver, when analyzing a tree that has two related events for the or relatedEventButtons: 1, }); }); + describe('when the related events button is clicked', () => { + beforeEach(async () => { + const button = await simulator.resolveWrapper(() => + simulator.processNodeRelatedEventButton(entityIDs.origin) + ); + if (button) { + button.simulate('click'); + } + }); + it('should open the submenu', async () => { + await expect( + simulator.map(() => simulator.processNodeSubmenuItems().map((node) => node.text())) + ).toYieldEqualTo(['2 registry']); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/map.tsx b/x-pack/plugins/security_solution/public/resolver/view/map.tsx deleted file mode 100644 index bbff2388af8b..000000000000 --- a/x-pack/plugins/security_solution/public/resolver/view/map.tsx +++ /dev/null @@ -1,129 +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. - */ - -/* eslint-disable react/display-name */ - -import React, { useContext } from 'react'; -import { useSelector } from 'react-redux'; -import { useEffectOnce } from 'react-use'; -import { EuiLoadingSpinner } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; -import * as selectors from '../store/selectors'; -import { EdgeLine } from './edge_line'; -import { GraphControls } from './graph_controls'; -import { ProcessEventDot } from './process_event_dot'; -import { useCamera } from './use_camera'; -import { SymbolDefinitions, useResolverTheme } from './assets'; -import { useStateSyncingActions } from './use_state_syncing_actions'; -import { useResolverQueryParams } from './use_resolver_query_params'; -import { StyledMapContainer, StyledPanel, GraphContainer } from './styles'; -import { entityIDSafeVersion } from '../../../common/endpoint/models/event'; -import { SideEffectContext } from './side_effect_context'; - -/** - * The highest level connected Resolver component. Needs a `Provider` in its ancestry to work. - */ -export const ResolverMap = React.memo(function ({ - className, - databaseDocumentID, - resolverComponentInstanceID, -}: { - /** - * Used by `styled-components`. - */ - className?: string; - /** - * The `_id` value of an event in ES. - * Used as the origin of the Resolver graph. - */ - databaseDocumentID?: string; - /** - * A string literal describing where in the app resolver is located, - * used to prevent collisions in things like query params - */ - resolverComponentInstanceID: string; -}) { - /** - * This is responsible for dispatching actions that include any external data. - * `databaseDocumentID` - */ - useStateSyncingActions({ databaseDocumentID, resolverComponentInstanceID }); - - const { timestamp } = useContext(SideEffectContext); - - // use this for the entire render in order to keep things in sync - const timeAtRender = timestamp(); - - const { processNodePositions, connectingEdgeLineSegments } = useSelector( - selectors.visibleNodesAndEdgeLines - )(timeAtRender); - const terminatedProcesses = useSelector(selectors.terminatedProcesses); - const { projectionMatrix, ref, onMouseDown } = useCamera(); - const isLoading = useSelector(selectors.isLoading); - const hasError = useSelector(selectors.hasError); - const activeDescendantId = useSelector(selectors.ariaActiveDescendant); - const { colorMap } = useResolverTheme(); - const { cleanUpQueryParams } = useResolverQueryParams(); - - useEffectOnce(() => { - return () => cleanUpQueryParams(); - }); - - return ( - - {isLoading ? ( -
- -
- ) : hasError ? ( -
-
- {' '} - -
-
- ) : ( - - {connectingEdgeLineSegments.map(({ points: [startPosition, endPosition], metadata }) => ( - - ))} - {[...processNodePositions].map(([processEvent, position]) => { - const processEntityId = entityIDSafeVersion(processEvent); - return ( - - ); - })} - - )} - - - - - ); -}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx index 78e5fd79bea1..4d391a6c9ce5 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panel.test.tsx @@ -4,47 +4,143 @@ * you may not use this file except in compliance with the Elastic License. */ +import { createMemoryHistory, History as HistoryPackageHistoryInterface } from 'history'; + import { noAncestorsTwoChildren } from '../data_access_layer/mocks/no_ancestors_two_children'; import { Simulator } from '../test_utilities/simulator'; // Extend jest with a custom matcher import '../test_utilities/extend_jest'; +import { urlSearch } from '../test_utilities/url_search'; + +// the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances +const resolverComponentInstanceID = 'resolverComponentInstanceID'; -describe('Resolver: when analyzing a tree with no ancestors and two children', () => { - let simulator: Simulator; - let databaseDocumentID: string; +describe(`Resolver: when analyzing a tree with no ancestors and two children, and when the component instance ID is ${resolverComponentInstanceID}`, () => { + /** + * Get (or lazily create and get) the simulator. + */ + let simulator: () => Simulator; + /** lazily populated by `simulator`. */ + let simulatorInstance: Simulator | undefined; + let memoryHistory: HistoryPackageHistoryInterface; - // the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances - const resolverComponentInstanceID = 'resolverComponentInstanceID'; + // node IDs used by the generator + let entityIDs: { + origin: string; + firstChild: string; + secondChild: string; + }; - beforeEach(async () => { + beforeEach(() => { // create a mock data access layer const { metadata: dataAccessLayerMetadata, dataAccessLayer } = noAncestorsTwoChildren(); - // save a reference to the `_id` supported by the mock data layer - databaseDocumentID = dataAccessLayerMetadata.databaseDocumentID; + entityIDs = dataAccessLayerMetadata.entityIDs; + + memoryHistory = createMemoryHistory(); // create a resolver simulator, using the data access layer and an arbitrary component instance ID - simulator = new Simulator({ databaseDocumentID, dataAccessLayer, resolverComponentInstanceID }); + simulator = () => { + if (simulatorInstance) { + return simulatorInstance; + } else { + simulatorInstance = new Simulator({ + databaseDocumentID: dataAccessLayerMetadata.databaseDocumentID, + dataAccessLayer, + resolverComponentInstanceID, + history: memoryHistory, + }); + return simulatorInstance; + } + }; }); - it('should show the node list', async () => { - await expect(simulator.map(() => simulator.nodeListElement().length)).toYieldEqualTo(1); + afterEach(() => { + simulatorInstance = undefined; }); - it('should have 3 nodes in the node list', async () => { - await expect(simulator.map(() => simulator.nodeListItems().length)).toYieldEqualTo(3); + const queryStringWithOriginSelected = urlSearch(resolverComponentInstanceID, { + selectedEntityID: 'origin', }); - describe('when there is an item in the node list and it has been clicked', () => { + + describe(`when the URL query string is ${queryStringWithOriginSelected}`, () => { + beforeEach(() => { + memoryHistory.push({ + search: queryStringWithOriginSelected, + }); + }); + it('should show the node details for the origin', async () => { + await expect( + simulator().map(() => { + const titleWrapper = simulator().nodeDetailViewTitle(); + const titleIconWrapper = simulator().nodeDetailViewTitleIcon(); + return { + title: titleWrapper.exists() ? titleWrapper.text() : null, + titleIcon: titleIconWrapper.exists() ? titleIconWrapper.text() : null, + detailEntries: simulator().nodeDetailDescriptionListEntries(), + }; + }) + ).toYieldEqualTo({ + title: 'c', + titleIcon: 'Running Process', + detailEntries: [ + ['process.executable', 'executable'], + ['process.pid', '0'], + ['user.name', 'user.name'], + ['user.domain', 'user.domain'], + ['process.parent.pid', '0'], + ['process.hash.md5', 'hash.md5'], + ['process.args', 'args'], + ], + }); + }); + }); + + const queryStringWithFirstChildSelected = urlSearch(resolverComponentInstanceID, { + selectedEntityID: 'firstChild', + }); + + describe(`when the URL query string is ${queryStringWithFirstChildSelected}`, () => { + beforeEach(() => { + memoryHistory.push({ + search: queryStringWithFirstChildSelected, + }); + }); + it('should show the node details for the first child', async () => { + await expect( + simulator().map(() => simulator().nodeDetailDescriptionListEntries()) + ).toYieldEqualTo([ + ['process.executable', 'executable'], + ['process.pid', '1'], + ['user.name', 'user.name'], + ['user.domain', 'user.domain'], + ['process.parent.pid', '0'], + ['process.hash.md5', 'hash.md5'], + ['process.args', 'args'], + ]); + }); + }); + + it('should have 3 nodes (with icons) in the node list', async () => { + await expect(simulator().map(() => simulator().nodeListNodeLinkText().length)).toYieldEqualTo( + 3 + ); + await expect(simulator().map(() => simulator().nodeListNodeLinkIcons().length)).toYieldEqualTo( + 3 + ); + }); + + describe('when there is an item in the node list and its text has been clicked', () => { beforeEach(async () => { - const nodeListItems = await simulator.resolveWrapper(() => simulator.nodeListItems()); - expect(nodeListItems && nodeListItems.length).toBeTruthy(); - if (nodeListItems) { - nodeListItems.first().find('button').simulate('click'); + const nodeLinks = await simulator().resolveWrapper(() => simulator().nodeListNodeLinkText()); + expect(nodeLinks).toBeTruthy(); + if (nodeLinks) { + nodeLinks.first().simulate('click'); } }); it('should show the details for the first node', async () => { await expect( - simulator.map(() => simulator.nodeDetailDescriptionListEntries()) + simulator().map(() => simulator().nodeDetailDescriptionListEntries()) ).toYieldEqualTo([ ['process.executable', 'executable'], ['process.pid', '0'], @@ -55,5 +151,29 @@ describe('Resolver: when analyzing a tree with no ancestors and two children', ( ['process.args', 'args'], ]); }); + it("should have the first node's ID in the query string", async () => { + await expect(simulator().map(() => simulator().queryStringValues())).toYieldEqualTo({ + selectedNode: [entityIDs.origin], + }); + }); + describe('and when the node list link has been clicked', () => { + beforeEach(async () => { + const nodeListLink = await simulator().resolveWrapper(() => + simulator().nodeDetailBreadcrumbNodeListLink() + ); + if (nodeListLink) { + nodeListLink.simulate('click'); + } + }); + it('should show the list of nodes with links to each node', async () => { + await expect( + simulator().map(() => { + return simulator() + .nodeListNodeLinkText() + .map((node) => node.text()); + }) + ).toYieldEqualTo(['c', 'd', 'e']); + }); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx index 0d8f65b4e39e..b7c8ed0dfd7d 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/cube_for_process.tsx @@ -4,42 +4,55 @@ * you may not use this file except in compliance with the Elastic License. */ +import styled from 'styled-components'; + +import { i18n } from '@kbn/i18n'; + +/* eslint-disable react/display-name */ + import React, { memo } from 'react'; import { useResolverTheme } from '../assets'; /** - * During user testing, one user indicated they wanted to see stronger visual relationships between - * Nodes on the graph and what's in the table. Using the same symbol in both places (as below) could help with that. + * Icon representing a process node. */ -export const CubeForProcess = memo(function CubeForProcess({ - isProcessTerminated, +export const CubeForProcess = memo(function ({ + running, + 'data-test-subj': dataTestSubj, }: { - isProcessTerminated: boolean; + 'data-test-subj'?: string; + /** + * True if the process represented by the node is still running. + */ + running: boolean; }) { const { cubeAssetsForNode } = useResolverTheme(); - const { cubeSymbol, descriptionText } = cubeAssetsForNode(isProcessTerminated, false); + const { cubeSymbol } = cubeAssetsForNode(!running, false); return ( - <> - - {descriptionText} - - - + + + {i18n.translate('xpack.securitySolution.resolver.node_icon', { + defaultMessage: '{running, select, true {Running Process} false {Terminated Process}}', + values: { running }, + })} + + + ); }); + +const StyledSVG = styled.svg` + position: relative; + top: 0.4em; + margin-right: 0.25em; +`; diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx index 7e7e8b757baf..b3c4eefe5fae 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/index.tsx @@ -220,7 +220,7 @@ PanelContent.displayName = 'PanelContent'; export const Panel = memo(function Event({ className }: { className?: string }) { return ( - + ); diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx index 112a3400c494..adfcc4cc44d1 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_details.tsx @@ -129,6 +129,7 @@ export const ProcessDetails = memo(function ProcessDetails({ defaultMessage: 'Events', } ), + 'data-test-subj': 'resolver:node-detail:breadcrumbs:node-list-link', onClick: () => { pushToQueryParams({ crumbId: '', crumbEvent: '' }); }, @@ -155,20 +156,23 @@ export const ProcessDetails = memo(function ProcessDetails({ return cubeAssetsForNode(isProcessTerminated, false); }, [processEvent, cubeAssetsForNode, isProcessTerminated]); - const titleId = useMemo(() => htmlIdGenerator('resolverTable')(), []); + const titleID = useMemo(() => htmlIdGenerator('resolverTable')(), []); return ( <> -

- - {processName} +

+ + {processName}

- {descriptionText} + {descriptionText} diff --git a/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx index 11f005f8acbc..1be4b4b05524 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/panels/process_list_with_counts.tsx @@ -111,8 +111,11 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ }); }} > - - {name} + + {name} ); }, @@ -150,18 +153,10 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const processTableView: ProcessTableView[] = useMemo( () => [...processNodePositions.keys()].map((processEvent) => { - let dateTime: Date | undefined; - const eventTime = event.timestampSafeVersion(processEvent); const name = event.processNameSafeVersion(processEvent); - if (eventTime) { - const date = new Date(eventTime); - if (isFinite(date.getTime())) { - dateTime = date; - } - } return { name, - timestamp: dateTime, + timestamp: event.timestampAsDateSafeVersion(processEvent), event: processEvent, }; }), @@ -172,12 +167,9 @@ export const ProcessListWithCounts = memo(function ProcessListWithCounts({ const crumbs = useMemo(() => { return [ { - text: i18n.translate( - 'xpack.securitySolution.endpoint.resolver.panel.processListWithCounts.events', - { - defaultMessage: 'All Process Events', - } - ), + text: i18n.translate('xpack.securitySolution.resolver.panel.nodeList.title', { + defaultMessage: 'All Process Events', + }), onClick: () => {}, }, ]; diff --git a/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx b/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx index 7f0ba244146f..359a4e2dafd2 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx @@ -4,8 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ +/* eslint-disable no-duplicate-imports */ + +/* eslint-disable react/display-name */ + import { i18n } from '@kbn/i18n'; -import React, { ReactNode, useState, useMemo, useCallback, useRef, useLayoutEffect } from 'react'; +import React, { useState, useMemo, useCallback, useRef, useLayoutEffect } from 'react'; import { EuiI18nNumber, EuiSelectable, @@ -15,6 +19,7 @@ import { htmlIdGenerator, } from '@elastic/eui'; import styled from 'styled-components'; +import { EuiSelectableOption } from '@elastic/eui'; import { Matrix3 } from '../types'; /** @@ -59,21 +64,21 @@ const OptionList = React.memo( subMenuOptions: ResolverSubmenuOptionList; isLoading: boolean; }) => { - const [options, setOptions] = useState(() => + const [options, setOptions] = useState(() => typeof subMenuOptions !== 'object' ? [] - : subMenuOptions.map((opt: ResolverSubmenuOption): { - label: string; - prepend?: ReactNode; - } => { - return opt.prefix + : subMenuOptions.map((option: ResolverSubmenuOption) => { + const dataTestSubj = 'resolver:map:node-submenu-item'; + return option.prefix ? { - label: opt.optionTitle, - prepend: {opt.prefix} , + label: option.optionTitle, + prepend: {option.prefix} , + 'data-test-subj': dataTestSubj, } : { - label: opt.optionTitle, + label: option.optionTitle, prepend: , + 'data-test-subj': dataTestSubj, }; }) ); @@ -88,11 +93,10 @@ const OptionList = React.memo( }, {}); }, [subMenuOptions]); - type ChangeOptions = Array<{ label: string; prepend?: ReactNode; checked?: string }>; const selectableProps = useMemo(() => { return { listProps: { showIcons: true, bordered: true }, - onChange: (newOptions: ChangeOptions) => { + onChange: (newOptions: EuiSelectableOption[]) => { const selectedOption = newOptions.find((opt) => opt.checked === 'on'); if (selectedOption) { const { label } = selectedOption; @@ -119,8 +123,6 @@ const OptionList = React.memo( } ); -OptionList.displayName = 'OptionList'; - /** * A Submenu to be displayed in one of two forms: * 1) Provided a collection of `optionsWithActions`: it will call `menuAction` then - if and when menuData becomes available - display each item with an optional prefix and call the supplied action for the options when that option is clicked. @@ -259,8 +261,6 @@ const NodeSubMenuComponents = React.memo( } ); -NodeSubMenuComponents.displayName = 'NodeSubMenu'; - export const NodeSubMenu = styled(NodeSubMenuComponents)` margin: 2px 0 0 0; padding: 0; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 7321dde4647c..f2aeed63d6ee 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16380,7 +16380,7 @@ "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.eventDescriptiveName": "{descriptor} {subject}", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.events": "イベント", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.wait": "イベントを待機しています...", - "xpack.securitySolution.endpoint.resolver.panel.processListWithCounts.events": "すべてのプロセスイベント", + "xpack.securitySolution.resolver.panel.nodeList.title": "すべてのプロセスイベント", "xpack.securitySolution.endpoint.resolver.panel.relatedCounts.numberOfEventsInCrumb": "{totalCount}件のイベント", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.missing": "関連イベントが見つかりません。", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.wait": "イベントを待機しています...", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 525008fac223..82a6b128ad61 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16386,7 +16386,7 @@ "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.eventDescriptiveName": "{descriptor} {subject}", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.events": "事件", "xpack.securitySolution.endpoint.resolver.panel.processEventListByType.wait": "等候事件......", - "xpack.securitySolution.endpoint.resolver.panel.processListWithCounts.events": "所有进程事件", + "xpack.securitySolution.resolver.panel.nodeList.title": "所有进程事件", "xpack.securitySolution.endpoint.resolver.panel.relatedCounts.numberOfEventsInCrumb": "{totalCount} 个事件", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.missing": "找不到相关事件。", "xpack.securitySolution.endpoint.resolver.panel.relatedDetail.wait": "等候事件......", From 7d3a1ff21858e4bd92bdf45d43b5239c01b6fe39 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 11 Aug 2020 12:27:24 -0600 Subject: [PATCH 22/25] [maps] fix drawing shapes (#74689) * [maps] fix drawing shapes * prevent re-render on state change --- x-pack/package.json | 4 +-- .../map/mb/draw_control/draw_control.js | 33 +++++++++++++------ .../public/routing/routes/maps_app/index.js | 6 ++-- .../routing/routes/maps_app/maps_app_view.js | 30 ++++++++++------- .../maps/public/selectors/map_selectors.ts | 24 +++----------- yarn.lock | 19 ++++++----- 6 files changed, 59 insertions(+), 57 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index 962233a3a397..b426e790c2d4 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -217,7 +217,7 @@ "@kbn/interpreter": "1.0.0", "@kbn/ui-framework": "1.0.0", "@mapbox/geojson-rewind": "^0.4.1", - "@mapbox/mapbox-gl-draw": "^1.1.2", + "@mapbox/mapbox-gl-draw": "^1.2.0", "@mapbox/mapbox-gl-rtl-text": "^0.2.3", "@scant/router": "^0.1.0", "@slack/webhook": "^5.0.0", @@ -397,4 +397,4 @@ "cypress-multi-reporters" ] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js b/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js index ac28a2d5d5a6..2daa4b2c900f 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js +++ b/x-pack/plugins/maps/public/connected_components/map/mb/draw_control/draw_control.js @@ -18,9 +18,12 @@ import { } from '../../../../elasticsearch_geo_utils'; import { DrawTooltip } from './draw_tooltip'; +const DRAW_RECTANGLE = 'draw_rectangle'; +const DRAW_CIRCLE = 'draw_circle'; + const mbDrawModes = MapboxDraw.modes; -mbDrawModes.draw_rectangle = DrawRectangle; -mbDrawModes.draw_circle = DrawCircle; +mbDrawModes[DRAW_RECTANGLE] = DrawRectangle; +mbDrawModes[DRAW_CIRCLE] = DrawCircle; export class DrawControl extends React.Component { constructor() { @@ -45,8 +48,10 @@ export class DrawControl extends React.Component { this._removeDrawControl(); } + // debounce with zero timeout needed to allow mapbox-draw finish logic to complete + // before _removeDrawControl is called _syncDrawControl = _.debounce(() => { - if (!this.props.mbMap) { + if (!this._isMounted) { return; } @@ -55,7 +60,7 @@ export class DrawControl extends React.Component { } else { this._removeDrawControl(); } - }, 256); + }, 0); _onDraw = (e) => { if (!e.features.length) { @@ -118,7 +123,7 @@ export class DrawControl extends React.Component { }; _removeDrawControl() { - if (!this._mbDrawControlAdded) { + if (!this.props.mbMap || !this._mbDrawControlAdded) { return; } @@ -129,6 +134,10 @@ export class DrawControl extends React.Component { } _updateDrawControl() { + if (!this.props.mbMap) { + return; + } + if (!this._mbDrawControlAdded) { this.props.mbMap.addControl(this._mbDrawControl); this._mbDrawControlAdded = true; @@ -136,11 +145,15 @@ export class DrawControl extends React.Component { this.props.mbMap.on('draw.create', this._onDraw); } - if (this.props.drawState.drawType === DRAW_TYPE.BOUNDS) { - this._mbDrawControl.changeMode('draw_rectangle'); - } else if (this.props.drawState.drawType === DRAW_TYPE.DISTANCE) { - this._mbDrawControl.changeMode('draw_circle'); - } else if (this.props.drawState.drawType === DRAW_TYPE.POLYGON) { + const drawMode = this._mbDrawControl.getMode(); + if (drawMode !== DRAW_RECTANGLE && this.props.drawState.drawType === DRAW_TYPE.BOUNDS) { + this._mbDrawControl.changeMode(DRAW_RECTANGLE); + } else if (drawMode !== DRAW_CIRCLE && this.props.drawState.drawType === DRAW_TYPE.DISTANCE) { + this._mbDrawControl.changeMode(DRAW_CIRCLE); + } else if ( + drawMode !== this._mbDrawControl.modes.DRAW_POLYGON && + this.props.drawState.drawType === DRAW_TYPE.POLYGON + ) { this._mbDrawControl.changeMode(this._mbDrawControl.modes.DRAW_POLYGON); } } diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/index.js b/x-pack/plugins/maps/public/routing/routes/maps_app/index.js index c5f959c54fb6..a2a4ab87affc 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/index.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/index.js @@ -14,7 +14,7 @@ import { getRefreshConfig, getTimeFilters, hasDirtyState, - hasUnsavedChanges, + getLayerListConfigOnly, } from '../../../selectors/map_selectors'; import { replaceLayerList, @@ -45,9 +45,7 @@ function mapStateToProps(state = {}) { flyoutDisplay: getFlyoutDisplay(state), refreshConfig: getRefreshConfig(state), filters: getFilters(state), - hasUnsavedChanges: (savedMap, initialLayerListConfig) => { - return hasUnsavedChanges(state, savedMap, initialLayerListConfig); - }, + layerListConfigOnly: getLayerListConfigOnly(state), query: getQuery(state), timeFilters: getTimeFilters(state), }; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js index 97a08f11a675..91d00990772f 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.js @@ -103,7 +103,15 @@ export class MapsAppView extends React.Component { } _hasUnsavedChanges() { - return this.props.hasUnsavedChanges(this.props.savedMap, this.state.initialLayerListConfig); + const savedLayerList = this.props.savedMap.getLayerList(); + return !savedLayerList + ? !_.isEqual(this.props.layerListConfigOnly, this.state.initialLayerListConfig) + : // savedMap stores layerList as a JSON string using JSON.stringify. + // JSON.stringify removes undefined properties from objects. + // savedMap.getLayerList converts the JSON string back into Javascript array of objects. + // Need to perform the same process for layerListConfigOnly to compare apples to apples + // and avoid undefined properties in layerListConfigOnly triggering unsaved changes. + !_.isEqual(JSON.parse(JSON.stringify(this.props.layerListConfigOnly)), savedLayerList); } _setBreadcrumbs = () => { @@ -356,22 +364,20 @@ export class MapsAppView extends React.Component { ); } - render() { - const { filters, isFullScreen } = this.props; + _addFilter = (newFilters) => { + newFilters.forEach((filter) => { + filter.$state = { store: esFilters.FilterStateStore.APP_STATE }; + }); + this._onFiltersChange([...this.props.filters, ...newFilters]); + }; + render() { return this.state.initialized ? ( -
+
{this._renderTopNav()}

{`screenTitle placeholder`}

- { - newFilters.forEach((filter) => { - filter.$state = { store: esFilters.FilterStateStore.APP_STATE }; - }); - this._onFiltersChange([...filters, ...newFilters]); - }} - /> +
) : null; diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.ts b/x-pack/plugins/maps/public/selectors/map_selectors.ts index e082398a02a9..40ffda3f31c2 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.ts @@ -52,7 +52,6 @@ import { ISource } from '../classes/sources/source'; import { ITMSSource } from '../classes/sources/tms_source'; import { IVectorSource } from '../classes/sources/vector_source'; import { ILayer } from '../classes/layers/layer'; -import { ISavedGisMap } from '../routing/bootstrap/services/saved_gis_map'; function createLayerInstance( layerDescriptor: LayerDescriptor, @@ -298,6 +297,10 @@ export const getLayerList = createSelector( } ); +export const getLayerListConfigOnly = createSelector(getLayerListRaw, (layerDescriptorList) => { + return copyPersistentState(layerDescriptorList); +}); + export function getLayerById(layerId: string | null, state: MapStoreState): ILayer | undefined { return getLayerList(state).find((layer) => { return layerId === layer.getId(); @@ -417,22 +420,3 @@ export const areLayersLoaded = createSelector( return true; } ); - -export function hasUnsavedChanges( - state: MapStoreState, - savedMap: ISavedGisMap, - initialLayerListConfig: LayerDescriptor[] -) { - const layerListConfigOnly = copyPersistentState(getLayerListRaw(state)); - - const savedLayerList = savedMap.getLayerList(); - - return !savedLayerList - ? !_.isEqual(layerListConfigOnly, initialLayerListConfig) - : // savedMap stores layerList as a JSON string using JSON.stringify. - // JSON.stringify removes undefined properties from objects. - // savedMap.getLayerList converts the JSON string back into Javascript array of objects. - // Need to perform the same process for layerListConfigOnly to compare apples to apples - // and avoid undefined properties in layerListConfigOnly triggering unsaved changes. - !_.isEqual(JSON.parse(JSON.stringify(layerListConfigOnly)), savedLayerList); -} diff --git a/yarn.lock b/yarn.lock index 101f735355f0..7731d2f7a8ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3026,10 +3026,10 @@ resolved "https://registry.yarnpkg.com/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz#9aecf642cb00eab1080a57c4f949a65b4a5846d6" integrity sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw== -"@mapbox/geojsonhint@^2.0.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@mapbox/geojsonhint/-/geojsonhint-2.2.0.tgz#75ca94706e9a56e6debf4e1c78fabdc67978b883" - integrity sha512-8qQYRB+/2z2JsN5s6D0WAnpo69+3V3nvJsSFLwMB1dsaWz1V4oZeuoje9srbYAxxL8PXCwIywfhYa3GxOkBv5Q== +"@mapbox/geojsonhint@3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/geojsonhint/-/geojsonhint-3.0.0.tgz#42448232ce4236cb89c1b69c36b0cadeac99e02e" + integrity sha512-zHcyh1rDHYnEBd6NvOWoeHLuvazlDkIjvz9MJx4cKwcKTlfrqgxVnTv1QLnVJnsSU5neJnhQJcgscR/Zl4uYgw== dependencies: concat-stream "^1.6.1" jsonlint-lines "1.7.1" @@ -3042,16 +3042,17 @@ resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" integrity sha1-zlblOfg1UrWNENZy6k1vya3HsjQ= -"@mapbox/mapbox-gl-draw@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.1.2.tgz#247b3f0727db34c2641ab718df5eebeee69a2585" - integrity sha512-DWtATUAnJaGZYoH/y2O+QTRybxrp5y3w3eV5FXHFNVcKsCAojKEMB8ALKUG2IsiCKqV/JCAguK9AlPWR7Bjafw== +"@mapbox/mapbox-gl-draw@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-draw/-/mapbox-gl-draw-1.2.0.tgz#b6e5278afef65bd5d7d92366034997768e478ad9" + integrity sha512-gMrP2zn8PzDtrs72FMJTPytCumX5vUn9R7IK38qBOVy9UfqbdWr56KYuNA/2X+jKn4FIOpmWf8CWkKpOaQkv7w== dependencies: "@mapbox/geojson-area" "^0.2.1" "@mapbox/geojson-extent" "^0.3.2" "@mapbox/geojson-normalize" "0.0.1" - "@mapbox/geojsonhint" "^2.0.0" + "@mapbox/geojsonhint" "3.0.0" "@mapbox/point-geometry" "0.1.0" + eslint-plugin-import "^2.19.1" hat "0.0.3" lodash.isequal "^4.2.0" xtend "^4.0.1" From d78644229e670b6ef4e8be524ff005b305021b52 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 11 Aug 2020 12:59:23 -0700 Subject: [PATCH 23/25] [Reporting] Fix and test for Listing of Reports (#74453) * [Reporting] Fix and test for Listing of Reports * add sleeps * await selector instead of sleep * reduce changes * cleanup after csv generated * fix snapshot --- .../report_listing.test.tsx.snap | 3 + .../public/components/report_listing.tsx | 1 + .../plugins/reporting/server/routes/jobs.ts | 10 +- .../apps/dashboard/reporting/screenshots.ts | 10 +- .../functional/apps/discover/reporting.ts | 6 + .../functional/apps/lens/lens_reporting.ts | 6 + .../apps/reporting_management/index.ts | 2 +- .../report_delete_pagination.ts | 59 --------- .../reporting_management/report_listing.ts | 121 ++++++++++++++++++ .../functional/apps/visualize/reporting.ts | 6 + 10 files changed, 160 insertions(+), 64 deletions(-) delete mode 100644 x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts create mode 100644 x-pack/test/functional/apps/reporting_management/report_listing.ts diff --git a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap b/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap index ddba7842f119..66c3aea8acc1 100644 --- a/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap +++ b/x-pack/plugins/reporting/public/components/__snapshots__/report_listing.test.tsx.snap @@ -30,6 +30,7 @@ Array [ }, ] } + data-test-page={0} data-test-subj="reportJobListing" isSelectable={true} itemId="id" @@ -56,6 +57,7 @@ Array [ >
@@ -366,6 +368,7 @@ Array [ ,
diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/components/report_listing.tsx index afcae93a8db1..80ef9311fd0e 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.tsx @@ -513,6 +513,7 @@ class ReportListingUi extends Component { isSelectable={true} onChange={this.onTableChange} data-test-subj="reportJobListing" + data-test-page={this.state.page} /> {this.state.selectedJobs.length > 0 ? this.renderDeleteButton() : null} diff --git a/x-pack/plugins/reporting/server/routes/jobs.ts b/x-pack/plugins/reporting/server/routes/jobs.ts index 4033719b053b..e8eac9e577be 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.ts @@ -35,7 +35,13 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { router.get( { path: `${MAIN_ENTRY}/list`, - validate: false, + validate: { + query: schema.object({ + page: schema.string({ defaultValue: '0' }), + size: schema.string({ defaultValue: '10' }), + ids: schema.maybe(schema.string()), + }), + }, }, userHandler(async (user, context, req, res) => { // ensure the async dependencies are loaded @@ -50,7 +56,7 @@ export function registerJobInfoRoutes(reporting: ReportingCore) { page: queryPage = '0', size: querySize = '10', ids: queryIds = null, - } = req.query as ListQuery; + } = req.query as ListQuery; // NOTE: type inference is not working here. userHandler breaks it? const page = parseInt(queryPage, 10) || 0; const size = Math.min(100, parseInt(querySize, 10) || 10); const jobIds = queryIds ? queryIds.split(',') : null; diff --git a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts index da1131d05158..cf70e5a7b8b6 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts @@ -16,12 +16,13 @@ const mkdirAsync = promisify(fs.mkdir); const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); -export default function ({ getService, getPageObjects }: FtrProviderContext) { +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); const esArchiver = getService('esArchiver'); const browser = getService('browser'); const log = getService('log'); const config = getService('config'); - const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); + const es = getService('es'); describe('Screenshots', () => { before('initialize tests', async () => { @@ -33,6 +34,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after('clean up archives', async () => { await esArchiver.unload('reporting/ecommerce'); await esArchiver.unload('reporting/ecommerce_kibana'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); describe('Print PDF button', () => { diff --git a/x-pack/test/functional/apps/discover/reporting.ts b/x-pack/test/functional/apps/discover/reporting.ts index 32ccc59913db..7181bf0c7427 100644 --- a/x-pack/test/functional/apps/discover/reporting.ts +++ b/x-pack/test/functional/apps/discover/reporting.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); + const es = getService('es'); const esArchiver = getService('esArchiver'); const browser = getService('browser'); const PageObjects = getPageObjects(['reporting', 'common', 'discover']); @@ -22,6 +23,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); after('clean up archives', async () => { await esArchiver.unload('reporting/ecommerce'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); describe('Generate CSV button', () => { diff --git a/x-pack/test/functional/apps/lens/lens_reporting.ts b/x-pack/test/functional/apps/lens/lens_reporting.ts index 3e3d217b9d8d..4974b63be6f7 100644 --- a/x-pack/test/functional/apps/lens/lens_reporting.ts +++ b/x-pack/test/functional/apps/lens/lens_reporting.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'dashboard', 'reporting']); + const es = getService('es'); const esArchiver = getService('esArchiver'); const listingTable = getService('listingTable'); @@ -19,6 +20,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await esArchiver.unload('lens/reporting'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); it('should not cause PDF reports to fail', async () => { diff --git a/x-pack/test/functional/apps/reporting_management/index.ts b/x-pack/test/functional/apps/reporting_management/index.ts index f44d5858d53a..8606c46053ab 100644 --- a/x-pack/test/functional/apps/reporting_management/index.ts +++ b/x-pack/test/functional/apps/reporting_management/index.ts @@ -9,6 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ loadTestFile }: FtrProviderContext) => { describe('reporting management app', function () { this.tags('ciGroup7'); - loadTestFile(require.resolve('./report_delete_pagination')); + loadTestFile(require.resolve('./report_listing')); }); }; diff --git a/x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts b/x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts deleted file mode 100644 index 488314030085..000000000000 --- a/x-pack/test/functional/apps/reporting_management/report_delete_pagination.ts +++ /dev/null @@ -1,59 +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 expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'reporting']); - const log = getService('log'); - const retry = getService('retry'); - const security = getService('security'); - - const testSubjects = getService('testSubjects'); - const esArchiver = getService('esArchiver'); - - describe('Delete reports', function () { - before(async () => { - await security.testUser.setRoles(['kibana_admin', 'reporting_user']); - await esArchiver.load('empty_kibana'); - await esArchiver.load('reporting/archived_reports'); - await pageObjects.common.navigateToApp('reporting'); - await testSubjects.existOrFail('reportJobListing', { timeout: 200000 }); - }); - - after(async () => { - await esArchiver.unload('empty_kibana'); - await esArchiver.unload('reporting/archived_reports'); - await security.testUser.restoreDefaults(); - }); - - it('Confirm single report deletion works', async () => { - log.debug('Checking for reports.'); - await retry.try(async () => { - await testSubjects.click('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); - }); - const deleteButton = await testSubjects.find('deleteReportButton'); - await retry.waitFor('delete button to become enabled', async () => { - return await deleteButton.isEnabled(); - }); - await deleteButton.click(); - await testSubjects.exists('confirmModalBodyText'); - await testSubjects.click('confirmModalConfirmButton'); - await retry.try(async () => { - await testSubjects.waitForDeleted('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); - }); - }); - - // functional test for report pagination: https://github.com/elastic/kibana/pull/62881 - it('Report pagination', async () => { - const previousButton = await testSubjects.find('pagination-button-previous'); - expect(await previousButton.getAttribute('disabled')).to.be('true'); - await testSubjects.click('pagination-button-1'); - expect(await previousButton.getAttribute('disabled')).to.be(null); - }); - }); -}; diff --git a/x-pack/test/functional/apps/reporting_management/report_listing.ts b/x-pack/test/functional/apps/reporting_management/report_listing.ts new file mode 100644 index 000000000000..5bb36103fc6f --- /dev/null +++ b/x-pack/test/functional/apps/reporting_management/report_listing.ts @@ -0,0 +1,121 @@ +/* + * 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 { WebElementWrapper } from 'test/functional/services/lib/web_element_wrapper'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +const getTableTextFromElement = async (tableEl: WebElementWrapper) => { + const rows = await tableEl.findAllByCssSelector('tbody tr'); + return ( + await Promise.all( + rows.map(async (row) => { + return await row.getVisibleText(); + }) + ) + ).join('\n'); +}; + +export default ({ getPageObjects, getService }: FtrProviderContext) => { + const pageObjects = getPageObjects(['common', 'reporting']); + const log = getService('log'); + const retry = getService('retry'); + const security = getService('security'); + + const testSubjects = getService('testSubjects'); + const findInstance = getService('find'); + const esArchiver = getService('esArchiver'); + + describe('Listing of Reports', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'reporting_user']); + await esArchiver.load('empty_kibana'); + }); + + beforeEach(async () => { + // to reset the data after deletion testing + await esArchiver.load('reporting/archived_reports'); + await pageObjects.common.navigateToApp('reporting'); + await testSubjects.existOrFail('reportJobListing', { timeout: 200000 }); + }); + + after(async () => { + await esArchiver.unload('empty_kibana'); + await security.testUser.restoreDefaults(); + }); + + afterEach(async () => { + await esArchiver.unload('reporting/archived_reports'); + }); + + it('Confirm single report deletion works', async () => { + log.debug('Checking for reports.'); + await retry.try(async () => { + await testSubjects.click('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); + }); + const deleteButton = await testSubjects.find('deleteReportButton'); + await retry.waitFor('delete button to become enabled', async () => { + return await deleteButton.isEnabled(); + }); + await deleteButton.click(); + await testSubjects.exists('confirmModalBodyText'); + await testSubjects.click('confirmModalConfirmButton'); + await retry.try(async () => { + await testSubjects.waitForDeleted('checkboxSelectRow-k9a9xlwl0gpe1457b10rraq3'); + }); + }); + + it('Paginates content', async () => { + const previousButton = await testSubjects.find('pagination-button-previous'); + + // previous CAN NOT be clicked + expect(await previousButton.getAttribute('disabled')).to.be('true'); + + // scan page 1 + let tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing')); + const PAGE_CONTENT_1 = `[Logs] File Type Scatter Plot\nvisualization\n2020-04-21 @ 07:01 PM\ntest_user\nCompleted at 2020-04-21 @ 07:02 PM +[Logs] File Type Scatter Plot\nvisualization\n2020-04-21 @ 07:01 PM\ntest_user\nCompleted at 2020-04-21 @ 07:02 PM +[Logs] Heatmap\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +[Logs] Heatmap\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +[Flights] Flight Delays\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +[Flights] Flight Delays\nvisualization\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:01 PM +pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM +pdf\ndashboard\n2020-04-21 @ 07:00 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM +[Flights] Flight Cancellations\nvisualization\n2020-04-21 @ 06:59 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM +[Flights] Markdown Instructions\nvisualization\n2020-04-21 @ 06:59 PM\ntest_user\nCompleted at 2020-04-21 @ 07:00 PM`; + expect(tableText).to.be(PAGE_CONTENT_1); + + // click page 2 + await testSubjects.click('pagination-button-1'); + await findInstance.byCssSelector('[data-test-page="1"]'); + + // previous CAN be clicked + expect(await previousButton.getAttribute('disabled')).to.be(null); + + // scan page 2 + tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing')); + const PAGE_CONTENT_2 = `[eCommerce] Revenue Tracking\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM +[Logs] Web Traffic\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM +[Flights] Overview\ncanvas workpad\n2020-04-21 @ 06:58 PM\ntest_user\nCompleted at 2020-04-21 @ 06:59 PM +[eCommerce] Revenue Dashboard\ndashboard\n2020-04-21 @ 06:57 PM\ntest_user\nCompleted at 2020-04-21 @ 06:58 PM +[Logs] Web Traffic\ndashboard\n2020-04-21 @ 06:57 PM\ntest_user\nCompleted at 2020-04-21 @ 06:58 PM +[Flights] Global Flight Dashboard\ndashboard\n2020-04-21 @ 06:56 PM\ntest_user\nCompleted at 2020-04-21 @ 06:57 PM +[Flights] Global Flight Dashboard\ndashboard\n2020-04-21 @ 06:56 PM\ntest_user\nCompleted at 2020-04-21 @ 06:57 PM +report4csv\n2020-04-21 @ 06:55 PM\ntest_user\nCompleted at 2020-04-21 @ 06:56 PM - Max size reached\nreport3csv\n2020-04-21 @ 06:55 PM +test_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached\nreport2csv\n2020-04-21 @ 06:54 PM\ntest_user\nCompleted at 2020-04-21 @ 06:55 PM - Max size reached`; + expect(tableText).to.be(PAGE_CONTENT_2); + + // click page 3 + await testSubjects.click('pagination-button-2'); + await findInstance.byCssSelector('[data-test-page="2"]'); + + // scan page 3 + tableText = await getTableTextFromElement(await testSubjects.find('reportJobListing')); + const PAGE_CONTENT_3 = `report1csv\n2020-04-21 @ 06:54 PM\ntest_user\nCompleted at 2020-04-21 @ 06:54 PM - Max size reached`; + expect(tableText).to.be(PAGE_CONTENT_3); + }); + }); +}; diff --git a/x-pack/test/functional/apps/visualize/reporting.ts b/x-pack/test/functional/apps/visualize/reporting.ts index 02fd74e9480f..d1cea5a4481b 100644 --- a/x-pack/test/functional/apps/visualize/reporting.ts +++ b/x-pack/test/functional/apps/visualize/reporting.ts @@ -8,6 +8,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { + const es = getService('es'); const esArchiver = getService('esArchiver'); const browser = getService('browser'); const log = getService('log'); @@ -29,6 +30,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after('clean up archives', async () => { await esArchiver.unload('reporting/ecommerce'); await esArchiver.unload('reporting/ecommerce_kibana'); + await es.deleteByQuery({ + index: '.reporting-*', + refresh: true, + body: { query: { match_all: {} } }, + }); }); describe('Print PDF button', () => { From 506e9537bf1116f1ad7da2c85ec9befd491febc0 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Tue, 11 Aug 2020 23:28:43 +0300 Subject: [PATCH 24/25] [Search] Server strategy example (#71679) * Server strategy example * Add tsconfig Renamed is_partial to isPartial Added isPartial and isRunning to OSS response type * Docs + remove unused sample code * Fix test naming of arguments * ts * ts fix * Add filters and query input selector * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * Use new service * exapmle plugin ts * unsubscribe + use timefilter * typo * docs * Add comments and use agg config * Added agg configs Added field selector Added a custom input param * Adding getEsQuery to query service (??) * Add server side example * docs * caps * list plugin in examples page * fix typo * Update examples/search_examples/public/application.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/application.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * Update examples/search_examples/public/components/app.tsx Co-authored-by: Lukas Olson * eslint Co-authored-by: Lukas Olson Co-authored-by: Elastic Machine --- ...data-public.iessearchresponse.ispartial.md | 13 + ...data-public.iessearchresponse.isrunning.md | 13 + ...n-plugins-data-public.iessearchresponse.md | 2 + ...ugin-plugins-data-public.isearchgeneric.md | 2 +- ...ugin-plugins-data-public.isearchoptions.md | 1 + ...ins-data-public.isearchoptions.strategy.md | 11 + ...n-plugins-data-public.searchinterceptor.md | 2 +- ...data-public.searchinterceptor.runsearch.md | 3 +- ...-data-server.iessearchrequest.indextype.md | 11 + ...in-plugins-data-server.iessearchrequest.md | 19 + ...ins-data-server.iessearchrequest.params.md | 11 + ...data-server.iessearchresponse.ispartial.md | 13 + ...data-server.iessearchresponse.isrunning.md | 13 + ...n-plugins-data-server.iessearchresponse.md | 20 + ...ta-server.iessearchresponse.rawresponse.md | 11 + .../kibana-plugin-plugins-data-server.md | 2 + examples/search_examples/README.md | 9 + examples/search_examples/common/index.ts | 32 ++ examples/search_examples/kibana.json | 9 + .../search_examples/public/application.tsx | 44 +++ .../search_examples/public/components/app.tsx | 341 ++++++++++++++++++ examples/search_examples/public/index.scss | 0 examples/search_examples/public/index.ts | 29 ++ examples/search_examples/public/plugin.ts | 76 ++++ examples/search_examples/public/types.ts | 36 ++ examples/search_examples/server/index.ts | 27 ++ .../search_examples/server/my_strategy.ts | 40 ++ examples/search_examples/server/plugin.ts | 73 ++++ .../search_examples/server/routes/index.ts | 19 + .../server/routes/register_routes.ts | 26 ++ .../server/routes/server_search_route.ts | 70 ++++ examples/search_examples/server/types.ts | 34 ++ examples/search_examples/tsconfig.json | 16 + .../data/common/search/es_search/types.ts | 8 + src/plugins/data/public/public.api.md | 9 +- src/plugins/data/public/query/mocks.ts | 1 + .../data/public/query/query_service.ts | 13 + .../data/public/search/search_interceptor.ts | 21 +- src/plugins/data/public/search/types.ts | 8 +- src/plugins/data/server/index.ts | 7 +- .../es_search/es_search_strategy.test.ts | 5 +- .../search/es_search/es_search_strategy.ts | 9 +- src/plugins/data/server/server.api.md | 43 ++- x-pack/plugins/data_enhanced/common/index.ts | 7 +- .../data_enhanced/common/search/index.ts | 7 +- .../data_enhanced/common/search/types.ts | 17 +- .../public/search/search_interceptor.test.ts | 64 ++-- .../public/search/search_interceptor.ts | 16 +- .../server/search/es_search_strategy.ts | 4 +- 49 files changed, 1161 insertions(+), 106 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md create mode 100644 examples/search_examples/README.md create mode 100644 examples/search_examples/common/index.ts create mode 100644 examples/search_examples/kibana.json create mode 100644 examples/search_examples/public/application.tsx create mode 100644 examples/search_examples/public/components/app.tsx create mode 100644 examples/search_examples/public/index.scss create mode 100644 examples/search_examples/public/index.ts create mode 100644 examples/search_examples/public/plugin.ts create mode 100644 examples/search_examples/public/types.ts create mode 100644 examples/search_examples/server/index.ts create mode 100644 examples/search_examples/server/my_strategy.ts create mode 100644 examples/search_examples/server/plugin.ts create mode 100644 examples/search_examples/server/routes/index.ts create mode 100644 examples/search_examples/server/routes/register_routes.ts create mode 100644 examples/search_examples/server/routes/server_search_route.ts create mode 100644 examples/search_examples/server/types.ts create mode 100644 examples/search_examples/tsconfig.json diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md new file mode 100644 index 000000000000..00a56c6fe9c3 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-public.iessearchresponse.md) > [isPartial](./kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md) + +## IEsSearchResponse.isPartial property + +Indicates whether the results returned are complete or partial + +Signature: + +```typescript +isPartial?: boolean; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md new file mode 100644 index 000000000000..56fb1a751981 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-public.iessearchresponse.md) > [isRunning](./kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md) + +## IEsSearchResponse.isRunning property + +Indicates whether async search is still in flight + +Signature: + +```typescript +isRunning?: boolean; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md index ea7e2aef00d6..041d79de3282 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md @@ -14,5 +14,7 @@ export interface IEsSearchResponse extends IKibanaSearchResponse | Property | Type | Description | | --- | --- | --- | +| [isPartial](./kibana-plugin-plugins-data-public.iessearchresponse.ispartial.md) | boolean | Indicates whether the results returned are complete or partial | +| [isRunning](./kibana-plugin-plugins-data-public.iessearchresponse.isrunning.md) | boolean | Indicates whether async search is still in flight | | [rawResponse](./kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md) | SearchResponse<any> | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md index cdf19cd15a29..3bd6a398c8df 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md @@ -7,5 +7,5 @@ Signature: ```typescript -export declare type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOptions) => Observable; +export declare type ISearchGeneric = (request: IEsSearchRequest, options?: ISearchOptions) => Observable; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md index 05b725260628..3eb38dc7d52e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.md @@ -15,4 +15,5 @@ export interface ISearchOptions | Property | Type | Description | | --- | --- | --- | | [signal](./kibana-plugin-plugins-data-public.isearchoptions.signal.md) | AbortSignal | | +| [strategy](./kibana-plugin-plugins-data-public.isearchoptions.strategy.md) | string | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md new file mode 100644 index 000000000000..df7e050691a8 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchoptions.strategy.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) > [strategy](./kibana-plugin-plugins-data-public.isearchoptions.strategy.md) + +## ISearchOptions.strategy property + +Signature: + +```typescript +strategy?: string; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md index 30e980b5ffc5..b3b7da05326d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md @@ -35,7 +35,7 @@ export declare class SearchInterceptor | Method | Modifiers | Description | | --- | --- | --- | -| [runSearch(request, signal)](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) | | | +| [runSearch(request, signal, strategy)](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) | | | | [search(request, options)](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | Searches using the given search method. Overrides the AbortSignal with one that will abort either when cancelPending is called, when the request times out, or when the original AbortSignal is aborted. Updates the pendingCount when the request is started/finalized. | | [setupTimers(options)](./kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md) | | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md index 3601a00c48cf..ad1d1dcb59d7 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md @@ -7,7 +7,7 @@ Signature: ```typescript -protected runSearch(request: IEsSearchRequest, signal: AbortSignal): Observable; +protected runSearch(request: IEsSearchRequest, signal: AbortSignal, strategy?: string): Observable; ``` ## Parameters @@ -16,6 +16,7 @@ protected runSearch(request: IEsSearchRequest, signal: AbortSignal): Observable< | --- | --- | --- | | request | IEsSearchRequest | | | signal | AbortSignal | | +| strategy | string | | Returns: diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md new file mode 100644 index 000000000000..aaf4e55ee007 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.indextype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) > [indexType](./kibana-plugin-plugins-data-server.iessearchrequest.indextype.md) + +## IEsSearchRequest.indexType property + +Signature: + +```typescript +indexType?: string; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md new file mode 100644 index 000000000000..0dfa23eb64c1 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) + +## IEsSearchRequest interface + +Signature: + +```typescript +export interface IEsSearchRequest extends IKibanaSearchRequest +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [indexType](./kibana-plugin-plugins-data-server.iessearchrequest.indextype.md) | string | | +| [params](./kibana-plugin-plugins-data-server.iessearchrequest.params.md) | ISearchRequestParams | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md new file mode 100644 index 000000000000..d65281973c95 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchrequest.params.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) > [params](./kibana-plugin-plugins-data-server.iessearchrequest.params.md) + +## IEsSearchRequest.params property + +Signature: + +```typescript +params?: ISearchRequestParams; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md new file mode 100644 index 000000000000..fbddfc1cd9fc --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) > [isPartial](./kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md) + +## IEsSearchResponse.isPartial property + +Indicates whether the results returned are complete or partial + +Signature: + +```typescript +isPartial?: boolean; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md new file mode 100644 index 000000000000..01f3982957d5 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) > [isRunning](./kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md) + +## IEsSearchResponse.isRunning property + +Indicates whether async search is still in flight + +Signature: + +```typescript +isRunning?: boolean; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md new file mode 100644 index 000000000000..0407dce5fe41 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.md @@ -0,0 +1,20 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) + +## IEsSearchResponse interface + +Signature: + +```typescript +export interface IEsSearchResponse extends IKibanaSearchResponse +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [isPartial](./kibana-plugin-plugins-data-server.iessearchresponse.ispartial.md) | boolean | Indicates whether the results returned are complete or partial | +| [isRunning](./kibana-plugin-plugins-data-server.iessearchresponse.isrunning.md) | boolean | Indicates whether async search is still in flight | +| [rawResponse](./kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md) | SearchResponse<any> | | + diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md new file mode 100644 index 000000000000..0ee1691d0f69 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) > [rawResponse](./kibana-plugin-plugins-data-server.iessearchresponse.rawresponse.md) + +## IEsSearchResponse.rawResponse property + +Signature: + +```typescript +rawResponse: SearchResponse; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md index 1bcd575803f8..f472064c8775 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.md @@ -36,6 +36,8 @@ | [EsQueryConfig](./kibana-plugin-plugins-data-server.esqueryconfig.md) | | | [FieldFormatConfig](./kibana-plugin-plugins-data-server.fieldformatconfig.md) | | | [Filter](./kibana-plugin-plugins-data-server.filter.md) | | +| [IEsSearchRequest](./kibana-plugin-plugins-data-server.iessearchrequest.md) | | +| [IEsSearchResponse](./kibana-plugin-plugins-data-server.iessearchresponse.md) | | | [IFieldSubType](./kibana-plugin-plugins-data-server.ifieldsubtype.md) | | | [IFieldType](./kibana-plugin-plugins-data-server.ifieldtype.md) | | | [IIndexPattern](./kibana-plugin-plugins-data-server.iindexpattern.md) | | diff --git a/examples/search_examples/README.md b/examples/search_examples/README.md new file mode 100644 index 000000000000..bcc17bf7f333 --- /dev/null +++ b/examples/search_examples/README.md @@ -0,0 +1,9 @@ +# search_examples + +> An awesome Kibana plugin + +--- + +## Development + +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/examples/search_examples/common/index.ts b/examples/search_examples/common/index.ts new file mode 100644 index 000000000000..e1e7f6389ae8 --- /dev/null +++ b/examples/search_examples/common/index.ts @@ -0,0 +1,32 @@ +/* + * 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 { IEsSearchResponse, IEsSearchRequest } from '../../../src/plugins/data/common'; + +export const PLUGIN_ID = 'searchExamples'; +export const PLUGIN_NAME = 'Search Examples'; + +export interface IMyStrategyRequest extends IEsSearchRequest { + get_cool: boolean; +} +export interface IMyStrategyResponse extends IEsSearchResponse { + cool: string; +} + +export const SERVER_SEARCH_ROUTE_PATH = '/api/examples/search'; diff --git a/examples/search_examples/kibana.json b/examples/search_examples/kibana.json new file mode 100644 index 000000000000..7e392b841736 --- /dev/null +++ b/examples/search_examples/kibana.json @@ -0,0 +1,9 @@ +{ + "id": "searchExamples", + "version": "8.0.0", + "server": true, + "ui": true, + "requiredPlugins": ["navigation", "data", "developerExamples"], + "optionalPlugins": [], + "requiredBundles": [] +} diff --git a/examples/search_examples/public/application.tsx b/examples/search_examples/public/application.tsx new file mode 100644 index 000000000000..81e4ee8514c1 --- /dev/null +++ b/examples/search_examples/public/application.tsx @@ -0,0 +1,44 @@ +/* + * 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 ReactDOM from 'react-dom'; +import { AppMountParameters, CoreStart } from '../../../src/core/public'; +import { AppPluginStartDependencies } from './types'; +import { SearchExamplesApp } from './components/app'; + +export const renderApp = ( + { notifications, savedObjects, http }: CoreStart, + { navigation, data }: AppPluginStartDependencies, + { appBasePath, element }: AppMountParameters +) => { + ReactDOM.render( + , + element + ); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/examples/search_examples/public/components/app.tsx b/examples/search_examples/public/components/app.tsx new file mode 100644 index 000000000000..31cc5e420da1 --- /dev/null +++ b/examples/search_examples/public/components/app.tsx @@ -0,0 +1,341 @@ +/* + * 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, { useState, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage, I18nProvider } from '@kbn/i18n/react'; +import { BrowserRouter as Router } from 'react-router-dom'; + +import { + EuiButton, + EuiPage, + EuiPageBody, + EuiPageContent, + EuiPageContentBody, + EuiPageHeader, + EuiTitle, + EuiText, + EuiFlexGrid, + EuiFlexItem, + EuiCheckbox, + EuiSpacer, + EuiCode, + EuiComboBox, + EuiFormLabel, +} from '@elastic/eui'; + +import { CoreStart } from '../../../../src/core/public'; +import { mountReactNode } from '../../../../src/core/public/utils'; +import { NavigationPublicPluginStart } from '../../../../src/plugins/navigation/public'; + +import { + PLUGIN_ID, + PLUGIN_NAME, + IMyStrategyRequest, + IMyStrategyResponse, + SERVER_SEARCH_ROUTE_PATH, +} from '../../common'; + +import { + DataPublicPluginStart, + IndexPatternSelect, + IndexPattern, + IndexPatternField, +} from '../../../../src/plugins/data/public'; + +interface SearchExamplesAppDeps { + basename: string; + notifications: CoreStart['notifications']; + http: CoreStart['http']; + savedObjectsClient: CoreStart['savedObjects']['client']; + navigation: NavigationPublicPluginStart; + data: DataPublicPluginStart; +} + +function formatFieldToComboBox(field?: IndexPatternField | null) { + if (!field) return []; + return formatFieldsToComboBox([field]); +} + +function formatFieldsToComboBox(fields?: IndexPatternField[]) { + if (!fields) return []; + + return fields?.map((field) => { + return { + label: field.displayName || field.name, + }; + }); +} + +export const SearchExamplesApp = ({ + http, + basename, + notifications, + savedObjectsClient, + navigation, + data, +}: SearchExamplesAppDeps) => { + const [getCool, setGetCool] = useState(false); + const [timeTook, setTimeTook] = useState(); + const [indexPattern, setIndexPattern] = useState(); + const [numericFields, setNumericFields] = useState(); + const [selectedField, setSelectedField] = useState(); + + // Fetch the default index pattern using the `data.indexPatterns` service, as the component is mounted. + useEffect(() => { + const setDefaultIndexPattern = async () => { + const defaultIndexPattern = await data.indexPatterns.getDefault(); + setIndexPattern(defaultIndexPattern); + }; + + setDefaultIndexPattern(); + }, [data]); + + // Update the fields list every time the index pattern is modified. + useEffect(() => { + const fields = indexPattern?.fields.filter( + (field) => field.type === 'number' && field.aggregatable + ); + setNumericFields(fields); + setSelectedField(fields?.length ? fields[0] : null); + }, [indexPattern]); + + const doAsyncSearch = async (strategy?: string) => { + if (!indexPattern || !selectedField) return; + + // Constuct the query portion of the search request + const query = data.query.getEsQuery(indexPattern); + + // Constuct the aggregations portion of the search request by using the `data.search.aggs` service. + const aggs = [{ type: 'avg', params: { field: selectedField.name } }]; + const aggsDsl = data.search.aggs.createAggConfigs(indexPattern, aggs).toDsl(); + + const request = { + params: { + index: indexPattern.title, + body: { + aggs: aggsDsl, + query, + }, + }, + }; + + if (strategy) { + // Add a custom request parameter to be consumed by `MyStrategy`. + (request as IMyStrategyRequest).get_cool = getCool; + } + + // Submit the search request using the `data.search` service. + const searchSubscription$ = data.search + .search(request, { + strategy, + }) + .subscribe({ + next: (response) => { + if (!response.isPartial && !response.isRunning) { + setTimeTook(response.rawResponse.took); + const avgResult: number | undefined = response.rawResponse.aggregations + ? response.rawResponse.aggregations[1].value + : undefined; + const message = ( + + Searched {response.rawResponse.hits.total} documents.
+ The average of {selectedField.name} is {avgResult ? Math.floor(avgResult) : 0}. +
+ Is it Cool? {String((response as IMyStrategyResponse).cool)} +
+ ); + notifications.toasts.addSuccess({ + title: 'Query result', + text: mountReactNode(message), + }); + searchSubscription$.unsubscribe(); + } else if (response.isPartial && !response.isRunning) { + // TODO: Make response error status clearer + notifications.toasts.addWarning('An error has occurred'); + searchSubscription$.unsubscribe(); + } + }, + error: () => { + notifications.toasts.addDanger('Failed to run search'); + }, + }); + }; + + const onClickHandler = () => { + doAsyncSearch(); + }; + + const onMyStrategyClickHandler = () => { + doAsyncSearch('myStrategy'); + }; + + const onServerClickHandler = async () => { + if (!indexPattern || !selectedField) return; + try { + const response = await http.get(SERVER_SEARCH_ROUTE_PATH, { + query: { + index: indexPattern.title, + field: selectedField.name, + }, + }); + + notifications.toasts.addSuccess(`Server returned ${JSON.stringify(response)}`); + } catch (e) { + notifications.toasts.addDanger('Failed to run search'); + } + }; + + if (!indexPattern) return null; + + return ( + + + <> + + + + + +

+ +

+
+
+ + + + + + Index Pattern + { + const newIndexPattern = await data.indexPatterns.get(newIndexPatternId); + setIndexPattern(newIndexPattern); + }} + isClearable={false} + /> + + + Numeric Fields + { + const field = indexPattern.getFieldByName(option[0].label); + setSelectedField(field || null); + }} + sortMatchesBy="startsWith" + /> + + + + + + + + +

+ Searching Elasticsearch using data.search +

+
+ + If you want to fetch data from Elasticsearch, you can use the different services + provided by the data plugin. These help you get the index + pattern and search bar configuration, format them into a DSL query and send it + to Elasticsearch. + + + + + + + +

Writing a custom search strategy

+
+ + If you want to do some pre or post processing on the server, you might want to + create a custom search strategy. This example uses such a strategy, passing in + custom input and receiving custom output back. + + + } + checked={getCool} + onChange={(event) => setGetCool(event.target.checked)} + /> + + + + + + +

Using search on the server

+
+ + You can also run your search request from the server, without registering a + search strategy. This request does not take the configuration of{' '} + TopNavMenu into account, but you could pass those down to the + server as well. + + + + +
+
+
+
+ +
+
+ ); +}; diff --git a/examples/search_examples/public/index.scss b/examples/search_examples/public/index.scss new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/examples/search_examples/public/index.ts b/examples/search_examples/public/index.ts new file mode 100644 index 000000000000..cd3208aa0c08 --- /dev/null +++ b/examples/search_examples/public/index.ts @@ -0,0 +1,29 @@ +/* + * 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 './index.scss'; + +import { SearchExamplesPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. +export function plugin() { + return new SearchExamplesPlugin(); +} +export { SearchExamplesPluginSetup, SearchExamplesPluginStart } from './types'; diff --git a/examples/search_examples/public/plugin.ts b/examples/search_examples/public/plugin.ts new file mode 100644 index 000000000000..436304e9d5ff --- /dev/null +++ b/examples/search_examples/public/plugin.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 { + AppMountParameters, + CoreSetup, + CoreStart, + Plugin, + AppNavLinkStatus, +} from '../../../src/core/public'; +import { + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + AppPluginSetupDependencies, + AppPluginStartDependencies, +} from './types'; +import { PLUGIN_NAME } from '../common'; + +export class SearchExamplesPlugin + implements + Plugin< + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + AppPluginSetupDependencies, + AppPluginStartDependencies + > { + public setup( + core: CoreSetup, + { developerExamples }: AppPluginSetupDependencies + ): SearchExamplesPluginSetup { + // Register an application into the side navigation menu + core.application.register({ + id: 'searchExamples', + title: PLUGIN_NAME, + navLinkStatus: AppNavLinkStatus.hidden, + async mount(params: AppMountParameters) { + // Load application bundle + const { renderApp } = await import('./application'); + // Get start services as specified in kibana.json + const [coreStart, depsStart] = await core.getStartServices(); + // Render the application + return renderApp(coreStart, depsStart, params); + }, + }); + + developerExamples.register({ + appId: 'searchExamples', + title: 'Search Examples', + description: `Search Examples`, + }); + + return {}; + } + + public start(core: CoreStart): SearchExamplesPluginStart { + return {}; + } + + public stop() {} +} diff --git a/examples/search_examples/public/types.ts b/examples/search_examples/public/types.ts new file mode 100644 index 000000000000..0670cc590744 --- /dev/null +++ b/examples/search_examples/public/types.ts @@ -0,0 +1,36 @@ +/* + * 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 { NavigationPublicPluginStart } from '../../../src/plugins/navigation/public'; +import { DataPublicPluginStart } from '../../../src/plugins/data/public'; +import { DeveloperExamplesSetup } from '../../developer_examples/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginStart {} + +export interface AppPluginSetupDependencies { + developerExamples: DeveloperExamplesSetup; +} + +export interface AppPluginStartDependencies { + navigation: NavigationPublicPluginStart; + data: DataPublicPluginStart; +} diff --git a/examples/search_examples/server/index.ts b/examples/search_examples/server/index.ts new file mode 100644 index 000000000000..06d41490af57 --- /dev/null +++ b/examples/search_examples/server/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 { PluginInitializerContext } from '../../../src/core/server'; +import { SearchExamplesPlugin } from './plugin'; + +export function plugin(initializerContext: PluginInitializerContext) { + return new SearchExamplesPlugin(initializerContext); +} + +export { SearchExamplesPluginSetup, SearchExamplesPluginStart } from './types'; diff --git a/examples/search_examples/server/my_strategy.ts b/examples/search_examples/server/my_strategy.ts new file mode 100644 index 000000000000..a1116ddbd759 --- /dev/null +++ b/examples/search_examples/server/my_strategy.ts @@ -0,0 +1,40 @@ +/* + * 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 { ISearchStrategy, PluginStart } from '../../../src/plugins/data/server'; +import { IMyStrategyResponse, IMyStrategyRequest } from '../common'; + +export const mySearchStrategyProvider = (data: PluginStart): ISearchStrategy => { + const es = data.search.getSearchStrategy('es'); + return { + search: async (context, request, options): Promise => { + request.debug = true; + const esSearchRes = await es.search(context, request, options); + return { + ...esSearchRes, + cool: (request as IMyStrategyRequest).get_cool ? 'YES' : 'NOPE', + }; + }, + cancel: async (context, id) => { + if (es.cancel) { + es.cancel(context, id); + } + }, + }; +}; diff --git a/examples/search_examples/server/plugin.ts b/examples/search_examples/server/plugin.ts new file mode 100644 index 000000000000..deef5a53b2b7 --- /dev/null +++ b/examples/search_examples/server/plugin.ts @@ -0,0 +1,73 @@ +/* + * 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 { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '../../../src/core/server'; + +import { + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + SearchExamplesPluginSetupDeps, + SearchExamplesPluginStartDeps, +} from './types'; +import { mySearchStrategyProvider } from './my_strategy'; +import { registerRoutes } from './routes'; + +export class SearchExamplesPlugin + implements + Plugin< + SearchExamplesPluginSetup, + SearchExamplesPluginStart, + SearchExamplesPluginSetupDeps, + SearchExamplesPluginStartDeps + > { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup( + core: CoreSetup, + deps: SearchExamplesPluginSetupDeps + ) { + this.logger.debug('search_examples: Setup'); + const router = core.http.createRouter(); + + core.getStartServices().then(([_, depsStart]) => { + const myStrategy = mySearchStrategyProvider(depsStart.data); + deps.data.search.registerSearchStrategy('myStrategy', myStrategy); + registerRoutes(router, depsStart.data); + }); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('search_examples: Started'); + return {}; + } + + public stop() {} +} diff --git a/examples/search_examples/server/routes/index.ts b/examples/search_examples/server/routes/index.ts new file mode 100644 index 000000000000..ea575cf371bb --- /dev/null +++ b/examples/search_examples/server/routes/index.ts @@ -0,0 +1,19 @@ +/* + * 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 { registerRoutes } from './register_routes'; diff --git a/examples/search_examples/server/routes/register_routes.ts b/examples/search_examples/server/routes/register_routes.ts new file mode 100644 index 000000000000..ac3ea28d89d2 --- /dev/null +++ b/examples/search_examples/server/routes/register_routes.ts @@ -0,0 +1,26 @@ +/* + * 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 { IRouter } from 'kibana/server'; +import { PluginStart as DataPluginStart } from 'src/plugins/data/server'; +import { registerServerSearchRoute } from './server_search_route'; + +export function registerRoutes(router: IRouter, data: DataPluginStart) { + registerServerSearchRoute(router, data); +} diff --git a/examples/search_examples/server/routes/server_search_route.ts b/examples/search_examples/server/routes/server_search_route.ts new file mode 100644 index 000000000000..6eb21cf34b4a --- /dev/null +++ b/examples/search_examples/server/routes/server_search_route.ts @@ -0,0 +1,70 @@ +/* + * 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 { PluginStart as DataPluginStart, IEsSearchRequest } from 'src/plugins/data/server'; +import { schema } from '@kbn/config-schema'; +import { IEsSearchResponse } from 'src/plugins/data/common'; +import { IRouter } from '../../../../src/core/server'; +import { SERVER_SEARCH_ROUTE_PATH } from '../../common'; + +export function registerServerSearchRoute(router: IRouter, data: DataPluginStart) { + router.get( + { + path: SERVER_SEARCH_ROUTE_PATH, + validate: { + query: schema.object({ + index: schema.maybe(schema.string()), + field: schema.maybe(schema.string()), + }), + }, + }, + async (context, request, response) => { + const { index, field } = request.query; + // Run a synchronous search server side, by enforcing a high keepalive and waiting for completion. + // If you wish to run the search with polling (in basic+), you'd have to poll on the search API. + // Please reach out to the @app-arch-team if you need this to be implemented. + const res = await data.search.search( + context, + { + params: { + index, + body: { + aggs: { + '1': { + avg: { + field, + }, + }, + }, + }, + waitForCompletionTimeout: '5m', + keepAlive: '5m', + }, + } as IEsSearchRequest, + {} + ); + + return response.ok({ + body: { + aggs: (res as IEsSearchResponse).rawResponse.aggregations, + }, + }); + } + ); +} diff --git a/examples/search_examples/server/types.ts b/examples/search_examples/server/types.ts new file mode 100644 index 000000000000..da0f24a3012b --- /dev/null +++ b/examples/search_examples/server/types.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. + */ + +// Rename PluginStart to something better +import { PluginSetup, PluginStart } from '../../../src/plugins/data/server'; + +export interface SearchExamplesPluginSetupDeps { + data: PluginSetup; +} + +export interface SearchExamplesPluginStartDeps { + data: PluginStart; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchExamplesPluginStart {} diff --git a/examples/search_examples/tsconfig.json b/examples/search_examples/tsconfig.json new file mode 100644 index 000000000000..8a3ced743d0f --- /dev/null +++ b/examples/search_examples/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../typings/**/*", + ], + "exclude": [] +} diff --git a/src/plugins/data/common/search/es_search/types.ts b/src/plugins/data/common/search/es_search/types.ts index db2e31706e95..6fc092376870 100644 --- a/src/plugins/data/common/search/es_search/types.ts +++ b/src/plugins/data/common/search/es_search/types.ts @@ -31,5 +31,13 @@ export interface IEsSearchRequest extends IKibanaSearchRequest { } export interface IEsSearchResponse extends IKibanaSearchResponse { + /** + * Indicates whether async search is still in flight + */ + isRunning?: boolean; + /** + * Indicates whether the results returned are complete or partial + */ + isPartial?: boolean; rawResponse: SearchResponse; } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 216ed018957e..6225d74fb1b3 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -770,6 +770,8 @@ export interface IEsSearchRequest extends IKibanaSearchRequest { // // @public (undocumented) export interface IEsSearchResponse extends IKibanaSearchResponse { + isPartial?: boolean; + isRunning?: boolean; // (undocumented) rawResponse: SearchResponse_2; } @@ -1213,11 +1215,10 @@ export type InputTimeRange = TimeRange | { // @public (undocumented) export type ISearch = (request: IKibanaSearchRequest, options?: ISearchOptions) => Observable; -// Warning: (ae-forgotten-export) The symbol "IStrategyOptions" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ISearchGeneric" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOptions) => Observable; +export type ISearchGeneric = (request: IEsSearchRequest, options?: ISearchOptions) => Observable; // Warning: (ae-missing-release-tag) "ISearchOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1225,6 +1226,8 @@ export type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOpti export interface ISearchOptions { // (undocumented) signal?: AbortSignal; + // (undocumented) + strategy?: string; } // Warning: (ae-forgotten-export) The symbol "SearchSource" needs to be exported by the entry point index.d.ts @@ -1723,7 +1726,7 @@ export class SearchInterceptor { // (undocumented) protected readonly requestTimeout?: number | undefined; // (undocumented) - protected runSearch(request: IEsSearchRequest, signal: AbortSignal): Observable; + protected runSearch(request: IEsSearchRequest, signal: AbortSignal, strategy?: string): Observable; search(request: IEsSearchRequest, options?: ISearchOptions): Observable; // (undocumented) protected setupTimers(options?: ISearchOptions): { diff --git a/src/plugins/data/public/query/mocks.ts b/src/plugins/data/public/query/mocks.ts index 8c15d9d6d015..53c177de0fa3 100644 --- a/src/plugins/data/public/query/mocks.ts +++ b/src/plugins/data/public/query/mocks.ts @@ -44,6 +44,7 @@ const createStartContractMock = () => { savedQueries: jest.fn() as any, state$: new Observable(), timefilter: timefilterServiceMock.createStartContract(), + getEsQuery: jest.fn(), }; return startContract; diff --git a/src/plugins/data/public/query/query_service.ts b/src/plugins/data/public/query/query_service.ts index da514c0e24ea..fe7fdcbb1d11 100644 --- a/src/plugins/data/public/query/query_service.ts +++ b/src/plugins/data/public/query/query_service.ts @@ -26,6 +26,9 @@ import { TimefilterService, TimefilterSetup } from './timefilter'; import { createSavedQueryService } from './saved_query/saved_query_service'; import { createQueryStateObservable } from './state_sync/create_global_query_observable'; import { QueryStringManager, QueryStringContract } from './query_string'; +import { buildEsQuery, getEsQueryConfig } from '../../common'; +import { getUiSettings } from '../services'; +import { IndexPattern } from '..'; /** * Query Service @@ -86,6 +89,16 @@ export class QueryService { savedQueries: createSavedQueryService(savedObjectsClient), state$: this.state$, timefilter: this.timefilter, + getEsQuery: (indexPattern: IndexPattern) => { + const timeFilter = this.timefilter.timefilter.createFilter(indexPattern); + + return buildEsQuery( + indexPattern, + this.queryStringManager.getQuery(), + [...this.filterManager.getFilters(), ...(timeFilter ? [timeFilter] : [])], + getEsQueryConfig(getUiSettings()) + ); + }, }; } diff --git a/src/plugins/data/public/search/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor.ts index 677ad0ccea67..d6fcde8e986f 100644 --- a/src/plugins/data/public/search/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor.ts @@ -17,11 +17,12 @@ * under the License. */ +import { trimEnd } from 'lodash'; import { BehaviorSubject, throwError, timer, Subscription, defer, from, Observable } from 'rxjs'; import { finalize, filter } from 'rxjs/operators'; import { ApplicationStart, Toast, ToastsStart, CoreStart } from 'kibana/public'; import { getCombinedSignal, AbortError } from '../../common/utils'; -import { IEsSearchRequest, IEsSearchResponse } from '../../common/search'; +import { IEsSearchRequest, IEsSearchResponse, ES_SEARCH_STRATEGY } from '../../common/search'; import { ISearchOptions } from './types'; import { getLongQueryNotification } from './long_query_notification'; import { SearchUsageCollector } from './collectors'; @@ -92,14 +93,20 @@ export class SearchInterceptor { protected runSearch( request: IEsSearchRequest, - signal: AbortSignal + signal: AbortSignal, + strategy?: string ): Observable { const { id, ...searchRequest } = request; - const path = id != null ? `/internal/search/es/${id}` : '/internal/search/es'; - const method = 'POST'; + const path = trimEnd(`/internal/search/${strategy || ES_SEARCH_STRATEGY}/${id || ''}`, '/'); const body = JSON.stringify(id != null ? {} : searchRequest); - const response = this.deps.http.fetch({ path, method, body, signal }); - return from(response); + return from( + this.deps.http.fetch({ + method: 'POST', + path, + body, + signal, + }) + ); } /** @@ -120,7 +127,7 @@ export class SearchInterceptor { const { combinedSignal, cleanup } = this.setupTimers(options); this.pendingCount$.next(++this.pendingCount); - return this.runSearch(request, combinedSignal).pipe( + return this.runSearch(request, combinedSignal, options?.strategy).pipe( finalize(() => { this.pendingCount$.next(--this.pendingCount); cleanup(); diff --git a/src/plugins/data/public/search/types.ts b/src/plugins/data/public/search/types.ts index ec74275f35c0..f80a13d048a6 100644 --- a/src/plugins/data/public/search/types.ts +++ b/src/plugins/data/public/search/types.ts @@ -37,6 +37,7 @@ import { GetInternalStartServicesFn } from '../types'; export interface ISearchOptions { signal?: AbortSignal; + strategy?: string; } export type ISearch = ( @@ -44,14 +45,9 @@ export type ISearch = ( options?: ISearchOptions ) => Observable; -// Service API types -export interface IStrategyOptions extends ISearchOptions { - strategy?: string; -} - export type ISearchGeneric = ( request: IEsSearchRequest, - options?: IStrategyOptions + options?: ISearchOptions ) => Observable; export interface ISearchStartLegacy { diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index 1f3d7fbcb9f0..73ed88850d78 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -161,7 +161,12 @@ import { toAbsoluteDates, } from '../common'; -export { EsaggsExpressionFunctionDefinition, ParsedInterval } from '../common'; +export { + EsaggsExpressionFunctionDefinition, + ParsedInterval, + IEsSearchRequest, + IEsSearchResponse, +} from '../common'; export { ISearchStrategy, diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts index bc59bdee6a40..2888f9d9d20b 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts @@ -78,7 +78,7 @@ describe('ES search strategy', () => { }); }); - it('returns total, loaded, and raw response', async () => { + it('has all response parameters', async () => { const params = { index: 'logstash-*' }; const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); @@ -86,7 +86,8 @@ describe('ES search strategy', () => { params, }); - expect(response).toHaveProperty('total'); + expect(response.isRunning).toBe(false); + expect(response.isPartial).toBe(false); expect(response).toHaveProperty('loaded'); expect(response).toHaveProperty('rawResponse'); }); diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index 78ead6df1a44..234c30376d6d 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -30,7 +30,7 @@ export const esSearchStrategyProvider = ( ): ISearchStrategy => { return { search: async (context, request, options) => { - logger.info(`search ${JSON.stringify(request.params)}`); + logger.info(`search ${request.params?.index}`); const config = await config$.pipe(first()).toPromise(); const defaultParams = getDefaultSearchParams(config); @@ -56,7 +56,12 @@ export const esSearchStrategyProvider = ( // The above query will either complete or timeout and throw an error. // There is no progress indication on this api. - return { rawResponse, ...getTotalLoaded(rawResponse._shards) }; + return { + isPartial: false, + isRunning: false, + rawResponse, + ...getTotalLoaded(rawResponse._shards), + }; } catch (e) { if (usage) usage.trackError(); throw e; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 013034c79d3f..37d569a4bf9f 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -369,6 +369,30 @@ export function getTotalLoaded({ total, failed, successful }: ShardsResponse): { loaded: number; }; +// Warning: (ae-forgotten-export) The symbol "IKibanaSearchRequest" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IEsSearchRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface IEsSearchRequest extends IKibanaSearchRequest { + // (undocumented) + indexType?: string; + // Warning: (ae-forgotten-export) The symbol "ISearchRequestParams" needs to be exported by the entry point index.d.ts + // + // (undocumented) + params?: ISearchRequestParams; +} + +// Warning: (ae-forgotten-export) The symbol "IKibanaSearchResponse" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "IEsSearchResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface IEsSearchResponse extends IKibanaSearchResponse { + isPartial?: boolean; + isRunning?: boolean; + // (undocumented) + rawResponse: SearchResponse; +} + // Warning: (ae-missing-release-tag) "IFieldFormatsRegistry" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -547,8 +571,6 @@ export interface ISearchSetup { export interface ISearchStart { getSearchStrategy: (name: string) => ISearchStrategy; // Warning: (ae-forgotten-export) The symbol "RequestHandlerContext" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "IKibanaSearchRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "IKibanaSearchResponse" needs to be exported by the entry point index.d.ts // // (undocumented) search: (context: RequestHandlerContext, request: IKibanaSearchRequest, options: ISearchOptions) => Promise; @@ -560,9 +582,6 @@ export interface ISearchStart { export interface ISearchStrategy { // (undocumented) cancel?: (context: RequestHandlerContext, id: string) => Promise; - // Warning: (ae-forgotten-export) The symbol "IEsSearchRequest" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "IEsSearchResponse" needs to be exported by the entry point index.d.ts - // // (undocumented) search: (context: RequestHandlerContext, request: IEsSearchRequest, options?: ISearchOptions) => Promise; } @@ -817,13 +836,13 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:180:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:181:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:182:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:183:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:184:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:188:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:185:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:186:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:187:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:188:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:189:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:190:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:193:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/x-pack/plugins/data_enhanced/common/index.ts b/x-pack/plugins/data_enhanced/common/index.ts index 4d38e5486907..1f1cd938c97d 100644 --- a/x-pack/plugins/data_enhanced/common/index.ts +++ b/x-pack/plugins/data_enhanced/common/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { - EnhancedSearchParams, - IEnhancedEsSearchRequest, - IAsyncSearchRequest, - IAsyncSearchResponse, -} from './search'; +export { EnhancedSearchParams, IEnhancedEsSearchRequest, IAsyncSearchRequest } from './search'; diff --git a/x-pack/plugins/data_enhanced/common/search/index.ts b/x-pack/plugins/data_enhanced/common/search/index.ts index 9137e551adeb..129e412a47cc 100644 --- a/x-pack/plugins/data_enhanced/common/search/index.ts +++ b/x-pack/plugins/data_enhanced/common/search/index.ts @@ -4,9 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { - EnhancedSearchParams, - IEnhancedEsSearchRequest, - IAsyncSearchRequest, - IAsyncSearchResponse, -} from './types'; +export { EnhancedSearchParams, IEnhancedEsSearchRequest, IAsyncSearchRequest } from './types'; diff --git a/x-pack/plugins/data_enhanced/common/search/types.ts b/x-pack/plugins/data_enhanced/common/search/types.ts index c29deee5e4cb..a5d7d326cecd 100644 --- a/x-pack/plugins/data_enhanced/common/search/types.ts +++ b/x-pack/plugins/data_enhanced/common/search/types.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - IEsSearchRequest, - IEsSearchResponse, - ISearchRequestParams, -} from '../../../../../src/plugins/data/common'; +import { IEsSearchRequest, ISearchRequestParams } from '../../../../../src/plugins/data/common'; export interface EnhancedSearchParams extends ISearchRequestParams { ignoreThrottled: boolean; @@ -23,17 +19,6 @@ export interface IAsyncSearchRequest extends IEsSearchRequest { params?: EnhancedSearchParams; } -export interface IAsyncSearchResponse extends IEsSearchResponse { - /** - * Indicates whether async search is still in flight - */ - is_running?: boolean; - /** - * Indicates whether the results returned are complete or partial - */ - is_partial?: boolean; -} - export interface IEnhancedEsSearchRequest extends IEsSearchRequest { /** * Used to determine whether to use the _rollups_search or a regular search endpoint. diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts index 639f56d0cafc..d004511fa467 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.test.ts @@ -72,8 +72,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, rawResponse: { took: 1, @@ -99,8 +99,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, rawResponse: { took: 1, @@ -110,8 +110,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 20, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, rawResponse: { took: 1, @@ -144,8 +144,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: true, - is_running: false, + isPartial: true, + isRunning: false, id: 1, }, }, @@ -168,8 +168,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 500, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -194,16 +194,16 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, }, }, { time: 300, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -238,8 +238,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 2000, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -262,16 +262,16 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, }, }, { time: 2000, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -302,8 +302,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: true, + isPartial: false, + isRunning: true, id: 1, }, }, @@ -311,8 +311,8 @@ describe('EnhancedSearchInterceptor', () => { time: 10, value: { error: 'oh no', - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, isError: true, @@ -346,16 +346,16 @@ describe('EnhancedSearchInterceptor', () => { { time: 10, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, { time: 20, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, }, }, @@ -380,8 +380,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 250, value: { - is_partial: true, - is_running: true, + isPartial: true, + isRunning: true, id: 1, rawResponse: { took: 1, @@ -391,8 +391,8 @@ describe('EnhancedSearchInterceptor', () => { { time: 2000, value: { - is_partial: false, - is_running: false, + isPartial: false, + isRunning: false, id: 1, rawResponse: { took: 1, diff --git a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts index 9662b9e17248..bff9e2cb9048 100644 --- a/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts +++ b/x-pack/plugins/data_enhanced/public/search/search_interceptor.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Observable, throwError, EMPTY, timer, from } from 'rxjs'; +import { throwError, EMPTY, timer, from } from 'rxjs'; import { mergeMap, expand, takeUntil, finalize, tap } from 'rxjs/operators'; import { getLongQueryNotification } from './long_query_notification'; import { @@ -14,7 +14,7 @@ import { } from '../../../../../src/plugins/data/public'; import { AbortError, toPromise } from '../../../../../src/plugins/data/common'; import { IAsyncSearchOptions } from '.'; -import { IAsyncSearchRequest, IAsyncSearchResponse } from '../../common'; +import { IAsyncSearchRequest } from '../../common'; export class EnhancedSearchInterceptor extends SearchInterceptor { /** @@ -67,7 +67,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { public search( request: IAsyncSearchRequest, { pollInterval = 1000, ...options }: IAsyncSearchOptions = {} - ): Observable { + ) { let { id } = request; request.params = { @@ -80,15 +80,15 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { this.pendingCount$.next(++this.pendingCount); - return (this.runSearch(request, combinedSignal) as Observable).pipe( - expand((response: IAsyncSearchResponse) => { + return this.runSearch(request, combinedSignal, options?.strategy).pipe( + expand((response) => { // If the response indicates of an error, stop polling and complete the observable - if (!response || (!response.is_running && response.is_partial)) { + if (!response || (!response.isRunning && response.isPartial)) { return throwError(new AbortError()); } // If the response indicates it is complete, stop polling and complete the observable - if (!response.is_running) { + if (!response.isRunning) { return EMPTY; } @@ -97,7 +97,7 @@ export class EnhancedSearchInterceptor extends SearchInterceptor { return timer(pollInterval).pipe( // Send future requests using just the ID from the response mergeMap(() => { - return this.runSearch({ id }, combinedSignal) as Observable; + return this.runSearch({ id }, combinedSignal, options?.strategy); }) ); }), diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index 0ed5485cfb6c..95f1285363f4 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -128,8 +128,8 @@ async function asyncSearch( return { id, - is_partial, - is_running, + isPartial: is_partial, + isRunning: is_running, rawResponse: shimHitsTotal(response), ...getTotalLoaded(response._shards), }; From a81059b14baebcd60e499fd3eaef425f00e91163 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 12 Aug 2020 09:24:43 +0100 Subject: [PATCH 25/25] [ML] Removing full lodash library imports (#74742) * [ML] Removing full lodash library imports * more has * fixing missing filter * removing _ * removing unused file * removing first use * removing comment --- x-pack/plugins/ml/common/util/job_utils.ts | 18 +++-- .../annotations_table/annotations_table.js | 14 ++-- .../anomalies_table/anomalies_table.js | 4 +- .../anomalies_table_columns.js | 4 +- .../anomalies_table/anomaly_details.js | 15 ++-- .../anomalies_table/influencers_cell.js | 4 +- .../components/anomalies_table/links_menu.js | 12 +-- .../explorer_chart_config_builder.js | 4 +- .../explorer_chart_distribution.js | 14 ++-- .../explorer_chart_single_metric.js | 14 ++-- .../explorer_charts_container_service.js | 59 +++++++------- .../explorer_charts_container_service.test.js | 10 +-- .../explorer/explorer_swimlane.tsx | 20 ++--- .../application/services/forecast_service.js | 34 ++++---- .../application/services/job_service.js | 48 ++++++----- .../application/services/mapping_service.js | 6 +- .../results_service/result_service_rx.ts | 35 ++++---- .../results_service/results_service.js | 81 ++++++++++--------- .../forecasting_modal/forecasting_modal.js | 8 +- .../timeseries_chart/timeseries_chart.js | 42 +++++----- .../timeseries_search_service.ts | 27 ++++--- .../timeseriesexplorer_utils.js | 34 ++++---- .../application/util/chart_config_builder.js | 11 +-- .../ml/public/application/util/inherits.js | 36 --------- .../public/application/util/time_buckets.js | 18 +++-- .../ml/server/lib/telemetry/telemetry.ts | 4 +- .../models/annotation_service/annotation.ts | 9 ++- .../bucket_span_estimator.js | 25 +++--- .../polled_data_checker.js | 4 +- .../models/data_visualizer/data_visualizer.ts | 77 +++++++++--------- .../validate_cardinality.test.ts | 14 ++-- .../validate_time_range.test.ts | 4 +- .../build_anomaly_table_items.js | 13 +-- .../models/results_service/results_service.ts | 14 ++-- 34 files changed, 365 insertions(+), 371 deletions(-) delete mode 100644 x-pack/plugins/ml/public/application/util/inherits.js diff --git a/x-pack/plugins/ml/common/util/job_utils.ts b/x-pack/plugins/ml/common/util/job_utils.ts index bb0e351ebfec..8e6933ed5924 100644 --- a/x-pack/plugins/ml/common/util/job_utils.ts +++ b/x-pack/plugins/ml/common/util/job_utils.ts @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import isEmpty from 'lodash/isEmpty'; +import isEqual from 'lodash/isEqual'; +import each from 'lodash/each'; +import pick from 'lodash/pick'; + import semver from 'semver'; import moment, { Duration } from 'moment'; // @ts-ignore @@ -307,7 +311,7 @@ export function getSafeAggregationName(fieldName: string, index: number): string export function uniqWithIsEqual(arr: T): T { return arr.reduce((dedupedArray, value) => { - if (dedupedArray.filter((compareValue: any) => _.isEqual(compareValue, value)).length === 0) { + if (dedupedArray.filter((compareValue: any) => isEqual(compareValue, value)).length === 0) { dedupedArray.push(value); } return dedupedArray; @@ -328,7 +332,7 @@ export function basicJobValidation( if (job) { // Job details - if (_.isEmpty(job.job_id)) { + if (isEmpty(job.job_id)) { messages.push({ id: 'job_id_empty' }); valid = false; } else if (isJobIdValid(job.job_id) === false) { @@ -350,7 +354,7 @@ export function basicJobValidation( // Analysis Configuration if (job.analysis_config.categorization_filters) { let v = true; - _.each(job.analysis_config.categorization_filters, (d) => { + each(job.analysis_config.categorization_filters, (d) => { try { new RegExp(d); } catch (e) { @@ -382,8 +386,8 @@ export function basicJobValidation( valid = false; } else { let v = true; - _.each(job.analysis_config.detectors, (d) => { - if (_.isEmpty(d.function)) { + each(job.analysis_config.detectors, (d) => { + if (isEmpty(d.function)) { v = false; } }); @@ -400,7 +404,7 @@ export function basicJobValidation( // create an array of objects with a subset of the attributes // where we want to make sure they are not be the same across detectors const compareSubSet = job.analysis_config.detectors.map((d) => - _.pick(d, [ + pick(d, [ 'function', 'field_name', 'by_field_name', diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js index 69f7635a6603..c6ca4fb82198 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js +++ b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js @@ -9,7 +9,9 @@ * This version supports both fetching the annotations by itself (used in the jobs list) and * getting the annotations via props (used in Anomaly Explorer and Single Series Viewer). */ -import _ from 'lodash'; + +import uniq from 'lodash/uniq'; + import PropTypes from 'prop-types'; import rison from 'rison-node'; import React, { Component, Fragment } from 'react'; @@ -255,18 +257,18 @@ export class AnnotationsTable extends Component { // if the annotation is at the series level // then pass the partitioning field(s) and detector index to the Single Metric Viewer - if (_.has(annotation, 'detector_index')) { + if (annotation.detector_index !== undefined) { mlTimeSeriesExplorer.detectorIndex = annotation.detector_index; } - if (_.has(annotation, 'partition_field_value')) { + if (annotation.partition_field_value !== undefined) { entityCondition[annotation.partition_field_name] = annotation.partition_field_value; } - if (_.has(annotation, 'over_field_value')) { + if (annotation.over_field_value !== undefined) { entityCondition[annotation.over_field_name] = annotation.over_field_value; } - if (_.has(annotation, 'by_field_value')) { + if (annotation.by_field_value !== undefined) { // Note that analyses with by and over fields, will have a top-level by_field_name, // but the by_field_value(s) will be in the nested causes array. entityCondition[annotation.by_field_name] = annotation.by_field_value; @@ -421,7 +423,7 @@ export class AnnotationsTable extends Component { }, ]; - const jobIds = _.uniq(annotations.map((a) => a.job_id)); + const jobIds = uniq(annotations.map((a) => a.job_id)); if (jobIds.length > 1) { columns.unshift({ field: 'job_id', diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js index 2a890f75fecd..378ee8280517 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table.js @@ -9,7 +9,7 @@ */ import PropTypes from 'prop-types'; -import _ from 'lodash'; +import get from 'lodash/get'; import React, { Component } from 'react'; @@ -70,7 +70,7 @@ class AnomaliesTable extends Component { } else { const examples = item.entityName === 'mlcategory' - ? _.get(this.props.tableData, ['examplesByJobId', item.jobId, item.entityValue]) + ? get(this.props.tableData, ['examplesByJobId', item.jobId, item.entityValue]) : undefined; let definition = undefined; diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js index af7c6c8e289f..57f3a08713ff 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomalies_table_columns.js @@ -7,7 +7,7 @@ import { EuiButtonIcon, EuiLink, EuiScreenReaderOnly } from '@elastic/eui'; import React from 'react'; -import _ from 'lodash'; +import get from 'lodash/get'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -251,7 +251,7 @@ export function getColumns( sortable: false, truncateText: true, render: (item) => { - const examples = _.get(examplesByJobId, [item.jobId, item.entityValue], []); + const examples = get(examplesByJobId, [item.jobId, item.entityValue], []); return ( { - const simplified = _.pick(cause, 'typical', 'actual', 'probability'); + const simplified = pick(cause, 'typical', 'actual', 'probability'); // Get the 'entity field name/value' to display in the cause - // For by and over, use by_field_name/value (over_field_name/value are in the top level fields) // For just an 'over' field - the over_field_name/value appear in both top level and cause. - simplified.entityName = _.has(cause, 'by_field_name') - ? cause.by_field_name - : cause.over_field_name; - simplified.entityValue = _.has(cause, 'by_field_value') - ? cause.by_field_value - : cause.over_field_value; + simplified.entityName = cause.by_field_name ? cause.by_field_name : cause.over_field_name; + simplified.entityValue = cause.by_field_value ? cause.by_field_value : cause.over_field_value; return simplified; }); } @@ -471,7 +468,7 @@ export class AnomalyDetails extends Component { renderDetails() { const detailItems = getDetailsItems(this.props.anomaly, this.props.examples, this.props.filter); - const isInterimResult = _.get(this.props.anomaly, 'source.is_interim', false); + const isInterimResult = get(this.props.anomaly, 'source.is_interim', false); return ( diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js b/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js index 2e42606c048d..abdb0961351a 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/influencers_cell.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; @@ -148,7 +148,7 @@ export class InfluencersCell extends Component { const influencers = []; recordInfluencers.forEach((influencer) => { - _.each(influencer, (influencerFieldValue, influencerFieldName) => { + each(influencer, (influencerFieldValue, influencerFieldName) => { influencers.push({ influencerFieldName, influencerFieldValue, diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js index f603264896cd..0e4d736a01e4 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import moment from 'moment'; import rison from 'rison-node'; import PropTypes from 'prop-types'; @@ -58,7 +58,7 @@ class LinksMenuUI extends Component { // If url_value contains $earliest$ and $latest$ tokens, add in times to the source record. // Create a copy of the record as we are adding properties into it. - const record = _.cloneDeep(anomaly.source); + const record = cloneDeep(anomaly.source); const timestamp = record.timestamp; const configuredUrlValue = customUrl.url_value; const timeRangeInterval = parseInterval(customUrl.time_range); @@ -99,7 +99,7 @@ class LinksMenuUI extends Component { if ( (configuredUrlValue.includes('$mlcategoryterms$') || configuredUrlValue.includes('$mlcategoryregex$')) && - _.has(record, 'mlcategory') + record.mlcategory !== undefined ) { const jobId = record.job_id; @@ -156,15 +156,15 @@ class LinksMenuUI extends Component { // Extract the by, over and partition fields for the record. const entityCondition = {}; - if (_.has(record, 'partition_field_value')) { + if (record.partition_field_value !== undefined) { entityCondition[record.partition_field_name] = record.partition_field_value; } - if (_.has(record, 'over_field_value')) { + if (record.over_field_value !== undefined) { entityCondition[record.over_field_name] = record.over_field_value; } - if (_.has(record, 'by_field_value')) { + if (record.by_field_value !== undefined) { // Note that analyses with by and over fields, will have a top-level by_field_name, // but the by_field_value(s) will be in the nested causes array. // TODO - drilldown from cause in expanded row only? diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js index b5e9daad7d1c..b75784c95c52 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_config_builder.js @@ -9,8 +9,6 @@ * the raw data in the Explorer dashboard. */ -import _ from 'lodash'; - import { parseInterval } from '../../../../common/util/parse_interval'; import { getEntityFieldList } from '../../../../common/util/anomaly_utils'; import { buildConfigFromDetector } from '../../util/chart_config_builder'; @@ -30,7 +28,7 @@ export function buildConfig(record) { config.detectorLabel = record.function; if ( - _.has(mlJobService.detectorsByJob, record.job_id) && + mlJobService.detectorsByJob[record.job_id] !== undefined && detectorIndex < mlJobService.detectorsByJob[record.job_id].length ) { config.detectorLabel = diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js index 7a18914957ba..00aca5d43be8 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js @@ -11,8 +11,8 @@ import PropTypes from 'prop-types'; import React from 'react'; +import { i18n } from '@kbn/i18n'; -import _ from 'lodash'; import d3 from 'd3'; import $ from 'jquery'; import moment from 'moment'; @@ -33,8 +33,6 @@ import { mlFieldFormatService } from '../../services/field_format_service'; import { CHART_TYPE } from '../explorer_constants'; -import { i18n } from '@kbn/i18n'; - const CONTENT_WRAPPER_HEIGHT = 215; // If a rare/event-distribution chart has a cardinality of 10 or less, @@ -403,7 +401,7 @@ export class ExplorerChartDistribution extends React.Component { .attr('cy', (d) => lineChartYScale(d[CHART_Y_ATTRIBUTE])) .attr('class', (d) => { let markerClass = 'metric-value'; - if (_.has(d, 'anomalyScore') && Number(d.anomalyScore) >= severity) { + if (d.anomalyScore !== undefined && Number(d.anomalyScore) >= severity) { markerClass += ' anomaly-marker '; markerClass += getSeverityWithLow(d.anomalyScore).id; } @@ -444,7 +442,7 @@ export class ExplorerChartDistribution extends React.Component { const tooltipData = [{ label: formattedDate }]; const seriesKey = config.detectorLabel; - if (_.has(marker, 'entity')) { + if (marker.entity !== undefined) { tooltipData.push({ label: i18n.translate('xpack.ml.explorer.distributionChart.entityLabel', { defaultMessage: 'entity', @@ -457,7 +455,7 @@ export class ExplorerChartDistribution extends React.Component { }); } - if (_.has(marker, 'anomalyScore')) { + if (marker.anomalyScore !== undefined) { const score = parseInt(marker.anomalyScore); const displayScore = score > 0 ? score : '< 1'; tooltipData.push({ @@ -494,7 +492,7 @@ export class ExplorerChartDistribution extends React.Component { valueAccessor: 'typical', }); } - if (typeof marker.byFieldName !== 'undefined' && _.has(marker, 'numberOfCauses')) { + if (typeof marker.byFieldName !== 'undefined' && marker.numberOfCauses !== undefined) { tooltipData.push({ label: i18n.translate( 'xpack.ml.explorer.distributionChart.unusualByFieldValuesLabel', @@ -532,7 +530,7 @@ export class ExplorerChartDistribution extends React.Component { }); } - if (_.has(marker, 'scheduledEvents')) { + if (marker.scheduledEvents !== undefined) { marker.scheduledEvents.forEach((scheduledEvent, i) => { tooltipData.push({ label: i18n.translate( diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js index 63775c5ca312..4d53e747d485 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_single_metric.js @@ -12,10 +12,10 @@ import PropTypes from 'prop-types'; import React from 'react'; -import _ from 'lodash'; import d3 from 'd3'; import $ from 'jquery'; import moment from 'moment'; +import { i18n } from '@kbn/i18n'; import { formatHumanReadableDateTime } from '../../util/date_utils'; import { formatValue } from '../../formatters/format_value'; @@ -40,8 +40,6 @@ import { getTimeBucketsFromCache } from '../../util/time_buckets'; import { mlEscape } from '../../util/string_utils'; import { mlFieldFormatService } from '../../services/field_format_service'; -import { i18n } from '@kbn/i18n'; - const CONTENT_WRAPPER_HEIGHT = 215; const CONTENT_WRAPPER_CLASS = 'ml-explorer-chart-content-wrapper'; @@ -307,7 +305,7 @@ export class ExplorerChartSingleMetric extends React.Component { .on('mouseout', () => tooltipService.hide()); const isAnomalyVisible = (d) => - _.has(d, 'anomalyScore') && Number(d.anomalyScore) >= severity; + d.anomalyScore !== undefined && Number(d.anomalyScore) >= severity; // Update all dots to new positions. dots @@ -380,7 +378,7 @@ export class ExplorerChartSingleMetric extends React.Component { const tooltipData = [{ label: formattedDate }]; const seriesKey = config.detectorLabel; - if (_.has(marker, 'anomalyScore')) { + if (marker.anomalyScore !== undefined) { const score = parseInt(marker.anomalyScore); const displayScore = score > 0 ? score : '< 1'; tooltipData.push({ @@ -411,7 +409,7 @@ export class ExplorerChartSingleMetric extends React.Component { // Show actual/typical when available except for rare detectors. // Rare detectors always have 1 as actual and the probability as typical. // Exposing those values in the tooltip with actual/typical labels might irritate users. - if (_.has(marker, 'actual') && config.functionDescription !== 'rare') { + if (marker.actual !== undefined && config.functionDescription !== 'rare') { // Display the record actual in preference to the chart value, which may be // different depending on the aggregation interval of the chart. tooltipData.push({ @@ -445,7 +443,7 @@ export class ExplorerChartSingleMetric extends React.Component { }, valueAccessor: 'value', }); - if (_.has(marker, 'byFieldName') && _.has(marker, 'numberOfCauses')) { + if (marker.byFieldName !== undefined && marker.numberOfCauses !== undefined) { tooltipData.push({ label: i18n.translate( 'xpack.ml.explorer.distributionChart.unusualByFieldValuesLabel', @@ -483,7 +481,7 @@ export class ExplorerChartSingleMetric extends React.Component { }); } - if (_.has(marker, 'scheduledEvents')) { + if (marker.scheduledEvents !== undefined) { tooltipData.push({ label: i18n.translate('xpack.ml.explorer.singleMetricChart.scheduledEventsLabel', { defaultMessage: 'Scheduled events', diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js index 1b83a4ed3056..712b64af2db8 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.js @@ -11,7 +11,12 @@ * and manages the layout of the charts in the containing div. */ -import _ from 'lodash'; +import get from 'lodash/get'; +import each from 'lodash/each'; +import find from 'lodash/find'; +import sortBy from 'lodash/sortBy'; +import map from 'lodash/map'; +import reduce from 'lodash/reduce'; import { buildConfig } from './explorer_chart_config_builder'; import { chartLimits, getChartType } from '../../util/chart_utils'; @@ -113,7 +118,7 @@ export const anomalyDataChange = function ( // If source data can be plotted, use that, otherwise model plot will be available. const useSourceData = isSourceDataChartableForDetector(job, detectorIndex); if (useSourceData === true) { - const datafeedQuery = _.get(config, 'datafeedConfig.query', null); + const datafeedQuery = get(config, 'datafeedConfig.query', null); return mlResultsService .getMetricData( config.datafeedConfig.indices, @@ -131,8 +136,8 @@ export const anomalyDataChange = function ( // Extract the partition, by, over fields on which to filter. const criteriaFields = []; const detector = job.analysis_config.detectors[detectorIndex]; - if (_.has(detector, 'partition_field_name')) { - const partitionEntity = _.find(entityFields, { + if (detector.partition_field_name !== undefined) { + const partitionEntity = find(entityFields, { fieldName: detector.partition_field_name, }); if (partitionEntity !== undefined) { @@ -143,8 +148,8 @@ export const anomalyDataChange = function ( } } - if (_.has(detector, 'over_field_name')) { - const overEntity = _.find(entityFields, { fieldName: detector.over_field_name }); + if (detector.over_field_name !== undefined) { + const overEntity = find(entityFields, { fieldName: detector.over_field_name }); if (overEntity !== undefined) { criteriaFields.push( { fieldName: 'over_field_name', fieldValue: overEntity.fieldName }, @@ -153,8 +158,8 @@ export const anomalyDataChange = function ( } } - if (_.has(detector, 'by_field_name')) { - const byEntity = _.find(entityFields, { fieldName: detector.by_field_name }); + if (detector.by_field_name !== undefined) { + const byEntity = find(entityFields, { fieldName: detector.by_field_name }); if (byEntity !== undefined) { criteriaFields.push( { fieldName: 'by_field_name', fieldValue: byEntity.fieldName }, @@ -236,7 +241,7 @@ export const anomalyDataChange = function ( filterField = config.entityFields.find((f) => f.fieldType === 'partition'); } - const datafeedQuery = _.get(config, 'datafeedConfig.query', null); + const datafeedQuery = get(config, 'datafeedConfig.query', null); return mlResultsService.getEventDistributionData( config.datafeedConfig.indices, splitField, @@ -285,7 +290,7 @@ export const anomalyDataChange = function ( if (eventDistribution.length > 0 && records.length > 0) { const filterField = records[0].by_field_value || records[0].over_field_value; chartData = eventDistribution.filter((d) => d.entity !== filterField); - _.map(metricData, (value, time) => { + map(metricData, (value, time) => { // The filtering for rare/event_distribution charts needs to be handled // differently because of how the source data is structured. // For rare chart values we are only interested wether a value is either `0` or not, @@ -304,7 +309,7 @@ export const anomalyDataChange = function ( } }); } else { - chartData = _.map(metricData, (value, time) => ({ + chartData = map(metricData, (value, time) => ({ date: +time, value: value, })); @@ -314,7 +319,7 @@ export const anomalyDataChange = function ( // Iterate through the anomaly records, adding anomalyScore properties // to the chartData entries for anomalous buckets. const chartDataForPointSearch = getChartDataForPointSearch(chartData, records[0], chartType); - _.each(records, (record) => { + each(records, (record) => { // Look for a chart point with the same time as the record. // If none found, insert a point for anomalies due to a gap in the data. const recordTime = record[ML_TIME_FIELD_NAME]; @@ -330,13 +335,13 @@ export const anomalyDataChange = function ( chartPoint.actual = record.actual; chartPoint.typical = record.typical; } else { - const causes = _.get(record, 'causes', []); + const causes = get(record, 'causes', []); if (causes.length > 0) { chartPoint.byFieldName = record.by_field_name; chartPoint.numberOfCauses = causes.length; if (causes.length === 1) { // If only a single cause, copy actual and typical values to the top level. - const cause = _.first(record.causes); + const cause = record.causes[0]; chartPoint.actual = cause.actual; chartPoint.typical = cause.typical; } @@ -351,7 +356,7 @@ export const anomalyDataChange = function ( // Add a scheduledEvents property to any points in the chart data set // which correspond to times of scheduled events for the job. if (scheduledEvents !== undefined) { - _.each(scheduledEvents, (events, time) => { + each(scheduledEvents, (events, time) => { const chartPoint = findChartPointForTime(chartDataForPointSearch, Number(time)); if (chartPoint !== undefined) { // Note if the scheduled event coincides with an absence of the underlying metric data, @@ -385,10 +390,10 @@ export const anomalyDataChange = function ( .then((response) => { // calculate an overall min/max for all series const processedData = response.map(processChartData); - const allDataPoints = _.reduce( + const allDataPoints = reduce( processedData, (datapoints, series) => { - _.each(series, (d) => datapoints.push(d)); + each(series, (d) => datapoints.push(d)); return datapoints; }, [] @@ -420,7 +425,7 @@ function processRecordsForDisplay(anomalyRecords) { // Aggregate by job, detector, and analysis fields (partition, by, over). const aggregatedData = {}; - _.each(anomalyRecords, (record) => { + each(anomalyRecords, (record) => { // Check if we can plot a chart for this record, depending on whether the source data // is chartable, and if model plot is enabled for the job. const job = mlJobService.getJob(record.job_id); @@ -524,20 +529,20 @@ function processRecordsForDisplay(anomalyRecords) { let recordsForSeries = []; // Convert to an array of the records with the highest record_score per unique series. - _.each(aggregatedData, (detectorsForJob) => { - _.each(detectorsForJob, (groupsForDetector) => { + each(aggregatedData, (detectorsForJob) => { + each(detectorsForJob, (groupsForDetector) => { if (groupsForDetector.maxScoreRecord !== undefined) { // Detector with no partition / by field. recordsForSeries.push(groupsForDetector.maxScoreRecord); } else { - _.each(groupsForDetector, (valuesForGroup) => { - _.each(valuesForGroup, (dataForGroupValue) => { + each(groupsForDetector, (valuesForGroup) => { + each(valuesForGroup, (dataForGroupValue) => { if (dataForGroupValue.maxScoreRecord !== undefined) { recordsForSeries.push(dataForGroupValue.maxScoreRecord); } else { // Second level of aggregation for partition and by/over. - _.each(dataForGroupValue, (splitsForGroup) => { - _.each(splitsForGroup, (dataForSplitValue) => { + each(dataForGroupValue, (splitsForGroup) => { + each(splitsForGroup, (dataForSplitValue) => { recordsForSeries.push(dataForSplitValue.maxScoreRecord); }); }); @@ -547,7 +552,7 @@ function processRecordsForDisplay(anomalyRecords) { } }); }); - recordsForSeries = _.sortBy(recordsForSeries, 'record_score').reverse(); + recordsForSeries = sortBy(recordsForSeries, 'record_score').reverse(); return recordsForSeries; } @@ -564,7 +569,7 @@ function calculateChartRange( // Calculate the time range for the charts. // Fit in as many points in the available container width plotted at the job bucket span. const midpointMs = Math.ceil((earliestMs + latestMs) / 2); - const maxBucketSpanMs = Math.max.apply(null, _.map(seriesConfigs, 'bucketSpanSeconds')) * 1000; + const maxBucketSpanMs = Math.max.apply(null, map(seriesConfigs, 'bucketSpanSeconds')) * 1000; const pointsToPlotFullSelection = Math.ceil((latestMs - earliestMs) / maxBucketSpanMs); @@ -588,7 +593,7 @@ function calculateChartRange( let minMs = recordsToPlot[0][timeFieldName]; let maxMs = recordsToPlot[0][timeFieldName]; - _.each(recordsToPlot, (record) => { + each(recordsToPlot, (record) => { const diffMs = maxMs - minMs; if (diffMs < maxTimeSpan) { const recordTime = record[timeFieldName]; diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js index 433aa65cc5dd..a7d422d16110 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container_service.test.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import mockAnomalyChartRecords from './__mocks__/mock_anomaly_chart_records.json'; import mockDetectorsByJob from './__mocks__/mock_detectors_by_job.json'; @@ -24,10 +24,10 @@ import mockSeriesPromisesResponse from './__mocks__/mock_series_promises_respons // suitable responses from the mocked services. The mocked services check against the // provided alternative values and return specific modified mock responses for the test case. -const mockJobConfigClone = _.cloneDeep(mockJobConfig); +const mockJobConfigClone = cloneDeep(mockJobConfig); // adjust mock data to tests against null/0 values -const mockMetricClone = _.cloneDeep(mockSeriesPromisesResponse[0][0]); +const mockMetricClone = cloneDeep(mockSeriesPromisesResponse[0][0]); mockMetricClone.results['1486712700000'] = null; mockMetricClone.results['1486713600000'] = 0; @@ -127,7 +127,7 @@ describe('explorerChartsContainerService', () => { }); test('filtering should skip values of null', (done) => { - const mockAnomalyChartRecordsClone = _.cloneDeep(mockAnomalyChartRecords).map((d) => { + const mockAnomalyChartRecordsClone = cloneDeep(mockAnomalyChartRecords).map((d) => { d.job_id = 'mock-job-id-distribution'; return d; }); @@ -151,7 +151,7 @@ describe('explorerChartsContainerService', () => { }); test('field value with trailing dot should not throw an error', (done) => { - const mockAnomalyChartRecordsClone = _.cloneDeep(mockAnomalyChartRecords); + const mockAnomalyChartRecordsClone = cloneDeep(mockAnomalyChartRecords); mockAnomalyChartRecordsClone[1].partition_field_value = 'AAL.'; expect(() => { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx index 2590ab2f1cb2..05e082711f61 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer_swimlane.tsx @@ -10,7 +10,9 @@ import React from 'react'; import './_explorer.scss'; -import _, { isEqual } from 'lodash'; +import isEqual from 'lodash/isEqual'; +import uniq from 'lodash/uniq'; +import get from 'lodash/get'; import d3 from 'd3'; import moment from 'moment'; import DragSelect from 'dragselect'; @@ -176,9 +178,9 @@ export class ExplorerSwimlane extends React.Component { } ); - selectedData.laneLabels = _.uniq(selectedData.laneLabels); - selectedData.times = _.uniq(selectedData.times); - if (_.isEqual(selectedData, previousSelectedData) === false) { + selectedData.laneLabels = uniq(selectedData.laneLabels); + selectedData.times = uniq(selectedData.times); + if (isEqual(selectedData, previousSelectedData) === false) { // If no cells containing anomalies have been selected, // immediately clear the selection, otherwise trigger // a reload with the updated selected cells. @@ -246,7 +248,7 @@ export class ExplorerSwimlane extends React.Component { selectedTimes: d3.extent(times), }; - if (_.isEqual(oldSelection, newSelection)) { + if (isEqual(oldSelection, newSelection)) { triggerNewSelection = false; } @@ -277,8 +279,8 @@ export class ExplorerSwimlane extends React.Component { // Check for selection and reselect the corresponding swimlane cell // if the time range and lane label are still in view. const selectionState = selection; - const selectedType = _.get(selectionState, 'type', undefined); - const selectionViewByFieldName = _.get(selectionState, 'viewByFieldName', ''); + const selectedType = get(selectionState, 'type', undefined); + const selectionViewByFieldName = get(selectionState, 'viewByFieldName', ''); // If a selection was done in the other swimlane, add the "masked" classes // to de-emphasize the swimlane cells. @@ -288,8 +290,8 @@ export class ExplorerSwimlane extends React.Component { } const cellsToSelect: Node[] = []; - const selectedLanes = _.get(selectionState, 'lanes', []); - const selectedTimes = _.get(selectionState, 'times', []); + const selectedLanes = get(selectionState, 'lanes', []); + const selectedTimes = get(selectionState, 'times', []); const selectedTimeExtent = d3.extent(selectedTimes); if ( diff --git a/x-pack/plugins/ml/public/application/services/forecast_service.js b/x-pack/plugins/ml/public/application/services/forecast_service.js index ed5a29ff74a6..57e50387a03a 100644 --- a/x-pack/plugins/ml/public/application/services/forecast_service.js +++ b/x-pack/plugins/ml/public/application/services/forecast_service.js @@ -6,7 +6,9 @@ // Service for carrying out requests to run ML forecasts and to obtain // data on forecasts that have been performed. -import _ from 'lodash'; +import get from 'lodash/get'; +import find from 'lodash/find'; +import each from 'lodash/each'; import { map } from 'rxjs/operators'; import { ml } from './ml_api_service'; @@ -129,8 +131,8 @@ function getForecastDateRange(job, forecastId) { }, }) .then((resp) => { - obj.earliest = _.get(resp, 'aggregations.earliest.value', null); - obj.latest = _.get(resp, 'aggregations.latest.value', null); + obj.earliest = get(resp, 'aggregations.earliest.value', null); + obj.latest = get(resp, 'aggregations.latest.value', null); if (obj.earliest === null || obj.latest === null) { reject(resp); } else { @@ -157,8 +159,8 @@ function getForecastData( // Extract the partition, by, over fields on which to filter. const criteriaFields = []; const detector = job.analysis_config.detectors[detectorIndex]; - if (_.has(detector, 'partition_field_name')) { - const partitionEntity = _.find(entityFields, { fieldName: detector.partition_field_name }); + if (detector.partition_field_name !== undefined) { + const partitionEntity = find(entityFields, { fieldName: detector.partition_field_name }); if (partitionEntity !== undefined) { criteriaFields.push( { fieldName: 'partition_field_name', fieldValue: partitionEntity.fieldName }, @@ -167,8 +169,8 @@ function getForecastData( } } - if (_.has(detector, 'over_field_name')) { - const overEntity = _.find(entityFields, { fieldName: detector.over_field_name }); + if (detector.over_field_name !== undefined) { + const overEntity = find(entityFields, { fieldName: detector.over_field_name }); if (overEntity !== undefined) { criteriaFields.push( { fieldName: 'over_field_name', fieldValue: overEntity.fieldName }, @@ -177,8 +179,8 @@ function getForecastData( } } - if (_.has(detector, 'by_field_name')) { - const byEntity = _.find(entityFields, { fieldName: detector.by_field_name }); + if (detector.by_field_name !== undefined) { + const byEntity = find(entityFields, { fieldName: detector.by_field_name }); if (byEntity !== undefined) { criteriaFields.push( { fieldName: 'by_field_name', fieldValue: byEntity.fieldName }, @@ -222,7 +224,7 @@ function getForecastData( ]; // Add in term queries for each of the specified criteria. - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { filterCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -281,13 +283,13 @@ function getForecastData( }) .pipe( map((resp) => { - const aggregationsByTime = _.get(resp, ['aggregations', 'times', 'buckets'], []); - _.each(aggregationsByTime, (dataForTime) => { + const aggregationsByTime = get(resp, ['aggregations', 'times', 'buckets'], []); + each(aggregationsByTime, (dataForTime) => { const time = dataForTime.key; obj.results[time] = { - prediction: _.get(dataForTime, ['prediction', 'value']), - forecastUpper: _.get(dataForTime, ['forecastUpper', 'value']), - forecastLower: _.get(dataForTime, ['forecastLower', 'value']), + prediction: get(dataForTime, ['prediction', 'value']), + forecastUpper: get(dataForTime, ['forecastUpper', 'value']), + forecastLower: get(dataForTime, ['forecastLower', 'value']), }; }); @@ -355,7 +357,7 @@ function getForecastRequestStats(job, forecastId) { }) .then((resp) => { if (resp.hits.total !== 0) { - obj.stats = _.first(resp.hits.hits)._source; + obj.stats = resp.hits.hits[0]._source; } resolve(obj); }) diff --git a/x-pack/plugins/ml/public/application/services/job_service.js b/x-pack/plugins/ml/public/application/services/job_service.js index 7e90758ffd7d..704d76059f75 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.js +++ b/x-pack/plugins/ml/public/application/services/job_service.js @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; +import each from 'lodash/each'; +import find from 'lodash/find'; +import get from 'lodash/get'; +import isNumber from 'lodash/isNumber'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; @@ -135,10 +139,10 @@ class JobService { const jobStats = statsResp.jobs[j]; if (job.job_id === jobStats.job_id) { job.state = jobStats.state; - job.data_counts = _.cloneDeep(jobStats.data_counts); - job.model_size_stats = _.cloneDeep(jobStats.model_size_stats); + job.data_counts = cloneDeep(jobStats.data_counts); + job.model_size_stats = cloneDeep(jobStats.model_size_stats); if (jobStats.node) { - job.node = _.cloneDeep(jobStats.node); + job.node = cloneDeep(jobStats.node); } if (jobStats.open_time) { job.open_time = jobStats.open_time; @@ -212,10 +216,10 @@ class JobService { newJob.state = statsJob.state; newJob.data_counts = {}; newJob.model_size_stats = {}; - newJob.data_counts = _.cloneDeep(statsJob.data_counts); - newJob.model_size_stats = _.cloneDeep(statsJob.model_size_stats); + newJob.data_counts = cloneDeep(statsJob.data_counts); + newJob.model_size_stats = cloneDeep(statsJob.model_size_stats); if (newJob.node) { - newJob.node = _.cloneDeep(statsJob.node); + newJob.node = cloneDeep(statsJob.node); } if (statsJob.open_time) { @@ -352,7 +356,7 @@ class JobService { // create a deep copy of a job object // also remove items from the job which are set by the server and not needed // in the future this formatting could be optional - const tempJob = _.cloneDeep(job); + const tempJob = cloneDeep(job); // remove all of the items which should not be copied // such as counts, state and times @@ -375,7 +379,7 @@ class JobService { delete tempJob.analysis_config.use_per_partition_normalization; - _.each(tempJob.analysis_config.detectors, (d) => { + each(tempJob.analysis_config.detectors, (d) => { delete d.detector_index; }); @@ -469,7 +473,7 @@ class JobService { // find a job based on the id getJob(jobId) { - const job = _.find(jobs, (j) => { + const job = find(jobs, (j) => { return j.job_id === jobId; }); @@ -550,7 +554,7 @@ class JobService { // get fields from detectors if (job.analysis_config.detectors) { - _.each(job.analysis_config.detectors, (dtr) => { + each(job.analysis_config.detectors, (dtr) => { if (dtr.by_field_name) { fields[dtr.by_field_name] = {}; } @@ -568,7 +572,7 @@ class JobService { // get fields from influencers if (job.analysis_config.influencers) { - _.each(job.analysis_config.influencers, (inf) => { + each(job.analysis_config.influencers, (inf) => { fields[inf] = {}; }); } @@ -659,7 +663,7 @@ class JobService { return new Promise((resolve, reject) => { // if the end timestamp is a number, add one ms to it to make it // inclusive of the end of the data - if (_.isNumber(end)) { + if (isNumber(end)) { end++; } @@ -780,7 +784,7 @@ class JobService { }); } }); - _.each(tempGroups, (js, id) => { + each(tempGroups, (js, id) => { groups.push({ id, jobs: js }); }); return groups; @@ -837,9 +841,9 @@ function processBasicJobInfo(localJobService, jobsList) { const customUrlsByJob = {}; // use cloned copy of jobs list so not to alter the original - const jobsListCopy = _.cloneDeep(jobsList); + const jobsListCopy = cloneDeep(jobsList); - _.each(jobsListCopy, (jobObj) => { + each(jobsListCopy, (jobObj) => { const analysisConfig = jobObj.analysis_config; const bucketSpan = parseInterval(analysisConfig.bucket_span); @@ -848,20 +852,20 @@ function processBasicJobInfo(localJobService, jobsList) { bucketSpanSeconds: bucketSpan.asSeconds(), }; - if (_.has(jobObj, 'description') && /^\s*$/.test(jobObj.description) === false) { + if (jobObj.description !== undefined && /^\s*$/.test(jobObj.description) === false) { job.description = jobObj.description; } else { // Just use the id as the description. job.description = jobObj.job_id; } - job.detectors = _.get(analysisConfig, 'detectors', []); + job.detectors = get(analysisConfig, 'detectors', []); detectorsByJob[job.id] = job.detectors; - if (_.has(jobObj, 'custom_settings.custom_urls')) { + if (jobObj.custom_settings !== undefined && jobObj.custom_settings.custom_urls !== undefined) { job.customUrls = []; - _.each(jobObj.custom_settings.custom_urls, (url) => { - if (_.has(url, 'url_name') && _.has(url, 'url_value') && isWebUrl(url.url_value)) { + each(jobObj.custom_settings.custom_urls, (url) => { + if (url.url_name !== undefined && url.url_value !== undefined && isWebUrl(url.url_value)) { // Only make web URLs (i.e. http or https) available in dashboard drilldowns. job.customUrls.push(url); } @@ -897,7 +901,7 @@ function createJobStats(jobsList, jobStats) { const mlNodes = {}; let failedJobs = 0; - _.each(jobsList, (job) => { + each(jobsList, (job) => { if (job.state === 'opened') { jobStats.open.value++; } else if (job.state === 'closed') { diff --git a/x-pack/plugins/ml/public/application/services/mapping_service.js b/x-pack/plugins/ml/public/application/services/mapping_service.js index 52aa5ed7413c..251bb0bce569 100644 --- a/x-pack/plugins/ml/public/application/services/mapping_service.js +++ b/x-pack/plugins/ml/public/application/services/mapping_service.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; import { ml } from './ml_api_service'; @@ -16,8 +16,8 @@ export function getFieldTypeFromMapping(index, fieldName) { ml.getFieldCaps({ index, fields: [fieldName] }) .then((resp) => { let fieldType = ''; - _.each(resp.fields, (field) => { - _.each(field, (type) => { + each(resp.fields, (field) => { + each(field, (type) => { if (fieldType === '') { fieldType = type.type; } diff --git a/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts b/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts index d7f016b41937..898ca8894cbd 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts +++ b/x-pack/plugins/ml/public/application/services/results_service/result_service_rx.ts @@ -13,7 +13,8 @@ // Returned response contains a results property containing the requested aggregation. import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; import { Dictionary } from '../../../../common/types/common'; import { ML_MEDIAN_PERCENTS } from '../../../../common/util/job_utils'; import { JobId } from '../../../../common/types/anomaly_detection_jobs'; @@ -237,7 +238,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { ]; // Add in term queries for each of the specified criteria. - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { mustCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -316,12 +317,12 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }) .pipe( map((resp) => { - const aggregationsByTime = _.get(resp, ['aggregations', 'times', 'buckets'], []); - _.each(aggregationsByTime, (dataForTime: any) => { + const aggregationsByTime = get(resp, ['aggregations', 'times', 'buckets'], []); + each(aggregationsByTime, (dataForTime: any) => { const time = dataForTime.key; - const modelUpper: number | undefined = _.get(dataForTime, ['modelUpper', 'value']); - const modelLower: number | undefined = _.get(dataForTime, ['modelLower', 'value']); - const actual = _.get(dataForTime, ['actual', 'value']); + const modelUpper: number | undefined = get(dataForTime, ['modelUpper', 'value']); + const modelLower: number | undefined = get(dataForTime, ['modelLower', 'value']); + const actual = get(dataForTime, ['actual', 'value']); obj.results[time] = { actual, @@ -375,7 +376,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -391,7 +392,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { } // Add in term queries for each of the specified criteria. - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { boolCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -428,7 +429,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { .pipe( map((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit: any) => { + each(resp.hits.hits, (hit: any) => { obj.records.push(hit._source); }); } @@ -473,7 +474,7 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { jobIdFilterStr += `${i > 0 ? ' OR ' : ''}job_id:${jobId}`; }); boolCriteria.push({ @@ -536,15 +537,15 @@ export function resultsServiceRxProvider(mlApiServices: MlApiServices) { }) .pipe( map((resp) => { - const dataByJobId = _.get(resp, ['aggregations', 'jobs', 'buckets'], []); - _.each(dataByJobId, (dataForJob: any) => { + const dataByJobId = get(resp, ['aggregations', 'jobs', 'buckets'], []); + each(dataByJobId, (dataForJob: any) => { const jobId: string = dataForJob.key; const resultsForTime: Record = {}; - const dataByTime = _.get(dataForJob, ['times', 'buckets'], []); - _.each(dataByTime, (dataForTime: any) => { + const dataByTime = get(dataForJob, ['times', 'buckets'], []); + each(dataByTime, (dataForTime: any) => { const time: string = dataForTime.key; - const events: object[] = _.get(dataForTime, ['events', 'buckets']); - resultsForTime[time] = _.map(events, 'key'); + const events: any[] = get(dataForTime, ['events', 'buckets']); + resultsForTime[time] = events.map((e) => e.key); }); obj.events[jobId] = resultsForTime; }); diff --git a/x-pack/plugins/ml/public/application/services/results_service/results_service.js b/x-pack/plugins/ml/public/application/services/results_service/results_service.js index 50e2d0a5a2a0..0c3b2e40c8e2 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/results_service.js +++ b/x-pack/plugins/ml/public/application/services/results_service/results_service.js @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; import { ML_MEDIAN_PERCENTS } from '../../../../common/util/job_utils'; import { escapeForElasticsearchQuery } from '../../util/string_utils'; @@ -50,7 +51,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -131,18 +132,18 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const dataByJobId = _.get(resp, ['aggregations', 'jobId', 'buckets'], []); - _.each(dataByJobId, (dataForJob) => { + const dataByJobId = get(resp, ['aggregations', 'jobId', 'buckets'], []); + each(dataByJobId, (dataForJob) => { const jobId = dataForJob.key; const resultsForTime = {}; - const dataByTime = _.get(dataForJob, ['byTime', 'buckets'], []); - _.each(dataByTime, (dataForTime) => { - const value = _.get(dataForTime, ['anomalyScore', 'value']); + const dataByTime = get(dataForJob, ['byTime', 'buckets'], []); + each(dataByTime, (dataForTime) => { + const value = get(dataForTime, ['anomalyScore', 'value']); if (value !== undefined) { const time = dataForTime.key; - resultsForTime[time] = _.get(dataForTime, ['anomalyScore', 'value']); + resultsForTime[time] = get(dataForTime, ['anomalyScore', 'value']); } }); obj.results[jobId] = resultsForTime; @@ -198,7 +199,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -305,17 +306,17 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const fieldNameBuckets = _.get( + const fieldNameBuckets = get( resp, ['aggregations', 'influencerFieldNames', 'buckets'], [] ); - _.each(fieldNameBuckets, (nameBucket) => { + each(fieldNameBuckets, (nameBucket) => { const fieldName = nameBucket.key; const fieldValues = []; - const fieldValueBuckets = _.get(nameBucket, ['influencerFieldValues', 'buckets'], []); - _.each(fieldValueBuckets, (valueBucket) => { + const fieldValueBuckets = get(nameBucket, ['influencerFieldValues', 'buckets'], []); + each(fieldValueBuckets, (valueBucket) => { const fieldValueResult = { influencerFieldValue: valueBucket.key, maxAnomalyScore: valueBucket.maxAnomalyScore.value, @@ -360,7 +361,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -424,8 +425,8 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const buckets = _.get(resp, ['aggregations', 'influencerFieldValues', 'buckets'], []); - _.each(buckets, (bucket) => { + const buckets = get(resp, ['aggregations', 'influencerFieldValues', 'buckets'], []); + each(buckets, (bucket) => { const result = { influencerFieldValue: bucket.key, maxAnomalyScore: bucket.maxAnomalyScore.value, @@ -458,9 +459,9 @@ export function resultsServiceProvider(mlApiServices) { end: latestMs, }) .then((resp) => { - const dataByTime = _.get(resp, ['overall_buckets'], []); - _.each(dataByTime, (dataForTime) => { - const value = _.get(dataForTime, ['overall_score']); + const dataByTime = get(resp, ['overall_buckets'], []); + each(dataByTime, (dataForTime) => { + const value = get(dataForTime, ['overall_score']); if (value !== undefined) { obj.results[dataForTime.timestamp] = value; } @@ -517,7 +518,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -537,7 +538,7 @@ export function resultsServiceProvider(mlApiServices) { if (influencerFieldValues && influencerFieldValues.length > 0) { let influencerFilterStr = ''; - _.each(influencerFieldValues, (value, i) => { + each(influencerFieldValues, (value, i) => { if (i > 0) { influencerFilterStr += ' OR '; } @@ -625,17 +626,17 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const fieldValueBuckets = _.get( + const fieldValueBuckets = get( resp, ['aggregations', 'influencerFieldValues', 'buckets'], [] ); - _.each(fieldValueBuckets, (valueBucket) => { + each(fieldValueBuckets, (valueBucket) => { const fieldValue = valueBucket.key; const fieldValues = {}; - const timeBuckets = _.get(valueBucket, ['byTime', 'buckets'], []); - _.each(timeBuckets, (timeBucket) => { + const timeBuckets = get(valueBucket, ['byTime', 'buckets'], []); + each(timeBuckets, (timeBucket) => { const time = timeBucket.key; const score = timeBucket.maxAnomalyScore.value; fieldValues[time] = score; @@ -701,7 +702,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -744,7 +745,7 @@ export function resultsServiceProvider(mlApiServices) { }) .then((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit) => { + each(resp.hits.hits, (hit) => { obj.records.push(hit._source); }); } @@ -797,7 +798,7 @@ export function resultsServiceProvider(mlApiServices) { if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i) => { + each(jobIds, (jobId, i) => { if (i > 0) { jobIdFilterStr += ' OR '; } @@ -875,7 +876,7 @@ export function resultsServiceProvider(mlApiServices) { }) .then((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit) => { + each(resp.hits.hits, (hit) => { obj.records.push(hit._source); }); } @@ -1000,7 +1001,7 @@ export function resultsServiceProvider(mlApiServices) { }) .then((resp) => { if (resp.hits.total !== 0) { - _.each(resp.hits.hits, (hit) => { + each(resp.hits.hits, (hit) => { obj.records.push(hit._source); }); } @@ -1079,8 +1080,8 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const dataByTimeBucket = _.get(resp, ['aggregations', 'eventRate', 'buckets'], []); - _.each(dataByTimeBucket, (dataForTime) => { + const dataByTimeBucket = get(resp, ['aggregations', 'eventRate', 'buckets'], []); + each(dataByTimeBucket, (dataForTime) => { const time = dataForTime.key; obj.results[time] = dataForTime.doc_count; }); @@ -1227,18 +1228,18 @@ export function resultsServiceProvider(mlApiServices) { // Because of the sampling, results of metricFunctions which use sum or count // can be significantly skewed. Taking into account totalHits we calculate a // a factor to normalize results for these metricFunctions. - const totalHits = _.get(resp, ['hits', 'total'], 0); - const successfulShards = _.get(resp, ['_shards', 'successful'], 0); + const totalHits = get(resp, ['hits', 'total'], 0); + const successfulShards = get(resp, ['_shards', 'successful'], 0); let normalizeFactor = 1; if (totalHits > successfulShards * SAMPLER_TOP_TERMS_SHARD_SIZE) { normalizeFactor = totalHits / (successfulShards * SAMPLER_TOP_TERMS_SHARD_SIZE); } - const dataByTime = _.get(resp, ['aggregations', 'sample', 'byTime', 'buckets'], []); + const dataByTime = get(resp, ['aggregations', 'sample', 'byTime', 'buckets'], []); const data = dataByTime.reduce((d, dataForTime) => { const date = +dataForTime.key; - const entities = _.get(dataForTime, ['entities', 'buckets'], []); + const entities = get(dataForTime, ['entities', 'buckets'], []); entities.forEach((entity) => { let value = metricFunction === 'count' ? entity.doc_count : entity.metric.value; @@ -1291,7 +1292,7 @@ export function resultsServiceProvider(mlApiServices) { { term: { job_id: jobId } }, ]; - _.each(criteriaFields, (criteria) => { + each(criteriaFields, (criteria) => { mustCriteria.push({ term: { [criteria.fieldName]: criteria.fieldValue, @@ -1339,11 +1340,11 @@ export function resultsServiceProvider(mlApiServices) { }, }) .then((resp) => { - const aggregationsByTime = _.get(resp, ['aggregations', 'times', 'buckets'], []); - _.each(aggregationsByTime, (dataForTime) => { + const aggregationsByTime = get(resp, ['aggregations', 'times', 'buckets'], []); + each(aggregationsByTime, (dataForTime) => { const time = dataForTime.key; obj.results[time] = { - score: _.get(dataForTime, ['recordScore', 'value']), + score: get(dataForTime, ['recordScore', 'value']), }; }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js index 86f12d7ca68c..d825844ffa14 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/forecasting_modal/forecasting_modal.js @@ -9,7 +9,7 @@ */ import PropTypes from 'prop-types'; -import _ from 'lodash'; +import get from 'lodash/get'; import React, { Component } from 'react'; @@ -250,8 +250,8 @@ export class ForecastingModalUI extends Component { .getForecastRequestStats(this.props.job, forecastId) .then((resp) => { // Get the progress (stats value is between 0 and 1). - const progress = _.get(resp, ['stats', 'forecast_progress'], previousProgress); - const status = _.get(resp, ['stats', 'forecast_status']); + const progress = get(resp, ['stats', 'forecast_progress'], previousProgress); + const status = get(resp, ['stats', 'forecast_status']); // The requests for forecast stats can get routed to different shards, // and if these operate at different speeds there is a chance that a @@ -263,7 +263,7 @@ export class ForecastingModalUI extends Component { } // Display any messages returned in the request stats. - let messages = _.get(resp, ['stats', 'forecast_messages'], []); + let messages = get(resp, ['stats', 'forecast_messages'], []); messages = messages.map((message) => ({ message, status: MESSAGE_LEVEL.WARNING })); this.setState({ messages }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 190bce1639c4..7ec59f4acbc5 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -12,9 +12,13 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import useObservable from 'react-use/lib/useObservable'; -import _ from 'lodash'; +import isEqual from 'lodash/isEqual'; +import reduce from 'lodash/reduce'; +import each from 'lodash/each'; +import get from 'lodash/get'; import d3 from 'd3'; import moment from 'moment'; +import { i18n } from '@kbn/i18n'; import { getSeverityWithLow, @@ -49,8 +53,6 @@ import { unhighlightFocusChartAnnotation, } from './timeseries_chart_annotations'; -import { i18n } from '@kbn/i18n'; - const focusZoomPanelHeight = 25; const focusChartHeight = 310; const focusHeight = focusZoomPanelHeight + focusChartHeight; @@ -399,7 +401,7 @@ class TimeseriesChartIntl extends Component { if (zoomFrom) { focusLoadFrom = zoomFrom.getTime(); } else { - focusLoadFrom = _.reduce( + focusLoadFrom = reduce( combinedData, (memo, point) => Math.min(memo, point.date.getTime()), new Date(2099, 12, 31).getTime() @@ -410,11 +412,7 @@ class TimeseriesChartIntl extends Component { if (zoomTo) { focusLoadTo = zoomTo.getTime(); } else { - focusLoadTo = _.reduce( - combinedData, - (memo, point) => Math.max(memo, point.date.getTime()), - 0 - ); + focusLoadTo = reduce(combinedData, (memo, point) => Math.max(memo, point.date.getTime()), 0); } focusLoadTo = Math.min(focusLoadTo, contextXMax); @@ -431,7 +429,7 @@ class TimeseriesChartIntl extends Component { min: moment(new Date(contextXScaleDomain[0])), max: moment(contextXScaleDomain[1]), }; - if (!_.isEqual(newSelectedBounds, this.selectedBounds)) { + if (!isEqual(newSelectedBounds, this.selectedBounds)) { this.selectedBounds = newSelectedBounds; this.setContextBrushExtent( new Date(contextXScaleDomain[0]), @@ -764,7 +762,7 @@ class TimeseriesChartIntl extends Component { }) .attr('class', (d) => { let markerClass = 'metric-value'; - if (_.has(d, 'anomalyScore')) { + if (d.anomalyScore !== undefined) { markerClass += ` anomaly-marker ${getSeverityWithLow(d.anomalyScore).id}`; } return markerClass; @@ -887,14 +885,14 @@ class TimeseriesChartIntl extends Component { ); const zoomOptions = [{ durationMs: autoZoomDuration, label: 'auto' }]; - _.each(ZOOM_INTERVAL_OPTIONS, (option) => { + each(ZOOM_INTERVAL_OPTIONS, (option) => { if (option.duration.asSeconds() > minSecs && option.duration.asSeconds() < boundsSecs) { zoomOptions.push({ durationMs: option.duration.asMilliseconds(), label: option.label }); } }); xPos += zoomLabel.node().getBBox().width + 4; - _.each(zoomOptions, (option) => { + each(zoomOptions, (option) => { const text = zoomGroup .append('a') .attr('data-ms', option.durationMs) @@ -960,7 +958,7 @@ class TimeseriesChartIntl extends Component { const combinedData = contextForecastData === undefined ? data : data.concat(contextForecastData); const valuesRange = { min: Number.MAX_VALUE, max: Number.MIN_VALUE }; - _.each(combinedData, (item) => { + each(combinedData, (item) => { valuesRange.min = Math.min(item.value, valuesRange.min); valuesRange.max = Math.max(item.value, valuesRange.max); }); @@ -973,7 +971,7 @@ class TimeseriesChartIntl extends Component { (contextForecastData !== undefined && contextForecastData.length > 0) ) { const boundsRange = { min: Number.MAX_VALUE, max: Number.MIN_VALUE }; - _.each(combinedData, (item) => { + each(combinedData, (item) => { boundsRange.min = Math.min(item.lower, boundsRange.min); boundsRange.max = Math.max(item.upper, boundsRange.max); }); @@ -1294,7 +1292,7 @@ class TimeseriesChartIntl extends Component { if (swimlaneData !== undefined && swimlaneData.length > 0) { // Adjust the earliest back to the time of the first swimlane point // if this is before the time filter minimum. - earliest = Math.min(_.first(swimlaneData).date.getTime(), bounds.min.valueOf()); + earliest = Math.min(swimlaneData[0].date.getTime(), bounds.min.valueOf()); } const contextAggMs = contextAggregationInterval.asMilliseconds(); @@ -1352,7 +1350,7 @@ class TimeseriesChartIntl extends Component { const formattedDate = formatHumanReadableDateTimeSeconds(marker.date); const tooltipData = [{ label: formattedDate }]; - if (_.has(marker, 'anomalyScore')) { + if (marker.anomalyScore !== undefined) { const score = parseInt(marker.anomalyScore); const displayScore = score > 0 ? score : '< 1'; tooltipData.push({ @@ -1387,7 +1385,7 @@ class TimeseriesChartIntl extends Component { // Show actual/typical when available except for rare detectors. // Rare detectors always have 1 as actual and the probability as typical. // Exposing those values in the tooltip with actual/typical labels might irritate users. - if (_.has(marker, 'actual') && marker.function !== 'rare') { + if (marker.actual !== undefined && marker.function !== 'rare') { // Display the record actual in preference to the chart value, which may be // different depending on the aggregation interval of the chart. tooltipData.push({ @@ -1421,7 +1419,7 @@ class TimeseriesChartIntl extends Component { }, valueAccessor: 'value', }); - if (_.has(marker, 'byFieldName') && _.has(marker, 'numberOfCauses')) { + if (marker.byFieldName !== undefined && marker.numberOfCauses !== undefined) { const numberOfCauses = marker.numberOfCauses; // If numberOfCauses === 1, won't go into this block as actual/typical copied to top level fields. const byFieldName = mlEscape(marker.byFieldName); @@ -1488,7 +1486,7 @@ class TimeseriesChartIntl extends Component { } } else { // TODO - need better formatting for small decimals. - if (_.get(marker, 'isForecast', false) === true) { + if (get(marker, 'isForecast', false) === true) { tooltipData.push({ label: i18n.translate( 'xpack.ml.timeSeriesExplorer.timeSeriesChart.withoutAnomalyScore.predictionLabel', @@ -1548,7 +1546,7 @@ class TimeseriesChartIntl extends Component { } } - if (_.has(marker, 'scheduledEvents')) { + if (marker.scheduledEvents !== undefined) { marker.scheduledEvents.forEach((scheduledEvent, i) => { tooltipData.push({ label: i18n.translate( @@ -1569,7 +1567,7 @@ class TimeseriesChartIntl extends Component { }); } - if (_.has(marker, 'annotation')) { + if (marker.annotation !== undefined) { tooltipData.length = 0; // header tooltipData.push({ diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts index ce5a7565c519..d1e959b33e5d 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseries_search_service.ts @@ -4,7 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import each from 'lodash/each'; +import find from 'lodash/find'; +import get from 'lodash/get'; +import filter from 'lodash/filter'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -35,8 +38,8 @@ function getMetricData( // Extract the partition, by, over fields on which to filter. const criteriaFields = []; const detector = job.analysis_config.detectors[detectorIndex]; - if (_.has(detector, 'partition_field_name')) { - const partitionEntity: any = _.find(entityFields, { + if (detector.partition_field_name !== undefined) { + const partitionEntity: any = find(entityFields, { fieldName: detector.partition_field_name, }); if (partitionEntity !== undefined) { @@ -47,8 +50,8 @@ function getMetricData( } } - if (_.has(detector, 'over_field_name')) { - const overEntity: any = _.find(entityFields, { fieldName: detector.over_field_name }); + if (detector.over_field_name !== undefined) { + const overEntity: any = find(entityFields, { fieldName: detector.over_field_name }); if (overEntity !== undefined) { criteriaFields.push( { fieldName: 'over_field_name', fieldValue: overEntity.fieldName }, @@ -57,8 +60,8 @@ function getMetricData( } } - if (_.has(detector, 'by_field_name')) { - const byEntity: any = _.find(entityFields, { fieldName: detector.by_field_name }); + if (detector.by_field_name !== undefined) { + const byEntity: any = find(entityFields, { fieldName: detector.by_field_name }); if (byEntity !== undefined) { criteriaFields.push( { fieldName: 'by_field_name', fieldValue: byEntity.fieldName }, @@ -97,7 +100,7 @@ function getMetricData( ) .pipe( map((resp) => { - _.each(resp.results, (value, time) => { + each(resp.results, (value, time) => { // @ts-ignore obj.results[time] = { actual: value, @@ -134,7 +137,7 @@ function getChartDetails( } obj.results.functionLabel = functionLabel; - const blankEntityFields = _.filter(entityFields, (entity) => { + const blankEntityFields = filter(entityFields, (entity) => { return entity.fieldValue === null; }); @@ -145,7 +148,7 @@ function getChartDetails( obj.results.entityData.entities = entityFields; resolve(obj); } else { - const entityFieldNames: string[] = _.map(blankEntityFields, 'fieldName'); + const entityFieldNames: string[] = blankEntityFields.map((f) => f.fieldName); ml.getCardinalityOfFields({ index: chartConfig.datafeedConfig.indices, fieldNames: entityFieldNames, @@ -155,12 +158,12 @@ function getChartDetails( latestMs, }) .then((results: any) => { - _.each(blankEntityFields, (field) => { + each(blankEntityFields, (field) => { // results will not contain keys for non-aggregatable fields, // so store as 0 to indicate over all field values. obj.results.entityData.entities.push({ fieldName: field.fieldName, - cardinality: _.get(results, field.fieldName, 0), + cardinality: get(results, field.fieldName, 0), }); }); diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js index 857db302e664..7d14bb43ef81 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_utils/timeseriesexplorer_utils.js @@ -10,7 +10,9 @@ * Viewer dashboard. */ -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; +import find from 'lodash/find'; import moment from 'moment-timezone'; import { isTimeSeriesViewJob } from '../../../../common/util/job_utils'; @@ -41,7 +43,7 @@ export function createTimeSeriesJobData(jobs) { export function processMetricPlotResults(metricPlotData, modelPlotEnabled) { const metricPlotChartData = []; if (modelPlotEnabled === true) { - _.each(metricPlotData, (dataForTime, time) => { + each(metricPlotData, (dataForTime, time) => { metricPlotChartData.push({ date: new Date(+time), lower: dataForTime.modelLower, @@ -50,7 +52,7 @@ export function processMetricPlotResults(metricPlotData, modelPlotEnabled) { }); }); } else { - _.each(metricPlotData, (dataForTime, time) => { + each(metricPlotData, (dataForTime, time) => { metricPlotChartData.push({ date: new Date(+time), value: dataForTime.actual, @@ -66,7 +68,7 @@ export function processMetricPlotResults(metricPlotData, modelPlotEnabled) { // value, lower and upper keys. export function processForecastResults(forecastData) { const forecastPlotChartData = []; - _.each(forecastData, (dataForTime, time) => { + each(forecastData, (dataForTime, time) => { forecastPlotChartData.push({ date: new Date(+time), isForecast: true, @@ -83,7 +85,7 @@ export function processForecastResults(forecastData) { // i.e. array of Objects with keys date (JavaScript date) and score. export function processRecordScoreResults(scoreData) { const bucketScoreData = []; - _.each(scoreData, (dataForTime, time) => { + each(scoreData, (dataForTime, time) => { bucketScoreData.push({ date: new Date(+time), score: dataForTime.score, @@ -153,7 +155,7 @@ export function processDataForFocusAnomalies( chartPoint.anomalyScore = recordScore; chartPoint.function = record.function; - if (_.has(record, 'actual')) { + if (record.actual !== undefined) { // If cannot match chart point for anomaly time // substitute the value with the record's actual so it won't plot as null/0 if (chartPoint.value === null) { @@ -163,13 +165,13 @@ export function processDataForFocusAnomalies( chartPoint.actual = record.actual; chartPoint.typical = record.typical; } else { - const causes = _.get(record, 'causes', []); + const causes = get(record, 'causes', []); if (causes.length > 0) { chartPoint.byFieldName = record.by_field_name; chartPoint.numberOfCauses = causes.length; if (causes.length === 1) { // If only a single cause, copy actual and typical values to the top level. - const cause = _.first(record.causes); + const cause = record.causes[0]; chartPoint.actual = cause.actual; chartPoint.typical = cause.typical; // substitute the value with the record's actual so it won't plot as null/0 @@ -180,7 +182,7 @@ export function processDataForFocusAnomalies( } } - if (_.has(record, 'multi_bucket_impact')) { + if (record.multi_bucket_impact !== undefined) { chartPoint.multiBucketImpact = record.multi_bucket_impact; } } @@ -194,7 +196,7 @@ export function processDataForFocusAnomalies( // which correspond to times of scheduled events for the job. export function processScheduledEventsForChart(chartData, scheduledEvents) { if (scheduledEvents !== undefined) { - _.each(scheduledEvents, (events, time) => { + each(scheduledEvents, (events, time) => { const chartPoint = findNearestChartPointToTime(chartData, time); if (chartPoint !== undefined) { // Note if the scheduled event coincides with an absence of the underlying metric data, @@ -301,7 +303,7 @@ export function calculateAggregationInterval(bounds, bucketsTarget, jobs, select // Ensure the aggregation interval is always a multiple of the bucket span to avoid strange // behaviour such as adjacent chart buckets holding different numbers of job results. - const bucketSpanSeconds = _.find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; + const bucketSpanSeconds = find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; let aggInterval = buckets.getIntervalToNearestMultiple(bucketSpanSeconds); // Set the interval back to the job bucket span if the auto interval is smaller. @@ -324,8 +326,8 @@ export function calculateDefaultFocusRange( const combinedData = isForecastData === false ? contextChartData : contextChartData.concat(contextForecastData); - const earliestDataDate = _.first(combinedData).date; - const latestDataDate = _.last(combinedData).date; + const earliestDataDate = combinedData[0].date; + const latestDataDate = combinedData[combinedData.length - 1].date; let rangeEarliestMs; let rangeLatestMs; @@ -333,8 +335,8 @@ export function calculateDefaultFocusRange( if (isForecastData === true) { // Return a range centred on the start of the forecast range, depending // on the time range of the forecast and data. - const earliestForecastDataDate = _.first(contextForecastData).date; - const latestForecastDataDate = _.last(contextForecastData).date; + const earliestForecastDataDate = contextForecastData[0].date; + const latestForecastDataDate = contextForecastData[contextForecastData.length - 1].date; rangeLatestMs = Math.min( earliestForecastDataDate.getTime() + autoZoomDuration / 2, @@ -379,7 +381,7 @@ export function getAutoZoomDuration(jobs, selectedJob) { // Calculate the 'auto' zoom duration which shows data at bucket span granularity. // Get the minimum bucket span of selected jobs. // TODO - only look at jobs for which data has been returned? - const bucketSpanSeconds = _.find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; + const bucketSpanSeconds = find(jobs, { id: selectedJob.job_id }).bucketSpanSeconds; // In most cases the duration can be obtained by simply multiplying the points target // Check that this duration returns the bucket span when run back through the diff --git a/x-pack/plugins/ml/public/application/util/chart_config_builder.js b/x-pack/plugins/ml/public/application/util/chart_config_builder.js index 3b09e09d3dd4..bc63404a106d 100644 --- a/x-pack/plugins/ml/public/application/util/chart_config_builder.js +++ b/x-pack/plugins/ml/public/application/util/chart_config_builder.js @@ -9,7 +9,7 @@ * in the source metric data. */ -import _ from 'lodash'; +import get from 'lodash/get'; import { mlFunctionToESAggregation } from '../../../common/util/job_utils'; @@ -44,15 +44,16 @@ export function buildConfigFromDetector(job, detectorIndex) { // aggregations//aggregations//cardinality/field // or aggs//aggs//cardinality/field let cardinalityField = undefined; - const topAgg = _.get(job.datafeed_config, 'aggregations') || _.get(job.datafeed_config, 'aggs'); - if (topAgg !== undefined && _.values(topAgg).length > 0) { + const topAgg = get(job.datafeed_config, 'aggregations') || get(job.datafeed_config, 'aggs'); + if (topAgg !== undefined && Object.values(topAgg).length > 0) { cardinalityField = - _.get(_.values(topAgg)[0], [ + get(Object.values(topAgg)[0], [ 'aggregations', summaryCountFieldName, 'cardinality', 'field', - ]) || _.get(_.values(topAgg)[0], ['aggs', summaryCountFieldName, 'cardinality', 'field']); + ]) || + get(Object.values(topAgg)[0], ['aggs', summaryCountFieldName, 'cardinality', 'field']); } if (detector.function === 'non_zero_count' && cardinalityField !== undefined) { diff --git a/x-pack/plugins/ml/public/application/util/inherits.js b/x-pack/plugins/ml/public/application/util/inherits.js deleted file mode 100644 index bf16e573117d..000000000000 --- a/x-pack/plugins/ml/public/application/util/inherits.js +++ /dev/null @@ -1,36 +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. - */ - -// create a property descriptor for properties -// that won't change -function describeConst(val) { - return { - writable: false, - enumerable: false, - configurable: false, - value: val, - }; -} - -/** - * Apply inheritance in the legacy `_.class(SubClass).inherits(SuperClass)` - * @param {Function} SubClass class that should inherit SuperClass - * @param {Function} SuperClass - * @return {Function} - */ -export function inherits(SubClass, SuperClass) { - const prototype = Object.create(SuperClass.prototype, { - constructor: describeConst(SubClass), - superConstructor: describeConst(SuperClass), - }); - - Object.defineProperties(SubClass, { - prototype: describeConst(prototype), - Super: describeConst(SuperClass), - }); - - return SubClass; -} diff --git a/x-pack/plugins/ml/public/application/util/time_buckets.js b/x-pack/plugins/ml/public/application/util/time_buckets.js index 19d499faf6c8..15b8f24804ec 100644 --- a/x-pack/plugins/ml/public/application/util/time_buckets.js +++ b/x-pack/plugins/ml/public/application/util/time_buckets.js @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import isPlainObject from 'lodash/isPlainObject'; +import isString from 'lodash/isString'; +import ary from 'lodash/ary'; +import sortBy from 'lodash/sortBy'; +import assign from 'lodash/assign'; import moment from 'moment'; import dateMath from '@elastic/datemath'; @@ -80,16 +84,16 @@ TimeBuckets.prototype.setBounds = function (input) { if (!input) return this.clearBounds(); let bounds; - if (_.isPlainObject(input)) { + if (isPlainObject(input)) { // accept the response from timefilter.getActiveBounds() bounds = [input.min, input.max]; } else { bounds = Array.isArray(input) ? input : []; } - const moments = _(bounds).map(_.ary(moment, 1)).sortBy(Number); + const moments = sortBy(bounds.map(ary(moment, 1)), Number); - const valid = moments.size() === 2 && moments.every(isValidMoment); + const valid = moments.length === 2 && moments.every(isValidMoment); if (!valid) { this.clearBounds(); throw new Error('invalid bounds set: ' + input); @@ -175,7 +179,7 @@ TimeBuckets.prototype.setInterval = function (input) { return; } - if (_.isString(interval)) { + if (isString(interval)) { input = interval; interval = parseInterval(interval); if (+interval === 0) { @@ -256,7 +260,7 @@ TimeBuckets.prototype.getInterval = function () { if (+scaled === +interval) return interval; decorateInterval(interval, duration); - return _.assign(scaled, { + return assign(scaled, { preScaled: interval, scale: interval / scaled, scaled: true, @@ -287,7 +291,7 @@ TimeBuckets.prototype.getIntervalToNearestMultiple = function (divisorSecs) { decorateInterval(nearestMultipleInt, this.getDuration()); // Check to see if the new interval is scaled compared to the original. - const preScaled = _.get(interval, 'preScaled'); + const preScaled = interval.preScaled; if (preScaled !== undefined && preScaled < nearestMultipleInt) { nearestMultipleInt.preScaled = preScaled; nearestMultipleInt.scale = preScaled / nearestMultipleInt; diff --git a/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts b/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts index f2162ff2c3d3..d9ebccd55473 100644 --- a/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts +++ b/x-pack/plugins/ml/server/lib/telemetry/telemetry.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import isEmpty from 'lodash/isEmpty'; import { ISavedObjectsRepository } from 'kibana/server'; import { getInternalRepository } from './internal_repository'; @@ -58,7 +58,7 @@ export async function updateTelemetry(internalRepo?: ISavedObjectsRepository) { let telemetry = await getTelemetry(internalRepository); // Create if doesn't exist - if (telemetry === null || _.isEmpty(telemetry)) { + if (telemetry === null || isEmpty(telemetry)) { const newTelemetrySavedObject = await internalRepository.create( TELEMETRY_DOC_ID, initTelemetry(), diff --git a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts index 8094689abf3e..a585449db0a2 100644 --- a/x-pack/plugins/ml/server/models/annotation_service/annotation.ts +++ b/x-pack/plugins/ml/server/models/annotation_service/annotation.ts @@ -5,7 +5,8 @@ */ import Boom from 'boom'; -import _ from 'lodash'; +import each from 'lodash/each'; +import get from 'lodash/get'; import { ILegacyScopedClusterClient } from 'kibana/server'; import { ANNOTATION_EVENT_USER, ANNOTATION_TYPE } from '../../../common/constants/annotations'; @@ -190,7 +191,7 @@ export function annotationProvider({ callAsInternalUser }: ILegacyScopedClusterC if (jobIds && jobIds.length > 0 && !(jobIds.length === 1 && jobIds[0] === '*')) { let jobIdFilterStr = ''; - _.each(jobIds, (jobId, i: number) => { + each(jobIds, (jobId, i: number) => { jobIdFilterStr += `${i! > 0 ? ' OR ' : ''}job_id:${jobId}`; }); boolCriteria.push({ @@ -293,7 +294,7 @@ export function annotationProvider({ callAsInternalUser }: ILegacyScopedClusterC throw new Error(`Annotations couldn't be retrieved from Elasticsearch.`); } - const docs: Annotations = _.get(resp, ['hits', 'hits'], []).map((d: EsResult) => { + const docs: Annotations = get(resp, ['hits', 'hits'], []).map((d: EsResult) => { // get the original source document and the document id, we need it // to identify the annotation when editing/deleting it. // if original `event` is undefined then substitute with 'user` by default @@ -305,7 +306,7 @@ export function annotationProvider({ callAsInternalUser }: ILegacyScopedClusterC } as Annotation; }); - const aggregations = _.get(resp, ['aggregations'], {}) as EsAggregationResult; + const aggregations = get(resp, ['aggregations'], {}) as EsAggregationResult; if (fields) { obj.aggregations = aggregations; } diff --git a/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js b/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js index 375854777940..381c615051e3 100644 --- a/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js +++ b/x-pack/plugins/ml/server/models/bucket_span_estimator/bucket_span_estimator.js @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; +import each from 'lodash/each'; +import remove from 'lodash/remove'; +import sortBy from 'lodash/sortBy'; +import get from 'lodash/get'; import { mlLog } from '../../client/log'; @@ -91,7 +95,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } else { // loop over partition values for (let j = 0; j < this.splitFieldValues.length; j++) { - const queryCopy = _.cloneDeep(this.query); + const queryCopy = cloneDeep(this.query); // add a term to the query to filter on the partition value queryCopy.bool.must.push({ term: { @@ -151,7 +155,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } }; - _.each(this.checkers, (check) => { + each(this.checkers, (check) => { check.check .run() .then((interval) => { @@ -174,7 +178,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } processResults() { - const allResults = _.map(this.checkers, 'result'); + const allResults = this.checkers.map((c) => c.result); let reducedResults = []; const numberOfSplitFields = this.splitFieldValues.length || 1; @@ -185,8 +189,8 @@ export function estimateBucketSpanFactory(mlClusterClient) { const pos = i * numberOfSplitFields; let resultsSubset = allResults.slice(pos, pos + numberOfSplitFields); // remove results of tests which have failed - resultsSubset = _.remove(resultsSubset, (res) => res !== null); - resultsSubset = _.sortBy(resultsSubset, (r) => r.ms); + resultsSubset = remove(resultsSubset, (res) => res !== null); + resultsSubset = sortBy(resultsSubset, (r) => r.ms); const tempMedian = this.findMedian(resultsSubset); if (tempMedian !== null) { @@ -194,7 +198,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { } } - reducedResults = _.sortBy(reducedResults, (r) => r.ms); + reducedResults = sortBy(reducedResults, (r) => r.ms); return this.findMedian(reducedResults); } @@ -256,7 +260,7 @@ export function estimateBucketSpanFactory(mlClusterClient) { }, }) .then((resp) => { - const value = _.get(resp, ['aggregations', 'field_count', 'value'], 0); + const value = get(resp, ['aggregations', 'field_count', 'value'], 0); resolve(value); }) .catch((resp) => { @@ -293,9 +297,10 @@ export function estimateBucketSpanFactory(mlClusterClient) { }, }) .then((partitionResp) => { - if (_.has(partitionResp, 'aggregations.fields_bucket_counts.buckets')) { + // eslint-disable-next-line camelcase + if (partitionResp.aggregations?.fields_bucket_counts?.buckets !== undefined) { const buckets = partitionResp.aggregations.fields_bucket_counts.buckets; - fieldValues = _.map(buckets, (b) => b.key); + fieldValues = buckets.map((b) => b.key); } resolve(fieldValues); }) diff --git a/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js b/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js index 347843e276c3..d3bbd59f3cf9 100644 --- a/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js +++ b/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js @@ -10,7 +10,7 @@ * And a minimum bucket span */ -import _ from 'lodash'; +import get from 'lodash/get'; export function polledDataCheckerFactory({ callAsCurrentUser }) { class PolledDataChecker { @@ -29,7 +29,7 @@ export function polledDataCheckerFactory({ callAsCurrentUser }) { const interval = { name: '1m', ms: 60000 }; this.performSearch(interval.ms) .then((resp) => { - const fullBuckets = _.get(resp, 'aggregations.non_empty_buckets.buckets', []); + const fullBuckets = get(resp, 'aggregations.non_empty_buckets.buckets', []); const result = this.isPolledData(fullBuckets, interval); if (result.pass) { // data is polled, return a flag and the minimumBucketSpan which should be diff --git a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts index 7f19f32373e0..838315d8d272 100644 --- a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts +++ b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -5,7 +5,10 @@ */ import { ILegacyScopedClusterClient } from 'kibana/server'; -import _ from 'lodash'; +import get from 'lodash/get'; +import each from 'lodash/each'; +import last from 'lodash/last'; +import find from 'lodash/find'; import { KBN_FIELD_TYPES } from '../../../../../../src/plugins/data/server'; import { ML_JOB_FIELD_TYPES } from '../../../common/constants/field_types'; import { getSafeAggregationName } from '../../../common/util/job_utils'; @@ -216,7 +219,7 @@ const getAggIntervals = async ( const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const aggregations = - aggsPath.length > 0 ? _.get(respStats.aggregations, aggsPath) : respStats.aggregations; + aggsPath.length > 0 ? get(respStats.aggregations, aggsPath) : respStats.aggregations; return Object.keys(aggregations).reduce((p, aggName) => { const stats = [aggregations[aggName].min, aggregations[aggName].max]; @@ -300,9 +303,7 @@ export const getHistogramsForFields = async ( const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const aggregations = - aggsPath.length > 0 - ? _.get(respChartsData.aggregations, aggsPath) - : respChartsData.aggregations; + aggsPath.length > 0 ? get(respChartsData.aggregations, aggsPath) : respChartsData.aggregations; const chartsData: ChartData[] = fields.map( (field): ChartData => { @@ -382,8 +383,8 @@ export class DataVisualizer { // To avoid checking for the existence of too many aggregatable fields in one request, // split the check into multiple batches (max 200 fields per request). const batches: string[][] = [[]]; - _.each(aggregatableFields, (field) => { - let lastArray: string[] = _.last(batches) as string[]; + each(aggregatableFields, (field) => { + let lastArray: string[] = last(batches) as string[]; if (lastArray.length === AGGREGATABLE_EXISTS_REQUEST_BATCH_SIZE) { lastArray = []; batches.push(lastArray); @@ -475,7 +476,7 @@ export class DataVisualizer { // Batch up fields by type, getting stats for multiple fields at a time. const batches: Field[][] = []; const batchedFields: { [key: string]: Field[][] } = {}; - _.each(fields, (field) => { + each(fields, (field) => { if (field.fieldName === undefined) { // undefined fieldName is used for a document count request. // getDocumentCountStats requires timeField - don't add to batched requests if not defined @@ -487,7 +488,7 @@ export class DataVisualizer { if (batchedFields[fieldType] === undefined) { batchedFields[fieldType] = [[]]; } - let lastArray: Field[] = _.last(batchedFields[fieldType]) as Field[]; + let lastArray: Field[] = last(batchedFields[fieldType]) as Field[]; if (lastArray.length === FIELDS_REQUEST_BATCH_SIZE) { lastArray = []; batchedFields[fieldType].push(lastArray); @@ -496,7 +497,7 @@ export class DataVisualizer { } }); - _.each(batchedFields, (lists) => { + each(batchedFields, (lists) => { batches.push(...lists); }); @@ -636,7 +637,7 @@ export class DataVisualizer { body, }); const aggregations = resp.aggregations; - const totalCount = _.get(resp, ['hits', 'total'], 0); + const totalCount = get(resp, ['hits', 'total'], 0); const stats = { totalCount, aggregatableExistsFields: [] as FieldData[], @@ -645,12 +646,12 @@ export class DataVisualizer { const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const sampleCount = - samplerShardSize > 0 ? _.get(aggregations, ['sample', 'doc_count'], 0) : totalCount; + samplerShardSize > 0 ? get(aggregations, ['sample', 'doc_count'], 0) : totalCount; aggregatableFields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field, i); - const count = _.get(aggregations, [...aggsPath, `${safeFieldName}_count`, 'doc_count'], 0); + const count = get(aggregations, [...aggsPath, `${safeFieldName}_count`, 'doc_count'], 0); if (count > 0) { - const cardinality = _.get( + const cardinality = get( aggregations, [...aggsPath, `${safeFieldName}_cardinality`, 'value'], 0 @@ -745,12 +746,12 @@ export class DataVisualizer { }); const buckets: { [key: string]: number } = {}; - const dataByTimeBucket: Array<{ key: string; doc_count: number }> = _.get( + const dataByTimeBucket: Array<{ key: string; doc_count: number }> = get( resp, ['aggregations', 'eventRate', 'buckets'], [] ); - _.each(dataByTimeBucket, (dataForTime) => { + each(dataByTimeBucket, (dataForTime) => { const time = dataForTime.key; buckets[time] = dataForTime.doc_count; }); @@ -851,12 +852,12 @@ export class DataVisualizer { const batchStats: NumericFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); - const docCount = _.get( + const docCount = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'doc_count'], 0 ); - const fieldStatsResp = _.get( + const fieldStatsResp = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'actual_stats'], {} @@ -867,20 +868,20 @@ export class DataVisualizer { topAggsPath.push('top'); } - const topValues: Bucket[] = _.get(aggregations, [...topAggsPath, 'buckets'], []); + const topValues: Bucket[] = get(aggregations, [...topAggsPath, 'buckets'], []); const stats: NumericFieldStats = { fieldName: field.fieldName, count: docCount, - min: _.get(fieldStatsResp, 'min', 0), - max: _.get(fieldStatsResp, 'max', 0), - avg: _.get(fieldStatsResp, 'avg', 0), + min: get(fieldStatsResp, 'min', 0), + max: get(fieldStatsResp, 'max', 0), + avg: get(fieldStatsResp, 'avg', 0), isTopValuesSampled: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD || samplerShardSize > 0, topValues, topValuesSampleSize: topValues.reduce( (acc, curr) => acc + curr.doc_count, - _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) + get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) ), topValuesSamplerShardSize: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD @@ -889,12 +890,12 @@ export class DataVisualizer { }; if (stats.count > 0) { - const percentiles = _.get( + const percentiles = get( aggregations, [...aggsPath, `${safeFieldName}_percentiles`, 'values'], [] ); - const medianPercentile: { value: number; key: number } | undefined = _.find(percentiles, { + const medianPercentile: { value: number; key: number } | undefined = find(percentiles, { key: 50, }); stats.median = medianPercentile !== undefined ? medianPercentile!.value : 0; @@ -978,7 +979,7 @@ export class DataVisualizer { topAggsPath.push('top'); } - const topValues: Bucket[] = _.get(aggregations, [...topAggsPath, 'buckets'], []); + const topValues: Bucket[] = get(aggregations, [...topAggsPath, 'buckets'], []); const stats = { fieldName: field.fieldName, @@ -987,7 +988,7 @@ export class DataVisualizer { topValues, topValuesSampleSize: topValues.reduce( (acc, curr) => acc + curr.doc_count, - _.get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) + get(aggregations, [...topAggsPath, 'sum_other_doc_count'], 0) ), topValuesSamplerShardSize: field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD @@ -1046,12 +1047,12 @@ export class DataVisualizer { const batchStats: DateFieldStats[] = []; fields.forEach((field, i) => { const safeFieldName = getSafeAggregationName(field.fieldName, i); - const docCount = _.get( + const docCount = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'doc_count'], 0 ); - const fieldStatsResp = _.get( + const fieldStatsResp = get( aggregations, [...aggsPath, `${safeFieldName}_field_stats`, 'actual_stats'], {} @@ -1059,8 +1060,8 @@ export class DataVisualizer { batchStats.push({ fieldName: field.fieldName, count: docCount, - earliest: _.get(fieldStatsResp, 'min', 0), - latest: _.get(fieldStatsResp, 'max', 0), + earliest: get(fieldStatsResp, 'min', 0), + latest: get(fieldStatsResp, 'max', 0), }); }); @@ -1115,17 +1116,17 @@ export class DataVisualizer { const safeFieldName = getSafeAggregationName(field.fieldName, i); const stats: BooleanFieldStats = { fieldName: field.fieldName, - count: _.get(aggregations, [...aggsPath, `${safeFieldName}_value_count`, 'doc_count'], 0), + count: get(aggregations, [...aggsPath, `${safeFieldName}_value_count`, 'doc_count'], 0), trueCount: 0, falseCount: 0, }; - const valueBuckets: Array<{ [key: string]: number }> = _.get( + const valueBuckets: Array<{ [key: string]: number }> = get( aggregations, [...aggsPath, `${safeFieldName}_values`, 'buckets'], [] ); - _.forEach(valueBuckets, (bucket) => { + valueBuckets.forEach((bucket) => { stats[`${bucket.key_as_string}Count`] = bucket.doc_count; }); @@ -1182,8 +1183,8 @@ export class DataVisualizer { // If the field is not in the _source (as will happen if the // field is populated using copy_to in the index mapping), // there will be no example to add. - // Use lodash _.get() to support field names containing dots. - const example: any = _.get(hits[i]._source, field); + // Use lodash get() to support field names containing dots. + const example: any = get(hits[i]._source, field); if (example !== undefined && stats.examples.indexOf(example) === -1) { stats.examples.push(example); if (stats.examples.length === maxExamples) { @@ -1216,7 +1217,7 @@ export class DataVisualizer { // Look ahead to the last percentiles and process these too if // they don't add more than 50% to the value range. - const lastValue = (_.last(percentileBuckets) as any).value; + const lastValue = (last(percentileBuckets) as any).value; const upperBound = lowerBound + 1.5 * (lastValue - lowerBound); const filteredLength = percentileBuckets.length; for (let i = filteredLength; i < percentiles.length; i++) { @@ -1237,7 +1238,7 @@ export class DataVisualizer { // Add in 0-5 and 95-100% if they don't add more // than 25% to the value range at either end. - const lastValue: number = (_.last(percentileBuckets) as any).value; + const lastValue: number = (last(percentileBuckets) as any).value; const maxDiff = 0.25 * (lastValue - lowerBound); if (lowerBound - dataMin < maxDiff) { percentileBuckets.splice(0, 0, percentiles[0]); diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts index 92933877e283..16ee70ad9efd 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import { ILegacyScopedClusterClient } from 'kibana/server'; @@ -145,7 +145,7 @@ describe('ML - validateCardinality', () => { test: (ids: string[]) => void ) => { const job = getJobConfig(fieldName); - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality( mlClusterClientFactory(mockCardinality), @@ -250,7 +250,7 @@ describe('ML - validateCardinality', () => { it(`disabled model_plot, over field cardinality of ${cardinality} doesn't trigger a warning`, () => { const job = (getJobConfig('over_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: false }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -261,7 +261,7 @@ describe('ML - validateCardinality', () => { it(`enabled model_plot, over field cardinality of ${cardinality} triggers a model plot warning`, () => { const job = (getJobConfig('over_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: true }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -272,7 +272,7 @@ describe('ML - validateCardinality', () => { it(`disabled model_plot, by field cardinality of ${cardinality} triggers a field cardinality warning`, () => { const job = (getJobConfig('by_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: false }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -283,7 +283,7 @@ describe('ML - validateCardinality', () => { it(`enabled model_plot, by field cardinality of ${cardinality} triggers a model plot warning and field cardinality warning`, () => { const job = (getJobConfig('by_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: true }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); @@ -294,7 +294,7 @@ describe('ML - validateCardinality', () => { it(`enabled model_plot with terms, by field cardinality of ${cardinality} triggers just field cardinality warning`, () => { const job = (getJobConfig('by_field_name') as unknown) as CombinedJob; job.model_plot_config = { enabled: true, terms: 'AAL,AAB' }; - const mockCardinality = _.cloneDeep(mockResponses); + const mockCardinality = cloneDeep(mockResponses); mockCardinality.search.aggregations.airline_cardinality.value = cardinality; return validateCardinality(mlClusterClientFactory(mockCardinality), job).then((messages) => { const ids = messages.map((m) => m.id); diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts b/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts index f74d8a26ef37..a45be189ba3d 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_time_range.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import cloneDeep from 'lodash/cloneDeep'; import { ILegacyScopedClusterClient } from 'kibana/server'; @@ -144,7 +144,7 @@ describe('ML - validateTimeRange', () => { }); it('invalid time field', () => { - const mockSearchResponseInvalid = _.cloneDeep(mockSearchResponse); + const mockSearchResponseInvalid = cloneDeep(mockSearchResponse); mockSearchResponseInvalid.fieldCaps = undefined; const duration = { start: 0, end: 1 }; return validateTimeRange( diff --git a/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js b/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js index e664a1403d7d..588e0e10a8d6 100644 --- a/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js +++ b/x-pack/plugins/ml/server/models/results_service/build_anomaly_table_items.js @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import sortBy from 'lodash/sortBy'; +import each from 'lodash/each'; import moment from 'moment-timezone'; import { @@ -55,7 +56,7 @@ export function buildAnomalyTableItems(anomalyRecords, aggregationInterval, date if (source.influencers !== undefined) { const influencers = []; - const sourceInfluencers = _.sortBy(source.influencers, 'influencer_field_name'); + const sourceInfluencers = sortBy(source.influencers, 'influencer_field_name'); sourceInfluencers.forEach((influencer) => { const influencerFieldName = influencer.influencer_field_name; influencer.influencer_field_values.forEach((influencerFieldValue) => { @@ -172,10 +173,10 @@ function aggregateAnomalies(anomalyRecords, interval, dateFormatTz) { // Flatten the aggregatedData to give a list of records with // the highest score per bucketed time / jobId / detectorIndex. const summaryRecords = []; - _.each(aggregatedData, (times, roundedTime) => { - _.each(times, (jobIds) => { - _.each(jobIds, (entityDetectors) => { - _.each(entityDetectors, (record) => { + each(aggregatedData, (times, roundedTime) => { + each(times, (jobIds) => { + each(jobIds, (entityDetectors) => { + each(entityDetectors, (record) => { summaryRecords.push({ time: +roundedTime, source: record, diff --git a/x-pack/plugins/ml/server/models/results_service/results_service.ts b/x-pack/plugins/ml/server/models/results_service/results_service.ts index 04997e517bba..8e71384942b5 100644 --- a/x-pack/plugins/ml/server/models/results_service/results_service.ts +++ b/x-pack/plugins/ml/server/models/results_service/results_service.ts @@ -4,7 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; +import sortBy from 'lodash/sortBy'; +import slice from 'lodash/slice'; +import get from 'lodash/get'; import moment from 'moment'; import { SearchResponse } from 'elasticsearch'; import { ILegacyScopedClusterClient } from 'kibana/server'; @@ -175,7 +177,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie }); // Sort anomalies in ascending time order. - records = _.sortBy(records, 'timestamp'); + records = sortBy(records, 'timestamp'); tableData.interval = aggregationInterval; if (aggregationInterval === 'auto') { // Determine the actual interval to use if aggregating. @@ -197,7 +199,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie const categoryIdsByJobId: { [key: string]: any } = {}; categoryAnomalies.forEach((anomaly) => { - if (!_.has(categoryIdsByJobId, anomaly.jobId)) { + if (categoryIdsByJobId[anomaly.jobId] === undefined) { categoryIdsByJobId[anomaly.jobId] = []; } if (categoryIdsByJobId[anomaly.jobId].indexOf(anomaly.entityValue) === -1) { @@ -289,7 +291,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie }; const resp = await callAsInternalUser('search', query); - const maxScore = _.get(resp, ['aggregations', 'max_score', 'value'], null); + const maxScore = get(resp, ['aggregations', 'max_score', 'value'], null); return { maxScore }; } @@ -353,7 +355,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie }, }); - const bucketsByJobId: Array<{ key: string; maxTimestamp: { value?: number } }> = _.get( + const bucketsByJobId: Array<{ key: string; maxTimestamp: { value?: number } }> = get( resp, ['aggregations', 'byJobId', 'buckets'], [] @@ -387,7 +389,7 @@ export function resultsServiceProvider(mlClusterClient: ILegacyScopedClusterClie if (resp.hits.total !== 0) { resp.hits.hits.forEach((hit: any) => { if (maxExamples) { - examplesByCategoryId[hit._source.category_id] = _.slice( + examplesByCategoryId[hit._source.category_id] = slice( hit._source.examples, 0, Math.min(hit._source.examples.length, maxExamples)

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 Date: Tue, 11 Aug 2020 13:31:59 -0400 Subject: [PATCH 19/25] [Security Solution] Rename Administration > Hosts subtab to Endpoints (#74287) --- .../public/common/store/actions.ts | 4 +- .../public/management/common/constants.ts | 6 +- .../public/management/common/routing.ts | 40 ++--- .../public/management/common/translations.ts | 4 +- .../components/management_empty_state.tsx | 22 +-- .../management/pages/endpoint_hosts/index.tsx | 10 +- .../pages/endpoint_hosts/routes.tsx | 6 +- .../pages/endpoint_hosts/store/action.ts | 60 ++++---- ...on.test.ts => endpoint_pagination.test.ts} | 34 ++--- .../pages/endpoint_hosts/store/index.test.ts | 30 ++-- .../endpoint_hosts/store/middleware.test.ts | 32 ++-- .../pages/endpoint_hosts/store/middleware.ts | 96 ++++++------ ...t_list.ts => mock_endpoint_result_list.ts} | 47 +++--- .../pages/endpoint_hosts/store/reducer.ts | 52 +++---- .../pages/endpoint_hosts/store/selectors.ts | 81 +++++----- .../management/pages/endpoint_hosts/types.ts | 10 +- ...licy_link.tsx => endpoint_policy_link.tsx} | 8 +- ...{host_details.tsx => endpoint_details.tsx} | 63 ++++---- .../endpoint_hosts/view/details/index.tsx | 77 +++++----- .../view/details/policy_response.tsx | 6 +- .../details/policy_response_friendly_names.ts | 117 +++++++------- .../pages/endpoint_hosts/view/hooks.ts | 10 +- .../pages/endpoint_hosts/view/index.test.tsx | 122 +++++++-------- .../pages/endpoint_hosts/view/index.tsx | 100 ++++++------ .../view/url_from_query_params.ts | 4 +- .../public/management/pages/index.test.tsx | 4 +- .../public/management/pages/index.tsx | 14 +- .../pages/policy/view/agents_summary.tsx | 2 +- .../pages/policy/view/policy_details.test.tsx | 12 +- .../pages/policy/view/policy_details.tsx | 4 +- .../public/management/store/middleware.ts | 8 +- .../public/management/store/reducer.ts | 11 +- .../public/management/types.ts | 6 +- .../components/endpoint_notice/index.tsx | 4 +- .../translations/translations/ja-JP.json | 144 +++++++++--------- .../translations/translations/zh-CN.json | 144 +++++++++--------- .../apps/endpoint/endpoint_list.ts | 74 +++++---- .../apps/endpoint/policy_details.ts | 2 +- .../page_objects/endpoint_page.ts | 10 +- 39 files changed, 750 insertions(+), 730 deletions(-) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/{host_pagination.test.ts => endpoint_pagination.test.ts} (80%) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/{mock_host_result_list.ts => mock_endpoint_result_list.ts} (79%) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/{host_policy_link.tsx => endpoint_policy_link.tsx} (89%) rename x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/{host_details.tsx => endpoint_details.tsx} (76%) diff --git a/x-pack/plugins/security_solution/public/common/store/actions.ts b/x-pack/plugins/security_solution/public/common/store/actions.ts index f2072aae1936..cd8836e38bfe 100644 --- a/x-pack/plugins/security_solution/public/common/store/actions.ts +++ b/x-pack/plugins/security_solution/public/common/store/actions.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostAction } from '../../management/pages/endpoint_hosts/store/action'; +import { EndpointAction } from '../../management/pages/endpoint_hosts/store/action'; import { PolicyListAction } from '../../management/pages/policy/store/policy_list'; import { PolicyDetailsAction } from '../../management/pages/policy/store/policy_details'; @@ -13,4 +13,4 @@ export { dragAndDropActions } from './drag_and_drop'; export { inputsActions } from './inputs'; import { RoutingAction } from './routing'; -export type AppAction = HostAction | RoutingAction | PolicyListAction | PolicyDetailsAction; +export type AppAction = EndpointAction | RoutingAction | PolicyListAction | PolicyDetailsAction; diff --git a/x-pack/plugins/security_solution/public/management/common/constants.ts b/x-pack/plugins/security_solution/public/management/common/constants.ts index b07c47a39804..88396cc24a5e 100644 --- a/x-pack/plugins/security_solution/public/management/common/constants.ts +++ b/x-pack/plugins/security_solution/public/management/common/constants.ts @@ -10,7 +10,7 @@ import { SecurityPageName } from '../../app/types'; // --[ ROUTING ]--------------------------------------------------------------------------- export const MANAGEMENT_APP_ID = `${APP_ID}:${SecurityPageName.administration}`; export const MANAGEMENT_ROUTING_ROOT_PATH = ''; -export const MANAGEMENT_ROUTING_HOSTS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.hosts})`; +export const MANAGEMENT_ROUTING_ENDPOINTS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.endpoints})`; export const MANAGEMENT_ROUTING_POLICIES_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.policies})`; export const MANAGEMENT_ROUTING_POLICY_DETAILS_PATH = `${MANAGEMENT_ROUTING_ROOT_PATH}/:tabName(${AdministrationSubTab.policies})/:policyId`; @@ -21,5 +21,5 @@ export const MANAGEMENT_STORE_GLOBAL_NAMESPACE: ManagementStoreGlobalNamespace = export const MANAGEMENT_STORE_POLICY_LIST_NAMESPACE = 'policyList'; /** Namespace within the Management state where policy details state is maintained */ export const MANAGEMENT_STORE_POLICY_DETAILS_NAMESPACE = 'policyDetails'; -/** Namespace within the Management state where hosts state is maintained */ -export const MANAGEMENT_STORE_HOSTS_NAMESPACE = 'hosts'; +/** Namespace within the Management state where endpoint-host state is maintained */ +export const MANAGEMENT_STORE_ENDPOINTS_NAMESPACE = 'endpoints'; diff --git a/x-pack/plugins/security_solution/public/management/common/routing.ts b/x-pack/plugins/security_solution/public/management/common/routing.ts index eeb1533f57a6..ea162422abb6 100644 --- a/x-pack/plugins/security_solution/public/management/common/routing.ts +++ b/x-pack/plugins/security_solution/public/management/common/routing.ts @@ -10,13 +10,13 @@ import { generatePath } from 'react-router-dom'; import querystring from 'querystring'; import { - MANAGEMENT_ROUTING_HOSTS_PATH, + MANAGEMENT_ROUTING_ENDPOINTS_PATH, MANAGEMENT_ROUTING_POLICIES_PATH, MANAGEMENT_ROUTING_POLICY_DETAILS_PATH, } from './constants'; import { AdministrationSubTab } from '../types'; import { appendSearch } from '../../common/components/link_to/helpers'; -import { HostIndexUIQueryParams } from '../pages/endpoint_hosts/types'; +import { EndpointIndexUIQueryParams } from '../pages/endpoint_hosts/types'; // Taken from: https://github.com/microsoft/TypeScript/issues/12936#issuecomment-559034150 type ExactKeys = Exclude extends never ? T1 : never; @@ -31,42 +31,44 @@ const querystringStringify: ( params: Exact ) => string = querystring.stringify; -/** Make `selected_host` required */ -type HostDetailsUrlProps = Omit & - Required>; +/** Make `selected_endpoint` required */ +type EndpointDetailsUrlProps = Omit & + Required>; -export const getHostListPath = ( - props: { name: 'default' | 'hostList' } & HostIndexUIQueryParams, +export const getEndpointListPath = ( + props: { name: 'default' | 'endpointList' } & EndpointIndexUIQueryParams, search?: string ) => { const { name, ...queryParams } = props; - const urlQueryParams = querystringStringify( + const urlQueryParams = querystringStringify( queryParams ); const urlSearch = `${urlQueryParams && !isEmpty(search) ? '&' : ''}${search ?? ''}`; - if (name === 'hostList') { - return `${generatePath(MANAGEMENT_ROUTING_HOSTS_PATH, { - tabName: AdministrationSubTab.hosts, + if (name === 'endpointList') { + return `${generatePath(MANAGEMENT_ROUTING_ENDPOINTS_PATH, { + tabName: AdministrationSubTab.endpoints, })}${appendSearch(`${urlQueryParams ? `${urlQueryParams}${urlSearch}` : urlSearch}`)}`; } return `${appendSearch(`${urlQueryParams ? `${urlQueryParams}${urlSearch}` : urlSearch}`)}`; }; -export const getHostDetailsPath = ( - props: { name: 'hostDetails' | 'hostPolicyResponse' } & HostIndexUIQueryParams & - HostDetailsUrlProps, +export const getEndpointDetailsPath = ( + props: { name: 'endpointDetails' | 'endpointPolicyResponse' } & EndpointIndexUIQueryParams & + EndpointDetailsUrlProps, search?: string ) => { const { name, ...queryParams } = props; - queryParams.show = (props.name === 'hostPolicyResponse' + queryParams.show = (props.name === 'endpointPolicyResponse' ? 'policy_response' - : '') as HostIndexUIQueryParams['show']; - const urlQueryParams = querystringStringify(queryParams); + : '') as EndpointIndexUIQueryParams['show']; + const urlQueryParams = querystringStringify( + queryParams + ); const urlSearch = `${urlQueryParams && !isEmpty(search) ? '&' : ''}${search ?? ''}`; - return `${generatePath(MANAGEMENT_ROUTING_HOSTS_PATH, { - tabName: AdministrationSubTab.hosts, + return `${generatePath(MANAGEMENT_ROUTING_ENDPOINTS_PATH, { + tabName: AdministrationSubTab.endpoints, })}${appendSearch(`${urlQueryParams ? `${urlQueryParams}${urlSearch}` : urlSearch}`)}`; }; diff --git a/x-pack/plugins/security_solution/public/management/common/translations.ts b/x-pack/plugins/security_solution/public/management/common/translations.ts index 70ccf715eaa0..03f6a80ef99a 100644 --- a/x-pack/plugins/security_solution/public/management/common/translations.ts +++ b/x-pack/plugins/security_solution/public/management/common/translations.ts @@ -6,8 +6,8 @@ import { i18n } from '@kbn/i18n'; -export const HOSTS_TAB = i18n.translate('xpack.securitySolution.hostsTab', { - defaultMessage: 'Hosts', +export const ENDPOINTS_TAB = i18n.translate('xpack.securitySolution.endpointsTab', { + defaultMessage: 'Endpoints', }); export const POLICIES_TAB = i18n.translate('xpack.securitySolution.policiesTab', { diff --git a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx index a4518d1a1f49..4617865d6aa6 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx @@ -116,7 +116,7 @@ const PolicyEmptyState = React.memo<{ ); }); -const HostsEmptyState = React.memo<{ +const EndpointsEmptyState = React.memo<{ loading: boolean; onActionClick: (event: MouseEvent) => void; actionDisabled: boolean; @@ -126,14 +126,14 @@ const HostsEmptyState = React.memo<{ const policySteps = useMemo( () => [ { - title: i18n.translate('xpack.securitySolution.endpoint.hostList.stepOneTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.list.stepOneTitle', { defaultMessage: 'Select the integration you want to use', }), children: ( <> @@ -151,7 +151,7 @@ const HostsEmptyState = React.memo<{ return loading ? ( @@ -159,7 +159,7 @@ const HostsEmptyState = React.memo<{ list ) : ( ); @@ -169,7 +169,7 @@ const HostsEmptyState = React.memo<{ ), }, { - title: i18n.translate('xpack.securitySolution.endpoint.hostList.stepTwoTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.list.stepTwoTitle', { defaultMessage: 'Enroll your agents enabled with Endpoint Security through Ingest Manager', }), @@ -179,7 +179,7 @@ const HostsEmptyState = React.memo<{ @@ -211,13 +211,13 @@ const HostsEmptyState = React.memo<{ steps={policySteps} headerComponent={ } bodyComponent={ } @@ -265,7 +265,7 @@ const ManagementEmptyState = React.memo<{ }); PolicyEmptyState.displayName = 'PolicyEmptyState'; -HostsEmptyState.displayName = 'HostsEmptyState'; +EndpointsEmptyState.displayName = 'HostsEmptyState'; ManagementEmptyState.displayName = 'ManagementEmptyState'; -export { PolicyEmptyState, HostsEmptyState }; +export { PolicyEmptyState, EndpointsEmptyState as HostsEmptyState }; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx index a970edd4d30f..23e55301d22c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/index.tsx @@ -6,20 +6,20 @@ import { Switch, Route } from 'react-router-dom'; import React, { memo } from 'react'; -import { HostList } from './view'; -import { MANAGEMENT_ROUTING_HOSTS_PATH } from '../../common/constants'; +import { EndpointList } from './view'; +import { MANAGEMENT_ROUTING_ENDPOINTS_PATH } from '../../common/constants'; import { NotFoundPage } from '../../../app/404'; /** * Provides the routing container for the hosts related views */ -export const HostsContainer = memo(() => { +export const EndpointsContainer = memo(() => { return ( - + ); }); -HostsContainer.displayName = 'HostsContainer'; +EndpointsContainer.displayName = 'EndpointsContainer'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx index 3f92358b93d5..727d2715f097 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/routes.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { Route, Switch } from 'react-router-dom'; -import { HostList } from './view'; +import { EndpointList } from './view'; export const EndpointHostsRoutes: React.FC = () => ( - - + + ); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts index 4a4326d5b291..2e188af41d2d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts @@ -12,35 +12,35 @@ import { import { ServerApiError } from '../../../../common/types'; import { GetPolicyListResponse } from '../../policy/types'; import { GetPackagesResponse } from '../../../../../../ingest_manager/common'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; -interface ServerReturnedHostList { - type: 'serverReturnedHostList'; +interface ServerReturnedEndpointList { + type: 'serverReturnedEndpointList'; payload: HostResultList; } -interface ServerFailedToReturnHostList { - type: 'serverFailedToReturnHostList'; +interface ServerFailedToReturnEndpointList { + type: 'serverFailedToReturnEndpointList'; payload: ServerApiError; } -interface ServerReturnedHostDetails { - type: 'serverReturnedHostDetails'; +interface ServerReturnedEndpointDetails { + type: 'serverReturnedEndpointDetails'; payload: HostInfo; } -interface ServerFailedToReturnHostDetails { - type: 'serverFailedToReturnHostDetails'; +interface ServerFailedToReturnEndpointDetails { + type: 'serverFailedToReturnEndpointDetails'; payload: ServerApiError; } -interface ServerReturnedHostPolicyResponse { - type: 'serverReturnedHostPolicyResponse'; +interface ServerReturnedEndpointPolicyResponse { + type: 'serverReturnedEndpointPolicyResponse'; payload: GetHostPolicyResponse; } -interface ServerFailedToReturnHostPolicyResponse { - type: 'serverFailedToReturnHostPolicyResponse'; +interface ServerFailedToReturnEndpointPolicyResponse { + type: 'serverFailedToReturnEndpointPolicyResponse'; payload: ServerApiError; } @@ -63,8 +63,8 @@ interface UserSelectedEndpointPolicy { }; } -interface ServerCancelledHostListLoading { - type: 'serverCancelledHostListLoading'; +interface ServerCancelledEndpointListLoading { + type: 'serverCancelledEndpointListLoading'; } interface ServerCancelledPolicyItemsLoading { @@ -76,28 +76,28 @@ interface ServerReturnedEndpointPackageInfo { payload: GetPackagesResponse['response'][0]; } -interface ServerReturnedHostNonExistingPolicies { - type: 'serverReturnedHostNonExistingPolicies'; - payload: HostState['nonExistingPolicies']; +interface ServerReturnedEndpointNonExistingPolicies { + type: 'serverReturnedEndpointNonExistingPolicies'; + payload: EndpointState['nonExistingPolicies']; } -interface ServerReturnedHostExistValue { - type: 'serverReturnedHostExistValue'; +interface ServerReturnedEndpointExistValue { + type: 'serverReturnedEndpointExistValue'; payload: boolean; } -export type HostAction = - | ServerReturnedHostList - | ServerFailedToReturnHostList - | ServerReturnedHostDetails - | ServerFailedToReturnHostDetails - | ServerReturnedHostPolicyResponse - | ServerFailedToReturnHostPolicyResponse +export type EndpointAction = + | ServerReturnedEndpointList + | ServerFailedToReturnEndpointList + | ServerReturnedEndpointDetails + | ServerFailedToReturnEndpointDetails + | ServerReturnedEndpointPolicyResponse + | ServerFailedToReturnEndpointPolicyResponse | ServerReturnedPoliciesForOnboarding | ServerFailedToReturnPoliciesForOnboarding | UserSelectedEndpointPolicy - | ServerCancelledHostListLoading - | ServerReturnedHostExistValue + | ServerCancelledEndpointListLoading + | ServerReturnedEndpointExistValue | ServerCancelledPolicyItemsLoading | ServerReturnedEndpointPackageInfo - | ServerReturnedHostNonExistingPolicies; + | ServerReturnedEndpointNonExistingPolicies; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/host_pagination.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/endpoint_pagination.test.ts similarity index 80% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/host_pagination.test.ts rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/endpoint_pagination.test.ts index 533b14e50f3d..0fd970f4bed1 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/host_pagination.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/endpoint_pagination.test.ts @@ -13,41 +13,41 @@ import { coreMock } from '../../../../../../../../src/core/public/mocks'; import { HostResultList, AppLocation } from '../../../../../common/endpoint/types'; import { DepsStartMock, depsStartMock } from '../../../../common/mock/endpoint'; -import { hostMiddlewareFactory } from './middleware'; +import { endpointMiddlewareFactory } from './middleware'; -import { hostListReducer } from './reducer'; +import { endpointListReducer } from './reducer'; import { uiQueryParams } from './selectors'; -import { mockHostResultList } from './mock_host_result_list'; -import { HostState, HostIndexUIQueryParams } from '../types'; +import { mockEndpointResultList } from './mock_endpoint_result_list'; +import { EndpointState, EndpointIndexUIQueryParams } from '../types'; import { MiddlewareActionSpyHelper, createSpyMiddleware, } from '../../../../common/store/test_utils'; -import { getHostListPath } from '../../../common/routing'; +import { getEndpointListPath } from '../../../common/routing'; -describe('host list pagination: ', () => { +describe('endpoint list pagination: ', () => { let fakeCoreStart: jest.Mocked; let depsStart: DepsStartMock; let fakeHttpServices: jest.Mocked; let history: History; let store: Store; - let queryParams: () => HostIndexUIQueryParams; + let queryParams: () => EndpointIndexUIQueryParams; let waitForAction: MiddlewareActionSpyHelper['waitForAction']; let actionSpyMiddleware; const getEndpointListApiResponse = (): HostResultList => { - return mockHostResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); + return mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); }; - let historyPush: (params: HostIndexUIQueryParams) => void; + let historyPush: (params: EndpointIndexUIQueryParams) => void; beforeEach(() => { fakeCoreStart = coreMock.createStart(); depsStart = depsStartMock(); fakeHttpServices = fakeCoreStart.http as jest.Mocked; history = createBrowserHistory(); - const middleware = hostMiddlewareFactory(fakeCoreStart, depsStart); - ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); - store = createStore(hostListReducer, applyMiddleware(middleware, actionSpyMiddleware)); + const middleware = endpointMiddlewareFactory(fakeCoreStart, depsStart); + ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); + store = createStore(endpointListReducer, applyMiddleware(middleware, actionSpyMiddleware)); history.listen((location) => { store.dispatch({ type: 'userChangedUrl', payload: location }); @@ -55,12 +55,12 @@ describe('host list pagination: ', () => { queryParams = () => uiQueryParams(store.getState()); - historyPush = (nextQueryParams: HostIndexUIQueryParams): void => { - return history.push(getHostListPath({ name: 'hostList', ...nextQueryParams })); + historyPush = (nextQueryParams: EndpointIndexUIQueryParams): void => { + return history.push(getEndpointListPath({ name: 'endpointList', ...nextQueryParams })); }; }); - describe('when the user enteres the host list for the first time', () => { + describe('when the user enteres the endpoint list for the first time', () => { it('the api is called with page_index and page_size defaulting to 0 and 10 respectively', async () => { const apiResponse = getEndpointListApiResponse(); fakeHttpServices.post.mockResolvedValue(apiResponse); @@ -70,10 +70,10 @@ describe('host list pagination: ', () => { type: 'userChangedUrl', payload: { ...history.location, - pathname: getHostListPath({ name: 'hostList' }), + pathname: getEndpointListPath({ name: 'endpointList' }), }, }); - await waitForAction('serverReturnedHostList'); + await waitForAction('serverReturnedEndpointList'); expect(fakeHttpServices.post).toHaveBeenCalledWith('/api/endpoint/metadata', { body: JSON.stringify({ paging_properties: [{ page_index: '0' }, { page_size: '10' }], diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts index 8ff4ad5a043b..b3ab3443809c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts @@ -5,24 +5,24 @@ */ import { createStore, Dispatch, Store } from 'redux'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; import { listData } from './selectors'; -import { mockHostResultList } from './mock_host_result_list'; -import { HostAction } from './action'; -import { hostListReducer } from './reducer'; +import { mockEndpointResultList } from './mock_endpoint_result_list'; +import { EndpointAction } from './action'; +import { endpointListReducer } from './reducer'; -describe('HostList store concerns', () => { - let store: Store; - let dispatch: Dispatch; +describe('EndpointList store concerns', () => { + let store: Store; + let dispatch: Dispatch; const createTestStore = () => { - store = createStore(hostListReducer); + store = createStore(endpointListReducer); dispatch = store.dispatch; }; const loadDataToStore = () => { dispatch({ - type: 'serverReturnedHostList', - payload: mockHostResultList({ request_page_size: 1, request_page_index: 1, total: 10 }), + type: 'serverReturnedEndpointList', + payload: mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10 }), }); }; @@ -51,18 +51,18 @@ describe('HostList store concerns', () => { policyItemsLoading: false, endpointPackageInfo: undefined, nonExistingPolicies: {}, - hostsExist: true, + endpointsExist: true, }); }); - test('it handles `serverReturnedHostList', () => { - const payload = mockHostResultList({ + test('it handles `serverReturnedEndpointList', () => { + const payload = mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10, }); dispatch({ - type: 'serverReturnedHostList', + type: 'serverReturnedEndpointList', payload, }); @@ -80,7 +80,7 @@ describe('HostList store concerns', () => { loadDataToStore(); }); - test('it selects `hostListData`', () => { + test('it selects `endpointListData`', () => { const currentState = store.getState(); expect(listData(currentState)).toEqual(currentState.hosts); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts index 1c5c4fbac51b..77ade5bcc697 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts @@ -16,36 +16,36 @@ import { } from '../../../../common/store/test_utils'; import { Immutable, HostResultList } from '../../../../../common/endpoint/types'; import { AppAction } from '../../../../common/store/actions'; -import { mockHostResultList } from './mock_host_result_list'; +import { mockEndpointResultList } from './mock_endpoint_result_list'; import { listData } from './selectors'; -import { HostState } from '../types'; -import { hostListReducer } from './reducer'; -import { hostMiddlewareFactory } from './middleware'; -import { getHostListPath } from '../../../common/routing'; +import { EndpointState } from '../types'; +import { endpointListReducer } from './reducer'; +import { endpointMiddlewareFactory } from './middleware'; +import { getEndpointListPath } from '../../../common/routing'; -describe('host list middleware', () => { +describe('endpoint list middleware', () => { let fakeCoreStart: jest.Mocked; let depsStart: DepsStartMock; let fakeHttpServices: jest.Mocked; - type HostListStore = Store, Immutable>; - let store: HostListStore; - let getState: HostListStore['getState']; - let dispatch: HostListStore['dispatch']; + type EndpointListStore = Store, Immutable>; + let store: EndpointListStore; + let getState: EndpointListStore['getState']; + let dispatch: EndpointListStore['dispatch']; let waitForAction: MiddlewareActionSpyHelper['waitForAction']; let actionSpyMiddleware; let history: History; const getEndpointListApiResponse = (): HostResultList => { - return mockHostResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); + return mockEndpointResultList({ request_page_size: 1, request_page_index: 1, total: 10 }); }; beforeEach(() => { fakeCoreStart = coreMock.createStart({ basePath: '/mock' }); depsStart = depsStartMock(); fakeHttpServices = fakeCoreStart.http as jest.Mocked; - ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); + ({ actionSpyMiddleware, waitForAction } = createSpyMiddleware()); store = createStore( - hostListReducer, - applyMiddleware(hostMiddlewareFactory(fakeCoreStart, depsStart), actionSpyMiddleware) + endpointListReducer, + applyMiddleware(endpointMiddlewareFactory(fakeCoreStart, depsStart), actionSpyMiddleware) ); getState = store.getState; dispatch = store.dispatch; @@ -60,10 +60,10 @@ describe('host list middleware', () => { type: 'userChangedUrl', payload: { ...history.location, - pathname: getHostListPath({ name: 'hostList' }), + pathname: getEndpointListPath({ name: 'endpointList' }), }, }); - await waitForAction('serverReturnedHostList'); + await waitForAction('serverReturnedEndpointList'); expect(fakeHttpServices.post).toHaveBeenCalledWith('/api/endpoint/metadata', { body: JSON.stringify({ paging_properties: [{ page_index: '0' }, { page_size: '10' }], diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts index 74bebf211258..fa2dbe084c1a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts @@ -9,14 +9,14 @@ import { HostInfo, HostResultList } from '../../../../../common/endpoint/types'; import { GetPolicyListResponse } from '../../policy/types'; import { ImmutableMiddlewareFactory } from '../../../../common/store'; import { - isOnHostPage, - hasSelectedHost, + isOnEndpointPage, + hasSelectedEndpoint, uiQueryParams, listData, endpointPackageInfo, nonExistingPolicies, } from './selectors'; -import { HostState } from '../types'; +import { EndpointState } from '../types'; import { sendGetEndpointSpecificPackageConfigs, sendGetEndpointSecurityPackage, @@ -24,16 +24,16 @@ import { } from '../../policy/store/policy_list/services/ingest'; import { AGENT_CONFIG_SAVED_OBJECT_TYPE } from '../../../../../../ingest_manager/common'; -export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (coreStart) => { +export const endpointMiddlewareFactory: ImmutableMiddlewareFactory = (coreStart) => { return ({ getState, dispatch }) => (next) => async (action) => { next(action); const state = getState(); - // Host list + // Endpoint list if ( action.type === 'userChangedUrl' && - isOnHostPage(state) && - hasSelectedHost(state) !== true + isOnEndpointPage(state) && + hasSelectedEndpoint(state) !== true ) { if (!endpointPackageInfo(state)) { sendGetEndpointSecurityPackage(coreStart.http) @@ -50,30 +50,30 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor } const { page_index: pageIndex, page_size: pageSize } = uiQueryParams(state); - let hostResponse; + let endpointResponse; try { - hostResponse = await coreStart.http.post('/api/endpoint/metadata', { + endpointResponse = await coreStart.http.post('/api/endpoint/metadata', { body: JSON.stringify({ paging_properties: [{ page_index: pageIndex }, { page_size: pageSize }], }), }); - hostResponse.request_page_index = Number(pageIndex); + endpointResponse.request_page_index = Number(pageIndex); dispatch({ - type: 'serverReturnedHostList', - payload: hostResponse, + type: 'serverReturnedEndpointList', + payload: endpointResponse, }); - getNonExistingPoliciesForHostsList( + getNonExistingPoliciesForEndpointsList( coreStart.http, - hostResponse.hosts, + endpointResponse.hosts, nonExistingPolicies(state) ) .then((missingPolicies) => { if (missingPolicies !== undefined) { dispatch({ - type: 'serverReturnedHostNonExistingPolicies', + type: 'serverReturnedEndpointNonExistingPolicies', payload: missingPolicies, }); } @@ -83,24 +83,24 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .catch((error) => console.error(error)); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostList', + type: 'serverFailedToReturnEndpointList', payload: error, }); } - // No hosts, so we should check to see if there are policies for onboarding - if (hostResponse && hostResponse.hosts.length === 0) { + // No endpoints, so we should check to see if there are policies for onboarding + if (endpointResponse && endpointResponse.hosts.length === 0) { const http = coreStart.http; // The original query to the list could have had an invalid param (ex. invalid page_size), - // so we check first if hosts actually do exist before pulling in data for the onboarding + // so we check first if endpoints actually do exist before pulling in data for the onboarding // messages. - if (await doHostsExist(http)) { + if (await doEndpointsExist(http)) { return; } dispatch({ - type: 'serverReturnedHostExistValue', + type: 'serverReturnedEndpointExistValue', payload: false, }); @@ -135,13 +135,13 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor } } - // Host Details - if (action.type === 'userChangedUrl' && hasSelectedHost(state) === true) { + // Endpoint Details + if (action.type === 'userChangedUrl' && hasSelectedEndpoint(state) === true) { dispatch({ type: 'serverCancelledPolicyItemsLoading', }); - // If user navigated directly to a host details page, load the host list + // If user navigated directly to a endpoint details page, load the endpoint list if (listData(state).length === 0) { const { page_index: pageIndex, page_size: pageSize } = uiQueryParams(state); try { @@ -152,11 +152,11 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor }); response.request_page_index = Number(pageIndex); dispatch({ - type: 'serverReturnedHostList', + type: 'serverReturnedEndpointList', payload: response, }); - getNonExistingPoliciesForHostsList( + getNonExistingPoliciesForEndpointsList( coreStart.http, response.hosts, nonExistingPolicies(state) @@ -164,7 +164,7 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .then((missingPolicies) => { if (missingPolicies !== undefined) { dispatch({ - type: 'serverReturnedHostNonExistingPolicies', + type: 'serverReturnedEndpointNonExistingPolicies', payload: missingPolicies, }); } @@ -174,31 +174,35 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .catch((error) => console.error(error)); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostList', + type: 'serverFailedToReturnEndpointList', payload: error, }); } } else { dispatch({ - type: 'serverCancelledHostListLoading', + type: 'serverCancelledEndpointListLoading', }); } - // call the host details api - const { selected_host: selectedHost } = uiQueryParams(state); + // call the endpoint details api + const { selected_endpoint: selectedEndpoint } = uiQueryParams(state); try { const response = await coreStart.http.get( - `/api/endpoint/metadata/${selectedHost}` + `/api/endpoint/metadata/${selectedEndpoint}` ); dispatch({ - type: 'serverReturnedHostDetails', + type: 'serverReturnedEndpointDetails', payload: response, }); - getNonExistingPoliciesForHostsList(coreStart.http, [response], nonExistingPolicies(state)) + getNonExistingPoliciesForEndpointsList( + coreStart.http, + [response], + nonExistingPolicies(state) + ) .then((missingPolicies) => { if (missingPolicies !== undefined) { dispatch({ - type: 'serverReturnedHostNonExistingPolicies', + type: 'serverReturnedEndpointNonExistingPolicies', payload: missingPolicies, }); } @@ -208,7 +212,7 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor .catch((error) => console.error(error)); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostDetails', + type: 'serverFailedToReturnEndpointDetails', payload: error, }); } @@ -216,15 +220,15 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor // call the policy response api try { const policyResponse = await coreStart.http.get(`/api/endpoint/policy_response`, { - query: { hostId: selectedHost }, + query: { hostId: selectedEndpoint }, }); dispatch({ - type: 'serverReturnedHostPolicyResponse', + type: 'serverReturnedEndpointPolicyResponse', payload: policyResponse, }); } catch (error) { dispatch({ - type: 'serverFailedToReturnHostPolicyResponse', + type: 'serverFailedToReturnEndpointPolicyResponse', payload: error, }); } @@ -232,11 +236,11 @@ export const hostMiddlewareFactory: ImmutableMiddlewareFactory = (cor }; }; -const getNonExistingPoliciesForHostsList = async ( +const getNonExistingPoliciesForEndpointsList = async ( http: HttpStart, hosts: HostResultList['hosts'], - currentNonExistingPolicies: HostState['nonExistingPolicies'] -): Promise => { + currentNonExistingPolicies: EndpointState['nonExistingPolicies'] +): Promise => { if (hosts.length === 0) { return; } @@ -266,14 +270,14 @@ const getNonExistingPoliciesForHostsList = async ( )})`, }, }) - ).items.reduce((list, agentConfig) => { + ).items.reduce((list, agentConfig) => { (agentConfig.package_configs as string[]).forEach((packageConfig) => { list[packageConfig as string] = true; }); return list; }, {}); - const nonExisting = policyIdsToCheck.reduce( + const nonExisting = policyIdsToCheck.reduce( (list, policyId) => { if (policiesFound[policyId]) { return list; @@ -291,7 +295,7 @@ const getNonExistingPoliciesForHostsList = async ( return nonExisting; }; -const doHostsExist = async (http: HttpStart): Promise => { +const doEndpointsExist = async (http: HttpStart): Promise => { try { return ( ( @@ -304,7 +308,7 @@ const doHostsExist = async (http: HttpStart): Promise => { ); } catch (error) { // eslint-disable-next-line no-console - console.error(`error while trying to check if hosts exist`); + console.error(`error while trying to check if endpoints exist`); // eslint-disable-next-line no-console console.error(error); } diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_host_result_list.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_endpoint_result_list.ts similarity index 79% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_host_result_list.ts rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_endpoint_result_list.ts index b69e5c5cd0e6..2f0b66624f37 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_host_result_list.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/mock_endpoint_result_list.ts @@ -26,7 +26,7 @@ import { GetPolicyListResponse } from '../../policy/types'; const generator = new EndpointDocGenerator('seed'); -export const mockHostResultList: (options?: { +export const mockEndpointResultList: (options?: { total?: number; request_page_size?: number; request_page_index?: number; @@ -62,7 +62,7 @@ export const mockHostResultList: (options?: { /** * returns a mocked API response for retrieving a single host metadata */ -export const mockHostDetailsApiResult = (): HostInfo => { +export const mockEndpointDetailsApiResult = (): HostInfo => { return { metadata: generator.generateHostMetadata(), host_status: HostStatus.ERROR, @@ -73,14 +73,14 @@ export const mockHostDetailsApiResult = (): HostInfo => { * Mock API handlers used by the Endpoint Host list. It also sets up a list of * API handlers for Host details based on a list of Host results. */ -const hostListApiPathHandlerMocks = ({ - hostsResults = mockHostResultList({ total: 3 }).hosts, +const endpointListApiPathHandlerMocks = ({ + endpointsResults = mockEndpointResultList({ total: 3 }).hosts, epmPackages = [generator.generateEpmPackage()], endpointPackageConfigs = [], policyResponse = generator.generatePolicyResponse(), }: { /** route handlers will be setup for each individual host in this array */ - hostsResults?: HostResultList['hosts']; + endpointsResults?: HostResultList['hosts']; epmPackages?: GetPackagesResponse['response']; endpointPackageConfigs?: GetPolicyListResponse['items']; policyResponse?: HostPolicyResponse; @@ -94,17 +94,17 @@ const hostListApiPathHandlerMocks = ({ }; }, - // host list + // endpoint list '/api/endpoint/metadata': (): HostResultList => { return { - hosts: hostsResults, + hosts: endpointsResults, request_page_size: 10, request_page_index: 0, - total: hostsResults?.length || 0, + total: endpointsResults?.length || 0, }; }, - // Do policies referenced in host list exist + // Do policies referenced in endpoint list exist // just returns 1 single agent config that includes all of the packageConfig IDs provided [INGEST_API_AGENT_CONFIGS]: (): GetAgentConfigsResponse => { const agentConfig = generator.generateAgentConfig(); @@ -137,9 +137,9 @@ const hostListApiPathHandlerMocks = ({ }, }; - // Build a GET route handler for each host details based on the list of Hosts passed on input - if (hostsResults) { - hostsResults.forEach((host) => { + // Build a GET route handler for each endpoint details based on the list of Endpoints passed on input + if (endpointsResults) { + endpointsResults.forEach((host) => { // @ts-expect-error apiHandlers[`/api/endpoint/metadata/${host.metadata.host.id}`] = () => host; }); @@ -149,33 +149,36 @@ const hostListApiPathHandlerMocks = ({ }; /** - * Sets up mock impelementations in support of the Hosts list view + * Sets up mock impelementations in support of the Endpoints list view * * @param mockedHttpService - * @param hostsResults + * @param endpointsResults * @param pathHandlersOptions */ -export const setHostListApiMockImplementation: ( +export const setEndpointListApiMockImplementation: ( mockedHttpService: jest.Mocked, - apiResponses?: Parameters[0] + apiResponses?: Parameters[0] ) => void = ( mockedHttpService, - { hostsResults = mockHostResultList({ total: 3 }).hosts, ...pathHandlersOptions } = {} + { endpointsResults = mockEndpointResultList({ total: 3 }).hosts, ...pathHandlersOptions } = {} ) => { - const apiHandlers = hostListApiPathHandlerMocks({ ...pathHandlersOptions, hostsResults }); + const apiHandlers = endpointListApiPathHandlerMocks({ + ...pathHandlersOptions, + endpointsResults, + }); mockedHttpService.post .mockImplementation(async (...args) => { throw new Error(`un-expected call to http.post: ${args}`); }) - // First time called, return list of hosts + // First time called, return list of endpoints .mockImplementationOnce(async () => { return apiHandlers['/api/endpoint/metadata'](); }); - // If the hosts list results is zero, then mock the second call to `/metadata` to return - // empty list - indicating there are no hosts currently present on the system - if (!hostsResults.length) { + // If the endpoints list results is zero, then mock the second call to `/metadata` to return + // empty list - indicating there are no endpoints currently present on the system + if (!endpointsResults.length) { mockedHttpService.post.mockImplementationOnce(async () => { return apiHandlers['/api/endpoint/metadata'](); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts index e54f7df4d4f7..d4fe3310eac0 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { isOnHostPage, hasSelectedHost } from './selectors'; -import { HostState } from '../types'; +import { isOnEndpointPage, hasSelectedEndpoint } from './selectors'; +import { EndpointState } from '../types'; import { AppAction } from '../../../../common/store/actions'; import { ImmutableReducer } from '../../../../common/store'; import { Immutable } from '../../../../../common/endpoint/types'; -export const initialHostListState: Immutable = { +export const initialEndpointListState: Immutable = { hosts: [], pageSize: 10, pageIndex: 0, @@ -29,15 +29,15 @@ export const initialHostListState: Immutable = { policyItemsLoading: false, endpointPackageInfo: undefined, nonExistingPolicies: {}, - hostsExist: true, + endpointsExist: true, }; /* eslint-disable-next-line complexity */ -export const hostListReducer: ImmutableReducer = ( - state = initialHostListState, +export const endpointListReducer: ImmutableReducer = ( + state = initialEndpointListState, action ) => { - if (action.type === 'serverReturnedHostList') { + if (action.type === 'serverReturnedEndpointList') { const { hosts, total, @@ -53,13 +53,13 @@ export const hostListReducer: ImmutableReducer = ( loading: false, error: undefined, }; - } else if (action.type === 'serverFailedToReturnHostList') { + } else if (action.type === 'serverFailedToReturnEndpointList') { return { ...state, error: action.payload, loading: false, }; - } else if (action.type === 'serverReturnedHostNonExistingPolicies') { + } else if (action.type === 'serverReturnedEndpointNonExistingPolicies') { return { ...state, nonExistingPolicies: { @@ -67,14 +67,14 @@ export const hostListReducer: ImmutableReducer = ( ...action.payload, }, }; - } else if (action.type === 'serverReturnedHostDetails') { + } else if (action.type === 'serverReturnedEndpointDetails') { return { ...state, details: action.payload.metadata, detailsLoading: false, detailsError: undefined, }; - } else if (action.type === 'serverFailedToReturnHostDetails') { + } else if (action.type === 'serverFailedToReturnEndpointDetails') { return { ...state, detailsError: action.payload, @@ -92,14 +92,14 @@ export const hostListReducer: ImmutableReducer = ( error: action.payload, policyItemsLoading: false, }; - } else if (action.type === 'serverReturnedHostPolicyResponse') { + } else if (action.type === 'serverReturnedEndpointPolicyResponse') { return { ...state, policyResponse: action.payload.policy_response, policyResponseLoading: false, policyResponseError: undefined, }; - } else if (action.type === 'serverFailedToReturnHostPolicyResponse') { + } else if (action.type === 'serverFailedToReturnEndpointPolicyResponse') { return { ...state, policyResponseError: action.payload, @@ -111,7 +111,7 @@ export const hostListReducer: ImmutableReducer = ( selectedPolicyId: action.payload.selectedPolicyId, policyResponseLoading: false, }; - } else if (action.type === 'serverCancelledHostListLoading') { + } else if (action.type === 'serverCancelledEndpointListLoading') { return { ...state, loading: false, @@ -126,22 +126,22 @@ export const hostListReducer: ImmutableReducer = ( ...state, endpointPackageInfo: action.payload, }; - } else if (action.type === 'serverReturnedHostExistValue') { + } else if (action.type === 'serverReturnedEndpointExistValue') { return { ...state, - hostsExist: action.payload, + endpointsExist: action.payload, }; } else if (action.type === 'userChangedUrl') { - const newState: Immutable = { + const newState: Immutable = { ...state, location: action.payload, }; - const isCurrentlyOnListPage = isOnHostPage(newState) && !hasSelectedHost(newState); - const wasPreviouslyOnListPage = isOnHostPage(state) && !hasSelectedHost(state); - const isCurrentlyOnDetailsPage = isOnHostPage(newState) && hasSelectedHost(newState); - const wasPreviouslyOnDetailsPage = isOnHostPage(state) && hasSelectedHost(state); + const isCurrentlyOnListPage = isOnEndpointPage(newState) && !hasSelectedEndpoint(newState); + const wasPreviouslyOnListPage = isOnEndpointPage(state) && !hasSelectedEndpoint(state); + const isCurrentlyOnDetailsPage = isOnEndpointPage(newState) && hasSelectedEndpoint(newState); + const wasPreviouslyOnDetailsPage = isOnEndpointPage(state) && hasSelectedEndpoint(state); - // if on the host list page for the first time, return new location and load list + // if on the endpoint list page for the first time, return new location and load list if (isCurrentlyOnListPage) { if (!wasPreviouslyOnListPage) { return { @@ -154,7 +154,7 @@ export const hostListReducer: ImmutableReducer = ( }; } } else if (isCurrentlyOnDetailsPage) { - // if previous page was the list or another host details page, load host details only + // if previous page was the list or another endpoint details page, load endpoint details only if (wasPreviouslyOnDetailsPage || wasPreviouslyOnListPage) { return { ...state, @@ -166,7 +166,7 @@ export const hostListReducer: ImmutableReducer = ( policyResponseError: undefined, }; } else { - // if previous page was not host list or host details, load both list and details + // if previous page was not endpoint list or endpoint details, load both list and details return { ...state, location: action.payload, @@ -180,14 +180,14 @@ export const hostListReducer: ImmutableReducer = ( }; } } - // otherwise we are not on a host list or details page + // otherwise we are not on a endpoint list or details page return { ...state, location: action.payload, error: undefined, detailsError: undefined, policyResponseError: undefined, - hostsExist: true, + endpointsExist: true, }; } return state; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts index ca006f21c29a..2c6fc6d5a75e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts @@ -14,36 +14,36 @@ import { HostPolicyResponseConfiguration, HostPolicyResponseActionStatus, } from '../../../../../common/endpoint/types'; -import { HostState, HostIndexUIQueryParams } from '../types'; -import { MANAGEMENT_ROUTING_HOSTS_PATH } from '../../../common/constants'; +import { EndpointState, EndpointIndexUIQueryParams } from '../types'; +import { MANAGEMENT_ROUTING_ENDPOINTS_PATH } from '../../../common/constants'; const PAGE_SIZES = Object.freeze([10, 20, 50]); -export const listData = (state: Immutable) => state.hosts; +export const listData = (state: Immutable) => state.hosts; -export const pageIndex = (state: Immutable): number => state.pageIndex; +export const pageIndex = (state: Immutable): number => state.pageIndex; -export const pageSize = (state: Immutable): number => state.pageSize; +export const pageSize = (state: Immutable): number => state.pageSize; -export const totalHits = (state: Immutable): number => state.total; +export const totalHits = (state: Immutable): number => state.total; -export const listLoading = (state: Immutable): boolean => state.loading; +export const listLoading = (state: Immutable): boolean => state.loading; -export const listError = (state: Immutable) => state.error; +export const listError = (state: Immutable) => state.error; -export const detailsData = (state: Immutable) => state.details; +export const detailsData = (state: Immutable) => state.details; -export const detailsLoading = (state: Immutable): boolean => state.detailsLoading; +export const detailsLoading = (state: Immutable): boolean => state.detailsLoading; -export const detailsError = (state: Immutable) => state.detailsError; +export const detailsError = (state: Immutable) => state.detailsError; -export const policyItems = (state: Immutable) => state.policyItems; +export const policyItems = (state: Immutable) => state.policyItems; -export const policyItemsLoading = (state: Immutable) => state.policyItemsLoading; +export const policyItemsLoading = (state: Immutable) => state.policyItemsLoading; -export const selectedPolicyId = (state: Immutable) => state.selectedPolicyId; +export const selectedPolicyId = (state: Immutable) => state.selectedPolicyId; -export const endpointPackageInfo = (state: Immutable) => state.endpointPackageInfo; +export const endpointPackageInfo = (state: Immutable) => state.endpointPackageInfo; export const endpointPackageVersion = createSelector( endpointPackageInfo, @@ -53,14 +53,14 @@ export const endpointPackageVersion = createSelector( /** * Returns the full policy response from the endpoint after a user modifies a policy. */ -const detailsPolicyAppliedResponse = (state: Immutable) => +const detailsPolicyAppliedResponse = (state: Immutable) => state.policyResponse && state.policyResponse.Endpoint.policy.applied; /** * Returns the response configurations from the endpoint after a user modifies a policy. */ export const policyResponseConfigurations: ( - state: Immutable + state: Immutable ) => undefined | Immutable = createSelector( detailsPolicyAppliedResponse, (applied) => { @@ -72,7 +72,7 @@ export const policyResponseConfigurations: ( * Returns a map of the number of failed and warning policy response actions per configuration. */ export const policyResponseFailedOrWarningActionCount: ( - state: Immutable + state: Immutable ) => Map = createSelector(detailsPolicyAppliedResponse, (applied) => { const failureOrWarningByConfigType = new Map(); if (applied?.response?.configurations !== undefined && applied?.actions !== undefined) { @@ -98,7 +98,7 @@ export const policyResponseFailedOrWarningActionCount: ( * Returns the actions taken by the endpoint for each response configuration after a user modifies a policy. */ export const policyResponseActions: ( - state: Immutable + state: Immutable ) => undefined | Immutable = createSelector( detailsPolicyAppliedResponse, (applied) => { @@ -106,32 +106,32 @@ export const policyResponseActions: ( } ); -export const policyResponseLoading = (state: Immutable): boolean => +export const policyResponseLoading = (state: Immutable): boolean => state.policyResponseLoading; -export const policyResponseError = (state: Immutable) => state.policyResponseError; +export const policyResponseError = (state: Immutable) => state.policyResponseError; -export const isOnHostPage = (state: Immutable) => { +export const isOnEndpointPage = (state: Immutable) => { return ( matchPath(state.location?.pathname ?? '', { - path: MANAGEMENT_ROUTING_HOSTS_PATH, + path: MANAGEMENT_ROUTING_ENDPOINTS_PATH, exact: true, }) !== null ); }; export const uiQueryParams: ( - state: Immutable -) => Immutable = createSelector( - (state: Immutable) => state.location, - (location: Immutable['location']) => { - const data: HostIndexUIQueryParams = { page_index: '0', page_size: '10' }; + state: Immutable +) => Immutable = createSelector( + (state: Immutable) => state.location, + (location: Immutable['location']) => { + const data: EndpointIndexUIQueryParams = { page_index: '0', page_size: '10' }; if (location) { // Removes the `?` from the beginning of query string if it exists const query = querystring.parse(location.search.slice(1)); - const keys: Array = [ - 'selected_host', + const keys: Array = [ + 'selected_endpoint', 'page_size', 'page_index', 'show', @@ -171,15 +171,15 @@ export const uiQueryParams: ( } ); -export const hasSelectedHost: (state: Immutable) => boolean = createSelector( +export const hasSelectedEndpoint: (state: Immutable) => boolean = createSelector( uiQueryParams, - ({ selected_host: selectedHost }) => { - return selectedHost !== undefined; + ({ selected_endpoint: selectedEndpoint }) => { + return selectedEndpoint !== undefined; } ); /** What policy details panel view to show */ -export const showView: (state: HostState) => 'policy_response' | 'details' = createSelector( +export const showView: (state: EndpointState) => 'policy_response' | 'details' = createSelector( uiQueryParams, (searchParams) => { return searchParams.show === 'policy_response' ? 'policy_response' : 'details'; @@ -189,7 +189,7 @@ export const showView: (state: HostState) => 'policy_response' | 'details' = cre /** * Returns the Policy Response overall status */ -export const policyResponseStatus: (state: Immutable) => string = createSelector( +export const policyResponseStatus: (state: Immutable) => string = createSelector( (state) => state.policyResponse, (policyResponse) => { return (policyResponse && policyResponse?.Endpoint?.policy?.applied?.status) || ''; @@ -197,15 +197,16 @@ export const policyResponseStatus: (state: Immutable) => string = cre ); /** - * returns the list of known non-existing polices that may have been in the Host API response. + * returns the list of known non-existing polices that may have been in the Endpoint API response. * @param state */ export const nonExistingPolicies: ( - state: Immutable -) => Immutable = (state) => state.nonExistingPolicies; + state: Immutable +) => Immutable = (state) => state.nonExistingPolicies; /** - * Return boolean that indicates whether hosts exist + * Return boolean that indicates whether endpoints exist * @param state */ -export const hostsExist: (state: Immutable) => boolean = (state) => state.hostsExist; +export const endpointsExist: (state: Immutable) => boolean = (state) => + state.endpointsExist; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts index 6c949e9700b9..7e75285560bd 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts @@ -15,7 +15,7 @@ import { import { ServerApiError } from '../../../common/types'; import { GetPackagesResponse } from '../../../../../ingest_manager/common'; -export interface HostState { +export interface EndpointState { /** list of host **/ hosts: HostInfo[]; /** number of items per page */ @@ -53,15 +53,15 @@ export interface HostState { /** tracks the list of policies IDs used in Host metadata that may no longer exist */ nonExistingPolicies: Record; /** Tracks whether hosts exist and helps control if onboarding should be visible */ - hostsExist: boolean; + endpointsExist: boolean; } /** * Query params on the host page parsed from the URL */ -export interface HostIndexUIQueryParams { - /** Selected host id shows host details flyout */ - selected_host?: string; +export interface EndpointIndexUIQueryParams { + /** Selected endpoint id shows host details flyout */ + selected_endpoint?: string; /** How many items to show in list */ page_size?: string; /** Which page to show */ diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx similarity index 89% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx index ec4d7e87b721..2b6132aca410 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/host_policy_link.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_policy_link.tsx @@ -6,7 +6,7 @@ import React, { memo, useMemo } from 'react'; import { EuiLink, EuiLinkAnchorProps } from '@elastic/eui'; -import { useHostSelector } from '../hooks'; +import { useEndpointSelector } from '../hooks'; import { nonExistingPolicies } from '../../store/selectors'; import { getPolicyDetailPath } from '../../../../common/routing'; import { useFormatUrl } from '../../../../../common/components/link_to'; @@ -18,12 +18,12 @@ import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/end * the `nonExistingPolicies` value in the store. If it does not exist, then regular * text is returned. */ -export const HostPolicyLink = memo< +export const EndpointPolicyLink = memo< Omit & { policyId: string; } >(({ policyId, children, onClick, ...otherProps }) => { - const missingPolicies = useHostSelector(nonExistingPolicies); + const missingPolicies = useEndpointSelector(nonExistingPolicies); const { formatUrl } = useFormatUrl(SecurityPageName.administration); const { toRoutePath, toRouteUrl } = useMemo(() => { const toPath = getPolicyDetailPath(policyId); @@ -50,4 +50,4 @@ export const HostPolicyLink = memo< ); }); -HostPolicyLink.displayName = 'HostPolicyLink'; +EndpointPolicyLink.displayName = 'EndpointPolicyLink'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx similarity index 76% rename from x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx rename to x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx index 6a0a0cbb1014..bd499ee6abb2 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx @@ -19,18 +19,18 @@ import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { HostMetadata } from '../../../../../../common/endpoint/types'; -import { useHostSelector, useAgentDetailsIngestUrl } from '../hooks'; +import { useEndpointSelector, useAgentDetailsIngestUrl } from '../hooks'; import { useNavigateToAppEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { policyResponseStatus, uiQueryParams } from '../../store/selectors'; import { POLICY_STATUS_TO_HEALTH_COLOR } from '../host_constants'; import { FormattedDateAndTime } from '../../../../../common/components/endpoint/formatted_date_time'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app'; -import { getHostDetailsPath } from '../../../../common/routing'; +import { getEndpointDetailsPath } from '../../../../common/routing'; import { SecurityPageName } from '../../../../../app/types'; import { useFormatUrl } from '../../../../../common/components/link_to'; import { AgentDetailsReassignConfigAction } from '../../../../../../../ingest_manager/public'; -import { HostPolicyLink } from '../components/host_policy_link'; +import { EndpointPolicyLink } from '../components/endpoint_policy_link'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -51,15 +51,15 @@ const LinkToExternalApp = styled.div` const openReassignFlyoutSearch = '?openReassignFlyout=true'; -export const HostDetails = memo(({ details }: { details: HostMetadata }) => { +export const EndpointDetails = memo(({ details }: { details: HostMetadata }) => { const agentId = details.elastic.agent.id; const { url: agentDetailsUrl, appId: ingestAppId, appPath: agentDetailsAppPath, } = useAgentDetailsIngestUrl(agentId); - const queryParams = useHostSelector(uiQueryParams); - const policyStatus = useHostSelector( + const queryParams = useEndpointSelector(uiQueryParams); + const policyStatus = useEndpointSelector( policyResponseStatus ) as keyof typeof POLICY_STATUS_TO_HEALTH_COLOR; const { formatUrl } = useFormatUrl(SecurityPageName.administration); @@ -67,13 +67,13 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const detailsResultsUpper = useMemo(() => { return [ { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.os', { + title: i18n.translate('xpack.securitySolution.endpoint.details.os', { defaultMessage: 'OS', }), description: details.host.os.full, }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.lastSeen', { + title: i18n.translate('xpack.securitySolution.endpoint.details.lastSeen', { defaultMessage: 'Last Seen', }), description: , @@ -83,19 +83,19 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const [policyResponseUri, policyResponseRoutePath] = useMemo(() => { // eslint-disable-next-line @typescript-eslint/naming-convention - const { selected_host, show, ...currentUrlParams } = queryParams; + const { selected_endpoint, show, ...currentUrlParams } = queryParams; return [ formatUrl( - getHostDetailsPath({ - name: 'hostPolicyResponse', + getEndpointDetailsPath({ + name: 'endpointPolicyResponse', ...currentUrlParams, - selected_host: details.host.id, + selected_endpoint: details.host.id, }) ), - getHostDetailsPath({ - name: 'hostPolicyResponse', + getEndpointDetailsPath({ + name: 'endpointPolicyResponse', ...currentUrlParams, - selected_host: details.host.id, + selected_endpoint: details.host.id, }), ]; }, [details.host.id, formatUrl, queryParams]); @@ -110,7 +110,10 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { onDoneNavigateTo: [ 'securitySolution:administration', { - path: getHostDetailsPath({ name: 'hostDetails', selected_host: details.host.id }), + path: getEndpointDetailsPath({ + name: 'endpointDetails', + selected_endpoint: details.host.id, + }), }, ], }, @@ -121,22 +124,22 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const detailsResultsPolicy = useMemo(() => { return [ { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.policy', { + title: i18n.translate('xpack.securitySolution.endpoint.details.policy', { defaultMessage: 'Integration', }), description: ( <> - {details.Endpoint.policy.applied.name} - + ), }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.policyStatus', { + title: i18n.translate('xpack.securitySolution.endpoint.details.policyStatus', { defaultMessage: 'Configuration response', }), description: ( @@ -152,7 +155,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { > @@ -166,7 +169,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const detailsResultsLower = useMemo(() => { return [ { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.ipAddress', { + title: i18n.translate('xpack.securitySolution.endpoint.details.ipAddress', { defaultMessage: 'IP Address', }), description: ( @@ -178,13 +181,13 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { ), }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.hostname', { + title: i18n.translate('xpack.securitySolution.endpoint.details.hostname', { defaultMessage: 'Hostname', }), description: details.host.hostname, }, { - title: i18n.translate('xpack.securitySolution.endpoint.host.details.endpointVersion', { + title: i18n.translate('xpack.securitySolution.endpoint.details.endpointVersion', { defaultMessage: 'Endpoint Version', }), description: details.agent.version, @@ -197,13 +200,13 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { { appPath={agentDetailsWithFlyoutPath} href={agentDetailsWithFlyoutUrl} onClick={handleReassignEndpointsClick} - data-test-subj="hostDetailsLinkToIngest" + data-test-subj="endpointDetailsLinkToIngest" > @@ -225,10 +228,10 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { ); }); -HostDetails.displayName = 'HostDetails'; +EndpointDetails.displayName = 'EndpointDetails'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx index 69dabeeb616a..40227ec24a9e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx @@ -19,7 +19,7 @@ import { useHistory } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { useToasts } from '../../../../../common/lib/kibana'; -import { useHostSelector } from '../hooks'; +import { useEndpointSelector } from '../hooks'; import { urlFromQueryParams } from '../url_from_query_params'; import { uiQueryParams, @@ -33,36 +33,39 @@ import { policyResponseError, policyResponseLoading, } from '../../store/selectors'; -import { HostDetails } from './host_details'; +import { EndpointDetails } from './endpoint_details'; import { PolicyResponse } from './policy_response'; import { HostMetadata } from '../../../../../../common/endpoint/types'; import { FlyoutSubHeader, FlyoutSubHeaderProps } from './components/flyout_sub_header'; import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; -import { getHostListPath } from '../../../../common/routing'; +import { getEndpointListPath } from '../../../../common/routing'; import { SecurityPageName } from '../../../../../app/types'; import { useFormatUrl } from '../../../../../common/components/link_to'; -export const HostDetailsFlyout = memo(() => { +export const EndpointDetailsFlyout = memo(() => { const history = useHistory(); const toasts = useToasts(); - const queryParams = useHostSelector(uiQueryParams); - const { selected_host: selectedHost, ...queryParamsWithoutSelectedHost } = queryParams; - const details = useHostSelector(detailsData); - const loading = useHostSelector(detailsLoading); - const error = useHostSelector(detailsError); - const show = useHostSelector(showView); + const queryParams = useEndpointSelector(uiQueryParams); + const { + selected_endpoint: selectedEndpoint, + ...queryParamsWithoutSelectedEndpoint + } = queryParams; + const details = useEndpointSelector(detailsData); + const loading = useEndpointSelector(detailsLoading); + const error = useEndpointSelector(detailsError); + const show = useEndpointSelector(showView); const handleFlyoutClose = useCallback(() => { - history.push(urlFromQueryParams(queryParamsWithoutSelectedHost)); - }, [history, queryParamsWithoutSelectedHost]); + history.push(urlFromQueryParams(queryParamsWithoutSelectedEndpoint)); + }, [history, queryParamsWithoutSelectedEndpoint]); useEffect(() => { if (error !== undefined) { toasts.addDanger({ - title: i18n.translate('xpack.securitySolution.endpoint.host.details.errorTitle', { + title: i18n.translate('xpack.securitySolution.endpoint.details.errorTitle', { defaultMessage: 'Could not find host', }), - text: i18n.translate('xpack.securitySolution.endpoint.host.details.errorBody', { + text: i18n.translate('xpack.securitySolution.endpoint.details.errorBody', { defaultMessage: 'Please exit the flyout and select an available host.', }), }); @@ -73,12 +76,12 @@ export const HostDetailsFlyout = memo(() => { -

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%0DBr^L@;|Mva)8!pvfM5Ihy7d<-r%n) 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¨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 AjQ{`u literal 0 HcmV?d00001 diff --git a/docs/visualize/images/timelion-copy-expression.png b/docs/visualize/images/timelion-copy-expression.png new file mode 100644 index 0000000000000000000000000000000000000000..376bf7919166e25fab2416b03096ca9fc64775e0 GIT binary patch literal 228148 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