You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by po...@apache.org on 2023/09/21 14:30:05 UTC
[incubator-kie-tools-temporary-rnd-do-not-use] 13/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1557)
This is an automated email from the ASF dual-hosted git repository.
porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git
commit 414c4cbca7c2ac4f7ba96460e2e84909b08f01e8
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Mon Apr 10 11:59:28 2023 +0200
NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1557)
Signed-off-by: dependabot[bot] <su...@github.com>
Signed-off-by: Tomas David <td...@redhat.com>
Signed-off-by: Kirill Gaevskii <kg...@redhat.com>
Co-authored-by: Handreyrc <47...@users.noreply.github.com>
Co-authored-by: Roger Martinez <ro...@gmail.com>
Co-authored-by: Tiago Bento <15...@users.noreply.github.com>
Co-authored-by: Kumar Aditya Raj <se...@gmail.com>
Co-authored-by: Kirill Gaevskii <kg...@redhat.com>
Co-authored-by: William Antônio Siqueira <wi...@gmail.com>
Co-authored-by: Jaime Enriquez <ja...@inodesoft.com>
Co-authored-by: Luiz João Motta <lu...@gmail.com>
Co-authored-by: Zbyněk Drápela <61...@users.noreply.github.com>
Co-authored-by: Manaswini Das <da...@gmail.com>
Co-authored-by: Pere Fernández <pe...@users.noreply.github.com>
Co-authored-by: Paulo Martins <pa...@gmail.com>
Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
Co-authored-by: Thiago Lugli <th...@users.noreply.github.com>
Co-authored-by: Daniel J dos Santos <da...@users.noreply.github.com>
Co-authored-by: Daniel J dos Santos <da...@ibm.com>
Co-authored-by: Lubo Terifaj <lu...@gmail.com>
Co-authored-by: dependabot[bot] <49...@users.noreply.github.com>
Co-authored-by: Barbora Kapustova (Siskova) <ba...@users.noreply.github.com>
Co-authored-by: Saravana Balaji Srinivasan <40...@users.noreply.github.com>
Co-authored-by: Bai Xiaofeng <bx...@gmail.com>
Co-authored-by: Kbowers <92...@users.noreply.github.com>
Co-authored-by: Kennedy Bowers <ke...@ibm.com>
Co-authored-by: Ajay Jaganathan <36...@users.noreply.github.com>
Co-authored-by: Jan Stastny <st...@gmail.com>
Co-authored-by: jstastny-cz <ja...@ibm.com>
Co-authored-by: Tiago <ti...@gmail.com>
Co-authored-by: Tomáš David <td...@redhat.com>
Co-authored-by: William Antônio Siqueira <ws...@redhat.com>
Co-authored-by: Yeser Amer <ye...@ibm.com>
---
.github/workflows/release_build.yml | 2 +
.github/workflows/staging_build.yml | 2 +
README.md | 4 +-
package.json | 3 +
packages/boxed-expression-component/package.json | 2 +-
.../package.json | 4 +-
.../dashbuilder-component-table/static/index.html | 1 -
.../src/TimeSeriesComponent.tsx | 9 +-
.../src/api/DashbuilderEditorChannelApi.ts | 10 +-
.../src/editor/DashbuilderEditor.tsx | 18 +-
.../src/impl/DashbuilderEditorChannelApiImpl.ts | 5 +
.../src/monaco/DashbuilderMonacoEditorApi.ts | 13 +-
.../external/ExternalComponentDisplayer.java | 8 +-
.../renderer/client/metric/MetricDisplayer.java | 3 +-
.../echarts/client/EChartsDisplayerView.java | 1 +
.../external/ExternalDataSetClientProvider.java | 39 +-
.../services/RuntimeDataSetClientServices.java | 8 +-
.../ExternalDataSetClientProviderTest.java | 87 +
.../RuntimeModelJSONMarshallerTest.java | 3 +-
.../dashbuilder/displayer/DisplayerSettings.java | 4 +-
.../dataset/def/ExternalDataSetDef.java | 17 +-
.../dataset/group/AggregateFunctionType.java | 16 +-
.../dataset/json/ExternalDataSetJSONParser.java | 1 -
.../dataset/json/ExternalDefJSONMarshaller.java | 4 +
.../dataset/engine/SharedDataSetOpEngine.java | 3 +-
.../function/AggregateFunctionManagerImpl.java | 3 +
.../engine/function/JoinCommaFunction.java} | 27 +-
.../{MedianFunction.java => JoinFunction.java} | 42 +-
.../engine/function/JoinHyphenFunction.java} | 28 +-
.../dataset/engine/function/MedianFunction.java | 2 +-
.../engine/function/AggregateFunctionsTest.java | 38 +
.../src/DmnFormToolbar.tsx | 6 +-
.../src/DmnDecision.ts} | 12 +-
.../src/DmnDocumentData.ts} | 25 +-
packages/dmn-language-service/src/index.ts | 29 +
.../tests/fixtures/decisions.dmn | 64 +
packages/dmn-language-service/tests/index.test.ts | 25 +-
packages/editor/src/api/Editor.ts | 1 -
packages/kie-bc-editors/package.json | 1 +
.../src/bpmn/envelope/BpmnEditorFactory.ts | 28 +
.../envelope/exposedInteropApi/DmnDecision.ts} | 12 +-
.../envelope/exposedInteropApi/DmnDocumentData.ts} | 25 +-
.../DmnLanguageServiceExposedInteropApi.ts} | 16 +-
.../kie-bc-editors/src/common/GwtEditorWrapper.tsx | 2 +-
.../GwtAppFormerConsumedInteropApi.ts | 2 +-
packages/kie-bc-editors/tests/DummyEditor.tsx | 5 +-
.../kie-bc-editors/tests/GwtEditorWrapper.test.ts | 5 +
packages/kie-editors-standalone/package.json | 2 +-
packages/online-editor/package.json | 2 +-
.../online-editor/src/aboutModal/AboutButton.tsx | 6 +-
.../src/accelerators/AcceleratorsHooks.tsx | 6 +-
.../EditorEnvelopeLocatorFactory.ts | 36 +-
.../startupBlockers/StartupBlockerTemplate.tsx | 8 +-
packages/pmml-editor/package.json | 2 +-
packages/serverless-logic-web-tools/env/index.js | 10 +
.../it-tests/e2e/CreateNewFile.cy.ts | 3 +
.../it-tests/e2e/TrySample.cy.ts | 141 -
.../it-tests/e2e/UploadFiles.cy.ts | 3 +
packages/serverless-logic-web-tools/package.json | 4 +-
packages/serverless-logic-web-tools/src/App.tsx | 2 +
.../src/editor/Deploy/ConfirmDeployModal.tsx | 6 +-
.../src/editor/EditorPage.tsx | 272 +-
.../src/editor/EditorPageDockDrawer.tsx | 13 +-
.../src/editor/EditorToolbar.tsx | 6 +-
.../src/editor/NewFileDropdownMenu.tsx | 50 +-
.../src/editor/WebToolsEmbeddedEditor.tsx | 168 +
.../src/editor/api/SwfServiceCatalogStore.ts | 6 +-
.../src/editor/channel/DashChannelComponent.tsx | 75 +
.../src/editor/channel/SwfChannelComponent.tsx | 143 +
.../src/editor/hooks/useEditorNotifications.tsx | 73 +
.../src/extension/index.ts | 60 +-
.../src/home/sample/SampleCard.tsx | 117 +
.../src/home/sample/SampleCardSkeleton.css | 56 +
.../src/home/sample/SampleCardSkeleton.tsx | 64 +
.../src/home/sample/SamplesLoadError.tsx | 74 +
.../src/home/sample/Showcase.tsx | 211 +
.../src/home/sample/hooks/SampleContext.tsx | 109 +
.../src/home/sample/sampleApi.ts | 232 +
.../src/homepage/overView/Overview.tsx | 2 +-
.../src/homepage/routes/HomePageRoutes.tsx | 10 +-
.../src/homepage/sampleCatalog/SampleCard.tsx | 79 -
.../src/homepage/sampleCatalog/SampleCatalog.tsx | 100 -
.../src/homepage/sampleCatalog/Types.ts | 65 -
.../src/navigation/Routes.ts | 3 +
.../strategies/DashboardWorkspaceDeployment.ts | 5 +-
.../hooks/useUpdateVirtualServiceRegistry.tsx | 4 +-
.../useVirtualServiceRegistryDependencies.tsx | 4 +-
.../models/VirtualServiceRegistryFunction.ts | 8 +-
.../src/workspace/components/FileLabel.tsx | 15 +-
.../components/NewWorkspaceFromSample.tsx | 80 +
.../static/resources/style.css | 1 -
.../static/samples/compensation/compensation.svg | 1 -
.../samples/compensation/compensation.sw.json | 75 -
.../samples/greetings-kafka/greetings-kafka.svg | 1 -
.../greetings-kafka/greetings-kafka.sw.json | 99 -
.../static/samples/greetings/greetings.svg | 1 -
.../static/samples/greetings/greetings.sw.json | 68 -
.../samples/kitchensink/kitchensink.dash.yml | 822 ----
.../static/samples/kitchensink/kitchensink.svg | 1892 --------
.../products-dashboard/products-dashboard.dash.yml | 42 -
.../products-dashboard/products-dashboard.svg | 671 ---
.../static/samples/swf-report/sampleResponse.json | 5122 --------------------
.../static/samples/swf-report/swf-report.dash.yml | 387 --
.../static/samples/swf-report/swf-report.svg | 1652 -------
.../traffic-violation/traffic-violation.yard.yaml | 28 -
.../serverless-logic-web-tools/webpack.config.js | 3 +-
...erverlessWorkflowDiagramEditorChannelApiImpl.ts | 4 +
.../src/api/DiagramExposedInteropApi.ts | 5 +
.../src/api/DiagramService.ts | 4 +
.../ServerlessWorkflowDiagramEditorChannelApi.ts | 3 +-
.../ServerlessWorkflowDiagramEditorEnvelopeApi.ts | 2 +-
...rverlessWorkflowDiagramEditorEnvelopeApiImpl.ts | 2 +-
.../bridge/client/diagramApi/DiagramApi.java | 4 +
.../diagramApi/DiagramApiInteropWrapper.java | 5 +
.../client/diagramApi/DiagramApiService.java | 5 +
.../client/diagramApi/NoOpDiagramApiService.java | 3 +
.../client/lienzo/shape/impl/LienzoShape.java | 48 -
.../impl/ShapeStateAttributeAnimationHandler.java | 151 -
.../shape/impl/ShapeStateDefaultHandler.java | 96 +-
.../lienzo/shape/view/MultipleAnimationHandle.java | 58 -
.../shape/view/wires/WiresNoneLayoutContainer.java | 81 -
.../shape/view/wires/WiresScalableContainer.java | 148 -
.../shape/view/wires/ext/DecoratedShapeView.java | 215 -
.../client/lienzo/util/LienzoPictureUtils.java | 58 -
.../stunner/client/lienzo/util/LienzoSvgPaths.java | 73 -
.../lienzo/util/ShapeViewUserDataEncoder.java | 29 +-
.../ShapeStateAttributeAnimationHandlerTest.java | 115 -
.../shape/impl/ShapeStateDefaultHandlerTest.java | 92 +-
.../shape/view/MultipleAnimationHandleTest.java | 84 -
.../view/wires/WiresScalableContainerTest.java | 212 -
.../view/wires/ext/DecoratedShapeViewTest.java | 60 -
.../client/lienzo/util/LienzoPictureUtilsTest.java | 79 -
.../stunner/shapes/client/BasicConnectorShape.java | 3 +-
.../stunner/shapes/client/BasicContainerShape.java | 37 -
.../common/stunner/shapes/client/RingShape.java | 42 -
.../shapes/client/view/PictureShapeView.java | 75 -
.../shapes/client/view/ShapeViewFactory.java | 88 -
.../client/widgets/editor/StunnerEditor.java | 3 +
.../session/impl/AbstractSessionPresenter.java | 3 +
.../client/widgets/editor/StunnerEditorTest.java | 15 +
.../client/shape/impl/AbstractElementShape.java | 1 -
.../shape/impl/ShapeStateAttributesFactory.java | 9 +-
.../core/client/shape/impl/NodeShapeImplTest.java | 4 +-
.../common/stunner/sw/autolayout/AutoLayout.java | 1354 +++---
.../stunner/sw/definition/ParallelState.java | 17 +-
.../custom/NumCompletedJsonTypeDeserializer.java | 37 +
.../custom/NumCompletedJsonTypeSerializer.java | 34 +
.../stunner/sw/marshall/TransitionMarshalling.java | 7 +-
.../stunner/sw/resources/i18n/SWConstants.java | 10 +
.../sw/resources/i18n/SWConstants.properties | 8 +-
.../stunner/sw/marshall/StateMarshallingTest.java | 24 +
.../common/stunner/sw/client/shapes/HasAction.java | 79 -
.../stunner/sw/client/shapes/HasActions.java | 2 +-
.../stunner/sw/client/shapes/HasBranches.java | 43 +
.../sw/client/shapes/ParallelStateShape.java | 16 +-
.../sw/client/shapes/ServerlessWorkflowShape.java | 16 +-
.../client/shapes/ServerlessWorkflowShapeView.java | 19 +-
.../stunner/sw/client/shapes/StateShape.java | 9 +-
.../stunner/sw/client/shapes/TransitionShape.java | 7 +-
.../stunner/sw/client/shapes/icons/BottomText.java | 64 +
.../stunner/sw/client/shapes/icons/IconPath.java | 1 +
.../stunner/sw/client/shapes/HasActionTest.java | 166 -
.../stunner/sw/client/shapes/HasActionsTest.java | 4 +-
.../stunner/sw/client/shapes/HasBranchesTest.java | 81 +
.../client/shapes/HasTranslationGeneralTest.java | 7 +-
.../stunner/sw/client/shapes/StateShapeTest.java | 44 +-
.../stunner/sw/client/editor/DiagramEditor.java | 32 +-
.../sw-editor-kogito-app/src/main/webapp/test.html | 2 +-
.../sw/client/editor/DiagramEditorTest.java | 45 +-
.../stunner/sw/client/selenium/JsCanvasHelper.java | 5 +
.../sw/client/selenium/SWEditorSeleniumIT.java | 20 +
.../channel/SwfLanguageServiceCodeCompletion.ts | 10 +-
.../src/channel/parsers/impl/openapi/openapi.ts | 82 +-
.../tests/channel/parsers/openapi/openapi.test.ts | 4 +-
.../marshaller/DmnLanguageServiceApi.java | 33 +
.../DmnLanguageServiceApiInteropWrapper.java} | 24 +-
.../marshaller/DmnLanguageServiceService.java | 33 +
.../DmnLanguageServiceServiceProducer.java | 46 +
.../UnavailableDmnLanguageServiceService.java | 30 +
.../dmneditor/marshaller/model/DmnDecision.java} | 20 +-
.../marshaller/model/DmnDocumentData.java} | 30 +-
.../marshaller/model/PMMLDocumentData.java | 1 +
.../pmmleditor/marshaller/model/PMMLModelData.java | 1 +
.../marshaller/model => util}/JSIUtils.java | 2 +-
.../DmnLanguageServiceServiceProducerTest.java | 58 +
.../marshaller/DmnLanguageServiceServiceTest.java | 55 +
.../rebind/BindableProxyLoaderGenerator.java | 7 +
.../errai/databinding/rebind/DataBindingUtil.java | 39 +-
.../client/editors/types/jsinterop/JavaClass.java | 2 +-
.../pom.xml | 47 +-
.../widgets/container/displayer/FormDisplayer.java | 12 +-
.../DomainObjectFieldChangeHandler.java} | 16 +-
.../DomainObjectFieldChangeHandlerRegistry.java} | 20 +-
...DomainObjectFieldChangeHandlerRegistryImpl.java | 63 +
.../container/displayer/FormDisplayerTest.java | 6 +-
.../task/BusinessRuleTaskExecutionSet.java | 34 +-
.../bpmn/definition/property/task/FileName.java | 69 +
.../bpmn/definition/HashCodeAndEqualityTest.java | 3 +
.../kie-wb-common-stunner-bpmn-client/pom.xml | 5 +
.../common/stunner/bpmn/StunnerBPMNEntryPoint.java | 12 +-
.../dataproviders/DecisionNameFormProvider.java | 54 +
.../client/dataproviders/FileNameFormProvider.java | 43 +
.../BusinessRuleTaskChangeHandler.java | 80 +
.../forms/filters/RuleLanguageFilterProvider.java | 6 +-
.../bpmn/client/forms/util/ListBoxValues.java | 2 +-
.../client/util/DmnResourceContentFetcher.java | 107 +
.../stunner/bpmn/StunnerBPMNEntryPointTest.java | 6 +-
.../BusinessRuleTaskChangeHandlerTest.java | 81 +
.../client/util/DmnResourceContentFetcherTest.java | 93 +
.../pom.xml | 43 +-
.../kogito/client/selenium/basic-process.bpmn2 | 9 +-
.../converters/customproperties/CustomInput.java | 1 +
.../properties/BusinessRuleTaskPropertyWriter.java | 10 +
.../GenericServiceTaskPropertyWriter.java | 29 +-
.../fromstunner/tasks/TaskConverter.java | 1 +
.../properties/BusinessRuleTaskPropertyReader.java | 7 +-
.../tostunner/tasks/BaseTaskConverter.java | 4 +
.../GenericServiceTaskPropertyWriterTest.java | 4 +-
.../GenericServiceTaskPropertyReaderTest.java | 4 +-
.../dashbuilder-editor-extension-smoke.test.ts | 3 +-
.../package.json | 9 +-
.../package.json | 6 +-
.../it-tests/resources/functions/function.sw.json | 14 +
.../resources/functions/function.sw.json.result | 30 +
.../it-tests/resources/functions/function.sw.yaml | 10 +
.../resources/functions/function.sw.yaml.result | 18 +
.../it-tests/resources/functions/routes/camel.json | 29 +
.../it-tests/resources/functions/routes/camel.yaml | 12 +
.../resources/functions/specs/asyncapi.json | 17 +
.../resources/functions/specs/asyncapi.yaml | 10 +
.../resources/functions/specs/openapi.json | 41 +
.../resources/functions/specs/openapi.yaml | 25 +
...kflow-editor-extension-basic-operations.test.ts | 3 +-
...ess-workflow-editor-extension-functions.test.ts | 175 +
.../package.json | 8 +-
...erverlessWorkflowDiagramEditorChannelApiImpl.ts | 30 +-
.../builtInVsCodeEditorSwfContributions.ts | 4 -
packages/vscode-extension-yard-editor/package.json | 8 +-
.../src/constants/ExtensionHelper.ts | 63 +
.../WorkspaceFileRelativePathParser.ts | 56 +-
patches/selenium-webdriver@4.8.1.patch | 13 +
pnpm-lock.yaml | 199 +-
repo/graph.dot | 2 +-
repo/graph.json | 10 +-
244 files changed, 5170 insertions(+), 14907 deletions(-)
diff --git a/.github/workflows/release_build.yml b/.github/workflows/release_build.yml
index 2007fdd061..19eaf8ad88 100644
--- a/.github/workflows/release_build.yml
+++ b/.github/workflows/release_build.yml
@@ -1316,6 +1316,8 @@ jobs:
serverless_logic_web_tools:
env:
+ SERVERLESS_LOGIC_WEB_TOOLS__version: "${{ inputs.tag }}"
+ SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef: "${{ inputs.tag }}"
SERVERLESS_LOGIC_WEB_TOOLS__buildInfo: ""
SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlLinux: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_linux_${{ inputs.tag }}.tar.gz"
SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlMacOs: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_macos_${{ inputs.tag }}.dmg"
diff --git a/.github/workflows/staging_build.yml b/.github/workflows/staging_build.yml
index f365c7d665..baad6f0396 100644
--- a/.github/workflows/staging_build.yml
+++ b/.github/workflows/staging_build.yml
@@ -177,6 +177,8 @@ jobs:
DMN_DEV_DEPLOYMENT__gtmId: ""
DMN_DEV_DEPLOYMENT__onlineEditorUrl: "https://kiegroup.github.io/kogito-online-staging/${{ inputs.tag }}-prerelease"
EXTENDED_SERVICES__kieSandboxUrl: "https://kiegroup.github.io/kogito-online-staging/${{ inputs.tag }}-prerelease"
+ SERVERLESS_LOGIC_WEB_TOOLS__version: "${{ inputs.tag }}-prerelease"
+ SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef: "${{ inputs.tag }}"
SERVERLESS_LOGIC_WEB_TOOLS__buildInfo: "${{ inputs.tag }} (staging) @ ${{ inputs.commit_sha }}"
SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlLinux: "${{ inputs.download_asset_url }}/STAGING__kie_sandbox_extended_services_linux_${{ inputs.tag }}.tar.gz"
SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlMacOs: "${{ inputs.download_asset_url }}/STAGING__kie_sandbox_extended_services_macos_${{ inputs.tag }}.dmg"
diff --git a/README.md b/README.md
index 7ae9f768e4..5cfe210394 100644
--- a/README.md
+++ b/README.md
@@ -138,12 +138,12 @@ After that, you're ready to start developing the Editors individually.
- BPMN
- Located at `packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-kogito-runtime`.
- - Run `mvn clean gwt:run` to start.
+ - Run `mvn clean gwt:run` to start. To enable live-reloading capability, run `mvn clean gwt:run -Phot-reload`
- DMN
- Located at `packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-webapp-kogito-runtime`.
- - Run `mvn clean gwt:run` to start.
+ - Run `mvn clean gwt:run` to start. To enable live-reloading capability, run `mvn clean gwt:run -Phot-reload`
- If you want to enable live-reloading capabilities of the React components that are part of the DMN Editor, follow [these steps](./packages/stunner-editors/docs/live-reload-dmn-loader.md).
- Test Scenario (SceSim)
diff --git a/package.json b/package.json
index 7332149438..828023539b 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,9 @@
"monaco-yaml": "*"
}
}
+ },
+ "patchedDependencies": {
+ "selenium-webdriver@4.8.1": "patches/selenium-webdriver@4.8.1.patch"
}
},
"kieTools": {
diff --git a/packages/boxed-expression-component/package.json b/packages/boxed-expression-component/package.json
index c01c708de4..bfb592847f 100644
--- a/packages/boxed-expression-component/package.json
+++ b/packages/boxed-expression-component/package.json
@@ -60,7 +60,7 @@
"@types/uuid": "^8.3.0",
"copy-webpack-plugin": "^11.0.0",
"copyfiles": "^2.4.1",
- "cypress": "^12.5.1",
+ "cypress": "^12.8.1",
"cypress-file-upload": "^5.0.8",
"cypress-iframe": "^1.0.1",
"cypress-image-snapshot": "^4.0.1",
diff --git a/packages/chrome-extension-pack-kogito-kie-editors/package.json b/packages/chrome-extension-pack-kogito-kie-editors/package.json
index 3e9a5d5a18..0c3a4da08c 100644
--- a/packages/chrome-extension-pack-kogito-kie-editors/package.json
+++ b/packages/chrome-extension-pack-kogito-kie-editors/package.json
@@ -43,14 +43,14 @@
"@types/chrome": "^0.0.193",
"@types/jest": "^26.0.23",
"@types/jest-when": "^2.7.4",
- "@types/selenium-webdriver": "^4.1.9",
+ "@types/selenium-webdriver": "^4.1.12",
"chai": "^4.3.4",
"copy-webpack-plugin": "^11.0.0",
"jest": "^26.6.3",
"jest-junit": "^14.0.0",
"jest-when": "^3.5.0",
"rimraf": "^3.0.2",
- "selenium-webdriver": "^4.7.1",
+ "selenium-webdriver": "^4.8.1",
"start-server-and-test": "^1.12.1",
"ts-jest": "^26.5.6",
"typescript": "^4.4.2",
diff --git a/packages/dashbuilder-component-table/static/index.html b/packages/dashbuilder-component-table/static/index.html
index 4bf57902d6..31199789df 100644
--- a/packages/dashbuilder-component-table/static/index.html
+++ b/packages/dashbuilder-component-table/static/index.html
@@ -17,7 +17,6 @@
<html lang="en">
<head>
<title>Filtered Table</title>
- <link rel="stylesheet" href="resources/style.css" />
<link rel="stylesheet" href="index.css" />
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
diff --git a/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx b/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx
index d2bca813a9..82d17700af 100644
--- a/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx
+++ b/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx
@@ -54,13 +54,8 @@ const INIT_OPTION = {
};
const validate = (columns: Column[]): string | undefined => {
- if (
- columns.length < 3 ||
- columns[0].type !== "LABEL" || // series
- columns[1].type !== "NUMBER" || // time
- columns[2].type !== "NUMBER" // value
- ) {
- return "Data Set is Invalid! You must provide at least 3 columns container the series (LABEL), timestamp (NUMBER) and the value (NUMBER)";
+ if (columns.length < 3) {
+ return "Data Set is invalid! You must provide at least 3 columns containing the series, timestamp and the value";
}
};
diff --git a/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts b/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts
index b35563c3e9..8543ed0567 100644
--- a/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts
+++ b/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts
@@ -16,5 +16,13 @@
import { KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
import { DashbuilderLanguageServiceChannelApi } from "@kie-tools/dashbuilder-language-service/dist/api";
+import { Position } from "monaco-editor";
-export interface DashbuilderEditorChannelApi extends KogitoEditorChannelApi, DashbuilderLanguageServiceChannelApi {}
+export interface DashbuilderEditorChannelApi extends KogitoEditorChannelApi, DashbuilderLanguageServiceChannelApi {
+ /**
+ * Moves the cursor in the editor to a specified position
+ *
+ * @param position
+ */
+ kogitoDashbuilderTextEditor_moveCursorToPosition(position: Position): void;
+}
diff --git a/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx b/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx
index bba4b9f6cf..b3d9ff6a2b 100644
--- a/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx
+++ b/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx
@@ -26,9 +26,17 @@ import { WorkspaceEdit } from "@kie-tools-core/workspace/dist/api";
import { Notification } from "@kie-tools-core/notifications/dist/api";
import { MonacoEditorOperation, DashbuilderMonacoEditorApi } from "../monaco/DashbuilderMonacoEditorApi";
import { DashbuilderMonacoEditor } from "../monaco/DashbuilderMonacoEditor";
-import { ChannelType, EditorTheme, StateControlCommand } from "@kie-tools-core/editor/dist/api";
+import {
+ ChannelType,
+ EditorTheme,
+ StateControlCommand,
+ useKogitoEditorEnvelopeContext,
+} from "@kie-tools-core/editor/dist/api";
import { Dashbuilder } from "../dashbuilder/Dashbuilder";
import { Toolbar } from "./Toolbar";
+import { Position } from "monaco-editor";
+import { useSubscription } from "@kie-tools-core/envelope-bus/dist/hooks";
+import { DashbuilderEditorChannelApi } from "../api";
const INITIAL_CONTENT = `datasets:
- uuid: products
@@ -123,6 +131,7 @@ const RefForwardingDashbuilderEditor: React.ForwardRefRenderFunction<Dashbuilder
const [renderContent, setRenderContent] = useState("");
const [showPreview, setShowPreview] = useState<boolean>(false);
const dashbuilderMonacoEditorRef = useRef<DashbuilderMonacoEditorApi>(null);
+ const editorEnvelopeCtx = useKogitoEditorEnvelopeContext<DashbuilderEditorChannelApi>();
useEffect(() => {
const timer = setInterval(() => {
@@ -175,6 +184,13 @@ const RefForwardingDashbuilderEditor: React.ForwardRefRenderFunction<Dashbuilder
[]
);
+ useSubscription(
+ editorEnvelopeCtx.channelApi.notifications.kogitoDashbuilderTextEditor_moveCursorToPosition,
+ useCallback((position: Position) => {
+ dashbuilderMonacoEditorRef.current?.moveCursorToPosition(position);
+ }, [])
+ );
+
const onContentChanged = useCallback(
(newContent: string, operation?: MonacoEditorOperation) => {
if (operation === MonacoEditorOperation.EDIT) {
diff --git a/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts b/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts
index cb972126e8..513d087749 100644
--- a/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts
+++ b/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts
@@ -32,6 +32,7 @@ import { DashbuilderEditorChannelApi } from "../editor";
import { SharedValueProvider } from "@kie-tools-core/envelope-bus/dist/api";
import { Position, Range, CompletionItem, CodeLens } from "vscode-languageserver-types";
import { DashbuilderLanguageServiceChannelApi } from "@kie-tools/dashbuilder-language-service/dist/api";
+import { Position as MonacoPosition } from "monaco-editor";
export class DashbuilderEditorChannelApiImpl implements DashbuilderEditorChannelApi {
constructor(
@@ -106,4 +107,8 @@ export class DashbuilderEditorChannelApiImpl implements DashbuilderEditorChannel
kogitoDashbuilderLanguageService__getCodeLenses(args: { uri: string; content: string }): Promise<CodeLens[]> {
return this.dashbuilderLanguageServiceChannelApiImpl.kogitoDashbuilderLanguageService__getCodeLenses(args) ?? [];
}
+
+ public kogitoDashbuilderTextEditor_moveCursorToPosition(_position: MonacoPosition): void {
+ // no-op
+ }
}
diff --git a/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts b/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts
index b13531fb68..127affb1e0 100644
--- a/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts
+++ b/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { editor, KeyCode, KeyMod } from "monaco-editor";
+import { editor, KeyCode, KeyMod, Position } from "monaco-editor";
import { initYamlSchemaDiagnostics } from "./augmentation/language/yaml";
import { OperatingSystem } from "@kie-tools-core/operating-system";
import { EditorTheme } from "@kie-tools-core/editor/dist/api";
@@ -31,6 +31,7 @@ export interface DashbuilderMonacoEditorApi {
getContent: () => string;
setTheme: (theme: EditorTheme) => void;
forceRedraw: () => void;
+ moveCursorToPosition: (position: Position) => void;
}
export enum MonacoEditorOperation {
@@ -134,4 +135,14 @@ export class DefaultDashbuilderMonacoEditorController implements DashbuilderMona
return "vs";
}
}
+
+ public moveCursorToPosition(position: Position): void {
+ if (!this.editor) {
+ return;
+ }
+
+ this.editor.revealLineInCenter(position.lineNumber);
+ this.editor.setPosition(position);
+ this.editor.focus();
+ }
}
diff --git a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java
index 8fc24716b0..8d1cc051ce 100644
--- a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java
+++ b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java
@@ -43,6 +43,8 @@ import org.dashbuilder.displayer.external.ExternalFilterRequest;
@Dependent
public class ExternalComponentDisplayer extends AbstractErraiDisplayer<ExternalComponentDisplayer.View> {
+ private static final String DEFAULT_WIDTH = "100%";
+
public interface View extends AbstractErraiDisplayer.View<ExternalComponentDisplayer> {
void setSize(int chartWidth, int chartHeight);
@@ -125,10 +127,8 @@ public class ExternalComponentDisplayer extends AbstractErraiDisplayer<ExternalC
displayerSettings.getChartMarginLeft());
var width = displayerSettings.getComponentWidth();
- if (width != null && !width.trim().isEmpty()) {
- view.setWidth(width);
- }
-
+ var finalWidth = width != null && !width.trim().isEmpty() ? width : DEFAULT_WIDTH;
+ view.setWidth(finalWidth);
var height = displayerSettings.getComponentHeight();
if (height != null && !height.trim().isEmpty()) {
view.setHeight(height);
diff --git a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java
index b16a0673be..c02786fe5a 100644
--- a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java
+++ b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java
@@ -102,9 +102,8 @@ public class MetricDisplayer extends AbstractGwtDisplayer<MetricDisplayer.View>
public DisplayerConstraints createDisplayerConstraints() {
DataSetLookupConstraints lookupConstraints = new DataSetLookupConstraints()
- .setGroupAllowed(false)
+ .setGroupAllowed(true)
.setMinColumns(1)
- .setFunctionRequired(true)
.setExtraColumnsAllowed(false)
.setColumnsTitle(view.getColumnsTitle());
diff --git a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java
index 963bf9a928..0747f04f2d 100644
--- a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java
+++ b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java
@@ -112,6 +112,7 @@ public class EChartsDisplayerView<P extends EChartsAbstractDisplayer<?>>
initParams);
if (bootstrapParams.isResizable()) {
Window.addResizeHandler(v -> chart.resize());
+ Scheduler.get().scheduleDeferred(chart::resize);
}
}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
index 29f4dab87e..f5469efdfe 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
@@ -163,17 +163,14 @@ public class ExternalDataSetClientProvider {
return register(def, callback, responseText, mimeType);
} else {
var exception = buildExceptionForResponse(responseText, response);
- return notAbleToRetrieveDataSet(def, callback, exception);
+ return notAbleToRetrieveDataSet(def, callback, exception);
}
}, error -> notAbleToRetrieveDataSet(def, callback));
}).catch_(e -> notAbleToRetrieveDataSet(def, callback,
- new RuntimeException("Request not started, make sure that CORS is enabled. Message: " + e)
- ));
+ new RuntimeException("Request not started, make sure that CORS is enabled.\nMessage: " + e)));
}
-
-
private Throwable buildExceptionForResponse(String responseText, Response response) {
var sb = new StringBuffer("The dataset URL is unreachable with status ");
sb.append(response.status);
@@ -186,7 +183,7 @@ public class ExternalDataSetClientProvider {
sb.append(responseText);
}
return new RuntimeException(sb.toString());
- }
+ }
private IThenable<Object> register(ExternalDataSetDef def,
final DataSetReadyCallback callback,
@@ -219,12 +216,37 @@ public class ExternalDataSetClientProvider {
}
}
+ var existingDs = clientDataSetManager.getDataSet(def.getUUID());
+ if (def.isAccumulate() && existingDs != null) {
+ // no new data, so keep existing data set
+ if (dataSet.getRowCount() == 0) {
+ dataSet = existingDs;
+ } else {
+ accumulateDataSet(dataSet, existingDs);
+ }
+ }
+ dataSet.setDefinition(def);
dataSet.setUUID(def.getUUID());
clientDataSetManager.registerDataSet(dataSet);
callback.callback(dataSet);
return null;
}
+ void accumulateDataSet(DataSet dataSet, DataSet existingDs) {
+ if (dataSet.getRowCount() > 0 && !existingDs.getColumns().equals(dataSet.getColumns())) {
+ throw new RuntimeException("New data is not compatible with existing data.");
+ }
+ for (int i = dataSet.getRowCount(), j = 0; i < existingDs.getDefinition().getCacheMaxRows() && j < existingDs
+ .getRowCount(); i++, j++) {
+ final int row = j;
+ var values = existingDs.getColumns()
+ .stream()
+ .map(cl -> existingDs.getValueAt(row, cl.getId()))
+ .toArray(Object[]::new);
+ dataSet.addValues(values);
+ }
+ }
+
private void doLookup(DataSetLookup lookup, DataSetReadyCallback listener) {
try {
var result = clientDataSetManager.lookupDataSet(lookup);
@@ -236,11 +258,14 @@ public class ExternalDataSetClientProvider {
private void handleCache(String uuid) {
var def = externalDataSets.get(uuid);
+ if (def == null || def.isAccumulate()) {
+ return;
+ }
scheduledTimeouts.computeIfPresent(uuid, (k, v) -> {
DomGlobal.clearTimeout(v);
return null;
});
- if (def != null && def.isCacheEnabled()) {
+ if (def.isCacheEnabled()) {
var refreshTimeAmount = def.getRefreshTimeAmount();
if (refreshTimeAmount != null) {
var id = DomGlobal.setTimeout(params -> {
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
index d9ba619fba..a70e08c35b 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
@@ -140,7 +140,7 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
@Override
public void lookupDataSet(DataSetDef def, DataSetLookup lookup, DataSetReadyCallback listener) throws Exception {
var clientDataSet = clientDataSetManager.lookupDataSet(lookup);
- if (clientDataSet != null) {
+ if (!isAccumulate(lookup.getDataSetUUID()) && clientDataSet != null) {
listener.callback(clientDataSet);
return;
}
@@ -151,7 +151,7 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
@Override
public boolean onError(ClientRuntimeError error) {
- if (loader.isEditor() || loader.isClient() ) {
+ if (loader.isEditor() || loader.isClient()) {
listener.onError(error);
} else {
DomGlobal.console.debug("Error retrieving dataset from client, trying from backend");
@@ -172,6 +172,10 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
});
}
+ private boolean isAccumulate(String uuid) {
+ return externalDataSetClientProvider.get(uuid).map(def -> def.isAccumulate()).orElse(false);
+ }
+
@Override
public void lookupDataSet(DataSetLookup request, DataSetReadyCallback listener) throws Exception {
this.lookupDataSet(null, request, listener);
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/external/ExternalDataSetClientProviderTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/external/ExternalDataSetClientProviderTest.java
new file mode 100644
index 0000000000..d4bf5f1c03
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/external/ExternalDataSetClientProviderTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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.
+ */
+package org.dashbuilder.client.external;
+
+import org.dashbuilder.dataset.def.ExternalDataSetDef;
+import org.dashbuilder.dataset.json.ExternalDataSetJSONParser;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ExternalDataSetClientProviderTest {
+
+ private ExternalDataSetJSONParser externalParser;
+
+ private ExternalDataSetClientProvider provider;
+
+ @Before
+ public void prepare() {
+ externalParser = new ExternalDataSetJSONParser(null);
+ provider = new ExternalDataSetClientProvider();
+ }
+
+ @Test
+ public void accumulateDataSetTest() {
+ var provider = new ExternalDataSetClientProvider();
+
+ var def = new ExternalDataSetDef();
+ def.setAccumulate(true);
+
+ var existingDs = externalParser.parseDataSet("[[2], [1]]");
+ var ds = externalParser.parseDataSet("[[3]]");
+
+ existingDs.setDefinition(def);
+ ds.setDefinition(def);
+ provider.accumulateDataSet(ds, existingDs);
+
+ assertEquals(3, ds.getRowCount());
+ }
+
+ @Test
+ public void accumulateDataSetOverflowTest() {
+ var def = new ExternalDataSetDef();
+ def.setAccumulate(true);
+ def.setCacheMaxRows(2);
+
+ var existingDs = externalParser.parseDataSet("[[2], [1]]");
+ var ds = externalParser.parseDataSet("[[3]]");
+
+ existingDs.setDefinition(def);
+ ds.setDefinition(def);
+ provider.accumulateDataSet(ds, existingDs);
+
+ assertEquals(2, ds.getRowCount());
+ assertEquals(3.0, ds.getValueAt(0, 0));
+ assertEquals(2.0, ds.getValueAt(1, 0));
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void accumulateIncompatibleDataSetsTest() {
+ var def = new ExternalDataSetDef();
+ def.setAccumulate(true);
+ def.setCacheMaxRows(2);
+
+ var existingDs = externalParser.parseDataSet("[[1]]");
+ var ds = externalParser.parseDataSet("[[\"a\", 1]]");
+
+ existingDs.setDefinition(def);
+ ds.setDefinition(def);
+
+ provider.accumulateDataSet(ds, existingDs);
+ }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java
index 86ab8c4763..d34209dd99 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java
@@ -62,7 +62,8 @@ public class RuntimeModelJSONMarshallerTest {
" \"pushMaxSize\": 1024,\n" +
" \"refreshAlways\": false,\n" +
" \"dynamic\": false,\n" +
- " \"url\": \"http://acme.com\"\n" +
+ " \"url\": \"http://acme.com\",\n" +
+ " \"accumulate\": false\n" +
" }\n" +
" ],\n" +
" \"properties\": {\n" +
diff --git a/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java b/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
index 674a150ca0..14b57909d6 100644
--- a/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
+++ b/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
@@ -379,7 +379,9 @@ public class DisplayerSettings {
}
public boolean isFilterEnabled() {
- return parseBoolean(settings.get(getSettingPath(DisplayerAttributeDef.FILTER_ENABLED))) || isFilterListeningEnabled() || isFilterNotificationEnabled();
+ return parseBoolean(settings.get(getSettingPath(DisplayerAttributeDef.FILTER_ENABLED))) ||
+ isFilterListeningEnabled() ||
+ isFilterNotificationEnabled();
}
public void setFilterEnabled(boolean filterEnabled) {
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java
index 9312f97559..e567e2eda6 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java
@@ -38,6 +38,8 @@ public class ExternalDataSetDef extends DataSetDef {
private Map<String, String> headers;
+ private boolean accumulate;
+
public ExternalDataSetDef() {
super.setProvider(DataSetProviderType.EXTERNAL);
}
@@ -89,6 +91,14 @@ public class ExternalDataSetDef extends DataSetDef {
this.headers = headers;
}
+ public boolean isAccumulate() {
+ return accumulate;
+ }
+
+ public void setAccumulate(boolean accumulate) {
+ this.accumulate = accumulate;
+ }
+
@Override
public DataSetDef clone() {
var def = new ExternalDataSetDef();
@@ -96,6 +106,7 @@ public class ExternalDataSetDef extends DataSetDef {
def.setUrl(getUrl());
def.setDynamic(isDynamic());
def.setHeaders(getHeaders());
+ def.setAccumulate(isAccumulate());
return def;
}
@@ -112,7 +123,8 @@ public class ExternalDataSetDef extends DataSetDef {
dynamic == other.dynamic &&
Objects.equals(expression, other.expression) &&
Objects.equals(headers, other.headers) &&
- Objects.equals(url, other.url);
+ Objects.equals(url, other.url) &&
+ Objects.equals(accumulate, other.accumulate);
}
public String toString() {
@@ -126,7 +138,8 @@ public class ExternalDataSetDef extends DataSetDef {
out.append("Dynamic=").append(dynamic).append("\n");
out.append("Expression=").append(expression).append("\n");
out.append("Content=").append(content).append("\n");
- out.append("Headers=").append(headers);
+ out.append("Headers=").append(headers).append("\n");
+ out.append("Accumulate=").append(accumulate);
return out.toString();
}
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java
index 2b12efcce1..abadc7fed1 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java
@@ -24,13 +24,17 @@ import org.dashbuilder.dataset.ColumnType;
* List of available aggregate functions used in data set group operations.
*/
public enum AggregateFunctionType {
+
COUNT,
DISTINCT,
AVERAGE,
SUM,
MIN,
MAX,
- MEDIAN;
+ MEDIAN,
+ JOIN,
+ JOIN_COMMA,
+ JOIN_HYPHEN;
private static AggregateFunctionType[] _typeArray = values();
private static List<AggregateFunctionType> _numericOnly = Arrays.asList(AVERAGE, MEDIAN, SUM, MAX, MIN);
@@ -38,7 +42,8 @@ public enum AggregateFunctionType {
public int getIndex() {
for (int i = 0; i < _typeArray.length; i++) {
AggregateFunctionType type = _typeArray[i];
- if (this.equals(type)) return i;
+ if (this.equals(type))
+ return i;
}
return -1;
}
@@ -51,9 +56,14 @@ public enum AggregateFunctionType {
}
public ColumnType getResultType(ColumnType columnType) {
- if (columnType != null && (MIN.equals(this) || MAX.equals(this))) {
+ if (columnType != null && (MIN.equals(this) || MAX.equals(this))) {
return columnType;
}
+ if (JOIN.equals(this) ||
+ JOIN_COMMA.equals(this) ||
+ JOIN_HYPHEN.equals(this)) {
+ return ColumnType.TEXT;
+ }
return ColumnType.NUMBER;
}
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
index c2468679ca..22975dfc2c 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
@@ -144,7 +144,6 @@ public class ExternalDataSetJSONParser {
dataSet.addColumn(id, type);
}
}
-
}
private void addValues(DataSet dataSet, JsonArray valuesArray) {
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java
index c8048518ec..fa4ce701c4 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java
@@ -33,6 +33,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
public static final String EXPRESSION = "expression";
public static final String CONTENT = "content";
public static final String HEADERS = "headers";
+ public static final String ACCUMULATE = "accumulate";
@Override
public void fromJson(ExternalDataSetDef def, JsonObject json) {
@@ -41,6 +42,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
var content = json.getString(CONTENT);
var expression = json.getString(EXPRESSION);
var headers = json.getObject(HEADERS);
+ var accumulate = json.getBoolean(ACCUMULATE);
if (isBlank(url) && isBlank(content)) {
throw new IllegalArgumentException("External Data Sets must have \"url\" or \"content\" field");
@@ -64,6 +66,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
}
def.setDynamic(dynamic);
+ def.setAccumulate(accumulate);
}
@Override
@@ -72,6 +75,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
json.put(URL, def.getUrl());
json.put(EXPRESSION, def.getExpression());
json.put(CONTENT, def.getContent());
+ json.put(ACCUMULATE, def.isAccumulate());
if (def.getHeaders() != null) {
var headers = Json.createObject();
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java
index a366a4d172..e757f0b823 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java
@@ -491,7 +491,8 @@ public class SharedDataSetOpEngine implements DataSetOpEngine {
// Columns based on aggregation functions
AggregateFunctionType aggF = gf.getFunction();
if (aggF != null) {
- DataColumnImpl column = new DataColumnImpl(columnId, ColumnType.NUMBER);
+ var columnType = aggF.getResultType(null);
+ DataColumnImpl column = new DataColumnImpl(columnId, columnType);
column.setGroupFunction(gf);
result.addColumn(column);
}
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java
index 99304f972f..a843051b9e 100755
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java
@@ -39,6 +39,9 @@ public class AggregateFunctionManagerImpl implements AggregateFunctionManager {
registerFunction(new MedianFunction());
registerFunction(new MaxFunction());
registerFunction(new MinFunction());
+ registerFunction(new JoinFunction());
+ registerFunction(new JoinCommaFunction());
+ registerFunction(new JoinHyphenFunction());
}
public Collection<AggregateFunction> getAllFunctions() {
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinCommaFunction.java
similarity index 52%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
copy to packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinCommaFunction.java
index f4ae0bc6a4..60147152c6 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinCommaFunction.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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
+ * 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,
@@ -13,18 +13,21 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package org.dashbuilder.dataset.engine.function;
-package org.appformer.kogito.bridge.client.diagramApi;
+import org.dashbuilder.dataset.group.AggregateFunctionType;
-/**
- * A {@link DiagramApi} implementation used when envelope API is available
- */
-public class DiagramApiService implements DiagramApi {
+public class JoinCommaFunction extends JoinFunction {
+
+ private static final CharSequence COMMA = ", ";
+ public JoinCommaFunction() {
+ super(COMMA);
+ }
+
@Override
- public void onNodeSelected(final String nodeName) {
- if (nodeName != null) {
- DiagramApiInteropWrapper.get().onNodeSelected(nodeName);
- }
+ public AggregateFunctionType getType() {
+ return AggregateFunctionType.JOIN_COMMA;
}
-}
+
+}
\ No newline at end of file
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinFunction.java
similarity index 63%
copy from packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
copy to packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinFunction.java
index db22583660..fbf84b3ef0 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinFunction.java
@@ -18,44 +18,34 @@ package org.dashbuilder.dataset.engine.function;
import java.util.List;
import java.util.stream.Collectors;
+import org.dashbuilder.dataset.group.AggregateFunction;
import org.dashbuilder.dataset.group.AggregateFunctionType;
-/**
- * It calculates the average value of a set of numbers.
- */
-public class MedianFunction extends AbstractFunction {
+public class JoinFunction implements AggregateFunction {
+
+ private static final CharSequence DEFAULT_DELIMITER = " ";
+ private CharSequence delimiter;
+
+ public JoinFunction() {
+ this(DEFAULT_DELIMITER);
+ }
- public MedianFunction() {
+ public JoinFunction(CharSequence delimiter) {
super();
+ this.delimiter = delimiter;
}
+ @Override
public AggregateFunctionType getType() {
- return AggregateFunctionType.MEDIAN;
+ return AggregateFunctionType.JOIN;
}
+ @Override
public Object aggregate(List values) {
- if (values == null || values.isEmpty()) {
- return 0d;
- }
-
- var n = values.size();
-
- if (n == 1) {
- return ((Number) values.get(0)).doubleValue();
- }
-
- var sortedValues = values.stream().mapToDouble(v -> ((Number) v).doubleValue()).sorted().toArray();
-
- if (n % 2 == 1) {
- return sortedValues[n / 2];
- }
- var middle = n / 2;
- var ii = n == 2 ? 0 : middle - 1;
- var is = n == 2 ? 1 : middle + 1;
- var v = (sortedValues[ii] + sortedValues[is]) / 2d;
- return round(v, precission);
+ return values.stream().collect(Collectors.joining(delimiter));
}
+ @Override
public Object aggregate(List values, List<Integer> rows) {
if (rows == null) {
return aggregate(values);
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinHyphenFunction.java
similarity index 50%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
copy to packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinHyphenFunction.java
index f4ae0bc6a4..7be2e9b4cd 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinHyphenFunction.java
@@ -1,11 +1,11 @@
/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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
+ * 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,
@@ -13,18 +13,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+package org.dashbuilder.dataset.engine.function;
-package org.appformer.kogito.bridge.client.diagramApi;
+import org.dashbuilder.dataset.group.AggregateFunctionType;
-/**
- * A {@link DiagramApi} implementation used when envelope API is available
- */
-public class DiagramApiService implements DiagramApi {
+public class JoinHyphenFunction extends JoinFunction {
+
+ // line break compatible with Javascript
+ private static final CharSequence HYPHEN = " - ";
+ public JoinHyphenFunction() {
+ super(HYPHEN);
+ }
+
@Override
- public void onNodeSelected(final String nodeName) {
- if (nodeName != null) {
- DiagramApiInteropWrapper.get().onNodeSelected(nodeName);
- }
+ public AggregateFunctionType getType() {
+ return AggregateFunctionType.JOIN_HYPHEN;
}
-}
+
+}
\ No newline at end of file
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
index db22583660..5821a6b935 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
@@ -51,7 +51,7 @@ public class MedianFunction extends AbstractFunction {
}
var middle = n / 2;
var ii = n == 2 ? 0 : middle - 1;
- var is = n == 2 ? 1 : middle + 1;
+ var is = n == 2 ? 1 : middle;
var v = (sortedValues[ii] + sortedValues[is]) / 2d;
return round(v, precission);
}
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java
index 6dc1faf2f2..f8c2ebe05b 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java
@@ -351,5 +351,43 @@ public class AggregateFunctionsTest {
values = List.of(1);
result = function.aggregate(values);
assertEquals(result, 1.0d);
+
+ values = List.of(1, 2, 3, 3, 4, 5);
+ result = function.aggregate(values);
+ assertEquals(3d, result);
+
+ values = List.of(1, 3, 3, 4);
+ result = function.aggregate(values);
+ assertEquals(3d, result);
+ }
+
+ @Test
+ public void testJoinFunction() {
+ var function = new JoinFunction();
+ var values = List.of("a", "b", "c");
+ var result = function.aggregate(values);
+ assertEquals("a b c", result);
+
+ values = List.of();
+ result = function.aggregate(values);
+ assertEquals("", result);
}
+
+ @Test
+ public void testJoinCommaFunction() {
+ var function = new JoinCommaFunction();
+ var values = List.of("a", "b", "c");
+ var result = function.aggregate(values);
+ assertEquals("a, b, c", result);
+ }
+
+ @Test
+ public void testJoinHyphenFunction() {
+ var function = new JoinHyphenFunction();
+ var values = List.of("a", "b", "c");
+ var result = function.aggregate(values);
+ assertEquals("a - b - c", result);
+
+ }
+
}
diff --git a/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx b/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx
index 32d7284d12..b64c5e03af 100644
--- a/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx
+++ b/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx
@@ -148,8 +148,10 @@ export function DmnFormToolbar(props: Props) {
<Brand
src={routes.static.images.kieHorizontalLogoReverse.path({})}
alt={"Logo"}
- style={{ display: "inline", height: "38px" }}
- />
+ heights={{ default: "38px" }}
+ >
+ <source srcSet={routes.static.images.kieHorizontalLogoReverse.path({})} />
+ </Brand>
</FlexItem>
<FlexItem style={{ display: "flex", alignItems: "center" }}>
<TextContent>
diff --git a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts b/packages/dmn-language-service/src/DmnDecision.ts
similarity index 58%
copy from packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
copy to packages/dmn-language-service/src/DmnDecision.ts
index d75abcad08..0df4449489 100644
--- a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
+++ b/packages/dmn-language-service/src/DmnDecision.ts
@@ -1,11 +1,11 @@
/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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
+ * 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,
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-import { KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
+export class DmnDecision {
+ public readonly name: string;
-export interface ServerlessWorkflowDiagramEditorChannelApi extends KogitoEditorChannelApi {
- kogitoSwfDiagramEditor__onNodeSelected(args: { nodeName: string; documentUri?: string }): void;
+ constructor(name: string) {
+ this.name = name;
+ }
}
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java b/packages/dmn-language-service/src/DmnDocumentData.ts
similarity index 53%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
copy to packages/dmn-language-service/src/DmnDocumentData.ts
index adf0b33bbf..68b80707f6 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
+++ b/packages/dmn-language-service/src/DmnDocumentData.ts
@@ -1,11 +1,11 @@
/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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
+ * 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,
@@ -14,17 +14,16 @@
* limitations under the License.
*/
-package org.appformer.kogito.bridge.client.diagramApi;
+import { DmnDecision } from "./DmnDecision";
-/**
- * Api for diagram window interactions.
- */
-public interface DiagramApi {
-
- /**
- * Move the cursor in the text editor to a specified node
- * @param nodeName the name of the target node
- */
- void onNodeSelected(String nodeName);
+export class DmnDocumentData {
+ public readonly namespace: string;
+ public readonly name: string;
+ public readonly decisions: DmnDecision[];
+ constructor(namespace: string, name: string, models: DmnDecision[]) {
+ this.namespace = namespace;
+ this.name = name;
+ this.decisions = models;
+ }
}
diff --git a/packages/dmn-language-service/src/index.ts b/packages/dmn-language-service/src/index.ts
index c3d2812e6c..3dd2b36878 100644
--- a/packages/dmn-language-service/src/index.ts
+++ b/packages/dmn-language-service/src/index.ts
@@ -14,10 +14,20 @@
* limitations under the License.
*/
+import { DmnDocumentData } from "./DmnDocumentData";
+import { DmnDecision } from "./DmnDecision";
+
+export * from "./DmnDocumentData";
+
const IMPORT = "import";
const INPUT_DATA = "inputData";
const XML_MIME = "text/xml";
const LOCATION_URI_ATTRIBUTE = "locationURI";
+const DECISION_NAME_ATTRIBUTE = "name";
+const NAMESPACE = "namespace";
+const DMN_NAME = "name";
+const DECISION = "decision";
+const DEFINITIONS = "definitions";
export interface DmnLanguageServiceImportedModel {
content: string;
@@ -28,6 +38,8 @@ export class DmnLanguageService {
private readonly parser = new DOMParser();
private readonly importTagRegExp = new RegExp(`([a-z]*:)?(${IMPORT})`);
private readonly inputDataRegEx = new RegExp(`([a-z]*:)?(${INPUT_DATA})`);
+ private readonly decisionsTagRegExp = new RegExp(`([a-z]*:)?(${DECISION})`);
+ private readonly definitionsTagRegExp = new RegExp(`([a-z]*:)?(${DEFINITIONS})`);
constructor(
private readonly args: {
@@ -67,6 +79,23 @@ export class DmnLanguageService {
return "";
}
+ public getDmnDocumentData(dmnContent: string): DmnDocumentData {
+ const xmlContent = this.parser.parseFromString(dmnContent, XML_MIME);
+ const definitionsTag = this.definitionsTagRegExp.exec(dmnContent);
+ const definitions = xmlContent.getElementsByTagName(definitionsTag ? definitionsTag[0] : DEFINITIONS);
+ const definition = definitions[0];
+ const namespace = definition.getAttribute(NAMESPACE);
+ const dmnModelName = definition.getAttribute(DMN_NAME);
+
+ const dmnDecisions = this.decisionsTagRegExp.exec(dmnContent);
+ const dmnDecisionsContent = xmlContent.getElementsByTagName(dmnDecisions ? dmnDecisions[0] : DECISION);
+
+ const decisions = Array.from(dmnDecisionsContent)
+ .map((decision) => decision.getAttribute(DECISION_NAME_ATTRIBUTE))
+ .flatMap((decisionName) => (decisionName ? [new DmnDecision(decisionName)] : []));
+ return new DmnDocumentData(namespace ?? "", dmnModelName ?? "", decisions);
+ }
+
// recursively get imported models
public async getAllImportedModelsResources(modelsContent: string[]): Promise<DmnLanguageServiceImportedModel[]> {
// get imported models resources
diff --git a/packages/dmn-language-service/tests/fixtures/decisions.dmn b/packages/dmn-language-service/tests/fixtures/decisions.dmn
new file mode 100644
index 0000000000..d31e9c2e2c
--- /dev/null
+++ b/packages/dmn-language-service/tests/fixtures/decisions.dmn
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dmn:definitions xmlns:dmn="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="https://kiegroup.org/dmn/_57B8BED3-0077-4154-8435-30E57EA6F02E" xmlns:feel="http://www.omg.org/spec/DMN/20180521/FEEL/" xmlns:kie="http://www.drools.org/kie/dmn/1.2" xmlns:dmndi="http://www.omg.org/spec/DMN/20180521/DMNDI/" xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" id="_69FF465F-72D8-4541-9916-99174CC60EDC" name="My Model Name" typeLanguage="http:/ [...]
+ <dmn:extensionElements/>
+ <dmn:decision id="_DBFC1810-89DF-4FD8-9D42-2C87C29354AC" name="Decision-1">
+ <dmn:extensionElements/>
+ <dmn:variable id="_17C7D2CE-047B-46A8-A2DC-3C3256EDA5E7" name="Decision-1"/>
+ </dmn:decision>
+ <dmn:decision id="_49CDEC14-8D60-408A-9EAB-523E59E2FFAF" name="Decision-2">
+ <dmn:extensionElements/>
+ <dmn:variable id="_A5ECF5B2-278B-487D-A9F4-0C3DF2C25042" name="Decision-2"/>
+ <dmn:informationRequirement id="_E69C6AD0-0BBA-4126-8C0C-7C7381646EEA">
+ <dmn:requiredDecision href="#_DBFC1810-89DF-4FD8-9D42-2C87C29354AC"/>
+ </dmn:informationRequirement>
+ </dmn:decision>
+ <dmn:decision id="_52F81D8D-5FA7-4300-A855-C8CE88D4B825" name="Decision-3">
+ <dmn:extensionElements/>
+ <dmn:variable id="_BD33A344-7F8F-4B18-9535-7ED4041664CB" name="Decision-3"/>
+ <dmn:informationRequirement id="_97E802F2-AFE9-4461-A575-6D8A3B05FD55">
+ <dmn:requiredDecision href="#_49CDEC14-8D60-408A-9EAB-523E59E2FFAF"/>
+ </dmn:informationRequirement>
+ </dmn:decision>
+ <dmndi:DMNDI>
+ <dmndi:DMNDiagram id="_B708E43A-EB44-4DAB-8098-0883E470865F" name="DRG">
+ <di:extension>
+ <kie:ComponentsWidthsExtension/>
+ </di:extension>
+ <dmndi:DMNShape id="dmnshape-drg-_DBFC1810-89DF-4FD8-9D42-2C87C29354AC" dmnElementRef="_DBFC1810-89DF-4FD8-9D42-2C87C29354AC" isCollapsed="false">
+ <dmndi:DMNStyle>
+ <dmndi:FillColor red="255" green="255" blue="255"/>
+ <dmndi:StrokeColor red="0" green="0" blue="0"/>
+ <dmndi:FontColor red="0" green="0" blue="0"/>
+ </dmndi:DMNStyle>
+ <dc:Bounds x="130" y="126" width="100" height="50"/>
+ <dmndi:DMNLabel/>
+ </dmndi:DMNShape>
+ <dmndi:DMNShape id="dmnshape-drg-_49CDEC14-8D60-408A-9EAB-523E59E2FFAF" dmnElementRef="_49CDEC14-8D60-408A-9EAB-523E59E2FFAF" isCollapsed="false">
+ <dmndi:DMNStyle>
+ <dmndi:FillColor red="255" green="255" blue="255"/>
+ <dmndi:StrokeColor red="0" green="0" blue="0"/>
+ <dmndi:FontColor red="0" green="0" blue="0"/>
+ </dmndi:DMNStyle>
+ <dc:Bounds x="130" y="-4" width="100" height="50"/>
+ <dmndi:DMNLabel/>
+ </dmndi:DMNShape>
+ <dmndi:DMNShape id="dmnshape-drg-_52F81D8D-5FA7-4300-A855-C8CE88D4B825" dmnElementRef="_52F81D8D-5FA7-4300-A855-C8CE88D4B825" isCollapsed="false">
+ <dmndi:DMNStyle>
+ <dmndi:FillColor red="255" green="255" blue="255"/>
+ <dmndi:StrokeColor red="0" green="0" blue="0"/>
+ <dmndi:FontColor red="0" green="0" blue="0"/>
+ </dmndi:DMNStyle>
+ <dc:Bounds x="130" y="-134" width="100" height="50"/>
+ <dmndi:DMNLabel/>
+ </dmndi:DMNShape>
+ <dmndi:DMNEdge id="dmnedge-drg-_E69C6AD0-0BBA-4126-8C0C-7C7381646EEA-AUTO-SOURCE-AUTO-TARGET" dmnElementRef="_E69C6AD0-0BBA-4126-8C0C-7C7381646EEA">
+ <di:waypoint x="180" y="126"/>
+ <di:waypoint x="180" y="46"/>
+ </dmndi:DMNEdge>
+ <dmndi:DMNEdge id="dmnedge-drg-_97E802F2-AFE9-4461-A575-6D8A3B05FD55-AUTO-SOURCE-AUTO-TARGET" dmnElementRef="_97E802F2-AFE9-4461-A575-6D8A3B05FD55">
+ <di:waypoint x="180" y="-4"/>
+ <di:waypoint x="180" y="-84"/>
+ </dmndi:DMNEdge>
+ </dmndi:DMNDiagram>
+ </dmndi:DMNDI>
+</dmn:definitions>
\ No newline at end of file
diff --git a/packages/dmn-language-service/tests/index.test.ts b/packages/dmn-language-service/tests/index.test.ts
index 4ca4da7309..92e0dc3f4e 100644
--- a/packages/dmn-language-service/tests/index.test.ts
+++ b/packages/dmn-language-service/tests/index.test.ts
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-import { DmnLanguageService } from "../src";
+import { DmnDocumentData, DmnLanguageService } from "../src";
import { readFile } from "fs/promises";
import { readFileSync } from "fs";
import { resolve } from "path";
+import { DmnDecision } from "../src/DmnDecision";
const tests = [
{ modelPath: "./fixtures/model.dmn", expected: ["recursive.dmn", "nested.dmn"] },
@@ -90,4 +91,26 @@ describe("DmnLanguageService", () => {
expect(await service.getAllImportedModelsResources([fileRecursive])).toEqual([expected]);
});
+
+ it("getDmnDocumentData - get decisions", async () => {
+ const pathRecursive = resolve(__dirname, "./fixtures/decisions.dmn");
+ const fileRecursive = readFileSync(pathRecursive, "utf8");
+
+ const pathNested = resolve(__dirname, "./fixtures/nested.dmn");
+ const fileNested = readFileSync(pathNested, "utf8");
+
+ const expected = {
+ relativePath: pathNested,
+ content: fileNested,
+ };
+
+ const dmnDocumentData: DmnDocumentData = new DmnDocumentData(
+ "https://kiegroup.org/dmn/_57B8BED3-0077-4154-8435-30E57EA6F02E",
+ "My Model Name",
+ [new DmnDecision("Decision-1"), new DmnDecision("Decision-2"), new DmnDecision("Decision-3")]
+ );
+ const service = new DmnLanguageService({ getDmnImportedModel: () => new Promise((res) => res(expected)) });
+
+ expect(service.getDmnDocumentData(fileRecursive)).toEqual(dmnDocumentData);
+ });
});
diff --git a/packages/editor/src/api/Editor.ts b/packages/editor/src/api/Editor.ts
index 640c116f45..30aeb69c38 100644
--- a/packages/editor/src/api/Editor.ts
+++ b/packages/editor/src/api/Editor.ts
@@ -43,5 +43,4 @@ export interface EditorApi {
redo(): Promise<void>;
validate(): Promise<Notification[]>;
setTheme(theme: EditorTheme): Promise<void>;
- selectStateByName?(name: string): Promise<void>;
}
diff --git a/packages/kie-bc-editors/package.json b/packages/kie-bc-editors/package.json
index c6f40e0131..b921b5ab60 100644
--- a/packages/kie-bc-editors/package.json
+++ b/packages/kie-bc-editors/package.json
@@ -34,6 +34,7 @@
"@kie-tools-core/operating-system": "workspace:*",
"@kie-tools-core/vscode-java-code-completion": "workspace:*",
"@kie-tools-core/workspace": "workspace:*",
+ "@kie-tools/dmn-language-service": "workspace:*",
"@kie-tools/pmml-editor-marshaller": "workspace:*",
"@patternfly/react-core": "^4.276.6",
"react": "^17.0.2",
diff --git a/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts b/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts
index d87888b10a..cb3374249e 100644
--- a/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts
+++ b/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts
@@ -18,6 +18,16 @@ import { GwtEditorWrapperFactory, XmlFormatter } from "../../common";
import { BpmnEditorChannelApi, getBpmnLanguageData } from "../api";
import { EditorFactory, EditorInitArgs, KogitoEditorEnvelopeContextType } from "@kie-tools-core/editor/dist/api";
import { BpmnEditor, BpmnEditorImpl } from "./BpmnEditor";
+import { DmnLanguageServiceExposedInteropApi } from "./exposedInteropApi/DmnLanguageServiceExposedInteropApi";
+import { DmnLanguageService } from "@kie-tools/dmn-language-service";
+
+export interface CustomWindow extends Window {
+ envelope: {
+ dmnLanguageService: DmnLanguageServiceExposedInteropApi;
+ };
+}
+
+declare let window: CustomWindow;
export class BpmnEditorFactory implements EditorFactory<BpmnEditor, BpmnEditorChannelApi> {
constructor(private readonly gwtEditorEnvelopeConfig: { shouldLoadResourcesDynamically: boolean }) {}
@@ -26,6 +36,24 @@ export class BpmnEditorFactory implements EditorFactory<BpmnEditor, BpmnEditorCh
ctx: KogitoEditorEnvelopeContextType<BpmnEditorChannelApi>,
initArgs: EditorInitArgs
): Promise<BpmnEditor> {
+ const dmnLs = new DmnLanguageService({
+ // currently does not need to implement it since we don't need a way to read other Dmn files.
+ getDmnImportedModel: () => Promise.resolve({ relativePath: "", content: "" }),
+ });
+
+ const exposedInteropApi: CustomWindow["envelope"] = {
+ dmnLanguageService: {
+ getDmnDocumentData: (dmnContent) => {
+ return dmnLs.getDmnDocumentData(dmnContent);
+ },
+ },
+ };
+
+ window.envelope = {
+ ...(window.envelope ?? {}),
+ ...exposedInteropApi,
+ };
+
const languageData = getBpmnLanguageData(initArgs.resourcesPathPrefix);
const factory = new GwtEditorWrapperFactory<BpmnEditor>(
languageData,
diff --git a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDecision.ts
similarity index 58%
copy from packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
copy to packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDecision.ts
index d75abcad08..0df4449489 100644
--- a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
+++ b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDecision.ts
@@ -1,11 +1,11 @@
/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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
+ * 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,
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-import { KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
+export class DmnDecision {
+ public readonly name: string;
-export interface ServerlessWorkflowDiagramEditorChannelApi extends KogitoEditorChannelApi {
- kogitoSwfDiagramEditor__onNodeSelected(args: { nodeName: string; documentUri?: string }): void;
+ constructor(name: string) {
+ this.name = name;
+ }
}
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDocumentData.ts
similarity index 53%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
copy to packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDocumentData.ts
index adf0b33bbf..68b80707f6 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
+++ b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDocumentData.ts
@@ -1,11 +1,11 @@
/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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
+ * 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,
@@ -14,17 +14,16 @@
* limitations under the License.
*/
-package org.appformer.kogito.bridge.client.diagramApi;
+import { DmnDecision } from "./DmnDecision";
-/**
- * Api for diagram window interactions.
- */
-public interface DiagramApi {
-
- /**
- * Move the cursor in the text editor to a specified node
- * @param nodeName the name of the target node
- */
- void onNodeSelected(String nodeName);
+export class DmnDocumentData {
+ public readonly namespace: string;
+ public readonly name: string;
+ public readonly decisions: DmnDecision[];
+ constructor(namespace: string, name: string, models: DmnDecision[]) {
+ this.namespace = namespace;
+ this.name = name;
+ this.decisions = models;
+ }
}
diff --git a/packages/serverless-workflow-diagram-editor-envelope/src/api/DiagramExposedInteropApi.ts b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnLanguageServiceExposedInteropApi.ts
similarity index 65%
copy from packages/serverless-workflow-diagram-editor-envelope/src/api/DiagramExposedInteropApi.ts
copy to packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnLanguageServiceExposedInteropApi.ts
index c887a0d1d3..99f0643ff0 100644
--- a/packages/serverless-workflow-diagram-editor-envelope/src/api/DiagramExposedInteropApi.ts
+++ b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnLanguageServiceExposedInteropApi.ts
@@ -1,5 +1,5 @@
-/**
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,15 +14,17 @@
* limitations under the License.
*/
+import { DmnDocumentData } from "./DmnDocumentData";
+
/**
* EXPOSED INTEROP API
*
- * This API is exposed from the Envelope to be consumed on Java code for diagram window interactions.
+ * This API is exposed from the Envelope to be consumed on Java code.
*/
-export interface DiagramExposedInteropApi {
+export interface DmnLanguageServiceExposedInteropApi {
/**
- * Event fired when a node is selected
- * @param nodeName the name of the node
+ * It performs the marshall of a xmlContent retrieved from a DMN file returning a DmnDocumentData
+ * * @param xmlContent
*/
- onNodeSelected: (nodeName: string) => void;
+ getDmnDocumentData(dmnContent: string): DmnDocumentData;
}
diff --git a/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx b/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx
index 59fcf6b4ff..e3a580c86d 100644
--- a/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx
+++ b/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx
@@ -91,7 +91,7 @@ export class GwtEditorWrapper implements Editor {
return this.gwtEditor.setContent(path, content.trim());
}
- public selectStateByName(name: string) {
+ public selectStateByName(name: string | null) {
return this.gwtEditor.selectStateByName(name);
}
diff --git a/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts b/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts
index 33e28856de..a095b1ea58 100644
--- a/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts
+++ b/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts
@@ -44,7 +44,7 @@ export interface GwtEditor {
setContent(path: string, content: string): Promise<void>;
getPreview(): Promise<string | undefined>;
validate(): Promise<Notification[]>;
- selectStateByName(name: string): Promise<void>;
+ selectStateByName(name: string | null): Promise<void>;
}
export class GwtAppFormerConsumedInteropApi {
diff --git a/packages/kie-bc-editors/tests/DummyEditor.tsx b/packages/kie-bc-editors/tests/DummyEditor.tsx
index 1185b292c1..cc5fd9ee56 100644
--- a/packages/kie-bc-editors/tests/DummyEditor.tsx
+++ b/packages/kie-bc-editors/tests/DummyEditor.tsx
@@ -18,8 +18,9 @@ import * as React from "react";
import { Editor, EditorTheme } from "@kie-tools-core/editor/dist/api";
import { DEFAULT_RECT } from "@kie-tools-core/guided-tour/dist/api";
import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { GwtEditor } from "@kie-tools/kie-bc-editors/dist/common/consumedInteropApi/GwtAppFormerConsumedInteropApi";
-export class DummyEditor implements Editor {
+export class DummyEditor implements Editor, GwtEditor {
private ref: DummyEditorComponent;
public readonly af_componentTitle = "Dummy Editor";
public readonly af_componentId = "dummy-editor";
@@ -61,7 +62,7 @@ export class DummyEditor implements Editor {
return Promise.resolve();
}
- public selectStateByName(_name: string): Promise<void> {
+ public selectStateByName(_name: string | null): Promise<void> {
return Promise.resolve();
}
}
diff --git a/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts b/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts
index b8c7226aaa..207873ad1a 100644
--- a/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts
+++ b/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts
@@ -58,6 +58,11 @@ describe("GwtEditorWrapper", () => {
expect(mockEditor.setContent).toHaveBeenCalledWith("path", "a content");
});
+ test("selectStateByName", async () => {
+ await wrapper.selectStateByName("stateName");
+ expect(mockEditor.selectStateByName).toHaveBeenCalledWith("stateName");
+ });
+
test("af_onOpen removes header", () => {
const parent = document.createElement("div");
const workbenchHeaderPanel = document.createElement("div");
diff --git a/packages/kie-editors-standalone/package.json b/packages/kie-editors-standalone/package.json
index 06047771c2..7b5b5916e0 100644
--- a/packages/kie-editors-standalone/package.json
+++ b/packages/kie-editors-standalone/package.json
@@ -62,7 +62,7 @@
"@types/react-router-dom": "^5.1.7",
"@types/underscore": "^1.11.2",
"copy-webpack-plugin": "^11.0.0",
- "cypress": "^12.5.1",
+ "cypress": "^12.8.1",
"cypress-file-upload": "^5.0.8",
"cypress-iframe": "^1.0.1",
"cypress-log-to-output": "^1.1.2",
diff --git a/packages/online-editor/package.json b/packages/online-editor/package.json
index 0424ec2682..2d9d6d72a6 100644
--- a/packages/online-editor/package.json
+++ b/packages/online-editor/package.json
@@ -99,7 +99,7 @@
"@types/testing-library__react": "^9.1.2",
"@types/uuid": "^8.3.0",
"copy-webpack-plugin": "^11.0.0",
- "cypress": "^12.5.1",
+ "cypress": "^12.8.1",
"cypress-file-upload": "^5.0.8",
"cypress-iframe": "^1.0.1",
"cypress-log-to-output": "^1.1.2",
diff --git a/packages/online-editor/src/aboutModal/AboutButton.tsx b/packages/online-editor/src/aboutModal/AboutButton.tsx
index e475349e30..eaafcb62ca 100644
--- a/packages/online-editor/src/aboutModal/AboutButton.tsx
+++ b/packages/online-editor/src/aboutModal/AboutButton.tsx
@@ -63,8 +63,10 @@ export const AboutButton: React.FunctionComponent = () => {
<Brand
src={routes.static.images.kieHorizontalLogoDefault.path({})}
alt={"Logo"}
- style={{ display: "inline", height: "80px" }}
- />
+ heights={{ default: "80px" }}
+ >
+ <source srcSet={routes.static.images.kieHorizontalLogoDefault.path({})} />
+ </Brand>
</FlexItem>
<FlexItem style={{ display: "flex", alignItems: "center" }}>
<TextContent>
diff --git a/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx b/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
index def9232810..a80902aa2a 100644
--- a/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
+++ b/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
@@ -42,7 +42,7 @@ import {
GIT_DEFAULT_BRANCH,
GIT_ORIGIN_REMOTE_NAME,
} from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
-import { isDecision, isScorecard, isWorkflow } from "../envelopeLocator/EditorEnvelopeLocatorFactory";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
const TEMP_ACCELERATOR_REMOTE_NAME = "__kie-sandbox__accelerator-remote";
const BACKUP_BRANCH_NAME = "__kie-sandbox__accelerator-backup-branch";
@@ -185,9 +185,9 @@ export function useAcceleratorsDispatch(workspace: ActiveWorkspace) {
workspaceFiles.map(async (file) => {
let fileNewDestination: string;
- if (isDecision(file.relativePath) || isScorecard(file.relativePath)) {
+ if (isOfKind("dmn", file.relativePath) || isOfKind("pmml", file.relativePath)) {
fileNewDestination = accelerator.dmnDestinationFolder;
- } else if (isWorkflow(file.relativePath)) {
+ } else if (isOfKind("bpmn", file.relativePath)) {
fileNewDestination = accelerator.bpmnDestinationFolder;
} else {
fileNewDestination = accelerator.otherFilesDestinationFolder;
diff --git a/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts b/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
index d278130ad8..f8f13e0254 100644
--- a/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
+++ b/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
@@ -20,13 +20,7 @@ import {
EnvelopeMapping,
} from "@kie-tools-core/editor/dist/api/EditorEnvelopeLocator";
-const REGEX = {
- supported: /(\.bpmn|\.bpmn2|\.dmn|\.pmml|\.scesim)$/i,
- dmn: /^.*\.dmn$/i,
- bpmn: /^.*\.(bpmn|bpmn2)$/i,
- scesim: /^.*\.scesim$/i,
- pmml: /^.*\.pmml$/i,
-};
+import { FileTypes, isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
export const GLOB_PATTERN = {
all: "**/*",
@@ -36,14 +30,6 @@ export const GLOB_PATTERN = {
pmml: "**/*.pmml",
};
-export enum FileTypes {
- DMN = "dmn",
- BPMN = "bpmn",
- BPMN2 = "bpmn2",
- SCESIM = "scesim",
- PMML = "pmml",
-}
-
export const supportedFileExtensionArray = [
FileTypes.DMN,
FileTypes.BPMN,
@@ -54,28 +40,12 @@ export const supportedFileExtensionArray = [
export type SupportedFileExtensions = typeof supportedFileExtensionArray[number];
-export function isDecision(path: string): boolean {
- return REGEX.dmn.test(path);
-}
-
-export function isWorkflow(path: string): boolean {
- return REGEX.bpmn.test(path);
-}
-
-export function isTestScenario(path: string): boolean {
- return REGEX.scesim.test(path);
-}
-
-export function isScorecard(path: string): boolean {
- return REGEX.pmml.test(path);
-}
-
export function isModel(path: string): boolean {
- return isDecision(path) || isWorkflow(path) || isScorecard(path);
+ return isOfKind("dmn", path) || isOfKind("bpmn", path) || isOfKind("pmml", path);
}
export function isEditable(path: string): boolean {
- return isModel(path) || isTestScenario(path);
+ return isModel(path) || isOfKind("scesim", path);
}
export class EditorEnvelopeLocatorFactory {
diff --git a/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx b/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx
index cd4d1a0014..8488dffc14 100644
--- a/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx
+++ b/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx
@@ -29,15 +29,17 @@ export function StartupBlockerTemplate(props: { children?: React.ReactNode }) {
header={
<Masthead aria-label={"Page header"} display={{ default: "stack" }}>
<MastheadMain style={{ justifyContent: "space-between" }}>
- <PageHeaderToolsItem className={"pf-l-flex"}>
+ <PageHeaderToolsItem className={"kie-sandbox--logo"}>
<MastheadBrand style={{ textDecoration: "none" }}>
<Flex alignItems={{ default: "alignItemsCenter" }}>
<FlexItem style={{ display: "flex", alignItems: "center" }}>
<Brand
src={routes.static.images.kieHorizontalLogoReverse.path({})}
alt={"Logo"}
- style={{ display: "inline", height: "38px" }}
- />
+ heights={{ default: "38px" }}
+ >
+ <source srcSet={routes.static.images.kieHorizontalLogoReverse.path({})} />
+ </Brand>
</FlexItem>
<FlexItem style={{ display: "flex", alignItems: "center" }}>
<TextContent>
diff --git a/packages/pmml-editor/package.json b/packages/pmml-editor/package.json
index 611bdead0c..c6b6871286 100644
--- a/packages/pmml-editor/package.json
+++ b/packages/pmml-editor/package.json
@@ -90,7 +90,7 @@
"copy-webpack-plugin": "^11.0.0",
"copyfiles": "^2.4.1",
"cpr": "^3.0.1",
- "cypress": "^12.5.1",
+ "cypress": "^12.8.1",
"cypress-file-upload": "^5.0.8",
"cypress-iframe": "^1.0.1",
"cypress-log-to-output": "^1.1.2",
diff --git a/packages/serverless-logic-web-tools/env/index.js b/packages/serverless-logic-web-tools/env/index.js
index 2926081f8f..32c5b70019 100644
--- a/packages/serverless-logic-web-tools/env/index.js
+++ b/packages/serverless-logic-web-tools/env/index.js
@@ -31,6 +31,14 @@ module.exports = composeEnv(
default: `dev (${process.env.USER}) @ ${new Date().toISOString()}`,
description: "",
},
+ SERVERLESS_LOGIC_WEB_TOOLS__version: {
+ default: version,
+ description: "",
+ },
+ SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef: {
+ default: "main",
+ description: "",
+ },
SERVERLESS_LOGIC_WEB_TOOLS__gtmId: {
default: undefined,
description: "",
@@ -75,6 +83,7 @@ module.exports = composeEnv(
get env() {
return {
serverlessLogicWebTools: {
+ version: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__version),
buildInfo: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__buildInfo),
gtmId: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__gtmId),
dev: {
@@ -101,6 +110,7 @@ module.exports = composeEnv(
},
},
gitCorsProxyUrl: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__gitCorsProxyUrl),
+ samplesRepositoryRef: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef),
},
};
},
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
index a206baff6c..3ecb4b0ba4 100644
--- a/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
+++ b/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
@@ -136,5 +136,8 @@ describe("Serverless Logic Web Tools - Create and edit test", () => {
cy.ouia({ ouiaId: "hello-text" }).should("have.text", "Hello");
});
});
+
+ // check there are no problems in dashbuilder file
+ cy.get("#total-notifications").should("have.text", 0);
});
});
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/TrySample.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/TrySample.cy.ts
deleted file mode 100644
index 7425ee4043..0000000000
--- a/packages/serverless-logic-web-tools/it-tests/e2e/TrySample.cy.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed 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 ctrlOrCmd = Cypress.platform === "darwin" ? "Cmd" : "Ctrl";
-
-describe("Serverless Logic Web Tools - Try samples test", () => {
- beforeEach(() => {
- cy.visit("/");
- });
-
- it("should check all samples are present", () => {
- cy.ouia({ ouiaType: "sample-title" }).should(($titles) => {
- expect($titles).length(6);
- expect($titles.eq(0)).text("Greetings");
- expect($titles.eq(1)).text("Greetings with Kafka events");
- expect($titles.eq(2)).text("Compensation");
- expect($titles.eq(3)).text("Dashbuilder Kitchensink");
- expect($titles.eq(4)).text("Products Dashboard");
- expect($titles.eq(5)).text("Serverless Workflow Report");
- });
- });
-
- it("should check greetings sample", () => {
- // open greeting example
- cy.ouia({ ouiaId: "greetings-try-swf-sample-button" }).click();
- cy.loadEditor();
-
- // check header type and name
- cy.ouia({ ouiaId: "file-type-label" }).should("have.text", "Serverless Workflow");
- cy.ouia({ ouiaId: "file-name-input" }).should("have.value", "greetings");
-
- cy.getEditor().within(() => {
- cy.iframe("#kogito-iframe[src='./serverless-workflow-text-editor-envelope.html']").within(() => {
- // check text editor contains text
- cy.get(".monaco-editor textarea")
- .should("contain.value", '"id": "jsongreet"')
- .should("contain.value", '"name": "Greeting workflow",');
-
- // check shortcuts modal dialog
- cy.ouia({ ouiaId: "keyboard-shortcuts-icon" }).click();
- cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box")
- .should("contain.text", "Keyboard shortcuts")
- .should("contain.text", `${ctrlOrCmd} + Z`)
- .should("contain.text", "Undo last edit");
- cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box .pf-c-button").click();
- });
-
- cy.iframe("#kogito-iframe[src='./serverless-workflow-diagram-editor-envelope.html']")
- .trigger("mouseover")
- .within(() => {
- // check canvas is present
- cy.get("#canvasPanel").should("have.descendants", "canvas").should("be.visible");
-
- // check zoom controls are present
- cy.ouia({ ouiaId: "zoom-controls-panel" })
- .should("be.visible")
- .should("have.descendants", "button[data-ouia-component-id='reset-zoom-button']")
- .should("have.descendants", "button[data-ouia-component-id='minus-zoom-button']")
- .should("have.descendants", "button[data-ouia-component-id='plus-zoom-button']")
- .should("have.descendants", "div[data-ouia-component-id='select-zoom-button']");
-
- // check shortcuts modal dialog
- cy.ouia({ ouiaId: "keyboard-shortcuts-icon" }).click();
- cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box")
- .should("contain.text", "Keyboard shortcuts")
- .should("contain.text", `${ctrlOrCmd} + Alt`)
- .should("contain.text", "Hold to Preview");
- cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box .pf-c-button").click();
- });
- });
- });
-
- it("should check swf-report example of dashboard", () => {
- // open swf-report example
- cy.ouia({ ouiaId: "swf-report-try-swf-sample-button" }).click();
- cy.loadEditor();
-
- // check header type and name
- cy.ouia({ ouiaId: "file-type-label" }).should("have.text", "Dashboard");
- cy.ouia({ ouiaId: "file-name-input" }).should("have.value", "swf-report");
-
- cy.getEditor().within(() => {
- // check text editor contains text
- cy.get(".monaco-editor textarea")
- .should("contain.value", "properties:")
- .should("contain.value", "dataIndexUrl: https://your.data.index.url.com")
- .should("contain.value", "cardTemplate: >-");
-
- // check preview buttow hides text editor
- cy.ouia({ ouiaId: "preview-button" }).click();
- cy.get(".monaco-editor textarea").should("not.be.visible");
- cy.ouia({ ouiaId: "preview-button" }).click();
- cy.get(".monaco-editor textarea").should("be.visible");
-
- // check shortcuts modal dialog
- cy.ouia({ ouiaId: "keyboard-shortcuts-icon" }).click();
- cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box")
- .should("contain.text", "Keyboard shortcuts")
- .should("contain.text", `Shift + ${ctrlOrCmd} + Z`)
- .should("contain.text", "Redo last edit");
- cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box .pf-c-button").click();
-
- cy.iframe("[src='dashbuilder-client/index.html']").within(() => {
- // check default values
- cy.get("#mainContainer").should("contain.text", "Serverless Workflow Summary ");
- cy.get(".card-pf-aggregate-status:contains('Total Workflows') > h2").should("have.text", 464);
- cy.get(".card-pf-aggregate-status:contains('Completed') > h2").should("have.text", 458);
- cy.get(".card-pf-aggregate-status:contains('Error') > h2").should("have.text", 6);
- cy.iframe("#externalComponentIFrame").within(() => {
- cy.get(".pf-c-options-menu__toggle-text b").last().should("have.text", 464);
- });
-
- // switch filter and check values
- cy.get("select.form-control").select("yamlgreet");
- cy.get(".card-pf-aggregate-status:contains('Total Workflows') > h2").should("have.text", 177);
- cy.get(".card-pf-aggregate-status:contains('Completed') > h2").should("have.text", 173);
- cy.get(".card-pf-aggregate-status:contains('Error') > h2").should("have.text", 4);
- cy.iframe("#externalComponentIFrame").within(() => {
- cy.get(".pf-c-options-menu__toggle-text b").last().should("have.text", 177);
- });
-
- // check average duration graph
- cy.get(".uf-perspective-rendered-col:contains('Average Duration') .c3-event-rect").click();
- cy.get(".c3-tooltip-name--Total .value").should("have.text", 2.06);
- });
- });
- });
-});
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts
index 4b082aebf2..bba718f70e 100644
--- a/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts
+++ b/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts
@@ -39,6 +39,9 @@ describe("Serverless Logic Web Tools - Upload files test", () => {
cy.ouia({ ouiaId: "hello-text" }).should("have.text", "Hello");
});
});
+
+ // check there are no problems in dashbuilder file
+ cy.get("#total-notifications").should("have.text", 0);
});
it("should upload 2 files (JSON and YAML) and check editors and diagrams content", () => {
diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index b4dc7778a3..e374cea474 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -61,6 +61,7 @@
"axios": "^0.27.2",
"bowser": "^2.10.0",
"buffer": "^6.0.3",
+ "fuse.js": "^6.6.2",
"history": "^4.9.0",
"jszip": "^3.7.1",
"moment": "^2.29.4",
@@ -69,6 +70,7 @@
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-dropzone": "^11.4.2",
+ "react-if": "^4.1.4",
"react-router": "^5.2.1",
"react-router-dom": "^5.2.1",
"showdown": "^2.1.0",
@@ -98,7 +100,7 @@
"@types/react-router": "^5.1.14",
"@types/react-router-dom": "^5.1.7",
"copy-webpack-plugin": "^11.0.0",
- "cypress": "^12.5.1",
+ "cypress": "^12.8.1",
"cypress-file-upload": "^5.0.8",
"cypress-iframe": "^1.0.1",
"cypress-log-to-output": "^1.1.2",
diff --git a/packages/serverless-logic-web-tools/src/App.tsx b/packages/serverless-logic-web-tools/src/App.tsx
index f44b318453..e08b09d3c2 100644
--- a/packages/serverless-logic-web-tools/src/App.tsx
+++ b/packages/serverless-logic-web-tools/src/App.tsx
@@ -26,6 +26,7 @@ import { OpenShiftContextProvider } from "./openshift/OpenShiftContextProvider";
import { SettingsContextProvider } from "./settings/SettingsContext";
import { VirtualServiceRegistryContextProvider } from "./virtualServiceRegistry/VirtualServiceRegistryContextProvider";
import { WorkspacesContextProvider } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContextProvider";
+import { SampleContextProvider } from "./home/sample/hooks/SampleContext";
export const App = () => (
<HashRouter>
@@ -41,6 +42,7 @@ export const App = () => (
],
[OpenShiftContextProvider, {}],
[VirtualServiceRegistryContextProvider, {}],
+ [SampleContextProvider, {}],
[NavigationContextProvider, {}],
[RoutesSwitch, {}]
)}
diff --git a/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx b/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx
index 4c8fbc0da5..df4640d976 100644
--- a/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx
@@ -23,7 +23,7 @@ import { Button } from "@patternfly/react-core/dist/js/components/Button";
import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
import { useCallback, useMemo, useState } from "react";
import { AlertsController, useAlert } from "../../alerts/Alerts";
-import { isDashbuilder, isServerlessWorkflow } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { useAppI18n } from "../../i18n";
import { CompletedDeployOperation } from "../../openshift/deploy/types";
import { useOpenShift } from "../../openshift/OpenShiftContext";
@@ -51,9 +51,9 @@ export function ConfirmDeployModal(props: ConfirmDeployModalProps) {
const optionsComponent = useMemo(() => {
let DeployOptionsComponent = null;
- if (isServerlessWorkflow(props.workspaceFile.name)) {
+ if (isOfKind("sw", props.workspaceFile.name)) {
DeployOptionsComponent = SwfDeployOptions;
- } else if (isDashbuilder(props.workspaceFile.name)) {
+ } else if (isOfKind("dash", props.workspaceFile.name)) {
DeployOptionsComponent = DashDeployOptions;
}
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index e638b2a0ee..b0e9dc58f2 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@ -16,13 +16,8 @@
import * as React from "react";
import { ChannelType } from "@kie-tools-core/editor/dist/api";
-import { EmbeddedEditorFile, StateControl } from "@kie-tools-core/editor/dist/channel";
-import {
- EmbeddedEditor,
- EmbeddedEditorRef,
- EmbeddedEditorChannelApiImpl,
- useStateControlSubscription,
-} from "@kie-tools-core/editor/dist/embedded";
+import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
+import { useStateControlSubscription } from "@kie-tools-core/editor/dist/embedded";
import { Notification } from "@kie-tools-core/notifications/dist/api";
import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
@@ -31,43 +26,23 @@ import { useHistory } from "react-router";
import { AlertsController } from "../alerts/Alerts";
import { LoadingSpinner } from "./LoadingSpinner";
import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocatorContext";
-import { isDashbuilder, isEditable, isServerlessWorkflow } from "../extension";
+import { isEditable } from "../extension";
import { useAppI18n } from "../i18n";
import { useRoutes } from "../navigation/Hooks";
import { useQueryParams } from "../queryParams/QueryParamsContext";
import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
import { useController } from "@kie-tools-core/react-hooks/dist/useController";
import { usePrevious } from "@kie-tools-core/react-hooks/dist/usePrevious";
-import { useSettingsDispatch } from "../settings/SettingsContext";
import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
import { useWorkspaceFilePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceFileHooks";
import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { SwfLanguageServiceChannelApiImpl } from "./api/SwfLanguageServiceChannelApiImpl";
-import { SwfServiceCatalogChannelApiImpl } from "./api/SwfServiceCatalogChannelApiImpl";
import { EditorPageDockDrawer, EditorPageDockDrawerRef } from "./EditorPageDockDrawer";
import { EditorPageErrorPage } from "./EditorPageErrorPage";
import { EditorToolbar } from "./EditorToolbar";
-import {
- useUpdateVirtualServiceRegistryOnVsrFileEvent as useUpdateVirtualServiceRegistryOnVsrFileEvents,
- useUpdateVirtualServiceRegistryOnVsrWorkspaceEvent as useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents,
- useUpdateVirtualServiceRegistryOnWorkspaceFileEvents,
-} from "../virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry";
-import { useVirtualServiceRegistry } from "../virtualServiceRegistry/VirtualServiceRegistryContext";
-import { DiagnosticSeverity } from "vscode-languageserver-types";
-import { useSwfFeatureToggle } from "./hooks/useSwfFeatureToggle";
-import {
- SwfCombinedEditorChannelApiImpl,
- SwfFeatureToggleChannelApiImpl,
-} from "@kie-tools/serverless-workflow-combined-editor/dist/impl";
-import { WebToolsSwfLanguageService } from "./api/WebToolsSwfLanguageService";
import { APP_NAME } from "../AppConstants";
-import { MessageBusClientApi } from "@kie-tools-core/envelope-bus/dist/api";
-import { ServerlessWorkflowCombinedEditorChannelApi } from "@kie-tools/serverless-workflow-combined-editor/dist/api";
-import { Position } from "monaco-editor";
-import { DashbuilderLanguageServiceChannelApiImpl } from "./api/DashbuilderLanguageServiceChannelApiImpl";
-import { DashbuilderLanguageService } from "@kie-tools/dashbuilder-language-service/dist/channel";
-import { DashbuilderEditorChannelApiImpl } from "@kie-tools/dashbuilder-editor/dist/impl";
-import { DashbuilderLanguageServiceChannelApi } from "@kie-tools/dashbuilder-language-service/dist/api";
+import { WebToolsEmbeddedEditor, WebToolsEmbeddedEditorRef } from "./WebToolsEmbeddedEditor";
+import { useEditorNotifications } from "./hooks/useEditorNotifications";
+
export interface Props {
workspaceId: string;
fileRelativePath: string;
@@ -77,41 +52,24 @@ let saveVersion = 1;
let refreshVersion = 0;
export function EditorPage(props: Props) {
- const settingsDispatch = useSettingsDispatch();
const routes = useRoutes();
const editorEnvelopeLocator = useEditorEnvelopeLocator();
const history = useHistory();
const workspaces = useWorkspaces();
const { i18n, locale } = useAppI18n();
- const [editor, editorRef] = useController<EmbeddedEditorRef>();
+ const [webToolsEditor, webToolsEditorRef] = useController<WebToolsEmbeddedEditorRef>();
const [alerts, alertsRef] = useController<AlertsController>();
const [editorPageDock, editorPageDockRef] = useController<EditorPageDockDrawerRef>();
const lastContent = useRef<string>();
const workspaceFilePromise = useWorkspaceFilePromise(props.workspaceId, props.fileRelativePath);
const [embeddedEditorFile, setEmbeddedEditorFile] = useState<EmbeddedEditorFile>();
- const isEditorReady = useMemo(() => editor?.isReady, [editor]);
- const [isReady, setReady] = useState(false);
- const [isServiceRegistryReady, setServiceRegistryReady] = useState(false);
- const swfFeatureToggle = useSwfFeatureToggle(editor);
-
+ const isEditorReady = useMemo(() => webToolsEditor?.editor?.isReady, [webToolsEditor]);
const queryParams = useQueryParams();
- const virtualServiceRegistry = useVirtualServiceRegistry();
-
- const isSwf = useMemo(
- () => workspaceFilePromise.data && isServerlessWorkflow(workspaceFilePromise.data.workspaceFile.name),
- [workspaceFilePromise.data]
- );
-
- const isDash = useMemo(
- () => workspaceFilePromise.data && isDashbuilder(workspaceFilePromise.data.workspaceFile.name),
- [workspaceFilePromise.data]
- );
- useUpdateVirtualServiceRegistryOnWorkspaceFileEvents({ workspaceFile: workspaceFilePromise.data?.workspaceFile });
- useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents({ catalogStore: settingsDispatch.serviceRegistry.catalogStore });
- useUpdateVirtualServiceRegistryOnVsrFileEvents({
- workspaceId: props.workspaceId,
- catalogStore: settingsDispatch.serviceRegistry.catalogStore,
+ const notifications = useEditorNotifications({
+ webToolsEditor,
+ content: lastContent.current,
+ fileRelativePath: props.fileRelativePath,
});
useEffect(() => {
@@ -193,26 +151,20 @@ export function EditorPage(props: Props) {
}
const saveContent = useCallback(async () => {
- if (!workspaceFilePromise.data || !editor) {
+ if (!workspaceFilePromise.data || !webToolsEditor?.editor) {
return;
}
const version = saveVersion++;
console.debug(`Saving @ new version (${saveVersion}).`);
- const content = await editor.getContent();
- // FIXME: Uncomment when working on KOGITO-7805
- // const svgString = await editor.getPreview();
+ const content = await webToolsEditor.editor.getContent();
if (version + 1 < saveVersion) {
console.debug(`Saving @ stale version (${version}); ignoring before writing.`);
return;
}
- // FIXME: Uncomment when working on KOGITO-7805
- // if (svgString) {
- // await svgService.createOrOverwriteSvg(workspaceFilePromise.data, svgString);
- // }
console.debug(`Saving @ current version (${version}); updating content.`);
lastContent.current = content;
@@ -228,11 +180,11 @@ export function EditorPage(props: Props) {
}
console.debug(`Saving @ current version (${version}); marking as saved.`);
- editor?.getStateControl().setSavedCommand();
- }, [workspaces, editor, workspaceFilePromise]);
+ webToolsEditor.editor.getStateControl().setSavedCommand();
+ }, [workspaces, webToolsEditor, workspaceFilePromise]);
useStateControlSubscription(
- editor,
+ webToolsEditor?.editor,
useCallback(
(isDirty) => {
if (!isDirty) {
@@ -243,7 +195,7 @@ export function EditorPage(props: Props) {
},
[saveContent]
),
- { throttle: isSwf && swfFeatureToggle.stunnerEnabled ? 400 : 200 }
+ { throttle: 400 }
);
// end (AUTO-SAVE)
@@ -251,177 +203,19 @@ export function EditorPage(props: Props) {
alerts?.closeAll();
}, [alerts]);
- const stateControl = useMemo(() => new StateControl(), [embeddedEditorFile?.getFileContents]);
-
- const channelApiImpl = useMemo(
- () =>
- embeddedEditorFile &&
- new EmbeddedEditorChannelApiImpl(stateControl, embeddedEditorFile, locale, {
- kogitoEditor_ready: () => {
- setReady(true);
- },
- }),
- [embeddedEditorFile, locale, stateControl]
- );
-
- useEffect(() => {
- if (
- workspaceFilePromise.data &&
- (!settingsDispatch.serviceRegistry.catalogStore.virtualServiceRegistry ||
- settingsDispatch.serviceRegistry.catalogStore.currentFile !== workspaceFilePromise.data.workspaceFile)
- ) {
- settingsDispatch.serviceRegistry.catalogStore.setVirtualServiceRegistry(
- virtualServiceRegistry,
- workspaceFilePromise.data.workspaceFile
- );
- }
- }, [settingsDispatch.serviceRegistry.catalogStore, virtualServiceRegistry, workspaceFilePromise.data]);
-
- // SWF-specific code should be isolated when having more capabilities for other editors.
-
- useEffect(() => {
- setServiceRegistryReady(false);
- if (isSwf && isReady) {
- settingsDispatch.serviceRegistry.catalogStore.refresh().then(() => setServiceRegistryReady(true));
- }
- }, [isSwf, isReady, settingsDispatch.serviceRegistry.catalogStore]);
-
- const swfLanguageService = useMemo(() => {
- if (!isSwf || !workspaceFilePromise.data) {
- return;
- }
-
- const webToolsSwfLanguageService = new WebToolsSwfLanguageService(settingsDispatch.serviceRegistry.catalogStore);
-
- return webToolsSwfLanguageService.getLs(workspaceFilePromise.data.workspaceFile.relativePath);
- }, [isSwf, workspaceFilePromise.data, settingsDispatch.serviceRegistry.catalogStore]);
-
- const swfLanguageServiceChannelApiImpl = useMemo(
- () => swfLanguageService && new SwfLanguageServiceChannelApiImpl(swfLanguageService),
- [swfLanguageService]
- );
-
- const dashbuilderLanguageService = useMemo(() => {
- if (!isDash || !workspaceFilePromise.data) {
- return;
- }
- return new DashbuilderLanguageService();
- }, [isDash, workspaceFilePromise.data]);
-
- const dashbuilderLanguageServiceChannelApiImpl = useMemo(
- () => dashbuilderLanguageService && new DashbuilderLanguageServiceChannelApiImpl(dashbuilderLanguageService),
- [dashbuilderLanguageService]
- );
-
- const swfServiceCatalogChannelApiImpl = useMemo(
- () =>
- settingsDispatch.serviceRegistry.catalogStore &&
- new SwfServiceCatalogChannelApiImpl(settingsDispatch.serviceRegistry.catalogStore),
- [settingsDispatch.serviceRegistry.catalogStore]
- );
-
- const swfFeatureToggleChannelApiImpl = useMemo(
- () => new SwfFeatureToggleChannelApiImpl(swfFeatureToggle),
- [swfFeatureToggle]
- );
-
- useEffect(() => {
- if (embeddedEditorFile && !isServerlessWorkflow(embeddedEditorFile.path || "") && !isReady) {
- setReady(true);
- }
- }, [embeddedEditorFile, isReady, settingsDispatch.serviceRegistry.catalogStore, virtualServiceRegistry]);
-
- const apiImpl = useMemo(() => {
- if (!channelApiImpl || (!swfLanguageService && !dashbuilderLanguageService) || !swfServiceCatalogChannelApiImpl) {
- return;
- }
- if (isDash) {
- return new DashbuilderEditorChannelApiImpl(
- channelApiImpl,
- dashbuilderLanguageServiceChannelApiImpl as DashbuilderLanguageServiceChannelApi
- );
- }
- return new SwfCombinedEditorChannelApiImpl(
- channelApiImpl,
- swfFeatureToggleChannelApiImpl,
- swfServiceCatalogChannelApiImpl,
- swfLanguageServiceChannelApiImpl
- );
- }, [
- channelApiImpl,
- swfLanguageService,
- dashbuilderLanguageService,
- swfServiceCatalogChannelApiImpl,
- swfFeatureToggleChannelApiImpl,
- swfLanguageServiceChannelApiImpl,
- dashbuilderLanguageServiceChannelApiImpl,
- ]);
-
useEffect(() => {
- if (!editor?.isReady || lastContent.current === undefined || !workspaceFilePromise.data || !swfLanguageService) {
- return;
- }
-
- swfLanguageService
- .getDiagnostics({
- content: lastContent.current,
- uriPath: workspaceFilePromise.data.workspaceFile.relativePath,
- })
- .then((lsDiagnostics) => {
- const diagnostics = lsDiagnostics.map(
- (lsDiagnostic) =>
- ({
- path: "", // empty to not group them by path, as we're only validating one file.
- severity: lsDiagnostic.severity === DiagnosticSeverity.Error ? "ERROR" : "WARNING",
- message: `${lsDiagnostic.message} [Line ${lsDiagnostic.range.start.line + 1}]`,
- type: "PROBLEM",
- position: {
- startLineNumber: lsDiagnostic.range.start.line + 1,
- startColumn: lsDiagnostic.range.start.character + 1,
- endLineNumber: lsDiagnostic.range.end.line + 1,
- endColumn: lsDiagnostic.range.end.character + 1,
- },
- } as Notification)
- );
-
- editorPageDock?.setNotifications(i18n.terms.validation, "", diagnostics);
- })
- .catch((e) => console.error(e));
- }, [
- workspaceFilePromise.data,
- editor,
- swfLanguageService,
- editorPageDock,
- i18n.terms.validation,
- isServiceRegistryReady,
- ]);
-
- const swfEditorChannelApi = useMemo(
- () =>
- embeddedEditorFile && isServerlessWorkflow(embeddedEditorFile?.fileName)
- ? (editor?.getEnvelopeServer()
- .envelopeApi as unknown as MessageBusClientApi<ServerlessWorkflowCombinedEditorChannelApi>)
- : undefined,
- [editor]
- );
+ editorPageDock?.setNotifications(i18n.terms.validation, "", notifications);
+ }, [editorPageDock, notifications, i18n]);
const onNotificationClick = useCallback(
(notification: Notification) => {
- if (
- !notification.position ||
- !swfEditorChannelApi ||
- !embeddedEditorFile ||
- !isServerlessWorkflow(embeddedEditorFile?.fileName)
- ) {
- return;
+ if (webToolsEditor?.notificationHandler.isSupported) {
+ webToolsEditor.notificationHandler.onClick(notification);
}
-
- swfEditorChannelApi.notifications.kogitoSwfCombinedEditor_moveCursorToPosition.send(
- new Position(notification.position.startLineNumber, notification.position.startColumn)
- );
},
- [swfEditorChannelApi]
+ [webToolsEditor]
);
+
return (
<PromiseStateWrapper
promise={workspaceFilePromise}
@@ -432,7 +226,7 @@ export function EditorPage(props: Props) {
<Page>
<EditorToolbar
workspaceFile={file.workspaceFile}
- editor={editor}
+ editor={webToolsEditor?.editor}
alerts={alerts}
alertsRef={alertsRef}
editorPageDock={editorPageDock}
@@ -440,28 +234,24 @@ export function EditorPage(props: Props) {
<Divider />
<EditorPageDockDrawer
ref={editorPageDockRef}
- isEditorReady={editor?.isReady}
+ isEditorReady={isEditorReady}
workspaceFile={file.workspaceFile}
onNotificationClick={onNotificationClick}
+ isDisabled={!webToolsEditor?.notificationHandler.isSupported}
>
<PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }} aria-label="Editor Section">
<div style={{ height: "100%" }}>
{!isEditorReady && <LoadingSpinner />}
<div style={{ display: isEditorReady ? "inline" : "none" }}>
{embeddedEditorFile && (
- <EmbeddedEditor
- /* FIXME: By providing a different `key` everytime, we avoid calling `setContent` twice on the same Editor.
- * This is by design, and after setContent supports multiple calls on the same instance, we can remove that.
- */
- key={uniqueFileId}
- ref={editorRef}
+ <WebToolsEmbeddedEditor
+ uniqueFileId={uniqueFileId}
+ ref={webToolsEditorRef}
file={embeddedEditorFile}
+ workspaceFile={file.workspaceFile}
editorEnvelopeLocator={editorEnvelopeLocator}
channelType={ChannelType.ONLINE_MULTI_FILE}
locale={locale}
- customChannelApiImpl={apiImpl}
- stateControl={stateControl}
- isReady={isReady}
/>
)}
</div>
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx
index eba53ae2b6..1ea4d179ad 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx
@@ -19,7 +19,6 @@ import { Drawer, DrawerContent, DrawerPanelContent } from "@patternfly/react-cor
import { ToggleGroup } from "@patternfly/react-core/dist/js/components/ToggleGroup";
import * as React from "react";
import { PropsWithChildren, useCallback, useEffect, useImperativeHandle, useMemo, useState } from "react";
-import { isServerlessWorkflow } from "../extension";
import { useAppI18n } from "../i18n";
import { useController } from "@kie-tools-core/react-hooks/dist/useController";
import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
@@ -38,6 +37,7 @@ interface EditorPageDockDrawerProps {
isEditorReady?: boolean;
onNotificationClick?: (notification: Notification) => void;
workspaceFile: WorkspaceFile;
+ isDisabled: boolean;
}
export interface EditorPageDockDrawerRef {
@@ -100,17 +100,12 @@ export const EditorPageDockDrawer = React.forwardRef<
[notificationsPanel, onToggle, setNotifications]
);
- const notificationsPanelIsDisabled = useMemo(
- () => !isServerlessWorkflow(props.workspaceFile.name),
- [props.workspaceFile.name]
- );
-
const notificationsPanelDisabledReason = useMemo(() => {
- if (notificationsPanelIsDisabled) {
+ if (props.isDisabled) {
return "This tab is not supported for this editor";
}
return "";
- }, [notificationsPanelIsDisabled]);
+ }, [props.isDisabled]);
useEffect(() => {
setPanel(PanelId.NONE);
@@ -151,7 +146,7 @@ export const EditorPageDockDrawer = React.forwardRef<
>
<ToggleGroup>
<NotificationsPanelDockToggle
- isDisabled={notificationsPanelIsDisabled}
+ isDisabled={props.isDisabled}
disabledReason={notificationsPanelDisabledReason}
ref={notificationsToggleRef}
isSelected={panel === PanelId.NOTIFICATIONS_PANEL}
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
index 23eca2485c..27d5cdebb4 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
@@ -60,7 +60,7 @@ import * as React from "react";
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { useHistory } from "react-router";
import { Alerts, AlertsController, useAlert } from "../alerts/Alerts";
-import { isDashbuilder, isServerlessWorkflow } from "../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { useAppI18n } from "../i18n";
import {
useNavigationBlockersBypass,
@@ -181,7 +181,7 @@ export function EditorToolbar(props: Props) {
}, [isSaved]);
const canBeDeployed = useMemo(
- () => isServerlessWorkflow(props.workspaceFile.relativePath) || isDashbuilder(props.workspaceFile.relativePath),
+ () => isOfKind("sw", props.workspaceFile.relativePath) || isOfKind("dash", props.workspaceFile.relativePath),
[props.workspaceFile.relativePath]
);
@@ -308,7 +308,7 @@ export function EditorToolbar(props: Props) {
);
const shouldIncludeDownloadSvgDropdownItem = useMemo(() => {
- return isServerlessWorkflow(props.workspaceFile.relativePath);
+ return isOfKind("sw", props.workspaceFile.relativePath);
}, [props.workspaceFile]);
const onDownload = useCallback(() => {
diff --git a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
index 95c7323dca..8f12de447f 100644
--- a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
@@ -34,7 +34,8 @@ import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/co
import { basename } from "path";
import { ImportFromUrlForm } from "../workspace/components/ImportFromUrlForm";
import { useRoutes } from "../navigation/Hooks";
-import { FileTypes, isEditable, SupportedFileExtensions } from "../extension";
+import { isEditable, SupportedFileExtensions } from "../extension";
+import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { decoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
import { extractExtension } from "@kie-tools-core/workspaces-git-fs/dist/relativePath/WorkspaceFileRelativePathParser";
import { UrlType } from "../workspace/hooks/ImportableUrlHooks";
@@ -249,53 +250,6 @@ export function NewFileDropdownMenu(props: {
</b>
</MenuItem>
<Divider />
- <MenuItem
- description={"Try sample models"}
- itemId="samplesItemId"
- direction={"down"}
- drilldownMenu={
- <DrilldownMenu id={"samplesMenu"}>
- <MenuItem direction="up">Back</MenuItem>
- <Divider />
- <MenuItem
- onClick={() => addSample("greetings", FileTypes.SW_JSON)}
- description="Serverless Workflow files are used to define orchestration logic for services."
- >
- <Flex>
- <FlexItem>Greetings</FlexItem>
- <FlexItem>
- <FileLabel extension={FileTypes.SW_JSON} />
- </FlexItem>
- </Flex>
- </MenuItem>
- <MenuItem
- onClick={() => addSample("traffic-violation", FileTypes.YARD_YAML)}
- description="Serverless Decision files are used to define decision logic for services."
- >
- <Flex>
- <FlexItem>Traffic Violation</FlexItem>
- <FlexItem>
- <FileLabel extension={FileTypes.YARD_YAML} />
- </FlexItem>
- </Flex>
- </MenuItem>
- <MenuItem
- onClick={() => addSample("swf-report", FileTypes.DASH_YML)}
- description="Dashboard files are used to define data visualization from data extracted from applications."
- >
- <Flex>
- <FlexItem>Serverless Workflow Report</FlexItem>
- <FlexItem>
- <FileLabel extension={FileTypes.DASH_YML} />
- </FlexItem>
- </Flex>
- </MenuItem>
- </DrilldownMenu>
- }
- >
- Samples
- </MenuItem>
- <Divider />
<MenuItem
itemId={"importFromUrlItemId"}
direction={"down"}
diff --git a/packages/serverless-logic-web-tools/src/editor/WebToolsEmbeddedEditor.tsx b/packages/serverless-logic-web-tools/src/editor/WebToolsEmbeddedEditor.tsx
new file mode 100644
index 0000000000..4e87c0b12e
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/WebToolsEmbeddedEditor.tsx
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 * as React from "react";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { StateControl } from "@kie-tools-core/editor/dist/channel";
+import { useMemo, useState, ForwardRefRenderFunction, useImperativeHandle, forwardRef, useEffect } from "react";
+import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { SwfChannelComponent } from "./channel/SwfChannelComponent";
+import { DashChannelComponent } from "./channel/DashChannelComponent";
+import { useController } from "@kie-tools-core/react-hooks/dist/useController";
+import { When } from "react-if";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
+import { ChannelType, KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
+import {
+ SwfJsonLanguageService,
+ SwfYamlLanguageService,
+} from "@kie-tools/serverless-workflow-language-service/dist/channel";
+import { DashbuilderLanguageService } from "@kie-tools/dashbuilder-language-service/dist/channel";
+import { EmbeddedEditor, EmbeddedEditorChannelApiImpl, EmbeddedEditorRef } from "@kie-tools-core/editor/dist/embedded";
+import { Props } from "@kie-tools-core/editor/dist/embedded/embedded/EmbeddedEditor";
+
+type SupportedLanguageService = SwfYamlLanguageService | SwfJsonLanguageService | DashbuilderLanguageService;
+
+type NotificationHandler =
+ | { isSupported: false }
+ | {
+ isSupported: true;
+ onClick: (notification: Notification) => void;
+ };
+
+export interface EditorChannelComponentRef {
+ isReady: boolean;
+ notificationHandler: NotificationHandler;
+ kogitoEditorChannelApi?: KogitoEditorChannelApi;
+ languageService?: SupportedLanguageService;
+}
+export type EditorChannelComponentProps = {
+ channelApiImpl: EmbeddedEditorChannelApiImpl;
+ editor: EmbeddedEditorRef;
+ workspaceFile: WorkspaceFile;
+};
+
+export type WebToolsEmbeddedEditorRef = Pick<
+ EditorChannelComponentRef,
+ "isReady" | "notificationHandler" | "languageService"
+> & {
+ editor?: EmbeddedEditorRef;
+};
+
+export type WebToolsEmbeddedEditorProps = Props & {
+ uniqueFileId?: string;
+ workspaceFile: WorkspaceFile;
+};
+
+const RefForwardingWebToolsEmbeddedEditor: ForwardRefRenderFunction<
+ WebToolsEmbeddedEditorRef,
+ WebToolsEmbeddedEditorProps
+> = (props, fowardedRef) => {
+ const { file, locale, uniqueFileId, editorEnvelopeLocator, workspaceFile } = { ...props };
+
+ const [isReady, setReady] = useState(false);
+ const [editor, editorRef] = useController<EmbeddedEditorRef>();
+
+ const [swfChannelComponent, swfChannelComponentRef] = useController<EditorChannelComponentRef>();
+ const [dashChannelComponent, dashChannelComponentRef] = useController<EditorChannelComponentRef>();
+ const availableComponents = useMemo(
+ () => [swfChannelComponent, dashChannelComponent],
+ [dashChannelComponent, swfChannelComponent]
+ );
+
+ // Keep getFileContents in the dependency list to update the stateControl instance
+ const stateControl = useMemo(() => new StateControl(), [file?.getFileContents]);
+
+ const channelApiImpl = useMemo(
+ () =>
+ new EmbeddedEditorChannelApiImpl(stateControl, file, locale, {
+ kogitoEditor_ready: () => {
+ setReady(true);
+ },
+ }),
+ [file, locale, stateControl]
+ );
+
+ const channelComponent = useMemo<EditorChannelComponentRef>(() => {
+ const loadedComponent = availableComponents.find((c) => !!c);
+
+ if (!loadedComponent) {
+ return {
+ isReady: true,
+ notificationHandler: {
+ isSupported: false,
+ },
+ };
+ }
+
+ return { ...loadedComponent };
+ }, [availableComponents]);
+
+ useImperativeHandle(
+ fowardedRef,
+ () => {
+ return {
+ editor,
+ ...channelComponent,
+ isReady: isReady && !!channelComponent.isReady,
+ };
+ },
+ [channelComponent, editor, isReady]
+ );
+
+ useEffect(() => {
+ if (!channelComponent.kogitoEditorChannelApi && file && !isReady) {
+ setReady(true);
+ }
+ }, [channelComponent, isReady, file]);
+
+ return (
+ <>
+ <EmbeddedEditor
+ key={uniqueFileId} /* KOGITO-8892 */
+ ref={editorRef}
+ file={file}
+ editorEnvelopeLocator={editorEnvelopeLocator}
+ channelType={ChannelType.ONLINE_MULTI_FILE}
+ locale={locale}
+ customChannelApiImpl={channelComponent.kogitoEditorChannelApi}
+ stateControl={stateControl}
+ isReady={isReady}
+ />
+ {editor && (
+ <>
+ <When condition={isOfKind("sw", workspaceFile.name)}>
+ <SwfChannelComponent
+ ref={swfChannelComponentRef}
+ channelApiImpl={channelApiImpl}
+ editor={editor}
+ workspaceFile={workspaceFile}
+ />
+ </When>
+ <When condition={isOfKind("dash", workspaceFile.name)}>
+ <DashChannelComponent
+ ref={dashChannelComponentRef}
+ channelApiImpl={channelApiImpl}
+ editor={editor}
+ workspaceFile={workspaceFile}
+ />
+ </When>
+ </>
+ )}
+ </>
+ );
+};
+
+export const WebToolsEmbeddedEditor = forwardRef(RefForwardingWebToolsEmbeddedEditor);
diff --git a/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts b/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts
index 84aa86c2d0..0e787319e9 100644
--- a/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts
+++ b/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts
@@ -23,7 +23,7 @@ import { parseApiContent } from "@kie-tools/serverless-workflow-service-catalog/
import { ArtifactType, SearchedArtifact } from "@rhoas/registry-instance-sdk";
import { OpenAPIV3 } from "openapi-types";
import * as yaml from "yaml";
-import { isSpec } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import {
isServiceAccountConfigValid,
ServiceAccountSettingsConfig,
@@ -164,11 +164,11 @@ export class SwfServiceCatalogStore {
};
const isForeignArtifact = (metadata: SearchedArtifact) => {
- return !isSpec(metadata.id) && metadata.groupId !== this.currentFile?.workspaceId;
+ return !isOfKind("spec", metadata.id) && metadata.groupId !== this.currentFile?.workspaceId;
};
const isLocalSpec = (metadata: SearchedArtifact) => {
- return isSpec(metadata.id) && metadata.groupId === this.currentFile?.workspaceId;
+ return isOfKind("spec", metadata.id) && metadata.groupId === this.currentFile?.workspaceId;
};
// The list should:
diff --git a/packages/serverless-logic-web-tools/src/editor/channel/DashChannelComponent.tsx b/packages/serverless-logic-web-tools/src/editor/channel/DashChannelComponent.tsx
new file mode 100644
index 0000000000..2a8358d251
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/channel/DashChannelComponent.tsx
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 * as React from "react";
+import { ForwardRefRenderFunction, useImperativeHandle, forwardRef, useMemo, useCallback } from "react";
+import { EditorChannelComponentProps, EditorChannelComponentRef } from "../WebToolsEmbeddedEditor";
+import { DashbuilderEditorChannelApiImpl } from "@kie-tools/dashbuilder-editor/dist/impl";
+import { DashbuilderLanguageService } from "@kie-tools/dashbuilder-language-service/dist/channel";
+import { DashbuilderLanguageServiceChannelApiImpl } from "../api/DashbuilderLanguageServiceChannelApiImpl";
+import { MessageBusClientApi } from "@kie-tools-core/envelope-bus/dist/api";
+import { DashbuilderEditorChannelApi } from "@kie-tools/dashbuilder-editor";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { Position } from "monaco-editor";
+
+const RefForwardingDashChannelComponent: ForwardRefRenderFunction<
+ EditorChannelComponentRef,
+ EditorChannelComponentProps
+> = (props, fowardedRef) => {
+ const { editor, channelApiImpl } = { ...props };
+ const languageService = useMemo(() => new DashbuilderLanguageService(), []);
+
+ const apiImpl = useMemo(() => {
+ const lsChannelApiImpl = new DashbuilderLanguageServiceChannelApiImpl(languageService);
+ return new DashbuilderEditorChannelApiImpl(channelApiImpl, lsChannelApiImpl);
+ }, [channelApiImpl, languageService]);
+
+ const onNotificationClick = useCallback(
+ (notification: Notification) => {
+ if (!editor || !notification.position) {
+ return;
+ }
+
+ const messageBusClient = editor.getEnvelopeServer()
+ .envelopeApi as unknown as MessageBusClientApi<DashbuilderEditorChannelApi>;
+
+ messageBusClient.notifications.kogitoDashbuilderTextEditor_moveCursorToPosition.send(
+ new Position(notification.position.startLineNumber, notification.position.startColumn)
+ );
+ },
+ [editor]
+ );
+
+ useImperativeHandle(
+ fowardedRef,
+ () => {
+ return {
+ kogitoEditorChannelApi: apiImpl,
+ languageService: languageService,
+ isReady: true,
+ notificationHandler: {
+ isSupported: true,
+ onClick: onNotificationClick,
+ },
+ };
+ },
+ [apiImpl, languageService, onNotificationClick]
+ );
+
+ return <></>;
+};
+
+export const DashChannelComponent = forwardRef(RefForwardingDashChannelComponent);
diff --git a/packages/serverless-logic-web-tools/src/editor/channel/SwfChannelComponent.tsx b/packages/serverless-logic-web-tools/src/editor/channel/SwfChannelComponent.tsx
new file mode 100644
index 0000000000..ac05fc171b
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/channel/SwfChannelComponent.tsx
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 * as React from "react";
+import {
+ ForwardRefRenderFunction,
+ useImperativeHandle,
+ useEffect,
+ forwardRef,
+ useState,
+ useMemo,
+ useCallback,
+} from "react";
+import { useSettingsDispatch } from "../../settings/SettingsContext";
+import {
+ useUpdateVirtualServiceRegistryOnVsrFileEvents,
+ useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents,
+ useUpdateVirtualServiceRegistryOnWorkspaceFileEvents,
+} from "../../virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry";
+import { useVirtualServiceRegistry } from "../../virtualServiceRegistry/VirtualServiceRegistryContext";
+import { SwfLanguageServiceChannelApiImpl } from "../api/SwfLanguageServiceChannelApiImpl";
+import { SwfServiceCatalogChannelApiImpl } from "../api/SwfServiceCatalogChannelApiImpl";
+import { WebToolsSwfLanguageService } from "../api/WebToolsSwfLanguageService";
+import { useSwfFeatureToggle } from "../hooks/useSwfFeatureToggle";
+import { EditorChannelComponentProps, EditorChannelComponentRef } from "../WebToolsEmbeddedEditor";
+import {
+ SwfCombinedEditorChannelApiImpl,
+ SwfFeatureToggleChannelApiImpl,
+} from "@kie-tools/serverless-workflow-combined-editor/dist/impl";
+import { MessageBusClientApi } from "@kie-tools-core/envelope-bus/dist/api";
+import { ServerlessWorkflowCombinedEditorChannelApi } from "@kie-tools/serverless-workflow-combined-editor/dist/api";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { Position } from "monaco-editor";
+import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
+
+const RefForwardingSwfChannelComponent: ForwardRefRenderFunction<
+ EditorChannelComponentRef,
+ EditorChannelComponentProps
+> = (props, fowardedRef) => {
+ const { editor, workspaceFile, channelApiImpl } = { ...props };
+ const [isReady, setReady] = useState(false);
+ const virtualServiceRegistry = useVirtualServiceRegistry();
+ const swfFeatureToggle = useSwfFeatureToggle(editor);
+ const {
+ serviceRegistry: { catalogStore },
+ } = useSettingsDispatch();
+
+ useUpdateVirtualServiceRegistryOnWorkspaceFileEvents({ workspaceFile: workspaceFile });
+ useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents({ catalogStore: catalogStore });
+ useUpdateVirtualServiceRegistryOnVsrFileEvents({
+ workspaceId: workspaceFile.workspaceId,
+ catalogStore: catalogStore,
+ });
+
+ useEffect(() => {
+ if (catalogStore.virtualServiceRegistry || catalogStore.currentFile === workspaceFile) {
+ return;
+ }
+
+ catalogStore.setVirtualServiceRegistry(virtualServiceRegistry, workspaceFile);
+ }, [catalogStore, virtualServiceRegistry, workspaceFile]);
+
+ useCancelableEffect(
+ useCallback(
+ ({ canceled }) => {
+ setReady(false);
+ catalogStore.refresh().then(() => {
+ if (canceled.get()) {
+ return;
+ }
+ setReady(true);
+ });
+ },
+ [catalogStore]
+ )
+ );
+
+ const languageService = useMemo(() => {
+ const webToolsSwfLanguageService = new WebToolsSwfLanguageService(catalogStore);
+ return webToolsSwfLanguageService.getLs(workspaceFile.relativePath);
+ }, [workspaceFile, catalogStore]);
+
+ const apiImpl = useMemo(() => {
+ const lsChannelApiImpl = new SwfLanguageServiceChannelApiImpl(languageService);
+ const serviceCatalogChannelApiImpl = new SwfServiceCatalogChannelApiImpl(catalogStore);
+ const featureToggleChannelApiImpl = new SwfFeatureToggleChannelApiImpl(swfFeatureToggle);
+ return new SwfCombinedEditorChannelApiImpl(
+ channelApiImpl,
+ featureToggleChannelApiImpl,
+ serviceCatalogChannelApiImpl,
+ lsChannelApiImpl
+ );
+ }, [languageService, catalogStore, swfFeatureToggle, channelApiImpl]);
+
+ const onNotificationClick = useCallback(
+ (notification: Notification) => {
+ if (!editor || !notification.position) {
+ return;
+ }
+
+ const messageBusClient = editor.getEnvelopeServer()
+ .envelopeApi as unknown as MessageBusClientApi<ServerlessWorkflowCombinedEditorChannelApi>;
+
+ messageBusClient.notifications.kogitoSwfCombinedEditor_moveCursorToPosition.send(
+ new Position(notification.position.startLineNumber, notification.position.startColumn)
+ );
+ },
+ [editor]
+ );
+
+ useImperativeHandle(
+ fowardedRef,
+ () => {
+ return {
+ kogitoEditorChannelApi: apiImpl,
+ languageService: languageService,
+ isReady,
+ notificationHandler: {
+ isSupported: true,
+ onClick: onNotificationClick,
+ },
+ };
+ },
+ [apiImpl, languageService, isReady, onNotificationClick]
+ );
+
+ return <></>;
+};
+
+export const SwfChannelComponent = forwardRef(RefForwardingSwfChannelComponent);
diff --git a/packages/serverless-logic-web-tools/src/editor/hooks/useEditorNotifications.tsx b/packages/serverless-logic-web-tools/src/editor/hooks/useEditorNotifications.tsx
new file mode 100644
index 0000000000..4b49276e14
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/hooks/useEditorNotifications.tsx
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 { useCallback, useState } from "react";
+import { WebToolsEmbeddedEditorRef } from "../WebToolsEmbeddedEditor";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { DiagnosticSeverity } from "vscode-languageserver-types";
+import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
+
+interface HookArgs {
+ webToolsEditor: WebToolsEmbeddedEditorRef | undefined;
+ content: string | undefined;
+ fileRelativePath: string;
+}
+
+export function useEditorNotifications(args: HookArgs) {
+ const { webToolsEditor, content, fileRelativePath } = { ...args };
+ const [notifications, setNotifications] = useState<Notification[]>([]);
+
+ useCancelableEffect(
+ useCallback(
+ ({ canceled }) => {
+ if (!webToolsEditor?.isReady || !webToolsEditor?.languageService || content === undefined) {
+ return;
+ }
+
+ webToolsEditor.languageService
+ .getDiagnostics({
+ content: content,
+ uriPath: fileRelativePath,
+ })
+ .then((lsDiagnostics) => {
+ if (canceled.get()) {
+ return;
+ }
+ const mappedDiagnostics = lsDiagnostics.map(
+ (lsDiagnostic) =>
+ ({
+ path: "", // empty to not group them by path, as we're only validating one file.
+ severity: lsDiagnostic.severity === DiagnosticSeverity.Error ? "ERROR" : "WARNING",
+ message: `${lsDiagnostic.message} [Line ${lsDiagnostic.range.start.line + 1}]`,
+ type: "PROBLEM",
+ position: {
+ startLineNumber: lsDiagnostic.range.start.line + 1,
+ startColumn: lsDiagnostic.range.start.character + 1,
+ endLineNumber: lsDiagnostic.range.end.line + 1,
+ endColumn: lsDiagnostic.range.end.character + 1,
+ },
+ } as Notification)
+ );
+ setNotifications(mappedDiagnostics);
+ })
+ .catch((e) => console.error(e));
+ },
+ [content, fileRelativePath, webToolsEditor]
+ )
+ );
+
+ return notifications;
+}
diff --git a/packages/serverless-logic-web-tools/src/extension/index.ts b/packages/serverless-logic-web-tools/src/extension/index.ts
index e130abdcf9..463ab3ee4f 100644
--- a/packages/serverless-logic-web-tools/src/extension/index.ts
+++ b/packages/serverless-logic-web-tools/src/extension/index.ts
@@ -17,21 +17,10 @@
import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
import { basename } from "path";
import { PROJECT_FILES } from "../project";
+import { FileTypes, isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
const EDIT_NON_MODEL_ALLOW_LIST = [PROJECT_FILES.applicationProperties];
-const REGEX = {
- supported: /(\.sw\.json|\.sw\.yaml|\.sw\.yml|\.yard\.json|\.yard\.yaml|\.yard\.yml|\.dash\.yml|\.dash\.yaml)$/i,
- sw: /^.*\.sw\.(json|yml|yaml)$/i,
- swJson: /^.*\.sw\.json$/i,
- swYaml: /^.*\.sw\.(yml|yaml)$/i,
- yard: /^.*\.yard\.(json|yml|yaml)$/i,
- dash: /^.*\.dash\.(yml|yaml)$/i,
- json: /^.*\.json$/i,
- yaml: /^.*\.(yml|yaml)$/i,
- spec: /^.*(\.spec|\.specs|spec|specs)\.(json|yml|yaml)$/i,
-};
-
export const GLOB_PATTERN = {
all: "**/*",
allExceptDockerfiles: "**/!(Dockerfile|.dockerignore)",
@@ -42,17 +31,6 @@ export const GLOB_PATTERN = {
sw_spec: "**/+(*.sw|*.spec?(s)|spec?(s)).+(yml|yaml|json)",
};
-export enum FileTypes {
- SW_JSON = "sw.json",
- SW_YML = "sw.yml",
- SW_YAML = "sw.yaml",
- YARD_JSON = "yard.json",
- YARD_YML = "yard.yml",
- YARD_YAML = "yard.yaml",
- DASH_YAML = "dash.yaml",
- DASH_YML = "dash.yml",
-}
-
export const supportedFileExtensionArray = [
FileTypes.SW_JSON,
FileTypes.SW_YML,
@@ -64,28 +42,8 @@ export const supportedFileExtensionArray = [
FileTypes.DASH_YML,
];
-export function isServerlessWorkflow(path: string): boolean {
- return REGEX.sw.test(path);
-}
-
-export function isServerlessWorkflowJson(path: string): boolean {
- return REGEX.swJson.test(path);
-}
-
-export function isServerlessWorkflowYaml(path: string): boolean {
- return REGEX.swYaml.test(path);
-}
-
-export function isServerlessDecision(path: string): boolean {
- return REGEX.yard.test(path);
-}
-
-export function isDashbuilder(path: string): boolean {
- return REGEX.dash.test(path);
-}
-
export function isModel(path: string): boolean {
- return isServerlessWorkflow(path) || isServerlessDecision(path) || isDashbuilder(path);
+ return isOfKind("sw", path) || isOfKind("yard", path) || isOfKind("dash", path);
}
export function isEditable(path: string): boolean {
@@ -93,19 +51,7 @@ export function isEditable(path: string): boolean {
}
export function isSupportedByVirtualServiceRegistry(path: string): boolean {
- return isServerlessWorkflow(path) || isSpec(path);
-}
-
-export function isSpec(path: string): boolean {
- return REGEX.spec.test(path);
-}
-
-export function isJson(path: string): boolean {
- return REGEX.json.test(path);
-}
-
-export function isYaml(path: string): boolean {
- return REGEX.yaml.test(path);
+ return isOfKind("sw", path) || isOfKind("spec", path);
}
export type SupportedFileExtensions = typeof supportedFileExtensionArray[number];
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
new file mode 100644
index 0000000000..31475546ff
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 * as React from "react";
+import { useMemo, useRef, useEffect } from "react";
+import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { useRoutes } from "../../navigation/Hooks";
+import { Link } from "react-router-dom";
+import { Text } from "@patternfly/react-core/dist/js/components/Text";
+import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
+import { FolderIcon, FileIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
+import { Sample, SampleCategory } from "./sampleApi";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+
+const tagMap: Record<SampleCategory, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
+ ["serverless-workflow"]: {
+ label: "Serverless Workflow",
+ icon: FileIcon,
+ color: "orange",
+ },
+ ["serverless-decision"]: {
+ label: "Serverless Decision",
+ icon: FolderIcon,
+ color: "blue",
+ },
+ ["dashbuilder"]: {
+ label: "Dashboard",
+ icon: MonitoringIcon,
+ color: "purple",
+ },
+};
+
+export function SampleCard(props: { sample: Sample }) {
+ const routes = useRoutes();
+ const imgRef = useRef<HTMLImageElement>(null);
+ const tag = useMemo(() => tagMap[props.sample.definition.category], [props.sample.definition.category]);
+
+ useEffect(() => {
+ const blob = new Blob([props.sample.svgContent], { type: "image/svg+xml" });
+ const url = URL.createObjectURL(blob);
+ imgRef.current!.addEventListener("load", () => URL.revokeObjectURL(url), { once: true });
+ imgRef.current!.src = url;
+ }, [props.sample.svgContent]);
+
+ return (
+ <Card isCompact={true} isFullHeight={true}>
+ <Grid style={{ height: "100%" }}>
+ <GridItem
+ lg={6}
+ style={{ overflow: "hidden", textAlign: "center", verticalAlign: "middle", position: "relative" }}
+ >
+ <div style={{ position: "absolute", bottom: "16px", right: 0, left: 0, margin: "auto" }}>
+ <Label color={tag.color}>
+ <tag.icon />
+ <b>{tag.label}</b>
+ </Label>
+ </div>
+ <Bullseye style={{ padding: "0px 8px 30px 8px" }}>
+ <img
+ style={{ height: "370px", maxWidth: "100%" }}
+ ref={imgRef}
+ alt={`SVG for sample ${props.sample.sampleId}`}
+ />
+ </Bullseye>
+ </GridItem>
+ <GridItem lg={6} style={{ display: "flex", flexDirection: "column" }}>
+ <CardTitle data-ouia-component-type="sample-title">{props.sample.definition.title}</CardTitle>
+ <CardBody isFilled={true}>
+ <Tooltip content={<div>{props.sample.definition.description}</div>}>
+ <Text
+ component="p"
+ style={{
+ display: "-webkit-box",
+ WebkitBoxOrient: "vertical",
+ WebkitLineClamp: 5,
+ overflow: "hidden",
+ textOverflow: "ellipsis",
+ whiteSpace: "pre-wrap",
+ }}
+ >
+ {props.sample.definition.description}
+ </Text>
+ </Tooltip>
+ </CardBody>
+ <CardFooter style={{ alignItems: "baseline" }}>
+ <Link
+ to={{
+ pathname: routes.sampleShowcase.path({}),
+ search: routes.sampleShowcase.queryString({ sampleId: props.sample.sampleId }),
+ }}
+ >
+ <Button variant={ButtonVariant.tertiary} ouiaId={props.sample.sampleId + `-try-swf-sample-button`}>
+ Try it out!
+ </Button>
+ </Link>
+ </CardFooter>
+ </GridItem>
+ </Grid>
+ </Card>
+ );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
new file mode 100644
index 0000000000..cc7433efff
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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.
+ */
+
+.sample-card-skeleton--gallery {
+ overflow-x: auto;
+ grid-auto-flow: column;
+ grid-auto-columns: minmax(calc(100% / 3.1 - 16px), 1fr);
+ padding-bottom: 8px;
+ padding-right: var(--pf-c-page__main-section--xl--PaddingRight);
+ height: 430px;
+}
+
+.sample-card-skeleton--grid {
+ height: 100%;
+}
+
+.sample-card-skeleton--grid-item {
+ overflow: hidden;
+ text-align: center;
+ vertical-align: middle;
+ position: relative;
+}
+
+.sample-card-skeleton--label {
+ position: absolute;
+ bottom: 16px;
+ right: 0;
+ left: 0;
+ margin-left: 20px;
+}
+
+.sample-card-skeleton--svg {
+ margin: 20px;
+}
+
+.sample-card-skeleton--grid-content-item {
+ display: flex;
+ flex-direction: column;
+}
+
+.sample-card-skeleton--card-footer-style {
+ align-items: baseline;
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.tsx b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.tsx
new file mode 100644
index 0000000000..97efa00e93
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.tsx
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
+import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import "./SampleCardSkeleton.css";
+
+export function SampleCardSkeleton(props: { numberOfCards: number }) {
+ return (
+ <Gallery
+ hasGutter={true}
+ minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
+ className="sample-card-skeleton--gallery"
+ >
+ {Array(props.numberOfCards)
+ .fill(undefined)
+ .map((_item, index) => (
+ <Card isCompact={true} key={index} isFullHeight={true}>
+ <Grid className="sample-card-skeleton--grid">
+ <GridItem md={6} className="sample-card-skeleton--grid-item">
+ <div className="sample-card-skeleton--label">
+ <Skeleton width="90%" />
+ </div>
+ <Skeleton
+ shape="square"
+ width="90%"
+ height="80%"
+ screenreaderText="Loading svg"
+ className="sample-card-skeleton--svg"
+ />
+ </GridItem>
+ <GridItem md={6} className="sample-card-skeleton--grid-content-item">
+ <CardTitle data-ouia-component-type="sample-title">
+ <Skeleton width="90%" />
+ </CardTitle>
+ <CardBody isFilled={true}>
+ <Skeleton shape="square" width="90%" height="80%" screenreaderText="Loading description" />
+ </CardBody>
+ <CardFooter className="sample-card-skeleton--card-footer-style">
+ <Skeleton width="90%" />
+ </CardFooter>
+ </GridItem>
+ </Grid>
+ </Card>
+ ))}
+ </Gallery>
+ );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SamplesLoadError.tsx b/packages/serverless-logic-web-tools/src/home/sample/SamplesLoadError.tsx
new file mode 100644
index 0000000000..cace4ef168
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SamplesLoadError.tsx
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { EmptyState, EmptyStateBody } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
+import { Text, TextContent } from "@patternfly/react-core/dist/js/components/Text";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import * as React from "react";
+import { useMemo, useState } from "react";
+import { ClipboardCopy, ClipboardCopyVariant } from "@patternfly/react-core/dist/js/components/ClipboardCopy";
+
+export interface Props {
+ errors: string[];
+}
+
+export function SamplesLoadError(props: Props) {
+ const [showDetails, setShowDetails] = useState(false);
+
+ const detailsString = useMemo(() => {
+ return props.errors.join("\n");
+ }, [props.errors]);
+
+ return (
+ <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
+ <EmptyState>
+ <EmptyStateIcon icon={ExclamationTriangleIcon} />
+ <TextContent>
+ <Text component={"h2"}>{"Can't load samples"}</Text>
+ </TextContent>
+ <EmptyStateBody>
+ <PageSection>
+ <TextContent style={{ textOverflow: "ellipsis", overflow: "hidden" }}>
+ {`There was an error loading samples.`}
+ </TextContent>
+ <br />
+ {props.errors && (
+ <>
+ <Button variant={ButtonVariant.link} onClick={() => setShowDetails((prev) => !prev)}>
+ {showDetails ? "Hide details" : "Show details"}
+ </Button>
+
+ {showDetails && (
+ <PageSection variant={"light"} isFilled={true} style={{ height: "100%", minWidth: "1000px" }}>
+ <ClipboardCopy
+ variant={ClipboardCopyVariant.expansion}
+ isReadOnly={true}
+ hoverTip="Copy"
+ clickTip="Copied"
+ >{`${detailsString}`}</ClipboardCopy>
+ </PageSection>
+ )}
+ </>
+ )}
+ </PageSection>
+ </EmptyStateBody>
+ </EmptyState>
+ </PageSection>
+ );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx b/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
new file mode 100644
index 0000000000..e1839b9c36
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 * as React from "react";
+import { useEffect, useState, useCallback, useMemo } from "react";
+import { TextContent, Text } from "@patternfly/react-core/dist/js/components/Text";
+import { SampleCard } from "./SampleCard";
+import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import { Sample, SampleCategory } from "./sampleApi";
+import { SampleCardSkeleton } from "./SampleCardSkeleton";
+import { SamplesLoadError } from "./SamplesLoadError";
+import { useSampleDispatch } from "./hooks/SampleContext";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
+import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import {
+ Dropdown,
+ DropdownItem,
+ DropdownSeparator,
+ DropdownToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import { FileLabel } from "../../workspace/components/FileLabel";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+
+const SAMPLE_PRIORITY: Record<SampleCategory, number> = {
+ ["serverless-workflow"]: 1,
+ ["dashbuilder"]: 2,
+ ["serverless-decision"]: 3,
+};
+
+const LABEL_MAP: Record<SampleCategory, JSX.Element> = {
+ ["serverless-workflow"]: <FileLabel extension="sw.yaml" labelProps={{ isCompact: true }} />,
+ ["dashbuilder"]: <FileLabel extension="dash.yaml" labelProps={{ isCompact: true }} />,
+ ["serverless-decision"]: <FileLabel extension="yard.yaml" labelProps={{ isCompact: true }} />,
+};
+
+const ALL_CATEGORIES_LABEL = "All categories";
+
+const CATEGORY_ARRAY = Object.keys(SAMPLE_PRIORITY) as SampleCategory[];
+
+export function Showcase() {
+ const sampleDispatch = useSampleDispatch();
+ const [loading, setLoading] = useState<boolean>(true);
+ const [samples, setSamples] = useState<Sample[]>([]);
+ const [sampleLoadingError, setSampleLoadingError] = useState("");
+ const [searchFilter, setSearchFilter] = useState("");
+ const [categoryFilter, setCategoryFilter] = useState<SampleCategory | undefined>();
+ const [isCategoryFilterDropdownOpen, setCategoryFilterDropdownOpen] = useState(false);
+
+ const onSearch = useCallback(
+ async (args: { searchValue: string; category?: SampleCategory }) => {
+ if (args.searchValue === searchFilter && args.category === categoryFilter) {
+ return;
+ }
+ setSearchFilter(args.searchValue);
+ setCategoryFilter(args.category);
+ setSamples(await sampleDispatch.getSamples({ searchFilter: args.searchValue, categoryFilter: args.category }));
+ },
+ [categoryFilter, sampleDispatch, searchFilter]
+ );
+
+ useEffect(() => {
+ sampleDispatch
+ .getSamples({})
+ .then((data) => {
+ const sortedSamples = data.sort(
+ (a: Sample, b: Sample) => SAMPLE_PRIORITY[a.definition.category] - SAMPLE_PRIORITY[b.definition.category]
+ );
+ setSamples([...sortedSamples]);
+ })
+ .catch((e) => {
+ setSampleLoadingError(e.toString());
+ })
+ .finally(() => {
+ setLoading(false);
+ });
+ }, [sampleDispatch]);
+
+ const filterResultMessage = useMemo(() => {
+ if (samples.length === 0) {
+ return;
+ }
+ const isPlural = samples.length > 1;
+ return `Showing ${samples.length} sample${isPlural ? "s" : ""}`;
+ }, [samples.length]);
+
+ const selectedCategory = useMemo(() => {
+ if (categoryFilter) {
+ return LABEL_MAP[categoryFilter];
+ }
+ return ALL_CATEGORIES_LABEL;
+ }, [categoryFilter]);
+
+ const categoryFilterDropdownItems = useMemo(
+ () => [
+ <DropdownItem
+ key="category-filter-all-categories"
+ onClick={() => onSearch({ searchValue: searchFilter, category: undefined })}
+ >
+ {ALL_CATEGORIES_LABEL}
+ </DropdownItem>,
+ <DropdownSeparator key="category-filter-separator" />,
+ ...CATEGORY_ARRAY.map((category: SampleCategory) => (
+ <DropdownItem
+ key={`category-filter-${category}`}
+ onClick={() => onSearch({ searchValue: searchFilter, category })}
+ >
+ {LABEL_MAP[category]}
+ </DropdownItem>
+ )),
+ ],
+ [onSearch, searchFilter]
+ );
+
+ return (
+ <>
+ {sampleLoadingError && <SamplesLoadError errors={[sampleLoadingError]} />}
+ {!sampleLoadingError && (
+ <>
+ <TextContent>
+ <Text component="h1">Samples Showcase</Text>
+ </TextContent>
+ <br />
+ <Flex flexWrap={{ default: "wrap" }}>
+ <FlexItem style={{ marginRight: 0 }}>
+ <SearchInput
+ value={""}
+ type={"search"}
+ onChange={(_ev, value) => onSearch({ searchValue: value, category: categoryFilter })}
+ onClear={() => onSearch({ searchValue: "", category: categoryFilter })}
+ onFocus={() => setCategoryFilterDropdownOpen(false)}
+ placeholder={"Find samples"}
+ style={{ width: "400px" }}
+ onClick={(e) => {
+ e.stopPropagation();
+ }}
+ />
+ </FlexItem>
+ <FlexItem>
+ <Dropdown
+ style={{ backgroundColor: "white" }}
+ onSelect={() => setCategoryFilterDropdownOpen(false)}
+ dropdownItems={categoryFilterDropdownItems}
+ toggle={
+ <DropdownToggle
+ id="category-filter-dropdown"
+ onToggle={(isOpen: boolean) => setCategoryFilterDropdownOpen(isOpen)}
+ >
+ {selectedCategory}
+ </DropdownToggle>
+ }
+ isOpen={isCategoryFilterDropdownOpen}
+ />
+ </FlexItem>
+ <FlexItem>
+ {filterResultMessage && (
+ <TextContent>
+ <Text>{filterResultMessage}</Text>
+ </TextContent>
+ )}
+ </FlexItem>
+ </Flex>
+ <br />
+ {loading && <SampleCardSkeleton numberOfCards={4} />}
+ {!loading && samples.length === 0 && (
+ <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
+ <EmptyState style={{ height: "350px" }}>
+ <EmptyStateIcon icon={CubesIcon} />
+ <Title headingLevel="h4" size="lg">
+ {"None of the available samples matched this search"}
+ </Title>
+ </EmptyState>
+ </PageSection>
+ )}
+ {!loading && samples.length > 0 && (
+ <Gallery
+ hasGutter={true}
+ minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
+ style={{
+ overflowX: "auto",
+ gridAutoFlow: "column",
+ gridAutoColumns: "minmax(calc(100%/3.1 - 16px),1fr)",
+ paddingBottom: "8px",
+ paddingRight: "var(--pf-c-page__main-section--xl--PaddingRight)",
+ }}
+ >
+ {samples.map((sample) => (
+ <SampleCard sample={sample} key={`sample-${sample.sampleId}`} />
+ ))}
+ </Gallery>
+ )}
+ </>
+ )}
+ </>
+ );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
new file mode 100644
index 0000000000..f8fdbd7e4c
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 { LfsStorageFile, LfsStorageService } from "@kie-tools-core/workspaces-git-fs/dist/lfs/LfsStorageService";
+import { LfsFsCache } from "@kie-tools-core/workspaces-git-fs/dist/lfs/LfsFsCache";
+import { LocalFile } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/LocalFile";
+import * as React from "react";
+import { useContext, useMemo, useCallback, useState } from "react";
+import { useSettingsDispatch } from "../../../settings/SettingsContext";
+import { fetchSampleDefinitions, fetchSampleFiles, Sample, SampleCategory } from "../sampleApi";
+import { decoder, encoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
+import Fuse from "fuse.js";
+
+const SAMPLE_DEFINITIONS_CACHE_FILE_PATH = "/definitions.json";
+const SAMPLES_FS_MOUNT_POINT = `lfs_v1__samples__${process.env.WEBPACK_REPLACE__version!}`;
+const SEARCH_KEYS = ["definition.category", "definition.title", "definition.description"];
+
+export interface SampleDispatchContextType {
+ getSamples(args: { categoryFilter?: SampleCategory; searchFilter?: string }): Promise<Sample[]>;
+ getSampleFiles(sampleId: string): Promise<LocalFile[]>;
+}
+
+export const SampleDispatchContext = React.createContext<SampleDispatchContextType>({} as any);
+
+export function SampleContextProvider(props: React.PropsWithChildren<{}>) {
+ const settingsDispatch = useSettingsDispatch();
+
+ const fsCache = useMemo(() => new LfsFsCache(), []);
+ const fs = useMemo(() => fsCache.getOrCreateFs(SAMPLES_FS_MOUNT_POINT), [fsCache]);
+ const sampleStorageService = useMemo(() => new LfsStorageService(), []);
+
+ const [allSampleDefinitions, setAllSampleDefinitions] = useState<Sample[]>();
+
+ const loadCache = useCallback(
+ async (args: { path: string; loadFn: () => Promise<any> }) => {
+ const storageFile = await sampleStorageService.getFile(fs, args.path);
+ if (storageFile) {
+ const cacheContent = decoder.decode(await storageFile.getFileContents());
+ return JSON.parse(cacheContent);
+ }
+ const content = await args.loadFn();
+ const cacheFile = new LfsStorageFile({
+ path: args.path,
+ getFileContents: async () => encoder.encode(JSON.stringify(content)),
+ });
+ await sampleStorageService.createFiles(fs, [cacheFile]);
+ return content;
+ },
+ [fs, sampleStorageService]
+ );
+
+ const getSamples = useCallback(
+ async (args: { categoryFilter?: SampleCategory; searchFilter?: string }) => {
+ let filteredSamples: Sample[];
+ if (!allSampleDefinitions) {
+ filteredSamples = (await loadCache({
+ path: SAMPLE_DEFINITIONS_CACHE_FILE_PATH,
+ loadFn: async () => fetchSampleDefinitions(settingsDispatch.github.octokit),
+ })) as Sample[];
+
+ setAllSampleDefinitions(filteredSamples);
+ } else {
+ filteredSamples = allSampleDefinitions;
+ }
+
+ if (args.categoryFilter) {
+ filteredSamples = filteredSamples.filter((s) => s.definition.category === args.categoryFilter);
+ }
+
+ if (args.searchFilter && args.searchFilter.trim().length > 0) {
+ const fuse = new Fuse(filteredSamples, {
+ keys: SEARCH_KEYS,
+ shouldSort: false,
+ threshold: 0.3,
+ });
+
+ filteredSamples = fuse.search(args.searchFilter).map((r) => r.item);
+ }
+
+ return filteredSamples;
+ },
+ [allSampleDefinitions, loadCache, settingsDispatch.github.octokit]
+ );
+
+ const getSampleFiles = useCallback(
+ async (sampleId: string) => fetchSampleFiles({ octokit: settingsDispatch.github.octokit, sampleId }),
+ [settingsDispatch.github.octokit]
+ );
+
+ const dispatch = useMemo(() => ({ getSamples, getSampleFiles }), [getSamples, getSampleFiles]);
+ return <SampleDispatchContext.Provider value={dispatch}>{props.children}</SampleDispatchContext.Provider>;
+}
+
+export function useSampleDispatch() {
+ return useContext(SampleDispatchContext);
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
new file mode 100644
index 0000000000..e4054706dc
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 { LocalFile } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/LocalFile";
+import { Octokit } from "@octokit/rest";
+import { extname, join } from "path";
+import { decoder, encoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
+
+interface FileData {
+ content: string;
+ encoding: BufferEncoding;
+}
+
+interface SampleDefinitionFile {
+ sampleId: string;
+ definitionPath: string;
+}
+
+interface GitHubRepoInfo {
+ owner: string;
+ repo: string;
+ ref: string;
+}
+
+type GitHubFileInfo = GitHubRepoInfo & { path: string };
+
+export type SampleCategory = "serverless-workflow" | "serverless-decision" | "dashbuilder";
+
+const SAMPLE_DEFINITION_FILE = "definition.json";
+
+const SAMPLE_TEMPLATE_FOLDER = "template";
+
+const SVG_EXTENSION = ".svg";
+
+const SAMPLE_FOLDER = "samples";
+
+type SampleStatus = "ok" | "out of date" | "deprecated";
+
+interface SampleDefinition {
+ category: SampleCategory;
+ status: SampleStatus;
+ title: string;
+ description: string;
+ cover: string;
+ tags: string[];
+}
+
+interface ContentData {
+ type: string;
+ download_url: string;
+ git_url: string;
+ html_url: string;
+ name: string;
+ path: string;
+ sha: string;
+ size: number;
+ url: string;
+}
+
+export type Sample = {
+ sampleId: string;
+ definition: SampleDefinition;
+ svgContent: string;
+};
+
+export const KIE_SAMPLES_REPO: GitHubFileInfo = {
+ owner: "kiegroup",
+ repo: "kie-samples",
+ ref: process.env["WEBPACK_REPLACE__samplesRepositoryRef"]!,
+ path: "samples",
+};
+
+async function fetchFileContent(args: { octokit: Octokit; fileInfo: GitHubFileInfo }): Promise<string | undefined> {
+ try {
+ const content = await args.octokit.repos.getContent({ ...args.fileInfo });
+ if (content) {
+ const fileData = content.data as FileData;
+ return decoder.decode(new Uint8Array(Buffer.from(fileData.content, fileData.encoding)));
+ }
+ } catch (e) {
+ console.debug(`Error fetching ${args.fileInfo.path} with Octokit. Fallback is 'raw.githubusercontent.com'.`);
+ const rawFileResponse = await fetch(
+ `https://raw.githubusercontent.com/${args.fileInfo.owner}/${args.fileInfo.repo}/${args.fileInfo.ref}/${args.fileInfo.path}`
+ );
+ if (rawFileResponse.ok) {
+ return await rawFileResponse.text();
+ }
+ }
+}
+
+async function fetchFolderFiles(args: {
+ octokit: Octokit;
+ fileInfo: GitHubFileInfo;
+}): Promise<ContentData[] | undefined> {
+ try {
+ const folderContent = await args.octokit.repos.getContent({
+ ...args.fileInfo,
+ });
+
+ if (!folderContent || !folderContent.data) {
+ return;
+ }
+
+ return folderContent.data as ContentData[];
+ } catch (e) {
+ console.debug(`Error fetching ${args.fileInfo.path} with Octokit.`);
+ }
+}
+
+async function listSampleDefinitionFiles(args: {
+ octokit: Octokit;
+ repoInfo: GitHubRepoInfo;
+}): Promise<SampleDefinitionFile[]> {
+ const samplesFolders = await fetchFolderFiles({
+ octokit: args.octokit,
+ fileInfo: {
+ ...args.repoInfo,
+ path: SAMPLE_FOLDER,
+ },
+ });
+
+ if (!samplesFolders) {
+ throw new Error(
+ `Cannot fetch samples folder at https://github.com/${KIE_SAMPLES_REPO.owner}/${KIE_SAMPLES_REPO.repo}`
+ );
+ }
+
+ return samplesFolders
+ .filter((folder) => folder.name !== SAMPLE_TEMPLATE_FOLDER)
+ .map((folder) => ({ sampleId: folder.name, definitionPath: join(folder.path, SAMPLE_DEFINITION_FILE) }));
+}
+
+export async function fetchSampleDefinitions(octokit: Octokit): Promise<Sample[]> {
+ const sampleDefinitionFiles = await listSampleDefinitionFiles({
+ octokit,
+ repoInfo: { ...KIE_SAMPLES_REPO },
+ });
+
+ const samples = (
+ await Promise.all(
+ sampleDefinitionFiles.map(async (definitionFile) => {
+ const fileContent = await fetchFileContent({
+ octokit,
+ fileInfo: {
+ ...KIE_SAMPLES_REPO,
+ path: definitionFile.definitionPath,
+ },
+ });
+
+ if (!fileContent) {
+ console.error(`Could not read sample definition for ${definitionFile.sampleId}`);
+ return null;
+ }
+
+ const definition = JSON.parse(fileContent) as SampleDefinition;
+ const svgContent = await fetchFileContent({
+ octokit,
+ fileInfo: {
+ ...KIE_SAMPLES_REPO,
+ path: join("samples", definitionFile.sampleId, definition.cover),
+ },
+ });
+
+ if (!svgContent) {
+ console.error(`Could not read sample svg for ${definitionFile.sampleId}`);
+ return null;
+ }
+
+ return {
+ sampleId: definitionFile.sampleId,
+ definition,
+ svgContent,
+ };
+ })
+ )
+ ).filter((sample) => sample !== null) as Sample[];
+
+ if (samples.length === 0) {
+ throw new Error("No samples could be loaded.");
+ }
+
+ return samples;
+}
+
+export async function fetchSampleFiles(args: { octokit: Octokit; sampleId: string }): Promise<LocalFile[]> {
+ const sampleFolderFiles = await fetchFolderFiles({
+ octokit: args.octokit,
+ fileInfo: {
+ ...KIE_SAMPLES_REPO,
+ path: decodeURIComponent(`${KIE_SAMPLES_REPO.path}/${args.sampleId}`),
+ },
+ });
+
+ if (!sampleFolderFiles) {
+ throw new Error(`Sample ${args.sampleId} not found`);
+ }
+
+ const sampleFiles = sampleFolderFiles
+ .filter((file) => file.name !== SAMPLE_DEFINITION_FILE && extname(file.name) !== SVG_EXTENSION)
+ .map(async (file) => {
+ const fileContent = await fetchFileContent({
+ octokit: args.octokit,
+ fileInfo: {
+ ...KIE_SAMPLES_REPO,
+ path: file.path,
+ },
+ });
+
+ if (!fileContent) {
+ throw new Error(`Could not get file contents for ${file.path}`);
+ }
+
+ return {
+ path: decodeURIComponent(file.path).split(`${SAMPLE_FOLDER}/${args.sampleId}`)[1],
+ fileContents: encoder.encode(fileContent),
+ };
+ });
+ return Promise.all(sampleFiles);
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
index e286bc94c0..b49ecb1f3a 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -15,7 +15,7 @@
*/
import * as React from "react";
-import { FileTypes } from "../../extension";
+import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 5885cc544d..896194c6cc 100644
--- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -19,13 +19,14 @@ import { Switch } from "react-router";
import { Overview } from "../overView/Overview";
import { RecentModels } from "../recentModels/RecentModels";
import { Route } from "react-router-dom";
-import { SampleCatalog } from "../sampleCatalog/SampleCatalog";
import { useRoutes } from "../../navigation/Hooks";
import { supportedFileExtensionArray } from "../../extension";
-import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWorkspaceWithEmptyFilePage";
+import { NewWorkspaceFromSample } from "../../workspace/components/NewWorkspaceFromSample";
import { NewWorkspaceFromUrlPage } from "../../workspace/components/NewWorkspaceFromUrlPage";
+import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWorkspaceWithEmptyFilePage";
import { EditorPage } from "../../editor/EditorPage";
import { NoMatchPage } from "../../navigation/NoMatchPage";
+import { Showcase } from "../../home/sample/Showcase";
export function HomePageRoutes(props: { isNavOpen: boolean }) {
const routes = useRoutes();
@@ -38,6 +39,9 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
<Route path={routes.importModel.path({})}>
<NewWorkspaceFromUrlPage />
</Route>
+ <Route path={routes.sampleShowcase.path({})}>
+ <NewWorkspaceFromSample />
+ </Route>
<Route
path={routes.workspaceWithFilePath.path({
workspaceId: ":workspaceId",
@@ -61,7 +65,7 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
<RecentModels />
</Route>
<Route path={routes.sampleCatalog.path({})}>
- <SampleCatalog />
+ <Showcase />
</Route>
<Route component={NoMatchPage} />
</Switch>
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
deleted file mode 100644
index 689412102c..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed 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 * as React from "react";
-import { useMemo } from "react";
-import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
-import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { useRoutes } from "../../navigation/Hooks";
-import { Link } from "react-router-dom";
-import { Text } from "@patternfly/react-core/dist/js/components/Text";
-import { Label } from "@patternfly/react-core/dist/js/components/Label";
-import { FileTypes } from "../../extension";
-import { Sample, tagMap } from "./Types";
-
-export function SampleCard({ sample }: { sample: Sample }) {
- const routes = useRoutes();
-
- const tag = useMemo(() => tagMap[sample.type], [sample.type]);
-
- return (
- <Card isCompact={true} isFullHeight={true}>
- <Grid style={{ height: "100%" }}>
- <GridItem
- md={6}
- style={{ overflow: "hidden", textAlign: "center", verticalAlign: "middle", position: "relative" }}
- >
- <div style={{ position: "absolute", bottom: "16px", right: 0, left: 0, margin: "auto" }}>
- <Label color={tag.color}>
- <tag.icon />
- <b>{tag.label}</b>
- </Label>
- </div>
- <sample.svg style={{ height: "100%", maxWidth: "100%", maxHeight: "400px" }} />
- </GridItem>
- <GridItem md={6} style={{ display: "flex", flexDirection: "column" }}>
- <CardTitle data-ouia-component-type="sample-title">{sample.name}</CardTitle>
- <CardBody isFilled={true}>
- <Text component="p">{sample.description}</Text>
- </CardBody>
- <CardFooter style={{ alignItems: "baseline" }}>
- <Link
- to={{
- pathname: routes.importModel.path({}),
- search: routes.importModel.queryString({
- url:
- sample.repoUrl ??
- `${window.location.origin}${window.location.pathname}${routes.static.sample.path({
- type: sample.type || FileTypes.SW_JSON,
- name: sample.fileName,
- })}`,
- renameWorkspace: sample.name,
- ...(sample.repoUrl ? { removeRemote: "true" } : {}),
- }),
- }}
- >
- <Button variant={ButtonVariant.tertiary} ouiaId={sample.fileName + `-try-swf-sample-button`}>
- Try it out!
- </Button>
- </Link>
- </CardFooter>
- </GridItem>
- </Grid>
- </Card>
- );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
deleted file mode 100644
index b26bc2c997..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed 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 * as React from "react";
-import { TextContent, Text } from "@patternfly/react-core/dist/js/components/Text";
-import { Sample, SampleType } from "./Types";
-import { ReactComponent as GreetingsSvg } from "../../../static/samples/greetings/greetings.svg";
-import { ReactComponent as GreetingsKafkaSvg } from "../../../static/samples/greetings-kafka/greetings-kafka.svg";
-import { ReactComponent as ProductsDashboardSvg } from "../../../static/samples/products-dashboard/products-dashboard.svg";
-import { ReactComponent as SwfReportSvg } from "../../../static/samples/swf-report/swf-report.svg";
-import { ReactComponent as KitchensinkSvg } from "../../../static/samples/kitchensink/kitchensink.svg";
-import { ReactComponent as CompensationSvg } from "../../../static/samples/compensation/compensation.svg";
-import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
-import { SampleCard } from "./SampleCard";
-
-const samples: Array<Sample> = [
- {
- name: "Greetings",
- fileName: "greetings",
- svg: GreetingsSvg,
- description: `This example shows a single Operation State with one action that calls the "greeting" function. The workflow data input is assumed to be the name of the person to greet. The results of the action is assumed to be the greeting for the provided persons name, which is added to the states data and becomes the workflow data output.`,
- type: SampleType.SW_JSON,
- },
- {
- name: "Greetings with Kafka events",
- fileName: "greetings-kafka",
- svg: GreetingsKafkaSvg,
- description: `This example is similar to the Greetings sample, but this time the "greeting" function is triggered via an Apache Kafka event. The event payload is assumed to be the name of the person to greet and in which language. The results of the action is assumed to be the greeting for the provided persons name, which is added to the states data and becomes the workflow data output.`,
- type: SampleType.SW_JSON,
- },
- {
- name: "Compensation",
- fileName: "compensation",
- svg: CompensationSvg,
- description: `This example contains a simple workflow service that illustrate compensation handling. This is simple workflow that expects a boolean shouldCompensate to indicate if compensation segment (which is composed by two inject states) should be executed or not. The process result is a boolean field compensated which value should match shouldCompensate.`,
- type: SampleType.SW_JSON,
- },
- {
- name: "Dashbuilder Kitchensink",
- fileName: "kitchensink",
- svg: KitchensinkSvg,
- description: `Explore all Dashbuilder components. Navigate in tabs to learn about Dashbuilder concepts and check how to use and the look of all visual components available for use in Dashbuilder.`,
- type: SampleType.DASH_YML,
- },
- {
- name: "Products Dashboard",
- fileName: "products-dashboard",
- svg: ProductsDashboardSvg,
- description:
- 'In this example we show a dashboard from a "products" dataset. It displays the dataset information in a bar chart grouping products by counting them. At the end we have a table listing all products.',
- type: SampleType.DASH_YML,
- },
- {
- name: "Serverless Workflow Report",
- fileName: "swf-report",
- svg: SwfReportSvg,
- description:
- "This example is for Serverless Workflow Data Index. It connects to data index to retrieve information about running and completed workflows. The top row shows a general overview of workflow states, the middle row contains charts to compare workflows execution. This information can be filtered using the small combo box on right side. Finally a table shows all the workflows details.",
- type: SampleType.DASH_YML,
- },
-];
-
-export function SampleCatalog() {
- return (
- <>
- <TextContent>
- <Text component="h1">Samples Showcase</Text>
- </TextContent>
- <br />
- <Gallery
- hasGutter={true}
- minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
- style={{
- overflowX: "auto",
- gridAutoFlow: "column",
- gridAutoColumns: "minmax(calc(100%/3.1 - 16px),1fr)",
- paddingBottom: "8px",
- paddingRight: "var(--pf-c-page__main-section--xl--PaddingRight)",
- }}
- >
- {samples.map((sample) => (
- <SampleCard sample={sample} key={sample.fileName} />
- ))}
- </Gallery>
- </>
- );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts
deleted file mode 100644
index 037ec8e5e3..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed 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 * as React from "react";
-import { LabelProps } from "@patternfly/react-core/dist/js/components/Label";
-import { labelColors } from "../../workspace/components/FileLabel";
-import { FileIcon, FolderIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
-
-export enum SampleType {
- SW_YML = "sw.yml",
- SW_YAML = "sw.yaml",
- SW_JSON = "sw.json",
- SW_PROJECT = "sw.project",
- DASH_YML = "dash.yml",
-}
-
-export type Sample = {
- name: string;
- fileName: string;
- svg: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
- description: string;
- repoUrl?: string;
- type: SampleType;
-};
-
-export const tagMap: Record<SampleType, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
- [SampleType.SW_YML]: {
- label: labelColors[SampleType.SW_YML].label,
- icon: FileIcon,
- color: labelColors[SampleType.SW_YML].color,
- },
- [SampleType.SW_YAML]: {
- label: labelColors[SampleType.SW_YAML].label,
- icon: FileIcon,
- color: labelColors[SampleType.SW_YAML].color,
- },
- [SampleType.SW_JSON]: {
- label: labelColors[SampleType.SW_JSON].label,
- icon: FileIcon,
- color: labelColors[SampleType.SW_JSON].color,
- },
- [SampleType.SW_PROJECT]: {
- label: "Serverless Project",
- icon: FolderIcon,
- color: "orange",
- },
- [SampleType.DASH_YML]: {
- label: labelColors[SampleType.DASH_YML].label,
- icon: MonitoringIcon,
- color: labelColors[SampleType.DASH_YML].color,
- },
-};
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index b821ee0a80..0d2f7000b2 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -24,6 +24,7 @@ export enum QueryParams {
EXPAND = "expand",
REMOVE_REMOTE = "removeRemote",
RENAME_WORKSPACE = "renameWorkspace",
+ SAMPLE_ID = "sampleId",
}
export enum PathParams {
@@ -122,6 +123,8 @@ export const routes = {
queryParams: QueryParams.URL | QueryParams.BRANCH | QueryParams.REMOVE_REMOTE | QueryParams.RENAME_WORKSPACE;
}>(() => `/import`),
+ sampleShowcase: new Route<{ queryParams: QueryParams.SAMPLE_ID }>(() => `/sample`),
+
workspaceWithFilePath: new Route<{
pathParams: PathParams.WORKSPACE_ID | PathParams.FILE_RELATIVE_PATH | PathParams.EXTENSION;
}>(
diff --git a/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts b/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts
index 52a20b5ab8..33eec2b67b 100644
--- a/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts
+++ b/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts
@@ -14,7 +14,8 @@
* limitations under the License.
*/
-import { GLOB_PATTERN, isDashbuilder } from "../../../extension";
+import { GLOB_PATTERN } from "../../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { OpenShiftPipeline } from "../../OpenShiftPipeline";
import { KnativeBuilderPipeline } from "../../pipelines/KnativeBuilderPipeline";
import { DashbuilderViewer } from "../BaseContainerImages";
@@ -32,7 +33,7 @@ export class DashboardWorkspaceDeployment extends DeploymentStrategy {
const dockerIgnoreFile = await this.createDockerignoreFile();
const otherDashFiles = filesToBeDeployed.filter(
- (f) => isDashbuilder(f.name) && f.relativePath !== this.args.targetFile.relativePath
+ (f) => isOfKind("dash", f.name) && f.relativePath !== this.args.targetFile.relativePath
);
const appDataFile = createDashbuilderViewerAppDataFile({
diff --git a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx
index b453b270c7..7e72d6eaff 100644
--- a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx
+++ b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx
@@ -155,7 +155,7 @@ export function useUpdateVirtualServiceRegistryOnWorkspaceFileEvents(args: {
);
}
-export function useUpdateVirtualServiceRegistryOnVsrFileEvent(args: {
+export function useUpdateVirtualServiceRegistryOnVsrFileEvents(args: {
workspaceId: string;
catalogStore: SwfServiceCatalogStore;
}) {
@@ -188,7 +188,7 @@ export function useUpdateVirtualServiceRegistryOnVsrFileEvent(args: {
);
}
-export function useUpdateVirtualServiceRegistryOnVsrWorkspaceEvent(args: { catalogStore: SwfServiceCatalogStore }) {
+export function useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents(args: { catalogStore: SwfServiceCatalogStore }) {
useCancelableEffect(
useCallback(
({ canceled }) => {
diff --git a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx
index 2e67266a23..765d0467d7 100644
--- a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx
+++ b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
import { useState, useEffect, useMemo } from "react";
-import { isServerlessWorkflow } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { getVirtualServiceRegistryDependencies } from "../models/VirtualServiceRegistryFunction";
import { useVirtualServiceRegistry } from "../VirtualServiceRegistryContext";
@@ -34,7 +34,7 @@ export function useVirtualServiceRegistryDependencies(props: { workspace: Active
const dependencies: Array<string> = (
await Promise.all(
props.workspace.files
- .map((file) => isServerlessWorkflow(file.relativePath) && getVirtualServiceRegistryDependencies(file))
+ .map((file) => isOfKind("sw", file.relativePath) && getVirtualServiceRegistryDependencies(file))
.filter((value): value is Promise<Array<string>> => Boolean(value))
)
).flat();
diff --git a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts
index 99709b41d6..98b1d9f76a 100644
--- a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts
+++ b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { isJson, isSpec } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
import { generateOpenApiSpec } from "./BaseOpenApiSpec";
import * as yaml from "yaml";
@@ -39,12 +39,12 @@ export class VirtualServiceRegistryFunction {
return;
}
- if (isSpec(this.relativePath)) {
+ if (isOfKind("spec", this.relativePath)) {
return content;
}
try {
- const parsedContent = isJson(this.file.relativePath) ? JSON.parse(content) : yaml.parse(content);
+ const parsedContent = isOfKind("json", this.file.relativePath) ? JSON.parse(content) : yaml.parse(content);
if (parsedContent.id) {
return generateOpenApiSpec(parsedContent.id);
} else {
@@ -64,7 +64,7 @@ export async function getVirtualServiceRegistryDependencies(file: WorkspaceFile)
let parsedContent: Record<string, unknown>;
try {
- parsedContent = isJson(file.relativePath) ? JSON.parse(content) : yaml.parse(content);
+ parsedContent = isOfKind("json", file.relativePath) ? JSON.parse(content) : yaml.parse(content);
} catch (e) {
// Invalid file.
return [];
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx b/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx
index 2a1fc12768..544bb6dbc8 100644
--- a/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx
@@ -16,7 +16,7 @@
import * as React from "react";
import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
-import { FileTypes } from "../../extension";
+import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
type LabelColorType = { color: LabelProps["color"]; label: string };
@@ -24,7 +24,7 @@ const swfLabel: LabelColorType = { color: "green", label: "Serverless Workflow"
const sdLabel: LabelColorType = { color: "blue", label: "Serverless Decision" };
const dashboardLabel: LabelColorType = { color: "purple", label: "Dashboard" };
-export const labelColors: Record<FileTypes, LabelColorType> = {
+export const labelColors: Record<string, LabelColorType> = {
[FileTypes.SW_JSON]: swfLabel,
[FileTypes.SW_YML]: swfLabel,
[FileTypes.SW_YAML]: swfLabel,
@@ -35,14 +35,19 @@ export const labelColors: Record<FileTypes, LabelColorType> = {
[FileTypes.DASH_YML]: dashboardLabel,
};
-export function FileLabel(props: { style?: LabelProps["style"]; extension: string }) {
+export function FileLabel(props: { style?: LabelProps["style"]; extension: string; labelProps?: LabelProps }) {
const parsedExtension = props.extension.toLowerCase();
- const labelColor = labelColors[parsedExtension as FileTypes];
+ const labelColor = labelColors[parsedExtension as string];
return (
<>
{props.extension && (
- <Label style={props.style ?? {}} color={labelColor?.color ?? "grey"} data-ouia-component-id="file-type-label">
+ <Label
+ {...props.labelProps}
+ style={props.style ?? {}}
+ color={labelColor?.color ?? "grey"}
+ data-ouia-component-id="file-type-label"
+ >
{labelColor?.label ?? props.extension.toUpperCase()}
</Label>
)}
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
new file mode 100644
index 0000000000..500a06bd09
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed 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 * as React from "react";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { useRoutes } from "../../navigation/Hooks";
+import { useHistory } from "react-router";
+import { useEffect, useState } from "react";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { QueryParams } from "../../navigation/Routes";
+import { useQueryParam } from "../../queryParams/QueryParamsContext";
+import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { EditorPageErrorPage } from "../../editor/EditorPageErrorPage";
+import { KIE_SAMPLES_REPO } from "../../home/sample/sampleApi";
+import { useSampleDispatch } from "../../home/sample/hooks/SampleContext";
+
+export function NewWorkspaceFromSample() {
+ const sampleDispatch = useSampleDispatch();
+ const workspaces = useWorkspaces();
+ const routes = useRoutes();
+ const history = useHistory();
+ const [openingError, setOpeningError] = useState("");
+
+ const sampleId = useQueryParam(QueryParams.SAMPLE_ID) ?? "";
+
+ useEffect(() => {
+ sampleDispatch
+ .getSampleFiles(sampleId)
+ .then((sampleFiles) => workspaces.createWorkspaceFromLocal({ localFiles: sampleFiles }))
+ .then(({ workspace, suggestedFirstFile }) => {
+ if (!suggestedFirstFile) {
+ return;
+ }
+ history.replace({
+ pathname: routes.workspaceWithFilePath.path({
+ workspaceId: workspace.workspaceId,
+ fileRelativePath: suggestedFirstFile.relativePathWithoutExtension,
+ extension: suggestedFirstFile.extension,
+ }),
+ });
+ })
+ .catch((e) => {
+ setOpeningError(e.toString());
+ });
+ }, [history, routes.workspaceWithFilePath, sampleId, workspaces, sampleDispatch]);
+
+ return (
+ <>
+ {openingError && <EditorPageErrorPage path={`${KIE_SAMPLES_REPO.path}/${sampleId}`} errors={[openingError]} />}
+ {!openingError && (
+ <PageSection variant={"light"} isFilled={true} padding={{ default: "noPadding" }}>
+ <Bullseye>
+ <TextContent>
+ <Bullseye>
+ <Spinner />
+ </Bullseye>
+ <br />
+ <Text component={TextVariants.p}>{`Loading sample...`}</Text>
+ </TextContent>
+ </Bullseye>
+ </PageSection>
+ )}
+ </>
+ );
+}
diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css
index d542f433ac..9d002919ea 100644
--- a/packages/serverless-logic-web-tools/static/resources/style.css
+++ b/packages/serverless-logic-web-tools/static/resources/style.css
@@ -659,7 +659,6 @@ section.kie-tools--settings-tab {
.pf-c-menu__item-description {
word-break: normal !important;
}
-
.chr-c-app-title {
color: #fff;
padding: var(--pf-global--spacer--md) var(--pf-global--spacer--sm) var(--pf-global--spacer--md)
diff --git a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.svg b/packages/serverless-logic-web-tools/static/samples/compensation/compensation.svg
deleted file mode 100644
index 90943659d9..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1022" height="813" viewBox="0 0 1022 813"><defs/><g transform="matrix(1,0,0,1,0,0)"><g><g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 1200 0" stroke-miterlimit="10" stroke-opacity="0.8" stroke-dasharray="5"/></g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 0 800" stroke-miterlimit="10" stroke-opacity="0.8" s [...]
\ No newline at end of file
diff --git a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.sw.json b/packages/serverless-logic-web-tools/static/samples/compensation/compensation.sw.json
deleted file mode 100644
index 45a1028d64..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.sw.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "id": "compensation",
- "version": "1.0",
- "specVersion": "0.8",
- "name": "Workflow Error example",
- "description": "An example of how compensation works",
- "start": "printStatus",
- "states": [
- {
- "name": "printStatus",
- "type": "inject",
- "data": {
- "compensated": false
- },
- "compensatedBy": "compensating",
- "transition": "branch"
- },
- {
- "name": "branch",
- "type": "switch",
- "dataConditions": [
- {
- "condition": ".shouldCompensate==true",
- "transition": {
- "nextState": "finish_compensate",
- "compensate": true
- }
- },
- {
- "condition": ".shouldCompensate==false",
- "transition": {
- "nextState": "finish_not_compensate",
- "compensate": false
- }
- }
- ],
- "defaultCondition": {
- "transition": "finish_not_compensate"
- }
- },
- {
- "name": "compensating",
- "usedForCompensation": true,
- "type": "inject",
- "data": {
- "compensated": true
- },
- "transition": "compensating_more"
- },
- {
- "name": "compensating_more",
- "usedForCompensation": true,
- "type": "inject",
- "data": {
- "compensating_more": "Real Betis Balompie"
- }
- },
- {
- "name": "finish_compensate",
- "type": "operation",
- "actions": [],
- "end": {
- "terminate": true
- }
- },
- {
- "name": "finish_not_compensate",
- "type": "operation",
- "actions": [],
- "end": {
- "terminate": true
- }
- }
- ]
-}
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.svg b/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.svg
deleted file mode 100644
index a64c18154f..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1022" height="1010" viewBox="0 0 1022 1010"><defs/><g transform="matrix(1,0,0,1,0,0)"><g><g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 1200 0" stroke-miterlimit="10" stroke-opacity="0.8" stroke-dasharray="5"/></g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 0 800" stroke-miterlimit="10" stroke-opacity="0.8" [...]
\ No newline at end of file
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.sw.json b/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.sw.json
deleted file mode 100644
index c50238f31e..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.sw.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "id": "jsongreet",
- "version": "1.0",
- "specVersion": "0.8",
- "name": "Greeting workflow",
- "expressionLang": "jsonpath",
- "description": "JSON based greeting workflow",
- "start": "HandleNewGreet",
- "functions": [
- {
- "name": "printMessage",
- "type": "custom",
- "operation": "sysout"
- }
- ],
- "events": [
- {
- "name": "NewGreetEvent",
- "source": "greetEvent",
- "type": "dev.knative.kafka.event"
- }
- ],
- "states": [
- {
- "name": "HandleNewGreet",
- "type": "event",
- "onEvents": [
- {
- "eventRefs": ["NewGreetEvent"],
- "actions": []
- }
- ],
- "transition": "ChooseOnLanguage"
- },
- {
- "name": "ChooseOnLanguage",
- "type": "switch",
- "dataConditions": [
- {
- "condition": "{{ $.[?(@.language == 'English')] }}",
- "transition": "GreetInEnglish"
- },
- {
- "condition": "{{ $.[?(@.language == 'Spanish')] }}",
- "transition": "GreetInSpanish"
- },
- {
- "condition": "{{ $.[?(@.language == 'Portuguese')] }}",
- "transition": "GreetInPortuguese"
- }
- ],
- "defaultCondition": {
- "transition": "GreetInEnglish"
- }
- },
- {
- "name": "GreetInEnglish",
- "type": "inject",
- "data": {
- "greeting": "Hello from JSON Workflow, "
- },
- "transition": "GreetPerson"
- },
- {
- "name": "GreetInSpanish",
- "type": "inject",
- "data": {
- "greeting": "Saludos desde JSON Workflow, "
- },
- "transition": "GreetPerson"
- },
- {
- "name": "GreetInPortuguese",
- "type": "inject",
- "data": {
- "greeting": "Saudações de JSON Workflow, "
- },
- "transition": "GreetPerson"
- },
- {
- "name": "GreetPerson",
- "type": "operation",
- "actions": [
- {
- "name": "greetAction",
- "functionRef": {
- "refName": "printMessage",
- "arguments": {
- "message": "$.greeting $.name"
- }
- }
- }
- ],
- "end": {
- "terminate": true
- }
- }
- ]
-}
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.svg b/packages/serverless-logic-web-tools/static/samples/greetings/greetings.svg
deleted file mode 100644
index a5a9265af5..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="698" height="813" viewBox="0 0 698 813"><defs/><g transform="matrix(1,0,0,1,0,0)"><g><g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 1200 0" stroke-miterlimit="10" stroke-opacity="0.8" stroke-dasharray="5"/></g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 0 800" stroke-miterlimit="10" stroke-opacity="0.8" str [...]
\ No newline at end of file
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.sw.json b/packages/serverless-logic-web-tools/static/samples/greetings/greetings.sw.json
deleted file mode 100644
index a66f3396e7..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.sw.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "id": "jsongreet",
- "version": "1.0",
- "specVersion": "0.8",
- "name": "Greeting workflow",
- "description": "JSON based greeting workflow",
- "start": "ChooseOnLanguage",
- "functions": [
- {
- "name": "greetFunction",
- "type": "custom",
- "operation": "sysout"
- }
- ],
- "states": [
- {
- "name": "ChooseOnLanguage",
- "type": "switch",
- "dataConditions": [
- {
- "condition": "${ .language == \"English\" }",
- "transition": "GreetInEnglish"
- },
- {
- "condition": "${ .language == \"Spanish\" }",
- "transition": "GreetInSpanish"
- }
- ],
- "defaultCondition": {
- "transition": "GreetInEnglish"
- }
- },
- {
- "name": "GreetInEnglish",
- "type": "inject",
- "data": {
- "greeting": "Hello from JSON Workflow, "
- },
- "transition": "GreetPerson"
- },
- {
- "name": "GreetInSpanish",
- "type": "inject",
- "data": {
- "greeting": "Saludos desde JSON Workflow, "
- },
- "transition": "GreetPerson"
- },
- {
- "name": "GreetPerson",
- "type": "operation",
- "actions": [
- {
- "name": "greetAction",
- "functionRef": {
- "refName": "greetFunction",
- "arguments": {
- "message": ".greeting+.name"
- }
- }
- }
- ],
- "end": {
- "terminate": true
- }
- }
- ]
-}
diff --git a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.dash.yml b/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.dash.yml
deleted file mode 100644
index fe62e5dc69..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.dash.yml
+++ /dev/null
@@ -1,822 +0,0 @@
-pages:
- - name: index
- properties:
- margin: 10px
- components:
- - properties:
- background-color: blue
- opacity: 0.5
- color: white
- font-weight: bolder
- padding: 20px
- margin-bottom: 20px
- html: >-
- <strong style="font-size: xx-large; font-weight: bolder; font-family: sans-serif"> Dashbuilder Components </strong>
- <br />
- - type: TABS
- properties:
- width: 100%
- navGroupId: MainGroup
- targetDivId: all_div
- - type: DIV
- properties:
- divId: all_div
- - name: Tree
- rows:
- - columns:
- - span: "3"
- components:
- - type: TREE
- properties:
- width: 180px
- navGroupId: Displayers
- targetDivId: navigation_tree_div
- - span: "9"
- components:
- - type: DIV
- properties:
- divId: navigation_tree_div
-
- - name: Menu
- components:
- - type: MENU
- properties:
- width: 100%
- navGroupId: Displayers
- targetDivId: navigation_menu_div
- - type: DIV
- properties:
- divId: navigation_menu_div
- - name: Carousel
- components:
- - type: CAROUSEL
- properties:
- navGroupId: Displayers
- - name: Tiles
- components:
- - type: TILES
- properties:
- navGroupId: Displayers
- - name: Navigation
- components:
- - html: >-
- Multiple pages can be declared on the same dashboard. If the dashboard contains more than one page then a menu is available for displaying the pages. <br />
- Pages can be organized in groups and then be embedded in other pages using Navigation Components. In fact, this example is built using TABS navigation component. <br />
- Here are some other navigation components:
- - type: TABS
- properties:
- width: 100%
- navGroupId: Navigation
- targetDivId: navigation_div
- - type: DIV
- properties:
- divId: navigation_div
- - name: Timeseries
- components:
- - settings:
- component: timeseries
- external:
- width: 100%
- lookup:
- uuid: timeseries
- - name: Forms
- components:
- - type: EXTERNAL
- properties:
- height: 500px
- componentId: uniforms
- uniforms.url: http://acme.com
- uniforms.schema: >-
- {
- "title":"",
- "type":"object",
- "properties":{
- "workflowdata": {
- "title": "Sample Form",
- "default": { "language": "English", "name": "John" },
- "type": "object",
- "properties": {
- "name":{
- "type":"string"
- },
- "language":{
- "type":"string",
- "allowedValues": ["English", "Spanish"]
- }
- },
- "required":[
- "name", "language"
- ]
- }
-
- }
- }
- - name: SVG Heatmap
- components:
- - settings:
- component: svg-heatmap
- external:
- width: 100%
- svg-heatmap:
- svg: >-
- <svg xmlns="http://www.w3.org/2000/svg">
- <path id="svg_1" d="m23,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
- <path id="svg_2" d="m133,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
- <path id="svg_3" d="m240,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
- <path id="svg_4" d="m350,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
- <path id="svg_5" d="m461,24l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
- <path id="svg_6" d="m566,26l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
- </svg>
- lookup:
- uuid: svg-data
- - name: ECharts
- components:
- - settings:
- component: echarts
- external:
- width: 100%
- height: 400px
- echarts:
- title:
- text: Products
- left: center
- option: >-
- {
- "toolbox": {
- "feature": {
- "dataZoom": {},
- "magicType": {
- "type": ["line", "bar", "stack"]
- },
- "saveAsImage": {}
- }
- },
- "series": [
- {
- "type": "bar",
- "markLine": {
- "data": [
- { "type": "max" }
- ]
- }
-
- },
- {
- "type": "bar",
- "markLine": {
- "data": [
- { "type": "max" }
- ]
- }
-
- }
- ]
- }
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: product
- functions:
- - source: product
- - source: quantity
- - source: quantity2
- - name: Rich Table
- components:
- - settings:
- component: table
- external:
- width: 100%
- lookup:
- uuid: products
- - name: Geo Map
- components:
- - settings:
- component: map
- chart:
- height: 400
- lookup:
- uuid: countries
- group:
- - columnGroup:
- source: Country
- functions:
- - source: Country
- - source: Value
- - name: External Components
- components:
- - properties:
- margin-bottom: 20px
- html: >-
- It is possible to develop <a href="https://blog.kie.org/2021/02/dashbuilder-external-components-javascript-api-2.html">custom components</a> that can be rendered inside Dashbuilder. By default some external components are available for use:
- - type: TABS
- properties:
- width: 100%
- navGroupId: Components
- targetDivId: external_components_div
- - type: DIV
- properties:
- divId: external_components_div
- - name: Meter
- properties:
- font-size: x-large
- text-align: center
- components:
- - properties:
- float: left
- settings:
- type: METERCHART
- general:
- title: "Memory Usage"
- visible: "true"
- chart:
- legend:
- show: "true"
- position: bottom
- meter:
- end: "4120"
- critical: "3000"
- warning: "2000"
- lookup:
- uuid: memory_usage
- group:
- - columnGroup:
- source: Server
- functions:
- - source: Server
- - source: Usage
- function: SUM
- - name: Selectors
- components:
- - html: >-
- Dashbuilder Displayers can filter each other. For filtering only we have selectors components. You can enable filter using the filter section:<br /> <pre>
- filter:
- enabled: 'true'
- notification: 'true'</pre>
-
- - html: >-
- <strong> subtype DROPDOWN (default) </strong>
- - settings:
- type: SELECTOR
- filter:
- enabled: "true"
- notification: "true"
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Section
- functions:
- - source: Section
- - html: >-
- <br /><strong>subtype SELECTOR_LABELS (used only with LABEL column types)</strong>
- - settings:
- type: SELECTOR
- subtype: SELECTOR_LABELS
- filter:
- enabled: "true"
- notification: "true"
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Section
- functions:
- - source: Section
- - html: >-
- <br /><strong> subtype SELECTOR_SLIDER (can't be used with LABEL columns)</strong>
- - settings:
- type: SELECTOR
- subtype: SELECTOR_SLIDER
- filter:
- enabled: "true"
- notification: "true"
- lookup:
- uuid: products
- group:
- - functions:
- - source: Quantity
- - settings:
- type: BARCHART
- filter:
- enabled: "true"
- listening: "true"
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - name: Metric
- components:
- - html: >-
- Metric components render an HTML template based on data. Users can customize the HTML and Javascript based on data.
- - html: "<h4><strong>Default Metric</strong></h4><br />"
- - settings:
- type: METRIC
- chart:
- height: "100"
- general:
- visible: "true"
- title: Total Products
- lookup:
- uuid: products
- group:
- - functions:
- - source: Quantity
- function: SUM
- - html: >-
- <hr />
- The following metric uses custom HTML and Javascript template:<br/>
- - settings:
- type: METRIC
- html:
- html: >-
- <h2><strong>✪ Total Products:</strong> <span id="${this}">${value}</span></h2>
- javascript: >-
- ${this}.onmouseover = function() {
- ${this}.style.color = "red";
- };
- ${this}.onmouseout = function() {
- ${this}.style.color = "black";
- };
- general:
- visible: "true"
- title: Total Products
- lookup:
- uuid: products
- group:
- - functions:
- - source: Quantity
- function: SUM
- - name: Map
- rows:
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>subtype MAP_REGIONS (default)</strong></h4><br />"
- - settings:
- type: MAP
- lookup:
- uuid: countries
- group:
- - columnGroup:
- source: Country
- functions:
- - source: Country
- - source: Value
- - span: "6"
- components:
- - html: "<h4><strong>subtype MAP_MARKERS</strong></h4><br />"
- - settings:
- type: MAP
- subtype: MAP_MARKERS
- lookup:
- uuid: countries
- group:
- - columnGroup:
- source: Country
- functions:
- - source: Country
- - source: Value
- - name: Pie Chart
- rows:
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>subtype PIE (default)</strong></h4><br />"
- - settings:
- type: PIECHART
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - span: "6"
- components:
- - html: "<h4><strong>subtype DONUT</strong></h4><br />"
- - settings:
- type: PIECHART
- subtype: DONUT
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - name: Bubble Chart
- rows:
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>Bubble Chart</strong></h4><br />"
- - settings:
- type: BUBBLECHART
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - source: Product
- - name: Area Chart
- rows:
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>subtype AREA (default)</strong></h4><br />"
-
- - settings:
- type: AREACHART
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - span: "6"
- components:
- - html: "<h4><strong>subtype AREA_STACKED</strong></h4><br />"
- - settings:
- type: AREACHART
- subtype: AREA_STACKED
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - name: Bar Chart
- rows:
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>subtype COLUMN (default)</strong></h4><br />"
- - settings:
- type: BARCHART
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - span: "6"
- components:
- - html: "<h4><strong>subtype BAR</strong></h4><br />"
- - settings:
- type: BARCHART
- subtype: BAR
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>subtype COLUMN_STACKED</strong></h4><br />"
- - settings:
- type: BARCHART
- subtype: COLUMN_STACKED
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - span: "6"
- components:
- - html: "<h4><strong>subType BAR</strong></h4><br />"
- - settings:
- type: BARCHART
- subtype: BAR_STACKED
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - name: Line Chart
- rows:
- - columns:
- - span: "6"
- components:
- - html: "<h4><strong>subtype line (default)</strong></h4><br />"
- - settings:
- type: LINECHART
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - span: "6"
- components:
- - html: "<h4><strong>subtype smooth</strong></h4><br />"
- - settings:
- type: LINECHART
- subtype: SMOOTH
- lookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- functions:
- - source: Product
- - source: Quantity
- - source: Quantity2
- - name: Displayers
- properties:
- margin: 10px
- components:
- - properties:
- margin-bottom: 20px
- html: >-
- Data can be displayed using <i>Displayers</i>.
- The usual charts types are supported and Dashbuilder internally use <a href="https://echarts.apache.org/en/index.html">ECharts library</a> to render them. <br />
- Displayers configuration is described in the <a href="https://www.dashbuilder.org/docs/#chap-dashbuilder-yaml-guides">YML guide</a>
- - type: TABS
- properties:
- width: 100%
- navGroupId: Displayers
- targetDivId: displayers_div
- - type: DIV
- properties:
- divId: displayers_div
- - name: Layout
- properties:
- margin: 10px
- rows:
- - columns:
- - components:
- - html: >-
- <p style="margin-top: 20px">
- A Dashbuilder application is composed of Pages. The smallest Dashbuilder YML application contain a single page with a single component
- <pre>pages:
- - name: Page
- components:
- - html: Hello World</pre>
- Currently boostrap layout is used, which means that columns and rows can be used for organization:
- </p>
- - columns:
- - properties:
- border: solid 1px
- text-align: center
- margin-bottom: 10px
- components:
- - html: ROW1
- - columns:
- - properties:
- border: solid 1px
- text-align: center
- span: "3"
- components:
- - html: ROW2 CL1 SPAN 3
- - properties:
- border: solid 1px
- text-align: center
- span: "3"
- components:
- - html: ROW2 CL2 SPAN 3
- - properties:
- border: solid 1px
- text-align: center
- span: "6"
- components:
- - html: ROW2 CL3 SPAN 6
- - columns:
- - properties:
- margin-top: 10px
- components:
- - html: >-
- This is the code for the layout above: <br /><br />
- <pre>pages:
- - name: Layout
- rows:
- - columns:
- - properties:
- border: solid 1px
- text-align: center
- margin-bottom: 10px
- components:
- - html: ROW1
- - columns:
- - properties:
- border: solid 1px
- text-align: center
- span: '3'
- components:
- - html: ROW2 CL1 SPAN 3
- - properties:
- border: solid 1px
- text-align: center
- span: '3'
- components:
- - html: ROW2 CL2 SPAN 3
- - properties:
- border: solid 1px
- text-align: center
- span: '6'
- components:
- - html: ROW2 CL3 SPAN 6</pre>
- - name: Data Sets
- properties:
- margin: 10px
- components:
- - html: >-
- <p>
- Data is retrieved using Datasets and it can be retrieved from JSON content. The content can be retrieved from a JSON URL or declared inline: <br />
- <pre>datasets:
- - uuid: products
- content: >-
- [
- ["Computers", "Scanner", 5, 3],
- ["Computers", "Printer", 7, 4],
- ["Computers", "Laptop", 3, 2],
- ["Electronics", "Camera", 10, 7],
- ["Electronics", "Headphones", 5, 9]
- ]
- columns:
- - id: Section
- type: LABEL
- - id: Product
- type: LABEL
- - id: Quantity
- type: NUMBER
- - id: Quantity2
- type: NUMBER
- </pre>
- Data Sets can be used with Displayers or External Components. For more information check <a href="https://blog.kie.org/2022/04/support-any-json-metrics-and-csv-as-dataset-in-dashbuilder.html">the article about datasets</a>.
- </p>
- - name: HTML & CSS
- properties:
- margin: 10px
- components:
- - html: >-
- <p>Dashbuilder Support HTML components using the <i>html</i> element and CSS 2 properties using <i>properties</i>
- object that applies to any component (pages, row, columns and component). A page with font-size xxx-large could use the following declaration:
- <pre>pages:
- - components:
- - html: Hello World
- properties:
- font-size: xxx-large</pre>
- </p>
- <p>
- When using HTML you can make use of any library used by Dashbuilder. Currently it used Patternfly V3. Here's a sample panel:
- <div class="panel panel-default">
- <div class="panel-heading">
- <h3 class="panel-title">Patternfly 3 Components</h3>
- </div>
- <div class="panel-body">
- You can use <a href="https://www.patternfly.org/v3/pattern-library/" class="alert-link">Patternfly 3</a> components. Bear in mind that libraries used by Dashbuilder can change in future, so be careful when using patternfly or other provided libraries.
- </div>
- </div>
- <div class="alert alert-warning" style="margin-top: 20px">
- <span class="pficon pficon-warning-triangle-o"></span>
- <strong>Using internal libraries</strong> Internal visual libraries are always a subject of change. Currently Patternfly 3 is used, but this may change in future.
- </div>
- <div class="alert alert-info" style="margin-top: 20px">
- <span class="pficon pficon-info"></span>
- <strong>Javascript not supported</strong> Javascript is not supported inside HTML elements.
- </div>
- </p>
-navTree:
- root_items:
- - type: GROUP
- id: MainGroup
- children:
- - page: Layout
- - page: HTML & CSS
- - page: Data Sets
- - page: Displayers
- - page: External Components
- - page: Navigation
- - type: GROUP
- id: Displayers
- children:
- - page: Bar Chart
- - page: Line Chart
- - page: Area Chart
- - page: Pie Chart
- - page: Bubble Chart
- - page: Meter
- - page: Map
- - page: Metric
- - page: Selectors
- - type: GROUP
- id: Components
- children:
- - page: ECharts
- - page: Timeseries
- - page: SVG Heatmap
- - page: Rich Table
- - page: Geo Map
- - page: Forms
- - type: GROUP
- id: Navigation
- children:
- - page: Tiles
- - page: Carousel
- - page: Menu
- - page: Tree
-
-datasets:
- - uuid: products
- content: >-
- [
- ["Computers", "Scanner", 5, 3],
- ["Computers", "Printer", 7, 4],
- ["Computers", "Laptop", 3, 2],
- ["Electronics", "Camera", 10, 7],
- ["Electronics", "Headphones", 5, 9]
- ]
- columns:
- - id: Section
- type: LABEL
- - id: Product
- type: LABEL
- - id: Quantity
- type: NUMBER
- - id: Quantity2
- type: NUMBER
- - uuid: countries
- content: >-
- [
- ["Brazil", 6],
- ["USA", 3],
- ["China", 5],
- ["India", 5],
- ["Russia", 6],
- ["Canada", 6],
- ["Australia", 9],
- ["Mali", 4],
- ["South Africa", 11],
- ]
- columns:
- - id: Country
- type: LABEL
- - id: Value
- type: NUMBER
- - uuid: svg-data
- content: >-
- [
- ["svg_1", 1],
- ["svg_2", 2],
- ["svg_3", 3],
- ["svg_4", 4],
- ["svg_5", 5],
- ["svg_6", 6]
- ]
- columns:
- - id: id
- type: LABEL
- - id: v
- type: NUMBER
- - uuid: memory_usage
- content: >-
- [
- ["Server 1", 2512],
- ["Server 2", 1900],
- ["Server 3", 3200],
- ["Server 4", 1200]
- ]
- columns:
- - id: Server
- type: LABEL
- - id: Usage
- type: NUMBER
- - uuid: timeseries
- url: https://raw.githubusercontent.com/jesuino/dashbuilder-data/master/samples/timeseries.json
diff --git a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.svg b/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.svg
deleted file mode 100644
index b66e1affe4..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.svg
+++ /dev/null
@@ -1,1892 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- width="210mm"
- height="297mm"
- viewBox="0 0 210 297"
- version="1.1"
- id="svg159"
- xmlnsXlink="http://www.w3.org/1999/xlink"
- xmlns="http://www.w3.org/2000/svg"
- xmlnssvg="http://www.w3.org/2000/svg">
- <defs
- id="defs156" />
- <g
- id="layer1"
- style="display:inline">
- <g
- id="g1321"
- transform="matrix(1.0515521,0,0,1.0515521,-7.7893147,20.694398)">
- <image
- width="93.902992"
- height="59.590317"
- preserveAspectRatio="none"
- xlink:href="data:image/png;base64,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
-7Gzt379f99xzj/793/9dkpSfn6/77rtPW7Zs0fr16zU4OKi9e/fqyJEjcrvdamxsnLa2H99uPDty
-5Ig2bNggl8ulm2++WcYYvfvuu/ryl7+sv/qrv9JNN92kyspKTUxMaMeOHXrllVfkdrv1b//2bxob
-G9Ndd92ldevWKS8vT11dXZKkp59+Wnfffbe2bdumjRs36qmnnrrAs4yNPXv26Ic//KGWL18uSbrk
-kkt06aWXTnusyM/P17333quvfvWruummm/TUU0/pG9/4hq677jq98sorkk5fxbK0tFQul0ubN2/W
-Rx99JGny8eFb3/qWNm7cqGuuuUYdHR0XpgDz5JVXXtENN9yg6667Tt///vcladqaHjhwQLm5uSoq
-KtKBAwdC29i6dav+9m//Vtu2bZPL5VJ3d3eor6mpScXFxVq9erVeeuklSZpx377rrrv09a9/XZs2
-bdIjjzwSWn6qY80//MM/KD8/X9dee60ef/zx+S2UgTlw4ID5i7/4C1NbW2tOnjxpjDHm2LFjZt26
-dWZ4eNgYY8zExIQxxpjR0VFjjDHPPvuseeyxx4wxxmzZsiX02OfzmRtuuGHG9oaGBvPkk08aY4x5
-7bXXzE033WSMMeazn/2saWpqmvf5LgTf/e53zf79+40xxvzsZz8zGzZsMMacrtmdd94ZWm7Lli2m
-v7/fGGPM8uXLzRtvvGGMMWbv3r3m+9//vjHGmKuvvjq0/HS1/fh240VeXp45fvx4WNuZfdgYY7Zt
-22beeOMN8x//8R9m+fLlof39W9/6lnnhhRfM73//e+NyuULLP/300+aBBx4wxhjzhz/8wWRnZ5vh
-4WHzz//8z+YrX/mKMcaYsbExs2bNGhMIBOZ7ehfc5ZdfPqm+Z0x1rPjkJz9pfvWrXxljjKmsrDT3
-3nuvMcaYt956y9xyyy3GGGNuu+028/bbbxtjjHn00UfNj370I2PM5OPDme3/+te/NqWlpdGe2rx6
-8cUXzbJly8zVV18d+vcnf/In5u233zbj4+Nm/fr15tSpU8YYY770pS+FjgEfr+no6Kj5/Oc/b4LB
-oDHGmNtvv91897vfNcacfs3X1dUZY4z53e9+Z9asWRNq37lzpzHmdO3O7N8z7dtn1/eqq64yY2Nj
-0x5rVq1aFVr27NfafOAtdEmbNm1Sbm6ufvSjH2n16tV68cUX9ctf/lJf+tKXQmfjNptNgUBADz30
-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
-3cAAAAAASUVORK5CYII=
-"
- id="image299"
- x="7.4745264"
- y="32.165771" />
- <g
- id="g1314">
- <image
- width="92.522018"
- height="56.317757"
- preserveAspectRatio="none"
- xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAe8AAAEqCAYAAAA8rNjKAAAABHNCSVQICAgIfAhkiAAAIABJREFU
-eJzsvelzI3l63/nNO3EDBEESPItk3dPHjGbG1ugeObyywpKPtTdsyaHD2pDX0mit/RP0L+yuwroc
-G3ZoLWllK1bSzMovtNrRMZJHVo96eqqri12sYhVvgsSdQGYiz31BPU8DJEiCJHhWfiI6ukgCiUQi
-8Xt+z/V9hDAMQ0RERERERETcGMSrPoGIiIiIiIiI0xEZ74iIiIiIiBtGZLwjIiIiIiJuGJHxjoiI
-iIiIuGFExjsiIiIiIuKGERnviIiIiIiIG0ZkvCMiIiIiIm4YkfGOiIiIiIi4YUTGOyIiIiIi4oYR
-Ge+IiIiIiIgbRmS8IyIiIiIibhiR8Y6IiIiIiLhhRMY7IiIiIiLihhEZ74iIiIiIiBtGZLwjIiIi
-IiJuGJHxjoiIiIiIuGFExjsiIiIiIuKGERnviIiIiIiIG4Z81ScQEXHTCMOQ/y0IwhWeSURExJtK
-ZLwjrj1hGLKRbDQaEEURQRCg0WggkUjAtm3EYjEEQQDLshAEAXRdh6ZpME0TiUQCmUxmoNcKggCe
-56HT6aDdbkOSJAiCAMMwYJomfN/v+zxBEKAoCjKZDJLJJGRZRiwWG9o1iIiIiOhGCLvdiIiIK8Sy
-LLiuC9d12WD6vo9Wq4UgCCBJElzXhSiKcF0XnudBVVX4vs9G1vd9uK7LBt91XQDA/fv3EYvFYBgG
-EokEfN9HLBaD4zioVqtIpVLwPA/lchlhGCIIAvi+D1mW+WdVVSFJEoD9TQSwv7EQRRGiKEIQBHie
-B0mSkE6n8ejRI/i+j3a7jVgsBkmSIIpRpioiIuL8RMY74tIhw9vpdGBZForFIj7++GMYhgFRFOH7
-PkRRRBiGUBQFkiSxUTzK+Lmui1arhU6ng0QigVgsxoabPHV6nKqqPb8noxuGIUzTxNjY2InvgTYU
-YRjyRoE2DoVCAYqiwHEcAOD/h2GId955B5qmnfsaXjaO4/B1uwo6nQ4Mw+CIiqIoV3YuERHXgch4
-R1wKhmHA8zzs7u7CcRw24K7rYnR0FOVyGbquw/d99nTT6fSRxyND6Xkeh9TJOyfDH4Yh4vH4qc6z
-O0R/WsIwRKvVAvBJLlwURaiqing8jkQiwYZ9GNB7DMMQW1tbkGUZ7XYb8XgcpmlC13WEYYh8Pg9d
-10/l9TuOg6WlJbRaLSQSCbRaLcRiMbz77rscfbhMnj9/jlKpBF3XoaoqZFlGKpVCJpNhgx4R8SYR
-Ge+Ic0O5Z1nuX0LRbDbx7NkzOI6DeDwOXdf5b6ZpotFoQFEUJJNJhGEIz/MAAKlUCp1Op8cz1jQN
-nuchHo8jl8uhUqmgUqlA0zQkEolrUUDWbDZhWRYmJiYwMTGBTCYzVIO3tLQE3/chCAJkWYZpmqjV
-agjDELIsQxRFKIqCIAjgui5kWcZbb7117GboIBTur9frqNfrvPE4zTGGSb1eR7PZhGEY6HQ66HQ6
-UFUVgiDw+83n88jn87AsC5IkIZFIXMm5RkRcBpHxjjiRZrMJ27ZhGAZGRkaQy+UA7Oeo19fXUavV
-oOs6FEXB/Pw8Wq0WTNNENptFOp3G6uoqXr9+DVmWkc1mYVkWHMdhQy1JEkZGRg69ruM4qNVqmJyc
-hCRJkGUZgiDANE1+bhiGcBwHsVjsWuSTbdvm9zM7Ozv04/u+zx5xt6Gm1zZNE4IgYHJyEoIgIJPJ
-wPf9gVIBNwXTNLG7uwvXdWHbNqdH2u02RxsEQYCmaUgmk0gkEkin01EBYcStIjLeEZwPDoIArVYL
-2WwWjuPAMAxUq1WUy2VYloVCoYDR0VEUi0UAwMrKCvb29ji/m0gkIEkStra2oCgK5ubmMDs7i6dP
-n3IoHNhfZIMggKZp0HWdvdIwDNFutzkEqmkacrkcG/4wDCFJEnvg18HLPkin08HExAQmJycv7DUo
-WrGzswPXdaFpGmRZ5mI+uuaqqiKZTCKfz98q492N53ncIUA58TAM8eLFC06jdDod5PN5FItFxOPx
-IyNEERE3iegufgMJwxC1Wg2CIKBer8MwDNi2DWA/VJ3NZhEEAV69eoUgCJDJZLCwsIDx8fGe4yws
-LGBhYQH1ep0NP+0FBUFAOp2GKIq4c+cODMNApVKBYRjQNA1BEHBYkzwoVVUxNTWFVCoFWZaRSCRQ
-r9eRy+XQaDTY406n09fScFMRHl3LiyIej3P6YX19nfPbnufh7t27yGazSKVSvGGiNMR1wbZtWJaF
-bDZ77s+RDDHVFRAPHz7kgkdBEPDq1SssLS3xz3fu3IHjOMjn8wD279cgCCLDHnFjiDzvN4QwDNl4
-VioVDjWSNyxJEqanpzEyMoJ4PI61tTWUSiUIgoBPf/rTvKi1222YpslhdKrODsMQ6+vrEASBPel8
-Pg9ZlrG+vg5FUeC6LudMu/OxwL7Hevfu3UMeYqlUwvPnz3s8bcqB0yagO4d+VbTbbaiqikwmg3Q6
-zUbhonEcB81mk1MXMzMzl/K6g+K6Lvb29qCqKlqtFtrtNrcEapp2IQVwtm0jCAK0220kk0mUy2Vs
-bGxAlmXE43G0Wi1+TVVVud2vO9QeBAHGxsaGWtUehiGq1Sp0XefviaIo1yLdE3HziIz3G8STJ0/Y
-M47FYmi323Acp6c1K5fLQVEU7O3tIQgCmKaJ2dlZ3Lt3D6urq9jc3OwpiKJ8Ki1yW1tbSCQS7A1S
-CFwQBFiWxT3auq4jm80ikUicWC1cq9VQr9e5tUvXddi2DVEUOb9+2mrqYeN5HtrtNt5++22kUqkr
-O4/rQrvdxvb2NlqtFtcBUGtdLBZDPB5HMpnkFMx5CIIAjuNwHrxarUJRFHieB1EUWQ+gX6uh53k9
-3rbv+/B9H47jQFEUFAoFTE1NDeXearfbePLkCWRZ5s0D1S3EYjHIsoxCoYB6vY54PM7nTI+JiOgm
-Mt63EAqXkuLYwQrhzc1NbG1tsSAKiaLkcjnOIVIuulAooFAoQJIkNBoNfPTRRxAEAclkkntvKcRN
-RWiapvGi2el0OHwJgKujyesaRu/w+++/f+UeOFU4P3z48I0vjHJdF3/1V38FSZKQTCZZNCeXyyGf
-z0PTtKH2jK+vr6NcLsNxHN7EDcPYUfrjnXfeGZoH3mw2sbW1hU6ngyAI0Ol0uBCTOiu6Nx6u60JR
-FHzmM5+JetsjeogSPLeM7hCh67pcGAbse9szMzOYmprC+Pg4Xr16BdM0kUwmkcvlIEkSewTdob1O
-p4Nms4lYLIaFhQXkcjmUSiVeeMIwRCaTgSiKkCQJlmWh0+lAFEXOT9MGIQgC5HI5ZLPZoS3gc3Nz
-ePny5VCOdRYoDEziMG86pVKJvUlSv1tYWBha65bv+7Asi+skKBQvy/LQctaU1hkZGYFhGLw51HUd
-jUYD8XicPfnu12y1WhwKp2hD99/T6TTS6TR83+fUk6IofN/UajUuNKSIAoDIcEccIjLet4AwDFEu
-l2EYBur1Ou/kVVXlcK7neSiVSlBVFaOjo4jFYrhz5w4XrXU6HW7BkWUZjx8/hq7rWFlZ4YI26i3O
-ZrNotVoQRRGO40AURVQqFSSTSfi+z4sdFQdRKBLYz9G22200Gg2oqjqUBZ2EXS4b0zQB7F//iYkJ
-3Llz59LP4TpCxZCSJKHZbGJ+fn7gz5kMsyzLrK5HRXe02XNdF0+fPuXfUe3EMIvNRFFEPB5Ho9Fg
-gSF6LTLYJJCTzWa5iHBjYwPVapU7KQAgkUggm82yFgEA7kPvvi5hGOL58+fc7idJEmZmZoaSWoi4
-fUTG+wbjeR6LlFAVt6Zp3B9NUqO0a3ddl/PW6XQahmEgk8mw1KdlWRgbG8PY2BiWlpYgSRJs20Yq
-lYKqqhyWrNfrrHSVTCahqiqazSaLtVBLF0EhfFqEKbw+TC/pMquEfd+HaZpwXRf5fB737t1jbfU3
-HfIWyZOkdr9BWV9fx87ODjRNQxiGKBaLEEURq6uruHv3Lofhp6amsL29DUmSTq2iNyj9jn3Q0wb2
-RYqq1Srf91TDQaF7wzCwu7sLXddRKBT4PR1EEATcv38fjuPgww8/hCRJ2N7e5o0uRTNoUyNJEnzf
-H3joTsTt4o0x3kEQsEfQTxDkPMe9ihaTMAzxjW98A77vI5lMIh6Pw3EcmKbJ56MoSs/OPpPJsCfc
-6XTgui6azSZ0XUen08Hjx49RKBTg+z5SqRQajQZ0XUe73Qawn68ul8u4c+cOisUidF3H2toatra2
-eJoWsN9u1m3IqFWJcqBUaLa5uYlCocACL2fh9evXKJVKlyrZSV4+qbzd1JDmeaRgj8LzPFiW1XNN
-SqUSZmZmBnotKuYiL3ttbQ0PHjyA67pYWVnhvDBFlwzD4Lazy6Df9/yk9A9JuQLA9vY2arUapqam
-+PuysrKCiYkJBEEA27ahKArGx8dRrVbhOA6nrqhanTx+WZa55ZI2BpdVuNnpdKJK+SvmjShYe/Xq
-FUqlEqt5ffaznz1TvtVxHDiOg0ajgTAMYds2V9OOj49DlmVMT0/D87xLWdBXV1fZSyFDXavV0Gg0
-4LoustksYrHYkYumbdvQdR2WZSGfz2N+fp7/1ul0sLq6yhXn5HU7joOJiQnMzs5id3cXT58+RSqV
-OnWul44LANlsFjMzM8ee61FUKhWUSiXuAb8oL4yo1+tQFAWyLMNxHBSLRczNzV3oaw4Ly7Kws7PD
-GzjLsrivPxaLDa0GYXNzE5ZlwTRNWJYFYN/A5fN5TExMHPk6juPg2bNnPe2GnU4HwCfKdVQdToYv
-DMOeYTM3Ac/zuMNDVVU0Gg3OqVOBGjkFruueGLnwPA+2bbO3T5XqiUQClmVxESrVIIyOjp67uPOb
-3/wm2u02pqamonTRFfFGGO9SqQRZlqHrOmRZHniIAfU00w6YWl1oQaHjkday4zisY909/YjGVuq6
-PpA2tGma8DwPpmlCVVVYloV6vY6FhQUYhoHR0dFD0qCyLKPRaOCDDz7oUSzzfZ+L0Y6Cer7HxsYw
-OTnJC6+qqnj16lVPT3W73caDBw+Qy+Wwvb2NtbU1bjMDwAsIGQjaMJGndBC6npQ3npqaGtiAe56H
-5eVlnvHdbrcvVEms2WwiCALuFdY0DXfv3h1qJGeYkGBMpVLh0ao05tTzPP5sSGr285//PIDhFUd1
-Oh3U63XYts2dB48fP+75e3fbFLDvaZfL5R6vznVdjjC12+1b5fFRFOwsG9ejoGtN3zlBEPj72el0
-oOs6YrEYpqenB6pF2NzcRCqV4u8xbSqq1Spisdgh8aaIy+GNMN6ngRYcGoJAAg6D9loGQcBtUt3q
-VnTDq6qKQqGA2dlZhGGIUqnE+WYq7KKFldpFAPQYa/I6dF1HPp/HyMgIdF3HN77xDTSbTaTTaW4X
-0zSN87HUl+26Lnuo1NNKO3/KX7uui/HxcdRqNV5YyOt88OABe2qu62JtbQ2bm5v83pPJJFfQKorC
-BXHHLRRhGMKyLHz2s58deGGu1Wp4+vQpi12Ypol0On1hUQ8yhoqiQNM0jIyMYHp6+kJe67xUKhVs
-bGzAdV1YlsXa75qmwfd91Go13ozScA/6fIrFIjRNYynRi/BqgyDAhx9+CMdxuFaDOhOCIMDa2hoE
-QeBzovsfQI9y2kWyIWzgT6U/RUUow4cPAQJChBAhIhNm8O3BF/AgeHCh53BR0IYoHo/zdaSOkFgs
-1hM9NAwDrVaL+87pnqEISSwWg67rPcp/Uf3HxXNrjHcQBNjb20Oz2cTi4uLAhtYwDNaIBj7RSqZq
-7WFAYS3P87jgRlEUNsbkSVCuut+50zlRCxZVklP4TRRFGIbBAimqqrJBplYm3/e5yAz4xHDPzc2x
-BOmLFy8Qj8dh2zZyuRwPwJAkiTczYRhiYWEBY2NjWF1dRb1e52tFRXAPHjzg9/H69WsuLupnwEmU
-YnR0FNPT0wN/8cMwxPb2NnzfZ9W4YYbNaQNEBptyl+Pj49e2Jcw0Tezt7WFnZ4fnk9P7oN5913Uh
-SRJyuRz29vYAgD0rRVG4v5k89EQigXw+j1Qq1RNupTqSRCLBRVQHMQwDe3t7EEURIyMjkCQJpmny
-7Pbd3V2O6lCkiKROaeNBymd0XuRJXlRf/9fFr+Pr0n9FMZzA58PPQj6iNOgD8Vt4iVe4F9zD3/d/
-6ELO5aLpVjrsHqVLU9uoS4Q2/t0bKoIcAsrDU85+ZGTk1kRIriO3wng3Gg1sbW1xbrafDnc/Op0O
-/vqv/xqqqvICchFSjZZlDa0t6ijq9ToAYGpqir+Qa8Ia/lvsL/Gy8RKBEEASRYQAZEHBmDyGH4z/
-IO5KdwHsfzl3dnbQbrchyzLS6TRvFKhIx7Isvkajo6NotVrodDqchjBNk0dgptNpOI6DjY0NlMtl
-jI6OotPpwLKsnrQFedzkeaVSqYGlRRuNBuuvD2Mx706J0OaH+nkLhQKSyeS19ijK5TI2NzdRrVbh
-+z5HYGKxGEzT5M1ad/qG8tLkPfVbbGlxps1XOp3G+Pg4yuUyXrx4wZXPhUIBMzMzHKqv1WqcEqHB
-NWQEyIMDcCiNRXlsuo+7RV1oVGk+n+eCymEaiF9UfhGzmMKng3cHfs4r4TXeFz7Aj3g/ivHw9oaQ
-KRJ40vWmjoN4PI7JycmoGv6CuNHGu91uY2dnh3ubKe87PT2NfD7PueejcF0X3/zmNzm0PEzI26Zc
-3UVXQ5PSmaqq+BP8Cb4hvYepcBKfFz4HGVLP6wdBAD/08Q3xfWwKm7hvPsQX/S9C0zQ0m03Issx5
-9IPQYkwiMOSBksLYo0eP+Jo/ffoUe3t7GBkZwcLCAqrVKmq1Wt/jUsrA933cv3+fQ+5HUSqVsL6+
-3tOScx4o4pJOp1EsFjl8eFNot9t4/vw5Wq0WgH0xkH7XuVqtHvobbdxGR0d7ok39qtEdx4Hruly0
-uLGxga2tLVYGu3//Pr71rW+xJ06fIXn/p/0e9DsHwzBw7949bG5uDq3lsCyU8X/Kv47/PviHZz7G
-74tfwXf734t3T2H4bzOU+stms5iYmIjmqw+ZG2m8bdvG5uYmms0mLxoAOFcriiJSqRREUcTbb78N
-4JPdIEl61ut1zM/P46OPPhp6hTJ5290tIpeBAwe/ovwyFsI7eDt8a+DnPROW8LGwjJ/y/kfE/fiJ
-xpBEJKiPXFVV5HI5JJPJnuKtSqXCXler1epRnwI+qSTuTlHQfOZcLocHD47OJ1Jh06DFh0dBC4yq
-qrhz586JnxelDmzbxujoKERRRK1WQyqVguM4KJfLCMMQo6Ojl7ZYua6L5eVlbhU8rnKc1O+6W6t8
-30e1WkUmk+HnUZU4FSh1t2dZlsWqfNS+ROFzKlS8SKnadruNYrHInRbn3Rh30MEvK/8W//gchpv4
-ivgH+O/8v4e7wd1zH+u2QCF1Gk17HQYJ3QZulPGmXs+trS0EQYDx8fGeXblt2zxxSpIkZDIZzuWS
-yhgVkXmeh1gsNtTcGc2jptz2ZfZ+bwgb+B35P51rAfpd8ffxQ94/wEK40Pfv1F6USCSQSqWQSCTg
-eR5rn9NjKHcWBAHLtVKxFEEVscVikWeCA+CCvLm5uSM/l06ngydPnpzaMybP3rIsLsbSNA2FQoHb
-a47Dtm08e/aM87Bk6LtnkFPx3+joKO7evZwF/MWLF2g0Gj3Rg360223OK1P+u3uqW6PRYNlaeh+a
-pmFychLtdpvvbUoxNRoNrl6/qMK2flBES1XVoRQn/m/K/4p/FPzwEM5sn/9b/H38vPu/DO14twVK
-w42Pj2N0dPTG6iNcF26M8V5bW8POzg7nHW3bRqfTQSqV6smxUKXj6Ogo4vE43nvvPWiaxosUeU1U
-OTksSHWL5k1fJjWhhl+X/wP+UfAPzn2s3xO/jP/B+2eYCCd6fk+DFKjXfW5uDuPj4z1RC9M0sbGx
-wRO/PM/jCvuDGxnKoy4uLsI0TaytrUHTNMzMzCCfz5+YW37x4gXq9frABpx2/+l0GslkkqvST7PB
-CoIAH3zwARssAOyRHnxvlmXh3XffvXAvY2Njg1shG40GMpnMkekOTdMwPz8PRVHw+vVrVuUjyuUy
-MplMz6LaaDTw4MEDpNNpbG5uIpPJwPd9PH/+nKNbN5kvS19GUohh8YgN61mwYeNPxD/HT7s/PbRj
-3iZs24Ysy5iamsLo6OhVn86N5cYorE1MTCCfz3MokiZcGYaBeDyOxcXFvipL1M4EgPuUKWw4LOPt
-ui7a7TYkSbp0ww0A/0H+9+fK1XXzD4Mfxm/Jv4kvmT8H4JO+UKpCTiaTHCotl8t4+PAhe6DPnj3j
-xwPgtp9+xoQ0q5eXl/H48WO8/fbb3BM/CGdRtZubmztXT7YoiiwPS8pWB8+JqvonJycv1BOl+emV
-SgWqqrL+9lHXhHKPmqZha2sLjUbjkOdDnzEN1QD2dbnX19cxNjaG9fV1rg6/6UabWBFf4h8PYdPb
-jQ4dIQI0hSbS4eWvB9cd27bhOM6pZHMjDnNjPO9+bG9vY2NjA+l0GhMTE4c8AXpr9XqdB2JUq9Wh
-et000IOEDy6b35J/E3cwg8lwcmjHLPklPJOe419rPwNg//pZlsUKUDQLnOZyv/vuu9A0DfV6nXPh
-ZJx3dnZQrVbZ0Lmui06nw+1qnU4H9+/f558HZWlpiYUoTqLVamFsbKxHQe48vPfee9zjSlrt9PnT
-kIqLrLCt1+uoVCpoNBrQNI0V9ZLJZF9Pv9lsQlEUzMzMoFarcfdDP7a3t5HP53v+7rouR1xSqRQP
-5bjOlfeD8DXxa/DEDhbC4dwX3Xjw8DXh6/hx78eHfuybDtXBeJ7HBaLU4x8xODfG8+5HNpvF7u4u
-arUabNvGO++8AwDcptJqtXiBpbDhMA03Ff+QKMlVsCfs4TuCv33u45DKFgBMx6exFH+O+eL+ora1
-tcUpC+pRn5ycZOEVGsvYHfmgxT2bzaJarfL1pzYhqlqmfvXTUigUsLq6eqzxphzb1NQUpqamTv0a
-R/G5z32OQ+Mk8xqLxS68JYZ6pqkws1to52C4G/gkVUB9/BsbGxypOopEIoFWq8WiG8C+R35QJ/82
-LLTfkj7ADwU/eCHHliGjKlQu5NjXlUE7CqhvX9M0dDodvHjxgkWPxsbGLn1OxE3lRl+lWCyGd999
-lzW6t7e30Ww2eVwl9eqqqjrUECblzV3XRTqdvrIQ4n+R/gB/O/z8uY5BXzjSRCbJ1+8Jvwu/2vhV
-/KvMv8Lk5CTy+Tw+/vhjVnATBAHNZhPJZBJra2toNBo8UILC5aOjoxgdHeXHVqtViKIIy7IwMjKC
-yclJJJPJM1Vl5/N57Ozs9PSZH0QQBDx8+PBC8s40ZAXApaRKSqUS1tbW2JB2G+qjJpoFQcCz20mG
-86Tq/HQ6jVqtxuIctxkXzoUeP4GL1dm/TpD8brc88iBQdJSUGsMwHOpG+zZzo413N0+fPmVlse7F
-ehDDShW4g+z4yOO6DqP4lsVlfOocVbLdwxEOTgIbEUbw1c6f8s+apmFhYYHft2maaDQayOVyqFQq
-Pdrn5MWbpglRFJHP57lNxPd91Ot1Lig8DyMjI9jY2Oj7N9d1kUgkbsUu3vM8bG5uHnm96LofvB+7
-J+hJkoSRkRFsbW0dm96h2o2b1ON+VjRcbDHhOMawLqxjJpy50Ne5bEjZkZTuRFHkFtCxsTHs7e0N
-1MJJm8nFxUWkUinuAooYjBu9spHHWCqV0G63T+3BUf8xeee6rrNBOzgwAegtTLtqww0AAs4euiTl
-quMMnBT0vv/uvHQ8Hse3fdu3YX19nY1+t/qSqqqwbRuvX7+GKIp4/Pgxfz6k/HVeEokEh+DpHGgi
-EwBMT0/fCuNNrVhH5ZlzuRzK5TJ/HwiSDJ6c3K+HSKfT2NraOvR8WohJN+G2bHqOw4MHHefTCDiJ
-RJiAIRjAja0q6o/jOJiZmWHVxJ2dHdRqNSiKgmKxCMMwWF71ICTFGoYhVFXF48eP+Z6m+zxiMG7s
-lSJPu1AooFQqsQ7vIPlsKpoiHV+SbQT25UVlWcbW1harllFfLEmQdnv2juNcyThCFy5SOF2RFz/3
-b/KlJxWJjYRZ1IIacmL/qlBFUXhgQT90XYdhGCgWiz1fymaziZ2dHSwsLJzry5pOp3Hv3j1IkgTb
-trG9vc0iKvfu3bvw8aCXSSwWYxW7g3Tr23ejqiq2trbgeR5mZ2cRi8UwOTnJuudUcChJEjRNQywW
-42rz244ECQEuNjXgw4eEy5szf1kIgsDpNVmWsbi4iHq9zkOVuke00vz17hnkNPM9m83eitqJq+LG
-Gm8SCSkUCpBlGfV6He12+1iDRAVMiqLAMAxIksSzjMmbJl1t8mY0TUO73eZCH9/3eWdJue+xsbFL
-X/CaQhOJ8PS5YpokNEh1d0JIHGm8XdfF5ubmse1JwH64vVurvFKp4PXr1wjDEM1m89zjNKlNjSYa
-kfG5ipa9i0QURdi23RNdItEZGkjT7zmyLPNAD0mSMDk5iUQigUql0jNsglJH3eNdbzMCBNjoXOhr
-NNBEPhxMp/+q8X2fZ4h3Tw0jMZzumeCCIGB1dRWe57EmAxWrkrgP/Zv0N0ZHR+H7PuezW60W35cR
-Z+PGGu/Z2Vn+d7VaRaVS4albFPLuzks7zn5xyqNHjzgfqqrqkdWNsixjYmJfqIT6EV++fInd3V0O
-s3eP2rxs473vOQSnfl73mNITHxuGfT0Hz/Pw5MmTE9XpqBiOeoo3NjbQaDRYwYv674eFrus3Snqx
-0WhwyP8ksYpCoYByucw/d29EyRM6CMnPHiwAymQyaDQa2NjYYM/bsixYlnXi7PfbhIPh3n8H2RX2
-MBpefxESEq2iNkdgf+PXbrdZyVKWZZRKJWxtbXEb6MbGxqH7ljxs4JPU2fz8/CHZ4XQ6fes22JfN
-jTXe3eRyOdy/fx+pVApbW1vodDo8yrK7KvzOnTvconDavmIAmJychG3bbLRp4R2GB3lasmEWTaF5
-6nwaDRQZJMVQRx3j0uEpSRRmPWnnTC0hpI4H7HvipGVerVYHmv52G6HknyrHAAAgAElEQVSJXGEY
-QtM0ZLPZYyMYsVgMhUKBe+kTiQRmZ2ehKAqeP3/OksDdiKKIBw8ewHEcVCqVngiIruscVdJ1HalU
-ijcEbwppXGzdin/BYflhoSgKHj16dOj+O2iYSf2QBs4cvFdIYre7U4FEgebn568kvXibuRXf1GQy
-iUKhANd14XkeDMPgalma7lWpVM5dDBGLxfCpT30Kn/70p3Hv3j0uvLiqIgsT1qmfQ+EwUgM7jqZg
-QBcOe3SCIAysjiQIAtLpNHvF3cVtnU7njQyd+b6Pzc1NVqsTRRHf+ta30G63j3yOoihYWFjAo0eP
-8PjxY8zNzaFareLJkyfI5XIwTfPQczzPQxiGePbsGdbX11l7/6OPPsLu7i7GxsZYMKNcLqPT6bC3
-/ibw/d734+vCf7uQY68LG3gUPLqQYw8Tz/NY538Q4vH4kQp71LPd/TeaVPjs2TM8f/6cI6AR5+fG
-e97tdhuNRgPb29swTRPxeBzFYhEjIyNYWVlBEASYnZ3FxMTE0HZ+VBxHOcN+sqyXgXaGatnuUHYY
-htyv3O/aqNLR18u27XPnRtvtNiu3vUmYpslSsxROHLQ9KxaLodPp8EIYBAF0XcfIyAhM0+T+b8qF
-b29vIx6PY35+HoIgoFwu89hXEpeJx+OcbqJ85ZvAnfAOfk/43QupBn9P+Gv8vHf9h5MMU6Y0nU4j
-Ho8figBRKN4wDKysrGBxcTEaSjIEbpzxpklVwH7VcqVSgeu6yOfzWFxc7JkO9ejRI54rPGxoopHr
-uqjX65ceNgeAb/e/gCfSh3g7GHz8Z/cIVQBsyKkGgHbgHwXP8H2pL/Y9RqlU4tz1eVAU5dwjPW8i
-JIZDqYtms4mZmZmBQ9au67JMba1WQ7lchiAIrH5HOgSJRAJTU1OcqgD2C4UoQgXsG3mKHiUSCVSr
-VQRBwJ/NbQ+j/33/h/BH0lfxd4L+9/pZeCp8hIc3wOsG9tcxaiUcBpOTk1hfX++7Idd1HbVaDSsr
-K8eO+40YjBthvMMwhGVZ2NraQr1eR6vV4qrHfD6PdDqNsbGxQ8+7SI+Oio1kWb6yUNCng0/jj6Wv
-4m0MbrwPQoszeYOapkFRFHwgPMGPij/W81jaLJXLZei6fu6FXZZlLC8vY2ZmBtls9tYbCuATSd0g
-CGBZFtLpNGRZxurqKlKp1ED6AST5a9s2RkZG0Gw22QsPggCFQgGTk5N97//x8fFD08No3CdVFnf/
-LpFI3BjBFpozTznZQdqQ7gZ38V/Fv8CK8GooGucWLLwSVvGz3pfOfayLptPpcDHasBgbG0Oj0eD5
-7geJermHx7UeTGKaJiqVCnZ3d7nHtVgs8gxm3/evzHPzfR9/+Zd/yVq+V1U5+Q3xG3gpLuPbw791
-7mNRu9D74jeR6YzgR6Z+BGNjY6wfTznZYV5zyruLoojZ2dkrS0FcNL7v4/Xr11hbW0MqlcLU1BQ2
-Nja4eI+4e/fuQP3p3/zmN1Gv1xGPx7GwsICVlRWMj4/zUBFVVVnz3zRNJJNJ1Ot11kWntjC63pRG
-6b7+tm3Dtu1r+5kEQcAboU6nw7PGLctCJpPpqbHofk6/TeIvK7+Ed8O3MBWeXZrThYuviP/lxszy
-brVamJqaQiwW6ylm7OYsnTT1eh3b29uwLOvQWkGbzrm5Oe7miTgb19p4u66LpaUlrnocHx+/Uu+s
-2WyiXC5DlmUUCgV88MEHh1ogroJ/p/waPh2+jbHwcPThtNSFOv48/Dp+NvgSHj58CFEUsby8jEql
-cqHvleRpHz9+fGGvcVVYloXV1VU0m02WjM3lclhcXES1WkWpVIKu67Asi6/BcSkJ2ghsbW2xwBAZ
-rVwuh2w2i3q9zoI1VBzoeV5PTzf17VLRWr92tVqtBlmWr8V9bln7BZrU305tj8lksifE351ao0hS
-PB6H4zgwDIOv/0H+nfJrGEUe3xZ8+tTn9kp4jSfCh/g599+c4x1eLo7j9GhVZDIZ7O3tQZZljI2N
-IZvN4smTJ8jn86cOrTuOg5WVFe5mIOgefPDgwRuZMhsm19p4Xyc8z8MHH3zA0oDT09N48uQJfN+/
-FsUXv6j87/ju8DuQC89efNJGG38o/n/41+2fwfj4OH9ht7e3sb29faFfNgojF4tFzMzcLi3ovb09
-rKysIJlM8gjZ+/fvA9j3fnZ3d9k4Oo7Tc+0J27ZRq9VgGAbP8CZdetd1IQgCZFmGYRhwHIcN2nFQ
-FwaNMu23MQ6CALu7u1AUBblc7ko3z3t7exBFEclkEpIkHRt+pcK7IAi404QG59D1orbRbr4qfRXf
-Ej/Ad4XfgcIAPdoddPCH4h8hH47in3n//Hxv8AxQ5IE2M1TjM2jagKBuBVLqC8OQ5x1sbm7i8ePH
-KBQKpzo313Xx+vXrQyqMlmXh4cOHZ2rXjfiEKPkwICTrNzY2hunpaZimiXa7fS08EgD4Ofd/xi8p
-/xYLuINH4cNTP39ZWMaSsIx/4/487KBXItOyrAtftEVRRCwWQ71ev3XGm7w/+rfneRBFEWtra/w7
-QpIklEoltFotLC4uQpIkdDodfPzxxzy4geR6ie7NYyKR4FqMQc/ruHoD8pRoUtRVCBIRpFEwyCaS
-zlEURYyMjLCWNtFoNNButw+lLb7ofxFf9L+I35F+B38m/jlGMIJ74QImwgkWLNoV9rCCFWwLJeTC
-HH7a/Z+g4Go28CSuQzUoruvCMAwuPh3UQPZL1VDdg6qq2NjYgGVZPeJYJ0Htja9eveJzIi2BN0UI
-6CKJjPcp0HWdF0pVVXm61nVpdfoZ92fxFenL+D3xK/j+4HuRwskbCxMm/l/xq5gMpvAl7+cA7C94
-rVYLwCeteJexYLfb7Vs5DrBcLvOktU6ng7GxMVY26y4SAz4Z77m3t4disYhUKoVGowHP86DrOprN
-5rGvJYoi60uftEA6jgNRFGEYBm8IDhYikhfm+z5qtRoEQRj6/HoK/h3nKZIe9klKdP3od66ZTAad
-Toen4B3cEPwT/58APmAIBj4UPsRfie+jgw5kyCiGRXxf8HdOTFNRLp7UGC8CTdN6FCOB/ZYtx3Fg
-mia3z54FRVGQSqVQr9cRhiEqlQpyudypHBZJkrCwsID19XVUKhWIonijiiCvM5HxPgWf+tSnen6+
-qqEkx/FD/g8DPvAb8n/EnrCL8XAMd7HYs9DsCXt4+Teew0iYx5fcn+uZUEYDRzY2NlCtVjkkexHQ
-nGnf9+E4zplme193giCALMvcb51KpXikqqZpPAO9+/HUiri9vY0XL15A0zS0Wi2YpnmiASNv/aRN
-paZpqNfrHFJ2HIfDsBRpIsNAmw0672EswJ1OB5ZlsZY2RQLoXiOjTiFwUvXzfX8oiz+10Jmmyedw
-UDksFabwhfAL+ELwhVMf3/M8lgamNIcsy0NNP8ViMT7/bqhocW9vjzcnZ/kOS5KEeDzObbFra2uY
-n58/1YaAilGprbbVag08RCriaKKc9xlwXRfVahXLy8tIpVLXuvWhLJTxVHyKLWETDhwoUFEMi/hU
-8KljPQfP83hzchHvjyYQUcHVzs4ORkZGMD8//0ZoHtu2jRcvXqDZbLLBolYvmvZFIVFa9MmbPi73
-2G634boubNtGPB7nsalHUavVoOt6jzGkcyCP++AwFFp8qc3tLFiWBdu2+ftD89+pewP4pPuBDDv1
-p8uyPNR7xPM8VCoVVhsjQy7LMmKx2LHvkaIp1ALVfa0ptVYoFLj3vtVq8VAl4qhRr4NSrVaP1Zmg
-1k6aBHZaTNPExMQEXNfF7u4uEokEJicnj6xQP4owDHlE8Nzc3KnPI6KXyHifgaWlJVQqFRbESCaT
-1yZ0fh2gCtbuymZN07iqmTyeO3fuwPM8vHjxAkEQYG5ubqiCEdcV27bx5MkT9iiz2Sznnmmq087O
-Dnzf5xnyVC0tiuKRveCkK51IJKAoSo/O9FH36N7eHjKZzKkjSO12m1X2KG+cSCROTK+YpolWqwXP
-8478rKm9LZFIQNM0BEHA4jJkhIbttVEuPwgCDjVTtT4J2FDlfvc1IONNwzpIf4KKCWu1GtLpNF9f
-km+mx9NrUn/6cQbWsiyWN5Zlmf9NffvHfYbVahWqqp65SMxxHMzNzWFra4vz4Hfv3r02NT9vIpHx
-PgPlchnr6+sAPpmlfNKErcuAxvZdZSifFvSJiQmkUik0m02srKwglUphfHycDQst+svLyyzlmc1m
-MTIygnw+fyvD54Tv+yiXy6wGSMNbbNvuMbp0P3U6HTiOg2aziTAMMTk52ddINptN+L7f0wZF09vq
-9XqPYaDCt0QiceZrTVK7juNwMV33eMh+1Ot1APv57UEEaa4az/NQq9UgSRLCMGTjTMJMB99Du93m
-Gda0NvTziqltjeRpfd+HaZrwPI/D7LRBIc357tqAg4Vf2Wz2xA1Nd+1EEARIJpMDe/ztdhsTExPI
-ZrN48eIFCwXdvXv3RnyOt5HIeJ+RVquFjz/+mCtw6Xf0BequyiVD1R0eOxgq6/d44rjHdv+d8pXp
-dPrSd8RkDOLxOEzT5Lzr6OgoNE1DrVYDsF83IAgCWq0WVldXWdKTvEyS/XznnXfOFUq8CVAOm7y3
-zc3NnsKjg1C+l67TwfC57/toNBrc902eGXnsiqKwZx+GIVqtFnK53NCKh4IgwN7e3rGT4mq1Gnvp
-N4nuiAiwX7x62rDxoK9DGxz6jlN6ofuaNRoNVug7Tf6Ziuho6qKmaQM/33VdPH78GK9evcLe3h53
-NrzzzjtRAdoVcH2TtdecZDKJmZkZrKys8M+UmwR6DWy/9pqDvzvu8Sf93G3cXddFp9NBvV5nuVPy
-Aii8Oez+Ssdx4DgOFzRJksTGIgxDFIvFnipymnRFo0WB/cIYeh7lCm97H+jHH3/MhjQIAmQymWPD
-zuSJt1qtvpK81KNLIiZUeEg5YpJQpXoDSZI4j949ba7RaLCXfppFmcLKR7WT0Sb3OteIHAUZVRK1
-UVWV0xnD3GQe5akfRFVVztFTYeEgnxW1ZMZiMTiOw50k5I3bto1Wq8WTALshrYFisQjDMJBKpTA7
-O3vtinbfFG7et+gaQbtxQRB6ei0B9ISw+oWzDv7uuMef9PPBv+m6jjAMuXKWjAP1ge7u7vJc3vNC
-FcOUhyNjTLntxcXFQ88xTZOFRCgcSCFGKvy57V43AExMTGB3d5dVwgaFRn3WajVugyJjTGpZdB/S
-4txoNADsG04Kc5ZKJViWBdd1+f4ggY9ms8kGfJC2MAoDy7J85AaE2oRarRbrpl93lS3aXFExGrXJ
-kUY9RRIue6NJ35FarcaV25Zl8dCbQVBVFfl8HrVajXXhqSCw33Q5TdOQTCaRSCQwNjaGzc3NI+dK
-RFw8kfE+B9SOQx7NdRqsIQhC39AkFZPR4IDzhLuazSa3edFUK2qJod81Gg02FvV6naUq3333XQD7
-u/mdnR3s7u5ienoa9Xr9zG0tN42pqSmMj49jZ2cHOzs7A30WhmHANE1kMhnIsoxyuQzHcaAoClet
-031I8pfZbPZQu9/u7m7PSNLu+5dajyiSkk6ne6rAu6EWP8qtn6TCRfoIruui1WpB0zQ+T+qJvqhJ
-gGeh1WrBsiyoqgrHcXhTSd5rEAT8mZy1n/osdIvr0GS4TqeDRqNxKj36g1KxoiiiUqlwoWM33RMJ
-JycnUa1Wsb6+DsuyMDU19UZ8Z68T0dU+I2EYotlsslzjTUEQBMRiMfi+j729PUxOTp75S0eh1lwu
-B0mS0Gq1eiIPNDpU13VMT0/zqMBHjx7xNUsmk4jH45iYmODK4mw2e+09smEhyzKmp6chiiJ2dnaO
-fd++76PdbiOdTkNRFNi2zZEKagnzfR+lUok/GxJhoQ0UtUQdDIl3bzzj8TgbVwCc3rAsixdvRVHg
-OA7i8Tiy2SwqlQq/5klQisS2bTQaDRQKBeTzeR6EQgVi1wG6tpqm9a0Ep+r/SqVyqcabXhvY3wDT
-BoO+32c5DpFKpWDb9qHHUfsgANY/f/nyJVZXVyGK4q1TRrzuRMb7jFSr1YGlGq8jZDyr1eqZw16d
-TgexWIzFM7rzsJRbI83y1dVVzosfJB6P88L38OHppV1vAxMTE6zEdpQBpOl1tVqNq56pzYzSI5SG
-oGtPnrhhGD0a6K7rHrtpo+NRC9LCwgIEQcD29jYPKxFFEdPT0yx7ebCV6jho47G4uMiiM5RX7qci
-RwprJBpyWVBNwEmjLCkldZlzDqj4jEbDiqI4lP53yucfvBcPaj5MTk4OpD0QcTFExvuMVCqVvnmh
-s/Db2m+jKTWhBgp+3P6JoRxzEBKJBFeeHhc9IEEN6kel3Xe30aWcIFVCt1otjI2NcS5NFEUOE0cc
-hhbJkzxXCiv30yPvdDrIZrMwDAOtVovDz5QTJSnWXC6HWq2Ger2OdDrd1+BS+1K73cadO3fYKKyu
-rgLY30i02218+OGHiMViXPk8CDS68/Hjx5yftSwLH3/8MYemyQiShCnl4z3PQ71ehyRJF9pR0Wq1
-EIYhp4JOgooDqb+bVOCGHUEgAR5ZlnnDFI/Hh5KycxyHr+3BJqR2u43R0dFD70dVVaytrfEmPuLy
-iIz3Gdje3ka9Xh9Ku8tX1C/jO1JfwKfEx+igg1/Cr+Bf2v9yCGd5Mt1iD/3wPI934DQbmR5L1eTA
-vhclSRLGxsY4fK7rOlzXRSaTQaFQOLYFKgI8Feqkxf5gZwHwiXY3tep97nOfg2EYePXqFc/yJqEc
-6kHOZDKoVqvY3t4+pCdPSm+KomBsbKynJeqtt97CkydPYJomxsbGOGVCw1RINe84HMfB5OQkh3cd
-x8FHH32EMAxZDIXodDqssd39O8uyUKlULqRdq1sJbdDj0+a33W6z0IvrulzJPSzD1mq1OOI17A1M
-d7TlYAqE7oWDJJNJyLKMtbU1lMtljI6OctrlTVBKvEoi431KbNvG7u7u0Poad6VdfErcn2GtQQMu
-OdVH0pMECYFQhfpR1atU+CaKIn9hk8kk3n//ff6iT0xM3Lh+3ovCsizOIcfjcfZUqaWrXq8fO16W
-Cspo1GOtVsPExAT3iKuqCl3XUSqVoKoqisUiH9PzPJYh3dvbY9nbXC6Hvb09HjhC/fbUSy5JEkZH
-Rw+Fix89eoR2u90jzkF530qlAsMwji0603Ud5XIZqVSK8/f5fJ57qA+Gaj3P63k+jfJst9uoVqu8
-KaHirfMadEmSkMvlWOXtNNDjSfa3Vqtxu94wvPBYLMaf57ALZCk1QEWKhOd5R1bUp1IpZDIZ1ix4
-9eoVgP2NwNtvv30txiXfViLjfUp2d3e5UGcYjPsT+Jb/BO9Ib8MMTeBwkeeFQW1CtDjbts0hTfLK
-+3nLlFsdHR3F5ORkzxd0enoa8Xj8TNOfbiulUgnb29u82aEOBVVVORVBAzqo6IgMWLeSFml753I5
-FItFFAoFOI6D169fwzRNNuwvX76Eqqp48OABdF3H2toaqtUqh84ty4LjONB1nVMn1CMeBAFyuRyr
-pvUzXt3tZt3k83nkcjksLS2hVCrx/Gy6j2isKOWHS6US0uk0S+V2K8+RYVJVlWdNHySRSPTIhdLw
-jH567d1QwZ5hGLwpoup6x3G4l/tgt8RpEUUR+Xye0xg0H/s8bZC0kbmozhZSRaR0F80/P+r7vLOz
-g729Pei6zmsFKcJRQWzExRAprJ2CWq2GpaWloYeD/rP6n1GXa9ACHT9m/9hQj30UFHrsVkULw7BH
-h/m4546Ojp5qtu+bzNLSEhqNxrG5Sdd1eTAH9ehT+93Dhw8xOjrKw2Ko+nttbQ3b29uYnp7Gzs4O
-G0jaGNy7dw+qqqLRaODDDz9k4RvDMDg3K4pi3+hKq9VCoVDAwsLCmd5ztVrF1tYWGo0GG0V6TdK5
-D4IADx484A1Cs9lEu93G9vY2T/vKZrOo1+tIpVLcukYa50eFoklz/KDRDYIAlUqFdcUpREyFlpRT
-J7XCVqvFXRDnhaRryXjTRopel6rED4oxUWRFURR0Oh3evF2E8bYsC+VyGb7v4+7du8jlctjd3cX4
-+PiRBWmvXr1CuVxmRUXqZKHpeZHnfXFEnvcpaDabF9LC8k+dfwocFsy6UGhxSiQSHK4llbiTCIIA
-W1tbGB8fj4pUBqTdbrPxJO3qbhRFYWNDnqZlWaxBDeBQxbNhGAD2Q6mFQoHbtaj6e2lpCbFYDAsL
-C/jO7/xObGxs9BSckbEigSGqli6VSlAUBeVyGfPz8z2eYqVSYZ11KuaiuePdjIyMQFEUPHv2DIqi
-cBiZpp4pigJN0/DkyRM8fPgQ2WwW6XQa6XQam5ubPPuZfAvqJadCMJqk1e/+03Ud1WqVVcCA/fud
-zjmXy/F7ouhAN7SxoBGlw+BgGJr+03Wd0xSO4+Brsa9hI7EOV/ibtiwJUEQFn/M/j3vBvQvJ8dNm
-x/M8ZLNZOI6D6elpFmM5jkKhgGq1Ct/3MTU1xWNlB1GJizgfkfE+BbTI3QaoL3iQCU20wFNYl/Kr
-kSjDYIyMjKDRaEBVVQ5ZHxfd0DSNB1RMT08fec+RQt3IyAgby1KpBNM0oWka9/JTDQL1k798+ZK9
-Ttu20Ww2US6XAYCNCOV833vvPSwsLECSJDSbTW6RJK+93W7j+fPniMViKBaLkGWZaybq9Tp3H1Cl
-O0UGGo0GUqkULMvC69evce/ePfbAx8fHEYYh8vk8tre32dumQjcK71NxWPcMcGDfIFNBXreWezwe
-R7VaRaVS4ZTBQSjkS9Gli/BwaRPW/bn+lvKbMCQD34Uv4HvD7+QwPr2vvw7ex29mfgOfcb8NX/BP
-P1sc6D96tNlsskgOSb3OzMwMnOtPJpOYmJjA5uYmWq0WFhYWIm/7kojC5gPSaDSwvLz8xgnw+76P
-ZrPJ4cTPfvazN0qU5jqwu7uLra0t9mapJ/co2u02xsfHkc1mj8y3tlotfPTRRxAEAQ8ePGDPjgqH
-tre3We+aZobPzs7C932sra31hIq7R9uSsaV+alLQo6EmB0O7BI2ABXo1zslANRqNnoE1pFBGbUnp
-dBrj4+OsvrayssLdDpR3pXoBgiIPpmkil8sd2hBRDQe1zR0Mldu2zXUDpJJoGAaSyeSlTcry4OFX
-tV/BDyh/F1PCyfnhP/O/hi1vBz/h/OSpXofU7GgDDuwrHtJnRDU8nU4Hmqbh0aNHA29cgiDAe++9
-x7oDi4uL10pt8rYSuU4Dsru7e21Uny4TWuCmpqa4QCjidNAsaio8O25hoyr0mZmZYx9HFdeu66LZ
-bLLxTiaTbHxevnzZMz1qeXmZF1aSTaUwp+/7KBaLKBaL+PDDD2EYBveHDxKdOSkilUgk2APXNA2p
-VKon5F2r1diwyrLMXjV5g/28OQqJ0+O7BwN1n1M8Hudpa2Sggf0KeeojJy3+kZGRS92g/6r+K/gp
-ZXBth++WvgsvxJf49/g/8JPOTw30nE6ng4mJCeTzeU5jUP1EIpFgw011CSfdewehwrxmswnDMLC+
-vo65ubmBnx9xNqLt0YB0599uO1RNbhgGNE3DzMzMqWb/RnwCLWgk4tFPM7obSZIwMTFx4uJJRsr3
-/b7pC03TcO/ePW4tymazePz4MUZHR7ngiQyzpml46623OL+ZSCTY4A9iuAeBZEapULJWq3EY3rZt
-6LqO+/fvA9hvFZufn2dFuJOIxWJQFAWGYbBhJih1QFXlVCxG50GFZBMTE0MdjzoIv6b9Kv6F8iOn
-ft5dYRF3lDv4qvTVYx9HCmxBEHAqwvM82LaNRCKBO3fu9LTiUcj8LAW5JL6kaRrq9To6nc6pjxFx
-OiLjPSAUSrztUEUuhTjv3r176ZrNtwkacUp9zycZZco/ngQJrWQymSOLgxRF4V5yqlKWZRmzs7PI
-5/PcDtTd1w2AhVeGjSRJiMViSKVS6HQ6PFClWq1yixyRSqVQLBb7amz3I5lMcqUz5XEBcGsava/x
-8XEkEglkMhluJ6Nq+MtkSVzCtDQJDWcTLvp28W/hY2Xp2Mf4vo9kMonFxUWeeKhpGorFIu7du4f5
-+Xk8fPiQjXcYhtjY2MDW1tapzyeRSPB17nQ6LCAUcXFEYfMByWazWFtbu/VFWlRQFY/HT1W4EtEf
-MhDkiRxnFCn/OGgF/507dw79rlarcVW2YRisBNj9WFVVMT4+DsuyAOx7rq9fv4aqqhgdHUUQBBxG
-HiaqqrIBp8WeCtgOGk9ZllEsFlGr1QCAPUgAhwrUCF3Xoes6DMPgULiiKBgdHUW1WuXjNBoNlvNU
-VRVhGLJE8GWpAP6p8if4celfnOsY3yN/J/5Y+mN8n/99ff9OETRqN0skEnj06FFPdIFmuJPUaqPR
-4OLK02g1UBscsP85v2m1QVdB5HkPCIXmbjtUwJTJZDAxMXHVp3PjkWUZ+Xz+RM+OxFNyudyxkQ5q
-Y6Lwu2maPSImW1tbePnyJTY2NlCtVhGPxzE3N3co/DwyMsJhbNM0ebQnsN/WRJ75MKDhNFQUFoYh
-t2GRmhkV0pEKXfd7NQyDW7+azSZarRbq9XrPY7sh1S9SYKNNiuM4aLfbEAQBtm3ze6YN1cGQ+0Uy
-jIKuBWEBH8tHe9+qqsK2bb4fyuUyPvzwQywtLfEQHOpooM6BeDyOkZERrK6uYnNzc6DzCMMQu7u7
-vEGlzzviYrndbuQQuS0tYichCAJSqRQePHhw1adyayCDRTKTpPBFw15kWYbneZidneXcYavVgiAI
-bPAonN5oNOB5Ho/UpL8pioLPfOYzuHfvHmq1GsrlMprNJhKJxJFh9YmJCXz00UeQJAkPHjzgnDeF
-1g3D4AWZ5m4f1MOnv4ui2BN+JeU4avGiynfP82AYRs8GhQrNtre3uX+bvHQSKhkdHe3ZPLdaLdbU
-1zTtkLhJo9Fg75ymlDWbTWiaxsIvlJulNIWqqj294RdFVahiUigO5ViBcPxwpHg8zvdNvV6Hruuo
-1+vY29vD48ePkc/nuVBxZ2cHr1+/BrAf3aAxp93zvg/y9OlTLhQcKXsAACAASURBVHikz9T3fZ4X
-H3FxRMZ7QGgE4m2ne15zxHCYnZ3loS3NZhPLy8s8T5tCt7quY3x8HJ7nsUgJ5aPJUAZBwHKjZMSp
-v9vzPG4DIkWsUql07AKaSCSwsLCA9fX1Q/e2pmmYnZ1Fs9mEZVloNBrQNA3JZBKWZfGCTcVv5KWR
-kafwOLWbFQoF3ri4rntoqIgkSdyqVi6XWbZXVdW+kQiqqm80GmxwKVRLG4ru41PBGkHh9XQ6zUZe
-VVX27C/S8NRQw4hwtEE8DfIAwxC65xd4nodYLNajbHfwsVTU1263ORp0FDRXvjvFQh5/xMUSGe8B
-ocpcGsd3W/F9/8I9jzcNkr4E9g3K+vo6gH2j7jgORkZGYNs2Xrx4gVarxepex5FOpzmPS7ljktEE
-9lv8Op0OisWjPTxZltnQN5tNbGxscD6acp6UA69Wq0gkEojFYmi329z77zgO5ufnUa1WIYriIaPX
-6XR6NPLJa+90OqjVaocMA53/oPn2TCYDy7LQbrc5GmHb9qGK6YObEwrdHzzfRCKBVqvFrWsXoRSm
-QIGL4RR0hRi8A4bSItPT030N8sTEBJrNJtdJxONxVCoVjI2N8ZrXarVYZIc8epotT1Dr3mVEMd5k
-bq8VugAymQzq9fqtDQeR9xYNFbk4dnZ2uOd7eXkZQRBgY2MDrVYLsVjsTOkZmqbVXQwXj8f7FrQd
-9XzLsli8RVEU3Llzh0eF0uS4bl6+fAnLsjAzMwNBEHoGUxw89sEojiRJSCQSHM4+L6TfTprt+Xz+
-xGr5RCLBOt4kFENiNLlcjj3w7h76YTEZTuIvwq/h80M4lhcOPskoDEOkUqkjdcqB/c0lbQpt2+6Z
-SR6GIVZWVmDbNn+m1H5Hfw/DkIfeREVrF0tkvE+BoigIw5ALO25L3zON90wmk0in05emLvUmUq/X
-oWnaoehN96I3CJVKpWeKE00oOyvFYhHj4+PctnWc5yuKIrLZLCYmJjA9Pc1T0fp5vLZt9219G7SH
-exCoMv648G43QRBwBI0ME1Wh00AYQRBQKBT498P8TsiQUQ1qQxn/mwwHdyREUYRhGHjx4gXm5+f7
-bnCo4t6yLM6HU4FfqVSCbdscFu+eP0+1AzRqlqRyIy6O6Oqegnw+j3g8jq2tLdTrda7MvslQfnJu
-bu7YHXnE+Wi1Wtje3kar1eqbw5Vl+UQBl24op0wc1T51Gvp52P2IxWJ46623+Ofd3V202+2eECmJ
-gVCv8UH66Wyf57xPc+1arRYMw+i530nbO5VK9eTHwzAcWtV9NyP+CJpKE2mc3av/Q/+P8H3uFwd+
-PK1VlALpl1LRNA0PHjxgkR6iXq9jdXWVaxjI+xZFkaMTDx8+fCO0MK4Lt78Ca8jEYjEsLi5ienqa
-q2tvKu12G5lMBo8ePYoM9wWyvb2NFy9eoFarHdkGdlCk5CTIUwf2F9x2u43l5WU2pIMas2azeW7l
-wHK5zKFzYN/brtVqrHV9lAIcsH8Pnhcy3oNGHnzf57w+QZsnz/N68uP0mQzbgP9z90fwe+6Xz3WM
-LX8bs+Hpx/ImEgns7Owc2RqXSCR6DLdhGFhdXYWu67zposFE+Xwed+7cwczMTGS4L5nI8z4j2WwW
-L168gOu6CIKARw3ehFARKWpNTU0hn88PJXpwMOcasU+lUsHW1tZA4yWpLWyQroZUKsUjajVNQywW
-w97eHkzT5KlV2WwWIyMjfT1fy7Kwvr7OVeSpVArT09NnuhdIYpQMXBiGiMVixxpTKmLzfR/lcvlc
-dRZUsDdoN0gYhoeuCY1ppZoW2ohIkgTLsuB53tCVBu+69/Gn4p/he6TvPvVzf939j/hR5+wiL5Ik
-YWVlBTMzMycW5cViMaTTabTbbU41kIRtJOJ0dUSe9xlRFIW/8PF4nLWVqRrzIFQFe9UtFDScYXZ2
-FlNTU0PrX7+I0OJtgFq6jvKqSUPesiwemTkI1GpGM79pYaWBJZIkoVKpYHl5ua/O9NraGprNJuLx
-OD92aWkJL1++5P7ug8Y3DMND4huu68KyLDaetPkwTRO2baNcLh/pXScSCaTTaei6jkajMdD77gel
-r046BvWYU8HgQeh73P0eqa89m82e+fyO4ov+F1Fx6/jz4C9O9bzf8H4L3+F8F1Lh2Su5JUmC67rY
-2to68bsryzLu3r0LXdd5WMxbb70VGe4rRvqFX/iFX7jqk7iJCIKASqUCRVFYerBbapBkCUnViUQ3
-6ItyWTKMB3EcB9PT00MPkw9bSvO2sLGxwUVQB/F9H9VqFZIkIZvNnnojRfee67qwbfuQJjkt0PV6
-HY7j9Izg3Nzc7AnVK4rCuuCrq6toNBrY29tDq9Xigsb19XWUSiVUKhUet9lsNjmykMvlYBgGVFVF
-MplEKpXi7wQZxKMiUzQm9KwIgsCDX/pdx3q9DtM0IYoi4vF43+8fqbl1RwEEQWD51KOmm52Ht4O3
-sRwu48+Fv8Bb4mMIODp1shau43e838UPdH4Q98J7535t6tGmfv3joHtpd3cXmUxm4OLAiIvj+sd4
-rzG6rvOs4Hv37mFlZQWu67IXTguEIAicY6OeWQBD3blSvk6WZYRhyKGtbqiaOcpvXw6kNNbPYJFc
-qKqq565ktiyrZzBEN7quw/M8NrqpVIoXXs/zeowR9WDLssz5TcMwejxaXddhmiaP4KQRppQ3TyQS
-vFEAwP+n6AJ5bt3QxD767pwF2jz08/KpJz2TyRx7/CAIWPCm+zNLJpOsiOd5Hiu6DStF9gPe34Pt
-2fi/1N9CR7SxIM1jTpiFLuhohA08D16gFJQw7c/gZ90vDeU1CRrKMki6ZnJyklMsEVdPZLzPgSzL
-PMSD1LKoCrP7Bu/e5dOXngqKqLeaRjQeB/WiUm8lGWcaqUieFA0koCIeKjAh5aSIy4EmWnUvjNSm
-ZFkWNE07t+GmDcJxkRzKgQPgwRPdcpbHnX+/45LkJrBvnLuV3FzX7ZsmSKVSHGI/2DttmiZPs0sk
-ElxJf9pq9Far1ff+ptz6SRsDmv521NAT6ie3bXvo4XQdOn7C+UkAwJawhXVxDTZ2kQ7T+LvhD5wr
-RH4SVFF/kn6FIAiRBsQ1IjLe5yCfz/P4zEajwZrJJ5FMJmEYBu/kDcNALBbjDUA/TNNk4QPSiiZD
-7vs+FhYWesKO9XodpVIJ+Xwem5ubPRraEZdDpVLhaAeFtj3P4+KnYURestksR1oG4aT0hiRJAx2r
-VqtB13XE43G4rsv1HrFYDNlstq8XR4NILMvC3t4ekskkG454PI5sNou5uTk0Gg1sb2+fKhVDoXnq
-SabIAUU3TgrJ00b3OEEWihCk02lOWZCM7WmV2CgK4TgOZFnu2exPhpOY9CdPdbyzoqoqTNPE9vY2
-7t07fyg+4vKIjPc5yGQyGB8fx87ODtbX11EoFAbyFii0bRgGdF1HsVjE3t4eFEU5tGBRv+zc3BzG
-x8chCAKH9ahvmPSxu8lms+wVNJtNVKtVNvy0oEVcHBsbG9jd3eUCKMMwkEgkLiRXSCmTYURVyECd
-BMmkxmIxJJNJ9kRPEi8SRZE3LaTIpSgKCx/F43Fomoa9vb1T3aekrEYyqbFYjA3tIEWA5P0fR1No
-4rn0HLqiY0waw2RsklNkNMRjkLw9GXyal0BRmKv6Tqqq2reoMeJ6Exnvc5LNZlGr1dBoNFAsFhGP
-x/nLeBwHd+rkwXRD8oQH2zkorHecbnU3mqb1LKimaUbG+4LY3d1Fs9lEs9nsSWN0D84YNsMUC6KC
-tpOg3DeFqsMwPFUkofuxiUQCpmnyHG6aP768vHyqc9d1HZ1Oh+eZD3K9qare87y+IXAbNv6T+tto
-i20UxQmMa2NwAgtPxW/hD8L/B57m4dvlL2DRWITjOLwJoO8zpU5ok0L68/F4vCeVUa/XIQjC0CIy
-p8F13ajg9AYSGe9z0Gw2sbS0BFVV2XuYmprCq1evDhW9nARpLVMI0XVdpFIp3L9//9zn2Z2D7M6V
-RwyXra0trK+vcwshXWeKsFyk1vOg/eH/P3tvHiTZftV3fu+aN/e9Mmvvqt77vX6r9JDBjjH2YGR2
-BHjDQ3gQIAeMwfbAzDCMB4IZHMyMbRh7FsBgIbawgREgwBaLQ0K2dpD0Wuq9umvrWnLfbmbe/c4f
-xfl1ZlZmVmZlVnV11/1EKPS6KpdbefPe8zvnd873exSjfj8o0FiWhZmZGdi2jWq1euxZaApmGxsb
-WFpaQiQSQTabRaFQ6NtBPujvjUajzKOc+jwGoes6UxvrN6b3e+LvIS/t42+I3wqRbpV/XtwwTRNv
-ue8Ez/P4uPJJfEr6JL5b+x7Yts2kQ2mbJBqNssBOkwWd94ZwOMycuWhK5TQlijmOw8WLF0/t/Tym
-gzfnPQEkp0hexfV6HX6/H/F4/Fhzz9TcBBxcUEtL46snDTpOel1N02CaJlRVxfb2NtbW1qbyHucd
-0zRRKBRY8KpWqyiVSiiVSqxRq3dGelpQCXZarzUq1KcxNzeH+fl51hh2XKh8u7m5iXa7jfn5ebz0
-0ktIp9NQVZWNXlKAG6SZQB3jvZWsTizLQq1WQzKZRCQSOZTt/pL8S4j6wvg74t96Grh73oOy1S93
-34Vvc9+D/1v+v6DhwCOAZsbJiRAAy/A7qySapjGHLp/PNzXdhVHRNA2BQODU39djcrzgPQGiKOLK
-lStIJpPQNI017czNzbGgPg6BQACGYTDRi2ldUJ0dtIIgQBRFPHr0CDs7O9jZ2Zmau9N5pdVq4fHj
-xzAMg5k/0L5rMBhENBpFOBxmgizTxLKssaRBj4LmskfFtm22aMlkMhMFb+Bgi6fdbrNFjyiKWFpa
-wurqKoLBIEKhEGZnZxEKhQbu8VcqFUiSdKTCWyAQ6Hs+flv6LVySVvBO/s0jj5eqLEF/EN/Bfzt+
-wffzzOGMmkOpTB4Ohw9tl1HfQDabZZKjk8rVjstJ2J56nDxe8J4QQRCwurrK9stIzAEYL4sBno6j
-6Lo+lj71UZAACEln+nw+vPzyy3j99dextLT0wlqcnhalUonpljebTTSbTZb5ka82jQ9yHDeRmlgv
-lmWxccBpQU2Ro+Dz+VAsFlEqlZDNZhEOhyfWK5ckCdVqFZ/61KeY93k6ncalS5dw+fJl7O/vI5/P
-IxAIQNM0NJvNrr1rAF2iNzRi2buYprG0TkXECldBTarhDf71sY9bURR8Y/Dr8OGZD8Pn8zETD8Mw
-wHEcwuHwob3lfufuNIO34zjsc5rW/cbjdPCC95Sg0iXtay0sLAAY/4IIhUKQJAmXLl2a6kz24uIi
-bNtGIpGA3+9HpVLBxsYGVlZWprJXep7pdArTdR2BQACJRALRaBSxWAypVAqyLLOqh23b2NnZ6Suj
-Oy50451mSX7chQDpkwPAwsICZFmeKABRh75lWYe6oPf29phS2srKCq5fv46VlRVEo1HwPM+sKakD
-n3QUSAa28zPnOI6ZuhAflD6Ivyl867GPfY6bQ1M8GJkjJTfqzK/VaqjX6+xckS0pBXTaJz+t5jHH
-cZgSXqvVwhe+8AVUKpVTeW+PyfEa1qYAzdmSxnSr1UIsFkO73cbGxsbQ2dFebNuGz+ebupZyMBjE
-O97xDlY+J+WscRvrPLp58uQJ8zimqsuwRZeqqkzBrNlsdmU+x4W6tckQZNLF2LiLRr/fj1arxQxG
-gsEgarXaRA161LxlGAYqlQoLvNvb23AcB7ZtI5fLYWFhAYFAgKkG0r446bt3Yts21tbW0G63u7Ya
-aP9cURS4wuTbD39J+Ap8VPgo/qL1F2GaJiKRCMLhMHtfKpULgtB1rqjn5bQmQZrNJlZWVgAcfI/b
-7TZarZYnffqc4KVcU4Acdmjve2dnB8DBKNfc3NxY+5wkFHESAbXzNaPR6FQ9lc8jpVIJxWIRgiCg
-Wq2yTGYYJGySTCYRDAZZr8QkBAIBhEIhpl7Wy7j74ePuewMHAX93dxe2bSOZTLIO6uMiCAKi0Sgq
-lQru37+PtbU1ZktJ3eeFQgH3799HsVhk70V72f0WIIIgYG5uDqZpolarMRVCRVGgKArWuXVc4ScX
-KlnmlrAmrEEURQSDQZZpk5GM3+9HrVbD/v7+oYUWz/MoFAonngG3223Mzc0hk8nAsiy0223WZOfx
-fOAF7ylCTTV0YwCAmZmZLjnJo7Asa2or32q1inw+j8ePH2NjYwN7e3ts3y8ajeLNN9/05FIngDr3
-6TMUBIF1Dg+CFPGAg+7qae2DU7+EaZqoVCpMz7vRaDAdglHL9McN3vR3JRIJXL16lY2SHRdq2iTl
-NBr94nmeWaw2m02sra0hn8+P9JrhcBjXr1/H7OwsE5ghdbNtfhtL/OKxj7cTgzu4/ju3EGj+vFwu
-w3VdJBKJQzrhwWAQmUyGVfH64TgOKpUKisXiscRVdF1HIpHA4uLB30r9AKTt7vF8MNX07rx7OvM8
-j2w2C8dx2L4VeeF2jhENY5AD1Ti4rovNzU3s7+8DOAgywWAQruuiWCxiZmYGsix75bEJodFAslkl
-jfph3budwRs4CHqhUAiqqqJSqSAcDo9ddTFNE81mE5IkIZlMAjgoiebzeQiCgGQyyfy22+02wuHw
-0NI6Ccsch42NDSwuLkKWZaRSKWxsbExURaJGP2riJAMT0vcnC9RyuQye51mvyTBCoRCuX7+OjY0N
-VCoVVqY2OAM+TGm/+c8vYb/fz0bbTNPsakrtVx6n+ydJKNMIG2mq+3w+uK7LKhCNRgOGYQw1C7Ft
-m8mwAsD8/DwymQz7vc/nQyQSQS6Xe+aWxR6jM7Xgbds27ty5g+vXrzNv3/NI50VBpFKpkctgZFk4
-KlT67lw43b59G5VKBel0GrOzs9ja2mL7hJqmYWtrC5Zl4dKlS57D2DHJ5/Ns77JarbKGtKP2K8lI
-pJdQKATDMMYWdCF/6t5Z3XA4zEahKMjJsszminv1tDsZ5D3fTxild8FOxidvvPHGscxFeuk0VaFG
-NFVVUS6XD5lklMtlzM/Pj/ye0WgUuVyOnbOYG0XVrSLOTd5vwrkHCyCqPJTLZSiKgtdeew1bW1vY
-2dkZ2sxKDm+lUon1U9DceOd5pi0bMjwSRbHrfBiGAcuykE6nh1p5Li8vo1qteo5hzxFTC96CIODK
-lStotVpYW1vD/Pw8UqnUuc7EiUAgcMhdahCapqFcLvddBHRSr9dRKpVYac1xHFy5cgWKomBhYQEX
-L15kAeDmzZtwXRe5XI5Jd4ZCIWxsbEDTNKTTaU+kYUzu3bvHhHioi5xcqYZBC61+kCpbs9lkjU7D
-oFJ7NBoduMdL5hwUSP1+P8v8SqUS64ruPcZ4PH5oITJK8AYOyrIk7TvN3g2a6OhUryMsy8LS0tJY
-i4VIJIJMJsOy7wv6Cj4mfhQr8oWJjzXkhNBqtZBMJhGPx5lZSzAYZNsJwxZ6pMRmGAbq9TqzS+3d
-hvD7/WxRnkqlwPM8a14EDsyTaOtuGD6fD2+99dbEf7fH6THVsjl1eF69ehW3bt1CoVDAyy+/PM23
-eC4hC8ZRbmSj7Dfmcjmsr68zlSfqnKXX79epznEcstksstksdnd3sbe3B0mSkMvlkMvlkMlkMDc3
-5y22RoQ8nTszZMqMjmKT28SHlA/B4A3wHAfHdZGxZvD1xjdAkiREIhEmVEJl8E4cx2Ha6UfdlKlh
-qlMqVBAE1pyk6zoqlQqTCCX6WdQOWiD0Oz5d16EoCmZmZrC3tzf1xWGvShm91zgIgoDFxUU4joNa
-rYaFyAJyXH5iqdlPOJ/Cl9nvgs/nw/Ly8qHrPp1OY3Nz88j3oAkWjuNYAK5UKiiXywfCMMEgm264
-du0aZmZmoOs6bt26BY7j8Morr3geBi8wU29pptLNq6++is3NTTY+cp4pFosjNwCJoohGo4FMJjPw
-4qbSKt3ATNPE0tLSyFlONptFo9FAsViEKIpwHAfr6+vw+/2QJImJSvA8j3g87nWk9+HVV1/FvXv3
-WHlzVH4z/BuIJ+L4B6Hv6/r5vpvD+1vvx7va78J1XEcwGIRlWcjn8yyjAg66hCkwjhIQZVlmal+9
-VQFJkiBJEjRNY/vhpmlC1/WJx7woqM/MzEBVVdRqtWPrnndCndGk/U17ucvLy8d6PRJZosz28vZl
-bJibWOVXjn2M96z7eKv+LiTnk32vyUAggNdeew1ra2sDRzWp2ZAybTrX0WgUlmWhXq+zUbPZ2Vm2
-cDEMA5FIBOVyGbVazdsWe4E5sQFfXddZk0UikTi3e+DAQemqXC6P9FhJkqCqKprNZt/9p3q9jkaj
-wVbUNBc6zkXK8zxCoRDS6TR0XWfWhLIs49atW0zsglSiel3NPMAWN+ME7l/z/Sr+cvC/wCX70qHf
-ZbkM/mHw+/Ez3M8i3AxjwV1gY2fVapXJZpLgyDgZVe88cS+KosDn80HTNLTbbaRSqYmEQkgGNhQK
-MQnh9fV15PP5Y6v5kZWtbdtdcr+WZfXt2h4XWth8Z+y9+O/2fgir4vGC9x9Yf4h3tf8CVlZWhl6T
-kUgEs7Oz2NnZgSAIh75H1JcQj8dZ82E8HofP54Moil1mQ53bK/l8HuVyGYIgsMrNeb73vsic2Fl1
-HAfBYNBT8MLBxbWwsABN00bq4nVdF0+ePIGqqgAOblDVahVPnjzBxsYGG/fqLE+OE0Rs20YqlUI0
-GsXs7CzS6TTbE52bmwPwtMvXcRzcu3cPW1tbAA5KlHRc5xmyWR21orLOrSOtpHFDuDH0cX8/8D58
-2P8fADwtbwMH3eOyLCMSiYxdCnUc58jtkM798EkVvqiJr5NMJjPycVOmXqvV2EgUNWVFo1EWrCzL
-mqoHAHDwWf311tfgV61/O/Zzb7lfRN1o4t3Zd2NmZubIa5J0IHpH+OjvikajrLGw9xonpT5yMCNU
-VWXXLe2zj4NhGBPL23qcDsKP/diP/dhJvDCpHp2kDeLzAs/z7IZTLBZh2zbL3PohiiI0TUMul0O1
-WsXe3h6KxSJqtRo4joMkSXBdF+12G6qqdjWnHYXjOLh9+zZ2d3dRrVbZ6Mrt27extbUFVVWZTCPw
-tImK9hXffvtt5PN5RCKRc9/klsvlRrbQ/JDyIfzXwb8HAEf2P5RRgqz7EEaYGZyYpolQKDT2zdg0
-TeZYNQo0jjTJVglVbiqVCpP7JclTUpgbBFWoBEFgXfdkMtKZYdJc8uLiIjKZzNS2dhRFgVWy4Lf8
-+F3+d/Gq8MpIz/uI/VGst7bwvf7vxfz8/MjvFwwGUSqVoGkay/4bjQabZQcOFlZUeaAGNp7nmbyq
-ruvsc6Zx0EQigWQyOfZC78GDB9jZ2UE+n0cwGPR8vs8wJ6qLed4z7l6y2Syb+a5UKnBdd2B3cmd5
-TJZlyLLMGmvoYtY0Da+88spY89o8z2Nubg57e3tMlIHjONy4cYPpSVuWhSdPnuDq1avsOCjbn5ub
-G6lR6rwwatCwBHPkx79Lehc+Jv5nzJqzXT8/zuw1GXaMyiQz3p24rou9vT34/X4mwTk7OwtVVdke
-O33/aLyJFrS9c+iCILA5b+oFIJGTkygLBwIBrFZWsYIV/JL7ASSEOL5GeDf4PoXKL7pfwmetP8NN
-9RV8t/JNTPhkVHiex/z8PDY2NtjPSAud9uGBg0U3yb6Gw2E2RWBZFgqFAsLhMJaXlzE7O4tEIgFJ
-ksb+XBzHYWOHrVZrbFdEj9PFE7U+RWivORQKIZFIYGtri62e+2UjvaXOdrsNTdMwOzvLlLyOU9lI
-pVJIJpNdgYTELohsNtv1HPrd6urq2O/3ItJut9ke9CiTBJ03fiq3D7q5hrkIWlx36fK4jk/jNtTR
-eNkkkEyrLMuo1+usf8Lv92NpaQlf+MIXmGIaz/OsimRZ1kABGZ7n0W63WQd2JpOZmt99L+l0+mAu
-Gwq+R38f8lwevy39Lqpc9aDSAg4OHMiOD6/Zr+I7m+9FMBjEhQsXjjWt0buAJ+0GujdwHIdYLHbo
-O0NNiKZpYm9vDz6fD9ls9tjZMr02JRWFQgGJRMJrWD2jeMH7GRGNRnHt2jXs7e2xbITneXYht9tt
-OI7DjCZc14Usy6yhrddisFOmc5QVt3dBTkaj0WCNQTzPs7nsQVsJtvs0+FLQH8S2s4UZ++mcv6qq
-UBTlWIGBhGRG5TjSqL1YloVQKMTG1NrtNvuexmIx+P1+uK7b1bwWDAaHKjSKoohoNIpsNssat04K
-8tUmZtwZ/B3j2/s+1jAMWM6BCMpxj6nzWiSNcY7jUK/XIYoiO3+91zVZpyaTSaiqivX1dXAcd6RG
-xCCoLE+SruM2ZHqcLl7wfoZIksSyh52dHdRqNTSbTYiiiFgsxrSySb+4VquxETHKwmnem6wQXdfF
-3Nzc2DOvHuOhaRpTNRMEgbnJKYrCAjOp2gFARIigpJQQ+3P1rmFNZB/RP4r36N8C0zVZBzjJZI5D
-uVxGIBAYOXhToJ2GvjW9Bs/z2Nvb6+qQT6fTfRUHB30eJPhy48bwZr9pQeYm9Xp9aF8HfQdoQTHJ
-+/E8j2aziWw2i9nZWTx8+JBtlQ2CpHnpODRNw9raGoD+So9HQTKqdJ6OuwjwOB284H1GmJ+fx/z8
-PCqVSpd0ZaVSwePHj9FqtTAzM8NW361Wi11klLWTete9e/dQq9Vw+fLkDkkeh2m1WqzZjzI00qIm
-X2vKWEia9Kvb78b7hQ/gH/i/D67rHiqzk5RmwS2gUT/QOad9S+o2HgeaHx41cNMUAY2NHRf6O8hV
-TFEU1Ot1bGxsYGlp6aAhbASzEtIwt20bwWCQTUGcFouLi3jw4MFA5z0aWbt+/frE76UoCm7evAnL
-sthnn0wmsbu7e6TKHn2+iqKwWfrt7W1W+RgHmjABxpdp9jh9vOB9xuhdwcfjcczPz+PevXsscJNj
-FD2WAkE+n2ereK/Z5OTY399Ho9E4pGQXDodhmiYMw0AqlToUoN9pvxO/7PwKvsv/3q6fU6NQwS3g
-A41fxrfsfwuC0eBEN89xDSaoZD3pvDT1ABSLRZimySRNGkYNTQAAIABJREFUqbJ09epVRKPRoTao
-rutC13XE43Gk02kEg8FTb35VFAXxeBx7e3t9gyC5qA0SWRkXQRC6Kg+kVd4v86bvCzXuWZaFVqvF
-Pmue56Gq6tjBWxRFZLNZ3L9/H7IsI5/Pw+fznXudjrPKiY2KeUwPGgMhgRZyJCLxjkajAVVVEQgE
-EI1G4TgO5ubmjlVq9TiaQCCAQqEA13WhaRrr0O/Unu4nRpJ1s1BMBb/m/hpUrokUl4ToiHhkPsJv
-6h/EffsBvsv6LliWBb/f33Uzp/NORiNHlbYty4JhGCNrAJBS2TTkNKnMT82Z9LdomoZqtYpsNst8
-xzuPzbIs6LrO3MEWFhYmHlubBFEU2VhWP+jzPYkMNRAIQFVVtFot2LbN9qGpka1SqTA3O9M02Ugg
-SfTqun4sdbVgMAjTNFGtVlGr1VCtVlEul+H3+8/9aOhZw8u8nxPm5+eRTqfRbDaRy+WYhCldWLFY
-jN3QaZzE42Tw+XxMQRA4yIQoSMmyDMMwBnaTX3Qv4mLrIh41HuG38Ntoui3MurP429LfhoCnDYed
-e890gw4Gg0wDoFqtsqBIPyPou+G6LhqNxpGlVwBdJdtJoPfuLdeTOU+z2cTm5ibrGqcsm8YhZ2Zm
-kE6np2poclxI751EU3rp9BOYNmQOUygUmOkNAOYM108+2bIsNJtNZk5Sr9dHOvf9XkMQBGQyGezv
-77NATpK0HmeDZ3+FeIwM3eDi8Tja7TaazSbu3buHYDDYlYm5rntsgxEqBXriDMMRRZFpeNM8fqPR
-YEGJ9MEHdVDP6rNIGklEIpFDN+FgMIharYZyuYxwOAxVVbtG+RRFQSgUYiVT27ZZIKfxQUmSkM/n
-WSPjsOy1c3EwLr1l42HOauRBnc/n2eSEoiiYm5sbquX/LPH7/cjlcgNlXSftzB9GJpPB5uYmHMdh
-FQhSYzNN89A12ukVL4risRoPRVHE/Pw8bt++jUQigZWVFWxubmJnZweGYWBmZmbsBYHHyXD2rhaP
-kfD7/UilUlhZWemaAXYcB4FA4FjBu91uY21tDZ/4xCdQLBZx79491unu0U02m4Vt20zEhrr/ydyj
-1WqxANwrN0ldveRM1osoikgmk9B1HYVC4dACgEYKSSwnFAqxKQRZllkHfCwWY0YmwyCJ0V5J06PQ
-NA2FQgGFQgHAQeCmMbFBdGrC37hxAzdv3sTs7Gzfz0HXdWxsbLAmwGfBsLlpURRPtJRMzYpkFnP5
-8mVcvnyZTZd00jlbD4A5DR6HZDKJxcVF8DyPRqOBpaUlrK6uolQqYX19/diaAx7Txcu8n3Pm5+dh
-2zZ2d3fh9/uZq9CowZtGnJrNJur1OnNA03WdBZ7l5eWRnOEmtVJ8nlhaWmISoJQZdZq3kEJVLBZD
-o9FgQR44KC3T7wCwfXJq8KL/JmOKcrl87BsxZdVHBRlqwBqHTklPOuajmsvo76IssTNrd10XpVKJ
-9XZQT0EqlXpmzoSKoiCVSrFxt15OsrxPErG2bbOxREVR8MYbb+Du3bvseqOqTzQahc/nY/vfo3T1
-90KStisrK3j06BH29/eZJ7hhGNB1HfV6faLROI/p4AXvF4BsNotHjx4xkwJJkkaySCSzE5otpzll
-27axv7/PMqjHjx+z8SbLspgbWaVSQb1e78oMV1dXz8R+5UlDHsr3799HqVQ65LrWeaPXdZ19RpR1
-0+8bjQba7TYTLqGFk+u6bDTwOFUUTdOYQMtRimnUdCcIQpckJ416DYIWLfReVPUZBpmWOI6D3d1d
-AAefD70Gaes7jnNomuJZkclkUCqV+v7uJMvmANg13fn9kiQJiUQC29vbzF2MmtUMwwDP87h48eLY
-e9SWZeHu3bt4+eWXIUkSgsEgdF1HLpdDPp9nQlHeCNnZ4MW/y54DeJ5n+9605zpKgwk5CIVCISb2
-QFrn9FrAQYPW5uYmgIMLfH9/n3Uz27bNMqSz0mh0mly5cgV37txhgY6U8ToVxKgkTc1swFMN8Wq1
-img0yhoMNU1jfQcEBdZxoHNDzWzhcHjgvrdt2zBNE36/H+12GzzPM/ldmrMmSqUSC9ok90uNaKPY
-fcqyzHoBDMNgAYjneVYmpu8vfR7T6ICfBJp/puZQOi5qLDzJ0jlpjfd+tgsLB5axjx8/hmmaiMfj
-bCtmdXX1WMf05MkT2LbNKiexWAzLy8vY2dkBcKBNT8Y1Hs+e81HjfMERRRGZTIbdEFVVxe3bt1kZ
-tF6v4/79+3j06BHa7TaAg2yHAgo9hrK8WCzWVUIlsQ+/389METiOQygUQjQaZTfkQCBw7vbDOI7D
-/Pw8RFFEoVBgmRB1nANPdeEDgQAymQybXaZmr87sTZZlCIKAYDCIZrPJgtc4i6LOc0ABtjdw03uq
-qgrTNJFMJtkirtVqsZnvdruNcrmMQqGAfD7PAhl1lHMcx5TARs3IaKFCXvLkbEd/I8kB02d3Frqc
-+1l8zs7O4v79+2yhcRLQ1ko/3YZYLIbXXnuNGQcJgnDswN1sNrG3t4eVlZWuRWcwGIQgCJibm8OV
-K1cQCoVw9+5ddh/xeHacrzTpBWZpaYm5hT148ACSJOGLX/wiZFlmjUQcx6FUKiGbzUJV1S4hB5Jc
-FUURzWZz6A2gV1CCbtqVSgWpVOqQeMmLTiwWY6M55IdNXss+n485Z1EQp0oJZec0BkS/A8C2Mair
-eJzMmwQ8wuEwK6N2Yts2c6cDwLJJKle3220kEgnIssyMKSjT7Ox4J8jycxxIkU5VVdZoR8eTy+W6
-Rh3PQh8FybtalsX27emcbG5u4tq1aydSISBp2AcPHuCll146NAJKCzXbtnHp0qVjBW7btnHnzh3E
-YrFDhkTpdJrtcauqikKhwDJ9z+752fLsrwqPqUCl7kwmw24s1BhFvsczMzMwTZNl4J3lUGo0Iv/o
-4whjiKKIt99+G9vb2+cuAydjCgpuruuiXC6jXq8PbOQjRSzaeiDovFEmOk5QoD1z0ufmeZ6V6gky
-tonH44jH4+yGT8dIMrv0M8qyB5VL6/X62GV9asajsn6tVmMLIFrsaJqGSCRyJoIEz/NYXl5mYjw3
-b95Eq9WCKIpQVfVEsm/btlllRJZl7O/vH3qMJElYXV3F1atXR9q26Ee9Xkc4HMa1a9cOVXio/+L+
-/fu4c+cOJElCIBA40WqDx2h4mfcLhs/nw5d92ZdB13U8efIEtVoNsiwjnU6j3W4z3+B+K/RJvZwd
-xwHHcdje3maltvOCJEmIxWKo1Wrw+XxwHAexWAyapqFUKg2cjSUxls7FEmmm08JrnHOi6zoMw2Dq
-WpFIBLlc7pDQyKBu4UQigWazyWw8jwrKJM153ABLHdQkDkKqZdQfcBZK5kQkEsGFCxfYKKYsy2yf
-fm9vb+re4oIgIJvNolarwbZtprbWe04m7fymRVw/isUiCoUCW8TRAm6YEJHH6eAF7xcQ2p+ORCLY
-2Nhgghi0Lzkok5MkiZXYgfHmWCnj43ke0WgUe3t78Pv952qkZGlpCevr66hUKrAsiznDAYc9mwnD
-MA7djKnrnGwZjwqgruui1WqxBrPOc9Yp4kIZ9FH758FgEI7jQFVVhEKhoe8viiJmZmZQr9fRbDaP
-LclLxxQMPtV053n+zG3BJJNJ9t/k6kXjWicRzCjbv3PnDtrtNh49eoTZ2dmpKihWKhW4rntoYsKy
-LBSLRaRSKcTjcWxtbcFxHNYf02q1jp3te0yOp23+AkOl0Ugkwkq0ZDPaL5hQUJckiQlDUCcyx3FD
-b+IkBhKPx8FxHEzTZC5VlFkdp2v6eYJKwY7jMGtFyqCB/uVv2tPs/Fw6P3cqX1Ng6A0OjuOg0Wiw
-9+x0hgKeKp5FIpGBojD98Pl8aDabTIhmGFQ1oP3145zjRqPBegGAg88gmUye6cUflftN0wTP85id
-nT0RHXaaic/n82i1WiiXywgGg1PZTiiXy3j06BHq9TpCoVDXueZ5Hul0GqlUCn6/n4nx0Dm+cOHC
-xO/vcXy84H3OcByH2Y72g0bESOxB13Xouo5Wq4VgMDjw5qTrOhOVoNehBpd6vY69vT0Ui0Xs7+8z
-6cYXMZDzPI94PA5N05jTEzV89QuEVK2g80GZsiRJSCaTmJubY93pNEvdGYB1XWdZfiAQ6Hp90jY/
-bgAMBAJMHe6ohjQ6/nq9Pnb2TXPeNHZGLC8vn+nRQ0VRmAAOmahMClVRehfL4XAYtVoNtVoNlmWh
-VqshEolMNKbWbrexs7PD9rVJTKizeZDK5TQBQJW5119/3SuZP2PO7pXhcSI4jjNyMxnt05ZKpSPd
-nXw+H8rlMpPpBMDmiykYGYaBer3ONJIXFxdfyAAOABcvXsT29jYKhQJ8Ph+bu+7cx6aRMhLAabfb
-bF+VqiWdkHhOZ0DTNG1ggBtmnKFpGgzD6AqY1G2uqipc12UqXbVaravTfBD0+FKp1FVeHkS5XIYg
-CNB1vWuLod1uI5lMPhcuVktLS1N9vUqlgrt377LxvqWlJbZ1QLK51Juys7ODcDh8rCBarVaZXzmV
-vjVNw9tvv413vvOdfcf+5ubmkEwm+/rRe5w+3hk4Z9DI2Lj0Nk11ZoAkmygIAvO5phJuZ4ZNDW3B
-YBDlchmWZeHSpUuT/1FnFNKHLhaLMAyD7eeSVSZ9XlTdyGQyyGQyA89PJBJBsVhkQjCiKILjuIHz
-1XR+qPmMIDUzSZJQqVQAHJT0aXuExttoL1fXddbE5roufD7focBKM+nhcBitVgulUgnRaLTrJk9K
-cpqmQVVVZkFK/wPAFALPU7NjJ6RsRt+BjY0NLC0tIZFIIBKJdPmLk2XouPvO7XabzaeHw2F2Xi3L
-QiaTGTqv7wm0nB284H3O6BTAGJXevVpqZFEUhQVkEgOhYERzwZ03786MX5IkJo/5IgdwsnKlzLu3
-e3qcEnM0GsXy8jJbIMmyjHq9ju3t7b77nxSIm80mfD4fC/oURMm7mTrGqT+hsxpCWyg0c07Pp/I+
-/ZvneciyzLznqeeBRg/J9KRUKrGGykAgcGihYpomEonEuQ0S4XAYFy9exMOHD1m/xN7eHnieRzKZ
-RC6XY48lj/Rxg/fe3h50XUcoFGLn0nEcRCKRqVcSPE4OL3ifM8i2chz8fj8ajQb7tyiKTHXNMIyu
-Bql2u82ESkqlElqtFlvJk8gFAJb5UZf0STT6nBU6M8tJSSQSXV3BPp+PzRn3C3iKosAwDORyORZg
-Ox2nqDpyVPNTZzbWbDbRaDSYJC91spPqFs27G4bByu5kY1oulxEKhfp+HrquI5FInPtGKArg6+vr
-8Pv90HUdW1tbmJubQyqVYhalruv2VV4bhK7rKJVKqFarSCaTbMuG3OdWV1c93fLnCK/j4Byxvr6O
-Uqk09l5iPylE13Wh63pX5kg3EkEQmM0k3cA1TWNNW1Sio8xd07TJ/rBzDM/ziEQiLIMmIwtVVVl2
-TDfkQCDAnKcmgYJzOBxmblf0mp3BhEwsSHq1XC6zBUQvpK1+XsvlvUSjUczNzaHVarHm0UKhwIRt
-bNsGx3Fs8XsUm5ubuHXrFvb29lg1TNd1tmgWBOGQda3H2cYL3ucETdOwv78/VgZI410+n491NRNU
-ju3U5ZYkiemrA0/3UYvFIrMXNQyDNSpRJl4ul8+dIts0oTG9er2OWq2GRqPBHLoajQaq1Sp4nkcg
-EOiSTj0utPjqPWeCIAzVvCYZ1F5Iv/3ChQvP3ITkLBGJRJivu6Io0DQN29vbbPQSOGg865TX7cQw
-DKytrTGrX1pokXmRZVlsG0eWZezt7Y19HW5ubqJcLk/2h3ocC69sfk7Y29tj86ijYBgG25+0bRu6
-rjNJVdq/jUQih7pOSS6SupVJNCQSibD3JkMO4OnedzQa9QQfjgk1LVETYSQSYSXVSCTCnKI4jmP7
-m5OgqipTGevkOFsfuq4jEolgdnb2TMigniUURcHq6iru3r3LJFJJDMlxHMiyjFqtBk3T+vZOPHny
-BJubm0yERdd15vVNRiYEZe/lcpmp85XLZfh8PvbajuNgbW0NgUAACwsLzGGwUCiwhYHH6eEF7xcc
-y7KY6peiKKhUKgiHw0eOelDwJdlPyqpIFrHzou4kFosdEtzopfO9RVGEYRiH9Lc9RkfXdWY0Qk1g
-kUgEqqpC07SuJrlxFnD9oOf3nluaOBhnppyObXV11ZsZHgDHcYhGo9jd3YUoimw7iqxIl5eXB15n
-tMgiDXZd1+H3+5k+e+diia739fV1xGIx7O3tYXt7G4FAoGs0rNlsIpPJsP+miQRqePQ4Pbzg/YJj
-WRZrLgIO9kgrlQoEQYBlWQOFHsgLmi5wamoBcKRS1zglWcMwmMCIaZpju1OddyjbTqfTXZkvqbH1
-y44naQ7sJ+cKgJVxRw3CrVYL6XT63DenjUI6nUY+n+9q7KQmUrLw7YX2xCORCFP7Gybfqmka0uk0
-FhYWUKlUsL29jVAoxNzvqDS/sLDAFoM0Y95pouNxenif+AtOPp/vmvOlMR3btpHL5VjZrd8NoFeO
-8yTKmlRmv3fvHhzHwdLS0sAxIo/D0Ghev3ND1ZLe303SUUzz+/1+PmrW7XWVj4csy1hcXMT29nZX
-T4AkSQObPalp1LIs9pyjFla0DUaaDa+++iort7daLYTD4a5zT6OgoigyQSfXdaFpGtNxiEajQ/0U
-PI6PF7xfYGjful9ZTRAEJpJh2zYajUZXxhwIBNi89kmWwzq7j2u1Gh48eMC6l2dmZhCLxbxsfAg0
-u90PSZKg6zr7NwmtTGpqQeNfBN3ga7Xa0ABOWXskEvG6yscklUqhVqsxz3jgqZRqLpdjpexOZmZm
-sL6+fmRWTMJNFNyr1SokScLGxgZUVYWqqnAcB+94xzsOPXd1dRWlUon9++HDh6jX62zLLZfLYX5+
-HvPz85P8+R598IL3C47run3LnM1mE4qiIBwOM6lMoFs5TRCEiSxCxyUajbLSoGVZ2N7exu7uLi5f
-vuzNnw4gGAz2Pb8U0Kl7mAJ3r3PUOFCzGzUcBoNBtg9LjVTVapXNf/eSSCSQz+eZcIvHeGSz2S69
-BfqM9/f3+wbvaDSKSCTCrvVBmKaJ1dVVpoxIlbpisQjbthGLxbC8vNw3ew6Hw12LwUQiwe4npK7Y
-ecwkOkNbdpFIxMvKj4kXvF9waNyrswzdarWYrjXZRBqGgb29PeZF7fP5YNv2qXeA0zFSOa7dbmN7
-exvBYBDhcJgFDI8DwuEwQqEQWq0WZFmGruvsZtkb1Pu5ko2DqqrgOI4ZV3QGBCqhapqGRqNxyN2M
-yqmXLl3yVLyOCcnrklMc8LR0/vDhQ8zNzXVV2WRZRiaTwaNHj4a+rizLrOxdLpeZaiLZCC8vL4+8
-2EqlUkilUnjw4AFKpRL7nriuC1VV8fjxY+i6DkmSmBdCIpFg/z8OqqpOVQDpecO7C77A0OzsxsYG
-s+Msl8tMAa0zOwqFQsya0nVdlMtl5ic9LfJcHg+4+8hzeZichYgbwQX3Aq4714f+DeVyGbVajVma
-yrIMQRAgCALm5+fPfZfr4uIi7t27x7p+ab+T4ziEw2E2GjQNb2wSgRn0WmRMQ3aZfr8fsixD0zTM
-zs565dMJmZ2dxf3797uuXVEUUa1W4TgOrl692vV4akyljnMyNeksvXdW51RVZeePtswKhcKhBVe9
-XofjOBAEAevr67BtG+FwGPF4vEu9TRRFuK6L3d1ddoy9wk47OztoNBqYn5/H7OwsW0gcxcbGBur1
-Oq5fv36mrWNPCs8S9AXnyZMnrNu8Xq8zb+fesiZ1JpN3cLvd7mtAMS51ro5fk34VHxP+BCUujyQX
-xwouYBHz8EPBDr+NPxL+CJ8QPgEbDhbdxUPHRTaFVKIlje1ms4lKpQLTNA9php8nSOK0Uqmw5rVw
-OMymAijrnbRUTYGA+hQGZTz0e+pQlmUZrusiHo+PbRfq0Y3P54MgCMjlcqwJlaoetm0fKp/Lsoxk
-MolIJMLU2ugaoqAei8WYC5xpmiiVSl09MZqmdb2ubdv4whe+gL29PQQCAXZfaTabKJVKmJ2dhaIo
-bHyR53m2D977naFFOGkR7O/vo1qtdmlEDILm0R89egRFUc7dd8vLvF9gyuUydnd3Wcep4zhHlsGp
-zE5iDpPwAfEXoXFtvNv5a+BwuHM8gjAi7lVccw+yhbv8Pfy08FP4eusbcNG9OPB1qWyuKAps20ah
-UIDf70cqlZroeJ9nUqkUKpUKm7cl21Ge59FqtSYWZgHAlLlkWR5pURcMBtFqtVCr1ZBOp9nN1mMy
-ZmZmUKlUoKoqW5ANWsDS7H8gEGDd4q7rol6vY2trC5FIpEsuN51Oo1wuQ1VVJJNJVoHrbGgVBAGv
-vPIK66GYn59nfSq5XA6CICAajbItLhpXHdR4Sn02oigysaGtrS3mLjczM9P3ebQwkCQJjx49QiqV
-Old6AV7wfoGpVCoIhUKsOzgcDg81JSEVNQryx+1KbqGFn5N+Fn/J/QqkndED6nX3Gq671/AH4h/h
-S86X8I32Nx75HKoWbG5uotlsMkGZ86jWdvHiRaiqilwux25sVLYcxV/7KDotXUcxt6Esr9VqneuF
-1bThOA7Ly8vY3Nxk2TRw9CgnBU8Sfrlx40bfvgjqPo/H4yiVSmg2m3jy5AmuX3+6vRUMBlmm29mn
-QtsiHMfhypUrrFqzu7vLmiY7jwV4+r3qPIZAIABN07C7uwtJkg6VxW3bZp321JtDqnHnpSfm/CxT
-ziHJZJKN5mQymaEBzTAMVKtVBAIBJBIJFgTHpY02fk76WbzH+Uak3ePdsL/a+SpYvIFfF//dSI+n
-5ppisYhHjx5ha2troN7ziwzP85idnYXjOAiHw0gmk5BlGYlEYipTA6IoQpKksebvOY5DOp0+l3uS
-J4nf78fly5cRiUSY4c+4I5X9ru92u808CEKhEC5evAhJko5lZkOvX6vVsLi4iOvXr+PSpUvw+/1d
-1+cgV0FFUWCaJhqNBqsGPnz4EOvr6/jkJz+Jx48fQ9M0LC0t4fr165BlGbdu3UKhUBj7WJ9HvOD9
-AiMIQpfT17CbLjW0Tdq5+XPSz+A9ztEZ81G803kTFkx8nP/4SI8XBIHNh7fb7XNrdJJIJOD3+7tu
-erVaDYVCYWL3Niq9j5PZkIynx/QRBAHLy8sIh8OwbRsbGxu4desWdnd3uwxixrEN9fv9uHbtGm7e
-vAlJkpBIJPDKK68ce0Kg0Wjgzp07LOMOhUK4dOkS05cAwBYf/aCRtdu3byOXy6FSqWBnZ4f9XRcv
-XkQymWTNeD6fDxsbG+dCbtlrWHvB0TSNeWcPgpq/FEWZKHh/QPxFvANvIIjpNI4sYREfET6KL3Pe
-NdbzSBpyGt3Vzxskf8vzPMLhMBRFYXvgZMNKOI7DGoVGgSwoad97FMiBLBgMntuRnpNEEAQkEgmU
-SiXW21KpVFAul9no3uPHj1kTGFWphtFp8QocLYc8jHK5jFarhfn5efYaPM9DVVWm5EZSzP2Oi8Yb
-6f5Emg/RaBTz8/MscBOyLGN3d5ddBy9yxccL3i8woigilUpB0zTWEdoP0zTRarUm+qKrnIrPCX+K
-19xXj/0a/VhxL+B3xA/hdeeNkZ/DcRwcxzmXDVIcx0EQBKiq2lUWpYpE5zx2pVJBs9lk2tSjbJPQ
-c2nWe5TH1+t1xONxT5jlhCC9esMw2LkxTRO1Wg21Wo2Ng5E+ejAYnFjjflQCgQAikUjXuW+326jV
-atB1ncmx9i4qqOGS4zjYtg1ZlnH58mXIsoxQKHSo0Y5QFAXRaBSyLGN9fR08z7N58hdtL/zF+ms8
-+rK4uMhsOvtdsCTKMgm/IfwGvtr5qoleox8++NDG+PvX5znLI8OIXqjJx7IstNtt9rhWqwVVVUda
-vHEcB9M0B+qp94Nuth4nRyaTQSQSQbvdZlaeNDlCwTEYDKJUKqFWq0GWZczPz7PqlK7rbN6b5rxJ
-XKVSqRwSUKEFwVEZOfXcdEKVAWpmcxyHBVbHcdhWi+u6TKnNsiw8efJkJD18+pveeustuK6Lt99+
-G3t7e7hx48bAa+N5xAve5wBJkpBKpbCzs9NXZlSSJLTb7YlcvepcFYI7foPbKLzhvoaPCB/BV9pf
-OdLjbds+13KqiqKwcmRnNp1KpdBoNGDbNoLBIAu+HMd1aaAPolqtguM4pnzXbrf7err30qmb7XFy
-kOlQZ6BtNpuo1WpoNptot9ts5p5Gzd58803s7+9jZ2cHlmUxJ7F8Pg+/389069966y0IgoDt7W2o
-qopGo4FQKIQbN26MdYy2baNarbIMmdQeaTvHMIwut7nNzU2USiVmZ5zJZEZeNNK97OWXX8bGxgby
-+TzW1tZw8+bNF2Jx7wXvc8Ls7Cyq1SprTOtEEAT4fD5Uq1Ukk0k2LjJqmanElZBx+89iToN5dx6/
-z3945OBtGMa5DhaUGfdrFOs3/qfr+pENfo1GA47jsMBgmiYMw0Cj0WASu4OqN5qmIZfLYXZ29hh/
-jcckdI50Ebquo16vIxKJgOM4VCoVJj9MTnTZbJYtzmKxGCqVCgqFAvb39xGJRJDNZo8ljCQIQlfA
-dxwH9XodmqaxSkE0GmUVQjJksSwLruviS1/6Eq5duzbWGKvf78f8/DxarRZKpRLy+TwWFhbGPvaz
-hhe8zwkcx2FmZgZbW1t99zYVRWEKSZSJpVKprhtyq9Vie1C0bwYAD7gHWMbyiR6/jqMzQ+DgxhSP
-x/saNZwXaNZ1mH9zJySZ2Zupd9JbkSFVN57nUavVmKpav22ZYdaVHqePz+fr6ge5efMm21L73Oc+
-B1VVceHCBbz00ksADhbDJEWazWaxsrIytQkCnufxjne8g6kASpLUlVmHQiHE43EUi0U2pnjnzh28
-/vrrY2XP+XweOzs7SKVSaDabUzn2Z835TU/OIfF4nJkN9MLzPNLpNAKBABRFYaYlAJiMIjU3aZrW
-dZPOc3kk3eO7VY0CP8JXlaoKy8snu5A46/A8j3hSL9GHAAAgAElEQVQ83jUuNAxStQIwUIltkDsd
-Zdyqqg4czxFFEU+ePOmyEfU4W9D1/NJLL2FhYaHru2MYBizLwtzcHK5evTr10T9JkiDLctdWTidL
-S0vIZrPMpUzTNNy6dWusEbilpSW88sorCIfDzOr4ecfLvM8RgiAgm81ie3t7YImTSmyNRgPlcpm5
-Atm2zUrqpVKpa3/c4qwT2+8mjuqLpczxypUrEzffvQikUikUi8WRH+84DhqNBgvAZChCn2W73R6Y
-lVMzlG3bXdl+ZymUmuXOswb984DP58Pq6mrXz0KhEG7evDnSNprjOMjlcmMrNJZKJTx69Ag3b97s
-G8Dn5uYwNzcHx3FQKBQgy/JY/TmkxS/LMorF4lTkgp81XvA+Z8Tjcezu7h5ZUiVPZpJf7FxtU+mc
-Lp6IG4HKNRF3T26u2sbwi80wjCNV5M4b46iqRaNRFnxp1K5SqbARHjKu6UXTNJimCVmWUavVoGka
-a5ZzHIc5kA0ryXucfUbtf7FtG0+ePEG73cbCwgKy2SwURWEz3YNK3TSHblnW0NfneX6iLbFgMIg3
-3hh97PQs4wXvc4Yoishms1hfXx+6MuZ5ngXs3uYnMpwwTROKouACfwFr3H3EcXLBe5Sy+XkUZRkE
-+TKPCt1UDcNg2vDk6W6aJvufYRiIx+OszNppz6ooCivX0/53ZxY+avC2bRt3797FzMzMQFMKj7OF
-4zgoFosolUrgeR6hUAjlchnlchmSJDGjo1deeeVQZazVaqFSqUCSJKiqemxPhfOGF7zPIeQcZBjG
-SCvq3gzO5/OB4zi0221UKhXM+Gbwh4kP4yWMNzYyKjZsJIfopLdaLSwsLJw7S8BB1Ot1lEqlkRt6
-OkV8TNNkN8/OBRuNB/U2pLXbbbYfTr/rV/ak2fJRaDQarHnSC95nF9M18bbxNm41v4SHlTXkyjn4
-ZB8CcgCL/AKucVew6C6yak4oFOr7nWw0Guw7VKvVvKmEEfGC9zmE53nMz8/j4cOHx1Yd6vRzLpfL
-0CwNpmsOLK9Owqe4zwwcE6PRkvPcXd5LsViEaZpHzsOWuBI+Y/8pvmTdRVmqwuYc2KIDTgM4nYMo
-CPALClJiAq8Gb+I6fxWyI3eJ/ViWBb/fD47j0Gw24ff7+27HSJI0UqOTbdvY29tjs+SqqnpbIWeI
-B+YD/JvcB7Cl7oLTRSi1CAJqGGYVUPjZg0U9XHxefoz/FPw8jLAK2SfghnQN//3yD/adRiC70NNQ
-fHuR8IL3OYXEGo6CLDeHkUgk8C7ry/El6TZumNenHrzzXAFz7lzf35E63Hme6+6EvJMHBe77/H38
-TuvfY79ZglOU4NuPQ64HISIIpc9CzgVQAPDByMdhzv97KDEOF6wFvEf4BsTMGHN7CgaDUBQFjUaj
-b1MaiX0cxdraGqrVKiKRCJNt9Xj2/F7j9/H/5X8HrV0Hsa0MItw88wmvNQ+mCCj4cuAQMqIIGVGg
-cqAJUIgb+B7+B5CNJvBDc/8Ys8LT7LrVarHRRsMwkMvlvMX4CHhXxjlFURSkUikUCoWhamS0z3kU
-XyF+Bf5P8adxw7w+1eakT3GfwV8eIs5CM8oeB5CYSi+/bf8uPtH4LIwtGfGdeUQ7+hNM1zwy64nU
-k0A9Cdd1sWVp+PGr/xKhtIBvi34DLquXoaoqYrEYms3mwGbIo8ZzSKyDyvZUavdcyZ4d9837+N+f
-/BScJwqCe3OQDAOCKMB1Xdb3Qnrq/XAc58A8RUwgtTsD7AL/beWfYCU1h5+Y+3F2byFNfk3TsLa2
-xkZXT4uNjQ34/f7natHgBe9zzPLyMjiOQ7FYhCzLfW+44xgYfLP1Hvw2/0F8A/d1Uzm+BlRUuCpe
-dQabnVBntMcBhmF0fR4fcf8Ev1/9Yzh3IojWVybyeyOtaThAeu0i+Mc8fm3hDxC88GH8TeGbEHWj
-AwO3ZVlIpfr3LVC1YHNzEzzPs3PabrdHytY9ToafzP0f+GLuPpZ2rqPVaqFttNmECU2cjNo30263
-WZKwuv8y2oUWvqP5Xvw3M++DYApssU8LtWazeWrB23VdlEql5277zQve5xiO47C8vIxQKIQnT550
-aQwTo5gPEEvuEuatRXyc/yS+3D6w8ZwkA/9j/j/iB8x/NPQxo4yXnCcqlQpEUYQJEz/R/GeorTmI
-7a4e+TyyZRwGGVwATz2io9tz4J5w+H8u/SouZWfx99y/e+h5hmEgHA4f6iK2LAvFYhHVahWqqrLO
-dXqOz+fzyubPiO/f+sdorfNY0V9GUzvQRe+dqx7l2uZ5HrZto9lsMkczAPDbASyt38RPFP8F3vS9
-jG/BN7PnkG7AacFxHBKJBKrV6rFfw7Is7O3tIZFInNqxexuFHkgmk7h69SrC4TBTUyJorGPUAPm1
-ztcCOoePcH8CwzCOVdJuoIHf4n/nyMBNvAgmA9PAsiwYhoHPc5/HD+b+Z3AfyyK2279XoBO6CQ/S
-N3cch416+Xw+JuDC8zw7x4k7K9j8eBs/yf0U6lydPZfcqhYXFw8tAvf397G+vg5N0+D3+7uCgW3b
-yGazA7N1j5PjfRvfB/FhEpFKAoVCAaqqTtRTQnK9zWYTqqqyypBpmpjbuIzPVe/h37q/3vWcVmt8
-J8FJyGazzIZ0XCqVCj75yU/i3r17p5pIcK63YejRQb1ex/b2NtrtNvx+P5MSHFcZ67P8Z/Ax50/w
-bu6vIcyPPrf5Ke7TqHB1vM9830iPbzQamJ2dPfeSqMQPf+ZH8PHdtxG/vcKqJpQt06Xuum7fWVtq
-TqT9R3oeaU73y7R0XWcz3dSFXn3HGr4n8XdxybmEYDCImZmZQ98f0zRx+/ZtAId104GDzPvChQsT
-ecx7jM/3bn4/Ag9ngRbHHOhG9XofBdu2wfM8IpEIms0mdF2HJEnYnXmEv5B+FV/LfQ2rpr322mtT
-ec9RGdULoPPx5XIZlUoFlmVhYWHhVGfUvZqURxeRSATXrl3DvXv3oOs6u8DGDd7vdN7Cq8Zr+Hn8
-a9gBC6/hVSy7S30fa8LEp7nPosAV8Vfsv4qbzs2x3sub7z7gn+//ND678QCZzavgfFxXJt3Zt2Db
-NtOnJ1lZjuNgWRZ4nmc3MfrvQYG797Xp/8OfXsHPvvkr+JE3/iFeS/S/AZMC2yApW0EQvMB9yvxP
-uz8KPA5DcfxomAez14PMZo4Lqe9RiZq2RebyF/GffJ/F1fgVXHIuQRCEiSyKj8O41YWNjQ3kcjlw
-HIfXX3/91GWZveDtcQhBEHDp0iU8fPgQrVYLfr9/LItQQpZlfFvhbyCKKD7j/zT+A/+HaKMNDhw4
-AA5cCBCQclP4K/Z/iaybHftYA4GANwcM4GfzP49P3LqN2dwVtJwWUz3rB8/z7FwahsEybQDshk0B
-nKRR+9GvUdCyLEiShAvrb+JfRv8NMuEMrkvXDz1O1/WBjYaGYSCZTI70d3tMhz9u/kds7xaxaF6G
-pmlMzvQkZq8HfS+Xtq/j/b5fwY/y/yMURTnVwH0cFEVBIpFAOBx+Jn4KXtncYyCNRgMPHz5krmKj
-dH/qus6aj2RZhqqqbAb4JLBtGy+//PK5nvP+k9bH8NN/+guYeXgFruuiUqmM3GhI3cK9j7VtG5Zl
-Db0p9T6GSqykiw8A5Tcf4Jde/Rn4ue65c8uycPfu3b7HqKoqrl275pmYnCL/1YP3YnnjJmzbRq1W
-YyNep01basJ3ScN3W9+J1dVVT/J4COf3judxJHRTJ+/uYSNZlmUxtzHK3NrtNjRNO7FV6bO6wZwl
-Wm4L/+rez2Pm4RUAB6VrWZYHNp/10qmW1gl9rqM24FBlJhKJdGVMiT+7gu99cLjxkPZRe4/TdV0o
-iuLpW58i/+vuP0XwUQatVgv1ev2ZXld+M4gnah5NuYkHDx5gd3d36u/xokyneMHbYyAkdUlNJsMy
-uWazyXzAw+EwotEoAoHAiZa+TNNENps911n3D6z9EJKfv9r1M0VRpvKZdBqT9KNzMcfzPAKBQP9M
-+vMy/rfdf9b1s1arxUxQen+eTqfP9Tk9DRqNBkqlEjY3N/Hp7c/BKR189oN820+Tpe3reL/9ywgG
-g9jZ2UEul5vaa9u2jc997nPY2NiY2ms+K7wrxGMoJLOpKAqazebAx/W7wZPn7kkY35umCZ/Pd673
-Rn+z+kGU7xyuhoiiyOQmR2HYviZlx/1216iZDXjqp96PRDODT2/dQskuscfu7e31zYBEUfR6GE4Q
-13WxsbGBhw8fYmtrC79Qfj+iu7OsKfGs6IsX2hUAYOOI00IQBESjUezs7JxIVn+aeMHbYyikN8xx
-HAvCNE9MwYH2Ovs1tCmKciIKaBzHDZV1PQ/8+taHkCou9P2d3+8/snROHd/DEEURHMdB1/Wu17Ms
-q8vykx4ziPTtq/gnG/8LgINxxGKxeGg7xXEc+P1+RCKRocfkMT61Wg3FYhF37txBqVSCz+eDLMu4
-7d5D1Eg868M7RGx/Dh/C78Hn86FSqUz1tdPpNHw+H3K53FSz+tPGC94eQ1EUBaIowu/3Q5Ik6LqO
-RqOBer2OarWKarWKQqHArCF7cV2X2TvWarWR92KHoes6LMs618H7Z/L/GtztwaNU1DA4KDjTuNgo
-JVKfz8ekUWnun3obCJ7nYZrm0PO7t13DprXJPJ97S+PtdvtcV1JOCsdx8ODBA9y9exemabLmUQMG
-jNbZ7FeO6DF8wfwigIMtuWmWuROJBFZWVpil8fOKF7w9joSCsizLKBQKcBwHqVQKwWAQmqYhlUoh
-Fouh3W4fKp8HAgGkUimEw2G4rot6vd7vLUY6BsMw0Gq1YNs20un0c6VDPG0+mvsEYq3B6mNU/hyW
-WYuieKQ6neu60DQNoiiy8Z1+3ekAugRh+jHz6BL+xfa/Yq/bi8/neyYjNy86rVaLVao6e1A+gU8h
-Ujo9849xaekak0rd39+HqqpTe+1kMonXX38dFy9enNprnjbenLfHUFzXZTdaRVGQTCZZedTn8yGb
-PZjNppJ5vV4/NBrG8zyT06xWq9A0bazRsVarxfa3JUlCKBQ61/uin9Y+A/Px0UFOFMWJO2t1Xe/a
-EiGjmn5d4p1l9EFs5/OIXoqiXC53/Zyc6LzxsOlTr9fB8/yhhdEX7S8hpp1d+VlJDaAQLiAtHJS5
-p91Id5Tf/VnHy7w9htKZTdm2jXa7PfAG7ff7EQwG2chJb6MJZXqqqqJWqx353qSzHovFcPnyZSwt
-LWF2dhbhcPjMNNY8C35l998hVVw88nGu607Ub0BCHb29DP2y+lHfR36cwof03zs0hWCapjcedgKY
-pon9/f2+/SgV5/hGHKeB0gzjER4DOPh+7ezsPOMjOlt4wdtjZMgsYFhDEakOCYKAVquFWq3Wlf1F
-IhEoioJ2uz30vVRVhd/vx6VLl3D58uXnfpU8TfZqhZEe5/P5Bi5yjmpWo+rKsEyaqjKmaUIQhJEa
-zaKtJD5a/s9dCzuSZz3P2yAnBS3g+mWthtN/BPCsEDTCeOI8AXBwXyH3OY8DvLK5x8gMk9zsJRgM
-wnEcNJtN1Go1xGKxLgnOYYHDtm0oioILFy6cmDLb88q6tQ43N9pnMqw6QYGXZFDJHaxzzneQNGrn
-VgoARKPRsTSwVV1HJpNBLpeD67oIhULIZDLeuT4BOqVwezmJKZBpIts+1F0V+POvFcdxyOfz53rL
-rBMveHsMhQwCZFkeOsvbD57nEQ6HWZNbZ/CmEny/jFrXdczPz3s38z78ceUjCOVHazI6am6XgjbP
-83Bdt2s2fFBTGjUOUvCORqPj70WWZMivyXgp9RIMw/AkME8I13Vx7949NBoNhEKhQ82JLs7+1pOL
-biGgs77gOE28srnHUHp9lse9eHRdh8/n69rjtCwLoVBo4EJAEASvTD6AO817UMzRRuR4nocgCH07
-u6mXwbIsFrgFQYAkSUNdxDo9j48rniEVI/hs888QCAS8wH2COI6DSqXCGkZ7OettIxZvwc89/a7r
-uu5l3R14wdtjKJ03/6P0zfthGAZM00S9Xke73Ua9Xu/yfh70HNpf9+imoh3d6NdJP/1wgub3x/Vr
-pu/DoOz8KKLtJL6k3h77eR7jIQgC5ufnB+ohSPzZLry2JRWz3NM+CJ/P5zU1duAFb4+hNJtNJr6h
-adrYmVI4HEYwGIRlWdA0Da7rMhOLQT7csix7JfMB6OZ42a6iKGybojMDp8XTOH0MwEFAIHUuv99/
-7K7/kvH8imM8T0iS1LfyAgAR4Wxnsa1AHRe51a6fjWtL/CLjBW+PI+nUNT9OpkUd6PH4gSJYKBQa
-2plsmqa3tzUAyx7vcyGlNU3T0G634TgOHMcZq3ehs1QOPN17nGTutm1PX+/e4zCSJA081xf5FbSk
-wX4Fzxo9rGLJXWL/9tyru/GCt8dQKGiLojix+lWj0QAwXByh1WohEol4e96DOMb9i5qVZFmGaZqw
-LIuJ5hyFaZrQdR26rrObp2VZUBRlonPkuN7i7DQgadt+fAX/5ajG90/5iEZH9j39frZaLUSjUU+B
-rwMveHsMJRqNsmxtkmzYsqyRGk4EQUAmk/EaUwZwnCq1KIps35OC+ChZs23bsG27q9nJsiy29ziJ
-UI7AnW8f9tNikGEQAKTdNJzwYDOZZ4nFm1iWDoSIXNeFLMtIp8+ulOuzwAveHkdC+6XDXKOOolwu
-wzCMoSILtm3D7/cjkTh7LkdnBUE8XtCTJIlJm44D9SjQtIAgCAgEAhMr3AVEr6fhNCAHwEEsynOw
-uckkdE+C/cw6vln4RgAH1b9sNuu5zfXgBW+PoXQ2mE1SJhUEAclkErIso1wu9zUoabVaSKXOrtby
-WcAvDTcSGYTP5xvL4xsAGx2jbnRycpu0acjhbMzIXhZ1GpAIzyC+Xfxb2Jl/eIpHNBpKhEfCTcB1
-XW9BPwAveHsMJRwOw+/3w7KsiRqUSOnJ7/cztbVyucyCSavVQiwW8y7SI0gqx/98/H7/2FsfFLht
-20YgEJjKFEAtUMJr4Vcmfh2P0Rh23UbcCBJDtqhoUoH+R//ubWKcJnupDXyr75sAHPTJZLPZQ1r4
-Hl7w9jgCshEURXGisjnwtFuU53nmPFYul5mQSyaTmbpz0IvGa+GbaPqOZ6sqiuKxyt3kAT2tPgRr
-RsWbgTem8loewzEM48gF29+XvhtbS3fYvylQkyeBz+dDNBpFLBZDLBZDJBJhVZyTmArxJR3ccG6w
-ShxNqXh04wVvjyM5Tsm1l149bODpwqBeryOTyXgX6Qj81ehXop0tHeu5pmmOlS2R6Qi5xU0LIW4i
-znvn+jRQVfXIrDXiRnA1tIKCvAfHcRAIBBCJRBAOh5FIJBAOh7t83GVZRjQaRTgcPnRPMM3JzE62
-lu/g++T3QdM0hMNhLC4ueln3ALzg7XEk5NMsiuIhH+ZRcRynb9bHcRxEUfQu0BHJClkI6ePdIDvt
-XTuhEij9z7ZtFuhDodDULVhnIsmpvZbHYPb399FsNvteW3SOgYNF2reo3wzhkoZ4PI5AIDCSUBIt
-6ju/N/0W6SMfb3wL7wq9gaAeRDQaxZUrVzyxpiF4wdvjSOhGPupscD94noemaYc6X13XxdzcnLfX
-PQbLsfljP7dzr7LzBt4Z2HmeRyQSYTfyaVIM7+LrZt491df0OEyr1cLjx48PLbo0TYNt26wZkfav
-s9ksfv7K/4vt1fFka3meh2VZLAM/ygxnEFWliETWh6/WvgqBQACrq6vHvteMQ6dd8fOGpzXnMRRy
-kRJFkfkuHwdFUcDzPCRJYl7elmUhkUhgcXFxmof8wvPeue/Ajyz8c6SeXBjrebIsIxwOo9lswnEc
-yLIMSZK6Rr+O6k6emIsN/PXwV5/c63sAODjXmUwGlUqFLdBEUUQ4HMbS0hLLaGmShPinqz+GH3Z/
-FBc2R2so7LSPpet63L6Vmq8C/kIL3+f8AERFxNLS0qkE7lqthvv37+PmzZvPpSiUF7w9hkJ65MBB
-88txm9YCgQA0TYMoilhZWQHP87BtG8lkcqol2fPANeka/IsO8GT85/r9flZG7TfydZI3TZdzcCW9
-fGKv7/EUURRx8eJF7O3todFoQJZlJBKJQ7PSvd+BRXERP3nxx/HD3I9ieePmke9DjafVapVZy45D
-PryL0IKLH3B+AK7rYmlp6dQCabPZRLvdxsbGBi5evNjXee0s45XNPYbS6f5F+97HRVEUaJoGn8+H
-eDyOVCrlBe5j8p75r0cxdozojeGqWydJ4dpD/A8LP3jq73uemZ2dxZUrV3DhwoWRRU4WxAX84pWf
-Q+HKGnK+3aGPpZ6VRCKBUCgESZJGbmzdmr+L5cUEflD4R/9/e/f2W1d21wH8uy9nX881Ocd2fBwn
-cWInk0yHzAU0EmIKAt4Qqqo+IB6oKsQLEkIgAW+VQKhFqgQtKkUtTBEPfeRPQDwiVe2knTKdTDKT
-m2M79vG57b3Pvq194SFaa+zE99g+3vbvI1nx5RyfZef4/PZa6/f7LWRZhsnJyWNtxFKv12HbtliF
-KhoK3mRHG+s7eU/rV5HnORYXFw9pdGfXl2tfgnHjYOdpj0MqJ7jWnkFNro17KGQPFCj4/uXv4ubN
-Nh60P9z19rIsw7Is6Lq+a/DuWqtYnr+LPz7/h/ia/EeIogi1Wg3T09OHNfw94RexQRDs2PnxpKLg
-TbaVZRmePHmyKVP8Va9Q+d75fk61Ilv7s7k/QWf24biHsSeDNz7Dty59Y9zDIPv0F60/xw9e+2dE
-t57hwYVfIJKDHW+/00ramr2Mxasf4daVi/h7/euYz+ZF8tw48l5kWQZjDK7rio6PRUpgoz1vsi1Z
-lmGapkh4kSQJnuft+0zvjaIowqVLl6gZyyF413wXs9f+C8PlCFpyck9bWm8t4ktXKMO8qMpyGd9q
-/wOC6QDfmfguPnb/D5mroDaYQJ1tLvvjuSyqqiJHjk55GaNaD6Zewm9bv4kv4j0kSYIwCUUCa6vV
-GsuydbfbhaIoqNVq6HQ6GAwGGI1GuH37diFKV6WcDkklO1heXsbi4iLK5TIYY3AcB+fP761Ol2en
-84x1SZJg2zbm5uYKucd0Uv3BL76G2o+vjXsYW2JKBOs3XHz36j+NeyjkEA2yAf7b+x/c8X6GLush
-TCJkeYY0zZAmCRQmo5HV8I78Fm5Lt+G6LizLAmMM1WoV09PTsCwLaZqOpZY7CALcv39fdA/kr22X
-L1/G7Ozs7t/gBKDgTXaUpik+/PBDqKqKMAwRBMGegjdjDGEYwrZtcZgFrx0mh+sz9hn+6s7fovWL
-6+Meyku8dz/Dj279cNzDIMcsz3P0ej2EYYjJyUkMh0MsLS1hYmICrVZrrCtvS0tL6Ha7iKIIlmUh
-jmNR+dJutwszsaBlc7IjRVFEZnKe53v+o+NHUL722mtjyWw+S66WruJPb34V/8L+ExN3T04A779z
-Dz947TvjHgYZA0mSNl3knz9/fs8rdkfNdV0wxkT5qmVZmJmZgWmahXqtooQ1siPe9lCW5T2Vim1c
-yMmybMezhMnh+Z3yb+Orr38Fazc+GfdQAAD9t+/h269/E3X54PkRpPj220//qIxGI5GMNjMzA0mS
-4Ps+dF3HzMwMKpVKoQI3QDNvsgtJkqAoiigV831/29Ol8jxHFEWQJEk0ZDkJf7hnxZdqv4/Gm3V8
-R/93tH4+nhl4osQIfvUpvv/at+nwkTPO9318/PHHME0TiqIgjmOUSiXMz88f67L56uoqHj16BFmW
-MTU1Bdd1EQQBzp07h3a7jUqlcmxjOUwUvMmuLMuC53kwTXPHEi/esOHSpUviMJPDPI2K7O6L1nu4
-dvsq/tr8OqQ7TdjR8TW9WG8+xeTrOt6/+v6xPSY5uXgfdb76liQJGo3GsQbulZUVrK6uQtd19Pt9
-uK6L4XCIqakpzM7OFiKrfDu0bE52xZeYoihCFEU71kIyxvDo0SM8fvy4MIkfp01bbeNHt97H7Hs6
-1ubvHfnj5VKG9V/5BL/36+/ie1e/feSPR4rBcRzkeY5SqYQkSVAqlY5133tlZQUrKytQVRWMMczM
-zGB2dha3b9/G1atXCx24AZp5kz3QNE3MpHe7ajZNE47jbHv8JDk+35j9O9y/cB/fnPxHDB8l+z7I
-ZC/WbtzDlfYUvnfph1AlejkhnwvDEIZhiK00nhR21Hq9HrrdLnq9HkzTRBAEaLfbmJiYKNy+9k6o
-VIzsajgc4sGDBzBNE8PhEEEQoNVqbXnbOI6hKAquX78OXT+5jUPOmjvxHfzr4/fRWXNQ/WwGBjv4
-dkbfXkN6tY8rrTb+5uJfoqVs/VwgZ9snn3yCXq+HyclJWJaFqampI3083/exvLwsssn5jH9ubu7E
-ZLofJgreZFdhGGJ5eVmcx93v91Eul7c865k3XVhYWBjDSMlu/NzHv639Bz7o/xzuMIS0ZsEenIMZ
-bx/MXaOPqDkEmhGa1Rp+t/Vb+Er9y8c4alJEfJvtqA8bcRwHS0tL8H1ffE5RFGiahlqthna7faSP
-Py4UvMmukiTBhx9+KA4miaIIvu+j2Wy+dNsoipDnOd5+++0xjJTs1112F/87/DE+DR5gGA8RpjFy
-5FAkGaZq4FypgdfLN/Fu+dfQVk/niyApJsdxMBgMsL6+DgDQdR2+78O2bUxPT79SG+ciOD0bAOTI
-qKoqrmR56dhW+9lRFEHXdUxOTo5hlOQgbpRu4EbzxriHQci+eJ6HR48eIY5jsY8eRRFs28aFCxdO
-feAGKHiTPeDZ5TxjtFQqbZu4duvWreMcGiHkjEmSBL/85S8hSZJob5rnOcrlMi5dunRmcm2oVIzs
-ynEchGG46XSxF3db8jxHlmVYXl6mrmqEkCOjqiouX76MarUKz/Og6zquXLmC+fn5MxO4AdrzJnuQ
-JAk8z8Onn36KUqkEWZYxHA63PGQkCAJIkoR2u33k2aWEkLOLn1RY9Hrtg6KZN9mVqqpIkgRxHENV
-VcRxjCzLtrztxv0nQgg5KpqmndnADVDwJiWTxdEAABAoSURBVHvEDyYBIM7f3arTWhiGUBSFjv4k
-YzUajbC6urpjN0BCioyCN9kTXddFu9ON+98vyvMc7Xb7yGs7CdnJ0tISHjx4gA8++GDHfvyEFBVl
-m5M9sW1bZHZKkgRN015qNZhlGdI03bJ5CyHHhTEmSojq9fqxHoRByHGhhDWyZ8+ePcPi4iIsy4Lj
-OIiiCJVKRSyjM8bQbDYxMzMz5pGSsy7LMrHNQ8hpRDNvsmdTU1MYDodwHAe2bUOWZfi+L4J3lmV7
-PklsdXUVkiTBdV1cuHCBZuvkUFHgJqcdBW+yL41GA/1+H4qiwDAMpGmKtbU1mKYJSZLw8OFDaJq2
-Y4ejR48eYXFxEZIkQZIkZFmG+fn5Y/wpCCGk2GjZnOzbw4cP0el0RNtUxhiyLMNoNEIYhrBtG++9
-996293ccB2trayiVSjBNc9tDTgghhGyNgjc5kDt37qDf78M0TZimiTRNEcexWEpfWFg4taf5EELI
-uFHwJgeSpikePnyIpaUlJEki6sAbjQaiKAJjDJcuXcL09PSWh5gQQgg5OAre5JWsrKxgdXUV/X4f
-tm3Dtm0wxjAYDGAYBmzbRrPZhG3bVPtNCCGHhII3eWVJksB1XaysrIhZd5IkyLIMSZJAkiRUKhW8
-9dZb4x4qIYScChS8yaFJ0xRhGMJ1XXiehyiK0Gq1YBgGZFlGuVwe9xAJIeRUoOBNCCGEFAx1MiCE
-EEIKhoI3IYQQUjAUvAkhhJCCoeBNCCGEFAwFb0IIIaRgKHgTQgghBUPBmxBCCCkYCt6EEEJIwVDw
-JoQQQgpGHfcACNlKEATodruQJImOFiWEkBdQ8CYniuM4ePLkCTzPA2MM5XIZFy5cgCzTIhEhhHDU
-25ycCL7v4+nTp+j1ejBNE41GA6qqYmJiAqpK15iEELIRvSqSE2FpaQnD4RCGYeDWrVsUsE+hIAiQ
-5zmyLINpmlAUZdxDOpA4jsX59budlJfnOZIkQalUOvRxPHnyBJIk4eLFi4f+vcnJRzNvMnaPHz9G
-p9OBYRgYjUawLAtf+MIXxj0scghc18X6+jrCMEQYhsiyDACgKApmZmbQbDaPfUxJkqDT6WBycnJf
-2zGj0Qhra2sYDoeIogi2bWNhYQGaponbMMbQ7/cRRRFGoxHiOEae51hYWICqqi8F8SRJxG0Mw0AU
-RQAAWZahaRpc10WWZZAkCXmegzGG0WgE3/fR7/dx/fp1tFqtw/nFkEKh4E3GajAY4N69e7BtG1EU
-oVqtolKpYHJyctxDIwfkui6CIIDv+3AcB1EUQdO0TaspcRzDsizMzs5C07RNs/Asyw4lx8H3faRp
-iizLkOc5oihCFEVwHAee5+Hy5cubgqkkSZAkCaZpIkkSRFEExhgkSUKv14PneciyTMy2oyiCrusw
-TRN5niMMQ6RpCsYYZFkWPy8fQ7lcRrVaRalUQhzHCIIArusiTVMAgKqqSNMUeZ5DlmUoioI4jgE8
-n8FLkiR+FkmSoKoqqtWqeAx+W357WZaxsLBwJLN+Mn4UvMlY9Xo93Lt3D5ZlAQBu3rxJS+YF4zgO
-+v0+GGMi4IVhCFmWYRjGtsvjQRBAkiQ0Gg1Uq1WkaYrRaITRaIRyuQzbtpHnOSzLQqVS2dNYXNfF
-cDiE53nwfR/A86CcJAnSNIUkSdB1HbIsI0kSZFkmPs9vy8fL76OqqvhZNsrzXARmHvh3eu7yWbai
-KGCMQdO0TbP2F/EgvZ0oiqAoCiRJQpqmUBRFBO04jpGmKd54442Xxk1OBwreZOxWVlawuroKxhiq
-1SqazSYajQZlmI9JGIYYDofbBs0oijAYDOC6LuI4RhiGYIxB13UkSQLTNPf1eIwxKIoigmmpVAJj
-TATPUqmEd955Z9tAFscxHMdBp9NBEATiPmd5xhnHMbIsQ61WQ7VahaZpKJfLCMMQiqLs+/+InDwU
-vMlYMMbw0UcfQdd1NJtNPH78GKZpgjGGLMugaRqq1SouXry44+yDHK5utyv2dVVVRaVSQblcxvT0
-NPr9Pp49e4YoihAEAVRVhWmaR3qR5fs+Go0Grl27tuXXPM9Dt9vFcDiEaZq0avMC/vekKApkWRYf
-X7t2DbZtn+kLnKKj4E3GwnEc3L9/H2maQtM0+L4P0zTFMmKapoiiCBMTE5iYmKCZAp4nTA0GA5H4
-dO7cOZEUFcexWC71fV8suZZKJVSrVTQajZcugvgecBiGcBwHvu8jyzJkWQZd15HnOeI4BmNM7APL
-snzkL/j8cfM8R6VSQbvdhm3bImHM8zwAz58jPJObgvbe8b15VVXx5ptv0sVxQVHwJmPDl8sVRRGJ
-OxuTcIDn+6K6rmN6ehrnz58f42gPl+u6KJVKm/YjGWMiMDLG4Pu+WJbmTWt4UEvTFJOTk2L2Kcuy
-+HypVBIfJ0kCAKhUKmLvN8/zTQlQaZqK7ObtHFYS2V7wC4obN27g3Llz8DwPnU4H/X4fAFAqlcQe
-MzmYPM/heR4ajQZKpRJ0XUeWZeLvz7btcQ+R7IKCN3lJv9+HZVmQJElkzfKEmMPS7XaxvLwsZtw8
-gAMQmcn88fj+5/z8PGq12qGN4Titra2h0+mIpd3l5WUYhgHLsqCqKjzPE8FI0zRRVsWDpqIoL2Vk
-x3EMVVX3NOvkyU08AJ/UfII0TRGGISqVCq5cuYJut4tOp4M0TaHrOgXsQ5Rlmfjb4hdy/G/+jTfe
-2PFijowfBW/ykp/85CcYjUYiiMqyDEmS0Gw2ceHChS2XTcMw3FdW65MnT/Ds2TPkeS6CEq8BbrVa
-6Ha7m5bK+QxxXLXBB5XnORYXF9HpdKBpGqIoQp7nYlmaz4BlWRbL3ny5+ywKggCKoqBer4uM8d0a
-oZBXx1d08jxHtVrF3NxcYZvonBUUvE8Bz/NgGIaYgb348X799Kc/FfumvBSlXC6DMYa3334bwPOy
-l+FwKPqP379/H4ZhoNVqIUkSqKqKWq0GVVXFbMl1Xei6Lj7H63AZY1hfX0ee51BVFVmWwfM86Lq+
-aVx8j/PixYsnvjFFv9/HYDCA7/sIggCGYdCscQ946RWAXUuvyKvh5WSyLIvExFqtJso2yclGwbvg
-sizDnTt3ROKXqqqinhR43slqYWEBpmnC931YloVerwdZlqHr+palQHEcY3FxEb1eb1PA4clKfImN
-JzPpui6WcPm+KgCRiSxJEgzDwNramqht5U0reCLUYDAQ5S2qqkLTtC2DXZ7nCIIA8/PzqNfrR/Rb
-fTWMMfzsZz8D8Px3QEGbjBvvzhbHMQzDQJIksG0blUoFlUplU54JKQYK3gWQ57lohOF5nqiD5XtS
-WZYhDENIkgTGGCzLQpqmIiu30WiIWlxVVcEYAwBRjpVlGWzbhqIoogOUoijodrvo9/ui2xTvlAVg
-X8u6G2dTG+/Hs6QBwLKsPe3D8tnCzZs3T+wMgTGGTz/9VCTbEXLceMc33nRGlmVx4I9hGCKTnxQX
-Be8Thr/w12o1MMYwHA43dUziV82lUknsA+d5Dk3TROIJ/xyATftWWwVcnrAiy7JIWOGlSFmWIYoi
-qKoqMpmDIECtVjv2hCc+FkmScP369RO5DzocDjEcDjEajeA4zp4vSAg5DEmSiARQWZZRq9VQr9eh
-aRqVWp5CFLxPmDiO8dlnn8FxHDGLHsfsjfdn3hj8+UXBce5DMsZEprFpmpiamhprGUue53BdV/S8
-9jwPURQhjmPRGpSCNjkufFWsVCqhXC7DsiycO3dOtIAlpxcF7zG6d+8earWa6CzGGEOtVoNhGOj1
-erh79y4syzozJRuO44hMbF4axRjDlStXxjLbf1Gv18PKygrCMBT7+rydJzUKIcfJdV1omoZKpQLL
-stBqtc7M6wR5joL3mERRhOXlZbiuKzpb8d7efMk6SZIztWfKE2r4Mr1lWZienj702m7HccThF5qm
-bfs75gdlBEGAbreLIAh2bWZCyFHhB77wlsKtVosOHTnDaKowJrquo9FoYHV1VdT18sxrnozGTyDi
-5VqnHZ/B+r4PWZYRBIFIdDssw+EQd+/eFTNmVVVRr9fRbrdfygnwPA8fffSRyAGgF0pynPI8Fxfx
-vLRSURS8/vrrZ7YPAPkcBe8xqtfrmJubQ57n6Pf7ov0jTw7jy2Kj0UgcW8iXaxVFEXvQvBf1aWmq
-wFs1GoYhMrb3k1kehuG2ncf4Xv7GhLf19XUEQYB2u72pZMYwDJTLZfi+L4645C+mVAJGDsvGzPCN
-fREAiLPCecfDZrNJgZsAoGXzE4WXhPFZJ2MM7XZbfI2XeKVpKg6iYIyh3++LcjH+tdPQm3hj9iwv
-ZavX62J7QVEUsYT98ccfQ9d1VKtVPH78GABw8eJFTExMiO/37NkzPH369KX96TiO4boupqamsLCw
-sGkMYRgijmN4nod6vY4sy9DpdLC+vr7lGc+E7Ib3SODd9fjpbM1mE4ZhiOcnXRySnVDwLjieRCXL
-smhRyvdqT2I51UHxTmzA50lifLuhXC5jNBrB8zyxMlEul+F5Hubn50U71X6/j6WlJXE4B89i1zQN
-jUZDlNUAn+8vRlEEWZYxGAzEMj7P8OX3JWQ3aZqKJkl8e4gftFOv1ylQk32j4F1w6+vrItC4ros8
-zxFFEQBs6nwG4FQGGt7khTeg4XiegGVZMAxDJL1VKhV4noc8z0VA5kuW/H6GYaDb7Yo2rzzLXdO0
-sWe8k+LgJYSGYcC2bZTLZVHGRcirouB9CiVJsmmGGAQBXNcVy+pZliHPcxiGcaqDEc8J4Ak/kiSJ
-lrCdTgeMMSiKIhpY8Nn4xjwCQvYjyzIEQQBVVWHbNhqNhjh2k5DDRMH7FHn69Ck0TUOv14OiKGKf
-VlVVsVzHg7rjOKI9aZqm4nvw7G7ejIX3Jgfw0r9FxH9eTdNOTYIfGR/+fOKH7iiKglarhYmJiVO1
-bUVOHso2P0V48lq320UYhiiVSlhdXYWu65s6LvHOafwoSn7SF+8Oxmfosiwjz3N4nrdphi5J0qaj
-LIs0Qz2NWwfk6PBVGH5cJn+f513w7RdFUcQ+9tzc3LiHTc4AmnmfYrwXeJqm4o1nuvIAnSSJ2APm
-B5ukaQpVVUVG+8ZmMXmei2Qx3hf9pJ7uRciLdgrGvERx49G0/EAPfsFr27Z4f6s3Qo4LBW8C4PMX
-tY2Bngd7nr3OP+ZZ17zumdegA5uX1vn7jDFx6MnG27x4+4P8S4qFv9wc9N8XP8ePqeUfb3U/fqrW
-dsGYf/3FQLxxy4iQk4aCNzkQXnfOl9Zf9S0IgpdefF98C8NQfI2fKU6Kgz9XeEA0DENc5G18Az6/
-+OPNcF71bWN5ISGnAQVvQgghpGBOb50QIYQQckpR8CaEEEIKhoI3IYQQUjAUvAkhhJCCoeBNCCGE
-FAwFb0IIIaRgKHgTQgghBUPBmxBCCCkYCt6EEEJIwVDwJoQQQgqGgjchhBBSMBS8CSGEkIKh4E0I
-IYQUDAVvQgghpGAoeBNCCCEFQ8GbEEIIKRgK3oQQQkjBUPAmhBBCCoaCNyGEEFIwFLwJIYSQgqHg
-TQghhBTM/wP0r5H+skcc1QAAAABJRU5ErkJggg==
-"
- id="image287"
- x="114.75478"
- y="95.127419" />
- <image
- width="91.543488"
- height="68.8339"
- preserveAspectRatio="none"
- xlink:href="data:image/png;base64,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
-vn37Ul1dzZw5c5p+gOHgD/Ydd9xBOBwGYOPGjYRCIYPvSoYjnc2UKVO4//772bdvH3AwYtuzZ89h
-taTPprq6mosvvpjf/e53TVFILHHy2axfv54dO3Y0/fnVV1/F6/WSn5//s97r8SJ5NhMmTGDJkiUs
-Xrz4B/sFf+7ZvPXWW1RWVlJRUUFFRQVXX301zzzzjBpiM6Km6DBKS0sZM2YM6enp5OXlsWzZMubO
-nQtAYWEhTz/9NFOnTiU3N5cePXrw7rvvHlHv0A/x6NGjmz72wAMPUFtbS5cuXcjJyeGKK65o+mF2
-Mkc6m0svvZQxY8YwePBgcnNzOf30049a4Sh5NvPmzeMf//gHkydPxuv1Nv330UcfndibPkacfDbb
-t29n1KhR5Ofn06FDB+bMmcPixYtjlpGQPJvc3FxycnJIS0v7QZQbrz9Tyo/RJcOKoiiK0ohGioqi
-KIrSiJqioiiKojSipqgoiqIojagpKoqiKEojaoqKoiiK0oiaoqIoiqI0oqaoKIqiKI2oKSqKoihK
-I2qKiqIoitKImqKiKIqiNKKmqCiKoiiNqCkqiqIoSiNqioqiKIrSiJqioiiKojSipqgoiqIojagp
-KoqiKEoj/w9LDrtwIfjOQAAAAABJRU5ErkJggg==
-"
- id="image311"
- x="9.8340321"
- y="93.127213" />
- <image
- width="88.209435"
- height="53.91893"
- preserveAspectRatio="none"
- xlink:href="data:image/png;base64,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
-i/60cN++fRQVFREXF0dWVhY1NTUUFBRQXl5OYGAg8fHxbN++HYCsrCxGjhzZkpsXERERJ7TomYHM
-zEySkpJISEhg3LhxhIWF0b59e9LT0wFITExk586dREREYLFY2LJlS0tuXkRERJzgYxq7C7ANycvL
-87zLBKfzKf7ya3eHcVU88XSfJ1KeXUN5dg1PzLMuE9SnEQhFRES8nIoBERERL6diQERExMupGBAR
-EfFyKgZERES8nIoBERERL6diQERExMupGBAREfFyKgZERES8nIoBERERL6diQERExMupGBAREfFy
-KgZERES8nIoBERERL+dUMVBdXc3MmTOJiIjAarVSUlJSb56MjAwGDx5MaGgoBw8evOLlRERExLWc
-KgY2b95MUFAQhw8fJi0tjTVr1tSZfubMGbZt28aBAwfIyspiyZIlV7SciIiIuJ5TxcCePXuYNGkS
-ADabjd27d9eZnpOTQ2JiIr6+voSEhODj40NJSckvLiciIiKu51QxUFhYSHBwMAABAQFUVFQ0Oh2g
-a9euFBYW/uJyIiIi4nr+ziwUEBBwVdONMVe0XHFxMcXFxfXafX19ycvLu8oo3S8g+AZ3h3BV7gy+
-190heAXl2TWUZ9fwxDx/V3ae7/LOuzuMK9apUyd69erVqttwqhjo1q0bxcXFWCwWKisr8ff3b3B6
-raKiIiwWyy8uZ7FYsFgs9baXl5fHgAEDnAlVroLy7BrKs2soz66hPLc+V3wZduoyQXx8PNu3bwcg
-KyuLkSNHArBv3z6KioqIi4sjKyuLmpoaCgoKKC8vJzAwsNHlRERExH2cOjOQmJjIzp07iYiIwGKx
-sGXLFgAyMzNJSkoiISGBcePGERYWRvv27UlPT29yOREREXEfp4oBPz8/Nm3aVK/99ddfd7xesGAB
-CxYsuKLlRERExH00AqGIiIiX84hioKGbCqXlKc+uoTy7hvLsGspz63NFjn1M7e/+RERExCt5xJkB
-ERERaT0qBi7z4YcfOh6wNGjQIE6ePOnukK55zzzzDL179yY8PJyhQ4fy0UcfNTjfrFmz+Pzzz5tc
-l4a4blx0dDTnzzdvoBXlt2k7duwgLCyM/v37069fP95//313h9Tm7d69myeeeKJOW1JS0i9+1n/J
-rl27eOaZZ5qcJyUlhePHjzdrO9cKp35NcC379a9/zfbt27ntttv48ccfadeunbtD8gpr1qzBZrNx
-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
-/3X5/6zg9TITAAAAAElFTkSuQmCC
-"
- id="image415"
- x="114.75478"
- y="36.409554" />
- </g>
- </g>
- </g>
-</svg>
diff --git a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.dash.yml b/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.dash.yml
deleted file mode 100644
index 88e26858b5..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.dash.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-datasets:
- - uuid: products
- content: >-
- [
- ["Computers", "Scanner", 5, 3],
- ["Computers", "Printer", 7, 4],
- ["Computers", "Laptop", 3, 2],
- ["Electronics", "Camera", 10, 7],
- ["Electronics", "Headphones", 5, 9]
- ]
- columns:
- - id: Section
- type: LABEL
- - id: Product
- type: LABEL
- - id: Quantity
- type: NUMBER
- - id: Quantity2
- type: NUMBER
-pages:
- - components:
- - html: Welcome to Dashbuilder!
- properties:
- font-size: xx-large
- margin-bottom: 30px
- - settings:
- type: BARCHART
- dataSetLookup:
- uuid: products
- group:
- - columnGroup:
- source: Product
- groupFunctions:
- - source: Product
- - source: Quantity
- function: SUM
- - source: Quantity2
- function: SUM
- - settings:
- type: TABLE
- dataSetLookup:
- uuid: products
diff --git a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.svg b/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.svg
deleted file mode 100644
index 643e728edc..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.svg
+++ /dev/null
@@ -1,671 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- version="1.1"
- id="svg39"
- width="505"
- height="581"
- viewBox="0 0 505 581"
- xmlns="http://www.w3.org/2000/svg">
- <defs
- id="defs43" />
- <g
- id="g45">
- <image
- width="505"
- height="581"
- preserveAspectRatio="none"
- xlink:href="data:image/png;base64,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
-"
- id="image47" />
- </g>
-</svg>
diff --git a/packages/serverless-logic-web-tools/static/samples/swf-report/sampleResponse.json b/packages/serverless-logic-web-tools/static/samples/swf-report/sampleResponse.json
deleted file mode 100644
index 2d95bd665b..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/swf-report/sampleResponse.json
+++ /dev/null
@@ -1,5122 +0,0 @@
-{
- "data": {
- "ProcessInstances": [
- {
- "id": "0aa4eba3-f0c8-4918-a559-7a7f065047df",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-09T05:02:51.334Z",
- "end": "2022-03-09T05:02:51.399Z",
- "lastUpdate": "2022-03-09T05:02:51.426Z",
- "error": null
- },
- {
- "id": "48bbb8fa-e04a-48ec-925d-d3af9699d266",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-09T14:08:05.779Z",
- "end": "2022-03-09T14:08:05.897Z",
- "lastUpdate": "2022-03-09T14:08:05.922Z",
- "error": null
- },
- {
- "id": "ec8212e5-26fe-446d-9425-d150be682f03",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-09T14:08:11.006Z",
- "end": "2022-03-09T14:08:11.01Z",
- "lastUpdate": "2022-03-09T14:08:11.011Z",
- "error": null
- },
- {
- "id": "4193ee7b-87b2-48d0-996a-b8fb9c1085d1",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T14:42:02.621Z",
- "end": "2022-03-10T14:42:02.624Z",
- "lastUpdate": "2022-03-10T14:42:02.626Z",
- "error": null
- },
- {
- "id": "9c8e1b2a-8176-431f-b717-854f59376e20",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T14:42:08.266Z",
- "end": "2022-03-10T14:42:08.268Z",
- "lastUpdate": "2022-03-10T14:42:08.27Z",
- "error": null
- },
- {
- "id": "68a6683e-f9bb-42b4-b159-595fdad91672",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T14:42:25.06Z",
- "end": "2022-03-10T14:42:25.063Z",
- "lastUpdate": "2022-03-10T14:42:25.064Z",
- "error": null
- },
- {
- "id": "a1a4ac9f-9139-4e6e-990e-2f01d3e96c86",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T16:37:45.049Z",
- "end": "2022-03-10T16:37:45.052Z",
- "lastUpdate": "2022-03-10T16:37:45.054Z",
- "error": null
- },
- {
- "id": "9e620f68-b3d9-4563-af81-e2c12a170cca",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T16:41:17.755Z",
- "end": "2022-03-10T16:41:17.757Z",
- "lastUpdate": "2022-03-10T16:41:17.758Z",
- "error": null
- },
- {
- "id": "65743702-202d-434f-a1e9-a61ed35e0771",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T22:25:05.813Z",
- "end": "2022-03-10T22:25:05.816Z",
- "lastUpdate": "2022-03-10T22:25:05.818Z",
- "error": null
- },
- {
- "id": "77a44c9a-7d50-44c9-acab-7d794cb7561c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "ERROR",
- "start": "2022-03-10T22:25:38.41Z",
- "end": null,
- "lastUpdate": "2022-03-10T22:25:38.435Z",
- "error": {
- "message": "b542885a-f023-4f44-b00a-84f9c9e1b242 - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
- }
- },
- {
- "id": "71a05a34-b556-4146-ac38-084fc94fe3a8",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "ERROR",
- "start": "2022-03-10T22:27:12.853Z",
- "end": null,
- "lastUpdate": "2022-03-10T22:27:12.856Z",
- "error": {
- "message": "57473835-b90e-426b-bf0c-756a74900aaf - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
- }
- },
- {
- "id": "b8755fcc-c647-43e8-8a48-be987d65cf52",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "ERROR",
- "start": "2022-03-10T22:27:15.783Z",
- "end": null,
- "lastUpdate": "2022-03-10T22:27:15.785Z",
- "error": {
- "message": "1e27e635-ed16-4aa0-8378-9f039d7f022d - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
- }
- },
- {
- "id": "22b7d40b-cebd-4079-a6e2-d49abb01df11",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T22:27:31.494Z",
- "end": "2022-03-10T22:27:31.502Z",
- "lastUpdate": "2022-03-10T22:27:31.504Z",
- "error": null
- },
- {
- "id": "de686d16-c780-4590-9a6e-9edff2b9a4a8",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T22:27:33.368Z",
- "end": "2022-03-10T22:27:33.37Z",
- "lastUpdate": "2022-03-10T22:27:33.371Z",
- "error": null
- },
- {
- "id": "f9a56844-5025-47e2-b484-a8561c762fec",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:09:55.556Z",
- "end": "2022-03-10T23:09:55.558Z",
- "lastUpdate": "2022-03-10T23:09:55.56Z",
- "error": null
- },
- {
- "id": "253830fb-3cd8-4261-93b8-484fa2ae19f5",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:13:43.52Z",
- "end": "2022-03-10T23:13:43.522Z",
- "lastUpdate": "2022-03-10T23:13:43.523Z",
- "error": null
- },
- {
- "id": "32fd5dce-8126-4d1d-a077-6b00037a21b9",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:32:54.562Z",
- "end": "2022-03-10T23:32:54.565Z",
- "lastUpdate": "2022-03-10T23:32:54.567Z",
- "error": null
- },
- {
- "id": "d7f0ddda-388a-43ba-9619-7e9d116161b6",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:33:03.82Z",
- "end": "2022-03-10T23:33:03.822Z",
- "lastUpdate": "2022-03-10T23:33:03.828Z",
- "error": null
- },
- {
- "id": "bb42c091-b828-4182-9866-2e19e31367a9",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:33:06.853Z",
- "end": "2022-03-10T23:33:06.857Z",
- "lastUpdate": "2022-03-10T23:33:06.86Z",
- "error": null
- },
- {
- "id": "c3cee7fb-782a-4c87-ab28-280a4234ec20",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:33:11.331Z",
- "end": "2022-03-10T23:33:11.333Z",
- "lastUpdate": "2022-03-10T23:33:11.334Z",
- "error": null
- },
- {
- "id": "dbd27e42-68b8-4ca6-87fc-256cfc42f732",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:33:14.782Z",
- "end": "2022-03-10T23:33:14.785Z",
- "lastUpdate": "2022-03-10T23:33:14.786Z",
- "error": null
- },
- {
- "id": "749b1570-3b29-4b4d-8c52-dedaee1d479a",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:33:22.089Z",
- "end": "2022-03-10T23:33:22.098Z",
- "lastUpdate": "2022-03-10T23:33:22.099Z",
- "error": null
- },
- {
- "id": "23e4a0c8-71b6-48e1-824f-b6da0b817289",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-10T23:51:53.413Z",
- "end": "2022-03-10T23:51:53.414Z",
- "lastUpdate": "2022-03-10T23:51:53.416Z",
- "error": null
- },
- {
- "id": "7fe1c3d7-c4c7-455e-b1bd-0f0a98af5dfb",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:18:01.217Z",
- "end": "2022-03-11T00:18:01.219Z",
- "lastUpdate": "2022-03-11T00:18:01.22Z",
- "error": null
- },
- {
- "id": "10603c9a-7d85-4818-9b84-3769084bdfb2",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:18:53.142Z",
- "end": "2022-03-11T00:18:53.145Z",
- "lastUpdate": "2022-03-11T00:18:53.154Z",
- "error": null
- },
- {
- "id": "f65b1a7e-641f-440b-9979-1613c5acdfdf",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:20:44.196Z",
- "end": "2022-03-11T00:20:44.198Z",
- "lastUpdate": "2022-03-11T00:20:44.198Z",
- "error": null
- },
- {
- "id": "1fae1d16-2f52-43d2-944d-fa41b3276d4c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:20:52.579Z",
- "end": "2022-03-11T00:20:52.581Z",
- "lastUpdate": "2022-03-11T00:20:52.582Z",
- "error": null
- },
- {
- "id": "cdd98f6c-6eb7-4af6-9228-3bfd581b6088",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "ERROR",
- "start": "2022-03-11T00:25:44.409Z",
- "end": null,
- "lastUpdate": "2022-03-11T00:25:44.414Z",
- "error": {
- "message": "ad04c58e-93c3-4850-8e94-6f6fdda1ba74 - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
- }
- },
- {
- "id": "2a3a2c26-e601-4c34-aa26-942b4d360697",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:31:13.203Z",
- "end": "2022-03-11T00:31:13.205Z",
- "lastUpdate": "2022-03-11T00:31:13.205Z",
- "error": null
- },
- {
- "id": "14bb3d63-59a6-416c-826f-a117b4a3e3c3",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:31:50.424Z",
- "end": "2022-03-11T00:31:50.426Z",
- "lastUpdate": "2022-03-11T00:31:50.427Z",
- "error": null
- },
- {
- "id": "7ac41d09-5ae4-4f9d-ad79-6880f1e6bd32",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:35:53.88Z",
- "end": "2022-03-11T00:35:53.883Z",
- "lastUpdate": "2022-03-11T00:35:53.884Z",
- "error": null
- },
- {
- "id": "37653791-587b-480a-9866-fd61caf16464",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:00.919Z",
- "end": "2022-03-11T00:36:00.921Z",
- "lastUpdate": "2022-03-11T00:36:00.921Z",
- "error": null
- },
- {
- "id": "596857aa-6f6d-4ade-803d-146f67cdedb3",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:05.506Z",
- "end": "2022-03-11T00:36:05.514Z",
- "lastUpdate": "2022-03-11T00:36:05.515Z",
- "error": null
- },
- {
- "id": "66e12947-7260-4da9-8cd0-ded4bd442472",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:11.999Z",
- "end": "2022-03-11T00:36:12.001Z",
- "lastUpdate": "2022-03-11T00:36:12.002Z",
- "error": null
- },
- {
- "id": "f2480279-6164-4126-8076-c76217f1dfd2",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:20.256Z",
- "end": "2022-03-11T00:36:20.258Z",
- "lastUpdate": "2022-03-11T00:36:20.258Z",
- "error": null
- },
- {
- "id": "f3493882-0177-4a52-9f00-3d73f4a4c87e",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:26.014Z",
- "end": "2022-03-11T00:36:26.015Z",
- "lastUpdate": "2022-03-11T00:36:26.016Z",
- "error": null
- },
- {
- "id": "b2298e2f-88f1-4114-bdfc-9503e7ec46c3",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:31.751Z",
- "end": "2022-03-11T00:36:31.753Z",
- "lastUpdate": "2022-03-11T00:36:31.753Z",
- "error": null
- },
- {
- "id": "f44aa304-f064-4f58-b8f5-cd85d21c5b45",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:38.005Z",
- "end": "2022-03-11T00:36:38.006Z",
- "lastUpdate": "2022-03-11T00:36:38.007Z",
- "error": null
- },
- {
- "id": "b037ffb9-12f7-48bb-bc65-59836d59b15f",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:36:55.775Z",
- "end": "2022-03-11T00:36:55.777Z",
- "lastUpdate": "2022-03-11T00:36:55.778Z",
- "error": null
- },
- {
- "id": "3dbebbac-9e5a-414d-8e5d-654996e25bb5",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:37:00.437Z",
- "end": "2022-03-11T00:37:00.439Z",
- "lastUpdate": "2022-03-11T00:37:00.44Z",
- "error": null
- },
- {
- "id": "7b114f5a-7205-498b-92f4-bd0a3173c997",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:37:06.095Z",
- "end": "2022-03-11T00:37:06.096Z",
- "lastUpdate": "2022-03-11T00:37:06.1Z",
- "error": null
- },
- {
- "id": "741ecf38-b5ad-4786-95d9-c85cb7b4d484",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:37:12.982Z",
- "end": "2022-03-11T00:37:12.985Z",
- "lastUpdate": "2022-03-11T00:37:12.986Z",
- "error": null
- },
- {
- "id": "d91ea74d-7166-4603-a8c4-c719cb259686",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T00:55:11.981Z",
- "end": "2022-03-11T00:55:11.983Z",
- "lastUpdate": "2022-03-11T00:55:11.984Z",
- "error": null
- },
- {
- "id": "ea54826a-bd04-41ec-9f0b-1ad5130f7899",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:15:35.421Z",
- "end": "2022-03-11T02:15:35.432Z",
- "lastUpdate": "2022-03-11T02:15:35.441Z",
- "error": null
- },
- {
- "id": "2bd47c95-f8bd-4a71-bf30-16eec9e1b07b",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:15:41.391Z",
- "end": "2022-03-11T02:15:41.393Z",
- "lastUpdate": "2022-03-11T02:15:41.394Z",
- "error": null
- },
- {
- "id": "a22dd9e4-f721-4cce-8ec9-9a7c0725becc",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:16:25.272Z",
- "end": "2022-03-11T02:16:25.274Z",
- "lastUpdate": "2022-03-11T02:16:25.274Z",
- "error": null
- },
- {
- "id": "bd824def-b10d-4e0a-bcf1-c33ea03206fd",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:16:29.701Z",
- "end": "2022-03-11T02:16:29.703Z",
- "lastUpdate": "2022-03-11T02:16:29.704Z",
- "error": null
- },
- {
- "id": "5e9eaac1-2d3c-4e0f-a457-9db5b320bbda",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:16:34.433Z",
- "end": "2022-03-11T02:16:34.436Z",
- "lastUpdate": "2022-03-11T02:16:34.437Z",
- "error": null
- },
- {
- "id": "4445e034-ccf9-4e10-9391-4d3e7d5036f4",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:17:25.949Z",
- "end": "2022-03-11T02:17:25.95Z",
- "lastUpdate": "2022-03-11T02:17:25.951Z",
- "error": null
- },
- {
- "id": "70523f4d-83e8-42f2-8c1b-496a9dd3433f",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:17:32.409Z",
- "end": "2022-03-11T02:17:32.419Z",
- "lastUpdate": "2022-03-11T02:17:32.42Z",
- "error": null
- },
- {
- "id": "93782288-0f2c-4060-90a9-0d318edfb752",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:17:40.151Z",
- "end": "2022-03-11T02:17:40.153Z",
- "lastUpdate": "2022-03-11T02:17:40.154Z",
- "error": null
- },
- {
- "id": "21ee45b8-260f-4df1-aed3-9646b7354fb9",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T02:17:46.729Z",
- "end": "2022-03-11T02:17:46.731Z",
- "lastUpdate": "2022-03-11T02:17:46.731Z",
- "error": null
- },
- {
- "id": "328f3f35-6393-488f-9cda-3afee9e0147c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T13:45:22.507Z",
- "end": "2022-03-11T13:45:22.509Z",
- "lastUpdate": "2022-03-11T13:45:22.51Z",
- "error": null
- },
- {
- "id": "fe84ee9e-7587-432c-bae6-a3e64a663982",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:25:53.853Z",
- "end": "2022-03-11T17:25:53.855Z",
- "lastUpdate": "2022-03-11T17:25:53.856Z",
- "error": null
- },
- {
- "id": "9128cac3-3908-49b8-802f-703a3a21c3a5",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:25:57.228Z",
- "end": "2022-03-11T17:25:57.229Z",
- "lastUpdate": "2022-03-11T17:25:57.23Z",
- "error": null
- },
- {
- "id": "80509e04-2522-4c1e-89e5-389f03c28be4",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:25:59.504Z",
- "end": "2022-03-11T17:25:59.505Z",
- "lastUpdate": "2022-03-11T17:25:59.506Z",
- "error": null
- },
- {
- "id": "c3cbbc53-03ed-44d9-be3a-98b6f22e9ee4",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:01.537Z",
- "end": "2022-03-11T17:26:01.539Z",
- "lastUpdate": "2022-03-11T17:26:01.54Z",
- "error": null
- },
- {
- "id": "62bc666e-4f48-4c50-95af-7f4f8de96c32",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:03.558Z",
- "end": "2022-03-11T17:26:03.56Z",
- "lastUpdate": "2022-03-11T17:26:03.56Z",
- "error": null
- },
- {
- "id": "f626adeb-8e71-42d3-8d24-4590c16e553f",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:05.834Z",
- "end": "2022-03-11T17:26:05.836Z",
- "lastUpdate": "2022-03-11T17:26:05.837Z",
- "error": null
- },
- {
- "id": "2c110e56-5e07-49f5-869e-1aea39e18d81",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:07.731Z",
- "end": "2022-03-11T17:26:07.733Z",
- "lastUpdate": "2022-03-11T17:26:07.734Z",
- "error": null
- },
- {
- "id": "3a61c5fa-bbc8-4435-9666-ea49fe3f8cff",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:10.031Z",
- "end": "2022-03-11T17:26:10.033Z",
- "lastUpdate": "2022-03-11T17:26:10.033Z",
- "error": null
- },
- {
- "id": "948a17a3-32c1-49c0-bf77-1778074a7c2e",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:14.244Z",
- "end": "2022-03-11T17:26:14.251Z",
- "lastUpdate": "2022-03-11T17:26:14.252Z",
- "error": null
- },
- {
- "id": "95315504-b631-4fd1-a361-532ccdc2da16",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T17:26:18.463Z",
- "end": "2022-03-11T17:26:18.475Z",
- "lastUpdate": "2022-03-11T17:26:18.476Z",
- "error": null
- },
- {
- "id": "519a0949-4fab-4273-93dc-b4c87cff76b3",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T22:59:15.285Z",
- "end": "2022-03-11T22:59:15.286Z",
- "lastUpdate": "2022-03-11T22:59:15.287Z",
- "error": null
- },
- {
- "id": "fe27f173-5db3-4626-b06b-6add90275a1e",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T22:59:18.784Z",
- "end": "2022-03-11T22:59:18.785Z",
- "lastUpdate": "2022-03-11T22:59:18.786Z",
- "error": null
- },
- {
- "id": "5a0848a2-fec6-45f1-b617-8a49a9f32d2a",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T22:59:23.525Z",
- "end": "2022-03-11T22:59:23.527Z",
- "lastUpdate": "2022-03-11T22:59:23.527Z",
- "error": null
- },
- {
- "id": "5a8ffa47-d670-4723-9aa8-05a62b2a5ab2",
- "processId": "yamlgreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-11T22:59:26.759Z",
- "end": "2022-03-11T22:59:26.76Z",
- "lastUpdate": "2022-03-11T22:59:26.761Z",
- "error": null
- },
- {
- "id": "d9b6c141-03b1-484f-98fc-29383059797c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T00:42:21.362Z",
- "end": "2022-03-13T00:42:21.369Z",
- "lastUpdate": "2022-03-13T00:42:21.371Z",
- "error": null
- },
- {
- "id": "c15514d0-dd64-4a97-94d4-ae37e970b9fb",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T00:42:26.06Z",
- "end": "2022-03-13T00:42:26.062Z",
- "lastUpdate": "2022-03-13T00:42:26.063Z",
- "error": null
- },
- {
- "id": "567d03a4-b35e-4cd2-9c47-86902788c992",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T00:42:30.246Z",
- "end": "2022-03-13T00:42:30.248Z",
- "lastUpdate": "2022-03-13T00:42:30.248Z",
- "error": null
- },
- {
- "id": "ac929d79-6d8f-490d-90c6-8e73e1afeea4",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T00:42:32.148Z",
- "end": "2022-03-13T00:42:32.149Z",
- "lastUpdate": "2022-03-13T00:42:32.15Z",
- "error": null
- },
- {
- "id": "2da91068-0ab4-468d-8639-7398c11f3d53",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T00:42:34.518Z",
- "end": "2022-03-13T00:42:34.519Z",
- "lastUpdate": "2022-03-13T00:42:34.52Z",
- "error": null
- },
- {
- "id": "71a96a65-31f5-46c2-a5fb-051f266f5b98",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T00:42:48.408Z",
- "end": "2022-03-13T00:42:48.413Z",
- "lastUpdate": "2022-03-13T00:42:48.414Z",
- "error": null
- },
- {
- "id": "8536bd5e-74d2-44de-8bae-a4297b93fe35",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T15:56:11.688Z",
- "end": "2022-03-13T15:56:11.69Z",
- "lastUpdate": "2022-03-13T15:56:11.691Z",
- "error": null
- },
- {
- "id": "64e2ef0e-dac7-4bc8-bbf8-37cddcb00dce",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T15:56:14.544Z",
- "end": "2022-03-13T15:56:14.545Z",
- "lastUpdate": "2022-03-13T15:56:14.545Z",
- "error": null
- },
- {
- "id": "c53a6bdf-aa50-4ecd-b574-3e87c5ab2cd6",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:00:23.714Z",
- "end": "2022-03-13T16:00:23.715Z",
- "lastUpdate": "2022-03-13T16:00:23.715Z",
- "error": null
- },
- {
- "id": "98c712af-cc8b-440a-90e1-a45c1cbef506",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:00:58.069Z",
- "end": "2022-03-13T16:00:58.07Z",
- "lastUpdate": "2022-03-13T16:00:58.071Z",
- "error": null
- },
- {
- "id": "2af55fcd-c7d6-4ed5-819c-8bbd8fe8c5fd",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:06.612Z",
- "end": "2022-03-13T16:01:06.653Z",
- "lastUpdate": "2022-03-13T16:01:06.654Z",
- "error": null
- },
- {
- "id": "53fddb11-b257-44be-98e2-04bee3db5044",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:10.225Z",
- "end": "2022-03-13T16:01:10.227Z",
- "lastUpdate": "2022-03-13T16:01:10.228Z",
- "error": null
- },
- {
- "id": "10c53c09-3574-4a71-a449-68dd0e4fcc7b",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:15.353Z",
- "end": "2022-03-13T16:01:15.354Z",
- "lastUpdate": "2022-03-13T16:01:15.355Z",
- "error": null
- },
- {
- "id": "e1f2fe58-83ef-480f-bc09-3b30ff3886fc",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:18.731Z",
- "end": "2022-03-13T16:01:18.733Z",
- "lastUpdate": "2022-03-13T16:01:18.733Z",
- "error": null
- },
- {
- "id": "7838dd7b-7570-4613-8dd1-dddac155cdf8",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:21.846Z",
- "end": "2022-03-13T16:01:21.848Z",
- "lastUpdate": "2022-03-13T16:01:21.849Z",
- "error": null
- },
- {
- "id": "2315efab-d1c4-4fc8-ab3f-dbfa979110a1",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:25.342Z",
- "end": "2022-03-13T16:01:25.343Z",
- "lastUpdate": "2022-03-13T16:01:25.343Z",
- "error": null
- },
- {
- "id": "74c640fb-760f-497c-a4f3-96413b976c64",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:28.772Z",
- "end": "2022-03-13T16:01:28.774Z",
- "lastUpdate": "2022-03-13T16:01:28.781Z",
- "error": null
- },
- {
- "id": "2f08588a-6085-4262-8e5c-3d150e0f15c5",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:32.614Z",
- "end": "2022-03-13T16:01:32.616Z",
- "lastUpdate": "2022-03-13T16:01:32.616Z",
- "error": null
- },
- {
- "id": "2a513ebc-4ec9-4cd9-a133-0564c0828f8f",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:36.372Z",
- "end": "2022-03-13T16:01:36.375Z",
- "lastUpdate": "2022-03-13T16:01:36.388Z",
- "error": null
- },
- {
- "id": "77bface2-0247-475e-a0a9-371d9cf50732",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:39.661Z",
- "end": "2022-03-13T16:01:39.662Z",
- "lastUpdate": "2022-03-13T16:01:39.662Z",
- "error": null
- },
- {
- "id": "08b5a7ae-a119-4311-bd30-db892af6d7f2",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:01:43.422Z",
- "end": "2022-03-13T16:01:43.423Z",
- "lastUpdate": "2022-03-13T16:01:43.424Z",
- "error": null
- },
- {
- "id": "02738a3e-31f8-48bd-9fa0-c9974ea829ea",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:30.478Z",
- "end": "2022-03-13T16:02:30.479Z",
- "lastUpdate": "2022-03-13T16:02:30.48Z",
- "error": null
- },
- {
- "id": "3eb94f60-fe52-45f2-b92d-b57571123adc",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:33.924Z",
- "end": "2022-03-13T16:02:33.925Z",
- "lastUpdate": "2022-03-13T16:02:33.926Z",
- "error": null
- },
- {
- "id": "55fe38e8-9b6a-4479-bcc8-c9693755a294",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:38.255Z",
- "end": "2022-03-13T16:02:38.256Z",
- "lastUpdate": "2022-03-13T16:02:38.258Z",
- "error": null
- },
- {
- "id": "17c0f6cf-c0c0-48ff-9fcd-d0762d7baa10",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:41.061Z",
- "end": "2022-03-13T16:02:41.063Z",
- "lastUpdate": "2022-03-13T16:02:41.064Z",
- "error": null
- },
- {
- "id": "19b73f00-0991-46bf-9623-1d63471be21e",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:44.427Z",
- "end": "2022-03-13T16:02:44.429Z",
- "lastUpdate": "2022-03-13T16:02:44.429Z",
- "error": null
- },
- {
- "id": "585397ff-16c6-478e-a2b8-48d39d1a27f0",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:47.514Z",
- "end": "2022-03-13T16:02:47.516Z",
- "lastUpdate": "2022-03-13T16:02:47.516Z",
- "error": null
- },
- {
- "id": "02df931f-bb22-465b-9f76-d4a88519d6dd",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:50.8Z",
- "end": "2022-03-13T16:02:50.801Z",
- "lastUpdate": "2022-03-13T16:02:50.802Z",
- "error": null
- },
- {
- "id": "cb160be4-765e-48f0-b306-1b73d8129851",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:53.438Z",
- "end": "2022-03-13T16:02:53.439Z",
- "lastUpdate": "2022-03-13T16:02:53.439Z",
- "error": null
- },
- {
- "id": "d7be9eb4-3620-46b8-a4eb-e9ff1cf426b2",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:56.284Z",
- "end": "2022-03-13T16:02:56.286Z",
- "lastUpdate": "2022-03-13T16:02:56.287Z",
- "error": null
- },
- {
- "id": "3ddff3f1-687e-4f44-a57b-c6973bfe7320",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:02:58.795Z",
- "end": "2022-03-13T16:02:58.796Z",
- "lastUpdate": "2022-03-13T16:02:58.797Z",
- "error": null
- },
- {
- "id": "6b42955b-8981-42e5-bff6-179b366139a5",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:00.931Z",
- "end": "2022-03-13T16:03:00.932Z",
- "lastUpdate": "2022-03-13T16:03:00.933Z",
- "error": null
- },
- {
- "id": "cc47b9df-d0f7-44d1-ac5f-94bba8f0e0b2",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:04.095Z",
- "end": "2022-03-13T16:03:04.099Z",
- "lastUpdate": "2022-03-13T16:03:04.102Z",
- "error": null
- },
- {
- "id": "3a346472-7d63-4e2d-ab36-482bc82342be",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:09.982Z",
- "end": "2022-03-13T16:03:09.983Z",
- "lastUpdate": "2022-03-13T16:03:09.983Z",
- "error": null
- },
- {
- "id": "9951fdce-6c8a-4a02-a8a4-abf73822554f",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:12.485Z",
- "end": "2022-03-13T16:03:12.487Z",
- "lastUpdate": "2022-03-13T16:03:12.487Z",
- "error": null
- },
- {
- "id": "f5a99f39-a468-47ea-8111-8fc29e4a413c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:15.912Z",
- "end": "2022-03-13T16:03:15.913Z",
- "lastUpdate": "2022-03-13T16:03:15.913Z",
- "error": null
- },
- {
- "id": "29b18b1e-8da8-44d2-ab1d-7dd1f7c40c2d",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:18.474Z",
- "end": "2022-03-13T16:03:18.475Z",
- "lastUpdate": "2022-03-13T16:03:18.476Z",
- "error": null
- },
- {
- "id": "feb2c3c8-a02f-40b8-8c9c-bcda6aa312ca",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:22.01Z",
- "end": "2022-03-13T16:03:22.012Z",
- "lastUpdate": "2022-03-13T16:03:22.014Z",
- "error": null
- },
- {
- "id": "eb1ce4a9-daa0-4a4d-862c-803eda43ee97",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:30.605Z",
- "end": "2022-03-13T16:03:30.606Z",
- "lastUpdate": "2022-03-13T16:03:30.607Z",
- "error": null
- },
- {
- "id": "84953de2-87f8-48b6-8ab2-231b055c7519",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:34.956Z",
- "end": "2022-03-13T16:03:34.96Z",
- "lastUpdate": "2022-03-13T16:03:34.961Z",
- "error": null
- },
- {
- "id": "0bd4e60f-7792-4a5f-9da0-726d29c4eefe",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:38.223Z",
- "end": "2022-03-13T16:03:38.225Z",
- "lastUpdate": "2022-03-13T16:03:38.226Z",
- "error": null
- },
- {
- "id": "331012df-d974-41a1-ae32-43916bee1e67",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:41.658Z",
- "end": "2022-03-13T16:03:41.659Z",
- "lastUpdate": "2022-03-13T16:03:41.663Z",
- "error": null
- },
- {
- "id": "dffa2c1e-551b-43f8-9a83-80c78ab5ef9c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:47.864Z",
- "end": "2022-03-13T16:03:47.865Z",
- "lastUpdate": "2022-03-13T16:03:47.866Z",
- "error": null
- },
- {
- "id": "0de1cd77-41c9-4162-b373-9d47dc6d7ebd",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:50.872Z",
- "end": "2022-03-13T16:03:50.873Z",
- "lastUpdate": "2022-03-13T16:03:50.874Z",
- "error": null
- },
- {
- "id": "756aab3e-003e-418e-98d4-436398803a69",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:54.839Z",
- "end": "2022-03-13T16:03:54.84Z",
- "lastUpdate": "2022-03-13T16:03:54.841Z",
- "error": null
- },
- {
- "id": "e91a6002-0a59-4a95-be79-456e619d5653",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:03:57.199Z",
- "end": "2022-03-13T16:03:57.2Z",
- "lastUpdate": "2022-03-13T16:03:57.201Z",
- "error": null
- },
- {
- "id": "8c96ef9d-aa98-45f4-82ef-8a04e370eb67",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:05:18.042Z",
- "end": "2022-03-13T16:05:18.045Z",
- "lastUpdate": "2022-03-13T16:05:18.045Z",
- "error": null
- },
- {
- "id": "1897d7ab-ee7f-453b-9d97-2a8d5daf7bd9",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:05:26.027Z",
- "end": "2022-03-13T16:05:26.028Z",
- "lastUpdate": "2022-03-13T16:05:26.029Z",
- "error": null
- },
- {
- "id": "169b0138-22d0-46c1-8488-7fecf782ac78",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:05:30.76Z",
- "end": "2022-03-13T16:05:30.761Z",
- "lastUpdate": "2022-03-13T16:05:30.761Z",
- "error": null
- },
- {
- "id": "d4b5c9fe-824a-4cfd-9b38-e6e22f0cb56a",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:05:33.8Z",
- "end": "2022-03-13T16:05:33.801Z",
- "lastUpdate": "2022-03-13T16:05:33.801Z",
- "error": null
- },
- {
- "id": "ca7eb985-1a1d-4e4a-87b6-fffe67a69711",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:05:36.486Z",
- "end": "2022-03-13T16:05:36.492Z",
- "lastUpdate": "2022-03-13T16:05:36.493Z",
- "error": null
- },
- {
- "id": "44ec7a6b-b6d7-4553-ade2-5e53e618cf5c",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:06:31.689Z",
- "end": "2022-03-13T16:06:31.691Z",
- "lastUpdate": "2022-03-13T16:06:31.694Z",
- "error": null
- },
- {
- "id": "07eee0f6-a108-4f9c-8180-0794606db75b",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:07:04.874Z",
- "end": "2022-03-13T16:07:04.875Z",
- "lastUpdate": "2022-03-13T16:07:04.876Z",
- "error": null
- },
- {
- "id": "c36aa5b3-ccb7-47d3-96ce-82169c39f5f6",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:07:09.23Z",
- "end": "2022-03-13T16:07:09.231Z",
- "lastUpdate": "2022-03-13T16:07:09.231Z",
- "error": null
- },
- {
- "id": "663a3061-8702-4e0d-a274-c0a71ba0c222",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:07:14.814Z",
- "end": "2022-03-13T16:07:14.817Z",
- "lastUpdate": "2022-03-13T16:07:14.817Z",
- "error": null
- },
- {
- "id": "84d99b04-8a8d-457e-a114-2d77fc28a13a",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:09:45.002Z",
- "end": "2022-03-13T16:09:45.006Z",
- "lastUpdate": "2022-03-13T16:09:45.013Z",
- "error": null
- },
- {
- "id": "bc107aef-63b0-42e5-a531-a62cc1550d44",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:11:59.115Z",
- "end": "2022-03-13T16:11:59.116Z",
- "lastUpdate": "2022-03-13T16:11:59.117Z",
- "error": null
- },
- {
- "id": "4da36d4f-d8c7-4d78-aaf6-42ac71181aa4",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
- "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
- "state": "COMPLETED",
- "start": "2022-03-13T16:12:07.359Z",
- "end": "2022-03-13T16:12:07.361Z",
- "lastUpdate": "2022-03-13T16:12:07.361Z",
- "error": null
- },
- {
- "id": "f1fb4bb6-fc0d-4084-9731-6b258f5eb786",
- "processId": "jsongreet",
- "processName": "Greeting workflow",
... 14599 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org