From 9082501373bc2d8cf8cc46b8e63c677700ed46b8 Mon Sep 17 00:00:00 2001 From: FanBin Date: Tue, 22 Jul 2025 22:20:01 +0800 Subject: [PATCH] first version --- .gitignore | 6 + hadoop.dll | Bin 0 -> 84992 bytes pom.xml | 179 ++++++++++++++++++ .../com/fanbin/FlinkKafkaConsumerExample.java | 66 +++++++ .../com/fanbin/JVM/CustomClassLoader.java | 40 ++++ .../com/fanbin/JVM/CustomClassLoaderDemo.java | 34 ++++ .../java/com/fanbin/KafkaMessageProducer.java | 54 ++++++ src/main/java/com/fanbin/Main.java | 42 ++++ src/main/java/com/fanbin/MapPutTest.java | 33 ++++ .../com/fanbin/SparkFileStreamingReader.java | 45 +++++ .../java/com/fanbin/SparkKafkaReader.java | 86 +++++++++ .../com/fanbin/ThreadPoolFutureExample.java | 127 +++++++++++++ .../com/fanbin/TransactionAlertSystem.java | 154 +++++++++++++++ .../com/fanbin/TransactionMonitoringCEP.java | 148 +++++++++++++++ src/main/java/com/fanbin/leetcode/LC11.java | 29 +++ .../java/com/fanbin/leetcode/ThreeNum.java | 27 +++ src/main/resources/log4j.properties | 20 ++ winutils.exe | Bin 0 -> 112640 bytes 18 files changed, 1090 insertions(+) create mode 100644 .gitignore create mode 100644 hadoop.dll create mode 100644 pom.xml create mode 100644 src/main/java/com/fanbin/FlinkKafkaConsumerExample.java create mode 100644 src/main/java/com/fanbin/JVM/CustomClassLoader.java create mode 100644 src/main/java/com/fanbin/JVM/CustomClassLoaderDemo.java create mode 100644 src/main/java/com/fanbin/KafkaMessageProducer.java create mode 100644 src/main/java/com/fanbin/Main.java create mode 100644 src/main/java/com/fanbin/MapPutTest.java create mode 100644 src/main/java/com/fanbin/SparkFileStreamingReader.java create mode 100644 src/main/java/com/fanbin/SparkKafkaReader.java create mode 100644 src/main/java/com/fanbin/ThreadPoolFutureExample.java create mode 100644 src/main/java/com/fanbin/TransactionAlertSystem.java create mode 100644 src/main/java/com/fanbin/TransactionMonitoringCEP.java create mode 100644 src/main/java/com/fanbin/leetcode/LC11.java create mode 100644 src/main/java/com/fanbin/leetcode/ThreeNum.java create mode 100644 src/main/resources/log4j.properties create mode 100644 winutils.exe diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d613c08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/.idea/ +/.vscode/ +/checkpoints/ +/data/ +/output/ +/target/ diff --git a/hadoop.dll b/hadoop.dll new file mode 100644 index 0000000000000000000000000000000000000000..60fb8b1336de7ec890e594c6910678e7be35786f GIT binary patch literal 84992 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 jlPQf5e#`NH|G>$C + + 4.0.0 + + com.fanbin + demo + 1.0-SNAPSHOT + + + central + Maven Central Repository + https://repo.maven.apache.org/maven2 + + false + + + + + 17 + 17 + 1.17.1 + + + + + + org.apache.spark + spark-core_2.12 + 3.3.0 + + + + org.apache.spark + spark-sql_2.12 + 3.3.0 + + + + org.apache.spark + spark-sql-kafka-0-10_2.12 + 3.3.0 + + + + org.apache.kafka + kafka-clients + 3.2.0 + + + + org.apache.flink + flink-java + ${flink.version} + + + org.apache.flink + flink-clients + ${flink.version} + + + + + + + + + org.apache.flink + flink-runtime-web + ${flink.version} + + + + org.apache.flink + flink-connector-files + ${flink.version} + + + org.apache.flink + flink-streaming-java + ${flink.version} + + + + + + + + + + org.apache.flink + flink-cep + ${flink.version} + provided + + + + org.apache.flink + flink-connector-kafka + ${flink.version} + + + org.apache.kafka + kafka-clients + + + + + + + + + org.apache.flink + flink-runtime + ${flink.version} + tests + + + + + + + + + org.apache.flink + flink-json + ${flink.version} + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.2 + + + + com.fanbin.TransactionAlertSystem + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.4.1 + + + package + + shade + + + false + + + com.fanbin.TransactionAlertSystem + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fanbin/FlinkKafkaConsumerExample.java b/src/main/java/com/fanbin/FlinkKafkaConsumerExample.java new file mode 100644 index 0000000..1dfa784 --- /dev/null +++ b/src/main/java/com/fanbin/FlinkKafkaConsumerExample.java @@ -0,0 +1,66 @@ +package com.fanbin; + +import org.apache.flink.api.common.eventtime.WatermarkStrategy; +import org.apache.flink.api.common.serialization.SimpleStringSchema; +import org.apache.flink.configuration.Configuration; +import org.apache.flink.configuration.RestOptions; +import org.apache.flink.connector.kafka.source.KafkaSource; +import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; + +import java.util.Properties; + +public class FlinkKafkaConsumerExample { + private static final String TOPIC_NAME = "topic_10"; + private static final String BOOTSTRAP_SERVERS = "localhost:9092"; + private static final String GROUP_ID = "flink-consumer-group"; + + public static void main(String[] args) throws Exception { + // 设置Flink执行环境 +// final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); + Configuration config = new Configuration(); + config.setInteger(RestOptions.PORT, 8081); // 设置 Web UI 端口 + + // 创建带 Web UI 的本地执行环境 + StreamExecutionEnvironment env = StreamExecutionEnvironment + .createLocalEnvironmentWithWebUI(config); + + // 设置并行度 + env.setParallelism(4); + + // 添加 Kafka 源(见下一步) + // ... + + // 执行任务 + // 配置Kafka消费者属性 + Properties properties = new Properties(); + properties.setProperty("bootstrap.servers", BOOTSTRAP_SERVERS); + properties.setProperty("group.id", GROUP_ID); +// properties.setProperty("rest.port", "8081"); // 设置Flink REST端口 + + // 创建KafkaSource + KafkaSource source = KafkaSource.builder() + .setBootstrapServers(BOOTSTRAP_SERVERS) + .setTopics(TOPIC_NAME) + .setGroupId(GROUP_ID) +// .setProperties(properties) + .setStartingOffsets(OffsetsInitializer.earliest()) // 从最早偏移量开始消费 + .setValueOnlyDeserializer(new SimpleStringSchema()) // 只反序列化value + .build(); + + // 从Kafka读取数据 + DataStream kafkaStream = env.fromSource(source, + WatermarkStrategy.noWatermarks(), // 不使用水印 + "Kafka Source"); + + // 处理数据 - 打印到控制台 + kafkaStream.print(); + + // 执行Flink作业 + env.execute("Flink Kafka Consumer Example"); + + + + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/JVM/CustomClassLoader.java b/src/main/java/com/fanbin/JVM/CustomClassLoader.java new file mode 100644 index 0000000..eff9de4 --- /dev/null +++ b/src/main/java/com/fanbin/JVM/CustomClassLoader.java @@ -0,0 +1,40 @@ +package com.fanbin.JVM; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class CustomClassLoader extends ClassLoader { + + private final String classPath; + + public CustomClassLoader(String classPath) { + this.classPath = classPath; + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + try { + byte[] classData = loadClassData(name); + return defineClass(name, classData, 0, classData.length); + } catch (IOException e) { + throw new ClassNotFoundException("Class not found: " + name, e); + } + } + + private byte[] loadClassData(String className) throws IOException { + String path = classPath + File.separatorChar + + className.replace('.', File.separatorChar) + ".class"; + try (FileInputStream fis = new FileInputStream(path); + ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + bos.write(buffer, 0, bytesRead); + } + return bos.toByteArray(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/JVM/CustomClassLoaderDemo.java b/src/main/java/com/fanbin/JVM/CustomClassLoaderDemo.java new file mode 100644 index 0000000..3ccfde8 --- /dev/null +++ b/src/main/java/com/fanbin/JVM/CustomClassLoaderDemo.java @@ -0,0 +1,34 @@ +package com.fanbin.JVM; + +import java.lang.reflect.Method; + +public class CustomClassLoaderDemo { + + public static void main(String[] args) throws Exception { + // 1. 创建自定义类加载器实例 + String classPath = "target/classes"; + CustomClassLoader loader = new CustomClassLoader(classPath); + + // 2. 加载类 + String className = "com.fanbin.JVM.MapPutTest"; + Class dynamicClass = loader.loadClass(className); + + // 3. 创建实例 + Object instance = dynamicClass.getDeclaredConstructor().newInstance(); + + // 4. 调用方法(通过反射) + // 假设MyDynamicClass有一个doWork方法 + Method doWorkMethod = dynamicClass.getMethod("generateRandomString"); + doWorkMethod.invoke(instance); + + // 5. 使用接口调用(推荐) + if (instance instanceof MyInterface) { + ((MyInterface) instance).doWork(); + } + } + + // 公共接口(由系统类加载器加载) + public interface MyInterface { + void doWork(); + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/KafkaMessageProducer.java b/src/main/java/com/fanbin/KafkaMessageProducer.java new file mode 100644 index 0000000..d4de14c --- /dev/null +++ b/src/main/java/com/fanbin/KafkaMessageProducer.java @@ -0,0 +1,54 @@ +package com.fanbin; + +import org.apache.kafka.clients.producer.KafkaProducer; +import org.apache.kafka.clients.producer.ProducerConfig; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.common.serialization.StringSerializer; + +import java.util.Properties; +import java.util.concurrent.TimeUnit; + +public class KafkaMessageProducer { + private static final String TOPIC_NAME = "topic_100"; + private static final String BOOTSTRAP_SERVERS = "localhost:9092"; + + public static void main(String[] args) { + // 配置Kafka生产者属性 + Properties props = new Properties(); + props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS); + props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); + props.put(ProducerConfig.ACKS_CONFIG, "all"); // 确保消息被所有副本确认 + props.put(ProducerConfig.RETRIES_CONFIG, 3); // 重试次数 + + // 创建Kafka生产者实例 + try (KafkaProducer producer = new KafkaProducer<>(props)) { + // 发送示例消息 + for (int i = 0; i < 1000_0000; i++) { + String key = "key-" + i; + String value = "这是第 " + i + " 条测试消息"; + ProducerRecord record = new ProducerRecord<>(TOPIC_NAME, key, value); + + // 异步发送消息并处理回调 + producer.send(record, (metadata, exception) -> { + if (exception == null) { + System.out.printf("消息发送成功 - Topic: %s, Partition: %d, Offset: %d%n", + metadata.topic(), metadata.partition(), metadata.offset()); + } else { + System.err.printf("消息发送失败: %s%n", exception.getMessage()); + } + }); + + // 模拟消息生成间隔 +// TimeUnit.MILLISECONDS.sleep(1); + } + + System.out.println("所有消息发送完成"); +// } catch (InterruptedException e) { +// Thread.currentThread().interrupt(); +// System.err.println("生产者线程被中断: " + e.getMessage()); + } catch (Exception e) { + System.err.println("生产者发生异常: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/Main.java b/src/main/java/com/fanbin/Main.java new file mode 100644 index 0000000..824659b --- /dev/null +++ b/src/main/java/com/fanbin/Main.java @@ -0,0 +1,42 @@ +package com.fanbin; + +import java.util.concurrent.CountDownLatch; + +public class Main { + private static final Object lock1 = new Object(); + private static final Object lock2 = new Object(); + private static final CountDownLatch latch = new CountDownLatch(2); + + public static void main(String[] args) { + Thread thread1 = new Thread(() -> { + synchronized (lock1) { + System.out.println("Thread 1: Holding lock1..."); + latch.countDown(); // 让 thread2 也开始执行 + + try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 保证两个线程同时竞争 + System.out.println("Thread 1: need lock2!"); + + synchronized (lock2) { + System.out.println("Thread 1: Acquired lock2!"); + } + } + }); + + Thread thread2 = new Thread(() -> { + synchronized (lock2) { + System.out.println("Thread 2: Holding lock2..."); + latch.countDown(); // 让 thread1 也开始执行 + + try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 保证两个线程同时竞争 + System.out.println("Thread 2: need lock1!"); + + synchronized (lock1) { + System.out.println("Thread 2: Acquired lock1!"); + } + } + }); + + thread1.start(); + thread2.start(); + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/MapPutTest.java b/src/main/java/com/fanbin/MapPutTest.java new file mode 100644 index 0000000..b965a8e --- /dev/null +++ b/src/main/java/com/fanbin/MapPutTest.java @@ -0,0 +1,33 @@ +package com.fanbin; + +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.CountDownLatch; +import java.util.stream.IntStream; + +public class MapPutTest { + + public static void main(String[] args) { + System.out.println(Integer.toBinaryString(hash("1231111111111111111111111111111111111111111111111111"))); + } + static int hash(Object key) { + int h; + // 使用对象的hashCode()方法计算哈希值 + System.out.println(Integer.toBinaryString(key.hashCode())); + System.out.println(Integer.toBinaryString(key.hashCode() >>> 16)); + return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); + } + private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + private static final int LENGTH = 20; + + public static String generateRandomString() { + Random random = new Random(); + StringBuilder sb = new StringBuilder(LENGTH); + for (int i = 0; i < LENGTH; i++) { + int index = random.nextInt(CHARACTERS.length()); + sb.append(CHARACTERS.charAt(index)); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/SparkFileStreamingReader.java b/src/main/java/com/fanbin/SparkFileStreamingReader.java new file mode 100644 index 0000000..d379545 --- /dev/null +++ b/src/main/java/com/fanbin/SparkFileStreamingReader.java @@ -0,0 +1,45 @@ +package com.fanbin; + +import java.util.concurrent.TimeoutException; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.streaming.StreamingQuery; +import org.apache.spark.sql.streaming.StreamingQueryException; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructType; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructType; + +public class SparkFileStreamingReader { + public static void main(String[] args) throws StreamingQueryException, TimeoutException { + // 创建SparkSession + SparkSession spark = SparkSession.builder() + .appName("Spark File Streaming Reader") + .master("local[*]") + .getOrCreate(); + + // 从文件系统读取流数据(支持CSV、JSON、Parquet等格式) + Dataset df = spark.readStream() + .format("csv") + .schema(new StructType() + .add("name", DataTypes.StringType, true) + .add("age", DataTypes.IntegerType, true)) + .option("header", "true") // 使用CSV表头 + .load("data/input/"); // 监控的目录路径 + + // 简单的数据处理:显示数据结构 + df.printSchema(); + + // 将结果输出到文件系统(Parquet格式) + StreamingQuery query = df.repartition(2).writeStream() + .outputMode("append") + .format("csv") // 支持parquet/csv/json等格式 + .option("path", "data/output/") // 输出文件路径 + .option("checkpointLocation", "data/checkpoint/") // 流式检查点路径 + .start(); + + query.awaitTermination(); + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/SparkKafkaReader.java b/src/main/java/com/fanbin/SparkKafkaReader.java new file mode 100644 index 0000000..de4c265 --- /dev/null +++ b/src/main/java/com/fanbin/SparkKafkaReader.java @@ -0,0 +1,86 @@ +package com.fanbin; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeoutException; + +import com.codahale.metrics.MetricRegistry; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.functions; +import org.apache.spark.sql.streaming.StreamingQuery; +import org.apache.spark.sql.streaming.StreamingQueryException; +import org.apache.spark.sql.streaming.Trigger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SparkKafkaReader { + private static final Logger logger = LoggerFactory.getLogger(SparkKafkaReader.class); + private static final MetricRegistry metrics = new MetricRegistry(); + + public static void main(String[] args) throws StreamingQueryException, TimeoutException { + // 创建SparkSession + SparkSession spark = SparkSession.builder() + .appName("Spark Kafka Reader") + .master("local[*]") + .getOrCreate(); + + // 从Kafka读取数据 + Dataset df = spark.readStream() + .format("kafka") + .option("kafka.bootstrap.servers", "localhost:9092") // Kafka服务地址 + .option("subscribe", "topic_100") +// .option("kafka.group.id", "spark-hdfs-group") + .option("startingOffsets", "earliest") // 首次启动从最早开始 + .option("failOnDataLoss", "false") // 订阅的主题 + .load(); + + // 选择并处理数据(示例:将value转换为字符串) + Dataset result = df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)"); + + StreamingQuery query = result.writeStream() + .foreachBatch((batchDF, batchId) -> { + // 批次开始日志 + logger.info("🚀 Starting batch {}", batchId); + metrics.counter("batches.started").inc(); + + try { + // 处理前指标 + long inputCount = batchDF.count(); + metrics.histogram("batch.size").update(inputCount); + logger.info("📥 Input records: {}", inputCount); + + // 业务处理 + Dataset processedDF = processData(batchDF); + + // 处理后指标 + long outputCount = processedDF.count(); + metrics.histogram("output.size").update(outputCount); + logger.info("📤 Output records: {}", outputCount); + + // 0: 100 --> 101 105 (A) 110(B) + // 写入结果 + processedDF.repartition((int) (outputCount/1000000 ==0 ? 1 : outputCount/1000000)).write().mode("append").csv("data/output/topic_100/"); + + // 成功指标 + metrics.counter("batches.completed").inc(); + logger.info("✅ Batch {} completed successfully", batchId); + } catch (Exception e) { + // 错误处理 + metrics.counter("batches.failed").inc(); + logger.error("❌ Batch {} failed: {}", batchId, e.getMessage(), e); + } + }) + .trigger(Trigger.ProcessingTime("30 seconds")) + .option("checkpointLocation", "checkpoints/topic_100") // 必须设置检查点! +// .option("kafka.group.id", "spark-hdfs-group") + .start(); + query.awaitTermination(); + } + + private static Dataset processData(Dataset df) { + return df.withColumn("processed_time", functions.current_timestamp()); + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/ThreadPoolFutureExample.java b/src/main/java/com/fanbin/ThreadPoolFutureExample.java new file mode 100644 index 0000000..968f2ff --- /dev/null +++ b/src/main/java/com/fanbin/ThreadPoolFutureExample.java @@ -0,0 +1,127 @@ +package com.fanbin; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; + +public class ThreadPoolFutureExample { + + // 自定义任务类 + static class CalculationTask implements Callable { + private final int taskId; + private final int value; + + public CalculationTask(int taskId, int value) { + this.taskId = taskId; + this.value = value; + } + + @Override + public Integer call() throws Exception { + System.out.println("Task-" + taskId + " started. Thread: " + + Thread.currentThread().getName()); + + // 模拟耗时计算 + int result = 0; + for (int i = 1; i <= value; i++) { + result += i; + Thread.sleep(1000); // 模拟计算耗时 + } + + // 随机抛出异常 + if (taskId % 4 == 0) { + throw new RuntimeException("Task-" + taskId + " simulated exception"); + } + + System.out.println("Task-" + taskId + " completed. Result: " + result); + return result; + } + } + static class MyExceptionHandler implements RejectedExecutionHandler { + + @Override + public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { + System.err.println("任务被拒绝: " + r.toString()); + } + } + public static void main(String[] args) { + // 1. 创建线程池 (核心线程2,最大线程4,空闲线程存活时间60秒,任务队列容量10) + ThreadPoolExecutor executor = new ThreadPoolExecutor( + 2, + 6, + 60, TimeUnit.SECONDS, + new ArrayBlockingQueue<>(5), + new MyExceptionHandler() // 当队列满时,由调用线程执行任务 + ); + + // 2. 创建任务列表 + List> futures = new ArrayList<>(); + for (int i = 1; i <= 15; i++) { + CalculationTask task = new CalculationTask(i, i * 10); + // 提交任务并获取Future对象 + Future future = executor.submit(task); + futures.add(future); + } + + // 3. 获取任务结果 + for (int i = 0; i < futures.size(); i++) { + try { + // 设置超时时间,避免无限等待 + Integer result = futures.get(i).get(20, TimeUnit.SECONDS); + System.out.println("Got result for task-" + (i+1) + ": " + result); + } catch (InterruptedException e) { + System.err.println("Task interrupted: " + e.getMessage()); + } catch (ExecutionException e) { + System.err.println("Task execution failed for task-" + (i+1) + + ": " + e.getCause().getMessage()); + } catch (TimeoutException e) { + System.err.println("Task-" + (i+1) + " timed out. Cancelling..."); + futures.get(i).cancel(true); // 尝试中断任务 + } + } + + // 4. 执行一个特殊任务(带返回值的) + Future specialTask = executor.submit(() -> { + System.out.println("Special factorial task started"); + int result = 1; + for (int i = 1; i <= 5; i++) { + result *= i; + Thread.sleep(100); + } + return result; + }); + + // 5. 轮询等待特殊任务完成 + while (!specialTask.isDone()) { + System.out.println("Waiting for special task to complete..."); + try { + Thread.sleep(200); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + try { + System.out.println("Special task result: " + specialTask.get()); + } catch (Exception e) { + System.err.println("Special task failed: " + e.getMessage()); + } + + // 6. 关闭线程池 + executor.shutdown(); // 不再接受新任务 + try { + // 等待现有任务完成,最多等待5秒 + if (!executor.awaitTermination(5, TimeUnit.SECONDS)) { + System.err.println("Forcing shutdown of remaining tasks"); + executor.shutdownNow(); // 尝试取消所有任务 + } + } catch (InterruptedException e) { + executor.shutdownNow(); + Thread.currentThread().interrupt(); + } + + System.out.println("All tasks completed. Final thread pool status:"); + System.out.println(" Completed tasks: " + executor.getCompletedTaskCount()); + System.out.println(" Active threads: " + executor.getActiveCount()); + } +} diff --git a/src/main/java/com/fanbin/TransactionAlertSystem.java b/src/main/java/com/fanbin/TransactionAlertSystem.java new file mode 100644 index 0000000..9ea2be4 --- /dev/null +++ b/src/main/java/com/fanbin/TransactionAlertSystem.java @@ -0,0 +1,154 @@ +package com.fanbin; + +import org.apache.flink.api.common.eventtime.WatermarkStrategy; +import org.apache.flink.api.common.functions.RichFlatMapFunction; +import org.apache.flink.api.common.serialization.SimpleStringEncoder; +import org.apache.flink.api.common.state.ValueState; +import org.apache.flink.api.common.state.ValueStateDescriptor; +import org.apache.flink.configuration.Configuration; +import org.apache.flink.configuration.RestOptions; +import org.apache.flink.connector.file.sink.FileSink; +import org.apache.flink.core.fs.Path; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.util.Collector; + +import java.time.Duration; + +public class TransactionAlertSystem { + + public static void main(String[] args) throws Exception { + Configuration config = new Configuration(); + config.setInteger(RestOptions.PORT, 8081); + + StreamExecutionEnvironment env = StreamExecutionEnvironment + .createLocalEnvironmentWithWebUI(config); + env.setParallelism(4); + + DataStream transactions = env.fromElements( + new Transaction("acc1", 0.5, System.currentTimeMillis()), + new Transaction("acc1", 600.0, System.currentTimeMillis() + 1000), + new Transaction("acc1", 300.0, System.currentTimeMillis() + 2000), + new Transaction("acc2", 0.8, System.currentTimeMillis() + 3000), + new Transaction("acc2", 100.0, System.currentTimeMillis() + 4000), + new Transaction("acc3", 0.9, System.currentTimeMillis() + 5000), + new Transaction("acc3", 700.0, System.currentTimeMillis() + 6000) + ).assignTimestampsAndWatermarks( + WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(5)) + .withTimestampAssigner((event, timestamp) -> event.timestamp)); + + DataStream alerts = transactions + .keyBy(Transaction::getAccountId) + .flatMap(new SuspiciousTransactionPatternDetector()); + + alerts.print(); + + FileSink sink = FileSink + .forRowFormat(new Path("output/alerts"), new SimpleStringEncoder("UTF-8")) + .build(); + FileSink sink1 = FileSink + .forRowFormat(new Path("output/alerts"), new SimpleStringEncoder("UTF-8")) + .build(); + alerts.sinkTo(sink); + transactions.sinkTo(sink1); + + env.execute("Transaction Monitoring Job"); + } + + public static class Transaction { + private String accountId; + private double amount; + private long timestamp; + + public Transaction() {} + + public Transaction(String accountId, double amount, long timestamp) { + this.accountId = accountId; + this.amount = amount; + this.timestamp = timestamp; + } + + public String getAccountId() { + return accountId; + } + + public double getAmount() { + return amount; + } + + public long getTimestamp() { + return timestamp; + } + + @Override + public String toString() { + return "Transaction{" + + "accountId='" + accountId + '\'' + + ", amount=" + amount + + ", timestamp=" + timestamp + + '}'; + } + } + + public static class Alert { + private String accountId; + private double smallAmount; + private double largeAmount; + private long smallTimestamp; + private long largeTimestamp; + + public Alert(String accountId, double smallAmount, double largeAmount, + long smallTimestamp, long largeTimestamp) { + this.accountId = accountId; + this.smallAmount = smallAmount; + this.largeAmount = largeAmount; + this.smallTimestamp = smallTimestamp; + this.largeTimestamp = largeTimestamp; + } + + @Override + public String toString() { + return "🚨 ALERT for account " + accountId + + ": Detected suspicious pattern!\n" + + " Small transaction: $" + smallAmount + " at " + smallTimestamp + "\n" + + " Followed by large transaction: $" + largeAmount + " at " + largeTimestamp; + } + } + + private static class SuspiciousTransactionPatternDetector + extends RichFlatMapFunction { + + private transient ValueState lastSmallTransactionState; + + @Override + public void open(Configuration parameters) { + ValueStateDescriptor descriptor = + new ValueStateDescriptor<>("lastSmallTx", Transaction.class); + lastSmallTransactionState = getRuntimeContext().getState(descriptor); + } + + @Override + public void flatMap(Transaction transaction, Collector out) throws Exception { + Transaction lastSmallTx = lastSmallTransactionState.value(); + + if (transaction.getAmount() < 1.0) { + lastSmallTransactionState.update(transaction); + } else if (transaction.getAmount() > 500.0) { + if (lastSmallTx != null) { + if (transaction.getTimestamp() > lastSmallTx.getTimestamp()) { + out.collect(new Alert( + transaction.getAccountId(), + lastSmallTx.getAmount(), + transaction.getAmount(), + lastSmallTx.getTimestamp(), + transaction.getTimestamp() + )); + } + lastSmallTransactionState.clear(); + } + } else { + lastSmallTransactionState.clear(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/TransactionMonitoringCEP.java b/src/main/java/com/fanbin/TransactionMonitoringCEP.java new file mode 100644 index 0000000..c209859 --- /dev/null +++ b/src/main/java/com/fanbin/TransactionMonitoringCEP.java @@ -0,0 +1,148 @@ +package com.fanbin; + +import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner; +import org.apache.flink.api.common.eventtime.WatermarkStrategy; +import org.apache.flink.cep.CEP; +import org.apache.flink.cep.PatternSelectFunction; +import org.apache.flink.cep.PatternStream; +import org.apache.flink.cep.pattern.Pattern; +import org.apache.flink.cep.pattern.conditions.SimpleCondition; +import org.apache.flink.configuration.Configuration; +import org.apache.flink.configuration.RestOptions; +import org.apache.flink.streaming.api.datastream.DataStream; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.apache.flink.streaming.api.windowing.time.Time; + +import java.util.List; +import java.util.Map; + +public class TransactionMonitoringCEP { + + public static void main(String[] args) throws Exception { + // 1. 设置执行环境 + Configuration config = new Configuration(); + config.setInteger(RestOptions.PORT, 8081); // 设置 Web UI 端口 + + // 创建带 Web UI 的本地执行环境 + StreamExecutionEnvironment env = StreamExecutionEnvironment + .createLocalEnvironmentWithWebUI(config); + env.setParallelism(4); // 方便调试,生产环境可调整 + // 2. 创建模拟交易数据流 + DataStream transactionStream = env + .fromElements( + // 正常交易序列 + new TransactionEvent("acc-001", 0.5, System.currentTimeMillis() - 10000), + new TransactionEvent("acc-001", 100, System.currentTimeMillis() - 5000), + new TransactionEvent("acc-001", 0.8, System.currentTimeMillis() - 3000), + new TransactionEvent("acc-001", 600, System.currentTimeMillis() - 1000), // 应触发报警 + + // 另一个账户的触发序列 + new TransactionEvent("acc-002", 0.3, System.currentTimeMillis() - 800), + new TransactionEvent("acc-002", 700, System.currentTimeMillis() - 100), // 应触发报警 + + // 不应触发报警的序列 + new TransactionEvent("acc-003", 0.9, System.currentTimeMillis() - 600), + new TransactionEvent("acc-003", 300, System.currentTimeMillis() - 300) // 金额不足$500 + ) + .assignTimestampsAndWatermarks( + WatermarkStrategy.forMonotonousTimestamps() + .withTimestampAssigner( + (SerializableTimestampAssigner) (event, recordTimestamp) -> event.timestamp + ) + ) + .keyBy(event -> event.accountId); // 按账户ID分组 + + // 3. 定义CEP模式 + Pattern alertPattern = Pattern.begin("smallTx") + .where(new SimpleCondition() { + @Override + public boolean filter(TransactionEvent event) { + return event.amount < 1.0; // 小于$1的交易 + } + }) + .next("largeTx") // 严格连续的下一个事件 + .where(new SimpleCondition() { + @Override + public boolean filter(TransactionEvent event) { + return event.amount > 500.0; // 大于$500的交易 + } + }) + .within(Time.minutes(5)); // 5分钟内发生 + + // 4. 应用模式到数据流 + PatternStream patternStream = CEP.pattern( + transactionStream, + alertPattern + ); + + // 5. 处理匹配事件 + DataStream alerts = patternStream.select(new PatternSelectFunction() { + @Override + public Alert select(Map> pattern) throws Exception { + TransactionEvent smallTx = pattern.get("smallTx").get(0); + TransactionEvent largeTx = pattern.get("largeTx").get(0); + + return new Alert( + smallTx.accountId, + smallTx.amount, + largeTx.amount, + "检测到小额交易后立即大额交易" + ); + } + }); + + // 6. 输出报警 + alerts.print(); + + // 7. 执行作业 + env.execute("Transaction Monitoring with CEP"); + } + + // 交易事件类 + public static class TransactionEvent { + public String accountId; + public double amount; + public long timestamp; + + public TransactionEvent() {} + + public TransactionEvent(String accountId, double amount, long timestamp) { + this.accountId = accountId; + this.amount = amount; + this.timestamp = timestamp; + } + + @Override + public String toString() { + return String.format("账户: %s, 金额: $%.2f, 时间: %d", accountId, amount, timestamp); + } + } + + // 报警类 + public static class Alert { + public String accountId; + public double smallAmount; + public double largeAmount; + public String message; + + public Alert() {} + + public Alert(String accountId, double smallAmount, double largeAmount, String message) { + this.accountId = accountId; + this.smallAmount = smallAmount; + this.largeAmount = largeAmount; + this.message = message; + } + + @Override + public String toString() { + return String.format( + "【交易异常报警】账户: %s\n" + + "-> 小额交易: $%.2f\n" + + "-> 紧随的大额交易: $%.2f\n" + + "-> 报警原因: %s", + accountId, smallAmount, largeAmount, message + ); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/fanbin/leetcode/LC11.java b/src/main/java/com/fanbin/leetcode/LC11.java new file mode 100644 index 0000000..7d77be8 --- /dev/null +++ b/src/main/java/com/fanbin/leetcode/LC11.java @@ -0,0 +1,29 @@ +package com.fanbin.leetcode; + +public class LC11 { + public static int maxArea(int[] height) { + int left = 0, right = height.length - 1; + int maxArea = 0; + while (left < right) { + // 计算当前容器的面积 + int width = right - left; + int currentHeight = Math.min(height[left], height[right]); + int currentArea = width * currentHeight; + maxArea = Math.max(maxArea, currentArea); + + // 移动较短的边界 + if (height[left] < height[right]) { + left++; + } else { + right--; + } + } + + return maxArea; + } + public static void main(String[] args) { + int[] height = {6,2,6,2,5,4,8,3,7}; + int result = maxArea(height); + System.out.println("最大面积为: " + result); + } +} diff --git a/src/main/java/com/fanbin/leetcode/ThreeNum.java b/src/main/java/com/fanbin/leetcode/ThreeNum.java new file mode 100644 index 0000000..9e379d3 --- /dev/null +++ b/src/main/java/com/fanbin/leetcode/ThreeNum.java @@ -0,0 +1,27 @@ +package com.fanbin.leetcode; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class ThreeNum { + public List> threeSum(int[] nums) { + List> result = new ArrayList>(20); + + for(int i=0; i< nums.length; i++) { + for(int j=i+1; j < nums.length; j++) { + for (int k=j+1; k< nums.length; k++) { + if (nums[i] + nums[j] + nums[k] == 0) { + List arr = new ArrayList(16); + arr.add(i); + arr.add(j); + arr.add(k); + result.add(arr); + } + } + } + } + return result.stream().distinct().toList(); + } +} diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000..ce43159 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,20 @@ +# ??????? +log4j.rootLogger=DEBUG, console, file + +# ????? +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +# ???? +log4j.appender.file=org.apache.log4j.RollingFileAppender +log4j.appender.file.File=spark-streaming.log +log4j.appender.file.MaxFileSize=100MB +log4j.appender.file.MaxBackupIndex=10 +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +# ??????? +log4j.logger.org.apache.spark=DEBUG +log4j.logger.org.apache.kafka=DEBUG +log4j.logger.com.fanbin=DEBUG \ No newline at end of file diff --git a/winutils.exe b/winutils.exe new file mode 100644 index 0000000000000000000000000000000000000000..4fd286dd74c2d37d73ccaf3c83007afa99f5586b GIT binary patch literal 112640 zcmeFadwg6)`NzLW6G$&11-n=($O1uw+#;bdZOvo1X2ywsUzoPYiW+0@5Bk-D(={M6a!r`nG@A$8sb3qP@6W8;)& zkNUe$H~girZqcpL|0^E<`>jQuFM0jnw}ymQJU(jAS3Lgct$(-Y$8LR=aLb0j-ue<@ zVcl7`?r!NLw?1d#KYh7>Soqi_?nKm#4iJDOAN z%iEi0E?T~zdHNzA8-gW&9tAYW)&KjrnnW;rW3YU%IaJD~!RECdiQ=m(;#;D4Zm?Mf ztun);32r3HBfhyJ{lHf)VZ@cdb)IzH$FA)Fi@>KT3gtdAonU zCQ)h{yidj9FimJ24l9Jiwut>j;(w9>rN~RnU)Rsy_NKcBn;T%g>F#Tr6Vh|8aWgtA zC1*9&B$f{Mc9)VNqQUY#fKRB5Ey}1?hG1i5jJWa=rUMlS99axqzVYxcBFh(l3 z?Ig0>1&FR_Dfv~HP{x*WhN7k9pfUgpc?xDf8s7XD!X+DJXAeGF@f&N31Ap#DX)mlq z!fbb0Vd$ofqN?Log{CYp@|@DMDx+Uv)7|aOeNA^SXzoE#w+c=2jV#E`7*Ql$O5SK3WVaon{u0Hy;)dD7kZcpl^vSfo&2(b4zW$E5^^K51=Ikt2@>;Umi3(eqP#&?=haY?Z~C}jm_*H9r?x+u@*H5r7T)slUTG46)*co zsZ{tC&9L~kAfJ2y5R{)=Ma~BvHjyHpi_r58Xy6Y2ll7$I$bDxba{u!;$hAe}h8?+=Mec@8 z2$h$8L(ZClwLe)*3na@e@QB$D&mTf>32I$MTzf1fb2twZiG9;Ve0)rNtVKg+DQg`c zzZ4%c;G-ko(R`_dmAMD`Ypp4$i3O!(GyWUBA$tB58lQ;ZHzp$Z!YBj}jR@ZD2!z54C>>tG-; ze@IV3et|Mq7~N9xyjZMBZy?sECt_enG0+_`(C--dx)^x$p*L%BFn5q^d`$y;%AjcL zsuKOAe8m|aT&s)t{4PV3Q~yWbpuT5M#OL|1!{;!FO;IVw=U(Eo89r^eg<8{H;BH#_ z1>mA24bekn=~-beU6*TohVFfjk=%x*!`X9!Gie>tqd^U9Xy~BPq=Ve%a28DqRwb4i zM^%lc=)%@d)Ga*pTB%f=Wn3zsKH({X@G~0|iNboCp!&rik)7(T@e0)8y2|Wfc>+aXv9C0uc3phf4;^!r>^PM)8W%L2p7;Xcl8u{rJiTf> z4F>+KwrPWq`1Ss{;z0jFVogDWTLIV5`>)(!ZhVt6WM8Q z09{_c5A;-)@i34e@ZSa7HrR>(w3w+9#6%N&tzr*tCKHamZyf=RogI6=K2)DqdG>;s zz0tp5bw7?;hw|a@CUN+^2ONhCafgWuGY+fSR7b9H)lw&D8PoTKX^F#>OZJfurn7}< zp)lp^-*+cTs7s8zm-wRjL;Il01yU=f5dH=*vMbm?ovm#R3Aa>{d z;tnz=V)(hiu?+v~Rd8)arBqHXxruxjZWFFMgezCS0$jm{Ew!{1KgwRRjYO#bv@!E@J#D0v++K|<*Z91pE@*CBUUyA#owqA%fUTuueZ84gfLV1_w+}zz zkrxHE#>2toCOqoU=o9)0^dov{Ihrj;dwldqgUx-4F1e>!xf*+$2EI;0(_Jn{ebzNR z(|iS>=DU`#>F&DuwEjV&3@-{2+5LTN|7>k>Uk|_TRC1V~wP$>SIYq)$Jjm0oDemv{ z!0l*U8__sy(en0=aYYLsDwRrQ25nrE#1}vd9!z+1xF(T*)+&N?~YI{OM;-o*rU(ybQr1_1oQEgA(QEMQORlTGAMAgyo;P&I#9&Q?~>X%g8KlM~1P2-1wC?(fSGEYNhg6_;(dXFw8KjM<5%UGpq|7S209H-L7FVRSjGkq#w`XmVV zWWMNe*7nvG>kA_cGEqWySIsqLOMrh=;IG{q+pa7S(M4Srw^AVkM)PxoOE${v$Fv8g zI?+rA9W|?p2(|PB`s6~;&wjX+{0nnWdVv!M2nOaIOOWWDkAG5&3MfUd-t0yL@uPmA zIkuYRFUI}AA~NCmO7VOcJQLp=f1#AjgPuVdjPDqS@$7LJ4;03vDQ(bU{DCmO#FSN( zqq&u)nKqTHkS`_qkn5+cxj{Woxl-~MEQBIl>NXQ@CV>gJvc`l&?nD^H4*Pr%Bi`tN+N#uooJ)!$A`zxhK$Q*Gu=JtV@bVIt(eRG4yH`|;a` z?Qs8fmeuOU%%lw)`Nkz8(0&`9#|=JouoD z)m7k;rQ|7PQt$TaDwDblQuN(lqi8AFgW9X;UM{*g`ibyQGz;Z^!2w4|<3| zuZTeR73fTaU@=9LpYR?M!sqH8KhkpK*vJ_9m6sN5;_r0Z3A~MoeS|g$Ddb1DIpSi9 zvY=$YAWx4+%*`Pn$Q(jxtKzg4pVr>o<$zLgLZ5oI@B*)5Sg+kNH5%F5&#$bwqAnz`@aoAFMy^hP9Y1L`y|L=|4gWhp@Sa! z7uDldD-mfJB8jXz=%-gYk(3gP^yBAg;9Vw9o0I1wl4o$pEjo!ssX_eHDfbf~@{s~L z0}${lDbc$lFoGS}Qp5D50q#4MF1Ll*L0gdT!1YhQQ*DRImjLgvAd%e}&Q1cKs3^m6 zR+|Xl3uig4HZcz%-OU47O_J28dIf=g(p^^+>4_qJQKU19bVrdu5ej82bY`KbW=#Ex z@QW)%j(DfWMkZUycVCSDbB(Ekk^T!mHzkV;L@{Q}Zi-&XN{N-csDRykj6Tuy90Gz8 zYox@T?~asYzKTlu8C!%h*SNOVX{QS1+k|qeLzzqF0RiQGU=AO?3zTr&ZKfgtx?;E7 zmhSq(BcVz?2w@fTpPPvJZ-r3$dSvupam;TNrPD=;D(b?co>cazTmC^ZW|~&*r`-yb zNcq*YNU(h4)f16BSmX|f$PGGj*NNOqKL9TkXO-+c>mKh}_c%82t9vf8cv=oMEe|gz zw^^CpE&&fa9LY^AeR?8xzVjUH+ywVlbw@aM7KxoRV5jg&Mh!!q zS=V-nq{!50<|pc|ExGaNWV+k2)u9I4G!a9yV8}ZM`#WyB#m!T9LK}To%+j}vx};7& zaqlc8AM;7wK8e-!^(4{sR4cT!RRom|l*Vggy8f`$>|{L2Ab_211I1D@pvR$_=RkE1 zK0XZp`)XM#NwMWG{vR4~NAsNU57ek~D9~E?tBB?6A7?pChSDPS2=)ARDROMMp`C5M zQB)qlnyRUcjH9wmMCGzdDp!MRzO6|c-=^zQ@+yyS30&XKa#!y=VEmS9l=MD#{0TMB zcB1VA#7)%@X#5%=Of=?ev1r9zHq}qNrG|b^v=um2)Fr}~sW>!HJz}EYwt;!Sxf#Ih zQR>G3@OKk8wWj#X6T;8oE!{_DY{(M!NcM2wDB5#F-4%X9;o5KSd(!eV(9{ zY-ityQG1V4vKB@q5%qj^-Zi6gJ@5GkU#YggX`49l9?r=_n z=~D9KG7h*l3fLVzJ;MvVwlVb9dU`93-sfU^b1HB=IjLGc2YX6Pub~3=o4`sw z!wbE%uB-u6Py689CibcuRD_0AAzOHoCC_%`X>7}3+N&31Iehs9 zjqRJi!C0okn(s1%lG)H20&Jv}BH;<&A@197DZ7tWuw0M9@)}^JjwufX=B)5DU2ecOi7+x!Z!WIIPTA@sPNMTN0K+F*b zQA){Q|F4V*!v^z`81w#Bm=9V8=6!^D1NwVo zo;Bf$7#=R8eNT+`X=1*@VEFSw`?GI>_MEMvUD2GWWO$^Ec{7_$v@}%lnJUcP!u)Ar zp8h77yDBlSEMvYn#@t+m`2)hdn=mtjN~}|*g|GZT8eGvlszG#ljZE9318s@kov=G~ zv)c)EzVVYP{`)m}BbUTrjOY|rZ3oL6#-ysIg5^PVGHNCbQ}c8j0_likJjJSH2}p9v z+dov)#r7*~8eD*OH1vqWa;rE@OwNPJxL=b+my!pd6EzgETFSmxc0l=Yw(DCg_)I2D ztE-fJ*PmTk8~5KzS(DtAeZHu&m*OX6_j@y4+G4NK`!BubuN2f>|k8@3&xC7Fl}2n*hoGtw|9_6 z(Q=D1lbH!NnCg-F%X#P~v`DK(JiT0c2K<;Sw3_r>dODAgq_0&YRa$#4&4#m!=Q^#K zD;Z9i#}$ZBqSM)aZ&N9`iX>9{3M}GV!&N23KI6B2fwT&+dP9M;q5?Sp)pjNxY-pnD zxYOGIwf4igm27Bz>$FmGcaNla)Vc=HgtfPeLwCl|_jhYZ57ggHQC+FCEAA}0EM5H* z6x6$s>!t&)IoqZviyH}OnWOubS~vru9bS7-3hc{fQ2(ua~-W4%sT4N-1; zE{JP@+Nh`kIg#6{)(^PJA;oU{k<8m|dA%Gf?Lx22-@5jcmD?%RKw~gokQC0(4lMX> zV`e`F-Vm<3(Z)jo(XSe;*`st5%Q2 zR^L0df(P~V!l;uxtrY+M5{jQl@hF`-729g3pZhW4l8utf&-llmKU8hbk#I6Bg@GIV zgNAT_<~Y=WUtm%*yVpdjTwt1tJcZ+;X7(E=(vA{o!`D5ooUGjrbkt-gQ`2p=*+YsK z#$>SX|FH()c4K;X;XEJ-W^En0`3#gvtBAWWv?yqO&`6L_Dw&%hhUl-W6l3 zauNe)HNKt7Qtn75_zooqpF}}2RueIBov>k5o!+ZfxE6@9by_9gR=T2_pBdW~z2XHe zuXXo7PTT!W)D`XScsp0Ty&uY6(ZTevYaFhV0FsbpTyunr4I*Yh`cT$SD0 zbnDid20u?@E4+hZAZr~MsikgQ<88VtJ(G>OsV==n>1I1o^+$FP(6Xlg-da|BDS7_0 zRvi@`@L%Zdt2w>uCveJu={UXC+1+{KG!3VP$9(heavbzlav)~lq(yp90T)fvNoRD{ zG}t2IX$73P*8Zz4l{~45_4|fU*4}H6VR9##$<3zkzySU%le_IJaB2PIYKWEl$wS9g zP_8MtHkFgP{Yb#`J#gGNssqt_Jo6Yd91IM% zvKm|z`rHWqk)>5EjhFiytyQ0-{d75M=xU+f`6zoqr1X$sDM1wJQ{+eZeewy`60glp z2|vIXt+zRjUeO`9l>ne`s4G>WSH4 z<6P(O0H+e&5@V^izVKlXppu2T&01%9htKbmkJXnTUweCEz6~@mqEScYs3K+zMEaDH za#O(dYZ8-T(dK{K{MPEe8&vFI)#1m?DJ35!abWb4Y-1^TAJKVC84|s3R|$5UpZSer z=7}v}T*yHqw#gEO({TS)ZGB7HrX>=qk(vf-EtGdF(%W>hwFtd77rDwBEaD=Y5D( zY$r;rb|{HSPT*h}Xr|5&_T^2nc!?9 zB10tj!};f$c>c`LER2W#qj7+8;f`08NfkecvN){PARS768$D%f$Zs>ApeTgTCz&-`fA;A}jt^VfSbMPd zfreEfx%!@&Xv)oVRHs4SFZ)*S!Km-*=Kp&A3G&gKSziG?60m6Zu(*;0U7biU6$zY$ z>`jNIE^b)mnr<6(ua~iK*ka^;-xp^vZLy5KM}nN4Uk96&-#oVbN+p2!>9HA7w>Xq- zmXh;-={6NImdb%fpBq^2-sC#|CrA8`91s7;EQ|O*7Yl$2FHLE+^Hc(!RG6nO_jIRw z%DN{JAg{+gEp$(MXO(hdg1j~Yv99u(dIlubWqdZP2%e>YkQ#|5dmK%uycoP z<1cMRuVrOEeo^T_WKm}r_3>279FnY3-X@_gzA_T(ivk%nO3DAm z9HHAyKI4{xME1Z^@~<*NTAC)GN~FR39>g|q-mX01DJB2+7ZIKP1ca?Jl0=8eT*#Xg zXAg&%Ms8RvGYDGAJ1ME<@>LM*zz|mxYP+D-h_OmR81B!XvCQqm{@Zxweh@J?gS;V% zahQ=mrQ|*iwpGd(Exm=8(Zg#0fa9~mQ6;BS4W8RdO?hxy z`wGSlR~AKcR+h3ID6mC|`Q#Z9k3G~Cn;H2R zmXBN7*!EstkE`;uyXj;C*imQGp-@9ZXB0_A5gQwn)f%Ow711(Cr#rrvMW0k-2Yp^g zB1>ibm{#d5g;b<0p5V>oDl$YBnGyxP8KWgMd<+CnE>b^?LRmz5M-{@^rQ{_s!j9$+ zc5n|CY(Du^g!h0-ybCc2vXcZ3gmQjDGR$Rq|;3}E;XoO(a7zBNiA{~BoECRt* zBDf?%@XMc-)gf1pV_Z#Mr;AXbxS)g6D65+xJA1fT|Bm5-r}YxtJL8h*o}Sfwp!QnEv6|vO#XZO5 zPIds3Ism{0up-NA3X7O56xl*?8q&r=@n~h@3m*AX1dnt`Xx$Wmn$^xJ?pRrd+_s;g zx#D(3R*K8GoXVWX4#vMcW#YC)lg0_wOSN5Gx?H>>5q(zpv}+j7F=W0Wg>sPUa@9b_ z8g>kN8vPTzX|mf8r$B5;oSPCMRMFf1_(o5N>4 zhM2Y{xZ~*~y7nE=2*wr&$;DG7(aDKz`-?MW@cY1rK zL<)7<>*y2En+fs;uvi;t36|H{+iER|>|T;F)pWO}#k*LXW?CydPwA;8D2>e zd(*I0Z+#ZAW7Yf+_M~jb^Msl;b}RPZ zs>b`WlB>BtOHxqTr%Oj|PS+C^~lb zWzCk&N_%|1JWj1+^zSxhU!DTtskK)x&ricfw<_R0Mh zF+HuRZJ|qKGWv(f=+I3@H@55i#Sm+lSCzuqmq@I_3!2nYUL3{cuRnFGOrYK=#7xTG*&R9N$C?#g+dNu{`cxV|l|Ie1S-1d*;wy*eIZYVO^slzg5H zn@PSb1KkHP3QqwehNV3DcZLjQs!aIEs5riq)>D7@L24Ic@~3d1Zlacdt;d`K|V>Ik8JcEGhFJ`}}iz^77++f0L*y+@kv zo{q!PActjmoWqjcPpx0j!MrzzW-XP~cun0lZIHD|m{Wt?-xs}dTk!f5L5T%MyclMO z;xyl0L#O9%6Hujyy{Zbh(914)B)iEa+0Q1!Dqsyfh2QxkvTKRAvH}bllvE}>idWF6 zfDcdsM^AMXP?f*j<-b!s8|-qxM--#d=UVP%G=GP#l-y|qid&>%?0&cs_QexpyDx)3 z&v**^t`)rt^u86Z#=4XUPF)S=qulbttA^(19IiGLL=Y6 zj;5waG*_U-BFM)18js@$joWD(_vLw{64^bKk_vR11h$a_zoe9$`j9F^&m^XbPsy`L z3*E%y-J*6FNb#3p&u&EX{Kz3g1}fWmliHkU!_;?BBu!+ph!=j1CVf`Z;7x$r126dv zjMnt-kgMN??LGLan>v!)0Es%EUCVt&%C4O_yKZ2#PT9}N9~fV{VPLeOcaG@qnMkvt zqd&MQ^+OIk@?;a4O;ff zez9loVbW-n3%X)n? znI_Iu_*;&5`+lVZQQP}AkthQwb0?o!)7zv>m9@&MYtEHt3C=gt-|_Pe+qH>&RcZp0 ziM(8zt@*61qUm_G+Y`)$Ge2T&H*NN9Z8uHZef~h&?s@-ZZFebHWW+tN(@N6=vO8`G z=PIXL=H2F|-8lKK4VZ6;%X*L?m>i_H(cTPlRe-b@_y2mvt!l@H*Fx8-hO(&bKe6P=6ZTWPy z-0i`JC6uVJ49hnvDEsOpZ6Rsgh52>`XJxe@yYPbS847x{sbW@O>BbUG%l1=6h8Z-| zGeWm_nr>9Xn;_p|onr#UG ziqnb0{{*rs$;F`v6gKcz9M(21y}5$J#iT9n%ATv>LSuCCC$oF%sV{qQu}8wU4~*1E zc-ycptMpW#S35zTDU@<`6Xcmf$!nM(&lD;h6n60JPU`Iw9o2siT=krl-Alm*)}QwD z@?zdGLs6|BStWV#;31i+sEox=(hBVyyyB7vEn> z4ltCCvF^>B+%W6@r1D}G8p5}mki{v5`*CYszv?`o%98^V^sj;XDc4~+b*fW(H}zB5 zZD|eR=iIx%oK4vcWJ~!B12%57)m^OQmr*dtQUtuCDJ8@U$*JHFs9bb}(+sOhU(`1-eI|8x9i?${Vo`{=zJzsBH0|P z?OLqu)}r&pGpL4EtwK7dxRa%{qPem*q^BlWlpgV@jKu+ekkpG5udkhq6Wt?wX;Bp` zl8PdkC=!o-tx-y66bTfeP}+xGn31M9{RER(XU3YB5sf?z+EJWf^PQF=TXq-RV;aq% z$LxE&9?w-;4BQZYl%7%5RM1(gMe7eH6PK%$+(U3EEF-I7>>T`{3>ipBX$#n`qCYXp zag!{A_4sr*Rxnws^SfiF$WX*y-L|=z^t0aW5&D zUcj$mwuN`#`KoUPFr8pr)L>?yhLZOY@0K}O*U&d_h{b#DQTqtu5xj!*L}QylGSg z9|i^xcg@vA>l86+UBfS?zM#1qW-?)) z^$or3Ih-#eb$bqn@8PZO95Y;75#oG5I&w8|wE7WL(aJPoBZ&Q|NK-B)-+hPK%MYlY z(My_^UP(3@ZYd4Z$SZrc-*H$|78(c4h1YpY*kc_n&TU+8;R7 zi9B{c8^5lCgOvq$)e*dQveT;FRCt#4AGTlUHh)M(Ev=|UlG3>B0B4H#-|jNiXvf6O zQ!Cp)`m1dJXUNFpc06qvuKkzi^S1B}~gjvCLp$$2N#-x-2 z1(s8wk`B9UH1FL<;Ad^4u3;N%3AVSH+u2)nEotEkh*)@%KWZkmy{A%SAD*mt*+-^> z%fTBK@2AHqD_R!|vaQ;<3{+w9V_;ZGky3Is9fTT?TIW9abTcDT*OO5^OC)M~GahTF z_4p3`C#%qF16Amc68aUO*P--wk6RMrys$RzBJ&vwlOK!-?FSSh*tiN4RX01j5ua`y zSN=7WFHR|YZdCRaOB?IJSJ_9!qBFwacG!%Gj#RUW56&N&;x%Wro#tK-p%kBP_nUsm zI?t4wf^2V^*kl`r++X|Vor`r9_s~H|f=NwFep{}(j%F`8%Sha_KJ(~3bKZD_js zQyM}mM18vE&DGVk^l(aHQz`YSV`jqXfpC(Ys>xBq8|FW7OH*G`sY1f!1Gh^mrWxg@u;AoAh!UZfua%I6-y3^k>-L5fo zyUKJYmFa#?l2_7wo%UMPEwj2`O8mfWdT*B3Su?lcz>c3_pD^q_ykk`z+gxgkY6xbg z)SqUUYEr**7RRjjx)0K23B>& z;6vJF1AAI5v5B@P_r#IpB`GuYS40g*QAfe{Qc<6&hG`0B(B-G8Sdj(}T1MAJ$0?qc zS#<^Z`0_xrZ@{=bFn35yW+H{%EP_{x;I439q;&{2oc0N4rj$J9TW}5^8C8qYSPMGP zr&-ljRaM?q)%TtQ>u!TvrTmI0H;VEt>Nl*ang(YozV*5|=o4GT`+)HN;AHR~D_kZ| zRb3n;?$La|1d6L;HmT#P<9ot&ws6tpO$~2S9Us=xiXndE8u{BnF{O!Wq*ee z!(j2cxJJ5zylWt;9**I8XCIL~sy-#a)GK zt<=Ki%Swefc{&J0R6iZFu(-PmL(x+5J+~^u`dFI$t&>s`@GC@O8 z7Ub2m!t5;`G#G$a7_u;**(wV^q3*-ULOL6yG=n-;yiSv79b;(1ZIq}1iD?JTrby%*bN_s*pKRTi5LC7a)nR)s%R;>^EXWS8Zsq# zHHNc<;S^yQ1Op&Z%du|==)t}rpa_hr*766}>$GM5(t3$fmLd51R%H0YKfw4!VH{@IFSO(0y_q1!?;);FX&Sf} zT1aP!`D@)p*$89SAcu0+oUK;*favci`f2E^!&R?fb~K-Z?7LDir1R~lDv`drI%*R+ z)J27>a>`YEl8|ob1ZfdfNE1R@N`4MaRCYXtcfM6|@idzT)`A4(Y$0gpzn8irA6-Dm zCMw_6S}{0EChc~0#N%_29mnJES+EIr5sx1fkJv(wNv#h$bRx}!a^G@eg!2m%;k-*Y zA3hG8uY#elKhgyibrO&mUUfjs%tXDwO+s;nP^<;|t=30l%-27VdYr6R2f_%OtE><8;;ksp=vo_oOMUwVUyEr@BvPBG-|-=+{|3}RSl`|>__zq6_l)%Z|8`uN zGy!cn6EaA~m1q72?E|4*TsUqhNsk{&uKTLh@9y0Dglfj=@jhWI91FG`W2Xi`w{b^F zc+DwLL^_$ecPX6JuY$$6Gjy(s>)bB43~huvzl0mf7W!MDKAiMNJYOWB);sF6B#? z%M{uu+Ca>GVqj&Q*5cDty#|!>3GRN*aP})KF*$zF*$|lt^9K||qjl2sxpo`CH8Lq8I)gALxw`tQUg!l@Y80K>&h?$=r3~Rc5pL zOXMs+VmkZZsNUfV1}>Yuz}NEwi>#n13C_tbG8?o0j%V%u&_OM;U;)CT&w@BbO$P3AvzfMNpkzcBcSU;I~kUJJ;|F+7ko%01H z1aNG}>YFAW4}?bty9*Frkt^lE`Rd4a%pck{p*v)+leZ(-a0hizRh9DY80-JM2G(ak z7-8K62OjIeU}gPXrpq>)@plb0X$|mq`gs2SC`{MKm@X@0ddV2M&g?1Q_!r>7>qO=7 z+>G(4o)xMNP6ixqVRfzArT%=BWyFmZ&P5zszTYaNCeF`z*v z1rl-4ky~oypY)v({qD8KMXHp%&9qmgsAh5TTsvdO;^^9C-(>Q#o$wjHcU9eLX2eRK zuCm`zS$5X)omN42LSkUFB$?-rr}i$D_!K3gevzwFE^Dw)amxVJo}#X|(&*0ulW&hK zYGM#cgsn^gu= zqYGPTk@GijdYO!bANDfGTq`0yQXpZU zGUP_~E5eT`y0D*;)miHY=%ot7C3tf<3c`s`VW=yY%1?O}nEYYb_un9;J=Pu;PVRh; z)J=zPwPcq{o}iNV`;yp~UiNIla<)P-t#a>Bxht)l_oAf6Ao4GyOS{66n=1l%VM%8< z3xvP4b-r4K|A+IzuQQpFs7+3c6cc8Ht+KYKiuSAMpMjRP!NAy8zvcCj7mTez-1?-QdY29<-x5ZmYN?`|uhrr!|R!0aWfRT>0ail(_=1s${ z1fEr`t=AaUVv~co*;eJE?-AF473q6Q*(t8>Uqw#HndlYkxMN&H9a6BiU%$uWU~tQ~ zeM*5`E3C?@)l)4rw%xm!o0M+CtR#mEf9iNFC4UK5a>==EXhR9q&|NPBv;0uwTuFrssdhsXQ@Lmi6%GJ4AUsH|pLRikFKn4U zVB_jo_CscyO>pBni~{bVc(q^Xtne63`CxpbRGMn ztxW?9)#lVmc>Xy&v!Q`n(_Dz}!*~|@MGB28WU|O%Y1ShG11({%Ur7xy&HJ-y_f z8hDa`E?i--!K4vfa|Eim1udack{Nt6iE}PWmZbwZXhFGZRt&l;T+_5UJP%JpCeo9} z43%Yh<%tG1;foB6c3SThsSIGLs+63INQKKdrVy3m{b!PVwY`(5Yu+glrFrkuL%3w4 znzK1s@%gKhht~Gf$acPjeETX??ZYZzO?@>v*t6P;zPXLC}NVRS=<5{FR&27q~Sv!a`SGKhb znAr~p%NcBmMQ`ezqyk@SfM}l?eWDk;HsCN3`G}+QB zaoQ8040a3{TZ9R|6|#mIMR(+Aw@=+YyM1xz;=5%sCj(RXgA=V2+e#FE?jLs5!^08> z#2L|JMpN@8Zw9Xy74*<5gNJ#5fSGIE(%iz` zY9jfvR=LYsM>c$Yatc~~AW^2fTE+hHK8n51zGT=| z-^&@viefMF-d4HTbYE&ppGB7&Djsfz5otT)ur}`RuExfmBXkkJG zI`n#bO>q~Oy;|A)>1`ZZT#@ZEK{8L(+q>P+h2_lowU*mY$~^rc_mc!3^ZYvH4s1ye zjHb!ytH{~L<)j8iQ)4hTxSZ(&qtnM=(~A~hvlrc~u}yP1_J({lf7`hnd$qorx9KjY zW`K9{tFi51i(YZ%;Qy7^mvsq_6pu6L<}~$N9zb3ohP)yiBnzKbZD z>V&3H5fyo1BAQlQg*2`R7h}m20=K#Hs1kUfxw;b!dN4;}i_c+p?l!x%@4|*q@~S6= zgYj*9cqlvwSR}`4i#s`Pws@r+Ye+$ksa}q?JeHF8s%9pTV>P*OBCdpqsL7#1l0&%u zQ#p2s410PHo$rYbd>OP)h^;<(xvhOoaSe_sS6YRvG2jcM7`$0j@d*A{~^q z7eBWnjaxFrd$A!`*USjScLZpv?#2xr#WVRow4j?$hcvTyc|(f-DEj@>5R z$KL>FEDdU2dxJ1aB=SZW8ZjpNwnbx!B;E=UI~6ZPTXf1}8bqdXb2{g@4~{9&k{tyl z?@`zZH_(Zv!@Xv^_Cjmj1Dp%D4uyrd=$^WAt;F5Pm+pi6>TV>BK-QmhN0FW=(y0j5 zxzL9hAD$|GlisCgor&~s-(a0jlY-$&@8L79Yv9EFlNc1Ho}meCOO`dEpC}D0Qwd#( z_C1iA1cl3p0r}A5%E0>hE}39?UudsV@=A|NO)?GCyCZy`A;XpDGNGs^qICF)Mj8>0 z3+l}{-w{3mI(JFD0BimsCR)s%^f{zXL(RnhO2iw3A+p?Z*1 z`H*OY=B8vN8o2=C;7>v`x-XV{4r*8pD!A0Dg|&K|GRKrmgZ|2U=CljBYoxUVFncYf z^pKK^WuNBj@m&PZ3&U^QeOg?A-#~4h3alx#hx-veo8hL#YHm*f>Fxt>kHx!)DU8m+`>@^N}0EPcfTuMs_+epUeStRY8!i zKa$z5vGu0?%Wkghz;J_fpzFXkhaGIy7PbX%p;pNA^{+nkpP>8K_dqv<3JQ1d2Xr$` zIVkP_6?fY`0J^h-V(bm+dh@jnqZ^<&Wen1)~Yk+uH%5B^8o zJ^MA#T`F{+bm$uXBXm!G1$6rgogJsi*FW(e346zjp!+ShTKJ_IZ2jloGP~&ch0z|^$NL*67Eiz+=DcM@+#u&0R11tSvdt*kyBW+w8$vqE zH)^l0|7hVmrk7$Y75&ZjMwGBL z)ZF*;Wq`W!0T1;a!#1OgP4$K&_lm>z4+U}uYaO;p7)kh=?)yt_`7~K_?()gMMNrR> zR!aWJ=ji)d4%;-@Rz8_D69e0wg2*@SB5Z3O61LBmvAsQl`kZ0wD`TrC2j2D*Kt6eB z1h)u?@c4&?=9n^?IZ^fp4b6MYXx`<}9Ouw2naVjU1RdLjd{YIT73wK!m4$RcP)iqd7gw{=T8Pp^WBuhvv%;&37WWtAwVW z#>M>)Wi+d!>~jsxiDfjOcWCZ#Xf{T0hYQVpv}Er=T^Wt&Bh;e~jq3-g zw|{;LG}r4OLGoFmW}o@SpE%$b9q_0Enatw?zUq1b-|2x-&W{77H{D2o#JE*?-?Ro)l4jb-7!B8fUXjH=vKK7u+Y>k>Wy1I-xE|q) z->fA32A7I>*o)YOs-o@d#eN1(;or$;%qt zqr2#WWO3&n%%h91saDQ}mm^;*8r<+;WmA6Djfc9icOx4ijqkv>`gcR|6{j^b!2&sM zS3E6NZOw8wtCa9Uue?} zg`MvEVt{lwkb5Qo`8L==wtySv2>49IG)e{>=t^QBf%s_^eI=66!n0P_b-2VG8d~4a zlc6sq7iNh9m9~m0^>QBKD3VC&6g$QFnm$MH=~D8i7uoUzD7KTy-(zKHitLGQh{?NR zf|lNqu$5=CJZH~)R0udv{qb0hbQLGdSZqdG0n4s^733s9oQXguJ!YwF8cUAKj5bgC zy6$9>NC^t7V9l{|l+;9H9X3f+XG}sGSJGcIBz8FfV)kxG0BT;|P;4kAzXyglx^EHlY0*@&&F*&-=GO3I;$xt4L@e7|89q_x46ZfY zZyfv>`8bKBnMbaE@Vf+VQAFFHtcNWl(9ez_5jP#=%Qu6sB`v&+)JO%1th$VJI{v#%bMCi2pjY36 z({0JtTJ$|QJ?N)36cGWflH7>{p)4i80|6QXIg(4;0$)0TkRvNRKIrDZ&M0DiPfH|L zJAMCz2K(mvrZe{NU)u_N)E}HGhNEUmnAWq}t#uTHol4kB`&FMYG>37dusw>=t2535%9tPW2u@k4`|oz?KN_^P&?<*f@1bRtxu?g@*ul=Sf)nh*!@4bsiKj zy*^#J030jm+ypn3?|_g|;9QLQsxE&q4k*(+rsLB0t2C)hm+XEVEdCynid-N*0n-$< zMV*v!ZPe^jvm8_t>j%I(qBCt`UAUCg_aNEN7dm!}%!R8U4Yey)77N2rTh6z>Av(B-4##UBRW11t73rqkY(~_;+#@s1m4rE9}+)H`3 zu}>3u0znF2lGGG3%dUK>#kbYyAZgk*lx%uI`*b)s+nNUl)D{%qqeanvA!FsV#|%DP z%i1!T-ra1-5f!X?ets-Wv+mqYp^D*=wzG*Opn)7aJdW9avyL%(yNOZaW4D6KjS?g9 zf>tsF6}6914J(D8v}|3OjBd!Ksl=)6J`*MkMURC}Iz?sfg9@!eWIz~UI~S+&BMf|K zHOKQpJ!|NANs-=N6&W^Xgm2f4Rl+}C8+ zoAon>YymO#bC%Ug2CcH1-iRtQD1Kq#b&W6)C)tn7s>PHBpJBrA>g`=Q?xM`71Ml5? zEJ!K&!$oF4_+8haAVa$vw8a@?iCyK1nXHSf1smp29zgFw&*~(HLVA_m$0ACRSUuVGTJ7C>#8tXe&v7_C4GsxoELI8MKsLT;E)mgveXu|SaWnS!Y1m(?KFfTnwe{Sk}f+UHPf>lGZdB9#3L$g zCnloOtHzghj7BAOCL=0YqZ1WT$ΞlmIE_ucW%w5680nCuJlWmnU{G!%sOL{bb0n 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 Xdf?!I8kFmSzuWnDc=F+Kf)e=uq$?!a literal 0 HcmV?d00001