diff --git a/.gitignore b/.gitignore
index 667aaef..1c4cf5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
HELP.md
target/
+data/
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
diff --git a/.mvn/maven.config b/.mvn/maven.config
new file mode 100644
index 0000000..1388250
--- /dev/null
+++ b/.mvn/maven.config
@@ -0,0 +1,2 @@
+-s
+.mvn/settings.xml
diff --git a/.mvn/settings.xml b/.mvn/settings.xml
new file mode 100644
index 0000000..86ca28e
--- /dev/null
+++ b/.mvn/settings.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+ huaweicloud
+ *
+ Huawei Cloud Maven
+ https://repo.huaweicloud.com/repository/maven/
+
+
+
+
+
+ cn-mirrors
+
+
+ huaweicloud
+ https://repo.huaweicloud.com/repository/maven/
+ true
+ true
+
+
+ aliyun-public
+ https://maven.aliyun.com/repository/public
+ true
+ true
+
+
+ tencent
+ https://mirrors.cloud.tencent.com/nexus/repository/maven-public/
+ true
+ true
+
+
+
+
+ huaweicloud
+ https://repo.huaweicloud.com/repository/maven/
+ true
+ true
+
+
+ aliyun-public
+ https://maven.aliyun.com/repository/public
+ true
+ true
+
+
+
+
+
+
+ cn-mirrors
+
+
+
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
index 216df05..6d9191e 100644
--- a/.mvn/wrapper/maven-wrapper.properties
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -1,3 +1,3 @@
wrapperVersion=3.3.4
distributionType=only-script
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip
+distributionUrl=https://repo.huaweicloud.com/repository/maven/org/apache/maven/apache-maven/3.9.16/apache-maven-3.9.16-bin.zip
diff --git a/mvnw-cn b/mvnw-cn
new file mode 100755
index 0000000..cb6e0c4
--- /dev/null
+++ b/mvnw-cn
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+# Run Maven with Chinese DNS / hosts overrides.
+# WSL default nameserver (10.255.255.254) often hangs; this bypasses it.
+set -euo pipefail
+ROOT="$(cd "$(dirname "$0")" && pwd)"
+REAL_HOME="${HOME}"
+DNS_DIR="${TMPDIR:-/tmp}/maven-dns-fix"
+mkdir -p "$DNS_DIR"
+printf 'nameserver 223.5.5.5\nnameserver 119.29.29.29\noptions timeout:2 attempts:2\n' > "$DNS_DIR/resolv.conf"
+cat > "$DNS_DIR/hosts" <<'EOF'
+127.0.0.1 localhost
+::1 localhost
+122.228.195.18 maven.aliyun.com
+180.163.142.26 repo.huaweicloud.com
+61.170.82.70 mirrors.cloud.tencent.com
+EOF
+
+if unshare --user --map-root-user --mount true 2>/dev/null; then
+ exec unshare --user --map-root-user --mount bash -c "
+ mount --bind '$DNS_DIR/resolv.conf' /etc/resolv.conf
+ mount --bind '$DNS_DIR/hosts' /etc/hosts
+ export HOME='$REAL_HOME'
+ export MAVEN_OPTS=\"\${MAVEN_OPTS:-} -Dmaven.repo.local=$REAL_HOME/.m2/repository\"
+ cd '$ROOT'
+ exec ./mvnw \"\$@\"
+ " bash "$@"
+else
+ echo "warn: unshare unavailable; running ./mvnw without DNS override" >&2
+ exec "$ROOT/mvnw" "$@"
+fi
diff --git a/pom.xml b/pom.xml
index c1abcc6..98e34db 100644
--- a/pom.xml
+++ b/pom.xml
@@ -42,6 +42,25 @@
org.springframework.boot
spring-boot-starter-webmvc
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.ahocorasick
+ ahocorasick
+ 0.6.3
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
org.springframework.boot
diff --git a/src/main/java/com/example/demo/api/package-info.java b/src/main/java/com/example/demo/api/package-info.java
new file mode 100644
index 0000000..bbf812a
--- /dev/null
+++ b/src/main/java/com/example/demo/api/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.api;
diff --git a/src/main/java/com/example/demo/application/package-info.java b/src/main/java/com/example/demo/application/package-info.java
new file mode 100644
index 0000000..4a3dd64
--- /dev/null
+++ b/src/main/java/com/example/demo/application/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.application;
diff --git a/src/main/java/com/example/demo/config/package-info.java b/src/main/java/com/example/demo/config/package-info.java
new file mode 100644
index 0000000..a4bc723
--- /dev/null
+++ b/src/main/java/com/example/demo/config/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.config;
diff --git a/src/main/java/com/example/demo/domain/package-info.java b/src/main/java/com/example/demo/domain/package-info.java
new file mode 100644
index 0000000..39ae1b8
--- /dev/null
+++ b/src/main/java/com/example/demo/domain/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.domain;
diff --git a/src/main/java/com/example/demo/job/package-info.java b/src/main/java/com/example/demo/job/package-info.java
new file mode 100644
index 0000000..0ee192b
--- /dev/null
+++ b/src/main/java/com/example/demo/job/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.job;
diff --git a/src/main/java/com/example/demo/matcher/package-info.java b/src/main/java/com/example/demo/matcher/package-info.java
new file mode 100644
index 0000000..2a7738e
--- /dev/null
+++ b/src/main/java/com/example/demo/matcher/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.matcher;
diff --git a/src/main/java/com/example/demo/repository/package-info.java b/src/main/java/com/example/demo/repository/package-info.java
new file mode 100644
index 0000000..0919a62
--- /dev/null
+++ b/src/main/java/com/example/demo/repository/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.repository;
diff --git a/src/main/java/com/example/demo/support/package-info.java b/src/main/java/com/example/demo/support/package-info.java
new file mode 100644
index 0000000..de0793d
--- /dev/null
+++ b/src/main/java/com/example/demo/support/package-info.java
@@ -0,0 +1 @@
+package com.example.demo.support;
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
deleted file mode 100644
index 2109a44..0000000
--- a/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-spring.application.name=demo
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..3de83c3
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,31 @@
+spring:
+ application:
+ name: asr-event-monitor
+
+ datasource:
+ url: jdbc:h2:file:./data/rules;DB_CLOSE_ON_EXIT=FALSE
+ username: sa
+ password:
+
+ jpa:
+ hibernate:
+ ddl-auto: update
+ open-in-view: false
+
+server:
+ port: 8080
+
+monitor:
+ recent-final-window-size: 2
+ max-processed-seqs: 500
+ session-ttl: PT2H
+ session-cleanup-interval: PT10M
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include:
+ - health
+ - info
+ - metrics
diff --git a/src/main/resources/static/.gitkeep b/src/main/resources/static/.gitkeep
new file mode 100644
index 0000000..e69de29