From d6a93182469445f039adaccaba06b601fd823256 Mon Sep 17 00:00:00 2001 From: Guillaume Martres <smarter@ubuntu.com> Date: Mon, 19 Apr 2021 12:02:23 +0200 Subject: [PATCH] Add solution to the 2021 midterm --- previous-exams/2021-midterm/m1.md | 61 +++ previous-exams/2021-midterm/m1/.gitignore | 22 + previous-exams/2021-midterm/m1/assignment.sbt | 2 + previous-exams/2021-midterm/m1/build.sbt | 12 + .../2021-midterm/m1/grading-tests.jar | Bin 0 -> 33287 bytes .../m1/project/FilteringReporterPlugin.scala | 31 ++ .../m1/project/MOOCSettings.scala | 49 ++ .../m1/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m1/project/build.properties | 1 + .../2021-midterm/m1/project/buildSettings.sbt | 5 + .../2021-midterm/m1/project/plugins.sbt | 2 + .../m1/src/main/scala/m1/Lib.scala | 60 +++ .../m1/src/main/scala/m1/M1.scala | 76 ++++ .../m1/src/test/scala/m1/M1Suite.scala | 156 +++++++ previous-exams/2021-midterm/m14.md | 42 ++ previous-exams/2021-midterm/m14/.gitignore | 22 + .../2021-midterm/m14/assignment.sbt | 2 + previous-exams/2021-midterm/m14/build.sbt | 12 + .../2021-midterm/m14/grading-tests.jar | Bin 0 -> 119786 bytes .../m14/project/FilteringReporterPlugin.scala | 31 ++ .../m14/project/MOOCSettings.scala | 49 ++ .../m14/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m14/project/build.properties | 1 + .../m14/project/buildSettings.sbt | 5 + .../2021-midterm/m14/project/plugins.sbt | 2 + .../scala/m14/AbstractBlockingQueue.scala | 14 + .../m14/AbstractThreadPoolExecutor.scala | 7 + .../m14/src/main/scala/m14/M14.scala | 80 ++++ .../m14/src/main/scala/m14/Monitor.scala | 23 + .../m14/src/test/scala/m14/M14Suite.scala | 159 +++++++ .../m14/instrumentation/MockedMonitor.scala | 73 +++ .../SchedulableBlockingQueue.scala | 17 + .../scala/m14/instrumentation/Scheduler.scala | 305 +++++++++++++ .../scala/m14/instrumentation/Stats.scala | 23 + .../m14/instrumentation/TestHelper.scala | 125 ++++++ .../scala/m14/instrumentation/TestUtils.scala | 20 + previous-exams/2021-midterm/m15.md | 42 ++ previous-exams/2021-midterm/m15/.gitignore | 22 + .../2021-midterm/m15/assignment.sbt | 2 + previous-exams/2021-midterm/m15/build.sbt | 12 + .../2021-midterm/m15/grading-tests.jar | Bin 0 -> 126110 bytes .../m15/project/FilteringReporterPlugin.scala | 31 ++ .../m15/project/MOOCSettings.scala | 49 ++ .../m15/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m15/project/build.properties | 1 + .../m15/project/buildSettings.sbt | 5 + .../2021-midterm/m15/project/plugins.sbt | 2 + .../scala/m15/AbstractBlockingQueue.scala | 14 + .../m15/AbstractThreadPoolExecutor.scala | 7 + .../m15/src/main/scala/m15/M15.scala | 79 ++++ .../m15/src/main/scala/m15/Monitor.scala | 23 + .../m15/src/test/scala/m15/M15Suite.scala | 281 ++++++++++++ .../m15/instrumentation/MockedMonitor.scala | 73 +++ .../SchedulableBlockingQueue.scala | 17 + .../scala/m15/instrumentation/Scheduler.scala | 305 +++++++++++++ .../scala/m15/instrumentation/Stats.scala | 23 + .../m15/instrumentation/TestHelper.scala | 125 ++++++ .../scala/m15/instrumentation/TestUtils.scala | 20 + previous-exams/2021-midterm/m2.md | 61 +++ previous-exams/2021-midterm/m2/.gitignore | 22 + previous-exams/2021-midterm/m2/assignment.sbt | 2 + previous-exams/2021-midterm/m2/build.sbt | 12 + .../2021-midterm/m2/grading-tests.jar | Bin 0 -> 34633 bytes .../m2/project/FilteringReporterPlugin.scala | 31 ++ .../m2/project/MOOCSettings.scala | 49 ++ .../m2/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m2/project/build.properties | 1 + .../2021-midterm/m2/project/buildSettings.sbt | 5 + .../2021-midterm/m2/project/plugins.sbt | 2 + .../m2/src/main/scala/m2/Lib.scala | 60 +++ .../m2/src/main/scala/m2/M2.scala | 75 ++++ .../m2/src/test/scala/m2/M2Suite.scala | 175 ++++++++ previous-exams/2021-midterm/m20.md | 97 ++++ previous-exams/2021-midterm/m20/.gitignore | 22 + .../2021-midterm/m20/assignment.sbt | 2 + previous-exams/2021-midterm/m20/build.sbt | 12 + .../2021-midterm/m20/grading-tests.jar | Bin 0 -> 131660 bytes .../m20/project/FilteringReporterPlugin.scala | 31 ++ .../m20/project/MOOCSettings.scala | 49 ++ .../m20/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m20/project/build.properties | 1 + .../m20/project/buildSettings.sbt | 5 + .../2021-midterm/m20/project/plugins.sbt | 2 + .../main/scala/m20/MultiWriterSeqCount.scala | 66 +++ .../m20/src/main/scala/m20/SeqCount.scala | 53 +++ .../m20/instrumentation/AtomicVariable.scala | 28 ++ .../scala/m20/instrumentation/Monitor.scala | 23 + .../m20/src/test/scala/m20/TestSuite.scala | 122 +++++ .../m20/instrumentation/MockedMonitor.scala | 72 +++ .../scala/m20/instrumentation/Scheduler.scala | 304 +++++++++++++ .../scala/m20/instrumentation/Stats.scala | 23 + .../m20/instrumentation/TestHelper.scala | 124 +++++ .../scala/m20/instrumentation/TestUtils.scala | 19 + .../m20/src/test/scala/m20/overrides.scala | 68 +++ previous-exams/2021-midterm/m21.md | 97 ++++ previous-exams/2021-midterm/m21/.gitignore | 22 + .../2021-midterm/m21/assignment.sbt | 2 + previous-exams/2021-midterm/m21/build.sbt | 12 + .../2021-midterm/m21/grading-tests.jar | Bin 0 -> 131654 bytes .../m21/project/FilteringReporterPlugin.scala | 31 ++ .../m21/project/MOOCSettings.scala | 49 ++ .../m21/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m21/project/build.properties | 1 + .../m21/project/buildSettings.sbt | 5 + .../2021-midterm/m21/project/plugins.sbt | 2 + .../main/scala/m21/MultiWriterSeqCount.scala | 66 +++ .../m21/src/main/scala/m21/SeqCount.scala | 53 +++ .../m21/instrumentation/AtomicVariable.scala | 28 ++ .../scala/m21/instrumentation/Monitor.scala | 23 + .../m21/src/test/scala/m21/TestSuite.scala | 122 +++++ .../m21/instrumentation/MockedMonitor.scala | 72 +++ .../scala/m21/instrumentation/Scheduler.scala | 304 +++++++++++++ .../scala/m21/instrumentation/Stats.scala | 23 + .../m21/instrumentation/TestHelper.scala | 124 +++++ .../scala/m21/instrumentation/TestUtils.scala | 19 + .../m21/src/test/scala/m21/overrides.scala | 68 +++ previous-exams/2021-midterm/m3.md | 61 +++ previous-exams/2021-midterm/m3/.gitignore | 22 + previous-exams/2021-midterm/m3/assignment.sbt | 2 + previous-exams/2021-midterm/m3/build.sbt | 12 + .../2021-midterm/m3/grading-tests.jar | Bin 0 -> 34429 bytes .../m3/project/FilteringReporterPlugin.scala | 31 ++ .../m3/project/MOOCSettings.scala | 49 ++ .../m3/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m3/project/build.properties | 1 + .../2021-midterm/m3/project/buildSettings.sbt | 5 + .../2021-midterm/m3/project/plugins.sbt | 2 + .../m3/src/main/scala/m3/Lib.scala | 68 +++ .../m3/src/main/scala/m3/M3.scala | 75 ++++ .../m3/src/test/scala/m3/M3Suite.scala | 174 ++++++++ previous-exams/2021-midterm/m6.md | 155 +++++++ previous-exams/2021-midterm/m6/.gitignore | 22 + previous-exams/2021-midterm/m6/assignment.sbt | 2 + previous-exams/2021-midterm/m6/build.sbt | 12 + .../2021-midterm/m6/grading-tests.jar | Bin 0 -> 35241 bytes .../m6/project/FilteringReporterPlugin.scala | 31 ++ .../m6/project/MOOCSettings.scala | 49 ++ .../m6/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m6/project/build.properties | 1 + .../2021-midterm/m6/project/buildSettings.sbt | 5 + .../2021-midterm/m6/project/plugins.sbt | 2 + .../m6/src/main/scala/m6/M6.scala | 149 +++++++ .../m6/src/main/scala/m6/lib.scala | 84 ++++ .../m6/src/test/scala/m6/M6Suite.scala | 422 ++++++++++++++++++ previous-exams/2021-midterm/m7.md | 155 +++++++ previous-exams/2021-midterm/m7/.gitignore | 22 + previous-exams/2021-midterm/m7/assignment.sbt | 2 + previous-exams/2021-midterm/m7/build.sbt | 12 + .../2021-midterm/m7/grading-tests.jar | Bin 0 -> 35244 bytes .../m7/project/FilteringReporterPlugin.scala | 31 ++ .../m7/project/MOOCSettings.scala | 49 ++ .../m7/project/StudentTasks.scala | 303 +++++++++++++ .../2021-midterm/m7/project/build.properties | 1 + .../2021-midterm/m7/project/buildSettings.sbt | 5 + .../2021-midterm/m7/project/plugins.sbt | 2 + .../m7/src/main/scala/m7/M7.scala | 149 +++++++ .../m7/src/main/scala/m7/lib.scala | 84 ++++ .../m7/src/test/scala/m7/M7Suite.scala | 422 ++++++++++++++++++ 158 files changed, 10460 insertions(+) create mode 100644 previous-exams/2021-midterm/m1.md create mode 100644 previous-exams/2021-midterm/m1/.gitignore create mode 100644 previous-exams/2021-midterm/m1/assignment.sbt create mode 100644 previous-exams/2021-midterm/m1/build.sbt create mode 100644 previous-exams/2021-midterm/m1/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m1/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m1/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m1/project/build.properties create mode 100644 previous-exams/2021-midterm/m1/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m1/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala create mode 100644 previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala create mode 100644 previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala create mode 100644 previous-exams/2021-midterm/m14.md create mode 100644 previous-exams/2021-midterm/m14/.gitignore create mode 100644 previous-exams/2021-midterm/m14/assignment.sbt create mode 100644 previous-exams/2021-midterm/m14/build.sbt create mode 100644 previous-exams/2021-midterm/m14/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m14/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m14/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m14/project/build.properties create mode 100644 previous-exams/2021-midterm/m14/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m14/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala create mode 100644 previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m15.md create mode 100644 previous-exams/2021-midterm/m15/.gitignore create mode 100644 previous-exams/2021-midterm/m15/assignment.sbt create mode 100644 previous-exams/2021-midterm/m15/build.sbt create mode 100644 previous-exams/2021-midterm/m15/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m15/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m15/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m15/project/build.properties create mode 100644 previous-exams/2021-midterm/m15/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m15/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala create mode 100644 previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m2.md create mode 100644 previous-exams/2021-midterm/m2/.gitignore create mode 100644 previous-exams/2021-midterm/m2/assignment.sbt create mode 100644 previous-exams/2021-midterm/m2/build.sbt create mode 100644 previous-exams/2021-midterm/m2/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m2/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m2/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m2/project/build.properties create mode 100644 previous-exams/2021-midterm/m2/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m2/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala create mode 100644 previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala create mode 100644 previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala create mode 100644 previous-exams/2021-midterm/m20.md create mode 100644 previous-exams/2021-midterm/m20/.gitignore create mode 100644 previous-exams/2021-midterm/m20/assignment.sbt create mode 100644 previous-exams/2021-midterm/m20/build.sbt create mode 100644 previous-exams/2021-midterm/m20/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m20/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m20/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m20/project/build.properties create mode 100644 previous-exams/2021-midterm/m20/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m20/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala create mode 100644 previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala create mode 100644 previous-exams/2021-midterm/m21.md create mode 100644 previous-exams/2021-midterm/m21/.gitignore create mode 100644 previous-exams/2021-midterm/m21/assignment.sbt create mode 100644 previous-exams/2021-midterm/m21/build.sbt create mode 100644 previous-exams/2021-midterm/m21/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m21/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m21/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m21/project/build.properties create mode 100644 previous-exams/2021-midterm/m21/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m21/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala create mode 100644 previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala create mode 100644 previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala create mode 100644 previous-exams/2021-midterm/m3.md create mode 100644 previous-exams/2021-midterm/m3/.gitignore create mode 100644 previous-exams/2021-midterm/m3/assignment.sbt create mode 100644 previous-exams/2021-midterm/m3/build.sbt create mode 100644 previous-exams/2021-midterm/m3/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m3/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m3/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m3/project/build.properties create mode 100644 previous-exams/2021-midterm/m3/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m3/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala create mode 100644 previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala create mode 100644 previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala create mode 100644 previous-exams/2021-midterm/m6.md create mode 100644 previous-exams/2021-midterm/m6/.gitignore create mode 100644 previous-exams/2021-midterm/m6/assignment.sbt create mode 100644 previous-exams/2021-midterm/m6/build.sbt create mode 100644 previous-exams/2021-midterm/m6/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m6/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m6/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m6/project/build.properties create mode 100644 previous-exams/2021-midterm/m6/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m6/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala create mode 100644 previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala create mode 100644 previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala create mode 100644 previous-exams/2021-midterm/m7.md create mode 100644 previous-exams/2021-midterm/m7/.gitignore create mode 100644 previous-exams/2021-midterm/m7/assignment.sbt create mode 100644 previous-exams/2021-midterm/m7/build.sbt create mode 100644 previous-exams/2021-midterm/m7/grading-tests.jar create mode 100644 previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala create mode 100644 previous-exams/2021-midterm/m7/project/MOOCSettings.scala create mode 100644 previous-exams/2021-midterm/m7/project/StudentTasks.scala create mode 100644 previous-exams/2021-midterm/m7/project/build.properties create mode 100644 previous-exams/2021-midterm/m7/project/buildSettings.sbt create mode 100644 previous-exams/2021-midterm/m7/project/plugins.sbt create mode 100644 previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala create mode 100644 previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala create mode 100644 previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala diff --git a/previous-exams/2021-midterm/m1.md b/previous-exams/2021-midterm/m1.md new file mode 100644 index 0000000..0846974 --- /dev/null +++ b/previous-exams/2021-midterm/m1.md @@ -0,0 +1,61 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m1 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m1 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +Given the following sequential implementation of a function that computes the sequence of rolling averages, your task will be to complete and optimize a parallel version of this code. + +```scala +/** Compute the rolling average of array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(x1 / 1, (x1 + x2) / 2, (x1 + x2 + x3) / 3, ..., (x1 + x2 + x3 + ... + xn) / n)` + */ +def rollingAveragesSequential(arr: Array[Int]): Array[Double] = + // Transform all numbers to fractions with denominator 1 + val arr1 = arr.map(x => Frac(x, 1)) + // Compute the rolling average keeping the sum of all elements in the numerator and the count of elements in the denominator. + val arr2 = arr1.scan(Frac(0, 0))((acc, x) => Frac(acc.numerator + x.numerator, acc.denominator + x.denominator)) + // Transform fractions to Doubles + arr2.map(frac => frac.toDouble) + // Drop the extra initial element that was added by the scan + arr3.tail +``` + + This implementation has some issues: + - It does not use parallelism + - Creates two intermediate arrays by calling `map` + - Creates an extra intermediate arrays by calling `tail` + - Scan returns an extra element we do not need + + We want to parallelize and avoid the creation of the extra arrays. + As we are calling a `scan` the natural operations we need are `upsweep` and `downsweep`. + It is possible specialize those operations for our problem by letting those operations do the mapping. + It is also possible to change those operations to not generate the first element. + +We give you a version of `rollingAveragesSequential` that partially implements the parallelization using `upsweep` and `downsweep`. + + Your tasks in the exercise will be to: + - TASK 1: Implement the parallelization of `upsweep` and `downsweep` + - TASK 2: Remove the calls to the `map` + - TASK 3: Remove the call to `tail` + + You can get partial points for solving part of the tasks. + The order of the tasks is a suggestion, you may do them in any order if that is simpler for you. + +Look at the `Lib` trait to find the definitions of functions and classes you can use (or already used). +In this question we use a `Arr` array class instead of the normal `Array`. You may assume that this class has the same performance characteristics as the normal array. `Arr` provides only a limited set of operations. diff --git a/previous-exams/2021-midterm/m1/.gitignore b/previous-exams/2021-midterm/m1/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m1/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m1/assignment.sbt b/previous-exams/2021-midterm/m1/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m1/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m1/build.sbt b/previous-exams/2021-midterm/m1/build.sbt new file mode 100644 index 0000000..e476688 --- /dev/null +++ b/previous-exams/2021-midterm/m1/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m1" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m1.M1Suite" diff --git a/previous-exams/2021-midterm/m1/grading-tests.jar b/previous-exams/2021-midterm/m1/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..6fa91f4263cecf0bd58cfea49fefc29d3cf7bffa GIT binary patch literal 33287 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 P82A|Gu`n<M*MfKex{Fn^ literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m1/project/MOOCSettings.scala b/previous-exams/2021-midterm/m1/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m1/project/StudentTasks.scala b/previous-exams/2021-midterm/m1/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m1/project/build.properties b/previous-exams/2021-midterm/m1/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m1/project/buildSettings.sbt b/previous-exams/2021-midterm/m1/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m1/project/plugins.sbt b/previous-exams/2021-midterm/m1/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m1/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala b/previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala new file mode 100644 index 0000000..37ce780 --- /dev/null +++ b/previous-exams/2021-midterm/m1/src/main/scala/m1/Lib.scala @@ -0,0 +1,60 @@ +package m1 + +//////////////////////////////////////// +// NO NEED TO MODIFY THIS SOURCE FILE // +//////////////////////////////////////// + +trait Lib { + + /** If an array has `n` elements and `n < THRESHOLD`, then it should be processed sequentially */ + final val THRESHOLD: Int = 33 + + /** Compute the two values in parallel + * + * Note: Most tests just compute those two sequentially to make any bug simpler to debug + */ + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) + + /** A limited array. It only contains the required operations for this exercise. */ + trait Arr[T] { + /** Get the i-th element of the array (0-based) */ + def apply(i: Int): T + /** Update the i-th element of the array with the given value (0-based) */ + def update(i: Int, x: T): Unit + /** Number of elements in this array */ + def length: Int + /** Create a copy of this array without the first element */ + def tail: Arr[T] + /** Create a copy of this array by mapping all the elements with the given function */ + def map[U](f: T => U): Arr[U] + } + + object Arr { + /** Create an array with the given elements */ + def apply[T](xs: T*): Arr[T] = { + val arr: Arr[T] = Arr.ofLength(xs.length) + for i <- 0 until xs.length do arr(i) = xs(i) + arr + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def ofLength[T](n: Int): Arr[T] = + newArrOfLength(n) + + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def newArrOfLength[T](n: Int): Arr[T] + + /** A fractional number representing `numerator/denominator` */ + case class Frac(numerator: Int, denominator: Int) { + def toDouble: Double = numerator.toDouble / denominator + } + + /** Tree result of an upsweep operation. Specialized for `Frac` results. */ + trait TreeRes { val res: Frac } + /** Leaf result of an upsweep operation. Specialized for `Frac` results. */ + case class Leaf(from: Int, to: Int, res: Frac) extends TreeRes + /** Tree node result of an upsweep operation. Specialized for `Frac` results. */ + case class Node(left: TreeRes, res: Frac, right: TreeRes) extends TreeRes +} diff --git a/previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala b/previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala new file mode 100644 index 0000000..fc53991 --- /dev/null +++ b/previous-exams/2021-midterm/m1/src/main/scala/m1/M1.scala @@ -0,0 +1,76 @@ +package m1 + + +trait M1 extends Lib { + // Functions and classes of Lib can be used in here + + /** Compute the rolling average of array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(x1 / 1, (x1 + x2) / 2, (x1 + x2 + x3) / 3, ..., (x1 + x2 + x3 + ... + xn) / n)` + */ + def rollingAveragesParallel(arr: Arr[Int]): Arr[Double] = { + if (arr.length == 0) return Arr.ofLength(0) + + val out: Arr[Double] = Arr.ofLength(arr.length) + val tree = upsweep(arr, 0, arr.length) + downsweep(arr, Frac(0, 0), tree, out) + out + } + + // No need to modify this + def scanOp(acc: Frac, x: Frac) = + Frac(acc.numerator + x.numerator, acc.denominator + x.denominator) + + + def upsweep(input: Arr[Int], from: Int, to: Int): TreeRes = { + if (to - from < THRESHOLD) + Leaf(from, to, reduceSequential(input, from + 1, to, Frac(input(from), 1))) + else { + val mid = from + (to - from)/2 + val (tL, tR) = parallel( + upsweep(input, from, mid), + upsweep(input, mid, to) + ) + Node(tL, scanOp(tL.res, tR.res), tR) + } + } + + + def downsweep(input: Arr[Int], a0: Frac, tree: TreeRes, output: Arr[Double]): Unit = { + tree match { + case Node(left, _, right) => + parallel( + downsweep(input, a0, left, output), + downsweep(input, scanOp(a0, left.res), right, output) + ) + case Leaf(from, to, _) => + downsweepSequential(input, from, to, a0, output) + } + } + + + def downsweepSequential(input: Arr[Int], from: Int, to: Int, a0: Frac, output: Arr[Double]): Unit = { + if (from < to) { + var i = from + var a = a0 + while (i < to) { + a = scanOp(a, Frac(input(i), 1)) + output(i) = a.toDouble + i = i + 1 + } + } + } + + + def reduceSequential(input: Arr[Int], from: Int, to: Int, a0: Frac): Frac = { + var a = a0 + var i = from + while (i < to) { + a = scanOp(a, Frac(input(i), 1)) + i = i + 1 + } + a + } + +} diff --git a/previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala b/previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala new file mode 100644 index 0000000..ab1b865 --- /dev/null +++ b/previous-exams/2021-midterm/m1/src/test/scala/m1/M1Suite.scala @@ -0,0 +1,156 @@ +package m1 + +class M1Suite extends munit.FunSuite { + + test("Rolling average result test (5pts)") { + RollingAveragesBasicLogicTest.basicTests() + RollingAveragesBasicLogicTest.normalTests() + RollingAveragesBasicLogicTest.largeTests() + } + + test("[TASK 1] Rolling average parallelism test (30pts)") { + RollingAveragesCallsToParallel.parallelismTest() + RollingAveragesParallel.basicTests() + RollingAveragesParallel.normalTests() + RollingAveragesParallel.largeTests() + } + + test("[TASK 2] Rolling average no `map` test (35pts)") { + RollingAveragesNoMap.basicTests() + RollingAveragesNoMap.normalTests() + RollingAveragesNoMap.largeTests() + } + + test("[TASK 3] Rolling average no `tail` test (30pts)") { + RollingAveragesNoTail.basicTests() + RollingAveragesNoTail.normalTests() + RollingAveragesNoTail.largeTests() + } + + + object RollingAveragesBasicLogicTest extends M1 with LibImpl with RollingAveragesTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + object RollingAveragesCallsToParallel extends M1 with LibImpl with RollingAveragesTest { + private var count = 0 + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = + count += 1 + (op1, op2) + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + + def parallelismTest() = { + assertParallelCount(Arr(), 0) + assertParallelCount(Arr(1), 0) + assertParallelCount(Arr(1, 2, 3, 4), 0) + assertParallelCount(Arr(Array.tabulate(16)(identity): _*), 0) + assertParallelCount(Arr(Array.tabulate(32)(identity): _*), 0) + + assertParallelCount(Arr(Array.tabulate(33)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(64)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(128)(identity): _*), 6) + assertParallelCount(Arr(Array.tabulate(256)(identity): _*), 14) + assertParallelCount(Arr(Array.tabulate(1000)(identity): _*), 62) + assertParallelCount(Arr(Array.tabulate(1024)(identity): _*), 62) + } + + def assertParallelCount(arr: Arr[Int], expected: Int): Unit = { + try { + count = 0 + rollingAveragesParallel(arr) + assert(count == expected, { + val extra = if (expected == 0) "" else s" ${expected/2} for the `upsweep` and ${expected/2} for the `downsweep`" + s"\n$arr\n\nERROR: Expected $expected instead of $count calls to `parallel(...)` for an array of ${arr.length} elements. Current parallel threshold is $THRESHOLD.$extra" + }) + } finally { + count = 0 + } + } + + } + + object RollingAveragesNoMap extends M1 with LibImpl with RollingAveragesTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def map[U](f: T => U): Arr[U] = throw Exception("Should not call Arr.map") + } + } + + object RollingAveragesNoTail extends M1 with LibImpl with RollingAveragesTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def tail: Arr[T] = throw Exception("Should not call Arr.tail") + } + } + + object RollingAveragesParallel extends M1 with LibImpl with RollingAveragesTest { + import scala.concurrent.duration._ + val TIMEOUT = Duration(10, SECONDS) + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = { + import concurrent.ExecutionContext.Implicits.global + import scala.concurrent._ + Await.result(Future(op1).zip(Future(op2)), TIMEOUT) // FIXME not timing-out + } + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + trait LibImpl extends Lib { + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] + + def newArrOfLength[T](n: Int): Arr[T] = + newArrFrom(new Array(n)) + + class ArrImpl[T](val arr: Array[AnyRef]) extends Arr[T]: + def apply(i: Int): T = + arr(i).asInstanceOf[T] + def update(i: Int, x: T): Unit = + arr(i) = x.asInstanceOf[AnyRef] + def length: Int = + arr.length + def map[U](f: T => U): Arr[U] = + newArrFrom(arr.map(f.asInstanceOf[AnyRef => AnyRef])) + def tail: Arr[T] = + newArrFrom(arr.tail) + override def toString: String = + arr.mkString("Arr(", ", ", ")") + override def equals(that: Any): Boolean = + that match + case that: ArrImpl[_] => Array.equals(arr, that.arr) + case _ => false + } + + trait RollingAveragesTest extends M1 { + + def tabulate[T](n: Int)(f: Int => T): Arr[T] = + val arr = Arr.ofLength[T](n) + for i <- 0 until n do + arr(i) = f(i) + arr + + def basicTests() = { + assertEquals(rollingAveragesParallel(Arr()), Arr[Double]()) + assertEquals(rollingAveragesParallel(Arr(1)), Arr[Double](1)) + assertEquals(rollingAveragesParallel(Arr(1, 2, 3, 4)), Arr(1, 1.5, 2, 2.5)) + assertEquals(rollingAveragesParallel(Arr(4, 4, 4, 4)), Arr[Double](4, 4, 4, 4)) + } + + def normalTests() = { + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(64)(identity): _*)), Arr(Array.tabulate(64)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(4, 4, 4, 4)), Arr[Double](4, 4, 4, 4)) + assertEquals(rollingAveragesParallel(Arr(4, 8, 6, 4)), Arr[Double](4, 6, 6, 5.5)) + assertEquals(rollingAveragesParallel(Arr(4, 3, 2, 1)), Arr(4, 3.5, 3, 2.5)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(64)(identity).reverse: _*)), Arr(Array.tabulate(64)(i => 63 - i.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(128)(i => 128 - 2*i).reverse: _*)), Arr(Array.tabulate(128)(i => -126d + i): _*)) + } + + def largeTests() = { + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(500)(identity): _*)), Arr(Array.tabulate(500)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(512)(identity): _*)), Arr(Array.tabulate(512)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(1_000)(identity): _*)), Arr(Array.tabulate(1_000)(_.toDouble / 2): _*)) + assertEquals(rollingAveragesParallel(Arr(Array.tabulate(10_000)(identity): _*)), Arr(Array.tabulate(10_000)(_.toDouble / 2): _*)) + } + } +} \ No newline at end of file diff --git a/previous-exams/2021-midterm/m14.md b/previous-exams/2021-midterm/m14.md new file mode 100644 index 0000000..62f775d --- /dev/null +++ b/previous-exams/2021-midterm/m14.md @@ -0,0 +1,42 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m14 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m14 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will implement a simple thread pool executor. +Thread pool executors provide a way to execute tasks in parallel using one of several pooled threads. +Using a pool of threads provides improved performance compared to creating a new thread for every operation since threads in the pool are reused throughout the executor's lifetime. + +Thread pool executors are one of the core primitive used to implement parallel programs. For example, they are the underlying mechanism used in the implementation of `Future`-s. + +Your task is to complete the implementation of the `ThreadPoolExecutor` class. This class' constructor takes the number of threads of the pool as argument and exposes two life-cycle methods (`start` and `shutdown`), and an `execute` method to run tasks on the thread pool. The `execute` method takes as argument `Unit => Unit` functions. These functions can be constructed anonymously using the following syntax: `val func = (x: Unit) => println("hello")`. Furthermore, given a `func` function of type `Unit => Unit`, one can invoke that function using `func(())`. +For the purpose of this exercise, you can assume that the tasks submitted to the thread pool via the `execute` method do not throw exceptions. + +The thread pool implementation uses two additional classes: +- `BlockingQueue`, used by the `ThreadPoolExecutor` to store pending tasks, +- `Worker`-s, which each run in a separate thread, consume tasks from the queue and execute those tasks. + +The `BlockingQueue` implements two methods: +- `put` to insert an element in the queue +- `take` to retrieve and remove an element from the queue, in a last in first out order. + +The `put` operation always succeeds and is non-blocking (the queue is unbounded). +The `take` operation is a potentially blocking operation that waits for new elements when called on an empty queue. + +Given that `Worker`-s run on separate threads, the `take` operation must be thread-safe. Furthermore, since the thread pool executor could also be used from multiple threads, the `put` operation should also be thread-safe. +Your implementation should use a single lock to achieve this thread safety, specifically using the `[wait](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait())`/`[notify](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify())`/`[notifyAll](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll())`/`synchronized` primitives. +Remember that `wait`, `notify` and `notifyAll` should only be invoked inside a synchronized block. diff --git a/previous-exams/2021-midterm/m14/.gitignore b/previous-exams/2021-midterm/m14/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m14/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m14/assignment.sbt b/previous-exams/2021-midterm/m14/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m14/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m14/build.sbt b/previous-exams/2021-midterm/m14/build.sbt new file mode 100644 index 0000000..aeee575 --- /dev/null +++ b/previous-exams/2021-midterm/m14/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m14" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m14.M14Suite" diff --git a/previous-exams/2021-midterm/m14/grading-tests.jar b/previous-exams/2021-midterm/m14/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..ff7d9e97309ad2d12b3694244f6870f5603f0dbc GIT binary patch literal 119786 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�XOV!bOU|=% z59THKYDnCRyDWT9_~z29TUe^CcQ>z%ve}_~gH`_B_Y097Nd_X@PtM5G$d)t_ku7uC zb)LIzw{z5*EviB{r@qMERGQuG{&4QH9Om2Kzi0YJ=lWkSeRpNoBj2aZ>^j_SPPrZK zlbtqaY@6<t>F207m2vXHefuu_yL4}z@6wHS%YLTne*54!mG9833?-TOFRx}TdBkeE zn(@ZE3V#)w^D-P;MMG8|at#$*5v>&Kc=Nb(@yw{~G8Y4zYtlW(wr2P)(T}?<-C1%p zYnM`IhEMm^FW*WYJLdP!u@!r}s*_pH^w^!UW*)yM7j2exrZ(GN&3T~qV5!t9*0iN! z%h=lIJ=?XW)nx0E=({SWSA&~-{?{yH%?$88l&yb3jZxyuQIiHPJuapNQ8s;j2c|Qw zZ{@qerEw)CAzSd!h8ZjOyz#NA?ep^So)MP5J?lN6?i=Hb$DhrAJ!{ZU{rAZ-)H9M{ zQ$@jav*Y1m**A7xIe0Frb((b9x`w&hp(X}zjgDs?p15Ou@Ml(Q=UMu4A3dM4J#9*y zf9<yT{rOMkTE=faTvN)m*6>;O!J4&NPfz^R`!`=V_!N^_WNy~WuWg#IWqnqLXEY~z zN&94mPwY%M_3poNu#RW!sU0bGx85YgHap3-l}0Dr4V!xB(yrJ4zptIV=~fZ@ZynFS z3Elc-8!GlWO_vg5Pb^&Swe!-W6EmakJTYFA^J!_cV8I5{%=*}!XU)zY+{Vh4Yo2qP z@pe_nCy(1PA7yO~mu&vhb0TCxe#t`S-?OiqZU624*T*zf@<}eI+>QN?x7)tF+!E__ zoaOjGIVUbT)m~?%mzE1kUq?R_Yh5Jr`BI*fUh#X*wkL6x`_|MHJPOa?e>+w7d*Z~I zGh@#8u<u!NDb?rR6&0V&r`zs1>%0xWFg57+?}U^~?7x1gr$*WZCoU7?kL^}cR&`yW zRGoV6!-cOa7<!tV7aF*xSmb%l)@0ZneA_tKbJ^|bZr?KRN^dk;Gp+Ms>!LNbGt}Cv zwjJI2?%RrGiK0u(&Sv&AZQC>VWks=h;wOH+Wi@vNb(bx7J)Wf6|L)|B71yR!%uJh_ z`X=z-8Q;_QL-w)S9lj>a!?;3t&LNHuHV*t%FRiNVYc#j-X!xTXZd5kG>VWU$)A}bW z9xQY>_F236X^xAfM0e)Jip=fXbZ2lJefsU2#9dwH9~P&Ae($JS7Aj^S%XRsn_nBil zEH{#;l^ba^$1?A!Z<zOOl9M}E=6a`cFFwv+3KIVoIyLRTQ}vSBB&s@pl~lls%3mA2 zDocD8?(SJCbNoQR$fdhlPcIwpxEo;{T>I?KXScAJISVESy*<r!H>2UNNZ1sP*>0gz zEtl}^Pj>ov_*VE!)01zm&pe`9w_Nq4U;d@&IIRWSMR)bTn{Hgk<Na&LVXiq7p1oM) zzv9VKf31=m1s9hGYSg!7x=m9us(tf3M9OtOyRV>q`5u4vxRU`FJPxn7*EMd?Q=REq zn<%w-Io~<ai4(+lUPmx>tEE@JT9}`peZeV8--mVfKG*x_mgiq87tq<s{L*rv#qPW_ zHZKwk^>r8O6rGT%KAY@Q&hj&PMX-<D-+;7~ITMR^FK{hN%(^-4Ow^^cekc2d^Q$&C z%r^|>dnmm8>|^n`Sq}SCW=%>exb<zW&i;B`&+qY(LYI~~{aWj^{Zg)w!G3mz{{bG` z4WGW=abM)+%W1y@pD}Hld17VcUOTCmmv#vU`ZE1G|3zFh_;2V!^_Q9}-@k7N(&;m9 zbNW9;dY9AxqRIdE&xv1>>(+MOwj_#=BU9>IZ1~Nr8RyR&>h^f9@x}C)RmrB^3eyX( ztdrw%@MCyxGu5qlpOgKClLr?sa1YGv@sX?CDBD?4o{}H&km;_UUW-9aMC+9!XD0~@ z#d(~3!1gEE@jhqZ%iZB?1?SHz(2?`~@+e}F`rKLD*2#W|@#wb7eRsmbxo4tu$*;G} z%tglSbKMU$F0a@*!~4LbgVBXK&PsRs_~qucEzU?!iLYK_DRX^Wc3|bc>}|I*Pt6wj z_K`>5|M|=UUbC=P@0Z()+9Gdc^+?_lu2o#S?#kg}hfCK=Pn&N$QQg@zZOih2kaMCx zV~$PTbftN{=sLHrEWQ@&;~p^F{qGYr&ulGUPi5ShE{mPz(%<EZ+lwA6TsQYTaVp*C za{I^q!XcMd&&*7H`D|&VbcR=XCWBt=jE5&09-dfMllR2+q{OT%6AbSp^)J*s-m&?o zjHGkO&B;dHE0=c83)n99^+S-p{^Xf!D~|57s|b4iZR*v~pINJG8nx!{zq4JoHB@f> z1na{1`C{*`X<Dr?l8#w3^H<^#Ej#{Tk9DE^!HoQJJKg$n7&9LWK3;ez`(QE0b;GN@ z9JZ4Crk$|3&uyMJ;m&lU%5NUse1Ee4zeyBvygXMyLI3)>%TBdXB8s~itT!nK<m~;T zkazMq-@Pc0a4nn8r-dE*Zs&F_nV^39?=Rh{Tswjv{@mkW_v)DP+6m$-LQc%x5E8d_ zOXPM1Wu5qm`PCK6#V@~0(vofojdq+f@8LAQnU!q8#|$6(o+>i=P{1OYsLWT+^?sT4 zr=9&1`)qdi-u70v&b?Y-wfBr8<8sHZ+p_G}e)z6#dtH>X)g<};>z8kRk38L#6;+kg zyntDR$N13U-%soAys21IJx~AhC&qnqGS8i8(B>DdS*l{t*VHOz`!`fgbA8+Yri*V4 zIrluA_GrptsY`z1rib&>CGSZj*SzB{d&`w~-JwxBG0l5dfcu}bKWl{VGi5K;^jRAA zaN^ZC%Xen`?sgZJFA(x-519QYB`<TvSG_fBQ#<5#aejaD`EJeo1;*EH`0uYT&~I10 zF2{1cpvL-pPvHBIX*NqPMbt$+Y+3j_@P*xyNvHUgcfaXn`yFs$j&v_u<Md-j$4@_1 zv{}OMB6i@E+;jCk5jQ9M?0XpV>LLFN%i@l@pmeb}avwik{?l`)x^jLD|GDx%3!UyQ zzhp6U?YigEOTHYQAgBFAIz&o;^VNu%YonSU{`C}idHi|Wah9)2`&EQP_6xT^PxlV^ zXUr>VrkJlZXHCPVE9cH~@qf@fxjTH#ouJn)3s_&yuG#ivzu`UMu7iK`6+9x#ITlau zySn|;Pv5%ehm-$oD$(le|5Nz4Yt_yPg(7nl3_~{PcKmz2Na*3l(#{=+AJ)t}qwpv5 zUyt}JyVoiI4{d3&Fe_cOQ6p}*rNriUvldHjOUUhC7H|4^3ES_v>*js_(Y?V;tJyaD zLhqip0b+0XzA4T>X>qPZhsWr0ucXE1J%K;6zbxRnbY1kHO}%5)tJyxQn5%x4CeQxM zC-XCQs+!k<y4L+#uJ#Qt+FSpGin5k0Xa2(UFXw`BVc>HU4TCdoq3=yrnB8_u<;yCN zO4+aAb^4j{+0#j%SBWq5b`e}ECzH9@Za;tfeFwS6A3Q4mM1Stt>*#hyy6=U0%mekk zJX{q&`uQZdZhX65)mopGvU~r5we_Kyn|vDV&0YRCyqK@W<=au0+3}C}Vzrj2_r>*J zw<zsU2<Mo(?1aGI$n%;^?9LNc2Xz+LNVRpIuUYQ+xxMo|({e}dw$AfT%N@BlA5}lU zruf-S{b=S-6?b&rdw$Vnl00=s>D1|MX8i^30*{YWyx~Y<diJ7A;jqF@jigCSPB9uv z9(kktRh%nSFu7IhZZy+(zoU#QKUtqnOZzK*s_WrC&Clw;lTN)nwER+tq4TyYfh8Vu zS|1;obLBcSn+Pw@qK1>go1d&L`aEIj{u#|$@lzH?d@5CYBx%9->&x%T%8S)A<Ly^o ziJPddm9zPp<(a6~)W|T!%!Sk6?%eaHleOB^xm5Yr`KizOnkD{)2s=v2_LVdX+s3N- z7p01-Iht3e=zZo`z9lgGbZ_Pwp`&b;&#XVJzt;AP&GpIaGeW%_S(CjkAJ8#8B`}xw zqNSGa^hFojGBjOIhkWu3Y*dWmyr?xb%_Fec@O4(lwG}49Q$)CVz1Fp6%=JpQ4BBKi zp?8w!8Eet+Tese{m?`r#<nHxrsmiHEA!{$M`1LU2rNlh8=O321UA?_CW_7Ucf(~xp zc@KNk^#WIhoY}B&%RR=WbIqn)d#SNjUTEoE&p(z{C#JoUx-_9^qTpRwzZsjB?)uqv zBf%kATudM+b6ShrZpAK#E6XqCXx>WcND??2I!oDATw>8)frWlLlNaf>y)f#~3tt)2 zwN1Kh5C5XoA*&`B+|E4kCaPmy@XAY)Y25A2GcUJAn&(^0u*{Vx{r50o+X1;>R<}3W z{O<HQ|2Z#nx3K&xrgIXZN8Uc-dpT$K!#UM6uJ!y8v0mg-H{UDtQJu8QUp|4_2`e{c zrDX0r72bZPW<ut=r5BcIJ$QX(o9m)kniKaw|M2_Nm&<D%CZ2v;`6!UR;o8lnhA$P1 z8CM;DF!6Zks%Z;$-4w88y~rLiOWSq3)S`5Ss<5R}n!8Rn+zafO7o0h-<z6Cl)p3O? zN7el;_jX*$(_QA;yS}h@zT(tZ_75e$e4f88Wqsb_*`Hfad^xlJR?79KD>ZGH+86ve z=b_RU>?BbAaqoZr{h37p)?fJN9P#|PDSVCq^M@;%GICBcPX`=X{YZ5x(<9Rm)6+_K zXYIN4hBG@`c<<b(EwPV+r@a=mNDdZA{%}*IFRz<@ciC39-)GKy6<e%vo!<H+ym6CD zZnw&!*juOMey%CVyyV~Z@)P&*Z^gH7S$|k}pXmaR(34C1=VYi%+h3+EmM`$p>(c|{ zizmB;Lt++A3*iYcy{NhBWx(Io&He$g_PQ$qq}gA@c;A{ZMNfLcXPuWfJzu_Jj7s;s zuCnww{{=PgTN9_m890bXUb^e~QkD72+$nuaqbEJeW!|E#YM0Ux-|*IHPv?H?l@j%~ z5lhAE(=SIjvHGT(^h#y$-KvXnC@nG5b*mQDU3hg%+pP=xI-*_%y;>l*C3(x#Zztqs z7t|Wt-F4f3;cte0+qKCh9es;xnWo;2p5bZu$4&9o(cN10t_eS;yldvYbUk#c?ArX$ zZ^4fgDnD-f&mkHzPiZUjx_x`*ud8alvNbe6Tz=u5Romn3*>d$}aaMO09l8C(dUnkF zNv{^(&9*6t-Q1pMq3irYk#XWbf7N61wQqOs(p_A#TWyi_Gqbmo)~<djWfT51eE+gm z@df>FOf}E$+S7GPxWxF3Rhneu%VRpn|3s$EOgU@BIq#58>(NiQ&5Eaa{nU2*>BV|7 zATXy`;qu#(_9-XdpE=uj^p|kYNlUHj8*Y9_H}8ItxB0%v=J>v<_lE6#-xbT;j&rP; zx__n4$~75pE85+1*Zs2SwR1{d_3PyW$4@)@CV0<36;UF%(=V9uX~l~PAN{R<1>~I* z`psfDTiWY|VpYWUB`tD}-d4Xiq^9!Pofdr8Raf;WqD{NTEPRKqj;*Kv%s+EF1)exx z3+IfU&uIPdG~=u79>$@|4;~P-+J7<hNmhyY&ihN6nz!s&^owP0(384mu3s;EkKI{x zr|wtA;^ikU&j=3;onr1VU#V%6eneG`r|nMHb=Ug?&T;Q@y*$A@&tR|7^ccqlAMS7A zs{i=jw(|(nVMomjtz8M`Vw%?@81+sWcpl#&IQe75?Z_WC?aP9Vf4*?4x!3kxZq~xz z3;Fgg`O{sHG%sdr>w3FiLbZ|GSN88~TJDrzD>~z}<C6Vu@$ygJh`-$JZagP;*0VS7 zFMcmw^Y;Lwzx}Br!J0aAr=6MgCD%n&{Jr?xMRz^Y?DI~>&MBT$x9^*XrtI<zCwEhg zf2$`6f0^xeo#8L9<@MOWCt5|#asM@nzFyw__~m`|o1uZW2R@u<=-+rKAghIOZbeR) zDdP>FUE1ykb-AJzH=b8o(w(H`-ocb{wmn(=@R=})T{F`n-+j5n7FH=E6XvkiMlSoD z<9oMx4CT8Fc1=@1H1|{Y>u#QOak10-DQiNWU5nlOL_}OU|KpWuUe`VCR?kll-*xtT z%;&qwd*q+5I#suB<NjZk6Po_!$et7Z5#1>g+Zq~@%vzl2$$R#2eQDJqzKA!cmb0yU zYGupey<?tq3HS5QOqUNWHgbPh`?fGHrt#!b$xAAk^AfWbxGt|*>iE-3`l<h?oy#jC zk8{S^^@V@?{Hm)i@9p!ifA35?)li&jG=n+gbK0ND?|UoaJGZA+%$@dnlkFzwW#`(q zZM}0&x^#<aq{6D}!9o{rJg#}jQ0}SlM&Z@-3*2JgLTcqFRy$c*u?zgM(%Cot@Ukv8 zo!C|3S}~sQj~f~LOg_ug`nX_eNy4E^iQfJ(##a)|-y5>Oe_H$O0rP?OnrjMs`7gvN zzO^_RZdv(5>Sf~1;|EVa_RKN5ds5EM;KcOqoHCOSTWjX#9sgR>oZ8;l<i@?+;DyEg zTj$H=p8vkH{u8sT<y7WB9D&j8+`Y#yym-F+*Uy`bb#YdEb+;BBe#yPmY{7cYikKAV z$2Q!(y=+o~m!F3DtUf!V&&}s9^B=*Lzg)EDC4V{2UGi1$!q$j;d9$6F(_}uS$oPF) zJ@aJt)U&LWe`ZN`UDsU|$9DG;>(-kqxsJ~MYJdFa;(|lVmz2(T?g+}(zjpan(3)b& z8#`s*#58W%F0?as>RI-u)A+M=-RkD;PmtQg&~_p{S)eH?L;iTY*XQ*c=cL^(I`(1u z#2~}ndnU*|>6`qgck-XL3y(ejI6YEczy8A86YJi4m;F65G1mKomH6E7#@MqFC;ZQM z#J;|K<Eyc;mVNn!hjI)1;%8XZSsJyi^G|-U{>;Js+a!L8OjEPH81j(qYr|^S;FxyJ z{I1`IlNWV+%PlJ82<?+wbzdRGeTBgM*k8}@FTGfzv-AGa!XB>|u~O%C<^E0PHGTeg zE8~j{=B!&AZ|1W|o4vgDGr`fWZ{q&rc1J3#n*TRccyBO^jQO|u=+kUpJ^kV*MR}7> z*ZUX!jJ;V9&UeDlGl+Y-^2+Ovw(>1o!@kx0HpAWvOka$;uSm;y&b3zfB;$E^)#~z# ztgS~s{rkwHP_ohX&!KFWfVhZxj4hW+HJ0^VRBoP7yCJ&AkX`(bdNcRggUPK~d~xaD zW=}nJY<-1wQOs+rn0KXrlav;HWs}#KrY-C`({lakWi?`V`F@-@>|7{xXOA4;^rhbW zS>JWVEZ$h*aK^=9)$%<$UaY4+8wo!=dDr92u{@Kd@l*PRPjsw4`*+1ImFVwTC0Zxn z*e!js!E+JYb(ZVSA+s!39h-CH#r(P9!kXW0qmI52{9623W#_XcCsIY~r#}*939@c{ zqNlJ~+I3FboUOcDZuc2y^J_hvYw_^yqI8WE(fXeyA!jaowi~y8c%AwnrAp*WwZwwG zZCS1iE>q6D5Z}rs__TGq<gO^~cj`x*LhkIfverMSJ!e|AkJ{<ig~11N)h0*F%zR@w zQ%7vJkJxjynR}efiY{hs3*2>e;wAA(YhpgXOnMU`D7|!g)Rer98h0OhWS(!ZxIghy zbm>>USBDpw%@JJseaXd*XH{H(O9ooS9(M~quEs9AQ~Aoqn^y`Co|v)My!WQ;vj@8W zPd-@t>;d=MEf><hY5S{w3yFGB@SJb9l-_pVfV`z`-D|E~NL|(@e6nZ5ibKgu+a63< zx$xJSAm{5IL5J6z35<%$YWN*@ev<U5OT~vXRh%MKq`y1niJbnWZ03K*ZQBk1O)BTy zeOFw1%J5h8gjl#z^dA13kF-*{vp?M5dP3~_#myyqb)#+4Q@fY1$tgT>N~|<&n}y=G znJM?*&Csnf+I-Y*PhQCxG3&KCg%{3<Ny~0_jWddFnS4`e))}$tNjD!g<WyYPacP>_ zx|1H#!le;MK6)h_tv;}L?-eKWn?c8=v`cfg1RY=6w^BLZ;m(5@R!P4^^ma*V@41+C z#!@X+T_xCk(my|*U8kR|<9wtx+0lHy;Q#l2kN@i~>x-5xso3;thq~|a++}^YkIF9V zJNhg(sqUyq`m%fZyERXXm!H~kTCCRFiFehzO%~e!>#Ky~`oo{hnB$u(_VVUJ<?EAA z31qKkKf=7?z^X|->rSZL{;lg~pAz_mW1&!8PQiWmHT&9gYBz@;v3!5A?4*Oi#!I)h zq`$fz{(aIO$CJx{KYYPnaG^pV`s;5^mL>PS`EP4IW<PssM`PKml*#j|?j)T^>{cxA zTVW*TuO?Zfa&iLy%^x2g^4R$_2Q9k&aToKlJDl(CyDlv;FR0^R^~Akx<)rQDt0&Fv z-?#l`@Xi+(oz_<b?n&X3O<%_6f3%@u?u!}gj_cZaeOh#4?fr(Tk3k=#dczslXsZ0I zcNCI{@)7=EH*wFS<RV{*?}dBzw$_C7buPQavnOrV+s(OeL$`g4imqO~wszs#yQ$gl zx7<2^DX{8X)_xED$hYM=pUy{px_?prrN5`;rX5$?-PM18aIMi~U;EAMUfx$rj@Xmm z9;Qgw_I)Z2`^{>X_qDR!KJ(=M^vge$|82bbJl|~Y|4m!{mw)M=Go|jK=PU8xBPNEb zH{*4@dPTi+-ag&-t<r3+uG!qzxmNmHU%uJedp9>*J?HJ;ZQn%A{)XTF5}$v$e!cI1 z;cXlJZ{L#N^0M;YvgbRlD90Vtvu2KnV!e~Y;<l@yeR0QM>yFRzHxDls+@D)BfnQlq zUxDp@^Zx(G{y(~`<X-V$vujdkgx)z}-6Y$v+uCK_EjRSn350jQPP{ApDD$J^$2}H$ z_Za7KzdWn$_x_T@gWvP#>|d0t)#>k1^v4`D)x>9Q7_TJ7!0^hMq^YKo#Nv`l_}aU( z)42<Rug^UGeqv6XVt<>OTH@pmp35rHX~7&b=Vlh`-txPnn>#DVbGz}&b33|fIr-d# zs#FA;YTr4BhhLhS;yq0@`q(C&4ZLhQ^UM-HvjsC*JoK$#b#Ab*k!EU{{@r@lqzM%* z7v7%JX})l=vgY~kegEIrJpXY2;<M*j2Crq~7ieG0jN9@`{UxvbtN2CN&b^p@#3VRG z;oJN5{q=39EE`(l`|5A^{5ZMzm_q)<dpU-Y>c&;w=Ymo$thSiuyznEd@Jy%djqmOz zJqthD*5v8>>-)dUry?Yu)XX-F{@1K&W~6rHnKJv&pX%O$8znvSd!&r-MWrN8_z^X6 z--$`xIg{6Z=v`v7+Rkplqd9uI&nHa$pnfUeSlC{W|Mi3fMr*BeuN@El-o;<yp>gfy z{oulXTq=FrXLNa32Xx9LtZcCOX*@&9>C$^%R?hizuSP}h)Q=E#W4|{qBdMe{Uy|pj z)MuCGtvdpew?vt|m%eA3-StK4w2PZ@tBX<4=k(@Gp=2ZVbi?48OsiW1)BFr1)$Y$) zU0HbLe2>^?Zx18?Em2&GE2Gw3Yj4@UX4-YZ(|0~)ixlm#+uC5L<;R*N@Kz_q{1unl z%X`Ta{_0L%cp)mmF=^k)gbh!WD{YdsE{TfQx_s(c(rNYiNW3(c<dOej`Hp>mp5$|E zleFuNs=N1xbwkIJxBX#%Z@W&ODYH%Vrf=9@)>{Utf<iMj!(>++^q2i;eB^(SJ@3tW z)|Ck*RYz+782V&h{`B_rbmhL8O-Ib{*Ur~$*urkL<<F_7b59sMrT^1?u;8+|LB5~F z!l&Wo-xS%8m`&82aYW?MtE~bTt&aSCq8?SpywT}$RGsjeDO@GLuAe*?RcHK1L`S$( zOhtTY<mFHEb>2H~3iLdv@9R1(^TgaAU#E4>3@{Px{1AJ>$6=n!_t!^x4hn62Q2kFM z<ZE=TqVZSX)lbiI?l+3~+WPEE$ongw`eGebB6+y<qw@R(ej4%qbu^#p=+t=7f>&X> zL#v>RgXs64j2&y@v@Q68+T|X7OMY_Y<=3_+g&*n`KI&WN`gEnqpXq!q%`-w`&Kr6h z|0uIfuicho?c@(HU6fS*_6xNBaGQ8C#o+0Nc;%G>CI1xsHh$;X^s?tz(uJd|!le|h zYJ@C1lg4%5;015Kzp>E?R|y}1#ZT?u&goa#duW^FO`TnyJ#tegU!GoQr?_F0%r~y0 z``3Qo4LxywtKE^qkqo5?rjy)Wd|~^`vRZCq@IxIj;~qiI{pJmm_lOrpNhj5IxG&nI z`bhV|r1#fuR@v4?c~qoo{j*NF-o^K1!Md~V|NaP;R~@bIi+R8>iPP70+QpB%6keT4 zJC<^>>%{BTO_O(j@OwSWi8=XNgIKx!VUMc*i^giQS7fRm{b;&hCtvEJJ;&Zdwx+{9 zPAqBjiv(#o*4hqJ<@CmdJ7#pshYMwz7K!-I%h@_Xd4*7b#8rhl8)Md4#(}yKtGO0& z6ln+iy|rMwL9lL0WJtDk`>VtikM-i}XROd^W&7~=Hy3x&zO<ws9+rR^-M5U3rs;Se z5#x+nZg}`2Ti3z_hs#NgodMGyrJi(N_58<`4Pj2b`|Mr`lyW@TEY&^JaLF|%NB2IL z*mNJ2Hp{4&GPBC}3jfR4Is5a(+%6_={S_5*rox`lzb`oH)*ohX7E97hEHH`O7ot7S z`E*`c*`in1mrE%w_F4GssG+jy`kpI2aw{djPI_j0fj4o>(|d)r785UKPhrV&`y2C_ zX~myME2hUu%zPuwTg!4y+(dt$Q2&-WF2CCR>~$qOBtJyHoXx+GYrlSzcFT!to-)x_ z*&lIOU9L{kt>@$Ok34leP+9c+wfk4~nQrgyX?w6>ql8IHxvR<CxWhhXQOi`<vm8}? z&mtRBmp{wH(9AiPDalOd{c5K@ora5#)?b?$Jk5v4;7HAZBfOfdFZ0?iKKviM%j5ow zE&IarmVUUp<M@(yGnPH&cmLY??+D+6`Bz!ii7?JpJFCH4U?X+&<P>`+jiO&?7l>X6 z+aWop%9-(vqo2@D)@O^k|GTeSUUlpams+9n=E)cDh)?>gIMv{JtBZz$sbxmmieIz% zOOA#;doHy@eoBSg(x}A`-!&z#ZB7@+*j`;3ul|8)W61u3)7+`2r-WWvQ7L{ZFzsH+ zDY+*r{NzRL8P}iLk(zR5uG^g|jkm`hDLv(E-to|6$ybFpJvsmXm`vIi9=FR|DcE-X zy@|I%;*KBr{Oi^Cr>3GWR+qC?y>mSLv(=6Bq4+ExargVG6H*G2<90o*I5jh{-0HH; zr}j+qAmcQ)s0l_>(vnQ3v~v~&t5<nQ$}O!lj0?OmeS$-uS&}=?ql=zmmdB;nEMrnz z-(mB<>%k|3m!(Iw{%O2wb^2=hi|d}uixL4{-G<DxV}Cw9S>!as_-AUxjQu%gqI-N+ z-97y=y=ag2&qM#rpFVw4aXLXy>BE7?zpuBQT(W4!$Ip9z{G6N|=_qmfzn_51;@)ll z{aW&^e?FUkU+b#PewR(scYg-QB+s4mLL&2P&sVNRJ9Bh?TL(%7=<ybK>Ls6z=b5DH zv%Pn==J)+-H+v@DsgtfK&5rHe75T+wv0t|B-U&KO{CS&iZvM<`n0@AsgZ`XL8DIKx zXBi!Tu~hI`4c|rCwdI$N^UD1a`FTM%=INb@*V3vMs?3hQw^2`K_YeIxtGD~yi+AKt z>)5vRT57^JUblY9aF4pjS`texI<+6(!M4sl`}mE9^3&NF<vTWS%F_H|{kLkPR~y@r z&35;9O^fqbY#cPVaPbq<GReiKl9EltWtrvwyRAMoW!{Dr;+b25cxPYB6>HVKu<T-1 z`}rNF;imgfxxVR4=y#i**tVtD?V^oX)VjCVyo$~D7R1Q@iTJisqlQg+!?oK}R$B>{ zJxhGt*Ya0kqx@g(ijCIycTIMi@67al-?Ci{uf^VYuL*wp{o2!2*@vCv<ivT|g|zQ% zXbRi?`194`gu177fgP7@&kHV>Id=HLl|wOKzsaoo#c}uX8Uxu%b}I$eS8*N(r~kZ` zoLpUGahz}0afzi@mlv~bep=cld}~b<$BU4E*^%=UEv4iv{SFATKdYab|F*Tnd|$Gy z?YB4VN|R?leU#HTv820=dya7B4YS(oYkDo`eBYC?o58;5kt}<$#dEoA)g$gfhi?Cu zdwf#j`VZc~O%vlXPVV}`H#by`RYaI?dm(R5wW0a!(}zp^&rOgC`!g+NdiqiC1r5J6 z<!<T=-#^r+_4w<bs`(FBebw4)!n{DvPeHF}qxANLu6FgTbNQbicRg{|?x)7~KhI8l z(JY$We*SIvao682jEM$iUh5{LRD3<uT$S^{{EGak7^l2%i`L9p*uSaQV~f&n>oApz zxj|b6EkE-X6f0Tp6)|eM^Rw;rtv8}OZx-K__>}VIVY}@w?m2UAIZrjdQtr~{#kfgS zLF3}=tB(VAO8z`^^^1(B(IT#@^1S`V4@J)<oJe<Jv|268v|>v$Lj$XzW1old(tsjU zotLNH?(clJ|44^c{OkILclQ|%ED+c`dxzSEzhZxv{nyM~yhUwi!@KL6x@L>4G?QEm zmAj7dFTX4<(0HgYBP?XoqMHR}A;0IoWANBvq;-i|Y+~@m{f#%mx+h6_pR4d)VBYV{ zyXjTa5-aV6dG2R=W}OL0e6@OQ2H)Nb7kJ!vU%%kPzoYK8yrk)=46&5d1k?7cUoO_O zvR%(6S6aN@`{6%h=FG*1I-bowSv6zsFYXhISa&k}AKCx1asHiuyj)uwo-^4Nn9YoJ zU88eqeYqsdi_OQ&+xG8d&h~5*Kip(vcJ)z^uH99kqP9~jyxgWfc)5UA=F^wXx-BZN zma^B(eis(9ZPC(?N>{l#C;NLGmz7h_GM?<0Fyow+@==F*j<c6at<cD@vn|Nn<D>HL z8E0jU9Q(R6>Qyb5zkXnmDYU(HeBskC4Pnc*9af3_74YYem~A|TW8p8Cpj;o}q}DZ2 zYAeNN2eR8fh>=rY&2hikaQUj&!nqlGwj1oE7PHHCR;^u8tTRh;Yqax&CkKwLm~F== z#sAH5wp@va+k&TJ>=$mj@$d5B*IUf)zVt2MbiuV|i~W9a*;+h_k&WPrFY3rCn4<k& zn$!F7%G0$h&o@r6nzZfUb&K^zLf11s%$&23%WK0X@niCQ#m76+vtJzCoEV=Op5?Dv zD3>h0ai`h$hqr9RinctNXBjp9#6<lEZ8As2FY>QHoBViXlJbgHxf|N8GXE@u{F)v3 z4{0i~aeJ9v6ywbGIQ^_jQg`YFrOsEy9$y+RvlYDA@u#<jQKmjc{Q7Jk%@%d}30g9K z#<w!syiHqQDc`@F{@DGS)&|=m%}%8)7OLU>F<y1fdg3QOCtP;_f9$N<>^vs>4zH;j zGL7OdOfFUXesS&NfN-W>=}E7Oq6}uIUe)ycs`~fBPn)<fS*GItR*S3eLIj#)jTS8F zy0`2X=Z-AL?t}9M&VFa#HF=i(Hf!h4$G0Cf?eCxCEx%CSde(8(j2{z~o7;}}ExXvj zvC@9l>4m#Y<WfSO-Ai?;KV4fh@5;Q+wx}!>ot8_H1*)&Ei!n8c=*KARe{wozChL+7 zp)Z658s;3&<w~%RnsEGRX=3`Kw+4Z$TE4UOlsvbKTi0>f*Z!WP)6V{7{Z}=9p1-G% zy58&b|K&wx-BWD)pTtkt?D<t%=+UO^OP}ZKdPgqLJ8fTT9NWO%IN6i2?afJngbY`& z2F2&bEE1O{3q3e~j)$@Bi^}iU?_c<HF23iiw&wYj+m~Ad*H2ndZofRP%}zS<ecLP{ zd)YRxAf~H<-=Di|T^JEnx;yLpx*}_%RWa{`Z@*i6_ngn$x;s;^tmArnN@CG`i#f-& zo#!un8`x>*7vi+~=~sa(lNHxB$JlYcb@-g--YocbVpg!GdtiFy0lE73PYXM}Cy2bg zqkh=Z`L4C1N72D|XKN=dpC1vk?cMR;@+uE%A7A*lWz)YSNgNTSr#1dQ5#Q-Qrz&9a z{B)_and)vgjY=Ahu&41)tS!3rzWd_@m1FKp-u%s!ke{}ByT{E~mgL!U_DWr{_`)&$ z?zG0j#Z%7SZ!=uwcU<Bm;}JE-I;}~JpNyvmDcEndVSciF)?<a^?q&Dv4ygy!z4Bo@ z<!`F~YyP&o7wfq{-c500UVd*{V}-iHzY_N4aaHC=Uf*fwe02WHl(p5n9y_vFP3ru) zLDgR3^YZ6vk^7iGCrW>2NzKp>S+D-~lUql|4bi+%wfmoCeOun|D%tn<!SqAra`XLu zY{-^u;eWlfJ=8v9&Gv&9Ykrv>`kxy6Zo@lv(_gO3E~c+~uORcSa@ntaE&R621m;~; zOV#yJ{<C6EsD7&Jlx`z!j?S7g-RVz#)no3eujIeu_Ty{Gf%B~UR1zk7|Gqi9AXE6m z6RD@6A8J-Jy)7>Kbg4Z|=*{zIsSUi!HAN|x-zqyv9a^<E<y82bEN81jt5oy0D5yUC z;JfqiY<ZQ-wvR7t+~Sk{Kyb^o+K8Rpra~3}8MgKHJICM4d)<Eb%=x(|gI$vSRlF=1 zOSbOupT}#+Z-3<Kw@xK1#=Vv;4Ez@p{oj3%W_k25o`FsG#gtFmTmx6y$^LaXFxAQ4 z-{a8y;`pL@cO}%*_nq(BC)K@=t?a_gnqQSGo~K{jS%0(bRm=|6uzqRVA5S)Q9k?}3 z%jS5nWa*6$$1MA1oqgx9_H6Xd!^a=<c8C3V;NN=x{r7d7KUVnX9G&Dh@%Y`%;gkN& zm|gPiSXjx_?OR%JH4E|F?O1COaBo9K;PW->(`sAA&;D6*>Y>u#6*9}VPMB!gIZ?KA zV)jPSPp1mDu1^j867kmT$NRM>HqVfkoXS$N?dadK8**FbA33;5OJ>b1*0-}$|K%4N zygBBmx9rcJmgcKQe4p&sib^+`ubj6%|H|6$9sf?xxb=FyT5!SQ1Bt6nyUi8(votWK zcJEoYuMZSTm&9|Q5wtJbnN}GZKmVxUHh%pF`oCCtcpgU{>d9L!AADSPZN}Aqe@oY1 znRP8-MW2;xE??m96{Z})&u`y;eQUPUhvl{|v5f}<vSt5dWMyTwOFn;mc9T`s{oiHL ztn*IZo_D7zElo1>%84t>7P~w1PW0e-6SqGib++nunXkK7ZC9?FxcVQ@t)eaKQsQO5 zYHn3tv}Q#>*p-RCCpIl>yS&`FuzufyZ>^`Io|STJ{q&VX|G|O?%_~;xTq-!(=W4CL z5l|j_bn2BWQ+4=~|KB&<dh)QEQqBuo$I`Ql{B|inZNJ2nzvXt};_Ymwle!C-x8Jb1 z^I}QfuIa2^uZ4_P9FEHh-?2sZ`uEUHIROjIl0~L$f7p?7T=n^$ubciySO3t8d!VNs z8TK$}?X;D-PR+H#Tj$1KRFh#8|1;H__0FU6M;*%}Bc8qWy}8voG4{}^4sUIXCtDXj zwa}PSmUKmTs$R*@{i27$3j)49oOG-xtNX?MhS%%OZl%82s(*B=cf=FkfY*hK-)^{2 z!@RxmbMbE}3%x_v9^cfvSTCox{buZ(|7?9X?pPFkWQq%m6e|q1`eV*|!zw~-;@|Mj z&w}PMLh4(+zf87xY`x{i%B?f3POn{FR`%es?Aj};(|7}CN0jAEKdax&nBcej)bpjg zShJcL`a<LLx2!!jk?-pD8L!0B*L?j^{V^+_A$(K%tjdCOY&U)D0`yzX$M#M=bL{JN zu^TzB?4D~aJh*Z8t;6QQv4_fU)bnl+<*aBt;1(fxXLZ4k{EmmOEgp#!Uij!-Uwh;2 zg0cspIhoQA&2+5)njigODzlQK-aoslIa*3YWaZzk?xorXT%T;bIpMBnE>p7fY^Sr6 zJc?dvG|#_3NmwxLp~t6{{);a-1eLekitJS`Rr)vOme1RLZT`2T?7tM;Il#7ja!M}0 z%mvqvTLR}l<k%`(+o=5L>!$)w^}NpqCGQ<xY`Srh-i>|N(t@{gG#oozw(^RfP-wNb zzwY)=CQFa{#<D!Raf#uFiGRdSesjhC)A99&I?I<XeIj&x(dHo5mwqg<uO_}VUbkZQ zirMF`KFo`$-y0^NbjYbAKV0L=n<;<HIT8gGbTqnlOzfZVW8adpX%9WN8q3|kr(Jte zb1ApQG%M4$I_K**9LTG$nR(Xj(A&0x>DmwT8Vh!ZtS$6ASIMxXBm9uA(5oX?%HCz| zcw(%YR^qbo(Yu3g4~%}x@l4wFYqjv&{#}30-n()CW08zzvHGtxnKJLczg)7`Z!*02 z%T4$Ec9kh@DxU-brO!kkTlGz2(^n^%tzI(mPBONys$94ACmOq&nTpR&40h_^Se5<b z<JC(&z2Es#E~ReIk_^l}=67R4l=7N84bI;uzWtX~cV|i|Yo}j{T9}aUtIoa$Z}QSl z$}K!tYIEp%$dC1&5A%Z#P5W8UUA^<d1ItTFKkgbzG&4@;J=Lv#^N+!cMf=oPvl!={ zeB|+z>x59@tv2OvZcRrNv(jztV(;(b>T*32&3brxV#I;Czyp`J?Us>`*>rop#Tte} zW}%lsLY1sSKXd<Ym~<jD#%SW-bw`(-Jn8ancSn6u<g9I9?{)t9oMpcAiP^@>cIusX zR0CdnNB`$s>C*oG#jh73`^!$`ee1j7E_?D#T7E<I^~$J>;+hiHRrh{wklk+4ke$Ab zIsN;|%h4@tKjkvN>;0U!@v6c}#wUVl?fZ{xuC(dzzj5f_4c_n{n>KvX;tQ-k>9fL$ z{bt#!*PAYju6*#}IIqm?r=^Peg4zs8mb3L6oA_ingO-2HvDWN5%lU9c-lCY7mnyb) zZG9Bm`^2JtoBaG~QQ6PW{8W#esCeYl`lyQj<_#*RE1WL$vn1`%Iu|tK7TdFHs%y3i zCr7WGTU?m3(Rt<k@Q$S&>(!c9uB_H>Uh`i~@8;v8sD(HFWT(#24bl7It#|yUlTn|7 z`~R(6(ZT#`H($y3`r1xRSzT{hw=sIwwSxR@|4J_1%`cy`R<&jA=a#ix39G-!C%*1` zw`taIWpiB<2c;9TJ+)gjTJL-lDM~k<`1x_2VCAnj^#YbzvIg7v^HwY?@Sn8v)~Or3 z{E6?1q>7(xp2}LeOV7%7qC!JB=L6S&_08fRmBkI;csFeK-uUCdo2_?~&hNRK_y1+& z(si-TyPk!;lCtovoqSg7jqiHTP18$F%=RjtjJx*yN91~wzeo1o{GGknTHE2q>^ea+ z_lSr{tqGgLE(Y$`w&9Qa8sq=#u6o7gpIO3tI6J)Zs${bIn{L^1>{(mA>&kl03BkXU z3wEkb2)_Nnx%Zsp+WW=r4u@=yUlqKke`WsiYtuQk_3ydy{G3v@;mW?3v-K=i`(L}d zc8%70(S3a}{8Pf`>#SU}%IK!-DuzA|)uNc{3WXgi6^jDZJ3jb&J}f`d8ZRQgug>t^ zRiBpo`=sY@+wK;&h_9k;>aNM=;TL%49C#Gkc~my#ZCciICYi`*2X;q1WfhK>nm1Q* z^Uq1A6Yr*M=Wj39vg-fO4w`9r`u!D~q67oOQEhxP4aU$-E$HV2I49;g=jWAV=9Q*; zra2}TmSz^E7W?EUXQS<UvHqHW-HwfoO_(jujqPrXv+&<Ddmc?%bm`8OJ(G@1I`hY- z_W2Q;=YRH0I<x0e$a$0FPYzu=v*=3F{69}}%Gli8*c#Uy+2rzf&XGMOwf~o_x$;D) zj4jQLEiryUO;%TaU0j-H-Nd-Uq9i{hWoCcA027t_f;lY8%^hva_;=-HyRof%@aNK^ zCn4L<$Sjb$CUE@01P=vS9;2q-iH)6&t&A)ZkrI+OByKe7q_OcSoIG;i)B(;VtP*O4 zf8u3BP8?W}ulRTSb0ubGaSu!IDGa-2U3hwufq~%}19gK8b@nFKe}DdE2a#`;Ny#sd zIk-;{5DQ{wtF!28VOb=!>M}3q+&S7ZTi>rZ&!)(B&hEe0oJW(KCX1MJxdwVE9SPVK zGFKp}!+}X<iP1;?DXp?yvPTYm+4ue4_r33{ug~xAOTXi5Dl1j+tHoK2bFaIf*IDKE z#XD6!gU-qQzWPJwq<%yEB`qF~&u4f%3=_9KozZdQ!m%kQ=Dlw8lbmFvYNp1wYfr$X z=`uNrWm8{uE3CY;NnlNurF7#58MPbx82<d+)6gJ#Y(e6aJzToJE($sme-~#kUNL<Y zVYRD;m*v$2fnVqK@){(Br6XCSHf{go@$C}JkL?d*Ick_E&EE8V2dC57Z3T_t^J7FF zo(eX&_PLnH@aU1NG1*!_^|>~e9CbSrrsk-&`2W7(w9h#!th_((xnlL#yx^@=>W&*m z0@GJUPLRC+@b;?H@vEJB{;ct3Ru5<uZ(Tmeqj&k<6>hKnVtbdz=~{QrI(BjHR_W*4 z*KN6Ff6TM{`}Lnu>p#c6;f<5y$<F+hCed*=?^~@Y*SyX;^WR|$))o9*@ZIyx+wQaa zi~gJDS6(YCzjl}Zalbu(+5JL8)1JR!`vv*?+W5;3zq^+I@@?Jwhh>MB9-hiuzxbr} zAAV3an>fRb`4l4q!x!ku9oRRI%i+jou6ZdcXgO+cXm+@CsK{M&MIK2u56+|8ZiI1P z`;eh58Xc`M&3)Cy7KMcxSyxX#VPc*<(_rSpmHSWf+g)Rtwnp{WRr#g!tc}~;oi@}> z*g9io^}CzDZQkuuumAJ&^m+!h4W|p1+SpArTeIqQMQY;CJEl3>b2oZ9b4eUNo3{J( z?7jy}mDaX2X*h?6K3DVCw<<e%IhNJ1ZJ+MG)0f-k>Tw-^u<WC3yz$9M#bXC{x_pa0 ze9PlG@9~Xu7b?}xKD1SrwXiMa-nH$nn)%Uf+1BN?9EYDS3t*LU-qV*J@Tv7@`pz=~ zhqvCTJnCz-#b5G>-B|%&-t`$fTH-`=J&d;Oob5JsVX~KbEx)Lsis=^x!R70<d2FXH zxU@!F#_y+Lj6d)5rY9x0O<La_|Cv5JN%fq9#`cXN??P^?MH^;R$X>U;*e88u_5|%@ zuE@(w`rN0st?w-LI6Ry2jhOTEUCGlANAP?<*IoB+XMpG}POeo8X6zF9e9F<}&avBb z112UVh-Q72Wb=B|n!F>)GsI^d_o~@e@3YT7IT9XmTWH_)w+zoJre#lYwershzOq$g zws+6g>0Ix;x`cU()z*ipGdu2Ctkhc=bVzM|-npBq53^OJS-oW@UESKf&Uxm1U!@H} zLV-b1?Dy2e=SI(z?Vr8mVMy|>!|^{BJucDPd$#N1q0Ms_o{GOz%00ciFTy;F=kD_U zxML^Ga!)<jsGB|2W$lBVtzRQ=Z}z(C<0~$DQ;c<UNxols{<U?TuO_AIUUoWYqq-&S z`n0!eo_6s%zItyjtH0%Pq}|bWEu$YD4}%VGYw9<>bDUXpzC!sj{Y3WW;D`XjcBYe! z>&#A1`q%$AL*S-<)5)ME_e|p&+v2XAS4+Fpvaq^%_06-Ur&7;P-D9$^?8MK1t$xA1 zf9I(slsBv@sGXh9A+@sPQs<q_$4g{%<Bxt+oi{n9qnq#5p$eg|y!%2qkG?kk8k5dy z6{>SeRC9h~+LI@tD?&O$5@KCBRbEN2^%Rvby4WUt?*coobA|W0fS~&5g6^uKHdV1b zpJo+IQ=NZhudj{v96gP-&dK6`kG!~D8OM3u<cYb?yDGlg?8wtXef7~#e*|}Ld;a3l zO2xlPt}}&?X{JdpGWlnfvA`f^s`8w=Z&fG!F3-~uTYKqC+LylGH;do9|LQofEPZ$W z9QW3FQ4bnU+u8K}v#OY|=V|<NMWxlhE8eEZOci;f;+n*E-Qa@2TL$y`9TrlJ_cOTU z{*)(V)pFFi+%vlQZQ?~{9&`8a>~e_<KV`El-Xecc;$4f4@Rh*M0RD+_Z+qW7j$7?> zWkUDESSL1~@<T?8_P(#Z&m^_hIn&F;L4I3T6;Ex;Nr7J%);Cuf|FTv(`<U(N@mEie z8?+v;JMyyXQ*t8P#EjK<l)tjr{dm9A{-6&>t=~0`y_1>y`3<*Q6*Rn&`}8})#>(oG zqV*Rag-_xyXHDRmHvhtZ%de`hzp8%Joc3qUyu_#fxxPx;Ew`0?<#=Ply7?cz%3b@m z;ivSrsIAMimlW5`4~@TfyZ6&Q=bu-f$huyguGK5pb@8rT`|HQn4?VZ<2cL%FX``51 z!@|Iz$BnNNl*L`3p_ON?lkWOo4v;uDU)=1}HX}9pCXG*~rOrzmG+zDTI5<=1W=l%N z!t(Za3a#s=UhaD#pR&iWP2zB?cwE&(`P3TzSl=mn-xfXpvS<JEm%j_^{{8wUdq8TQ zklHQn>}ii#7rxrERJ`lLN88n}w(<xpEKulceaiK|ck9+_g|`<R>=U;<yxqR(>IYl( zFIR&SxWfg~&V{X3om%{6!-9tzPgf^R{=SZ<_WS{cL>oaP1CJAb6giu>eOTo#`*72u zkpJeLUO!C}H@V+)Wp-v+yz%Rs)V)zEK3A(7MTHM*q)a%@Dr`9;@?Nh{QT3_(eC_>L zH##56S}C{mj_t}Rum7){oO`@5aJFxO;%}uJ_rF9>x)85*-6!VI6uwxsC9&_49A@Yr zown`$u9$h}&S!47UU;K)>D4LjZ!CION0~Vr+;{8D(NM3+PtyA|Tm8xI##P#-b9WVQ z{q*zROpQmgrp2iD{L!scy!C0$8cD5nJ*lcww&qNHULSX?)JOelAoo(C8qbJ&?(JLa zIt}hzJ?<!cIxwfz;7V_<_Ri;flzXNMP2SmTs=MQ~EZ^T3SB_MbRLq~y6_t0*#($M> zI7{O>gWF%MPfa^7J3aa3+}>yBwBu%5rLS4QulYi~y=Nb<g3XilhIZ<4?E4c^K8hsI zKR2UCuF%M^@{(%BrP!n|I(!m7a~^r+95nW2NlR|uDaXgXk=fr!v2$hcoetfKjFU&s z&Umm<<=>I6#;0-zvUon|2sKt4Zn(!>A;72^@?-AP2?q<x6q?=t+-*0J`y6#3=id_p z4TkyldNqGPGFB{dg(OkiEjc>=ObiT%S;$SIXf3j!SRavak$J|Mzf+=wXMc#8wQmcj zX67Y#HZe}MSpgl{@luoDT2xP*c(b~F=FTqP*=O#bJNM6^yJ-ivcF&d#9IPMLi@0tH z6Iof7dD-mSO8(jv{7d-VgfGvywY$mpR{PBAcb4~eKDT~e^V|RYo<O6uH6cQx8^7gt z?KZS*y8kdMe(w8g+l%kS{9N0;U2Vto@B_Jh?=Bzo-1FV;N$MJDDPM)0jy4~I{Ae?a zwH9&7J0F;yh%l3?yj_^RCS>y4pA+t0U#e&*mzr_pkL0s6POF@i3$-LCTv@&KV0UJV zgy9L-iE7<le>y8194GXh`mvyir|Dq!WYgXZ(`$tv9`h8>aILVGV9{oK*S<#WNnggM z#&1fYf~qWW#&)~JOP#zH-<Tl0rpSP&)hsN;@&C0Im(pFT`aga1;JoAfC{ZxRb<I8- zE4Gtju2)L$@%fuu-dkDtVYkcP)vZSaEp~5Y+~>Hc?N~;`_R?RII-;vrtZ2wC>14C$ zVO~-uv`9hF+3#BU=98TfPH*S-ob#Fd`RN;Dk6@ir#g)=WXTH~wK4<gf%Grk|o7?)F z?q6H$>^!$fzv4~L=3`B|<*S=kt!ChME;R33e6K8POZht$k>g*l#c{5jZOtWqBRs9Q zX77y@f4xH=|1YaoP!muQRVv-A>mJCzBqZ>a7{8Ia*NPrjH>IwoC1;N}<tyl_3td@} z*SS5v=Jajz>9gm&);@nA+rFUVpn|Y!$m9!pGuIj_C;7y6sP16i*TcIcG4SErt?w&- zztdV=nlE@wW!fU;y>^PnBW(iDUkO{E9kjQxWbwb9e)D$!TfYC7S<u`#=|m-kTf1jh zd6f&qu5&B>5bd#u>zePsSts>fbtcDmSX?uluF@MUc-(*0%LwQD+hn)$*-z8?m}$TE zS(1vg@u7|L>`XhJRR6l_u*0Fh)`eY3osVC!*Y(YmaCd*Vrl{%-0q)&SN6)XAe>_9e zXj6Pd<<ev4Y6IQXTTZQ;es9mGsNT6V*DQYOvEz8^w;xlc+c+<8<(ey~_44tn7-g02 zNX7TduM`_rg{?5~d9`Q5#?vWo-<Wh?i?^QoeCCtt`JY}l1P+|%H$Sv>qHu-BjUPAo zubejArC^iV8<W{!&11213#-k1eX~Q&6A$_($TM>l)C+%~@X&32AA8D7z1P=UxHK;% zsd%JcjsCUi0RP3?hc4$@r!nu6+WGqTtM7)5_S=_l;tRjNN&ReRVzGwKy`pKS(#@7# z{`u$V%O%EkQNMB(rpgqmxq0soTN`-X==8%~n@jFX{=Yc$$IRHXK?ir4<lK$j{k`Dv zC*RAJwYSQ5p2|5l|F+%FmGKPi(WiaI{yocI(?0+2Jky=?H+}wlN55abxZbWxq-gcS z5Q%f`i4httcfK-xUvfcS?Agt=^;uof&*k<Q{F8_)I=-p@OryG5`EB2g@ypK3{y077 z;~n`k_24ezrfDLk>MRTlpYRqvinwaWisaOS67&}T)R4cRBcp8dWnW+GUC+6~Kp^qa zu?9=WkT#7^3uk;3Y*#rl|J1jZr0aUI?GNIY8cx*c{Fwe<<8f{7WdjLiy~y8H)$evb zzw<rs|DV4<xexH%GvEm+GLAgE;%3<1L%h*jO)sBVCo{d`s^6&up4j$R6K7owO}5{? zv;2hjHlEJJ4Pim0rqR!)l`Xlry7cTOAMKr~GoS8i*kbs_qI1?vT_KOFThG6mcP{k= z&)lPz81=80=J{Hh@a*+{nWDk7>A2_WuV<f@w@y_F)!z~@H=W~bc3Yahfyc@(emrwu z1PQp9J72K7kj3-x=cIQEA}kkVovp2uw!BL2sNG~Td;inWSlz-;6THOreyRU63||*& zp0oDQ=GV&%9^V#8^7!(xv!~9nurJXwJbUY&)tU<v7@B!<v$n39Z;&>`afz*M$1} z0zuyL+jTE(T~z$gYJT2DwxFB!U!x_<C71o*zd*Sr<RC|e_!6(&`HFQjTO3#Z+{xp- z)-yBtb=&pkogv!Z*MCgyn{3(Uk{xivEOx56`St5^MH>@s5<2QOoaw4(P!DD;f4uiZ zY11v~3r1-YR;%7Mr_b}N%UXL<uscz#e{n^NIxq8!tSN@-%5Q(DcFq+yG3<$(c5}%A zXP@rN|C<^^GYzJlF%nOib<q6PRNK7V?n2Sq*+SR*ywYdS+ncat#aroBvD-6bqm6m; zEZJvY&d_w-oHzByDz$=K*M-cMtAv--b0iwv5qs=5f4+fhhLPqb7yrmz#=Exn&R6<3 zRg6*Rvgs3++Z&y(&)`15t8UvQXJ0wx!Xt58=Y;Pfd+!$n2W(*LV#o{3HBV%lBpiCq zV1qROoTL}t-IKb)Cq3kA<5ZQ1o2+~?RpRDZpE-}>irW&!pBi>tm3UXZMstZ~^3{{l z%Wha0&D$5bi`%==r}&!P_qFGx4zQ@r<@2+gD<U&F&V6acx~Y~Y&E3@xdEZ^6*UiLv ze9jkUf94;(HEJ)`K3l)#HJA5~LqZj8tQ*$3Ce^>&cwW$Lfz#ue?;~=K3V*6}s?e<P zc&oj<)MQzQl33RTw~jv?*I3@jgF4ldCAR1DF*7jS!h6P)0^VGP)(l-5mK`jdE>d?d z=0-{+huaaZjJ+;WlM-0ox?T(mShG?wLTGD3^ez?dHEO#HH*dUn@BRM;#&xf!PkZTO zAF+JVV&lCvnd!fl+ArR}P<HvZJ-c5gd30D9z1g?D7<AB7wOReY^6%*k>>ov)^D}=W z1YOly7O1N^OLO+Bb*k!Fl}mHD5?;^o*Pfa+@!Vb>*{OSCrc6%f*&A^7^0fI2e=n+W z^;=bCv|3_SOvw6^pIu!W4hWojHhqfI))f-JbxhgvS8h5X;1{js8X4`A=IeY_%w6(G zm*#W*r#zPH4c_bsQ2+EHVbO|$5S6#nPd|MW+UB$6Vp#UwgI|7$OnA8OtG_bSE{T?t zD}~c93k$Zr)zxuzQ*GI3+2Q+Q+J(*u9-HObzOg#%TfQ;malKqxvyDytp=8eEvMNs3 z&|(P-ncStHC7S=<ILG@gA;Wr6)~cUIha1(?zsz9~eCt@TA-buB&rZ2+Phj09VP>V8 zioS#CdMicS{$1nbn3}5>v@GewvOIzF7aiM|?TORTs`UQ%&@i)P?L~#_oo-3jw<{!a z{JwRuP33Uf@oB=*ZhD$5J9nSVb2-$pwyZ&MgG%_czSpcryR2MOQ+6A#nzeG;l$2@f zm#vQK6AN+E|MVzRF;VpVLWQ_PiER(=tom5s9HYtUUJ#-Zcq(>w(M~OK&JWYvCtH}- z2R>Z1S%f3-=7iXJdkZHPmCe}^vsx{|>5yShr$uMDWSJX#v^cYVgNXSzsg0ASZ{_Us zaGDkUAz{*wm9F2eZ)aeSpIa<FtKs^|u9dg7{f@q>@lWoW?K16f<hiq!tAC~JDw;I; zl%ccf%WowXr;Xb-Ex6X<xSNl8$AJrx^GnZVWo?kmJAY?Gi{<RY<v)sC4(&PXG_PS@ z){-qvL9<uQ3g&)X6{;PQlOEE;q_K1FS5d=t*Qay^3o>aWWyY<4`ejO*RyS8{_q-~T zb9P79JX+MD8k2P6N`cM-6~)sFvo2h}(&;>_HdDVlf}t`|$~NS}!(-YP96FK}7z`OY zCC<Noy86yFy>myZT{P}@h)iLfX{SE%;Z|woB}vmO4OZ)AZHhF_kn>tSYtqVT&qS4v z@7LK=R-*K3j!(RFl=W=cFipQxsp-0DUsp{G_ghu-@O*D-v9U?icAniFef{&ySYF6J zJKMdlKk?qKj5|#V`8P^FP2BqF5)a3{Bhw;kSfleB{@42Sx3@IyQE!f1ba%_)44#6E zqF-)Ka=e!^+uJ7F+rV$)<Ge|3`n?My{)l}$BD8&jd71P@dEN5)7j~aDy3pwVa_?oa zqY6pW7ETc5+?-}3*3VoVeqG{`hlRo<lOoCbH+<jjXJkceV$C_c#O6-O&j)N%GXL4c z6-;ptJ1oESL;TN$t#t>kE`Rp;#edgJbyDfcAM*`m=llF&J73zPUe~Jb{LPQ&V(|_0 z&+JP+->%uexL9)c_Mc$|udJ$G{xFf9|Br8>;;i&_&L4CSKaXv5=>Pt3lJciV##Q}F zKN=W*uvW0l+43*bh}TVj;d6=K?DHPKiLZEf*t?y-LS>uAf6=XGOXOC!q}_Eno5Yo_ zqxMqEO#OL{c2W3A&)rXC7EP@Fc)WA!vop60{^;@8-z!Ksv%}KMg7e#t=+xtnnP!wS zOB9*xeP|w?_<h%^{D-;jq03|APHo(`_};&Kg`hv5jLLq@sZ5l7SRFCr<?iN3T&K1N z{(Ratdqr8r`^A&DrdxbJtK7F!@OZ+atcQD=%4MHVmwC>-?X$y<Z9R4KO?Ur_I4;DU zRuO4ZZu7uOu0Xb1FL8DGOZ7K5Z^SOjUwv6aF7)1R!PMQNOETWix_!qlQ2NQj?(Yv~ zcB<z+{`+j&8#m=$7d!G63%-`}?f7PwAtZnIbnnsciIac4xMmkwQ|#ZI@b9Hy#mAkd z+>f}Wb{Bkp&HZwB>Vx-d4|4sM`!Ol_2l%`#1I5679jputQ+e_A-v|`%s9m_!;LHNy z@1pnj*Z5e!^|61_oHmR9L*vOU#y+uDe@{dy@yu(Sawy>z|Af9>6U752lux(iD7jR% zb#?69S9TM&PD_opo8bDPm3JG{j}@GU<`||QFl3ApI>D*<l;fmIt+wQ>ZN|HQ*T4T> z|Nig2t?SF)#ZM8momi#*P)+Q=(}HcmU!<?-Z+!Ud?0)Mr2{&Y4_gik^|2?s7kM=9` zB9FY7Z_y%!fima0dR2}J@9AEqGs)elPTkj%bsDQcCF{MXZuhQt&Sm*zG2xoR236-J z1#0}COu1}6&YEp9_fFoW$bGBZGh~7|=jD}H24=XvjPd>WBy5uFt5vanlO8HE=4l7L zuDs@YaOXT#=@Ysq&VOtv{_QrcV3J4V!A(c<L{``Htu30|yL8PRmaSKnR-W~UeYYs4 zMmNZO!kh=sbSK?On%raZX>IyTwu2{?uO7T)^4{TK)ud9vyzB8^H>>_L#ChCyE4UqY ziC1NkqU93nc`wC0-?x}2Pu{(&`oLA4(q@O;64Oax{(L_p8Xq~bO|}U-Da-V*t?pga zr)-t=3(A!5pEh}`#>wTGzmHSxuUTb6fq>@|z9s9b-<H0Z=<3CL`w4Tivc{g42VsXf zI8J%4yS?d%n!MCcxtB~&@3>iQpUnHfmhGv?gfEx8&3<l>WIdkyDe%LUIV@XGrEEJX zyzJCv?zvZF&$}$>y!m9m|91ub{k;zYFMMUzn_W}$p;{#6RBqJ4T|e$>Y*}znXWNdl zg&&%Jt$8iC;>1Rtd-oSiyBfm0GkflV^|wD6=?3t|R4!Y}>os?4WpD9~Exxm6xqbZK z_py4B;H>vcX5KYe$>H_qeunvfPNtYmE04M6NbUY3{IaRz4~y%?^Vfp+XH8t!yYR+m zvA+`=HafYAWxlJ;xN5VbV#5A;ViD?*&zl0X^=?>CQ@Zn@;<D1+U5q#XGS7B%RliZ7 z5`Otb7DMwfsUPxL7S|#VPnL-fzV%M%i+#O^udRSNN8Y5rp(l^M>Wr`zZ~UoT;XZ+j zdjsRQh}hRjk+Zf|*)`U)ndPTv%Kb{$_`$Yi)*T0<yyBz1TenEQ{+Tz6XT#3j3v7SC zQ%qet`+-HqiRlwQ*S=v4;%F;8+{76Y*)TV{ZBeS$rbJ!ei_+!BDqJ~<FORj#A5fbw z^V02C)vV%~2Q8PZT_Sxp%VOiNu87);?*vz$znQxJScT-#b^9JMbEfQ$oAk$r!M}M) zk>hTj<?}gbmQ{S2x*;aABSmX>sIJzL9Xn#{19{b~OcVL%iB0-;rF+)7EmkkY7P7v- zJu$JQ`gUKL+j0Aem)cgjyp)IwVeZuHz1JMSVDb;qh0OL_BaAkAxBC5=BKGWCo>0}> z-)5Hu|7qO&ZoIl>%l44e{TJHj3;jCyfYW%1>Wt=s{>6H+>2BG9^9^$RUGsF@)uZ)I zw!dM&Gk-yiuA_j7{O4`X5{LaCzL-|lVY%q*0qMkJGczn1gx9*hpW1MQX~F^BSz-xl z4>gq6YCS!CF@bf-C7Z1w9S>j35qr@0P$PC9yN&h2s{4%6GQBSfmqlb-UKcVr8LDvn z;_`%ra}NaW@nbq^-YkCI#bJis$|}XR7C&71u7#ag`_F2k<=z7?*MBxh7ke`0r2K#5 zl%MOIEwV3ZpLz4C%ixHF<$i(15+|>Q&B^$BtuuSkhp%fqx2TEVaeB}e-ZO3Px#r;G ztXHLvc6W#5GtG}pc_x{%&S75cR?+*{!o0#X|H{REd7s#y%fz!Q;wES8o_7NGwx5qw zeau{QO+Nknqp5cTlAl^!skqx1F1Nw!SLU7*E{yCSdF;4*Sw1fRoA|Kp@3dux|5;Y| zU%&HBMd?d>O{l<o=JVElPpA6FZ_t}|v6J68Ln7myRZD;3g_*vGmVY~6{>x+AC&PQ{ zD~|=qyzE~3MBMwM7W1XQrxfoT4!pg(B6Qs?t*w8(r!G_oZL6w_@Vk2R)++8W%})WL za*cVqiSrK{EGsxY!;<;t_Z`t@`AaUUKkG~V5L~mhTsZEh?i)|dHn}7>#kK3RS1&GA zimO?sw_a|==LegwiLd#qsPWqVsqI>+tvu{ON!8)$5i&x??0S41pC+Du-*@t^`O$A@ zPF!tXWK{Ss>h_vXe%XrmXZk;zd^h*4?8ca7>eWd}R+HwuzxBW3{g)4u0}ia0cv~KQ z%P#1a@aMY+V|FWb*S61kEbFzVeAD-id&Vhq*jAJ(yzG9@-!5zyFzMsEOXke?H~Q3U zInQ$WXrp(a#nhk1r|$R|Scn<lk~dY~{ryMD<u@HVZeN`;^t&`3Jy@VqX0rUAl&|`F z`4dazwz@ezPXChdJ3vE@>Gt{~HydxWr*|)QpWl}5{;Yq`-v=A!&DZp?c{jg$#=gS+ z>Q&22|NZ%R@yE{WwTmB~-0Z%dy(HdP!2ew++XQ~k+>ejna^63(S8u8K1?N*oHa32V zP-B~DZL_FnuhgYIH{SkRV0PoumM0VRpZ-2KzhZ^TKEdFVJ7!F(_EDKuu|`d<Yh}si z8IyLMIx$)3(j*p@B&DSFT8)1VPVi6aTtA=n<Qvi88|*98F9@&psNtM){fL?Co2x}h z(E&a+d~t<_;@|(2UXmBx=>1Bd>Pkq4R!aK@%^a=ll#RP@^fbmET{fX(5o^x2fD>Y$ z+_o8n81O7kNbu)T&UV?n;K}EoPWu>^eRn+hZ1K$uvE5#MKOd>xPnr4tdAeTtk>@@O z7W1U=thr%w&m>P`=QcCui2bLZ9+0dq$z139Cb0OSj0~Gpj#NL}CEvdqjj=o>cioG9 zAK%=6Hf3Yvn{Ee%Zr`Ww@?v64%TG0ax8a{-I$x%Y$C^#W*!Y;hiyOXgRtX+`=eA$) zKQE{|Y2W<$yCeq#gDc(xzBO@lCqb(o+=^0Dee?4&OY)1*`jvA-qJu9xNZ8)KG%c>7 z=xbXP>k?LP&8Cd*GX`GrTUHqJp82q22{((=p(ULS{{;TG*%>w)KiF)%@AsS4`wxhJ zy}jfTSE|~N4L9$;FFJSfrtiK#R#t2Vy-bHM_|;i0mo&XyRMwJM9Bteib2DVS_cQ_T zWeaaE6J<>H$opt+v%EN2`FmEb_lhzW$F?0g_PX4LU-SakuejzcY&!Mz9L0^tO@Ggf zc;1)CZ@lDks{EFtXSf7SN{v`9&z#DV)Nx$Up-IssCqK)yO)$P<$-0k1-M?4en3^i6 zBAFKVy6L*hsf7!Jqs!+03KH_$D(ihE=+25|tI|#x<ZgFc<&}Qx;$eY#mpSU@Ewqo# zI}o1ZZEV&Rlqdfy`Nc5?=h@4*dA4rKoLODtD=rw5{9?7NgqADM+qEmq-c-Fiziv}@ z*}5kZtIqg~89&{euBMxD(2;G~-xBo#;q6PlZkJrNZRZaCkmF)Jcc0Ia{8a4q(B{w| z%XyZrn&-rgzob+Yoea*X6Rnhb5~}`m%h%?%O4<J`LK0u~{AVS8o0KCr;fdtp@NZ?@ zyY4OUn%Ap3;p+`G39kP~-6AFxOnP@Nc(Yen`BYQqJtbw=T9%%uK77IXd&6t(JC~m9 zlY6t`M$Fx~N4vk)ZdsHo5hG-HL~B{{%0){~x_Csc&{%B}{$yi|WM?jOY}POPEy}O> z+B9!H%}6t8KgM_Q<3uq=n+54Nc+*~{GpX!hDp}N>rndib)n{&&yD@)+cZFA1@fSXQ z(z4C*OhxYgmD8-0cD!pk#vwDKAX553VN7Y`;vJ2St0o*^ot2tfk@H7jCBJSeZ-r=S zWKk)5x#s^1Yvq=R-hE|t&nS~?4wvjlbrb*ORh_Ta2kgvRCZ+W9dz93ykLfR7u(tL6 zzO1R39wk+^f9a|@_MtbqL!SO!Icw?16|Jil%;r>Zid5)a|Gt0U-rtNheERbL|M1yN zWBU)D_A8Xzp>TwWf#EdXAs1rv2x{YeZjg6|aG=QC=p(JO^LCkgvzl_~^)AcUt?^G` zmvHHvJ=>DijT7yzy;9QutakE=v1hiaXY#E1YRSq=rB@5B3Jc_Rb!=&J4Jc9lC$>)H z$gfE^7TtaM$ng8!;(M0uJHJ=_Joe0nZ<&pZ_J%&)Sr#f@haZJKi(K~c(;@e^nfEK+ z-1}aBrcFPgq`FVbp~kx0u}fSu^jeKaNaWP%NBC@4IKOH*!u$0UhwK!WxTz@|@^-as zg<2BnH#X}?FlqCZym-jra*bnmWz-wS#}a=XJTl!Hei)oy{X5WpHK&$K^|`_m_qQ2L z7WlTp=zfTy`}au^Sv*R0)1;Hw1<uF`3anOWck6d3&UwGwQReJ~Ijc^36mD2_{oz!Z zMN76>_)gZ1PK=Qh-03*;nPvZ;)yobp7O+%V*?fi5W4i@YVCXB$b_-wEg75OR|E?^r z6MOslukvcY?f(PU{+;!zXWQyL$B3y}f2NCwF32+MUvg6B)l*g$!>}b6-mg^iO8B&> zD`ldn)t92B&ikX5*#EmFp;Ppwvq@xm|M#Ff&zEFB3`se+QpvS+o7&B+wb3Ha9i@0H z>-7)xeLJ$)U8OaD5!a00D)E!oB&<kUv7=c+?QV<1wG+%2o$`XavI5Hk`j2eOEG$2? z&_80Wl3~@UEq}!Qy*zbS_Ut}YJKgH*%F_!ge$85$8k4H~TC4rAu=<iO_u7MQZJpvV z$7r$cuGeAl>w@L?Z#rB0cYWGCGxh7{+;d|ud#-)4FKgDnSDxZ2zp~6~VtdjHOxrIn z?Nm=WH}6+S|FR(S*NQ=!Pww})JB52}oe-ZF#wv8A?4{+*YELbFkJ8S#LOba>XIba# z+5P^t@*~IOb-OaJEE9fqX4#vcFALUwnEbQgVX@|fy8rjii5YI5l&~*yYs`UdoSS=$ zAIe(@&NCD<*etNSx%>OV4AIk#7VFke$uVkEe|+Q8#$1Un2Km=tH2%KPXZU%?2^|CN zFkSf-X&j%kc<X#Fva!lLoLD8wEXuVnj#)nFgWkTrdT@3U>kr!fo{53M4DURFI*uyG zH$OQ$H3fTxvo}1tS~^@b)_t1oB%SDO!tE<Oh1Cm%BDX!>)gtm_!lWafK99YlG&%ET zw{0}pCfc8#l6kC?`RTg?&F@9U+)slJ2rSsaC?d4Lx01n5?q|iL`5&Aj(@i#|RKJ-~ z_p@X1%*DpP-)z2qEBn3iuiy3W_Ax#%_@}cWeb@H_|7#i%mDN$kI#*B4ayvg^=DbTr z&dVllJ+p^N@j{8~+|cTht216mO732?RF~D1>1)x)O_6I4OcT}S7rnG<9TyAtOHbY8 z*HQC+AGKoJyUk~s?=O}^;aAsOUEjNUTi#Y~nU2bJ5gS9}kF&M~Z}nTCcCApc$3W`U zL+8Z~xw}ng>T<lf-Ll<)iQ`nME>qo0(}uN7{P_|)nsV=in5(lyB{z%in-pf3?epbi z!Zu~8L%TmraJX{%s%zerbqUKGj7%=o*L@H<`2IuBwT&rLc5krmXus(8=2}WzuyJ#X zV^8(TP0n@xx2}{f^VU1%=YM;e)v|0`&)l}|?@9A}+GfAGbtCK`<E4a^k+BKdw(GAk z)gHYN*x%eSIn8wX<>xGI$=Pq;iBH~cq7spJvGtw6MmeF3ZN-vTF9q>EQdw)#Se8FA z<fesW1<PKc&x?in7q_i#wN$p9nSO75_ROwlY-Wos#m{BlE;wLw>A53s_Mv3<#=jfS zuHk!ZxF`J8huSqtr)^4oy>AQUex7xdX|H>5=T^DCwKtz<Xk9H|v%WdJaoVdJw^ls) z62fr&+Qjrp+on8czb3r&^BuvboeF)ApEO@-`0_U6K}g3s|IJ6jT<+Db>0K6O*TC3# zLhAt6yb0Qx7dA_X+<5u)zvgX&h@~y&XNo@XEX;YNU?YBnW1dKb&9`$OcAS&(I4MxO zG>p^L$td@m?6<86dh5^bntHcv|KAtO4_Q9VkDJ;rVxxN@V@6n6&ALUO+C+sDW3)_9 zKc6#iw_35>ube~etlQR?++HWO%rH;-?Ovw8vsaw@9o1skwxvf~IB<cfV(j6=-RYO^ zd09jzUz>BOitXyljXhRNB46#8mDYMr^Mug0RneivOy;W&?)1(y$V_7kQC^(g`pxn3 zoK3~G*}H#KaR(P$u6;kV*RoiAPDrWk%+dm1NB)Og%altESo(5a&4~^@x3{mQNOws} zTfp+GcREa0K9zlzQXL)pZ?B)U&Vfm}7sOU*tLitbextSYV`1!ik0qI3V<fJ7YyIT- zeP9;r)F<s9Yc#Xvldsv`V^Vy~t*6iNAUNb))!Vp(=@lHe+N!6mIowlhkW-O%=Ro?? znIA0~@29$bVJ&Gf=of!--Tm;7Nj416Kc;S4aQ4QkxQNoC>BT=vB;t==clz-7HPi0v z+5XRa-}J2A*j&?`Z~5BH@cOAtrTbiuX8-tRrMFtk;ULrb&{(qugScsq`&-^~Es@J8 z*JXXS;^kC<$G`0EAAT}T^Yf3Mxo1CL$oyz^w`H5$tye;6KUyzY?#+JuSM*QFgO>7L zs~6p2>5=|1v*qJw0kMxwdkoG--!hJJJe?joS9jYL9gUC2ZEiVk%9*M;vr_);ZttAu zxra~rO~375pUTa;f7!F+K9`dgWcfWf`rrBa$AaqlW?!uGS~s-Z-@yBKTC77nuX2x4 zTy~=7{b$*iJ&g~WxUp?+Gt2Ss&-^(>WO_)ur;*-@n8WYir5MbdYY=jJ+NaC~BA0@l zv(D9udCe-bTRZpMDScn{Qz}y*rD<MU)~6o4c#pd3$<j5EVhY|<=jy!?|HL|Xv4Ycz z=Wk^Dsw>3zTtAkt{K<;l?#|P#=VpF+%wLpvlEF7)T6)Ky(g%9`-dM2jdR)GtH6yC~ zMxfNaL-Q&!Lyr8jej&1>z1j7P$j5i5)Oshh2Oa2KG0!m6?DezvYtqvH*;+Vd?~H6J zpU<OvuTr{G^?bngsXBK8p040`|M{oC@2g<nkF1DK$2VU%Z-1buxxU7-qRl3x?V|j9 ztw%hE%huX?tUhNgA*9o1dpLFV@{E#wNhK5A?&jxxDCnH{MJTZ8_w@(<d)yvY&yLR) z`5`hV^v7lgjf!WJ4hg89a8~h{#9S2b|0qiEAmgDosu$w62s{hhw_@uf=RN+P^iF0h zejR3Wd}m<0*lE?!zEzo(_L+6pf(53Vt9N*xZmO7c?bA%}ls|f(6y|Q$`;y%fS9tT$ zh5dIK<Bv0|H{A_=SFYooaL#yJf1cj9*V0G6oqTn}?ycZ$xw>zc{yHAJw$W^x+WeZ6 zMR)(t&S|fZe=GB<iu*HnMU&};QvT1bHFZ07cj&AA*;A()DE(Fa)uOGOs!`(pEN=h1 zJ{-+>pq~-rVj`vS=qRhn{X^xC=DOCb?~vD7v`<^GhfO?i^OiMJ7k}_x%ObmW&yzp% zmj`If`gB$O>f`WxYCmSBYCq`N6ZXLNNli^lF`u<;Mf=GZYyQphkK9{iAKyPM(%+== zJpO3^+;@h%bQTBxX(?_pv58;ixaW|>>>qEQH7{6rf9b<BO7oU(Kg!B8QMxKx=h3ny zOFQCKoIZU!?NVzpg~R=|Fz>|zn~M=eH(prfd@1mVQ@(hDD{j4GW%`~|p%YiV|1`hp z=zm@H+b0Y+od5Y_Mr-kn^ENUCpNt&J<0?1a-D%Lh#N_&co+(A56C)$eUG+5&SNy}Z ze&?jSkETsN6!pV)!xM>LAKQXix$c!*iD#Z%taZ%r;JF~F`a_cc`@$Z}++Q3koW!mC zUuFht+~4baH~;@3{b5?kw|G!rG{#g(Z#O#wgQ+mSv2WrU2B@v<sgt4$ghM5cf4?nu z+&q5HMf1uJj_FtWjO})Lel+8YE70jPe)VF_%OvI7cU5n?zP|A#CI4nl+3ab#lTEHK z%aqPo_%KYFOJt#gs{pI$`*RDDH!kXX#Ok;<J(!90>%sP%b3f00|3Cl!_qp#^KKj8M zDblz7N5-_cs>w&zKKmiQV|M3kwy-_r|D&2TYWF;EOg26es=PoiJ5rKm>ECbG3h$mb zB{^iJTTB%DYvX<@QSwcD#r>>hUlr$l?yh0@B6{BL{12Ca`OB|gTCmCFyNu>*!HyW8 z9hdvX<pSgn*Dqj=W$0k5&GlJ*#E7wDTTINcxCMV7*`CpgN^*TMwIwVnC2Sk3#ICKZ z%mzzxjw+NzIz&DXt*Vl}kl~nM?NBQt{UD=h3NNpZ{P|5Y*1F~KI$XJbPp|XKW*xC* z#tXI>WP4c7{=Dk%$q>1aiQhI02xouee<W2X9P!WcLiCY_`?{wzDyJ^ImlzQ1RnR0m zXT5GicTH#JTI2R`rzeSVIfs8P(0Od7p!Mndz7s!GChm;c@FnbgP@ItBrxiyEP0Ld! zhrgVE;_$B1mkP3LRx4_;%-G89VO3T;C6YCZ+wbtI+!=M&%iiz5B)ebo-HNjx7uAQl z&-IVL;Z$y|yGG#l42QM7jve>Z3%A<c?UVjGEBxlg-&PXlmt@Ybon-MREl<ovW!<&Z z^+r>DnvN#ToBC&y=_LCD4nHI>+>l!EvgzUSIOUz^je9?SOSYN0NTEpl{AQlF`;PX6 zTmDGnI>hruM?g3Erd9Hnq$8{S-l~5~c8}xwG2{0i9cHz&4<B<M&e+S`c3*e$;>e)7 z?-H8w_OC+Ed~bU=f#18yXT!?7_q)#Dp8dhZoRxW>TFjaoA<_q<UUdD;+m*8=f49M^ z{tu4(tEE^T=k2@e%eP2XDoV+`J@E1Tvt5@e!p@r2X=a{flb^ciY@%h-J*A_w)-EkN z@@)6gcWJKo1lPN+IqMeqLimk(WvI!@!o~g?EW%fQ2w#y)4A8jt=!%@OT2D-bp8Q_7 zwt1VxqV01$q*p95aT6`A{gYX@_q)mdd9${kTXQ?%<h=W9FC|@cdviP7yqjz41GTI> z%)#BkX6?VXiSTM(pEGq^&~3fgxjR&PI42*>y<$;1qv=%AOKl0w(7mm<k{r)J`mvf# zA@O<Z+^^lG%c4I{Nd5UmFZQ<X+QV*7)Lw7?p)OaXW1KoIs4|h?RQcf};fv-PGai0> z<gc`=ziIEgB7N6)+aI;*%5eDY<~d~7Rdcn2quu7o>?;p_>Xm+peLFn!#ubB7{-5G; zvE{aIzn>KFzWtH3MVal*?iRLC?rq6C+A<~0-d(zSH{#VV2R*(_|HD3M(=Df*+F2p- zX#dMyyxudGJXkFibGTC~=CDrNY@_yI)`z)WHmbh=(<^%q|IfOx<KO*N*?&qF?#ebV z^>&}#FWvUxpK-|J{L}Up8=u^D-l!twx%kL~1B|KZm4{z$%&^&4>l57e>8Adij%k5z zpKkWw360}i{ON)9sdM~O7bc%N@w=jX)5;GiRy98^Oq}nx->i2^_Hmx6KN#*uN=`WU zYVpne9Xq!kJ-F`3ofylB&PVo44K6MWk!{;!JL{d-G|@-WE@5BRdEU0nwyIz7CI9I= zyDO2~x|V&my%)OqNZi&hmRi|TS}$(46yGbUJ67nyXIhgpy<7kM!i_%<Zo1T6WSDY# z#hO(=t}7^iV&7YQrtI0PWzHHi<-$LI(|pu2DeA+DW$NO3n(5nDES1kHSNSTTCBWXH zpPRl-Pu5ZY-17zEs#n*^O))vQFs18<sN<a%w<53myLjziuqkm-z>@OCZ)<|5PrDHM zQ7H4K@XY|bl?OaoSZz&Gt?YL#XWqapm@oa@XrZx2ZC%J^Ev*~7gnu!M3LVkxDGt!B z?OrvjciX?1mt_~OeHPxu7kYK$T>HR<#~l_nM+tt_PJ3w`(zo+XL@l4-=D(6tuAE!E z_OocDyE50QHfuLtWs!c~o9EV-ZeiKA>y~p}uD^)YeGjcCQ@XEJZt8Qh>iBWTBAkmi zVauLnp`kOb8ZT57f2-nV{b*6>I)~LdPS&eZ4Q6#+<hqq)l5{O}c7(0y@BgprMbw`1 zE-tn+OR`RX)ylho|Kfd6b+dhzg|8qR1H&2)eANxEsn(#>;?kTFJ=B|DOZ(1x9WfAT z^<QScc&k<Ev`5G0o;##;CeKCSU})fm)B~xvIQ`m8TFpL6vV7myvZG+}gG1~eQfrvM zF56|=So~R*&+_}@*KcJHh$Oeo{gpAx>+Z~J*PNvDQWjs<z8IO>mcVne>;9*Z!rIAk z)3gI8zBcUnl%**a*7<G2>K%`G9&WsHX^ug~Z}!g;ifw{5YYcy+X<E14ee-{j<kEAq zS{KwCuRPki*88H^o{%R!o7=da?U~y5|BOa{PIPDSO9c(T&yQxMy)*mx-C#jdxkT)( zW)n59YPP16+Slg4G(4b|d1JQp4W-_C=8g_V{>65p3JYgGsQYB}dk^!h_6NT|a^5JD z1y5i<Q$6YVpMinF8}Ftc0-=gpd&f?=n}0h*;#jd!VdD?w8?53D0)j&20@E^?ILjE7 znpb;HeI7NtJ=y&q!x3KfvYg|dbNH*b%|22%YrWbc-&<R=qh5F{J$Oomt%PY?X-X4! z$c4N%w%F4Xw#hD^H9<{w?)Q)HZJt;Do%i_b&E>H(PPiBL9OARnz94_$jQf}3#xtLr z!}FFiF&?XXbTCI>;19bBzk7e7L)YFfMkgkl9N+BJv!Jp^UD8TJ&1J$dNh$FNF~<oa z6_c1wUcS*T;o;M8WyyiQUWaFY>>PSIZOWRI{&<VHKKPv;IOP~4>*JXcoy>nf?AYh| z`G{u|>#5x=>H#(ZajKb<>UmW(d+a1drYZ&8vn!NxWpO=hqat>$;YsxghD(8N35Ab% zFTHQNX!7|*_*TscN`V^Q$sqwcQ=5~HGI~u(_q0F1LT(b*I(D;ylDWz|0($1S+>78i zEBh$I=7_M2yp+G8TmN1cjjs7hYOGxe@ptBj*cEjxQ48$1I+bg~@XFB0&46jv<FEaN zO6PtTe|(=Ta^YU0#ijlS4zD<bKMPxOcnRE?$ii~8V~Wqw$%U4SWI`u8SuN@fwVKB{ zePYm#92X~3+3U6OI|@wH|4u6Jog%eejm0>rBkLjS!M+Uk`Bj^ibNel6^2-u_n4RzY zz01jV&(u>HQF|-}?}<e{+!<%L=dXQ+Jzv_P;<?P;2aonJ?{%|f7hh2Q?YP~PYjyt; zU9<kN*_OZjWvRixJ}1=t>3Z$ecdM?yiaNV0T>IRPwJ-DA#6MkIVYvJDz70E;r(gOs z<$L<dUAooJR?M9HF@^J-?rk?;y|Qc8*-_bvucBMDYQ0U<iY<d(<)>Ygc&~RWJSN%T z`QcA)|CckZ`t)K`&Ep`m-9d9cy}K3mxo6eSZKj-JTSE8pelnUfe|o~%GCS!hYiFm& zKF?EKUtbw{x{7<(Lgn}O3pW4%z4L7E!JpMT&n~@q>v{RU3%jO=weQ|5ZT&R<f0pRK z6+P=>WF+qAhqCSb`u^PgGa0LTrPgnMY8TKLVX9ZP%xcfw3DzBYrw_0H^;C3w$E0jd z4c5NbE1#6;&z_}U`|Hf6S1Z0>e%6=sk6re3L*JE8o)_<go{@bqCHF-~Z|x>?HC673 zd;AmJ1t-=EzO<h9^ZjCh?YwjMq|3j!{hh1Pw!XIL>$SB9zP{wW{q9gZs3bgj@v~tp zGXuj%W_%?fu9dq%sU=~FIp`~Qdqc8=FFT0X&c3uvKTb5Da>b1<T~Vg46;s+zIM394 z6p-51zc4m&rpe1CoK5?^j!Rmf>Uo@AKjraVl`@v>Y<rd6=FjI<pS!pB@5j%t%^8X- z4jKf_oqM?@vOH(|DPQ;Umej1>cWz$p?cq9hp?uB!7qb@5ZohTzprO9CmJ?6%*G+jZ zqFQf1a=EZPH}Uqgxs|EWqTx=5c$niBZP+5zSmM0rIzP`kr_>j^Q~N89n(nZDd(nVr z+mc|x^Z;hRsNDB!_G{*)tf<=9`-;gqC2+=}$TW`B;%d(?i}d^Sz8IHSx-U8>5UV3C zr^Ltl*Ry1?y4z~SwkOun7B$na^Xxry(%CG0&zt!_)N6Kb%eGo{YHP0dtjt?el03e= zoY|G=`H}tbtcBNKv&LV}kWrRM=6JnzR^hP?lXQP=Nj+__qHl}Js?h5bpDz=2y{q}; z)(^GFrF}fz^}8eA9kKfJe!W(namqjE?dcZ6?o#C|IL*pea6Xp3yyEFP$vNkow#_}o zC+4(#W@OvNZwpo=PnDUScmL_O-+`5DYjQ-SoFA>t4V@ic{OY?T%S6AXUHS_`Z4zFr z{5hMq`83O{&NpG*r>7rrKBJydCU1D>O+ka!yo!728Bg?HCVTwX-RZh9^3HT)r^QFI zuIw~jeMoht!B6k)RR`W)-z4F@Dns!4JU?NF-wG1iozB7KF|)6o)V=&<TlrthuXb^p zVs@V~Z#~lL9mGC0D8ob4MS%5ispXU}>Y__I&g#2{WiG!s`=YhYO@~*?x*|4<(~oeg zZG2{H%doEEr6G^W<jXD7_8+mF@|TUx{^6=63E~<eF^g~29g=a1GpXyF_;<>s1HJsY zUdNgzT@k;dG$kcMi7nEktnW+RzQ)dLEY5Zs3KLfEK5^-LDZj1XY8f@=z|UW%WvJfo z^Uf^NJn?v5c~0;QK8s~d$vjKbZdr1f%3d_(2r}O*$EbNe@CCP=_K&_+zH33gmYO0P zIIeB?n&Zv*oGDR7%V_5Ro~dOv6V?1#{8jlg?|e8nZ<#Qsin3vl#^>Y;y~O?C74aTY z-nk6S3=FUFP8{K`3qkn`t%b2P>~^tms>uJ^*-K{UY!`Q8T)1?rS=M?Mfu}(lA{wT% z%sjjnE|`|PDOcQVcjD%5M*SB*!aqFgzAP?(;o`K3lKRGd=YG7~|8RGo^1S@=n?AF1 zn{K^)S8hH1{?EC^`_8Vfum3IEp!}mHG5+O+iCfY_a!zZmY+HL{R^}4@mEZO(>Q1;l zFI?uXm|$YYY7voG&-g8876mU@E8%?I_i5jxYiCO0wwkzJf2ZlaOUo(c#R>7StBV$| zzQ!2dtC+R2taYLN>zSG}cC8bOk&jyW<VK9~+^bsOES!Bbr+?kevz&c47k}#Z{w|%T zv!g6#mL^{iO;(*7z01?+vGCb7W%>29gf1RbIQQgS{5ij+65q@>Op%(tk@+Nx)yCkq z9<$E0-4apLbvHk`e8%9L2}}KQLkr334>H>~PY<wY^MBHL(9O!1r)+V%^qun;ih_(y zs+$zQ@^sEjxA-Q1bN+P2g{F**`UWm+KX>tKat7}4C{0<P72<B&8+;}3+l^B<RxQ1; z%yp)O%qsWKUuKwCZO;h!<o0^y{d-M4f<4<7u_p6a*G32LI<@hvmg-c6^42%YQe?hd z;WIoEKK0Zq%grlx1*WgKU{gLV`9_qd@AIFpCMBP_*u?cVG%k);<<2LoSqHK$j!lSI zBk6zb=+udYOpk>+=PfZ=y<OH-{lIRv*O!e;dJ`3TPU-%9u4$tj$fe$SYi*dzoXLib zmxazHcRkY6I41I4GkI1%SH)b370dX9u2iw`)cVfpJ~1iq_L<w$($)xkY}uZ6?6&Ol zDOX(BUIoW4SA48=?~zPw(dvMO&!+sH;ukf`xAxjIef_9co5EDp_Ez;g=5qf1>`if* zv2)@@&hGY<nC~a5XHU55V&oRM_L+?J_L^%YJxQsnq5@9a)Cs=7^mp%0k#n;`w?3NQ z)FItcdUDOVnUaUY!b4uQ-<^H;_ivFWLR>;3B9diSWV<7#8FtTU5nYp~DKKAkeRRH8 z#1UP#v<uEt=d4-(*NUx%xzJ;_*Rk7Tjx+kr^!HqlZv7N$aJt-b!*k2E<r=az%Aq0C zMStyEy5gr$W$w{{oa0Iff$ROPHqBai&T6UZ)me}EDlBI`sf$~<UUu!@v)lHp70ElR zky@|&)c3g73UQNt9cO)?Jr~O;i5C9*#MaB7`;kKNpLvTv>eVi0ouxYQ!F|SA_ZQFA zlalQHxc-9ap1!;M2mjmLESt1s_Ple>D&H$7an_Z#dw;1C>JffaJ$pgmf<P&`pKQ#B zr7K=~U%&kOOI~4VYK_DDyYocijxES`z9r&Z|6HZb;7zsf<rAjKhx-d2B(AW$Dg5Eg z#3HMZpC61hF8>kzwe+#3{JNvna~|1#b!GlrvA{ok()$0xp2suJ@b=gAy_`7nqP(Kb zfr}UA70yiByE*yGoDRJ|Og~TEdvQJ^{_woL7fWL*8u|>a&f7Fd#5$X7Vw*Vc#AVfX z!GrBz<lG-|wn_;rc38ascR7WvCobu=<Tv(~;y3;r^@>jI{uVX<Q~rl=pZC-|;mMc( zz<0XctE&ZWpL!+M8XCzO6wPsar)uUD(sKFb!46h~q#2(RWB7!OU!{k3n0a*yFwEd* zlK5<@d~$W~26v{btTCTMr)QWuCFg%%>2W?i<k9Pjbl#K4BVu0Ev6RZ*V*B!5p6%pB zi}!DHrm3sgoVcfOB5q2;jtf3hYU|Bw>TT!kulQ6JoNx3!?B=m({|9T;Ke){g-(Q^F z`^l7T-qOH5VOulLbL!0wW@+2)Wz)97U{mAwL%fw0LX7i{EPI!~Jkpd!-1PMR!=-=! zOLsm{E}wRwR?7NfdFlSj-{z10T>kg%{(A=b;vfIP#d6-<lJ5?z3=9fnt+9nPcl6M@ zD523g!Y@VV-S@oJ9`^RI-HuDEn!GZudack5lAn1)hlz8Wh|7yri#*<~F>VmAPBRi0 zTa{})?_*DTO=tc`)osahc2B<}?6HT%Nx}Ps-u8e6EjbFA3w4(2UKhIYcGZ_2*=@J& zZv3~r|MT3>bM^m{E5p6NcddEBcl8#h`o>S~Ok4XG-CtbSvi8T*?=OF4ON1%@e_+l3 zE&2YQZkyLx<pmyPYkz8TS!(p9vx<9uWO=_pbMljE6VCeumo=s`y2v$_TTFZ&n`Ga3 z$85<}&YaE;k#iRu<E9@FesAHaeDbBr+out_A&)0`eb{n3(fwfQ(qiGGldC<%R^Imf zm&??(No9hKeR07a&r5$j%6Clbp1CB0=j7`Z%^tC@7s%A~PCU%%_u!;w_Y@Ds_h!@9 z3BR!k%GL4xY$mcoHIn^d$)9CcdZsJB`Q2fw^63xLrHR|7Klrw8`D+gqXJL=+dp|jv z^UvSnnwOc|EOl(^Hts8Y?cFB3ttU(u)sV|sP@*_>jW~z;nYRa4%~yCo+vKeZCzt2@ z{rng6y6;@R-L0}ou5u2`*5fKGnLY0QI=9<EV6urt%EaH*?SY52nr^dvR@1QFS^8b8 zyQbua>Lu1w`=)Psul#z!IgOZg9ZSsbZ8&kfr^+I4V!!jUH1!p{ZF^kh%wy)Qdm72U zm3`&u<$2YtjdwJ=YpOQ!R{q$_($CblJ~Qgc%6ro_4oqp^-dFm8J+R>B?PHU6%d$`4 zN|)U!ZK`uvdd`xKvL|@Ux2|>coxQ^9(}A$Y`@4SoMlE=?gO~k{N^soVgWY2OkA%!J zC#tCheyRUl@3-TD=^K+`fqMoilcban?CpyEJ*~vm#ja`5i*W80=VvXEUaaxyYRo;g z2dN8dC!2iNJd-Z>Gb^)k>tt!!50_>!Z|hphp{}AkW69CzfN%acRAy~rZdcx!HGMH3 z$GWT=-?I9)hJRK$9zMNnJImku|H7{~Wz2n`a#Mb~MOyiZH~Y9&)i<6u2uf7nez@R@ zF5k4Jk(+<7|IpoV^me?|o`2>d75r&ldFqntiRyt_+__hNWtsA_M%-aGXg<WeWKFq{ z4101li>>_;Ipx*_iRX?_L|1HLoV|^$^>k3mU9nk<%4JeKp4>lsY2DMm+fO`ii=Mcz z_nC}aAz$X}%;|;FeruvcR_8_CO}e@!^jk(xd*GT^(Qz9NY<s18`uLBJCJ|cV8%`Dc znz7*E;luf+Cq#=E<{XtY70A2T(y=wL<MGSurgJklUG!A!{C;J*<lR{-&l_3o(@+)8 z(zqkFK-sA!d)uoL8GHRFAC^uHdUYX7v0p!vH|DqB!pl)VL}efKKeoMZ>g{hIF!gXi ziRX*9AGyo?yA9nHdKT|kXRK_hq0SS@?mT~uYw}Ft&Si%iekV=YuF25$EY)rc=i(ni zed{tR(|ouM)n^n~&g8tlpx@NKSjgQwRb_EdoXpmchK!`7tp!}}!n5Z8=5Rk)B=h0V zj#rk<GBTwv0-xpduH1bx|HX<0&5LIrxUj5nNlr=g)Bh0`M{Aq(bNL#Li~PRMY3F#- z#$~$9TJpZz#GM<~%r+^R8t+_gZ1!-G;%bBG*JsH&#od>m_SxsU^UqmbImb2!-jO+X zWV&(FgvRh6-haCE7Jt-UrQYMe)?n79nf6Y>A7^!aPSdQFo&U*n(`0MLhKnJ0nlIkj z!Z|<c`I$*|jPsKYRUEDTyuDhwCHk7HZ}PvK!`gpm=kHEd{KXf4v;F%4(f7Bmg{8$C zub&e5f3A*~bL;t>L$(z&zW6=d_x1hny(-Z+TfTdEC7J$v>ZSRw|7yikL)`;58#(z4 zMDDeQ`_&)TIXZupQOS?5Y})cOmR_(AeJW{@#=IgZVS@0El^18seG{8CxwqrW*E<od zCi{+ro4!AyT^zM1#)02R`NG-mS*!TXx_(UgX<D2waO?kjQ@iywIZ~h0kH%zsH(MyA zv9JHq`RT@1@5M#87tJ`$cV13#>c`XOv(l&Z8y$7>R*dV|Zu*?h)oSzGpPL^qcmDYE z+Pmkn%iH5v{@STd-F^K^P58;9&u%l#wR9D$?o(UTKE>nu$#sT%YZXfQ7Wl;9k$#(( z(NTG@(>>bze&i3ivu^HHJO;K`%T0Nf8`a0noXyALro8e_kkY+tFRt?5nxWJ7HE9EL ztH{Rv@nZa{liJ-ceVpBV^GT4Jh)rP}{}Z;RiwXtvyNqkg`_B0E%KTrHm{w8u=CJzl zFNaDB|5U!ev-!)R#os=p&-{5h-EEP0eu|rvUz|nV<@MFV3N@RYUpmLBn7W^Tl63E5 z`&uvY1@2Qnp4|5(!;EPv|4vuQ+oD%&ZoIwMaP9t=-=Xe%J>T!I-I(t6CO*kXPIPk7 z?nalS^H*;e8_x9W@LajIXOD)WZ=r(|n^M_Ip%3i`>V*1h|E==a=Irw=!T8^|j?7Pn z8v8_MhYB*?h&-xXR&{6p-gn&HH$s0*-(zY%UH*XDhRzVJ{=0{l1>evyYjk-NxN(NQ zSkTW$4u(^`M1yZ|D=cCA^gx8GRcV9V)H4Ngv+r8J@|9q^fBIf_pOjnJ@nvFSL34F= zH8uV{{j9bz*8MMcV*M|nF5X|!@(Xvi{&~Ob^9`P|>+jDe3%5>8?<~qnwlvLOA^CIV zx!>P|nca%JZ{%qGY5f7-D_Q>NzsDqY28Im0m)9%dSZNegnwOWEmySNL(Fz*a2oSI} zU+NprF{PbfZqeEsL5d4HxL94}4*6*Fg{J+GxTVc@dC4-=fsK16VF&ys@$alQPd`8J zZngRTy88c&34GB!%3E(*x*AJudwOL@;_7W_Qm57>OUx>qG4Y^8RsWUb(2Jpu18!Pc zJQ9s|>qy)Z7+4y*vdG(7ZAH)}ozq*4^mRAC;_#S}c!2kc&r%<S(Cc=q*sZ238h@F7 z=9G1u?##Bd+1IvsA2ql!G01I><F|^FT5s3v*UL+hIM!8nNnBEiwfDz#NvE54;)HBp z^e*PE<%#_kz4oAhZb*r^V0+6xm0g9ZZr22yKQ%ACSu_25>DEIlC*-WF*vWas{^F%< z%eJ*wcLXW5TIFBYx-#L_<X}m2mZO$!rm?vuV$rkQ9!VV2aE@4e{cCXB)SQj3(T1gS zKXuI75_NW?>*p1d--{R5l}=t$B;fq;f6_GO$o5*h(>u;i;1hc%Hm6g$*E(c_UwMOH zqK!t+xjTk?-id75XVl!qF*hac<tw%Yi?&5>)7_*$zvi?yOXUL%k+vh!r`K$K|NP5+ zvx<2RzIVkR7|9vLtlVxUZ6z*fB6;&IpSeM2`wagJ684J{Kjbg!QP2Bo%ws$K%UtW7 z^^>fh%sN_YsBYr7#!q=mTG&p7%RK)Mt&}ZzJ@v%V30kv`Y+Zgy<ifq;W2bH{TzIR` zwXEp2!H%bW49g$)Pxn2(>VvQEgF~qcn}a+}RtPC|G(FrU;qxoj^`x`0&%DrEnp=#b z4o~)7VmDdwq2ylWb;aD-U;MT)yeL1MERn&!oKtt+5y>Tg)!6nwShXNQTtg*h@tw5| zmMt;)e|Qf6)?C@S(cez<ahzA%Yzg%#2@y(c6HUt6zSQmO>^#TftUJM7VGVe2L%g<o zjf|RY;O8w|Tc&(}Jn2@9(5D^Gx8-tOmODP>`munlW9t_M>{i;v7WZOVwVT7KwHjY| z`&IuOadOC9xowV!SRljeSk-f?{l$$2OrkT-)F17V_g`{W_+aosXDRbL_b&I#Lk2e< zC0FPr)Pq~mm)|eqV_{}s_=<OMLlJ-GB0RbgBegZ0sYBrl6RTI}Hec0+5do*oZf@f~ znRnw&(gE&Y>0f%qm+9LrSll{M@}i`Bdd-Kcg@3$DWIopHKAq+?jb-cQyYI{N_J6j1 zUNd|C|9{V-8QeceI+uUEFmcJU>AIKoR_$6EF>9f^{*7JhUanS>I6P0G@y)E2T0eQ# zh6pOQZ7cHA)Hqpr`NVBYZ<m&ZuV)nnduF*AEuJ+i=t7?MX;vXI$!+JPcD~N4yLQ3! zv;n`xDxQf<Z>LFqJGWz7k=w!r&t&qWHfBV}%+0wgp&Ga}MC(qH#m)OZWeLk1D^fHs zpE-1+N7&8rV)*2jPqS5wtS(;3@^60J(!s}8Xjc2}(V38@h1(~tJ+h)lx8wMQ&b3A< zTRcr}AG@$CNy@c9r;XXa`9s;P2a`84>lZp(bGEOoj_Lbq9+H)|N!s?#lf1TRhP|Jx z4qmu!W6jNT{9iPiSc*qRuj7HbwgCJ1_l{0Z68gq1YfXE#GRr5Mlun7+7c?zPE2MMD zMf-sMXD<yiOY9aq{*+#){{N>~3Qyt=QC*3JdLMFpMML=V{4`g!?9@&$SA4u+by<hv zu4PlMpOdJ(%4zM&`(~GM?%hjWM<n6{dm^I(*6ux*nW6Ad<i<vczDK-mH-fHK?9p2{ zrAJs|sz*uBrZx9AOl4xccP)PY{KnHfznfRA@wNAVsM#50;d#a`+vSL)q_BnNL!D(B zZ{{rWFPv_)?B}wE&n^zCg%c)RV_vW=>rM0#o|{{GdQyXQ1>Ux7%Q|{j_GwFq>#tYB zvC9>c<?@T$^ekLg1Qef&b5i#`yT~m2^R&;)b}b5B!ML}m=aG<eb?zt2ohus`yl7eK zY_x92lfB*-Rw-%Pt`EDkZEBol?v1K_HlZh1s><!}_%2y?HSAF4;ziT;dI=OxJ)kE& zb<M;}x}~8@%WlNIzIS`M#`KAk7bu+Hu=HKTk**%gC8}$Z-p>5>A){#b*I6y9G3g0b zwjn1z{<^e2`GB!NYe=xsyKNkYYPMwFWsTFAvVKnBuA_x-pRT#LB<Dk~OI&Q=o2ID? zu63tw360&DGr6GkuHMTT7fVXd>FKRbn|Ay8)r<+>SzGs2Zuw?*`-S(+-FB;|?AbcS zFvocLyvsk7Ce1yQBA!_yCH(tD^^AF9E{@NBn7TjK{T0V;(ye@KKeNexU+Y*CBdNvl zi?R!ZZ@+K;zjM=D6;E;7x$GYAid2*T+~b?}qEuBv{m5rC$HfkdO)S2c{$i7VFjZg1 zU;fhWqZe)a`(Nz6JN3}&7v(t~riO1`&pE=tX1m@~YG+!?2SvU+{3hzVnbuhb`LSuq z*D<Ef+V8f%D(30os}=phdmhg>ztI2dSBY}vFZ&54Eyun*xM1tUf0nPFKT-C0+x}() z_iujv7mAhk{1ATPZGG5&Q7yA|S(|xbo~*2L$-Jm`iF*zfTNo$Ky8s&FICT7roa-CT zRw+Tn4vW`+E~kir#yB*;v9}n5$2eR-V;tdA{%3KY^SpK5Q!4+FZo6I9)dV-AUWv6v zMsJP5V;n{<AuN|)9_sjEpmd_jK<`(l<hM;)Ez(O}J}~P1VC<=wweW{^?}ql8tFAHM zLZ)Y$yCmm-uUPS1Z|V=Vd$%3_2u>5*E$?)<<r_om@$Y}1c+B};W_DayNG4^ye2RY8 z1=$QXuX+1d&)Y9|J>H~l@k;ZV)!O#Qqx;{lJ^tM-K74)g>fTSHzv7kz-U-{9asHeB z>_Vo)u}9?`BV?)?_?vilRwUWYi}3xv{qh>2hVEHU??2r2>3?s_hfd?}hkU(rIsRJJ zz5l4+@b~uni@U`>Xtw|72hHf*bt>HH%F4i?gLjC7P~nU=#t|HyBl28y-e&IHC1J0a zr+!<=|B%sjZObdAuM_X@W=Z5!;X1U1-{ex+ChKFuW$A4@1%y>!zB%*e%$wTju^-mt zzS)|1Hi;+hl1eELi@MHqi^drY4>xgozP{!uy**%&M`ef0xi?Oiz9oM7|NPJM-{;Ep zKA(B9QN8_2#5!vi_ZL&`!*|5W{I~heeX4qL$oaU18c)kUcXs*w{U9Onde?UE1@71X zNEPX*pIjuAYB6(K<h;)rhP-QXxsGqV<JaN-<APq#o3t|Ln4(HW$w$h9YFGNU=6Gzl zxI*djc{hpvX&y~G`)=><eaTp?dwOG$`jTzmyLe>Zxs~x;*j%SOnK^s)iT0@zc+vu% zR9bSp%yUb5$??1CH1jlv_OgrCk_L6%G6~-=1--AbJJYal;$%g^nw;c+b$__(?rQQY zw6Er$nxDS7N8gNP+KK|Bdxj|zK55&X+&4_w7rLKG*0t%Y$$58)S<G*biW@$e5N{u| zwyABZ)cK3m83sxw+b=J^+Sj!6>CNXGlKRaG&#aeU>E~1?s+)Uc-^G}Yo0m49T0ehA z4aY_W6%oBFr(4Pl6IE<Fm+oV_73}}>Yj|vu)1P0jIkq{QY(FUa`1<nL;Agv2FXnFh z`ND@qez(D6&HZ)1&M-(6>FYYr`n!HhUG27C0+*b2PkrqYc8`0e`?au%FB5+sIAYv$ z_=H_ieuu%k1&VF1?AIMCmBrJ3ZPWNPZQk<AR&H<UUrs$2=Dj(hx_@5f^Pc$GmdwBZ ziT{(f>RQbC@lc%1iia12mfb%Qv+&;kiDi+kDrXD-JPzGt_aWoDpVPzL+y3+&GhAHN zU-p-6+jD1+vd>)-NxLFscAqUWQZ6cCaolcuYi{(41(j^ioFtSCgWRX^KCa%ve0`g< zkh83j@=4jXOLKPq%b#d%_Brp^S(|kN`u{eGKJS*?cSF?Y4`<!vguFD@iQ=^z_czHN zW4&`ZYv)&U5BvVRDccO4TKEhf<Q#jYe5PFc)uzWx-xGf-&v&e;ZJDN$bHjcE_x#}h zEf%^Qf-(B7+3^LBuQ}|SyJ~6s{e9sH3RjgsU3CB77;kSM*>)r>E-AK%^Uc?qD{EbX zri)*Bdegxtb{@xzUE33RDwm%rskst%#=*;zea-xvoQm>KHhY;Zc(2D1mT>>wqJ)XU zQT4~p96f$%&&nA=nh75>jTXF7@0~iUIAQB0f2p!CsXGg0czXWKGk>D8^6!!5x}j%& ztT1wuI;B|i-$P<M_o2cXHEz!68Lwi3`dHP9o?maW{c)`EU*M(*caC2@t+^>7`q2EQ zQ=XR;408Cn*WZkMc;0CbtH`6d8}9pY<qKHcF5)@1(`x7Qqd7}wUOlDBlxeNF*K^id z_b+mD%)V}ZBKOlMP~hIHmfufRKFvPi|A50TI)8F@tl^#|=QNiuVav=hx=`_S&&qg( z>nHZ!saU?;YQ~G8*6z1C>;|{D+TXBD)LRi#H2G+2`SmJ4g|tt5&5k{O;$~&LoxNAD zG`MENmA>-{HXmcM+;?yCn(nLY=jFdhB6<e@q*lN6PcNSe_tcCO;kG{EWa+zS@r{nz zj!)el?DF@HQBhU&+tXfSZ#OSAkM*6xyTuA0=iUBNxF+L6dFp$mm5GV-*{)ZuU;kn4 zm4#*H99<_qOkXhRn4n0R26yBB_bZJTeb-u<`SDDa(e@y1-F0gB*vq_rD6Ob*duQi7 zZKeH(%%iHo?xpv;qr<*t&a9t#Z2!ro^QP%FvuvFgye#uJe=mFK!usC(<;P<ccq?!I z;d}J=g5K5xojnGvM*lAFTyt~jq)GX$?<?3!>(~EpeEuS4Rs34M73^A1xqrP>cAu^$ zwDZnt;lkRSiWid?iOOGDeb{;X-P;@Fg8M_BeZ9Q>%SQe$uXs(aDyo0G<?v?j&eQzU z(xg`XyUcleft}sFZOg-Y{(KC1^}+7^PSsMCZvnO$E03-ZeYGfY<>Rn7OJ|?_t5s?n z+P*t{eb}ojI;O8JL|+wWnfc$HwQS$Ach{F|f9(pMx$dg0dVKkc-+ucZEnx4DTI+Xq z@!^x#vwm`!p5K?xzvGWx^2daWdwG`L%Q5@>`0A?Qm4WwbLc{o%C#>3OZ(6|EWxR5u z{sX_wpFXL&1a+?rX`Qup&%dh<(vew;hTWH&tRHuG`<)H_rfK^A$^MZ2te{$`EVNft zkBxz08auvq1x7f!2*Jr2sVSv7iAg!BPC5C>*_nCifu*UXsc3zMy<tDgrLT(qi%W{0 zxF}-N8<i>7QiNB&aS&1W^IUx8frWI4AA@BZL#Cv6a`mH&Jz8f~3@@}!n|s0O<*7@p zo2G3Nwr*KkV!zz>@7j8Q|NZ91liV+zDB@pkYjsI_@6PYLzt?@g_x;`d|Fu7b84mxL zeZchS!iQVZLe^}G4dM0PXmZ)(`KQfU2d_=ljI~`c`={mE89R@L<(jf67JNEz<lh^~ zr)wr%6HQjDO?uTcYrBzhB&Ug;$(%KpEes4NN}fz<?&%5k(e0VtmNxTg&w*bK4FXmy z+qPWgU+Dc{Rao8oHBUri1vx6!oH)4GtQHpJ2#?9#s<T1!!sD3GhI?)~ix*7$TKVeo z{x!)8bInWVrg%iIjo705(!*+XsE$@nzWU=J)eEH#$sWo~(ZRWUBxZ=*5TDcgZB?Ml zM!lZU7s3&9C;hM9pxES>Bl4mwR#)?<WvZKR+Xu@c^SVbDPQH1##K9)|zm@RO=O0@Q z*16a(?91MDVB3`gMGu4AvT_eS<Jh{*<znxQlGND_?WU_kS<3XD*9X^~ymhO%D@`_N zxoGrumPPyOzf@Ek$bJ>o(DX=5&~=g!d9n74^v|0{_wOzi%i0mXe9wly8*Rc@)}3)M z{>@a&c<amK8(x1RI$Jf$lyq(H9^JL|%;D!(_vCJDtDZF_@_Ack=H<^@C3e03r@r{c zYqr0tY1e8^SG_iUIq#URR?W@O8|M$D&%0fEYM10ytC!i+%(gz<>b+|3l-mZI`uJTU zY|JNo3t<Q^lo8pn=v-$?kfBfVEwf3^fij0WLhNO@A9~0rudX!uH0AcLmc^3kXDw%i zbOp1f#%!IEse0b!Y<q$5&5)AQ+toh=Xx(1o)fl<Cz{iklSCnU(Z}B<3)S4vA)jsQu z){3Y<^Uiv9?%4^pS)#{8V$Wwz^NQLe(f?qzh1}~yoQ-}<LoU6%_hOT}b8$MaNoa`3 z_6OHkB2R5yR$88{w})e~MW^S<Z@DSIzgegW3!HxVMzG^5*TWr|7VT$aEp!$4xpk~R zUTAeN-RX;dbi3k{%55v&2sbW1>wBk8c>`ytk9z<^cUAE0C|<{8^^jNAiZiorbA0NM z&(MBWcIZHgjP!}rrKu}tUr;SpHTupgH_6XarTgc}l%*;K|Msux`L?fGDE0P+EsJJN zV|nL&KjiV1%|3G48-yZwcW?cyvtqAyg7%6>=N|6ishU??(0|~AS3r~3zkMuLAI@Hr z+Z0m1R%Un9>HEjZmlS_DR=zJf<5&FB1$I-|h4ws?7l}w-@mx(bmd}1-P^9*(rB5d4 zOm@E`{4ubxx3@-ai|Jm4+b=(I=$!~$_;^KDZd~*G;=Dx5m2Qp?ZiN&}%`$$hcyXcn z$0;no6PwcxC|+OlQ+egj<hG=l?@nvfY5C9K{vnw^OKkb6g4kf2$8NuMf<MGC#eULx zIgQ<Q(}UQGGjE<PsNQckdH<31Pa;3OR@Ez4Z~w9U)JBu9(%b*XeaaW!tNgs+$Ey0- ztozrxF8z7;`|3Bnk4mo}knVYUmSug$?f-Q%f_a-)tw{B~XgOntxYY4UubI}Zi3wfx zpo{gq<?L71cSLQsq$ss~w_M;ebJ@|Zu!<8lf9rS1GAG=QnaUl}^FT@OW5<sM<^FpT zZX)uJ_Oe`ipzJpJavIOkO{d??>NDJYKy}(xp07J%=LDS=-t?VCD01=<AFV6T>+_AP z7ALNFY8bmRB&2W0#5tMMKfe<6-PbL@rs&D8v)|_mFW%W198)|gIVUmBx-z<LhuV`j z=cFs9%FNmMz4Nn-yZ-!Y1^pxUi_@E4Ypttow$@Af`#@=(M2&d3Zo+F<mHUMzc2C#a zTsx4jZl5@<Ucd0)fw{cv^wu3KJ5V{vZ1uLP$BTa`rM4t%o((N{E3>CX*84*2xwLj> z@lw_p3$6I(Y}==Q=gp37w$@90@zx>t`pk8+jAL)~+6o+z<STi!YpUf&{Q%3&OsRIo zZ*qd_<X<;4XN3IYa@(WxR73IpSAM;Ok`G3k+5X*o`NywuspW6Yb2^Q?UUFIA=eTAR znO)2F%a%EB(z@sOWJ=Co$ea})YP{vK(K)6+f5mhQD^D1fMkmLXSjT5BTfR>3SN6&m z#}Dt5(h2In-tK-zPTuh3QVAtKmm8H?YU+yWpVZRCKSn5Te&~?OH)Gx>jipa__sTyy zw9?gP;*Wz&^QO(yd7#eyqf&X!{Nuf*JJRjC_2-1xKCPXne>ZMgz2eKdM9V4fq`2~V z`BPI?hQ6x0p&If`>)N8&xRRnN6ND3rZ|gpKdTi4ByvEO6&BaS)R@K;f_U_X<z20+L zvu5A#N3Rd(cd9<F{%ic}i?zPlxgfc7678OvqN}I<y4_gvn=#q+fW*Ct4Ieq~9j%s2 zSU>%@K=5}%l{w6x+}o?=F8XP=?Ujq@wYPjN^=Ibm$anY8#7P|vlsVjc@3ZEe!0LU{ zUEgySoXIc!A2<KZ_bj92ihXU#4|LuC8Rg2VKD&Em|MX4gi~sBM-Pf1*Jb(YY{{wm3 z?e`7->OWY2=_6z!T%dyAz?_|dfkA|-^>YczjohU{(K#Za67%X6Y+f*bY(1u4`N2{6 zvDcww|J@!<p2^y22PI51+uknZd2^1(+SsXgNqV03^mAp2)AyEa-=6EeJ>b<U5B(5b z(VZHOJ|fJfr<jEnF{)fuSQKzRD8TUJ%Q-dAcmMhS^S`;*V*e6hT}iHD!Mvxzt2X!w zlymqSAAZf0n?FBs#^wIKQg{BCZvJ96Bil(j#bD9uFy~3)DXPodHZCaO(&t*U?&Spj z*6k0(Ob_LDJ$SC1R3WXuW#5`4(dKQ8Z`1;BIx%i|k|iLK-C|bo)RncbQTo?!sr64; z<5n^+F1(tR_2zm8r-x0-iC1$^RxM8c&ZHux*%K}0x=J89A#aI##i|QU$rHC_&H1UM zubto>Qz3o5>tMzs<p~)_PaUfd{NN|UR;>M9jXkYJI4W{)K+6yB+1nm%IP~hS?Spl} ztp!`pKaaTkZgqe8SG_Oazc-7EDGSQP{b8tPh_RCjotpJ~jhzL{ES`@OgdVSMyPIm@ zRAIgP{q6XCo_-mI?#W9$q*cT?vt1nzT4&C%4a=9QdCqWTcJiVXCeAgrJlh|fP1x5k zb*jUG)xC+F#awwSt3%#jI+!EGIxDUJdWP`VXAe)d)?Jv_vP0zY;zeIN3SDNmwfqU# z-q%pR=aB1*kTU{bm&nvg?U}IR*r5tp`GXG%n-uIMR{!O+uvx3CRv;K=|4nnX{QRZ% z^+_z}T35OpD^fVM{lfQ*hIg(GeXYz~)21HSt9ZZp-)7Cm|Iw4u#lIhl)jw4;Rik-x zSWj4~QDVOEx9tnuZv0%3xZ(Plyl+iYH?YZ?%54c{e>#0_NA$W^ti0;))0WzvWj^`V z^Q3!QhGunKu+0{J-!4tl)^9Io@}1t+<}<~WRZGy;WW}<;xYO@sKOF6uHF2|sepE)# zxrN%N!)(^wKWlINphL1`C)Y1~>-(0O+k>@^{<=6ZDCR87%0k(gGPNav%l%h*Bu|p9 zxqdpuW~<Kr_D{U;&1JN1zGBztU+`$Dk)D=Eb-cK*N$e&8pT$j+3uH4_iCGCQ$y&Ie zyv{>^U+w&m%`x-;Yux+z(O$G8(^PiL-~73c``+IQ;tYHmBU^n=^D<LWH><*p_dg}8 zLZs59_!MV++SAj@Rr<lYY4i7#;H^1gXRmH@wJjAn`?IdS++JYgX4BKht*+jDP<VWz zpPBNvtivnM-}o5f-sj{0Mt$+kkcmF2)w@iRbY_<NJi9XEeNXAp_UiX~mU~yb{MvH* z$$>-f<^-BlPf9s)H}qS($FIK0^UN>TPl_qiPu%z8<?)#J8aGq7`)?2TNNn7>$s?|4 zqUFh$PrpBHU)f-wt~+;%?(8!=&ggd*<^N6*)eSC)Tv{+gq)wx3@|^N+k-TlbF_Ln= z@xFX<pDxu;a6Fytr?S<{zt!OW3-cM?YA02#PXs>mes<3H)W3V5X9S-)ntXjSyL;j? zhP|Epl74f%{3v&0x^BBp?2CDdt=un-G^?+#STX0sgze|fi5|OreRA{j)rPL8PhXlc z@nqI1o6n-Yo;#lWQ7L{V_VcRb%uM?t<;sFT#h=7MU5`s92_;1=3=Gk%_=+}d{9TXK zA{CXyy!<>BL$p3eZ^-E&;XnafbAGo&A37F2Vs>>s%PiCULrKDwrI$5p<`i!8YiFNu zEuL&`!O#7d)4sWv`|g9}#EnG{+kc2oOTB+`hLBO$?AzOS@A98-SDU`?@1H-c2Ta}> z&B>d(jMuwrpY)cNFFW%sFRhrldXeOfL$dPEFHL-`%G;AzeA0O5SzhxA`>qNdi)mi9 z<E8zBb@_$Wh7*>pn%8^j)xlZ1%hIOL`#Am1hMh5n@66|MUe?z?x^>O^T}|fMPdba1 z$~eyG%k37pvLR~if#<x@5~d%O*tRTMb!f%YfG+QrHP^NF`xyTd&*#-_duYMIYs=Ft z8+fj@fM@alDSpoS&ga*t>h3=@;mlL{moJ*<IZFNI(X7AvN#fkGtc$AlXD_5zZa)(2 z-SuqF`3Yxpg?G-WKeOP!<i!pBiXWG_2tWOFH|yn%er8FY#|noZzI}D4<XY=@g9)WY zCNfDUST;RebA9frCC7dj-%a?rs!!Qs*1^P{Rm*~{`nF#@F46aXQx32C%41nZ8?>Bn z1sk>r@7^bPDn4D}h92|DBiFCJ3IBeV^|ta1ZtIk;J@=*crzS5^6xx<-xBTfGm8bvy z@_8QT^hqn=dj6vE4a4<<c^jPUc+wx0bl*NLqW5KCOD5Y|&3T^=gx!Ak=&Zq(&0&Y9 z?qBnKW1r5qv<VDX-}cV_QRH*;f5y_q4U3re`RP~P%bfJ2+53yzd)BpW1+Tr-u3l7J z;y!1e`lrPS_PG~p_MN$|6u;g}^G@aL>Ujz;*~OP+TF+ArpVqqn)rHqD)<$Yi`rYV# za^@`I9m^uNgrx3TR*}>evBYuJ#eUz&UsqntQ9iG5I%LZSM&|b~Cmry$sy_6f{LJN* z+l37}6gNexhKKC&GxIH5v%}`2sIu^EiJu+GqMOvW6=bPRz11-7j>9M2rz(Zrev=-v z_hm@TOOLJP@<?R(D{(yYl%2;t$vI0We^`9))imdMS)06WcN~>|bjNvH#2)jXqKhZz zicJriEZF;H;TN?Y-Y@<l_79VoTwcVsPguv%E4Xk~+v?aU%MNecthiLfZG-xfC2o3U z8luWxugW;5Pn4LoxNBy|9aE+03b&&*@)9eAH|Hmt+FkH_)$mQ|g{eW4)&e2NyNahg zmnL$!D&4OT?>4=5?o~qSt%!%ZDjv)_Epptuo9cYKOO|Oc-QhEwe8u;s?TS?`;61@6 zPovhPF*7iT;2lCBHXj?I=i^Y{aOqT$x_dReEejo5l(y=wyd=bw*`O5SG;u<c%g>D2 z9n)65RjE{Do-Ao4KW*3B_=3gDtIcAs6zhoE9uGE;{SkiW<+aBj_f1x0cjAgQc+dXb z?tA6Cz3<P?|Nr-wb%Wszp6S}k$)2Ixb1ttexEq#p^}^(xNi(O*^v<rW?aF&myI4r# z@b~Vpz>8CsynL}O>fy<f#ywLO)p{G|hF*LoyH{h+a+}S2Hn077aph6pr_rh_HGjDk zE!}XkyDV#C;E9@>PrNkU)#uIflPx-RbJ?o=EAK*-XFgVI4c;HjCFMV{X?v2Y;(-e{ zIh>q27OqwMxr+OE!NVg*JTlTUuJKmid$K3LMe)^2J*ip8?sj-?4JynLY&>++C8RFI zOiU#EqDJ1_R~wh)Om@%kx*A$NOHtUG_n*mz#!yM!39}zMxA%n25!_ua@yGDve6x~P z!6T7v4Y6UmZU5R_t*(i$boSg)7V=QTxjXCblh>=xd1t=b(syIxF%RA~6AwR><`kE# z`F?Vvv01^M+!U8W&7QbD=Py)yaeKZH4p25)7gGC6@|^73$&tzJ(d9C>{_LF0Jc;i5 z64sT<tA%f_yHUu*94Xl>!KK{C;=D+(wP#T}&!OwG^J4wQ<*inoyj$YoF)6CItWx=H z+-Zq}OT~Dazr@+>+#z&KqUqGPZQp+Ip1GFNle~yk{*hH=loBh?$u`p(W!F_p{dEmD z==^<aFvl`VPiy(<grjpV>p1NX3-^0p^5LFa5U<yX3$gz<q|1hCcYZgKc5^dX5TcvB zg|qkzgNDlW&Jd-t8WkRy-JcGu2(>%dbU<12dGgK4y!OIv-B(HiuXfo5g?OEHyK-Ui zqKG3&JN14zp7KAkN7W$Tc#He#7;RVX{>9%KSKT@JblG;ThsAB$%a5$F?JBIf*c4iG z@<NJqsM=Tl6Q`&5nBEaSvTspkc(^X-{VfmnIZX7bi7hnwn9x6U3d>dF2?0|I<-`w} z_^r@Z>g}?-=y3Y>mhK+OC9E5~iZzp`aO}^Wc<kh+V9f$!{ZFb&QY~9nU2s^wx%{SA z@PZw#JHMPO3cJ2@=0%ayk4)~~diG^eTEvtos(I6SU#)*OXV*gQZOM}gEz&L0CZ1n? z$asdZjiIMb(}Fh_qy(F%)Y&U1^<2_=cl(0heO)WviLLXmZTs<n+vSn7{sqbU&Uf=) zoMP|Yr)b3T&#iUe#Z{X3T=^foJ11yTT>f6rf;W3&4F509xz1b8@#yjHJ@$2>ZOsR+ z>C-cN|2D0D+;~J@;veJ1BicOvY>(}gFA3ja?|oWZ^W<><1g6~+{_Or>ugqg#@++w5 zzpIy1e%sDFE}K}li~KA6c~sCrewSxmS4!FCIxh1UeHK?N&L>F83m@hS)a`#6-=cr< zS4x59M=8HWr%H?_d|1I&&7^m|+LqDL?8zivS+&{!cxUd`FElpV-|oM=sXC%-&4qKu zw+_$snAi8@dgSNbuZ6!?|ELmQ>)iai;sJAKZJe++_eN_KGwp>XF7KA8m-o1Qd%R8C z+=WSgM^UqrhwnRK|8+MsH4a>#w@k>l;!wW8q60a7{QI2V%Uzpqy5{%IRe`))W;&Q3 z;K*W2<<Dx&=zhnsJ0RrA+2`tC0(P{Cu1nf!Jzas*;Er(d;-;#c+4~rGG0N?lQ8(k= zEf#MH$bD;nSOWP^u`n<w;yufc*s{_Xt*o318fOg`{WniHTcxr|dh5c_%^_>29tnG- z;TOWy<te<}&+vp_=i3$?2enI^ZBJ&nN%n3ExD}Lf^VGh}o2D$C;S`yq)M|D?q{{Em z!}kx>>oR`an=EsB+p8(XODfCX?f$-Rcg^>^Kfhb&@8MMFuII?n<4rT(7R~u5%X3$w z=#6=^XKI`|m2`DtomT43d9!cjI&j=6J!X}kDsy`7Ng1nJH!&vWxlA8j-#uLQI%>IW z<^t~p&$msKo!ay?f=N2u_LPImg45dJLCsA3&$jw4dtk}OAJkN~GK6=^SD$<9SgKie zHAlur9X%YBeWzAw{~cRZWqq-f$d}qPT`sSRFJ<1XGCQgLsfp^@Q>xo9Bxqc$h|XqR zA5xa0(Cwx2Wa`yT+cLi-T)o=&Zb`!OwPi<EI9NOlWq!$RGa=rzN~^U!=Q`gvu07Yv zkH5Ih@_XIJzxInxJ4^0uzW&$U=g0+FSN3bO4K}(3O8f5Nx9zGra3nTj^$K?1Bhq`~ zgv%exx#pT}<a-}}C9Ki6JFYKW_BrSIvYFc_wtkX)kskH?N+oAbw_@*GwRcBry{g@L z6m!xYn<95BZ740BFRrk6dFQq_LMm_Lnr6NUib<L7pm4k4fL?6g*A%<X!$&RD(re#4 zEtao{m=(8lTIJNNkE@iLJ>MS7nArB)Ep&zav3nAWDncIo+h)i*O@0Z_8*zhUe70s& z<vlrbGUWG(-A#VPAlIEFq0ExEHD(LbO^YeN8$~?6ZoQf}@uF(IjC^37;C<WE0?7}O z&#VsBv!2fK?&a%vPCMabiT7@D?JV!I%Wrf<r})UHpUJHaylvIjslk^V^x$5(<K{+X zpCu(JCy%I$aP>c$;jq7Kh13nc+oyFyYUfWg4tp^5jZ@nGIJeF{lBJ4s6Kb|ae^_c& zyFa=nhE1wvv6@|{|Iq@W`Dw}b7l!kGc*SjfX)b4)ugH{pnH!D-Ugv)E()+jU@grNB zN;r(Qn<T&Koq8m)o|W0Gd8U;7+?dMVyJAUE=MHr~;_>3z5%nTqbFEF%_Jfk&V@|Tn z7mk>m|M10}utgsZDjfb4bG7J(&+A`dVH^JM=={86fz3XTe(~?>O!v#u+g5K24te?8 zhsS@_J|6Z}f|CSoTxVUFpm$h4!}LzToy+^1u5NL?Kkwl4DLd0yl^U<#h~e9?OjJ1j zK(Qgu!^))}Y_y+M7@t;(w3ra_&uHJG4S%lQ{yFo5mzI5e^qKx=FaFdhcddUso9Xp! zrQrM0A%D%%W2@hoscc#K-tD7oP5<268G6f}v**Np`@72X$HcCe$7ODxY|0O<s8q2v zmppUoiOI+3u?tEzUD^{|bTWcPf8+A^1s^M(?m2b-*;MD{qQ?$jeVO_8u>Z%+8lS%w zpEJMpzt!P=^#$V(+G6WU$`%$x-wXa)c}x3;FVFsCGTnyC%=a8xH&5Od`XF@bo7eUm zU6K>Ck6irg^)&pWb!+o|?w;+I`K53Fg>tQUzrp@U#D04%`&%U*+yz@c%uhaYHq}&F zWwzIazokFTnw@G{eWKHsN-=J96=qwv=_h}M>#MaF*Y!m{^;~*@TPuHe(Vi$P-M?z; z^S-aBJn|{`>%Ej&i`QxYW$p`Isli|6cBkoa=!`Z)$um{2c5tqLCH}-Q+Oynu#pa2R z3wRst6c4>TYk9u^*p6ABs-E^-*H+&X_xNnNU-{mmZLg;W&&p<ht5RS;fBomTZ1)$( z$ouB6PIRuS=AC_s*;M6nX8<q%QsG$BC6_u2c%v`9?veT>G;#KeeQjShu9ny_&(9_6 z#FF(%&r@f;I3oQ^bJGqtCAZTKY}J-a{<*zMc`U<|B)(wf-5%!*t<xS>CSMI|-(R`H zF5&AD+&|&^(v|#1i#9B?J2HdEcjXGDEt3y#bMuisA9#!9NWw3!Urx*0cBEXpzR`c} zXN!pA?w+}ovi=-BrWL`w_tchdsBJobMO3DqTm7}g(doRUC#G+lc*XhnvHvTlS*1OH zC?{J{&G)cz`}*?_<97xqO?mBAa`(VhmvFr~9M5^U)V9w2WV34LiH)-j`qh-oH<a<+ z?evhH9_LcQrypRlYR`@~^_f@BADh4K@#oGA+4v_>$EUxlNR+!j>-cx^Z}lE_iz^NP z2@83B<cjP2zp3xO*^{ZSvP=K0?E4wxvvWen)q<Gc^Iqqb+FkU0&ujOx&O-3f=FdjK z_N~DaeBxqqME3d=@TXaxZku(rmh<lR9kNCj6nVA^Ol52P*WDMblhB@&eN6X_L&*M( zUe3Dq@wwA^yX;vvuWhLNS9-8$`6lT+QI>mw?50b_`&-@aS_JaHc~U>&)9x4l^8Rgh z`E&S%>N2*DW$qpG3Lh;!vbXrp7VGo>wOuaxzByd~gI9fn{}BV7OA;4PoE7rlyX3!< zOWA|WoTH*wGX93ztX`?XbFtq_P*dd9EDrvM?{{&xxS8E3%+Ff)s_FGEe%?Jx&Hk~2 zMi*4JyPf4=XJBCE!#BF1OlWigt%f}s!&wt@^{V~%d!BJ=pO_RC547kyOfm4}nB8z# zX}5~6gD*pKZlQ--ipoq*V_~taTDfaW*JkUk5Dj0mH8fb#qu}7ujOg39YQw#wx0YSp zR<<$p=fCIs%qP!0=_B;}cisK(lV|RHzpwhd?e{m&??~_e>3Dy#i;4eNu30xMtK)nX zBs$x6TmL<{LSKr5HCrnB*59>vW&dq(bP9OLx^M2jS$y#Y(Pw|H75@>vh)vT`S-3gP zEviP=&T%;p*Qz~t#Ccdxr%O+<KC`fx=alrb3p?3%vOF#ORkr?p7l+W+rcX-WBpicZ znYNkgF6`r5aGrr_?%cb9_pkBQ`_?K5#j3p6vhbMBI)C-Ui<ZuK&Q(@!wzd85zOXgX zE%*DDU68t8w*PAQZLN$;4krqC@b1%Vh%kN8!1Fro*b<o*Eq~>ZN}+{Lv0oSFE=d1& zwPLpRuG_c%BsN&rT0EXKF}tUY`CzV;sPU@u`y48N6ucj|-%C)NXa4o@m2Q!!?m430 zm<8)Mu=dDZJ>TQI&q3q`$Eqy{%H5e|9TaX{l0EhyqgP+*70;F{I@j&D9$ZmB`(9~X zxBd<zkt0{~4oD{|@7vdHc;NM&qm2m)yF`wxlL%UtmLsyI;6$S2(XQpIx+JB2XZZxj zK3R~dHZ$abis$kfCQWWd*}FU!uh}OV@c5ucOkTiJg~f?~SMh#beVWx*Zi@WVZl6`l zX8NsKB<1*c?ZSt77nWS+KYIAG<=um7HVkia*2LJK;NZ<#H~HBG8;@4g4J&uAKFoi2 zUjMw<#Q5u$|F%7SxFNq^A^&J4^Gd^H1Flz{z5iq*(iP{vJ7g8-Xt{6QI=+V4<{BR> zuk|#Zp1Eblv>hAD4Jr>Mq!?w)^mGk5!xO>SDABg9Az?MkTq~KQn>4l`^IZM%j0ks5 z=1j+}dV84qF1InBSx`0ED}!h8u5(KY#V)1K49Plq-m)o;C)$%IOX$gp6<e1SFYY$G zpf>r~WtO%pJiMC(qQtp2HOx_8vA}Mnd;aTWzh4@)cb0UTbgIwguekWlp@p?LAeo=_ z%*C+SZ1$WQ#+G$v71Q+J9DZlbqPu#9bd;{~y23vDOLq^}CEUKCAa<MiS_%8t*O8K? z6)yv{edUrQo0$wOWdA+bma*IO_R05)xK}7Ibc_1p_%LDr%uTyYI(N?zStQ%!7M?QU zqZ8BG*jvThN)M~fzTzt=Zn3dAMel782k(Qg%fI<^vy``OW7dp+el0A%+5T1b=dCWz z4{h0EJC4@MUR+}5IDh2|c>_`ATh42<YY$%It6#FmPUP0TyIV6Bygy;KG1Gr~eW2TI zgM>p~9Zty%dWV*DzZBNn)uDHAnVx7!jG^+}{HUAX#S-_=7cseJmi*5w&Hd~tzIc^O zPj0hu)kjU(ZFf4__sw~WmqojnoOarD{GF~Q<|W^IF#J-e9?w20rTbzp7|f@KUEy=k zzWt@=*{i5s=UC(F`K-@4C^qN4xIZg*;o5M6-E4PRII|n~_Z+$z8lGalk9k?r!{`^E z^>)q7Yjuf}cyUXlW7~DM=)b#tZyi5W!uYm*<!KJ1W}AESboz@~-pb$Fn|327EXDrJ zg%tIvO>0CW5+27dv5t)7>oIwu_rmk&gkY|ha*q6AJc)Py?Jt|NPHgkms5{{<P4C)$ z%75*e6qEUXf#csz$F477f8nje$<L*AQiW5R`=z4e<Dj03%KedEvr~m9|2-G}GV$2~ z<qL1zxnCwa`n~;R-o~_6r{rbO?KI`s;PNnwD@;Z0fA^d`{vtqd!4Uzet*s2Zm(G3r z^gwUYLFFr_rC&08tz7Wh`Cx9;WV!UC>%HS|)~((8)KlEn(LXW5&G0}z%eH5kF0wP9 zy6|6k_AFA}*7>~Xr7Lf?G;_^0<%$21xP&F7VqRRrrh4X-|7u&}F7Mg1IW@VGMQPLL z`pUgq%x#JjePa)K+<M)lpnqw5x5veD3$2yOGpjVMW1lH4SbO5oVyk<PzQ1JOb5uU5 z+uo^W;*F%a_a1-BDQ-VdRwl!8;V<XkEgXV>&kLOX5Ww-~PsvR0iiVWj(+R)o9ru?w ziqx4NIJBPQ?YHfD4$G1*Xe)H@KYYLQiHUGW{AEt{o*(%_iLFy#Nqn)^2vyj0>b@Aq zt&i8zCdVx|kNG0?SML1nKY^3~9hmmd^jEUj!fj5n&Hs9O_Vit^y3Hy2gWJU>xsLse z^W8v=gZC{m<#Ia0n)h43l>No-u=~@C_!Hl)w?_xM%(}hNxm%KXx6d#0zsFs9zsy^3 zQ*t>^Q?uD5`5g_1JWqr?yX$WL%jy)bqJ^ha3d?&pjpY*#F;3ikqhZaqtM}VZ?rd_q zw*1S>hn0Sb9O_2Rx&Ic}%VgYaaXEEvkr>aT<Hk!k|7uP-A-;?|ft$rwvS^2*n^IXv zTg3W_tsy*zWjg{Folxa+-MGNGZK55&labm!jl#yHWQAp6vJYg|nOOYY9sMV&X>!sw z#%-(z-BSEF9DQ|Q$+Q6VnDQx4?{pl?wsgC3|Ky&wqSU}Dxm-@>FN#M>mp>B87rk|K zw;{`$FDu@y3uB4&RON|vl2~=-U}?ji6|tU1M_0~a_Ar!vWfpK>x$InShh)IBwF~e1 zDq1HCo3Oo%niO#4wCu7KBB6Q@1+OM7ZC$wFrQ{Ly$?wfvduL4bKh64QOY-4ex0W@E z_|H&WV-kL*_|ob}CO4k-yyN|2aD?f=iEm=N3am_YHy1zo9;Gj4*&43HmcFaGOf;cx z+79mEO($m5rFJcS#3SCIE3C5pjM-7H8&(?w);u|GDf5k2>*F-1wPM*7d`3S!oBK_7 zBxSN#)WzMOrW&=%^r*W_?Y<SlyeBr5|75yoy09R)+#;jv>$HS9Q;%+PGHNo&Sn$B| zrcQQEhg#C)V3RK1h$VYgFSZWiTjCs%B7FB;_k8Oq-=bQlI*MJqwfknP={aN9offTu z|0BNb(BPS_u#HDZyj8bdp~kOp-wm$7Z|`4xD|Oj4p>VTi6zhqn0t#CupIqTMW6@mi z+#r@s9xq-cXn(lDXJh>6;CfTBxqcTFn|6uak-YUXUYM`+SaMBpN#Q}4F4>zgZLSK= z3_p*~d}`)*SW$!L<=Zr__bm@L3Ai22i)if&IQ?zeg-^0~8x2fs+vPU~-3++XQrTUU zGFNz`&h;sZywew)bmlQUlDa{9;(^u$r_@iLZ+jB_BB5@^qoQun`Ham?3o{nvp8wRx z7hH4g)n1{d%$rB5xc~ojUX^r=iP!qW?aI5^zJ-F9GuHozVcL?r_~v@vz1Ia#OuXiP z`|rbwgTL=EMjm;jc#voDv$O9GY`nXlUEAl(mgl!t*q@1J`<*X1|M}XxSyNw`iFeiJ zL<L{)Ik}}sD=RzFG*5WDaqoMHncDkii2To6clBew>hFn)%CWW*7BT|mqJe!oq_xvs zuL^uWB>kSt<@R+Jt3_{Cr}1iEy)$J-W9vI{_RmLaA2mANvN)mlJfnF6-|W{j9-V%q zc<*bto7AJ#Cj<9yeSP-unLF%CHW5|{!Y>6sW(Yp*n&-0A_OTl8#~I!-kN!+vdu;_H zw~~j?Ya<u^E8Cj=YrKq(Zj%mPb!yri$w!=T?&<xDihU`1q(aceMzwF}k;zOyv-pA< zqqJRD7$4pI$nxEPtB~;H3Nku{AJ^(ha+Nb3`}~Nt&u(9%!g5uXO-+ZE{g`&)*n^`! zEE^}p-*5GatXcm5h2mq5+@AQNuJ>K<8?#a?AF-dg`7Za2L-rKSx|SdEjPLs$yNl97 zmfYEI{fghM<d20d^UW;drGk%^KT6kI^SQXC>t%j;3A<I)%=-N$o$(h<EYvxs+uxWK zmUnvAk{h2lp3r_2+90sMO?l0U2DeWK?teINKk52Cn~zdHQ5KcarjpmUa;$v)f9}2v zZ|f?-?EKH~*$$W=d0$zbuk=ZiS@!=4!%U5N*-N|Jn^fw>@(qRZ)l2M|Go1g3+G)Od z|LVimABhjMn`8KVo3?GbE8h0?-Lu1cd9FU{;oh(O@10P+@CokEYhE1P|JZrCOZu&a z)(8H2@9E|V{4;xQ{Ph0w65VX;xV#RlXwP8x+gAQNnq{tKir@T&%FdJYU#vUodynT` zHp8EzzP<&5&9c5Kd>QO~Ug!Q^?l(^}e&UnxMUwp<uYuiWo|QLtyM0>f{7gaqe2Sg< zuS1M#pDZ`1&py<+V*i~9Z41t9D|?U-mjANkl+8<{qgM;=t1Q)A@ohhkFT2ixhmA51 znQETwoTBbN^U;cmIpLaVjXy->PZV9yJ-%c~?dr!rmn$CUwA!mF^0jmd>u&4qzYeD^ z+-5X4`r4aEtV*e|{|cft?!3&`y}fJsnRC{sEgD_@=jpiKGTWR}85yo2#L2LEQ`ny8 z9l2if<|JH7QBb~HB=me!)!|;nCv}^6ns!~je(|mO(-0M%qOLj9^nV@Mx}o6O2DY$+ zS05H=<eUip$?{%t`W!uNg+p@%9vZmo?~HxukiH^&!Tgy=Cnlt`MCCKA&S2i|wqeio z?Z0l<+?5Snw|*+`ls`LGMXEP6iPdUM^qc=y^3go!Bl2(e*G#<q?Do6oZjt{PpYIAt zHqW^5@cBzm9&6o`U#~~8+ON~NHmj&HhGV|U#QL_`&UaJyZP<V2`lUzg$xXLUDQyUP zaKkUUNh!5aVaH4TX76N~pCLJEk-^mr`bw!B>8ERCWf#W&3w!rP-S={UwZuo;)SA-@ z4_-Tz+~F$Q+}QYZW|aLExgTv#3WqEe(<e{7Iyd&B?Xs9-p}V=C6y+?Jz2LhuNdCf! z&<S(jCF}`GIAyv>?p=gZbm`U~O}j$QsZKoPvLZ9S*&uV#n&gZBJG#X>rg{`h-ecOy z*QW6D*AcPYD)-POer`Kd&reGKT;k`p`RRS>CdM1J&St46Rel{mkdt#}+9Z|UOWz*F zEWe{Nn|1ApIN=R#{6Uf%*cA>>dcKq4-D16+j%%Li3#?l*zd-Zh*JD1eQx#X+JNFqp z{dwv5k~>yL;fG$Yk#h6QJR#UBw5jZrf}HWw1s-|YO3vG6KT@+(n)s<n$9x-`M1*tM z2gRcXYd>ySYj#5@WwmV4NxyTImh<K3)&-vs^4&T+a`Nq0`J7vlPD@{UV)KrDZSmg! z@1|Y4<eFo?pmOIe4R@cN(dubM{3eH^EL{ECf`#wooa%mZ)aSK-!|UlHr@D=0^P<n( zjApt1)zhq5(T?k6%|6zK`O~H=H&61|(Jl1iM^tTW;E9iK7M?GBd~y1pHG3ur?&j)< zjn!DMqolsR&TH8ey~Bw|m_HTw9R0fCTBPu?uL<&ps-5q36l~$D`}C})Qh4ulbvp*< zM5oVB#6KtroSghSaaY()yUWpO6Ak?D>79t)c6ygg*tV_F(T_I?Jnx>ksqDUAy<}5y zL~;CvtvtKVJiE2ZVT0%UIWyJwzffv^TygkV@8m}nwfDr+7R%mGIc9rm_mjJ4{#P5_ z)$@8Y@q4+v(TbuU0(^oB=Il@7mS}xqv|ID$gR9`V*`FLQc;D0Cf5zQ&p<8{4M5w3R zL+wwi7tE}=F>l-9Dg9lhJt6*|H2=iZY8bI>*s?g^<5Kb`0dEH$p#qDOztr7Cyq+vA zZfBVjIj3K2qPN|-M{71G1>2nz3Ra*0X#LZfE#-Zh^Eak^icI(tBlvW)!?*WE^ZYt4 z@qJ(ywG;SIdGh&!PtpxP&N}^c5}e5s@_FgO>#3*SM?}<`7wU!c{m;7|xOSQ1{_F92 z@*l!}uadWT`u!>Y!_7aXIHrGiTye1MX7kQtI`umBj}D!fpOt6!A#v|^CGH0Y&%gO; zv`VvHum0enkKT^j?Wg~)x$s5Q@aHD(um_@!ORWxZvN(E&dGa;<IMlKK>g!XJ_dmPz zX}Qq$;}$bmC)VArulD(#acIx8Df=g{FOFPn_W7^v&+29WW?PAzeRV`)p4=aI@dJM~ zBh~z*Usb6u7mU%JoPTnAq`*HWM+dEF^PW4&KaLvz^b-_4v7gznR%ZjJ*s1w9>y#b- zF8?F$Uh@9a_1QIZ`2zLdFDjEbUi8WKr``Ex#?mcqmha}zDU7RCcyayb52fIVLNgYr zO!iH``Dbe6`rs0E;lop$pBikqbL8Rjr5#V(PQAAOv*mXL)0ERI=V-;>_mVsp7`m#e z`T42?tPILO{wXgnSao5FVC;-=*MP^dA7>w47yEYM)_ok|Gut&LMStH>{4h}|CaG}S zmUg9o4}K+F5>2Wuy<qX;KCgG~fwgNmfB$u!c7G?E!Krh6*IO59>)e%m<)WFj!ZRj$ z*2jf;_S1QG*yp->8Ef0INa*S2`Skw!U+$!7rv5lo^7BfWCP9vEEv3IU+uW#HW}l^1 zYqQJI*F1ImIsYp>!Pko3DTk^aQ@-OR8=u=dUo+#;fz7j)Y&a9Lxg<2^tlZ4i&qOYA z=w({#inH|1cx6(1*7Iz7|J}|j$F;2H{(IQv*Za0(;kM{h^{oMO`P$d)sX6MTyz_=% z>Q9NZCua2}wc=a4p1-#Kd)avB-=6Ki#Ch{mrd9vt|63n_`t^FvD|~^IukUkTTM)P} ziqn418E!k3%O%^6ttsnNzbeJjoAay4DOS)<^Mrql)&>90Y}P+1-{R#i=nG$G|IvB= z#GwhDr6yA!u5%CB)$07>$)?0b9d(v_pD49wJ@MxGc6HiKGrr>B>oaF>;+r?;+gFx( z4?12|b9qK2G02CmGOM#aBV21I5h`EK*?()&Q;B)GOlvmj-!|M+w_dlTJ2*E~;A-j2 zY5&%9mGDI0erG1`;QWkx62I~D55Adpye`QupSbVYOBkr1Ua0468j`-vId*SGQHDXi z!;Og=jQvst`ws;qPVXw<m614O8an;f!LStdH$}^ihJBmvmvwvE_KYuEKO0`j3y$%a zShLkV_C)&ge>J9&v1bG?cRw(G;47b2c4nsFj-bhf71zFsM;_nsX6=kQf3HL=C^tJF zGJjiH+n0?hABz&blC0M*D)Ttc<H+}-<nlooldI{X?C)MlMcmE)YI}PjgUG7$g)Jeo z4J!l8MJ{@jDz~>?SASet#Wl~h^Yx9+o>u?;H#zStvOE8xhVjK4?L|(d%J)rf@Xi)D zy!v*I{q>dB6FT_|uJVK(c>Fx_+wEx{EHjTjUHh-YKIiJsHK)Hm%}f{lw)ESvA1lJL zBc4reI+=NW%9jhFf4wDM+0|-^cQt*SqjBd;eL=82^NoY+->z<c#W;Oed@W~5oj}&r ziTikiZI`^$T@?6A`-X3FLi7dkx6dxz*l2Vlb<RYY<?Aksepj1TXSP>SKy4jwSvupR zu4!*M?z~CgY$oxg{cC9Ty2jm7&UYV*{h!6KUpq!{`OK}nd(LM@-Mew6=f2xAOJ7A# zKBb}{!T$@zq9*<K>29ft*v|b?a_R5xANg%Ue-~ejc1jjHpZu{b=2Eq}-BPnXA59$p z`z`V8{62ZbtOFHV%?Wl*^YR(FJMVWqH<()O)>+PXapk;I&LIy2+fO`xxiHeUWL8y^ z*pZCDo^uv%r}-~>m8{>o>vhR@_rAcxic#|`zue?md9iqknaS$ICGQk(^%O?)O?)5d z=J9cRd(00x=8$7ScH06vbf+-<)yhdwy>Q>heyQ%F8QZ#rt}b@Znv$u#Rp4b<w$RIE z3C(IhKc10Zb8zy3{J!UgR$mt$nY43P@fx=DDCV4krdt`aU1bZKcobZ|>{@Q+Hdn!e zzm@U$W%v0?uNIy^_F|SqY<*AO7po1+mA|m&p9?H9X`XWL&X2a8*AINT-FK07Ue@-* zb0428m98zBpy3w(?b*)Hzg`$@@AtEFI=;uRJa6;$uRi>>wMAP^KkRnNOPBvU=lGtQ zp18YD%51AA@YL8pJy+RNSKSlWeR1~hjFSJC=l5NVX3t!A`=`X;tEHc1LoPZ0XSw&f z`(E$G--eA_-M@Ftk$YHVos{I_)6>_vamFVOv;EEMmd@Ugx^!RL`<+v&h5GfHmmFTe z&9m#`g4w)9FY;~d8qGMJeS#++o1c0iTKmJrFR{#)s#c=&UruosHJO^$a8{0C&63m! z2aP}8uMA-~yL!1S>%gYhFT$+4-!0y}@oe!63DZm8GZ#NQ@4iqq_@$*`U*3T%xvH2Q zu9`ngr|(lccA4`-k>p){wFT!H&a6J_!r?5pAWlWC^W+Tff2uA|O9S2Vv+MTjElZfQ zsdd?0mis!JTik4VN`1cUf6>|5r8@6f>G_7Lbbkw_w6JeomR(gx{`g)^aLW6-**~;O zHt+c5q=$A{uLQmC^d%=H`sjRrwxc*HX{!13`fF9Z<$4ym4ZHoy<JL#0d*1c^Iq&eJ zH@@sA-@X)-UMqffQeWq;89y?7YW^s!eJ`kcW?}B{6RbXZ79QSJE+^id{O)6+bBO)q z;nnWn12vfszPdQ$#?#WBv4$Iu&#pJv$gzXzHTzO6Z-ea<=cs?=Nb_=jBl_dwnknj; zt<QGc?UZ-cNm<ry^?LS-Cn{{um-Hw~g_@kaaAy8`-V2qpN-e(_>ijO8<@VfJrY7Ni zm_~$lY|nk~i@O+4mFb`OufuAx`FWxn^I69qMNB?6v(vh|j~s27;C%e3I>U6+|3_J@ z<3*--ct;-oX*6%`$Lk3^{i{BjT+iP3wacG7Y3ttETn@*y5A1E8wIJM3UVCQ$)bn;n zzZ5bYJ;hS%Hu16Ttd_fL4PRWn>La;#cMyk6pt_y4fg;ajna0Ss%VuuTJ~`*gk+Yoh zO>ZCjX7%7`y-vB8jIo$LN9g(;eLwe^tF6mlQM2vTq343V=PPDxwy;|+5W##r@kRZt z@H1?ww#M-nLYEinTsrsEsYcJ~b&}Td?nwpKM-QD9sx9O#*yDI7Blvxm^zoIE1wQTt zGT-JkJy`OF<K5GBdp$Yg+Rn#qvFprz>+4jI)l^{~xZZb<KC|vTV|`ck>Z9T;zAuEo z3w-U;_xu#{jdOvJ@WvF`tttB_rKtwUo?dZoQ|kWp@!uv}{E@6#*Kns+EO>p3_%127 z=Tf~Xk^v_hQ+DN6&Y3>pc;%xF7DC@$9;M|xSW$6j*_(XBcJmG573*!3=5=;Hc0XcX zeRR9(+r<g}KkVKVZv2tx^QWc!MaJ38{?2$48PWY&b~<tEx;lmL$O`Y*7F+-LpcH?z zUY(F|{faH^A3t--MeF=)c|YTax6hx;S!<Hn17wB&-~5u%#AT`S&w2Vw+x~;h7oUIF zDYx%C+l&{|nc{bse1FY&@9Gted&2LN_wPQTY3Jab`Rr)<zVJCN@+N|()N{W7G<ml1 zr>$YZ@!u!cyqUW5O;=xaRmwhfHSVNM0%_~L%H<bZZCibG(}~%a|Jcl&eaG^6rpXz} z+m~~HpXA&uK6!DazhPw4&E)q>yB1%%n<Km^qVKxM<m8!2MT=aU4;Ot3zP9P!oviA) z*AwRSE`K_u*5qui%;eytO@C&*`24K$PUX8hag|*uF&nNpO7Y9TH{0^@tgQ#D`_nIJ z+Y2MkRh*jp+oNfT_DRc^DoWF1rs-JtzLq~&w5jTmdHT8EPp;~H*~)YyKJjEijY@x^ zisZ%HA9l*}>}0MgRX-rNfVD*2^zvPU+20Rbx$A9yIQ^dI_sgFZo@#$lJ-cD+hnD`p zjb9ujJ{vrC+;WfIIBywS<Vst$8Iuz3az?7I-g<BD1mla7c7--idn>Ct#rfQ%&AGlY z9UE=hlIOW!Qd)I;5|fF05^MX`Cf;1W1!tG`Zi|ZHb4&`H^)557Ld`YcSoY@R-M6*E zp03(4a~?~*(DEM{VNWw}om%qpBM0vfZHfP(65rY<2h5)5kh^ORyVGWNOH)DPxW>w$ z+Xq;z_Fh`;@L*BZw2etSXQ+0*SlRw%nS0R0Ir+)P^R8I7&8ZJM-do6>@lbWrgrtyt zZ98nIIdt*2PCKzw^PB%E<0E#`D`&s$S$Jw$u&d9y8~&<c*<S^Bmi?KVV!`KBH7(56 z`l8Y`=UEZKg7rr`O*?C&Brim&UAu9@GUrfd2v4=)W`48H=AAjAoSQ;3)6cw$^UjZu zI8}N}c7jDS@71Iiakb8(+S3ZcZ&tZ-UkjBNU-xQ84#T0(vKedI{XagNV)0Bl=#!M{ z&d2;0PR~&|lA`=b)#bR=7OQ6G)i%~!oCJ<8oZ4M~t?Kh#z4b58eHVM7vFbqXGWWo6 z=C(T<`d?K&Njoq>I_XpLJ;8T^hCd76d;GikNVlZ_OJ9+ARkzK%z*-}Q|BBnQ3tZm? zzI-5NyyIN$k+ANArN>gHZ@&>MGue92;=7CYs#Ya=*6c`C`*g#n!E$-h;^Yk%H@;F} zGP@PDbZuv&`sCxGA2+lMor!X&R8O2VSFAbCIHU2xM=|!4j_v=PU#D69_w7nOJMG`~ z4z6oaF>93nS$|dkP${(RujZ17;}3T9DTdXtZT!CZi(nPshW&jje!t$Jbo`}8t?*j$ zm#M$DNqFCPP5C=%hM&E_@{9aiSxOS88u(smoat$OaxL>_CYRTuyYfYrERFdtdXe2E zXuDU!(K_|R5>vh7er@Hu#&hIJ<*xjm8E$-c&8HO|dAZHSu})}aMCLJ*b%wURzcZJa z^!aDJIT>fIbmnW1yVkFaV>hQYJXd3}33tn7d_S#p+QZ@s##$D&_L3)x<(#+lYr}p! zIo1k!Ca&Mpbob}f&Kpbo<Bsn&cW8U!d-T(^xSy4tUpqHkDb%;@e!4awe8;Y~E$?b~ z{oYopS@*WDrQLl+!6KuJtDa5Uv-$qTgEoeH7N?lVPh+ooy0_=hUk<6HPu_b!DfR}e zuVLADA@S|Q?4~<?c0XAjSNoi{NjKd4DYH>_?~E;rA2XLfIeT`G>iUV5{vXzVH2wW# zyW~A@skr_>fj<A%g#Y7Gm@D?{T$;++bB8~LR&$$+?#<SHDdiyk?VOqAot?Af)OWn} zQsl~iY3}fxVN$}+Hf#5<r|dm4{><mU#GB)L*RuALd=Aq;Tl@Vg@%K6fB=)NQH2f)V z7PU<MU&W;?i*x;&qQPvRemjRSPOv?tWB72lMD5)R8;gB<uVjZ*+ZdXjD%{uW7Vaau zyLgB9Vn*SYx(Qpjz9clS&8ROZl<%$TpC#a`aDH8Nf7jb<o-1ZP&AE4Z;y2G-Ej-TL zTNbLl-ok4++cdo->D)RM_NlXNr2O8fY&qcb_A-~J`o!bQ`NZ1hO!`o`MaazK^|e+j z{U5A$`&-iX@u+{{(p?_@GUk_QYl5C!!`dp&&Y$OB`2P9sUe*3j#qIKZSJAzyVHa;F zN&j`tS-!v1`-N;F>)%)#$NvKQ7wnIoe-Zn!`q%b~ZVRc}_`c=*PlS#rziyon%@VI} zywxtA-8a^6ZPu1Puk%aUWH)=Qv5l{5TpYfpY=7PCZqxOb^Lf|o3EqG9@UPxgF1?Ox zs#(v5CSQDhD7{mPeRaYq-6_kDX&(81;Hl72*6lSjPDfv@FlF@n;QNu&RPdR8d#-EI zI@NNf=^t0=GzZ?EBj(xp$j8msH!zr8V(TgAEk7^zY&MqM%2{=>vvBdWrWSqK&Pk0P zU*5N@Prc<3G~we?<={!8GhGsce4GDA%{Tb|{l<r|*E%N4{5n^5wJ2ITC`Yz0km{Xt zWO3xy_~)O)Wo&+ae=_CXtcYY+$K{MCcgXcV(8!Qt*_M#26fvh|#>^uUHOCHV_b%S( z@m{SvXqKAVMWMiHE*)1tzUcXHb>8iVrFGZc1&fW%cpm@0ViO^_wV`{ZL#+Getcgo} z#iG0?eG8tnM?QAm30aBH*Dl|j5;QBKn|F<ermv6d7JrTu*+orWM|d8*TljO)q-jn^ zu6Jc+2^mk0*r<50i#KcK(>GTnvm)7cM$Fd}-@NH$YZTw|yS{?6b%eik{0nhZ`FXeN zkkUW<#Wz&VSu<i-<KCWo+VaNYY_s8X-s4M}xzjs@Z+^4t?^2)LA5>SIIyKbutaf1) z-|Eozt1~q@BljPj<N3+fZ@btW7qwO0Q7=Q!u>SG4V!3@teR9ylnI1p0Gq{qLvi|sb zX=Z0silJ|K_Qdl~5|6mZp0t>}gh@B_^wW&HtDLpgvPRajY+6#XTJG8Th0(mb`Z}le z9GdY&Y}%*)D^eN?J63MKlss)$%CFU%uUZ}n?SB4}wYtb5T%+UIPT5^*dl)~3i7q~8 zt+~D`$j9{SbOw<pwwxb!xg6?0nZ>+!ZMlhG?vcJFdAUsAytbcX{l@p;PwlV9y>E)n zJWl0SFs`5bCjQ~fqK<#F`hM?H5!4Ad%fars-K;oq+lDFs7hPZrPmgZ=^Kt3NJIm}X z&MCf(nWp0(u6FQj`16-vW=6}WUewchwEyPjhuad2@)Nxlt&+~q@LxN*Zf?c5#qTa9 ztUvO6l?x{agOJVqMRvzp<?lXXO-<B{-?~lQrstxLa(Y;iTT4ueV$nn`ZPCc^vz;8v zouUQuEcaOP7d@})Tk-jOU}FEL&zcTCTjiJh(K^@8H|dpl{^X<8nwuJpgSoTsA9!B5 z;184T(tMRytDc6eVzT<Xeu3dDrV0&aozso~_e|kscd4<yHz}{QAXaqt4v)B;{6{u9 z{pPmUg5!T~;d-aM`O^$8vj*Kc`&9~$9rX}pTsZaQn@Y=rauM-6U0O|CkDt;ITXZPM z?#(vwS;^jYaheuF!56<s9oF_dG=KRn)5YFD)e3*r@aG&8+?u`Or+P*0zV@uyi-Z!6 z-RWwGKAu@Ub?REZwVNh~9zXK)!Q^v{?mJ{X820X5aPU^=XWlQXY=6Hf`LfD(SJRc% zdO{}_*dMfX)KuRP^Vqi}{?OfNG5iXTZ0ssmx~*x|@V>1v_m^PM>edY*S^ZIJYi?!z zu}#vSsKS_^usNUMz<W)P{8zmCuIG7lN>}dUSsSDkR_(Y;#;Q5%!go)P13FQwe)HVh z^J~hi1*wXQdWBOO{ol5qTx7p=!jGcauIE#dFN!*!y{_}<b8YoMquox)O4rtHDUg`S z_xP<!b;7FEIUs_uSM_(L<o0RXZ!CR!S>fjKm5VMV{g~v{{V*V)@NbJ<sqiL|(#_|( z-<0e%x_aFwVdwfQ`_%g9de6!JoBA{5$c?6+1)Z}V2xUxr;WI<@jfro;y$`ytKAUy1 z=QP^|pMEl>(I~P?LD6%j7w6L_KN?=!Ni9r$6zeDSX+o)b^2{}B->dyOz%hgCSfHY} z{sjx8m1(P@bDPffbhF3j`Tk%$T_9c|z<T#s$?ru=zO4CsSH!+Rea*zD?0gy3v8T#k zu>ERecK*c}IPnqtJFg#&yG>)J?{dGJeOPzf(hDEHtXwZ-yNLbSisKOx8{?hrr)NbU z*#Gm|daEPS2X{!+-EZ6#%hu(RX>M0t@|$nh>~~vl$1jxoHS4aO-~B_!v+DcndiwLa z|332Dct6ixLr#qU*uxWHH>YL9Yw3G$SwHc*+Aa5#_(gxeF8P;#QvC6Ur}u?Ed|$ou zquJes>w>SV-})`t_shuX^xXsd*?0VtsIcXc(K}k@&hR_>Q+}4-vp3=G8$UZ~?XP*9 zd@q;7&414BA0JnH$R>XJ!w*`h)>C``vA-GvgLV{U3)N7!^j@v5ED=thmS3yt%rW!a zrI(y3yOt~Oy8LpUpH-#p^S>X})Kw?H<b2;c^W~S9Pkf)9{bCZB(|C2`QYl@X$T$A0 zf>x?b{dQIB_NJ$zDLUJ3q;<M7CGvYm@FbpPVv#aP+}O+b`|f%#vt{a)w#Lurem-a2 z5c2iv_q*@!-QWAY{QdF3zsoegN6413#OqxSf3?+q<Lr9|GsS2AYpS~Ql|Or4tV1Aw z?YI8(xgUb={}uRne*d2?(ZW#s|LZj}Od@l|s;3@IxqQ1PP55nz#l-Dra<n!_>lk!Y z>^>XO`Q!de@mCX*<%CYZ6-!kriacp|A~tpV%lP#s6I`cGZ8Q3M^R&X*E|$G#V^VdT z|2?1jUfkF0FjF&YWt`q>gDJPQ9}2Y`P<{0OT*lUme*OHFJ)y3RTa1NVW!5+zDt4QE zahY??(tBGP%D6mL_I&yEK0*7|%vHLjYL`x&eRcZY1$_gBfAxoaR6<^g?>`bXF+(@6 zWsh3*Rc%qR=6!d%ls<(1?5gbh$J=c6CCT#9zqs><+Tt!8$%$%+shYMn#>sm2=8o!{ zAJ%U%z7}_C`?lUPg@>Zn(V0KIpVXd9O5m-Uy)dRdChgn%Gu#uVOMJZk?dRu%dJj`) zALVFjiI3!Y+V)c+(~={?@LHqF>`m&7ClXxug}=L_xc_Kg)x|H`dtLb*!j!h3jYu`P zo!epDtUJ%LY%<fkddEATm#KRE*m^K){T9ZAYx@n)n9pKx&1*c^Hs`$IiNDv=ikCX_ zpZl_h{r{t-ciQ$b742ViYVq7VzZ+u2HNG%z<?Ia2UvX;MC;7al>f<F!x4-fK@|v-O z*N6Y`k+)a)RBoI(;v^E4U?8b;Y*V;y)wjxS*ZnM=r=~N7e0~@7Z?SE1rb>vE4|k5} ziN&|LZz)Z;nms>%4a?1Wa!<BNJPX&V`y%7?NMGw~*lX>o4+Z}p27Pp>TH_$Qq)*}B z^t8#0l|0?2dDaNU9P&Q;UVMt;ldXD&Q&%!J+N3_y`oO<~_0bVmYx}2}&(rH}{j6Lt z#k+=4;zpOF!iodVLN9Jw-}onEVj2GGSJ82aQaR6jshi=w+q%SkpSB(KsENrpn*Hpy zZ%6c>ALl2A=NrvD9(>HW!A4=>p@45}H-CHz*RU!4&0p0Wn6K4bu&+oo>8n)HZQr9W zKFPG#pZ1Dvc3ynNplDX)6N9GYb4nktmreFO+j!+|kX>Q76l*-o#Qb}YpY$){JgeLz zlOS58G~I~llDi<gVaptz;8V)xKV&ZLK9i(y^Y5OOfA&k~ES32rGQmY)^@bU~$IN-3 zF4cSD-F(<4p}+9or01gduN<zj=W3A6v21y^M1$2eY&w^Qi=0+vUL(U+i8V{lT{C$U zXE0USF_wAqB#i(MW%dewmKoxjCJ*PhmQ4PgP_(p?(Px!Aqflv>#Mzuz4t1sy^@(ho zB61d6@@F;uaE|oYTPe2rrWyaE2^^Q3el9v2!xPK5HQ(va>1SHZksG&Mx!N_Ycd6rb zVGS;;X?s6*xyGkeEDUOVH2;6=v!IO1mAget4_%8r@lhpbUy|^Lj;s}8TQg7VRB2CW zzm{|9mKM*gpALD?TsKTDn-e_m>c3+xe<l=_KWUy~s^B++|H`K%%ZZU13iGcfNI#c6 zuuI&)@!iif360enrHe~79GcErzW?}A=GFrSH<by8ZrM3V2rcPK(Jd0x)6f^a`1_^d ziLTFFEv-S%e=$80f7z?j9K~>&Kk=;Ck;x}dd^DE0!M8nHWaa_=Kc^p*&3b%6ufy_- z;Gc<FXBX`H`Llkjv@V+p!}>qB4CHs7SRraTuQ}FE?MR}E<cCW&7ydagDjjt%o0Gh4 zPtx`o6J{ULdf@cro3Ov^JBM@X^ILb$FPX4HsW@J5Rte7)=5K3_^i9reoU!`YX@)bl zj4K3|@*S2xm!`vhz0dhs*ddOl-tA61nnaS8_}Bg^cM05-xx>J2Nl+%krC+KaW-mRl zx$ozR-5f=geH$;aeR)$``e@cOr58*JU#m+5?;O~l7{Rppz5=62o4t&PyNZ+LmX`|y znihrs=9u@O^yvQU50AyKnX;;1QK&tSk%8yT-i=I)PN%lsV!8K2(`WzIl?{KYelrQR z96eCFFtD{`>yyHT4D)X*rpcUF;(X<;x~8S3=3>i|_>dR64jamt7YgaQ?)JKCvcFU8 zL=<;X*47Sl9kVHl$F)!V_1?VJNz-o4(FoQxhe9L89Xd^-bL;)}8tQetpPh9|Y@MZ` zUe8;#Kg-Z5uUN+S#=O1~1$WV+7haWCe2fn&6X(>Nymm4uyvgt2vFvz8wl!CrGHdT9 zT%7ehTQsXSO;9lP>LxaB7fYA5-@dBeQhJ-k*?pM9%VuqD9Jf?t?}q)`WadqrG23-V z0gtZs(<t+$?;mHZ5B_R*i|N1?F@`rs^v~+wKCRW&X|qsl*Qfnw%GTaXy721sDISHX zPc#+SqIGqoGOtQq^<hh&)VKUh+BTcDwM!3i@UMw_V7GQ&%8rF|c%;;HgO`K}eVv}+ zDW7yDT<F%ER+hz~CmEg#`!o3I*49qYxF)_TLVC&$uAt~Wsa2QP>!c+aemZFS&}8vR zzPlWrE-yk3%w;JGVtOGnw^_r6J*8rvK%?+a_2<vxoorP%{+r%WKXr-qnkY^~uk~K# z8b0&Yl$1(XT0@pBeA{5w!ouD4=ivz(HqNJQM#+{bHWeIa^hz&g|5o_b+WO1OI>q}% zeivV5ShUXM*IQKjIoGVeExKe&+N9X9+}65<j@b-#8rNU>KD}kMR440dkkf;8RZ=^< zy(j)qdNMoc+76Cb4bgo|%==beD?0IWidZ3oX_3@gk1z*wC)N!Dx*h%=f@V|fe@hF` zJm+i_KI4D;J+DvlJ1(v%$v4cnHm~}dr3S+nzY~3Lzw`xGi3j8^y~lRmo3*N(Juzwq zUuVmb!qhk=1<T$8XXCZbS8h^Gu(p}yr#!Djqa%4<YR8Q_hF1c$6+D~_U80B1#lES` zTsN~ViF>UyXaC2%CLK$@Su#uedoQX7yw!i#a-jS3eEndV)w2YY4K4Z%LSz;-iM4JK zZ9C=pa&hY(jU^8k_t)?^$4v{Jv6k(!w;FS05W}s?Ne;XDb6UmP?AWI=XbG}Be_!q} zS7ZB($Q}DQuJ_3wJj$@<fp0*{#BjwQ;RhEUIQnHO(}D*Ldbc)6+_F`${bj|;XKqp2 zcQipkcB8MW;G4dShYcRG*%~cV$~B&G;8Apfq0UDezLRbq3>LHGZ0*|)xymuL{mQ<& zS)hrFcls`qKE6%wou1VEej5~b`1@DQ5^htKn&p-CTP3_M)*G_~zMVfMxj?!_VgK&$ z7c01z%G|xkF2C0~Yi3)}<3Lk}xelEV_)L{zPy95_2r-#x_Cfo?UvGzWukFiAe(BGC zJI#n$M1Wans)4EF_A{~9R5IcwUpdmKVA`Uveab<b)dzq1Ox-A>7HZ3^zAk;uv`y&^ z^10_Vo~x(6;6Ime-e*q#ys+~T^WtZ&b^FB9XR_ZQd}3$VpDEn-Pv^Wn;D2x4*^f%6 zH?O;S=>D#UT<g-Sr)cZHPQFy28nN`IOigv9{mkPn|I7~9?o^HVo-+LbziH>U4{v7J zo?EiqPH9(U<-EORWv6C(a2yN>GiraEn0+^=-}2m>P1lW|%Oo+Mu`zcqKKt;zLA1{7 ze<!y!zMS*x#A3dU6D8*~pS-$jnc8|=>)ki+9a=Io_EC`kgxIXs>SFF@BbN#0g5OOm z-<+ONY;fRBR?+R^Cq;*^xXb)Jr#8RVvia59*lRY$ervvayz$cJ(J?PKd@<v?{PPE^ zJrgdJ{b*yoyLy%l&m_m)SACY>c*eQGTXKr>?iu06TkcDDSI>4~`)auRfnTiqcK_NV zmFF)=IaY)RdUlkhJ3lihwtBtwyTS7_d%wl0<;G>lpDywG{^slZgzGO&4o~WiJ%8c( zA8Cd~y}PQ-&lY-c8Xn8rwvYd|*Bh~IpXZ--WZU^HZ)(<2mED(j^}b9g@2u<3xO;km zFi&m7@|!O{Z|;3%QZ~Qu-m4e?By#TaZ@b)nG&L!#r^@Dy`nA6d(zO*e%bt9$TI24x zFwW>kwyn+X`+~M?^DOi1`4+3cQJ>-GR{So|{ejA5{i*}?&!QeVx__BsYw)}H;_-R& z()lKww)_$3eo{Q0p(Xd*<}-pDpKLgO`ro|02Quy@dtLKXz0Evl-IE2IpZx81y1R6l zNJE%(+sQA-U2M&(Yv=ua^+x;51D+W&I-ak+`c9~B3_15WIX|LP+uJUkEp)}n&_l*d z_tng6RPLD1blf2|#U#FCmjBI-mCrUWaOl*@<f}NmNL*@4W!jPHewHcwc^A)F#{aQ& zmfS_wZ5nEd*KI!Mrk%1|uKiKOctL4aii%C@y7mem?^y{g`&8zBe||)u+a)kzVt9Da z`FG5VJDP2jx>aI3=SxnQ((ag+#jeX1Arg3T>mrTIFF!1n*eE#fcxmvfcU5x&?sNzB zEb}&B8f#uU`_80}g;CaC#_4<QHe|i>HIDJ$t7)0BC`*=wbBD8=yO3ZA_v3PZCwY-l zCR?@FDtSqP&AXQ0IK9X%FfGuydsf8xoGXubk0>7NKkK@-I8eGd&*7hkz~bj89`W6^ z<;{w?Uwpb;%1qq9(LLZ?*EA=IsXLC;>YR#JbUV_k6Q!xQ-`lMC{7cT8tDh~p>atB= zuR-JP7R9t#73B$&-`-1Iwo``j%2}SS1Xq6J(uBU|2b;s@9`UiZsy)^-Gl_j;;ofyA zqBkPg6HD`#8`lL22ykwZJi{<C<ig$A^9?UQbd*+PEiHK%`0<NMLSM(<q;rqAE#jY% zT5$VCzQVt|E@F9U%hW{w3+>oG>E-u#3zqV&<oz~Nt~gDPOK(fB!09Q5noqb5zVI3q z9xuKeU3z)4ahlc3r5Y+bF8Z~~pZS_1HJ4*i@UEAyQ=WWT=f&u@du@jJ<xF*XPR_R* z7w`3vx?}M-MychS<GF3d)(_fxcnmN5d+z>YeZ->sTQ{ReLP>!6UoD%fzV^24-f^>B z+q-7o(K7RQnKmQoqM-IG_Tw7eeMaAxCI}YCH_Id~%bQf=^78Sk7|T;We|@+F=J>Bt z-ev!C(&c*<Tn3g$?|k1k_e9{<pThhsi)31*Z|QqZ-rlb9f6C3Hi_Uj(rFhQqaNW=A z5oma3(fOO9M;m{;&3L(cZuNzY%R@TsM9lBn*7w#=oxw0W^2^a5i>#-(PO-QBskY*t zMfgJF1xu$iuTr=>kxhB4&Mo$uu5*4I(&1NTy2lG8TQ%HOU)wnGh`El#>Wh|&P3O{? zzZD;N-ZlRudq!`NQqld~6B{gEyll%5{j9U=$fCx=${;qTSN|@byW-mDK7HYVJ?xU~ z%W^K={lD~G<Ds6J8_Jk{DjiDpMbBYUUhq^!qLlv!he!O&ci|DKPT|iQb&l*S$(dw7 zr{KZ*_8of`iC8VlnlAtJh)MUljlQnae?~5Oa(6@MLjNa|4{^=x?NML(?x1g<Ux_eF z$6B3Tx>aj3cvhW{k#erN#5cp+TD@$};~9@ja-1cr#YLD~WhXsR=8)gT{#f|(vrBVk zq-L6XcQ5L$+)(*0>@KtX<eV7KkVwmN?avR?i!=G(E;*jD-g{B4?xMNV7AV{)_Wp3; z-~Cyc@h_b(&gWE;{joM_w!-Cu_tPFfd)$+zBc1T>{2`ua3zweSeEdpwXWZN6;TuXi zmYkIRU3;W%K||uRM#0X@wpUnoSF+wcTp6Ks?e5972Hx&#OC+=mtb%#!CiXQ}+;u+v zH?wtF>HTwzGbc^ax}^8{E$^295*6Kk6DH^}of4bBkB#Bt*3V~3F8Qg?-27-&{-Z!E z+v(Fd``aGbIV9BBPS8BSpZaX!(lgG<2b*`bS3SwSx9&<1|BI;OKC7Gcp8eCQ<ht9N z!T!naxXm8zhpcPm@3Efz^Fi;~!#dLk$4|GkFMVCgUw^9Rwk~%-p~Bm_y(P`3x%mWU zv}dUw{y$fuL|}=IrTK!m1rPHs$ushn-<!+%H9>Ih&!{b>_g}Ux%M}0Bb5r!D($a&v zC6BNBO|hQx$-`Xq^yB%<&KCS#o~ijos%1Tw;^()oi(jrO*1pTLt7g@UqW`KJtBcC+ z*L!9OM@Q@uO=?(r`^K4;^owfK^5pkl|ND}CLD)&FU5_<CS5H`wxpIkiM9}d|-rZ+b z-hB4fdo62Is6*Q|{;a2m-5*$AWjcGFH?7M(lP9sEM3W_xLH2EnVyoj!_iG+sJUabn zP2f;qd#PXAFEh#h)3&9v7K9jF?swvC2(9i?eJB(2p4o4<2LIWl%X4qEys%=L5}Q(c zm*>#0U6PY}`l_ZcJ#fcQdoPa{|IZ(8GmZPaR($@i@})`X%ajh5X>oB&HqXAqo3MK3 z-E-OjoiFt^<gxwXu3I*HXV|}hjjiue(qxz(3Y7h{{(VVX?Y*>;%%)pj>r<>sjrm`v z)j2*Y;59DpnR!z|-Qo1D!Z#{{L7y*j+)Q6~=j~c=)yQA5&u)J$n>3?*=I4y<Qa2}d zo(NlW(RSCon66#!c9;I%++8%kJU8pCihoo7zrTJZ8C{->el{DuD7bw0$%9WTF8hDy z_@jF1KHr7@e=|QvhrhhHd{f}mr79WO>gPl*ZRh*FzjTAdjK@bGMZf-g|CMO@<}X&$ z;_MA?v3JyOKYWwf_M|H7hu`|F)+P7Pp4^%>jiJkHT21+4$#wg82Nq2^v8ZdFvvKmW zma=_nbrtH_N4B<<%~HGUrz01Vk<MJO=hJsvC%cC`TxRWfAA6;Ceen0^j0y7Yjqj9G z7f!#cv`%Ho=YLCrj@#@A&AhyC`}{4LdcT;{uJcF)|33X*c9vnW-rkcF8>hWGxb~k& zz<#fZtB;*N5i^BRuQcVw+50Aq_iU#B3)rRqaz2~mg=N)`Hkq{k?vLEI^u{kS-QWMh z?tW*T`|ZR2>zm%|hwI+9y1D87`XBpKW-`BBw4E_GeWC7~c4hsl^Uc#Xe{omJ`o<9a zF7f5w$KF?jg-oh;tEe<2_2(A$t-N^Aj#=fx?=<%r$FH%Re<^ocuYO|I-@`w|9-4g1 zXNrl^U&s1s$wKkl%d6jrt(iWpDI<5Xv3HK0!?x-i-Z^@;I<*r#lyAS@qPy$(x-&C4 zYk5|@`55_9Ijl<EInC;V<S$_+O)JJ3i|Q;wE~~36cbTy}?TW0kSatdM$(LJY)vN>S z?(ps4Uet4a{cO>7qBA3VKfj4LEKvHi{L}p$Kc2T+E-&wTX^`D7xi0<f#BJTt`!)3* z9B`_)n*MK%g!s&gSx1iQ6#SFByJl{{jhE+3`x$HBB-Tx6(oo#X(o?(e_eH%@o|yet z*9&@nY%+Vs{p@`8Ly!3)k6RpzwGKPfJI`0+-{3O;%i_gL?%!NeUGsd7VWv-vU1ic^ zmMuq&?(!Fxmsi{SSSEdu<ltfW^rqr%QeDB_>(+rccG+B5Fjrkz&u12ccfyZLM|7T^ z`P%$?!OOg<ue-Tk$i=^H&bk>pC+zg4>78u0!p_Aqt9tubUNCa8hn`lOXMOC&`UgJc z%}dw!<*UUuNL2mV^4Y{>`xn!#Zr?Y5QP7$E?Z9IB#OK>M`<d6Tz52If^7TK}&exU) z{qBz{?XUN2y3jc5g`!2|#ltG?HX5fcnY%vu+_ULRZsCh}94(Izy>xK+-ooO0Sx237 z|4Zj{e}#AX$aCd=^V+4}v^DQp=da2$YnJ|J+`30@l8b*1qo#_njhwcxRYuUVU$QSI zusJgu{$*<v$W1pr=Q&e%VVuL$<DBYIhLU1eR{SoEY72g9t}Sq}Ab@%5iTW+Kd7cV# zDTy>auFpBU#<o1&d-;x@t2>S<&;5B&Y7)2oKFwndGA0Kqe$SY{#o^uLAOAhOqtb6p zwKBeV*Fs6kJou7E)ztqcNnS-u4A@MRHZEThxVDFHX56o>r4#??PcdHgk>j2>!=yAH zM~9V5JsjF+IA)4`x%4BVceli{>F@IF{oArT-^qn3-_2y{TJG_meaU|H|B8)!gqhR~ zH(oJ$Ipt-yuY}8zpI5!5tX#Lq%oSkqU2x<7qFuX99WE`YHT$3b{bQ;BlWg_XoW4(l zE&c6&>RI~lGD!?-S6DbjrD9X~_sj1jjTMtkFLo-_7qP#PzHnq-(uIQ`FQ53-5i2}@ zt!Goc$=1&^)YqT8y2SL8f72JOcp>wY*-RCz>!Nq==PrKD|L*0(S^f{(c3o}1o)CV2 zpYqr0*x66-^)2hGaNo0YpQ3Qy>g>!rx4t_X)alHY&ib2hb;JGVrAwvutyydTIIBZ0 zd)h6j7@2o9=7J}89D3XO?d!a0qATYbsFWYQJ26H<p!Be>&7@Gf*AF%?*SmDrlkIZ! zF20rrw@Y)Tzn+{s>58zQDUaHtvxeK-eWK4loUr`*{jMgxIp>QlCVS|;_B-CcevLQZ zDaZfSyKRCFbJZW=FJAv>Z*2UUo4c1*ANELi|0?<Q^|;9AFK=ACZNBBt<kv4JPmgv= zf13Q;?oHntJEd}VF8N%Gcb|6%Zzx=N^=j*#6Or;iHz>Y(Cw*eqt;8>};rExVEAfw& zP)V1WvAFKBc%^UEPL*fb*>d&Q=a%$WExsOmakhnI{{xllPHu-TDk@gVs$b@uQ<8Rd zVq)qNGd^WUqo&)e>Sy9vuZKUnDE-*!RaD`omgWC4H(wBwadprB_edbey6yE{iFrZM zu{L>+Wv@n`o3qmHweRG_Duo#jr1vPlozq}^#qrgoD+1DfMM}$l9j#iaSg3vSqs964 z6Q!i|g3@<pC|I2`jX(a@hCy?O!PeIDfcBM>*F6n#{vl&}Kvnr-VE$)=bHDG*xb?Pd z$%=nhuVk)NEN!zox%6?$SJgQWEAPDfbeQF&<J+abUUKsv|M9J(lH+={Lk`pR-3Bvm zzx!0g`LN8`;=<dbw)5D}J=Sz=jP1JITv<P<|K5R_3R@@Ue~@qN&E9+VI*Y-ko2n@_ zc1EtNj=nu7%`k=g`_4IU*DbA4t6+9-cbp~ty~6d*yOW=I8`lfP7@Y5aBv;SpGB^A2 zq{@G0?>H?Am;Jl9wq|zzL(MGh^893*?FAY#dyl%WPqLI*=6B`(=~Qt}&60{%n_QOk zm~N#Vw+%1NSY%iJD0FcpL&nVrYxB28>%Kpfs|#dzn||l=FY5sD{VP^)tom|ot&04C z)$WF+W|q0i_a8@>Fp12bcGUP5bGK~G>~e{iM^oHIH%w}Dlh>HHciwcR3dia<^Oz0( zT=VkjZ@pJ(&f}26{%NAhx#QA5%)a;XJTH5ekhsN`r(uG7VL|#9vGhF&Q%?6zf3wie zaejkvwo&P)w^1Kv)JUcq^>Qr{DwX-}!uKm>!{zth%ThRYUW_QYqR#)Qt&i<&fc92t z_1O5NS1jgJJ}10dV*g}n{^OqbBc`k!#jkSAYX!blJ~y(6nAvpf)#sQm-gEZGKDaz% z*ONUCZ`%vHe|?P0k~S@<J)_D0aF*Trb}QGf$6q<JANl+`+v3i|!ock<F}w;d;;wU> z9lSO7N}c&RmT8Zfb2sexe?a|5(*~u@YxD(V1s6G6)Edk8JSy9HRx|$Kwwi6<vw0Jx zFHC=Nr0XbS`{R#J-tilL?$Y2-jucsWS24e8#YV$dh3@WiKXI(Hd)U}EMT(*KR!y_y zIqpoAtG*md*&f8LIr(6zg{H^}z8!O|r6%S7=3KS?z=;`MS-}QYPbTL-@;T8j?czQm zo1tXR;!mz~_Fg^kne`sK$1j%{-H-ZPerI}=?6Z2&%lF7<kF5Gp!F-XHtBZsmY<<<6 zB=X_g&IX1R_aCclO+9kAMs9oe$K3`VZYvgB%#;^Yczo+_;`>#nWjC?^-_Epk^%Jf6 z{(DS&qVHPBH`KoqV&Avly~3LJVzKSXp9N(zZarRq^k%jtr}|&n9SU(rUS?O;bEMyq z%aP*9{M7X4+j0wG=GIT^UfI^X`!0~Ava~$rH2b0%R`r{`1&sK%2pz9=c^X~%X~q7Z zT?-cIq%hSnFln@Wb`F^T;pd9FMy9%GV~M_bK}uz<*5!N*UFxqaW6G_IOF7c5t~uU_ zW!Rl;ajtUFVhigj{W%RAg$<^)Zsh3v=KV8+>D}c6a@+6jynV#l@6OYbC$chpRZ&w< zoc$eCVY&R>8p(?3c@I86eC2n5QTBlCm4CAi?09-bmC4p~$~}%3{O_1Wl6bjxZ+Wn! ze1>|~om0odCe2>t=X=F;pKiov#lwNK3;Q?ti%$FaykpH08>Odgq6Uu{iucX4;-74P zqM+7bYkf_Y_ROm5dsKEEdcOE7d!c#xvYYLn4=TKyB;(1ad-yV2%PYkN>lQs1Q+;32 zw`<u8|G8hUm8`xMoStWP+P$Dm=V8H@E7z<&A2r=xWnO)u_3)LxxSh*9YiGoG%{{{U zUemRe!N<#@h}q&Xk0-+_t8d>p=WkERZkYCCPlW98wR(4+s%gzVF8NSQr1us7q6ybu zdjH&2T6!^XgUqD!ypc2Woopq(c9<IOJNr3v-uDlu^VU6M_!nXDe#cA3bIi@P3-)s> z-SPhVId|Qxd2)V!&)g2}e9iRG<>K-)jC)%|FTRl6UUPM8jtkqO9#=&<=YMxLa4%E6 ztK?Jq*p)fRgTY%--zF|bxY*~mE{Ee4^QThtzwaq!STFVZM1kWStt9()?wF1lOyQLq znX``Y7I7}Q|Gex3-<`)zULw;PE}G8QOiSCbUEe`w{;#TFW8cc7%riUM+W&~%udG)( zaCqlx3;Bs0D~}r`Jo0FplAtf5`)=1Ou^mrc`GRb#XHS{Twp{sz8>dh&-+UV_f%<!A zelNDLox~rwI6|oE$E+|9XZ^37il=5Rz4C8sz!mdrkC{20rpC`{U)j#mXmw|Tm!ml2 zO}i-%Z3OZI-Yhn?wV3>>Wy{a5_<HH(0r#FBd3|ixoO3<O94C)X{KZ^VA#15%sLn4k zhlT$x+YZZ|ds2N5tlk}bx4m!w-Agf>`2>9LI+pY<uJzSFm!UUx&Xilhrm-m!w<gHV zFpyg=|A5J*{#TIVE}MDMffKSb7>X9n{%Q7d?)pi2RvsLM%#6m9tX(Jct=l90GW3PT zi{RRcSC)R>$@0!~kw#y2NW_86IE5KJrf#tlZY^G*xI>~uqv!R6kLAps^Ew$meC6Zc z5K^^6Ae-~Vc3YNb4{I#iK3}qx+o!&1iCBuSZFl_yk!fpoI?wnY^uhnG_DSz;g6+$e ze__<iXPR`qfNPhs{1!Inl^3$wF9~;4+&!zey*h1@c&PjCLe~kmm{LWju_-O^_MEJ+ zzf|y#<6Oq}H!5##F-Pw5dw8u>YwJF4zn$H>zttwEPWvZfQt`YaTrur_Z1&5|3)$xE zoy5OL*<s^C?U%2ZdwY#ul?c_HT(Z*eM)6{Cm2VDBYj@A$KlX8#V1R_^kB9~h8NP?F z<m%Z(9wdg{W6hLk=_}L-<(J#R892F|Ylmn_p^h9+>peTo;NANIFK4E2zLI$3Lxx2; z^9d`Zp4-<~-6)TYy!xW8T{7^1X!WJ76>0a}9c4?de$o8#t;TkbB)dy!4KtsY?*h?) z>DoS7f<^APe{7p^>H4+#k2l9J3tGr?>(h(Oed+-Z4+eUqm5Zp$FdHrZvf}539_g$_ zpG7M>c<noTvwt4p$v8NH*=Y9vSdYGM$Dc^o{cLmE@b${?m&q%S@maF{=9^rwXX@jF z^-2;g&Fchu_#W=L?3{Q1-h)eXp1$<m@np&NTg<Y@+$HnAZhGNiW+jrpPi$iT$~AMl z-B&ns##e1HoceiE+R9%o*PDOUI-WQb_n_||&vucDhpRnZxuiJGwHnJMINYxmSoYia zPSK2_kNnFVw4Z)XdL3q88hmz&T0xWe167twUT@pG<Qo@vvqv1d+MXSCE%0ziy{|v- z6XQg_e(viz4^{+Uu390>AAj`9XJ(CzsN>~7v#K6!amZbMZ@F3TnyKxN&mIqXP-JNT z$}8>i{AE(r!B@`lG<+1T$QRh-e(PD;J?49-cQ2e(z*G{?YxnSMK-Q}2_VQfrt%a^> ziyijPU-IojY)$x|xu-8ozr1iujIJx^FJ+d$-nk~z*XH?|uA9(U89Uwa+fB}!nwKW< zJvp?)olpB5M^JcTkS}A}+&MF@dZf)g>p1JQfaBXcol&hKcPw8_Ji0*GYQNK($SLg} z<r?fqeIg{A_uS;$#P_h~vysy6vV)<YKW}`&oY^s<-q+>8j~<&;=^v3*-oMWOu-x*l z|JTj<AIWuXpD!8Q7hRF*l-FnF`SrANQC@L~T-d?WOBZVd?$_IEd(~s^r0N5+l;a=I zdYTZs;b)V|eI>q0dxc6hL|B=^Zr$LSlle<QJUCE8fT{n!<P(|vGE14ux3aBVSK0e~ z-5zj!MX#j%+-JM@yuWj%U<>!%N$wX+8I;2BmZ*DdGg<ui<}2O>r;dqimCtSavD%LN zmCW3L<*Y%cegBxK-ng*Df@7Amp;m+OJ)I*Hq_?+C)tEMwx!Jta*gLu~Eme43W=PYH zrOS9Fwl$wQzvWxy$*lRCc2$*|G<>^td(OElwaJ|(b)`BkwX4$H=TDM-FT7L!j%Q!m zgXr?WH;v6%X(s84#w@R{@V6^{FLO5D^1&@=pR6K#!<Ok^-o`uL-&Z^#zFuy*(YgwW zS*v_l{Jvbw?EUd?!ImEy_tmaFNw{|~<4bLSjck@cshZo{$>yuyMz-A#khT?NJhhPT z<l2{)Tk;<?Jl^%sRF2zOpuebP$3u-j*V5cgMM}RdDe;$GvGvEYZX1Ry-%nqv)^G;x zUw`lP_MhyNVj|A;PPp`(Q7GoOTwp@~dQCS!Gv%X;JhHBe+D-FW_UEEw=^BBKiRZK* zKl}K|XT$XP|C}4wi#9!~&|*2>-?KjKRBX7^36^=2GBqq)0;?aaeQZ&^Q{b%X!vEZp z|Gh7=^SWWYmf@ODEr(R?q=&Z-?et~{mYBCc^u^L`pI)yQei`@Yu%YkfWmBj4KXKCj zx$VbJwyzTN)sO#h=Ci9-xXNL2zxmw9w-2S`kAIT8^UHAl-MNdl9kf}uB>I)tzQ3-M zE?;S^J9OLpn6>CH4L9bbQuddJ!nT~)K6}w(!AQ-Zw|kG)bO%)%m_D;z6!N*nfsa-B z>f47_Un?5?To&i61)BeoxOF*^BU)cl?hJd<tH?)hCqFb5c6zTFAZ{ufWcT@;!^TXl zJDIaG*!6BYzg_Wf#*RbVb%gf5YMiXwIXT1mmz4p>`ZDpj7w=e2)Q<e!bZKY1P(|QD z_gEFRlI2fs7jC+(o78m2GVxHEful{`cFu!ec5pr{IO(}j)S|+I`KeiLaBzA2W42u{ zXU_juvg_OOThF(qJ~^tjcCAzX<*=8%uU7L2uivO)fBRbYS~lsQto0w;j~y#|eK|$< zr|O>{M;_@vJS{$H`^<!sHM0*gb#Hz4G5*-3uT{Apx37LO{pzdT1y7cr6@Jg85mcYK zO>$mnUAO<eBfA%OE?PKok4l2Z=GzJVT7QLdcP1_j%s0+>9(^YCl+@zRt+&<01S_AG zMP!G`y*gc=zWvq|`4g)iX&sQN__m9&W$NVX6*{N-SFhdhPV&o{>?z9{<NWK_IV@!j z+`o<4L^#7|#<D#&2gKsfTz)0mJmv4Ps})hP|C;u#NfJ_UssFUA@#3nE)t6>Z%Q$H* z={CD?VdADQUXP{OzP{zu)mX95VWAhx-EMuODX()E%=q-INmeE?VB4(qu_1{q+}W)+ z{pz&xb}-M2t>kv9EMNJfy5w#4lZV-^vFYOR`YOvpCAGDC!<b)0#oa02c9h}vj4d1H zJN`C)D*pfR`vRXmNz3<0vpUVYl=b|z_F9AUS?id>CDyRiemXQs?8)lew$A_a%uI7% zJ2P&nVtOMU63Y3&>q_rzJ5EP~`1P>?nRT*{p71lwc+$$susk!!LxWAAJT!Cl8g2)t zsRy&J>MOjji_l@y=1$YPvBJ<e(_F}~n}M4tWohL>Cg+{2{(PCaKF~hy<J=4XkDvN~ zbK~6wyTeLXhkjjMxKC;Ej4!DZ&ZHile_r_GQI9IGM2@QmPkGCCD+D>b`CIQASU>g0 z$>Yqz6EyTM_hbjS6}7skR9@{}az!?7#*#0u+gKgk{QaZids04$b;^F5`DfXptaIgc ztC!Zj{d;oefAin}N>U%5+sCzD!k7DO{(-)3tpmNkIN4ecRLo5gXRw@SuxgI`yd^8@ z_x#w;2wJV^E${3ZqQSth))wDtMFm{P>XjrGm7w3&y*D&ETsl<bpP!S25zlm?F0rbM zO{OuoJdR#76XBkcWuoYz(G~U8!1BO>6g8i;j92-e4xWxWFlp-%yHefxe{Emc87J>h zVR_xW=4i~fH}7vx|NM6D{r`WShBFA?NPMB+>%W9&^&_h|&j`J8-rHWHG4FObb4eWD z>UMv+nasiNCr`Op1Kaw#&iT%ZDtNPK`EITxp1rec+L!ZKhYIu^^nGl-FKg0fr=G^* ziEpgiw$3{x*_UkX%vxpEnjOvch^KST+WgL>bK7{Xm*xEwXzS)($Ys)2!FztelTZEg zQl7U-=%t_6(?5H`DpTOUh_i|1o;44dszSCX9K7%-PeQb9o9EpxwjnMPE?j7RXJNbd z+=WoStg|}~J)EL=c<Pe^GY|jmzQHf*mekt?uXz{DaVk$|rtQTYCB|&L(+ii%uHE5v zmviScAH~(Po~t_E{ARX+FSEk9AvQfDzW7a$MEApQkr&U~NUn0Sc5@UJne;p<&a$IT zx?;Di)+C-aK5OlcI(XU?^MvbkZ8}-%SQ`AicI(VJKR&IVedzlx!2>eqi+U${Jmtvk znkAK5+_~{r%t2kx!k)xyPo{cV2^_K33X)J)&G~TZ*qT_8ePKoyr%kUvGvVr1?sd*H z=ldyb2of@k&(5uwKc_VBY;N@(6<PJy!gBu(O_yCh`DJEEpV+*2CRhK>anq}bEjThO zF!hB^<qspbWr@*j{W+4WHC9!gKfC_yjd`JK&V-f*PU{VHIQn(|oBKVnqElVZM=cU( z?blcsx_ehjx=#2S?o0LePgX3P>-X8vF2u0CUqbInZP<s6ZPq(hKN3#y|El^Xv4HQh zR@y{$#|sskd3+B{l-E`M9l0Tv>&ot5iYs0pz4&s*meh=*b>_2T7l(X`Iq9vPGkeba zIj>D3@4we%Dq~w=bbb4eT?@8)so$Mzo9T1<>8DVc_(z(WJv&}3IM=Hlc>h84)POzP z!q1n4EeJlkC}i3v$qX02xSvI>9<0|wL>xEmyEP}IQBip9?2o(bG9(T~7j;ki72Ra{ z>Xg*98Q;BDABvn*6ZGBeqfW6@U=@F_tcl~Vu)gVs%cH)$7Av=HpSQIqmGk)g@SO}- zo8DUPs>t!!AL00{rLgN}lZNgAvnWlT=}&}~%kS6Qba|h8w`;!UF5_Lt-M(G;t!(R( zaCz%h^K*-Q!gUJ{xXR19$Mf2F-21ftFT=#CwtK!A>v?jO%~@0}^;cp=_qP6Q`#JKx z2l7o=`2SfOY_(&#ubw|M=k<vfc5Tv&e>3%O2>5Bz6!=T-phRAqjqsJg&H(-iQ7=2+ zJS^Mnb7eyJ!&oOa9`nOSi)`Q5-e-|o>zL_%#qqsqcNNRt{t}M8&#yb~m8@;_c)Y{$ z=f<d?hCYuP<qKC$`x7z4QRSA-cMsi0{(sf)_zh*9=1(&9`hMg<GxM2sJa3dYci)i{ z<KySAJz*BRTkvOhiLVE%H~-83J->vu{u25j(p?wkzu`}P>o1=9m(3+#<=vRjH~+&| zy|D6)AEnJ^Z(XLmq_}3jX#BnCub=L@zP$QG*7fLgt+j$(7jH_nzkYoCq33o;v8HtX z(!T~41_l#ue8rkPzG6);IVZ8WI5dQnf$_t~|NmPjdHV|oiX8vne*J=x&69;ejx4LU zt>97Uijr6C@SGgx!6q(cKK-RD+j8TgYVVTg<sYPH>?lq&Q4|y|&--KbuJ^f-tZ=H- z?iX_{pMU><zVeRze!l&T5r=9IRn#V){CK!6?CdU{trzM<tk#KnMJpV-u<nMqpTeQ% z=YCyV_r>Ctr^HIPd)$$$-4?D_HogAAMS&yOeR=TYQ}@3|27H~`6>{(CbB9+NTP`?D zc(>|&5i+Xxa9Xc^XzSi(91(#l{zSX1{4r%hc68-EC;Nk|*4bCYM4lE_(|UVxQm-RV zszHOW*{_83pP4Newy$0EtF0@`*I!tSd+LriVM{{R{8=8pP4=*7a#`2xn}WS_udYzz zoZFgo^O!}ET4~z_*$*nxEi;{xUb;FS(4EEgw`%XoqhSiN;qNv+RyikiQ{-Tsr1+*q zHGgj%D|ut?ERmsljVaU0^s=^i|M~N7a^gKtloEgBpHvQ<emrGe*d58!TpCh0b?!Gl zHhPzAw6=fKG_Mb?iGM|7On+G(O7Nbql6&U(PFAOS?d=PnZ2RA35apr!Oln%s11tXs z_rfd3ie&b9zUXq#n|?T8)l~-*sbz=ONSjVom;c51e3yCnowMpSyOyQtEMSf`*l(9| zCYRx%+5X<5IX~X~ZFzW;xu?z|$tdmU%OfxQb(_rZD!KK2YB+j?QB8>ZUZz%oUg3<q z#|3tU4}6!2Ote0*^hne6X?`(&9C6;S+~=^&$Y<73V|cG5x?>{4>D-2B!waoK|I;l~ z4d=W)`G9YK`2y+kpE8F&U4Nf{zlQOitljTFpKS}ychoV1s$jL%jT6F{7#L2nke^mj zHw(lD#rnvEip(?av@?C_>|3GZzf8>~Dd`b6vp1)TiKEB%eG-#Ot*SMH)1LDg7i(tt zq@|~&r~m({{pQd#zrZ@KOG%l!|COdSdBmDzJvqrPf2HMzL++&+SE|HUblRP{Q+)pC zIotb|&$IU#)>`Ga7}qsU|8dFKC2#Ua(VwQz)-LU}OKwbb6QBKDuHR5Uw<-4R{soPq zRgZm7bZlC-TBRjr?sZq4&1pAUI^v&)?p4WY4puz1DDLE}X|Y0mVKe)<JGs|tJ!%$N zr2MKsIGt&cuNI$>V|z!~8a_XVqY?ZLm-<5{PCxSfXSYz(jQA<~o*u`IEO-~KO4_P& zhdXaVl2t~F>E*uyd<}p3)^eWIUbSNJXOD>$jE%v%<#XM21wuR5bSp+#+Ophaiwbf2 ze@(;8p|hlH<Ff*}H>YdZ`L`VrkC)rYH&Lqdy2-UKc_ESKwgwhNSFYX4#x5A~bravZ zzQ4P?G8>9(b}{K+-zFT#6rKOHbb|(a$GoEvPJ4Jf16MEK{5X}-bX$Pc<<M*D#^)8? zQWlDG=4yD<Zhu*jrnpjuclj){E37LYM^EmGI^tLGLUKv((*C<!g|zgT4;ejq^;F?i zj!ISX=}4a^3&L(|Dm=~bzE}Ip_k!Cq@l|I&vcCA6|Lb-Qhoj3OC+WMJ<+nPAJZv@l zCsev<f>Y!XRvk|diz=PJtVfOnbi6pKyYbnt>1%!_Y&{iqyMoW}@zK*FY=!n}s~TRp z>^f$lfBHvj%%%87?Ne4ksc}hX->#1=PVc@{wT0m}lkdd|VRAyvCURQKtF*6&ER1oV z6<4=nvh(%-A`$l*x-VxR2w{n+{p;bsQEg4<(G_fYynLbuXB}K8`KC)hXTxVZ?K{bj zJL=A+?-W!OTj4R+A~b7boXYuQcV|rEd0^35Z2MMI_3h~`<=UBfeP8x?|EdYMW}D!p zoOVT1xp`m7%A50bl`YpjI5xGPN#(tC-ZQf}J;Px6=@Sjt1$=+?()hKy_n99Rk~2S4 zKF`VO_p_QfJEco|LgqSw*P(f#O_RL~B+XaVNGWXJ$#m4^eZlWiHdCSE6sO&%Mfr@? z-&tNuzhlR~@l1f~8s7M+>^uH`zq4hNgu?fo>02f*<+`!#z{jV_4`S59IrsB_muCzX zIdSlw;5);ky=!`webkD)YWJMW!o6r;iOxcsD`A#p6LN~q`^}l<Ia&99-)pV=EEeC+ z?L4HnCP$sEccWtRfz!5Irm5$>^FL}db9b;{c8SXW;&>CIoZj9i-@C4Lh?=SGiOv40 zp8dr-`we@Q>8G0?_AdNz?%U$#zem~IzMh(rZQMF@N%iX|_t?E7H_Vv(<i~~kZ+@-& z{!pK@`KO)X?X!P=JmLI&{9xnpoXW}b%->hWnY}j5j(nE6?e^(&m!iKvQQ3U@&$mNA zO!sHS`~S)OVrx3X*V?Q8<CMGKryIV#abM~`1E}<QHs^r81`7kjSG=VUo(@1sF?t7J zYDjkeWe*YC$rh!LExtHvZV8y?lrZ^_&>^vDxlT8?1t=_O@K|xg{kp8E^6_)O7~f{q zU$I-Ft0QFJAm3{7*k$QjZlP&5^DK+s&wN~5`}gDJ|MCoHl6@0)MbBPu6(_-37+y6| z)N)^V?q|tqB^-?x!>?tpeid~u?CZ&6+L`WFo0x<-U;VhcjYsBm>AwwTF)NkT13Ze> zw{3eG#q{ge<lX0^zk4yIN5$K(&@;GFV51%-a$=hHYc(Dbo(u!lEiaY|bMctxn0FdX zXv|EK_-T`#%=B#bfzBt!H;Z+ngCcicveKFPXS$H%RfTU#%e7Z$|4Vyw%J!qz>B|T1 z-@91o6!<1NqHwLjn(wA_O$<7NnJkZP)GXM1=hfwP$L6iISa+45aqF*%S%2Kp6?^rU zy^xygS8I6mrpNMaeEaTg+OKOq|FT|M_=&;=J#Xh4Op28?W=bxTVbO7G_ss5lt+hO| zVOghq!MOvGXSjM~E-iV?B)g%?w*2@JS09mpLrX&<eBC1#%xIaq>s!@kk#7-aih?aI z+fTEG6u2q~UuAKbT&`eHHzjn|+x$&yk~No4*46jQzq-Tp&#}(9RojJT_=>MIa<D2q zKlQrgy?^VfWPHMJ2<}YLeaD|{{?}_d-;!ysUOBIOzOjML+A#L;hsZZ8w_iAT?nM5N z+p_zgR!1`(&wR4aS=3|Q{S7G(_@=QwJMCVhtodXD|Ef9Vyj?rp^TUO1yGQk@%OAhX zD_IiKy;|w#naJ%oEMxc&)ZD)LX^jS-h54;InHxn{1EqIvvtlsawu-IH^1bHO-G6>R z>DYL-^Um{Cr<Mo2xTDuqUp(m`bDuM3#sfw7&GHS&o>g+n)hERz)~-8Lof7vZ=}UZ% zHrK}fMF%E4o*|)fM)|gSUH?h($1`Jn{(kLM?makBN6^pM%kYn<qH~Sk{-Zyio__yf z@d2lIT;iKQ$=01p()!+7IBBC-<D<&~PbzrSHUB3rQgMI7vhGr&PI=c3x9uT+zB~vq z-Q71|SoLzxe#dKRhicny`2H~p_+tHa#U9D72q}$A{|>&@>^)%lQ%w7R;@9pKg>tLi zE{OFWn<280<!s^7hapNG^-(=)O(Ad2%v&(CalyWx=sohP#<IFw|4M=~<@#R5=XT5t z4DoDaHVI0K(VDMQC;0ju3J_^M|M>W&rY<I}7e`teGm?%9`06Nr><{E^p4NDni+9SD zYg58vo45-Zk1;a)#x!IXWIfXA`EJTH<<tRl%kOh*zVE5NfBX7p?FOl9l3j<he7DV+ z_@34I@<-nLMY55~vYZJ#HyaC+Pi%Ym<;k_H2j2W(dc^Zm;D&4|&+P<{U)L_YF_Oty zxlq}hdHLbuZ&NfEuL`;H(xLU>+Sl%Z`vp5!zutAJBjwuSwZccZW$b3vJi0gY?zZGW z(7Zs~r88?!Gr6!mTvU23?EGmS=~p=+Clz{oI5<B`o^hP8A}Yn>Zd6_T@^(qH#qmKi zEvgD~Xa6?o{<i*Y{r2Mb{c%z`oTqE%*f>AB^7fL(qO`9vhxu(*sh;KC(|2=A&MuX& z$-etlu2vYV>QH2?OA`1QwnV!`Tft9M!7eeeI=$yjGRNAsgsy<9!lq}Ql9^qLlSS$# zS$0KouU6?=5^1xirsmfB1Bv$Ptlu3v58nsHpD}B_cNQZ9!(t}#;}5k-cQwR2|4xX+ z*K~pIyv-|i9rEtD)z>uP#ua1X&{s@RE36X31uZAvK6W%YdS97yfc*9Re&d-wMww}! zW_ix`RC{u9iSMsPUlf}HRK;R9Hm%}b5u&1@F@YmQWXC+a1%H@TPH*ZzUw-cAyRYT^ z^XJx=&YAId<rW3bJK1f27Op8dz2121YkoPe`$lJ?V|{P;G*o5^&$$*N&1QZ1liHVV zqid$h%_*@LTwT+2FE<$|pEwjK()hrmsYYZ@@}WY;Gi3$AQ`)!BW~``oiM;Z7O)C5C zv-es=pGBN5K3Ki}v4q#_HB;X&k6@hhU6VUTrnM<%yV|Q40zs;Zy$7<VR`V@XevsX^ zrd#qz)X_u@`2Z_k&ZQI7xF-E5RKDWq`*TJ6R<G28?_NyDLTXGB+m(|axRuUL*w*-e z-J<eNlU2T<2R*gtYV5kqx9K;JrR>Qq4V&W^@_6SrHf~v%xn;juRK3F#m5E(q*__$S z_~KTvzt&)0#<p(3Dxp$6KD9SLTdij77W($HO13F4@O_up!EECY&b^MB;zIBK99`?g zcxXyeM&=g(DFQ7`I@;&MwpDO41zww|#x0Z`yYEm`c=*cM>n`5dveZA*`}(@W&oiU? z1p88t_?<d?<b~PM4b%Ewa=hMn%*t%R|D2dL8x42QUsL>TLDNx=qXKV2jRZM`%UU;_ z_ME)ov*&Hj5ckr__pJ9ta!grcH+c(l_}lFJ!C8-T%+B;3c6+dz`K?>MQT-kFTLSiJ zKOg!f8$>=?vvA?uW0G~c99KV<EuNzz`)vK*O?Rsd9)1hUY7BgOy~nfe?B{cJ3qpjx zmsdJJKgTN({AX5>an{L2Mj1Sx5;R5YY|9Nx9vhrqKl^9qVmDUXQnC6;XWkp!wXC!K zmu#>?@0fYhoLw%P&werxZQoRyfAg!hY5V_q^)G(%a{u@gb8m;kS8bb`wO1+>cCL0b zogEx*;Hr7-aKs$hpWFFvXFpq}`R7Y*`^)ozaWe1Bbf5KJeR5SHz&`u=&6nHr@1&%k z-m7Zl_~v){n?Fmd67Ow2>9p4%efE*MpJfm3M4VyuR#w;9|0KWlDDU<kGp3y5nUomO zI@Rd&jK8PmOWtU@IJsQS|GBw&ew*UwjN;-+JB@dW9BK;Y_5bVe?BA?4w`)@lDc71s zZfZYK`F^`*dkiO2(dlxJyNPwGXJX%fF<t(sHhjDKsiV64e{|@CE}z@=+x_G>PtDyA zeC{fjt~Uz1Q}t`7m7$Yg*k(pa^PBUTB}!M-F8{YAuJw|AoL?W$?EU^TuUu93X8bIi zxcc7P6U%<xS@!S9GOt{}JLk_$KK;ym@>9d8M<MYhyN~`eVmZC>*|Xdj<LjrEih4Tr z?tDB&Ifm_Jte5(;FM5v8FEyPhRXBHG#pKIV(|!8nn0GI#d{*$qJ2}=T+3!UF&)nPn zE4o%`x|=FCm%IPUja7Q~Vrt+9y{|UYyV6>!6#Sfb7`9qy1y5Yo{bk~_3dc^aqZMt5 z`)2%{|LmVMsDMiU^`^s{g@NHSD_I3pWnMCRqi=3#w!g5Wi0$R;-;VxPWDT6s)yl*j z6~GwyM76DHqsO7+OJxfSc1Lg9&GApGx6{S5Xa3*7W7fN8yDeCIQSI%SJGS5N6w7b^ z`}6hfat6yi2_93I7q2o{we9JYor&4o40yK|WQknnl5qaLux!oBU1>5aZvSrIlcCLF z#1qy%Yu!rKyv}6D{!fQC`Dp*WWaQn~(jvJl);)0*D^upK9}C{Tj%hq}VXAre`wGo` zsY7OKJ*RgqT&}mY$)fqu=SzC~_kOA>Ha%;w;by>h8|M^9fuBmw2FAN)yGY-9%(1Xp zF=fAKXxj^?z;eMtmJ1VIxTBJ{yiWDlx4q?T{Ku|!qL!%>CGYNuVSFV2@kmr(Vz*KF zXBGeFTV0llOsXkbwIDv|&%q6Avai0{v;1Y146{TENA}dNx>Fmb?v%>9%pGD<I=9cr zHBirb+Zt8TZy9x45+yyJ{@X9C7xOhDM{ddbi^i<mCDZ<?t8ce@Y0*~LF16_LmNzrJ z-TOAIP@Mbqmf$prtk)OrugGkYIjsLZXIWvCuQA`eCCep$&30V0Epmgd)Z^2_Pa-)5 zC!Nsf(D-=F==4_3^J#x%YP^dzb;UPurAb6--%AXAF61Y!y*V(wZE{6JJLj24f`@yb zg$6%RwLN;F%v0v@htR#HNq61-?rmAlv&Lzs{%lpflPw3g&-rAxy(~rNX3XRrWv08_ zOTP7PY_c#gxjpf&f1U)}_B-B3R^I>E^fJPApPGtZ%mga~-$JJ^y$W1ayHBq6UB62s z@`bL$v{b8=Ta2O(C#S#o<1(8e?1lLwsp}iP_IvU-=v}vMdpGN|!NRBNg?$I^NmkiC zp0y-FT!ZPw;v4gv`5doH*&ja;m;Qjq+|G<s^1HLqog)GZRSp-Q(s*IW^FH<Xd4r(& zi6@+Y@)VVeOU^G9Nq(~N*{{1w(PEGH?Td^`^=iziy%zUAv)8nN(`T1xh~d*>pC6*U zW%shD#cY@+<J<Cn)^e@W44URUAB3M_oxr>EG{26?nXAE5SFQAVXef5@*7S~Fo&L7& z5}jQ=srwUFO8PH3CVbHNq;t^qySpyV=M?gAOS;1PQvPsT%U?E7raSnp<+waE1A{Z( zi&f=t4N6w#C8IU!)`r~-7Y>*Be^<v(sO>0+)}y?x2@Qg)u5C3{%DTm}f-@>dQ+85g zkBYJ4%#9h}YwycdzV_zVuiaoPYWsDLp8i|Q+T8zA{mZ}YHhvs%LSW-G=V$kR-_8G7 z`}&N0{r?}r4a`5f5{p;9cZdmGU3FCB<SM<FUCWLchhLq;aBRcjw`S2RP6XLGt4B6W zUwFMY(;<l6Bs4t4+0Re4XmeZ8#MPR*=E?`oUx+yC>8fcLbn%m$pSXg-mbhu_JPKXA z)1P!HiB8SFlrr%PyQJ9?PoHzkO+znkJ!Ka>#ZgDdbhWC_S)PYeG~=gSdHLhRlT^#) z^2r~H=V={2HzienxoCIE;g6b2CoL=%PRXCP+3RW1N3FvF;cFMMdzLQ`<5tp~S5wh? zJX>|%n*1fTTX%Of@bWlS{rHlRWpL=i##Pf!7z*azkZ{p9>&!U#OW^G-NvUO8Q78RG zoY!b?)hYd&(D~v(*t%3{MS~FQ1MR!Qrmt9?!(LXDx?AF!Z1@V1c_|h@;wP0hD*mj0 z`lN|Nu-CETg61O5vo+U`K6v}cyjp<wV7o-KzrIFDTlA}?8+PWnnyfr6+WBfuVsv=9 z?uy^nRW5FFYPxhgc=o)jrX4Sw>zSD<=2V@zW*RZYa+Bgp72yYA;#n?76usYYwmCSi z5@Xx4C+F9kCBHVE3FXQ9E5zD2|D1HzG`^57ma6DgeC?4<>P;4WUU>yco|QX}tzXhH z*`uZ7tB7ceO}2+C)17CNZoKn;!qK|vS<~}(J{?A7(}Fh3T-D6=TX$;(%Y^vqyIRMN zPU*N@q1Li|V$zMb)Am0-dZIh6!&zck$+{5r2a)UY3|c;)2v}1*$?C*k5yMlRasjH< z&y{{lZo6)-oX~TmRCjT>NNH87iOwrSxeuz-Y`3<CC@Ut(=zrqznIWoou|nW&lV^y? z+^W47?fOEVXr}h<s94KBAw451F4CshbGnFOh1xF{ku^4&e{Sd}9qWpmn4ssWa&?c5 zdCrT&!OKmY&xW%<FDjaO+^NCqfZEobYo>*iRz@wmc5BC-S-$H1r)E68sXXng>2;<O z!Sjz>1$bg21GCFK)@+;4?Z~|I{0W1_k2tSy3+z3-t%>0X!>nnd&85l@bnUF=Lju<& zcQMVsd@9^>3kUz5YLR-sjweqwPinlHxNmAp-Kw@8qqSbU4#uyuTg^Q?xJ!#)a;fLe zNl)2+Mu#g~h^tg3U%shkc4@g|o|^8|x5XNZC8y4*aeK&KZ#MB{kmawl$ByeYJ#H3% zoiVQ<Bhk+P<!zNS%QYqJ7VT{>%jNh~F7(!3%}d&|B7?WC|LnyZO50-C|8Jgg_=uOj zoY1p1Yh4nzuvxrT+7>;>@t;}Y^BcK^268&LV`hcvuRVM52Jf5RZ+9HZzo=F1Gd^4E zbiQ<1)8-#j=2`28eMy?Xa>dOr9W$-pO+McCGs2sx@XdC|BbiTa{=LwZ+3{{w#1;vi zqbfBQLVtXaYRRl;anF7DPxbqJrSI(f)+);vJjv9#`KexT`}}JkGu}w|9J^$@|B!M2 z!FllyB$aBPSG_Ffep&fu@nw#=ZhgOw)wNe_y!%~xme_`scei)Ev6)r<^4}vHmitUK z_gFc;e7<L26cAVAc3zm{-r>X_tQ9PC%>QQ=bN0v`k~Nu=QvN{lLI3U#m%iG*>pObJ zJ|q0s){AQv7pg};t~hr_>~ZfqxrNhTxmIX8E%s~ayKrjlk7N<4?;oNJ{_yeGt4JSP zGI@oZ^=Y~Ky&{z|43@_m<DxG~PkWvC-D*+rjBT!_i#}ELmCgB(_g6~s)BjIQ+kU^P z&18Id`@%7+yoI|ursqGpb^iL?5Yq$I)6*gk3-s^ZeLV2^V~x0jtJTh3|FA2!=9t;N zOiBKh`w<7i=I^Zj+}P$SrgAucebSE0hId{{EL-0=tL+zK_4R83U*xtgKf1ql_jRS5 zv(4ol-_{vFJU25~kmGJ!y3Vy?;rF|<H!br$@loxG&+H4EGKJM{vFrT{EM9kZKY#3> z#c_2O|GD~`5}sWYtoXQdXZ8W{E!!3t7*DaCynyll^FK#Br4LNEX@QK=6}l!QJY!{G zkmJYKUc*~;p!O$YgJT1vuZ!N(Zux!TT*<PRJ!!Mpe;=HjnQpW6-Is~lod#*g<_T5v z<fh*_vqE~K1Z!sbO?h^!c~x8MZ%u7caX6^0()=U5L(piO@T(-}V0E<{c^f>r6g%fG z(JjrLCBI#<GOH@=kmv38t9zf{Dc<*f&U+bK+dq%q%@Of4`*~7f=kwo6cm0gdU$j@a zb!&cB-U{W8V^`1U*NAuK=O}Dlw{oVtSH^$;03(ObOzLeKQ3|aL&el&h^juk{cdP%A z<FWhq&Ri+&VC-|MlD%6xCCgPR|FH7eI+h-_Rm`q`eGEK)YQLPQVZ^*}g2sgNESl{y z-O78-9N1aRyG*wiirl=!;__jEifxfntI=1L*z*^h8pKvMuPyy&B>6v>!F{5#%w?rt ztV@1dv<cQ|+;b^pG?MtSmA6+(=ViWnf3U}2$pgxZd!O8XHB*dBlRcAh=010`DN`EP zpI^+AQrwU@y*^~gY-Yt%qH->Rek|W6$WC*&x~e$IF=KV{`~C?`vWrhl<`G`vA$3yS z-|55-_n9;1xEPhJwey~*Fi}e7<zv3eSFTIs>z+jl98{b?_nU^kk62)m{z-Y3QqNod zvUzu32YMaV54_RtGx6K@z<*_{SQ*YYbBRy*b3|C~sj9R@a=#J#$+r1R_-`DonBu)n z)4-QWd_li*?Q@gb{+I(5Hy6i5o=^<UP-Ye3|0BNEy)yNaw@A8n(6vIwh1{j@Bit=k znO^8Dv4~FC)G7PDQ6Y6bGnez_eSbgvl}P2gq#N=)G0@`9FBRoWx_=t|?2m@A)qUIL z?s+HT!->z_E56q&&Qo$Wkh4Erc5qK<`<>jXEl1WW75<+6sjFp?im!41HoZ^Noc~>} zyz+UfnZ0`AwF^zoanbC(_u8fybeS0{Jzp-xWKgf{z%AlF+0mosyyE>z@l!i?H%$90 za45LOSK|WH`-M_BK1t2{e4Rr?|H_o<+u!`!zju9RO3pPmwzAHLbrF5Vt)byR#3uZg z+^2L&npx&}!MYD>Mo|gE{!_O0-*Nu<+#&3h#!)s;`_?sX6BImZx2`s`$|+LMF!;le z`PFgKbH}aq6<3akeH6UpF^%`oyv~xROslucFVzZpS~cUD-ZZC;VSSu$|0vp=+L|Ob z(_O+Yq51QP73of8>U*|m>%M*Uv2AH=;rc}u-dX2nUM=;#vUlR~uPY4KbT8X3y<Fbh zXWQ}PDo2-uCsrMei+S@RS@~Yc@y|Id@srqvcP%rt@_X%>ta5I~qLbgNmA5(D^j`mV zV%k>!GY?Fa56-t#<Ew11Ke@t5M123-NfT`rWiNgt5hr|H@quErLDfykisQGJot#&! z>^bM#Jm0)4i(<Z|{eKy_NA~T~bYsIkxh^-l?LOMX9e%OL@btc%o&(bp>Q84q%?T@B zymC`+NDlMjQsq<s`1&>}ufDulLNheLrK)azh2-MI!%xINx<3v7z!!Vz>V0PxH^I&A zf17U`PUvJ>%eO`1th2)tt$R5W9tu^5?m4r+?K<DegqWSnw7n~Yg(g40(-$4N*)b`8 zy}>Nr#Il`5Z`nVcjhFQNw#<J|UU2ps`E1$u4*%XrPpvtA^~sLitJGJUd9<7S;FUMp z^wKNLJmsO*$~nPPTjv;S?^^ZnOJ1yLL7usYWO8_I#qHRyt9HNI<$Z2X=jDrb>z+&8 zJ9nh;s_lfl!|Lm*ug7fq%6HDSdMD4iUHprzL^JZ4H`te-eD>PnY}SMJ*GA_W>k9r} zD{-p1UVYr)#`oGAmc=ic3+A7y(XhyWtd#QaX!z@xnloG79l7P7IsE1L9X@}>;f&vX zo%Nsp{XL>{)KdTPqBW}D9)ACJ;^pt(8$R=0`L)r%rop~e%6fa*&L?lwcQNgK!L{X6 zsrpshcdzQE-}$?8o!yb!dbfj1P9C!<%h>j+>)-i6$v>Zt*57=6rTu!#tJTLhd=^dK zGAF-m^YaCB&fmG3Z{lI`_r#jD_p&%1&v|Wly~KRW=hEogeZNm{ynN|L!<G5x_bfZ( zzi)$Ss@i1nWhSX92IbrJ7o|@9c<|2cZ@B@S-jjcdrq;zu?p)impLN-k&4<L<51CKP zx4W~eBs6HBb?S;E?3W9ZpIL8SzT`&4rmQc^OhoDw=6ZTec8jtSp7?9ugpTYimsuSx z{&h07aaB9hJ(TX9nIiLdd7B^aQ|}{68)t0)bi_94qSCeJ9r^*QT-Ho^_GxL;)cM*| zbWYFO+~L0_<et`3UF}c}5iiybhUvLWKCQIb=ydn0k=b*f*3Z@AVeLWD+mcs2I&pNJ zj_%Smof{3c;}!nR^}Bui+p{n?smtnTOk@mAHkT-x6=?PT>R5Z@1n-uOQ~sY7auA-q zF+$F(=H=#>vS%)fo+)7!&e{|tTwFZObmOipQJsvZwMj?41iuH(_x{fa>TCUfc9P=` z8v{cp2fhkZ6;EF)G%vHTG!^GC$ECdJQ>$%61X-dt1|&E#iV8ekIU}rxRme^+wdLU3 zyqoWoeylc86H+y-`{pkB{!QL0hun*5cW3Ubez)`aJ!|9NkDp)9XHfgt^f0V2DM-}q z=C(OX<~e7@mMwhd-*af0BA@KMpaT+7{9BZLubL+N$KJPmz#8p1Vd3_e3njjHpH8z7 z`l6+-b9zhAdY$6y6DJ5bx4+i#G4)sQ6@R}~cCL1S#I54Ahr0LA&TQM@n|)?!(u*}- zD;16{__4?2^jiJ=wD2Gv=9^Zp(j^ZSH#wa#X1VMfUASd|X&c)XLz5f77o8E9sr^Dv zsg2>*qYS6wDQU4hAIqn0_?aDdX)Dw6m`lz#yGs@RIr?vUDzQzY$kbh_G|n@eOX=Zp zb*?;*E_;b-C2M2meKon;vygo+kK)>pOa2mOm!><X?sZ@dzMiQmEP8ZN^69RiO8)fr zS0c?@-u<_JdndL3=jxVMt9t_qW+%R?-&FE?YL{ZC^%bSLWf$9a7QEo-j+(OK+JXs3 z0v7*%9eDX%5zl_c?w3`XaSPcFKEBe@6D=;W@$8=5i*5UNoVL+cOxpiZP$2WM^l6<i zzauWU&Y#^L;~I0>lAkr0=d5b}#zn<1U5*>>4NE<L{38Ruv|+FNm1nn1Lmx~{oU`z0 zlS|u^)T^OMcaJZzndvVX(aHCA($3SWGYx)tFW+%^Ew7~awtFh;bbHUquB}Zr(f`JC zw(QBhj`fmk+wV9ZKfP(evSiU8t0wFSh<kN_<!I)DdI>>;lGCdj)}7>td~r?Tw9wiR zDaqc24}(?gE~zx6R<*@G)(U$e`JEx7{O;lxD=gGGb?bZ6IdbMN`YgQ8ldG&xso}NA z?cy0O7q%WdcVY8fjya3oJNHg7v{$+N>V^80lnOsdR@=5GWob`Dny*U!vYm2XA-#O! zx5#z_AGy`*?lasplKA-5_p(MXSIVl*WtI8bYZ!Zy&a7R~RX9KS%K8k0!u4TA2fd26 zDA!z<35{fXQ8t;o?w}9DOt$hLeLMF*d$sb_x)raEC7)^DswePOcz#uzfsm-&xte26 zy7LNJ)q7k|ItR_)S-QBNUrLbQeI@rL`z}+?->jfKn6p8DhXykPLp|Q{4i$oV5M$IM zviNeC$iH>sDcYx+JQoOTYmgRFKd8cbiqDhd=-SO9)(#q)p*gC88<!rLwqhao-S4H# z^ebO`tLxV;m@72H=<?I0b6*zA|B9Aa_9e#igs;w{fLWcT+dt3!Jol;G%l`fKe>e}s z)tua5dVjC^x-8el3C~2&PT&o_{%GausI-va=RU3s$v2*<PM)WyQDo+-E%eE_q>}UN z>8SndBv++rb)LL;X3k2nDM>-+&v0-UT@f=b^6Tpt`LbrFAqxjj@ARkIMKM<&Yc5@I z%JS<hn~BPQ6WdCgS%Nn;?^-5RmAIWXbwbgW+1ILd&+<%M(t7^nt&p0EN1G-Y@)@)2 z^qH7geQDeDi^Y~!5C2@Lxo5J2bCdaT*QYmc-U)3hiC(%W>&3SxrxvPwz1+X<n}_P7 z8(BV;&(`P&if-t0l#sEroF&s?v?b)Cgssj(&ew-Cj<9j^MrdEkQFcC?;&|SgGv!5| zx1MKa=^~+78)v@0<&@)dma{%S+VqZ=NdDonbvs%U&k9cMdM0sr-~UP1HuH4;*UnE@ z^;p4sxIK)sbj9<{W^DD+_BT6cbTC*+Fdf^HC7N^9<ofwr6a6H-9G6ue+^}@*-buHb zlbuX-oC7{tYhV6Wz$>)tVsNv-yhYY8Ur3$MoO6G|obZma#mDnP4%JD2GjYy{()0WN zI`Zfzn}Zi}W^2#5qV-9{Zl6_hR%TSdLZO$sCq-4(T(XfmCK%9lc>1YR%A$3uDsvpx zdn~FA5j!<U^La<XWcRAu`V*8zPIWQQI~c6=^sQu@uXp6vm#Rx&Y!Gs&d;4jXG=H#= z-y=)G^GYW-9M-P)_MSBToWODepO-P~{0@AMx!cfT>=C%ec$3+Izf%lOnb$6;`Zj%0 z^@^|SbKDL{9OSi46$#1Bsx*0X_pr@_)QNMawuUrLFz6GnWYdc*)eF8oVNTOa-4$$i z|3#%+1_h{H6>5%H_d{S4PpS9o?&tasCu*?WUz*2xxolg=zBdyMlHK*(Q%-lZObhio zyv)$%=JMH5+bjZ3X>7JpVlr7|zHs`bDktM9nyq>_el5K=r}k5}Sg}pJ%BF3PA{rDQ zvc`xcK039jtC%Tyd&49SSrHbuHp!_0OFkKeTD;NVaO7H;=jnMvo#|f6jrgtWY@)?f zH5Z?cdwOM&O~L!1KR?|}R{NYvJJ(UBfB(h8Ssp8cXXVWJGgW58`=r{St5Xz>?H7t% zx}#7Z{@UgF8lU%-QP#7!esP>QQ*uiB+^sV%opo}vT>8n?;O=a%;6S#uulvOo2{*`R zuUK7>C3r9T<!-e@*4h$wOLq3B`Eq<V7dvaeXs(*mj|`sre)S~T?i(e{f6j~bP0-jo zf#Zy;bY}ZSiARgNZ)AD5{hWO?I;mavV8sTR;%1XynQQt>?;Ked@!WUI@w|nftxw-M z{v{?^)1uY?#m>88uHt3UU9WWeXP7>=`zbTa-|UN0pDkafMQ@Cn#O~g`<~E|<+Zxu+ zIPlx%AbS|&vY(DJMF(tCzxPl6{rCR52L7EDS$=%~{3r2UvXFcIgKe>F^W6Q1%=;V9 z#Xpc%s$IVOMY(kI=NrDO1*3XpxO)Eby}WbmK>mv818u#Hu1lT=-gkZe{Fx$)n7{{p zhXwQhADlG#)8pVOIoBU{d<q%|)F1SG^`Fe0@I~O=qGv3-x#R8Y?=;WvdtY3hllV_^ z&z<#O!(@AR-;_FDsU6)DU-F(~@0OsJ(}Gf^$|V!r@>Fj)F8s*1-dFj>B@U;u44)mH zuSzz(;a)dIX}-6@W2*~K75)mQs=liex9ZenUv*h;{qu;=f&ZVaSDf^Jy7&gu2WLKW zcid^TyH+E8)OAk{_w~Ac50|ZC`&WJCbXHr%o4vMuJLQgl;ELN?v9ImA>|^7;k72hf zG>U2&XER@W)4QroRZQ)0zU`5M)!93)n)=*l5fy*M{wC^f>!R&DFYEr}&5P%~@s2(J z@;&RkcI(_ySBE{!_aoe&>+X5J_T)RWMX!5blt~wQZtuKs@3-8)i%(<b*2`D?a4-LP z@z3l!88+ko^9TCRuZiTfTfUJ|@&3nYb9){B$H&Lo)U*F+YX2Y)s!D1-HDf-oGB8Bp z9seMrDnTCw$@PhTF1l~M;msw!vzCQz+Van1nd?<G*W{VsCSNymb@bYz6PR#$itDGm zv#NKF?fYJ2A2egpv$`ACzu!7$c0=*{4MygNi%lfhCrw+*BH=xITFcaww+k|7FS&bc zQ_EN7=*;@H*4NeEZj-<MzWQACxzBSx&v~rOte<oKwAZGK{%j{??@ynR%=264GxMX@ zeCNyef46YFvOcx%&!^N!+2w&N)@}53h${H*A22D6W#aTE5#>orXN~wm0|U2gZ2tIv z&cfR&Tt}JL{ErZhzOHuBruB=}vd02fn+`SkHXZt=tY8|HtMMwGnekLSW2ehRPxj_X z9(J+|WU_SnzC_Jh=xW|&y7iOD%{v?=9~P+EW+}C9`l=Fq-bm@J$CZ22tm<d_{LpMz ze8O>F?zBHjmuhWJciD;LFR7Ttb7B9+g@G-~e~+J7EW+iuSIH>KbK%x`xyvSOn=Ux< zWp#?PXXKAda%;_}v-9l!<1BR9g<W&{rFNw~EN>jG*EE!@@>OEK5cd0=ydtla+r;G& zW)2g1g8b(+Oi1iEGqUOmd13X1r*e+VLWYwvr7IrmEBrlh`FsNh-`6`W?$vc$I)tn} z6ZJEEjOt!Foc8Mv)2eF}kvCF3cHiq~f8bdL3tp`lhgXyRtG0;eCiK|e;!%;Vn{+c- z{P9J-o6Am^b=jPias72I^OxMthL4-vXU{&rc)|^@E)Bo`;%nWbW&Sc9-Ptvz)JC^# z!8zU63jSL!y!B|`EU7m8M$voDfNwzxth2toZF_%QWB2sTWw-b}9yLx|9?_X8_HD~= z&2>f}im%&5J^HoBeePWMyZ^aA8XIvu{<t}Y{fzaK0Bc`=i^9bocmA~PQd+EW(%{YF zyWM-92K+ba-L>z^GjWwOQc(pfR%b7`czeR4167-Z-Y=KRn6cl{Sm~&73WL!7;uYKP zw;H`Wvsl%>g=0#9@RHdNZ6la>$0>jKCpA&%$gEGFrp5l>{@3((<m^&=?%hW|+3OtN zIc0+PPR1woZR<O}{53hhd5?FbyPI*&qmP@uO{~`Vr*pzfcF_)om&+$?l~>^ih<~@L zmv8nRJ}Dj>hljryG&vUBvbR}ygzcju*JK&-2HVLqPO*mNn|p<>IQ4adudGaKlCF*P zonOusTUH;HG2-9El-taGVnup$nR?S6UFH1OpR_)0+Yx?w&eDK;GcSMLu%ueq|3zT3 z!*ri~^>a3fGh(Lq`+9k<KUU^_cgKxs&y?=@+}6}<(qCE2X)BXfI_Ki#V+nIiRfAuA zbjxWkky`&QKsS5(l%uQNoGgkXUVZ2L)5Y5v81rYEx9h6~a&nW-Jqpc~V3I3Jb~88U zd|z?dWasBR6>s5t#V4b;YRr#*XKCAFzWDB$5VJP(UXJpM>b{RddzSTTzEe#W*vIlc zS}*3@vqO0%aoc*kauc?sx$K<&P{X>&%D8o67^`baTDj+RLn#BFM8^7vI@bLEs<vOO zI}T_hl@;zUx31b8xZrA|*y2czj+le5d9`Aa)_Y8E4gdIRpMXShc<EcyJ$#)fKj$6q zopV#6czw9US+>^bRWa2KHGi+WO^W{Jc|GTq!T0v4<JJ@Gzq+a3FI2UBv+mWYR;eeo zi9bTWN$&JfT`jz+U~0^{m8Trf%@nm2IX3fc)rkW?-v*@g{9eqTziV||VR&ru%A4ke zYO|j0=6ifLM<)C(^UJ)SOHALd^4@yy;Li;6`A0*)JBBQ0dwZAZ&H0#BKdsIcBz`zt z%K6;Uen(xglH%Uidvhi3#LAcXy{nG*Y`?+p^4vG3<;?ycS#!Djca~*j{A;#ZA^-5- ztH~u2xxY4iF@Jx*-#>8AXCu8;50B{mxyNT(TrXaBuPw^{lPCWNb@vU$$+NxB)~?CE z(7n!4JH9mN?$dSe3RljZ|6*Z##pTrMF1@QWj`nR>yKCA1Vh`5+RUhNOSuOpzDx&tO zL7ASE^V6Emldbum*1TF*x7hL6O!u_huWrpvpVu9a5uSVDTzGD-)jR#8ey0!bE%I0V zy~@n`*PmlMX8OcQ@MkyI{<MDSVX>U|`_uc|@@r=)^^1jVxoMjFVVT(<u^C18g7m&= zU7tQpJ}+jMQg(m8wBn<`ojVMFzWw?9(#FlpSG7%hTKBZEMoqC_O7f?Vi(kE-aJaKz zrOKi?KQyYm>Q=6fSG#v+nvAXbX7$ajLK_`)MAk4B_D5{!*edy`c#4*w_R^V7nP;@l z^i0(`J!@k}|Jsm)TB17Ire<bgQq3F%H{DiE&=SzTGB;xXS<A?Wf6lc&{Wp*I_Qm+Z zC&|U#-J01cHFvan1pl8)d6QgRtE@f$s{0up8AFqu6^hrYjT$c<Ieg<mX-W3R4|lQ| zeAgULV%7L~)PMPQ1OIRXV^N<KC%t;loQ=G8;?pM6G)L|7PEl>wJKnWw|Jgy+XN#Y_ z-4iwjhJLa}LqbxEOFU9@3Q~*EM?>~TaVErsUj651^z!r`pGldM^z>gEWjb3&dhH54 zr7}fNWY#1-m4z1$`B%=}W8$p#`H;?CmjHp7!bHI?CM}P^K*gn#FLC7tu70#mBd=li z11_yRjlbvjzCWvC{5ehN!2kD?cD~<Ne9rcFk-GoBswagE-Y@N2ZZ>yM+t#MEvBJbK z!{t$xO^RDobx%aiTtPXbMZ8=c5B3J#U%I{R>xpyMe681+G!?QQZIRk3Z4|w`H^YO! z{o70HLv2k$ZStxGRXQu$OAj3?Jol3CoAln!4Tbvz4Hs42>Cw_qJ)_mL)IrtfoTIAA z$>8YbG>bELxRzXakf5X|k@Ggmu&1rh!(dKFYnkEUr!4m?K5%JqzB3U@tmAXzstYw) z_5Q8dx-5g=yL#+cLtB0oHi}*m@KRx0Xp@xp%G*;^Ie>kkRo08W;_l9c%G+*seEZVv z?i6~V=SZ*Z$9H!ZR&1!>I<w<Ln&jal)lSWAGdqNB3>`K8uE@Dj^3HW`w)BjZ=L&r; zxy`sD*VXb!o8#!eW4dx@+WcF&zp{kyu|G0r>NfVnLQbxNuWV;@M&`wx{hT1Rtb6Kx z=Ce_zl>ymnqij}e4qIMra5zdg#jTwC<*uHE8{|@0um6y?-h8*ua#s3EqgfqCB9~m_ zU3MYx7Go>N?8VRK?d7UApDf{==o`_0^p=k1w3Qaj>0T=%wu(B%=QOiuH=Y#m`&=Hi ze9rU^k7C`d(>F8jI9Xh{Cw$^*p(|h6?#0W3+4{CwUN~X7VefMFt=A_@a7lOHF5Y<T zP08`a3s3kh+w4?ib$&kg+XZp@=hQN0zRJkBpq#cuUobPmWk&(iEJ^np$9Obv*;ue^ zw|-x<DrCc~3$N;Pf5gp+KC`oD@|8J(g-#P=pEX>(wUYnci>u}mg?s(^i{cX2Tg*SZ zw*7JPHxBc@(7xVN41d$!TiISZEqLQX<}Bt;MfShXoZsBEPT3M074h8ckd&>=yR_r! zz9k8JyGnN~C=#-=lz!ptoS2s1z1i&;+bfnkrs>C<dvAmsU3L46X2^`1X1SZzYA=00 zmRnftWsiL!_UzTe7l!Q;c}098j!y%O7d_H+Tk=du%3Q%ncCSOxJD#JD-bOwVw`w`Y zwS0oq{DOZ6YI+?rSQmNJq;tN_)o%O~{KrPy%6M_<tci0s<;9$PX?`Np?%c@@*Y?|` z9@Mee_E_{nXwGrILsxtztP9w%Us>q6)Va{as^y<gn@!yM`;Nhe$=dy_n=P}xNY(a; zD}|J$z483OXugg`-OE&@GhQau-gL*aU4LYIW#wEFR{bgK5U#qD^WavBOVXOCcMN}I zWqVsg=7rAqxkMvL%UEoC$LTA3y<4Ss?-V=k7F)V+zrtO=+WT>derh|!f3y6Xy~8Xe ztJzd>>c6ye_5b>EVx#kyu38^j$a~Le#zbMGbDc)FW6n)E{`ttZW4UrM?XO$k@97nO z%G<*BpJl?H3Twyt1xzy~HlN%1WNxU!o^FG3rfC5m<hCWm$Q$Ur<8QsWfBN%lQ#)sU z*;_HcYxak_i5q2v-ihhw>E*0F+OoiT-EaNd{d2#E-BEk<-ErIfx5As{jrY$NRpmY? zW_(3E`)b9un&w3*zw74vE-SS)4|5EQyCT5$U%)Qr=%G7DWmD&$jMTcJ|66x?S0TTh zlFpaFz9i)wo+A6*_nNB<=g*#e?YO03uT*a6s+={wZbw-P8ZIcid_KC9p<8~R!RK?_ z@fT#C{E;?)Rh#|A<4Di%8|w}-%3lwPw=(?kWk&w`nH@$2>mPC-RcVa4aVIvu%fBP0 zXmc0)2hC{;^Ir8We;PRTL)gut@-IdEGAnf>dv2fPtTZxLoAmj{EnDZrYZ}tkt2Vb< zymu37zQ%FjPDt9zn1hPn*46mldDLT4y3X0&Jnr{Y;bf&>=k=V0`nv?vG}M&5CT{9b zPV0Bxz_8xisHvp%-o4EZEU9MQXU<wkaP@7T{cUraZ3UBe$eaVupYoV`xgHd+Oy6=? zaF3|FtL!TI>GMlkw|W$|))s9!bgO#Pp}MoZ>mR+oq<&<zqOHY(&C!}a)cmi{ojF_R z;qAN{?)!=Nj#?`17CAScN9Du3L*GM={kB`EclqkBqru@yO3&QvzOuK>oXe`9!fjvl zxcx_ApR-=bhaPcn8;OI76aUwp`uRS+<=*wn*Zgu!Jm%}feijeaIHv!!W+i{&pA!>j z3w*Ht_MCOfv{_eYzFPlLdTML!z7J;`uWV|%FEmZe=UY?SydA&xcHMu-FK5%2>{MQ# zba$^ugh}JAiMDEgXKwgby5i2x8~?X*>Fv>Zs&$1SJ=4_oQ|^)bq2J!u-}spnm}c`a zxzk5}k(W<-@&2#!h4U4pp9d=mN8gM(P-z^z?1t7oy}EPy0UxHPEIDxcxU_}(f-H5W zST`L(F~RjwKQ;+2_teRH{-UizTB~%jQ(mE{lFJe!C(Z9yyIogqmb(8{PHQ>W)P-7> zeB4E=FQl9^lvyl0@od$U(+dyg{_^_&%UrFcebq|0rCPHN?eU!I-umj)nprze8YL=D z)jxaUN$Jm7kH0=zr<8kN^^RtNR`Btt?1}ct`yTP!5Wd=cEb5*1jF&wco0jYAy}DVw zT6kf>`U_Wcrq+BiJH7mP?NXC=bv?r~9o}15|HTCDyprp+W&xX3Z|6muY3mr8xqe1A z7hXPeZr_tl{T~B_O;=y>&}~ZUE_r!WiBWt~%opR|t(_5`uD8W2Gdfqqsb{XNh<URx z_1fc^MrkeY%wK#=*nc(sVx$(Ui}I7M)^Cz>S>k;aP3N8!SyrX6SD*8<J)?fScWZUi zu?YnNt>+X&@_l&T87#8fd_LXMMd!e&n4_`VXDs1bnbRxqA?DB?vH0~bg>&yLcyKD6 zud_R5BG0CddDBxR+OwzL3BJ}DY_;iG^Ayjc0iNP3woJ0BJX6-A`>&_)MP5qdoZwcL z2@Ch!^qu{}iGSw`mzJXPrB1djk^h=5K2`np>jz8GXX$gnd`~Cpt#snd742+WeBOI{ zmB-?!gMa=Te4buxH1V?g;e>+IzuF}HzgowAH<@W0$&sv+A3J}Y&PwAO8Q~M+T0OTk zYd11Ht%#X+_pffrs?eRLQ>sn|+|;P8T$6p%K~XOLmCVyklO{TaZ~Dp2u%WqN+1#gV zq@`VUc^vU=PAO`i({V$*=53`(R^ro>XI5^P+tsy5YjRKFiS8|i4xERUl~{iL`qC!x z`zqVNZdFF7?EU7xi+(C?l)O>Ex_ABb#d<kx?5}FGG~b?EY_Bb<vBkXq-<t1h=9+i% zgfTd2JwKbbYt}l!vyqG!Y@{~EbG7bqO*P67&76Os_5A&c%!gMzPrt}z`oVTi@LI&v z$pQOzFmQ8xynpVhUe@=%*=<keUbeWtJCnUeeXsY?sbBKK68u`0z1UcnC-hR)z9HoN z?>k@Os`j_1UD6R;XkOfM@6po8P5jdO8nV)szY;`6cFoORB0I}%zQxU7o0hoWKUwou zJ!5X=J+EbUPnKD~JS-V66m>Fm;cm{eeD@DNQB;@w)p6>I-Kos<0C}nE>K!LnUOrQP zaiZ^yi+bNL)oQK&{5a--jL*sojEA~7&vBfK|J!NVXs4L--}7C{jZV2Ix9lw@tor*| z?MkA-;`s~DuUfIJonvzGp<PqjKC5l}A!fVgf^sF(<*M^+e$Tjlq@ARGZkX-%;^Lmh z%*JQAN>9B7XSj!|eYQMw=i~9qW)siLg})S#^>+7LRkX(JyM$r&w~!Ys{U<w5@D=;_ z@4RJlxJ~Y4vG|U&&hwY+ulT~!$!RB?xT^kk#M9fq&m5Wl;xyA^?G{y~_HTy!pXHgI z$uR3ZC6x5#my_WAcPmb;xaQ}R*0=tX!=B3>`CeO1<~}=TV}31pY5d$5uP47fef_2M zqSe2bT|Szn*W`3R?4|Xg&{binJG(OG&-1#Ud{X9_-)`aWGnx&btv<D~Ua$A)+Ln`F z*A}RW?p<4v7E;JMg@dhk#*cqh(&Zlyy6EKb<xM|+!>6Rvd$Q*>n~737LXWI&7+39A zUG8Y8q9<uAsdH}bpChVg<QQY_UdTT3=6y5oYv}`Qhi3BK|G0FYsach-!E%#{`wYFz zjfKA4xu`7i=;yt?hfN;8`D$hEvHg#I&D<9b+dh<cf2sb}?6rTfeVE@O`$8qo^zMfX zr@v^`nsRCWPSKd;Z&Huqv_uTo+}r2=V`c&W<f$87(`D+mncuy;aIT>3ypB)1VtyTA zt36To{AGtr&x$jL4_(XJKC^?Z_w$pv`^!tc(x*xM+2<0cl_<#nOK(H=hx<_<XR|QW zXMIaw`!_PZ{@jH5vwqxV{<kLW&dm>vFV_Fr(y~&Zews;d!nwnHG!{+&xqOEw!<`xr z*1x^sa@-uns+{IhmsrfaJQD5&isZ^3%w#vL|5Wqd(WEMyZ_&-waz~m@R(w>5+B=nf z<BP<fzFRC3wY;8K#!X4&I<nqwit$;lW!oYQR5SHmH`;{Tb{TIA6YWj->72=@e$xD% z;hmLc<tpo(a=4b?ezddg;*SKebyjTGryjdHr(pKx!qYN^*>elTQyy2z6uzEQ5WTtZ zv}|Fz#Y4SQ$JQ1c;a$+XkmX(4wvHdZja_Qt!NsQqV>na_1GoA6Jf2@VY0~+oZJM1| z#bR>iws=>By3~vB$aub2uOxbTfM)UH5C24cJ!7hzdG)wu-3lHX{AxFR;q_?ME)^lh z>w!DAU+Ycq7Yb+h>f(RAw$U@n^D<NJCBZ$>8@@I!+a>n1WP8Q08%^#7`+r~C9Z)C2 zpR@MY6An2WwI6!R>OY*9To8PN&oz-xL`5_wJYeAiHP-6}_D-8B-&{OU^Y4ASe$Eqz zOgG`E4FcR7n6fW)Zr#E0+;io1!|zXZ&M*HcIjvqT?D6J`j;}Xcj5mn$Z{`zUBzoB5 zMA4=xnQvnn-7R=L*KO;$crGk|>W=SQ-<He0=U6+<Y`aaDvg?U&<+(l2yf1I@F1&KB zM$@kSc)$@8`QwJO)0X>gUbIuSQ{Q9L@j|27MY(db>ojvO>p#|>^vN<JGk9NA8pncE ziTe`A$|qM;N!S<Kwxw?uGdI<@Xo_dN>$zvb5&79S=KoXk`Fj3hvG$Y5u&h<v&*yJ? zvGjcY!ToPOM}O$LFe~Qo>{OjJzjcSdnyEMUs2gNQ%N<<pduPL4?)=RqUAq_V;5!id zC*hX7SAa>aYOi4J!5NFQFS}nC+SsXkRb-=O_mfpKrUvwA71k%p-#uF4G-1}W#Gs!U z=bt=!{(JJ1T+d5aa#Z!D7eATx#naTJmsM%!tUS%g7{eQ1%nfQEdQEkbn_swWb>*tp z0`KZ~FuXiv^3rS7=GGNUBzO2vdUi9TC!J&CGI`be*92FsU$)b8*8Mq4SpQ61a(VMj z{u9Q_qAXq-FALVzW!Y$(cQjY*>7;ZEFTdm`8^R7vwANgZp=Z|fx+`_*tZc8BihHW2 ztlE}!ibI!gN3==#DNW|osGFW98L6IDk1hOIY?8MAv6$3YRAzW~@zl-ivJVWF9|&8U z({ihiHN<yoqxKOmrtmCLt1{#kvOPOZ&+7`8d2)H5pD_xWe918dS1-7^kvOnjAf z=}y#9!CS}rHay^9y&0bQypW4^&#dn(yl;+wN|d^^=Xj=q=f?vnxkZ!8SXXUX<*?Pm z@}=@Ojzd?ceRB~LI`RA4<7tVz!W7<nUn*^sTC3)HoqbtHzch33R?WuDTUQRO;JtV7 z#T=fW^UZ8M-*aB!yUf1j)-vT1b_1XC(95=-zal2Rv-jgyc^Q25%S#p8oVgMgjAmGB z%$Rx1Ugb=U@98J6FVxu>`na>iw@>;KvA{3+sSN*_3u!EASyOMF*%FwRz1cr$pV{oM zH8cG5K6hUI^ti--!Mt9hqvbQ^U3qo<M(VaLr*(3t@!GquQTcO6v-sT+*35tV)Mm`G zJ~iLk^ZumM?{7UaN$L1(%Xry9%lVbfdW-iAU6&>IXGop$E1dMT=j@N`8WxFvm0K&8 z9rt`7@_c>QA%{<zoNX4BU8@_+?YFROdzh=^7cyN#q>6PrcUjGP*69}~{9AlMk-Kcl zTg(5lNj&xax_9_Y_7u(%o3lVm(|EP(j6btZaxwnrpRqCM=F>Ze8oEt(`0V~sY*l`_ zc<0kQN8di%8gu0RaU+{X<BulOjFr<3`O^b=m)i;FmRR4K8DMSOA?hk>v3!M;c6V4p z=*6Xb_Q|a7{`GUN$HenRlWf>8zxX}p?9qJPX_qg@>^b$Z_{<Xd3;cn;p9`kO_%2rC zxzzvS_#8LiA1~GSEWa2WlR0l;`oqWn<Er|;zxpY|y?x<{*4$5TWu7H&uCbo(R?tv) zYWdkCcNUd?F<z&h*Ya}8lLbt>U!<ONRQ2j^`cix^*rmvC>4!xIe-CB(Rebecedg1v z@J&YrSH~CsEk1cQUt;@_)t5ehX^M4O^>$kDL!PhVC;D1{d;eOlv+U>@H_6ovk9(~D zo{V|9dgtx=r<DGAm)UdeJv4v!kG&eji>^nVww<tbpWyoq*SA05yOX(oezL0F^tMXQ zde66)T}w7@U3NOdI(Ayq!swS~@9xGuxtGCvc~A4l_@o<e_x#U4`076sXmqU5CvoE; zAqIvw`uNrgnc-NcfHXQ5oSc!GQks+Mo|>0hlvt8qgtl^FZzN|;^w-+||8#EZPnw?` z-8p%Wg*lVV?Sn^_wB1l_l~GxA$}xw7v-OE<)wZc8CMnxKZED*lP&HjnyY<q#HLqvo zB}W$sKW}i_)mxVOeb?%@=ib@vE{WZ~PWI;a|Mi=6yu03fdb!+k$^YN`@7MnSU-kB@ zw?1=(vb^9On@v@|;Yw3Wjdu#FKfRTwH20NM!KQa%>Xxrk4*lJjs6NlzDtgY8$s6yM z9Bbg1#dpj7&AKIXrC!}Ce6T>cnD@sH>(26Evo!VGgOgr8;l08+>vRQ&SjL}qb0yW^ z@wB}^lXA)Z{h74O8#gpI9MGxDUJw@$&!QCZbZ`IC$)2Z{MX0&C6|JjPcv<55R`~eh z&Nb5ap72=B<Oww~h%UIx6ToA_$;4{oSS`9F)}&9kZ%NY07_-77h6e5%a;z$tb)N({ z2(bk3oY?rVC;9khrcREu^v}n-tX3+PM+D5?82svK??tU6$}4vipXvN=-Ts@U^tI5+ zmfdj=^1IjUIe&yHg7Hei$^+Mz%@a?q6sTJxpfgv^g69Iqv2C)m-}UA_%c?Aq`e7$* z{@@tHI``QLeV4Mz)gD^ioa=WiIH+5|@M2$|!a^%woi8oBJq^xZ)}QRXvs3VvwxD$1 zl9*Ek#)nm-elAVBA$uU}j#9=9p<uRqDj7X~H!nZf&UT^scE&H4Q+MZXbl2RGu662a z_dbRD>w=2{4@q6<S~i={`gn}`)TP^eR&4V~Ni~h1!opU0uhF_$q_Fux+qR6%w6AM* z?q?lRYZML3<7q!!rZrdU%+f<;cjQXvR#ccaFI1BCUomI4hnC`_mx7=6aYs*)i<ahf znYH2Q@m&Z0#2I$Z^^o<H53)2UQpn3Mj;X%TXXx55edAchmdSY+=RN35I#wCN#IyWy z^hv{)DTgnX{0hk1vYunj{j(}T&b8N_WGw7neX$L=t5@05TV{0ge8ZwR>kY;oZ+9%; z$hUijN=fphN4a^k^;}M81s=>Re;Raa>T1tghVN||D}PI@SN^tQ!S=O0E3$Y*o-XeE zy-~em=Z)+|qTL}I_D}uzj8A>WmAm%4b~H`RHGZlaVIO>>RCH0gEhmfGtBG2US37;D z1SZ*<7@sH&Z8UL+j97C$>FnGn{s``}m3{}iqQsLI7Vg||i>uN~v`0_!P=P?R$BU}f z3T|(2D9+BzejxBWrsUN!J!xe|m4ko2Ywu)vm}wFs+flLDLPkYS+vjyi;IFHf*TrNt z@IUeD>RueGu!X~&>BK_~?Ms2vbYC5smmwei@q@$Ht|brmMA-BRI|^0qs9JyNl61xF z1m9@WLtSaDpO$`leo?{i(c2uu%Nq<o_#OPSa#nT97H9eN&Fh0+pEB5zKcC}~$UWEY zX&>i3*mG8HY2EvU6;EG@9?sajU%%n|qra^yQxwc+mF(iJF?i2Wbk=&&_O(fpvuCE; zweV}7uTk+x+j4tRR*~e78Eq%h(~gR5T-0^bM)bs&#}!ef?ddmU?Jl+~cNPf!EOlt{ zo7j8p#St4;ItjSMTvP7atSnlr_0mG|tyo`fmSdWIumAPOnl{Ia-Y)ws`cU-h<P*kc z(m!loRZ}<Za9U{u^L*hmMVF<EnwwWGj}Pzs#j=Op<<tD*=dV9DsdEf{{`Zu`dG5T` z3A-iD-o-yl2rOW~`yng(sZ_~XhILXCLhn5jowZKmYv_v4m&1%^z2u1tI3}6Aq{eZ> z?ySg)$2GGG{64grUpP{~$xTmIa#!g|YxzZudK~NK2Oc&p=)7n(!|&MQa|);bubrB- zZi?^Gq~AjOBKpNY8qL1sbIz4buUKHNXZ5#J_t&$1Q2iqnofmzyp+407@g}b=w~mAh z1S@`)=9#(PO!3>}ndkDZE&I1tpyo&JvRSj|S*%+*Eru<c^LP2jYR9ZEznj)cN-ivr zyK?PE6hrTi!>6pu!}X@B8rn_H`JMcy)9CK}OC|C9-4wM?&&lUvyI=9lNB?~Y|DVbZ z_Y?acL<q}m+k7~2(emJ*=NBCgT5?DA`j^13GcO&9f4IJR%irx4tGbs4>+Sp^@4Mql z`{b8<PW?R3a=KaQ*se6w1m*J<%4Yr1D;LTxW{C~jYsc|wvdvA=b8k;C*Od@SQHs-Q znm!}uLQK_<WbK*emKVgrLz$-MO8wxU_a*M%Hmf)KoR7Hv1uM)c6ZbPc*!IOxeYU(I zZ%zNtDc-Uk^3ooc>zbx{3A6B@{NMbZ{p0-~@xuT6@>d)DU8oSk7iH;Q;g>(}in4u& z$hmj-if;(awAuaqd&sv=eFf7;%lE4-DQOFNmVMfXYr_5a#!LNpy0kWbQLtV-EzU@R z*TcYL+E=x8m#kJyWIHuWy7zO-#q)29ro@|to%kuga;{6*s)gS2iHDUpdZ^5iHC-xM zJ7=0oNM_5tuKW`*^DZA!?hL7mi;hnHvf5#3{fy_Io$pOh`<zm@cgqQ;EbGdrX{VfW zxE8rbz1(YLExl>RMANU!mcH2KXPuYH;25bEF+sf8L;jM{<gJIMh?<x-u1j9$(>HJG zu17t~e0Rp>1$^5*QQb*xyWi`ZM<dtSTo0IX?A6WZYL9w;pKP*I{U7G@`1y%bdzacs zyxmv(YIEBCtl+T6R~6<>$@_XE_mtH8kG?j+R-WlcrbJ(jy|LiVv65Lq56zYouiT-z z_tzz#8M^;+9<?N&dix?^UzEN<5X&-apPkNk6JjS?hyHTYntwKB@u6Ewe(aSypt-YK z{kN9r${pLJH%-0Mo~a-FZrKl^iQ6yqbXDKzJ32?_Y{n_Gn&7=R&sn{!40=3kQ!wkr z<f4Af-b+g+t&Df9cp^GS^Lv$m54-ZjyEaCz<gS~yRr~IY|F*)sdhhC8dwoBJ1&5vV z?K<V$+xAA=Yr$TvMi%utowFNm99+8GFZIstUGMbnaQc2o`*O2Lp(X0!1>uhLON)26 z3$OZAe)ffw<}44(GB^3UBNH8$ew(o1Wb^GbV+Awg-80HMv#(^79@lPfDhilnay{di z<s!W~Z&>End=ZLf%ziefYweNe%QAO8o5Z$yk-f!5&#Q;8XuQ`usbcrL?`4gZ*gLaA zhx3g^O(tqmO;wiaGUc26)DqPt&)oZ(yhG*T=j(NUg#!xt*Ibf_(U>fJ?xTab?<RvM zfmM$ktlk<aTv>Y0y`HIjrs#>V{WqqRpRjKJR93lWqo3Sz^+`*!W_)Uy!?V!uo@?$e zVQ0<TXHzAj|MkAyv3Qr-;`HjgCk>M&0~%LH70+thd0x$K{^!}eZ{jvO^St`AS<=&x z-AwImPT1Mtga1nOgp1!@3cS4~@le`4sharJ`pY-WIeVYKK#YH7yyOn9mE5&|?{>Kg zRPtXpjXB%4BCy5!{nI}0HBw)>L#tm~>SWvZzrJ;RLy^qtsP^*<yI-3oN4%Cl{`T$T ziq95i+u{%9CCKp4IozzT(e=shtn<fvZ4BEMvsxE&%T4`WoIcN8nm<u~LAaNh+umJQ z&U;^2I=}JOx6LoA_Bm|w%g?)>;=`}t?{?)Y!$Pl#@;1Rudp65h=CjVOKEvA2v3mc( z{Rdd@v&!`JDcbhEk?8vw$JO_EV&R_0Msm9w%JZcUvtM~9{_%;0omJobT|LXUt=BTT z5UKN-=Zj|Ug6<zPrQYaO+xN}i-4QSH<yYp#c&+qn_b%={^(p?4>xcW=b`vV|-%8ZY zEva|E__z7qF2g?)L$BvujXM;-YVQ7-SAMfqG1v$(d=Gm3`^D3{FOL0vaa?YRLC5ir z9P<u(=1%{*B}n(!hwVSCqmntl|CjskaJ%HO$UnjVM?Aa~o9d74zp(xMhrjzD-RJPv z_T8AWM{`Nq`91pYPq<J1skH75XYKORA2$1<Z)(S-%xFDf@G;)X$mv!3B%7_bITtTr zdMhjbq51QV{aH(xSc4cRRmnOXw9t6wnY+}AE9>2iE8F5GG>AWr>FJL2`ub04RWWzS zb1{}b7W3BWEI6~yZIzEhOUUQ5lcg5tzW%XyWAaDWnZeC+_1*Ws%gnMC4?fYIWH`ld z@!IB%TOz#ozSyLb7;~a%^|qt$`(N+<;F_sC$IE+uO~ZV)thy8bgs%ymy?n2_<Nx=- zroT4(Z?0iB)O{$mk2_)Qnk8LYlg-6a?rOa4VZFGT@0e3>T&d8x>mot9_WJ+h_66?G zFfG@)^eMRPaJ^LB{m-nKS%H@;+C?JOmsje4{=g+Od#U#Mjgfh3^QEjl@x*=j@nhc7 z8t<1^gG-i#W?#Knzqc*5CUVj=L%r=Qa%QHUeZ{+C`MlFRE=j+!(9WK^JN0h*hpwmF zo2LC=v?tO)Pg?KPGpS>r`Kw-8pFbtmnjQ6Qy2>Y>Z_&?EJHMDk@IDp_71(?=%RN8& z^qYBVt2b`nxpd{yf0uV?_FoTLFT25eB1dV|!s1P?8^6APKlAcMqvvzh*!J=zol{La zovE|B!F2uQS?+5tf7ojLH~Q82(+#30nBS-!$gJtfI(t63?=<uL1DF0d|6b)Sl&&}- z(KW+y`PPOOHIb+c-78$JYg@e*hOG`=xzVFGbFWx*ch&SQI(EHjr{B-sz`pdw#w{|_ zCMDN(hpM<A?k+0mPn|P;V)!|cn%}W3>n^z~y3J{HWM0l=lj_mkc$_E3@WYb06<b&6 z`z`qs^uKYn&1us!9J~=<YISyW`RU9MlXI;%dG$JCZTRgcTGi**WD5p-VhOOftzFx| z_4MtG!{-&*J_uA9oO#aD{mzl?v!hL;a|NHLR2qxEV(<FL2K!oh_A!Uo@cdtDp_OZ) z_Wi+*8x;|Jj|ArmJzitP|G8&+(hu{8fhFFvj&7HHp73Jt&KzF5z1N-U=3jjoaem8> zSv^Ji4O4%tl9|TSUl1)gLFc~SG>!Cx){QN5bb1pXR#(I%p9$wQo!C(16?0eUiq`Vz zrYPBqx{ho6UQJsNc6`sY16K=+RxiF1pBSv0`}*;xg3MT($c1a$uY^X+?QG8vS-SG& zik_FDS7te#T`|#JgUjFOlbPkr<%a6|4HxS?@A1yL*iiRV!9M(jS!#k<uILg8-hlAV zvm%NPx6duM)u{|JUNM#b<)gF>t-m%(mOs|*cy|5#qsc$Nu799Y`)uw0p6efGw|+JM zkbW;pZpz<J3X8TB%dWKX?z#Sf_g!s7=hy$BPVlb#p9E*{F)*mB;OhkAT49Ok1fz9% z=T7$Z7j~35{-62i)>Owh9WJd7rfmy!Oy}ezFVeWRWQp4DBpbflg41%+3(Lj6HcOa( ze0Q{aR>6k{2N%yjDKY<MkU~keaQP-{<MV&!U9bFheg1oUhBb$hX5>u^)Ae`L>Y44N zwQi3?RA0xH<cIG&FEAua+<f}`&ZnJsw!MnpeJGUemuHoauDjlM%fqMk_ny7^t}o-r zz6zBk96PyA{E=+C$Y*$XhO~!joc8aj%kRwn?WiNo^S3o=YT~kXVdiF@V{U&BUcPnM zvh8LR|Gu0gj>C~NEYg*_WBS4t^Eex=*q`ApHd7*h?woW9e%5>&Zd=tw>PjVLU#=Z- zdHsi}Su#`icy^aUn3`HNd+-#E%oV(P_hn|Lo)BNPbxGB=DxFx_=#?>dQgp6su3wUN zX`ARY{z~<GpO3yh_3#{TO}xslY1ea(b>;s&w5oFAsyRmcgI3Pn_v}-w)ZD-?CUcUW zhvdi};p|-N<e#U$@2f`MtQ|etyIPES4)1E&Rv{VuPwu<qGj7?Z-mBH^Lg!d(HkM|5 z*D3n`q%YUvT)o<w$#ajI&ehraZh_yo75!pSwI$7po5f66oUeV`rW#)8k-b^#<^9Od zl_D?Kox15Lvn%QD=a)GLcBWgO&)in(p|Ox(^2PB5Wy{;xohOz(Hc`K{Uc&Ogjpr$o zuh!1zdUE@Ki}-^i=^1aBVzQV^_KHkq`}AVD=t+(lQC0`8>T_=L$d_Nnx%APJ1>G&@ z=DVyH-gV(<?!u>L&8ok$jwrNlUQ%EjD0@J6mivd#w}12J+cPcRul@UdPC}&iU+|`q z-gEwweVG^-tXL^br>HA|Ya^>mL_%k+Uti(!v9U|)*&F%W^X3|-r<JtHp8xlBp;cj8 zYM8rwzk&7hGmnp$X(}XN3cbuPw^@7V*Eg$Pg<qOmr!u!heeMJX&X*1i4s0DvO<i0X zEV7j=I69R272Z#HQ@&eRZnL%b{E+*<-tE2r{de8{$6~Sd8E=0*S5s<zKFxZS%r^O| zx$7-kkDik^y!~qu??$z@%7T<{i;l!RdsyyRTlLPyT;r<!Z*z`ttGja3x6dlCl9}gq z@Z_mUJgcq;N3zbEt;O^=wSBYG3by#I*B@7G?P6aYvtrew(=W3E;tDzv_6E#Yn4GKk zs<1hP?V8QKw?Fy!c|D0e8YJ-L=G1du{d1>IP1qO`t<?V7;qT<+iOg5D+KU;r-CsM_ zf4pkHFfOd`XrUeBtNa3X7O~x0wtr6ViFm5<+_C=F&M&ETc0Xd`mM`BlD?N2B=Old& z(R*5Tdhb`2goOT6eSgARFY#nhSe{?=w{ETW+r3fIUQ-H|i8lE?Jo>ZvwD_kI{!1U$ zTxJdwf4|~~uIZDy&hoR-9{GwvdKR{SgwEeNI(6QsR(tV1=eRyR<~na<qEjI_Yj)Pm z9o!dJ?))=<?+MjM44HC2>U1l_!mPv_nl?BJx|q)>-gC~T+@86ZsfAm|<;3n4H+X;9 ztdBTq&$(|tx0C4mf+oA`j~97;nI2Qa`YW&I{zH*DpZEGnDP3WB^?7RE5?|v3Yu3o| z3v1`!DLH*(f73I8qgpC1(ZP#y?-|YV*zn20UZX>tJ%2$?K~JS{&7#GBOpi0&S^LE6 z%301d_K3}~drnx})U?Wqh`-khG|TsNIPkDe%=q|2o#*j$;ur0iEWuo=sJgaq(}$+R zJHLn>o_0ApcEJ_iPdR*sYmV;!CiJ!0_Dmdyt?k2K#(L8q9I~kGDEy_t_&by7rcKia zsl7K=u{>vzxpAsBYsvA$_G!Oc55E+#G20USZ`Rqs(9~l88CxvxY+KrNy|r7rB6_Ly z`UA15I(0lX^F9`=Jipj!LS0V)-?SC-^@nPhmZ|rDiae5O_gZKDr(N3O9~UGt>O64# z#&P1x!=#rQ+Vy2CTx>sCHf`6MJMaFk2~qb#7s=i37W%BlVKA@!Pim&33A4J_lgH`{ z^O~l_fAYKc^g}@TYrm;09<J9E{5khs`m~NvCN`;>&mT_*?h{}%dl2v6`R(mY!)H2+ zO7<N4UzV6E8oy|seJ9h-H@`1G;TAe!|HHAfs*ry(yGnIu)yzq&b$<Rke_%!fi&W`8 zrm26o9x1mqJl69d?{Dh8w`)H+2xz~GeD2LBZges{k*R0ei)4ox{%i*w^ye@6Gd)A0 z{?HrOT`N{kVqY?UfyeSYKlhxgX=}{iBNySyxY>oBS?7<&)jXBog*|!l?>L+^7)#BI z@0s0iycgory!Nx$C-cQW`kns=-@a@XSg>2$@O-YQ#73=!f3_aax$ID%=4q+_%-8+X zvc*3P@65aYY-h&j3-ii$%6J=c$({MM=fzB|dE4wJENgtYkV(h1Lv+&BY4K^NyXQMS zb^Ds#>f~}(lj9+K^knBFc~io>S)Vg2+b?ll>Lg`!)M!hC+L_~~8X2uR60LIIf7@^J z;<@ErbAcx}d4tT)gU?<TfBc-8o+`>4)-dsX^k*6Fg4bRVp-B$uO~>|g|5;Z!TfZxh zWwTUwzGWJNS>Ei!$<F>Qg$uOSGzwfZE9u>O$)Wn+<v`byk<-=FZR?H&%M~lgJ6^xE z>A1qDFZWrWX-a>&c;d|QWBNL7N4F<EIi=1YpSZf@me}r$Ib1^KsXBWazVFev<l-KC zo}2r?qN^W@-~ai!N8A5Gn#+&y8%&qJFV{5CxO~lsL+zVR)TJ3KP8>GNVcQ^kp3Sh{ zX5o{yHb3Srjy~}G+qCJQ^WGRdjoa?NLT|CB+VsCX|K}}<bekM<-nn$)G}-1W9WA-J z+}pMm9*<w5`!h|c>5oLawEd!`i+5@NKji!-a!ng+pH|hHkF9S`9qu?7&?(l|JcCuJ z_n^AKp>L8pAO3Y8+Ua<(&g-UqOK{apZvmTBfxla~{|ddAD*Ws=7smw67Zr!X6mMi0 zuP%EKm@KU3QG9=AUynIw%D>8cI}dCYFcF`3&f~!5b6j<t@e}i(&pM^W{6SSMTz$?0 zN#)Q@Tr$@+9|UjF{Bt_kU-3!4UlKFJY2`oG{T~Yw*)Ko5EvUtPzwpCFKQp}o=L1K> ztv{%g>p46N$d>Z1G3M!C)PCx5f3ZNtwdM;O_2Q3AZVWX$<a*_oEYD%p58;XCb1m4v zIEh_|*{dtRPU+|M2frlDv>0O<_lK`>xcB)<^P`n(7-k-3*x176@sBfn(PpEV<&TfA zjA(tRtFi5Iz<r}>4BXu=5j{6`rYt_;(W9EN{Zu;ZF2`>7yFTxEeBN|D|M_!XH2bs3 z5;kTbkCK~rbn{+z`=z4M_o-+?jDr1Fi&v}VU4-q_FE#lKRLC!1^<?=xr%yLkCiPod z9W!gt+V#VALDhyy0?&eXY?zrhCGD|>^WP7lyXLPHv-Li>rhqeP;l}KovI&;mrfV16 zX0l5<d-U>}IrD=(=kNb?d|vV%nH%S7s-MOB>Euq0J-F`3Yprd}&1cIJ%id`npPP5j zcJ;1JOyQyD4=vvpnHT<3r^@gADf>rHUF*NgSiHV=`L;jz`Nn77O}jUJXi56xv|^d| z-6t0rKV{UfbdigVUbSM^ifLK<FNJ!4>0}fCHTCD7rLXepSAJUE5F#z&G_N=2+Jz$? zH{VP(&N-!=yl|PjpM;%Z<g?!C$HZ7G!r7-!{rW-pUR#jwy8N0$vmfzEOq-$md71a@ z{|DaAi_)2yd#~)>0hwplw@%tN$J%^(+$F0Irzd^!`_oiBX&cl2!$#5jgFdg%GT#$> zhcVy0+@XKnxocI`JD8o$&3?Se$(+mC{-W{Tn`(T!T0&JXOz5q+{@_p4`zSq?FO|RV zyxzfl$DM7@>seR+TCdCQ6KOa&A*nr4^4Im(zt|LyADne9ROU?{Z`E&a_Ndx>`ycVW z$nRZzDr|1DX;tzgCcbZl1qKFLJu?^!S4*EQSaWEj;NtsVx^Lh4`|fQ>Qj~Vm*&m`F zizL4Z@67uvyyAetk?n6TB({4WHNJS{+@Dhp^07ur<?F8>-o1%&;r-j^H(Iyk#hl+L zsjRgxxBYC!>)68Wb7h4Eo}7C$^QiID-Q|0h|Gp=FYvPd!|DL^i6ZXpHtMYEX#I(as z_U4}FrDR^8e|>6Mp<VXVrL2wu(>b#*$}i-%ePqXV$5bZgh{U_i{(1A9nHGlg?BB8f z&3XB*uS+jJ=i3lea-v$G`GxrZXH0XOAMe-s^{P7PQ}BDm?}>e1B^5t%AAbICQnUXv zk8hrPgMJr2`NVQg<i+eQ_c}V_AFj$j)e=0fT7Lmk-Y4rxbyCSb`_e^Xjo6PAAG0dF zVfS<IfvhDdUJ>si)~~)_IJw=RhrOqzf>W5|An)#dN6&J6;WEEz-Y#<9<%R3tlH;?B z0`vB+i#@7)^p5+(MPk3FY!7nnE&MFyHHUEzOBd5a%~gdbUKsLz=UsQy`cx`&<YLz& z$Jb<D@0Iu`eyG<olf@+<R=~-+xNG00`^A<Uv^Fs5`s7ZIHjH<0R&%<?rYExEYr8;e z;-g0U>Q`*Puk<~dxiUA*>ZU@IyuY&E>!s6ourfZm;i-S;%HPIm;XTg^^LC!}T<q6k z5Gq*5mo>lH>h~4@pn?;xyuWn>yl>+O71|l>X~VTK>@;^_3uEUc39jy{9gEr+w(L*R z+3#D*99p}(t~&6SrN^!AeN)#tHgE60oyqfDU8;AzYlhK217Gu!1c9B4J|AODzR=Ts zA-8447IppDeEq1_;>M>Q$78dfnk-drf0VRKaZ32r>=#OFw%*^muVR_t!85IP=4-TC zr|x*f|D*j`u#RTImV>;nS5&|L^e*v``UPRLgLg|+8QPnxU2kN}|CX3=UEA%A*?g{f zIh*e9b&Kkqvfyst{?A1R?A~h3T39hlW5(J$Q=}`-d!;|@ogEreVpns;>!NJ_t@ojC z%kO4zTx>f0TQ)WB#xYrsy%S?RAHIKdV{0p~MZdxQW71NswH9^kOV8P~X<Yk%ZMOE? z%eUTMuIg5;uiMJ;{?_|{GWjox1kd_gKjAM5zO_;DK=tP3b7v}h23E*tPglFgp8C^h zo4=)oY`d*YPaA(UugJBy-%EU7creeBJNm_a#vPN_d=q~9wQT0dk-rz9Cn{6l5oFbO zhiPVf=KklhzirtyJa)}$+Ou3N|3wkkr#Q`u7N%SJhZys+m`;BceQYaerzf0ng4;Rf zqFZt|N4@ba7Ym(3%NK=lxv#0{dG@@x;ZOZHnHs<D|2$l4GI%P_FXFpmqIYJ~QRAt* zi<i%O_wLfy?;D+cYDM~|q)2Xe{?;C-v}JM6Z;!5n;&&{SeY`($g)Mn~FMI!EwfU3m zT9en->DP4X9$P&<$-Uxwj>tomZ8P<GdS~y+?Nd1<zF*w$Vbr^QzKwZ4H-7h>JiT%G zf$%$)B8lFO>rb=n-EiCKZ}E-m=Wo5YZoK<--II^%n*txQyiKrHyQOwiSVPM6*4ZA8 z<-IMPs&&VFt7W!{^*jxKd`*r2ru-QXJB!)xbAzPkEdH!{S!jFVn{9ifv?YQ+tUhpL z$=Can%??+7Ii}NUQYy7Ob$X}cjt9#o{pmZjE#geP$AdqM4t;wmYoas#?e}=|G7$}q zJ4+gNuU~xC{rddJ=UA;KG`&=Ra)yQVa(j=}WgQikbGMf(2d+J8ytHh`rL2mFTIR72 z&t2p*P&(9WJ+<ihlVXEazZ2FltZSToOV~oFMm#b>^>?#lRRar?&NAKAH{?Iul#dX8 z!CA8Tn3v%BrkByZVa95goSCJ$vo9TM`e*aOoX7ax_8si^j&-d_{X2#IiogL`3vJ)P z3}th*ehKZf8%|v7DtM#z*zFHrRj<w7JAV&1o|Ip3onLN}`ujN+QYCZO9{wQy*urM# z^Dti@Ij5C>51xO+KhI~Q^yKWkX`ywC9IERiwr@Cf%wI&tJ+LMDjNuLsTcMjX{w@^F zxcBdZdysO^!tk$GI@$S@+H(&5yI>U+z%RpdIPCXd=as?N+V<#fyLeX3@ODOwufFWB zf{tIoKU#l%e!Prx_Z=SN3-9=Ey|3SY!6og>*@=Gw-z|K|)b!<z<ZTT`{<ll#ChxCx zv*iok8y3E)+0VSlm}Bm|#DDd_RL!o2SePZ3uc+Hm8M8I7KEd?wx9%Kn^Tp>)+n&yB z@}GRudgWuetbKDg6|TGHTk!S6@+qs`x3O<e+%JAJY>UW^2l4K_&s?_k-YZMuk<XkM z{b5UDW=;1_P0z(*!MRGdZ~C`fbY~2ca@wc9mjC_1*p>hOU%vbF|B2Ycm)`cv9PSK> zJ(%5{rrdj5Ch5hU!`VCA-MiAyMaX{KB)jyD)*FeOa>?&6x}M*-nseUS-SL~c$EN-k zk1uBzK70GyBjNr@!wiMrlh5kj=2?{byYG9pw$R(xe@{=BzkknSi`KkX=f19!`Dw%( z_FUXK_vTqmjy=*QTUi8r6>p`jt)6VwHviqT{ZG&3sXUwh>{Q>eWw++MjQ)M>*|EPb zbG*&o=C9d5P4>(7?X`W%@lnAli)=3Du6Xn6Dx>msgZ1a8e~7)h_`2sIc?Hh<R(ot? z#rH09*PrB)ETpP9iQ|&%;w8b;J!2+LKJ)c>_%EwRi!WHb&++zs@#p8-hX%!u{`?es z_I6rKMeD3}yDzPjShBgj(%V;kow`V`$~FV%EUP$)Y)@0!ebWL;CPkip6L5Je>&GW= zuI#ua89PmF^|2_csVXlop4&QeiTw-Z<|ylzoHcVNdH8it+)=XbtotwDW&>+p%ZJT< zyRK|Xyd*!7(>SGZ|5`PdS+z@Ur}$@`G4PBCKf$(g*<#h1U8`%;J@i}tl-~5#^v>Mv zWwgp~TJNh%w?Bx!a7=T5rI2}z<C5Wul}p^G8r||*{g&nA59y?f(rI6sx`Jm`*jCmy zE9u`$nDu>5>R0yftL7Gd48A0z@VD-n%A<8JJ!YziCx27CHtXz414pysSxb+6mDX&{ z$@O_)qIGIv?;OG9d`oLo+WEeks0*F?tIgT-QqR-(_x^X`S<Dv$FUdREt>rV7wK@AH zkk``slB(iF#Yu^Jj^bVR3CE^vUA=hm+rpPget-K6b}Q9Q%8XmNOj()JRaLU~R%KfJ z^zYu!=DwJkQL<fhZ%fM6eBW9JspFR>U0GkYWy@S%_xuSyOZs@OvGQ)2wK3$=uWF&{ zEoqZa?m5iUXr((Zc8cG&H6C~WvYyQ7-gV-ZwmsMNbk1UvCc!OXt7WfsZn<=0eVmfz zX_pe~nfe~zE+jbbzEsM3^4r8M{!I55CT<G-r8e`8@yP>E=j@kTe@5`M*Q5RCgcWsv z7v^WV>c$yoC-A=vnI6lxJTF2s#ZJie+sr_r3%{?<x|(5juEt}AanV_+XUcQD)+^48 z>%NkcVwZfZ?49aN)4eJCPwqMUX3Ep}XJ?c;Ef2hjlTukb<MeC~C%Lu#b<ezcC(nzR zaZ{FS*@PDx_;)(JYT|AA=^*DjSNY~fKF_4Gm31c1ub+6WEOcAGxpYZzwAq{2yZmM} zw|TMUeOZy^)+Er`Dj4gxHgo%;=cZCm*q)gfUkTm3)y~w-$S_TM(<WYKp|<2145zof zj(r~3+P~^VrX$m*sdAT7^sgJKU+Hr=+g7(!)6?ASNtny}tvoe%ZcpXhQk%_JbA7gv zhnMNhg$XKecVD@*>DQ{h*F|>w=j`&Cc2sw=?4%|4QkIJ<-P_3Vxlr!vadXG7rsc8z zWxXN}iZY>x8)hxZSW_poY|*zWulKt=3L_<E%blLJY4v<dw@triZcN$UX)JkKDbu^@ z$iHBTQ<o*Y<Ry2^GG3hWK&bf0`}6IeQk+h|d+YnP?Zc~A_YbX8<t&YCGVxYPKBURS zo}F!Vl`p<`X7CK#Gw;@|KGV03`>#annPm!Y49X9quS)H`Her`cf8Q?yk(oK%Ki5zG zdZxNE-S19G+SL~6$&V&}kk^l#rvAA7sY&rZ;|#Cl8$w(WDv2@LEa^voTytUm%-d<) zUVFy4`OH4{=r4UoI9yr}t0?zgta=xgb;-T|T8h%zFMQvAY+oTe@$ii~uLM)|<W!ms zpVe+XeCOz#P&3mlvfa;@T#lHd88t_6lI*$I?qf3-9$R*W(`WGxm8GF;c-Ne>wY%Id zW#y~0L3z^=xt6<^gR|D1+d6++m*eGKSLNQlR(vCOxYYA)hnUvQjH5>+&S@wbTdmrb z82G^G8FQ$YQv2<hm$Tg8db(T=keA)MYXi^U6)u-QY0v1N*_`HVVCrO4Iy)(MzI)N7 zot#^4c&*D6yzuztmFcW&B)4+@ezr0tSLE^1BPTWm>^)LeX6$~Y??d9VC6}i8#JcgO z=Uoq&?c<<ry`=1#-fh2W*(%GEjeaID&#bu_RVKLm@XMYc`2&kivV?w`9wQLK6Xbhk z`XPl#6OYv=5)v#N@;3@(n`xgp8I@-K?O*rB{3Z?AHJ?{AU$5HOxlCm1<qaC0l3tJ4 zB4?HC-1vegXmd)kn`YH+&8;aKSIQiZC!L6U&-HR<!Grpbr79s?Y<52h*|c<N>(8FF zoUBWJbN;=LopC9Avgfm=N%~%Md3t>1FAHzI5~1SuZ%$_7y#sq}Cj{*J6MNi4?Lvy% z`4gHs1!2w&+g7HPwa%=nm0+K6a9!fn6HBJ=toh3(DREMgaZl3bg#J}^y;fO2PHeh! zKp}D8DHh&MIx?P*r>$_i;j&_C-ae;Ef6MdEdU739E|;FPum8ytnU_BClK1CjzWH)l zS!=;0d-X$tqPz;hk~#X9iyJ+EuPDzK-Sc{O0biNn;Q|Kl&1t;TmU-UoFktsge<7<g zXPw8FY-88+T^VY!dv0Btw0ptTWqB;S1S$fKg{^!po#byI@r_wdX<zF6G?9orx9JZT z-n`TM<LrBZ|0j5}&OFzDaQy$T2~W8)gNzP7eQ{Xwi=tCf*L*GB6DkLJ43Det`H=SR zLzDg54<A#WhkaH0>~^YOP_=h@wcDSWr=N4op8e(Fl01pIUmwf+Z@!shzisNhD$&g1 ze}DNuKK5q0So@p*gWSPyTKSKse|Q?lAOEq%x8Rf69NGIO`<`E0t<!!xOwU65)BY)s zq}q>f+p%fYt7mnyllQTkU*10Taab<5Z1<1Z>$hp;*vG`YjMS*G-I4kyxB0g_t9JS2 z`W?O7En~Pp*<amNc;vb2<NR2zdmqXxOu9vL&)mKJe(#3QYP|mUs~R^aJn~Ip%vpN- z+p5F82A^JNuKUCPe_Qy=+wYrpt?ZU~HeZQ<jhtL~`svkweE&_a+Wz+2cV@Hp&4<cv zum87Vi_F3P#f!I{66eahmpQxtne3OTagEzfHNEBRG4DOI>-E#1XB+z=JEPO?gq{5& z&cN_ef!yhY(2~p?j4O~}ccAhyw()3|R|jk62K!`qdv$LUS`wru#=F$4(d+fwlp+r1 z$ulj)^}YsuJ!t=+|HD%LuIz)8)-8Q+_f<Ud`%Fo_RHh#(*JjO`S^MqZw|n>RrO)60 z|K>m80}6F1FV^w!q?KGQ%w4bKGky22)HJR`h3T<(3np<%INuhEe<;~J`{@~<LeGqK zO%l%2^{=k=iMwHC{zZLH1_vuI&)VJJ{`MW?Jy&ov-gs7O*1X)w^UoZab;0Ik&KaZF zjnCAUYlS*rFA4vZlVnl9rj==`<6YzA9a0-LE6XMXPR%~OM`zOGg$burehY8CBV!VH z;nama=ldLI&Xb&f)_213d3P>;NtKjpFAXktmq=RqC59=s!q?T-&*;kT?p=p3n5>c9 z*Vbh<$7cca+`_8rxr!UJUazZASjBdo<>Oqh=X_#KAF7*qa?Y20?K<HTt$JQyx9Y@? zcebzHTFUxd<%nI2VY9WLS;xygU2-uCPU#kKRUgw6m}2~R=RVH|373pbJIi!u*BzN4 zsmJ5GSh7=tU!3cv;Qd9#{<}A1M6Y(-zUOFxRZx@X`L8*SwG+}TW?Sc2Ywz48<1W8$ z%fi`FiYI+f$9y>RgyHZ~sYLh3z6#CRlfE~Gv0hIuQCo3a|INym&$_ni7+J<?PW!Q? z;3w1dnA2)T_tP>Sw(a&m_Th3}nR9SZ#1^meosmW@lg~t6+Z2BGUGVAM+w!JuZkH6h zwp!`8g;a%AmccPzW&giUo_CMvioSnv_nI4zp~;7=s|!9H3qEd|&3lT^OGx5awXBPX zX-WMS6Zbh;`(xf87d);Z+qEfCbf@C$DRy$LKF1B#O?t_4*k{Y8|BMUUrZ4FI(_<H~ zviqIUoGy*tbwziV`u&;k&__h+##iIhM?VTKTUp&V-;pa#Vp8Cijz#=`3T3{3Y&hnc zrDZ$S!J12pGmW{izCwOg#zA$HC0e@@U-T)Q5bC`Xb>`i!8B>(q-}smoec|X=J+nMS zI@)5Mqx=2|Rw~JrCD{}9aqr`f{(PdgPe0_*D{rnD)~}bDy$au`wm-2`LrqR=t9zHf z^XmqWgHCIM*b=zJQjhMQ9e7O0_dY{JU(dM|Pm70lL=H||&RM_t*ur}=*DVrRarM;X zhj&&tTL#G9FJ5>csY6`%^it-Nt9k7I^M78<_Qvq=6YU#Xs|qq^1o&@}X20x_z?#M` z5w=qG_!^<RA!{w~ihSSW6?lX7rZ$hPW%r30k5ioQFZ|$gZ>ih-XIDR1&%1tFZMy5C z-T9|XTHnS8HtBhq=2vc0Q!8D0y)3<bvjXp}{1e{m3>_Blndg+b<ay5?&&&YRNj-Y8 zlh#}gZwqtFcD^s>_t#CowBnJrXQJ@FW&d3kG+f?SIj5nlM}N|`Kc@EXcmIf;``2f# z!g8Bkas4~<i?UKYO3%EnK7TRu{fgU%j>h*FtZdWEw0Izt>DeN_ME(8Jg}gCuckk)F zeSqy<PEwI@@MY;8<xef6o|#X`50A@9%H#e#`$vxOAMqpd*X)`9RY_F4Rm8qf&kJh# z!kZZD{zkR-n8+1P4ebjDMV7?<I{9|b-d&OJ-S6-oJs;pE)jY>W{Y9qY9<w`2+fvnR zw_I+G6IuAP!a33J(^?kCjWw^0FL?hd`QB!8cUfqb_VoV;j1J3ruF?-veQx*Xq(iQF zNTZ_T?U0a!wuHHfom2Pat~togocclbZ~27EISYio+;<Ax9$Yy8*Ex|I|7`KSsh->A z&0k2ixI37CXlD5#4q8}XtT(Zeot4m4tjc&+*Mmz~v~>lwefHjm9VCv;e=UFcN=EY9 zJg;`XR|z^LMoSg4mV30tu--i<aeC^X#wU-a3;Yo{=f}t8I_Jp2{wE6iPCi(0q4{y; zyxsSIf2gZFf1iP8!^sVzU)iVi7*Bl`D4@MCMJU?l#1)s52A2;=oSC^pG)&{s%BOK> znc_277;ULr`1g$X!UfZ%9Z&l1>}fi4R@6EDxaR*gg>t`LKR52JKAFJ#bK&RhSLFUS zx6iq~xG1Um;WS%btLCz2^L*x9mUF%y*>jt1TH=e0q@xFfwy5nCbAD^FlTV_=-!FOL zrztg;y+2*yKW4Nf;JLfpeub}HrWf5=O-0(%x};8JPqA9kv*lyU)xGI6`c*G4i*{rV zT{C^1pG?A|y??)c_{4bT{k!<x&kwjULXHf#x)K;F$H>62kP%<aMmXG2=gDIyfv*-l z{@h18-uDf2|ECq6kFy>nx5v78t_qyxRGX!8*kI}9bLV`XozqQFx;OXz%(;IXQX}_8 zPTS?6ne>)@TAk+FDOo-HKCa2E*~06Xoz3!I?;5*&+OvE2f6gy{cjv#Q<?b(^R6L*F zVvTzy9e?mtr0d(zxYT!hzpUA`>!3mQ%Qt6_@y~4DonXGbTw%kc{5_nOo{nvOlNTj@ zXj`JSW~Py%NQmo!U4DudE5i7K<~}G--n*{xK}OJIRYxO%C-+|pv&JmeU6s^P%eKRI z)2*YY1xh+jSR{HFWqB+;Xse_->Ee-DVY?Kk_RgLub0hsnvCR#m^<OqTdmykQH#Xhn zV8Yo$2EF13?Hr92UR_mnw$aNn((ia+rv3N$(clL!BMg@;IWg;;MbEzVWyz5_;-#I_ zm-fF-w^_Ej_U{@?Lr%Z$Gs-Tj{f@6abA{)L-^VXLxmE1G?zuM_Lf9+hR~*aqe972- zjeWZKtNkzcE?u?hg!Y7If%}zA-Un|Nm5x|ny6xaYQ{QE|V&V!JN4;V{SoOv%(de)i zpZ0B<J$tyg;51&2S=E&%AM8$<wY#FzPVPtk|LUb{Dt~(2`MGGv_otx+udF=ORU@ZO z@YwsJ?Mv~)z^qQ!_$?=+?(C|2%(nOW<z2U;wYldV<4*r6CwQn#^mWq>tw4!SU5o6@ zum6;)>HM`sd(W9!_t$KGcGvpBHtAg<#tT2>-Z^(C*(||%!A}pDjZ3ch9z7``J5}OR z>kLQR-mB`1`u>^QZ2YfNpIe{Rl&m!=OOU0md)69G!Nk}@QJo@<cUw|-&zf6suQ)gU zv&rn!mqJ(kj0%WvUs)5?+q1Rhsdd!8&nGS|bmNwDnOt!6`<97*Hgh!Q6uZ_oMjP%u zlNjS=(fjPfi$t4axjz?%y*o0wvvcwtetnY}3FoX{o~o2TUl{$vX8Y4!^J|xcJ+jUc z4d0pb#US6#Zo;hj^S^#@N}9-ge*TBgjtkZ<_?w$z>d4i4!kv-b+c|u(XT1%_*6fU_ zd6|1SyKaT=YtK{D+rIC|Wf#LU8hZO$^NOQi>GH|BnXRq=aG^--zUQ5<wQuXx+3WZ1 z{>f0*^-@T3b&R_6^ySLxJEp9(s?>H}!(6=YY>uA$zf(8Vh2u`%F6G`o`BFmLlruYT zm2LR2#P689M&#lrnM*$$Pk0z88yBOdywCE~pQF3tw(j75%-sCcfAj6z+c!r(+y3^g z(dNjwlZWnq`}4tJYRnDo^U;<@Pbc@dK6^W1P1^>)u)B@2)mGoRpR8$^lD<bt^XK^! zB~Og(t<DGsZQ8%SG2>nO_778ZD&P62DH+dHT>h!zoSJcH+T1hN`-PtEo2sUr*e9ZE z^mO7s_nkp+f6M*^9~?C8=f=?2%nS@GS@0Dis<;a8jH1-Ul;D!Yl2o+fyVZZMACsfN zziGRf9Yt8Snnp0TiVG((Pm&N`?cBY4LWJINHnI14k2j{*u*M&{bT48?#196seJxXa z`xEBauFaW|wC`uyzMs{<>nd3<9M(G=S97B{b<>qhv2K@Q-OxvDpF=*Z^!J%^K;jj5 z-Ql|(>c-!bHVG`$JD8Nw7gC|ROnIuu+Dpx;CzQ_x$ap+*W?Ow%GCa^_C6jbE&$fA| zRh>^qZ`^qPfs4t^Ex+IPP46#t7Iocn-6K^deU`t{!(WeP9dXxoWq$wv?_WjJTg$Vw zB(moD9H|uZcafUG*VeW?<KB$rmp<%IxjB7v%WIvbJ07jp;XOLjgjL<*W3#u@eVN4V z0SoGTMGu_${UrNHjFa1olKFvkXHJ)XI%-qdqx<P<Jfl_wdyZR8vr%u%ZcgsAHbonJ zBaR3E^t)5f5YNAT{`=U3<8S^jg6h^u+;J0~85tOE<1OQfi5|34zTZFNa)8Y7&qcS7 zPA)GG5o~^NaVO8gW&;u9{6iJX&d=OhoBvGppY`4+s=k-jo!*tTeQRVmcjU%Lp6p7t z9Vc2AIkPzKt@xmD>Vl%2O{c!F{=K^Tef#e}|Gl^3`@hB(%Z<wpGs)OyJhoB0{!#Je zLywkQ^HpBnKGv&$yIr+XwnF%p2<x7THx?bdKDw9nlyV$TD@2sZiia#)H-qDuiJ{Yi zl0ygDN`)#me~@B{V|*leQ<rr?$+t^7mvnFPE-t*T&-}h=0^|I&k_X})^TauLV_6T% zT=`t!Rx|5>`T51C7pxJyedS{2;syuFB%gl^SC<M%-EdNCW4*bz*1b&Hd%=>(WfKh# zPc3|>zrJaq-Z{-hUKdYr<^~E{ie$a&YF)AP&ByO<|5bz4T2-gaRym|**#GaV<Xq(| zC$@>SEcY-J4*u3-8!BrSU|Ii0HB;hD=(4vSymt@SC!Jq?HE{d33$Y3tWiKDy*mC8~ ztSH&afUVQ7v|TV;e%$Q*mPzvupEB~Ez2;)%-AB#$_Rg&nIo|)v?)|pO{a+8{f7~*6 z&-qnm<q_*Y&*H!L@tyR%eWJSFVROzd`&{(n)$wzapZC0f-yWwum%sY=w*1<@+pqU8 z<&U?H-o5+M_oKY|YY)BJKjX_G?i*6S!FP^N3lrUVmyv;i1@8rwO1ScMW^QVJX^9GY zrk?WF|8juHvH7<*mA*c9o27=arm<66_>@SX<bo64PDV#8R30YZTo-U@tM_%KAK{rk zF;kBGxM_c?BJZ|O+_b!tw{G8l{_kAzIos{^|Ni}9O^}<-ll=A3p0o(x>mOg;DJs3b zK{xmMisIYFo4F(oAJ|y8D0^9+Y?d|q@jb7!CP*He9eVf5R;ltH;pVtp>Aqy^o8^76 zpIcOp89dQ9$yw{9bl1f0HM?5)0)sE%tK9cIn|WvES3{n|vV~kBY^o`jGOE-6I#(*6 zF4!)Uy8DPgyphh~*u)9NKlhsaGF-5Ty_v`M-NcJ29y+1E@e7>}B}nak;e9EiMe*-R z!<c{b%zgHr((H`cSF@Gj$b7CpR`Z?)1?1iqySe4FNZyIBFK0GcGZi*&NPBfQP4k1v zvLunmJcfHO8l0Et5^oi~zR+pPr@)z$CSL5g&LtO+YVG*<!(=Trhoe(opLK3KQz{vH zXR}kj_f8MxyE&(p-&8X76%ReMwfRE$>wotHH2e~#DSo}U@%7txGtN$J_T^09RrPAG zO8AGCh3f@va%RM=5x9E$)rS9>R@Uc(D!N*|k1H3fe9$`oz0B92qV7DCultrQIKNQi zSJBKy(-o=L-$;oY9DbC)_ZMS%*-=lS=rrMM|K;lzKQA!an;LoN<L#c{#j8bc7q6<h zEbu-_R8ZPA>H7uyJ{F0*?q|!-J2s`gm~-JwcGaa9=U&Lo&Qtt6l}#w@rPO!z-yho6 zy>w`h{`X0x?N+zCr*7TKVvpatJoSft8xy7r2;~L7NjPYeQXgh}{6(Ex*28zxJ0@gF zOnNByuDvBysbj&(VxKqSQ582N4TL(J8YFxlPMn{`_fuf2L;1o<T!B0*&rUGtZ8~4k zGjoEW@HGE(8G$oTy!FXAeR%2YfA<(9?S+4`&-4D#J3Th&)Rwm?8#;t;9MCeH?(|G4 zvqj4;_DA1T4Zl5SJ0DMdFyXlA{%2nTUAbOX2)+LIOU10^jXbEBZM}5&@>M1V246OO zwV)#Y+=7-_=7!}4ONWZoy;Dn^oLZUbwNj)jX>r?!NkOZ(I&8dfNs2W{+RJ<GCDok= zE~S{?eG~TThw`6W`E@Tp9OeJPCTsop^otig|BuQqcpP#5ZtS#$k<7}e-{0;1Zu8vc zx#jb?U%&0|*YZEmF_YM(t(?AjSKwyd<%f8qH<w;MaqhKfp4B#<V+BfQ9$2lnOuf}_ zu;ofuROIQn&1WVBFIg(#e0<k8htsdpwjI!o)qXuc<8-Q?b6SSB$n}bon#I{SS`A&a zwuZJn>EYJQK9;pDA$r$Ft78I}S6%(&+%~b~Z{B|&=6fw~GdIkgbn%qJ`Dgm~XUz07 z{9^WLs#NgBK4s1=iYuL5yPe`?dCqE2i~Kk_O~UW|o5>Fu>a?s1V=Sr~D=gaPKd;!O z_(Ea2`UTyXZw4m4uiNtc4P>~3^Bh~7p0TLxarw0T=pJ!>?T$wx&R60tXY;7@PuRZp z)zg`qcP_oT%(bIrzrN!|o#~YqS>NOdFZyfA^3pCs|5kl<z{P$a<5>m=3a)%NjeXX1 zXHM9|BRiE-OqV9zXik-UlpU4(c2eY{yjzy9YW3$ll`u=4rrU9|^teD~Q2!pil#GOj zX2+yCt=#gBRHl8KqyGBSsg)Jn&qa-7m%jS&yDw~=ZTQ?jpRB}}ZPyf>v}s+=q6}d! z(YLvmK2^@>@f3Z$V?hGfbd8IP(tNrVw3Z!R)S^A*liRB=|C*n*-+6w%TkUb|r=;2U zd{VZ5uU)k-OED$gQ2o-`-LgwBat8i=<rB5bckjJN{_7)aT$g8ie5=;(t8BaWcdCfj z(_e=>yuFpR@+x=f2yL~UJSXsxbmj4L>wRYS1+MbV7pV*_nbO1m!tZwcHO=DY>wh+# z`Z3{z-fZd5Y3DZl)LMS;-5vRR@ym6l7la>lUy%LA<L<VeMO~5y*RtsK-RS0e*T9m( zW_zXf<gdE5r>|T$=4)-ynRT^YDfrVxt$o3&`xad^og=l-cm3B}X(i3)EvKgDo$dAx z7rC<}M%-jqN9H^IZ6Y~qEAqou|0-UZU==no{^C&;GyBLH>ZZwg+ZXpMxxLJEl6m5H zNA}Bh<<6EJJeg1J&RS*6zbNsa%iZ|4#WvQDlLfZN>~Ouljx{#wp_sZYw_3|*U9}TV zivmyb)O7DV!xt2P$*0Nny_)##E~&lNw%U7|!eiyTPS4!x|HyPnZG5B@tJ1W}rh{t( z%vYs9*s1s-K;y?3#RFe#n~d##oQa$FT;u#keW?eJ8RzkB@BiPrCfVefF>`-mX+qft zb&vjnybtak#ZTTp60lu-@#y^p_uh2<>$>JE^S&$Z@h9aiychpnb)T?!c88mp;$`8R zbGf7hZ+ww+ek5tsadJY6&(8f{KFUe#ee$gPjlakA8}SqVxwV+h=lnHq<&XPL6}q1s zbw5?GTZY?NNj>a}$zJkep3>z;rRSL<fl16Nt~=()^+q@-w|%dby54+<=U3>|MZI21 ztSnrPOwM*jllENfs8(svd$5c@cG*>q-o1Clm2Bq+XXiiurZ&mHFn!~1&S~2>Zff2t zzpd$!hST>jGj%SZc`5l5QuIsK?7s4D;hW>TUmt({@zK%AQ<)d9>|OMg<ziJ+hL^&b zdyYTZYTK<f+zM94C<rOJJknfpv{81(Lp~e1&Ib2G)^ES8mpatUcl=?+onQYSaL8QO zYGgOrmi*;)dVS3=$$*(ZEMpbe<+*452cN7k<<70thb#;XE!>n8oM>&+P|zU=qW9v> z-a1=fZa)*kU(3Poqc%73mC@zpeA%4_2F#LN&6)BV#;@Gs96Gn`e$zUGZ}Pgbt>&?7 zrlv$@drxc4%@M5;JSL%fY`W7L3qHnT@5URPs+xtjCJAWFST^_4W}zjS>054nuK!<t zuKeHUdgZs4MSp(Ik?1k6<h0-T%eAqpcTxQEx}Lv(o=o1|?#sh%GOv2$%9h%4p;j}K zw~r>sM0__E`5q{9o{MqPBhGv7!F-w;3pY$(wuk97Q->4N`_GFntUlt%#A@r2FLpyq zP;<`O<}D2egxCM@v_AP>eec%2YAcQ@PJQsQ;e2<J^s4u|BL44`BbU7W#Oe|CU?Fp! ze9-KQYwicD*}cssS5Mq^&;92Qw<YgXEDxTyR@r%0b?GIK+XpY5ZJO@Bs(oqZz2-%} zDzBCQ?7JWK)Oml4&XV`)JN`<)OcOe}ppEDJ=B>^~MITaPio*9v2fe*l&Nbz3r*Q>K z<{F2O0?bRrS3Y5E{BXD->e?TXlhP}kJ*qpG{Z(;PeEA`9fk^D9_x-ZYLX`}ye^|Dj zS6u1rarfV;)de-}CN_^IvG-36crDd*o9VKuhW^gl_fpesqN<vB8b7^L-@AU|*?@E& zzA`RP{XGvR`QQFpa7T4N=geKx7nt3&-SLF8`s8K*^puKutqPM1P6l7Tt8wJLdWFc> zTJO`U^KHMexX!$Fz-)uvKY=dW*n?BP|B4EDefg=Hedc{zu0uC%UI!c(TQxK1rrw9! z-}kw2hZt{PdDPp;G?{1r>q)_%FY9F%NvZxf|10jokaxh_xc$MdM-IC!{@T85>Nv#W zdhvWuYD}3&__2UTvpN5CHT-UFlf85`+n|#_U`MA|g#ON(?B7@ZKA@}P`a|($oAa(p z*;REGy;^Y#3RJEOd@wy+w}8>-&Vh~h*ycU?(Y8u;^@aa8cP->Jnayf{^52qEg=~+{ zJ#ZEHD=|+f=;5UDTla21OOBjX%4W~FxOq2Un0oFXN!R#x#Yxtl$NVciQ*sx-jk^Ei zd>BLdwgWGJPn)>uqJM$Rnb-R30$vrrS?{4Jag1M0XhjsmzNq#yvqWz0>0S0Bwp~KV z_1mVB2P;p;7A>9PevEI{=bJ|@m*g*D{+4M`cy-Q>tZT9&;b(U|op7#2;^^9aYaCfN z-d^FBsMb{Ow4^9-JI{Lq;mwsheip5cDL0$9S~{pS*rUL6`$y%w3Ab!ZW?yLImpft5 zcH8R0L5UxWM7&pad8&Wty3l!k{j@c2q7>WDzg`=Yxc$Q8cfU<#pPzrwY+vBT-?z$Z zzd^%!Zr2<CTP)WtpCP=VSNW{LjLE$xMBMHi{`m82hKBXcdl&gDEL<~X135~1CBJhd z|FG#x`^pr2?eUrDo=ESsGj1je-DenEM6FYdoO-EX$|~lI-%f6IVsc+x)iV3wM)j?= z2e^f^Uhp3{7<kOX=(&_^tgK+PJFBcrEKA!rvwfQ^GuSs*q-M)BZS2z8-@M)-tY*Q* zLQUy=I!49*qPHCjpPFB|RxS51HrhY&-1_nwj>zNp*QbU)y4zbCWws^qPFC9OtS=H5 z3Xd<=+Ieov?Y#@yeD-|WbGPfDj)Qho^4%H1ulBTrAIg2R^De^yhgV_=3iV$&uHOlt zJISy;TtayL?l*t_1*|T(TN`|RrYnEk_k`C$2BORDAHBZ)(b3|D?)hK8E)<`;Y9#ej zqupxZq4_q4a(DEd$$J?5eQvYV$!qK%9X&nQ9^D_IyVO3q`}+46fzR^g5+&U)$?e(q zMRxg=eXCDhc(`49&Hn?MNB0Lz)lYo5hN*n+B)d-Qkm{UGW$VMYl`m;rpTnH;p|Wo3 zCh7IzUrW|D2qybEnSYlKS2gRdIQnx=u?E}Q|KBC}U)h)UxEUqwd+xD1La11M9Z&bC zBU`(dKfM>7WLN&_*NhcDvAZsAU9e}au6V!5<)bC~f2!1f71y?wFFSYaa<}dA@V<Gn zwKCl;qT2iKTr71zxm>Jz@!v{UF?Rp0>bs{NIq>B`%f;|b_n0-T=Ukg~JUTj9O6Sta zd9TX(_W3`b^tjpVMx^AvtV7X}HtX-q>2~v1U-M`2x03wXX*afTMw;{%z0v5>esrQk zr)+zAUvK%c>3&a)`Zs;N@uX6Dmj2O6h7arn#M|s;qgV9I|GBI5;gd&4W`DnL)K&a+ z<<y0<`K|5uT~Du@7Q4s9dfuJ_W$SxZfB(%~+OcqJ^M@~isS=qUue{DZ3%+$_y6q{3 z1<R+bEIvGUc`@gTJF+6FIsQKUiQdkEwM!nCXZvMJzP<nOinHohf5XXsU6MP`y9uon zHT@cJres^U<jUo3HtUpRGaVk8De<ik`rxj(Z@%B($B`571R6HGU7YF>f9c|HQ4c%8 z-69+PYm*gnx^9Gu{<}ME8kcGg+w6^Nn6~wtjl5Bs!`69YZ_&;Gy{Oirl{t}NHxJ20 zrycwkk+v~HCz<<(EeE&j<_6s#VPB@iesAwS9eY(_dD7I|+t>c9x!3gQ|F2!lDi=@W z8egiET-v5=`~AY%+pXr$6hwCmcZzJ7`RK>t5Z$e7r*T=eX6?IL|9xHPrrEn&W4E8# z-~Asvrqrwbt0jh=fkB=VU!ARkqq7s1Sd^KVl#?2inwSz^lv$FBK1eV%^mdT2qk!#Z z#hWTE(K{*}1$-M=T3B6O^15P7LOTOoHdcH{^mLQC^XAxDwu9?0Z8|k2DD~$X_sDNK z(@v~)I&t`1&ij{_msjsnuLlnjaOq35aZL`MW#HWxt5<OOqHN;KThsEmYmYye9dmyF z#@54+wIrN>&)c^?yDjfs)@$o(o98P&7=D>rv}<8@WnOo!<9wq-+jOn>B}V_;)bc}e zSB!gNW+c<gwjVktLs#(3mDK*;_}qA!rp#%%@|6<1^p}JPrUlr>-AcU{9=AOFF;8bn zvga8?mS?Q4Q7Io(Cq)ZxS!mm%R$^dc`QEit(PF-FjEe-9l~RUdc1M{l&qV)8$&<x- zZI5d%bup^lCUe9-Bs6cjue->OX^Lyv)~D*0PW;#GENZTLl(Q|>S%2!YRkQM1FLv9p z?T^!uYUf$$vde4sW}fCpC*HU$3@A&f3c1{0eDau<1JnJuW2W_XYmaJw;5TClDV(lY zRvDFN`6%&-fyYyW72z*>*z}4Q-_w{K_ts1*r%!vy3+oPlBOdb}eygx+8&~$9FY~?X z)zMd+=a|8B_I=LkfY;w=J}#=9rmc}@`E<o2M(6B}zcytRy!1An?h$+8qM*%@6609W zeu-bNr^g;m-fkw$lbb$ep2h3`kMuiCJAW6w%dm-@=vH*|RI#U;&%aGEHy(b|mh4uX zwXNf|Mc{dfQ(dva<)_TvDr;VTvdubZj+EM*t*6TR)^m1#PG8E$we-RRZ4L#FHtC`Z zFTHpswZ3E7q;qk$oA%<X_Cbzcv~xvl7N;LDUADpJyoYFm-*wxTb+d|lE_}LP!;-qY z>0SN~HO(8ET&&kM%dRGJ*<F{ib9!GEvU0(H@3|8a^;Hh%@(6et=?FCQNLe}MRBvfo z*v(nBN}=E3UE9P3@3r-Q@x7fS@zKTivev~@8Mb;$k1b6Q`F>|pZ{nTD5}!}K==QsE z`b7BYj#~$cV~fvobnKG+S(o5;F#k;4q^K=w>Rpy+nz!l;K5sg1=`GR8)zedVd~%gd zqm(~`zbb!bOlh`%y-J3gihxq<CHt1=Lf`m7!wbAdtmpWd85kn*-jk+HY>q=4XjmEs zy)G@secK|P84Rs08;&@H@l4so8pOo%>RM-TjuZ1z$Bk2661?4}t!T{q)4cE5TK&0u zzBHEIIxuCXp7GqWW%dj6|4NovEq(6QWphl)Fjwu;-tRAT?*BYzIjR2t^WX9eGDn@; zYL^~%pFAsWqtEUoucjqsw#}Op=;J$6f7SHRr3F{7=!CK)-w<6gE856Y(_1}=%WzBR zC$B(Hzu9gF&qXUK@x*SQvfC@jcv9rlJ7QaZ-`UDBG4b<~iTl@zsqw~c=J~uJ`ILa> zq%DUwSik*sO8V%cS>=l|mrlwpEdErQJ|$#o(awr~#jE=#zH`{M(&gmy-rkzIe%73# zqP2!IXYO~^TAaN8L4AF27pI^s&!d!Qho*jUX<E47@_%Qb<ZOZdg~GE_Ph?Ea*xtIZ z^q`4XT%d&Cnx!v1XSwMoOUFId+b(Pt{r$%LJfS<<Eic{p`8Q8q_;icgUBhD+wiouM zOZ5HU{_5<B2^XZA8}{-ntgE}%+R|e1&9G&yYVWU)4wqHmY3$y!Oy_FIip`Q`-}p@) zMOFKV&DD<xINC1V{iTTCsLkL`msrn*kji~(U0UsyOQ(c5-4|8xJz?==mTX#wp61l0 zpWPfwIXnzYc0crq-o8bs@VNi<Tw8bcSLe(%R(`RP@>7=Ue<<N+aO7FmxyQVfOH<|? zTH&&4`O15*WTQ2O9_aq<ohr5C*aq{CQ@`9E9JSF7G(6sUQ+#fRg?=(mzSoWhPA}{A zFNAHD^mxZ;JkV8IFw4TlLz>ax%R2dJmsvGYZr6-VYbR!?Z!y(hS29I7DEMWzPDyiX zPv)M}lDpn)S?uJjQ_U*7eA!~foX>rim+e{*DrshFk|q)^dF%D<hRbuLI8Fu6u-19J z%lq+fmQBkhUE<C%O^%+~THLl)Tub=so~UO&9X}cp-D~~l7_Z7Y`kGVFob%hBz_XH? zcZ0-3rFzzWeQ0a>)VhBU3oGlXB@Z`tuu2A>@Q65aiF@uN!DoISbUBN6oIOyoYsJ#X zz0Ma7G(1<}TDh(=W+TU;nw-OYJT)f+o_=!sDR+G9?9ElvR~=;SY}&QphO4%tv&8AF z?p;YY)gE%~{(NcTwUW|PdS_Rs_5FTcn;GzB>#wRqX1~~;=lg4=zSl|Ry?ti2xM^L- zlVh8AMn=sQJSx{Ew`?_Q-~{V`uNHrm`>Q69A@1H&Z<$d)UnO>nQPkr53$hDDqvad_ z@7(oviKjeEmE3}zhp+a0EU(<)wtn?N3&prChEc3hOAju5f5H5R#P9uOO12BCyOU=h zaxc06D(fM`FIoAZSiWkj<Ax26`dO30@+2i|nwtBW?w(xN^t!KSa^o@gSq97gzW#Fh zl&M|N>F+8}tDmhdeY1F<?cUiozvDfuowCykUU<hy&64>idB~`b|36D&*Ppr43txv+ zd^0~0zP-KP^*7hHT>kZs9vNA=y{OEROsZggc!A4hms7SopK?q8OS`Tc#a^aLP6CAo ze=a|(B60V~wasrNTRy+h=cre9;h$gpW1ZH2TZx#-J@J!y?j5t{t2J45uqWku@|I&K zROe5eyycU|M8!o)GyKHej<gFpo@*{Vs()rfc&Or@I8PS&13mK(bfimm?cXl<Z9=|P zclNxOHlEH~zLm}A{95CvyRS=HyTktIot*E&D^_2STm0j(@_q}U=X>Y+er#e<zxi7I zX17oY`>e)I;_sJ<uRq=^-h2P1!K^cjL*s<j9`C>Q*nRQ)HRe0FI{p-^J<HQ&y-Mt4 z&i~ZnwgVpmHZB)PYnOX`IKf?S-i&_rF!R4}x2$G+uqd(8H0JvM{gVak3d;;@yt38j zolIKVE%V3l&xeEa=QGbQ{P7<=sKMUiz0;SKfnfqKz6KKU#WmXSMsRM9@OR1m$J@Rh z)_Ti4^-rSwDfW=9L0fn-<$oSu*5RQLD3Cb&h*o9zZ>M!P%8&28u%Yz!&v!NDb=x}? zpC94$^JwDaG>m<Di6Pg_=kTUWYOGNlnzbk0cAHA~tO`>1O*((`Lf-F$yZ`_HnScNE z=SR=m{cIz{l6UqA$S%BYzqa7F<v-PTlCR?X?bU1p7q3`4?S{Vn$>9FEtjWd4<v72* zI41Ad_f#b^WD$@0Wuw!@a=ObLAF6LTaY^50#$6uSe=AR%;yI#RlVP7^HG^4TdJL;a z+YgTxPSe0?yqsoIp(*0eE(&=Xm>0K~8P83~OR@~hYrZm1Pw=Hx0K4#)HSwpP9Jr<W zDN$9WSyH4jj?ZaVv*SyS-`vyLbsG8JF8^+r@JGV(z`I3D*Xh>GV62r^cUJoGqVLz< zAKE`kmtSd@S-1Z#*Y@^aqkR#QI)M*UY?4nY%s9i?+LxetSGtbFY8K1u$a(z+ChWIP z>nEQo+;3-O#U&M%wZ}t#$-#~bckKGZY&oBu6OTL6Wqa#~=Ki{*5~fYk8JW^$6P`Jp zId_h??(df)%pI(X3kw$Nsco6hsr*n<=d0+2c~z&@?|&sE{OEeT^9I>PJJ+t0+;8_b zE_I)?SY)334F3I{4;Bk(&HMcNx&D_%#qx_rOK$$3^!4@T#rz7oCeb@3pO<nN@#pV$ zSvL7CoACZb8MkkV71=F??tF$iRyzc}ZtpO-yf=7ad70g5?U;yLw`7xAo~0bu|NZrh zy#9}^Gr0?X)IU6bF;K?0L!9rS18@H{qrYy?WMAEVpA{bBaY^R5eU#Q~+y1hzJR<ut zy^{}L*z3N#O!oF?I~D5+S02N+I(>K3EN2Q@S~V@0EtmU}&1y#}<1^<ON`^t%Q+OX& zZxI#W5h~=o)=2r}+TNu(E&uYDMwfqB_lQp}yhFVH!impEdE(#5iu~iK7fyJW;5t#f zcBB76zQ;^*Ia}`hGF}p2w7uS3+2w@*^EtjXc86*<FVeHtD=?o{|Hil@zw^SR7T(|5 zWe<yA<qIrlRcv~_wBRgr-W|6S=1ZmOe%Q9Num#OklCS+?|Kas?HLnRbj(V^0)@$6` z+P`b6$E#aSyUe6JR%Qz`#(uxnyQ%z?&++!0qdZHdlpOfAZ?3>6N4wQ2%)c6&5?J}< zUkK_HMZG>dW9N^8S>~d_T5LLYzQ3j@FWDDY+_z0*?~=UqrT_Mxa(Hm#e1)^$q*vc- zZe<<q;nzI8WSz|M@2QDr^f)H}@Cg&zW^i@esySRe&-HSdcK`pnc&~GcYUPa8Q-e~D zZfm*EHr05EU%~}Bk#n~qAC^1qVHA0kTX4jWYrSyAX2BQz#im8qyR(kY6niSuxMl8y zdkWj7`Xyv%n0+-r8T%=9k;0#Syziz?I+3qr-zfYe=Wk<7ZvR8Y(m+e~tDd#H8>ffs z&HNSpL~G}4>Fm!v-_&n~CazmqCUSM%zdPqRKRZ6%q%9`?Z_CMIDMR6Wb3-}x@-=6R zH{Z_)-+uge_t`%@&xFrEP1}~ey5gwGqa{C7W^HV3Rfx>|9A&q5i$~W<xs4m9ubFb` zh;>Wv4}}#m{4t+1J1v7m9v!K^^ZiFk*iOL+r#nRxD)jUI8(d5Nus!v?Y|zm|c6@oC z;-a5NuXp}hCRsJ%;p7FAjtPo<)6#C-FSEvQQTfD>trg2!&#b@RRUXyxecxQ6eH>cz zC*D3k+4NO;P1N~SD;Mw1Kf6})Yv#=Tvya)I=sLgm+z*rLwgbA`qjyz)-_cf>`(~c? zJEoPVv&Fs%z5iXdk<l-uMRUu?^V>|f-wF--vi7rY+J*1i|GlsFJGZ>*>P5S+8B4!R ztNVB4<kgQZdf#7F#K_C()L%(H`upp}gP(lAo2)o~MR+Rf-#@&yKWuBiSjAo4By4?K zyt?||slQie?pkGUm?wRueR5`X(cPe|C2w}_SS8nO8^Er!^?CNxS;ji0XS)8rYJMU( zb=S022jA}8>D4=HX`1YEr&_<W&sIubzH<G_-diP0!wR)7U!C>%Nj6{U`IF%?Jr9;g ztqtUsDEM?WYoC+uhWB!Eg+FVLeLB!kt+D)GM9i6fUti0qT3_F<_j={QwM?vk$*;O% zxvCXaSwFZVqSpNRWt6nidSyuKthIZ-UG)%-&PfP7o+)6FeEPKC)vw<Sw?25XKjc4n zMt>#Ku`?!Y3=9kKb|U0)bRxnNGcl&~=Z0qc3p<L~UcSC<>7G;0T#GbBxmm@wEMQu6 z!r4$)qFcgFFZBqvtInkwx4C)Wnz^(3-OlHBX+M9yzFp2>X_M|Tb$RhBgH_v}PT855 zz0H94>sGZlTbPbrC|n?$xoVx{?^n;>G3wvsYT{|WI%!$<E4l4QCN6MiO^jSNwJvdH zbze)1<gQrv#8s|LnY(^0c>5}*@z8}(1Ml}g;tra$<VH=_6Lt2F^<ph#JNkTSY+~`# z&^ptz1{3mERL@h~q|i|_QE`UkUB3mgvV|=dP6}+g-=*bTvT(`n4hyCiJ_|&14R3ul zQn?p>=$U?{>vgX=n@;pR(+_L-;cl~WTJnuWXRb1xyj-apsM)F_KVRd;bdh=ko!3!Y zt=?zuk~+@7CV41o>7w}tIVpPWr>YyhmaV%SxJ=_z>hWn?mmHEi*Kel7yz<W9@<Xks z<+{%{e=)6E_CW3Mng36ogsICOH^>WgE}1n=xA^4+K`~R6$n~;`oeQ_|{q3ElcEa#a z(fKr~<yTD}KPar4wQ#?rO4e-G+lvhMSvby{Dxlce)6@}lFCuNH*~6PX^PBTC^_G5> z2|LK+9DUS!&8wJ0FOyQQy*^XG^u1s|>*k6B1#2s>id1;|8*YggIBrlAnLjt8eBxyD zw}#BC1Kyo}CO19h&;x0|%IVS3M$>ZEdB)t9x~pvU`&dNa8|hhZPrOsV#@ihIPW921 z_Z1gQ)(FK53yJG_$<A12q4>*9fOYTPCs&t+$4=4tBBpTKXl_W9<l2WDgH`M=sx^rI z>fLcH^cS;`97F87YM#5M&l8<a`=6F%vR?k;XOH%zrn!qb7W5}o^I5XQX8++~wmx}4 zb6stYkkPyLlpTGFPM&S)Qvxp}OWZrzH$Q2K-QfxCpCq5WGc&S#t#Rx`^4YJu9k=Nm ztF7I<<<u0Wo4?lVy?0qEn?ZO+iS~-5Q_p97(3bMKmpLtF!!#M+miJK$v`#Z<n(urN zeui}d@6OZwIwohX22WkJ((9q3*g>ml9ls{}+qz41cJ-w0Pgp7GzvP(kLE)3mLGyQ& zF0NP0a8wdntmpAx;+pCkb5PIyd0+Kod1eL%XS|tC4o{{->#VO0I~gnzF7bbF<eQnx zB4r$1V>*-$@mM%raS2p@C7~`k%|e+?c+puOW?kdE7fPf}((ZpZUjAg#BCV;-o~~Px zLZ^8LO)d62Y53pCZ<^@mz3;Yh`WPqi9NqJ@`u?Zi)4uQh_x1hzee4^==Nskdl)m*{ zb*m>cLe<qcHTde*Cy|k+tOjklb<1~hI#1+|yrs$1#B<fSa;JtmJMZ3vr=EIe0_p?z zsi=qA&J5)V)ms(*<f4)xH_z)|U;Zo!dU4tG>XqKR+ccU(RI>cu&)pW{oY;|?^K;Rf zUUhaieXYvP?TTkA(<EjY_wC&ir*nzZeaSShX(xRr?9Du<<?k!1Z~SHZRP9~!ORCeB zc1(D5kv+U(Ma(0QROMdnxm!6RPAh!jontZCbE|>L+7(Nex*xK-;x6di+#+?QYs;+z z0j6m$RLui<I=7vfbS1P&b)n$w9n;jD5;F4|zHeWv6Bu|?Ea&N|ZH8+smjr3bB;NQQ zKgsmSgn#>sj8q(5LPZ$2cuWX58@`t3pjq7~j$1A*7tRS7sfTDC_MI9OVg1y_Bv-4= zr}P}?0&|%wdy^-vh*ooa`BuaK{3$6Fm5s}}vM;!npSe0!OG_qle@qZZ!CwBUGIw8h zyiM-#Ibke({A*Lv?>WnU6`hfsmbOZjOXmLEZChk=SBUUW2%gC$Q^xttrBI+<V$pN) zsmD+K@$$B4Qg=zR^<rJ<6J0cs!Tg8Hw!bo#P78IcAMCVN3_2DxW!BOaeJ?kk>go16 zFqvofAFX4@r?ez{bX&A8m)Q3EX?~{Rr$r|VIBKVyd-{rnr=aw>E6*dzuF|+`L3jK) zBmH<3+ym$5-aNcv>n2IYbk93iHZNP4_4xGShXK_U2gD=Gricg4Y-xG^!RGvdj@XAr zTiH+Q&WLk1eYq}t_iaaK$>8+P?(0=7i+N1FwY$^x-cD9(JMdGFGudz6v7g(bn_eAx zqjWH4ibpnUYS{rJ_G5i7r-jY%Jo{{_rW`k;E0fu(^UuC)Nz;1F6}$GU_u8E$pFEn+ zZ8kr;VcVOC2E{~)=PqXs#Drz%dCbYK_jKXZH!|q0E744PdVR&2#BfKJB$i8)k_!A- z_MEDI{#WbNcHh7UpMPCR<;%6^zcX8;-Y-K_BY9J(N%XF1!n;;VZF;psZMIl_jPp6& zHD_1Mx|BcFO;q_f@2Bu^bqi;sy*IX$cV7K+?z#H!Cz|E@X{D!6Xsd_r<9uGVd1vCR zx8437OjneculOpN9IG&2dcH^E{nCVr>DL&eOchSWt3>U0pTfqH$?CHI;IE1#M(Op9 z|1Hmy9`QQQ$60)>YLUS#<vFE{vt`d|)O-K2oF&V5%=zi8*NZJZigRrWWvw5}Uf-x) z$NX`9Zt?reJC21-IK*yZX1&H^!Qrrw?CK+LM89i3ICLlQdbi)3GDnrnXEqOi_?E<f z4%M;b=}Qu-yAodUU#lhauY_EA>u&M8_CD{v*M&OTJvtd2T=cYF`JKU8<&Q_iEhfKs z{e!d7a*0))%Yyk|=Dt~S-`B>r{qC06%VYl^yzoJP!a1|HI=8bnW+rW71yy`o=a$r^ z@i}G4Eqq|Z@{9F-uH^~^yCokD7L{{WM>sefSn$`sJN;mWK;Gh48oPTB6x!W!oY42a zs9YxPU+%6u>%W%C_Ey}KIyhmj?y>bd>s#Vhh&(*Xk-C>dcEQYOPIV2Fe-BF&T5Kf} z=aeVLd=R?&FwIh6-IPTQ><-^#UX-XdZ>&*$<LJMI;i%}<&Qq@~@0D2W_*vZX<o^+y zZEbhHKCwyK9w3#stMesmgt@`*!>0P7p&a)dc~`%BzVZ8ai+7bW$5UfA7Vc|Vz3!vu z^@`QWHbT{va<iSky_))4YFfk;p8eaJ9)_JSSe-s&AL}W-E8B1E+{Nv>e#dRyf4Y0J zO%M6mSIo`GuaJEw^3~<tt_tqPhc3r?_dH#H@}=3L=e;jVLD!eBRK9iF4sw0@`yZg| z%MbpMu9jeVby%6>k#e=@(c>o96Mv_R|I7L(EU|mm|4-lT8~iIcAd@PMS6;JSVP#-= z$%k*u0B=QsIZP1zTy)?1#~b8lZ}FU)68hKCWMS6i3r5TSp2?oAq||uCLFKke*vY-6 zc_(zg?KS`2+}7Fm`){K9w#hRJ=FT|Ma%2hPWC6QrlT0qGU78toZOMgCTeoSxmC%0q ztZreR(Cc$sop--I{<ZpC<$dsyvL7dvk6(Y5s(M#MH96%jziJx)VY}0RI({6y5Ip~S zt%JbY--{oc=L_E7)$pa)_bk(;N78j|mrRs9_J}N(m?)At?c>U>t}pQuw{%z~=al#x z@7@@@sFG`@^vqi8m0>9yaaAc5(<dzM%yRG4knRq=sCCCnp}p_8>cko=x1U#1)QzMw z+QgbQZr(W-oZ>AkaIke6-^!Ido60`qbc={ilzbQ&*0bQ8TG#TE5`U%n`*r$y-YJ#` zd;Dj8;!q~7xg|F#T4PCWqRSH(xnBofAG$7lspv2Bgu|-~mme{?T&T4`#!XD$Q0c~p z6poo8yIqbg_|{iy?<jS`>6);P^kNUTmA}6qo;-1aS(J{F=#rP`CscbbIqs3R-M_X@ zX6Ehrb!=09U3skTbSq+GOVDeNMD8sUQWjnLcCAz~chMKoAf*!%XJkl=-gVyUa7c4P zmDI|9d$~*JsyYq%GWRoYkX4;|HqKD-E$eyFn`#r6&%Apg#&+(B!vY59+O~*4XPcn6 zZK8q9ul*U$x4e(84^R)!ed;z(?EAuXq516oTQA9;XxYqqY<d)LeqZ3dGZUE>DN8^2 zt$8XpF=|EM+eth2e&q~HifTD48`!nl@9PgI5AVN)dP~loSvc>%@5f>zzQ>)L?$}AJ zdKbKV&V-3kI)dK!!|qQAY)X;%_Ao0ly!KUe@QUBB@BNw764}f$|JOIu7Z*z#G&C+A z@v51UwIuPM+1U<}^Aiji{@q-@ubBH(MLD0Y%fn6w&aZ{LSl>PVy5ZDUCi%7EnvQGM z=VYjUsXraNzxQjz_Kh37b^bp-wYy;v`xIA&{k-v<GjC_iOaIyMNjzoy0kwB)zufz! z{i;Unme<=QJ0v8RPT0*GC9rtky-<DYoFeuw3qA-MnH}|TY*@Fp<;xY@N69G@WW<|o zC(l^LxOzKd>Z*{bRX3j1%Ct^eYa<>1*STej_tLs2ZxUE<dFv@u3rl~W!trTV%bsIg z+MlFM*JS=%H1B))>}85G6JHw|C(0YDs^4kd+<%krx@_X*AgeW7zZZn<*lv3|@<)%= z3?trV)52>$w-3)<qilKT;D)EHOYHW9EZ^0B&08;SQ?OIrbQ1}^KeMhLWwHBtx1sBa z@-jmm*`wZ<IBYbEkH5)#r*h}<rsU$u2kSl64;{a3E){V9z|(!shj+|*k?8ky(vF<y zJ2N{>TBjRWCHfaWf0Otl=#EKx$bmV6F7Dd<V!!70OnbvpF4yOka3I0&A-idSQ(4+x zlkUL%Z#l$2+&!i0!X9t1wfhI7Ti4~Yf9+npKB?Mpg(axx+@ZZ++4tO8(KN9pa+YY^ zLGS3&g19{?S?eFA{!ysadNEtRKq@tFpVxB}tvlJFoB3x<pTFtyo!5ey2bIlsoaWu9 z+Tj0pCD-?}OWd1HuQlA$$Txiuelv?dW%UX@hs67Txt1-HHfX<ZP|BQseb%nt&)Ex) zseDgknci$_d~nuurmS~d=hUixzKh*4=k*cO_fGfoT$W@%+|InJTKKuJZ4KXb9cTCK zf1I!KTnf$}XS_P|c;vYTiy7-5+L-X4c|RrS(%KK!+s^J4KltzB+S6X^&+XIy_57o! zL!Ch8hxyei0m~P1zkhzw;zEtYL?4Ol^Lj7+e!ROEEb`vI*MF5;mhHZ<<!S%7$^BmM zw6?zAL;hj4f71WAri`Tz<d?BU`S32OS-j*L*R?XXE9*9`tZzEasBa_`@K&-%uEO{F z8UOxO0^#TDo~;eyj}yv1|NhXw%-<QT?@J0N2b_C;@K(4~>YUmaW>@azg%sF*@K|t# zwP@eOudVOTIenU7b4&lbXwmd7H<Qn=@3DUQWoDtXwA`8f*Rv&=Z@ozP*Otzk)m5`* z!-}(U*W2!2al6kHes1@vn{`jWww|89ZccsVwSD$^ua6Y1ygcv6J@xaVlaw>>r)z(j zP~>knXHx&o$e$Zjzt?FBuYWZyX3Lc4Z9?p+kFts`T`x~~cOWKl(hiRpogJ)?^a>4~ zW9F;vbD8OxR9Ljjfb-(Zjh@%f`s{YOc~&H*<A9-=nI)UP!jrUP$BbHi8Y6P%8WhRh zcbWSBBL8}x)UZ7V0!%0PpF4X#{m!Ek9nliX|K^^pI{w#M+p_YAj#Z?^q>QA037h^O z$h_hm<HvX3+59>8{<-Z}j?7Kj#GpFw_o6McJ_nelZ<{5YRb+hhW#)C=xSfysb}FRK zj3_Zaa`#N_PkT_`$;N`|^FB5Ph6D~!mB`2>!XU!H!NI}6z@W%*jBUC@Ap--0G$R9p z2m>zzD)4m;an$wnbJO>A^z(Fc4Gz)sbqft)Wnld9@&EsSry$00F>o<3fJ|dhMA6N{ zz=^~^z`($eYiObm*B;=_$b?I)2#VI%P_3DH#U(|hxv6<2i6xo&d8kGqd&)nnaOH6p z28Nwn3=EPeMyWAET;XeI5?l&eGZ9c);;LeZ);9z>4cWYweJua(GBGeHvoSD8p_pgO zhRr-9^raZ+24?<J(kWwMU^v0az@Ua=U^XY3fg!2IB~Cf{$=R8C>4BxGrKtp6%V%vE zuO!95@XDEiK?ucgJ3dsy33&VI_g8F+5)2GSwb2b)sext?YLf}wySrvxczTk7f#Deg z1A{S&i-a8^2BAl-b7G!zeqKptUTLalnqzWdX=YJsu}^+-HUTG3oZ-fNijjfg3nRKs zZce1ygx^n|Hj245EDQ{K+zbq$)+8dSSGi!f$u%#9P`a?)lB46##K3Tvg@Hj9C7`@L zaT-b>NH$FqF;!<_VEBY#<~wiPX5#n!WQpzhe9R0Cx7a{s2y!;h48UP#MRIBZ#=s|f zLNQPb+}FX%z%Z4Ufk6Sq|L248nM)uD?3+J-m*ikzaOFZbc3mW1WATSVq1+CIBTNho zr`Z@7G*MhDmxSF|PzrV{N=^06&&$NTv<^Kq#QKAFzh`1#Fk?YC-zk+i^YObs##Bjf zH#-A^sW1bBI*R)zW?(npH$OQ$HHA3WZ=Yr1E6B#cu!aNO^i>7Kn2z7=&s0x({%2rd z@Mc7hQps}crU#`Km*$iZNGT^Tem0C{W?=ZpjBadx1zuzEyVgU>JC}i(f#Eeqeo?N$ zWo$`UVh*A5B5!WVcL!Dm1_g}#QeBVFTmqp`{^-BQBz6Xd3{Lb=5NgG1EdEfq{C*K1 z3o`@5S2hL)(1u4uk@>p^hq0x3d6{|Xgo5F&Q{hfmRt5$gUi9K9Vgg=+34}vgXs@Uq z8w0~Mc64*UPQ`C7{(umu;5RU5X8^Uh7>rOdUiBR8<_1IVy9BNGL}?5V@W3ULgpwi_ z28L)>1~iMLmyl=?ejk}Ujark&%)lVR&cFa#kAaBVZ!7Rxlv<>sl9-pDN3d1%hb55z z6bl1`A{V+1`_>R=gAswiQrYfymV=#vft3&4hF2Sjv%#2v4L!B@AN#8@Fla|HFo2E& zL4;DsP69R%Fxgw)*)v3gfnlvJy2*d<6EYcp%qpF~^sj-1fx(0uy)0PG!3b{Aqqp6H zOA?C+*7Rzt8z+P@F)*BDVPF7Fl_G+oi5HKt1cKq&oCEqAEDQ`^F-+AHz-KD{AXwk4 z_}q?}fgzp^JqXr_;54-a<D@e5>fM;N-aCttfnhNddJs5D;4zj!5TyTl)8Wm+!0?$B z-Bd;?e5T?Lf`i{$j>D$kP@`*+91c?}^O6ab+l8(P3C~y=807fT+tA`lxJ@Mx0RNwz z<haAez|hHoZfKAO9z*f_KWBsf4h?1ohI)1e2GAi7h~(O=kK54Dyv)K<jCJ|w>7dqA zGv)&;149%)0|V&RCxqGT#)Ql!5Ed<d@^(+y7#R9F(2WkVBxp4L5JA4m88t*EI$$>% z)RXl{%_&GNB9tzWZ^$x3sUOz|6EquIRpPuF8a?=tuQ@^u{w+y_EF%#7X-G#Nq8c5O zO3-Nh!H;~_7pl>#YjGP5KHrN_=p!Fzg<4DTHWM(KKzJaZaf51dYYQQh@dpR;@hqsR z@l*#6lQVFgn1h}`kWcVHH9ND5u-W+CjeOn#YLj?T4-T`jp9q5PXypCCpyLt{h029~ zyap49LgYP5sOEA`#cwYDfI!}v0ow6|aPQtZ*v%!l{|P-vkXI9<wo&yL5NQR0z(HOa zhHAsTrNr8RKbVl0!JyW|C2O$TfNi}QddM^)&6%Q(WxZUF+f)L9fjsJrYN*gQJcgqC YpOp=i6dV~G8P<z2FsSZjWME(b0Ga(<mH+?% literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m14/project/MOOCSettings.scala b/previous-exams/2021-midterm/m14/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m14/project/StudentTasks.scala b/previous-exams/2021-midterm/m14/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m14/project/build.properties b/previous-exams/2021-midterm/m14/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m14/project/buildSettings.sbt b/previous-exams/2021-midterm/m14/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m14/project/plugins.sbt b/previous-exams/2021-midterm/m14/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m14/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala new file mode 100644 index 0000000..a91a39c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractBlockingQueue.scala @@ -0,0 +1,14 @@ +package m14 + +abstract class AbstractBlockingQueue[T] extends Monitor { + private var underlying: List[T] = Nil + + def getUnderlying(): List[T] = + underlying + + def setUnderlying(newValue: List[T]): Unit = + underlying = newValue + + def put(elem: T): Unit + def take(): T +} diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala new file mode 100644 index 0000000..670294c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/AbstractThreadPoolExecutor.scala @@ -0,0 +1,7 @@ +package m14 + +abstract class AbstractThreadPoolExecutor { + def execute(task: Unit => Unit): Unit + def start(): Unit + def shutdown(): Unit +} diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala new file mode 100644 index 0000000..82e2e4c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/M14.scala @@ -0,0 +1,80 @@ +package m14 + +object M14 { + /** A thread pool that executes submitted task using one of several threads */ + class ThreadPoolExecutor(taskQueue: BlockingQueue[Unit => Unit], poolSize: Int) + extends AbstractThreadPoolExecutor { + + private class Worker extends Thread { + override def run(): Unit = { + try { + while (true) { + + val task = taskQueue.take() + task(()) + } + } catch { + case e: InterruptedException => + // Nothing to do here, we are shutting down gracefully. + } + } + } + private val workers: List[Worker] = List.fill(poolSize)(new Worker()) + + /** Executes the given task, passed by name. */ + def execute(task: Unit => Unit): Unit = + + taskQueue.put(task) + + /** Starts the thread pool. */ + def start(): Unit = + workers.foreach(_.start()) + + /** Instantly shuts down all actively executing tasks using an interrupt. */ + def shutdown(): Unit = + workers.foreach(_.interrupt()) + } + + /** + * A queue whose take operations blocks until the queue become non-empty. + * Elements must be retrived from this queue in a last in, first out order. + * All methods of this class are thread safe, that is, they can safely + * be used from multiple thread without any particular synchronization. + */ + class BlockingQueue[T] extends AbstractBlockingQueue[T] { + + // The state of this queue is stored in an underlying List[T] defined in + // the AbstractBlockingQueue class. Your implementation should access and + // update this list using the following setter and getter methods: + // - def getUnderlying(): List[T] + // - def setUnderlying(newValue: List[T]): Unit + // Using these methods is required for testing purposes. + + /** Inserts the specified element into this queue (non-blocking) */ + def put(elem: T): Unit = + + this.synchronized { + val underlying = getUnderlying() + setUnderlying(elem :: underlying) + this.notifyAll() + } + + + /** + * Retrieves and removes the head of this queue, waiting if necessary + * This queue operates in a first in, first out order. + * until an element becomes available (blocking). + * This queue operates in a last in, first out order. + */ + def take(): T = + + this.synchronized { + while (getUnderlying().isEmpty) + this.wait() + val underlying = getUnderlying() + val head = underlying.head + setUnderlying(underlying.tail) + head + } + } +} diff --git a/previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala b/previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala new file mode 100644 index 0000000..97dd73a --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/main/scala/m14/Monitor.scala @@ -0,0 +1,23 @@ +package m14 + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: => T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala new file mode 100644 index 0000000..cd04f2a --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/M14Suite.scala @@ -0,0 +1,159 @@ +package m14 + +import instrumentation.SchedulableBlockingQueue +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +class M14Suite extends munit.FunSuite { + import M14._ + + test("ThreadPool should put jobs in the queue, Workers should execute jobs from the queue (10pts)") { + case class PutE(e: Unit => Unit) extends Exception + val nThreads = 3 + var taken = false + class TestBlockingQueue extends BlockingQueue[Unit => Unit] { + override def put(e: Unit => Unit): Unit = + throw new PutE(e) + + override def take(): Unit => Unit = + x => { + taken = true + Thread.sleep(10 * 1000) + } + } + + val tpe = new ThreadPoolExecutor(new TestBlockingQueue, nThreads) + val unit2unit: Unit => Unit = x => () + try { + tpe.execute(unit2unit) + assert(false, "ThreadPoolExecutor does not put jobs in the queue") + } catch { + case PutE(e) => + assert(e == unit2unit) + } + tpe.start() + Thread.sleep(1000) + assert(taken, s"ThreadPoolExecutor workers do no execute jobs from the queue") + tpe.shutdown() + } + + test("BlockingQueue should work in a sequential setting (1pts)") { + testSequential[(Int, Int, Int, Int)]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched) + queue.put(1) + queue.put(2) + queue.put(3) + queue.put(4) + (queue.take(), + queue.take(), + queue.take(), + queue.take()) + }{ tuple => + (tuple == (4, 3, 2, 1), s"Expected (4, 3, 2, 1) got $tuple") + } + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'take' (3pts)") { + testManySchedules(2, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.take()), + args => (args(1) == 1, s"Expected 1, got ${args(1)}")) + }) + } + + test("BlockingQueue should not be able to take from an empty queue (3pts)") { + testSequential[Boolean]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched); + queue.put(1) + queue.put(2) + queue.take() + queue.take() + failsOrTimesOut(queue.take()) + }{ res => + (res, "Was able to retrieve an element from an empty queue") + } + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take' (5pts)") { + testManySchedules(3, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.put(2), () => queue.take()) + , args => { + val takeRes = args(2).asInstanceOf[Int] + val nocreation = (takeRes == 1 || takeRes == 2) + if (!nocreation) + (false, s"'take' should return either 1 or 2") + else (true, "") + }) + }) + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take', Thread 4: 'take' (10pts)") { + testManySchedules(4, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.put(2), () => queue.take(), () => queue.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(2).asInstanceOf[Int] + val takeRes2 = args(3).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 3: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 4: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + (false, s"'Thread 3 and 4' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'put(3)', Thread 4: 'take', Thread 5: 'take' (10pts)") { + testManySchedules(5, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.put(2), () => queue.put(3), + () => queue.take(), () => queue.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(3).asInstanceOf[Int] + val takeRes2 = args(4).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2, 3).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 4: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 5: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + return (false, s"'Thread 4 and 5' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + test("BlockingQueue should work when Thread 1: 'put(1); put(2); take', Thread 2: 'put(3)', Thread 3: 'put(4)' (10pts)") { + testManySchedules(3, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List( + () => { queue.put(1); queue.put(2); queue.take() }, + () => queue.put(3), + () => queue.put(4) + ), args => { + val takeRes = args(0).asInstanceOf[Int] + val nocreation = List(1, 2, 3, 4).contains + if (!nocreation(takeRes)) + (false, s"'Thread 1: take' returned $takeRes, but should return a value in {1, 2, 3, 4}") + else if (takeRes == 1) + (false, s"'Thread 1' returned 2 before returning 1 (got $takeRes)") + else + (true, "") + }) + }) + } +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..64aa205 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/MockedMonitor.scala @@ -0,0 +1,73 @@ +package m14 +package instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala new file mode 100644 index 0000000..16e68fa --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/SchedulableBlockingQueue.scala @@ -0,0 +1,17 @@ +package m14 +package instrumentation + +class SchedulableBlockingQueue[T](val scheduler: Scheduler) + extends m14.M14.BlockingQueue[T] with MockedMonitor { + private var underlying: List[T] = Nil + + override def getUnderlying(): List[T] = + scheduler.exec { + underlying + }(s"Get $underlying") + + override def setUnderlying(newValue: List[T]): Unit = + scheduler.exec { + underlying = newValue + }(s"Set $newValue") +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala new file mode 100644 index 0000000..448a809 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Scheduler.scala @@ -0,0 +1,305 @@ +package m14 +package instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala new file mode 100644 index 0000000..bc1241c --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +package m14 +package instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala new file mode 100644 index 0000000..faa3505 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestHelper.scala @@ -0,0 +1,125 @@ +package m14 +package instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 240 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala new file mode 100644 index 0000000..f980f99 --- /dev/null +++ b/previous-exams/2021-midterm/m14/src/test/scala/m14/instrumentation/TestUtils.scala @@ -0,0 +1,20 @@ +package m14 +package instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m15.md b/previous-exams/2021-midterm/m15.md new file mode 100644 index 0000000..781e05a --- /dev/null +++ b/previous-exams/2021-midterm/m15.md @@ -0,0 +1,42 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m15 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m15 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will implement a simple thread pool executor. +Thread pool executors provide a way to execute tasks in parallel using one of several pooled threads. +Using a pool of threads provides improved performance compared to creating a new thread for every operation since threads in the pool are reused throughout the executor's lifetime. + +Thread pool executors are one of the core primitive used to implement parallel programs. For example, they are the underlying mechanism used in the implementation of `Future`-s. + +Your task is to complete the implementation of the `ThreadPoolExecutor` class. This class' constructor takes the number of threads of the pool as argument and exposes two life-cycle methods (`start` and `shutdown`), and an `execute` method to run tasks on the thread pool. The `execute` method takes as argument `Unit => Unit` functions. These functions can be constructed anonymously using the following syntax: `val func = (x: Unit) => println("hello")`. Furthermore, given a `func` function of type `Unit => Unit`, one can invoke that function using `func(())`. +For the purpose of this exercise, you can assume that the tasks submitted to the thread pool via the `execute` method do not throw exceptions. + +The thread pool implementation uses two additional classes: +- `BlockingQueue`, used by the `ThreadPoolExecutor` to store pending tasks, +- `Worker`-s, which each run in a separate thread, consume tasks from the queue and execute those tasks. + +The `BlockingQueue` implements two methods: +- `put` to insert an element in the queue +- `take` to retrieve and remove an element from the queue, in a first in first out order. + +The `put` operation always succeeds and is non-blocking (the queue is unbounded). +The `take` operation is a potentially blocking operation that waits for new elements when called on an empty queue. + +Given that `Worker`-s run on separate threads, the `take` operation must be thread-safe. Furthermore, since the thread pool executor could also be used from multiple threads, the `put` operation should also be thread-safe. +Your implementation should use a single lock to achieve this thread safety, specifically using the `[wait](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait())`/`[notify](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify())`/`[notifyAll](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notifyAll())`/`synchronized` primitives. +Remember that `wait`, `notify` and `notifyAll` should only be invoked inside a synchronized block. diff --git a/previous-exams/2021-midterm/m15/.gitignore b/previous-exams/2021-midterm/m15/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m15/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m15/assignment.sbt b/previous-exams/2021-midterm/m15/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m15/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m15/build.sbt b/previous-exams/2021-midterm/m15/build.sbt new file mode 100644 index 0000000..3b7539d --- /dev/null +++ b/previous-exams/2021-midterm/m15/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m15" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m15.M15Suite" diff --git a/previous-exams/2021-midterm/m15/grading-tests.jar b/previous-exams/2021-midterm/m15/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..3243be21fe08c74418f052ef9b4f521129bd62f0 GIT binary patch literal 126110 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�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	bqLya}XXIIv*gUMy8+vmlG{`J~*xqr#z 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 literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m15/project/MOOCSettings.scala b/previous-exams/2021-midterm/m15/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m15/project/StudentTasks.scala b/previous-exams/2021-midterm/m15/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m15/project/build.properties b/previous-exams/2021-midterm/m15/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m15/project/buildSettings.sbt b/previous-exams/2021-midterm/m15/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m15/project/plugins.sbt b/previous-exams/2021-midterm/m15/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m15/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala new file mode 100644 index 0000000..85a28b2 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractBlockingQueue.scala @@ -0,0 +1,14 @@ +package m15 + +abstract class AbstractBlockingQueue[T] extends Monitor { + private var underlying: List[T] = Nil + + def getUnderlying(): List[T] = + underlying + + def setUnderlying(newValue: List[T]): Unit = + underlying = newValue + + def put(elem: T): Unit + def take(): T +} diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala new file mode 100644 index 0000000..5e663e8 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/AbstractThreadPoolExecutor.scala @@ -0,0 +1,7 @@ +package m15 + +abstract class AbstractThreadPoolExecutor { + def execute(task: Unit => Unit): Unit + def start(): Unit + def shutdown(): Unit +} diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala new file mode 100644 index 0000000..27bb83d --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/M15.scala @@ -0,0 +1,79 @@ +package m15 + +object M15 { + /** A thread pool that executes submitted task using one of several threads */ + class ThreadPoolExecutor(taskQueue: BlockingQueue[Unit => Unit], poolSize: Int) + extends AbstractThreadPoolExecutor { + + private class Worker extends Thread { + override def run(): Unit = { + try { + while (true) { + + val task = taskQueue.take() + task(()) + } + } catch { + case e: InterruptedException => + // Nothing to do here, we are shutting down gracefully. + } + } + } + private val workers: List[Worker] = List.fill(poolSize)(new Worker()) + + /** Executes the given task, passed by name. */ + def execute(task: Unit => Unit): Unit = + + taskQueue.put(task) + + /** Starts the thread pool. */ + def start(): Unit = + workers.foreach(_.start()) + + /** Instantly shuts down all actively executing tasks using an interrupt. */ + def shutdown(): Unit = + workers.foreach(_.interrupt()) + } + + /** + * A queue whose take operations blocks until the queue become non-empty. + * Elements must be retrived from this queue in a first in, first out order. + * All methods of this class are thread safe, that is, they can safely + * be used from multiple thread without any particular synchronization. + */ + class BlockingQueue[T] extends AbstractBlockingQueue[T] { + + // The state of this queue is stored in an underlying List[T] defined in + // the AbstractBlockingQueue class. Your implementation should access and + // update this list using the following setter and getter methods: + // - def getUnderlying(): List[T] + // - def setUnderlying(newValue: List[T]): Unit + // Using these methods is required for testing purposes. + + /** Inserts the specified element into this queue (non-blocking) */ + def put(elem: T): Unit = + + this.synchronized { + val underlying = getUnderlying() + setUnderlying(elem :: underlying) + this.notifyAll() + } + + + /** + * Retrieves and removes the head of this queue, waiting if necessary + * until an element becomes available (blocking). + * This queue operates in a first in, first out order. + */ + def take(): T = + + this.synchronized { + while (getUnderlying().isEmpty) + this.wait() + val underlying = getUnderlying() + val last = underlying.last + setUnderlying(underlying.init) + last + } + } +} diff --git a/previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala b/previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala new file mode 100644 index 0000000..b64e697 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/main/scala/m15/Monitor.scala @@ -0,0 +1,23 @@ +package m15 + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: => T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala new file mode 100644 index 0000000..e0f2243 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/M15Suite.scala @@ -0,0 +1,281 @@ +package m15 + +import instrumentation.SchedulableBlockingQueue +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +class M15Suite extends munit.FunSuite { + import M15._ + + test("ThreadPool should put jobs in the queue, Workers should execute jobs from the queue (10pts)") { + case class PutE(e: Unit => Unit) extends Exception + val nThreads = 3 + var taken = false + class TestBlockingQueue extends BlockingQueue[Unit => Unit] { + override def put(e: Unit => Unit): Unit = + throw new PutE(e) + + override def take(): Unit => Unit = + x => { + taken = true + Thread.sleep(10 * 1000) + } + } + + val tpe = new ThreadPoolExecutor(new TestBlockingQueue, nThreads) + val unit2unit: Unit => Unit = x => () + try { + tpe.execute(unit2unit) + assert(false, "ThreadPoolExecutor does not put jobs in the queue") + } catch { + case PutE(e) => + assert(e == unit2unit) + } + tpe.start() + Thread.sleep(1000) + assert(taken, s"ThreadPoolExecutor workers do no execute jobs from the queue") + tpe.shutdown() + } + + test("BlockingQueue should work in a sequential setting (1pts)") { + testSequential[(Int, Int, Int, Int)]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched) + queue.put(1) + queue.put(2) + queue.put(3) + queue.put(4) + (queue.take(), + queue.take(), + queue.take(), + queue.take()) + }{ tuple => + (tuple == (1, 2, 3, 4), s"Expected (1, 2, 3, 4) got $tuple") + } + } + + test("BlockingQueue should work when Thread 1: 'put(1)', Thread 2: 'take' (3pts)") { + testManySchedules(2, sched => { + val queue = new SchedulableBlockingQueue[Int](sched) + (List(() => queue.put(1), () => queue.take()), + args => (args(1) == 1, s"Expected 1, got ${args(1)}")) + }) + } + + test("BlockingQueue should not be able to take from an empty queue (3pts)") { + testSequential[Boolean]{ sched => + val queue = new SchedulableBlockingQueue[Int](sched); + queue.put(1) + queue.put(2) + queue.take() + queue.take() + failsOrTimesOut(queue.take()) + }{ res => + (res, "Was able to retrieve an element from an empty queue") + } + } + + test("Should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take', and a buffer of size 1") { + testManySchedules(3, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => prodCons.put(1), () => prodCons.put(2), () => prodCons.take()) + , args => { + val takeRes = args(2).asInstanceOf[Int] + val nocreation = (takeRes == 1 || takeRes == 2) + if (!nocreation) + (false, s"'take' should return either 1 or 2") + else (true, "") + }) + }) + } + + // testing no duplication + test("Should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'take', Thread 4: 'take', and a buffer of size 3") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => prodCons.put(1), () => prodCons.put(2), () => prodCons.take(), () => prodCons.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(2).asInstanceOf[Int] + val takeRes2 = args(3).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 3: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 4: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + (false, s"'Thread 3 and 4' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + // testing no duplication with 5 threads + test("Should work when Thread 1: 'put(1)', Thread 2: 'put(2)', Thread 3: 'put(3)', Thread 4: 'take', Thread 5: 'take', and a buffer of size 1") { + testManySchedules(5, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => prodCons.put(1), () => prodCons.put(2), () => prodCons.put(3), + () => prodCons.take(), () => prodCons.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(3).asInstanceOf[Int] + val takeRes2 = args(4).asInstanceOf[Int] + val nocreation = (x: Int) => List(1, 2, 3).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 4: take' returned $takeRes1 but should return a value in {1, 2, 3}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 5: take' returned $takeRes2 but should return a value in {1, 2, 3}") + + val noduplication = takeRes1 != takeRes2 + if (!noduplication) + return (false, s"'Thread 4 and 5' returned the same value: $takeRes1") + else (true, "") + } + m() + }) + }) + } + + // testing fifo buffer size 1 + test("Should work when Thread 1: 'put(1); put(2)', Thread 2: 'take', Thread 3: 'put(3)', Thread 4: 'put(4)', and a buffer of size 3") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(1); prodCons.put(2) }, () => prodCons.take(), + () => prodCons.put(3), () => prodCons.put(4)) + , args => { + def m(): (Boolean, String) = { + val takeRes = args(1).asInstanceOf[Int] + // no creation + val nocreation = (x: Int) => List(1, 2, 3, 4).contains(x) + if (!nocreation(takeRes)) + return (false, s"'Thread 2: take' returned $takeRes, but should return a value in {1, 2, 3, 4}") + // fifo (cannot have 2 without 1) + if (takeRes == 2) + (false, s"'Thread 2' returned 2 before returning 1") + else + (true, "") + } + m() + }) + }) + } + + // testing fifo buffer size 5 + test("Should work when Thread 1: 'put(1); put(2)', Thread 2: 'take', Thread 3: 'put(11)', Thread 4: 'put(10)', and a buffer of size 5") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(1); prodCons.put(2) }, () => prodCons.take(), + () => prodCons.put(11), () => prodCons.put(10)) + , args => { + def m(): (Boolean, String) = { + val takeRes = args(1).asInstanceOf[Int] + // no creation + val nocreation = (x: Int) => List(1, 2, 10, 11).contains(x) + if (!nocreation(takeRes)) + return (false, s"'Thread 2: take' returned $takeRes, but should return a value in {1, 2, 10, 11}") + // fifo (cannot have 2 without 1) + if (takeRes == 2) + (false, s"'Thread 2' returned 2 before returning 1") + else + (true, "") + } + m() + }) + }) + } + + // testing fifo on more complicated case + test("Should work when Thread 1: 'put(1); put(3)', Thread 2: 'put(2)', Thread 3: 'put(4)', Thread 4: 'take', Thread 5: 'take', and a buffer of size 10") { + testManySchedules(5, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(1); prodCons.put(3) }, () => prodCons.put(2), + () => prodCons.put(4), () => prodCons.take(), () => prodCons.take()) + , args => { + def m(): (Boolean, String) = { + val takeRes1 = args(3).asInstanceOf[Int] + val takeRes2 = args(4).asInstanceOf[Int] + // no creation + val nocreation = (x: Int) => List(1, 2, 3, 4).contains(x) + if (!nocreation(takeRes1)) + return (false, s"'Thread 4: take' returned $takeRes1 but should return a value in {1, 2, 3, 4}") + if (!nocreation(takeRes2)) + return (false, s"'Thread 5: take' returned $takeRes2 but should return a value in {1, 2, 3, 4}") + // no duplication + if (takeRes1 == takeRes2) + return (false, s"'Thread 4 and 5' returned the same value: $takeRes1") + // fifo (cannot have 3 without 1) + val takes = List(takeRes1, takeRes2) + if (takes.contains(3) && !takes.contains(1)) + (false, s"'Thread 4 or 5' returned 3 before returning 1") + else + (true, "") + } + m() + }) + }) + } + + // combining put and take in one thread + test("Should work when Thread 1: 'put(21); put(22)', Thread 2: 'take', Thread 3: 'put(23); take', Thread 4: 'put(24); take', and a buffer of size 2") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[Int](sched) + (List(() => { prodCons.put(21); prodCons.put(22) }, () => prodCons.take(), + () => { prodCons.put(23); prodCons.take() }, () => { prodCons.put(24); prodCons.take() }) + , args => { + def m(): (Boolean, String) = { + val takes = List(args(1).asInstanceOf[Int], args(2).asInstanceOf[Int], args(3).asInstanceOf[Int]) + // no creation + val vals = List(21, 22, 23, 24) + + var i = 0 + while (i < takes.length) { + val x = takes(i) + if (!vals.contains(x)) + return (false, s"'Thread $i: take' returned $x but should return a value in $vals") + i += 1 + } + + // no duplication + if (takes.distinct.size != takes.size) + return (false, s"Takes did not return unique values: $takes") + // fifo (cannot have 22 without 21) + if (takes.contains(22) && !takes.contains(21)) + (false, s"`Takes returned 22 before returning 21") + else + (true, "") + } + m() + }) + }) + } + + // completely hidden hard to crack test + test("[Black box test] Values should be taken in the order they are put") { + testManySchedules(4, sched => { + val prodCons = new SchedulableBlockingQueue[(Char, Int)](sched) + val n = 2 + (List( + () => for (i <- 1 to n) { prodCons.put(('a', i)) }, + () => for (i <- 1 to n) { prodCons.put(('b', i)) }, + () => for (i <- 1 to n) { prodCons.put(('c', i)) }, + () => { + import scala.collection.mutable + var counts = mutable.HashMap.empty[Char, Int] + counts('a') = 0 + counts('b') = 0 + counts('c') = 0 + for (i <- 1 to (3 * n)) { + val (c, n) = prodCons.take() + counts(c) += 1 + assert(counts(c) == n) + } + }) + , _ => + (true, "") + ) + }) + } +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..c0591e3 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/MockedMonitor.scala @@ -0,0 +1,73 @@ +package m15 +package instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala new file mode 100644 index 0000000..31b09be --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/SchedulableBlockingQueue.scala @@ -0,0 +1,17 @@ +package m15 +package instrumentation + +class SchedulableBlockingQueue[T](val scheduler: Scheduler) + extends m15.M15.BlockingQueue[T] with MockedMonitor { + private var underlying: List[T] = Nil + + override def getUnderlying(): List[T] = + scheduler.exec { + underlying + }(s"Get $underlying") + + override def setUnderlying(newValue: List[T]): Unit = + scheduler.exec { + underlying = newValue + }(s"Set $newValue") +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala new file mode 100644 index 0000000..fd5f427 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Scheduler.scala @@ -0,0 +1,305 @@ +package m15 +package instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala new file mode 100644 index 0000000..e82c098 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +package m15 +package instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala new file mode 100644 index 0000000..5f86338 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestHelper.scala @@ -0,0 +1,125 @@ +package m15 +package instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 240 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala new file mode 100644 index 0000000..3f4afe8 --- /dev/null +++ b/previous-exams/2021-midterm/m15/src/test/scala/m15/instrumentation/TestUtils.scala @@ -0,0 +1,20 @@ +package m15 +package instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m2.md b/previous-exams/2021-midterm/m2.md new file mode 100644 index 0000000..47b0976 --- /dev/null +++ b/previous-exams/2021-midterm/m2.md @@ -0,0 +1,61 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m2 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m2 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +Given the following sequential implementation of a function that computes the sequence of rolling geometric means, your task will be to complete and optimize a parallel version of this code. + +```scala +/** Compute the rolling geometric mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(math.pow(x1, 1), math.pow((x1 + x2), 1.0/2), math.pow((x1 + x2 + x3), 1.0/3), ..., math.pow((x1 + x2 + x3 + ... + xn), 1.0/n))` + */ +def rollingGeoMeanParallel(arr: Arr[Int]): Arr[Double] = { + // Transform all numbers to roots with degree 1 + val arr1 = arr.map(x => Root(x, 1)) + // Compute the rolling geometric mean keeping the root structured + val arr2 = arr1.scan(Root(1, 0))((acc, x) => Root(acc.radicand * x.radicand, acc.degree + x.degree)) + // Transform the roots to Doubles + arr2.map(root => root.toDouble) + // Drop the extra initial element that was added by the scan + arr3.tail +``` + + This implementation has some issues: + - It does not use parallelism + - Creates two intermediate arrays by calling `map` + - Creates an extra intermediate arrays by calling `tail` + - Scan returns an extra element we do not need + + We want to parallelize and avoid the creation of the extra arrays. + As we are calling a `scan` the natural operations we need are `upsweep` and `downsweep`. + It is possible specialize those operations for our problem by letting those operations do the mapping. + It is also possible to change those operations to not generate the first element. + +We give you a version of `rollingGeoMeanSequential` that partially implements the parallelization using `upsweep` and `downsweep`. + + Your tasks in the exercise will be to: + - TASK 1: Implement the parallelization of `upsweep` and `downsweep` + - TASK 2: Remove the calls to the `map` + - TASK 3: Remove the call to `tail` + + You can get partial points for solving part of the tasks. + The order of the tasks is a suggestion, you may do them in any order if that is simpler for you. + +Look at the `Lib` trait to find the definitions of functions and classes you can use (or already used). +In this question we use a `Arr` array class instead of the normal `Array`. You may assume that this class has the same performance characteristics as the normal array. `Arr` provides only a limited set of operations. diff --git a/previous-exams/2021-midterm/m2/.gitignore b/previous-exams/2021-midterm/m2/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m2/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m2/assignment.sbt b/previous-exams/2021-midterm/m2/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m2/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m2/build.sbt b/previous-exams/2021-midterm/m2/build.sbt new file mode 100644 index 0000000..4a68d9e --- /dev/null +++ b/previous-exams/2021-midterm/m2/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m2" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m2.M2Suite" diff --git a/previous-exams/2021-midterm/m2/grading-tests.jar b/previous-exams/2021-midterm/m2/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..66ce3fdf704542bc3d07a5b92687caf1fd2b3cf1 GIT binary patch literal 34633 zcmWIWW@Zs#;Nak3U|>*WKn5ZVybQjsA&$D9es21{j((nQuE8OCzHXr*tPG4FKK}pz z?-T>WXWuiYeY|z`F7kToYMncCeshq)72^j_Kb_G%;d$2gthT2PBiF08lxa_vL}@-r zTQ+5h*wa_fq!L#&WSd`LmRcbF=DCExn}_m;PK(A&m^EkSw3$4?)22^~Z^;r`#g(*% zY39P$Gn>v!%z1Y(OJbGho*0GzZ+4D_XEUV>7#JAD7#SD>yqQ_J7#KjVM{_<i11CeS zkv`nDAeGoXDgjaHYZP3XS(2)vl9-pDr(&p=oRe5w4A<Tooa=u%K%`DDS$oREls#6W zZDDVZ-MLfaD6445!r^J&tEzJ3$dh$33vb-rU9$FL{?ASqp`RI#`i<t5_4>>#JY9AE zbn&^*bE<dA+wZSq{=lLy@#(JH+N&F!%>~*HE}i5S%bXmswM}T+?VGQ^**u>5-u?Np ze|5#1PX_!jcR6fvxMb3rZ?f+S+omf1iGEtS&gP!zD%Bl1tHs_+N|~_Db-1FFwIp$p zqVWe)AHyXYKbAjf2|K*iF;(b#!CXi0NhzwUB%Zl_6gt_aeK%op;@z6`xu5*^JS(h> zslIC|>UUwwzs0*Ftr8;k>14Oh`|h^WNZ{YMboVbz;hwzROYZB)rWp21TTKf{(3q{9 zx6{(;;DR^P`b_eSd)U?U=BI63_pWc-q-Xo`O(fFXzby3R6`izhznD#t)}`A|ZKGyq z9_3#1w&hZ1+DdcpYfq<fm{)t6n0#PvbN%hodM_|=)dCOQJxUK(UnyZyZL2KySRngD zMM1K}x4n~#`S$^X;?_BO3Er}tRr}vGSj&69wtHXk<hf3GSJ{oX9QK`0bX||K-zitN z=S=&)MC9MJ<G*Viug|zWt#A3SBlm<3c3LIP*m5`dWb*~}4SB0ClppDn4qf)vgDWnn zM@+Exm_u?x<GlV8)%_y1jW<t~`^-&#`GLn=|J2m2#ya&23%I`iIJqff!opzF1jT+c zxyhk2SCU$Fj$G4v7x4VVE^g&#yV`$qURPVVxazOWv&4NhZSCS4=dCDKTbFe-R-A3c z{n*lwz{NGQ{{3^9=_ecMlOEB-%ylA>?Wa%62|?q-EI*6CRD0bl{M3+c7|iwh<IIDf zS9}l$rSAK7N2a7QF))O(KvFjeY1Rlm%?ADTzw97U*SAshl)zmFK~eUww`@kTKLp)9 zcpRNCE!;S{WyXv<$5{FLtuJjoR)2cFhss2G-#?3c-k18$C~Py^TWvr8dFA_GufKnn zXSnuZ&cc#AE4E7|DkVRxjFEn8Dr3;rnxG(f;@r27ouA@dC*Hk&`|UHg$%*g&tMa)? zs%?Jawf?kd`U;*a`^~*PYd^TnnD(IR_?Dd^^O)NYF4c0{?7??TlB@RqK^Et}ruyu2 z6|yle%hL+k!zJhFc!sHUC#Go_Zd~K7`<S;){NM2h9rX`OkA8LhoBQ0O<Z)WT%ui{h z(-Z$K%2yA3HFu(w*u`tt*I9Hfy~vk$fu*i=dxzwm62orGwpsR17R+{5`EomN_ld`R zhcjw4s(CIS+<)C&eDd?aCu@zSv_H78VxFgm_~A!SlOxrPB-Z`7`ruKLM%+FJxfvf6 z59d^52yKnOsJ8CH-ql=J*GEh+40-wIFQaFoj9{wStx4SSr(Jereq;S>lXzzL{OCVR z&RTc<S?Q3qak5Og%M@3yM#Vp|a-Of#4?fy<P3cz1p6kLT4#Cm8R{QivL@C*s{N{PQ z(B^`TpORLY^JJIUk5RYI)nxn++H-_Mc4MuZLs8+}Yoed*6y5a$;{J7Z8lQPL_tCY= z+{%|CpYLnTakh<(6zo4)uu_^M@DRI=;_6H9kH&7A5XBv#l9GM5d3w>^<IO$UXPF|W z82_kVdP`Go?(!;~BE_>?g0Cd)*K$6)*fG1eY`W28)@fM`&kS0#H73qiU+rU?{KWtA zcCVX(pL7-<J^wIsm-vS>X8#yLDRXL7v#2){1A_+Ml&OGPn)+lWdFB@6s5llCfoQZ8 z+8dT#E*vUy*F4k8bC%ewY3`a)a>+Ao6aoaNUegj;b#RO8q(u$uGp%)lCwb2BTi|;1 z`)Bzd+&>Pnznrw`%2omUozwQ8d|GsWW~RsFmzVfwRu{k9`TI@ryM5`;*4Nk7@;p$f z6SxsBdD6F6<n^-T6|BX2@hhiZHQuJ{&g%5w>BdVh4{fURK0mcIThrWld(Ii_#gE@E zV`}73Fz=u0wfOO3ChO?AA|)J0=38mK5P9+Kuzd8)>!)`)EZ@FPK}}%UWQR?27dN%E zKe;XXg+t??QhFU1lY7jSJ2hKl)EGBsJ=H38pRX-#x$8x?>*Hlnv3pW<v^=<E{`jY} z{$&y@XTSM!QtbV$-;xZtw?>uo=zSNzb@TLB!^=i<3mdnHJrQV_xl3mPuN|-M1=~j3 z8`91k=ecZtm(=cx(~Dm-OYG*{__^j;M*ghqGy2rN^E?WWVK203WPCGu_xx_<ro&9K z=SquR6Y3f6`W`h{9~-5$K~8XQnD+XUUu(2B#BB*Sn^bIdZpCqymXq=GyuaRRdMClO zduvTWq=@eMy+vwan$sQrY)aI%yna`wQ*zx4(?-R$59a<zxm$Gp_mPZMp2zQ$mF1Xi zc(C^Ok|*AqLu#{5+s-I`@3{SW%|$b@9@o%=5|aLB=giif6V6&DvTe;KrpFbgZQ&ng zIZV&h*>!66%8j4gnfiC$opK=3=SXKk-}T+T7iU*IG1T-gu4bQpO4@J_pIA=+b9bjp z`sRVx!o$3N2?gF0k<iH5{L0DaXuyFj4sO|xUhSGt`@!wq=?6)3e&0*_SrN8s<12}4 zTt7L_WH8=c{#9l>GvAtU!KD_L=Y(#U9(&X%Z!_EEvaN^u1Y$m`^{RZ}TUWABI((&_ zS?fJBtxvCBs8t8{Ut6@!PFM7TS@n|g;zNfSIoY2rO!j+bs4q~u%JsO}T2(WJwKuPC zHu8G3ZS8fvpTC4S-YLF)#qn-l&)$~TLB)GE%f?(@v_nzglw3zssK`o<RVtx7H+sHm zx_0j6{|Kfa&j)I6EPfr(zLa@q&FiP4H`AClJ>*o~(-QOT%DddK-4}9-Sa*vZ)_TXW zq$x`%WZ7!YD<2Ez?6xcXz2qH-%&MLhx3_qP-mS5G^Nr=gzp58AR_JYbTq-VG`|sG4 zIPH^*PNyYC9V^*ulzwBMYUGMZ|5ERoJ*~elp*_oc+Pf>c=Y%Uy8|8%mXX6&u4}1M> zk71_QeviOq=knx}y3>On&6uLkTPLHE`un-W@>+r4J3q1hkCZtq!+!Z@yTqwKo$Kxw zd^n}NV*heue#1F+Ez0~mWR6XL7yRXsw)pDi^Qp&nG{^P*wy5(x&B)I!71Uro*|61m zvX0Y_w$B3d7WS@Zo$uWDe~G`!U*opABH5G)e%E)rVN$nYm%qX6d3l=SHFn9T5|36a zF`pnUli8}d+hDitbT)g|<AqJH<sJl{bNjG|-{NFUidmqzL3GW9rVP_mnOp_8S{KV| z#^q9y^OwAJ-E(C55xaNkcQiN3-_LhkXS(#xOXbhId6(Cwy}zWjIBU)I4_4<qCh*Rg zA9cJnCr#G)<Ow#t+y|e8_x$Bv*Lop}d-qDQsOFt+cfLz)m3aE5w&sER8RL0h<ZelA zJkT+dS0_jOM5b3t#_5~29<v)=_scw<GWpBPd<T8?)1KOqw;L{ZRj%gTygzV`)myo1 zu|ZQGg%}6lv={g#$b3_s!*~5-<<6QbuKTO`y?)3Y`YwIy8T+aG5<vnp1$>#}ALmcK zc>Tn`l?SRde)>y>%QfE8nD2F4v*^Xq^dEPgU($K=@S4jz7LMJ__div3EOzpW{S+-_ zy<u{4$L6?S-x9_B^A6}IOWfa?EOOtQ?>`f$gq|xqvDKTEfq|Wegth~;ghnfwTZ2yL zU3L($H7`t>w9Id|T|-Ow%0?9%rO-9ARtSZxN;!GKRmp7490T7NOS7V!AG&26DgxPd zT!k{x7i<K$&+jd-Ikz)C?cMqK`2EZkeao9}eOdAO)e8CD6OD4qGkot?Te)l~eOXgr zHScl1_4C8trd=gZSX~!&UJ4Y*N!yaXdE#TsrlMcxYXsY@)^UFFxpbFjMY8jPbYGUQ zSI=>pmnI0z6ut7{s=HWvqJgN4$^BcW@9on4o&R~=g6q;U>zn-k9e=~ic31e)>dgJ0 zxubtR&Pd|ooBeIo?R8tPT#I-TxMC;A$^`lA<`WL{Iv(s%d*`!Zw_l`!oxS&kf5!vY zlpZU;CKGV{F4wj|?^|*lTefKH-;dc>bD8In$H%ihX|KC9Urqb<?ne0{ix3eD-g|~2 zx!1$jKYkg|%AEe9aCsWLOpCeS3$@a1ksE8`TbIu>o~^k}_j|L2%t~YPpW!dmn}bE9 zE+4r0$Rlf(N?fFE%GASrUN?@)ZFXPNFIn7kwCu5QUfnF^S)RT&22S0t>$)6dc@yT{ zJ@nSTs`|_imYMfX`<%}(-{<(du{yrMzCHEsNzqv5_L=K8E~swb=WCNN&wY0G+>I`E zm36zg%p_Nz*><ABCjCXlq!WMGKuM%{+q}Rlj0_Cj%=nUs9%>~Xl%JE6nV0UKn(v#M znCFyOoSE#CpPrc<l3HA%f|hX3Mx-Z1UlskgZcXB8{lm(f=M?y6B%E$w&-B(czwP(t zRAGn9Erz4DVe{rrKQU=h<Kz;@=obriPZ8UdZj~{cWs=0DNqJGbzTc~U@92K%{k`v7 z<|niMdmz8-^_=%}e%~!VxBEK(+@1d!8M2QQHGW%pZ{5Uu1=r3<<XQ`DoFO^?PLhfn zkL|ud|JfG<k}mbQ^^`0-%dWVgV13=<d!m;gPmW#uxVksvSi2OXzM<2z9sF{P{f9mu zRKF0xa`x%Ml__W1tr|r)&zjO!vqC&0tn7?S_zjPlRcCCL^dIMuf5v%cv*~&d_pdYb z9&FFqp6ju+CPE|NaGyhM;<P?<&K;@#4x67lx7i(RJ^CfQlw13@&~Dy!TMArDxg)HF zIIY}I-Psg=VS;kjnk8+oxXx@3SJFIuBXLRX4vz!r{5t(_eSZ{ihUet5ObZiID^C!- z?&n$Uz;(VdWXZls;dv<~1qL<(nbNbRUW*AFW-6Vy)|%~5w7c_cOF5wxQ+1B=$-YrM zzfg&*S>&ypxp8pSrnS>+xB7eM)vcJprn!PcH#(%aD6lYU+lps9UgUbG7_<5NbBlIN z`208R&Y3l$5f|e2T-X@=;E<C|-sxjWw}sQ@a4@qkax+R+dt?`|dfDFO<!yCqz9-9? zWxR0Sz^9k<>2NRarByD|pWn%|7Mb#?`9=`G{x&Y1po!O}o;qgyY|2H^b1x)~PdTgB zN1f`Bthyy(@+i>R+2dA)k(-3lOk1^nD}hyJyLX(u^)KVhy%&>$CM*8EaByyw&RLDy z2Q?%l@7DNcG{|jlNt?)>)$w4KRm;ZBV&Rj%c`6%Q8BR2lU|oINne~#{(Jv)d5hjA? zmb^&bkQ{MXFXpxSp;9Tm<D!!`F4xp+Hz`>d-8Wy)f5~DUzgb)n6Kz)>*)nxU;3_|_ z*WKM~qg7Qbbk<7Fm~c&Prt8BKZ6_FRe|xC7Gbw3(%+2SGU&9wKWZ!$KktNVPmt!)A z`jv+Z7xrbFzH#?jwLFz0=i_3@$RH0jwq&c`*au5IUEL0t@Od0<X5ziPYi8tT-HC?k zXIAJjXNw(8T>68@CRod^`{^c!{;6_O*B%sJ`a1hh#?*N`Qq!hzM6F!(@MA@j$eyG9 zs$KzUo}CM(nn|rYB)s%N_umLD*2vh@j~UXB<z{jx=l+zD&o=%hyrR}4&F^fZnONh| zm6I0SS-1R4#F+_8SL}Te(|ol3jB(tfHAg#QQqwaE!g6`nA6or7u>1DQ=6R=5s~PW{ zp3&E@#%gt|dnfla9<L1EQ_P`WUl#1X)4X$v>7CZ=-tG4kWV_tDz2@`k@m+8*n>o*n zXV=xJLp;u^AyIEr)ovduc^;(hBs0ZikL>#iaeF2=<{z6J`K+s2Y3dB2f>ep;rMrbM z7v64O?PXJNC!KHG6N!pf|7>__qn|&yU3nmLhxGgDcJ&Q@ukLPo71(DOb+Tjn)Y!Kx zHQzhjxG~=}Vta{O^n#vXclDy`jIxFYc~x^}+Obb*6SmO&JAdJM&E#^ktdO@Ml?-N6 zUWdO7tkkLFke?=Jd*FQXof*pxy>L0v;h*;HM3i;Nw03SU*Njh(9_gpN;}ew8I(?x3 z;p49#9t-p2hHbjlV>hq&rKIz*ZxjA{N}f5kc+-WiQ=Zqw`t8zaNZWmi^|{0450W+^ z{Jis*s;_C{6@BExW-B`_^>x>#rW8-N%*z3rVxL_JF;m`ew#WG0bj9T&FQ1->iJK?B zp-um>_NC|RpRGP8VY#K+Wc${r;$rb-`447ay0m@A%qbJk9W&}`vy{=X)}OyLQk4IB z^O}d%KlXij$L{m*?w;3M&ef{Sdm*R1%ir~7%(5BJ<5Yc*o7-g_pZUuE@cE_N_b2em zOb^#z>9PJbH*?gk3_Wk5m)C#vy8P0e`ndDT6uHd{w=4>r-DV$=RKMiljCr$6irBcB zx&9s%`lYR`G4uboZ`-Cnbu8bIq$Iw4VvbSTmr1vM>X$5E|H(_}W$BEV=)?u~LN7Vj ztu;9OGR|+hRPd&2O#7!E)!sAzUw7zAms`8K|Lx}Ee{3J4ZT#Ty|CBEE$%b*8XH{-r z`62Xh<fJy^ruFAd`O4RwnrW1!;?OJ4&uzZ{eP@b)>dcpXt3>T`{)9QohTOj!`u4hI z<Mfp9`uZai?^~L9E=<yY5V3CVl&9Qo8FeKb`x<A<s8oD@cy#@$?QH+wv|p=vZ5COP zrK@}B#9oKbm!_Y|I?%TD>7ChELQCc1y)M=&R~ab@2OevcG~brG{8;Z4+shJO9~8=7 z)jTTB@xRu3_T-LvCzsv0-u9?ad8wS{tEV!4DZzos7p4@=+hF5j#~M>}yz)oL>Zj_y zhikU!emZ(+dXx9QkQ-b-69V2&&5An_y(6pgWSH*z3pvtHZ%=qzbneSzPk}`<7fW|M zPTIZbv*VTdhjzuPZ~R!Y;IoApyI+!mLGwb%9BVCkwWNuES}z<)D*NM=t-3c-b=rpQ zH=GV?Y+GG^hAXvq_o1s1`M0BdOMjaGmza0yMOMu#&X{`sya^AS600=z4W)N%HjG~0 zU0ifcc!&6}yG6H;E;_X(jq}Db=^Ymfy(7;k$J(8{>(tzsyyGFuw>9bIsb@Kln61k? zcI9pP!g&WyDj#?mS}N0fW0LmWDJSoA?hDSi=c<<X<}*u_&GCs_uJ4VpyYgsaRc&1L zI=8cx{>AUUB<h?{Ec|w}{rtU_%O#up-=BNE@wQsAb?|?kc&{&4+V7@6_;m1T+5D$J zBaPEfX7<k7+|K>Bwbx4~>ttwsSfKv%^o7r+*_etyvMdgGthe}C8hh3q%d99>)AL(b z?zD98z1=9aUD@>AaRJlwhd)1Ga4gvE>{`An6-8HcCSKWdVA->4GNy9uSvGxFD&(B6 z>=DqP)hv}SX}aAq;PKhO%^^Xbg=WvXU38^FcEv}lpvSdm0+c@l?Kz_tQd_3@m2H}A zd)<|dL6NSPX6sLi+cQTsM(0jL_=BmU7ITd&&Q8=Se0LyQ^xW%$<-NuSlC)2+)xS`A zljq(Go-0|MPa10~gzv4nR$IYct>?5)G=H<=_RrBz(xRnb#OzCAdtY>nC&H-mOq9&D zb1U!d-Wfan)!z2KQj7MBzu$aueLCm#|E!-cKRg|M$N0wr<IZfIl{WkA``;fIe7X6R z>`}w5=JxL%u9`jV-O<9^m*gH*K21DTyJbhTjq#52H?Ku`>*af&zJ2La^~E)NSIpb; zKFl`rs`Kjak3*jRTXI!$PT8~fF~3jW{PH|Es(RY*-yC*Pl3m6>Qno67(X<wkKeAlg zDMQlvMe)_P2~0tI&p+nYYT4JJZ|VB|`Z@Dm`|Z3->VHpk|6cwfR{eTi#M*58L;X{; z?GO6TEvSpkRkX-?{70)kTI)_t+6U|O8Ixx7PpyBy;?MF|Q~tkM@n^f%l$-yp|2b-| ztl3&?<a_+X{d2!tydM~St#+z7WtppMwRD+{xbLCUm$XCHPqUrA!{OD#`Cr!g{m3=W zo|&#C?6)vEe8J}>GvfQ=YV>u_Ewettq@?K+*w3~xz{KK?sk!yxsdr6XA1@Bft9o+E zbW!X6>z}HxJFIlmzdt=kyl_j)Th^TEn_`cZvEJrhdHYnE=yCDQxt~vU|ICUxwXJzC z!}VC1@}k(}>Y3pkOS`_XCe2KF`ybShU2V?rJB5pZAw(8mLsp*wJPQCD+edB4Iw$7j z6o=#oBo-y+<fP_cv}7YWYhpsL+N*C?)$cc%DdH8rELG#=lCxVDN_%?V-oiQ8Ak)i8 z<Z{^M=_kF7O3cz0c6Y7V(xsvGfJy67l;f3cTQWT+KI(e3Zin`-+Pe9-x4)k)|F!;o z_2!gkOFg&R*MIr$eLwbG+5hi%iqG%-{KtFpd4Y>k|5$^Q*Brfn`O^H}l#={-C8^#c z?)g`QZFh;?U*)>^WkAyMX->}lRk25Wwr<ZX&-k}OO#bV4zProXjrBGeS}LkYNES_O zKB>sM>%`F~dXsuzI_OB228v#Olv&#L#Y82{`0UgwCC>W&^SUxFo=D8qShf3w(X!J% z=bn{BbZ7Z=Exf&3b!t(d?qpuxWv>ot@T^bY)GanStB<`jmqj@IK-^88GjBY2UeB1> zFL_hv#4B%=ggZ(ngw`^(zi51{Rd7NrxYttH>t)sad1V)k)TZAw)G-r(xG38oIqC40 z1u_O3nV5I51<aCNrYe3<J0YG=C+yPgt5@$!e&RdE7H(K*9vqrc9iRUH+r0;7UzmNS zGA(=Y&{>zkDxxJ(+9RCT)yPoy<zBwrodM13)FOJC6{d7d^EqW`sOhLXb4v1zk{02c z7H>+bgm3or<%Tq~x){8_Bhl$@^wy_Xs!Ls}oN+=^^1Bmmi>-wxTBwxB@w`6iqas*- zQEi8t^JBfKc?)#8a+mQ<y_JzH8hXL3_01K<EnF{?4omwSzQyvlcgx;cb3_7GP7UMy zHG78M^mEVs58m?d`Tjk9i;qfA?YqX4nzpO5GxvJ;x0g<>YTYKgML2G<WOu^%*-e}6 z3L^@i9xJ#K^LfuotL9q|op*1^keXM{ZL@fJ`EA{UeiHWf7QC^uy|!P{UX>xv8#3v} z;XvEV)<%=AG5+|}mcY1wZJ_SlJZ-5L=a(d;L?>_es(v|@OJ$GO(y3Q;4%|>rWVNVc zp0nY`oMS@QSL&bO>Rl?t-gDT7>002zzg<ah-6Aqyi`_b=p|s^L+xZv#xtyhsZeNfU zFb?eMoVla9r`~L8Sa7!iLtOIhT}$O1B0S&nu}GD#p0aRF!hYw9!)2|{E;%}IsO(yF zOXKp?usI1W#xl#oxsP2pxGH-=X{M>Q(99DaDr-39XSZ#PHoE7zUbv@Ru|@2Gp<j<z zcE(zRzr9?QEvjXO5z7Rmmb))4-4Z9TFLGh!qyU*Ynk~mXgEE<8^*Qb@yTIhw(V@-M zRW6WyWTV8FXZ?Q{gzuMal45!!aFee}P<)+-@5fVftd(p`Mc!sde^g8Ee;!$UP<i^S z_N}>5c~kGXzF)V@tBOD8LeS3Uc!75<{>Q5)?^q|*wK044rI}3Gvu^~PWZ@2*8f757 z*-L(bdyAvI2wUr6*NYcK&K*kLbn**hY<uK9%@YSgn}YKh3Mcs{%_v?gsvzd0RXeAT zQ`?U5c>j^fk#j_UduRzJuR5Vp(9|x>{%9Gi^s<PAo#*D<(7fFc8~!ON;kKIgZ9S(s zUh@||KJ-l3AShb(klc$0i=TE_2tIi_>(ytrFR!<!mmbmOz4uJ};FU`qcch+0bsWeF zi&m~>4Aio9oqXuu<_(rh`O^>oTGOjldSF-3zsRVNSKZHFL?&K*UXXn3D|5mNS<Y7< zFP@pvv9)nhu|>KTXGmOZP2{srUE3T^a{dvj-8oC7if>)7N7&4ZZJPph7jxg|n-T66 zZYC$zm{<Dp=K52C;+7XmUdG<$xfJrts&?_LkY8##jv{Ncm5(Q0xb#;k$8<W2O0yBq z++9n)x+iVSal2!7LOEYtPhB!G^}J75+?0f=aSPsa&#s@)Z`FL@LXP9zZ#P%Xwlw%V zqfW`>uSmD&%a=JO%84@$9+>pENOI2RLl2WwR)69CwRFR~^#woLC%&mjyC>vc;luxa zdYsi{tvSWZm$W^Ut>5<0;?@3z_qnp`+a)ZPELBcC$gz4gw`@j~*<>}vm+xQ7w=Ah= zDYlu|l^Ga3CF;uORbTYkZtizV4Ds%LW!c)w*YWSL!Y}`d0HgZv+f1g+X%5XzWwx~E zO`ROLm-R-PSzFllY0Fg>igh3SX2dG(yzpx7+te(BJ53K)o>EzB*tmOB1>4V;{}r`- z7n&7a{J(yY{RQtC+JOzH0%bm?7*%mJ%I@@?xmGKD!`fLh-}+?h6s`L-Q7EH@VYyR% z!i!C+lUAQTd}fuIWwVy6Ayd}$J>}EQ-fR@Ids>ovM`F{FayCB)jf<Zn+p@LO0?&Mq zX_b;J&ELz)y5VePfQqc}zonCAm$YhC=v_WENy+WYuT38Xtm4EMo5acNVQ9VKv~N?_ zb3?DxuMS?`Y>y;$oUK(hZLw|SX7lw_S60`5;>y*cb8Om$ZjYmqr6smp0=836KAjNV zyJ|z(tGnG#KL^FBi4~jb7;N!8xZ$5vV5}IwXYu;AkDlI1ShBk@>YL%+jw2OiM`v8O zexb{F`SsODoj*Lx-o>u{#Pv;c%bf6Yg+-frMLCs=M9fr#_A76U7fIf@FmbK>`3&VK zi^(3cMTRx&-MZ7dj?L&3`@Q8PSJTELAIfy?WUgMmm!P!Ke)blPOUsgZWW8QZ^9wnr z5Oz=hRo2w?k4?F@e~8k_l0CQ8X7arV3xN;ICLaox_O@|3aqGeRbN8=WMs?geaD8{9 zSN6gQSKV8ZC7z~vNFQC7tD_a~o&J<<Tlh!b9<P1t5={2^$zKiDyVq39%lqbyNczq# zGeRr1^H)FOJC+k%x%Re2Z;+&VUdV!C>)_q4awf9#L(eRFzB9V<|J|0|h5iSQ+D<?7 zJ1XRz>7IObvsY>6HS51l;@t1|bb{g^F^>CBj}`7NIdpx6O#;V#-iOt9Qg*i-y1wd< zmh%sVmiNVz{|a%%FE6?wV8`=t*KC>T0Y9py9_M)|$g%&d?>TRcn&wl6&J{9;g!76x zAKrWPVAsV*za}wGms`N@dcgPkrryj>*BN?Uoo;jPuKgri<6s~==kX)wPdhWpb@%@| zG}Y;5aKt}5&6o?13ie&|om%tUXW5n~a*ABj-7BAj{M4)4yWunMhR?lAXSREWoOYj) zw@c!%_mwE!N4|Nh9+`KiKhCk4^pRcoSoNgt`-iT)mG@TIuq-)BYw_|wohirUy;Tln z-dTM!B+CDH^29`+BYy%W`?da+e6#g_K+uMZ724~cY@fDg>&$L0iJ3=gx$d9NpYA&8 zz@*H#Iz{Imgv@pgI`sa@@78MD29_}U87<#m9M-7OKU7_Oe!uCl!(k5@D;y_IxWimI z@7JtMQweqj_vKG|g!H(+SIVzj669mGY2u3wJ3{Rid{BN=IKy`8pA`qxW?p$5an6fd z=JemABF(Y?4C+}X{aEbNEv2(({frNfn?6YNeCkmNns;W#yPN6zWZ!;%@T*<1|DZMZ z<e$s?Yp4G44BVy8GgGU+tDhrse%ntkReAl5x0IMQ%%3e0_@FX5I?(F(ud3fswsY00 zHas@@r01_P@7#-98`KS(CK{jMvPs;yaGuYh&HCakQnO~ymj3QJdFu{$Vab_}|3wsf zPqlMRJ%1^{^y<gUC**CbLi%5R^x1WDv*~QFg-=g*9-0-nw@-D^;dvfXLh}Uu&pSW5 zW7nN(7XImZpv?<*V@+PS>F+15&<WDq_?gu_W9Fyb(;QzsTCc$WmG5=tXLgOdC+-Fa ztlNI#T#<e7%foClL)i|LgucAIN8xT*z{5xDjYD}CUhqF$mlDDMhgHatd!unm>-{JB zntyoznXT)8uW-9-nx6C1_aCp{S@MB<2h+Aw>aR}!GLEXK@1Mrg`6vEL^TZwdl%=IF z1wZSEZkg~xkJspeIs58g%8LtiC;Kj3%l4?yRyA1Xr*@P*Q$oc1E{<Kd`ef3M8C`lL z&fI9ab{W^E$<1>@Jh@iAl3KOs=cD7?OJ0aRa_647s{20QlkZlR=N>u6)m^_>_4BU7 zb?;wcp6|u>%RJmIVr(8@eQB-y0`sn)Ts6~8ZQZY?XMR2)d8_K&^^#duwdpHPn>*gM zyPe79cj2u15q_~h&L8bJp0amZ+~#ujL2Ksq3qr3R$uBN%RqXq<BL3g8jXtZ6p3-!Q z_E~ybRsM(nrM&Xi>hl)7cAmF5BkMVK`d#4OS^8+g44b+n%U2)fE_$ebWLKBx(yXfr z2BFtG7hOzvcDi9Pce49}3+0ox6yDk|d3JTq<0&s9tfo)mxAVCwFvrfXBrj96%2w@Z zXxRmsijJuBm+mk+6s@@WaQ1r(-^}8BoiDGSE9cl3w%jspa`L%i3G4EnXHQfTzkEG@ z?!N2ugfwm53vmtk47(<;dTCR6<X5c8FQL#KD-Pw^_w$;%onsE3En~cU>ob>j6?Mzd zz}h$`{bS1;pLxj5QvK2<xnSdThvMz5Cf{UC<QUHi3eVbIeBp-ff{oEm$@P+s#Z&H? zFq`xVWxU(iaBO08+PsEmx@sohpDZYhaCp3-<=97~re|?guX!$5crVy_o=Ga5Zx$=l ztnITe+?n2dER(VKvXIpC(`-`9$}d=-b-0@47P375VWyN_qU6dRg_md8J=O2_OPt*r z?XogRZFy$Xz3Q52MRJSUm(KZq@wcz#T#ju@cXrkIYOB2n%yyJ(R?$D<D!+*TbftJL z%UZ6EKN_`XM0N^KpDcUdEB^ALqrzWiZ1tJ%IC*-cXFvDjl-H9Z@>+9j8>jJJvUi<t zw)DL#hxq;p+6EO*YksrL-NIJb>o|4#`X^7dzbx4hxy|ol=1#NLV}{x7%ZyDDv!t4B zmf!H%*!T0>&pytoTT$V=9j9Mk`mA*2&#fztMWuMZ*nWE2g;x#N&R;Tq`dT<j{l({N zKVma#E$4d0E#H{7ai9JL@zb$|P5X?Z#ec1O*>(Q%^;0n!iZL&uH<v1EdTiV0dw-(d zm)KwPrk4NzkhJ%=`{j!7=l_+w|7W>3BlTAN`D<I^FW&dK{BK%auIlsen|WFKXBYj` zo3ATsG@tXAdbVM(k-WkG&8naGpY8j3Uw7vJY_T&L|IPpMuVDGSV5f0+?GE;)Z?z|s z{4f1nw*1DyEl&UJ&rM}55$!y(^@o|r+nbMUjJkJriLT5s4BxzBPMuQ4%lgFCUB6ER z-0BNfKYuhbOXh>=+=sg^{rxQZFs^2sT+&A-&D0{^sIQhHS|To*1)ntM=g-l%Kgpfr zul;yW${gEmh2NgBz4g~-HmlD6*>ZY@#0KjscA0bc7?+=JdZA)|?V4Ya^hM8mHIsH9 zvott&Fuk(fbY=Ra-|3#aN+!h{@~&LmQu0}4e^J?z(vs^c{Jzf7uXPmDW<9z1vLoB8 zBX|GYCof8lyj49?=CSXu(-GF?xs9uZ)*iU;wM&LI*m%!wdB#_MQv&-Jwp1~G{ARQE zspytI_6%G3rM#@{&x0-5#qICS*jL7M(fP=avPi|BvyNF7Ysc)pygg%5JiB}Lq3?2w zHrKp&u-(6Q+hd;n$#djw+^$-y96nY2so1INsaE77$&=iZ`c;DXrkhk-YS}w+x^61l z&8WUscIR0&ivo5pZS$V{ZC3fw7bj+(w=Uf+sPEc+UsaFi^4{Q(<L{q+j}Qr)yL9=| z)2lW-`u@-I4FBJkXYxL3WE*{-adE4g%k<X%NvG?2-fUC<q+zwf>26GnU!IoL57Ww? ztRIP$-aC(4uhRS#ejqUC%|+L3?kiW#yI<ck>)a=0=JX%UU;ivD{C7jiy=0Dk;Q4;> zt@9nK=h$yn_OD=K{?Hlx)kg1x%0-r_Lvc4}im>>9Om|gq`95cc^z-v4&xv1%%=EB{ zdn0kRpnJX8)qAr)Y?qw3TXlZn+J&=!cK=betTx$yX7QiY%c6asiVulqiPp_4{$9Oz zr=Z?_mHPQFcBE|l?Emq9UPZL5K#BFtXOF5at3H3&D|Darhu)EL!+qWg2b$jpeOZ6( z`fCx@|3$mR?z?TNnX%qsKj&wyecE%**iUAx;rlOh|M$vS*PYXae}CM5D(AcC)_mQp z_qtixu5TwU`u1;8nbG}opAzeQ_tl!qyZ+w2#35VW<W1`q!2&hMQuF;92|tuUBQJbM z<_C)iGBA|u;Tw5T#W(Wem+zZcfHB?@QC<^#9XxaB-Jdu+m6=hf^@h<w<t?7N({tIa zH~CI*@^*5XcXYGhiAfhZ7I*VmUAn85JNccc)g>_x2K6lqt#iQ>hi0)8z!QfPJ^wlG zm){4UIh^i(&hCdmLuk^%1Cu_k`*v_$f!Q>}KhcvuR_GX(t(_=i^5sZCQNa8U)e0<W z@2}-wzWul=X-#cK%67rC6#>c*mSt&}J!<qmur$Hu1BZ!-V$sg}8l`uRa}PYy)OGDK z5v*k@o-#LLlWoqDq$-=T0QpX7xibPY5;NENxPRTD_rNsw_w}Vga%aR=B)T66pRx3D zFO%O*;R|biPFUDqlqmN%^zNZk0Y%FXPE}jCB9AfK+sN~|n4tGJE~z4yUezlBv5hmY zd8wpIME7iApUzdW#!*wZ&UT{D4{O^UckXnWzCS2>WrKyXblG#q1zw+Cye){2-(mjf zzTv*b&JH{rS6t0<U-ITl@#Q|*5x*cTNYK9Gfz~8Rtw)+37yBkgq|JG-`bPL{!>4I& zUEj4>MYB`8v;6e59-R`qDkFaPUy51shmI`)iTjK8sZZ-j4dXtOr5TrTSF6BN@kQIF zk3XKJ=s33A`x}_7B<!tbQ=!$rcWLSBHic^y8>O;MZCLM?79{Ky_ggbHOm&yd8L`s~ z7fgBYI-fr;M%y5~HMm-9_K73MdcPI8oj<b3#`4qBr9C?qF7LHd7Bn@9QP1U3IAU?) zP1i@8>8-0$_{zg?3-?C<o*kd1xkTP(LumhUNyqD-&#<?f-xGMXbg}P3%_mJ#hdQn# za_6mZ6~8HGY;<_>;>_mu{d-hH9%MPk_%CmE6@KW`wT?BK-NZ)r_8ylVfrq(bG&^st z(|B`zgV5WeJ<f72*^w0{VjGlp2c4`<3+f9f^@*Avo^w}+{~%*#t~yU<?i5L(zBS!n zHswmbn6ABBV6yh^Sc7^~DXR;bvK|7Zhj$rtZg7@;@jid)XW<*#SA#!2`MqZbbJasd z;o8DlpM=J_YNC}NwkOUHxuYMj-@iXKj91lo<Hd-O=^ss6A2kHobfkM6P2VIU_QG(p z)8Wtv)!6zzaqp$-elrDBo6_1cDum|gu*N?)TBE8ld9lldGh)2qkEJw!2<gvSs-V4m z&60nzca(z@+U@7xvi@@{j%n+c(=97+zE6L5-h1kiM`^Z8k3VKR?OE)7aVJ|h|IBoo z`*GcZJI{EXc`)UcR9x@%9|7IhFR|NB_5Q@PW47U3iFpDUxth=PB8)T^nriTeXkKjY zE8<_JnZ1L%+`Ijr258DqYaXkf1k=1XE>-grFRWdvdd48cY3bCMv`wl$<?A*mA93?M zZ2iIS<<Z>|KQ<n536uMop=GJ};DpM|gVvLO3r%CcKBXdI_j#F|lZGFz?5&jewe8rs z?c5EQKh)jPuKmX__lkAO#>FzpTP6vbbMLwpoP4iw!$$M$4S6qnwmC>H-{$w^o569m zrrj^Mr2n!Bkn(%5<ja4NT0cqa&4J0c{HC%e)b9LeVyo4E^zx4lUtTEx(NgQF4Uv%J zmF(PjMlUk^_vudsVJkU&<HG(Vo{3%2^fy)Vhhfbfc73~p7t&N$pM9ZxbH_Zxl$`I; z^QY{~QPSd$O|N`+{ppf!ri@kDQ5(2swVi*k*)F4^W!?s^YvCQnl3z+9rmdZt%6f82 z&!uGxQ*I|eetfg%&#e!3JHp%M1TC4~e09$rg#_OCW8q8A$Da+Ctz*w#D|a?`*1Daq zT3<^4ShnShZk}4|lFc7`7A@>*PJRB=&~*9H!>tP0Kjil5@BPg<xn6y}h4*UtPVHT% zJKhBbMx7P;d}r;Fmp^`~zp)7ZoBm_xmv7>08kMW8#HMzAxfL#P;nLEpI-X17ADauk z+#cem68yO8PSd3>w>sW>gQNdEnhR}B)1L5%v5EZZ*8CFgcERP}?b}y_rm@Q&?COk} z<F-k-aB=sYv?`^!cc+F=@|b@1$tx~q+le0O1*NT$e&vO`uFRNZD*j`wPTa%4U*gwz zsa|>(`{jOVg~<PhQ8O9&|EUMpBq`N3w9YM`%@uDt=cuLpzw=y;p=OXtLk<O*I2)}W z9BV!OO2Vei>{}4^(Dr7w*cH34cVn*=O_r_jEc^P!CFkebMV?%u)#0}}!)mowg!g=? z+!&MbXVEQ(5BCm6KlthJWAnWT<FnGK52s#@S&~)j$aQJDf2X$dE`{fJ7OY!s{KKQ` z-NJ(%K5mlI8(R#g$jTcAUGs6)IC=QSs?VI~H=0I@_w}lN@i9BP@7jD13C*to6ZMnx zEoS<<_U@Z8rMUH}<D$ve<JDtomR|j|d0C>`ZMC0S53>&{#%t%a)|jl==6#mCQaD^! z|JJIfwzG1ZYs5Ci9+|07rQo9MzFpw>!Lq{Jhd<0c_9}PzhIc*--m;jn_$4MM2+dYA ztnjh(J0kN_+-By^Hx*N_G3=ET`g~({`l1Am!>@EVM?^kew?Q&nC;IeCy?W#R<m~3f z4>Q#ZFW2sfY~pTxxoppoHP6rGZ7jK^cx8=tfqmZI@Vwm-Av3S}FrF^4HD5LRR1(|E zPX+G`c-i_MKbtHOefr&`S(9&UuDdC7<oyn5J0|shru1o73r#XS^$LU3YQ=Z?C!aGj zn)tSibyke}ge}+Z#@JnWGO6lrUiLb-vpdfhygMU!=9FULw@CMMvWFyh-R#Z1(YM0& zS=x_+zV)hAuN=SV$jDjDIamDbW#Ka!%e8^U*9x|6-4NI5tZP~GT;yv}9ak3L^OZYU z&aZRo-P|+F+3bo%@fDq^S8T2?dKS<pwVc<~FFI?ExFBf4aCN|At;Nqa@S3iZG5xG+ zs=sB$NyVM9W><FPtSpRmxw3~tf1OkB?w(n<b5|5TUy(WO%APBWo_&)s&6Cc$v+c?b zeW@&#xVGuht*dTpEqQm~knoPLGjf+2buY1wSGil!s#CD}`opOep{#zlRo+=x`OdNa zXw~|;YR|z#FH<*8eR@qeBigXj{3f%msp}^PxjmBkfv@HEOtocKyx+Dxdcy3Vx<#AT z@@~<Mvgs_poy_Jl(<V*#-NbV%?+NBzUs&}%aedp1_eX#0e0i($@KgPvJtaR*sXbS* z%kY1s6|B|&{_NxGkBYGQLjAtttDfH9AJ(0|r1xkiXui<Ia(2w*8C$k*y*1_Z?Mt7w zZTS;tQmns9{jGJVe^lwkSIiX~is~=DQjy#A{Cy2*zVKP@tm<jMt(*J9+8(LcS>6@+ zHAS>*{;|WNid!Zqe%bjFWxnvH>-Xz=CcF0Axt7%b{s^8gw7y<v5qrI^MPB=QUDNzq z5C0VHYJDKb{XG2V?VyLxj63h&JUr!2&5A$O(NFDt{ePa{cB+1Mo6+z3<MtY=Q`c|z zTlUf7-|cS=0!-Rh?oU1xdG2MY>+&lzo-YdA(X#WNhRqwxBQ-1A>o4t&3QV6FdEO>? zW`We{?OR#>Iwe_4KIch2+W%;GW}(|%%`_q3hg|xvj_MfReztGt!aENYcmH0tqF(6~ zZ-4wwH=PIfrGK7Xy*#9O_Isag#g?<qmoeT>+s1uUFRhxh6f}SMF*WD!l=yWoGSn1x zGoIc!Xm+5qH+Ob)hnnjjor^k0<(NTDS1!-R>G50)4ElH{4b|{BT|*KxG3N>+%4?vj z-n{h>mw9Y(KENoLBl#gCW93t}NeRNci)55kb0Z!`R+h=xcz3ZWzVu?3E!loSY?pY+ z1u-U1o=i`3-MiKA_m+E$KivJ@_HFu;1NJYzcfYrKZvDLO`<&13&NB1gt(I@tnzYp6 z`kRFNM-uiVJnQ{%ZA<FRl{340zqBk|Znj)_S7s}-0F(FnYwNH6*0D9cY;IY)b>bQJ z3n~wm=bf3ubwK?=umvLv%PlR1oi=8(H!@`iMwqT&*)mZ%$s=LrrsQS6AGuw-qFcP* zE>)6IM=0V+#=P0yucqk<Y{_lEp1zq;M>HeJT_I%N(#LO^;%*9GnDcYSLjU4K%fF#_ zKb?B^MXy;~HYV_{(Y0$Ov(C+R(z&UfeL~RGZ*kizE}gP4p~%BGvYs$m#40@CS(VB8 zdS!{0&#rS@${(F!FAy`8ImhBxWGkR_b+dc9y1V;h<<1Z1ZqEJ7loYc-bz|mhkDALV zZ<P9uv&>QzzxJ;-`()ahrWG2lzn7o+vt}OW{Nwv>_3Cc72-_K{xgukABxt!CsGI$4 z#|!@D+?CDgOOBqBp7!~0+Nm?^g(EJ-?!2%$_Q92+E4g|R*QRZmsdVT>si*Q}^UEt4 z<{c`2|L*2G#V+oqh<0vM8%bx~4++i!aWNWey-F%)-R*M@)U<E9DDY>;44KsxuTF~v zRTf`+(f$1Eo|#WBPSn@Uj%b@_?A9A{>B5JQ%w!ouHmADnCz)++uW6L;*!%3^lBYQZ zu3J~m*jInQ?CvSUHob={{e9xL=$bkCTPJ-!;c9whV#dL+oa|!?FXtJ4ntb`PW%Kg= z%dErHvKKFXUUadmv%=2%{vzAQQuF#`9hG8MJ<OS-Jabn}p~bR?F<(x8^s5xIHT`%o z?wHq`bIZQp%CvO7Dw$bZxwLe*gUj)yTVoBDY|VV;VYAWB@X)sE8lQD<+BC!0eLMKi zH1oyrh7twWE4{BDs~qAjt;t!_elC53`>OP(7yH>Z@_bQpP;=9*b$gIv?yL3b$@-&l zD=X$YypFqjX8qkc=Vo6{3!2Vo+W%-r(4Bs8<5gnX%Z-<v4hwGx+x2gb!mcIiaWe%& zo65Q}EcpGWH0g6BwF*tS8K|1Eyt_^PVU6aGNeWg=6|$GFS^9A99p&PL^c_=fTOU3q z$5h&XvL|zw-kB%y^VV`5)2#~IuG7rAbo1^<F^i{y*1J7iceEqsZAw~6TrThWW7$p_ z$Fg5G&(lq-l)Q6(hM#X5OVuvzo!w!)t1@~a>)rNWYj!&&m3K_{(n52u_DLtZCOvQ9 zZgW^L;pAIWo?TZ%kMcOHhQ*#vRkJ=+@?6K<DQ1ev9_IH`;`Vem<}Wj1t$cF%=9e`M z>hsgs-g~|GwUnC^|FrS7UH692;|GHIrzO0&&6>AwF2kI*?~lt~erA8M<evU&*{2eV zzxMoyym)oqEpNUfy|%2)rQYdVT(c}nOBd~EPt_B+bGE_yazDe;hXQ=w|NAdIU$b%b z1QW40A-N3OuD#N~u=rMlO&7m+zulqpNvCdjx1M}CW8$on@271oTcgH5J*4}>6UnLZ z#~w}9vI?8rD1Z34Gsh$FdbekL>_Rtu*`t_Tedgzq9<d<L$QNu`#rv0P#0olmj=i#o z_ku|c+k9Tf!^~e=LN{#nn{#r(^GBO<=0*ok$T_K!E9JHA{G7SEPo7?HGe2Z&^kj<C z-Z>dho^mo~|1jF8RQoS$<*N_YH{N{7$h+)x)>O~u{sHr)OY;kjBbCE9eCldr<GVH| z{J^ys0e<x+#Co^bJ&#LF?S$fswolyS=9;M-e5QE+q-Bq#<u*U|`8xmM^GmnmH?aA= zv^3TfeObD~X2H_S(vg!q_8-evxs<<hj#qkm>FLHxT5gHF^&5`<^JtznZ?0h%+iB2x zH!;w9x8Psj_{y$7ajf5xw@6}nr_(Vbwv)Ma7KR2P^{SpcyL{HIHa3{!!Q*oM>dc2< z6qc{<)r_oeynpJH=so}cM^}ZY=H7Sxf47PKqx`z75*!cejgA^iX3KM1zc(x0msP=W z-1&#SHp{hLcXqx?&sw3_@PXyyf(OQ1H0MgL&^P`Yxb;wV(FMH~i(l>Dz3aD;`G-|+ zq~!c|e7fy0Sw!pGxpLv0KVbpyB?P&WdN2I&EIlaj;+g3O!N4EI^CG+7TBrV8cr|k2 z>l)`%m(tI1>oo7ud46|=-kR<oeqM3L3)6*+WK&CKXeJjYmYq6bWt_Xwq(6E0xpbT3 z=Tf}y%<+8r(`j05uFh1WO|Moe#UDRdv1@{_)Z%4RJ|BG=nA9MipkGt7!u0duWr>Ej z`F`d-tUjoGAJld=TTvEpmb+3sTzCDgRZo3q<<72=++^Eo9LVF`QP#IkrLX<%s(Zf$ zt-4CB`x5?c^mwnB(<5`xb)sd?tiwm<eyUWOc5?rNi*t_n1!TrL<!|eJ`bKwq;0DRb zuS_?4ff}!@;uhPk1;qXnlRxs!%>VXfzQ>z(7qqg7b6xhY?7VquZtTk!UmRCN#y`o6 zDcyaiZ0QQ4wKtjiUWVm`Y@d2m>5}M!J6}yCEIYLMlAk%1`Da`8WSgytV|#rpT0p7b z7vF;$uf+P)WKLe*Gv(yno`s7ewl({RwAD=HyRW!pZmIqB@1;MM+?#NJW_D2VzvMaA zWzy3`CR+SnbGuLefZ;C77TFy#p6zFJIUZWv_x@ti@WlB8%Y%<q{kNANpZWO77SFSm zhnJo^#HPx(^$DkJ_?6Q?D_88?=W=#sMHzF}9@8r_1q+WwFInat^f{(|7PD*C9=$6S zu`55?^{uFsn|HrKDxTN$`tE?o+CiJ0f<8O7&r+In|G87|`KeO(A9u_We|VI4#mDOb z#m(HN|CCJUPMS5{>dKvfCCA=7_1>Q<_5X33RO9rAPyH536>+V!-}Fgf-LA`9gKoNB zir1P{x5r6r$I{myz4ol)TVBp*es810oY@~B&DVpHi5sUrH4}JgTg{hW#QtiNtCs^K zxcSPsXR0kfsQGF=A^L~zr%kziU*>Jf;(K3qyyu3I>Y21VT62T<-rf=04_fY~wrIcj z`{E1wpyh7jVoMG`FR6I`!LeNE`mG?<KM9=n9sHj2L*Mh=S@})uh~v7d%$It1-bUQ= zwb^guv$LNszdfI?_}#W^H;YuGqfSl>yVafc-u3H}+V!tISKCGHW&eKdy?@l)!?o}J z*k1bAW!9`Z``f&y|N0&-{<_ej-Cxh7#qMd#qveJ5u^ektIBN42DlTaVdH?xG6W2oh zN8WiC|85oTeYgI+@ZI}$UoQTYt+{@7tGwQot@00#pV~VA!SXzd{V^GeJFXu58TxWt z$iAOv9+tl|2sM}2`hPF<r$2Y_zs;*Z-4|PM=HLB~{9c|<z2{8MwD0);?VfVWft#=1 zCq7*Jv?Tke=GN&uGQ{l?*KhA;sFvI4^a`}zEpm%Rnwi1*5H*>jvt;*9R89(%yt{Aq zv7hTd<wea5H19m>61+pHBW$CKPU+74yfvj2vv1c1Z?O}5y3Kw49TmT4_q~6f&0ZQZ zd%nK!Hub_SO>a-;Sl?Wivb*c;$}4Y^cF%fje4|ZszuU!&o=&?i9^TlV+wxlKcHDje z*{&a|i-Nmsc|h&gZ-EWT$y^K!CV1Pg8Vq<Az2RK#7ExIfa#i%-yOe2Xo@``M5)j}p zc#y)BA}DGs$f?+P#M5bJqu7>5r$2BgPo8NobK=o!S<$=yW`*z0h~9l8?Dnm&#Vs0Z zZ(O@}?cMKv?|;Yb_S#>4f3~WzzR!jFGw<2o>pib|KIi?s>UVoT|Cr2g%ahRjLOjCq z(zQGH#ZDeGZmUn%n%JS<zFl%<owNVD3zw^u5>@`laWw9{{_6V6vz)e;cWf+5)(W1k z2vB{ntjxmh31}d8g3SkxGuli~OWvQzIK;gEz@^My*Iq-VYaCZJtv`koAMrT;)#c9) zyD0`XGgJ*uUy898yDYq`;ry1j?|qir&d?4x+UDS!IHm8rc)_V@4QajYynh+g#V*8O z)j7kn<eT)ImCt*!#5R;I3o3b6lXNo7(fQkojdP?{X&T&~)wzr}dAZ@UgI<jNR}F2q zHGN1hP1ng|5t}Zorfks39dPLtht8a|i5^v!i<z=TBhPLOF`DMPyf<ap&fhBpPp3Uv znG&uw)37h?kC3@sclt4jQ&x?lqNX+(X*#T?LZ&w^3%~69^}Y8^wxB>Q)4dnp=H8w7 zw)x@OH{ZEJPKSEP*p~@jH;mchqS&>K=cuvruND83wu$yHyYr^N@N7_kZp6tYQj;fV zo%K??8sVYmm|y?>!MYU=1~Fpy{^dkXzi9gX$mA#WtFJDdb$kA)G#<67VtQ-(W!_Ji zG@Ioa3uvhvw~lts<i;GOjmo0xsW0CxHcSp_s=9F2h1cZWwF|Aec3%>9xB2CKJk)3> zKj((tTCb9mSqHk5Ri6Gf3}7~AV-53_cRE+8_jI#F+5ZREVjt!?t+n&MQ8{-)8^@x! zH%Iiu&)CazANewCan+j%b~@%~<rx1*`aEHo+N!<xM)&F$u}gMm7bIl2Xo_d>Xy2QW z+L_dlQFG*mtI>*b({Ddll=FU{WoI?ZLQR10OX!8HIX{!KC7jM2zwkYKhs^A!RWbq= z=dbvuPnJwFb2k#{D-4%U@mkW`vany$*3Bp_V@KG!G@14YWh3^-$&>m{wN70ba#zqh z;^dZsRU0?d{kf56t62VYg+pz{tVq|)Tiu5xRv&YF*PN(qT=C$*jDu(Qs|n~WNe*|C zm*y7bbur5PC6e{#a)E5$kB)*6XKB4D8|A|zZ>>&b)|>SA`RSN^otry8b4OfketAW3 zbI^T{tBIMljvGrqpW*oGnXP}Md&ySuVol|X=QPS&v@cxOPLFGvero3Qr<c}y9X`6l z#p;9CqOww>@K<jGepgjXf6uBAjnlmvuWWw3fxomuc5{!<7nLuGjjm<0LY~~)C7M5> zD_>-V?V{tx(riI9e>7J3EInq@RqOTf><(Y8d*?oHbm)&<ZxYj0_VU;5nv4naEK*m_ zQp&id$E#T4aj^X7h5*h}n@n9VtVx#AJFKQzF`d7AsX~8nWz>)FhHhaqYyZ_;y!+go zPgvuEc6QL!K>O97nzrN$eR{(wvNn4~#l)S*xZiI5Q*?Qjq};5q=)>)W`Mj$N<!dio z-f0!ZP;R_@a`TyY#~cjH7i!Mc+;S=^PwQgyv><*h&1{QK&zBdPFD;B%^Fn9Sfun&^ zC;Iwi4S9B5HE5Mw=2h|Pqu%%Rsy^j<ka1+?A2Yr@dhGM3qR8a*-bXeQ{CYVoj5Oap z_`6cs^K^4>u+4^EV|MFQ$sMou+3?ivzH@GSaRX>mhhFVJow-+{Q>HGKDc&+i(EPlQ z=;c3qm<1mfOglRLx~1F!)j7AUCU!48$JTUl%Pr$tF%91Mqt}=Gk6(U1Gr8U@?aYmp zmsr;5UY)<ted*30xi#)pUt;ftPdX;3#UsZdee&TM$H?qz?{5$1tW+}Dx$4KeiMvhO zs=Uh{@PAw^_2WbGGBfSSQaAZiYF~O3i+5kQ3aZ+4a)wUH+NIU^XHVAiTJZASyM<gC zQgw~-*BlP7f5EvrA$R5un;XZKHs!3<*Yw!wJg3$Dq}g$Iw@s3jw?0fPh*$<1N&Y)^ zkBxc)Z~X!JrRVEUh0m>hav|&Doo_Q|t&W-TuWP@jcYV4+X0p!g6B<%l77?4`<bsRc zZ02xpYO8;E|I+UN1)twPzq@SVr%5}K*n4j%PF*_Hr*Qu6sV1`bKW&k{zm`)`=1bUz z%2(2tjz2P7>9IbWOExMh^5i6!BJO^dRm+NurpjFu7Ml`w<#YC;V<ML`3>GeL@11kd zsokmAN6{|iI@`I2NvB$*&&prTZJd;QSx8IzM56oV#hi<Kf6eU6$gcj$t9C2Rc*n{! z4(=wmq;7?zwH?ltnV02ra+dJV*ExY5b3f%h{ocXa`a0+4nmy;bT;nzde30F@!e@p0 z?32rWJ`nJ($k#l+VVUTOp!F8<I*-k?#H~*YN31lf*ci7aA&O5u$oW%EMDF&ar5cL9 zYlQ0LLw|0OpHsH<Tw6l&Q6A5I{zq8t+(b4cUlaM%q43`H_~Sk1IUGLSC1TP^Ya_yy zXC0~9*LcK6UZzRC_6nQV+NpPn%^auh)pqWETDj~Y=f!7_wc<~l4VmL4ckp|4Xx5gk ze>yTaSI#thXY|?NO<?&l(MIjlAHB7b-QBO4-PF!7njfmgp4%T~o%(Z~`1GF_G=40Y zov-X@5O+&^5BJaXzaI>4*D#CJRYk-snfrU8hW_5FsEo)KuA*~#Uk}VU`aS1Oz<xWa zsop28-7Myrux(OycDp4tQ{1nRv+VWD9dDwW?|IZ%tUTTG@YYwg$!<}$x>xyQCWe^F z8dp6EIwv~ubbFXx#GHbIXLtAYx1Y$V2-Lqnv*y0#li!o#73WvJ+8x--{j)46-mdq` zbba}{=O?%C{8g63z2DpNa_d@wMYH$nthM-&n_0zUy8OcC=PFhH?6dtIbUpBFX`XyT zQ0DkME1PPW^K%>Q7$38=sZZSDzt6<A|Bt-RquV!ToK^cEW3@{>yRi4hxqD2)GRhvS zj%RikH90D`=1$|zo+9`4_{5pdXH1`aVB_z?y(S7G>t=rv+CHt({`{rPXES6<S>+G# ze)kCLa-EuaR%C<Eb)$dcGfpLmMSd-KlO~l?a^3&Iv$HvR>t`J}y?xD!!`gX!WldT3 zJ&k+tg-gHs@3bdH>Zx(n(zpB<=J9h@)$Z1gcyHAhy{6K9`Tdahld9h4Wv}t--RWQa z=1c61$<B{nM8C5tR`$Dmw(QNp&>bh0O4zds+Rn#Uy*lXYf9PT3;g>dtU!0w2{A7z) zZ{*#b*N%v(@|iweVYzt4^v9P2ii_vXO0CFd&6=Zn<xZk=ud%yt^O9$8#Z1eetSGz{ z@OaD8V?TKoJ(I0SXU&RHy>chhxmVl$tdr;2-MU%t&ICT*wD4G}ckgRSm$TI$?r~k& z;k{z#?KY|MzF9{n&H5gB<<8v2$8w!}Z%>o@Zrmo-`28_+*ut#klR}Ewr_VXS`~7B^ z)@F}gpItBYR!2NMddIIuKwj%`=By(>_8K4ADbKGlM|j4Df?bh0sXM>2%)aLLNU?eW zTd)fMlY^QyAPWPx$+Xl&2(48p|FELyQ?zW3RsBm9yTpD;lhjW$u2zItEsvU?vV-sH zFOld_mwKN0+b*n6;+$@u`|HJrT~*Ij?9%-ov4MuRPe1<sq4MSCtXjtSkc~e-sGhUR ze0lmuSL#cJk9Ud;Q)RxMtGceTFEKxRvgY*dOP}Uu{){j&7P~s>+uT*EYj<UQo&6)M zvgXn&m3`^w@85iM`sSCXxw8yU|Jc_rKV|tNl{%x#BEMEn?Xo|7{&Y|VXYh;b#=eTI zOQQB4%n#-I%eQ~~>38<?v&;Uc&U*9jc<}jm>L2{Aum7_SzW%RWeQI_(OHM&c@v_zj zfx_-PK5bum=xlmW#oNSXcWPF=*&I60)cEPmZKt*x2c*r`SDMXzyFjzM`t6jXHG%G$ zE9X2~5wp4Uani>f5%)~=!u&c+g%?enyY=U}=0!IfAGBo56_Az_6c_LLA+k37)BUTi zoE!A~KU)=c-dNGIUU>SZrviJuzS~$`)N`69JbOp$RW<9@W3~sEO@8$0l0nz{Jx8U# z)@_{Wp_ay;<+}Vv(&1C0-wIT(M_l|`GG)76=~JzX$N#rmM0u~Q%xko&JD;4dxWD^H z?3wpMb<;oX?%BorXI(<Q=>EFxdp@r}$oj`@ljxH@&41O-W&c_C^heb`zNm+y;U4)0 z?k%d-|Jgx32q&wrT#vaK7|Ip#E#6SZ*Mk7<`bOLIy*ColdGOnosKzhB#uCZW;;7DP zArRQ2pw*q2qTs>Awc~@)XCbyU&dmxt9_`ES_Ksb#DD3q$*C=-3>9_7iMMv+xd2L(S z_UhcNTW7y5zh6D`jGNlA`|IoXoT>dj@AurlcZ%cVYPP?(Wcd74?V#YswEwT3ee+St zt+=kb=%UA--B&%<n0={epXg<+!1Ud$cKN&hS0D50qo128AGw+3xOV5o#;AiH(hp{Y zc=W$w5})2Q(eJ(H$tBFnETz|WGwV5;s<VD&7Kvkb<I1{{kx&<_<fxZ-ZuLZm)3cwq zZA{7M(~UE$W<SPlv($@2%J<+OMZLg39!l@}k0j09a!=Cq&+8S_AMze?zUZU1X|jSa z>t*eW)&`Le&g4Ft(LHm8pE8%<CsuaTEN_L3hx2E3&VKPZN~(#OEmN@Ph5KTSeOy<h zmOVaE6_Uu-`^Y!HcL~d7Ee?eV7V{bA>m8gS#MV^WZ7s&y{rBFcB_T78E)9{D)%E5| ziOD&~;r9De`d*P(=gC5~W}$v1ti2WGRjZY_MKUXR{^<1_iaA)(U27!l@19iRrn1FU zAYAdHPQjYI=zVrOn&d2OBIfl3d@h_LeEd;`+gjJnW|=L$dP;K~&K+#BoLn<enA`DT z?8J&+JxlIgPBy5^)<|+V+!^uc(JRk8D=l329$U9X(Ep-d)8ZP&Re_olPCOFPDGgkd zD)x%aJdESn@mYJ@zs<j1z0O=bKhAbuM|tX_dzDSfwW{mRn5$eg-IBDFTUbCMw*B&| zNY)t-jM-u&I^X-`nE!FKy(W1rTsm{FH~&)MlXv;ni1l1r{Bn=w!O(pPC&Pqtd|Sd_ zeJr@*QQ6#i<eQJbw_Iekm1k}g-`0)E<^2~o?KD{-<z=pOdGW=vs1CE7!%^bb9+YTp z?VGoB`l8)?H(qFKFu$stA$v!M*Y)BeiMbE#b=~jqyV%J_ykB_M%;3f@Ax~$1!<ge! z7inA1@9fp{IjA<xCU&aLT7#q6YkbyT4t{%#ukFn%FW1F$j-)>BsyMRVw2}4rk9(Kh zc&)5Lz1mo$KW(3O^0TVw!&7;SE(Ka&UR|rzz3W0Ozxt23t(7~OZ)dD7QL>-<j8Aha zTb9Mv4y9$2x@JEQ^-(>|`m^$hropXePtzWKNoe<)qmtayXT7lFi7jj3G3JAQ;%X~D zNQnBStYAs}ayQquMecoYf$Fr&8>FAFE-G$J2<kNawSDu1Sd|$;S!-n)Bd_WeK1zC% zc-KpP%BRX>^WJMuuMs``%qZra(i2gwPa^7JCGR@7f1PvsL7e542Vw11551iaN`F4* zCTjAdZI}1qtvmc!zkbz{bmn<G(RIb9?%clh3DY-CW|t4RZRe3Xsmj9XTq5uG1-Dxb zcT6pmG21n{ZQ;YR>{rfSm7!G?%VsG?YaE%o<8*7`j@e!+y&-C|<brO6Z>R};9+0j$ zyYhcrS=J8m-&5CpH{?FdbLiz%?=x*)I(&h~S|XyQC46!J-)fr63HfaCo#`EKyXO0n z-VL=f(++BuoH|_LvhweX40gHV$AXT<s{JNYrc^(@)nDE5iSyu<gT9Xr2=^SEaV|JB zY-aJ|m}~W1^Vc0`v^lv(?;zij-X%?Gan=PF)_AFMIB!YSZ{Bue+Gi7++|+Z%Th4FJ zi!tZ<Z8G~?<-O*tnrYAHor*u$RMaH)UOT(*{A2E~6<qNl?knUvSAE{Db9eg3rbWNG zRM%B7O?k0)m1Ck~<hqBeD?DWx;vX}9C^e50>iIggzcs%qpgCORyZY7Fbys)SweOU? zmDRG%_~rC{@0X-A2W2nfObhcXk&C;3oPUaR{fXL%75-|uRS6b1z0Ymdx^a2-i6x<v zZBA*eFw@liEWBr3%MZ=|9VrL*ZLONLcaCGapH@~lm)Di^AGx>wpWf6e8k==<S4`-N zkk~hDp@-LhZ2R;*|Hb?JyFRwDZ>@M*yCLt|2Y2p|{w{wuvzJyJ?G=~Ea+Q82dc4GM z(e@A9j1JtN(Nkak_-&%f;}~Oy|1TSv|1WA!npvUpmS4?jS5(OZ`=-l(qJ`hY2N~LW z>i-h9&8*j%$gxyHeP+rjkDtjC4aAe`jQmuc|C!wUp{vHcC?cN8?ZN(@Uq=N$MJ&2C zD`;v+vZ_+3-X86%O`KwV)6LtbOfQ_-5$)W5Wz!{g{*9}oqzWyT`nhe;Q0ZN_BI(-t zozvg;x~};pQs}w2dy3R-AKR%$lU|Bi8&yqVzc)>B>N%leHg4Y=MI4HuLZ>t&eZO}{ z2i#w|TuJfiLXp=8d%EIMuI*&oHlx@0<FS*8JnWMG?olz-UoMo*ox8!AFFk^lTiw^# zx9F71Odp2NMFy9{S8jf+XX&(T*N*I22}Ozhx7XdfmikDxM)ABdt2+z(LIc(rFQ-U8 z(%pGtz2^rzk@sq+0;lY`-64I_!y|UP|HfG-Ti<WhHvK+x?aCiZ4!SPuZORm#QhFlC z@w9-|av>(a&pcr#RgdpT>H8rW|2*)IgH3Msg$K87eyFPXKdQX6M#XNL!bcaQW$wR~ zm)gA#o%~q$zkWgU%dHENVo$Z7vVN30@mH6jW0c$VlaKbCE<Ui!#{5@X!B)<QaOp@T z^-2RLKQsG!p0#^t>UmE+IE^>DIn6gLLTZi|Z<K9;)<0pshf3{p(!Sld<`pycZF(b= zGIfod+4p4A%*{L2tA4+1TcG*wYoP7T+%MH<O+PF<S#>(|%!|j`MQ5B(mfx5ucDOfX z$I0fZqXiWaCU<X&U9&u5b)7l)M}&#X@>Wr$up7-24<Dbk-gA5F)~OMK{BD|SCVkry zxiz!#k@TY_hcaSk-AG;XM(9bveB0QW73oRg?oBH-E!M=ua%NmowvL%JVToE`r)K@c zYr$Tptftj>RUCGkzRqQd;km=Ny%^(kju*``5ww-EyuV@Jn#yjggx}p^)%Kw`l(eTC z?$o-reu3+*nub<qJrN7*%-#^Im3dOz|H#{2p4uq;XZG9}o#{KCDBX1CkN0}+)_wKD zlcJpmnlBcy`hQLB+^}%pdACQ$X8EkS>`}I2*2<bg&E~rtpUdsLJ^9=>kMbD*^hq+= zjTYx8r3OA#lbf@ytjtjH@s*B6#rkizPgFI#o_$t$b>H-aZ69*t7<$@;gAIEP3q<dS zeUMsgH`_`|{k&br%=u3?c&&SO-)a)G_({`0)_0W}#Wyn)mx%P4U6=i^u+e&5=x+|K zSFiW-?w!3m>xcE~jpD@>H_{CA&ob&*G#tGeIp@svr<<RDdB~&CeYTiQqWX+)bwIzj zq2TmHH9hmzj3+g=>E{mJTxPMkpilSQnmHDmxsGHmS@t}sTlbvOxe(2xQnUG#V&X1- z6m#{vXf=8Ejf!ZGm5VPQ+db)%hG+DwDnUV;#}#t7!}(vNpS{+y*~8@QyTg@UXJcb# z&pp~|a(HR+rX8CiUans7FzeQPDU*k{<~+UnpL^XQv*0b$=3LTcT_hRuHS67ErR8Q9 zSDN!&U1|PE?e<FZ;*g^sx9&LCcE^QL^sk6j@%jat-M3eq%#F6((cEmkEoI~S8RvN` zYnDA>nLp{V@zH0GkF*#1Tk7An57D=6=zro<$glbSXr1(Xrh7#qrK?3-e0ysZGW0iv zR>=8Bp1N`&{`Za#mRmn8&DwgQTio^Uw};VLpKf>kauB<(EB4}<O=DEC);2MYFAAc6 z<l=OfKgjmy2|OtO^x<AFuY2{md)f^SExG3sTX*c+vWsC;4t;wR9x7rN(`xtUVA!sW z6B{e*^M2|7y<Gdl{DaB8yB5>7a&MQPGK=}qnNug$^hi!9)N*FN;a!=Rdg^YQuw`7^ z?Un1<vkR-|y_sFK?M8^g@BW)-D^k|ThSX&(+OjU!Mnm}2Y^Ti}Il&#flyA(AUu2M# zoBx<`=A@}F*;B&4ZZ0Ybo3+Vk`n^|2v#)4x5BuDcom}c09rkQ`Y+1x<>FliAX4kH5 z&0SN><M&EIbAFV&<RwPmW5Goa`0UD!ZoN;sbgx(M&FRZI>vJ`h%Y<LkQRg|UbNu^k z*R&gHm3PH%)E3R3bLf%s>Gp-5l0n}&F70a1P@Hu2(t^_V4ZA1lCY)4TU6tDFwUepI z@Wy5Jx2c+4i$BHL{jRjR)Bbday!DL6-xB5LA04!*-aF5@%sn!BzM)C-`twI0Fh5(# z<?`$4)a}2XtSP!CcQ{9Q?;EeL(zTaD%bsSG&(G11(Bxa&{?n$(vqI$aM~Q0>KH4-Y zPupg?$S#EOoz~UgH=E|4S+wR;$Y!kvPi7fCwcfuib7#%9h%HwWqnFy5-p)|JWqS7J zjW1J{@Oh;fXr%L<I{9<1K>5^PTG`H9Z@G&vO#A+*Eo(~qCcddPEB-kj&6L*)ef4@0 zuhso;8&9vA7<n_cXP5c;JU#BKZzp|z$|Rk*ruRX{o5|XVTuXJTW&fKAA3Ax?C3(7O z*Z#$k_QyYj|Mkz2spo$jEvojQV4Z)Gs0EYo)2hu9R!`Xe?c*}PCF#CANp$`KTfgVW z<c~i7F~j!V;o=`YdH+&tl+FLi*3FmRKU4a@==%rq*CNDDb#5{+kDF;8H{JZ+9P@jV z%*{R>yL}}>Z}GC#8qXh3d71jDUikfl!(NMWpZPV1m}@Ej<p*`Ys(%%;sPZx}%vHwM z{SrXwexdcXjz)4;NFNpbciigQwCmGltUpft;lL89cw$=r3=5V?Ga7p5v_!BtHKgdS z&lU8{UJ@#_Tzskglx<tKu-<Zt=6Y(!#MkcO<Xt8I#qMRT6aS05mv%47FAM+V6?fC( z?DZS-O?T(t`+a|Q{k=UiC(f^Zdcv4t*NvMz>mm-=i%9snhD0(XYxFODBzSedp{RL^ zS(}mb!=99gF0Wm_21bt}r+aV|7+HKRXFSSdCS){4N-A2^RW#sK!gGI~car&XujD&? z-B_m>a~$JtzP@B*Xs4U<$B&;=Qaz?Udc8D7MJD8!^1}&pLTs5<NlZJp^3a7af!t=1 zUNz@aVw#TpMN=M#8S2cAZeO@k;htKm$1Ig8M|rx}R7uQwzJb?MP|nHLxi?kZIomP& zvcNPW9lZ;lF`_OHQaCe~y_~6=u5oWq;o}cG75%N5rBgIA<vUjxN(HhzpPuu@{k#9f zKK&nA>0A2UEWfk7=+Nd;ekLvOL}>NR3yo1+%rCQ2;?gbUch$a*`8G?A(L`j1fb5}Q zi9<FV&u4M0J+*bqo;|s@UA8Pf%xcXv<w2Y8=N)T~q?ihFnjb&0%~DZ4IB;vEYTWF- zcPD3US}PGdRiQsrj_>KmiX}UQ<h_sD$|{8w?os*@#$j>UZEE8yhu2dt$(@v+`sndL zkDC5X(cjpY-Z-(sL}m4*86sg*k4$MW4bfk+B5RUi%yZszMyjoxsb6X|?WCqop0{Ap z8$aJ~Gq1F1e)v%luXy;vl_ht!AHK4?@`;z_nr~arnmyn&@QL}>8PUBt)`I(ah{eV} z$0=&+i-YGyRLoYlJbB@*si40@RO)B-ph8oj$$w?GUAOmeHCW>|rDAuY+XCqe@70>l zofSK^Kxo>IzJ|{dY=4DKxc{a2c&#WpwBBdczZr{KCjZ+o$xG$w5_>VprF}Ez*Qg68 z+RvBU|E@|+YVRqr<c5XUtY<G_v}M#Qcv!=-a>J@yN^dt_Fkzc2>l$xh{=}|t3+L>g zSMn2I+!c&6uW>9s{`4$sQPw4o6COrsDq-on=S4>AUeZ!fTC)7A>y)tDcM|4o&AaQl zV8P@am-ck8I=!xkUAcUFbj1sijn3Z-BrA8^@#TNA(Ea-b%jN7-#h$O*<M?J%!9~?1 zmvTWh@x^&Jc5v^u67&r6ni<^j>dCBvD-lb(i!W<xyq$kb&2@6f!u3n`=4BNBcRg6V zQt3J?_lv+qu7cVJ^Nw^EYF)ik7<t#mY}%B}Wz%P;S2>4xsp*CV-CoeKdP0GqQ_vC3 z4^u7(1o8A1izc*P-kZz4^4eA7I%i?d)b%DpOPQIkGTgT4H&L(dRkc2$T+JJITDe-b zIoV>1o=cC_o@VAf&v|#u`o8BP<KN?INtS+(55{}1kiNz%oEf&FnVC6vdRK+<y64aG z6IYywy?<*`<!tV}I}XAQHhDc>kGGgdB=TlxzmeTB(RuIWNlEKP0(YBfW~JyX(x1cB z);#Os?m}VnJ(brUs^sS<MOcd8-dtuR7`LTR?cQ@IUU|2zNBfQzoQhd+Y@OPnc2SvE z&3ZZy12+5V)O=oaHZxDBwq3Z;Dy(P&|LzM14rZ<0Za8me@qwA_RcwD`KG=y*d&nkO zy|I7&0rr;<EDse=ST3LX^>9t%uEGYt*@dctlNYu935>P#eHEx_s3-mCc*)1dO81(- z7wu8k^!8EhUENvHm3{TWgpTS0{p(hTnk^34FZ;<pbHBX&16g;=a`qp`P5v+Fvo277 z|3l>YLx%q|p2_zc&k^UYh`Xy(ZDVa)X*km?Yn9EtMzdSur@rjksH)h1Dmf%{pMx{! zvlCmmJ}nih5sXh;abDN>_0-y;qHHa>MdFO{OP$OXz2VkmE)12ME?je$Z$^2TvtLL2 zar2lTQu{o&>KSPX&#;;r-mhbp=B)DQcEvf@k2USjR7KBMEMZ<h^>0JR`-i{p+~j|8 zWoQ3CHb05pM&Y(Am4_zm@{<Vq&guNhGSOqTpG1(pbGV~QZ0U0Mscu1mox9FzFF!iF zT;|ma?sGB8KUa2L3z*l|5P$jF5?LA7JuT0@J}T8Yw|~6yMB`vK_fe(tO#UCTb@5z` z^$TpXd#u;bdOG{Dno!L>*J6n&F9h5AD%&+w+n=s3I`;hAtirM{+03g>#-6;n^oP*D zgO7i!hYBTYe$&>xwTFAnu{y#3$LfD%)g0}Zy~$@m*sMqEy34*8vpnmK+&}3FOYBVE zS@pIKeJeJtxEb+c-DQ0v_TpU%MveE%i)L?<5kAD>f8ya?%MGUY{%yONu5?TNQ`@Y? zOS^x&gdIDTxnfPzg3r~gVM|?CC|}z5a_a}>O<CJc9KEx~jeF)P-o=G;E%ogyA5U;w z>KQ8c^zqE~N77`c8%-=zxaRQE;C7N(D5LIybN>~0G@O|B(k@ye>}+?^t>wjPZ!C0~ zkLP+Ozngiz=-HPE!f!rGvh`j6u)}%jt)RD(QzsWGDY+{DPW}7O?|NUTnE987J=a#O zOWWFNZ1VJe_>QdqJ=~3R{iaV9jGEzTdeDEd`Cs{cJR2J3{+`WP#`byl4X<l)4^#G7 zxPNX}+~l|I5U;f|*IVf+fivaTD-~7-YndsjJ536+yYoj%_O9AQ-o4U?HYJ8~y<g_M z?V}#wk;g?&yO*9UNiN~lUg;8XPvT+i)Yrx~FBb;yZ(g@<;oCn^M=IU8=c>Ie;T8%w z{=VQ(x8$6xEhV~_qIQX7=+1qybsFE}DDU))tmv03Wn~lAwBMVjrsB5tNj2A8yYlVt zIn0V){=9v+d8(>^qDC)w?Yl&w_(`JSX-B3{sz?uunJwt8B6qq=y7Z%CQP7dFi|PEQ zewg;PJydwEx?+)X1+&*nl~~V(yD#=e&GCK9AiJ<R<A_<+y;iqt-eHU6bdDK1uH~Ni z#$npwWwHFH<(nVr75Oh)XxC@UzBPZ{j_~DanacSk<ri`zB)c@39z<>WXxnC+x#you zRnDfRg=c?FbFH|1cKgCB-&xkpX6xHF<-+X=3vZ^V&)t5n>#G0Zy>nMo|ITV(f9|8o zI^$n+ul!wS#lAiItx1ZR?=u^(O^d%TRBCp)6#dS+%(O44Vf9AY>529^Z+y72xhEF! zoUP$t`nJDGiP5#}w_%Coq~s~wX1-~A!lYzho0ew8x-O0Joj$uG!{}n=TE}$J{cLBQ zdu{t?MeDBEn7(4=!z*{v0*bTSq;|8KmU(BrQE!#%S2Zm;I=fxUUCwlSbim^i0h?Qb zKPxuRx@~;LLT5!`M9^ak%_}@nLC(|fRIVs|7Fax;)$|;XDes(FyLq$ToeFroWx=sb z&)&~V0*V)^ntp$9uX2UprxiQzH%TcvpEdG3%gko_J$;3s&I&=Dm4bd;rqd$=9zXk^ zVBl3gp{gQ&t$uI&r3#mPzE@|3jiuY8Z~v5$TIaC;sfL;2^|Xo3kx#mLpDb;e>i5{d z)PMO$!M#6M+_N!$ydaEO|EdD(t)-`4Zf6r!Q}^ENR~FIsf1`=rI`jD#X8S*DKmR{8 z!1qPB#kSNR%F|BF_j_zy^*M6y<N;LcdlkKdExco6#E+*?#_UB=gSc&pKc3ej5IY z|6z1y&3A#i9|dB8^LLa9ds)`C$Y*QVM=E%=tDf=~@3@rN`DrujqLRo(e`*>v?oQJ< zuP?ClxX{y9)<tVJx%@oJ6j-GjSl1aZsS&Ml_{Yyvdly~2?xE5C@wSr8G5K7J8SN## zZCBQ0KlcA&yukJ^tA6(1ygySfbaVX8|50srzVu5`U!BB%twV}3w`cX&?B(1!hebd8 z#M2(b<QB=4wB$18oB2KW9(r$n<o=l<--P$pL9ZFzY_aF{&$Jab^i*1E$JKR&E{l9y zGVkwMwcknGW@K_txVo`w^4@FD7eACq>iv9E|LPz8>Z||qPj1XN`eQEs>Aux`+wbwm z{UQ@y-ASBkb!M}}l-;_4erFf4WZc?nvASUE;<_Z0`~T!VM{IF<@a?p?#8KvHfpfMw zOkvjz+{5isc|vGuZleZ&^nx8T`qvr+tm@Tu`yiWm_rR8I%Vcs)YxyqS?YVzG#&6e_ zplG))(I;Cb-TP@Dw)$mFuyd~NR__&S7jJ94<(4%)@V1NY{&m}|Bws&H6nrO@b^Vgw z?s;J~{IZT!7t(FwbE@_o`l9nWU2MVgt4oSmQ_92=L!7EUo_nIKf1&qX*X!u{@toVH zvHyz)^&B{zU0ObKGcX)eA))6`l2}|)84A0wWp71wL`e9w_cz&1ZRdL4a#6mu-E_;` z_4|+9p6ipouloOs^TDZBvT3vYZpm$ZUKg)^c}dgKM5z^Ap;tZAqi#Hpe14@loRL+e zfQw7xNucV2MNTeP8l)a;@B5H@C85SuSj2V8?r$r#4x~RauU#K<)w25i*1FdluSZqq z-d~kfvrT66PVQiy%(j;2xsvtg4EE0d$dqakp2|6Q;ffvhCpY{5pHsDrlXJaJOp0U7 zuhS>~9XrjPyE069(z9i0OQK3We6}AHKH0gAC%5q#OW^sBLPGx>p1E=}x;I_T*m!A< zlJY})-ulMES&GS;XLsK5h{`zYqx#-*rw8K%k?d8PkLNd-$e&z4JBTNRV}{(`7X{Bm zMHW5f_Q}jVFk!=$3@>x0d@rY67bi@dkh$f?r8S%`euqB)Kb^C6PlHTm+nJ@uTn&;h z7RRY;^>6yueenz1hCingJbf$gZZR=!ouF{sIz?uwUa?Yoo2K#I31V|K%9Sct8XlgJ z$#DDno}DkIw(j@+akO5=#zAtk;^hg`(tNzPE^#;g^}PO4h}OQ~*8A=+1KwHiDFvPn zwG2Eu_sDvt#?*<KQ_@3Sx~I#paBb6k__n0^=i3=vg6k{Zx%{2`lDAoMZC}FQ&(0gy zv|ZV<{r#5ZAM!T1ItZVic1h;+#XFxaRcvEyS}5rG`TkG;WG)v6KjR+fj%sG7mtU`x z*G<mzb7n1X%GiBSP1*99@Dbf#tegIyOQ{v_5cuzPEI#pB>XF%J_AA)yD`!qTJ14D1 zvXgDI<=gcF*0NO_KQF$$P@pJ9;(ooVv9aOhDSbCwJIqtklmyjy>Rp8%=osiR?m6QV zu$A@Z!`2th#q!@3EEj#4{hv`Q|6+H|dycK9^LQB&73SULGpp%3A~IR`aMzFf2l#*6 zJHFD}yP=wYD|;o6ShwM2soN{Ul~WRQD^lgpzP-O@`ZueU%nmO-7*F?VPLv4$HDS`M zd3l?q?s+zwSd~b8<nDcc@y^7>31=GxUr9_#JUPuxslX(-j<H64qV44!D!!lB7jd0j zzpRm|n`c7s^7AjI3NIAQ;{R&-m37j5<CGaj({30E{AQdKEG})lX63d0uUd;2P866_ zH$O9m=beCQ-iBXF9)FWscD2Y98~3Iud&I7B-t>{#_=KUJThI}Yy+5{YX1FvdSt8~C z)RR-#q&cEuu5vS9Kj3g}k@&jjjj!H$%-WxIYJ-%$LKWZ3)^oErD5$2-^0}6BWbf2Q zuKTAdv>$I}<$k9BBlS>rpd;srsS{=;Zj|Ef7WVNL3UGGfI@!#k&61+yFt7gOQStZ+ z>%>k?V@9W|4%@;P$IeUeF<#a@bDFqt+}6~zL$@=s)FSS;PWre`Gq=!bl`7*#eWjiy zCdtQwUhnpZ{IZ@qF8as%&+-3Fg&c4DFeeF52tT}iU$#%h?X+!s@=ctQB#j*QAKKV@ zG{9cjyQ9`qUrC*_{n44<&unyd^9Qg$x*5f>>Q)8c)0dTUPnD}b72mSE$i!olvQD7$ z7SAKa*@C~>kLWp`%9dXuaW?9~2g?;c`X5eAZ{Ndx-}L5zMLd&3i-Vb3zH}cDInU<k zA<(jd<pTeWe;j3|Q_?&lLyGMER!=)qm++N2d%}h5%9R^+gIAwYsWJ{y%5(kZy1(-A z)}QqeEk!~ncP9KPozn44^a{r#rxlEKhgV2)uAjZ&&fyYnp`2@1OlFlYG>eGtl$y9l z!}PAlIbMnNPOHCu^V`C-by1nh@edPfA7-yV_y6vCai!fiCwxjj9Awd{v{YVm{hoY} zUKRd{-zTc&uZ?q?yHIe8T&d$DVWuPXGqT)*7M;yH-4l>^>GnmpEtM>}Zk6k66MQxb zI&Sn(WwCXccvhKpg}A5pWuNyFmnJxAxn_B-y4qBvWSaJG(skvFhtpmh)jM&0ZGf4_ zJ4G|mojlX-I|xV{1@(NM{(^Ojwh7Zm`6kzsX>mL|mrlQs?w94yapfzMuxGfs%GR(| z&t~gx*dxDeyA!8@s}bkPm-T&n4o1bx{c&FR-I(_oYoJ<6f2hzu0js8z+(}o28D(9M zCs_9@U);j7BJmN66{ns>kDa;@%YquYLi^@96^x$8zUQ==aI>7;&8B_fOZ?((Lb^VI z$&TN4G9PiXe$sGpf|Ht_g=4*n)5Yc;LgEJ;`K@Fe;}2d^Etwgz_X^MJ|BRt$kNJ2s zt@rHfVB>z#wj_Rb&H^K$gI*HPbgs1-sym2eBx{@!u)E$^ZqSm)us%&c-Lx@udSbd! z(50MdSN2ahySFv3`9|WB+{5R;DxGaIIaDj!qsX_sQlr?!U#G!OHF=+<Bwyzg5fz<= zRW6@@XG(sX7pAdD#hRUA%am!xyxqZ#GN&FSJ-+0#Sg^4Bq+Dgc;APe(ldwhcY?URA z_xzsAOLJb7+w0@K#p$2G^gnmLSMHkO%ID0c5~q{+LTCxY``yQ;*h`CFW{UNizVOe* z&U*8dWs@wLSmk5+EIq>~tmvrpTkMpS)pj#YHPOB6OZG(HC(r*C={54dkS*CN+;_am zX&2ibi-I02hc6Gl*jUYA7oN+$A~~h0e$MjMmU|t{pWSt1vP>2@|7Vh-gkpiKv8-HU z`+ZMYW_3AbbrBhtdc(A+o~qxS$+tE(%W(T{J0p^uq@|&L_?Wb@F;C{Kz|{}8&y8bU z+8sB!J?fzetJ`Vsmn*v)HU2LBGCh7%%CbE!w|b{<QJZweW%qe;<=Ca4swb;XwcvGn z92&eU?B&Nfj5g0t*-V>X+^9W&bNIH|Z%@AO{LJF_s6K7-bIngum91|~#P?=CTJy-p zY~_tmRqba&#hN|_Uq8H(u3p=*FG@>S?wE4D%KFxmO1WB|rKXuR|0D{xS{krDlyC0X zW3>Ben5D_FIAPIf>tn&z$AYWl=k3z)FX&OXI40clX~Vpr;Js77{SkboS{(c-X4c$E z2No~>`t*fDh4P%7?0M6ZqY|SJn#_n=^HE$f%4lm;`lk<nyk{F`8LEG<Pxjh*SKIaZ zDyf^>W_`SQOLG2-H7h4dRGB-!pZq5Ke@fKS<=ef#mDU@ry?D9ys^vDmW9d;xFFg0j zmiQ&TGoWzh_2>k?w1hQ_{a?T6zH?76@TNi6r0cP7&2qQo&RIUg?53GvVXncQoZElg zI}9(g)y~nnu2uJWTS~CMbK%s>R?Z2J%*;L(Ru?L8ZD{Pgy{J2T#-S>vW&Ue~Qw*4T z?oG5Ye<vmJ_s0YEr~UQ3!Vgp0!hE$Qc3r!2=tA$Zu(mwqV{FGHPg|AUDl^>YVv~7` z=iTS2i#BO3d%8Ex|A$4^x0cwed2Rdn!u%~b!~89tubOV#b$QRc&f<e2J}=Z{uK8NL zJ!Ag9=JFR#;d0q+4>s=<?iPy7`z<@Kpgi2#M|$QCG2tBxZJ)L6c>SQQ^K|O|N8LLV z?H{#uM$i7y*={IYp2cijxIFKX*Sn3vp$RRoH`-Mms4>ubwPsSbUEVzz$;QIM+`igR zW;<igg~~ju<Mzl-R$JryN3QJZlMlN*vv+oFp7cZ2=jh?^bAckKD^IiD*w2|=I@#*+ za^~4d|4tR9-OHR&$-OVM>~?CdW#QgC23lK#3i~}%)kLlDxZ2pPQc1g1S)rD+Gjqzd zdh^`8i5?j@3a_kPe5JHJSX|W7^p%U=M1PTEALmFueYtyfdiNgByos@0Iq%ZdSUW#e zuG2F3U!A>U)5mAlq7Ap*a{kA$-<ZeD6K^=V&($|wt@h`Nq(8G})Cb6`Jd<DbUoUBu ziQ)a}aw^Y$pZa^W;FI{`B)+@4X{+~0W=*V~Ba!9oa&9U6shyw7CpK?Td;ak+|D?|q z_y0ci=vQm+JMr`QSN=(#`|p0AKKXM-k(~AFla-6!ITp=}sH?YpZE3Z`JV?#VSh(7E zH$(iSbs7GXb0#a!jNKC9P^?$t>Q<e)<?<ijCnW{5*^{rje?MX=9;GX9e!oFQ#*BaF z)XMELS6x-N#iU*Ow&b>_vL}bSq8VqQXNSMj#VJ*r&R&cWY0z3){m9_+5`DHbH>J-{ z6kjY|e8c{M(vvTC-;7h(^}d&_C~H12kz+yA9=Rpc+?N>nn^}MAj&YdW@<e5ciX!{x zC+dBll=KTuZ<5@}A#VQdn2qI;H)U2yixf3u(xwQPewo}Jv+iSd@Qp=L!l$<S>8U<% zyxYSy>A9cSLx%;?fq9m9zf2HbSoY`R_m_wL8&A%6@ozl&J9+tmCv_IAYVmT`%xd2c z2blj{lK07yZ)<IPmwjYg*Z(Q!TUFY_%Vq=yZsHVuJ>M#D>4aVXL)brunAgjRPM<$< zuNUJS&W4MJZAuSpVHA6?xO$b|sy}H@L}gc`gv?=|8ut8_-yuO?58o9o|F;CaZHcJL z(&d@4ygC1LWm*W|qf<F6dKRvp6mXP(pFICQo>>7)zrHjMj1N;iUt4AVaVdA`wCv+= zn`<O%SmOOYy46}PwR(11Gxx!1&AG|@=3HWPzB?uD?v$%CMfL3Qc6-HZESKIdHF|Wa z;n}H`y@KI>TaAP7*6{BrI$RO%x0da{Pw8QI^QW&@ywh5BaZ}!^6>InMN{SYWd@d;$ zTGd-|GT*86TKb$oeO>=~)}<3FURtcuUjAF|k?Ma7eNI2)EQ7^vC!XHlwsGo;lWnt} zFWeB5;g+qFp}Xf__u-~%kpb+V&+zfBt=Zu}-%|eTOXKTFc5~C%=lh*5<~^w{!f-di z@$Tn<6<&>@5zV5NdxcCE_os%QYyZZZyK#Z<nJofqUM|}xw&iNmw#a~fv&rh!9^DKk zXSTdGxZ+!EaG7sb;N{s5IMQBCV0d%;jMT^ci(!s^Gr!LLHE*T!hT@N*-@n*?yz5)@ zCw<~R^?l*u_f1;ozsS^_Kf}3Z_xWx8nGakZonTq_(AuLh_QrzwdC$Ks@INMe`(oMJ zRaw<`d#7DkGsXFc?EHNz-^v=-nwMBEP1~Y;bIV4><y=|$-oo~OgIx5ZuKK=z^f>R^ zl;gZzLM1DftNBizlDDF_P*=f5jO*&pz>?QI&*eLFFE_`i{!dui8F<hyATNE%ll+9V zmZ?d`w|uo8&O0M1m*%!Q@0eijyy!+d>7`Sa=x_C$e8$F5f%$k`+OdXr?LtdLZ>{~E zxUTKo&WS4mCoi%~Zg9R6`*bnGDR;ilTlAS&uRd;%-tvl3%;D>ghmw`wE7%Y2h`x5^ z_VTY2UogzkPcU&fygq1&=RNK~&IXq~-;B#%U3?Y&;i=QbJ<4%RD<6C=R7z_(yTZ-d z{J*;+%goiz?7lk-mL1S+=5u{APipGy7C-fc#-1;_<qOmU_Agnmd0E+xD@V4@Tz6~T zA?5Pb@7zuIl^!j9p_6m9$Lw!EpT#MoTQlTK!>bqQoypKH+j=nWn9QS7lZ(&1@Ge?) zUc#XKb={YV{%Tiv^~~O}2me&(+d9pDqyDsy8yC1N6#mY=Wxn^%2eD@*C$7DEevL%$ zMY9dH&)lvz99}uQlFMZFPSLhC>u1lbjL-{OkTPGL*FC!@z<hJuy+u=IUUUsQxBkQ? z)>>vek0WQ!L{C&($at$ia%&93E&eT&O~f~Qc{biWea2?RY}a>_GWzq<w2iZ4|CI3Q zx-$pWm6!6pIdo>NTFKS6j`gcVZeOf)KVfaT;>?R#JnQ6`40lCtzxniqS`3fbp`!`c z1b5DvGE?@XfL4?O^YJyx9~w0-pS`77zbHh=b#I!~X(eNA_P)~PGoN|z*hNo2ai})U zQseg<xph?`k&Co-4L0Y!ns=9d*QJ(8mEX88luGM*`rXP~lq#)jZ2Yj`pU}OTEMj&= zn`f5I$h3T<VR_wW_n9rx-`@!Q^xbectS)U?@r;(IxAJE!HheXO>qU&gpA~O4R&JlT z_M%f<F^eHz@3(3e(KMNi?jE}!fd|hgzHo`Sx3Xl$OQ)T@TB>uGd%s{!jVVpI(%(F% zDojYBp{uj*=i{%J|L#zn*gN0v+2>>D54*DOp2hh&bKSc&Di_NXI@M!UY&c9$=yo}N zd0qD>^v{<Qb(wi{V!iG}cvO2AbLt)lQ@j1*Q{@)@c{6$61(a?+{dl>1)Q+2ae6h>^ z2JywRN>)tq?3g0-!S2=MKz<bi*_Trmd^>B!dsjL3=$U;A@}X7-y(*W^T-RMywe#B2 z%=J?@-qw(G&0Fku_f77`Xldi$U8|X{{5i?CZpIC<l(f05N7p&*UGlor{w7Q8M>bd0 z5BCf!0;(&o{I<{RQM5VkDj@aFp~A0cKHt~oyjj+}<x5oMH6q2TT3h)hbbolmEt93M zT%NJTiEsAHX)8LUR!lBg&04cT`jP+cA}48mmw!s9od3sJ9}95Xwrgr-o_@;CvhPdF z-G4v2TU5}qre+FHz{#!R0XGBpJTpA>>SIgb$MQQB>T909c>L6*_}79v#-}pa?wQ^a z^j+UmF!{7d=id2j9&cQQxmp}26mDR<YxdUbNs0Yh=J@sU!3*B{O?Ywk{ql7AlIEW; zD<Aw9V}AGT{`N_yJ1;Gs@cF?4!~C-Q52yUT{rL~``~T+;|DC@$b^Wu%uy<0E_Xhpe zpJ=$`zUx2jhphh`1N1%kOLOlywA5c_{#h+|%3iUkbM9w{pT%-|_EnZ(mczd*&zPk5 zX35?4^Ez=WCGFgE&o5TH9;@3#Jv>la5n8-r=JDCLo4z{Am0!Pd?L$R!Zme$q$HseS zZR{d$&79tD{<zD*_wzE}ip$H+%76dTQ8C%rUO>Vrx9?BQ?vBbmi_5d;pLjfXZ?t{u z@pro({Mz~|Pw<C!0e9Y-BXgflEp^OyeCw|IbnC%_gTI30*bB3_uJ<??`Y<8WZr$4> zy}viyFW#~IWS=*e&C{n!dc4!7Pj3(J-mzrgzJ-BLBG2rv2o!r!dRA}cx*uj=f9~J< z+x)4=JVzg1u^?%d^XWTscErXs?mfGLAvoUiX4Zw`-G_=rr_beUThaVA#ekt%$J9qw zCf4cq?Aa@snYKoL$YE<(aHDna+>E7c2h6MU!mIQiZwfv*^-81G`CR=(OYt?!w}nq; zTrfBK+U_~G>~^`dHytc%d?jYHS1LmN+q$J}rW>Ytoqy}(RALz6{dGkO!yoa@SFBd0 zmvFvazmoA^Z_{%3$NxF1uLn9y)k{Qlaa?RokllLJpY1@sqBn0)wA=Ix|8Ct%3e<6w z`_j61UFM8`Hrcc5BhNoPeDIb+-t@aOUX@Nycy;Ti-7ANVT}mt7z1{I}o4tm|2aUj1 znHa?+^Zvt4+TYZy3Jt534;-A+a5#uB?kwLg?;4vhSHaa>SCv=n++A?kqw|!wpxpV= zJ9;+@ryp*#-R>~&z{3d<H&pK&$(XLiz2n@{hN^!4Td!y3U%GmYuYOv|iwRNT{f8IC z&B!R%S#(z|JoR6}1a+sCj~8TqTh-Bbf7vSiMOsoNPakcX9kTz?fzx~^e!9G$G~?ci zyNt8$F0POe;lJ<xv1-wdS2J#Cw{+RvdHz)0?9uVEQ}XvdRjfO>td-mQ=eFBB-h?sV zKRKOYamQY-x$d_w6eLRCFY}IW)_DAZb=$mGth4uc-FUonfgsC|ZH<OZ`se%WHd{x& zN|-X|*Nw+F*I!)!^mbq7msls)#^+If2{Tk0{U=_DkqfqFaliRhsJ^|&yYS}MHCH$J zv`1`PqH>~<_0fINla62i{J)m@f4g#{-*1y8r8T!NY6LB9SGX(VD#YOVCu~VvfBO4+ zX-}29TaOg4a!#=Nu}wKpW$Oe5-d?571{GVGm*Lj$*<Iht^k1#u592<#ie-)5w6EC_ zSNs@$-+y?AbE?yZC;6>WAMW=&E0<eWkWqOdwf}a1XeGz$LxO)?_CL;#cQ$KHWqq?! zlkL;1;>3K(I{i1x`n~t1Dx|EqJ5Ss38N<{`{5PG-A9*^4UvpdNcTz93a+N%L>l-&# zjS%sQR+Vi&Z&`eIzS(*uT_>zKYeQ5pYhb*`+y%cj+rOGvs~nJMA@hYbX?>)7#Fk@L zL9N>akFBwLWw4|tq-n3HYlLn@<JE6hBXWzAuIfEp)11L<I;qs;HA|Sc)`qAMhm!1< z0yX9vcCBI#=Wm-^Y2hvKa#H8?7`-d=@3%DfHLjRBRrQ{b$O7|Q&W(w?s%}cI2wv{L z`svi~S5`)d{(ZMpGs@Nb*eZ=Ik*1xI&*kHKU&u_{_0auz%bS?`Y5L;jcT~I+C0~gg zU!`+1+`ROP?3wfL4y|Q5(Hj2QnNe&>_m0>AldJ=o;?6g8HFMJ&4hFW_zxa4N+-95e zw9cJxzXk9be&?D|{c1|o!hib>!&RU0)phTj<Pm%2%vakRckaGhknVqG!v=|KJl4Ip zW$pevT&nfEtFv@gY$5yGg;pD0=T{$CH(5P&>npk4WjFVJyZv*Y<H>T-)u~4XLccoA z{hVVRuVh}=d|OoG<O8P(o%_U^-mN*Hyo+J0v)PH8Mjkr@-|c?(rMC6zuB<h?{<^GF zGr8Yu|6=O(olLbtE*Z0B`)tcy^BzctKi<G{Y<<96rgb6_tNyQg!1a9Ri5Slkzo)W0 zez8gAEIDWYXr)+*Z_vW|Qp@cA2Yg5mkK4EAS>=NJ1?!mR1oIzn{PH)1qpHkhg$Pe> za)eaxrVX2K3I31@kIyc7;I&-ZA}?{uaxa-T|63GS9+Q3kNB>0VHv2<yS|J*Sii+01 zw|gJ&U)`%~xFNN<wsuF3ij3my1=pHVt`=G-3Eg?U>QhDD&D#4PdbcZFa%9=EHnH`V zD$CqxQ>DN|qAAsHW>`&_&1}k>ab%Os`O<UWdBcji3oVv=a_l;Hc(cc9{+|y{ZkTh| zL~nA<_q0i~UzM?ZbM4`=mVVQid}x=nw!*pErUj=$E$4Z&*iV`Lc(Td$z~d==uXf(i zW06&Nw|)A}n(4Zd!m41wYq8gjRQqqe=BxVtxS+22ba7yWxkEu{xtvHU=jurv&3+*d z`NYyr?+7~-E41Lf&WTnd_u8Jlk33&|QfcCFax%K!#N8nqx}&4Ka@~X<L3aaGUE5zs z9?M$DCDUwiMsow7cK>#d($K?K6kl(!-~H~4<kj%Tm38b|O$W}W9nUS_{etay4Ex?g z1%e#zGK-J0aap}?@%mlaF)!x4?)2x=9!R%b)_Qa9VB(9Mkfpp^LeCZOn%|0eGc`4) zZtkx~X)E6gtdm=r61i&o7Moq3M%>k_iUgRaTYTGp>n&f*Ie)2%0RbG=oAQo0P0o44 zH`DpAm-ZZU^%b&v<iALCxL(P!4&hn8Z6oUyvzX;`vi@{sOSH-Idj0gfpR4$4!lQ1T zt&h`M^P^pQ*WF@U<GSXB!bDe*sIuN<`!id`J$S=!yZpKFvF4S`5#KWFb*;|j>Miyy zH?t;&PSsmj$i7bQosex_lRZaZ*qMXMZ$4Ss1~#(FR6bE!E>M;>{b5w&oWlk4oLz1g zCzow~9#~uB{>|&{hW68r?{{r$EW2N@`hD8o{0%k+0grZTvhI6Sdsv{vX6yZV&zmRD z%HU7+%#dM{_4u;-!B?Hm<d+XDSGue%=vzC%FF5;R-jBbk|J<xaCjFX}`ulC!uOE8u z)}<>CN0y!K|5U@b=<lX%zSeh-4ql6EJ*OJYu-&|RO)W=fOoZd~nBGXo7+ZmY#4Pi$ zmFoi+s2T`-;_aT-yyI6|M3z>Yx9Cgxte@LfUo7J=X$f-s>a=j#x9vg`|GD`lU8`$v z>a#wq+SsVXROs6L!DF8Ejw+3u^2D#wD?4t*SDBw)x@OiIQSDgOsVn%u{(RV{q8P^U zG*!H^@|8_rbJQIbAs&X}PqNz!JFo4w-lMc*uFtL?ebGBo)?|i<T>LzBThNhm9+&WU zFR$g6U%q;O{=4c}%Ln@c>cZwtcc1>T<#AEi@)wqCKmPn|b3LXpQOMYi)$jK2Z+kPI z?AH7eD_YO8E9_#i%i`7Ff3B++kG;I>)5<)-TSbRN)_sdT|2?LRHLuSo)3-!U#7p<( zf*y{2w<l~<;`W^{Ze)M@s2``;V!Ipr*7zTc&#iC@I431!yWHf+s+vWIV++2241c`X z$fSGTWGUwZ&JuY&Mji(e_RoH}*HKla$}fY*w6*2oFOBB8A^)mp{r3A)558kO=VS7W z`7#U)*9;jL0=yZSL>NREI5;>M7#I{87M{(NE?{6_5MyLu5MkhDKn1?8A&$D9es21{ zj((nQuE8OCzHacD≀N#&I!lF))BkV^BoV&CI}w#NW@rz>sUC57&+Eko$H=rlc}4 zFod!&Fi4>2d<oI%YZP3XS(2)vl9-pDr(%e<fD_%gsYv&#qZ&7t8SD^L<BSLxhkOaJ z0*dR**-(u0$;5XxJGv{2kuHu!b>&TNY{n9BCGz!Mpxb5<!T*OB#ke36?w&<=GxAB* zpqs!DmK>G9V+nzK!O(3%K2#8N>NUa^do4V+U_ApH-E8CoUqHtaBFz3}g4b+phZLe4 z?u4`#6m(_`!th=8cnl9n#C~5Iy7ARWYn?$GN)g8Y@y26(NNRBjfy9Hn76P<Z8ewvE oB(li_j6p7JP>tD|iee1vGKv6iRyL50d<=XHGgufHW;cO&0QkDUk^lez literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m2/project/MOOCSettings.scala b/previous-exams/2021-midterm/m2/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m2/project/StudentTasks.scala b/previous-exams/2021-midterm/m2/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m2/project/build.properties b/previous-exams/2021-midterm/m2/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m2/project/buildSettings.sbt b/previous-exams/2021-midterm/m2/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m2/project/plugins.sbt b/previous-exams/2021-midterm/m2/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m2/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala b/previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala new file mode 100644 index 0000000..9f1aff5 --- /dev/null +++ b/previous-exams/2021-midterm/m2/src/main/scala/m2/Lib.scala @@ -0,0 +1,60 @@ +package m2 + +//////////////////////////////////////// +// NO NEED TO MODIFY THIS SOURCE FILE // +//////////////////////////////////////// + +trait Lib { + + /** If an array has `n` elements and `n < THRESHOLD`, then it should be processed sequentially */ + final val THRESHOLD: Int = 33 + + /** Compute the two values in parallel + * + * Note: Most tests just compute those two sequentially to make any bug simpler to debug + */ + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) + + /** A limited array. It only contains the required operations for this exercise. */ + trait Arr[T] { + /** Get the i-th element of the array (0-based) */ + def apply(i: Int): T + /** Update the i-th element of the array with the given value (0-based) */ + def update(i: Int, x: T): Unit + /** Number of elements in this array */ + def length: Int + /** Create a copy of this array without the first element */ + def tail: Arr[T] + /** Create a copy of this array by mapping all the elements with the given function */ + def map[U](f: T => U): Arr[U] + } + + object Arr { + /** Create an array with the given elements */ + def apply[T](xs: T*): Arr[T] = { + val arr: Arr[T] = Arr.ofLength(xs.length) + for i <- 0 until xs.length do arr(i) = xs(i) + arr + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def ofLength[T](n: Int): Arr[T] = + newArrOfLength(n) + + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def newArrOfLength[T](n: Int): Arr[T] + + /** A number representing `radicand^(1.0/degree)` */ + case class Root(radicand: Int, degree: Int) { + def toDouble: Double = scala.math.pow(radicand, 1.0/degree) + } + + /** Tree result of an upsweep operation. Specialized for `Root` results. */ + trait TreeRes { val res: Root } + /** Leaf result of an upsweep operation. Specialized for `Root` results. */ + case class Leaf(from: Int, to: Int, res: Root) extends TreeRes + /** Tree node result of an upsweep operation. Specialized for `Root` results. */ + case class Node(left: TreeRes, res: Root, right: TreeRes) extends TreeRes +} diff --git a/previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala b/previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala new file mode 100644 index 0000000..1710998 --- /dev/null +++ b/previous-exams/2021-midterm/m2/src/main/scala/m2/M2.scala @@ -0,0 +1,75 @@ +package m2 + + +trait M2 extends Lib { + // Functions and classes of Lib can be used in here + + /** Compute the rolling geometric mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., xn)` the result is + * `Arr(math.pow(x1, 1), math.pow((x1 + x2), 1.0/2), math.pow((x1 + x2 + x3), 1.0/3), ..., math.pow((x1 + x2 + x3 + ... + xn), 1.0/n))` + */ + def rollingGeoMeanParallel(arr: Arr[Int]): Arr[Double] = { + if (arr.length == 0) return Arr.ofLength(0) + + val out: Arr[Double] = Arr.ofLength(arr.length) + val tree = upsweep(arr, 0, arr.length) + downsweep(arr, Root(1, 0), tree, out) + out + } + + // No need to modify this + def scanOp(acc: Root, x: Root) = + Root(acc.radicand * x.radicand, acc.degree + x.degree) + + + def upsweep(input: Arr[Int], from: Int, to: Int): TreeRes = { + if (to - from < THRESHOLD) + Leaf(from, to, reduceSequential(input, from + 1, to, Root(input(from), 1))) + else { + val mid = from + (to - from)/2 + val (tL, tR) = parallel( + upsweep(input, from, mid), + upsweep(input, mid, to) + ) + Node(tL, scanOp(tL.res, tR.res), tR) + } + } + + + def downsweep(input: Arr[Int], a0: Root, tree: TreeRes, output: Arr[Double]): Unit = { + tree match { + case Node(left, _, right) => + parallel( + downsweep(input, a0, left, output), + downsweep(input, scanOp(a0, left.res), right, output) + ) + case Leaf(from, to, _) => + downsweepSequential(input, from, to, a0, output) + } + } + + + def downsweepSequential(input: Arr[Int], from: Int, to: Int, a0: Root, output: Arr[Double]): Unit = { + if (from < to) { + var i = from + var a = a0 + while (i < to) { + a = scanOp(a, Root(input(i), 1)) + output(i) = a.toDouble + i = i + 1 + } + } + } + + + def reduceSequential(input: Arr[Int], from: Int, to: Int, a0: Root): Root = { + var a = a0 + var i = from + while (i < to) { + a = scanOp(a, Root(input(i), 1)) + i = i + 1 + } + a + } +} diff --git a/previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala b/previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala new file mode 100644 index 0000000..a5b3a44 --- /dev/null +++ b/previous-exams/2021-midterm/m2/src/test/scala/m2/M2Suite.scala @@ -0,0 +1,175 @@ +package m2 + +class M2Suite extends munit.FunSuite { + + test("Rolling geometric mean result test (5pts)") { + RollingGeoMeanBasicLogicTest.basicTests() + RollingGeoMeanBasicLogicTest.normalTests() + RollingGeoMeanBasicLogicTest.largeTests() + } + + test("[TASK 1] Rolling geometric mean parallelism test (30pts)") { + RollingGeoMeanCallsToParallel.parallelismTest() + RollingGeoMeanParallel.basicTests() + RollingGeoMeanParallel.normalTests() + RollingGeoMeanParallel.largeTests() + } + + test("[TASK 2] Rolling geometric mean no `map` test (35pts)") { + RollingGeoMeanNoMap.basicTests() + RollingGeoMeanNoMap.normalTests() + RollingGeoMeanNoMap.largeTests() + } + + test("[TASK 3] Rolling geometric mean no `tail` test (30pts)") { + RollingGeoMeanNoTail.basicTests() + RollingGeoMeanNoTail.normalTests() + RollingGeoMeanNoTail.largeTests() + } + + + object RollingGeoMeanBasicLogicTest extends M2 with LibImpl with RollingGeoMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + object RollingGeoMeanCallsToParallel extends M2 with LibImpl with RollingGeoMeanTest { + private var count = 0 + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = + count += 1 + (op1, op2) + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + + def parallelismTest() = { + assertParallelCount(Arr(), 0) + assertParallelCount(Arr(1), 0) + assertParallelCount(Arr(1, 2, 3, 4), 0) + assertParallelCount(Arr(Array.tabulate(16)(identity): _*), 0) + assertParallelCount(Arr(Array.tabulate(32)(identity): _*), 0) + + assertParallelCount(Arr(Array.tabulate(33)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(64)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(128)(identity): _*), 6) + assertParallelCount(Arr(Array.tabulate(256)(identity): _*), 14) + assertParallelCount(Arr(Array.tabulate(1000)(identity): _*), 62) + assertParallelCount(Arr(Array.tabulate(1024)(identity): _*), 62) + } + + def assertParallelCount(arr: Arr[Int], expected: Int): Unit = { + try { + count = 0 + rollingGeoMeanParallel(arr) + assert(count == expected, { + val extra = if (expected == 0) "" else s" ${expected/2} for the `upsweep` and ${expected/2} for the `downsweep`" + s"\n$arr\n\nERROR: Expected $expected instead of $count calls to `parallel(...)` for an array of ${arr.length} elements. Current parallel threshold is $THRESHOLD.$extra" + }) + } finally { + count = 0 + } + } + + } + + object RollingGeoMeanNoMap extends M2 with LibImpl with RollingGeoMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def map[U](f: T => U): Arr[U] = throw Exception("Should not call Arr.map") + } + } + + object RollingGeoMeanNoTail extends M2 with LibImpl with RollingGeoMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def tail: Arr[T] = throw Exception("Should not call Arr.tail") + } + } + + object RollingGeoMeanParallel extends M2 with LibImpl with RollingGeoMeanTest { + import scala.concurrent.duration._ + val TIMEOUT = Duration(10, SECONDS) + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = { + import concurrent.ExecutionContext.Implicits.global + import scala.concurrent._ + Await.result(Future(op1).zip(Future(op2)), TIMEOUT) // FIXME not timing-out + } + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + trait LibImpl extends Lib { + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] + + def newArrOfLength[T](n: Int): Arr[T] = + newArrFrom(new Array(n)) + + class ArrImpl[T](val arr: Array[AnyRef]) extends Arr[T]: + def apply(i: Int): T = + arr(i).asInstanceOf[T] + def update(i: Int, x: T): Unit = + arr(i) = x.asInstanceOf[AnyRef] + def length: Int = + arr.length + def map[U](f: T => U): Arr[U] = + newArrFrom(arr.map(f.asInstanceOf[AnyRef => AnyRef])) + def tail: Arr[T] = + newArrFrom(arr.tail) + override def toString: String = + arr.mkString("Arr(", ", ", ")") + override def equals(that: Any): Boolean = + that match + case that: ArrImpl[_] => Array.equals(arr, that.arr) + case _ => false + } + + trait RollingGeoMeanTest extends M2 { + + def tabulate[T](n: Int)(f: Int => T): Arr[T] = + val arr = Arr.ofLength[T](n) + for i <- 0 until n do + arr(i) = f(i) + arr + + def asSeq(arr: Arr[Double]) = + val array = new Array[Double](arr.length) + for i <- 0 to (arr.length - 1) do + array(i) = arr(i) + array.toSeq + + def scanOp_(acc: Root, x: Root) = + Root(acc.radicand * x.radicand, acc.degree + x.degree) + + def result(ds: Seq[Int]): Arr[Double] = + Arr(ds.map(x => Root(x, 1)).scan(Root(1, 0))(scanOp_).tail.map(_.toDouble): _*) + + def check(input: Seq[Int]) = + assertEquals( + // .toString calls are a terrible kludge so that NaNs compare equal to eachother... + asSeq(rollingGeoMeanParallel(Arr(input: _*))).map(_.toString), + asSeq(result(input)).map(_.toString) + ) + + def basicTests() = { + check(Seq()) + check(Seq(1)) + check(Seq(1, 2, 3, 4)) + check(Seq(4, 4, 4, 4)) + } + + def normalTests() = { + check(Seq.tabulate(64)(identity)) + check(Seq(4, 4, 4, 4)) + check(Seq(4, 8, 6, 4)) + check(Seq(4, 3, 2, 1)) + check(Seq.tabulate(64)(identity).reverse) + check(Seq.tabulate(128)(i => 128 - 2*i).reverse) + } + + def largeTests() = { + check(Seq.tabulate(500)(identity)) + check(Seq.tabulate(512)(identity)) + check(Seq.tabulate(1_000)(identity)) + check(Seq.tabulate(10_000)(identity)) + } + } +} diff --git a/previous-exams/2021-midterm/m20.md b/previous-exams/2021-midterm/m20.md new file mode 100644 index 0000000..59f6c09 --- /dev/null +++ b/previous-exams/2021-midterm/m20.md @@ -0,0 +1,97 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m20 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m20 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will complete the definition of two concurrent data +structures **without using `synchronized`**: `SeqCount` and `MultiWriterSeqCount`. + +## Part 1: SeqCount (defined in `SeqCount.scala`) + +An instance of this class stores two integers (initially set to 0), the stored +values can be updated using `write` and retrieved using `copy`. Only one thread +at a time is allowed to call `write` but multiple threads can call `copy` at +once. + +Your task in this part is to implement `copy` such that this method never +returns _partially updated values_, for example given two threads operating +concurrently on a `SeqCount` `sc`: +```scala +// Thread 1 +sc.write(1, 2) +``` +```scala +// Thread 2 +val result = sc.copy() +``` +`result` must either be `(0, 0)` (since the initial values are 0) or `(1, 2)`, +but it must not be `(1, 0)`, `(0, 2)` or any other value. + +To successfully implement this method you will need to use `generation`: this +method returns the current value of a volatile variable which is initially set +to 0, gets incremented by one at the beginning of `write`, and incremented by +one again at the end of `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- Remember that a write to a volatile field _happens-before_ every subsequent + read of that field. +- `generation` will always be even when a write has completed and always +odd when a write is in progress. +- `copy` can be implemented as a tail-recursive method. + +## Part 2: MultiWriterSeqCount (defined in `MultiWriterSeqCount.scala`) + +Like `SeqCount`, this class stores two integers updated using `write` and +retrieved using `copy`, but unlike `SeqCount` multiple threads are allowed to +call `write` at the same time: these writes will all succeed but they are +allowed to complete in any order, for example given three threads operating +concurrently on a `MultiWriterSeqCount` `msc`: +```scala +// Thread 1 +msc.write(1, 2) +``` +```scala +// Thread 2 +msc.write(10, 20) +``` +```scala +// Thread 3 +val result = msc.copy() +``` +`result` must either be `(0, 0)`, `(1, 2)` or `(10, 20)`. + +In this class, the generation is stored in an atomic variable instead of a +volatible field therefore it's important to note that: +- a `set` on an atomic variable _happens-before_ every subsequent `get` of that + variable. +- A call to `compareAndSet` both gets and set an atomic variable. + +Your task in this part is to implement both `copy` and `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- you should be able to just copy-paste the implementation of `copy` you + implemented in Part 1 +- you will need to make use of `compareAndSetGeneration` in `write` +- `write` can be implemented as a tail-recursive method. diff --git a/previous-exams/2021-midterm/m20/.gitignore b/previous-exams/2021-midterm/m20/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m20/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m20/assignment.sbt b/previous-exams/2021-midterm/m20/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m20/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m20/build.sbt b/previous-exams/2021-midterm/m20/build.sbt new file mode 100644 index 0000000..8cd8c7a --- /dev/null +++ b/previous-exams/2021-midterm/m20/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m20" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m20.M20Suite" diff --git a/previous-exams/2021-midterm/m20/grading-tests.jar b/previous-exams/2021-midterm/m20/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..b6bb8fe06564ac4c2bec2396c5dfe7caa3b51e44 GIT binary patch literal 131660 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 z%0A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Ɵ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 PJ(3Izt6nfNFfafB9K_Nb literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m20/project/MOOCSettings.scala b/previous-exams/2021-midterm/m20/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m20/project/StudentTasks.scala b/previous-exams/2021-midterm/m20/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m20/project/build.properties b/previous-exams/2021-midterm/m20/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m20/project/buildSettings.sbt b/previous-exams/2021-midterm/m20/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m20/project/plugins.sbt b/previous-exams/2021-midterm/m20/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m20/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala new file mode 100644 index 0000000..89df220 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/MultiWriterSeqCount.scala @@ -0,0 +1,66 @@ +package m20 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Multi-writer, multi-reader data structure containing a pair of integers. */ +class MultiWriterSeqCount extends Monitor: + /** Do not directly use this variable, use `generation`, `setGeneration` and + * `compareAndSetGeneration` instead. + */ + protected val myGeneration: AbstractAtomicVariable[Int] = new AtomicVariable(0) + protected def generation: Int = myGeneration.get + protected def setGeneration(newGeneration: Int): Unit = + myGeneration.set(newGeneration) + protected def compareAndSetGeneration(expected: Int, newValue: Int): Boolean = + myGeneration.compareAndSet(expected, newValue) + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def write(newX: Int, newY: Int): Unit = + val old = generation + if old % 2 != 0 then + write(newX, newY) + else + if !compareAndSetGeneration(old, old + 1) then + write(newX, newY) + else + setX(newX) + setY(newY) + setGeneration(old + 2) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 0 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end MultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala new file mode 100644 index 0000000..ff95a2c --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/SeqCount.scala @@ -0,0 +1,53 @@ +package m20 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Single-writer, multi-reader data structure containing a pair of integers. */ +class SeqCount extends Monitor: + /** Do not directly use this variable, use `generation` and `setGeneration` instead. */ + @volatile protected var myGeneration: Int = 0 + protected def generation: Int = myGeneration + protected def setGeneration(newGeneration: Int): Unit = + myGeneration = newGeneration + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method must only be called from one thread at a time. + */ + final def write(newX: Int, newY: Int): Unit = + setGeneration(generation + 1) + setX(newX) + setY(newY) + setGeneration(generation + 1) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 0 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end SeqCount diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala new file mode 100644 index 0000000..b966283 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/AtomicVariable.scala @@ -0,0 +1,28 @@ +package m20.instrumentation + +import java.util.concurrent.atomic._ + +abstract class AbstractAtomicVariable[T] { + def get: T + def set(value: T): Unit + def compareAndSet(expect: T, newval: T) : Boolean +} + +class AtomicVariable[T](initial: T) extends AbstractAtomicVariable[T] { + + private val atomic = new AtomicReference[T](initial) + + override def get: T = atomic.get() + + override def set(value: T): Unit = atomic.set(value) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + val current = atomic.get + if (current == expected) { + atomic.compareAndSet(current, newValue) + } + else { + false + } + } +} diff --git a/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala new file mode 100644 index 0000000..bf844ac --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/main/scala/m20/instrumentation/Monitor.scala @@ -0,0 +1,23 @@ +package m20.instrumentation + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: =>T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala new file mode 100644 index 0000000..14e707c --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/TestSuite.scala @@ -0,0 +1,122 @@ +package m20 + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.collection.mutable.HashMap +import scala.util.Random +import instrumentation._ +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +enum ThreadResult: + case WriteError(error: String) + case WriteSuccess + case Read(result: (Int, Int)) +import ThreadResult._ + +class M20Suite extends munit.FunSuite: + /** If at least one thread resulted in an error, + * return `(false, errorMessage)` otherwise return `(true, "")`. + */ + def processResults(results: List[ThreadResult]): (Boolean, String) = + val success = (true, "") + results.foldLeft(success) { + case (acc @ (false, _), _) => + // Report the first error found + acc + case (_, WriteError(error)) => + (false, error) + case (_, Read((x, y))) if x + 1 != y => + (false, s"Read ($x, $y) but expected y to be ${x + 1}") + case (_, _: Read | WriteSuccess) => + success + } + + def randomList(length: Int): List[Int] = + List.fill(length)(Random.nextInt) + + test("SeqCount: single-threaded write and copy (1 pts)") { + val sc = new SeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("SeqCount: one write thread, two copy threads (4 pts)") { + testManySchedules(3, sched => + val sc = new SchedulableSeqCount(sched) + // Invariant in this test: y == x + 1 + sc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foldLeft(WriteSuccess) { + case (res: WriteError, _) => + // Report the first error found + res + case (_, i) => + sc.write(i, i + 1) + val writtenValues = (i, i + 1) + val readBack = sc.copy() + if writtenValues != readBack then + WriteError(s"Wrote $writtenValues but read back $readBack") + else + WriteSuccess + } + + def copyThread(): ThreadResult = + Read(sc.copy()) + + val threads = List( + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + test("MultiWriterSeqCount: single-threaded write and copy (1 pts)") { + val sc = new MultiWriterSeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("MultiWriterSeqCount: two write threads, two copy threads (4 pts)") { + testManySchedules(4, sched => + val msc = new SchedulableMultiWriterSeqCount(sched) + // Invariant in this test: y == x + 1 + msc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foreach(i => msc.write(i, i + 1)) + // Unlke in the SeqCount test, we do not verify that we can read back + // the values we wrote, because the other writer thread might have + // overwritten them already. + WriteSuccess + + def copyThread(): ThreadResult = + Read(msc.copy()) + + val threads = List( + () => writeThread(), + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + import scala.concurrent.duration._ + override val munitTimeout = 200.seconds +end M20Suite + diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..0b7e94f --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/MockedMonitor.scala @@ -0,0 +1,72 @@ +package m20.instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala new file mode 100644 index 0000000..bdc09b5 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Scheduler.scala @@ -0,0 +1,304 @@ +package m20.instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala new file mode 100644 index 0000000..e38dd2a --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +/* Copyright 2009-2015 EPFL, Lausanne */ +package m20.instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala new file mode 100644 index 0000000..b361ded --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestHelper.scala @@ -0,0 +1,124 @@ +package m20.instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 150 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala new file mode 100644 index 0000000..a6a1cac --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/instrumentation/TestUtils.scala @@ -0,0 +1,19 @@ +package m20.instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala b/previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala new file mode 100644 index 0000000..cffe5c5 --- /dev/null +++ b/previous-exams/2021-midterm/m20/src/test/scala/m20/overrides.scala @@ -0,0 +1,68 @@ +package m20 + +import instrumentation._ + +import scala.annotation.tailrec +import java.util.concurrent.atomic._ + +class SchedulableAtomicVariable[T](initial: T, scheduler: Scheduler, name: String) extends AbstractAtomicVariable[T]: + private val proxied: AtomicVariable[T] = new AtomicVariable[T](initial) + + override def get: T = scheduler.exec { + proxied.get + } (s"", Some(res => s"$name: get $res")) + + override def set(value: T): Unit = scheduler.exec { + proxied.set(value) + } (s"$name: set $value", None) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + scheduler.exec { + proxied.compareAndSet(expected, newValue) + } (s"$name: compareAndSet(expected = $expected, newValue = $newValue)", Some(res => s"$name: Did it set? $res") ) + } + +end SchedulableAtomicVariable + +class SchedulableSeqCount(val scheduler: Scheduler) extends SeqCount with LockFreeMonitor: + override def generation: Int = scheduler.exec { + super.generation + } ("", Some(res => s"generation is $res")) + override def setGeneration(newGeneration: Int): Unit = scheduler.exec { + super.setGeneration(newGeneration) + } ( s"setGeneration($newGeneration)", None ) + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableSeqCount + +class SchedulableMultiWriterSeqCount(val scheduler: Scheduler) extends MultiWriterSeqCount with LockFreeMonitor: + override protected val myGeneration: AbstractAtomicVariable[Int] = new SchedulableAtomicVariable(0, scheduler, "myGeneration") + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableMultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m21.md b/previous-exams/2021-midterm/m21.md new file mode 100644 index 0000000..fb11db8 --- /dev/null +++ b/previous-exams/2021-midterm/m21.md @@ -0,0 +1,97 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m21 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m21 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this question, you will complete the definition of two concurrent data +structures **without using `synchronized`**: `SeqCount` and `MultiWriterSeqCount`. + +## Part 1: SeqCount (defined in `SeqCount.scala`) + +An instance of this class stores two integers (initially set to 1), the stored +values can be updated using `write` and retrieved using `copy`. Only one thread +at a time is allowed to call `write` but multiple threads can call `copy` at +once. + +Your task in this part is to implement `copy` such that this method never +returns _partially updated values_, for example given two threads operating +concurrently on a `SeqCount` `sc`: +```scala +// Thread 1 +sc.write(1, 2) +``` +```scala +// Thread 2 +val result = sc.copy() +``` +`result` must either be `(0, 0)` (since the initial values are 0) or `(1, 2)`, +but it must not be `(1, 0)`, `(0, 2)` or any other value. + +To successfully implement this method you will need to use `generation`: this +method returns the current value of a volatile variable which is initially set +to 1, gets incremented by one at the beginning of `write`, and incremented by +one again at the end of `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- Remember that a write to a volatile field _happens-before_ every subsequent + read of that field. +- `generation` will always be odd when a write has completed and always +even when a write is in progress. +- `copy` can be implemented as a tail-recursive method. + +## Part 2: MultiWriterSeqCount (defined in `MultiWriterSeqCount.scala`) + +Like `SeqCount`, this class stores two integers updated using `write` and +retrieved using `copy`, but unlike `SeqCount` multiple threads are allowed to +call `write` at the same time: these writes will all succeed but they are +allowed to complete in any order, for example given three threads operating +concurrently on a `MultiWriterSeqCount` `msc`: +```scala +// Thread 1 +msc.write(1, 2) +``` +```scala +// Thread 2 +msc.write(10, 20) +``` +```scala +// Thread 3 +val result = msc.copy() +``` +`result` must either be `(0, 0)`, `(1, 2)` or `(10, 20)`. + +In this class, the generation is stored in an atomic variable instead of a +volatible field therefore it's important to note that: +- a `set` on an atomic variable _happens-before_ every subsequent `get` of that + variable. +- A call to `compareAndSet` both gets and set an atomic variable. + +Your task in this part is to implement both `copy` and `write`. + +**You are not allowed to use `synchronized` or directly call any of +`myGeneration`, `myX` or `myY` (use the pre-defined getters and setters +instead).** + +Hints: +- you should be able to just copy-paste the implementation of `copy` you + implemented in Part 1 +- you will need to make use of `compareAndSetGeneration` in `write` +- `write` can be implemented as a tail-recursive method. diff --git a/previous-exams/2021-midterm/m21/.gitignore b/previous-exams/2021-midterm/m21/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m21/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m21/assignment.sbt b/previous-exams/2021-midterm/m21/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m21/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m21/build.sbt b/previous-exams/2021-midterm/m21/build.sbt new file mode 100644 index 0000000..15c6258 --- /dev/null +++ b/previous-exams/2021-midterm/m21/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m21" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m21.M21Suite" diff --git a/previous-exams/2021-midterm/m21/grading-tests.jar b/previous-exams/2021-midterm/m21/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..879793e5498e751321315fff68817cea677fc435 GIT binary patch literal 131654 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 Hz`y_iDxhE- literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m21/project/MOOCSettings.scala b/previous-exams/2021-midterm/m21/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m21/project/StudentTasks.scala b/previous-exams/2021-midterm/m21/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m21/project/build.properties b/previous-exams/2021-midterm/m21/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m21/project/buildSettings.sbt b/previous-exams/2021-midterm/m21/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m21/project/plugins.sbt b/previous-exams/2021-midterm/m21/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m21/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala new file mode 100644 index 0000000..73a81fb --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/MultiWriterSeqCount.scala @@ -0,0 +1,66 @@ +package m21 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Multi-writer, multi-reader data structure containing a pair of integers. */ +class MultiWriterSeqCount extends Monitor: + /** Do not directly use this variable, use `generation`, `setGeneration` and + * `compareAndSetGeneration` instead. + */ + protected val myGeneration: AbstractAtomicVariable[Int] = new AtomicVariable(1) + protected def generation: Int = myGeneration.get + protected def setGeneration(newGeneration: Int): Unit = + myGeneration.set(newGeneration) + protected def compareAndSetGeneration(expected: Int, newValue: Int): Boolean = + myGeneration.compareAndSet(expected, newValue) + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def write(newX: Int, newY: Int): Unit = + val old = generation + if old % 2 != 1 then + write(newX, newY) + else + if !compareAndSetGeneration(old, old + 1) then + write(newX, newY) + else + setX(newX) + setY(newY) + setGeneration(old + 2) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 1 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end MultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala new file mode 100644 index 0000000..c17f45e --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/SeqCount.scala @@ -0,0 +1,53 @@ +package m21 + +import instrumentation._ + +import scala.annotation.tailrec + +/** Single-writer, multi-reader data structure containing a pair of integers. */ +class SeqCount extends Monitor: + /** Do not directly use this variable, use `generation` and `setGeneration` instead. */ + @volatile protected var myGeneration: Int = 1 + protected def generation: Int = myGeneration + protected def setGeneration(newGeneration: Int): Unit = + myGeneration = newGeneration + + /** Do not directly use this variable, use `x` and `setX` instead. */ + protected var myX: Int = 0 + protected def x: Int = myX + protected def setX(newX: Int): Unit = + myX = newX + + /** Do not directly use this variable, use `y` and `setY` instead. */ + protected var myY: Int = 0 + protected def y: Int = myY + protected def setY(newY: Int): Unit = + myY = newY + + /** Write new values into this data structure. + * This method must only be called from one thread at a time. + */ + final def write(newX: Int, newY: Int): Unit = + setGeneration(generation + 1) + setX(newX) + setY(newY) + setGeneration(generation + 1) + + /** Copy the values previously written into this data structure into a tuple. + * This method is always safe to call. + * The implementation of this method is not allowed to call `synchronized`. + */ + + @tailrec + final def copy(): (Int, Int) = + val old = generation + if old % 2 != 1 then + copy() + else + val result = (x, y) + if generation != old then + copy() + else + result + +end SeqCount diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala new file mode 100644 index 0000000..5a5d2f4 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/AtomicVariable.scala @@ -0,0 +1,28 @@ +package m21.instrumentation + +import java.util.concurrent.atomic._ + +abstract class AbstractAtomicVariable[T] { + def get: T + def set(value: T): Unit + def compareAndSet(expect: T, newval: T) : Boolean +} + +class AtomicVariable[T](initial: T) extends AbstractAtomicVariable[T] { + + private val atomic = new AtomicReference[T](initial) + + override def get: T = atomic.get() + + override def set(value: T): Unit = atomic.set(value) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + val current = atomic.get + if (current == expected) { + atomic.compareAndSet(current, newValue) + } + else { + false + } + } +} diff --git a/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala new file mode 100644 index 0000000..0655100 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/main/scala/m21/instrumentation/Monitor.scala @@ -0,0 +1,23 @@ +package m21.instrumentation + +class Dummy + +trait Monitor { + implicit val dummy: Dummy = new Dummy + + def wait()(implicit i: Dummy) = waitDefault() + + def synchronized[T](e: => T)(implicit i: Dummy) = synchronizedDefault(e) + + def notify()(implicit i: Dummy) = notifyDefault() + + def notifyAll()(implicit i: Dummy) = notifyAllDefault() + + private val lock = new AnyRef + + // Can be overriden. + def waitDefault(): Unit = lock.wait() + def synchronizedDefault[T](toExecute: =>T): T = lock.synchronized(toExecute) + def notifyDefault(): Unit = lock.notify() + def notifyAllDefault(): Unit = lock.notifyAll() +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala new file mode 100644 index 0000000..5038092 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/TestSuite.scala @@ -0,0 +1,122 @@ +package m21 + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.collection.mutable.HashMap +import scala.util.Random +import instrumentation._ +import instrumentation.TestHelper._ +import instrumentation.TestUtils._ + +enum ThreadResult: + case WriteError(error: String) + case WriteSuccess + case Read(result: (Int, Int)) +import ThreadResult._ + +class M21Suite extends munit.FunSuite: + /** If at least one thread resulted in an error, + * return `(false, errorMessage)` otherwise return `(true, "")`. + */ + def processResults(results: List[ThreadResult]): (Boolean, String) = + val success = (true, "") + results.foldLeft(success) { + case (acc @ (false, _), _) => + // Report the first error found + acc + case (_, WriteError(error)) => + (false, error) + case (_, Read((x, y))) if x + 1 != y => + (false, s"Read ($x, $y) but expected y to be ${x + 1}") + case (_, _: Read | WriteSuccess) => + success + } + + def randomList(length: Int): List[Int] = + List.fill(length)(Random.nextInt) + + test("SeqCount: single-threaded write and copy (1 pts)") { + val sc = new SeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("SeqCount: one write thread, two copy threads (4 pts)") { + testManySchedules(3, sched => + val sc = new SchedulableSeqCount(sched) + // Invariant in this test: y == x + 1 + sc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foldLeft(WriteSuccess) { + case (res: WriteError, _) => + // Report the first error found + res + case (_, i) => + sc.write(i, i + 1) + val writtenValues = (i, i + 1) + val readBack = sc.copy() + if writtenValues != readBack then + WriteError(s"Wrote $writtenValues but read back $readBack") + else + WriteSuccess + } + + def copyThread(): ThreadResult = + Read(sc.copy()) + + val threads = List( + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + test("MultiWriterSeqCount: single-threaded write and copy (1 pts)") { + val sc = new MultiWriterSeqCount + randomList(100).lazyZip(randomList(100)).foreach { (x, y) => + sc.write(x, y) + assertEquals(sc.copy(), (x, y)) + } + } + + test("MultiWriterSeqCount: two write threads, two copy threads (4 pts)") { + testManySchedules(4, sched => + val msc = new SchedulableMultiWriterSeqCount(sched) + // Invariant in this test: y == x + 1 + msc.write(0, 1) + + val randomValues = randomList(length = 5) + + def writeThread(): ThreadResult = + randomValues.foreach(i => msc.write(i, i + 1)) + // Unlke in the SeqCount test, we do not verify that we can read back + // the values we wrote, because the other writer thread might have + // overwritten them already. + WriteSuccess + + def copyThread(): ThreadResult = + Read(msc.copy()) + + val threads = List( + () => writeThread(), + () => writeThread(), + () => copyThread(), + () => copyThread() + ) + + (threads, results => processResults(results.asInstanceOf[List[ThreadResult]])) + ) + } + + import scala.concurrent.duration._ + override val munitTimeout = 200.seconds +end M21Suite + diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala new file mode 100644 index 0000000..f7629e1 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/MockedMonitor.scala @@ -0,0 +1,72 @@ +package m21.instrumentation + +trait MockedMonitor extends Monitor { + def scheduler: Scheduler + + // Can be overriden. + override def waitDefault() = { + scheduler.log("wait") + scheduler updateThreadState Wait(this, scheduler.threadLocks.tail) + } + override def synchronizedDefault[T](toExecute: =>T): T = { + scheduler.log("synchronized check") + val prevLocks = scheduler.threadLocks + scheduler updateThreadState Sync(this, prevLocks) // If this belongs to prevLocks, should just continue. + scheduler.log("synchronized -> enter") + try { + toExecute + } finally { + scheduler updateThreadState Running(prevLocks) + scheduler.log("synchronized -> out") + } + } + override def notifyDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => SyncUnique(this, state.locks) + case e => e + } + } + scheduler.log("notify") + } + override def notifyAllDefault() = { + scheduler mapOtherStates { + state => state match { + case Wait(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case SyncUnique(lockToAquire, locks) if lockToAquire == this => Sync(this, state.locks) + case e => e + } + } + scheduler.log("notifyAll") + } +} + +trait LockFreeMonitor extends Monitor { + override def waitDefault() = { + throw new Exception("Please use lock-free structures and do not use wait()") + } + override def synchronizedDefault[T](toExecute: =>T): T = { + throw new Exception("Please use lock-free structures and do not use synchronized()") + } + override def notifyDefault() = { + throw new Exception("Please use lock-free structures and do not use notify()") + } + override def notifyAllDefault() = { + throw new Exception("Please use lock-free structures and do not use notifyAll()") + } +} + + +abstract class ThreadState { + def locks: Seq[AnyRef] +} +trait CanContinueIfAcquiresLock extends ThreadState { + def lockToAquire: AnyRef +} +case object Start extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case object End extends ThreadState { def locks: Seq[AnyRef] = Seq.empty } +case class Wait(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState +case class SyncUnique(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Sync(lockToAquire: AnyRef, locks: Seq[AnyRef]) extends ThreadState with CanContinueIfAcquiresLock +case class Running(locks: Seq[AnyRef]) extends ThreadState +case class VariableReadWrite(locks: Seq[AnyRef]) extends ThreadState diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala new file mode 100644 index 0000000..cef9ac5 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Scheduler.scala @@ -0,0 +1,304 @@ +package m21.instrumentation + +import java.util.concurrent._; +import scala.concurrent.duration._ +import scala.collection.mutable._ +import Stats._ + +import java.util.concurrent.atomic.AtomicInteger + +sealed abstract class Result +case class RetVal(rets: List[Any]) extends Result +case class Except(msg: String, stackTrace: Array[StackTraceElement]) extends Result +case class Timeout(msg: String) extends Result + +/** + * A class that maintains schedule and a set of thread ids. + * The schedules are advanced after an operation of a SchedulableBuffer is performed. + * Note: the real schedule that is executed may deviate from the input schedule + * due to the adjustments that had to be made for locks + */ +class Scheduler(sched: List[Int]) { + val maxOps = 500 // a limit on the maximum number of operations the code is allowed to perform + + private var schedule = sched + private var numThreads = 0 + private val realToFakeThreadId = Map[Long, Int]() + private val opLog = ListBuffer[String]() // a mutable list (used for efficient concat) + private val threadStates = Map[Int, ThreadState]() + + /** + * Runs a set of operations in parallel as per the schedule. + * Each operation may consist of many primitive operations like reads or writes + * to shared data structure each of which should be executed using the function `exec`. + * @timeout in milliseconds + * @return true - all threads completed on time, false -some tests timed out. + */ + def runInParallel(timeout: Long, ops: List[() => Any]): Result = { + numThreads = ops.length + val threadRes = Array.fill(numThreads) { None: Any } + var exception: Option[Except] = None + val syncObject = new Object() + var completed = new AtomicInteger(0) + // create threads + val threads = ops.zipWithIndex.map { + case (op, i) => + new Thread(new Runnable() { + def run(): Unit = { + val fakeId = i + 1 + setThreadId(fakeId) + try { + updateThreadState(Start) + val res = op() + updateThreadState(End) + threadRes(i) = res + // notify the master thread if all threads have completed + if (completed.incrementAndGet() == ops.length) { + syncObject.synchronized { syncObject.notifyAll() } + } + } catch { + case e: Throwable if exception != None => // do nothing here and silently fail + case e: Throwable => + log(s"throw ${e.toString}") + exception = Some(Except(s"Thread $fakeId crashed on the following schedule: \n" + opLog.mkString("\n"), + e.getStackTrace)) + syncObject.synchronized { syncObject.notifyAll() } + //println(s"$fakeId: ${e.toString}") + //Runtime.getRuntime().halt(0) //exit the JVM and all running threads (no other way to kill other threads) + } + } + }) + } + // start all threads + threads.foreach(_.start()) + // wait for all threads to complete, or for an exception to be thrown, or for the time out to expire + var remTime = timeout + syncObject.synchronized { + timed { if(completed.get() != ops.length) syncObject.wait(timeout) } { time => remTime -= time } + } + if (exception.isDefined) { + exception.get + } else if (remTime <= 1) { // timeout ? using 1 instead of zero to allow for some errors + Timeout(opLog.mkString("\n")) + } else { + // every thing executed normally + RetVal(threadRes.toList) + } + } + + // Updates the state of the current thread + def updateThreadState(state: ThreadState): Unit = { + val tid = threadId + synchronized { + threadStates(tid) = state + } + state match { + case Sync(lockToAquire, locks) => + if (locks.indexOf(lockToAquire) < 0) waitForTurn else { + // Re-aqcuiring the same lock + updateThreadState(Running(lockToAquire +: locks)) + } + case Start => waitStart() + case End => removeFromSchedule(tid) + case Running(_) => + case _ => waitForTurn // Wait, SyncUnique, VariableReadWrite + } + } + + def waitStart(): Unit = { + //while (threadStates.size < numThreads) { + //Thread.sleep(1) + //} + synchronized { + if (threadStates.size < numThreads) { + wait() + } else { + notifyAll() + } + } + } + + def threadLocks = { + synchronized { + threadStates(threadId).locks + } + } + + def threadState = { + synchronized { + threadStates(threadId) + } + } + + def mapOtherStates(f: ThreadState => ThreadState) = { + val exception = threadId + synchronized { + for (k <- threadStates.keys if k != exception) { + threadStates(k) = f(threadStates(k)) + } + } + } + + def log(str: String) = { + if((realToFakeThreadId contains Thread.currentThread().getId())) { + val space = (" " * ((threadId - 1) * 2)) + val s = space + threadId + ":" + "\n".r.replaceAllIn(str, "\n" + space + " ") + opLog += s + } + } + + /** + * Executes a read or write operation to a global data structure as per the given schedule + * @param msg a message corresponding to the operation that will be logged + */ + def exec[T](primop: => T)(msg: => String, postMsg: => Option[T => String] = None): T = { + if(! (realToFakeThreadId contains Thread.currentThread().getId())) { + primop + } else { + updateThreadState(VariableReadWrite(threadLocks)) + val m = msg + if(m != "") log(m) + if (opLog.size > maxOps) + throw new Exception(s"Total number of reads/writes performed by threads exceed $maxOps. A possible deadlock!") + val res = primop + postMsg match { + case Some(m) => log(m(res)) + case None => + } + res + } + } + + private def setThreadId(fakeId: Int) = synchronized { + realToFakeThreadId(Thread.currentThread.getId) = fakeId + } + + def threadId = + try { + realToFakeThreadId(Thread.currentThread().getId()) + } catch { + case e: NoSuchElementException => + throw new Exception("You are accessing shared variables in the constructor. This is not allowed. The variables are already initialized!") + } + + private def isTurn(tid: Int) = synchronized { + (!schedule.isEmpty && schedule.head != tid) + } + + def canProceed(): Boolean = { + val tid = threadId + canContinue match { + case Some((i, state)) if i == tid => + //println(s"$tid: Runs ! Was in state $state") + canContinue = None + state match { + case Sync(lockToAquire, locks) => updateThreadState(Running(lockToAquire +: locks)) + case SyncUnique(lockToAquire, locks) => + mapOtherStates { + _ match { + case SyncUnique(lockToAquire2, locks2) if lockToAquire2 == lockToAquire => Wait(lockToAquire2, locks2) + case e => e + } + } + updateThreadState(Running(lockToAquire +: locks)) + case VariableReadWrite(locks) => updateThreadState(Running(locks)) + } + true + case Some((i, state)) => + //println(s"$tid: not my turn but $i !") + false + case None => + false + } + } + + var threadPreference = 0 // In the case the schedule is over, which thread should have the preference to execute. + + /** returns true if the thread can continue to execute, and false otherwise */ + def decide(): Option[(Int, ThreadState)] = { + if (!threadStates.isEmpty) { // The last thread who enters the decision loop takes the decision. + //println(s"$threadId: I'm taking a decision") + if (threadStates.values.forall { case e: Wait => true case _ => false }) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + throw new Exception(s"Deadlock: Thread$s $waiting $are waiting but all others have ended and cannot notify them.") + } else { + // Threads can be in Wait, Sync, SyncUnique, and VariableReadWrite mode. + // Let's determine which ones can continue. + val notFree = threadStates.collect { case (id, state) => state.locks }.flatten.toSet + val threadsNotBlocked = threadStates.toSeq.filter { + case (id, v: VariableReadWrite) => true + case (id, v: CanContinueIfAcquiresLock) => !notFree(v.lockToAquire) || (v.locks contains v.lockToAquire) + case _ => false + } + if (threadsNotBlocked.isEmpty) { + val waiting = threadStates.keys.map(_.toString).mkString(", ") + val s = if (threadStates.size > 1) "s" else "" + val are = if (threadStates.size > 1) "are" else "is" + val whoHasLock = threadStates.toSeq.flatMap { case (id, state) => state.locks.map(lock => (lock, id)) }.toMap + val reason = threadStates.collect { + case (id, state: CanContinueIfAcquiresLock) if !notFree(state.lockToAquire) => + s"Thread $id is waiting on lock ${state.lockToAquire} held by thread ${whoHasLock(state.lockToAquire)}" + }.mkString("\n") + throw new Exception(s"Deadlock: Thread$s $waiting are interlocked. Indeed:\n$reason") + } else if (threadsNotBlocked.size == 1) { // Do not consume the schedule if only one thread can execute. + Some(threadsNotBlocked(0)) + } else { + val next = schedule.indexWhere(t => threadsNotBlocked.exists { case (id, state) => id == t }) + if (next != -1) { + //println(s"$threadId: schedule is $schedule, next chosen is ${schedule(next)}") + val chosenOne = schedule(next) // TODO: Make schedule a mutable list. + schedule = schedule.take(next) ++ schedule.drop(next + 1) + Some((chosenOne, threadStates(chosenOne))) + } else { + threadPreference = (threadPreference + 1) % threadsNotBlocked.size + val chosenOne = threadsNotBlocked(threadPreference) // Maybe another strategy + Some(chosenOne) + //threadsNotBlocked.indexOf(threadId) >= 0 + /* + val tnb = threadsNotBlocked.map(_._1).mkString(",") + val s = if (schedule.isEmpty) "empty" else schedule.mkString(",") + val only = if (schedule.isEmpty) "" else " only" + throw new Exception(s"The schedule is $s but$only threads ${tnb} can continue")*/ + } + } + } + } else canContinue + } + + /** + * This will be called before a schedulable operation begins. + * This should not use synchronized + */ + var numThreadsWaiting = new AtomicInteger(0) + //var waitingForDecision = Map[Int, Option[Int]]() // Mapping from thread ids to a number indicating who is going to make the choice. + var canContinue: Option[(Int, ThreadState)] = None // The result of the decision thread Id of the thread authorized to continue. + private def waitForTurn = { + synchronized { + if (numThreadsWaiting.incrementAndGet() == threadStates.size) { + canContinue = decide() + notifyAll() + } + //waitingForDecision(threadId) = Some(numThreadsWaiting) + //println(s"$threadId Entering waiting with ticket number $numThreadsWaiting/${waitingForDecision.size}") + while (!canProceed()) wait() + } + numThreadsWaiting.decrementAndGet() + } + + /** + * To be invoked when a thread is about to complete + */ + private def removeFromSchedule(fakeid: Int) = synchronized { + //println(s"$fakeid: I'm taking a decision because I finished") + schedule = schedule.filterNot(_ == fakeid) + threadStates -= fakeid + if (numThreadsWaiting.get() == threadStates.size) { + canContinue = decide() + notifyAll() + } + } + + def getOperationLog() = opLog +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala new file mode 100644 index 0000000..6eb7239 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/Stats.scala @@ -0,0 +1,23 @@ +/* Copyright 2009-2015 EPFL, Lausanne */ +package m21.instrumentation + +import java.lang.management._ + +/** + * A collection of methods that can be used to collect run-time statistics about Leon programs. + * This is mostly used to test the resources properties of Leon programs + */ +object Stats { + def timed[T](code: => T)(cont: Long => Unit): T = { + var t1 = System.currentTimeMillis() + val r = code + cont((System.currentTimeMillis() - t1)) + r + } + + def withTime[T](code: => T): (T, Long) = { + var t1 = System.currentTimeMillis() + val r = code + (r, (System.currentTimeMillis() - t1)) + } +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala new file mode 100644 index 0000000..5be75d6 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestHelper.scala @@ -0,0 +1,124 @@ +package m21.instrumentation + +import scala.util.Random +import scala.collection.mutable.{Map => MutableMap} + +import Stats._ + +object TestHelper { + val noOfSchedules = 10000 // set this to 100k during deployment + val readWritesPerThread = 20 // maximum number of read/writes possible in one thread + val contextSwitchBound = 10 + val testTimeout = 150 // the total time out for a test in seconds + val schedTimeout = 15 // the total time out for execution of a schedule in secs + + // Helpers + /*def testManySchedules(op1: => Any): Unit = testManySchedules(List(() => op1)) + def testManySchedules(op1: => Any, op2: => Any): Unit = testManySchedules(List(() => op1, () => op2)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3)) + def testManySchedules(op1: => Any, op2: => Any, op3: => Any, op4: => Any): Unit = testManySchedules(List(() => op1, () => op2, () => op3, () => op4))*/ + + def testSequential[T](ops: Scheduler => Any)(assertions: T => (Boolean, String)) = + testManySchedules(1, + (sched: Scheduler) => { + (List(() => ops(sched)), + (res: List[Any]) => assertions(res.head.asInstanceOf[T])) + }) + + /** + * @numThreads number of threads + * @ops operations to be executed, one per thread + * @assertion as condition that will executed after all threads have completed (without exceptions) + * the arguments are the results of the threads + */ + def testManySchedules(numThreads: Int, + ops: Scheduler => + (List[() => Any], // Threads + List[Any] => (Boolean, String)) // Assertion + ) = { + var timeout = testTimeout * 1000L + val threadIds = (1 to numThreads) + //(1 to scheduleLength).flatMap(_ => threadIds).toList.permutations.take(noOfSchedules).foreach { + val schedules = (new ScheduleGenerator(numThreads)).schedules() + var schedsExplored = 0 + schedules.takeWhile(_ => schedsExplored <= noOfSchedules && timeout > 0).foreach { + //case _ if timeout <= 0 => // break + case schedule => + schedsExplored += 1 + val schedr = new Scheduler(schedule) + //println("Exploring Sched: "+schedule) + val (threadOps, assertion) = ops(schedr) + if (threadOps.size != numThreads) + throw new IllegalStateException(s"Number of threads: $numThreads, do not match operations of threads: $threadOps") + timed { schedr.runInParallel(schedTimeout * 1000, threadOps) } { t => timeout -= t } match { + case Timeout(msg) => + throw new java.lang.AssertionError("assertion failed\n"+"The schedule took too long to complete. A possible deadlock! \n"+msg) + case Except(msg, stkTrace) => + val traceStr = "Thread Stack trace: \n"+stkTrace.map(" at "+_.toString).mkString("\n") + throw new java.lang.AssertionError("assertion failed\n"+msg+"\n"+traceStr) + case RetVal(threadRes) => + // check the assertion + val (success, custom_msg) = assertion(threadRes) + if (!success) { + val msg = "The following schedule resulted in wrong results: \n" + custom_msg + "\n" + schedr.getOperationLog().mkString("\n") + throw new java.lang.AssertionError("Assertion failed: "+msg) + } + } + } + if (timeout <= 0) { + throw new java.lang.AssertionError("Test took too long to complete! Cannot check all schedules as your code is too slow!") + } + } + + /** + * A schedule generator that is based on the context bound + */ + class ScheduleGenerator(numThreads: Int) { + val scheduleLength = readWritesPerThread * numThreads + val rands = (1 to scheduleLength).map(i => new Random(0xcafe * i)) // random numbers for choosing a thread at each position + def schedules(): LazyList[List[Int]] = { + var contextSwitches = 0 + var contexts = List[Int]() // a stack of thread ids in the order of context-switches + val remainingOps = MutableMap[Int, Int]() + remainingOps ++= (1 to numThreads).map(i => (i, readWritesPerThread)) // num ops remaining in each thread + val liveThreads = (1 to numThreads).toSeq.toBuffer + + /** + * Updates remainingOps and liveThreads once a thread is chosen for a position in the schedule + */ + def updateState(tid: Int): Unit = { + val remOps = remainingOps(tid) + if (remOps == 0) { + liveThreads -= tid + } else { + remainingOps += (tid -> (remOps - 1)) + } + } + val schedule = rands.foldLeft(List[Int]()) { + case (acc, r) if contextSwitches < contextSwitchBound => + val tid = liveThreads(r.nextInt(liveThreads.size)) + contexts match { + case prev :: tail if prev != tid => // we have a new context switch here + contexts +:= tid + contextSwitches += 1 + case prev :: tail => + case _ => // init case + contexts +:= tid + } + updateState(tid) + acc :+ tid + case (acc, _) => // here context-bound has been reached so complete the schedule without any more context switches + if (!contexts.isEmpty) { + contexts = contexts.dropWhile(remainingOps(_) == 0) + } + val tid = contexts match { + case top :: tail => top + case _ => liveThreads(0) // here, there has to be threads that have not even started + } + updateState(tid) + acc :+ tid + } + schedule #:: schedules() + } + } +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala new file mode 100644 index 0000000..5da7604 --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/instrumentation/TestUtils.scala @@ -0,0 +1,19 @@ +package m21.instrumentation + +import scala.concurrent._ +import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext.Implicits.global + +object TestUtils { + def failsOrTimesOut[T](action: => T): Boolean = { + val asyncAction = Future { + action + } + try { + Await.result(asyncAction, 2000.millisecond) + } catch { + case _: Throwable => return true + } + return false + } +} diff --git a/previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala b/previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala new file mode 100644 index 0000000..92d0cec --- /dev/null +++ b/previous-exams/2021-midterm/m21/src/test/scala/m21/overrides.scala @@ -0,0 +1,68 @@ +package m21 + +import instrumentation._ + +import scala.annotation.tailrec +import java.util.concurrent.atomic._ + +class SchedulableAtomicVariable[T](initial: T, scheduler: Scheduler, name: String) extends AbstractAtomicVariable[T]: + private val proxied: AtomicVariable[T] = new AtomicVariable[T](initial) + + override def get: T = scheduler.exec { + proxied.get + } (s"", Some(res => s"$name: get $res")) + + override def set(value: T): Unit = scheduler.exec { + proxied.set(value) + } (s"$name: set $value", None) + + override def compareAndSet(expected: T, newValue: T): Boolean = { + scheduler.exec { + proxied.compareAndSet(expected, newValue) + } (s"$name: compareAndSet(expected = $expected, newValue = $newValue)", Some(res => s"$name: Did it set? $res") ) + } + +end SchedulableAtomicVariable + +class SchedulableSeqCount(val scheduler: Scheduler) extends SeqCount with LockFreeMonitor: + override def generation: Int = scheduler.exec { + super.generation + } ("", Some(res => s"generation is $res")) + override def setGeneration(newGeneration: Int): Unit = scheduler.exec { + super.setGeneration(newGeneration) + } ( s"setGeneration($newGeneration)", None ) + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableSeqCount + +class SchedulableMultiWriterSeqCount(val scheduler: Scheduler) extends MultiWriterSeqCount with LockFreeMonitor: + override protected val myGeneration: AbstractAtomicVariable[Int] = new SchedulableAtomicVariable(1, scheduler, "myGeneration") + + override def x: Int = scheduler.exec { + super.x + } ("", Some(res => s"x is $res")) + override def setX(newX: Int): Unit = scheduler.exec { + super.setX(newX) + } (s"setX($newX)", None) + + override def y: Int = scheduler.exec { + super.y + } ("", Some(res => s"y is $res")) + override def setY(newY: Int): Unit = scheduler.exec { + super.setY(newY) + } (s"setY($newY)", None) + +end SchedulableMultiWriterSeqCount diff --git a/previous-exams/2021-midterm/m3.md b/previous-exams/2021-midterm/m3.md new file mode 100644 index 0000000..ee3969e --- /dev/null +++ b/previous-exams/2021-midterm/m3.md @@ -0,0 +1,61 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m3 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m3 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +Given the following sequential implementation of a function that computes the sequence of rolling windowed averages, your task will be to complete and optimize a parallel version of this code. + +```scala +/** Compute the rolling windowed mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., x_n)` the result is + * `Arr(x1, (x1+x2)/2, (x1+x2+x3)/3, (x2+x3+x4)/3, ..., (x_{n-2}, x_{n-1}, x_n)/n)` + */ +def rollingWinMeanParallel(arr: Arr[Int]): Arr[Double] = { + // Transform all numbers to averages of window of size 1 + val arr1 = arr.map(x => AvgWin(x :: Nil)) + // Compute the rolling windowed average by combining the windows together + val arr2 = arr1.scan(AvgWin(Nil))((acc, x) => acc.pushAll(x)) + // Transform the windowed averages to Doubles + arr2.map(win => win.toDouble) + // Drop the extra initial element that was added by the scan + arr3.tail +``` + + This implementation has some issues: + - It does not use parallelism + - Creates two intermediate arrays by calling `map` + - Creates an extra intermediate arrays by calling `tail` + - Scan returns an extra element we do not need + + We want to parallelize and avoid the creation of the extra arrays. + As we are calling a `scan` the natural operations we need are `upsweep` and `downsweep`. + It is possible specialize those operations for our problem by letting those operations do the mapping. + It is also possible to change those operations to not generate the first element. + +We give you a version of `rollingWinMeanSequential` that partially implements the parallelization using `upsweep` and `downsweep`. + + Your tasks in the exercise will be to: + - TASK 1: Implement the parallelization of `upsweep` and `downsweep` + - TASK 2: Remove the calls to the `map` + - TASK 3: Remove the call to `tail` + + You can get partial points for solving part of the tasks. + The order of the tasks is a suggestion, you may do them in any order if that is simpler for you. + +Look at the `Lib` trait to find the definitions of functions and classes you can use (or already used). +In this question we use a `Arr` array class instead of the normal `Array`. You may assume that this class has the same performance characteristics as the normal array. `Arr` provides only a limited set of operations. diff --git a/previous-exams/2021-midterm/m3/.gitignore b/previous-exams/2021-midterm/m3/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m3/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m3/assignment.sbt b/previous-exams/2021-midterm/m3/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m3/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m3/build.sbt b/previous-exams/2021-midterm/m3/build.sbt new file mode 100644 index 0000000..b15645a --- /dev/null +++ b/previous-exams/2021-midterm/m3/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m3" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m3.M3Suite" diff --git a/previous-exams/2021-midterm/m3/grading-tests.jar b/previous-exams/2021-midterm/m3/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..dea8c3895d7df93482a29b4f7e0c85a5f13b7c12 GIT binary patch literal 34429 zcmWIWW@Zs#;Nak3U|>*WKn5ZVybQjsA&$D9es21{j((nQuE8OCzHXr*tPG4FKK}pz z?-T>WXWuiYeY|z`F7kToYMncCeshq)72^j_Kb_G%;d$2gthT2PBiF08lxa_vL}@-r zTQ+5h*wa_fq>@)OWSd`LmRcbF=DCExn}_m;PK(A&m^EkSw3$4?)22^~Z^;r`#g(*% zY39P$Gn>v!%z1Y(OJbGho*0GzZ*~ry%u0^}1_lN(Mh1oeZ)O%Q1_qGp(VWlBz{!wn ztPgiBNF{cUN<dWl8V8qVmZYkvB<AJksTk@d=Oh*v!?m{t=lWj`5UJCv)|~P%WltBE z^Xjr>BSz8ElupG76G|@MV0HHKdFPcXzPoz*I@5o;_7gpn<bD4H9=p75qNZ_P<on9X zbCvUo{l7ncem$Q-?y;rw!rh^{IX4$_#2kJQ<eBWuoE)*WO=wz%d`b1ZkC(nLE?$0h z)zxes@BeKX9>zYZC%^7HY<q5lQA_<|8~+oNw>z1|=*?bru)2+{*HK--v|B23M#2fc z8s5n~nq2=hEf-!b$PJiz#55-T!X%Z*POY|^fqPswDKFu8#dG_a_3J71k3#!TPky!f z+sfB0rmyXHWiNGZdwP0P+KbBdQztaOeqUR5Cr)9?l?@KR&R$C7E8ej%S<ss&wfKnc zbvF%(DR(bTJeb>7azU_m*3n(NtZ#X>{oc3nq=E4we&4JW6H5MWeK0Y2;yu0h7jOA! z$0d~7Pw_K3?Y1^0Hm|e5c)E)-vwcFu25YS^eceH<u2~O7Irsbd9uG{KVcgDgtI?ln zlH>J~87mAn@bg>_Kk<^O?CM7E_tRwyo-1eOe%$6>cTeb2Zrj~$uhl0uEnV?r!f&Nd zlM~)KcwN8$wPOGKOQz4hFL}JuZln2~1&jM6)p81zDg}PAT+0>x)wf%J(WxF;&x71O z7nK&Bm&o8bbNRDi<@<??^bLZ4_MI%&k(>MQnd{C?Wo=LOMf?(#>o&=loxHG8YD0j7 zaCC|&`_>3W?u}c!tgl#ZdUvQ}=evh>heFj$Le|eeY@;>h{D%)p*Mv*Y9SiN<@%j(L z*WIi8N<%c~FWhe*uq@b}FE~={af9j;!(Jydrzf2=6X*Pi{AIf^XO_)_%rjFCmDQwu z)Y1CG3QFA*pH|1DGBGfOvOrQd32D{{J<SIF^}p;OQP;Oo^i;yGMkOu2HMe+EPJK}B zn;^l&>DhkloMci`ku<N2T)FpkssFn5N)uh`Og{D-?YnN8cuexvmv?__<~`s0dj0+T z^$a%-aJN0m+<R@!?~NTy#~*rWr{85tj`-9jH1EZmx!;z2w&FRv?`D?iHYpzN|N0vZ z&Kb;AyZ$Ry&(gVa#lN}Jf>tc%cQR#O_pP*>`(?xiiJVnRCe0~{lN8NA==vC@X#Cjz zY|8aRXBHUuM(;S5u+(!?P$W;Wa%X31u!dl+;hqxvD)m3y>pj=?W#wC`JDO)zglp!9 z+~Vn;Ui*9Fl>Ds$fdcPp-m>lW$Vh#t=KCP*R^^$8(|Rj)3_|V-vfq_ZOuSHb+)b=p z^4Q|!i|I4I{@ZJ}YlaTL^YU{6QjN}wt*q2yc}|D-r_MN$Fr!fW-qWK2drCTOOdcw? zRsN4S{%OOSl8|N9(^FT)8!HH}xbSng^Q1o-DyK@eh)U~)brwX+vwiveL-2iF-lw?k za+RN~{wosf?cTB^N@-Tj`f%Gu<d}c+PurzU1<{}C>=!U=y;-sDN^Mdm+r^D`DKowt zo%kqFCTQc^*A{Qsb{{H9tNlFvk?64(9cPW%CUr}1SvT=Jr({**rC0twbCdr);MuOf zYPEKH#2>eZJXt4CeX4M3^S#^9uXOLRX5>>x{dW^vk3=0ZQj~seH>c$_qujC>X|@v! z<{Y-w2s{7bhtkF53B{hvrY?BK9;%ro_IgWL=5|fvxyhYu35={U?i2s$M5?};sZc*{ zpH=Gdlg2%4_RZ-h=N&G-{DU2oGP6P!aeFf{FlgXSnF^?-sZVB-XKq1`iepg`h(=4H zy<yqm!r>x!%@uuwn7j_KC$X9yJ?XqSDOY<+Sm3Q24A)qqx2{*@k(lH2$RKdT+FJYn zj`fZ4e*z*!!*6e0^Y_ZuU$b}Z+V%d7fV0t>Z_dx|&8dE8_j}In_cMRKo*zG-!J<{3 z<y)xR=F5v)t8QKs{`sk9U68R*x~_L0SIdFZkB=JvOntj;nyE>#rnU9{HPhd0>?{kO z=fE;y_VMnc8#@gf=dShRvSL|uUPiQptEBp2|Jo@g&cZKBu8X>`G?fT-Y%dNGD4uAu zyGf4mX!Mga-i{ACnrG>T@;0-a3N?;idHdF$h3PLBtrh(e-TCTKYHgrn%!3E@R@yJb zIV`PD_)UKEYu$G7=17%QrP0re>i5mv8zZkjJGI(LVd*c+9|>yfIa2=kJAW<hPvrmR zCUAhUk@@_!^jB?#E2GR#zB`oVx&EY$D37sh=sU?H3pMy274R_MP%pQacjahjwR$7{ zRJ8H0U5UBq;XP$5J?~ewY>7G>G5Ph*CHZ?ZmglHE51A6!&)H#AZ>e`Rn|sz;?l)n@ z|55|5$b3IFGh%5>%}3t5F`M!&B87}2E@m+~XWg^?xN_IaIo~@srcCbJ`S#9_Ir#^p zzk8k(f4<_^lWElk&+jznUH>_0ss4*@PS(dMHn!Dudi9Em8<h8_P8FSTV71_$rt2)b zbZRdK-plEoYX7ME%-dxW=Ms&)T0ZZ&m)mvkh;qMX<*eJ*79saK9+YlKsE)B0npAhw z(>Xd)Gt1khGB`nD|JhZ{hO&-w#!Q)8J6At;`u0zHr+%+@;JfPXr;j65zl27choA6I z2>bfdZte3OvK#XEa%s5Dd^V?P?;EXUb?v4zHmwpZWBEVJJX58uykIN$-5qXUH)?*_ z7C157U3;_m*A=?2UIkCK%iZi=Wv*`XX!3@9IjLu<a;l9RVs&qX-Hb_M4w_vXtG)Qh zyNIZ_o0jV{{+GM7j_?1wlQ+C~D4HI(zJ1Wtv}ZO`<Cy}9HH$pj0##R@I_n!GeznZ+ z|M5qYy?C}KxL#zBo9Op9EY>(IW%kFDZR#S$!bLZNcb7-Jt=W81@J$rU>K)n>zO3$y zpSkX6!13dO?|vP5IeC_D!3v{UH<tOT3C-4Tzq^j%Ry@D#<g2V@d)_szoto#Dy>*e! zt{kz{;Q1@VpOv28eB^WJrTvQ{Q-9t!cH?@g8oc?n*z=8ZGG9$wTtBz9Q*2e~>LvbD zm&UJ92u|P5zv1X+&BC73)7k9#9&P$t+;hpU<8RE*rvE;Dj(yE5&nWXO{qJ%;-=gBH zq0s*2m--DRRrM(I@02+*{ao;uN80SGo6n~n+tD4@_uHb*_w<HtR#DFbGf&PqG}BXz zvF30k!}*KHt~VW5JY9cDeabIMXM0ONBah|DF=Y+O>zdi$G%d;SR({;rQ^->g5+r?s zZ(dHTq0EfC>%5!iH$ApESStQOBVFC_6{DY__)Om$jAumTwkgc=m28*pNaPPZ7kA*L z+p*;t)q?sTH8=KGOO|`RQRk1EknO8kUUlM6-eJl9o4dE1TA}sYbW`7Ep%iBEW!DQ0 zC&wMnvDwmiT6)JPk^KKnuNk*oJCwDm^;W_<q3?U$bdOn7%ga{?7Wb&{ZQtg0#yF{p znfo^DrrAQ0w~ET-FD*;HsC}H}sY>lH=?kX|mGh2eOK*ra%r{T`X5JON{O-|R?yG|4 zbbcv$#?MlB#NnAHlkw{x9!m117vA4(7uwVRpt)_+&&E&YZ6Ymdu9FX3{}G+~#dK4> z+6OtWf5FG5x=+ZMqVIS+v*^Xq^dEN~U($Iq@tVuKUmUxc?|-W7SnT8#`zcz=dc)-8 zhRt!mz9owL=N-^a7PxPjEOFnP?>`f$gf5ElbMj_oU|{DVq3z%UDWTCy=GLIod6ykT zY|RUkCN1-uZP(BezOqrpW|PKhwN)%rwIYp5CU)>@tNRFt_w~w1*LBM>aUPk~?<8|v z%!L2Qq2l+l^NZijoca6n_3Q5$<~?4yz|8j59;;W!^OpGBmW{gneIB1+POO#uoWAEj z9-sU9A*feLw$gE8#-b7tmf4bTZ{|Fy=vy%7pK*N4!oKV#o5>~S%&%?;yoeNbtle6C z$X8avC5_dz=Ig|xkrF<v>}R)s+q6CJ^uODCv|oH>JHC3s<o|}%&5qw&zGU5c|L0KH zKZ{v2nhr19`)XUZ?p9N=N|7u*C#@UDzw$mQa1Jn7+-WWRW?isY$NBR@TmBb{WY7IL z*OdKA;r6E7E0eadGwHrPb=rKo{(X~Xi=Z0g#W!~)b?sWZ&-&Y34L(s;zvgnD(A!_H zzOJwed3Zpw>dwlWjO-74g?D+*%?;DJAO3LV^D}8(xu^ds@VUP_<NHta*U1MWt;b9X zwpmP?rPdi9#vl1~L$grX#^Y}UUnd`vN#1z(N6+l}&pOhAg!y|eJlZv1DZrh1M*8-G z-~IRGjO`qkeK)#ne5*JALfwOV;&;v`MwS=3UO$kyEL-Qry@mP0{4<_kd={0iGckVN z{B=#f$Fw%<8p)lPw3?@4w4V`_L^L?Nre9%XVCZJXmqheXEAgQGoSe+O^zh6)-_*oB zr^MpSWS{)>%;b>N;u00KgmX3`Jt6qI=)ZMq5>NL(6g<$->^bMiG)^<+%<P>4%w<Vh z$xR|b97k)#&Od9^;p7bqzhw5(qx|v~&+ki=a~oL-oTPVMURM2n?{~SE4Rzo5E&to& z`bquY!rkY7p4)lf_W7RbzaMV0%du>T(h++xBj&2@9<4d1#%{l-x#*-FQ_nMbe7H?6 ze);mV85)L(Zpv;}m)|uD%-HRIe|`D!FF#zqpSU5XJnQ2^w*%fi6D*%KyB}Emq2>dp ziI`(?WrmUD=Y@U?N~0!Un!x{+>FlY#nJ@UHHG}(Swtw9?<KbbQ#>j2YK9z*@zhtUA zT~=MM_4IH|qf{BoEAGuDdpr;5R$n=H_Wg9V+8OT8*X}#;W|HZutsFnzG&ZEIZ{w+* zlbv#I@vhdXzMZjb;nNCSOSwBHPD#u$ykr;S<WikbnU{a8{q&BcVwDXWCRywh?mocx za;mAq)aSNFa*nF|Rnk)m3~U54<>$)06%>$WeWi3gSCS*%T<F$;j}si$rf8S_xWHv3 zrnSh(<KjF+W8;<Tx5I@_q#d6$M_NlYfJ?h;&C{C;lh~dvN?Mr{c((B3?Rh8Cc;+n; z)0&|8{P&q1Gb5D^mM^YYSiJhc(bgMxrt}^)Q$J%N$j0Z^n{v$O!-kcimoM%Nb(UZE zF<JMQ=@+F4cJXV!AG+<|qIL0PbZz_FfPho{k8V{}6wW>1s`YAD@Xd;2b4+#}mb6WF ztK9G;z+2ML*<ZTZ%_b{@!&BP-pn<dg=G#vS*`2PYNo|k3E#7-mdTxA{(Gq#PEusBO zB{QQXI1ejJ=W*~}cs%WbNs%M3;GKYWgKgK6L^J0b7%4w~oY_3FpwfMX!>wO4=J~OA zs~wstQp;18cVz?b?Y}NNJP%Ke(37m5^{B|h*}Uq>kC&fZtWGB_UD+UdbFP=nhDjD) zS2;6l<2IJAp2K49mCbf+=~m9PAd5@#k_opr7J96kaYH%$TUEl}s~HiEQ!h2L1YZB% z?%5*z>e#}C=iW+vQ&hcr*@$J`*Ts^NK^|&s$yU9(1(%j6DL-J~^E&Fx#LHe{ytyh^ zDY<WUU@Y4;lP>A0kBmR~to)&~EJ@I|tSKX+clDCb=D#-v{CYHP=RqH>j;NE19%k7% za@~97zFKHXWsp*aYG0fBBhR1@N9(qDI$n#4bh_of(>v{OMz!5#_uIX-EUzRc?F=s7 zFn4J}+$t3v^VgcTV#X<suQaS~CVVvfJmtA{wxQbeTb5FD!lDna{_v{m$|JsC3zirC zjAQt2wCb_4XXCrRpl?m7hmDGwKP61n`nzM-q5f40CU<(Tdq2OYFt^(%?|F!XAbY09 zY#(_89;=&ShlHKgLw>PNn3>Ccd9C)G7li?rK9uco{`JvMtx3{9ZKn0Rk0D7x2c{<8 zx&GEmrsKBUmuVFSXX}a&s2)G0@!@&ni`e~>%f(q%Je1oL|LZTK)vE6&ygYU;;&*Kn z)nC2$R(SBe)(so=vo}n8*|R@2b&p?p-#5EivJN{Ihn}mMFYa^LbIzpd8H?^~CWo74 ziCAy@^QSMAE!EkQ?eDHtTKlyYe|G+{;maGxI=jcm7`1wP+IxPuq-|ew)HyZMYI#UY zn!fJ8rf2UY4=&vF=Z}P49KXHY!GQFotIxhjzByx_Vagi*oAc)!%(2npe%STtRKWDf z%eHP+y{5HZ^`PVhlNvVu>&}PMUvg%rIJa6%cJ^;i4UCQpTc>kUBUj36+wD1X&ZIrL z-tql(t<j$;N_%DIojlFWbnQcGjq9&JS8GhARNKq?pP7Z`t~=HAmA5AN)^D-xQ;aU% zjBuN1*gQLR`LoR?tCJo(O)#zDzd!xn--f3N;`uJQ#_~PtyKZ;93*BfnS@YT6aL>yh zOZ#sYs{K3vq4?!n{Rr{nPgs4mF1`MBs9~Dk%#)K`ewo%OPptEPTA^gR@_3HM+Kemf z9`aASA)jfmY`I#`oP&oNoa#5W{5xgg^=$unZR=B;7OF=WPVBzsVJ2xDHtDuce2Q!S z)1#`JE+rQEwl?nbNO3LjZI$#}|D<H4p=!472gkrYhoax?f0Dj6#qVy!|JZi-5Ay4# zN`81)Z*+0;NeTVrvwQxB{8;r+#`AFG!SAoK+Gj^T^^r6cT5zo2y=C_Ozb-|tsT*H% zt`fCt{1X-_8xsF`sjRtW<Mfp9`1m6e?@O9^E=<yY5V2+Ml&9A28FeLG`)19SQDLd7 zuw3)X^^pB<OS9X%3dQ77xVsIC@~`gsl6qNcLt?Jw_o~vlbB}%xDS5wPUe5`aDTRs0 zdVO!6G*nJKZ_*}Y)3LVd)Rg4vO?o+gN51-)9o=Up(l4#~bxL6Vn*ycTT~f`<rhIOB zs`%;PgGbrt53|SW+UH26ZO)zeUTU9u%qQE!VJFgCv%*(aD(1gh_0%<H>z?$@xl{B# zwsl)xZdZ5iNb4&TI(~H9*4K(x<{!J2yL`htp9Qa3%vk&q6%1MzYUWs}&DVdV^pksG zXXTq8Q?ChCZ4Nn;o<Fa(NiZjD{oJtB-ra}3?l`us)bi@n`)?la*m&{kk1LaJ6zZ3G z6)ZH^J7xL|-a9u}ti62J((*Ou9rnL+JKrV+rbcaM$+^sX=f#YrI%yO2<e%p)J$Rt- zjZNp>>l=12d8U%|dYW1Cr@q~R{tuo6J~(s9s;@2gq-x%&ly^?=Gfnc9g@0GuHj16+ zRC!yfKb?Pj#ge%7*XOMcEWT$v$GVuMxX5Ep?YD`==8t*qzIpn(guU!$N?zKl`Hye6 z&-=CEwN8xPjyvy)ZS1q3$ylxpEdExoZtn)aPG{Ynug+_}diuxY%AHxu(-`L&Gn>9M z%E~KTaBS}4w1rEa?KCsp{$xd=b-?4YCCC0+EP7U1@sH<9#i<oL&o)Z=_st6PJj<Pv zm3KPuap8hvk3D*y7rLC~{<uhT#m8xZ#k-kJ@5z|vPMS6S#+5ts79V@<(0hHN)ceP6 zQjOCerIsyxwUv9N`GyxPUy}Q#p3<6huV&(xM^AMgCgs`3HHL>hDDi!0>c0BOPT}>T z7V8hknw?|lUaPZxpTqS{ntLuvt~e`nlKJNcwLOt*e}54B7SmFreJ{;9@7eYfXSbPM z*t(;X>wVENo(QALGf^@V&#k<-duQzQS9{y{N-f$i{(ket@(nGg|4;q-^21c!cbYX9 zW*)gZEky4A{NvvrulN%AweR7MTeIcA7hU!B{{FBfH`Dy%o=*l(?V|4J&eOc}J}0|Z zb^7+DPjfSW?#;Ls7vg`beD%C7uNGcqFW6O7f9aLTIg8Kb`~E)7`Ssast?lW*wJh>$ zd5&t<Y`P`zYl>_a|HI3oid#AqzwFF%_F!Cj@A*eoQK$GL)8{Puoh>ePH-5g_uKj;s zEdFi%W8LIz`!(0L%0E1QYU}(5%l$0&uh}Lbv$3#l>V93(JiFi@bB%pYo^3z1zdYn$ zaOtV~vXFn#qNm>cm;JwBO31!@b~Bef{*izE?;+I<K7Z$l%q#M{-Q~AZ^StZi51YPl zU0t1eURBJ)_Rr*dS2_3RrtyCENj;QVlE+;#S7`I;i{0;+9=%zze1@}1tLCeV3eURO z+IK%=OW(0+_p*!{om0O3aXa0%d?>fxU(P!v>&vIwli!s3o^6hGxY?Q`UU=u!x1?>k zIny`ooszpdJnoGCanT&>o7@5SjuwhvH{Eu6kCRTwlJkPyD%t<R!&6nOYD-JG7#P}Q z@wIIA@wIH76LWHkL-GR>ixP8kQgc+$o3@dhH6h_w?bSD{>aSOvd7)LcWI^yO9|h*b zTqkBu71ft57gD@<7d%Y;G|6Y?+RYnQZq0Jc-kKFXJ#201(QB(56qhWVwkz!Qy3*^f zzW>y%`@QeC=>PBg%)Qg%JOb+eoq8{RulD=A&-Ty%z2Eu#-sfkn)0fXvU9|O&_OiAY zQuXg=HTqbrt^WOZqKAc9S+&Kr)!7@@MyX8VI#!<LY4WAxy6c&c+V(Ps&+c1p%-Em* zgU@zK*~H$HoD&=>Zn*NPwX>8=>^>RW(EIRRhSH-&T+4Pz=CXYi5zwCb%-j0mj(P|G zwyhpNI?QA)#+I;N7G0JWthL0|MD6H?x4Hgmu_0$uoSRn~-RC}@J@d^X*0(wT851wL zh99h4d^W^1mnVyRM$9wr$yt4DCAlKW-G;$8&-B0P=zk%xQ%rf&Om`l&(!KHiJ2NB& z&Wax{E;iEJC8w<B?!)cfDQs-Wu|_;jQs2j0Z(mwOb5PSkzxeR$4(S)HMP#Fn9<lWi zJ^1$TT;|)qnQni$cQ!=tMVE}_9iCH6tTEf1O0E`I$X*q?XUbso(okhJ^JPhqLz9$~ zcW4E8ER>jHBFcNpj>pRBqYuwMtGyq6qK;2m)o7zFQJ%+j{Lo9YWtCrBnR$0Rc-eWB zrzlOF`>}wBV{W@sm6B{<@>O$XpI6dlD@%m8YHw+^3dvgPD;nZ<TVzvk`v$EG2jf%s zzKmEsVgJl+;gcrs3e8#=>hw=+nRcqeugM?GWUl^Y&eWCVOI%z1uqdeiMU>b3OUa6{ zOYIVK+26XDEIWR<qv6<rIpy+cG5a({44>D0Et$>u_Qb>3D3#V1yLm5OyuJPHHV5@N z@d7g(*M%;<{W4T^OE=qT&esu!%a;Fka}T!Sh>w#$@p-%HqNPD=S!J1Ds?5pBeG!<c zzc-5UP<BX^r*BhF?WC{?kIheTb{@^t;F^ESCal0l(mo^SP2h??&e!3hQRYED+5H>L z{1Ox2^0^#y*kF63GriV-yF_O|NY4?Ols}tSZkaW!mAOOe_O)+}0*S4+F5kVoA$qAv zYRfN1LEhV<v;5l~6lc8X%1HLP9+BxJc(9-)PFp1Yct~*o_wwuSI+h<^{BVL=QV!cu zxs?^-dmT0I_1=wi=--(h66O86<#T>m#=;Lr^|o=Fg~wgFVXw7zIj_@)wOm&{9XFOP z<CLoQT-sZ*SfHleNlvljkM^ama*oYMj!AraX7+zV_<muBuXmHAZ}L@6lwIfL*L^z2 zLCN!~_?n#ThepX$*KfP#<fCW0J^OXfEv>!n_o6+YezE(pKy`DpJ^wqGkmJ9EeE$7< z`DUxwUa^U{wZy_!9qRw8T6c!iX(|83#fNtCb3b=dI^x~4p<{uMQfa{ThfC6>{5j?x z_!8{+CMQ@T?{0!?f9oW#`AZ%j>i17nZb|Os`PNr!BH3>=b?M_97nMIY8(wanmMM3} z;J(g>Evb$o8kPzb*Ylp<Rb^cD#nMXgj~%D`)=(u;r*#kBoY?%x<<a!dtIqB;Sa5&l z#fhg)j@<83ic61jFP8hP>tL|h^jb~4h|kjHnO<ie%KY(rr95*&+>40IM`g8nPt8i= z`LQ+6uWqW_^U5l}if^oQRv7+OnDWbwxhhA;R<EeA{G#4m^H`R&_1ZQ*o6GyJy<7D6 zr|7RNRn0FpPO>xC*{tPFSBi=f-*_)q&N6mpgonzZt4C)pRMO_np1nL$d+*9E=bDyX zGJhF8b;+ge4>^lcd^;`7+NVhgc&=Tk5i2=K@y3;<YwTru(=I(SIW+gPpI}{(VBEKJ z&z`C>uKuF*H{i#g#W7}5Ozmmh&&tl+ydxug&HrWkp?l{ImoAxi%H`6ep2#~oQKr)u zTB@7ru|_V9zqr1&yuPi(ph<gT`nT4?mSbNp)Jd-1JoC`La<5E_dmr7c`+EOh{}TQ1 z?R^D(zU-9+9vX*UpZdeCqdWWTB!^$szt|hU^au1EogAo}<g}7CKW^&3qXNIfC3-SW z8ro(X{AXJD-=O86aN(2_bI+gs>bg5IG~3hNEUI~?i%UM+_Lsf~uj(!ppPsPUH9fks z(f8nkSJ$=)8NbML`(Bb9bWOscH_)Of`py5&<kG15dp7>7XZ_n3cPwHe<CR%Si`9iD z9`^XM<NuT&tBNFVYt6iQZp*btX<@g5U3wV`w7yuk=|<aZ++}ieP1aQ96{#Z1Ys*ev zuE_i=r~M&wclPCF3sm=S&S-KvIq$qtX0&Gar1s~UR}QS0lC7(9AlIzv(8?7Z`cv;L z(GEHGd8U}?RI5j8?S;7?9etg2<x**5w?~KSlWeUYS#F7I<$SU_-$h7WzOW&K_iObo z{aIE^=bV|pr$bzuVdddT7rb|DFxGk(HAS<^Xzt$hJkzY>uU@JfE<5jCIdjID(hmnV zs5L(P`*jhU?wd*P?gbn?z4P7<q4My}{V&sE<~<MFRJqsro|4htI9;*+-n689SGCqB z%y&9n`P4?;{AR#*10(l3$3q*LKmJ{m(#_YOv9~Hp`l{2*iccH51*=1&RAMh2FIi)- z%r}&y=eYZ}?2QvU=6zy&^zrY^7FSL4$w?myoVN2U3Su?<%otd^dQaPRtvhF48?5|# z<9d;Q)#8Qk^76G5m9{R_aALXUR`37r$hlKYS<3fcuxac5EDDzwZA=td>X^&3dfUnc zCv@eea^DC$Xm0rG@2owSJFIGb{CDk;eJv$(=ceYjqQaA_KZV^3J1E<8@z|xV9f@p< zjr{MdIq<A(nOXPk3qDn0mfdj=<XAtJbDukAdspw>-kgiq*A&ecthL@4uzi<cweED@ zn%+~6%zw-p-WMhBj<x%+Rf}Kh!EVNV$9=b*=Gf==^t!|YXNLRF)qbb4#IG+p!647L z<DJ^^RF?Y-KJ8$XWBVbSR}|;=p;ybD_k+ZN$9YAZ1^J0ZcT);$PPTaSUvgG@xNOzU zV_S|W`HDYrQ9l1J>?eb~h*$fwoj*4GS+QmJtoZ7WRSTaqN4~Q;DSsiUc;7wWr#07e z)|sT+hdkl$zjS8hr@MdL9zLJ_;Q8$Ce7R)-rt+z~o(9S28)chzZr`!8>AseoL3+}| zE%pND`>b~U$n~-P_t8QqTWgi-<*G~a{!9K|tgxAKXy+`?WnZS)OUWH{xWaF|GUdel zV^P0(l`G|Y*S~)H=i4IvqGwBX_0B%>m+SuV_fwWmdJq)0cJn<;=F7EW(}n8H?G+Ba zc8p2*>dfiVZ+B?RFQG-|zbEcE_2b9X|2}&*FsS_2v{kSD+auP)J7H?@CcjPr*B><u z?m>p?vNH=(T;^!W2mJ{A$T`#Y>7N-7)Fxg?o^j5LTh9CO(UyZ+^;7KGRQ_39epJ={ zLR;j|5&;{&<u;2yE>X8#SN&~f{FHB%1%D1tJT5r*=fOM6C)7UulNos6IIquC`@`<6 z*U}&E3p%IXwP)K7#wk|CUJN!zpM*_0_wV1ne`5a2Ps;tVXs({FF5|tlH1~+GyzBYM zJ6tx38yCzgxwBb+cFU{Tvt~(s^PIkQhP$x2k@LUI0I7-dwL|RO4^Is_eEz||7Z;VQ zLi(2m`_5ZCGet<(UyQ5R?W>hse^13BO$8fmy8!;~+TSwEZibwTclo$L-b>xoB6gSC zqD>xZM^8OJyrA-yeq!5#?)`1mE6QE`XWB=;Ja(6t^&wmL?Z|KKy0u3HHt%9Ih>iZk z7~he1dUnA_^O;(0k3W`h{d?T@^}+lHN*RpSr`LYC{YSQS|IzzLKYp~mvrXyf<$#~; ze|XI`|0wk}to>yCO_VuPcgy~8Z<eEf<F7P7oUu<?SoYfFwEpNN6He&yN>rFzYqK3n zHq@Q#xoB<K@uaGtxQ$QV=Q4XVDDKtPd9uoS(;Ugm9-a3^S*~xHb?Ss4Ur~^y=89FT zS2T%r%(p0T)fcwU?O46*N2{aV^%Hes@^7CO+vZL<-&?YHO8&%8c^`iZ&GR-a65jf7 z*H`5|y@`8x&ZqXC4}NNS%cx@7wt3%8=PmTRANlH&Z&3gFvNop4C9gd{Zf5%*@yCD7 zC;tm8lmd+_9^U%8rDfNT<rTY6H7u@^ny|k`XL6chF;~#;%#xi~n*V9udaGCbe&&LO z%RQ_$U-LJ<ZrO8St>Ek<S3U}#j%$B!(rcsnEL20wcXeAs<}Npp-ZrCnM!DD*)?Cf| zf|vMS_@|o@mpywy#qmo&r&PQUT*XrGisj<ZrJ@zDO;y)#b$<5X@Rg#zXZ%f*4(syW zXF4wFHS@6_&;Ghb=NDTo&f3j>Q#{Z8{?ErI`rR$}%;okMn9psWt!v^@?YPhJh2N?r z+)o5QmtVYbI^@|Rquqa*#IC&9$>5i}>3q#vGj^*b7AF^OI>kMy>Y_cfseAF280Y+1 zty0y3rr#q1lFtWi4hSf|vgFx39n&)ItT)rH+=zF)BC~k=8K>UG9kZ%+R}`kKTq%5I z&)Fr<?&+BFac9X)yJ8XNc;$|J{`^*{bV1Ya(E*Ro1U(kKvgh)WXa96e{kXH{OuJ$c zZ+OLEZ}+`iwN+xqi>+$A&s{j-dD<sc#WP*c)9NMTlZ<tF;!C|a{T{3A{eMKJP;QyK z$~pEI&1!z?lh%4{*NcDL<ymz`>O^wKlZKctg1=VClwUl4L5umx@t4ACPyA&3%4|;8 z_IAHkds&$6GhcD?VV&jbEybI@X8LUR**4GRG~1W+7t(#d?Dcr~sJw)gZ+%R{{3XHH zRMwd;Df;2X7r$_M%lS>Ev(BB^scF&}Xst7MspsWO79Zv$86LF}yCH6&_EIuCI=3z6 z+_YJnmp*&8NUC_EZsL8t=tHZR!|eUfPdn!yF?Wf6)aUYzKT~tHEN35^bM((Xmv}wi zqn^KR#W=rsou;wR;l2jvLRXH3@6VXFs7%PIoxV@q`Ni)q%&TAg`?%EYyMJ28yZAp3 zFaGteI(cfV{ruJ0`xow?u<ozw->IVK?w>Oiv`KvQC-&X8Df@r=T(XZm?6do)!_WD; zQ~&4Yo%)}*@=ttmfZOl=FY6Ulr?j7$y7Kcw8IBv@ABt6W>6zG_<y$8D=|895`OT|6 z)bb8&-j{IpRneI%g{<0_B4ooit(a4%R`Rm`;p(o>Ck$@2#j1ZlYMCYR#dO}&S&zPc z7X1*nW4m11N7kUEBGIU=kz%JrQZzF@WzNrUT5ofdJNLYX@Sc<=+ijfR(yZT}*Jw7Y zj(^#3T0&xr^)EKrbNd{ZpLTj7VjdFiU#NXi^IlQcZnYiNP0Z&%@?{5}7vVn>Sn^V2 ze->My`@|R1H0!?Jamjx1PE&54<F;FoDrZcNCL42xi*nwsvpza;X3OoambVW3J|`Xe zxgghVh0xjq_q}!ru?7n-s%GGPr8gz8e{oBd;LmSNYafelna7^VEWfz-C&Tm0HyOn3 z@6Fg)CUn#J$q%zg#h+5@7PZz+doORV=(^wFkbUHH+@j)|`w6=H7w>wkvp>5@-pX&P z^^!xUK7T3<a(k*3xkz%lc#NIUj-nk)Zl4bPDd?p!Y3ps@8=1K~Zs)i$lrPv)bogiP ziqG3bb7pRf3D_?AGib{X+eZfs4qJPg{)wxb@0xfua!>TGHC)<t|K%6|`5?dUjhK9@ z@6$Nr-C><?HoY(`y4gSZ?zfaaSN5qZqq$C>Jj*J*U+Z|FsJ)WE=Jp?bSx*1iY`R)) zx83+A5qjkldw=j_%es;eI`uoI*&7|4AMvKc=fm=>pPfzLCTIA6cwY8|#eWgAVd1W6 z>Mb)wX1RF((2if$a^Uix%848wtKxcmKZrj$J^jO`OAa=H5)xB6y4Q<exi|accGiiv z=j|?ByEOXe=|7^DRXXNplmCPoi}Zc`tR%8Zw61aU^Xj!b1@!KV{GafmC1m60^B@1` zxkU3ylvvMv_PA2@-nwI-r8IPo6bs&a{UN4lIs5sg6>;s$uWNe!ds@Ogk2m9|LVVkI zx1QA%>k5qiJE?uB{NrsSzrgDr!|dKS$M0)xz8imG-`)j#w=Y;Ly2YLQ)^F}xoiWyj z-G7ws{AOFj^Y;B@rqzEpY!J^_e8I=zm0X?Yg%8!BX~s7ONxbTU3=Avv@D0YO;v0<d z%lAzzz!-vwD6bJYF8c3TiR-TDE|pm<MhWvbPB3t4c<Zv9foX}tPnE=XJ<Ywn;m5sn z=Da&18YQK<#KLyt<Qp%~F0tTDVBX~EvrBmS_j}dvJ1;BTKlARZsL(h2JMY_<?ft&j z{QjQrWo_=~ZNC^aTus_{;Lyd;+`p@pB8`(-wyQiYG&U@nJoAP5mm?0F;^n!2DX^ry zyY~HMZlSH=B{PdHw>wg6RtS9vGR@)p`9Sc4hJ<_#Q>kl5%sW}x?%x5*7fco|T`^HD z$su9drew9-N^YmFJbtEFtC9D^z&Bym+MPDCmmlwHxW7sEjn~qe8JYn{`y3V+cprbw zdS{dS+dF^kGB34TmfU;A?V}&LII6kfyc|cyx2zi%+IMbiunxU@=#)dz@`F=bV*>9o zC7Gm3ME7jrpDuh+ZptO$E5avTHr#F3UMqX^vt5iU?`-Q$k4p4dR;f(n;raH(W!K_^ zvWu<5I6CYaXT4aadv~I5^TS@5?_43?UXR-O)+y;eRNChx5^I=}=Ek{imV+7Vv?pf@ zG`)i&J|^h;^NU|r5f>Fr?au1!zL#J$+pr=gYR86j%lnyXXU<49N}fH+?Y*5VCXC}i zV~))}%S^S73$+SqJ*j6@{J&`OG(KAzZQ8QoTEA(;@`op1tZ3wZ{kI@_E_hOL!Ob!a zm8ZKe3O9)Ri_Tc<v|4wnZ_1g##k!L&8mILvcR#mfilF(IEf<qjlG@r{FYUE!k&K@i zt9HJmuws(Vqj#&UlMAcsi@kMQzdEyTfA!I1@e8(j)&CzHlRkX6WQ(FrV~mG0%SEZ2 zgS}THJh!>`oO$q};8p^IP9~rDj#~oPFTV`9=%O-tQTD>6wNmria_f}ttVxtyH_atC zT;y9;M4y@EJw^Vc%*c)_;u{w24m$ZatcfqM)Fo<uaL!#V(S>%Ix#~Qbxicb#I?G&l z-!%LF_0-f@gQutR_}9cwZ4=Fy&Szk`+N{LYqeVC?KL34?m3`aZAX`=ceaHJF7l_*# zT@=3V&hpGMGiW0Fe*WJ}A2BxG`nzjpr0s+=GY+TuO#f)om^44gre(SJ(R2gm?iU+B zI~~?qGwq!H?S8kH-O<ZfgjXnJJ?&`AE?6s4vrpdFD`1&>=YpyFQtJ*+Uh<&(Z-feK zq<d;C@4E+jGg+*gezM#bH2Eg9VrTd=pR0`u+6U%@c$(y03$C)s+pxmKOnh$6iXSs7 zPZiJIDlxhH?G+y16>A@cR+KVat>CS_5WLewzoA<4YUe@2#%<4nzB#2HHY#%d1fEpf zcBo&|F=L1HcMtHS;!%l5qHZkCho;MVzc=Tx+PR`dz0GgOmR+aMY-@daE!6Leg+^wD z^*zPE73#tVeR@(;8F-dYTFkW0XOiSz<DK@2)fWOE9c1}^mT|fa_u>Qd*%y_^`rV5a zS<v?Vq20^xzhAD{=OpHEO0-s<YfVMuldJn)eb#g7*&Ers)hGRruJ+^7Ma5gb8=hut zv5tCr<~!>_lQ~B;ceY>tVx9Wt%(0%N<J01AY&^AKjqdRU@z;G$u0Qp{rkUUKyxp1g zX@_q3FFp8h!$gUbZzgTsv0cYIeM;AbH=;-7&)s>deI<I@eEFltnLa#z%u^b+>s624 zl-}2p&c~|O|2_Hgq*~G@fo;>n+h)x%S-VzuV_2m$r*G4;hnIi&Fi6QQRbMl4tLP&i zK3my|uDO+wJ2$B$Z^_iSX;xffGJ9gY@;%w_r#=LCec4oRq_58vad`TN)R&*bKV9v( ze==*gdogpcnfcMCucbB4w|=XEClxE)CK`4^CKZ<-Id)Vb`-k2>^}WCCP9OA(YZ3FU zGnjWnPkEdB(N`(UW_*uR^*w&wKJoa>ANEJjFWGLN9xHR{a+;6UrPmIL4&KxK(>#^_ za_yhyv43Ha(oCtVkIklpnQ&$O*sJ=DU8?8xN<roH4F(G?%-3DG-=Oc<r~A*Ro=v^E zK`8_@tC&%yleb1?`^<A0)$UJ^s_uf!DxS;OV!LJ8A)e*oMZ2!dn6y>wN1sOAL)~xl zKW&aOTAsJ&|Ehz@Kg_S6;`#9*e&&nh<d4ldU!b#!=h#2kU*lX;wqs`Kxha9p3=cm& zHawV~9a^+z@1`4TI97_@TlP0B@@-)J<D+M{TY#n&)6=g^yzdE`R(x-ze$Z21<kebb zraB!#sr?)I1orfPSXQAZ@bAs^8zrx=MOJj1imkkLe`3>@slty=P0%~B(|m>YTNAsb zN!1w!T9X5hwaqkO+qBr(?bN)L-0GDQ(WQ33EVrp=D?RgYI-e5!CVOvZ%fz7bl0VzN zxlg(oa^{8M(mCo%{6cT{DD8guFnZlAd2`;&H_c9L=e;kY_j6gI_LIv_TeYw5nXtX| z>L;UhQTMjqyms=q@@>{RoC}4Wt`wI@7slkwj*@qLz;i9fx_8}X-L>i)7d|yH+t!nO z+2U9KY4x5Ns{fnRjc3d5zw~OcIdc+Ub+L{JPeQ=nidj=k-*L^}cx~I(mRFz5|FUem zw)0h<RcrLS<7<UtG<@`*s;23dm(5;#nQdX3tuFtAZ@-^x>vo-*c~)qH@Aaa^yO!!K z1I;S-T}U|1d8dj?`Sp$1h*GZVYx?tAf6V=^;PBvy;e$7ir22m4o@~uKwdB3qamh2c z+|)M7&YQ+|-V-vbXjZW#uKoJF)j`GgHqWuH7BL3RDn7gTxxH{&URi?lHs!R*J0%(C zJpbK3@0Wlz`*eQ2?Z5YwR?V^W_gj5sj_sUG{Wal_0=(B9sC3;sXMV#h<;tvQ4<jcB zJl0$MYy-3DI~mj7Nwc2cxFT~d@NwCKV{bire+w;owzJ}%3TRHz@{vQYy1Vb>CC^yR zOf6N`A8(ZES2msJ-7!o2k?Z7u$GVH3@v&#^vCI<l%!*42E_UyeTF-16=bp7^I*%!n z{?XHKoUSH{2j!psGkM3~9mz{KbuBTESJ_*!Q>Vaq_Xn;$o0yiD%9P8^Ryr43vG!1< zY+U~1lFc_x6}`^Rj5X^sw_?`a<nqbEZVzXE*lW8zt+wKd_q(>=oG|;RZqeqod6}^n zO!~?#ledB96tnJV&kf$Y_|7`-ulLTziC(<l{QcI8+mVN!{-6Hy<%g@h?+R-UAk8T@ zUrN7f-S#*uzi!ThRkNqPJI=gqY3z~Drw&i~ol#(3am?^t4$e8nj{#5rExB4~^XAO` z)^F1{zdV0?%Qv0x<zn(Hd5#v=B&|~X;%O~n-|DXAlws%mVskLBBI}Z>`G=o}a?~=$ zmvp^bAD2^7pWF1}-?hj6@A4m8`>p$%uxj030sEkJe<kb-5B)qE!hLYB**X2s+m{|X zn=Z4zv`us8&w!uheW&W@%=$E6X6k<{*3@tR+x7>0Y28nl@AH@Q&+@O1iY(Js?qA-r zd(P$8-F_?W&b#jYz>&Q-?#GSd&YeO0{}+^BU3AQB^SsJsMh|(W<z(kt>Mj$#uy%Lm zjQ?HlmmQTXoj$|Qq*eRR3Q^-DKJCAswH39q&v`d{(YH>G>$Y`IwG8{~^PicopB7Xa zx6k<Ixn~)Aw=1XQrdZE^thR0X#@HiehPSnEuxajhxp>jTY1YOm$>O)g)@A2J?{zZK zc$D7ZrunTN)Rvtpa^QXe7Xw2g-ibvu{B7Bg#LOJb#%yIx$W_sQ?^33vJlm*}=xrcX za%6%+W5czyAOQnSPjyZMW--@~sTG|5@o8<5E-%u=ci-51b=$4l%X-^fMLI5dl}GP> z|9jv2>TL6myT9+f8SinSe$M^=J8$Q_pY!`}@wwg8+vRrtXJmMNB&hM*$*p$}XD3%0 zr?+fhu5;SQFD6f|o!8cKQrGKcqI?b<XZDBfk9)uE%M+LHFK%pgQxbQW+c1AuV6hIv z{09GrECK=<TFp;BJxIC5wZL&fZd7ogviFe*2bfZi`;;E<=~)^5OtJQi5z`E1gX0%t zrux2^rYEo^x7|F=i1Cd0iez_%kXcI~pJj@>xwtIxUsa}2gKNpXcid;zMl6o%b~qr( zk#R2T%7x=Q%f!l8?OHl@;+42&?dJuqrQRJMdlGZZH!;rfc1aKL^pEggHtFF!hI8A? zpPXSYU^JC^$0D{%j%Q+4qzda|X6B9mDk{!DnRk^b$zy@yzSQdaoYNU!jQZGFU#Y5J zTiE>ig!h)74IHlF{WEuZ+RE<haNuL#_T*27s&7z)V50u{-f5pz#6`tJLG9Up1zPis zE8?QIY{|5|pRRWHPE}*2>{D*-GOjtXT?Z!aNzL`0>8bSP{se<dmc~bwYq^paBp>zT z70lsCvemo#A?1tNfo5OFio%uP_Uwwog&Imve;W!k$@{CG*V?wr_-D$wIVQW3Ep5}) zDr%nioR*ljFuj*id8UDhjqfc9rzwonZl`|=INy72iu;|o+W137W;=FV3JI|<DOjGD zD(QZ^;?v>9)8BS{yL@@t3zH&2Uc)2O8)U6tU3A{1-gD>0kBVyvEIRKyrk%Kz^YUiS zk{qRJr!Q<j(WS`ie|(*S;JOPNgv7m;m1*;_o33%%F7tk(`o=|CZnL~2KGx2>!f5S! ze1(<bT79kUdE(tCCT!Uz-nPZ;oK5FZ^JBknmhteOnp$h{^wd_n8~d$zS8sH)I`C!9 z?LCHWN_PU<+1SG`{51LI{k6yDSEGVhLmbPABMnRaIdlpyFH!RUS0yu{%bdeR?!wtS zyC#O5lQ9?G#j_$)q<zXGMH^==yUCgnZvB%bq^>2+E%|5ZxWy}ekCFNeN7X=UPm`FI z?xhd7n=*o%jO?{o-nLx)pc13R8ZYFsTO>tw>QvJ`?YmRN-f)T=*ZAMK;lH5Iai(#p zc}padSgO{c!qxLG>Yh%B%zUe1ebeKo;pZvhyFqK@EO$!I1g(+#I7{Hw$EaTm(zz<* zn7$jYn!Gr(@m-(SH>J?ST1Co`=IoAR{gI9tJ9xKyKfk9j*IPy6k*OPtv(g0rbbbl8 zxjE|}bS@NLyXL*oX4%ADrH#_IdR|iZ8q2-x?;Uk9nEY}NPs2x_te^vvy$u(CU&f~* z%U`8!Gb3$3>w~W3L=l#5hc9`HXP2k5ta$i$hc|eM-1=#v6N*yhJA}0B!Ya3}f3}F* zFuDF-g6?I>dhOK}bKl9#t<@=DeAstw*XP<O177z+pLY)}{+^Sl{>-`f&c@K?<!j6| zq*oihxbC|7(`qv-{|ARJZSMcDd8P?pKxT<emWq1O?-X6RHK#6BPE|6gj{7-%bHU#( zp0KCSkAL_m(DZ}FdG6G8cFX&p>e{BCh>$O_vt<66;v{y+^y<`w3l)5`rM1>vjdNEr zUXb~N$4<Jbt^EaOc1m)u#boF6$5H~LLqpf)oMeG5k$e8+ddK$Tf8k5yjNwb<l1v|! zZ@TyL;++#~&Ys<rP|JLO%C~(-byItC?w!&!N-Nm>>I&1gXKQX)2&eGgKm2`ZxqX7= zjnlIOexG4~?ES`A==#ctxhF+F-&?=r<&R~@-&zR&Pyey=%Qx{g-N{wgd^}vMWVLuR zUf!9h<GCdMvANL8?IC{4j3)1T>X4bbcte~0jimY|j^5{eBv_l5GPeFp;{H3eaEe~t z{A#OJn-WWxq%9Iy`?2PhQPqjub^803ZU6R2=zZbLnE2!c`f~BYk@3lGmu=^)Gg+4M zmeo$>RCq=A-|2tWgq>L_{d&Lj2ZMiyw`wsn{_$6<vdWcBS@`_#@?+t={SQJo{-@79 zU^RVq<Xaz6Qx<`F3UXpKJFYFgl%3Um_EksJ!(6M3=~o%Qn#Nr#Tq<4RTK4tp(b%7J z9Vd%uebXxxp7YanVVt#+$dRIjAC+G>DPB0Z`cY=!k7Bvx;<wf5FD<V{Eqh(#>2>M3 zKetZvE|uqZ*XV66{xQod#(d54$40WLB{MveRqQR(Qs&HDmeF;5WAO9C^OMszDW>_U ze2uX?yw7ZgkCf!s1ry)DNYI&jUZsaI_|(s&PZ}HBrl;uF)SSEe`SY?wz1w0xcRgHv zNIBj#r?n<##Wwe|+?Da+y6YdWdYU^scXEyWCfjaf!7q*-X?^R|`r31&uQzkdJ@6~` z_{NVZ>DL2u-r4k>wpzX+mFsZ%Y4@H8h5t?Nn<va&aOsv?ep!d>8{JKT22FuqpJfJL z+o7Fvl<oMnqE)Bw-%-AC^GW8eKN9Qqu!nmVEHwB#W%`WXJ2$WP`I)!O`dWIgJNw<F z+j`=m%S@vW7~Vb6`)b>!8P2<y=Iridv+jSeDtX3^DR+xs^*!9>ds^(kuBT-!9CNIA z=EPh(aB+ijW#4q8o3}4iGjW$q?5tV8e)G|C5zX|w=btv~+O53)y8PLzD|7y<JomfT zS;?w$&hGWOVDm>Rci$Y<d*gOUu~^&5;;6WQEw92y4jaabJ@<mYy)1ktV!1ZB_*}uh z%^N&BopmdnmWzBXs*}pf(+b+ma(-T;RKBRG`L2M+x&fE9R#vWaKHJNhwMXwtMeNFt zc8x14<>uKlo9@%f$}3uUEPTN--=NP<?X#FB-GA=Xdw#0aec_H-;t!7+2RvTC=vkV0 z)*sfaTdJn|r7L#sbm+a`Dz#tR^q)GYL3{Z0T&JtAMS|*|Us}B5S>AQ8RB_MxjUK-~ zaz#FPmVZS1<0`2+>oo5aRZO$k{-~7e`PYi(=F8`kv`^<Q*qr@T<lYm$D|y`_jZ78B z_ZD4auF$TQbK1w7U#_tIQ}mP6==(QI!)}Y*d)s$2^R$TJ>%#UDzpw9}l-aKOF8A$K z$G^Be=N<2#71H~ET*sqbKj)+0!{&D?>oza#`f*UHPC$N=-RgUZch-IrJ0iHQD)Xh> zo!1e!+->&T`0VT#%kR$T3Vyfk+U+9O=%|a+!tQjZy?6b(q;~x)&((HOd-=a#f9D@H z_Ym{DKXdcyS!W+y<Xe5ds9yc!#ajV$4ymV0JIyb0`gplwgIdcpqZT{!+X6ujtG-v( zIJRC8|ERkC#lKrK-M(L6-uW)y{@aUxeEVKMyTzaW`d0sk<fpg%KLnf4i9feZ;LgJb ze^ymQYu&9`_QAS*M%QfqsrBzy{aJof^Z(7zpZS{u(*D2y!M=3KC$r}%v-%(GkNwW6 zxFP7Tt=gWebMo}9mp)SxKYK|1&DS)+g!9T`-nO7sa@}ml&!|0{d8$P?V&Cf3pLfg% zcG~`anc+X}{j;Z~Us;=^cTr>=$D+V9!k=T`&7Qql_TIy?`y##l?mJ&@)V|)S`lp(8 ze`W8KtWTepo-9*z@4l(GFh~3LQkm@=ZD;3N-%iarpDexXPm!y;Hs{L&Tz$4V);rg2 zeEW&};-ZfE>QPH?ECw}bXPw$-QNqQ*kcPKGtAVdU8-QzxTm-yHd*;bT79{}zPJ;(2 zP9701XI)HMT!hp)Q`vMfj!u85+T)XUNN3Xx*W0(=hVQ=Rdi&PVZMUv%lTvlbJi2Y$ zwzB)*Ywv%*75eM$?|V8kD<dz|pLx$-ZvEW)dCm7bpWn?rKELKgBExLg`3F`_^wq7M zt+cb^+K2aEszM*1e3<$%W&T3-@>iL*6Agsw_*)MAdHv<}*J&;DWbz~>_MGcTwOt`p z5Ns_Y|K)({gCGyN3Kp>`4MjWCQ%oK<h9~@-a%_=XTZbuA=_x;(t3rmC3T*}L*YT_I z@IT`?v(e;wdQz2>_=lO>{>r}G!v2|c)eXTFn&&QkY-RGhxwx$EUsdL%X4jH?Z@ACQ z-Qu>jim~5R;KG`#8y4~xzKwBPwd?5Ae^(frwY7IF+U0sA<Ca00q$Gcs;6<q!^P&${ zY-rOKb7%6_?wmYv1`FGg@MjJQA4O)ne$t*P8nN6XyL0KJjWJfaDw}m<-FqYSr2SQ` zgHNt0G<iLJ$Hxep*@+rwnY7cdd|1%BQRJ$}KZo-2CEBm<+i%(*>hOiDVzG5uscRWe z%l6_s$^p9N%7uS!u-=(ia5Ah_<Cc}g`Mwv6|LL-9x?!&Ryj?wif=F0&g5G)F>F*}Q zgzOI3w&Iynk#yCsU2J9UtW6KQ1o)p^+SRjRsr9@kayi@ELW+L}?_6_`<?^AUwv#@; z4JulFV2{H~r^j-QpS#?b*-!U)<8#zAde`fWGZIr5$dwpoGWS-Slsqbu-?h=%nSER3 zLx=VJes3m(sqRWKOE@Yx=~L~C^^MZZOskjkDZaPa{yCCocYea}cLm}LulWd<IjS#F zY+50{d&6zk&*zUP8E$>HLe6>#|LNon;Roz{JNGQuR4`TicY*2N?vhfzFZuljZ<%@% zk4hWs2674X_Dk&cWc#}AV4eKebx$iVySob?XF1e(PjZV?`u>|zY=WN+zc5Sb9ZfB= zZ(})U`1SJ6lxZ_`C+f5&+uUTIDU_+4_(F2=ZI5F-yw^|O?RhMa?f)&oM)~E8ohOW@ zuDYGfsXbH7-%RXUzx?gR>Q7F}h_2xG-?&P{x4KYbW>(CRVuPF%_O>=7Htqwr9Cpm; zo6BiCnRBX-%cjg<B3W;)7TEUv=qLy|?3OcWqkMSet;LDPdJ`T$KN*v+W4(vFJK|#V z%PWGLv+jFbP0XwfTv_`0x8SR(*Wx<FJ+t+ng}E(~4V=djzF@oix;-rVQ?>O^FOQ$v zrn@7+>Vwy!vND74S8oHVtE;5GXI6;D>0XUj<`3V`Us@r%xyPqO{Yzq_YT2xiCpUMA z=1=I#7g=Gu==kQ@zk_f72(Vcel+1NBZt0J-J8Gi&>8yGSkFSc5(sP?#@-Np;XX-wS z)Qw4*+Fi4*dOLHx4f+skrxV_^slZprM0;kN_l8iedrzI4MV=fFtuy}fTT=D)nY#Lg zU*3I}Zs!zvF)?)Is}=LNRtDZO<Ne9XHRVmtijvtoPj|oF`sdS)S(b9Mf}#(%7v}S> zDwMCiaQUZK6id1B>dDM!-cLJ_0vTye^)(NDd3+j|eH!b+hbn4Iiut{sCmAlQXca7+ z(pI#1rgEF3y0qHIBUd>6|2;YVIfwJ|+RtxaYz(~gfx}Mi?+*)pCmYLIk8c+8Ee%#? z>dWa;|K;$?<I<-Exs%v~kIZJDw?+31Q#@nGz0w<%<zWp{cFo6^-k-m8an<TIHB+>I z7Kuj|ezsoqC@P{rF-hj!MupG2j(2-Wt`B~@Sk!$kFNgB2l=I)WBuMS+T7ObvpWpt= z#~NeKXq4vs{n8hzmYNINzLF4D7n=5b`$yTAH_I#MdrG;lFfkA@n{@bQ^Cq$HQ|4Z( zoa~xWR{HX;O8rKjuT$opmw)7L`r+YmAJ9<q8oL?ZFCv|vRrP;8`SP4<@+N^ijrBbD z_L!`VwK^H~G}pw0c~)EegXyLhK4@1Rl8TI0)U*FHvqLBA_32Zg|CG;fT9Oj|NLhL3 znm<w>9Sb9t%@0~Kz1Fz0GVFlVzXp4+`Ts*!xcxr4@ap27{~~A4PCfWb`=8p|zjGCr z_WI~e3{5%nAnoS5N}scl8w<@&Nd0TA_kREHa8W^n`GU5Y=Ep>>Gmh}BjG22<<ow=f z&&wZk{cnG?oh5L{F`rd_%RWb2;eJoos@Pze3zt^S)bUi={=s8OmX><(OF`R2$4ph_ z{c2f0hP`aURaG}mNbB%vn4A}xrQiK1GA4dz+2YpoKaV-we3;1_>homd;++>;HctF? z^V^HIZKtaJN*14ea*d1m?Zp>u7p`#`&$)Nv<;i1H*6a+}@nu@e4aNL~y8eieJzv7s zobp~D@kq3rHU6!)R?Dv9n=!M_3vKKvpY6qy9oeY!y{q_WrH$Lvq{}wbre-yZzdq`< z>}i3Lsm6Y>>^Eg=WK@@QUOn`F@hhpuM$PgpD;8<(G>=cB%ICftE^3h7yljFyOXYn_ zx#zh_#R*<ZGIKgg7wvR2>HJ!w*~w~W!Lt8vptQ!;@K0xMvV?y8#bX-wY-XGK5jXkr zN@4!sOs-0n_@ALGFY->6@47Z2>gI{yv^t^PSADZmAFT5Fv+2~0dvaTSze$?RJg+si zd7FHUb?VPw;?sXz(D?BtIz!pfAnr|ih3%*Fzbcc~{q)oL=df{$i}nA>L5@{tr(D>? zA^LRA+*g7|?d$K|SZG&kqP0CJZqj4V#rEb#8B5mAWPK>IJ)wVI-|3B}FME%)Pu_J# z;$5u2QRb4X%pre8#5|u~GF)t}_cTUuXYGvx?!Cf#J1QT4{HSas9(U#Rb&dE&zMovF z+E0=Lwu-N;RJ<R)>gi|Ctu?Y6V-?~*ta^LEY}@Ibmpb1HEb3k?v)1CqHZ$9{S-~&v zRSVfJZ}wF$aQ&ci=pg4Cp1wqX*>y69i;perKWx$XkW=N|<oAIWb^o(>|9JZ5OsaT= zne5&6(j8%M9%M}9>=RVED!eV!^5BArhn`O3&Ymjw_4tI?2N4sbk8k{4*leO8vTpV# zq3zQe?XO?Td^l%LDXaW}&+jL$nbM_od6s6v%yp@M^bMvSmD%*_;hnQ4Ctl=996vjK z<L*USGWz$oZQ@(M<7?R!fgjVV8!v0`mH8SuNqf$e%D1^0)~&nts=WA`yDnkxYnHr? z*Y3vD1@HBKwRPv(om!^P?auDJT%H&w*SR@==j$`Q7QW`UH;9KnR_nencf~<TyNs7B z+0AV^+u8Y+f96?io_=n^Wi8Wm-sjQWx2ITKnY8#>&!V_<{*GtQvSv+tu+})>vCiUW ze9~ESDzm0}W!=jQEOwtKwVc<~FFI?^d4;TdjpgSYdRO<%vd&#m_;h8Y-pb1Du4m^~ zX2qCY*^#rd(6)I+CI3BZ@TQ!1+ZG<1yL_2r&}X~uS-U@9*^#@V@OIGSx?=&#AL?oj zXocj4Ov-xqV3TmgzuIk6Pw7m0=QOe8v0PY%;eKZMBkfuRv(yaA-s=>;JI>7YoaLDA z96hn<$UNJF%SweSPROk|D5A+wS->S9_*$-JiY>dM{4^Ks6LbHBSl$d{pM5UYuF?NS zGMn#ArZiKzspnSSQ<q%l{MGJgoajaQ!^?HQtd2bNlz)Mp)t#94a}GRz<9R2?OY}o6 zYmK~}er?!Z{RiDzX7c-vgsSV-O2%*0kyV)&owuxK@x93RvksWQ$;~x=%C&7vlkQr9 z?zCfzsxIvd{<<Vod~KcZ{Z&2wQF9M`fAe#;-o8D)@duYlZti*i`-fwymfr*Q&Atog zN3Hx}{AZ6+>omjGI@{YKpq_&CpRlDD-hZgx{pR22n`z(Umz{W5Z}as{9n=3U#c%g- zE`3{H5wx?+?Ess*MS3)coM~ap>Vjykdo^k;*X7bKoozp57yZ<7bMU<E)iKuGso#Do zZQ8kkclzcX=lvpeL`tVjI;DB;lx?=0u=nvJUCRtNX2q<L74MZ<qs=2HqRYo}{AgR@ z#-D;4mu4JUp0T&<|2j?2hG$G?&pvW0oM?1UM=$NXV%3y)mL-dPTXfX7ed1W{T*lQ~ z-R!G=bm`N?DRGtF{IC8#GE$m3<LwGj*`(RL+Tk}2PmN7>eSSIc-oGnTSG(x{mw%F@ zyHsok>#G~{4qr^#=B=@N%3Gtp>6>l)bD3{X%?aQ9b@$V`^}6TMZ=Z;p@QJT)_KtNM zV~_v*S|gj&5FVqr_n?j7v^Rg{LEQ<Sx4|<%a5FHhRK&N|Lm6Lp0<@7_5B0#Uy^)+1 zpuutfX_9G12MiQW^ch_AWa9A_QR&!ZZJ_9()Uo1&Q6(qy<e3KCP1<=H9Z?&1Y<qWY z?KZF52VJ(5ZS3B<b?sgA+_y>P(QlK)Z~x!--Dqa7kH`M?@%v`(e1EU_U-h@@cc)Lk z|GtM|L0q1g&zm`~^XJ^2!=+yOepiHwP+wUNhr4vC?yW`Ylgc^{?Df69@~3jtmc#e2 z?DFL=+!hm%X>co0QzDD;j8Ds!4z+?JO^Lj(dVR;=N+@lZdA`ho_30dukgtIiZzZ%= z1Sl(gJ@-B&=*B~}&6Z+3rz4ebdo<pyGWfpb$cE%C2ZC4hEVw3cLH?1@RgU9}{uQLB zYpvYsR`TEK)$(fQivcQAIo_+Bh&VVU=u26TxP_6AOtGQp#SEW=GxsIzKbFhE;`>K* z<%&kT-3!%jq|abGI3doY>yftO+e0FALRyV{mges{x%Od8LJ=n;i_>ARhWTX&JDPY| zUW;wh;du6Ye`4T518(k>QBhK2PfzT)Fhh{%d+PZr&0XB3USD2@SYDI6vRL-y+Af_5 z%OCpum@Cm1*>v&Qw~rwvlJAxnA6mG!F=LXWVY}nS8(ZGoc~DgK;7CHDk<-=3A?(i{ znH-zrx!G*p_Lpy6W}KhfY+20qlZoAry|uh;@k!powX40;Wx@lFG;pUUOq{$reNymS zk&mx-PpUF;+|A+ljdg|FN{2^c-5Za1c21kM;`QAKy%q20ytdu;f6u+M_k8wLZq3lS zHLt5Go!jq|=nkXX6I{v@RnL_r@h~0EjR-xLb--o*t>=ddO44(7zvIuEyEZp!@w_Xy zwgwo9-OqJbHV*7o+5C*9y7nMbm{3md*12n4Z!1+DlI}UWZTT*#O($keF3h@IpmS{6 z-Po$b%MLAArI`}3%2ny?7J=LwEnEH89JCC{lC|~LcP*>7c7Dx#&t-Z->i@KrC%eVA zUaa}Qil<Ot;Ctr5opQHwY@65Gie29-aJV!?ao48Ll{a1-VVQIO((;v;o}cpl$YmUy z8?`9%{=o^kI-w?Ao-rotI^6$wF-I6&E|2Na%g6}TloVQXK23Mh^KP$0qN$5632I+H zU8~i7>tY})`;VAynKNZ?XRJ=qv7Va7t1<Ogmc`bN1;MJKGt;O0s9t8hS^4Co;jLw< zZjVY5+r8#kB=_{qp6^~1<2dD$!-mV9g<3XkTaN~XG#T7_w@lBe|C{Cxrqeq&NKao; zRJ<}FrqQtKX5<MyaUYE>VQmLiWQAK5uzuT+r<&~bQz!ZQ?=IE&lN)wQUAN$@T-#-{ zRao1qa*=QBY{@&>Y%+I_ZJhT%V)FMhZ#HjWt-Js6<E{<-ze5}DuMjd8339cUk1Z=~ zUl)?}`jLmr+yknL_6^Z<B^sMkx?gvOs8}v&(M!C%XWoG{C27f8n>l)S`mCoMDmU7H zOCm1VOT7Q<(rp%QrW%2IR~Fu=Pu;%k&W{ZVYf?}7BxU7Bg$Lyab6Ty{@Y@&t?(ko) zkL+!?KQ55|zWPE4dvk)H=KU)oQ%c0;4!Ya8REHR>tbcstqeb%S;KwI}W1r+`OuOm- zXmMx-lfPjx_XcK9+jR?O?k=l|5nXQM8|qg5p(p68!Rb!U3rkzKW$Sd6)l8aOV^Drc zgE5ocu2p$TiLb>Xom=^nCc71uE<WzL?m3U}H)lB>^)AaNf;R7uXzWRta-PYU$G{{m z<@hXlsm-xJ*37&%fAMDf_s9M@T2%HaJ`}grI6l3?VYQI*jBuX|HTxFX)k?;%JaoCj zb?(<$Mjtie19z=|80z}H)GOxG3aty)&(~}^b=gRKU+48JkzaM^h2AfFY<kcm{^Nvy z^Vmgy?7Q_}^J_(W*5>*nNy4{QwQt+prTcUKYKiKlUd(4t+?sSnZ%^ZVE%$#tH4ihw zwK9Js7(DH;4xheZh50nERdsbUW(JFC>VEeA<Hh+=%>Qu(-~A}vbK8QKTOWT~8fIzw z-TcSeNB`$auQ&SZlbu$rYc95C-i=oKN4ZD8sk42Yf48Dqz|rP(!RvUN6-VN)-nA6v zRsVZ1!Xvo5>`&~5Q~OPiv8i5Md35D&`)gCblpjl4$g*~Jm-?5M{l<5Wwffnc`yFxq zr?UOy?Ac#Blj451KalU4+M4)oqsLd>RxQc7m-m0jSHE}ocax!7-}Lb2mg)C;T+c3? z+pc$vt$*XHQ&Xo{x-6M<Qsnw=<*dzdXZOB|_er|i;j#3_oFyuYyuDSvR22Q}n<Dmb z=k`<w)#V4~9E=e*lX3PC-StR7{j%RGme93PN-{xmUIyLErhQRLzIyX`QpvF+(t3Gq z%{>n`UpzBi<I<|hi&@=HX^3T7IvUt*SI-Uee;ssD%<jUIWESD(zX1|y@~<Zdr^XyS zTJ78OeR>9apqjxx>n|(h_}j01t=M?;&)m8_u}co7Z<%D|sb;<NrO3f2LZ@z}u3C`D z@Hc>wae3vuRWX9=gO_=l9)6nCCEuZ@%bQg*``7-G6wjKjA5)H)vUDDMG&gF=^^c*E z{dzO=b``ftpP5#v+FffFa?MkH^Ofj!L!;^)zRyx(%b1^~Zog*Uu-fCmo-U8Qb6z$2 z`WeTC^Q;M-sq}g3K|lE|Y{fB`60$Z-kec(bG4`$fGYP#-rz73M_Xelu7M&E5o3<%p z8ei4-oqCaZ@AftAUjHSb<JMlSMMtf_#I3jdJuha{t&*sKf~b?Sn*%n<Zaa2oL#On* zuLl;I$;gQLUe8I|D)2gne@^r9MT+N)H<}5(uHj$B)*t$Q61VS~?vAZDnWrDpdU5I5 ziagbTirLcBrPq5W?f%jd+VbYou_al(Z?ifLO~3M$M)ZeC)K1JiYdq`r(!-j&a^CJQ zSP^zj@0D(I=)T_kgDa0mZ|YIIt}6Jl<W$*Lr>ir&zIka`ER={jpc=c$nNzadb9GBd z%EW8I9$u!K`}Ol@-&?1dd?{D_ac*i>T#$RwER#fCp?xmq_it8yjtYAn8(FL$I@>c$ zXS;FQ>(Um_U2F2WcgLs|Y&n*6(#2@qJM-;-<>MH{8sGlUT@a%fZuPY2=HZAvU5OGW z!w;)oKe1GfXKMCMKb_vKFJGxTSgcy_S-S1jN3o|dPlf0GnD|wy@<)!Z)vUv^fx0uh zir;X#RKC*f)iD2fq|9t{E!Ru!LtW?gF1hZu>_*IblXGFx`VZgixM|8L!OO0eXq23w zKY!Zidkf=E+{!-gZ{L*ZUmT%!{qt?Nq6bAg8}A4E2vr2~N-UmS*tIdQo!|7yjpaW$ zv|jyZ68n-@6#8NNu5HrBH^i10R-a8gW8KsGG;_|;<EfX^za%hEIJQi(R=S#JneB>0 zp%UGz4SBCiI9(~)*JUjJz{z<|R!mA~@La*=R_=46vUW*E>lBI=Ec4L}i!Nu$Jt``j z8<ZllRdRP{>-N?uQc=2lUTgGE+Olw+bmGCl-`zLv-B>=~GWy~)w>5cH{CZ(o?;hRy zVxqTLa^0+n$4Y;Cy>I2de!0$k0pD+<Y2p7nZ*=FjW$;Qal`e9*yz<r8CzEZKU%R-H zo$b|?*#(=QUWvBQdR!s@EqcP~A8TIZmWDjoR&#_ovSV9M$2OitXPrtOG+Tt6kuT@H zB47S^UeBd=k4o!z8$PUC!YTSS%lOW#tm+RE7kc}rK6JG?d(xkS@9|BOzGWXX_39#Z z>$b+|mOYkUR9F3h+4QIL(T^@t_UFW3P19KzmVPB>uJV=k6;J#>R2iz?uSsk0`e(!a zzBK4lQP#t|U5ad9i(Y-s-WI!c+9r{0();xnf5`3m9mRG(b}zr}59tpw_in%V`J6+> zs_DPXw5}~Yp53ec=XidxESL~|zm4-tAn)<ITjhGpn;F|T9f_G2SY6pSV}C-sVMtr# z#YgQDTw&Mb1pN!w#;P?g-MS*W{pcUA*1&A`?5Vp`z9dS<|J&o^bJ{c0a%SJlW3xlF zH-{Bo*|~AgB2C?`uG8N>`*f`9)Uw{G+m`j3RsUa7HtADvroPjy<tH<|_}b(O)OpLq zdrQo375Yz0W7l=IT(WLOWE$TYoy*l{m4bCQ?@8o*W4GG<*~V2TnjABNTCUi(Y<b5R z)sZsQWW`&FvhYoFGf$~??@pb0YMo4z;El`5jf+Hn23G3Zf8Y4-{&}e{3}p`-m)&r# zkmFCk`MS4fW4Nek+2aE}d#!|<`6Z953cQ;de(&wX(xYo^7xCC`TKK~2XS8jR<Hf1L zcWf6uUGt><+TuSpZG{ywUn`ihKcq}MkQjWMD^S0Op?qf6E1iSko7q;|$WD&^aLiu& z;g%y2-+!&nNH$t&+x9d{c17x|)NQOaZJ{S+ww9jvdepJxS94Ly0+~7YISZ$+3|}gC z#p`v2(v>fHG8*oM8lNprw!O0TletzHv@9+*a>3VWyXU5*`ka1ObEP>_tz_1UyyY=U z)1x?)by=!&`(xOhHBz7a{WH&*gMBx@xb@1!KeBy-e^xjB>c6G&Z{C6BMzh|!tm{v9 zoYAqdXmOzU+oFd3?kBIFnGogpe~rThDRtw=)shAL(T~qRP_0ok{x4f|UFtvM`v<Yb zI(0L(|DCA_y!PYGnva%|kH1Df_Kke3o23(;tfA^1)HQv_V{4aqmnFp~wswk`YdZfC z2lc(y*jv9);$>hsu8gnmC4kcRLhEQ9jpVG5J}Ua}xYf03*Qd)^f1G&3&t=0=#rVQY zGnfi}I(p``M6ftDr0A}lt2*hL$7&TneJ^{B+|0~IIS20Cg-?AvEnI}6F8yBc-ShqL zWlPofdjCo*S6%;fYR{*i*^~6Gcjw>xeSdcSy*)Dn=T&~Zahc)Q&6hm$D&iBi<m;@> z*u-!wK-OPfM0bPYT!U1;Hm%@?Z$ezUJllLdB)_lqR%6{EdFR;nh9Wk0&XY>3H<o`2 zQdL|qX-ZEy+xs4O`Ijt@gAEz4@-+QCcp>xRjaA2zyqco>P6Z`-cxg_YV71caP?6VX z&K1cKQ6a4hS1a7A(iHP<y{a2DDej5HLEWT?u$cCRYZdOPm4?hxnsSt<`%RU^t?nCb zs;%u8&Rj^ieRRW~1zS@&yd}lNU#P6(QYzTQvgPuZGgFPH<lozn_@-&Y`q_=W1|cQ= z+EH`dt{lD)IOX4s#>`6}+v8sK@LkgA_HSsca7#Q=!`u{;WG>AX;GU@9+<Rtr&hx_? z;^WT5T~}_H#w48N@Po@ag8iYL`@*S}db%6Wt;<!~b@6ed@ZKY>nV0wZd%9e$E!q-$ zOIv-Z=T2MA<(CZC#ww@Xwhs5rT)D33%k`$3Yd<Y!oPR!9C@V>6?uV}(5oZNYZ&>Db z;IvGL{0b?Z{ZY5HS(Ad2j25VTTUGtU!K16+eQ99iWVIz7%hZ;$&T$TP?#dLCJj^?H zq2;nA8=`yjrU+e}G3QfjNU48S)`dl8%TzN(np=4eUk?8CfY1B=vyZEvc9`8Tz230= zfW$^ijYlzao*z72Sl284TEZnWOUvwSxBIrALBTw$t#q#lPl&tEbh5-L_)$^A;dPun z0h&D-U9(=8o#iO8ZQJW|fpuq*WRSAZb-@C~!yXCSy`HVyG3CmW6o<K&m<mICmoN#M z&h<ID(jlfZ$lb<aU+_tf27mtp1-8Pyf!U`8Q!?Jn@eaD+(b#QsqeGxM`116Z4ZX`O zSKQHHbKdMM_rzoNhME3<#oD%7A9{UEFYEozO?wl<d}n&DT=FO_>uag>&aGF~HdeW| z^d8yOB9uK_yyx?_TLqV+kN7&}-gh-k3%}MrbN}t!nlGI<5`XMys)>2IRQ%J%V;?S> z_w)CPy<E4a@y({fOZrK73WOBZ1NCL@bOzsEyF_E-nogImpXPX+iCNp7t{&=PWw6(` zYw3!hc;D)KFP=U0b`lRr&Epciu(+gKF|N_pW6EQbReL9I+E$sQq<Xn#{g!jzf6bWU zb#u+~b%KJ|6<#W~Oz9B)5PCu263^PBT!x2d&W&9f^7fbH{)cxxOXr)&Ek4W~%5+?% zza)%rHg|c8`!}vVlia^)v0aa-h@Bx(TH41_c|N;9_kHDB?ql-p9aAmlve(-#To-Td zw&do*K9=U#>D?8!c~73@C#;yc_te+c&uaX8c66#WRNN7mtd`lo;V{>$*Kc%p%yiy6 zbyCv&B^iHbhxpD6=y@7^puoj^59{`#!?&Nw1bzCZ(YCp3qiwpo@WoEOb4PaDWIQ;$ zV*AaV5@90Drsd{>b#o3by!ZH^5TEJuCx^@pZ!PIcmb9MRVO%K2UcH}PS7yz{I_t+X zqgl>bUDz!6py7Mv1|IXy8|{B<SnWL8FBHyew)v~ETK*aL<?d#lshp;g)039{5p=HW zxRM-H6l8X^U+U3ump#nypH%n<Op7=r6)yZy<$BfuK|%Qg>^rX+${lh1XK_S6rB40c zS?j*ycYL3YEB;&1_x(}rp2w5tv^W1L?68+h-eGX>d3EOIH=o~rd3rSE=DL-iO4xR1 zl&>&)b!^%anW^e4R@KaF6Pl%ZS^I>z_6OFQ&V`j_GbMw*pI*84rOOOEmYP<sn>%*d zuVE9OWuvM7a~E&a_wZo9j`+jZZGUL(bKL6Jd5UG3@AIq5v)|qn>HHx!?`wd~{biM& z>YL<VKFCg&7x@@l({KITZm!+;%ljWRUA(b7!K0SD?aKZHkJVy4nF$9cgy~CMl4|?c z<k9xZZ@yaZ@?@dX=x{&x^m_|eq#KwNFMXP>9pzjp#Z>1UJ-Mz%<fF{IwMX(lT3bz7 zzI+kOdVP`Ecb3{dsQj}~i0Pk4^);6AIP>G?$9>g)?&-c}pm9;OZC+)&#?oU?veSCc z-_AUG({K&{io|bT=X8%g|KKlofB%X}GrS8Ud@nzXO)%x_{=xt6bok@$v^!H$nYLas zDUaQjJY!+`y&1jTo(mUzmFGGkdR0tUocC^3o9nZrJbo9o3*Y_nLMNxYsGqK!8(r2B zDL7|I>U+=VptBM)t{0`<pC$U{q~y1GYaV*Gdqu{+?>?nzxzfY%X+zE(`IiTF-+I<& zG3{!XR94w+cIW7So-<eTo!=pFL&-|5fAy+qmnQv@DS7?>p-~od^q;g-Qa6+MvlG0t z?yTuN<)l+Dp_HBYHO?YZ`|a1)S67_b9P4>v_N9-7mXg!Hgg$(Fea8*6&YTywMZ$VB zgHrfq-=E1hoZ)f8^KYHP<=CUfZr?9->~VZpyVW^zUeAS<_g$|q`%qS=@Z4r`^EpF5 zt9tH?N88!|9cJ(|j<%ZcT36Qn>$G!|s=SXo>|J_Udh6*IYo%=yawKbQT|IiDPX1T< z_2*vbzvLSSmP&80cF)qDcO-*N{P*5um3=zu>&|xRtA9K<XNRHoG!L7J!rP@D9e%Q; zXY0jchR{Duj)w~-e&)Jz@!@*bsUi`&t?!O%nLM(|YA&hZUMPC|MXh*Lq;+Jc+lCoO z^0I6LikKrg+v^Nh)`_gze#Uxg<2Q+Ka@XoDAI9C?wX}K9#g$h#B!+4%=V*9+^4Nck zZ)qQ1eSW$1?8Jkm&a&MfcHMsGu=Ic7odOPvdx4Jei<hO%o?LRT!upyW>-(}r@6Kk& z{!_ayyyM`T^5E~cXT{vfTYGzoWy#Fn7AO1ex6jfM^1NSnzcagV4pU6`+Z{~o4-#ZW zu8Ao<W%;pTW&^YSA|HpDmn)h6E_=fAw8?q;%=uf>j!#&}w|DiLNvkD`xCL{?tk#>q zT=SUyL*<IXXMx4Lc}>shnDWk<W$lxdcRuLxmW9VMy?Z}T33$ADX`7z-=YYqj7C+OI z&Wef5npTkY&TQpQZSUUGZBo;9P1glGo$b&yE!jJ(U8-Ep^!tr~$LE4BA6mKdI(Rd6 zo^;loZC7^qbDE0Z4stHPTDd~-(~6z<+oTk|&l>riWmYr&p1x8rXN6$SN<lwP)9E(@ z9zV4&n7!26#dgp7i}MdUOV*so;FCW4*jTzf{Ql1vt91_bs{`{K^Uf%?7oV6u>x4I_ z_T+<sS@TXkIPCUWaB*eTF~`MxaVwp<ws?nLzRz|gVvf#P%bSVP|J;p#%(z%{C&O-{ zyxsqmyXIXGFU-09;dt&u`>6+)_dYXr`+T$JiRzd2ofBqr?o8Dy$`!V2PxpCZYT|$9 zhVK45H7xhfJg|2E(A-|!aqLKGbik^Q&VM}Ie-?IX*lyFX*A!fOUhL^|)kR-!FZ#2_ zWlHEa4SRjT)B|Eq#Z?!r+2;B)wNoQIC$O$Hezr!m#^E17PgT3E-aj><@6q>Ei!OW1 z0t^0^R<bMaUN|=Yqqsx;Z|%4XzxV!-UN~Lw*Zq(EG4rHfT$TB&@h`Sb*<z!q{7*OT zB2&(|3lmpMCO_lYeB#W(Ich}*WcHq(pZK)@3FEyS$t~TX2K@3St92&s+WmG#a#E+p z_Zy2so(5E9-q^E#58w4&v&!8+zkR>;#`M=N1;1YjE#7h8tZSA~pxg%6mAZmY9iyl0 z5(<>t<oMA*f3<nwtFuDdKl(Q=J)mg2JSNA|*8N4^q4(-?=CQX{tW`QHRTSlY|BwCF zSDE$s3${(XrFz9I@U~N~_SVxYau-jFzdmiZWc0zqN-=eT*3-*oDxUhmc&mxsAY)&A zR^|RvpY%SLU-NmN?fG2m#2b@CD~>*U-f#0-e$nm=UiWp+mN%_^()gbr)C?DXeqg@? zHv@x@5(&-llEmVYO85mMdn+nyLPF=gw>59Dy>&~&<G}TVl3n*b_UFyLcK(cf-Hy;3 z+bS<-PW{L5_u1#nxt*yRDwh|&nzbtEcIKqu^3~PZC(Aa6Pm1<b4OR3OUDB|@MWG>4 z@Mg+=K>=3B3l0i8mHUfVYjLjrG;`iXmGAS4>t28Vv+eZkuWS9UC8R&>(FyL;d@I@h z^t{;X-_uTB*;4HN{m&zFk<?%J?X@cp`P=T3;?zGoBh&fL9q|dTw~D7(Y<iof;(Kyi z%57ecIj<YkCta2m``hr0<>HBtLPGyMzPU;Z_Oa}~nYP^0)$LIIjC;+ceJ4Nhovp0( zn3Z_`tlE3lRu4wS$Zt8TpUO9GkvO?NYO_xYr%~wQ7vDstPFZyA<+V972_Dt<w~bE! z+E*Di>!oe+x|g!WQR{9#JF#)Opl{~+Kf>ADecj&41i!O>HgiL=agnH8$mE27*K<y1 zr%irpt`=Q(ZS}SCO`AD5i}w3o<9wCH|0!b4&SGE7&R!}0N%sw-9mFg4|LL8nfA&Z1 zt@ZzP->!SMVOdPDU!SG=Z8P)4%iRB0NQc&K7OeNUu<%f#jLY(gtG_R}HM=vOjp??} zYX$%GJAKdJC$=A*_3c`W@b9oo9TrBf&KAXQ-<Otj@zRbh;``iZ-JLS`^R=^fQ}1cz zsa;rNwL0V6$%}XXtO`lzW^vV?v~2HR`DZ#EElp(+?gHPXTCS|Vng2geZ+5d+p4g)M zoyNi^J!1sSKVLubb=Orp_6~vnlb-5t_-ylN?VI%{=Rcola{1u18S~v2b*2{oV=~-w zNTaN_L|Mo&ulwiU=|#nti`N!UELMBuyK|>U3-9Il2`oj+W~Vprxf5ehs#tW8dt>`E zyLXO7cOIDk<Mp|hAoBAo^Oa*E=>i<hE6<&MaCo`LnN3zYWk>$={j>PbpK&)$WZU}% zWeQhQHqR`6d-8OZr61cpCav8WdEc!TZ@KLJmeH$RtRnAR*YRDO_%&}9Keu|bY<sc7 z+;8#@e|SFcHYxugP_a3^!Kx?4qUgy43z;)B;+gLoJ~?H2{@lfnp?%6fpUM~{EaNPC zeZ+Hdk%^JR+XZ&Z_c?qz?<2N4b=%>lIr0jY)zfY!o!|EVsK%T=9+wGU+G9TJG&o<` zdGPh-1z)=vU&$2tpETW^cERd&L&|4%ofn4Zor3OoF8;B0Im@NV$r4X~^<JIDEY1-Y zW5Ts}`T@t~XEkE<m@e0TEUCYlwQ;t+LfJRz)^)236jGl>t^MY6WN)V9()_4<TlN^$ z{@U_Vf7#wi0aM!cWZo2;eK%*;)U>&C+oCRQ^3YpyQ&C|u<EJy5&)Zr5T)XAwwL2!0 zRnNMt3tv8We%d+1^Q`8%=a=n$bK-34_Jd!1HlJ@iWO#g*v9|8*X>D`PEA=dq+5A-Y zx6G0=f2O}&f9A*Z%=Q1oIuml&aavvuXw|!KcYMybY0X>r=9@WZ&D2SVe|drNNsnq> z%bfF)u1^#n2F$BIzNbC;zFe07s?D5Dt2C!NySmMDKYC*7PvgJyG8o0QZfd(O+Sgoh zBK^r9<)U+Lr?ll$W=7f;{9p>n6{&cl?<8vcEJF6d#G_f)6TO-z)QQaqnwuCP#HK1G zD8X>EamO1rjf)dDt@z|Or_6RH^8qP_YX%GR-9G8KuZx@O`6X)8qYX;e&)nbp?bH_g zb1tkem)Os!pRKT{l67m-E{?3m{ef5dTEf=`d`qlW6q5P&MrPLcMG|v#oz{BHn`wL9 z=NJ1L@x`ic;o?yZRsrghCV!fceN0>5zxwZX;|blSsedKCgeN`XWzf{$n}4cLo&VzZ ziR<!b2D-&gWZWXOw&{pEOUHkM*{(sm4!=9m8@$eR*9EC9c?@fvUDwwnoGTJ=J?Wv! zVtZslDYI&Z?WB7rH}1<l<;b;C<Ywf}GHI=j>oYPp$M?GTUrrJUciflPvdOWC-*WTB z>nXowSvH=WlseDsw#I_oiHsfpIb^)}%EX>b3v`-axk6UZU^~+ck6l#?E58Pr_HI4+ zG4IAb4%Guv=T%hB|1JK*d+wX)!TJ-w>(+J7otNOWE=Bd>_r=W~*UUX_1urO;NUZzJ zA+&aLqm)_SqGX1Hj9)A-Dlj}X?)a_x<VcFj%=@J?igE;0ihar!SeAC)@>sJ$Z4T?* z<=+M5V<#}D1&iJMaf|tzvS63ok*OB4Qg$~A1ZtVxpI@j9`npN?TRm%VWU-#g!R;#U zE|Yn4oG<0C<uj1%e4whso%Zsy3WoseFR3o0mh-6(-gYn0KCt@t>6>dGT&>(8=^fU0 zc-mjNop)ZpU|X@b?MwELsew!8F6b?YXG!OHV8Wl;_pFoMU}MCxjWaK(Y}&NIdXKx1 z*rGFuvp)y%xxCDaGV|Kvv^&%MQQAc5l@>lSq8#@F9P8wkTyAv}k1eQBa1wXik$#xv zi2M@o4kh!oO7D(}I|fLub-MaA{`@(^Q(Ih?2<@C{Up-;@>NzKJH#w-O8FzeBW<7G= zF#YdMn{KfeQoF=N`SbqR2j`h_>R7B;>{)l2QAo{Gqf|>JEjpro?h(b6x7HuYpF023 zBM~LLl#<K7axbQ<E-jHrcx&tPw$c5%+^Y}HHg}ImvhLdYf=$R{x}(i!CFdDR4QbZ0 zvJLJRoMqYG^G%jxUCZIdHv8ratEz~6n-f2|6(W7|ZrUDxb>ghi^7Q6dBbG+X>q)0B z{*C0SpMG&}z_AxkT~{z$X?JX}H8-yo6F6I&_m2Dg&7#folouZ_{*~ZaCM5iF^GDC% zpUqdN`F?0JsJv+vzW&z_ahrdv^IknskAIq_CO<uPjrQl*!c_-6|LDtp3UQ6o(w|_P zb5lC(oSt84+LY?osjX{MRwp!PwuS${ke&PJYFK)(WavMSIJViTzrxy{<zD{D<oSrr z%tA%UKt<`_shsK7PfiF_Cp+a{7Vrll*-9tQc^?G)D>~HYJSbchdM(X*?LW?Ms@rsn zx!%f5KDOBTtZ9b+0>QH-Tl{r5=oRQBM6Ka|yE0ueYE#(_^-mva^waz*&T#(GpQ)Ai zTj}EF9f4&!iGTY1j_GT8ORKisJ9lBX%Joh4+x5&Y%~rksseZej>80ONTr%1c`%4X- z=Wo+XeewQD(9zTDwj7jubKsW4e1i+=JLj%;N&UKD%A$8{^Gkb^&xRb`b#3D`&(4EI zbCd7RSGcuib+6{EJ4;w@_|CjGZ`!A-{@SJkOV(sQ4la9?;B+8MEwx#3X=+a}Z<PJU z{s{*;3#z=IO_}2T;EQwZ{3|wJbaPycC8IX$CA?63?bMdHwalQT$3j}>*_z9HuWs!9 zxcqV8W3__$`a)BWdTQsFS06dfx!pY{`-9<^)DKlh3_nyI$;{upMoX?tb@HQD-5Uly z76}rChl0=K)gJ!EIk`x3-Gj}V%BL^Qz4L7Lgb$_WJJx2;n9>^7u+W&(`BZ8{;*%Q7 z1wS4eh#XIp*txM+zLLRM^LV(i@^&dVy+?8uQT%=t@;B7KZ>knvwJ(J0rt+IzKe*<2 zckV1dIs1v<&Va(r%X1d!9_xvi_D}guuFeDA#nTG6#(O;q-!PSHe^KM28|QB9Yx^y| z@r=PL?NXZ!ns3avO%C=yaBlX8==Vi)uJ>OKKc(9o^;+cqgs`-bowvh}9bO!l<Tkf4 z-D=uxwoK;jm&B%Zwj8tU*_AxOszkdqa;E!ozvq{JmLy7?Kj}EHcKfHC3D-|?r><Ap zynIGrVp7e-?Q(biUkqATwd1!O>yccgeg899f5b8H+&5Uvryi5;R$ID1i)q)a{g>Y@ zd-h)HpIX+dQd54f^5D-4iqcKz{5iT{*5B=`ZfdM=j(Q@!tSw6Rdhxq;ReFDXzbLGE zU77Ly?iZUa@6S~&`F+{>_}4!bPw#&Dv*Y)<Dz10_=b7VQRmt()^*w+1^ZPaFs_yOO z$4(!yN_$fE+H8Wpr}&rUp=Bo~oQaFlS!k)hOJVU`qg$uy#NYGTZPSme<>8<IZIS9H z!EanD4^6kt4_y{lZayW{ifd-zY~#EXo)m>SjdLVBPCL}Fc`do3Y*=0$DX?nF!-vdg zl>aR;5bHdn{5x@---&;m;_A!GE$yB49(>Ae%eu}k^HL#XLU_})Sv$g>O)M)foGG4R zG+|ET6rLw(azBs628S`;*>pxp|KX#ydo$dB&3r3Y9%QQ0I^C6(bAkNL_h0$!r622L zZ(8K^`-Rpe{umvtlXHxsTG|}S7aWq>^;S-HVP?he-(T*<CVWxv)HA3m-^ATx#~PdP z<>x{<gI^*#yo>uK-R3_Fc*7p@=b}-_ANRj;Dm%4P%)3t+tzB{F$BT<qtyliKha2>l zeNGRkJnOmBNwaYtgHhEC_wNzmhZ+A!$nmQ7#J6j?n6HuvS-xmho6~W_jEgN-y0m)x zHF@Pamby<r*i@<WXIjjWMN$FbZym1k#LjQbs{fRrl_0rok=5^Hb>WC>>3)?t)(0<j zzsmYjR&B0x_<Q5i8C@*XlBFg^^mQ^$OWxJCK}NWFX`;{W#4|#CKkFE#^}l7&IX>r; zT(`62m4!05rP_<ubW6T|T+MLm>fwblw;6u)d_CBocxF52ZPP0&((gtD+E;TMY4M4C zjwol#>RK$aVbO%Yh5k%Sf6fd(_Dyg~-+}<%z3=5TSlbq=R76}kv?%Pv)BDHgl&(12 zcx(Bh6)~q4Ej8Q16Ze1p?Y3#RFK|8ks4EjylJ6sLKl#9ykKUd>$9FPZE_A(D_j3i4 zQ~2$G?;#>9!yky8d*BkcvL*7%#x*C88thxhYqn*Yq<Ew8VT<Lwxmy<cnq67^UgV^f zq+mmv<aWtvZH0MhcjCmh?qzf^NdC>5aR11wBm3Q@SuI~)<DXT1?Azh9ORwEG`@W=X z`^S~@k3OGw<!jrOZH9k5N)ykXU}}1+cU*5-t1#z;%$U>s7nrthxMgwg=v#;RJnCf& z&sK$AeP2@}yf9M5okM2+zJ>Q?jq9v^EJJl}P0EbD92CI6wLDSU{$I=;y(r_J_@m2X z-mdg~DXcmppub;AUGr{$bg)>{rxXnn5%ndv)hqtF)JV%ed-Y?twC^0Q^2WmG$Ex+F z#)_+^Y|gM=*<xL!zT!*^-{F?#Uv}FWYRx<}J>y@_4x3rIBb=>o?wOXj!@@#KL~rF) zEDD%@?&pLR!IKx+Eu8LrNB8MsmQ(JGpJ&+XajiNoEdAvbqnyLnibqTK)LJ-fcsH%| zbJ@#cm0QezS?91_{1C2r+4OzO3YJEfz5mizyuNsA_J`B1LY3|TOluo{8i)!n(#g8= z``Lf3PVZ+<8SA$SRB@F^Zn0nY{l|iPJS9rZbI&-$|7o%A^7G{Sb?FwTys4()YuDqh z6(V^if3{rQzsII!U(4!Q0>=MJ`gh+FO0K(gcY#yv3<2%$#~$cSZm8&f!X#Gfy6aa< z+_u{vF8BX2TA26ID!9&Q+W(K?vZnTS6VLoe30QREqBZNS^-Gc*!r7JUwjS%;+H5Gr zd|!Rt$8WoA+d7XQ+|((Z`0`7+u`vIMRIVv+j8h)G@DP$xGdnFkB};6s>eD|>I=3&B zH#l0Qsm1m4bLtw@`D8t6GN@ayHf6_*5Ld1<erb>54y%09?JSc}D>IlpZF%4G3pH1? zMa#`a4(R&a$#4~y?MMh+Z^7ql>v7L>aneOq$p!D&P1`)p=X|~x`okcCS)Oe&-zn22 zXL3%q1YBg6v`~|6k?$}%ykzYsbuU@NElo=|>KIMtTClb{VwSSuj}(o&ocE1CAH1Pn zUclRYOei|Dac0TY4^Q+qOjVn5W^#PPTE(bIHd{`6o#u;5Q*$c*$8~R}iTWP_ul|Q8 z>zrqGFRoqTt+jCPgDZ;16@$DVZ+QK1jkPC_`|?SfWg5lG?g*U9nB0^Vam!ta|L2qD zQ*P7rrtMzHb;-^-N<gGiyz!v_$C%&KCovoh^ef5M;Way5=vfuJ^mJ|s>*Q;EEN#n| zT>03ts=z|@bI9WDb3J}d;jY#6+`_F9baDqrKTBcioJ$|Bm>mwT4nBTd-|hJ8%)SSq zUg6=QLQ&@4*VC;sa<yWopRy^PxKx_QzkB85$D3~ji(7{Hu`gwswd9tf+S<_LObN@_ zo^1AF^fo{KKQ{5w^AF1UNiTnL+CO{!dHTPo>3`0tto~8H?D&Tgou9UD@61oK?%S>s z^QU^E!bP*EFV_}6<Ovaw-h05U{Y3f8CFd=#MEcrgUSzU7b%|S;NorxvMcHl6EPDk{ zf6;fCv8wgQ|H57aKXYEgkjb}SCj9$np)&WMrdPgy&&u0RKL|vgRgm;hjbEs6)ly@9 zZO4X0i$tftzVZu{rxkvgD3xTnH~gJsN=jq-%6o<{T?_L*<q9|b{#D7oocEZyhIW%k zgRw;2OVyWi9zO4W*qrcm0^`Qnttxg$>h6_q=kJ>To%#QFivsPs``&uXy}vu3V|H-P zD7(*cYVO~k?O)43KbJRi+;q99wQoakoavJ4iU0IPoF~Qg*Wa`cE;0{1Kjp6Qtts~` z{`c+v^nRE6|BfH#PoM05HNPhRZ)g6|ljT?KCBO9N>K9&^8~id=<zje>(PaIU3$b6^ z{kJb#A>Ce(UcF@Qaoddr#WRj)OV5_7+_O&e%8}$f>3^-{-miV7rFH0aLGFf)wQr;L zl)c^6UtQ(0=UT7~&$q=hcJH{Mnk1JWxxaA!iN|YSo7Zvmzg_s@RO+oV!5`Tlo$f@n z@6LMV^ssBvvVN`XS%)r8ni^`u_qdO(erD6_#Sd2{+3XkDE_Z~n)U%g6eA)_AQ>ArW z*RNc0nclHu)6ShsL!Zo@@&Br0<bvI|_6Du^!}j&(7v9FLtdnlFuiO`u)w>|?_|@xH zNBLp|T~%lNayxbX(5v34uS)Ce1p5N2XP;aoE>;;e<(73tOWF4A!PP9Q+ykyRG;HuF zecUxQW1?PTet7<smCp;me*B=6<-fOTanpx6eCENkrB5&&nLBTLo!!>T4;_6ihvzbF z4GXZpwsh?gQSB9Wu{RD`eRb1Rw35zSRAsV>;os)UsE${XHcq>xr5o$#E?9T@XZXV| zy;bqg`<c8Y6@OXDEHYy`!SrMQxyy&Hv>jC5vU}yq7!mD>UHb}JZ>_sH|9LLgnb(#D z3U@?~&E3Qw{JM7Pj9n#Z@>|uNVg*d@r`;)177$aZ2+49{TqnA*|9IfR*)_tpJML7f zo;WzKVQ~;++@m+#A-^iubShmFaq!c=(-zI9WxB8D!;0yJ%by%teJ5{C9D6NOyK>S? zt%q7}w@o4sD6VIEW_#s1*Vg!@(r>hxDlh%}8?{2x{oo#rjqeKX?Am&7*Q4yjc^XUm z8kYX-er#4Zf91a&D_5M4?pVD(Xt{{_yzTCKYGvVSZ{6nRZFpmLcyU6-7rr)g;lrli zPkeP+^5$@?=${i|e-4EGJp6i96{ntVRMgSqc@JK_)~ykb=j>5h7vQw2ZsEmCS$1Wy z_RR*5KU_bTmSy`RWT8vw*X+3pCyrOOb7)o6eK6mD+VidNgkbsAukz;BNy=NVxx8K| z%lnEq>%nXl?mt~iL_f{ArL<$UemGm$i5*<w@#mtIPL~{cxn>Pd@q@-6=2M?6tNOP* z_txLPlMXD4-L>Rt&6@zHpt)Wuv9eQC8dN@3tF8^dI`@C7r_#a9=2dmeyrT{t=TlS3 zT<Q|^e}Rgiis$!fUuLf@7jn&&)m#15ERwr(jn#y!k4xA}BCmuAd^>;fkYK6Pj!)~C zR(*)~eNryCuJm=~hEr2FNoN<?Uu$Xp@i6$^{yOfPB2z^_EZ-<|LfX$=d)3F?f%3I3 zpUyL@{++wdiPMOE#gwEIV!OEexvD>3<4{!H@AY_Pu!YW(?OF~CD;Y&6-7wlJs`K>I z^uYO+8^bPiY&}-h@hj++Myb~S#d0_88ARI-C)OMMoK=3IbJ{KTR~OX|&Dh>=#h|Gi z`l#!c(VD3`2cn(}tvPBFQS51vuOH>h`$YDXb=THYQER476}T<7PT)`YhHVwBc`v%F zx(engT$-wUzH;x2kV0v`-POW**FwWW7AfpKCdwJNSo+!A7OT=nEn&gs(R01RF3QKv z5(?c?w4!TKm}1O~@@Mz1cIXML)MhM+IHAw;<R|yXuGLR8w4CQYnlo$ioz?wTPq@XO zuRkQ~GC^Gb;qPX@3wn?I951eP^jj`*(9W}SE(=?^>AwZ)528LC5Q|iMSGG&3_sCuD z2k$;Uj#~Te{^NCSci#S%D_5OpwR-pK{kwPHu1zd;zqE0M#8p}AM(ewEe;)3vy52NV z@$UL5d)Ikz{Q32o@5AdGhQ6!!pIx83j_Z1FQvLiV`#ZM2D(YC3rugLNrpfE4MDIU5 zmupH&gFwlm{MHTn`W5p97WkcDvy5lc4bS>B-R58Z2C=LIv-BOlyz=U<{n7mOQ&E1w zd=^2eV#nK`uZpql|GX`3@`0bMv%C+KHchrF4gBENy(eY8(Z=N;^X?R|e%%_B{%-T? z*1d~OBvz~ooL{fO^6B-t`PaKbW|-S_JD&SkeY)|>-w=+~(T_s7+BO<$@w!D`x%_~y zu3K7f>#oAN$Ju4B8){ur;d@u_vj55p?~i}fpRD>EGH0*XiqJ`3N_x-Z&&yga+N$Tn zHT(MZeED^99mh_(W%w?LESB$B%~G-V>#C}|PyhGj@8z4wr<IV?t98Xp@y*Q@!kt3v zRIfiibY<QlrWKhE%3<Owrd$3mkI>dRda=n&@r^C>d855{BFvKlE%)a}sQt`8uOff- zE#JE?Yss%$b~LrOJ`ERhnDd*}aq?^KE5$B#OEw(Pe|aIWJ(cg(&O4edcaO78{KR_a zpm(9-EO)_a@z;!(cHDZ&9scIn#YbZ6tHL7gc|Xb8r=)R8=$eXPyX}f=;(BMN7fx;o z_f)9O_Eel=`6@X^QLb6jUrET()8(1iBcVs`wtA2EzG4-MpT)mw$qTWo*%8`T8y54s zTe6;e_~f9MW=MVSt^aY63ic(RmONX3^opjrR`Y@L<$Sx}`CVi`5W}{6(Fa9=UgpKe z*|@5moaVmfaq(YRb$4}~_@CMfYZvWfl4(8Z7Mzr@wrEoJPNCvQT#?62r?1ps7xwe} z<F-bt<&&f0LnrT0xyf0+s!)LWxyAGPvR!v}w8@()EZiVa`aIUNO>O55U88nCP1y_i zeL>Mb7;apg-LpbfZ-s>1-z4u9z7|Vl^8dDF?_@KVn$~6ePuhuT!l%uCS*Nc?{a?02 za`mjJ4RRY7&2|wp%($m|?q}k{)h<~(C4@gRyLTlr@Ky6aRC}>AI+efEXpzs#4+8V` zo!2*ePo3!AQS~YGj>-f-ZdvK1YoRl??AhF5b!z>I{Oh+Zd;UkSco*^B>;Kl&f2#xQ z<DEb3w)!8c`9t*mezwA+!MkIh)=9{AHqHvr+UoS;OK|iQr+~dLc9lKmniszOgr=za z5-Z&oQ==A!es^ayt5w+{#1X<46&s*4OZ)lTvYjuKrSEF5EWRS;|8*&Y)~DT;JC;{Y zzr(e+i@pDvwg>B+&$T;FPMssDq{P1R>ss>}@<(|0I_mRiM^!Fg@$M*Z_~M{w%Nm1; zHy3pF$NKbG39JiPw&H8+*F{y1%Y#(EcI8bIcmL%4^KJK@sijvGUj;DiOI3LyqU8EB zRn(@GZMnnQ9AQqwg32GF<^@abl6PynF!bkC{S>`k`1C@-+KffNdh3FYt$*P==Z;yZ zb>7nKea3hD!$dE%IxVqSzoN<g`Nt0BqPXcR=3V&7<oZfA|ASO#&VHuYkA0strG6x` z{S7$$zImN<2>+{+vvvQU$|q%?Ta~mby5-|c16S!k)4Q*JzW3m&qgw3^-KM5x>g-E) zKiJRsQq?NaVs!)0+0RzTTTWlJ+p%wtKjV4{Il*b4f4P3$p|^40j2i{rJFFjEt=iA? zc2Sj2I>)M(ho=;pS$Nh(OWu1MthA^qBt1h%m1jD;WXuw$`(`cckNgMkzY?rJ6<{XA zz@TWzz!2cg$Rxrb!ob17!N9<v$e@#1=~2MIz#zuRz#ziF%YX`eT|*poJ^kGDeI5Ng z-CTo1^nBgm6O#W<L5$;K;9_6^nZ}@qqMMn46N$f{fq@~{SRbw%-66==+DoA5d<oI% zYaCpfS(2)vl9-pDr(%e<ND<vQ<h#gGjho91b_l9*Mg)vQzBm_jfjPos=4>d&`9Lnq z#c`cEx+{?{TSax{O>S()5^yE*4OgHWS`n`N!;4}ZDfhLayZMa);^bz1l!&?}fyWX8 zS7)KyG8O4eJ<uu82(Kh-;jsnlnb7EF&pL%T-UM_iAHr;XQ@mz}U^$}?-Eid1jv6Sz z!{C6&a9ro5pc{|8o)@%Z65)1#A3Vlm**}SHGV&4y(0X8m$)_WcO(u{AkqaACV}epq bj6q%95a7+q2C|WlfsbJZ3j@RXMi37GyczZC literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m3/project/MOOCSettings.scala b/previous-exams/2021-midterm/m3/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m3/project/StudentTasks.scala b/previous-exams/2021-midterm/m3/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m3/project/build.properties b/previous-exams/2021-midterm/m3/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m3/project/buildSettings.sbt b/previous-exams/2021-midterm/m3/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m3/project/plugins.sbt b/previous-exams/2021-midterm/m3/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m3/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala b/previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala new file mode 100644 index 0000000..68e89db --- /dev/null +++ b/previous-exams/2021-midterm/m3/src/main/scala/m3/Lib.scala @@ -0,0 +1,68 @@ +package m3 + +//////////////////////////////////////// +// NO NEED TO MODIFY THIS SOURCE FILE // +//////////////////////////////////////// + +trait Lib { + + /** If an array has `n` elements and `n < THRESHOLD`, then it should be processed sequentially */ + final val THRESHOLD: Int = 33 + + /** Compute the two values in parallel + * + * Note: Most tests just compute those two sequentially to make any bug simpler to debug + */ + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) + + /** A limited array. It only contains the required operations for this exercise. */ + trait Arr[T] { + /** Get the i-th element of the array (0-based) */ + def apply(i: Int): T + /** Update the i-th element of the array with the given value (0-based) */ + def update(i: Int, x: T): Unit + /** Number of elements in this array */ + def length: Int + /** Create a copy of this array without the first element */ + def tail: Arr[T] + /** Create a copy of this array by mapping all the elements with the given function */ + def map[U](f: T => U): Arr[U] + } + + object Arr { + /** Create an array with the given elements */ + def apply[T](xs: T*): Arr[T] = { + val arr: Arr[T] = Arr.ofLength(xs.length) + for i <- 0 until xs.length do arr(i) = xs(i) + arr + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def ofLength[T](n: Int): Arr[T] = + newArrOfLength(n) + + } + + /** Create an array with the given length. All elements are initialized to `null`. */ + def newArrOfLength[T](n: Int): Arr[T] + + /** A number representing the average of a list of integers (the "window") */ + case class AvgWin(list: List[Int]) { + def push(i: Int) = list match { + case i3 :: i2 :: i1 :: Nil => AvgWin(i :: i3 :: i2 :: Nil) + case list => AvgWin(i :: list) + } + + def pushAll(other: AvgWin) = + other.list.foldRight(this)((el, self) => self.push(el)) + + def toDouble: Double = if list.isEmpty then 0 else list.sum / list.length + } + + /** Tree result of an upsweep operation. Specialized for `AvgWin` results. */ + trait TreeRes { val res: AvgWin } + /** Leaf result of an upsweep operation. Specialized for `AvgWin` results. */ + case class Leaf(from: Int, to: Int, res: AvgWin) extends TreeRes + /** Tree node result of an upsweep operation. Specialized for `AvgWin` results. */ + case class Node(left: TreeRes, res: AvgWin, right: TreeRes) extends TreeRes +} diff --git a/previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala b/previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala new file mode 100644 index 0000000..81aff19 --- /dev/null +++ b/previous-exams/2021-midterm/m3/src/main/scala/m3/M3.scala @@ -0,0 +1,75 @@ +package m3 + + +trait M3 extends Lib { + // Functions and classes of Lib can be used in here + + /** Compute the rolling windowed mean of an array. + * + * For an array `arr = Arr(x1, x2, x3, ..., x_n)` the result is + * `Arr(x1, (x1+x2)/2, (x1+x2+x3)/3, (x2+x3+x4)/3, ..., (x_{n-2}, x_{n-1}, x_n)/n)` + */ + def rollingWinMeanParallel(arr: Arr[Int]): Arr[Double] = { + if (arr.length == 0) return Arr.ofLength(0) + + val out: Arr[Double] = Arr.ofLength(arr.length) + val tree = upsweep(arr, 0, arr.length) + downsweep(arr, AvgWin(Nil), tree, out) + out + } + + // No need to modify this + def scanOp(acc: AvgWin, x: AvgWin) = + acc.pushAll(x) + + + def upsweep(input: Arr[Int], from: Int, to: Int): TreeRes = { + if (to - from < THRESHOLD) + Leaf(from, to, reduceSequential(input, from + 1, to, AvgWin(input(from) :: Nil))) + else { + val mid = from + (to - from)/2 + val (tL, tR) = parallel( + upsweep(input, from, mid), + upsweep(input, mid, to) + ) + Node(tL, scanOp(tL.res, tR.res), tR) + } + } + + + def downsweep(input: Arr[Int], a0: AvgWin, tree: TreeRes, output: Arr[Double]): Unit = { + tree match { + case Node(left, _, right) => + parallel( + downsweep(input, a0, left, output), + downsweep(input, scanOp(a0, left.res), right, output) + ) + case Leaf(from, to, _) => + downsweepSequential(input, from, to, a0, output) + } + } + + + def downsweepSequential(input: Arr[Int], from: Int, to: Int, a0: AvgWin, output: Arr[Double]): Unit = { + if (from < to) { + var i = from + var a = a0 + while (i < to) { + a = scanOp(a, AvgWin(input(i) :: Nil)) + output(i) = a.toDouble + i = i + 1 + } + } + } + + + def reduceSequential(input: Arr[Int], from: Int, to: Int, a0: AvgWin): AvgWin = { + var a = a0 + var i = from + while (i < to) { + a = scanOp(a, AvgWin(input(i) :: Nil)) + i = i + 1 + } + a + } +} diff --git a/previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala b/previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala new file mode 100644 index 0000000..176df6a --- /dev/null +++ b/previous-exams/2021-midterm/m3/src/test/scala/m3/M3Suite.scala @@ -0,0 +1,174 @@ +package m3 + +class M3Suite extends munit.FunSuite { + + test("Rolling windowed average result test (5pts)") { + RollingWinMeanBasicLogicTest.basicTests() + RollingWinMeanBasicLogicTest.normalTests() + RollingWinMeanBasicLogicTest.largeTests() + } + + test("[TASK 1] Rolling windowed average parallelism test (30pts)") { + RollingWinMeanCallsToParallel.parallelismTest() + RollingWinMeanParallel.basicTests() + RollingWinMeanParallel.normalTests() + RollingWinMeanParallel.largeTests() + } + + test("[TASK 2] Rolling windowed average no `map` test (35pts)") { + RollingWinMeanNoMap.basicTests() + RollingWinMeanNoMap.normalTests() + RollingWinMeanNoMap.largeTests() + } + + test("[TASK 3] Rolling windowed average no `tail` test (30pts)") { + RollingWinMeanNoTail.basicTests() + RollingWinMeanNoTail.normalTests() + RollingWinMeanNoTail.largeTests() + } + + + object RollingWinMeanBasicLogicTest extends M3 with LibImpl with RollingWinMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + object RollingWinMeanCallsToParallel extends M3 with LibImpl with RollingWinMeanTest { + private var count = 0 + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = + count += 1 + (op1, op2) + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + + def parallelismTest() = { + assertParallelCount(Arr(), 0) + assertParallelCount(Arr(1), 0) + assertParallelCount(Arr(1, 2, 3, 4), 0) + assertParallelCount(Arr(Array.tabulate(16)(identity): _*), 0) + assertParallelCount(Arr(Array.tabulate(32)(identity): _*), 0) + + assertParallelCount(Arr(Array.tabulate(33)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(64)(identity): _*), 2) + assertParallelCount(Arr(Array.tabulate(128)(identity): _*), 6) + assertParallelCount(Arr(Array.tabulate(256)(identity): _*), 14) + assertParallelCount(Arr(Array.tabulate(1000)(identity): _*), 62) + assertParallelCount(Arr(Array.tabulate(1024)(identity): _*), 62) + } + + def assertParallelCount(arr: Arr[Int], expected: Int): Unit = { + try { + count = 0 + rollingWinMeanParallel(arr) + assert(count == expected, { + val extra = if (expected == 0) "" else s" ${expected/2} for the `upsweep` and ${expected/2} for the `downsweep`" + s"\n$arr\n\nERROR: Expected $expected instead of $count calls to `parallel(...)` for an array of ${arr.length} elements. Current parallel threshold is $THRESHOLD.$extra" + }) + } finally { + count = 0 + } + } + + } + + object RollingWinMeanNoMap extends M3 with LibImpl with RollingWinMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def map[U](f: T => U): Arr[U] = throw Exception("Should not call Arr.map") + } + } + + object RollingWinMeanNoTail extends M3 with LibImpl with RollingWinMeanTest { + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = (op1, op2) + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl[T](arr) { + override def tail: Arr[T] = throw Exception("Should not call Arr.tail") + } + } + + object RollingWinMeanParallel extends M3 with LibImpl with RollingWinMeanTest { + import scala.concurrent.duration._ + val TIMEOUT = Duration(10, SECONDS) + def parallel[T1, T2](op1: => T1, op2: => T2): (T1, T2) = { + import concurrent.ExecutionContext.Implicits.global + import scala.concurrent._ + Await.result(Future(op1).zip(Future(op2)), TIMEOUT) // FIXME not timing-out + } + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] = new ArrImpl(arr) + } + + trait LibImpl extends Lib { + + def newArrFrom[T](arr: Array[AnyRef]): Arr[T] + + def newArrOfLength[T](n: Int): Arr[T] = + newArrFrom(new Array(n)) + + class ArrImpl[T](val arr: Array[AnyRef]) extends Arr[T]: + def apply(i: Int): T = + arr(i).asInstanceOf[T] + def update(i: Int, x: T): Unit = + arr(i) = x.asInstanceOf[AnyRef] + def length: Int = + arr.length + def map[U](f: T => U): Arr[U] = + newArrFrom(arr.map(f.asInstanceOf[AnyRef => AnyRef])) + def tail: Arr[T] = + newArrFrom(arr.tail) + override def toString: String = + arr.mkString("Arr(", ", ", ")") + override def equals(that: Any): Boolean = + that match + case that: ArrImpl[_] => Array.equals(arr, that.arr) + case _ => false + } + + trait RollingWinMeanTest extends M3 { + + def tabulate[T](n: Int)(f: Int => T): Arr[T] = + val arr = Arr.ofLength[T](n) + for i <- 0 until n do + arr(i) = f(i) + arr + + def asSeq(arr: Arr[Double]) = + val array = new Array[Double](arr.length) + for i <- 0 to (arr.length - 1) do + array(i) = arr(i) + array.toSeq + + def scanOp_(acc: AvgWin, x: AvgWin) = + acc.pushAll(x) + + def result(ds: Seq[Int]): Arr[Double] = + Arr(ds.map(x => AvgWin(x :: Nil)).scan(AvgWin(Nil))(scanOp_).tail.map(_.toDouble): _*) + + def check(input: Seq[Int]) = + assertEquals( + asSeq(rollingWinMeanParallel(Arr(input: _*))), + asSeq(result(input)) + ) + + def basicTests() = { + check(Seq()) + check(Seq(1)) + check(Seq(1, 2, 3, 4)) + check(Seq(4, 4, 4, 4)) + } + + def normalTests() = { + check(Seq.tabulate(64)(identity)) + check(Seq(4, 4, 4, 4)) + check(Seq(4, 8, 6, 4)) + check(Seq(4, 3, 2, 1)) + check(Seq.tabulate(64)(identity).reverse) + check(Seq.tabulate(128)(i => 128 - 2*i).reverse) + } + + def largeTests() = { + check(Seq.tabulate(500)(identity)) + check(Seq.tabulate(512)(identity)) + check(Seq.tabulate(1_000)(identity)) + check(Seq.tabulate(10_000)(identity)) + } + } +} diff --git a/previous-exams/2021-midterm/m6.md b/previous-exams/2021-midterm/m6.md new file mode 100644 index 0000000..f0eb449 --- /dev/null +++ b/previous-exams/2021-midterm/m6.md @@ -0,0 +1,155 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m6 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m6 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this exercise, you will implement an array Combiner using internally a doubly linked list of arrays. Your goal is to complete the implementation of the (simplified) Combiner interface, by implementing the `result` method to compute the result array from this array combiner. + +Here you can see the declaration of the `DLLCombiner` class and the related `Node` class definition. Look at the `Lib` trait in the `lib.scala` file to find all definitions of relevant functions and classes. + + +```scala + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) +``` + +`DLLCombiner` class contains the implementation of methods `+=` and `combine`. You should look at them to better understand the structure of this array Combiner, before moving on to solving this exercise. + +Your task in the exercise will be to implement the `result` method of the `DLLCombinerImplementation` class. This method should compute the result array from this array combiner. This method should work in parallel according to the Combiner contract. Implement this method efficiently using 4 parallel tasks, by copying the doubly linked list to the array from both ends at the same time. Two threads should start from the start of the list and two from the end. In each case, one thread would be responsible for odd list indexes and the other for even ones. + + +```scala + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size) { + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task1(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task2(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + def task3(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]) = { + ??? + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + ??? + + data + } + + } +``` + +Following the description above, your task in the exercise is to: + +- Implement the four tasks to copy parts of the array. Each task is responsible for computing one quarter of the array, as indicated in comments: + + Task 1: Computes every other Integer element of data array, starting from the first (index 0), up to the middle + + Task 2: Computes every other Integer element of data array, starting from the second, up to the middle + + Task 3: Computes every other Integer element of data array, starting from the second to last, up to the middle + + Task 4: Computes every other Integer element of data array, starting from the last, up to the middle +- Implement the method `result` to compute the result array in parallel using those four tasks. + +Hints: + +- Note that this doubly linked list implementation uses `null` pointers to represent the absence of nodes. Be careful when working with `null` pointers in your solution, to avoid causing a `NullPointerException`. + +- `DLLCombinerImplementation` comes with a private `copyForward` method that you can use in your solution: + +```scala + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) +``` + +This method copies certain elements from a doubly linked list to an array, in a way that might be useful for this exercise. + +## Examples + +Here is one example of the `result` method with intermediate results: + +```scala + val combiner1 = DLLCombinerImplementation(4) + combiner1 += 7 // (7) + combiner1 += 2 // (7, 2) + combiner1 += 4 // (7, 2, 4) + combiner1 += 3 // (7, 2, 4, 3) + combiner1 += 9 // (7, 2, 4, 3) <-> (9) + combiner1 += 5 // (7, 2, 4, 3) <-> (9, 5) + combiner1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val res1 = combiner1.result() // (7, 2, 4, 3, 9, 5, 1) + +``` +In this example, `task1` was responsible for computing elements at indexes 0 and 2, `task2` for computing the element at index 1, `task3` for computing elements at indexes 5 and 3, and `task4` for computing elements at indexes 6 and 4. + +Here is another example with combining: + +```scala + val c1 = DLLCombinerImplementation(4) + c1 += 7 // (7) + c1 += 2 // (7, 2) + c1 += 4 // (7, 2, 4) + c1 += 3 // (7, 2, 4, 3) + c1 += 9 // (7, 2, 4, 3) <-> (9) + c1 += 5 // (7, 2, 4, 3) <-> (9, 5) + c1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val c2 = DLLCombinerImplementation(4) + c2 += 6 // (6) + c2 += 8 // (6, 8) + c2 += 5 // (6, 8, 5) + c2 += 1 // (6, 8, 5, 1) + + val c3 = DLLCombinerImplementation(4) + c3 += 1 // (1) + + c1.combine(c2).combine(c3) // (7, 2, 4, 3) <-> (9, 5, 1) <-> (6, 8, 5, 1) <-> (1) + val res = c1.result() // (7, 2, 4, 3, 9, 5, 1, 6, 8, 5, 1, 1) + +``` + +You can look at the public tests to find more examples. + +In your solution you should only make changes to the `DLLCombinerImplementation` class. You are not allowed to change the file `lib.scala`. You can get partial points for solving parts of this exercise. + + + diff --git a/previous-exams/2021-midterm/m6/.gitignore b/previous-exams/2021-midterm/m6/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m6/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m6/assignment.sbt b/previous-exams/2021-midterm/m6/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m6/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m6/build.sbt b/previous-exams/2021-midterm/m6/build.sbt new file mode 100644 index 0000000..96606f6 --- /dev/null +++ b/previous-exams/2021-midterm/m6/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m6" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m6.M6Suite" diff --git a/previous-exams/2021-midterm/m6/grading-tests.jar b/previous-exams/2021-midterm/m6/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..2127d4e28e16c94709e41b0e9a6bf7e9a5ad4b88 GIT binary patch literal 35241 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℘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 bdnSr8=&oU91NonqftTSEGXulIRuB&WF;VXv literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m6/project/MOOCSettings.scala b/previous-exams/2021-midterm/m6/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m6/project/StudentTasks.scala b/previous-exams/2021-midterm/m6/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m6/project/build.properties b/previous-exams/2021-midterm/m6/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m6/project/buildSettings.sbt b/previous-exams/2021-midterm/m6/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m6/project/plugins.sbt b/previous-exams/2021-midterm/m6/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m6/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala b/previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala new file mode 100644 index 0000000..f754c4a --- /dev/null +++ b/previous-exams/2021-midterm/m6/src/main/scala/m6/M6.scala @@ -0,0 +1,149 @@ +package m6 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait M6 extends Lib { + + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size){ + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task1(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 0 + var i_to = 0 + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task2(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 1 + var i_to = 1 + + if(i_from >= current.cnt) { + current = current.next + if(current != null) { + i_from = 0 + } + else i_to = cnt/2 // to stop the loop + } + + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + def task3(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = last + if( current != null) { + var i_to = cnt - 2 + var i_from = current.cnt - 2 + if(i_from < 0) { + current = current.previous + if(current != null) { + i_from = current.cnt - 1 + } + else i_to = cnt/2 - 1 // to stop the loop + } + + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]): Unit = { + + var current = last + if( current != null) { + var i_from = current.cnt - 1 + var i_to = cnt - 1 + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + val t1 = task1(data) + val t2 = task2(data) + val t3 = task3(data) + + task4(data) + + t1.join() + t2.join() + t3.join() + + + data + } + + + private def copyBackward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to >= limit) { + try{ + data(i_to) = current.value(i_from) + i_to -= 2 + i_from -= 2 + if(i_from == -1) { + current = current.previous + i_from = current.cnt - 1 + } + else if(i_from == -2) { + current = current.previous + i_from = current.cnt - 2 + if(current.cnt == 1) { + current = current.previous + i_from = current.cnt - 1 + } + } + } + catch{ + case e: Exception => + } + } + + } + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to < limit) { + try { + data(i_to) = current.value(i_from) + i_to += 2 + i_from += 2 + if(i_from == current.cnt){ + current = current.next + i_from = 0 + } + else if(i_from > current.cnt) { + current = current.next + i_from = 1 + if(current.cnt == 1) { + current = current.next + i_from = 0 + } + } + } + catch{ + case e: Exception => + } + } + } + } + +} diff --git a/previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala b/previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala new file mode 100644 index 0000000..bfb2838 --- /dev/null +++ b/previous-exams/2021-midterm/m6/src/main/scala/m6/lib.scala @@ -0,0 +1,84 @@ +package m6 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait Lib { + + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) { + var head: Node = null + var last: Node = null + var cnt: Int = 0 + var chunks: Int = 0 + + // Adds an Integer to the last node of this array combiner. If the last node is full, allocates a new node. + def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + // Combines this array combiner and another given combiner in constant O(1) complexity. + def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + + def task1(data: Array[Int]): ForkJoinTask[Unit] + def task2(data: Array[Int]): ForkJoinTask[Unit] + def task3(data: Array[Int]): ForkJoinTask[Unit] + def task4(data: Array[Int]): Unit + + def result(): Array[Int] + + } + + def task[T](body: => T): ForkJoinTask[T] + +} \ No newline at end of file diff --git a/previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala b/previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala new file mode 100644 index 0000000..e04fcf0 --- /dev/null +++ b/previous-exams/2021-midterm/m6/src/test/scala/m6/M6Suite.scala @@ -0,0 +1,422 @@ +package m6 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +class M6Suite extends AbstractM6Suite { + + // (70+) 30 / 500 points for correct implementation, don't check parallelism + test("[Correctness] fetch result - simple combiners (5pts)") { + assertCorrectnessSimple() + } + + test("[Correctness] fetch result - small combiners (5pts)") { + assertCorrectnessBasic() + } + + test("[Correctness] fetch result - small combiners after combining (10pts)") { + assertCorrectnessCombined() + } + + test("[Correctness] fetch result - large combiners (10pts)") { + assertCorrectnessLarge() + } + + def assertCorrectnessSimple() = { + simpleCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessBasic() = { + basicCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessCombined() = { + combinedCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessLarge() = { + largeCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + // (70+30+) 50 / 500 points for correct parallel implementation, don't check if it's exactly 1/4 of the array per task + private var count = 0 + private val expected = 3 + + override def task[T](body: => T): ForkJoinTask[T] = { + count += 1 + scheduler.value.schedule(body) + } + + test("[TaskCount] number of newly created tasks should be 3 (5pts)") { + assertTaskCountSimple() + } + + test("[TaskCount] fetch result and check parallel - simple combiners (5pts)") { + assertTaskCountSimple() + assertCorrectnessSimple() + } + + test("[TaskCount] fetch result and check parallel - small combiners (10pts)") { + assertTaskCountSimple() + assertCorrectnessBasic() + } + + test("[TaskCount] fetch result and check parallel - small combiners after combining (15pts)") { + assertTaskCountSimple() + assertCorrectnessCombined() + } + + test("[TaskCount] fetch result and check parallel - large combiners (15pts)") { + assertTaskCountSimple() + assertCorrectnessLarge() + } + + def assertTaskCountSimple(): Unit = { + simpleCombiners.foreach(elem => assertTaskCount(elem._1, elem._2)) + } + + def assertTaskCount(combiner: DLLCombinerTest, array: Array[Int]): Unit = { + try { + count = 0 + build(combiner, array) + combiner.result() + assertEquals(count, expected, { + s"ERROR: Expected $expected instead of $count calls to `task(...)`" + }) + } finally { + count = 0 + } + } + + //(70+30+50+) 200 / 500 points for correct parallel implementation, exactly 1/4 of the array per task + test("[TaskFairness] each task should compute 1/4 of the result (50pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - simple combiners (20pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + assertCorrectnessSimple() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners (30pts)") { + assertTaskFairness(basicCombiners.unzip._1) + assertCorrectnessBasic() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners after combining (50pts)") { + assertTaskFairness(combinedCombiners.unzip._1) + assertCorrectnessCombined() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - large combiners (50pts)") { + assertTaskFairness(largeCombiners.unzip._1) + assertCorrectnessLarge() + } + + def assertTaskFairness(combiners: List[DLLCombinerTest]): Unit = { + def assertNewTaskFairness(combiner: DLLCombinerTest, task: ForkJoinTask[Unit], data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + task.join + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + def assertMainTaskFairness(combiner: DLLCombinerTest, task: Unit, data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + combiners.foreach { elem => + var data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task1(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task2(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task3(data), data) + + data = Array.fill(elem.cnt)(0) + assertMainTaskFairness(elem, elem.task4(data), data) + } + } + + //(70+30+50+200+) 150 / 500 points for correct parallel implementation, exactly 1/4 of the array per task, exactly the specified quarter + + test("[TaskPrecision] each task should compute specified 1/4 of the result - simple combiners (20pts)") { + assertTaskPrecision(simpleCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners (30pts)") { + assertTaskPrecision(basicCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners after combining (50pts)") { + assertTaskPrecision(combinedCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - large combiners (50pts)") { + assertTaskPrecision(largeCombiners) + } + + def assertTaskPrecision(combiners: List[(DLLCombinerTest, Array[Int])]): Unit = { + combiners.foreach { elem => + var data = Array.fill(elem._1.cnt)(0) + var ref = Array.fill(elem._1.cnt)(0) + val task1 = elem._1.task1(data) + task1.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 0) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task2 = elem._1.task2(data) + task2.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 1) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task3 = elem._1.task3(data) + task3.join + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 == elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task4 = elem._1.task4(data) + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 != elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + } + } + + test("[Public] fetch simple result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1, 2, 3, 8) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result after simple combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + + val combiner2 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 8 + + val combiner3 = DLLCombinerTest(2) + combiner2 += 1 + combiner2 += 9 + + val combiner4 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 2 + + val result = combiner1.combine(combiner2).combine(combiner3).combine(combiner4).result() + val array = Array(7, 2, 3, 8, 1, 9, 3, 2) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result - empty combiner (20pts)") { + val combiner1 = DLLCombinerTest(2) + val result = combiner1.result() + assertEquals(result.size, 0) + } + + test("[Public] fetch result - full single element combiner (15pts)") { + val combiner1 = DLLCombinerTest(3) + combiner1 += 4 + combiner1 += 2 + combiner1 += 6 + + val result = combiner1.result() + val array = Array(4, 2, 6) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + +} + + +trait AbstractM6Suite extends munit.FunSuite with LibImpl { + + def simpleCombiners = buildSimpleCombiners() + def basicCombiners = buildBasicCombiners() + def combinedCombiners = buildCombinedCombiners() + def largeCombiners = buildLargeCombiners() + + def buildSimpleCombiners() = { + val simpleCombiners = List( + (DLLCombinerTest(4), Array(4, 2, 6, 1, 5, 4, 3, 5, 6, 3, 4, 5, 6, 3, 4, 5)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2)), + (DLLCombinerTest(4), Array.fill(16)(5)) + ) + simpleCombiners.foreach(elem => build(elem._1, elem._2)) + simpleCombiners + } + + def buildBasicCombiners() = { + val basicCombiners = List( + (DLLCombinerTest(2), Array(4, 2, 6)), + (DLLCombinerTest(5), Array(4, 2, 6)), + (DLLCombinerTest(3), Array(4, 2, 6, 1, 7, 2, 4)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 11, 12, 13, 14, 15, 16, 17, 22)), + (DLLCombinerTest(3), Array.fill(16)(7)), + (DLLCombinerTest(3), Array.fill(19)(7)), + (DLLCombinerTest(3), Array.fill(5)(7)), + (DLLCombinerTest(3), Array.fill(6)(7)) + ) + basicCombiners.foreach(elem => build(elem._1, elem._2)) + basicCombiners + } + + def buildCombinedCombiners() = { + var combinedCombiners = List[(DLLCombinerTest, Array[Int])]() + Range(1, 10).foreach { chunk_size => + val array = basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foldLeft(Array[Int]()) { (acc, i) => acc ++ i._2 } + val combiner = DLLCombinerTest(chunk_size) + basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foreach(elem => combiner.combine(elem._1)) + + combinedCombiners = combinedCombiners :+ (combiner, array) + } + combinedCombiners + } + + def buildLargeCombiners() = { + val largeCombiners = List( + (DLLCombinerTest(21), Array.fill(1321)(4) ++ Array.fill(1322)(7)), + (DLLCombinerTest(18), Array.fill(1341)(2) ++ Array.fill(1122)(5)), + (DLLCombinerTest(3), Array.fill(1321)(4) ++ Array.fill(1322)(7) ++ Array.fill(321)(4) ++ Array.fill(322)(7)), + (DLLCombinerTest(12), Array.fill(992321)(4) ++ Array.fill(99322)(7)), + (DLLCombinerTest(4), Array.fill(953211)(4) ++ Array.fill(999322)(1)) + ) + largeCombiners.foreach(elem => build(elem._1, elem._2)) + largeCombiners + } + + def build(combiner: DLLCombinerTest, array: Array[Int]): DLLCombinerTest = { + array.foreach(elem => combiner += elem) + combiner + } + + def compare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + val result = combiner.result() + Range(0,array.size).forall(i => array(i) == result(i)) + } + + def buildAndCompare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + array.foreach(elem => combiner += elem) + val result = combiner.result() + + Range(0,array.size).forall(i => array(i) == result(i)) + } + +} + +trait LibImpl extends M6 { + + val forkJoinPool = new ForkJoinPool + + abstract class TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] + } + + class DefaultTaskScheduler extends TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] = { + val t = new RecursiveTask[T] { + def compute = body + } + Thread.currentThread match { + case wt: ForkJoinWorkerThread => + t.fork() + case _ => + forkJoinPool.execute(t) + } + t + } + } + + val scheduler = + new DynamicVariable[TaskScheduler](new DefaultTaskScheduler) + + def task[T](body: => T): ForkJoinTask[T] = { + scheduler.value.schedule(body) + } + + class DLLCombinerTest(chunk_size: Int = 3) extends DLLCombinerImplementation(chunk_size) { + + override def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + override def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + } +} diff --git a/previous-exams/2021-midterm/m7.md b/previous-exams/2021-midterm/m7.md new file mode 100644 index 0000000..899703e --- /dev/null +++ b/previous-exams/2021-midterm/m7.md @@ -0,0 +1,155 @@ +Use the following commands to make a fresh clone of your repository: + +``` +git clone -b m7 git@gitlab.epfl.ch:lamp/student-repositories-s21/cs206-GASPAR.git m7 +``` + +## Useful links + + * [A guide to the Scala parallel collections](https://docs.scala-lang.org/overviews/parallel-collections/overview.html) + * [The API documentation of the Scala parallel collections](https://www.javadoc.io/doc/org.scala-lang.modules/scala-parallel-collections_2.13/latest/scala/collection/index.html) + * [The API documentation of the Scala standard library](https://www.scala-lang.org/files/archive/api/2.13.4) + * [The API documentation of the Java standard library](https://docs.oracle.com/en/java/javase/15/docs/api/index.html) + +**If you have issues with the IDE, try [reimporting the +build](https://gitlab.epfl.ch/lamp/cs206/-/blob/master/labs/example-lab.md#ide-features-like-type-on-hover-or-go-to-definition-do-not-work), +if you still have problems, use `compile` in sbt instead.** + +## Exercise + +In this exercise, you will implement an array Combiner using internally a doubly linked list of arrays. Your goal is to complete the implementation of the (simplified) Combiner interface, by implementing the `result` method to compute the result array from this array combiner. + +Here you can see the declaration of the `DLLCombiner` class and the related `Node` class definition. Look at the `Lib` trait in the `lib.scala` file to find all definitions of relevant functions and classes. + + +```scala + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) +``` + +`DLLCombiner` class contains the implementation of methods `+=` and `combine`. You should look at them to better understand the structure of this array Combiner, before moving on to solving this exercise. + +Your task in the exercise will be to implement the `result` method of the `DLLCombinerImplementation` class. This method should compute the result array from this array combiner. This method should work in parallel according to the Combiner contract. Implement this method efficiently using 4 parallel tasks, by copying the doubly linked list to the array from both ends at the same time. Two threads should start from the start of the list and two from the end. In each case, one thread would be responsible for odd list indexes and the other for even ones. + + +```scala + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size) { + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task1(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task2(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + def task3(data: Array[Int]) = task { + ??? + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]) = { + ??? + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + ??? + + data + } + + } +``` + +Following the description above, your task in the exercise is to: + +- Implement the four tasks to copy parts of the array. Each task is responsible for computing one quarter of the array, as indicated in comments: + + Task 1: Computes every other Integer element of data array, starting from the second, up to the middle + + Task 2: Computes every other Integer element of data array, starting from the first (index 0), up to the middle + + Task 3: Computes every other Integer element of data array, starting from the last, up to the middle + + Task 4: Computes every other Integer element of data array, starting from the second to last, up to the middle +- Implement the method `result` to compute the result array in parallel using those four tasks. + +Hints: + +- Note that this doubly linked list implementation uses `null` pointers to represent the absence of nodes. Be careful when working with `null` pointers in your solution, to avoid causing a `NullPointerException`. + +- `DLLCombinerImplementation` comes with a private `copyForward` method that you can use in your solution: + +```scala + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) +``` + +This method copies certain elements from a doubly linked list to an array, in a way that might be useful for this exercise. + +## Examples + +Here is one example of the `result` method with intermediate results: + +```scala + val combiner1 = DLLCombinerImplementation(4) + combiner1 += 7 // (7) + combiner1 += 2 // (7, 2) + combiner1 += 4 // (7, 2, 4) + combiner1 += 3 // (7, 2, 4, 3) + combiner1 += 9 // (7, 2, 4, 3) <-> (9) + combiner1 += 5 // (7, 2, 4, 3) <-> (9, 5) + combiner1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val res1 = combiner1.result() // (7, 2, 4, 3, 9, 5, 1) + +``` +In this example, `task1` was responsible for computing elements at index 1, `task2` for computing elements at indexes 0 and 2, `task3` for computing elements at indexes 6 and 4, and `task4` for computing elements at indexes 5 and 3. + +Here is another example with combining: + +```scala + val c1 = DLLCombinerImplementation(4) + c1 += 7 // (7) + c1 += 2 // (7, 2) + c1 += 4 // (7, 2, 4) + c1 += 3 // (7, 2, 4, 3) + c1 += 9 // (7, 2, 4, 3) <-> (9) + c1 += 5 // (7, 2, 4, 3) <-> (9, 5) + c1 += 1 // (7, 2, 4, 3) <-> (9, 5, 1) + + val c2 = DLLCombinerImplementation(4) + c2 += 6 // (6) + c2 += 8 // (6, 8) + c2 += 5 // (6, 8, 5) + c2 += 1 // (6, 8, 5, 1) + + val c3 = DLLCombinerImplementation(4) + c3 += 1 // (1) + + c1.combine(c2).combine(c3) // (7, 2, 4, 3) <-> (9, 5, 1) <-> (6, 8, 5, 1) <-> (1) + val res = c1.result() // (7, 2, 4, 3, 9, 5, 1, 6, 8, 5, 1, 1) + +``` + +You can look at the public tests to find more examples. + +In your solution you should only make changes to the `DLLCombinerImplementation` class. You are not allowed to change the file `lib.scala`. You can get partial points for solving parts of this exercise. + + + diff --git a/previous-exams/2021-midterm/m7/.gitignore b/previous-exams/2021-midterm/m7/.gitignore new file mode 100644 index 0000000..40937dc --- /dev/null +++ b/previous-exams/2021-midterm/m7/.gitignore @@ -0,0 +1,22 @@ +# General +*.DS_Store +*.swp +*~ + +# Dotty +*.class +*.tasty +*.hasTasty + +# sbt +target/ + +# IDE +.bsp +.bloop +.metals +.vscode + +# datasets +stackoverflow-grading.csv +wikipedia-grading.dat diff --git a/previous-exams/2021-midterm/m7/assignment.sbt b/previous-exams/2021-midterm/m7/assignment.sbt new file mode 100644 index 0000000..da7eb3c --- /dev/null +++ b/previous-exams/2021-midterm/m7/assignment.sbt @@ -0,0 +1,2 @@ +// Student tasks (i.e. submit, packageSubmission) +enablePlugins(StudentTasks) diff --git a/previous-exams/2021-midterm/m7/build.sbt b/previous-exams/2021-midterm/m7/build.sbt new file mode 100644 index 0000000..25a0926 --- /dev/null +++ b/previous-exams/2021-midterm/m7/build.sbt @@ -0,0 +1,12 @@ +course := "midterm" +assignment := "m7" +scalaVersion := "3.0.0-RC1" +scalacOptions ++= Seq("-language:implicitConversions", "-deprecation") + +libraryDependencies += "org.scalameta" %% "munit" % "0.7.22" + +val MUnitFramework = new TestFramework("munit.Framework") +testFrameworks += MUnitFramework +// Decode Scala names +testOptions += Tests.Argument(MUnitFramework, "-s") +testSuite := "m7.M7Suite" diff --git a/previous-exams/2021-midterm/m7/grading-tests.jar b/previous-exams/2021-midterm/m7/grading-tests.jar new file mode 100644 index 0000000000000000000000000000000000000000..4536552028df3dbab3c2d6fd1d7ae9f4f1322f75 GIT binary patch literal 35244 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 literal 0 HcmV?d00001 diff --git a/previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala b/previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala new file mode 100644 index 0000000..2e4fd9a --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/FilteringReporterPlugin.scala @@ -0,0 +1,31 @@ +package sbt // To access the private[sbt] compilerReporter key +package filteringReporterPlugin + +import Keys._ +import ch.epfl.lamp._ + +object FilteringReporterPlugin extends AutoPlugin { + override lazy val projectSettings = Seq( + // Turn off warning coming from scalameter that we cannot fix without changing scalameter + compilerReporter in (Compile, compile) ~= { reporter => new FilteringReporter(reporter) } + ) +} + +class FilteringReporter(reporter: xsbti.Reporter) extends xsbti.Reporter { + + def reset(): Unit = reporter.reset() + def hasErrors: Boolean = reporter.hasErrors + def hasWarnings: Boolean = reporter.hasWarnings + def printSummary(): Unit = reporter.printSummary() + def problems: Array[xsbti.Problem] = reporter.problems + + def log(problem: xsbti.Problem): Unit = { + if (!problem.message.contains("An existential type that came from a Scala-2 classfile cannot be")) + reporter.log(problem) + } + + def comment(pos: xsbti.Position, msg: String): Unit = + reporter.comment(pos, msg) + + override def toString = s"CollectingReporter($reporter)" +} diff --git a/previous-exams/2021-midterm/m7/project/MOOCSettings.scala b/previous-exams/2021-midterm/m7/project/MOOCSettings.scala new file mode 100644 index 0000000..1c40443 --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/MOOCSettings.scala @@ -0,0 +1,49 @@ +package ch.epfl.lamp + +import sbt._ +import sbt.Keys._ + +/** + * Coursera uses two versions of each assignment. They both have the same assignment key and part id but have + * different item ids. + * + * @param key Assignment key + * @param partId Assignment partId + * @param itemId Item id of the non premium version + * @param premiumItemId Item id of the premium version (`None` if the assignment is optional) + */ +case class CourseraId(key: String, partId: String, itemId: String, premiumItemId: Option[String]) + +/** + * Settings shared by all assignments, reused in various tasks. + */ +object MOOCSettings extends AutoPlugin { + + override def requires = super.requires && filteringReporterPlugin.FilteringReporterPlugin + + object autoImport { + val course = SettingKey[String]("course") + val assignment = SettingKey[String]("assignment") + val options = SettingKey[Map[String, Map[String, String]]]("options") + val courseraId = settingKey[CourseraId]("Coursera-specific information identifying the assignment") + val testSuite = settingKey[String]("Fully qualified name of the test suite of this assignment") + .withRank(KeyRanks.Invisible) + // Convenient alias + type CourseraId = ch.epfl.lamp.CourseraId + val CourseraId = ch.epfl.lamp.CourseraId + } + + import autoImport._ + + override val globalSettings: Seq[Def.Setting[_]] = Seq( + // supershell is verbose, buggy and useless. + useSuperShell := false + ) + + override val projectSettings: Seq[Def.Setting[_]] = Seq( + parallelExecution in Test := false, + // Report test result after each test instead of waiting for every test to finish + logBuffered in Test := false, + name := s"${course.value}-${assignment.value}" + ) +} diff --git a/previous-exams/2021-midterm/m7/project/StudentTasks.scala b/previous-exams/2021-midterm/m7/project/StudentTasks.scala new file mode 100644 index 0000000..c4669af --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/StudentTasks.scala @@ -0,0 +1,303 @@ +package ch.epfl.lamp + +import sbt._ +import Keys._ + +// import scalaj.http._ +import java.io.{File, FileInputStream, IOException} +import org.apache.commons.codec.binary.Base64 +// import play.api.libs.json.{Json, JsObject, JsPath} +import scala.util.{Failure, Success, Try} + +/** + * Provides tasks for submitting the assignment + */ +object StudentTasks extends AutoPlugin { + + override def requires = super.requires && MOOCSettings + + object autoImport { + val packageSourcesOnly = TaskKey[File]("packageSourcesOnly", "Package the sources of the project") + val packageBinWithoutResources = TaskKey[File]("packageBinWithoutResources", "Like packageBin, but without the resources") + val packageSubmissionZip = TaskKey[File]("packageSubmissionZip") + val packageSubmission = inputKey[Unit]("package solution as an archive file") + + lazy val Grading = config("grading") extend(Runtime) + } + + + import autoImport._ + import MOOCSettings.autoImport._ + + override lazy val projectSettings = Seq( + packageSubmissionSetting, + fork := true, + connectInput in run := true, + outputStrategy := Some(StdoutOutput), + ) ++ + packageSubmissionZipSettings ++ + inConfig(Grading)(Defaults.testSettings ++ Seq( + unmanagedJars += file("grading-tests.jar"), + + definedTests := (definedTests in Test).value, + internalDependencyClasspath := (internalDependencyClasspath in Test).value + )) + + + /** ********************************************************** + * SUBMITTING A SOLUTION TO COURSERA + */ + + val packageSubmissionZipSettings = Seq( + packageSubmissionZip := { + val submission = crossTarget.value / "submission.zip" + val sources = (packageSourcesOnly in Compile).value + val binaries = (packageBinWithoutResources in Compile).value + IO.zip(Seq(sources -> "sources.zip", binaries -> "binaries.jar"), submission, None) + submission + }, + artifactClassifier in packageSourcesOnly := Some("sources"), + artifact in (Compile, packageBinWithoutResources) ~= (art => art.withName(art.name + "-without-resources")) + ) ++ + inConfig(Compile)( + Defaults.packageTaskSettings(packageSourcesOnly, Defaults.sourceMappings) ++ + Defaults.packageTaskSettings(packageBinWithoutResources, Def.task { + val relativePaths = + (unmanagedResources in Compile).value.flatMap(Path.relativeTo((unmanagedResourceDirectories in Compile).value)(_)) + (mappings in (Compile, packageBin)).value.filterNot { case (_, path) => relativePaths.contains(path) } + }) + ) + + val maxSubmitFileSize = { + val mb = 1024 * 1024 + 10 * mb + } + + /** Check that the jar exists, isn't empty, isn't crazy big, and can be read + * If so, encode jar as base64 so we can send it to Coursera + */ + def prepareJar(jar: File, s: TaskStreams): String = { + val errPrefix = "Error submitting assignment jar: " + val fileLength = jar.length() + if (!jar.exists()) { + s.log.error(errPrefix + "jar archive does not exist\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength == 0L) { + s.log.error(errPrefix + "jar archive is empty\n" + jar.getAbsolutePath) + failSubmit() + } else if (fileLength > maxSubmitFileSize) { + s.log.error(errPrefix + "jar archive is too big. Allowed size: " + + maxSubmitFileSize + " bytes, found " + fileLength + " bytes.\n" + + jar.getAbsolutePath) + failSubmit() + } else { + val bytes = new Array[Byte](fileLength.toInt) + val sizeRead = try { + val is = new FileInputStream(jar) + val read = is.read(bytes) + is.close() + read + } catch { + case ex: IOException => + s.log.error(errPrefix + "failed to read sources jar archive\n" + ex.toString) + failSubmit() + } + if (sizeRead != bytes.length) { + s.log.error(errPrefix + "failed to read the sources jar archive, size read: " + sizeRead) + failSubmit() + } else encodeBase64(bytes) + } + } + + /** Task to package solution to a given file path */ + lazy val packageSubmissionSetting = packageSubmission := { + val args: Seq[String] = Def.spaceDelimited("[path]").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val base64Jar = prepareJar(jar, s) + + val path = args.headOption.getOrElse((baseDirectory.value / "submission.jar").absolutePath) + scala.tools.nsc.io.File(path).writeAll(base64Jar) + } + +/* + /** Task to submit a solution to coursera */ + val submit = inputKey[Unit]("submit solution to Coursera") + lazy val submitSetting = submit := { + // Fail if scalafix linting does not pass. + scalafixLinting.value + + val args: Seq[String] = Def.spaceDelimited("<arg>").parsed + val s: TaskStreams = streams.value // for logging + val jar = (packageSubmissionZip in Compile).value + + val assignmentDetails = + courseraId.?.value.getOrElse(throw new MessageOnlyException("This assignment can not be submitted to Coursera because the `courseraId` setting is undefined")) + val assignmentKey = assignmentDetails.key + val courseName = + course.value match { + case "capstone" => "scala-capstone" + case "bigdata" => "scala-spark-big-data" + case other => other + } + + val partId = assignmentDetails.partId + val itemId = assignmentDetails.itemId + val premiumItemId = assignmentDetails.premiumItemId + + val (email, secret) = args match { + case email :: secret :: Nil => + (email, secret) + case _ => + val inputErr = + s"""|Invalid input to `submit`. The required syntax for `submit` is: + |submit <email-address> <submit-token> + | + |The submit token is NOT YOUR LOGIN PASSWORD. + |It can be obtained from the assignment page: + |https://www.coursera.org/learn/$courseName/programming/$itemId + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + """.stripMargin + s.log.error(inputErr) + failSubmit() + } + + val base64Jar = prepareJar(jar, s) + val json = + s"""|{ + | "assignmentKey":"$assignmentKey", + | "submitterEmail":"$email", + | "secret":"$secret", + | "parts":{ + | "$partId":{ + | "output":"$base64Jar" + | } + | } + |}""".stripMargin + + def postSubmission[T](data: String): Try[HttpResponse[String]] = { + val http = Http("https://www.coursera.org/api/onDemandProgrammingScriptSubmissions.v1") + val hs = List( + ("Cache-Control", "no-cache"), + ("Content-Type", "application/json") + ) + s.log.info("Connecting to Coursera...") + val response = Try(http.postData(data) + .headers(hs) + .option(HttpOptions.connTimeout(10000)) // scalaj default timeout is only 100ms, changing that to 10s + .asString) // kick off HTTP POST + response + } + + val connectMsg = + s"""|Attempting to submit "${assignment.value}" assignment in "$courseName" course + |Using: + |- email: $email + |- submit token: $secret""".stripMargin + s.log.info(connectMsg) + + def reportCourseraResponse(response: HttpResponse[String]): Unit = { + val code = response.code + val respBody = response.body + + /* Sample JSON response from Coursera + { + "message": "Invalid email or token.", + "details": { + "learnerMessage": "Invalid email or token." + } + } + */ + + // Success, Coursera responds with 2xx HTTP status code + if (response.is2xx) { + val successfulSubmitMsg = + s"""|Successfully connected to Coursera. (Status $code) + | + |Assignment submitted successfully! + | + |You can see how you scored by going to: + |https://www.coursera.org/learn/$courseName/programming/$itemId/ + |${ + premiumItemId.fold("") { id => + s"""or (for premium learners): + |https://www.coursera.org/learn/$courseName/programming/$id + """.stripMargin + } + } + |and clicking on "My Submission".""".stripMargin + s.log.info(successfulSubmitMsg) + } + + // Failure, Coursera responds with 4xx HTTP status code (client-side failure) + else if (response.is4xx) { + val result = Try(Json.parse(respBody)).toOption + val learnerMsg = result match { + case Some(resp: JsObject) => + (JsPath \ "details" \ "learnerMessage").read[String].reads(resp).get + case Some(x) => // shouldn't happen + "Could not parse Coursera's response:\n" + x + case None => + "Could not parse Coursera's response:\n" + respBody + } + val failedSubmitMsg = + s"""|Submission failed. + |There was something wrong while attempting to submit. + |Coursera says: + |$learnerMsg (Status $code)""".stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera responds with 5xx HTTP status code (server-side failure) + else if (response.is5xx) { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera seems to be unavailable at the moment (Status $code) + |Check https://status.coursera.org/ and try again in a few minutes. + """.stripMargin + s.log.error(failedSubmitMsg) + } + + // Failure, Coursera repsonds with an unexpected status code + else { + val failedSubmitMsg = + s"""|Submission failed. + |Coursera replied with an unexpected code (Status $code) + """.stripMargin + s.log.error(failedSubmitMsg) + } + } + + // kick it all off, actually make request + postSubmission(json) match { + case Success(resp) => reportCourseraResponse(resp) + case Failure(e) => + val failedConnectMsg = + s"""|Connection to Coursera failed. + |There was something wrong while attempting to connect to Coursera. + |Check your internet connection. + |${e.toString}""".stripMargin + s.log.error(failedConnectMsg) + } + + } +*/ + + def failSubmit(): Nothing = { + sys.error("Submission failed") + } + + /** + * ***************** + * DEALING WITH JARS + */ + def encodeBase64(bytes: Array[Byte]): String = + new String(Base64.encodeBase64(bytes)) +} diff --git a/previous-exams/2021-midterm/m7/project/build.properties b/previous-exams/2021-midterm/m7/project/build.properties new file mode 100644 index 0000000..0b2e09c --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.4.7 diff --git a/previous-exams/2021-midterm/m7/project/buildSettings.sbt b/previous-exams/2021-midterm/m7/project/buildSettings.sbt new file mode 100644 index 0000000..8fac702 --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/buildSettings.sbt @@ -0,0 +1,5 @@ +// Used for Coursera submission (StudentPlugin) +// libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.4.2" +// libraryDependencies += "com.typesafe.play" %% "play-json" % "2.7.4" +// Used for Base64 (StudentPlugin) +libraryDependencies += "commons-codec" % "commons-codec" % "1.10" diff --git a/previous-exams/2021-midterm/m7/project/plugins.sbt b/previous-exams/2021-midterm/m7/project/plugins.sbt new file mode 100644 index 0000000..021c019 --- /dev/null +++ b/previous-exams/2021-midterm/m7/project/plugins.sbt @@ -0,0 +1,2 @@ +// addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.28") +addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.3") diff --git a/previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala b/previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala new file mode 100644 index 0000000..d941f26 --- /dev/null +++ b/previous-exams/2021-midterm/m7/src/main/scala/m7/M7.scala @@ -0,0 +1,149 @@ +package m7 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait M7 extends Lib { + + class DLLCombinerImplementation(chunk_size: Int = 3) extends DLLCombiner(chunk_size){ + + // Computes every other Integer element of data array, starting from the second, up to the middle + def task1(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 1 + var i_to = 1 + + if(i_from >= current.cnt) { + current = current.next + if(current != null) { + i_from = 0 + } + else i_to = cnt/2 // to stop the loop + } + + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the first (index 0), up to the middle + def task2(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = head + if(current != null) { + var i_from = 0 + var i_to = 0 + copyForward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the last, up to the middle + def task3(data: Array[Int]): ForkJoinTask[Unit] = task { + + var current = last + if( current != null) { + var i_from = current.cnt - 1 + var i_to = cnt - 1 + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + // Computes every other Integer element of data array, starting from the second to last, up to the middle + // This is executed on the current thread. + def task4(data: Array[Int]): Unit = { + + var current = last + if( current != null) { + var i_to = cnt - 2 + var i_from = current.cnt - 2 + if(i_from < 0) { + current = current.previous + if(current != null) { + i_from = current.cnt - 1 + } + else i_to = cnt/2 - 1 // to stop the loop + } + + copyBackward(data, current, i_from, i_to, cnt/2) + } + } + + def result(): Array[Int] = { + val data = new Array[Int](cnt) + + val t1 = task1(data) + val t2 = task2(data) + val t3 = task3(data) + + task4(data) + + t1.join() + t2.join() + t3.join() + + + data + } + + + private def copyBackward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to >= limit) { + try{ + data(i_to) = current.value(i_from) + i_to -= 2 + i_from -= 2 + if(i_from == -1) { + current = current.previous + i_from = current.cnt - 1 + } + else if(i_from == -2) { + current = current.previous + i_from = current.cnt - 2 + if(current.cnt == 1) { + current = current.previous + i_from = current.cnt - 1 + } + } + } + catch{ + case e: Exception => + } + } + + } + private def copyForward(data: Array[Int], curr: Node, from: Int, to: Int, limit: Int) = { + var current = curr + var i_from = from + var i_to = to + + while (i_to < limit) { + try { + data(i_to) = current.value(i_from) + i_to += 2 + i_from += 2 + if(i_from == current.cnt){ + current = current.next + i_from = 0 + } + else if(i_from > current.cnt) { + current = current.next + i_from = 1 + if(current.cnt == 1) { + current = current.next + i_from = 0 + } + } + } + catch{ + case e: Exception => + } + } + } + } + +} diff --git a/previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala b/previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala new file mode 100644 index 0000000..20eda60 --- /dev/null +++ b/previous-exams/2021-midterm/m7/src/main/scala/m7/lib.scala @@ -0,0 +1,84 @@ +package m7 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +trait Lib { + + class Node(val size: Int) { + var value: Array[Int] = new Array(size) + var next: Node = null + var previous: Node = null + var cnt = 0 + + def add(v: Int) = { + value(cnt) = v + cnt += 1 + } + } + + // Simplified Combiner interface + // Implements methods += and combine + // Abstract methods should be implemented in subclasses + abstract class DLLCombiner(val chunk_size: Int) { + var head: Node = null + var last: Node = null + var cnt: Int = 0 + var chunks: Int = 0 + + // Adds an Integer to the last node of this array combiner. If the last node is full, allocates a new node. + def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + // Combines this array combiner and another given combiner in constant O(1) complexity. + def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + + def task1(data: Array[Int]): ForkJoinTask[Unit] + def task2(data: Array[Int]): ForkJoinTask[Unit] + def task3(data: Array[Int]): ForkJoinTask[Unit] + def task4(data: Array[Int]): Unit + + def result(): Array[Int] + + } + + def task[T](body: => T): ForkJoinTask[T] + +} \ No newline at end of file diff --git a/previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala b/previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala new file mode 100644 index 0000000..8e1c344 --- /dev/null +++ b/previous-exams/2021-midterm/m7/src/test/scala/m7/M7Suite.scala @@ -0,0 +1,422 @@ +package m7 + +import java.util.concurrent._ +import scala.util.DynamicVariable + +class M7Suite extends AbstractM7Suite { + + // (70+) 30 / 500 points for correct implementation, don't check parallelism + test("[Correctness] fetch result - simple combiners (5pts)") { + assertCorrectnessSimple() + } + + test("[Correctness] fetch result - small combiners (5pts)") { + assertCorrectnessBasic() + } + + test("[Correctness] fetch result - small combiners after combining (10pts)") { + assertCorrectnessCombined() + } + + test("[Correctness] fetch result - large combiners (10pts)") { + assertCorrectnessLarge() + } + + def assertCorrectnessSimple() = { + simpleCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessBasic() = { + basicCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessCombined() = { + combinedCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + def assertCorrectnessLarge() = { + largeCombiners.foreach(elem => assert(compare(elem._1, elem._2))) + } + + // (70+30+) 50 / 500 points for correct parallel implementation, don't check if it's exactly 1/4 of the array per task + private var count = 0 + private val expected = 3 + + override def task[T](body: => T): ForkJoinTask[T] = { + count += 1 + scheduler.value.schedule(body) + } + + test("[TaskCount] number of newly created tasks should be 3 (5pts)") { + assertTaskCountSimple() + } + + test("[TaskCount] fetch result and check parallel - simple combiners (5pts)") { + assertTaskCountSimple() + assertCorrectnessSimple() + } + + test("[TaskCount] fetch result and check parallel - small combiners (10pts)") { + assertTaskCountSimple() + assertCorrectnessBasic() + } + + test("[TaskCount] fetch result and check parallel - small combiners after combining (15pts)") { + assertTaskCountSimple() + assertCorrectnessCombined() + } + + test("[TaskCount] fetch result and check parallel - large combiners (15pts)") { + assertTaskCountSimple() + assertCorrectnessLarge() + } + + def assertTaskCountSimple(): Unit = { + simpleCombiners.foreach(elem => assertTaskCount(elem._1, elem._2)) + } + + def assertTaskCount(combiner: DLLCombinerTest, array: Array[Int]): Unit = { + try { + count = 0 + build(combiner, array) + combiner.result() + assertEquals(count, expected, { + s"ERROR: Expected $expected instead of $count calls to `task(...)`" + }) + } finally { + count = 0 + } + } + + //(70+30+50+) 200 / 500 points for correct parallel implementation, exactly 1/4 of the array per task + test("[TaskFairness] each task should compute 1/4 of the result (50pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - simple combiners (20pts)") { + assertTaskFairness(simpleCombiners.unzip._1) + assertCorrectnessSimple() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners (30pts)") { + assertTaskFairness(basicCombiners.unzip._1) + assertCorrectnessBasic() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - small combiners after combining (50pts)") { + assertTaskFairness(combinedCombiners.unzip._1) + assertCorrectnessCombined() + } + + test("[TaskFairness] each task should correctly compute 1/4 of the result - large combiners (50pts)") { + assertTaskFairness(largeCombiners.unzip._1) + assertCorrectnessLarge() + } + + def assertTaskFairness(combiners: List[DLLCombinerTest]): Unit = { + def assertNewTaskFairness(combiner: DLLCombinerTest, task: ForkJoinTask[Unit], data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + task.join + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + def assertMainTaskFairness(combiner: DLLCombinerTest, task: Unit, data: Array[Int]) = { + var count = 0 + var expected = combiner.cnt / 4 + count = data.count(elem => elem != 0) + + assert((count - expected).abs <= 1) + } + + combiners.foreach { elem => + var data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task1(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task2(data), data) + + data = Array.fill(elem.cnt)(0) + assertNewTaskFairness(elem, elem.task3(data), data) + + data = Array.fill(elem.cnt)(0) + assertMainTaskFairness(elem, elem.task4(data), data) + } + } + + //(70+30+50+200+) 150 / 500 points for correct parallel implementation, exactly 1/4 of the array per task, exactly the specified quarter + + test("[TaskPrecision] each task should compute specified 1/4 of the result - simple combiners (20pts)") { + assertTaskPrecision(simpleCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners (30pts)") { + assertTaskPrecision(basicCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - small combiners after combining (50pts)") { + assertTaskPrecision(combinedCombiners) + } + + test("[TaskPrecision] each task should compute specified 1/4 of the result - large combiners (50pts)") { + assertTaskPrecision(largeCombiners) + } + + def assertTaskPrecision(combiners: List[(DLLCombinerTest, Array[Int])]): Unit = { + combiners.foreach { elem => + var data = Array.fill(elem._1.cnt)(0) + var ref = Array.fill(elem._1.cnt)(0) + val task1 = elem._1.task1(data) + task1.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 1) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task2 = elem._1.task2(data) + task2.join + Range(0, elem._1.cnt).foreach(i => (if (i < elem._1.cnt / 2 - 1 && i % 2 == 0) ref(i) = elem._2(i))) + assert(Range(0, elem._1.cnt / 2 - 1).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task3 = elem._1.task3(data) + task3.join + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 != elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + + data = Array.fill(elem._1.cnt)(0) + ref = Array.fill(elem._1.cnt)(0) + val task4 = elem._1.task4(data) + Range(0, elem._1.cnt).foreach(i => (if (i > elem._1.cnt / 2 + 1 && i % 2 == elem._1.cnt % 2) ref(i) = elem._2(i))) + assert(Range(elem._1.cnt / 2 + 2, elem._1.cnt).forall(i => data(i) == ref(i))) + } + } + + test("[Public] fetch simple result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1, 2, 3, 8) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result without combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + combiner1 += 3 + combiner1 += 8 + combiner1 += 1 + + val result = combiner1.result() + val array = Array(7, 2, 3, 8, 1) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result after simple combining (5pts)") { + val combiner1 = DLLCombinerTest(2) + combiner1 += 7 + combiner1 += 2 + + val combiner2 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 8 + + val combiner3 = DLLCombinerTest(2) + combiner2 += 1 + combiner2 += 9 + + val combiner4 = DLLCombinerTest(2) + combiner2 += 3 + combiner2 += 2 + + val result = combiner1.combine(combiner2).combine(combiner3).combine(combiner4).result() + val array = Array(7, 2, 3, 8, 1, 9, 3, 2) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + + test("[Public] fetch result - empty combiner (20pts)") { + val combiner1 = DLLCombinerTest(2) + val result = combiner1.result() + assertEquals(result.size, 0) + } + + test("[Public] fetch result - full single element combiner (15pts)") { + val combiner1 = DLLCombinerTest(3) + combiner1 += 4 + combiner1 += 2 + combiner1 += 6 + + val result = combiner1.result() + val array = Array(4, 2, 6) + + assert(Range(0,array.size).forall(i => array(i) == result(i))) + } + +} + + +trait AbstractM7Suite extends munit.FunSuite with LibImpl { + + def simpleCombiners = buildSimpleCombiners() + def basicCombiners = buildBasicCombiners() + def combinedCombiners = buildCombinedCombiners() + def largeCombiners = buildLargeCombiners() + + def buildSimpleCombiners() = { + val simpleCombiners = List( + (DLLCombinerTest(4), Array(4, 2, 6, 1, 5, 4, 3, 5, 6, 3, 4, 5, 6, 3, 4, 5)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2)), + (DLLCombinerTest(4), Array.fill(16)(5)) + ) + simpleCombiners.foreach(elem => build(elem._1, elem._2)) + simpleCombiners + } + + def buildBasicCombiners() = { + val basicCombiners = List( + (DLLCombinerTest(2), Array(4, 2, 6)), + (DLLCombinerTest(5), Array(4, 2, 6)), + (DLLCombinerTest(3), Array(4, 2, 6, 1, 7, 2, 4)), + (DLLCombinerTest(4), Array(7, 2, 2, 9, 3, 2, 11, 12, 13, 14, 15, 16, 17, 22)), + (DLLCombinerTest(3), Array.fill(16)(7)), + (DLLCombinerTest(3), Array.fill(19)(7)), + (DLLCombinerTest(3), Array.fill(5)(7)), + (DLLCombinerTest(3), Array.fill(6)(7)) + ) + basicCombiners.foreach(elem => build(elem._1, elem._2)) + basicCombiners + } + + def buildCombinedCombiners() = { + var combinedCombiners = List[(DLLCombinerTest, Array[Int])]() + Range(1, 10).foreach { chunk_size => + val array = basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foldLeft(Array[Int]()) { (acc, i) => acc ++ i._2 } + val combiner = DLLCombinerTest(chunk_size) + basicCombiners.filter(elem => elem._1.chunk_size == chunk_size).foreach(elem => combiner.combine(elem._1)) + + combinedCombiners = combinedCombiners :+ (combiner, array) + } + combinedCombiners + } + + def buildLargeCombiners() = { + val largeCombiners = List( + (DLLCombinerTest(21), Array.fill(1321)(4) ++ Array.fill(1322)(7)), + (DLLCombinerTest(18), Array.fill(1341)(2) ++ Array.fill(1122)(5)), + (DLLCombinerTest(3), Array.fill(1321)(4) ++ Array.fill(1322)(7) ++ Array.fill(321)(4) ++ Array.fill(322)(7)), + (DLLCombinerTest(12), Array.fill(992321)(4) ++ Array.fill(99322)(7)), + (DLLCombinerTest(4), Array.fill(953211)(4) ++ Array.fill(999322)(1)) + ) + largeCombiners.foreach(elem => build(elem._1, elem._2)) + largeCombiners + } + + def build(combiner: DLLCombinerTest, array: Array[Int]): DLLCombinerTest = { + array.foreach(elem => combiner += elem) + combiner + } + + def compare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + val result = combiner.result() + Range(0,array.size).forall(i => array(i) == result(i)) + } + + def buildAndCompare(combiner: DLLCombinerTest, array: Array[Int]): Boolean = { + array.foreach(elem => combiner += elem) + val result = combiner.result() + + Range(0,array.size).forall(i => array(i) == result(i)) + } + +} + +trait LibImpl extends M7 { + + val forkJoinPool = new ForkJoinPool + + abstract class TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] + } + + class DefaultTaskScheduler extends TaskScheduler { + def schedule[T](body: => T): ForkJoinTask[T] = { + val t = new RecursiveTask[T] { + def compute = body + } + Thread.currentThread match { + case wt: ForkJoinWorkerThread => + t.fork() + case _ => + forkJoinPool.execute(t) + } + t + } + } + + val scheduler = + new DynamicVariable[TaskScheduler](new DefaultTaskScheduler) + + def task[T](body: => T): ForkJoinTask[T] = { + scheduler.value.schedule(body) + } + + class DLLCombinerTest(chunk_size: Int = 3) extends DLLCombinerImplementation(chunk_size) { + + override def +=(elem: Int): Unit = { + if(cnt % chunk_size == 0) { + chunks = chunks + 1 + val node = new Node(chunk_size) + if (cnt == 0) { + head = node + last = node + } + else { + last.next = node + node.previous = last + last = node + } + } + last.add(elem) + cnt += 1 + } + + override def combine(that: DLLCombiner): DLLCombiner = { + assert(this.chunk_size == that.chunk_size) + if (this.cnt == 0) { + this.head = that.head + this.last = that.last + this.cnt = that.cnt + this.chunks = that.chunks + + this + } + else if (that.cnt == 0) + this + else { + this.last.next = that.head + that.head.previous = this.last + + this.cnt = this.cnt + that.cnt + this.chunks = this.chunks + that.chunks + this.last = that.last + + this + } + } + } +} -- GitLab