diff --git a/.github/workflows/develop-build.yml b/.github/workflows/develop-build.yml
new file mode 100644
index 0000000..78664d9
--- /dev/null
+++ b/.github/workflows/develop-build.yml
@@ -0,0 +1,47 @@
+name: Publish Development Build
+
+permissions:
+ contents: write
+
+on:
+ push:
+ branches:
+ - 'develop'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out source code
+ uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v1
+ with:
+ java-version: 17
+ - name: Set up Maven cache
+ uses: actions/cache@v1
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-maven-
+ - name: Build with Maven
+ run: mvn clean verify -U -P snapshot-build
+ - name: Get current date
+ id: date
+ run: echo "::set-output name=date::$(date +'%Y-%m-%d %H:%M:%S %Z')"
+ - name: Create tag name from date
+ id: tagdate
+ run: echo "::set-output name=tagdate::$(date +'%Y-%m-%d_%H-%M-%S_%Z')"
+ - name: Release
+ id: create_release
+ uses: softprops/action-gh-release@v2
+ with:
+ name: ${{ steps.date.outputs.date }}
+ tag_name: ${{ steps.tagdate.outputs.tagdate }}
+ generate_release_notes: true
+ draft: false
+ prerelease: true
+ files: |
+ **/target/*.jar
+ install/*
diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml
new file mode 100644
index 0000000..e3a9552
--- /dev/null
+++ b/.github/workflows/release-build.yml
@@ -0,0 +1,40 @@
+name: Publish Release Build
+
+permissions:
+ contents: write
+
+on:
+ push:
+ tags:
+ - 'v*'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out source code
+ uses: actions/checkout@v4
+ - name: Set up JDK 17
+ uses: actions/setup-java@v1
+ with:
+ java-version: 17
+ - name: Set up Maven cache
+ uses: actions/cache@v1
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-maven-
+ - name: Build with Maven
+ run: mvn clean verify -U -P release-build
+ - name: Release
+ id: create_release
+ uses: softprops/action-gh-release@v2
+ with:
+ name: Release ${{ github.ref_name }}
+ generate_release_notes: true
+ draft: false
+ prerelease: false
+ files: |
+ **/target/*.jar
+ install/*
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 00a4436..0000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-name: Build and upload to release
-
-on:
- push:
- branch:
- - 'master'
-
-jobs:
- build:
- runs-on: ubuntu-latest
- steps:
- - name: Check out source code
- uses: actions/checkout@v2
- - name: Set up JDK 11
- uses: actions/setup-java@v1
- with:
- java-version: 11
- - name: Set up Maven cache
- uses: actions/cache@v1
- with:
- path: ~/.m2/repository
- key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
- restore-keys: |
- ${{ runner.os }}-maven-
- - name: Build with Maven
- run: mvn package --file plugin/pom.xml -DskipTests
- - name: Get current date
- id: date
- run: echo "::set-output name=date::$(date +'%Y-%m-%d %H:%M:%S %Z')"
- - name: Create tag name from date
- id: tagdate
- run: echo "::set-output name=tagdate::$(date +'%Y-%m-%d_%H-%M-%S_%Z')"
- - name: Create Release
- id: create_release
- uses: actions/create-release@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- tag_name: ${{ steps.tagdate.outputs.tagdate }}
- release_name: ${{ steps.date.outputs.date }}
- draft: false
- prerelease: false
- - name: Upload main asset
- id: upload-main-asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
- asset_path: plugin/module-main/target/plugin_intranda_opac_generic_xml.jar
- asset_name: plugin_intranda_opac_generic_xml.jar
- asset_content_type: application/jar
- - name: Upload Config asset
- id: upload-config-asset
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- upload_url: ${{ steps.create_release.outputs.upload_url }}
- asset_path: plugin/plugin_intranda_opac_xml.xml
- asset_name: plugin_intranda_opac_xml.xml
- asset_content_type: text/xml
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9f88813
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,20 @@
+
+# Junk files
+*~
+.DS_Store
+
+# Build
+target/
+bin/
+build/
+node_modules/
+
+# Eclipse
+.project
+.classpath
+.settings/
+
+# IntelliJ IDEA
+.idea
+*.iml
+
diff --git a/Jenkinsfile b/Jenkinsfile
index 44df4ed..13cb478 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,9 +1,13 @@
+
pipeline {
agent {
docker {
- image 'maven:3-jdk-11'
- args '-v $HOME/.m2:/var/maven/.m2:z -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
+ /* using a custom build image with a defined home directory for UID 1000 among other things */
+ image 'nexus.intranda.com:4443/maven:3.9.3-eclipse-temurin-17'
+ registryUrl 'https://nexus.intranda.com:4443'
+ registryCredentialsId 'jenkins-docker'
+ args '-v $HOME/.m2:/var/maven/.m2:z -v $HOME/.config:/var/maven/.config -v $HOME/.sonar:/var/maven/.sonar -u 1000 -ti -e _JAVA_OPTIONS=-Duser.home=/var/maven -e MAVEN_CONFIG=/var/maven/.m2'
}
}
@@ -11,26 +15,119 @@ pipeline {
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '15', daysToKeepStr: '90', numToKeepStr: '')
}
-
-
stages {
stage('prepare') {
steps {
- sh 'git clean -fdx'
+ sh 'git reset --hard HEAD && git clean -fdx'
}
}
-
- stage('build') {
+ stage('build-snapshot') {
+ when {
+ not {
+ anyOf {
+ branch 'master'
+ branch 'release_*'
+ allOf {
+ branch 'PR-*'
+ expression { env.CHANGE_BRANCH.startsWith("release_") }
+ }
+ }
+ }
+ }
+ steps {
+ sh 'mvn clean verify -U -P snapshot-build'
+ }
+ }
+ stage('build-release') {
+ when {
+ anyOf {
+ branch 'master'
+ branch 'release_*'
+ allOf {
+ branch 'PR-*'
+ expression { env.CHANGE_BRANCH.startsWith("release_") }
+ }
+ }
+ }
+ steps {
+ sh 'mvn clean verify -U -P release-build'
+ }
+ }
+ stage('sonarcloud') {
+ when {
+ anyOf {
+ branch 'master'
+ branch 'release_*'
+ branch 'sonar_*'
+ allOf {
+ branch 'PR-*'
+ expression { env.CHANGE_BRANCH.startsWith("release_") }
+ }
+ }
+ }
steps {
- sh 'mvn -f plugin/pom.xml package'
- recordIssues enabledForFailure: true, aggregatingResults: true, tools: [java(), javaDoc()]
+ withCredentials([string(credentialsId: 'jenkins-sonarcloud', variable: 'TOKEN')]) {
+ sh 'mvn verify sonar:sonar -Dsonar.token=$TOKEN -U'
+ }
+ }
+ }
+ stage('deploy-libs') {
+ when {
+ anyOf {
+ branch 'master'
+ branch 'develop'
+ }
+ }
+ steps {
+ script {
+ if (fileExists('module-lib/pom.xml')) {
+ sh 'mvn -N deploy'
+ sh 'mvn -f module-lib/pom.xml deploy'
+ }
+ }
+ }
+ }
+ stage('tag release') {
+ when { branch 'master' }
+ steps {
+ withCredentials([gitUsernamePassword(credentialsId: '93f7e7d3-8f74-4744-a785-518fc4d55314',
+ gitToolName: 'git-tool')]) {
+ sh '''#!/bin/bash -xe
+ projectversion=$(mvn org.apache.maven.plugins:maven-help-plugin:3.4.0:evaluate -Dexpression=project.version -q -DforceStdout)
+ if [ $? != 0 ]
+ then
+ exit 1
+ elif [[ "${projectversion}" =~ "SNAPSHOT" ]]
+ then
+ echo "This is a SNAPSHOT version"
+ exit 1
+ fi
+ echo "${projectversion}"
+ git tag -a "v${projectversion}" -m "releasing v${projectversion}" && git push origin v"${projectversion}"
+ '''
+ }
}
}
}
-
+
post {
+ always {
+ junit allowEmptyResults: true, testResults: "**/target/surefire-reports/*.xml"
+ step([
+ $class : 'JacocoPublisher',
+ execPattern : '**/target/jacoco.exec',
+ classPattern : '**/target/classes/',
+ sourcePattern : '**/src/main/java',
+ exclusionPattern : '**/*Test.class'
+ ])
+ recordIssues (
+ enabledForFailure: true, aggregatingResults: false,
+ tools: [checkStyle(pattern: 'target/checkstyle-result.xml', reportEncoding: 'UTF-8')]
+ )
+ dependencyCheckPublisher pattern: 'target/dependency-check-report.xml'
+ }
success {
- archiveArtifacts artifacts: '**/target/*.jar, */plugin_*.xml, plugin_*.xml', fingerprint: true, onlyIfSuccessful: true
+ archiveArtifacts artifacts: '**/target/*.jar, install/*', fingerprint: true, onlyIfSuccessful: true
}
changed {
emailext(
@@ -42,5 +139,3 @@ pipeline {
}
}
}
-
-/* vim: set ts=2 sw=2 tw=120 et :*/
\ No newline at end of file
diff --git a/plugin/build.xml b/build.xml
similarity index 100%
rename from plugin/build.xml
rename to build.xml
diff --git a/plugin/plugin_intranda_opac_xml.xml b/install/plugin_intranda_opac_xml.xml
similarity index 100%
rename from plugin/plugin_intranda_opac_xml.xml
rename to install/plugin_intranda_opac_xml.xml
diff --git a/module-base/pom.xml b/module-base/pom.xml
new file mode 100644
index 0000000..02be287
--- /dev/null
+++ b/module-base/pom.xml
@@ -0,0 +1,10 @@
+
+ 4.0.0
+
+ io.goobi.workflow.plugin
+ plugin-opac-generic-xml
+ 24.04.2
+
+ plugin-opac-generic-xml-base
+ jar
+
\ No newline at end of file
diff --git a/plugin/src/main/java/de/intranda/goobi/plugins/ConfigurationEntry.java b/module-base/src/main/java/de/intranda/goobi/plugins/ConfigurationEntry.java
similarity index 100%
rename from plugin/src/main/java/de/intranda/goobi/plugins/ConfigurationEntry.java
rename to module-base/src/main/java/de/intranda/goobi/plugins/ConfigurationEntry.java
diff --git a/plugin/src/main/java/de/intranda/goobi/plugins/XmlOpacPlugin.java b/module-base/src/main/java/de/intranda/goobi/plugins/XmlOpacPlugin.java
similarity index 84%
rename from plugin/src/main/java/de/intranda/goobi/plugins/XmlOpacPlugin.java
rename to module-base/src/main/java/de/intranda/goobi/plugins/XmlOpacPlugin.java
index 41b43d9..230bfe6 100644
--- a/plugin/src/main/java/de/intranda/goobi/plugins/XmlOpacPlugin.java
+++ b/module-base/src/main/java/de/intranda/goobi/plugins/XmlOpacPlugin.java
@@ -10,6 +10,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.StringTokenizer;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
@@ -32,6 +33,7 @@
import de.sub.goobi.helper.Helper;
import de.sub.goobi.helper.StorageProvider;
import de.sub.goobi.helper.StorageProviderInterface;
+import de.sub.goobi.helper.UghHelper;
import de.unigoettingen.sub.search.opac.ConfigOpac;
import de.unigoettingen.sub.search.opac.ConfigOpacCatalogue;
import de.unigoettingen.sub.search.opac.ConfigOpacDoctype;
@@ -61,6 +63,7 @@ public class XmlOpacPlugin implements IOpacPlugin {
private String documentType = null;
private String anchorType = null;
+ protected String atstsl;
private XPathFactory xFactory = XPathFactory.instance();
@@ -76,7 +79,8 @@ public class XmlOpacPlugin implements IOpacPlugin {
@Override
public Fileformat search(String inSuchfeld, String inSuchbegriff, ConfigOpacCatalogue coc, Prefs prefs) throws Exception {
-
+ String myTitle = "";
+ StringBuilder authors = new StringBuilder();
if (namespaces == null) {
loadConfiguration();
}
@@ -170,6 +174,7 @@ public Fileformat search(String inSuchfeld, String inSuchbegriff, ConfigOpacCata
for (String value : metadataValues) {
try {
if (mdt.getIsPerson()) {
+ authors.append(value).append("; ");
Person p = new Person(mdt);
if (value.contains(",")) {
p.setLastname(value.substring(0, value.indexOf(",")).trim());
@@ -188,7 +193,9 @@ public Fileformat search(String inSuchfeld, String inSuchbegriff, ConfigOpacCata
anchor.addPerson(p);
}
} else {
-
+ if ("TitleDocMain".equals(sp.getMetadataName())) {
+ myTitle = value.toLowerCase();
+ }
Metadata md = new Metadata(mdt);
md.setValue(value);
if ("physical".equals(sp.getLevel())) {
@@ -210,6 +217,7 @@ public Fileformat search(String inSuchfeld, String inSuchbegriff, ConfigOpacCata
}
}
}
+ this.atstsl = createAtstsl(myTitle, authors.toString());
return mm;
}
@@ -312,9 +320,12 @@ public int getHitcount() {
return hit;
}
+ /* (non-Javadoc)
+ * @see de.sub.goobi.Import.IOpac#getAtstsl()
+ */
@Override
public String getAtstsl() {
- return null;
+ return this.atstsl;
}
@Override
@@ -323,13 +334,64 @@ public ConfigOpacDoctype getOpacDocType() {
}
@Override
- public String createAtstsl(String value, String value2) {
- return null;
+ public String createAtstsl(String myTitle, String autor) {
+ String myAtsTsl = "";
+ if (autor != null && !"".equals(autor)) {
+ /* autor */
+ if (autor.length() > 4) {
+ myAtsTsl = autor.substring(0, 4);
+ } else {
+ myAtsTsl = autor;
+ /* titel */
+ }
+
+ if (myTitle.length() > 4) {
+ myAtsTsl += myTitle.substring(0, 4);
+ } else {
+ myAtsTsl += myTitle;
+ }
+ }
+
+ // if no author {
+ if (autor == null || "".equals(autor)) {
+ myAtsTsl = "";
+ StringTokenizer tokenizer = new StringTokenizer(myTitle);
+ int counter = 1;
+ while (tokenizer.hasMoreTokens()) {
+ String tok = tokenizer.nextToken();
+ if (counter == 1) {
+ if (tok.length() > 4) {
+ myAtsTsl += tok.substring(0, 4);
+ } else {
+ myAtsTsl += tok;
+ }
+ }
+ if (counter == 2 || counter == 3) {
+ if (tok.length() > 2) {
+ myAtsTsl += tok.substring(0, 2);
+ } else {
+ myAtsTsl += tok;
+ }
+ }
+ if (counter == 4) {
+ if (tok.length() > 1) {
+ myAtsTsl += tok.substring(0, 1);
+ } else {
+ myAtsTsl += tok;
+ }
+ }
+ counter++;
+ }
+ }
+ // replace umlauts
+ myAtsTsl = UghHelper.convertUmlaut(myAtsTsl);
+ myAtsTsl = myAtsTsl.replaceAll("[\\W]", "");
+ return myAtsTsl;
}
@Override
public void setAtstsl(String createAtstsl) {
-
+ atstsl = createAtstsl;
}
@Override
diff --git a/plugin/.classpath b/plugin/.classpath
deleted file mode 100644
index 88d9894..0000000
--- a/plugin/.classpath
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/plugin/.gitignore b/plugin/.gitignore
deleted file mode 100644
index b83d222..0000000
--- a/plugin/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/plugin/.project b/plugin/.project
deleted file mode 100644
index e40df3a..0000000
--- a/plugin/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- goobi-plugin-opac-generic-xml
-
-
-
-
-
- org.eclipse.jdt.core.javabuilder
-
-
-
-
- org.eclipse.m2e.core.maven2Builder
-
-
-
-
-
- org.eclipse.jdt.core.javanature
- org.eclipse.m2e.core.maven2Nature
-
-
diff --git a/plugin/.settings/org.eclipse.core.resources.prefs b/plugin/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f9fe345..0000000
--- a/plugin/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/test/java=UTF-8
-encoding/=UTF-8
diff --git a/plugin/.settings/org.eclipse.jdt.core.prefs b/plugin/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2bd4e77..0000000
--- a/plugin/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,16 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=11
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=11
diff --git a/plugin/.settings/org.eclipse.m2e.core.prefs b/plugin/.settings/org.eclipse.m2e.core.prefs
deleted file mode 100644
index f897a7f..0000000
--- a/plugin/.settings/org.eclipse.m2e.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
diff --git a/plugin/.settings/org.jboss.ide.eclipse.as.core.prefs b/plugin/.settings/org.jboss.ide.eclipse.as.core.prefs
deleted file mode 100644
index cf3aa3a..0000000
--- a/plugin/.settings/org.jboss.ide.eclipse.as.core.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-org.jboss.ide.eclipse.as.core.singledeployable.deployableList=
diff --git a/plugin/module-main/.gitignore b/plugin/module-main/.gitignore
deleted file mode 100644
index b83d222..0000000
--- a/plugin/module-main/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/target/
diff --git a/plugin/module-main/pom.xml b/plugin/module-main/pom.xml
deleted file mode 100644
index a55c242..0000000
--- a/plugin/module-main/pom.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-
- 4.0.0
- de.intranda.goobi.plugins.opac
- generic-xml-main
- 24.02.1
-
- plugin_intranda_opac_generic_xml
- /opt/digiverso/goobi/plugins/opac/
- 1.8
- 1.8
-
-
- de.intranda.goobi.plugins.opac
- generic-xml
- 24.02.1
-
-
-
- intranda
- https://nexus.intranda.com/repository/intranda
-
-
-
- ${jar.name}
- ${project.basedir}/../src
- ${project.basedir}/../test/src
-
-
- ../src
-
- **/*.java
-
-
-
-
-
- maven-compiler-plugin
- 3.7.0
-
-
- 1.8
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.12.4
-
- true
-
-
-
- org.codehaus.mojo
- buildnumber-maven-plugin
- 1.4
-
-
- validate
-
- create
-
-
-
-
- 10
- false
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- 3.1.0
-
-
-
- ${maven.build.timestamp}
-
-
-
- Versions
-
- ${project.version}
- ${buildNumber}
- ${scmBranch}
- ${goobi.version}
-
-
-
-
-
-
-
-
-
diff --git a/plugin/pom.xml b/plugin/pom.xml
deleted file mode 100644
index 0ce16c7..0000000
--- a/plugin/pom.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-
- 4.0.0
- de.intranda.goobi.plugins.opac
- generic-xml
- 24.02.1
- pom
- ead
- http://maven.apache.org
-
- UTF-8
- 1.8
- 1.8
- 24.02.1
-
-
- module-main
-
-
-
- intranda-releases
- https://nexus.intranda.com/repository/maven-releases
-
-
-
-
- intranda-public
- https://nexus.intranda.com/repository/maven-public
-
-
-
-
- de.intranda.goobi.workflow
- goobi-core-jar
- ${goobi.version}
-
-
-
- junit
- junit
- [4.13.1,)
- test
-
-
-
- org.projectlombok
- lombok
- 1.18.4
- provided
-
-
-
- scm:git:ssh://git@gitea.intranda.com:goobi-workflow/goobi-plugin-opac-generic-xml.git
- scm:git:ssh://git@gitea.intranda.com:goobi-workflow/goobi-plugin-opac-generic-xml.git
-
-
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..5d6f2fb
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+
+ io.goobi.workflow
+ workflow-base
+ 24.04.2
+
+
+ io.goobi.workflow.plugin
+ plugin-opac-generic-xml
+ pom
+
+ module-base
+
+
+
+ intranda-public
+ https://nexus.intranda.com/repository/maven-public
+
+
+
+
+ io.goobi.workflow
+ workflow-core
+ ${project.version}
+ classes
+
+
+
\ No newline at end of file