From 96aeb41a05dece473ffe0b1594cd0112467aed4b Mon Sep 17 00:00:00 2001 From: Matthew 'Apocist' Davis Date: Sat, 9 Aug 2014 05:08:18 -0400 Subject: [PATCH] Jtree Icon per Block +New file option --- .../BlockWindow.java | 84 ++++++------------ .../BuildingBlock/AddBackground.java | 6 ++ .../BuildingBlock/AddEmptyImage.java | 6 ++ .../BuildingBlock/AddImage.java | 6 +- .../BuildingBlock/AddText.java | 6 ++ .../BuildingBlock/AddThumbnail.java | 6 +- .../BuildingBlock/BuildingBlock.java | 6 ++ .../BuildingBlock/Filter/Filter.java | 7 +- .../DynamicTree.java | 18 +++- system/bgIcon.png | Bin 0 -> 3058 bytes system/blankIcon.png | Bin 0 -> 2849 bytes system/filterIcon.png | Bin 0 -> 3044 bytes system/imgIcon.png | Bin 0 -> 608 bytes system/textIcon.png | Bin 0 -> 2873 bytes system/thumbIcon.png | Bin 0 -> 797 bytes 15 files changed, 82 insertions(+), 63 deletions(-) create mode 100644 system/bgIcon.png create mode 100644 system/blankIcon.png create mode 100644 system/filterIcon.png create mode 100644 system/imgIcon.png create mode 100644 system/textIcon.png create mode 100644 system/thumbIcon.png diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BlockWindow.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BlockWindow.java index 0d4688b..9c2284e 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BlockWindow.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BlockWindow.java @@ -22,7 +22,6 @@ import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; -import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; @@ -68,7 +67,17 @@ public void run(){ JMenu menu = new JMenu("File");//Build the first menu. //a group of JMenuItems - JMenuItem menuItem = new JMenuItem("Open"); + JMenuItem menuItem = new JMenuItem("New"); + menuItem.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + int dialogResult = JOptionPane.showConfirmDialog (null, "Clear the current Signature? (Might not be saved)","Warning",JOptionPane.YES_NO_OPTION); + if(dialogResult == JOptionPane.YES_OPTION){ + blocks.clear(); + } + } + }); + menu.add(menuItem); + menuItem = new JMenuItem("Open"); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ final JFileChooser fc = new JFileChooser(System.getProperty("user.dir")); @@ -97,7 +106,6 @@ public void actionPerformed(ActionEvent e){ } }); menu.add(menuItem); - //a group of JMenuItems menuItem = new JMenuItem("Save"); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ @@ -116,20 +124,23 @@ public void actionPerformed(ActionEvent e){ BuildingBlock block = blocks.getRootNode(); if(file.exists()){ if(file.canWrite()){ - try { - Files.write(Paths.get(file.getPath()), blocks.nodeToBytes(block)); - JOptionPane.showMessageDialog(blockFrame, "Saved"); - } catch (IOException e1) {JOptionPane.showMessageDialog(blockFrame, "ERROR: Cannot save file!");} - }else{JOptionPane.showMessageDialog(blockFrame, "File is not rewritable");} + int dialogResult = JOptionPane.showConfirmDialog (null, "Overwrite the existing file?","Warning",JOptionPane.YES_NO_OPTION); + if(dialogResult == JOptionPane.YES_OPTION){ + try { + Files.write(Paths.get(file.getPath()), blocks.nodeToBytes(block)); + JOptionPane.showMessageDialog(null, "Saved"); + } catch (IOException e1) {JOptionPane.showMessageDialog(null, "ERROR: Cannot save file!");} + } + }else{JOptionPane.showMessageDialog(null, "File is not rewritable");} } else{ try { Files.write(Paths.get(file.getPath()), blocks.nodeToBytes(block)); - JOptionPane.showMessageDialog(blockFrame, "Saved"); + JOptionPane.showMessageDialog(null, "Signature Saved"); } catch (IOException e1) {JOptionPane.showMessageDialog(blockFrame, "ERROR: Cannot save file!");} } } - }else{JOptionPane.showMessageDialog(blockFrame, "Dir is not writable");} + }else{JOptionPane.showMessageDialog(null, "Dir is not writable");} } }); menu.add(menuItem); @@ -281,8 +292,11 @@ public void actionPerformed(ActionEvent e){ public void actionPerformed(ActionEvent e){ if(blocks.getCurrentNode() != null){ if(blocks.getCurrentNode() != blocks.getRootNode()){ - confirmDeleteBlockDialog(); - Main.ImageWindow.update(); + int dialogResult = JOptionPane.showConfirmDialog (null, "Delete the selected Block?","Warning",JOptionPane.YES_NO_OPTION); + if(dialogResult == JOptionPane.YES_OPTION){ + blocks.removeCurrentNode(); + Main.ImageWindow.update(); + } } } } @@ -429,50 +443,4 @@ public void actionPerformed(ActionEvent e){ return d; } - /** - * Creates JDialog confirming to delete the currently selected Block - * @return the JDialog window - */ - public JDialog confirmDeleteBlockDialog(){ - final JDialog d = new JDialog(blockFrame, "Delete Block", true); - - JPanel textPane = new JPanel(); - textPane.setLayout(new BoxLayout(textPane, BoxLayout.PAGE_AXIS)); - textPane.add(Box.createRigidArea(new Dimension(0,5))); - textPane.add(new JLabel("Are you sure you wish to Delete this Block?")); - textPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); - - JButton deleteButton = new JButton("Delete"); - deleteButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e){ - d.dispose(); - blocks.removeCurrentNode(); - } - }); - JButton cancelButton = new JButton("Cancel"); - cancelButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e){ - d.dispose(); - } - }); - - JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); - buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 3, 3, 3)); - buttonPane.add(Box.createHorizontalGlue()); - buttonPane.add(deleteButton); - buttonPane.add(Box.createRigidArea(new Dimension(25, 0))); - buttonPane.add(cancelButton); - buttonPane.add(Box.createHorizontalGlue()); - - Container contentPane = d.getContentPane(); - contentPane.add(textPane, BorderLayout.CENTER); - contentPane.add(buttonPane, BorderLayout.PAGE_END); - - d.pack(); - d.setLocationRelativeTo(blockFrame); - d.setVisible(true); - return d; - } - } diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddBackground.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddBackground.java index da17185..5bb66e1 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddBackground.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddBackground.java @@ -12,6 +12,8 @@ import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JDialog; @@ -45,6 +47,10 @@ public void setRgb(String rgb) { this.rgb = rgb; } @Override + public Icon getIcon() { + return new ImageIcon(System.getProperty("user.dir") + "/system/bgIcon.png"); + } + @Override public JDialog settingsDialog(Frame owner){ final String oldname = getName(); final String oldrgb = getRgb(); diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddEmptyImage.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddEmptyImage.java index 5d11c8c..4ed4a54 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddEmptyImage.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddEmptyImage.java @@ -6,6 +6,8 @@ import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; @@ -49,6 +51,10 @@ public void setSizeY(int sizeY) { this.sizeY = sizeY; } @Override + public Icon getIcon() { + return new ImageIcon(System.getProperty("user.dir") + "/system/blankIcon.png"); + } + @Override protected JPanel settingsImage(final JDialog owner){ //locations diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddImage.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddImage.java index 1dadb86..ee7c39e 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddImage.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddImage.java @@ -14,6 +14,7 @@ import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; @@ -56,7 +57,10 @@ public String getFilename() { public void setFilename(String filename) { this.filename = filename; } - + @Override + public Icon getIcon() { + return new ImageIcon(System.getProperty("user.dir") + "/system/imgIcon.png"); + } protected JPanel settingsImage(final JDialog owner){ //Image diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddText.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddText.java index b04262b..3e4759e 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddText.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddText.java @@ -17,6 +17,8 @@ import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JColorChooser; import javax.swing.JComboBox; @@ -113,6 +115,10 @@ public void setAlign(String align) { public void setAngdeg(int angdeg) { this.angdeg = angdeg; } + @Override + public Icon getIcon() { + return new ImageIcon(System.getProperty("user.dir") + "/system/textIcon.png"); + } protected JPanel settingsText(){ JLabel textLab = new JLabel("Text:"); final JTextField textField = new JTextField();textField.setText(getText()); diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddThumbnail.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddThumbnail.java index 4a2e84b..7a079bc 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddThumbnail.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/AddThumbnail.java @@ -7,6 +7,7 @@ import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JDialog; @@ -35,7 +36,10 @@ public int getId() { public void setId(int id) { this.id = id; } - + @Override + public Icon getIcon() { + return new ImageIcon(System.getProperty("user.dir") + "/system/thumbIcon.png"); + } @Override protected JPanel settingsImage(final JDialog owner){ diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/BuildingBlock.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/BuildingBlock.java index d5d5e98..f623fbc 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/BuildingBlock.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/BuildingBlock.java @@ -2,6 +2,8 @@ import java.awt.Frame; import java.awt.image.BufferedImage; + +import javax.swing.Icon; import javax.swing.JDialog; import javax.swing.tree.DefaultMutableTreeNode; @@ -82,6 +84,9 @@ public void setName(String name) { public String toString(){ return getName(); } + public Icon getIcon() { + return null; + } public JDialog settingsDialog(Frame owner){ return new JDialog(owner, "Null", true); } @@ -144,4 +149,5 @@ public String createScript(String filteronly){ public String generateScript(){ return ""; } + } diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/Filter/Filter.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/Filter/Filter.java index f9e59c0..9bb77e3 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/Filter/Filter.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/BuildingBlock/Filter/Filter.java @@ -2,6 +2,8 @@ import java.awt.image.BufferedImage; +import javax.swing.Icon; +import javax.swing.ImageIcon; import javax.swing.tree.DefaultMutableTreeNode; import com.inverseinnovations.VisualMALSignatureDesigner.Main; @@ -17,7 +19,10 @@ public Filter(String name,Main Main){ public boolean isFilter(){ return true; } - + @Override + public Icon getIcon() { + return new ImageIcon(System.getProperty("user.dir") + "/system/filterIcon.png"); + } @Override public BufferedImage display(BufferedImage image){ image = generateImage(image); diff --git a/src/com/inverseinnovations/VisualMALSignatureDesigner/DynamicTree.java b/src/com/inverseinnovations/VisualMALSignatureDesigner/DynamicTree.java index f67907d..4db4435 100644 --- a/src/com/inverseinnovations/VisualMALSignatureDesigner/DynamicTree.java +++ b/src/com/inverseinnovations/VisualMALSignatureDesigner/DynamicTree.java @@ -1,5 +1,6 @@ package com.inverseinnovations.VisualMALSignatureDesigner; +import java.awt.Component; import java.awt.GridLayout; import java.awt.Toolkit; import java.io.ByteArrayInputStream; @@ -17,6 +18,7 @@ import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreePath; @@ -67,6 +69,19 @@ public DynamicTree(Main Main) { tree = new JTree(treeModel); tree.setEditable(true); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + //tree.setCellRenderer(renderer);//TODO + tree.setCellRenderer(new DefaultTreeCellRenderer() { + private static final long serialVersionUID = 1L; + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) { + Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused); + if(value instanceof BuildingBlock){ + setIcon(((BuildingBlock)value).getIcon()); + } + return c; + } + }); + tree.setShowsRootHandles(true); JScrollPane scrollPane = new JScrollPane(tree); @@ -75,8 +90,7 @@ public DynamicTree(Main Main) { /** Remove all nodes except the root node. */ public void clear() { - rootNode.removeAllChildren(); - treeModel.reload(); + setRootNode(new InitSignature(Main)); } public BuildingBlock getRootNode(){ diff --git a/system/bgIcon.png b/system/bgIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdee84e07d5ef8f6625ed6e7390bcc4307c1a0f GIT binary patch literal 3058 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 literal 0 HcmV?d00001 diff --git a/system/filterIcon.png b/system/filterIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a6273e50f76deb7504da426f63599fb149a6caeb GIT binary patch literal 3044 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0003GNkl%R1?!4;L=hyr7toP^hYN}K!peuJKqBXSQwEE($unIEL zHGmVe;0BMeqUIEH21RtBJ*?aQ1K7t99>RVU2aN(okPm%#CeC*;-U#3rWn81bs`jWJ zU;(q(!gK^agXLO)JW4pnV#@pMqyfe-i9>W_FaAIPe$ zo*1AU!ji>%9l%Qra1rK>wAdzem5l74N+@6t&v-&##9YK(3;^4qzXE_ mu#S7YhH;A=mhhQ0{0;!bZZKr={dcqg0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-=1D|BRCwB?lRZq6Q51%sbMO7=4|K31L_-)H+#Fm?bYM487H8wEn{hI3I+z$Y zCqrBagQ;N=jmAX>6N4C(5UmkW1X^2YLHSC5zV^G( zj>~d|q*|pMCK#3*#P9(S(EvCX?s5kZA|xe8OiF~n5jBh8w!~q*L|FZ~1!@CmEI&9( z-u9y%e6*)_JczUS`Zl@uLnz|Ao2Ur+B|Y47BlOv?ywQV1+&Wqktj<4Wd3ppdeu$pq z7x6j|<6O{sL6a2lO`qTe=LyOMj6?}4Sr%U11f>bqa}?4k6p{8XY)%x9%9j+g&n{sb zH8SIOs1#>VI)XA$mOnfos4ODlwF5*9je3FHKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0001FNkl(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;qe( z)P;yHM4>3yRktn*rJK4DyC?(--K1%(U=cq`7wxFgPGd+ST1}Yf%}gfqaqrCic)J+% z+O-GH_ID1P=Ln?~Z&EtIw-awGlmHYzR#GhFKY_M~v2LL!mtQP<4@BfavWBfk!pP zsmd5nwhp8D9zqI`qJwA>rD+|*SLg{7F}N93DThFR%%GV25I2=UC`G&M;8feFNCdf3 zB2q5n874y0z|?SS9{FV}1g88PQF|R_+c>jD^uis+AKs?j@`=lU)AQ5x-~AJN#lp9$ zxT_6@omdDoZ5=0-#hIJK`1c8kr2>cF5*#f4!n4N~>lKT$-d!?RXNWB>;udf5*l32p zPJ5B)b%@(*YpXI$$Iy_@yQ;c`w z4XnlMjEwB$`{zTPi5i%(C=(y#k-0cy**M!9RZ9QdARFwb-pYkQpOT~pGMqm&ib!vx zXTf9Nb`w9-&1MA0gEsW_QJ8wj(bzcSOJfvy5CXZNi{52}LbIE_qk|k9Y!YY@HfnWr z%|LESp?NN9Dd5Y6lW4wt6%Pp@oGy~JE+&7z4NV(QHz}1YuHT&F(&eknT=^Z*vax4- zi2Bh^qF#Td)v6C0Pmv9aBcGq+{ZDt(bXxpz<1d;o%Ix{