From e1003c20ff00c637d963ce21fd685fed6460602a Mon Sep 17 00:00:00 2001 From: rattatwinko Date: Sat, 31 Jan 2026 21:40:34 +0100 Subject: [PATCH] A LOT of changes! Firstly a desktop icon system, secondly in the cameras ui you can now see time, thirdly you can now set the recording quality, lastly you have a desktop icon specifically for exporting! --- src/main/java/io/swtc/SwingIFrame.java | 16 ++ .../java/io/swtc/proccessing/CameraPanel.java | 72 ++++- .../io/swtc/proccessing/ui/IconSetter.java | 10 + .../io/swtc/proccessing/ui/desktop/DIM.java | 50 ++++ .../proccessing/ui/desktop/DesktopIcon.java | 107 +++++++ .../proccessing/ui/desktop/ShadowLabel.java | 32 +++ .../desktop/evidence/EvidenceExportFrame.java | 110 ++++++++ .../proccessing/ui/iframe/DesktopPane.java | 22 -- .../proccessing/ui/iframe/RecordingFrame.java | 267 +++++++----------- .../ui/sections/recording/ExportSection.java | 9 +- .../java/io/swtc/recording/cv/Quality.java | 25 ++ .../swtc/recording/evidence/ExportStats.java | 40 ++- .../recording/evidence/USBExportManager.java | 161 +++++------ src/main/resources/font/OverlayFont.ttf | Bin 0 -> 116008 bytes src/main/resources/icons/save.png | Bin 0 -> 35371 bytes 15 files changed, 617 insertions(+), 304 deletions(-) create mode 100644 src/main/java/io/swtc/proccessing/ui/desktop/DIM.java create mode 100644 src/main/java/io/swtc/proccessing/ui/desktop/DesktopIcon.java create mode 100644 src/main/java/io/swtc/proccessing/ui/desktop/ShadowLabel.java create mode 100644 src/main/java/io/swtc/proccessing/ui/desktop/evidence/EvidenceExportFrame.java create mode 100644 src/main/java/io/swtc/recording/cv/Quality.java create mode 100644 src/main/resources/font/OverlayFont.ttf create mode 100644 src/main/resources/icons/save.png diff --git a/src/main/java/io/swtc/SwingIFrame.java b/src/main/java/io/swtc/SwingIFrame.java index 033ea8b..7f0de41 100644 --- a/src/main/java/io/swtc/SwingIFrame.java +++ b/src/main/java/io/swtc/SwingIFrame.java @@ -2,6 +2,8 @@ package io.swtc; import com.github.sarxos.webcam.Webcam; import io.swtc.proccessing.ui.IconSetter; +import io.swtc.proccessing.ui.desktop.DIM; +import io.swtc.proccessing.ui.desktop.evidence.EvidenceExportFrame; import io.swtc.proccessing.ui.iframe.*; import javax.swing.*; import java.awt.*; @@ -15,6 +17,7 @@ import java.util.Objects; public class SwingIFrame { private final JFrame mainFrame; private final DesktopPane desktopPane; + private final DIM desktopIconManager; private final Map cameraToEffects = new HashMap<>(); private boolean fullscreen = false; @@ -25,6 +28,7 @@ public class SwingIFrame { private final JPopupMenu popupMenu = new JPopupMenu(); + public SwingIFrame() { mainFrame = new JFrame("Viewer"); mainFrame.setSize(1280, 720); @@ -36,6 +40,10 @@ public class SwingIFrame { desktopPane.setBackground(defDesktopBg); mainFrame.add(desktopPane, BorderLayout.CENTER); + desktopIconManager = new DIM(desktopPane); + + setupDesktopExportFrame(); + setupFullscreenToggle(); setupBlackBg(); initPopupMenu(); @@ -43,6 +51,14 @@ public class SwingIFrame { desktopPane.addMouseListener(popupListener()); } + private void setupDesktopExportFrame() { + desktopIconManager.addIcon( + "Export Evidence", + IconSetter.getSaveIconAsImageIcon(), + EvidenceExportFrame::showExport + ); + } + public void addCameraInternalFrame(Webcam webcam) { CameraInternalFrame cameraFrame = new CameraInternalFrame(webcam, this::handleEffectsRequest); diff --git a/src/main/java/io/swtc/proccessing/CameraPanel.java b/src/main/java/io/swtc/proccessing/CameraPanel.java index bf24ebf..2259704 100644 --- a/src/main/java/io/swtc/proccessing/CameraPanel.java +++ b/src/main/java/io/swtc/proccessing/CameraPanel.java @@ -1,12 +1,19 @@ package io.swtc.proccessing; +import io.swtc.proccessing.ui.IconSetter; import io.swtc.proccessing.ui.ShowError; import io.swtc.recording.cv.AVRecorder; import javax.swing.*; import java.awt.*; import java.awt.event.*; +import java.awt.font.GlyphVector; import java.awt.image.BufferedImage; +import java.io.InputStream; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Function; @@ -17,6 +24,21 @@ public class CameraPanel extends JPanel { private volatile BufferedImage processedImage; private Function imageProcessor; + private Font overlayFont; + private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + private final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); + + // Cached glyph vectors for performance + private GlyphVector dateGlyphs; + private GlyphVector timeGlyphs; + private String lastDate = ""; + private String lastTime = ""; + + // Pre-calculated positions to avoid repeated calculations + private static final int OVERLAY_X = 8; + private static final int OVERLAY_Y = 20; + private static final int TIME_Y_OFFSET = 19; + private volatile AVRecorder recorder; // this is now javacv, jcodec is stoopid private final AtomicBoolean repaintScheduled = new AtomicBoolean(false); @@ -35,12 +57,26 @@ public class CameraPanel extends JPanel { setBackground(Color.BLACK); setPreferredSize(new Dimension(640, 480)); + loadFont(); + graphicsConfig = GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice().getDefaultConfiguration(); initInteractionListeners(); } + private void loadFont() { + try (InputStream is = getClass().getResourceAsStream("/font/OverlayFont.ttf")) { + if (is != null) { + overlayFont = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(15f); + } else { + overlayFont = new Font(Font.MONOSPACED, Font.PLAIN, 15); + } + } catch (Exception e) { + overlayFont = new Font(Font.MONOSPACED, Font.PLAIN, 15); + } + } + private void initInteractionListeners() { MouseAdapter mouseHandler = new MouseAdapter() { @Override @@ -135,8 +171,40 @@ public class CameraPanel extends JPanel { } Graphics2D g2d = processedImage.createGraphics(); - g2d.drawImage(temp, 0, 0, null); - g2d.dispose(); + try { + g2d.drawImage(temp, 0, 0, null); // this is fucking expensive + drawTimeOverlay(g2d); + } finally { + g2d.dispose(); + } + } + + + private void drawTimeOverlay(Graphics2D g) { + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); + g.setFont(overlayFont); + + LocalDateTime now = LocalDateTime.now(); + String dateStr = now.format(dateFormatter); + String timeStr = now.format(timeFormatter); + + if (!dateStr.equals(lastDate)) { + dateGlyphs = overlayFont.createGlyphVector(g.getFontRenderContext(), dateStr); + lastDate = dateStr; + } + + if (!timeStr.equals(lastTime)) { + timeGlyphs = overlayFont.createGlyphVector(g.getFontRenderContext(), timeStr); + lastTime = timeStr; + } + + g.setColor(Color.BLACK); + g.drawGlyphVector(dateGlyphs, OVERLAY_X + 2, OVERLAY_Y + 2); + g.drawGlyphVector(timeGlyphs, OVERLAY_X + 2, OVERLAY_Y + TIME_Y_OFFSET + 2); + + g.setColor(Color.WHITE); + g.drawGlyphVector(dateGlyphs, OVERLAY_X, OVERLAY_Y); + g.drawGlyphVector(timeGlyphs, OVERLAY_X, OVERLAY_Y + TIME_Y_OFFSET); } private void scheduleRepaint() { diff --git a/src/main/java/io/swtc/proccessing/ui/IconSetter.java b/src/main/java/io/swtc/proccessing/ui/IconSetter.java index afbc5ba..57f741b 100644 --- a/src/main/java/io/swtc/proccessing/ui/IconSetter.java +++ b/src/main/java/io/swtc/proccessing/ui/IconSetter.java @@ -2,6 +2,7 @@ package io.swtc.proccessing.ui; import javax.swing.*; import java.awt.*; +import java.io.InputStream; import java.net.URL; import java.util.Objects; @@ -37,4 +38,13 @@ public class IconSetter { } return ICON_ICON; } + + public static ImageIcon getSaveIconAsImageIcon() { + if (Objects.isNull(ICON_ICON)) { + URL url = IconSetter.class.getResource("/icons/save.png"); + if (Objects.isNull(url)) throw new RuntimeException("Icon not found: /icons/save.ico"); + ICON_ICON = new ImageIcon(url); + } + return ICON_ICON; + } } diff --git a/src/main/java/io/swtc/proccessing/ui/desktop/DIM.java b/src/main/java/io/swtc/proccessing/ui/desktop/DIM.java new file mode 100644 index 0000000..c7435d1 --- /dev/null +++ b/src/main/java/io/swtc/proccessing/ui/desktop/DIM.java @@ -0,0 +1,50 @@ +package io.swtc.proccessing.ui.desktop; + +import javax.swing.*; +import java.awt.*; + +/* DesktopIconManager */ +public class DIM { + + private final JDesktopPane desktop; + + private int cX; + private int cY; + + private static final int PAD = 6; + + public DIM(JDesktopPane desktop) { + this.desktop = desktop; + + Insets insets = desktop.getInsets(); + this.cX = insets.left + PAD; + this.cY = insets.top + PAD; + } + + public void addIcon(String label, Icon icon, Runnable runaction) { + DesktopIcon desktopIcon = new DesktopIcon(label, icon, runaction); + + Dimension pref = desktopIcon.getPreferredSize(); + int w = pref.width; + int h = pref.height; + + Insets insets = desktop.getInsets(); + int usableHeight = desktop.getHeight() - insets.top - insets.bottom; + + if (usableHeight <= 0) { + usableHeight = Integer.MAX_VALUE; + } + + if (cY + h > usableHeight) { + cY = insets.top + PAD; + cX += w + PAD; + } + + desktopIcon.setBounds(cX, cY, w, h); + + desktop.add(desktopIcon, JLayeredPane.DEFAULT_LAYER); + + cY += h + PAD; + desktop.repaint(); + } +} diff --git a/src/main/java/io/swtc/proccessing/ui/desktop/DesktopIcon.java b/src/main/java/io/swtc/proccessing/ui/desktop/DesktopIcon.java new file mode 100644 index 0000000..8ac62e8 --- /dev/null +++ b/src/main/java/io/swtc/proccessing/ui/desktop/DesktopIcon.java @@ -0,0 +1,107 @@ +package io.swtc.proccessing.ui.desktop; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class DesktopIcon extends JPanel { + + private boolean hovered = false; + + private final JLabel iconLabel; + private final JLabel textLabel; + + public DesktopIcon(String label, Icon icon, Runnable action) { + + setLayout(new BorderLayout(4, 4)); + setOpaque(false); + + if (icon instanceof ImageIcon) { + Image img = ((ImageIcon) icon).getImage(); + Image scaled = img.getScaledInstance(64, 64, Image.SCALE_SMOOTH); + icon = new ImageIcon(scaled); + } + + iconLabel = new JLabel(icon, SwingConstants.CENTER); + textLabel = new ShadowLabel(label); + textLabel.setHorizontalAlignment(SwingConstants.CENTER); + + add(iconLabel, BorderLayout.CENTER); + add(textLabel, BorderLayout.SOUTH); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) { + if (action != null) action.run(); + } + } + + @Override + public void mouseEntered(MouseEvent e) { + hovered = true; + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + hovered = false; + repaint(); + } + }); + } + + @Override + public Dimension getPreferredSize() { + Dimension icon = iconLabel.getPreferredSize(); + Dimension text = textLabel.getPreferredSize(); + + int w = Math.max(icon.width, text.width) + 12; + int h = icon.height + text.height + 12; + + return new Dimension(w, h); + } + + @Override + protected void paintComponent(Graphics g) { + if (hovered) { + Graphics2D g2 = (Graphics2D) g.create(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + boolean lightBg = isBackgroundLight(); + + Color fill = lightBg + ? new Color(0, 0, 0, 30) + : new Color(255, 255, 255, 40); + + Color border = lightBg + ? new Color(0, 0, 0, 80) + : new Color(255, 255, 255, 100); + + g2.setColor(fill); + g2.fillRoundRect(2, 2, getWidth() - 4, getHeight() - 4, 10, 10); + + g2.setColor(border); + g2.drawRoundRect(2, 2, getWidth() - 5, getHeight() - 5, 10, 10); + + g2.dispose(); + } + + super.paintComponent(g); + } + + private boolean isBackgroundLight() { + Container p = getParent(); + if (p == null) return true; + + Color bg = p.getBackground(); + int luminance = (int) ( + bg.getRed() * 0.299 + + bg.getGreen() * 0.587 + + bg.getBlue() * 0.114 + ); + return luminance > 180; + } +} diff --git a/src/main/java/io/swtc/proccessing/ui/desktop/ShadowLabel.java b/src/main/java/io/swtc/proccessing/ui/desktop/ShadowLabel.java new file mode 100644 index 0000000..6e5075f --- /dev/null +++ b/src/main/java/io/swtc/proccessing/ui/desktop/ShadowLabel.java @@ -0,0 +1,32 @@ +package io.swtc.proccessing.ui.desktop; + +import javax.swing.*; +import java.awt.*; + +public class ShadowLabel extends JLabel { + public ShadowLabel(String text) { + super(text, SwingConstants.CENTER); + setForeground(Color.WHITE); + setPreferredSize(new Dimension(15, 20)); + } + + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g.create(); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + + FontMetrics fm = g2d.getFontMetrics(); + String text = getText(); + + int x = (getWidth() - fm.stringWidth(text)) / 2; + int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent(); + + g2d.setColor(new Color(0, 0, 0, 200)); + g2d.drawString(text, x + 1, y + 1); + + g2d.setColor(getForeground()); + g2d.drawString(text, x, y); + + g2d.dispose(); + } +} \ No newline at end of file diff --git a/src/main/java/io/swtc/proccessing/ui/desktop/evidence/EvidenceExportFrame.java b/src/main/java/io/swtc/proccessing/ui/desktop/evidence/EvidenceExportFrame.java new file mode 100644 index 0000000..ff1f891 --- /dev/null +++ b/src/main/java/io/swtc/proccessing/ui/desktop/evidence/EvidenceExportFrame.java @@ -0,0 +1,110 @@ +package io.swtc.proccessing.ui.desktop.evidence; + +import io.swtc.proccessing.ui.ShowError; +import io.swtc.recording.evidence.USBExportManager; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.nio.file.Path; +import java.io.File; + +public class EvidenceExportFrame extends JFrame { + + private final JProgressBar progressBar; + private final JLabel statusLabel; + private final JLabel detailLabel; + private final JButton actionBtn; + + private EvidenceExportFrame(Path sourceDir, Path usbTargetDir) { + setTitle("Export"); + setSize(400, 220); + setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + + JPanel contentPane = new JPanel(); + contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); + contentPane.setBorder(new EmptyBorder(25, 25, 25, 25)); + + statusLabel = new JLabel("Starting export"); + statusLabel.setAlignmentX(Component.LEFT_ALIGNMENT); + statusLabel.setFont(new Font(statusLabel.getFont().getName(), Font.BOLD, 14)); + detailLabel = new JLabel("Initializing"); + detailLabel.setAlignmentX(Component.LEFT_ALIGNMENT); + detailLabel.setForeground(Color.GRAY); + + progressBar = new JProgressBar(0, 100); + progressBar.setAlignmentX(Component.LEFT_ALIGNMENT); + progressBar.setMaximumSize(new Dimension(Integer.MAX_VALUE, 20)); + + actionBtn = new JButton("Cancel"); + actionBtn.setAlignmentX(Component.LEFT_ALIGNMENT); + contentPane.add(statusLabel); + contentPane.add(Box.createRigidArea(new Dimension(0, 10))); + contentPane.add(detailLabel); + contentPane.add(Box.createRigidArea(new Dimension(0, 20))); + contentPane.add(progressBar); + contentPane.add(Box.createVerticalGlue()); + contentPane.add(actionBtn); + + add(contentPane); + + actionBtn.addActionListener(e -> handleAction()); + + setVisible(true); + startExport(sourceDir, usbTargetDir); + } + + private void handleAction() { + if (actionBtn.getText().equals("Close")) { + dispose(); + return; + } + + int confirm = JOptionPane.showConfirmDialog(this, + "Stop export?", "Confirm", JOptionPane.YES_NO_OPTION); + if (confirm == JOptionPane.YES_OPTION) dispose(); + } + + private void startExport(Path sourceDir, Path usbTargetDir) { + USBExportManager.exportAsync( + sourceDir, + usbTargetDir, + stats -> SwingUtilities.invokeLater(() -> { + progressBar.setValue(stats.percent()); + statusLabel.setText("Exporting " + stats.percent() + "%"); + detailLabel.setText(String.format("%s | %s remaining", + stats.getSpeedMBps(), stats.timeLeft())); + }), + () -> SwingUtilities.invokeLater(() -> { + progressBar.setValue(100); + statusLabel.setText("Export Complete"); + detailLabel.setText("Files saved"); + actionBtn.setText("Close"); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + }), + ex -> SwingUtilities.invokeLater(() -> { + statusLabel.setText("Export Failed"); + detailLabel.setText(ex.getMessage()); + ShowError.error(this, ex.getMessage(), "Error"); + }) + ); + } + + public static void showExport() { + SwingUtilities.invokeLater(() -> { + File videoDir = new File(System.getProperty("user.home"), "Videos/swtcctv-rec"); + if (!videoDir.exists()) { + ShowError.warning(null, "No recordings found.", "Not Found"); + return; + } + + JFileChooser chooser = new JFileChooser(); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + Path target = chooser.getSelectedFile().toPath().resolve("swtcctv-rec_" + System.currentTimeMillis() / 1000); + new EvidenceExportFrame(videoDir.toPath(), target); + } + }); + } +} \ No newline at end of file diff --git a/src/main/java/io/swtc/proccessing/ui/iframe/DesktopPane.java b/src/main/java/io/swtc/proccessing/ui/iframe/DesktopPane.java index 9fc933d..e2b5267 100644 --- a/src/main/java/io/swtc/proccessing/ui/iframe/DesktopPane.java +++ b/src/main/java/io/swtc/proccessing/ui/iframe/DesktopPane.java @@ -2,7 +2,6 @@ package io.swtc.proccessing.ui.iframe; import javax.swing.*; import java.awt.*; -import java.awt.geom.CubicCurve2D; import java.util.HashMap; import java.util.Map; import java.util.Random; @@ -38,29 +37,8 @@ public class DesktopPane extends JDesktopPane { if (camera.isVisible() && effects.isVisible() && !camera.isIcon() && !effects.isIcon()) { g2d.setColor(getConnectionColor(camera)); - drawBezierConnection(g2d, camera, effects); } } g2d.dispose(); } - - private void drawBezierConnection(Graphics2D g2d, JInternalFrame from, JInternalFrame to) { - Rectangle f = from.getBounds(); - Rectangle t = to.getBounds(); - - int x1 = f.x + f.width; - int y1 = f.y + (f.height / 2); - int x2 = t.x; - int y2 = t.y + (t.height / 2); - - int ctrlOffset = Math.min(Math.abs(x2 - x1) / 2, 150); - CubicCurve2D curve = new CubicCurve2D.Double(x1, y1, x1 + ctrlOffset, y1, x2 - ctrlOffset, y2, x2, y2); - - //g2d.setStroke(new BasicStroke(3f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); - //g2d.draw(curve); - - // Terminals - //g2d.fillOval(x1 - 5, y1 - 5, 10, 10); - //g2d.fillOval(x2 - 5, y2 - 5, 10, 10); - } } \ No newline at end of file diff --git a/src/main/java/io/swtc/proccessing/ui/iframe/RecordingFrame.java b/src/main/java/io/swtc/proccessing/ui/iframe/RecordingFrame.java index 1d6848d..234ebc6 100644 --- a/src/main/java/io/swtc/proccessing/ui/iframe/RecordingFrame.java +++ b/src/main/java/io/swtc/proccessing/ui/iframe/RecordingFrame.java @@ -5,8 +5,8 @@ import io.swtc.proccessing.ui.IconSetter; import io.swtc.proccessing.ui.ShowError; import io.swtc.proccessing.ui.sections.recording.ExportSection; import io.swtc.recording.cv.AVRecorder; +import io.swtc.recording.cv.Quality; import io.swtc.recording.cv.RecorderConfig; -import io.swtc.recording.evidence.USBExportManager; import javax.swing.*; import java.awt.*; @@ -14,7 +14,6 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; -import java.nio.file.Path; public class RecordingFrame extends JInternalFrame { private AVRecorder avRecorder; @@ -24,6 +23,7 @@ public class RecordingFrame extends JInternalFrame { private JButton recordBtn; private JLabel statusLabel; private JLabel statsLabel; + private JComboBox presetCombo; private File outputDirectory; private File currentFile; @@ -44,7 +44,6 @@ public class RecordingFrame extends JInternalFrame { initializeUI(); - // Timer for UI updates only (1 FPS is enough for the clock) this.statsTimer = new Timer(1000, e -> updateStats()); this.statsTimer.setCoalesce(true); @@ -56,10 +55,7 @@ public class RecordingFrame extends JInternalFrame { outputDirectory = new File(videoDir, "swtcctv-rec"); if (!outputDirectory.exists()) { - boolean created = outputDirectory.mkdirs(); - if (!created) { - System.err.println("Could not create recording directory: " + outputDirectory.getAbsolutePath()); - } + outputDirectory.mkdirs(); } } @@ -69,21 +65,38 @@ public class RecordingFrame extends JInternalFrame { mainContent.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); exportSection = new ExportSection(this, outputDirectory, statusLabel); - - JPanel actionPanel = createActionPanel(); - + JPanel settingsPanel = createSettingsPanel(); JPanel statsPanel = createStatsPanel(); + JPanel actionPanel = createActionPanel(); mainContent.add(exportSection); mainContent.add(Box.createVerticalStrut(10)); + + mainContent.add(settingsPanel); + mainContent.add(Box.createVerticalStrut(10)); + mainContent.add(statsPanel); mainContent.add(Box.createVerticalStrut(10)); + mainContent.add(actionPanel); - getContentPane().add(mainContent); } + private JPanel createSettingsPanel() { + JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + panel.setBorder(BorderFactory.createTitledBorder("Encoding Settings")); + + presetCombo = new JComboBox<>(Quality.values()); + presetCombo.setSelectedItem(Quality.SUPERFAST); // Default + + panel.add(new JLabel("CPU Preset:")); + panel.add(presetCombo); + + // Disable combo box during recording to prevent mid-stream config changes + return panel; + } + private JPanel createStatsPanel() { JPanel panel = new JPanel(new GridLayout(2, 1)); panel.setBorder(BorderFactory.createTitledBorder("Session Info")); @@ -91,20 +104,95 @@ public class RecordingFrame extends JInternalFrame { statusLabel = new JLabel("Status: Idle"); statsLabel = new JLabel("Length: 00:00 | Size: 0.00 MB"); statsLabel.setFont(new Font("Monospaced", Font.PLAIN, 12)); - statsLabel.setPreferredSize(new Dimension(240, 20)); panel.add(statusLabel); panel.add(statsLabel); return panel; } + private JPanel createActionPanel() { + JPanel panel = new JPanel(new GridLayout(1, 2, 5, 5)); + recordBtn = new JButton("Start Recording"); + recordBtn.addActionListener(e -> toggleRecording()); + + JButton snapBtn = new JButton("Snapshot"); + snapBtn.addActionListener(e -> takeSnapshot()); + + panel.add(recordBtn); + panel.add(snapBtn); + return panel; + } + + private void startRec() { + BufferedImage sample = cameraPanel.getCurrentProcessedImage(); + if (sample == null) { + ShowError.warning(this, "No camera feed detected.", "Warning"); + return; + } + + try { + currentFile = new File(outputDirectory, "vid_" + System.currentTimeMillis() + ".mp4"); + + Quality selected = (Quality) presetCombo.getSelectedItem(); + String preset = (selected != null) ? selected.getFFmpegValue() : "superfast"; + + RecorderConfig config = new RecorderConfig( + currentFile, + sample.getWidth(), + sample.getHeight(), + 20, + 18, + preset + ); + + avRecorder = new AVRecorder(config); + avRecorder.start(); + + cameraPanel.setExternalRecorder(avRecorder); + + startTime = System.currentTimeMillis(); + statsTimer.start(); + + // UI Feedback + presetCombo.setEnabled(false); // Lock settings during recording + recordBtn.setText("Stop Recording"); + recordBtn.setForeground(Color.RED); + statusLabel.setText("Recording..."); + } catch (Exception ex) { + ShowError.error(this, "Failed to start: " + ex.getMessage(), "Error"); + } + } + + private void stopRec() { + if (avRecorder != null) { + statusLabel.setText("Finalizing file..."); + avRecorder.stop(); + cameraPanel.setExternalRecorder(null); + } + + statsTimer.stop(); + presetCombo.setEnabled(true); // Unlock settings + recordBtn.setText("Start Recording"); + recordBtn.setForeground(null); + + String fileName = (currentFile != null) ? currentFile.getName() : "N/A"; + statusLabel.setText("File saved: " + fileName); + } + + private void toggleRecording() { + if (avRecorder == null || !avRecorder.isRecording()) { + startRec(); + } else { + stopRec(); + } + } + private void updateStats() { if (avRecorder == null || !avRecorder.isRecording() || currentFile == null) return; long elapsedSecs = (System.currentTimeMillis() - startTime) / 1000; long minutes = elapsedSecs / 60; long seconds = elapsedSecs % 60; - double sizeInMb = currentFile.length() / 1048576.0; sb.setLength(0); @@ -118,163 +206,10 @@ public class RecordingFrame extends JInternalFrame { statsLabel.setText(sb.toString()); } - private void toggleRecording() { - // Updated check for the new recorder state - if (avRecorder == null || !avRecorder.isRecording()) { - startRec(); - } else { - stopRec(); - } - } - - private void startRec() { - BufferedImage sample = cameraPanel.getCurrentProcessedImage(); - if (sample == null) { - ShowError.warning(this, "No camera feed detected. Start camera first.", "Warning"); - return; - } - - try { - if (!outputDirectory.exists() && !outputDirectory.mkdirs()) { - throw new IOException("Failed to create directory: " + outputDirectory); - } - - currentFile = new File(outputDirectory, "vid_" + System.currentTimeMillis() + ".mp4"); - - // 1. Define the production config - RecorderConfig config = new RecorderConfig( - currentFile, - sample.getWidth(), - sample.getHeight(), - 20, // Frame Rate - 18, // CRF (Quality) - "superfast" - ); - - // 2. Initialize the HA Recorder - avRecorder = new AVRecorder(config); - avRecorder.start(); - - // 3. Link to CameraPanel (Ensure CameraPanel calls .accept(img)) - cameraPanel.setExternalRecorder(avRecorder); - - startTime = System.currentTimeMillis(); - statsTimer.start(); - - recordBtn.setText("Stop Recording"); - recordBtn.setForeground(Color.RED); - statusLabel.setText("Recording..."); - } catch (Exception ex) { - ShowError.error(this, "Failed to start Recorder: " + ex.getMessage(), "Error"); - ex.printStackTrace(); - } - } - - private void stopRec() { - if (avRecorder != null) { - statusLabel.setText("Finalizing file..."); - avRecorder.stop(); - cameraPanel.setExternalRecorder(null); - } - - statsTimer.stop(); - recordBtn.setText("Start Recording"); - recordBtn.setForeground(null); - - String fileName = (currentFile != null) ? currentFile.getName() : "N/A"; - statusLabel.setText("File saved: " + fileName); - } - - private JPanel createStoragePanel() { - JPanel panel = new JPanel(new BorderLayout(5, 5)); - panel.setBorder(BorderFactory.createTitledBorder("Storage Folder")); - - JTextField pathField = new JTextField(outputDirectory.getAbsolutePath()); - pathField.setEditable(false); - - JButton browseBtn = new JButton("..."); - browseBtn.addActionListener(e -> { - JFileChooser chooser = new JFileChooser(outputDirectory); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { - outputDirectory = chooser.getSelectedFile(); - pathField.setText(outputDirectory.getAbsolutePath()); - } - }); - - panel.add(pathField, BorderLayout.CENTER); - panel.add(browseBtn, BorderLayout.EAST); - return panel; - } - - private void exportToUSB() { - JFileChooser chooser = new JFileChooser(); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - chooser.setDialogTitle("Select USB destination"); - - if (chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return; - - Path usbRoot = chooser.getSelectedFile().toPath(); - Path exportTarget = usbRoot.resolve("CCTV_EXPORT"); - - try { - long size = USBExportManager.calculateDirectorySize(outputDirectory.toPath()); - - if (!USBExportManager.hasEnoughSpace(usbRoot, size)) { - ShowError.error(this, "Not enough space on USB device.", "Export failed"); - return; - } - - JProgressBar bar = new JProgressBar(0, 100); - JOptionPane pane = new JOptionPane(bar, - JOptionPane.INFORMATION_MESSAGE, - JOptionPane.DEFAULT_OPTION, - null, - new Object[]{}); - - JDialog dialog = pane.createDialog(this, "Exporting..."); - dialog.setModal(false); - dialog.setVisible(true); - - USBExportManager.exportAsync( - outputDirectory.toPath(), - exportTarget, - stats -> bar.setValue(stats.percent()), - () -> { - dialog.dispose(); - statusLabel.setText("Export completed"); - }, - ex -> { - dialog.dispose(); - ShowError.error(this, ex.getMessage(), "Export error"); - } - ); - - } catch (IOException ex) { - ShowError.error(this, ex.getMessage(), "Export error"); - } - } - - - private JPanel createActionPanel() { - JPanel panel = new JPanel(new GridLayout(1, 2, 5, 5)); - recordBtn = new JButton("Start Recording"); - recordBtn.addActionListener(e -> toggleRecording()); - - JButton snapBtn = new JButton("Snapshot"); - snapBtn.addActionListener(e -> takeSnapshot()); - - // Export is now handled by the ExportSection component - panel.add(recordBtn); - panel.add(snapBtn); - return panel; - } - private void takeSnapshot() { BufferedImage img = cameraPanel.getCurrentProcessedImage(); if (img != null) { try { - if (!outputDirectory.exists()) outputDirectory.mkdirs(); File file = new File(outputDirectory, "snap_" + System.currentTimeMillis() + ".png"); ImageIO.write(img, "PNG", file); statusLabel.setText("Snapshot: " + file.getName()); diff --git a/src/main/java/io/swtc/proccessing/ui/sections/recording/ExportSection.java b/src/main/java/io/swtc/proccessing/ui/sections/recording/ExportSection.java index fe149d1..2656fb7 100644 --- a/src/main/java/io/swtc/proccessing/ui/sections/recording/ExportSection.java +++ b/src/main/java/io/swtc/proccessing/ui/sections/recording/ExportSection.java @@ -27,16 +27,13 @@ public class ExportSection extends JPanel { this.pathField.setEditable(false); JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.addTab("Evidence-Export", createTransferTab()); tabbedPane.addTab("Storage Settings", createSettingsTab()); + tabbedPane.addTab("Evidence-Export", createTransferTab()); + add(tabbedPane, BorderLayout.CENTER); } - private static JLabel getStatusLabel(JLabel statusLabel) { - return statusLabel; - } - private JPanel createTransferTab() { JPanel panel = new JPanel(new GridBagLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); @@ -48,7 +45,7 @@ public class ExportSection extends JPanel { exportBtn.addActionListener(e -> startUsbExport()); JLabel infoLabel = new JLabel("" + - "Export Evidence to a USB Drive!" + + "Export Evidence (Can also be done via Desktop)" + ""); gbc.gridy = 0; diff --git a/src/main/java/io/swtc/recording/cv/Quality.java b/src/main/java/io/swtc/recording/cv/Quality.java new file mode 100644 index 0000000..b102727 --- /dev/null +++ b/src/main/java/io/swtc/recording/cv/Quality.java @@ -0,0 +1,25 @@ +package io.swtc.recording.cv; + +public enum Quality { + ULTRAFAST("Ultrafast (Lowest CPU)"), + SUPERFAST("Superfast"), + VERYFAST("Very Fast"), + FASTER("Faster"), + FAST("Fast"), + MEDIUM("Medium (Best Quality/Size)"); + + private final String label; + + Quality(String label) { + this.label = label; + } + + public String getFFmpegValue() { + return this.name().toLowerCase(); + } + + @Override + public String toString() { + return label; + } +} diff --git a/src/main/java/io/swtc/recording/evidence/ExportStats.java b/src/main/java/io/swtc/recording/evidence/ExportStats.java index cf5c321..9804f0d 100644 --- a/src/main/java/io/swtc/recording/evidence/ExportStats.java +++ b/src/main/java/io/swtc/recording/evidence/ExportStats.java @@ -5,38 +5,50 @@ import java.util.concurrent.TimeUnit; public record ExportStats( long totalBytes, long copiedBytes, - long startTimeNanos + long startTimeNanos, + String currentFileName ) { public int percent() { - return totalBytes == 0 ? 0 : - (int) ((copiedBytes * 100) / totalBytes); + if (totalBytes <= 0) return 0; + return (int) Math.min(100, (copiedBytes * 100) / totalBytes); } - /* timeLeft, ill implement this in the future (in the UI) i think - * this is the proper way to do this? idk - * */ public String timeLeft() { - if (copiedBytes == 0) return "0"; + if (copiedBytes <= 0) return "Calculating..."; long elapsedNanos = System.nanoTime() - startTimeNanos; + if (elapsedNanos <= 0) return "Calculating..."; - double bytesPerNano = (double) copiedBytes / elapsedNanos; + // Bytes per nanosecond + double bps = (double) copiedBytes / elapsedNanos; long remainingBytes = totalBytes - copiedBytes; - long remainingNanos = (long) (remainingBytes / bytesPerNano); + if (remainingBytes <= 0) return "Done"; + long remainingNanos = (long) (remainingBytes / bps); return formatDuration(remainingNanos); } + public String getSpeedMBps() { + long elapsedNanos = System.nanoTime() - startTimeNanos; + if (elapsedNanos <= 0 || copiedBytes <= 0) return "0 MB/s"; + + double seconds = elapsedNanos / 1_000_000_000.0; + double megabytes = copiedBytes / (1024.0 * 1024.0); + return String.format("%.1f MB/s", megabytes / seconds); + } + private static String formatDuration(long nanos) { - long seconds = TimeUnit.NANOSECONDS.toSeconds(nanos); - long mins = seconds / 60; - long secs = seconds % 60; + long totalSeconds = TimeUnit.NANOSECONDS.toSeconds(nanos); + if (totalSeconds < 1) return "less than a sec"; + + long mins = totalSeconds / 60; + long secs = totalSeconds % 60; if (mins > 0) { - return mins + "m " + secs + "s"; + return String.format("%dm %ds", mins, secs); } return secs + "s"; } -} +} \ No newline at end of file diff --git a/src/main/java/io/swtc/recording/evidence/USBExportManager.java b/src/main/java/io/swtc/recording/evidence/USBExportManager.java index a24d220..3c2c45d 100644 --- a/src/main/java/io/swtc/recording/evidence/USBExportManager.java +++ b/src/main/java/io/swtc/recording/evidence/USBExportManager.java @@ -1,114 +1,87 @@ package io.swtc.recording.evidence; -import javax.swing.*; import java.io.IOException; import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.concurrent.atomic.AtomicLong; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; import java.util.function.Consumer; - public class USBExportManager { - public static long calculateDirectorySize(Path dir) throws IOException { - AtomicLong size = new AtomicLong(); - - Files.walkFileTree(dir, new SimpleFileVisitor<>() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { - size.addAndGet(attrs.size()); - return FileVisitResult.CONTINUE; + public static void exportAsync(Path source, Path target, Consumer progress, Runnable onDone, Consumer onError) { + CompletableFuture.runAsync(() -> { + try { + performExport(source, target, progress); + onDone.run(); + } catch (Exception e) { + onError.accept(e); } }); + } - return size.get(); + private static void performExport(Path source, Path target, Consumer progress) throws IOException { + List allFiles; + try (Stream stream = Files.walk(source)) { + allFiles = stream.filter(Files::isRegularFile).toList(); + } + + long totalBytes = allFiles.stream().mapToLong(p -> p.toFile().length()).sum(); + + if (!hasEnoughSpace(target, totalBytes)) { + throw new IOException("Not enough space on target drive. Required: " + (totalBytes / 1024 / 1024) + " MB"); + } + + long totalCopied = 0; + long startTimeNanos = System.nanoTime(); + + for (Path file : allFiles) { + String fileName = file.getFileName().toString(); + + if (progress != null) { + progress.accept(new ExportStats(totalBytes, totalCopied, startTimeNanos, fileName)); + } + + Path relativePath = source.relativize(file); + Path destination = target.resolve(relativePath); + + Files.createDirectories(destination.getParent()); + + Files.copy(file, destination, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); + + totalCopied += Files.size(file); + + if (progress != null) { + progress.accept(new ExportStats(totalBytes, totalCopied, startTimeNanos, fileName)); + } + } } public static boolean hasEnoughSpace(Path target, long requiredBytes) throws IOException { - FileStore store = Files.getFileStore(target); + Path root = target; + while (root != null && !Files.exists(root)) { + root = root.getParent(); + } + if (root == null) return true; + + FileStore store = Files.getFileStore(root); return store.getUsableSpace() >= requiredBytes; } - public static void exportDirectory( - Path sourceDir, - Path usbTargetDir, - Consumer progressCallback - ) throws IOException { - if (!Files.isDirectory(sourceDir)) { - throw new IOException("Source is not a directory: " + sourceDir); + public static long calculateDirectorySize(Path dir) throws IOException { + if (dir == null || !Files.exists(dir)) return 0L; + + try (Stream walk = Files.walk(dir)) { + return walk.filter(Files::isRegularFile) + .mapToLong(p -> { + try { + return Files.size(p); + } catch (IOException e) { + return 0L; // Skip files that can't be read + } + }) + .sum(); } - - Files.createDirectories(usbTargetDir); - - long totalBytes = calculateDirectorySize(sourceDir); - AtomicLong copiedBytes = new AtomicLong(); - - Files.walkFileTree(sourceDir, new SimpleFileVisitor<>() { - - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException { - - Path targetDir = usbTargetDir.resolve(sourceDir.relativize(dir)); - Files.createDirectories(targetDir); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - - Path targetFile = usbTargetDir.resolve(sourceDir.relativize(file)); - - Files.copy( - file, - targetFile, - StandardCopyOption.REPLACE_EXISTING, - StandardCopyOption.COPY_ATTRIBUTES - ); - - copiedBytes.addAndGet(attrs.size()); - - long startTime = System.nanoTime(); - - if (progressCallback != null) { - progressCallback.accept( - new ExportStats(totalBytes, copiedBytes.get(), startTime) - ); - } - - return FileVisitResult.CONTINUE; - } - }); } - - - - public static void exportAsync( - Path sourceDir, - Path usbTargetDir, - Consumer progressCallback, - Runnable onDone, - Consumer onError - ) { - - new Thread(() -> { - try { - exportDirectory(sourceDir, usbTargetDir, stats -> - SwingUtilities.invokeLater(() -> - progressCallback.accept(stats)) - ); - - if (onDone != null) { - SwingUtilities.invokeLater(onDone); - } - - } catch (Exception ex) { - if (onError != null) { - SwingUtilities.invokeLater(() -> onError.accept(ex)); - } - } - }, "USB-Export-Thread").start(); - } -} +} \ No newline at end of file diff --git a/src/main/resources/font/OverlayFont.ttf b/src/main/resources/font/OverlayFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2442affbf6570d23c0b2b270cca8d49535df27bf GIT binary patch literal 116008 zcmeFa37k~bl?Qz9d$0DYUTB)F1*&Oqqe1AV1r)XD1!NJCMQOE>1{!GDT4>w?s4*^} zaf?P{HWM{2F|lxoOI$OPWU@?>nPjq>iOFOVlT4gU#%xT~@Bcsd-l|tcH;c)9zu)&w z3cBi5z4z`t_uR9ebMI4HDOH8HK&iRy9do?B-cF_TQ2aVpb2$H#b$#nMU%d88 zw3q#bo=NDV1BO^m|^}(9^v(zGLpc;ykZAaRYt` z9*C~P_l5XAe#7SeOFvb;>{)>J4@xDE+O%~|_jTWX?I9e0NU6y9&E1#w1;=H+fa@D^ zeRfOt=AN$mu4q##`ZVDGY2ViE{pY{u`hQev5?~y1X5Y4+zVD3u_Adc%9M|ttTIsjn zR+acviV*VUDeYbAy-WEx#_!&(Y6i}YS23K)sk77#`2Fe3Fy71a{%gF+f9=oTmSeUQ zdU?Be4ci*F>v!i~P&w;&$~Sj>>zM5CdEvJ%{Z3g8y)M6H0nvh|)jup* zu}|xpI`jIOxQeSaefw0b^~p`kW{nTj@jT8YyOJHrNy*`fAZ~x?jh+>q866jqA5yK) z55Kbd%G8xn(o+JLRJJ~kzRf@R#aHe7#_Q|PT9MCPzha-iwte5x{Pt}8N~MF`^=p>l zN7demS1#EdpBJARuZsog9*O+ zvN)$ev!s&<<}3x;tW-nfw$}zUCGT6;Y*O#ux^3+ib$R%G`;NZtsz3Y=Ftl(JAqJt~8);kv zQoa*T;Uv5(mC`@e_vrI=yN-j3KB6vG8`Mc^gq+hDuZOV(>JRFV^2fUaHBY@uy=>cw z zLez*~hndkpYWdzs{Xh7nLPfop`Q}CC^G|GF|55M9ryC7too)UR_dqD(&%wr{p=vU& z>)XeWg84gpO0VcbWY?9XihFEJknIufUN4rS{`r zAL#W2{M)Y9sBNkj-}`Yq8GpTM6F#@%*Y!AmrkbM`s%5yV7w5A0wpDGxwOO?kN9%BO ziR#9+J^003u?e4R@O=xe?@?><`wkqh#ql;A_oF3VyA(9G5T9qFXI>j_d0|NljW~C< z+)dcndsa;ag#62fAS>v{FLJK z67+Bhpu1e4?NQCp&65Fl4|+I3wc%G{;|%n;Mb0f2{A~xmmf{LxvtKo-#cGmTg6q}; ze}sP90a$28t5f7(u?1q*wUL!pvSqCl?>ZTIvKrj4i61ODMZD)4(ylX>{FMa z-Cm4=7$Q7VFmFvbB1Lg74%UJ>yH#C?E7!>Vvw;iF9I2Dkcr1P=HZN1T0kM4?cs@Me zgq~En4OC%hvq;a2faA^hHLJ!Q6smFHq4D92c_rAK^-FJ~B0!I%n!5Q-9sm(6p!N8_m_tXEy)+wDHp}pZ2wu<616n`NN5) zpZLw`vFUTBKR83rxOB!>X8dtx^UVI4pPKotlZKqsb<({j{p{ppPrmBpXJ-wWwSLyU zvwnTbxu^X4)U!|Bb?URH)tol}v@1`0=Cq&ZDsvlh59D5(J$m-lv!899(0WDdKepAk z-QJ#QKd1dm9l4HcI-c(M&728ymdv?h&RcVHbFY~D=IK|Q{_S~7=iNK+i}U_#e&hVU z`JbBqFAHiHtX=TPg5NBhw(zQjpFQK)Gp;-1pBB|E>Rj~rnayYRp83q;>c#68fAOsO zXZ_QXGnQPlRhd1vQW&mDE{taC3v_w(n~oOj20pF8h2=Z`#p(fOC3pFjUsUE{h| zb$z(&H!DwHdC$r(Ur>F)DHm+J;OSN4R&}qsulwZgtGoYW^^DbbtvPAUooilSyJ78* zda8R)?zz3^rFE%w7q0urx*x2MuWwp^&$mOwlli(terRR{Qj=VyFR!( zvb%ftt-C+F`|T?xUa{kfZ(SL^GI!;rSAO)$KV3EPsw=Mg;kzfld*i#me)Y*$Uw`!v z-!t_+x4-8{*G#+Swrjq3ZT8xWuKmQdKfP}9br)av)9a^QfA{sTUjO!zBl^bW$!)zy&t}5)J>ajdibWF-#p>w z9XJ2zmMynDd29WxOK!dA)*s$B@wSb({qlVc?|b}x|9bn}+dp^v@9&s)$LH_(^ZT3M zzw!N_yfbm<^gH|ReCDp1clF=(^j*LEz{wxj^MRk-ebU_@{b2Hg8$S5e56%0~XFl}P z51;qpYd#YF$h$uBqmR~q^p212zvt|GzI4xTKQ`fG+dh{6c*Vy*e(&-3e*V7neeb&O z{rA0a-)r|L@1K7E`up#^|KIO_^Anps@skH)57a-f^nra3eEq@d2bVl}@q>3i_|`+K zAKLZMT@O9}(AOXO)x+B!{?jMV`Q($I{KX@qA6fFq_DA0T$WxE}^QQv*JLXfnKK1IS zTR;8LPrvo(X^-X~-Jd@te^LJFeR^MFU-Q0u_r3C%|Jbz09)G;)@fD9>@%Yn^|KW+5 zPjo(U+Y`?`@xv#6`{d{+r$4#z$vZ!D%x9ke%qyRH^QqBKo%+=KpUOY=m8X9GwEy(P zr`JAx-P4ag{mrNMKQr-}3!ZuQ*}2a?_1STsed@VY&+UBf`RBg#y!U+L^J|~~((`|O zVZ;k_UbyImyI*+rh5vl9^2JkL-0gBs% z{^rYXeQxIGx<0oBGLi-&z0;wzKIAiqzJbrj)RnN$nsAhXHk_%h(5LHeeTBZwtMi`o zzUY0$`=PJ>qx}~Da(}nK*T2!f#s8T9ke~Ozuiq9hs1=&5p{B$&Sk&ot=_BDchdy&pwiUH2XyM>Fo3M!|KP? zzi*s3E;_DqT=lrxaihkK88>m<>El+7>zVM_gwITPZo*3wzI=4_=v7CrIeOjE7yg(2 zA(^DP6y zyfy@LL}2a#%nC3wYM|f#9n9D-3haD)0N&P1=G)tszP;@2IdAQJ>v5&tnvK8gTVwHF z&$EC2Po>^G&Rln}_n*}A?2mu(lVg7TpFe*2$G80WMtr;W$JhLL_m405@fk|Jy7blg zueQEA`_+lB&U|&stK(nwfAsH4z4FOd9(?8ASMGV`wpY%7#eYS=qJHpZ_05Ui$Qwc_ zN_`rQepxT`?(_Z`LN7J z+1`cTaM%M`FX7GhD!lPtjW^QEcq6>IUb{EP8|wAKXQ+gSI}ASDcr`&C4=Zm5=xLT} zg*7%$ErXSJjyg}Rf>lHNiFVE<-e@oBjqxr9wOt4Q>soc4dat?_p5BMl$Ka_viWt!o z>RI(!cx_)*UsGRK-&EgM|EhkWeyRRL{aXDOIO`%0{)gA>HF?$EG;fyI;+^Jg^EP?c zc$?K9yraD{yb0bGZ;#jK%@_aXN^hCB(Mx$(dm28^F<#7zdU3B7K2HQ5aR%N}8s1%v zs#kUJWXHm@I6*AC;p%j?NX>_BzeJtkwZgLQg-vDbzvb$?;QgIyw|bAdLS3z{QG3;0 z>Na(UdcS&DeL_8`9#S{KpZ= zqVR4+53YxFxk1&c8{wtyfuDA>8mVr9{q_NMlzJaH^-k5G?pCAK?dlkK=|`&%tK-x? zuo^!KyYOB$5uVy~&{~Un1U&tKI#GQJ_W1pNBu1 zpN6;ajA~cU!Ebm0mhhIvqd=d8dSJVpi4Rx;iXIR(&q|R60QWvQ2 zAXf5i)usLgUdSu3G=Biw|24Hy{X2Z9S7CSl99Hg6Vdwu$U8H^mEB8NPps+Z~I`fS~)&(&Re zrM^I~(yR3ry;WbN`}8)wU0>(hPt!N)7Jak+ zl>W4yu5Z;d^lf^kexE)`->y&Acj#IA{rVJrr#@Amraz!_`fh!fo~=KqTlI(ZqdKqK z^oJ3@`H1e&AJuaZ&6%q|22J#FJx|{Y*?ym1pzqfU^(XWh`T@O2Kd8^t59!7FVSSeV zq+X&Q(I@I#ym4N=*WgX`8olGa?Owl^_D=Ptd*^v8yiV_2Z=QEL<9L)9`27FU-!2O; zKM(a+KCXeTFTdvh&F|&#{3U(=HQV}2;27*)!Z+AC_j~ym!rysK_`5rH_qy}$JI|N@ z=Fa^!K3)IrbD%bHPG2$r+yh-Z*l%tegPkAj_krMYzrE8o2kPsu)s};8pgsor?Qr^a zZHBLPzYWypk^B~Jv;02S$HA^Czvocj|5|MwE^Mwp_jxe*25a+h?mbw$Ja@Ql40hdM zznAyR>kju?ckkieb0qB!cI{xlJ6J-WB6IltaPHZU>%xDbc1q-R_!`%)`;GVT*xk$X z{O+!E=fl63pXW6^KhQnlbFNSK>8>yT48!7%!|jBx=dt@9zNWkncP{+N4pT z2Z9msajr{rjDrof-J2)j?<4p_p6tz|2q*Ko{Kw2LY-!2wmVT2nyYi|rn^((MbaZC3 zNOM=5wICl|dhUw+w7UGUovYSm_by+N_a=0kr1zSJ)phmtdDWR$Z4K>@!B1{m)jBD! z8}r#!>n7#B#_ZZ`{-wqF;OKK7J60##I@WaLqa7>i^Zta+CFiZEZ>X=^yCR!kycj>_ zI_t9e89bWN*_qvEuI^r&KNdgPZ`u45o}a=iUs}8(3uyLsXY3p4i#hkXMUW^mKMk%KMGkj%+@d&<)5UZHrgrBMq(jXhSQ;fn5HoN%^3$ z0dQs4?u)E$&GHN(t}_tuJs+&$;b8u4w42 z@66_NOIP4r9fxN7pOlX@=3{LWA442UFcrnuhSmmPyrH!_@2y^!*J}VpK63n|e5^4` zP*ZJdo(|M%TmoQot2%kfs&)Z2-uPH7rP?}LkFPJ_KG9e@7fI8Ko(K>C`-D~5j=c@t zoEO2Dsv}PG**XB}pv3Gnbhn!>QiI%{ACJ3mb75%Vo6;nqhStYYNgtD4*HGVieEp<+ zrg5L=b>!D}w@=DfG-3eRY(CvKpX0(oLu+R~!*5IQErV~9@|9?&N>Gvo2G#)Vd_~); z?A}$`dl<*JI|eoIJZ}Lj z@N6eWG8gdA#jmAPHOK_+Q>vx`C~nKEQy+u(E7VZah?t4jv1~=YvY|EGkxzm6k_{lZ z*6b>D|73NwMtGyOb?>TuL!uM&dnVS61Db|nY&8=nn@$;z0eQ|z{ZrqpP=W&g|g28(}x(XO>$WG4dE;7iZ{PCfa z!wM%aGAAd7P99x2xy_s$)2Q;9iSJ;1V==xlfGdmf@v|P|M7USb*V`Fxfu+OAMptX8cwheQ;inP#;&wL|kb#h~V(!~5EaN!AH zfVrU50okyjdqx8#;z6$f8BWSiDNL;%mOtV6eGy&Tu>yjO6F4=DnFCKZHD+4`-ez2< zI}Vfv5HbUT$KTbkC+O*`_EQ^X>}%4s9NaV@01yv&&nj?5_l!yTmd44$XHCkVc&JN3 z!E12&bj*nwHX%DXJC~dfT+Z9OcW%R6NSYN;5s<792PbM>I}|9L0TDGUUxmv8NX-dy zSw7J=v1jk(hHQ4$UbHu}^pfmk(^fvfO}H|fUqzvjJ8Q+`Ue?dnJ??iqCr z=wS}VhY#rm?G4Zg0HMSUASEyf5l|KsL>VM#u^Tr}5FqdlrA1L$>21q_|ZLcBTODr2HwaH^IK0s#P=r%7^Tx_f!aq$;9HEd{x_u#dT1b*;$>F_f6JA z!Jwy=oLy44xa4fECWbF?H@Oa58}lN_or z9gwXvCOSOK!MB+c>p4rrgdIs?&~q{9TEpNlH^9p^lk?NS&!-Ra`#dzKht}jXJ6aIgpmng?e#KBncD#W;{(&f+y4IJJb= z@L(yg;lVOq!-M6G$RDZMI650gT8_?Xd|aE~R^Z6|*2(KMuRE95$)`84uB6Oie7Q@yR$B6AT#=I0m4UnG$A=|Qzl3YnTO>$Lic&gcqc zgN|2!)RnqQSF4G7h^|59+)(vZU5i}P*WkN-9T|_|dW4#!N2mYkE%SfNxw#BtOeN>E3%98)t`{}XxANT zfu5u1B1`uj)vr%SuIUoB1DTKc$a*YPXXrE3BIG>IRA(aNaTc;2OOb_Jtj@Bzo^z0y zTB0t~E0BxasV-;k2YJX{u&9?JOSeodmpo6GIvZ8s|E~V5FHn2*Ds>KWJgfB@XE zwa5crh0K4CUZ>aV4Z0VZvUBx?$a|iz{zGp>F0)H-Qa{(5kqvwqS-X!&MyU@uC1#ZR zkxyb)iMgZ8kxSZXb4gc9j_GRTkgh@g=sM($_8@0;1M)@hMXu;(eG9Tgw;@AxJF-LX zM`q|Qg}p{epf`zocK*pVNP*|6YGye?fmy|AYRL&B*&V~z1{u8H+MM3+^&ec#ss6KmQ@^F(220r5R4;;TZ4CL^1oFlyWTi65MOPwAU5zYt z4YJU+$X5?XR(d2d%5}&Lk4AQxS?hXav>K4Lo`8(-G2XG>amZ^iyEVz1?496E@unhw z+>HEj3v%7ly&2w2?}Y2XftWz0;8ao9`_^-uVn~k$0xI z*gMNx;w?pHdAa%^a^>gPJlT2P`CgZ|(!0Q0<#l_jy*1uiug6>Gt@k!~z21e$G7m+L zcbFQE4DU$f&FfH0yAiqT&E6K|Vc$UQ^Y4+7J`MTT>yYcMMD{j7b~lRr@Hk|6Bgh$# zL4LRu8Q4|G;^w3p{c-h}w^dbneaJaKj7;u}>hs8yg>N0Xgv-ksH4N z+2MDq&v`eg+1}0GE#9r(ZQlF5+r2xy_j`9D`~L&v#Qzof^qY`PZbOFr`^X~yP<_w4 z%lm+LxA(zd(ei~0qqA3U>$$imHhXjTnr&OR#Aa_@zjaH`M)+5~+t%#Zylzv^rOCFn zTl>4$tm)a(A8lXLjjQmnZEJUbv_tNVcF2#(j>2WJ4%=FXZEbF`we;LITQ_g+Hti+n z7VZg7U){Yeb$anaZ{GaqJOkW3+uS_UTy$Q4@20gqsrki=(+fhaMi+Lk+0ow|=?{{ojA3alg&78Sm$CmZo+jeZ;)V-rWcBX+Ly2RYO#N4|i zbZ>O2oJuV%f)y;oprXs<+SraQy;GW|&W6Gh$JC)XG52{v#VHxw_7_Dbts?}f2m+gz`m#$GeJ3yT-0H-=hGZ(P5vr)SHi?k#J3 z*F-lNyl*mi-xRto*o5ArTg>?_=KPk>dA|pk+-i`%wFK!~4M0&W5+S{8Gxu%_-5cF5 zr&8OCFh(|Q-Ligr(9fCempkmtwnlfDPIi=Zvcryghn?9SGP66(*e@xzo4Txc9KBq+ zOJsxKRt+w4(dwrWd-)8aNX2;WRe{Z+& zwcGpK?fvbxpLW|%hrO=Dj-$g~-(j!su-DD8?ar~+&#~9fvDeQr*SAbH@U={}{WRPA znk}5o_Wou|A1#ia-Fe$?vz^Ztdw+{NZ~JSu^Vw|SY_{~!V&}ct;;F^KVe!-KzPsz} z_?qqfPqY0^v;9r8@J@5^+UuuTIHy@Sr&)NWS@@<|xTZO{T>G~FX%@a|7Ooa|orBwr z-}PhRZL#gQ*#25EJ~ zw#CnEb6<<&>)H0Y+3q?EN2|TQ)wbJe+ikVix7q93EWB+NPwn=;b_-v-y}#Yw-){S9 zxA%A0>pJW>I_&iw_WBNc-5lHQ9DDs7d;J`H{Ty?B%Txnj%TzZWJ0G*{_3ie1drM^Y zroIi`L2FNccVuoi3?LDZ%@7bBecOAXQi5}F%J0DGWgBo5%!ADpS$BaLv!A?Z@$0h~%2Y!}Q)ag(y0>iY z@7dJTYw2dXVdN>Zr}*t13)yPZl-YBFjvd2{~N5^^z^-Xj9L+{#gIE-tP4~`lQbmC?NU1c8mFL z6i?HMQv`B+o*3EQ*S)qUShH!z>IfFaZ|je(?d{&Yb<5h+<{jI6*K}{iTM3UtM2YU)xaK+|qz0 z*l(rvCH&jJYZq?%^Bqj(@7nd&o?Q}`GVN5t7rk}?)8V-je65pMm)e&?j47Ge0)HGU;_G&zrXZJ*kBY(lIX*nIBnLmzyegBz0o9xdkzlL)_DuLy`ONVF&{csjk8R zDyz*alc<~60T8>8o2wh}SzX`K(9%%bunScPyLRn=YY#tm?eZ?-`xjhq2?|vuucjm?f!PqgQkE$CrazrpZkP(}aV%*h<(Gzt;OLL73 zld~oNIPlsA8FFnsN4Xzk=G@sA>NYm+dMl0j6NK1bWsS5Oe+;uZR(;xF;H0FEXVS5F zAI2HWq_@B?&%_ggh)7Tw>G3d|y34Qfh>Pl!7mEceqdExY2N*xlhnq9;^lo!^Z08Z& z-kCc-9#_gCAU-_qro6HulTIZQv1lZ~#QD`j615X+Y8zT2W#}LkI8^L6Q*Mx9XaETC zUn2qv=-4laB8NC?7>?*lgL=l`qCKW{751IztJYYvP^orCv>(-8+V^@807)h)l07Pu z3A$7e%v+$Us?uF5onE*g4iqI;4oP{5#QX%X(jm=M>B`-INjsgnaY{9etIs+FVb($v z0y?Pyg&1}KUW6qY3T#mW=JpG$;b;NaAwCRxERu*H{0dTfD~;m;DCKE`ol{~uQjrNF zeU&;BRAjbbMMN@@PWDv$Rp4;dMM?o$Dk`E~DjFqPf*_2R)8zh&NM^TbAlP|iEp+B4 z$Kye8Fp3Fc0fFAdT;@9s0P47VT3pt0_kB{DDKcf7SdoLeGqAaA$u1cAWgtQ z1^yvw_zH87k9cLBde}-6a7;So`F$CUIBaSQVv+G!GTu`GOkg#L5J);L9JFu&Sj&s8 ztV}?r%#Tr;$jxa#wcFf{u;St0-kCd^sGuk%mjpEdl}9-ms)Q=)2d4<{qJaqF0CEs6 zQKC<(5u+WAsOU=u19PC{B0)0I2ja$t6E+1YmA&lyx8hhijt!y zf;2!N#xStr#Htw|Vs<$Ah`b@n#)=N}u^%?X9&m~M(TI~$8mSSUaXL4mbwvhJ7HSld zKzUF$X^=@e-lI|}zYBZuh!{zB0b`^RY-+T!sz4>D$n6z6v-_Rg51m^SAjAWxx2Avw z>RcmHDK_Mv@JqQg1q+mmQb>vYrGhjhNo$2hCaAx&G@_~^L8L0!ozOw0A8Z*~fjvYr z5t<)EkWn6@dr~?Yjdi7AbU^9q%F0NWibNJJs7ZRhuU1mhV#yh3B-{|x_0D(LQfKbi zQKOWaFy82!QKLtJP{>HgL%<3v;HQ>0Nr?o3<`F#M$L0v-izAthPLPPog=*1n0BbNV z-=IvjwBm?{KZWg0(#u^2S2M9HD+OYKCF?_;1S*mYBH$$zk3z11R;<+t*#ce?tQAP* zWZvuR)NZ*McIOe?-I>FNS_cqFra&Oz6AYYxP$sovOH+E{C2G`KBcKVfKtuY27I}@D zn`_5Rdk}#=$lN6SXaZwVLEH~|R4nF1Wjr3~N@}sAQPpSV83vP*8A&BZf?CB05>Rw~ z3rzc#dhc~$6G9tyJ*;8i7JLghFa!Hx5W}1+SU+{@tlT0<-MEf=eiT%fNNXr{tYCzh zXU!a~1;apYGMQNkzRS$da0O{yLDm-OqY~(u-U1RRC|n_jYNLi5YK0a+2(-hDE#`!V zPyqA_bK%ZTE!t&3Sw%%<-;ioA1Ex=BfV8wqMbarsSJ@|}K_pfx zXP2=VRavq7FKP#NSrA}VcGxr%foiw}lSI2rEO+n&L@N2Cg`^@@hq2=Ey}8y{?*Xk!ub@lve&Rs)^VHtuRV<7Z0hXSeaw?K~(l#E8^60>Nh(o83XAYSGi4rD%!o*au_ z*XPy_sYG^Gt26)v;lca~KzJ&Ee-#g6>)>&TG6ck_lr^taJPzGhRaM;ueYJ@26ZP<5 zoMC(*{Iqn!n5SYh|1c9!aTBnGj9pk0me!aHMEJN{Uy{`3p?8SRqcqz#G;uPY~OeymF~lkE24e{ z^pc7rSRpzy1)T|75bBBX7)T7U08**s%1WI~&QH=44>uD}Cw9N1b_4~^axSxos=%VO z7{hWBBe&B|TBqhU{3oWfjZ=h#%>U`xFWMq0bwZB2>iH;_>wz9{OiLvebv97J_K8{B zhmlPF^EbYEGbK2f46H?rhouC4)T<0vO+lnChHw|Htq85HLZA=9%UD;E#v=qoBqE}2 zeiT$RmAAk_A@v;IJ)OBBuo2*b7Hoo)wF!n>cmXp^HERPn&>4I+;8RjiUZBUKJ;b=( zon{oxFn|*Y$Oi1)7>h(*ln(j_0SAPq5?vXFqc9MRbtN@u90QrgyI|k#K9bvD?=Vbv zknmhZC_EP)A2qEd_u>cWfXxP%0;EZ7Bl;IWPW_mGhG>DL; zKxut2++y))tWsQ~Ewnt{NN743XUq*o?9kAF za9BozHS`%AKq)^Nj{SwzPy+6&48#QO;x%!nDG}NY1?n;-fjS3SeJz>z%^^j;7RwB_ zfCVmuXCHR`oLn2dyC{6ac*tT2YkU*LN2EzCmdcY~3Vf}sm$Y-$k&!z^=m93uS4Z-@RLIusjw4Ic^_QDy>Fzy#7oECc8D)ip2x zOt{RU8U~L^(qM6|5fg#}krzb`m{7;%jy_NWM&QRG+XAd4RDud6niwH|zmRCPqfVnZ z-r5uP6^E;j8|B5nC@tfHMvLx#JRXv)IX2)&X(L0z z#vqc8u!+INY&c*b(MPz;M5BItIJ>la5jl8=%b?Q&HrQ z7%NIdFj$+(s&G0o)m54CQYjEkBvRCovlv-WX~c})!R-h_i>|DTyEt@6<`vRe5`-pq zLb*U+N(NKjZPcWwGiff1_fu4ww4L!Ms0hhGMi@U}#y^uG5@Z?RI8Y73SO$q<)(|sE zyXa~(8tF>GsKVf5vE<5(Gnh}3d(&P79>WpdEJ@n|VulsQi7iBgpndF!jrJ+%9}d=p zK}<4Q+=RFGPy>-iTomC&Gs<}?9tkLC)4rcx4ui%^Mi3TCWDr3}AlM#@S>HRQecw4p z$)pRlW3zmOh$<@=RYE$&XvW0zD>lxRh*#OP^rZVK9sVX+JSK*Wz+`|(2i)a`{n65=Z`P;2_YXzFc0EPkaCr)$zy{1v7mjj5;(bsK@4XWYO9 z3NYnwh^V&|1wr^a!*7@qH$HlDx!frQgQ?)XNixy7Z-^}V!Akf+(3^ugVhBsg1&kJPZ#?>^0E{rGSys zm^#@HYnbT;=RJ|*40y%auTh%~y&eq=1RnCRQmTM@1keL994^V0Xkc8L5XJl3x4r|nc-07v>gWxMvI`B^XhY)E2 z0Kpi^+W8KGFd(j!qAE#IA+JHGhuIICqL$*H!|)qIokNN-n(X=p5nGZj?YTysLFHqk z3#4UZ^c!Nfu0km>ABN3eq#s5YKs?|oK?PtS^@K?~%vpa0Jcy+q!h&0mboYyvN|~nNFg@~y_#Ti z8MTg7*BQQ=l+y4rBSD{G`;0HfB(fN=r_y3iu~01D1z08GGFh%i)M)o%-5_3_DPRa0 zj!29IF@)4B62m301c}`ebL=KcjqJxs#sp(XX0j!f#6ii}Xi}AG=gGN=w5#-T*6TUD z(DMdY77T?rX-#D$Z5shi`wS`@6^AwIl-x;@9nr{+D6B-qDm{j*eU}RHyacFR#Ls{d z#dHIO2dRSGrYHv)n2~nq)kFZOq>BBHR?nFkI^B6XafHj`8Q8IzG^;Uun7}>^2Bc;Z z8j1EuL?Lc$3sQ<1&eY1v3OEH4O`2cuc|vVv5-9dN;>IL|jPSOLB8QXeHiRq&G6gA( zKuH?bQa^!o#UwQ7HgrnkNU(3;kkh4wWVopg38iltTr5#B7$7iO;waIIR{F*>}eN@xL&K}Cfm;NVJQ8|bcTBz_lVU@R|Vqe09^jIG#e zRiY9K2c zuLu9q)-`!y7}U^}q+`fsO684Aa>1yBTU(UK5tvP@%}kC3O9hB~P@m)3Nrr9-GBt&i zqGs(Cnu>g&OFDD4QS2-oO+^uZi^t3mW% zhtw$8nBXNLk|^xJXmnAO2+XLAiG9Ztqm0WVh$LlGK+(=Kjs!l!Ixzyjvnh9i%n8d( z9WipOq)?1iMv;gX#t8V3M#t$Y9` z$z?RG_sUD`R3YD`Svgu=N}VSX0O&f#t=Tf-gh~ z*dRd=qos@u13v{5#OMb`5th059``kzeIy4XNDdx(zmT=mk@By+U%FzLu>+$n!)eE% zPcP0QS?rb_Bv73L=uGi6Bul&tY2tQt<*esn+bs@ZksHRfRQV3V_RhUXXJB@Iu zg``-)2YPBo(F3WM7!+Xr*TmjIlm!kYWRY+qDa+`RTCq<9?3EoLX%vPx4m5_rH8EE_ zPYdCNWO7lGEL2)MmKG6iYG6R!7BK2}0mlLbC}^+|9WoKeS>Kgh>V(jsFva6~x?Xz@{wa6iPCxJ0cE%7EQm{=4dvT&g!+v#|@2D6J9H>M5Ii?Im18qNhu8RY>lzqN;) zE$GEDEQ#W%=x^7lb93iFx};-?bWbG~AwV@`VkYc^#R(>)i#jk$nM@|Kk{T%@PB-JQ zPSg~uQU(mghJlr$Isogk^_*b=PvDgpei_K2nJ{^aMLF;=>QNG&I5e35BuOBVaJF_T zC4Pbk#u&1GQnNAWx)(zdLKI>YGkEG7(lB@vlh8;=G0qu91FjjWE5j%01bhU80r83? z%=C<(29Xvj_){rY=95e&x+;vVZnAhxk`9{5s|;uI$|)G!LnIc-*yuBe9L~C#{SXcf zH5anohMF^F)QoBtrqu=^=V^|dkK{I~?lY4xNN$bUZVg$=a_Mr~#!v+1lwy{)K`Z5y zQcB&d9>2p_c`YDe5J>DEFy&V)qf<2&W_-r$-VW z8Mms0@=&xfof2weyX3}=l-7ymV@{i4SYZxIM9a*@5sR1vKZm6hxnp5&9-Fh zBh`t73)Q2J393YRf{|*v!@+?$TP8Y9%%MzRGR;{|ZG+KTN+isx99Hw7dNP@YcbJ6m zPNo>>bfPtit6=(<33VWs!Oz+T1kq?x zI?gc6fFI-+j>0hrE#)F6O-;F@9Eh4Iv`ZhtSP8hekThuscpqBPR?{17ihK+eNS!G6 zVe_2bM|9(%Dx#dQaz+w9!7UV72=P;!fji{IbV5jG@wbrJ5}V2BQc}%nNaG^4K_a+|=f1xo{1NO7gUEo2TX2xlj?h4_1~{;-d6uQ9wM0 z#z~vuWK<*~zv0>Z28tS}ydmfc)eM7M4)h_6-B4c(@kL_(?%+2 zD-;GHwVPBunW%@PjgAMBMw6un^A@C_UA?Y~G@h0NA8Z(kcPyN^4x=3$3Fv~X_e#R?`kbi9hlaJDl-+a-1%S5d zj^zbdF&A(JOp*QRNm%d4hO@+w-cx3ui}oo-2Lq8W$P4 z8N0C#Id5Mb!Cj?$HMU`;|DssYhRgth$dyp==Oa-}1A~8r1?aBY(bc7}G{-FoNG2u5jEV-S(ixr(xvY{Ka{F$C3;Sb` zbi?V$0OLfBjf~Od-|rx_^Be{;T)8!zem^KKjasRg@*&7$$ed$~0xUZVEYhI!jMat= z?19h~{OJn#)9@x*M9IQP@GVqk!hka>SRl>t81V=s($N%W6LaOL!f?U?wJ624lVUx- zqgwVbNC3vnqFMPxwztzr@p%9|sJ22qBl6XZa+eX5DT9Aya)85++d&7zq^!o{S94U5N(e;BWg+hn)Im7Lum zwXY5&$gcY87APYECcqgx0f(S^h%!U<_)#=ysl`-YwZe?3iF;t`D9~7uaq#M$8qkpr zPnSfGgnZclfpcY~mx=SFeExzIyPId)fcrbJx7`m-lMJ)0|%eXrIRIvP{P`D zxSE+`@Gu#VLWFvf*gy`>)I%ZRD`1+iQW>gbrHOMexP0nqI>DKnG{>>4lC&&QR!aCYKq`+06E{3C%l)zW8b+L1$!!j}SwmeeCkMSvVgF-EI4#cXRZn~S&Ryc?JP!QffkMJEU;io3MK=q&`a&-Vy+bd zg(Mc9iJyb`NJwLwdSI}FEXB0@|HzusX1OUDK@bv#m~%} z5_2P>iDlU3)T0j1%n5enT9Gb5#a@C-g6LU8f0ot+L#7vOArlORjwtT`LGCuP#Z10T zJYe!6(nYoy!GgXCgdqi}S&2tGNNAA_S5~V|hHoEBq297IMOiH3fR2yFLLTD@aziYD zI4DVK4t9sE*kOX{z$9^Kjbd456C^I=E!ZX|DIPf}W3Iqp5d7k;MBdv9MdXc8K*zOM z2&%;xRD*LI$EJwHJz{GKUn9f@2RW%&?&Vx$n>faROP0KzVOm2u-l3X<*Uj3ngSI!g z$}qgmX@w(T$PDjN3Ln(1)ClYslhBN?}w-ia1 z*%vNiGJ&oNoUMdmCA)8M@sf*lNmHb!vbNw>?>wx=4kzH{Mo&5Kn7~MROARKgW7ym9 zyg`F~55H_|3-k`(71W>bBME;e>cKsK3$y%%G@A_wP@RJ=uyD=VMY+Nf zuJRUOlk7ZL5eo*s?DfjYN}J`WJx_8cE4!FllTCQ{*7l6xpp%X__uZLX%)SG9YFE6&K>!5dExs zFZF0yaq+wvdz;O)A=MF&VP_GB%8}7P1wd3qDx!t$Pb*DIiC!F+&p`-RRJa93b=b;_ zIbZCn@Ru}$J=mB@Dy_!=2JABRLddO}B@ZyCOl1ZvOiKdB<|I~ZXvX11JZeFVO(B)y zrWgyU7OHsAQU(1Blw*X{lro+l#19fC$etvfD)D_;m;tOH69JyIiys)hO(v2o9W3ak zBWt5GH*)YQ$0GGRbK5wL1uifHCm~4G#}EVEF=3DLolY6&!2VPUONL|EDF+0AeSzWV zBAx~Vq^H8qz+ouVNEM4fLL1JQ8Y%jXChAd~y^t+owxBek6G4Y^28Q6IBq`xyqg|~V zB+<2!h!G)w(#)DLB6zvtpuCJVvaFjLgqd3%Gr#jjI&_|$RirG*- zAZJ5!AP7^=*&yID)-F=752;!!b+t|(2HgD!X$EUx!}W1`#Ko0Cu_(7%nKl$lkXgpOvnj32-c8Aj*Y)UDBGeB@+8iSy%eHpQuJu`sKHPxtiCkt zRv3ylBub~<;v%ZfRAFD$P@z+sG?I=WA^474IgF~Of-E*V3S5rp zo9x8wRI`j&c(^E)+;3Jc6=|B;w6ShatTu?#xJcwA@W3h<4=%iibv(cWj6!VM#+Wc| zWRMDFGB;omRh5FdXbq)yX(djf{LY&RUJyCwfDA&jF8#HyqwXLKF@ zO^2a_XbYS4A?lkr-T31`Sfv4T7-KZUP%X;v?xH}uF=2(Byohy(AqC6PM}6@_ICD_`7k>u~Qm=#E=}7Iu=YLMOmbu|~Tbu+$sa zu=&Dbe8g!z%!<5Z=YSL?HiMf8 z5}BC}yCx7b%}9P*4tuy@;S*=TEw9C3P01v{N4C0}blo})^&Od?x6!<3b zN@N=PBFRfh4xs{5hiRO=Yo8%8m4Rc~p#&(Eok@~OR~1h>r?U!(z_}|~b|@=po8+D( zcP2U9o3P@|DD<$-N<(KkbdqP88DqtRaI8==hht1+<_`@nf!y#|+>TSQEV$Q3Xze&G z3s=GH%&UXvp15WWW*~^uuoe1b=Z3Xt_`!@AfWMeI$2v3O!fXl2OaYg1!X*Rh0EJs> z1sz#dlWMsbX$!ly1WU@8J24Vs*M5XDASjAH6JvwaLz{CKs#r3Tj73l_9H`e(-sbcu;o!QC{?`(#0fJbE0f}kp%JO?O{2coky3MYjVz$lkiY;(0-OX-gd;F& z)>0C{FdbRGMATKu2FwMZ3bMsaCpYyxbY-)IC4i-dYFpVXh81gejEFX93PE6F5m>Pe zw>QAL-gR_w3_-El*U?fG9BJ1@4j6 zArRB^BB*jjPWeFDj|`m)KZMoANzP+A@|zDCcMyqJ)E>YtXwT{p{f1B=h9>Sc;|>_5 zuq!@79K@J5E!s7?RR|Si;zahrR?g1MiQt6vegN-s2!<|PS8z_OC zqK=Te*Z?L+$kT`x1WjygAPj%8c7w2=om&cD7|R`CcxO0@fPg|qmBlZ3v2fTiP*}B$AZb|i7CjQYd)as+oDQ3RxfQ)!ZrQ-OX47RqFdL_jd+f{=0E5p>)C=G@e@*b*6h7UxDF z9DshT&0^=~z}Sad#!TA!cE9`E=jtF*e#_XIK(~^Fe%XpfqPg}XoGEC|Lrm!(&dPsv- zebOAlKU(B~fK{cmd1w&1N@LkiLLyIA*U!$K3OX^BiZP`lF%%O+l2~rVLK&9+8+|WD zmj~*5^k=PqmXwLUr(gyZaQg~3WEx}uMdY1{dpRA*7;6ffu%w^^QRiI24GOWMC8&t4 zE75>Zj56sk!Ho9{qjHg1)O$oRa#OVEU?#RWhgJ_-ts-+HI$YGC$>mV^K>`|!#f-sN z!dSZx?=KZg1+pb{p-4T>BK1_tMa46jf^P-+N4%QFwBlU30+JH5m&I{K^b%AEgF-PB z3@d|Z!~3+>aU>s9FvPe_f#mgN&LI;h3+)c7rzq6J+cJd|%M=i8Or!vEVXH(0(o8jp zXc_@IiP(v(=dT0d;C{qbrDEa88#vhhkl{fyat6!4l(wjeAP__J#ksLGM(yNijM|?o zJ**-Hh550Bk0+ZHW52cxLzEN7=y}+o0vc*jTs8(iXaLw~C`U^UM$u4ZJU|U4DPi%0 z$qC@SYWrmBcO}aOKhUfg3}xXi7}f7UtQDgB1tP4w=>R@^TOq zt5JTDFO)2UQp6^3R6O#IKZB; z2`;aNV2(jBTY)U;qBM(qCC&~!rql6wx;9N_kyJ@M6;BB)85U*(4rV8@xnpfj0Ui$A zu0`c$bOt1`FsVEYRK*#!5CH(}UE#+`R&bM0EFK~&I;BbQt~~5Pip4_^LAsfx*8-7f zNl-S(%eVO9qH9t%X&dwHs0%WMuyE&*(%E4RsgK&6Vh*rSi@+5NAaG;m8oQkH<5IVw z_3KfMH zsRfuIItmkm*(yv+(S9SHW)Ka+6NoDC@O_tSJnZkJ+z>^JYSe}IfV(wT|QDKl% zF}$L%l$7cAPl#-{On=(IU`63d013>e~Kt$xs6- z4owwp^1@6N=ZX9j)j_w@A^3o@-so4Y63exgk(wtOFp4lgXD@3IH`yLfu?-K9akd!mg1- z8AJeTtKxXTmJtEQA)O~hv}O~=gve6s(TCEzp?P!}UP4LeCg2YdV=JIwC_|-Swg4ue zaxy^-FhXj`kI^!K>%A`iO-8|f4p(=ZEZ9j3 zrT4VzqI_U3pL&#xYIz)3BIZE}TQft#>tgaC-Oc^DB&d#U@ja9lW0x%4os1$>as;;z zp00p4mnaEMiE#BVr&)*)AK?TrjBJ~$z%29G#Q$u@wzzC;*l5q=BU>DhF~mie_8UoOkXsKr@3kffJ@~vc zRpegqREl13iACj}k$RXG6$Oden-Mm)l@-qu z=a7hXCY6{kP(7R@B(Gt=h@8RzAT7`(IhLYI=oi0%ewks|Y3LV=HDXabpa)zDL(y)q zS=?*WEO(^Fl%!{)y&BI}IP~S%jDl&2@{~l9TaFYAPG3?IqOFAS44Uk=j>NptSk?3z z09{mTY&ybBu-KV!Pf%D-zcr4ayEsTV4m~uMNaAz@J=VhIw1ak~N10|LOc4t&#*&%2 zIw?0@#wd;n7vb2lmf`|XU_{23Ny0h+P9@=zC>X z&>@nKc67!wDH|PZ_kw-}lLDQBM@~A1M`>nk#Ufv3)WqDeaD;r3NMJfnB{wUPN=e|a zP{7HJG3~w~TsDh;5cq6RLdD|RiF;RU+i*x}(-G|Q%^FO!T=sMj<1eyJ7y&?!^A?LU z!Fb^|L#fA+QTTk2g1-SODDVj;-#lbZian1XfT;$#xHDHh2w#aa>$V61bRZfePpJQB zte||8W9RQ6Qi}obR;}=~5BcPmJ`svBGb`Z^>1TpmDW!~N5;)960tSOABc8(eBA;vo zf~#qNz$Vw&A4e>s0GuIlZtDwxUAS=-7-tckZ07>FxgmRMH*{HM57UU7GGgo$_yokQ zdy*+DjNd?DS4#(&b;vXe2P7JXUI^U{x(6%r-0T{1OtxH52)V5-3|SANflpOTML|p!?a0?zqhhjL&n0Syb;H5pLS`*h`EumcO`)hc{79S{(5FkdN=yiZ>%vcT7ewb4gSF+m>lJ6htk3=1K8zAt15$;8 zA!3L`idINCIEZw6T*P58YW~|kj3Vs|J4b}}+rpwtyWQyD_F)XA2pzdGTvASLCTdbf zYa*v9IX`49lIbW6OY(s`31siF4N?+IeG;WxG8RizAjMZw*~m6;GkGVrmO!O1Vt@%g zs_ZcDMOkaYzc6XaFp56&WR{vBGSx;U1huj>eb?YpU|cM zKisv^jutb@l}@#am4^vLoUzv!!>5v(;A(7JV8nuDQ!OStue+FX(Na#ErA{_QK$XDy zrr}}*h-JISEWo53v!=Ox8XEwX6CgRn4vq_D2ggNx%3gW3+*F!OFc!IkV@qfUM`Nuc zb|qGm@ub}Djo4}c^<2z^1jXGOV=>K8J|Dp&nalz9eVz&rBivi4h}VBjtkh6{p;5uZ zK@@;%RnVcWX@dcOkWm$LSj^y>f=AXIQX{YJ}fc^L?x?KnIOMKRw%$#bKTJbZ|3icg+JeiYjYB(bk< zGG6+m>EiQe3lD2;;azwbJgbdx`_99=Phu&Ig_oq`WRnD1xsWW*Q$Y~5S`1$y17mlF z3}1{0zBVbI;)dP|amrPONSnl$6LqN9VMfUYPi5XDDhQv&W|lzz1EH1ZBnJSTme7=n z32vqpnSYw$A_EKl8mPup9os5da09|2pdCC*88Crb3#GD5jSv1znBp#7peD;7mSW+% zFenpxg?yO5?WVVQ1=2-G+5cbMO>ZMO+V1*@cmbXu4UUYYlH5Tt1u>a|nB*?E9(TF5 zE3Awx<1-dAT?ioKaW@CqJ5G}$z!Q|DrcT*VXL0j9xYbNz@SV{N3ZM|7l4S~Bs>Hqj zukM^D&+Fg{e?Fat+RN2~#XY?o(id|SN9N4#bSPC5c;F&pZ01ptgFdeV(^C*zMs#t) z#EcN9hYm;<^v-?nh5ccHe{Y zWHAoZXeh!hJJ3nU(=71;^~s(|Vz;7Im$9b)_{@ zl&G2#6~-0zaHe)<8Ch{3tiffg>>Nl%LserDCN`AxNOA>E1W~kNU9Z&HqFuNd8FGdw z3~~;V*-8*mFbV0}r!bW6PFC>x!@CF8V4(OXfB*nt6&bdxOs0lIcu=aFjE;Lv>`O#= zP1rbrZL1jx!*b?_RpG&Gjj`JMFw~tuA9)5 zS^7>iq69=9v4IV8S3+h=9SAlG4pm*0Y#%5~W+5S23u3kpl&}t~n8Z?$8D%yfXmNW) zN==vGCoCIFt3mAEfqWio+17zcc!5V+4FZ8+XNU95f0!ilE?>kIEMokD>xy2SnXLmW zLW;R1pr^2S=?E%93cvsi^i5ET@fk-p<#5c!1_Z1L5tpNsY)}w#0NEU}Dg^O1aD?m} z=c+;ugL-H|W8Xq-GKnWHMe)QXQ#n8(XK5IZl@VZo4@<*ChsNXPvFasTV!BNqNI3E^ z9>{EhQ?f-Mvu|WgBg%!SFC7j=oOPYlxi75+5s^V1l!)5>#i6eX8|+m(H&E6VAC=4gf$lNhRa8a;8qpXTV1a1xk!2g&sNB{${{lXz#MR+(7%Am0mO8 z{$_U4xx*PPR>DSWf-fuEfV={ptgm0g9Bq`zMZXJiw@AQf0@llMHo?(Y!Y3twg(o~0 zoPR#yc{&h7LPLk(S{ljC5c&9LY#1C_w&DDh?qthnO|t?7PjG|efSp8prn<5!6(p#A zuu(t#Mu{BZ`E8)37z&hS|F;n%h7KK3sKGE&r4S#eu978%00b7AK*uMdmBUEwEE8z0 z9?X|9HT`YhRIZ-9OJ5aPlX4cJj8v}50ayY!iD{s!Eo?{FIU z-`t~5sHNmh#t(TXG|ZK#fkH(fe5sIl1*cO0m=z3?5Cy%vC$ezwJ2Z7R!Bi?;J>Zg1j2qdCRkN*U zasTBaOg4H1njqgA(7?~2UlEfQ!a|%8UR(-3=LNa*A?qtpw~Fd>$VEJEb2*&PSejrK zilVu~&+Xw6jb>0IDITZPjn$<~Wn-q`8}LCwHAN~$HLLYLAsETu#2PuxL0h0-sa7H5 zV-yGA^Ss;&#AG7Lc%=MUU~UmJs@>fYp#9NDsUA`Y$u}q*ca07na0WsyO@Q-DuGqA_Ce<@ zg@^f;-v;kt=V12@{Md817aj%#fy#gN%m5TN{|Yfm*otL5>Ti4C{cR7ta5dEbtv&Fp z&V-z-mfZ^qYu;Fg61*9DemcQG!CB(w~Ik(TP-Ai%G-6VM;RS3r67e8&ZSF zY|te}W=%xpYRuz$v6%K^Tj09l2@jFgqAX$LbsIYw?*3W@^S`m=YRI;OT`nT3BvF}2 zQb*9%L39$<^8_5w-h(+K)hZ?m$wNw~Ftm8`vaz~QPlY&~0ND-0SnRECRx}OLkx5$d zDcrQ}Xkkisc<2AnJXAt^+g(7|RWbqB2$~R^=WT%o!eS+O^vR_3S0~TF9lb!dP(LaH zyiAolAkwjoF>gVZ$(xE8VD>h?0HCAk6ImB-|vkj5iPz*Fj-0p|KRR zeN;rKFH}KP%9BlbdR?))2+)_KE;drC|6D$Un>U)uFISgA$CgI3TY+fu$LzC4(c?!= zBSL(PmL`0zwnFc5_RicCj3M;S7+ey$M(N!y)Zvb)W?f9mLI68hB7e*Sx(ug-fr{9{ zA(iqa6}vIDz)<%HBn7bx2sE;1`(}9bC_Ynmq&bD{Y0J-b<`7bWH7CzTi46x|(?PAT zmPL$afg7Ty%x9UAbI+B2)1OozvRV<<;IOux>4zb+4l&LxzDILy-BE!sldA!itFe61 zT8aZ*4hISai+IkYF%PQ}pc5{w!v3!;(`OvQ?)l2_prD2kS=xzcwE$~OjmC3lP@m`d zSYIiV;dw`S3(;y-5JL?h(!6L5c~_WY5L`&^!fSn9XiNFrr-br~d2>7v6ow2QQD(B` zbqhdh$e^?21YKqx{5F)mSXX7V$RYM z8}tZVdCzgUsZJ-);vzbNNl%Is8GJ8d0FgDMLp@?S! zi}a|3v!3xJnBwA@(At>{;DViBOM=tj4EK*B;msjM92=_{52i7BZdL$Teu;pBh9g?j z;GU~B1DjWA7`uJgmLsUBNcX{TM(jQf)MFzLlquJw;zQu^*O{&4R}QVt_#!;&awpka z{oQhJkgnK$xHos^rj8lIz|@$AF%9GJoIDfv88Uo`h-FtHi`6t_(@1r7ZEV=Y8ph;X zm`S6;1p%Xu0FoJTAbyL0npyfyg(fd591^tr@c*=TZa;Qi_kG{ze!tCyLvlz_)aVjf zmMxMR*^y-D#JO1{JMPKi}_ft-bd-bLK|NfP(gnX66ia_TFp#*6)60ss$|v`8ER& zlm7c-kt-iF|H=@G=wNr)>pmd$K8=Z|UE)aH7uROO(Ue+I1fyomguABbAR2vXsg+vF zte5)VVUzg_+Dm>1)-4;&{x&h!R4N8N)h2{f?1L=4f-56`W|AzTGYD; zo_GBo@%_Z-!NjT``-qj4g(tEP?EzAbKF={SM;VS96vcOc&VUw?oH!_eW+p-AkQ9hF9uKwZ;gAL6BA`iiugCH4 zQ*pz^QYn-{#AHtd%#R~^CDcg)u0qbc_dOAsS?jy)&t$F>}{lcrW`PwK)bT(8sA zr1(d%*XK#)=YQax2gf>SDeZRBJ=tvQVULhX=rJ$ogSaE{$e;Sjca}4*tcpAk!S)u& z4{GuYvq9(4_{;BpODR_?E8CV`gzz9LK_Y*q^Q3{FMdt!dP?epo2RL1MkbX!M^OBV! z4^SNzqe79)hLRy7<_BTpy3)4UN!Aua%15M3PF;amOg0co>_b)Ms3uAJNKa*AGCKii zwkFaZ%(WutezR7*l46NQ%CdF5giIZy(0e)GRx}pR-m7Vt8bfofq4ih#CABsjz|DoL zEm*gKk6fzOd`6BSx)#sW`P5&Te4G( zO&mB&&B{A03IZckv!3Ku_7HCue{;!L3_?6Sy__!3Lvwf*nD+bEVi9t~-iTu6_Q@*Z zHb8AynAaAR6~u5@i^A5umzCU7RAXN~7C3bRX3f@!0qsKoGhpC03lnnb#Fe#ioxp~5 z#K=B6mL4en?o4$Yn{SIKYZE?i5x#BmIPIi+)HIBX%o$3`p}P!YnuF45 z&Jf6X&N)M;-QpZE45>6?a*}%>Nn&{teR_{D;EVU#wAo*N6Mtm_Fl1^li0oF*tD{bq zItkS|Nyo{0Rh<()S4PP1FsCu%0z$`xk>CB6?;QB(F1zqS%o^RYcnH2<^V`lt-Tj7q z11o$Myq7rF7sjSM53CxM-_s{oG}w_clTg`ZVd@ca$4&NGx*zuppyb;%zr$kFYGrrM zidUDnJjRQ?EBu$%>-Rl^<-Ohww~wg>aFgAdJ_M%0+$z;&j(z@xgRPg z>YCww5<~{rB?tV)X&w1?h;aW%lW!XV&r`qBe=j0=K5Fn&ucZrJ0O zmOloMI=(k_B#r(^CJEaG1)5viHMMc{S-_DAmi`)OPb@r4{GLhVH_Xty$>FbqRgpdEu-q z&kH|WQYYyK8w+V|95CAwe|FZWblGg-nwyKEt=fh+)Mcd7BftxsqeB|OkLU+a-SlRC zf`$klA9PJaqKUPyjAksY*aeJMa(GRr09UnQ7%;09i6^}x0(tQdHZb(R{Hj6K>qX+C z_lz~7k4&=(nPzYS)@v1^*K;crU^$sMI?5?Gn-^KH*A}8$f*?Uy^kp4F?z+%~GHmlY z^;;y)db2JxDiV*XIi#aE`f(nc`aD_d0?BB(4lt6os_cq<&+rzlO`MhZPkyfJq*=7v z(Y*hHej-Rr+=LTLeR5(Mq5GS-yu&)4kBZMMU(yLR+;`sY1S9gv+q7y1VI`H!M-Ho! z8dlMdwSP{uWQe7!!djSpv;o6aL83?tI}nc9V6wRclL&686LKzfO>38CWlw4Lj5Gly zeZp}JjH2}g`%%v~r=Q_P+%&gNN`-huU<+GA^91vQBb!MD^Jf9#8thp%h-46UNM%9H z$e>J<>s~9zD>UH4SeWE1q#@{CCVpsuYS#4S&mGBW4M6tkjF9Ita3PkH+wGm>N|%yE z@f1=#XIYFD=wMfatWqv0-K zX1~$=9`2tjI8dc|zpl?aH$mrFo$YQAA)MbLz|k`&UBdio5KZ-CJRi*%!3IYwkY@5j zF)V4=Ps%d~+)!(A8+`%-f}`YQ;~xFdgi}0Ud`p}Q97A7(GJKBV8&m|*6f1B51I{g3 zv&tM(FMi9&2oebe!Ik;eoZ2xc%ILOs~ zlRtDe2jU*dxtaiD<}S-y5CLDrGF6C{j7V8uQdC5r;CF^r#Hh%QC3&k4vu9U|V|)ag z-{=e=Nh2xQ*%w}_!wOQZI|N!No2;hh6p)f!@>>1}7#$c4v7)8z6~7f{_9||-HhGD) zNxN1i)V|tGFJ|uYHqYF>HsYKPeObHFsmMM zd}#twlq8l`xa-fyj-KIP!6G(97pEMriF_+|ks@FR@u4QmKk-w?G6xm-GNO2O!VEko zR!do36eHS|=u9{kXGm}7o)NF4bwSAy8*Mbg-e*4(ggDL&jKks1h(@hGU5 zX!B^;+d<9VzqduVw)W9tLh``1d)v%mYClYWFz#Ufu$a$p%-P+~q#Jb~|6q3_oFcvc zh3B7p*3lGZD3k$+t?r^*i>HLff2j(m1epur7I&m09CU)>c_(b#y~D|hs*Hhd7MV;C z9XKc`G)!l%Uy>YBNP#OyXBdjwZWQWrKchcH6NJ zF=Ow(yY^kwV~^`Q-1f2ZkJW2$`CRkbS6o)Q#(wed15asHj(4t)vcQbK$ryfs@2xSW zQkP6^=Jcr{BS2PI6{88!J(;wbt&$kToAs+3V=;>JUyj#)J`Wt6@6N4&gybcf;y8tm z2mu4u9p3pINT@j;Lbp)Br6!9k6YfQff`0<7RD=v}Rr=L7)$^&F@f#Ew47x*t{|wVD z@Z9%_X!M!WH>Svd;4zL0^BTsx<4j}65G@5dwv6|eZ^qR$ynBMnnFHoF0atdMzrLdF zc+X&_X$q?1OWvGA_6?4Ty1ZTX#h$}PfQ(dUBrPmkcfpNjh57{J$0T);sY5zJd62Aa z*%rUiP)31X^FBI``YZBCnYuD~rQOJVAo=W2khz^GH&LtnJ>mUV+5|H1r2Egi*wVGT zYxauo3_XcOC?LJU0Uj>@zGxrGG=}(xBnG#-4>*BL?5UCa^?RcD80lfUcZ~Ihdjy|m zmWsuLRl*^FD#I?A0RNJR-$-Rhi<_ywk6#9{{> z8rF1tXoup|dG$UZkcyWibp5E-Fm_hlT7D)|g^kG|4G!u|$}p%(%7|D3z$!r%axApQ zZF!z>RKQ0`w33gWY$}D>flI|l@mUs|EFSi$o#y?4rqZ8`k=kVIFH*$a$HM~h`2 z(*hAW8ha-HrIPATh{}CV#LnGC_;AhK9^9v{yXQMgHh+BnjEX0>kkimRhd|?6M)y3L zqaUR-FpAQo>?yO7*d@GcbhMaFTB8wqwUcsgv{#%@RY1N>8raH714fph_@H_dpgiCm*0C4k_z-v}nztvNB(4 zI!z7+JHj4rjhc>z?Js}K*H1eW3})Scq45{G!#m5*MA1SyH1_pVIjU4hpr zR$J4*LkGt$mpN{?iZnaf>1ZRMiKHbymO8EU@UHyglBrTXilrEi^=P}bRl^JNP$-0U zMXMr@?e^qoXEAFzE}m*p4*JK9qS7L&9qn%YXisA->3FqZzV#~v)iK_(zK>s7{*t}$ z!~Te7%(!1P;cKQcuyz-Z_v+5@1!iA&x4SsnX)G4k7CA%k$@UZ$QP@K9Q!-cI>_Pz_ zD~0J~YTM#%?N!&kH8Wm0j-SMQFeb9#;2L(QIz}@X4Z5S1dENVVsbd3lI)jI^aj=tw zGFSTbBGmN)rr?PobsAE#Ko-8FbY)Pkp9`m9Xan!Yq9VlwXM zsY_@ftXfeCjlDFnlyB4E4}vFGuU=gl2Oj1p2IySIKC5%H2LV#6^?Cv8%>{az6bF67 zfD(lLx7RJ$`u|ATmkzNC=k4O{!3|_hL2DZYf@7=YaFIZ@2CAqtJ~!e^BfL2Yo?1S z5^}>7juoCFQ`LR} zVgUe!vLKw!{hU>5p}))M7WE!FJN0Pec_gc7pgYquqmPfrBBx?j&JPMC$=0WLtUwKj zIAP8NC&sU0A|B+Jn#U%}2M{j-V|D-P_#(;qfO^_S^8roZQNUUaS5%K^NiiD17G(S) zJy}SrWhc!wJ83pSrLoHr5RNx(JOn4uL6yp%2wX>j#{?A8Us@dpR8l>V2`O}rIwzL& zG1WN6w)>B%|tmVWyr|UU6azmX{`Tx$Sb0Po=#&Yu6JM)RCb5dMTS>rkz9T9W| zy{AH_>`8hb$oyDvLkO0>^dG?HQbB^eF-QB1I7U@P$*21reB$T$IH#0Jo1!oB zE5&{zn1J|F-HAY;5koR)=;a1DKwlgzL`SoSI;~b+oKBjj47$3V)2XB!`WtkFdJ?1z zZidXv{vz`i4yL3TO9S!R^G`mt!dYr2iPzZIcb>_oCtZE6$*1Twa^i|t@MT7hS}nf8 zpKL3XFmVZ31UMKCqQugZ4k0eKs^4huXU)=O&1se{=a6UV5{nO2Ool*zw;wqa$=a?d z*(~I^6d3hfG1~`h7t3*DWrsmVAr-VfR-%YRWqgXy)Ltb{v$E(7D~jqu&Rw#4`gkjp zWx@K@iFVi{{ZP!-45#mMy8f(B{)@YNjEG}1a|&=!L*{7AokR796-<_0~?-x)QV(|n)IQD<|E$DI*^i57bfx!%XR0lnzAyaGmOg~IjQcDXca>T zrzU}$hnp7Xs*w5uReLC6Fj>SR*R()or|cX5o6|HMj*#nEAy-1N?J?^9T2tNqdo!sw zLN%)ub1GkjVe`FtN*~D%C(!^NvU#mIO5JnTK`JN$z8YM`GP877mZhPaEIZCtmCT8= z(^wccSV2i*xV_&q&&J)}?Hc7;gzj91u)lm!A0?rL3dA!$OMbw5J6jnkVlymXXeqT; z^+S$C3LzaUlOn)7u!GgFV1s(k{6AAC#R=8wq}1CG$=jp~s)2JFtjZ^LD{0z>V4+b(w~DcH109uSaG$B^GPzLg50ISQo+Vc0N;qsRu5Q-?WVppuG1 zU^U?tb(U#Xhq%M4MkKEjaDj=K)dQP@-BW6#EVpFy3AY?!PIOY^;kCMgn#5I+;mU^u)Q77cFCbSrZkC+mqHr=@G*EswT=j zG}lC3zhF&NzFqX@4H}gNTGd3c?~kP>s(O+ZUvYynJ`V$U!kVbKwFtjvl~$Flsy?^w znrfqX(0MANpddMw>J?E|ohT&s&RTRT@Zl%6L~Bdk~CDa{Q2CVjw9 zOx|J6CTgKxbH`K?G`rN2xQd=0kr%6kqH_^=DkWQzSu$VmYcSN_BwNSwG92HPu8LDE@FcmdIndW*{aV=)+ zdd<0}Ht_76^S`-<_hM5UL<4x4IMF>-$y%OcNGY7x8_-gPI$4xFRY<4qpFE$5Blb@c zOX2EGzQ{6l-0Hq;7CE+R^4cHqVl3waq{fk(GGmmMn6TkDo>=Q z(yw*7=CNg=QZ@G+cW?@4tqmOSs$D`0UAxxKrd)y~gMu1q4GNy-RcPOvr#{#B%~H?` zn$3s+-8ggaRxN=!RA+sjEz3otn#VNtIh{S;v~5uxct~0x_JwNI)C5EQO<940duY2k zI#Aa@)N>{Ei`zBE?E-PWz$}}W{FHL(m$Z#q-vqG#>}nKO>4w&bQhli) zY;DIlA6#6@4~MbQlZlhXQ(;v>+LQk!+B}>7Q`fwcsxNuIvE6o$l0$e3Ij^y6Gjkb0 ztfRCifcu`hn?d>%W%SjE2UDMVLD4;M*L-K?ky$qmio0*=UPlY>5v@R!rayNvlh`}5>;({=_&(6JWE z&TW=6&%P5}wY=9~jIiFl$w8xffJY)Iov<*)-i?BG+%nkQ^WGnq6dl@-XPE8iq>$!e?z# zvPA8mx21hdXeOuwm!%C^8lIZ~CknIGXUry|4(inE`i8FS%TI&X015R6Ff4?8-_aSG z(s`44j5PWi#r@@5Se6iPZ`dLOQ;pe}T%baM8I=Rc4R0=Ex+b8Ma|V-hG)0S?_YkS^ zdcMDp`QrhCHCHV~FbFV+8pMS3t7ZeZ_c{5E>IhS-oWV2(9E69^_YVyYp&!8zH})hv#ejMsFD8P?ltjJccxwJi9`uu2s<3I#Vx4N5Y;C3K6PY;1b$`3a)6AjrxN`^)D+p&o zMHL9ioTwpe@3k73@E8PT%I&tX1_l-+uPzEedFaCGbmZCM*8NxNUrxIB>Gdy>W>KTy zy@GxjWT1glGFa&HL?ca18Jt^3PzBhc5k({cN_p*eQCrt|ioqr=oefCDimx2XqXnsnO{&vkj-MXFj{n8YD5TCn2TRaFaOni1fQ52JJ@H(rI- zkJuui>RI4oBs|sXT6o+k)hvhUJiM#enc0kXq!^8Ub1;(biR++0 zD|&0+3`jzrxr(ey;}LA(qgIZ{6k&X56|_~?UByMw-tRan1mf$~Rwoq<0OM5?DQ`)_ zc+^gwHz?f8F3Psl5(y<54c$5oo6A$V=-8IJb-*Mz9FddsJi^nRwpbh8RN3-z zU{ccCfpW`sk#nv)8vRDsM0!@V$-Pc9IaDE?n^2eMjqTQdI7ZXLCXtImX%_88yG+k7 z>l&iAv^9Z2m6a!H924LgjfRXWa-)VPNe)?GIMgV2Vu%W*@}!lot$iKF%IX}@ zF?7&<4^`CzFI;|}ftxrP>-F%Wivf2%%P4>=GI0KLUSjxU#KI6SnYO_+`6ZQ?fm@F5 z4)76F_?|+4DFN1tqLF`O7o3!|n2$I7%c8IN;X4j-OWUuW@1@Caj)Y~Yvu4T za~Oiqx;+jFb0Sm5S+AQDWFn#qTVQq5wG^4v1es8Cqt2ZrDfNBRDy4er``9{*>Rho}w7EB-$r0G9KCed+v38jtUd>#9Ui~NA$^ROVG4aE`jA$ zl~5odd%U};urqJh)s!X)P#)w1ByK zwco$$;*zREwgfUU`J|^ryrM|D&|_6HoYr z)R&l^PO2}-088Tag!+=>pE_TCiA)oGBe2a+ZhgsWR5tvFIkJs`L1QQBbtobzA!WNc z#i-m)Mx}k(0_bA_7=NUvEhJq+ia6N})lAm4>YD4`YV`oyFcmRUbz>?b*=8qAMN}Uv z1eh>ZK?#Hyf1EKDv5G~_ihmH+?M;$iiN<`0Wz}v`3x%>(&@)(VK+6QlXW}!OHFVO4 z-dV;BnAA9=fxCp2#TOoBT&UPpvLK`G2uOs%6+Tpm%9h4iYl`+B9s_gon#vEIuqN4^ za(mU*WLzaT3`bYiN1(PLlCgrN&uZTEl_7#35dB*`a9b3vgR8jQ3Ud8X8cPYDief|pbS zo1g|efM3Nu?QK8JW@eZ`mzFAwKhP*Cyh_T4EienpXt0c|vU;>C`(IgLHvQ=M*~Z>rP!H78DW>Ob*Rr^@m= zcjeKos`7|^M3Sj8OhKG9VW}T8p5n-f(ZFXE1xlq)h%Kv>74A76eEp941hKwWM@ebH);X`Ty%${ZF&`4R>}ilWUhl8r+C z+h9~iMMT(Qw`ES5nO>aVNiaOUhiwJ1>&1T$PWxp|)zl=eeq++;PYB~os5wxxQ^NOV zPLn|cRj|`3@bnc0J06d{kXPl09X(Vz^60j@EZ!{#bk^=Q8I0Bc^ny2|K^KR6y{PrZ zOA!ePysFhJ$O$*r7YNE%q)CX`C5C6ugATalefocO+}SQZ3`o4d@iM|lerHmax*t?$ z9Q@9$gG^j6`jaHj<8szVA+8kT&cu~JyP?5htlqLjL?u&L0y2oos}^F&u+(o#muq;w zVYUe8k)Hi(%n%B?s*A5tJW>GSv3{hr1%t^?%+>+?3qe+_P})y$5EV^ulF+QYMx^?> ze1=F==5D5KMh=R$ll?NHd&Zzvf;H&xzO+DEHPW|x%hQ!ciNwk}i0`@&SKNH#91?b( zGwQwP70x|?pVaAYLq>goS9Dl|aIc7{&sy1Nq-MjKpu=AU=GPG∓eYz|5P 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