From 4175dca940e9cb59764424403b0087d949ba187d Mon Sep 17 00:00:00 2001 From: Bilal Date: Tue, 4 Jun 2024 20:01:51 +0530 Subject: [PATCH] =?UTF-8?q?-=20Added=20api=20for=20FAQ=E2=80=99s=20,=20Mad?= =?UTF-8?q?e=20data=20model=20and=20decoded=20it=20-=20Made=203=20layer=20?= =?UTF-8?q?gradient=20for=20the=20view=20-=20Completed=20FAq=20expand=20co?= =?UTF-8?q?llapse=20with=20logic.=20-=20addd=20error=20handler=20-=20Made?= =?UTF-8?q?=20Woka=20Support=20UI=20-=20Added=20Custom=20DropDown=20in=20s?= =?UTF-8?q?upport=20-=20Added=20Custom=20Gradeint=20-=20Handled=20the=20au?= =?UTF-8?q?tolayouts=20-=20Added=20Check=20for=20No=20Subject=20Selected?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WOKA.xcodeproj/project.pbxproj | 100 +- WOKA/Alerts/AlertCustomVC.swift | 2 +- .../CollapseFaq.imageset/Contents.json | 23 + .../next-svgrepo-com (1) 1.png | Bin 0 -> 434 bytes .../next-svgrepo-com (1) 1@2x.png | Bin 0 -> 896 bytes .../next-svgrepo-com (1) 1@3x.png | Bin 0 -> 449 bytes .../SideMenu/ExpandFaq.imageset/Contents.json | 23 + .../next-svgrepo-com (1) 2.png | Bin 0 -> 342 bytes .../next-svgrepo-com (1) 2@2x.png | Bin 0 -> 515 bytes .../next-svgrepo-com (1) 2@3x.png | Bin 0 -> 375 bytes .../SupportBottomArrow.imageset/Contents.json | 26 + .../SupportBottomArrow.imageset/downarrow.png | Bin 0 -> 438 bytes .../downarrow@2x.png | Bin 0 -> 889 bytes .../downarrow@3x.png | Bin 0 -> 465 bytes .../SupportGirlImage.imageset/Contents.json | 21 + .../SupportGirlImage.imageset/Ellipse 20.png | Bin 0 -> 98428 bytes .../SupportUpArrow.imageset/Contents.json | 26 + .../SupportUpArrow.imageset/uparrow.png | Bin 0 -> 434 bytes .../SupportUpArrow.imageset/uparrow@2x.png | Bin 0 -> 896 bytes .../SupportUpArrow.imageset/uparrow@3x.png | Bin 0 -> 449 bytes WOKA/Constants K/StoryBoardID.swift | 1 + .../ActivityToast&Indicator/Utilities.swift | 2 +- WOKA/Helpers/DropDown/DropDown.h | 19 + .../DropDown/helpers/DPDConstants.swift | 61 + .../helpers/DPDKeyboardListener.swift | 72 + .../helpers/DPDUIView+Extension.swift | 61 + .../DropDown/resources/DropDownCell.xib | 38 + .../DropDown/src/DropDown+Appearance.swift | 35 + WOKA/Helpers/DropDown/src/DropDown.swift | 1209 +++++++++++++++++ WOKA/Helpers/DropDown/src/DropDownCell.swift | 78 ++ WOKA/Helpers/NsNotificationExtension.swift | 13 + .../UIElements Helper/ApplyGradrient.swift | 46 + .../UIElements Helper/LocalisedElements.swift | 5 - WOKA/Home/Home.storyboard | 17 +- WOKA/Network Adapter/APIEndPoints.swift | 4 + .../Controller/ContactSupportVC.swift | 97 ++ WOKA/SideBarNav/Controller/FaqVC.swift | 33 +- WOKA/SideBarNav/Model/FaqListDM.swift | 3 +- WOKA/SideBarNav/SideBarNav.storyboard | 146 +- WOKA/SideBarNav/View/FaqCell.swift | 18 + WOKA/SideBarNav/View/FaqCell.xib | 61 +- WOKA/SideBarNav/ViewModel/FaqVM.swift | 64 + .../Controller/SideMenuVC.swift | 8 +- .../Controller/TabBarVC.swift | 33 +- WOKA/TabBar & SideMenu/LinkTypeEnum.swift | 16 + 45 files changed, 2303 insertions(+), 58 deletions(-) create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/Contents.json create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1@2x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1@3x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/Contents.json create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2@2x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2@3x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/Contents.json create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow@2x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow@3x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Contents.json create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Ellipse 20.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/Contents.json create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow@2x.png create mode 100644 WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow@3x.png create mode 100644 WOKA/Helpers/DropDown/DropDown.h create mode 100644 WOKA/Helpers/DropDown/helpers/DPDConstants.swift create mode 100644 WOKA/Helpers/DropDown/helpers/DPDKeyboardListener.swift create mode 100644 WOKA/Helpers/DropDown/helpers/DPDUIView+Extension.swift create mode 100644 WOKA/Helpers/DropDown/resources/DropDownCell.xib create mode 100644 WOKA/Helpers/DropDown/src/DropDown+Appearance.swift create mode 100644 WOKA/Helpers/DropDown/src/DropDown.swift create mode 100644 WOKA/Helpers/DropDown/src/DropDownCell.swift create mode 100644 WOKA/Helpers/NsNotificationExtension.swift create mode 100644 WOKA/SideBarNav/Controller/ContactSupportVC.swift create mode 100644 WOKA/SideBarNav/ViewModel/FaqVM.swift create mode 100644 WOKA/TabBar & SideMenu/LinkTypeEnum.swift diff --git a/WOKA.xcodeproj/project.pbxproj b/WOKA.xcodeproj/project.pbxproj index f7c431f..9a51737 100644 --- a/WOKA.xcodeproj/project.pbxproj +++ b/WOKA.xcodeproj/project.pbxproj @@ -150,6 +150,10 @@ 9C56E8462BDBEE6400E4CA14 /* EmailVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C56E8452BDBEE6400E4CA14 /* EmailVC.swift */; }; 9C56E8482BDBEFAB00E4CA14 /* AssetColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C56E8472BDBEFAB00E4CA14 /* AssetColor.swift */; }; 9C56E84B2BDBF03F00E4CA14 /* AuthenticationSB.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C56E84A2BDBF03F00E4CA14 /* AuthenticationSB.storyboard */; }; + 9C7939132C0EFCAE00F5D6E6 /* FaqVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7939122C0EFCAE00F5D6E6 /* FaqVM.swift */; }; + 9C7939152C0F23AA00F5D6E6 /* NsNotificationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7939142C0F23AA00F5D6E6 /* NsNotificationExtension.swift */; }; + 9C7939172C0F23E900F5D6E6 /* LinkTypeEnum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7939162C0F23E900F5D6E6 /* LinkTypeEnum.swift */; }; + 9C7939192C0F345000F5D6E6 /* ContactSupportVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C7939182C0F345000F5D6E6 /* ContactSupportVC.swift */; }; 9C9BEEC72BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C9BEEC62BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift */; }; 9CBCB29B2BE4D614007D7934 /* LoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBCB29A2BE4D614007D7934 /* LoginVC.swift */; }; 9CBCB29D2BE4D6BB007D7934 /* LoginVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBCB29C2BE4D6BB007D7934 /* LoginVM.swift */; }; @@ -159,6 +163,13 @@ 9CBCB2A52BE50D49007D7934 /* NewPasswordVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBCB2A42BE50D49007D7934 /* NewPasswordVC.swift */; }; 9CBCB2A82BE5105A007D7934 /* Home.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9CBCB2A72BE5105A007D7934 /* Home.storyboard */; }; 9CBCB2AA2BE51A52007D7934 /* ThemeOneVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBCB2A92BE51A52007D7934 /* ThemeOneVC.swift */; }; + 9CBE1B3F2C0F37B300CA6E61 /* DPDConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBE1B322C0F37B200CA6E61 /* DPDConstants.swift */; }; + 9CBE1B402C0F37B300CA6E61 /* DPDKeyboardListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBE1B332C0F37B200CA6E61 /* DPDKeyboardListener.swift */; }; + 9CBE1B412C0F37B300CA6E61 /* DPDUIView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBE1B342C0F37B200CA6E61 /* DPDUIView+Extension.swift */; }; + 9CBE1B422C0F37B300CA6E61 /* DropDownCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9CBE1B362C0F37B200CA6E61 /* DropDownCell.xib */; }; + 9CBE1B432C0F37B300CA6E61 /* DropDown.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBE1B382C0F37B200CA6E61 /* DropDown.swift */; }; + 9CBE1B442C0F37B300CA6E61 /* DropDown+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBE1B392C0F37B200CA6E61 /* DropDown+Appearance.swift */; }; + 9CBE1B452C0F37B300CA6E61 /* DropDownCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBE1B3A2C0F37B200CA6E61 /* DropDownCell.swift */; }; 9CDC343C2BDBBC6B00093089 /* SelectAgeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CDC343B2BDBBC6B00093089 /* SelectAgeVC.swift */; }; 9CDCE1452BDB9B9A003FEF11 /* OnBoardMainSound.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 9CDCE1442BDB9B9A003FEF11 /* OnBoardMainSound.m4a */; }; /* End PBXBuildFile section */ @@ -333,6 +344,10 @@ 9C56E8452BDBEE6400E4CA14 /* EmailVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailVC.swift; sourceTree = ""; }; 9C56E8472BDBEFAB00E4CA14 /* AssetColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetColor.swift; sourceTree = ""; }; 9C56E8492BDBF03F00E4CA14 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AuthenticationSB.storyboard; sourceTree = ""; }; + 9C7939122C0EFCAE00F5D6E6 /* FaqVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaqVM.swift; sourceTree = ""; }; + 9C7939142C0F23AA00F5D6E6 /* NsNotificationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NsNotificationExtension.swift; sourceTree = ""; }; + 9C7939162C0F23E900F5D6E6 /* LinkTypeEnum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinkTypeEnum.swift; sourceTree = ""; }; + 9C7939182C0F345000F5D6E6 /* ContactSupportVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactSupportVC.swift; sourceTree = ""; }; 9C9BEEC62BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewCenteredFlowLayout.swift; sourceTree = ""; }; 9CBCB29A2BE4D614007D7934 /* LoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginVC.swift; sourceTree = ""; }; 9CBCB29C2BE4D6BB007D7934 /* LoginVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginVM.swift; sourceTree = ""; }; @@ -342,6 +357,14 @@ 9CBCB2A42BE50D49007D7934 /* NewPasswordVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewPasswordVC.swift; sourceTree = ""; }; 9CBCB2A72BE5105A007D7934 /* Home.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Home.storyboard; sourceTree = ""; }; 9CBCB2A92BE51A52007D7934 /* ThemeOneVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeOneVC.swift; sourceTree = ""; }; + 9CBE1B322C0F37B200CA6E61 /* DPDConstants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DPDConstants.swift; sourceTree = ""; }; + 9CBE1B332C0F37B200CA6E61 /* DPDKeyboardListener.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DPDKeyboardListener.swift; sourceTree = ""; }; + 9CBE1B342C0F37B200CA6E61 /* DPDUIView+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DPDUIView+Extension.swift"; sourceTree = ""; }; + 9CBE1B362C0F37B200CA6E61 /* DropDownCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DropDownCell.xib; sourceTree = ""; }; + 9CBE1B382C0F37B200CA6E61 /* DropDown.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropDown.swift; sourceTree = ""; }; + 9CBE1B392C0F37B200CA6E61 /* DropDown+Appearance.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DropDown+Appearance.swift"; sourceTree = ""; }; + 9CBE1B3A2C0F37B200CA6E61 /* DropDownCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropDownCell.swift; sourceTree = ""; }; + 9CBE1B3C2C0F37B200CA6E61 /* DropDown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DropDown.h; sourceTree = ""; }; 9CDC343B2BDBBC6B00093089 /* SelectAgeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectAgeVC.swift; sourceTree = ""; }; 9CDCE1412BDB94BA003FEF11 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Main.strings; sourceTree = ""; }; 9CDCE1422BDB94BD003FEF11 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = ""; }; @@ -426,9 +449,9 @@ 522A93142C0DE8770098FE49 /* SideBarNav */ = { isa = PBXGroup; children = ( - 522A93182C0DE8A50098FE49 /* View */, 522A93172C0DE8A20098FE49 /* Model */, - 522A93162C0DE89F0098FE49 /* ViewModel */, + 522A93182C0DE8A50098FE49 /* View */, + 9C7939112C0EFCA000F5D6E6 /* ViewModel */, 522A93152C0DE8960098FE49 /* Controller */, 522A93192C0DE8CC0098FE49 /* SideBarNav.storyboard */, ); @@ -440,17 +463,11 @@ children = ( 522A931B2C0DE9150098FE49 /* AboutUsVc.swift */, 52BC3BE12C0E02EE002FACA6 /* FaqVC.swift */, + 9C7939182C0F345000F5D6E6 /* ContactSupportVC.swift */, ); path = Controller; sourceTree = ""; }; - 522A93162C0DE89F0098FE49 /* ViewModel */ = { - isa = PBXGroup; - children = ( - ); - path = ViewModel; - sourceTree = ""; - }; 522A93172C0DE8A20098FE49 /* Model */ = { isa = PBXGroup; children = ( @@ -493,11 +510,9 @@ 523ED25C2BDA2BC700CFED02 /* WOKA */ = { isa = PBXGroup; children = ( - 522A93142C0DE8770098FE49 /* SideBarNav */, 523ED26B2BDA2BC900CFED02 /* Info.plist */, 9C9BEEC62BEE1BBF004ECC2F /* CollectionViewCenteredFlowLayout.swift */, 5259541E2BE8E93500191286 /* Config.xcconfig */, - 523ED2682BDA2BC900CFED02 /* LaunchScreen.storyboard */, 5259542C2BEA392A00191286 /* Alerts */, 523ED2932BDA3D0100CFED02 /* Assets */, 9C56E83E2BDBE4FB00E4CA14 /* Authentication */, @@ -505,10 +520,12 @@ 52C6E01F2BE3ADD800E22D59 /* Default Enum */, 52C8B0512BDA4B51003B51D0 /* Helpers */, 9CBCB2A62BE5104F007D7934 /* Home */, + 523ED2682BDA2BC900CFED02 /* LaunchScreen.storyboard */, 9C27E15E2BDB6E4F00EC1DA9 /* Localized Module */, 9C27E1612BDB6F0F00EC1DA9 /* Main */, 525954152BE8CAC900191286 /* Network Adapter */, 523ED28E2BDA372C00CFED02 /* OnBoarding Module */, + 522A93142C0DE8770098FE49 /* SideBarNav */, 525327D72BFCC30400F64283 /* TabBar & SideMenu */, 9C535DC82C00C34000DA6DCD /* Theme */, ); @@ -671,6 +688,7 @@ 524C422D2C048C620016A11C /* ViewModel */, 524C422C2C048C5E0016A11C /* Controller */, 522242582BFC73E40085C632 /* SideMenu */, + 9C7939162C0F23E900F5D6E6 /* LinkTypeEnum.swift */, ); path = "TabBar & SideMenu"; sourceTree = ""; @@ -739,6 +757,7 @@ 52C8B0512BDA4B51003B51D0 /* Helpers */ = { isa = PBXGroup; children = ( + 9CBE1B3E2C0F37B200CA6E61 /* DropDown */, 9C535DB62C0089A700DA6DCD /* Animation */, 525953D22BE8B2CD00191286 /* UIApplication */, 525953CD2BE8B28100191286 /* ActivityToast&Indicator */, @@ -755,6 +774,7 @@ 5259545D2BEBBA1A00191286 /* LoadingIndicatorImageView.swift */, 52A3F6AC2BECC0340000BB0B /* TypeAlias.swift */, 5219C2C12C086D9B00A1DF4D /* DataTypeConversion.swift */, + 9C7939142C0F23AA00F5D6E6 /* NsNotificationExtension.swift */, ); path = Helpers; sourceTree = ""; @@ -971,6 +991,14 @@ path = Controller; sourceTree = ""; }; + 9C7939112C0EFCA000F5D6E6 /* ViewModel */ = { + isa = PBXGroup; + children = ( + 9C7939122C0EFCAE00F5D6E6 /* FaqVM.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; 9CBCB2A62BE5104F007D7934 /* Home */ = { isa = PBXGroup; children = ( @@ -983,6 +1011,45 @@ path = Home; sourceTree = ""; }; + 9CBE1B352C0F37B200CA6E61 /* helpers */ = { + isa = PBXGroup; + children = ( + 9CBE1B322C0F37B200CA6E61 /* DPDConstants.swift */, + 9CBE1B332C0F37B200CA6E61 /* DPDKeyboardListener.swift */, + 9CBE1B342C0F37B200CA6E61 /* DPDUIView+Extension.swift */, + ); + path = helpers; + sourceTree = ""; + }; + 9CBE1B372C0F37B200CA6E61 /* resources */ = { + isa = PBXGroup; + children = ( + 9CBE1B362C0F37B200CA6E61 /* DropDownCell.xib */, + ); + path = resources; + sourceTree = ""; + }; + 9CBE1B3B2C0F37B200CA6E61 /* src */ = { + isa = PBXGroup; + children = ( + 9CBE1B382C0F37B200CA6E61 /* DropDown.swift */, + 9CBE1B392C0F37B200CA6E61 /* DropDown+Appearance.swift */, + 9CBE1B3A2C0F37B200CA6E61 /* DropDownCell.swift */, + ); + path = src; + sourceTree = ""; + }; + 9CBE1B3E2C0F37B200CA6E61 /* DropDown */ = { + isa = PBXGroup; + children = ( + 9CBE1B352C0F37B200CA6E61 /* helpers */, + 9CBE1B372C0F37B200CA6E61 /* resources */, + 9CBE1B3B2C0F37B200CA6E61 /* src */, + 9CBE1B3C2C0F37B200CA6E61 /* DropDown.h */, + ); + path = DropDown; + sourceTree = ""; + }; 9CDCE1432BDB9B64003FEF11 /* Sounds */ = { isa = PBXGroup; children = ( @@ -1125,6 +1192,7 @@ 525954392BEB4B3B00191286 /* Exo2-ExtraBold.ttf in Resources */, 5259543A2BEB4B3B00191286 /* Exo2-SemiBold.ttf in Resources */, 9C535DC52C00BF2400DA6DCD /* HomeExploreCell.xib in Resources */, + 9CBE1B422C0F37B300CA6E61 /* DropDownCell.xib in Resources */, 52A3F6A92BECBF2A0000BB0B /* LinkedChildCell.xib in Resources */, 523ED2652BDA2BC700CFED02 /* Base in Resources */, 52BC3BE62C0E0326002FACA6 /* FaqCell.xib in Resources */, @@ -1202,6 +1270,7 @@ 5272FCE32BDFDB05000ECB1D /* UserDetailsRegisterVC.swift in Sources */, 525954102BE8B72900191286 /* FontCustom.swift in Sources */, 5202AAFE2BDF90590043B7BD /* TextFieldImage.swift in Sources */, + 9C7939152C0F23AA00F5D6E6 /* NsNotificationExtension.swift in Sources */, 52FDDAB52BF34DC300E037C1 /* YesNoAlertVC.swift in Sources */, 52C6E0232BE3B3E300E22D59 /* SelectAvatarVC.swift in Sources */, 529B0DD62C070C0F00CFC54B /* GuestDataDM.swift in Sources */, @@ -1220,6 +1289,7 @@ 5259541D2BE8D94400191286 /* QueueHelper.swift in Sources */, 525954232BE8F00400191286 /* BaseResponseModel.swift in Sources */, 9C27E1692BDB76F200EC1DA9 /* OnBoardVM.swift in Sources */, + 9C7939172C0F23E900F5D6E6 /* LinkTypeEnum.swift in Sources */, 523ED2622BDA2BC700CFED02 /* SplashVC.swift in Sources */, 9CDC343C2BDBBC6B00093089 /* SelectAgeVC.swift in Sources */, 525327D02BFCBC4A00F64283 /* ExploreWokaVC.swift in Sources */, @@ -1233,6 +1303,7 @@ 525954192BE8CC3400191286 /* ConstantString.swift in Sources */, 52D774EB2BDFC0BF001D87DE /* OTPVC.swift in Sources */, 9C27E16F2BDB866500EC1DA9 /* CellIdentifier.swift in Sources */, + 9CBE1B412C0F37B300CA6E61 /* DPDUIView+Extension.swift in Sources */, 9C27E1632BDB6F1900EC1DA9 /* AuthFunc.swift in Sources */, 9C0A85412BEE35670093783D /* ResetPassUserNameVM.swift in Sources */, 52C6E0292BE3B52500E22D59 /* SelectAvatarVM.swift in Sources */, @@ -1242,11 +1313,13 @@ 525954142BE8C87300191286 /* ExtensionVCToastAlert.swift in Sources */, 52B8D4D92C04A25E00ED65F3 /* UIViewController+Container.swift in Sources */, 523ED25E2BDA2BC700CFED02 /* AppDelegate.swift in Sources */, + 9C7939132C0EFCAE00F5D6E6 /* FaqVM.swift in Sources */, 52D774ED2BDFC13F001D87DE /* OTPVM.swift in Sources */, 525327D62BFCC23600F64283 /* SideMenuVM.swift in Sources */, 9CBCB2A32BE50C95007D7934 /* ResetPassUserNameVC.swift in Sources */, 52A3F6A52BECBA8D0000BB0B /* LinkedChildDM.swift in Sources */, 52B8D4DE2C04A25E00ED65F3 /* SideMenuController.swift in Sources */, + 9CBE1B402C0F37B300CA6E61 /* DPDKeyboardListener.swift in Sources */, 52A3F6AB2BECBF550000BB0B /* LinkedChildVC.swift in Sources */, 52FDBA7B2BFF2712009D7AC7 /* AuthFuncTimeHandling.swift in Sources */, 9CBCB2A52BE50D49007D7934 /* NewPasswordVC.swift in Sources */, @@ -1258,6 +1331,7 @@ 52B8D4E22C04A25E00ED65F3 /* Segue.swift in Sources */, 5259542E2BEA393700191286 /* AlertCustomVC.swift in Sources */, 52CA28FA2BE119F500708B49 /* UserIntrestVC.swift in Sources */, + 9CBE1B442C0F37B300CA6E61 /* DropDown+Appearance.swift in Sources */, 9C27E16B2BDB774D00EC1DA9 /* CarouselData.swift in Sources */, 525954212BE8EB7900191286 /* APIEndPoints.swift in Sources */, 5259545A2BEB67D200191286 /* DateFormatterLib.swift in Sources */, @@ -1277,6 +1351,8 @@ 52A3F6A82BECBF2A0000BB0B /* LinkedChildCell.swift in Sources */, 52C6E01E2BE3847F00E22D59 /* BorderView.swift in Sources */, 52FDBA7D2BFF481A009D7AC7 /* ThemeOneVM.swift in Sources */, + 9C7939192C0F345000F5D6E6 /* ContactSupportVC.swift in Sources */, + 9CBE1B432C0F37B300CA6E61 /* DropDown.swift in Sources */, 52C8B0742BDA7626003B51D0 /* OnBoardVC.swift in Sources */, 5219C2C22C086D9C00A1DF4D /* DataTypeConversion.swift in Sources */, 525953CF2BE8B28F00191286 /* Utilities.swift in Sources */, @@ -1304,6 +1380,7 @@ 52663FF72BDFACF60001D8CE /* ShadowView.swift in Sources */, 9C535DC22C00B36900DA6DCD /* ThemeTwoVC.swift in Sources */, 52D774F12BDFC53B001D87DE /* StringSubScript.swift in Sources */, + 9CBE1B3F2C0F37B300CA6E61 /* DPDConstants.swift in Sources */, 52B8D4DA2C04A25E00ED65F3 /* Preferences.swift in Sources */, 52FB2D8F2BDF898F0009B0C7 /* TextFieldPadding.swift in Sources */, 5257B2652BDFB6F50086D79B /* CheckPhoneHomeBtnOrNotch.swift in Sources */, @@ -1312,6 +1389,7 @@ 525954342BEA620800191286 /* IntrestTopicDM.swift in Sources */, 52BC3BE52C0E0326002FACA6 /* FaqCell.swift in Sources */, 52663FF52BDFAB830001D8CE /* TextFieldErrorView.swift in Sources */, + 9CBE1B452C0F37B300CA6E61 /* DropDownCell.swift in Sources */, 9C27E16D2BDB852F00EC1DA9 /* GVar.swift in Sources */, 52B8D4E02C04A25E00ED65F3 /* UIView+Container.swift in Sources */, 9C56E8462BDBEE6400E4CA14 /* EmailVC.swift in Sources */, diff --git a/WOKA/Alerts/AlertCustomVC.swift b/WOKA/Alerts/AlertCustomVC.swift index 0206310..58beb88 100644 --- a/WOKA/Alerts/AlertCustomVC.swift +++ b/WOKA/Alerts/AlertCustomVC.swift @@ -54,7 +54,7 @@ class AlertCustomVC: UIViewController { @IBAction func doneBtnTapped(_ sender: UIButton) { self.dismiss() // Execute completion block if provided - // self.onDoneBlock?(true) + self.onDoneBlock?(true) } // Action when cancel button is tapped diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/Contents.json b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/Contents.json new file mode 100644 index 0000000..c30479c --- /dev/null +++ b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "next-svgrepo-com (1) 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "next-svgrepo-com (1) 1@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "next-svgrepo-com (1) 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7ccab0abb5532d8145f911b66ca1c87dc057eb GIT binary patch literal 434 zcmV;j0ZsmiP)Px$Y)M2xR5(wilfP@iKorMcTK|EJN|q8Vwt*taSP+L`NwJOwDu`33{5Aatf`gE; zQ^ZWMq}3|D5GaCwL6R<+x}`t3BNt8^YfBGqd!Nre-uE2`|2*6t{r~_zvs+mDlK{gX z8HMYx=-b&PI0S(AMx$}GUaw!{IDP{FR+x*51SJ4SHBCFUZ5ypts|QJvF0c>)a6Rpc zNVWwm{Fo%koagzoAP8RS^}3e98xmGPU{zI59LHHiQ8cYoDs5fYMa#0DeczwSvfSR5 zP(cn)CX=Ty45xx1Tmb-?#b7X~nx?rdl3+m*++n7VhnM#I{o~a3)O5kORnpttl&2=_2gSg1%H95gfRPl cPx&I!Q!9R9Hvtmd{QaQ543{ow-9$qAT}AnP4>04KeAWFVF-DMKKs7nkX6yi~0cF zo76O>RYc0B21rID#&_@mY7vwU82V?`P1A)+l*=@C!ks9hGlOYN6DOGscjlho_nq&a z0l_0*=#lHg6TpA%0EMTw(zx4-Q@akZ!mKC<0QGhV+5uq2xLhvxW_fuzn@*>50KfwP zF$-Z9fEK5gbH!pY=5#t20N`YNeB86UyDPT?VFo}eUM`n6`}+Fks?{pN81oq8!qn81 zH9X0BU-f&;wv;=VV#lq{`3E&cJ4~eMuw| zql=4+-~E0+zrDTvzFx1ts@Lm)F+Q1?nDFlG>=cbSaUTHdIhJL4Lli~Yb87q1`ue&% z8jXHy6rjgXxxBpm002>{SP+E#^z^hhl}eTLAnpQS%2BCQ+H^P^q4V=|=1m?3xA#8f&H18xsqZr<2q6^W-b`EvP}A;mx%ejKNAY-kG#n1MQr-%J z{-!#?ah&P|#yH;y=B-RH08M$NQu%1N+vi!&W3kw1Bog_d7p7|@H=H1Zu+wooIXUT- zB-lstT literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1@3x.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/CollapseFaq.imageset/next-svgrepo-com (1) 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0e326edb01ccbbcbf0e7a03752bb98db284d9d71 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzr1|*B;ILZJi#^NA%Cx&(BWL^T<)t)YnAsNnZ zZ#>LBCco*_4(@1u`W#uM#k2P+KDLka2^8D+fyhinLhc6kqP88X3&e_= zW-u>cD{?u*8Nih(P|PyL;mVnLu1~CMBNNXuK9Z>nyc#?ENRW$}B$I4P+yMurm-_E! zuc}*ifA@Qrraj8)hFlkzJ?Ga;9pGfDbq=#Nt`4|5KksjMy85-W38l=9ZPx$5J^NqR5(v#WPkuh1_p-zT3T8XGiT0hh>eY{c<|uC2L=WPW(Ed^zfd(;DUe2( z0SwmG*0M*A965XA#*N#~&dx5+o;~}%j)V+BHUMr&R8*Aw(xppJLJe`kX9&6hAVa|ZCe{#a29RV3E(6dFIeqWmJy4j~ zKY8-xJ1o}Vp^qn;z}^W83X)v0V#V?2&!4|>cXxNcapT52sGk4$TmW|kxdtEyCdpnv zkBNu4(gZQlh*LARKqT5`Sis{<%6ISHeQ0NA=Rj;y1{)L+5h1^P`SR1`WF~NSHa0ev ooG@WRLv(a>#iK`$-V>9Z0qG>x5yS^ROaK4?07*qoM6N<$f*FsGQ2+n{ literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2@2x.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..56cc9e758d3b871853eee2c4ca485ad73fa0ef78 GIT binary patch literal 515 zcmV+e0{s1nP)Px$y-7qtR9HvFmrYIrF&KtlR7x36G{!@?0M5XgxG-rt!%tHehCO%C8>mq?oCZyl zOeUoRm`*Y#8V2X5#o2b6KJU}y`}#GI|1|*Y=JUA^z#9w(PXJBnYJz_y9M05S;k-`0hRA^=WJ6a{c*q6~l&6J-Ico2UX{)kIYQYbNRdSTRu- z;D?DQio#Z_HPTvxQo5W@r`;e3UbC{kuOHa}$RJDuOO#Tq*=$a=)(t|)hY+I6Ie*N9 za1HP&rR*}s9$W&L5NWCYeFZ{@9_QS=A=1w3;tKMb)jMOXTcmB*xq|QHb(&OFfZEBk z>!<=?C3#flD5}lj%EgI#~8a1LfippAA2~>dc5=T{0o4ns4%PPQbPa$002ovPDHLk FV1ki<-mL%t literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2@3x.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/ExpandFaq.imageset/next-svgrepo-com (1) 2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2cde34f0ddad0eaa2cb742fe1fe969ebc84c788e GIT binary patch literal 375 zcmV--0f_#IP)Px$F-b&0RA@uZ+R+WdFbqXedjm#b1U7vmcHYcNA>4p!h%P`SL^q%cVhB(HF$~B?ga9%TVSp?|C?Eq74qzi7044$kU?HFY z1_BO1BPakQf(Ae#r~m|l4v0pi03s0;0kf)3d#_(o0DsQauK0$e10v(;farKC01;0E zpyDY2WIP;zj)wvm@h|`@9s*#-hXdI0p@59|FhEv(2p}_l7?2%51gH?-4X6^|1*jD7 z22_i80nF?mB99;6h~3A)z31IM<6K8dGrNe$b+d44yz33D(Hlg1d>7zzr&H#4n>X86 V?lA#DpbP*2002ovPDHLkV1mEajF$ia literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/Contents.json b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/Contents.json new file mode 100644 index 0000000..a49365a --- /dev/null +++ b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "downarrow.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "downarrow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "downarrow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..24d91223669d855062ea6be117324fe9a8460024 GIT binary patch literal 438 zcmV;n0ZIOeP)Px$a7jc#R5(wilRs<1Kp4i~s9UE{Xp&D5k%Huk*0!LT6mRM%WC)r4I!>KJz(UqG z7%C3pZU_adR6>_vM!!J+@rGWA!Bk6cx#8~lz0W=Oz8w5>aX)(8zy8RIH4K2-0swp- z2}ugZ0992>)9Lj6NXU*`uHWxB2ZO<#VHmfjX|4dE2ml{BPS9oi)F_HZK@hCDa=Cmu z91iaZAq`#EYnElb0ze4>&{29N;xG&!1VLzOnnsflJ@KvNmmMja3ag{*=#m@%j=Ik0E4sn$ZhlA01Se6 ga%bca;NWb114`MIFk*)1vH$=807*qoM6N<$f`?PRm;e9( literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow@2x.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..57fdf21fad3a9537564ca8f1287424f25efde261 GIT binary patch literal 889 zcmV-<1BU#GP)Px&Gf6~2R9HvtR!vJAK^UIhStaVB^wLv57Lzr8ZS4=pe-Ig_ z|F{RnM~?*lD+d^v;yuho35)&V5kkg200RVImPD2!n3T1R?jGq|eph*C5TNwuhUtC;#8488I=W@9pUa$8vb)Z-* z?i30IFVFLc=lKPU@dt|wtssFBLV7F~dl895_Ec4U<8V08>FMcPNgXx0g;JRXmW;c$3ApU)3=babGTlar<4;o&bd0x%&E2)NhQ*1l<)*4IKO ztjYm=2*9tdu9BiCLe!-u6ks3}MRBH5sXblS`^~{?#tEzPgM2IBAkf#W!cgKbqiGf}4e?(S}=v$GSFFN>o1&J;(#SJ{O0 z#j&w5*Vfh+kf1YR7)G?cz5S!j-BFggs;Yx9aM^4&>GSzOxo#4my;H4<83{L#&@`^w$}cZ36W!h2A**uMEw#=9N+J*lxYpO#fdtzf^_-x}=jZ3e z>FMbMRaFNnl+(;B8@JwJROSRBq?hdu(+O6oFcVdk=W@A(%jJ4+7Ft;a|IGpR{0}G0 z2UaIQxgL#1UrkL-fpVJp`T2QLlB7w9q?&TO1YliFC&tIeKc&-Y-K^LB+uPgMU0q!O zzAQ-+D2G9-s=N^bu$Efv^ZBHWjg8$xq0lb~0@5_?>*3*H+~e`=Xqq4y}gGJ>dj`eOK!J2V#(YVc&#F`bN`@m`2Bu)c6Qb) z%krEFZp(Hnz`r=a-me6!JMFbpHA8?oXe}f=?v<@+mO#URl`lLJcy!=5U$>4SYZzAZ P00000NkvXXu0mjf3QV3; literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow@3x.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportBottomArrow.imageset/downarrow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a7738224c6ec93cfb9e9f606ce2b67090614692f GIT binary patch literal 465 zcmV;?0WSWDP)Px$i%CR5RA@u(*5OS9F$@LZ=M5MEHb86ulOPu1${>hI$_A_eBd~!XD6P_?y*Q5D ziz=VgKh<4wpI>qg;Q}tY00ROsN{W$0Bw<*ASWbq;>>4VP=qjJ#!~c?C<|`ulHk`wK zr~?EuKLU6L@IXYL?z1ZAT_|jp4jKZJPbqvIEu)7WOaxX za1yaLqy?~uSPRk$s3Oh{(Evn?0q+3Pk)pgNBHGkWCrw9jcKH1E0-BQW z=pz;Y6~bz1Spn3DUWg^23!#Nr1G*8d5D$O}LJIK$m?0{V`}}27_W{#BQ5$TbkEBOc zjjT4OX%dw_GJh9QCzb$Q5DQCd_fDn&H^c(O9N>y5AXARO1>lY-Ads9!rF&q0U(+d8 zJBjymf$*-dbo@v{S}E`QA_?ybOUI8Sq?Pi%FOu-Cuyp(%MWFg$WoUT|00000NkvXX Hu0mjfBgwi* literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Contents.json b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Contents.json new file mode 100644 index 0000000..0766e89 --- /dev/null +++ b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Ellipse 20.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Ellipse 20.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportGirlImage.imageset/Ellipse 20.png new file mode 100644 index 0000000000000000000000000000000000000000..9477a1823ddc377ea61877754ac1751ba05e782d GIT binary patch literal 98428 zcmX6^WmsH2)5ePH;%Xh2m0Ni#rsD;`;6Lem~Cc zm0UTQ%p@nd=bi~fRYevHoeUig4h~CR4*VGo4*u%D2NfAsgPW){1^YvDlGAa8gQFGr z?}3+2`#*YpI53@ZK2%a*|_tE^_xy~AP^Wq@#Du;9_Yo|xMe7|?s3D+|I!aj z%;Kwg-t^&DO)$_C z4Xqmr=Hx!wl3Z3=aHWwK{;Y-+x4Ae~pBd$k1=9+cs2D5eg?lGBCFk4rs%3I-jMZ6n zOD886%L5Zia(N-SYAL0=LQj}|y=N|Gl1{?#Uw7M6;~EpY91!2@5cwA=UBi&r2F2L_ z6d}Qz8d=$6^we4Z69@}$slt~_)$k~$e8U_uAx-WVG; z7$V4$h8d74sj6Mm_qq@OfIi~YlRd{Nh2>}(TJGWhw6nUX{n=gmmb%c=FV{y8-LnIP zV#0buM8`SK9$8_Sqod`XafYS|(^R=ZB!hr15cuF&e?>VGudp;>V1Xhg0c=oVgj7fY z*U|yjriJJiZa|SZY4HHj`8t1R zPC4-aupX{Sg@TD^T!b4f7?OGzfFRgN!Z@ct!HkSb#`DTS%f0D^lr+Wghzc887YNWA z)}OzFCkIML1;B(n|E~i2zly_munHduSPO9f)_*N75Mi$v(g3)^()w@RVapUuMimTn zgE+vHrGwgz}8*lb12cpfv91~?-r4O zx0Nxlj3E;%dCONIVKCE4zMkB@45HbW0**Yzl}y75m{M{vek35>EdT(32xpy(^X0#?7i%Dk*${MrC&O~NBIu^`>8tMUpP~kq2%_KamXdwk^x^q82yKL^_-sNpO6xb>@jM@ zH@_>okiVZb)ew1Grr`QRaj`^rNy;0UpL5Vw|I)ePARGkCJ69FLN4?@BCS@Yi#rUe- zd#8jWGuf+oL!;{v>ZTjlkJ^Ty=_%mdkm`$g&Qr0!hhZR$Wvjm@`Q43;o>oX_?fjs3 zYy7Nh{0eT39$W*`7$LGs1alcA%+G#axLu7C^b{_0ajHmbY@Jn&B>Oq7nx~!Boam$x7NXb)H&2@(fO8>J4;sSa#O6P2W=T zu~g75d99{{2+0xAAhjTdgydYg_C&M}!m?6%ds|;KT#vw>J7rzKT)!9dCHM@@Ink`m zHRF5{e0T$mB9Ws@puvSSVB{M74TtA9^L)5PlrjmAM52n_=BtoWZj!8Huvv%-0~<~M zL2GJDXlewudH9WSwk3YO&fdFRYa_<;8(&BNd@S93yB_=2icGy@@40 z7}0X?LcwDFsLQDnn)d}RE~Q#u`$KAETz*xUxigcpWD(MF3(>N&MRguWwN|i*=o!?Q zCn}QQmY3v2f{Lpxib1qoi?|Z)%k*$b!;!d>mL;yB6_5Jf(<&0IDVGhxGHy*~7PBhL z5<~*76b9!aIQ^sfDa@u$GW5jOj2;Cfl=vzpCeZkJeys)qGTzL*SU;402Un8V%NT%j zqL8o~)+`w|T6fLs(rsBP85iTe*r6DUTE;7{!D`#YqY&?@7>0ahQJ!g5l3XGt=gq9N ze_{jMnM1J!$*|$0`v0T``1Zst0sa_)5cT+g?ZF0TyFOYUX7h*5+O{y_eYF-;e`llS z>}(YA?TgY(@lk3Mhg7;TaD^&G6bDmXmIVFAl>|J{fD$5ImHz$+BClujAEQz(2K9>H zAMF+Aow$`;=YNu6z$;0Kshh2*gxHhH>tArTMh#=4;)phWIh{R`WI3Ihi%2(4nW{P;fFTSK zM1Fa-AN@SYpy_CQj6O85b^q^Q)Ng)C6A9X(HuwlbYO2-+mlX379I{sSNMx39Y2IS& z=gp9vHT`pCDn@C;#YC*L5~w`UV+I9{&=U#4dP|SAv5zd}bLLVvOW)lBBrcZ5Xj2OzQ`gcS3|6YluPl$;$#%Kf6f) zp-7w~EWd-3(hwjQQdQ-VF8N4MB(YA(uxg@x_+5_!hbZIzKJfmc1lK4A)Z2&LZ72L=(B$HKtF?wn1IDZA&+T29^*39 zj7mn14hJzLNiS929uF%O-~Xzz4Fy@r487uy=LyAF>yJr`)eoy&oOd$_P96gT%i<@DIG%c3EAVm)%cI4W6kCtFNM*<%e0dJR zoXa~Y>l6yTKx^liyL?b}VF{=XGs{)v!GTX2ehSW)^Sh({(`Hv3}f5!_@u~i$~Omw8J9Cm3$>CjMyHrLmTT< zTn{x0yKqH&A4otD{uX+DLF~9BD%5OUc37BC4z{)K9*qa^L;1Fg5Lh?3?Yv{hXN6?r zklX}^(YZoC&*rzy!!Qn#?FVLx`1-K9&-Yy5{f$U)4Q!zyMfFq5(5$)1Zx`X~SgSG- zNNg3i8lyMWkuJI8Mt6EJ^kSXazc)ol$*>B8E1#r70w&%e$ZrFJ^IZ^DmB=b1bm($w zI}};-DcIq2X3*0~Xln0l9+AqL1?aK^X5)bW3}G8KT(PhL9kY`@G`n`!0y{zYM+5%R zx(V~VI}D*)l~txNE6nlWArxne!T}SXBx@k{>}{h!&iQ4aTbXyJYSa|o`a;4MBI!D- zvREo55A7F|i(gf0soXk;OsB(0t#DBA8DdgD!(&{SfD3~Pk_nwEUUf6oQ8gX&ReLH4 zT~w?Gku+s63*ZMV&M=5N7=)0(8; z42c-m%hBo$ZXLxG%lGG)%(Jvk%03KRl7TIAV5RZnhRZfKA#cs@R~(cfr? zObm522+0rMrxo_`bT5Q1rsSUyhfS`&k905)#m?dBg*Uv4DRM$ ztzSx~t`InO=G2zizN)JjiO6+M9U!kpr{J#uA&Qttt**W-kS z*Du!1?w1Su?1scTF#d$b$@J5nH}Rni4LBwLLiO@cv4NG*k24~vW`f%D^4s#$g4=Sa zwDUV@qy!0&Nq?_Ru#hhxLSe?bcVmD(n+{R|!P6O)nDS&s6oIwn2hdRz-KO@U2$1lftjM!PJVFJ@Rh zE1mOS!6Xs}tK*>de{hePh`lGGtfMnByos|TJ15d_<`yDWE{+y3hXanO=UrKb>R3ha z%K#K&4=6%YFu?CYbK*%}0*&%3V|*9wR;nm>sG7h3T`E%m`2~qz+n97QlpgY1HpRAUarfhd zYC3FYV__dR%qL_`sb?)qZ8~IX{WbcJ#CXJ!owl>1PdDPo}cU(a&t(1aYCp2d+kcLKnA{y{oE z`s86T%H;2pGQV0c<&-CZg%*WfFcC9o$?ct$-|Zy|0Pca@@8=L(7>OPvyRvx z@&YHV4``4e)dE(=6g(a3)du`XoHNKhmR zJCS9vDf_qlJEm9XrnnF_2_5N<7l8=ts)sc;AEmb7r5g=*-LGYzWIJ~BV{H7Q_8Us2 zTemf$3tTC3nE-YV!dAI`1yu(v$X$6tr?X-u2m7@2OwQAEF?w(cy-g}lax3ecel&FFMX-a{DX&seq`1U1s;c7NrMa4V*y!N z$t{La1v6!gwln?52|GU7xwwfm5vG?ZM#rwb?t<_HunuXZ|xukrp5Lz(u4D^M}&|5mn_Rs zPVId(*7c34{YYD!T1)<7A&*!%WX!z3G~1W$7Qw0QC0!6xN^?mYV_FrFQ~gSTeJ_Iq z6)IcEa7b1rvbhZ{sK3^!PWE|iu|m-xEh|p0F?q%FJif~7rH#qS>6|mKL}Qz)V|>Ki zp`O92F%33uYeG44_^L_g8I5mt3qJ3wSgJBUy#%B4RDJ}tAAwnlR6r_8^ zqv)?4%5m{&BM`%}`q=1 zwV7>qrOO~?<0_T48P$JSK+yob8&k11YD_CHAj&hUCxK%1{Dlm5 ze77^-j-R=vHjOhx5VvM3`qQh^-JFd$t)}cPQ@<)*E5OJztC;>+D<#@Cv0?CnuwELT zoYRrqnuLqvgsHE)Nspm|o;y4J&*l-Apsy5N5QiaC7rzx}^v##Tz!q7ni?B4&LH0e(EiQskSc z7Y=qEnI1oarS+#Ttat)3t#Ue()9|H;HX4-b9cyfOoG`|m|MeO>Hjf7j00>3CeXY}= zqEZwx0c_Bj08jaTosQWGXUQ%DRFXB1F~k$Xqq&B`yz1Cp!Zs_7*pHT{**Gn$ig3Wr&g*_mY7n zwpXD4xkZB42hw?5qev}L5wm~$k4mYBP-?oO;+sF#EUL#y;|jFkrrOv6ILlTIsyb(A zTs7YA`WrZDj-Pd5SR8ro-E4mU5G`gD>OhMejZ5a{N6cSU(r-5h8-<0ta+7v$6W~(m z_Gt#c!ZBKQSIvljzpad%M>AV5$oW45WmKMl$V4^)L@AfvsQB+(OluybtW$CR%2lLi z6F&MS;;#ZBvJ|bcC%IaNJ?8=U_Uax?m&|M_BJGl&lVL97edGY<7Y}482}i{hO2d(jz*+Pq|5MkTzI{d|MUcZF-835cVTGv{A^l- zX_jhHSUJpys;~P6;2)%`$3?IuGB&H35g z!_3939sJ%eAAai7*r{X>G`7>HjZ|-EMAR^4!K;5Ocb;o=zVtO_!lPyE3uZgyk}Oz} zza5OaDLJgOB9Z1D%1u+Z_^%OzYe0wC2nNZ6gA{0~%wKtF7|D!#p*nj~dwbWl1xOw9}{pQiYaN3^y4LbM%BeOOgBnek1O|6uz*Nu(%tL?sRR_8WRjf!^) z*ljcBq4*H^AYBcNrjer1tdUs9)n`+7Z4V0A1Yqlly!T}7MWtdL!fBTKt(x(r<;h=q zv{nX=!0z?R_4#$-yx@7*_`LiZ2cCjqJj^A64^2vB1%3P>=4}R9WO{QKkB-5X0MVUT zHQH{iUIfejmTVbCnWsx%@Y>y(x6JD~o)qI0(r%-vpP6lf*94ht7WC?9qBS;?BdVJy zusS@gAV$R~28DsOe<`cCW-8pjKcwRhwNKnQyCbxY!(nM}Z@-x9ehXgw_FA(L0ce*t z``DL~%>eVo6D<--X3?(VcdYn96#M}61NJ!sVM!HLI30O20qRKqX^8~ z?=sPm8xc4gUeYn49fq48Mc#kv*UI`gLw#i|izRR5zOOd9BO2bHcf-ysP2MI6tQz0k zx)1@!cgSd=*08a-a!^aaMnigJ^W*YPI55~Co8JrC%8F#DB$&Az#QI-+!V1B9RLS+O zuJmm^@KpL_rHK*%*g}l+oHwo^Ay=>PQ;ia-mc{={Q#RGM6v@LviEQ#ycK@6>{l!P)#kRHg=B!x z1Syo;%`>A{xEsE+oypAJ@4wZV<^LmB&{KAST+{JK^`AR0pJ7fPDsk&Bo`C`C2jp>9 zYN!7urdV_Hu}L0G!mQ#js&EIO_Hn$ySnBe}fQSZRb@8^U^_ca;<0B9vhN$wu=wf7Jec4x>E*iV)k;bAkDYvpLqy@1wbtZCDr3p4z5R6-f;zz%%V;3@Pt>+u}Fov_aaZxt4|h?7OuPPHG}zwtUe+vxl2 zWObb1LcN#KYUe}8ozsILUC!ck^p4P;gTu@7<{!*#q`dEcG$C#qTINXQWW>VvO2lvf z_iZf1;b2?Uu5{aW&^V_vOk~+BD5a>{Ci88>V$~mA>W&{MejnudUtq_}ad<%9OISCX z2EEUJ8AS;jcDMCwnYudh zoVjg#7utX1cAQ zP5{lNT}_6?r%6pfWW=^28(r@B-gzGXb%G0FsB;rITn{>?#a|j1 zmT~Ee5++}#=azz=0t1C@*w|Lt1ch_o@xk`4SYXC)RX|ho_sYJXfB!XkZ3p|-zBVLG zFD$J6NOJIm&`eK-!Go_PQ2WFD9~Fcj;CUC@`A>Mqbhr$R5K#yX46s-4R*az8&JDgC zi;x3zMMZrRv)-+se{!S*qSYgA9LRk2zlT2M#)l78_Wbsafqu(;hX%>-S)(GJ?1!5w z!k}i3b`j}~sy!?Jw(Bu<5YrI@lh7Zu75*j`=4lwPE>M2r!MkT+J8BPer3q~8{e!;E zuqvByWVC(7ix)qoP|6fU0RXxr4TOAYr0czYdW$4JkcFXbFX?L$8LxTH` zEZ-s*^8)mR3-ocUHNi^yqtyzrUIMvJ>Y872pw+MaUinRNL}ac)!lJtQHbs`2hGHrm zo1fW*EEq^ndA@OOp)@eUvmh>u9M!nJtcAR%wbOEuu=NY%R{ab+Iewv>cScxJb>c)H zku?vakI(@U5?~xhnY6F)+@M8%TQ~}{DWCZ0@JOFvxOk zE|Tc2O;!;3;g5azhL%n5dZPhoXyP>c^0^O(3^>uWEvFpJ`XB!lsyN3plOH=0o|FX? zdTu-HY_CMZdHK88`c}Q7_C@0z8X8w4wwJqxw&HZJbz%db;nL2#_!w6|eY%q}cCNm> zfCoh0#rZZ@mt??K1;ub!Fq|KXVYsL5^W}qjq?B3v2PGnmiJvE|IbMU_Gi#jry^=#e zz84~73bv7?ZbEkpNf8YuS`({V9#9c`O%jj)UWbbrr7&0`hC~edtlk}L6SRAxJv{ME3AfguqfP7hi0xM4R>tcVjE@t49e zr_naz1Xisl#RT!#7DFGhQbQ-wiOy?u<{|^B$mF#v9_}7g#Th*T_A9~wqeOWJSy(->8>=tPQ0KOJpYD!?;E~7eEYpXd-vd8UvGmqqagzii%R14slR(#{qwd*xvY+K8Z7Sxe6i^}0@}4xlmjb# z1^}#iDAx2m*&N{6hga>O59_CT7yaUI*s_ZkjQ?;90~0$jC;5Fu?bpET`jzqW6dmfmW89a0-WBn3yZ}$tm8Q%C^QflznbBvGk`k4W9F8=J*Vm`x zzgq|k;*m>}Y9_SQXNxkC$0zaZh&`W#wiqkQ_X!$djF1bNISJ+7n~XnY@cJ_{DrI7$ z1=9R0cUP5SIhf+Re|eotxl70M)7#0Rps^k5L*V4|JuW%uv>}z=LDAuYiDW8fV4_bY zO2%03lm16S4CO^45VGnSL7CiINr^*B5$bz#897DU&hxjIi=g65l395sEO!H!9AB#X zdR~^5{rFy_#VB?n=mRqY+!pP2Yl3038rqfXSJ7 zx6-w4Nw>Im^wSb+h71Qo?9mJ>y4hixNjiF^q*^Y$9o9M2tl`G`$xIJ`esvW_zP{YW z8g~5qOA;oJqeEq1;Oi|)BUTZaYh+)rf!;^s-(f6rawjWwq^X?*$`+0T@~421*Msr2{9D6CYI`y@Y*(dlPgkS)SE z1%l_Ko$xYr-hKb=@lO1`zN&$m3O>|FDMN%1AQ|+J4!K34!07De6}Qc?#YgG`5ELFl ztSKIITaRuUxBof)gC!c|wTB>tIEMUtE4$mLV}1Eggyzeh-%@B-mv&+$!Li>wF18LizKQj9r0Q_-y zFFMyaOubWOuj};=yuUCcN*HLmQ=G3}t15&d8r(5?cJp%~@o7>s9Tgs3v-^g}28S|2 z0TBm>koAt_Q)(|408r4gz8rGjDiDUK8QoG^Qd01vT~~zPd0S7fL;L>Q+T*;XcFV04 z?6eo`eaAFlrFSxZcyuIz;(bIBucFJ#6$%k?Cu(@7#$6W$fkuiO@ znItReNDR`4G)~ZtUFnFgW>FCtrnM13sw}IZ?ING8+K{DQuPjpw1cJgs&&u~LgzX?( z(_g=C?2j*p!WHwRccRNhcNgv{| z8=J!nc@`y;V}{PU$&bYir6Osw7%{)Rr<*49`6eyiqd&&cyNJ}_Y^3zF!mm1Y!Ap+0 zrm`p9C;)-?m_MzMrL{czH*+c!l}M@9d3WLTuajH4ki}_8Pg?s zUkht>m6QnBuhZ8K7?VK@yy6xZt4NDes(Q1r@$o8`0-^>LcE(yFpA0F?q&=p0ZaH12qT=!tp!C|r=^l)aI}R@i9Oq~;;q-^4r@6|p zyJ*?Y^8Iq4AUHG;Ks8#M@F14=zrnpo4}3=RUGRtJwb}Dka3e_Rw3EBWPSww0)zMSX zMW<}Bl8aSw!W3Z>mBOVdN@Sm9k71deqSRn0Fc&Hv3>yRe8sQ!|?$8kA0yR;)W?#t_{39n$Dap0TnltmfAWsHPPW zqeX5LEEjFwF`b(JBTdvH1@*DD73Qe^L4r#Bd=jqcv^rv$@3aj>l0vh;_I>@gC?1sq zmuxZ^C*C0yhA(3yn4Oi1Zayl236DKv=H~aF9N9c^cA$qbpkR{NyxFI_&Ub_Jg#L~! zxs{tf9nIlaK^LNpa<0eJ5^Ew@jP)0TF{#-@mIxWzpJ5Y=7Ds=n(7NjQ)y2vZDtoMi z+Rt`Mjl_v;W|uK_s$7&+%z|`88lK?|8kCgg(r&Tg>*V1}OC)rsufC|2;QO4z{VQ}{ z{+7amf_L)r>k$8wRNM_kMUV(nA;UJVGF6iM6;0$tDv+8q$2!jwcU{BYl=a@u)-bCMMhd9 zwG4$noYszT&3>EtP>6%n#=68f{i=O81*u==gR^WTcy;ZUrmt=U*501`_R~^tO|?B> z_qV1$&Bf0-{-wk;i=vSrwA(a~xdlGs^V{*I27e63$(%TE#dyij3aqDrtTPR+%+23` zCZ}9b#ehC0YP6lFZCgj6=i}!c*HdNXP4>M0M8=mN*nbb}L(*#T+Nk;Xt>f;9g*_Z) zr+>YuX6r8qj4zk)QBfR`wMuA@kxeK?+9bhLAyg?nvh<%sDv6KBo|{{sqvyaX2-!J3 zYi&jjH@Rj_EM8uAfC}pUa<1FDB&y5qj4|0bJ=H}cZPMYiRYd|<61G# z{#rj~c$v|8A;vei0*jbN6MVCpdUe;hDwf52>hfG6s*5_G+rY;sk4b67OraEHk2*aW z`x#uqrUEdS`{@5bdNml|*X8+&uv4nk*W%DcNiT0FQ?erhrpF9C)oFZgYQge_#hi>S z!Y7H3OW17#FCRNj^@JP_xrYSk6bIh`bS)e3cR`!lXUe3ZMBJ5_2 zo$Z4%c`L3Pmsaf-c4)K~bx(CO+E0=k)4;R`vZ``xuzmpY)5x1B)qH??xdp}Bba1OY@=U6b1A_W$6U#dwVD8kk&>>aUd7~LY z6e}&Zc%bW$M8|OzU_5rKEYKQQlU6psMo>i>3g*gB98goMqWs`e8f|9`QNv=iuYTS% zYtA?%p%X$8v?H5ZUOu`L)!^eJU`rqhTQ_p@=;UhOE>>(FwT__u=4zsYA&R}gdayAo zQ@pk`7h>Tntn){SP66jQ@7IV+^kKZ*opcL;Wy0s+ zjP=8(yz)^AF~64TGP5GbOaZ^1#-IA~3=GxI`Mj+P(54U0yXkL#Y|GVML>s(x=_O{1 zBhzC`tz-$8@icyoT5VC!=^_NY^hM@X2ivr`(w2EuyV!{+=?46Xce^g}S@-q(h-JJa_^~&=O6Z%}p@~4i_2%5)<`ZENQyH5Wz>8+sd zWU~7nK3?#zdXC%eyW!sxeNlD4DWyKko`F=&t$yJ?xa8Tw&{KD9jTM*2`HD5L4Pv-6 zGDCJw$jhdA?3ONMi8=&>tl+n4X|R^2TD(4;tI>!{a1Y-c2RxF7fU(9N#Jf~;XFSc( z#-=bz!#BiWv1<2EWtBZqU|V-gzF7OPPKo`(Xi0|02_1O$pz8IBp81a}?ref#5ZXUW z+A5mJVNv2b2wD^!S5Nh)?q2bqH?Fx6I;Z0yml&4D=j|L;<<@|@s|;sJ+fy>f!b0u+2ldB!p0CNC z>$o}>{}RNoE%n_BVv-;aKhU^B3-bb}05OUQ{`!kih!Y;gJmgBNM0E?{+)-t%AiFsd(VA9_AlpseZ-^uKrXa?2|VR&T4Rd1j{ zeo9Cx8}J3VFHUZWJI45s_=nd=4(&bgyIp`XKV-jwmVO z{Ag1!kP@{Ssj9lwOak{Gv2%uR+c<%^cQ1Duj4csrT8fm3&5gf!vg-VanG_^#(4tZ% z@_6e=vN!lgde;5QG?*`Dyk+;i3Gt0x9P>CI*yk7PIpF#kJQ^(|+33uzDLE`c;=G-$ zNE;tW)iEbHI9dHrXUb!RFw4AsYT=W|Y^11+`we*@RAvce2|54^rB`BM>^Ma{k*4dP zHJ#S>I%B*K+l)CSqq~xQwx3$zo%8hT)EOLl!X`ZTzyGLyYtm>9d0)t)pnoE#c!kO4 zMdP+$1^IYVt^QwZhIBQyxUwE}SXa7~RLH@{4wjb)&_Y?RK`e+Dm34MczawV7z4MdEZz2 z-@T$h=Tkn7{m*V8(WLgQY&|51>$ty%CeP7P*1&FP^6rr}U2pFP>vGX#WkEk^Zmtqi zUXX&zpO&Q+H6w%Y#k?o#g}_@p&Zqsm_tt}z1=ZtJ4x6(dn5K}s@Y>G#75#6-ikhkj z$y*%qgEH5m;$kXoy+u*Nz5rXTNqg(7D*7b~>&oTXop)(tAkjoZ2fz7qb1B_cmVH}# zyYfMG12Os}#6m)p!@0cJvPN!<9F|c_o&p6^yT*UROADf+^q0DLy|v$#pO6zfaBUU) zlVT=*ZDULh%G6I8Jsfwd>9~Q9*Q#x*R4RTn`4Pm2fB40(sw7IwsXLd)1Z5Lt`*6`U z9QG|Qo3VcHp`rb-flV=fldJm?FJA0YJ;(o#Mq%(+t%MnH9yvDoX-$fh8iz~l!G+_S z*S?wnHf1oxRF3F_62-BGS>+f(cgulZBUc0-f#qSU888j0bZ+TCy04E-z5zV%tm$dhKTm$Ma# z-_n@9Dzb*t^}Z49mK3B&TMWP3fPux79hdqq(osQ*i_0q=V83rnf{e*JydK6Cxwi9d z9&13JmE5wbhUBrXX{V}E3yZCzY{!AHk=ache(J=pC7tH3-2JE|Om`J~o=>MOHTmM{ z*IvOpI|GE!L-KEaXWeC7CE4vI8Xb1lnw9+{ORa%rAVmXXW%r*it~^!~rh`@?AR>zR zlsdC?MiLcS4~``G$~#jhJL#~iD&y4tEcMf*rh^CcqFneREFY)wbICi+k{Bl9v@%wO zqxuCcCX8XxGH$lXCbh%bMD}|hI>!aKgu)T9iAkll?ut;qN7e4u{dHH%@bWqMbqP%r z=tz$)0^y8`lF{rqZ{5MpbEyih&L+iAGT1M;(N2)&+P7E0&YZ&IRY<+U8!vB9AdM@@tFXL6T;qtba?u+ zug`C5T)l{^wG0s^TREtf^c5>6H_e8B;tUOD!v>LC0EV9xM0jSC`)!r>D{0SrA(jR~ z|Elk0z~fr;z$?^=%xKi04S}{#dGOBn=#Q=%3B;{-M_*ZhAw%ip-93ZK$D8a`n-ydV zNm$>(@t*OVV+ybv#<9>nUX2&QWTB2dpT^Y6%HUqzg~s*%v%%?%!vR>%$g^m>Z~3mS zR@hu=<7gzYHvC`}60suDgL(HWZM={#Vb%x_*B@VrO3&Q+_IicNz#YWOKv%4R=Hx`- zg7<|Y+!k3ullpZ8V_d?-rWQ(t8&gp;p$vtRO37V>r>B)jmH>{=I%x47RWLRQqhsZ- zj|0=4FxzNd$66WzoBl~vp=nMCVuxqG)f*LzA}5~a#!HeSkbTM^`Z;qj zFBy6=etp0tYPeb7aQZ}xCqm_Q9bosmYg*RiGYelGPSsO6FBfKoG+nUPzg8ol`6D_m z`r|?cdx}&t)n$t5PSG5h*7C|0bNPjkzQOdglNpeHnQTvMOOfuX$MQ!^g$6}dj39?N zdAIkub!aw@!*Ve3c>tWR_{N;6#J(qiQf}CnZvS`td7TJ}=-7mIFBh(MMdp(Sds24RzRcIxAcUM!hNW>iipRo??iT`5?en=U~yXZ>HcnaEvqL}X*O)#0vk>o+B44DMK*k% zl-{aVcY79KpG}lB&Sb_&Y_qHXkh57?7P4)_D}C^~ zq5b|P*@h@S(eHji@n=Rx&Wt!Y877?--|p2YE<+#kV?*D`Q;luI@`+8`%P%}U&Myf8 z!F4-KrgHE2XTAje-NB>v%7}W-I%9izVD~2;A6fFstF@iPc3YSu1#-@P`y8P%7lxL@ zVLH7Iy|WIQPrd&qJe+%Wvga#g@YK6<6iS)CAGaUxWK)q=R}Jj%l~1O?{=lqqO5!YM zl0TUX_A2m->UNqRJ>%k^61;9MvZ&UNUfFo0=6oLT9I=_42B}ux&ANPj`S|=WbG})i zcP8=hODYPiPR%*6mhMk{r|-%3Q~#x!-}w%-{iDw6Z9zk0+p*;hsiVcQ7upL@E9fHp zsd>93>2$ga_yYhR=lt$}&ozL`Wui8wI*jtPs=&+K=5r{kR~3*Mji1O2V`3O-I=$0}aj zO(^l*SANeIBfd^oSn0M$E>ty_O?6vMcbAbE4*mGuj~|5e8KM*6mZ$HieX*tWJfh`G zw+&C*AVH{D-eHlgu^bwUK9=*X+Fhr%dWslS_uayEm;XM!H;ZC_i3a5sb#2CIz`_nn z+fplE{k0343y2~;&Ty{^F@HKKL!_isl*)c0zXmrR-8VdeKC-86CDoL4WU*&Vv!&6e z)Zcqe@y!}HLG>srPYUMgU^ig7l8_^Rb`^r5s%_x0(AHbWB?~#e4t^JL#fj0LKm0~9 zdEM8zSC&dgm)`cu?z>HvNUOy~L7<_y7 z6@IkhW?j8iqaN12aZs145%iGJ+uDuw#~&KL;nd~bWYJGoBod*=qZJX4MIx4h^u8f$8WOWI%8u!hnK zimTs;TOR!j`i(}q_x2w#t}&IaDP`KYet8eM1#4<dZOWQ-}GpYE;;7sdk} z3oc=6u5ZMr|9c*}VtZ`SixIe>tfHI$*>{561ZB}n-Yu79k zx>3yu@k5!~GUQP0t=h2=6F&+&L`T8g+Ac&xcuX{rJJpd8r-dVEF-aZv;enVa_au$( zkK0bU3@-5#e|Mtd@vlEPIy(^(j#O&pj;`abvWgwtHp$7-CJw*7N|`|D^=b$BO^&nWb101;iQS{lMmiY+jU^&sb^x)5Lrad z2e3!BqpuO55WXN2-GWACbtU$1-t4}7x#TP^yq%7MK}RnMZ3AVI_ceZNVk^bf;fy>N z>S&iD<$;v`IP_#ck?cl;nNt^oF?G1TV;!Lm;u3=fPnluGSo+qXTZMOMJubzD)4zQc zLPC3ck5x*?Amm`s54S`|~a&E2=*50~5|43EmHM&#vsm*{4sC)4jR37vMH`aJQEzrdE1gsHRGfjqD=Y&FU} zz~9hkh=ey!g}3gmb>Ae;nX)p`Eof}}>T|7B2wEwHDRFQcq=>SwAgtnWi;8IR_I zfz-sX#R&HxrFnuyvrB+0dWy)R1cwMY59w|AQD4aP338~4nB#GCQAX*;t z1pf9@u0%s+wIKWPb7x@MaYrF%+*lOMm?Tu$x(uMVReiu^p&Z4bHI^{(v7yP1nI=nS7TIwPbgJfJ9|(~cm$a@bVyFtN_HQ(lSBcp|?U8b^tb6r6@g3X;J!@P6 z#?GEDvd1SboJA7|BJBh+G^P}i*R@R(A7TmV!Je?u_nmOfMOgdnt7xjOLrq;X@?(4U zqu{114u^`S#ujvSw&UM_xeMR_^&gO#or?hhACKsWByu*o{Svuvi@ZT5x&@29+qa>k zrPYXmAz^U)NIP}07k{uc+l^XeXI%qKnc}$E1u|KV?Mj4JnFFEVt$;K!pa#z24 zCs}AKmL7%kPCW@P{P!8GTl<+vo)p#r5xI%aVUjz$UxZTVm{~cVj_{zTDj$1#I)zna z6=W{0^FF~ulQIs0=tSO1_a7hQaB=3ww?D#L5ByJ%&+*fip{BkTha1XJ*TNoH6RL^S zYiQZ=@j88f6ckLIh>XH~EI4f?vd4`<_JpxQ^>HW=pJc;%Kl~;h{mETup-DwsdnaPL zktlnFva^zf+;ektD;jI7@wZ?93_twMACZza039Xyd_`W?dXJW--HF_H#=2c5x&@1m z-+RL?gurfM8juGo1KXvf<`0}uX3@{3aPft)lU8RC@pvH;!Nj0Mnp zJsIarTnU#XOEHo8o~nb`Q(c7pv~==!@(Xl77Vp@L!?dh_{R6QryYwf_pMf#6reVtB zc_I!!nBFn&__q4*52LoULNsB?%k^z&aA_JR#kCXJ*Hu>F-aCJR@7;bE#m!R?PVoH| zq2o}Y=aV2^>+O)}9rosC>{$P$@mygwr$M|4y8H~hE?63yjmM(Db(oUyoN8b%0E0=# z+R!M3O**2rCMhPm35A9@@4H7LwkNp3TyO-8aU0Zt<9!v~9S z)wiz2?rl5a;LAzZtTwl|q08!>f5C3>7#7s&<8>#_gQ|ZvJlf6rK?e<@F;ONNGw&mW zYh8cbK@&139Y<4$6KWO)y8oL$5uay^j>ko_PK9Sl+nA&rv79(@8Cp8qaHy^XJF50$ zd&OQ<+v~jiD)roX?X^mL_1XtweG-M=n9Qdiy9hIuFG0qbyk5`w#<$kswR;{F_qZ)R zjokV9$Q)mQyh-DcSy%vDMyi+y`ts;-j=&i=U4{St?Elcx(%~~!&fxdw=BA>!qy}AN z43rfgCO7-tDGlcCVPvP^cQ8t zv5V%5p}4ZVQVi4+$OW2`k&a3tZ;qcUbSzD+bYI5DdyR*p(;Sm|R3AE|(dRo#$|)94 zmfDzHq3hmTvLt^G@3VE3O}0Wtw+U7&S>=f#68UTQK8o^vhs0%Y=CtFH6ysk|Db5;$ zX_*tma{i1}sBde+mh#=gVn5PAG4-|vO-WEkePy*soa3%$xbq$)Wu;->suiMEoHOVX zQj)x`vo5+WUnPsWY;TcxUb_1Lc73wWc%47mO4oO4em2I=no7i;PqF)4nlPjxd;A!Y zg}?Z`Q}E`4|3g*L5i~Tk_#|=$=W68VrQ%32kvWB%_HNsTXCMA2F1z98u#Fq+RgKUQ z$SZT*^DZp(xw({P4H}z>$X#HIR~bartxi{C7C*2wds^cbIB2FBjuZ|qePUO5AaFt( zPa@dWCu*bhptwmF$6zZ(?N;t0WE+VnqDBExxbh34IH`=DCz2I3b)qJ9*-%%H%-kHZ zGNLhK?o3pzSxerFSXi0JDPGOtiSBjxuC}p3Tjm_Ibx8@+-wvAK1(USM`)pwgQwq`q z3Dxj;=+DqXUb4ir{=0)K4i@9xho2U=)by;0I4Zwyozaqs^p7iCD3%UKCl1$_Vt;Kh zwwCX~k;ZaE2H3UNjTJTc@W0QCC4u&P`Y}i0?C)PIT=K3BozB486-@S(2Z~Waiz`2d z5fu}Kum9oan19L&oP7Odc$}>A#->)JrP+iQyC*mosGTfvZjYKtZuZjBT9NGc$$M`h zJv#@doO>z4kwh5bQqhIb6W&bSR`x`vB=KO-P*;m>UwvUbSK z(jVw_$mT7wYg04&4LYyvg6^P@jMZ!fg z5x%+j5*#~rAqtXnMXX%)AjjsKT73EPTe$1O8z@F!BGy@G@_72UuMDbENAdW}OD9eE zKYH?I@w<*X`y?dgXvu5U6f5tJ7V<_NIZ`b$*yH1(L}{86nw0J8Cm+LxPd`9d5FfFw zb%v3gZt}I#3sMLsDD2<0-I%?KQmWX&Q*!GqTinv(N>)^a_2wY!j>q;;o2CTQPE%Op zx@sFMlc{>?61#=9*|^%nt?r2qQTl`t3qE)3)o>9qC;Tm3px=u0!;AJGL{4s=csgOq zM6I5fj;B*6b8|2GEByJr5xQ7w(X-wAsOZHN2BTrJHBjgZL7DHf=U>PE^;^Z`&2%~S5u9U5ScaP3_f~=t|y*;OWzsmGCm#@zWmrd1LQ%LOMwQ1 z$~$|pT6xen8>&qz90~52Y8SoF+RxGo;SLVMa^rG0eNW)hNIp#q`U#;0ZclA@%YBoXz6G{@s54i`{gD~UOZ21d(t%*!(QKjx49fn2NP`B zpg?}M7DN!_vsVl2OO-UJwckV?}dK!-V+BwGdToU&oS?C8hZbvOyTZ6|u1|LJ474TbN;nDxw>7S5c6*X(UmKfvqFpp&3H$?j0%03bwAdXpe< zR-R)~n#E_Y!udb>HcqDwYozPPF=)6RR?x( z>+Gc|3WKFQT?r*zzwKEL=j_;cvr%Wf*EsWX=-nL?sad9+1`dw;nYJOoII!W zV+PvSwzZ=TE^!@)*EOsnx*s99#@afO8O}(KO~TSKb1+nxojb*Ny!C_6yk8_@z3`{s z!O7pc!fSPP(GlEz#doo9!&YOR;bj*gKhBubmdT6f3wJ!Ds=Cq3IN}7jxVUK4kyY** zkD_Ru5RCEoK8~Be@$3`$--Gw`ZM+kSxe=YnX&B$qA`b&TdGAdljYTAr#b`HY*8mca zP;l$zq7)Xfu@7X4`AER)2x2ne37$N31yRMoZ8uFG+vSYOqZ?1R`q+gF7z$=VL4_Cj z4O{3s_@0vzv);mW%=ocJ?L7a?{d@K!D?7_;P>Lf`pEzwYo!eGJSjS9Z3MIsAP4x&} zDE%Pi{!R) z0bPFDYaM!=H5iyZk|ad~-B~jbBZx=waJNG=NeLF3Rnv*#OywQjyV9vze4H_D_Dn;r zldqkMBc+(XWKoYy=Vi-}7RS(Gb$8RUgsQ%%H)LU$I{J6tcMfowYMjl6nE1h!JPrjs zvElo)!*c@a<)u>)6W6!j!*$*3UVT?Qj*p7PF@*~-lwf(AFR39!CVFwXM+D zW~{HQs6_GMVr1v#^!ThvGp4}836*>td2&XdtMK5K5Z`b4a~6Sdvg|5bLH#6TP2tZm zAWc;!&0Bz*{(di<^qYTu$pxsZti(V=C=9X{&B=%&Bo*l3s^WjaLv$SchP}GoLNN(_ zv&h#zy&8>`HR9e{IbjK6t%Fw`;|shWDRD_S(pVu>2pekZkWR60Us!tnX`;*7{ny=! znj>Xm9UsxXpKZWz&$$aa^UyHHsGc+(f#{ z0;0aAn%p(-dfnd6ZYSSCCpetrS}+N24AE80WduMg{pt-O&dG{uJZSMn$QjM5+DCUb z#d?MKj8>dtBBJIbl*F`TZNkH)Ryt9z6sg(|bvdUVZya1QcO8TN?5~ps5Z`$PuJW<8 ztPJFjHIh(Ka`*`16BCfGXRv!Bjx2>m$1K68AASO7Y^*q*X3jfc%P*8Z(rm%7-arWP zZmuim0XEq45>&rz!rT=rL`f1){0e8zLf!lCVIbl1R2kPk?WDzI7KvA$`|CQR4t;Xn z>%HP(k@N2{_rW8@;xQjTvsyfkvP5A)?sN<__*f+CN^<&dHn z-hMaMzy7|LTEcCfav#cQxgb&CX zkBW&kZe}JWXSWROt}suA+B-XfB384WconYG;dELA)&y zDQT%>RptsJV<;ZSLk(eu<1|771DgQH$Dx%x0Il?!x*UD~E`EP|hyUb2c4PB-nmT=| zAp*nLws9-wE|_mTS5?)^cvwU(ckWB>3Z3v`X$>vu%@rqCy7U3GKc68cn!z0>YjiZG zEL;d%Dwh=n{yvKxiH1s6C&yDtq%HoyC^ zsM%)B%$kU_xbQXz=`Ygawf$hbxB5^?z-{>uahJ1i{P{LqdixKMn3<-Xc~uLMx3Lkx z6a7wYQQNyX(^dS9iH^akmtKUF)=irx%7U8KM{}^i@dkm%9x0AbH)FXNP zhaL<6Te@Q>{(ar`cTI`l#V$&2kaF==mm2F7vN{wNZE4jk z`0-OFAUQo1wGE9T|A9jp=9YG$oTv8lICy2QGm)A4cYgSHTY9z1RUCKz1vvLRH)GS9 z5Ae`We;n{LtsWkw#N<>AB!cyN^%Wu^(ZeE-OG*s>&9qN%|LY0uAuY#`Uy4XUyj4#M zqaCZS@Grn36590bcscIEvoQO(Wq9T9521M1UMxB7MC5U)CG!p~93xlszo5ybN{?qR zT8jOfHsX^HKSx<Ygyz1AcPX-^fzeLXWGT`7hph?kS_yEa09%$0qP3QbA^+iOwB8k7wZ; zZOHHHqVb}YLSn@#4sKP@*5ni}{kQMA7dexsV97-nVSpgqc&9y>jGH(Co4#0& zF?4gb==JQ}1*ic+KD2Pnmo;2##2^OidKrn<&7;c)^Q(eB_$qCm#2lkbLsM<@%nSGkb7N^ zlX5-=x$66^DyUCR#1Z5Hw4W0#S8Ul5NNh+kVd1J%#IdtC)Cc}R+9t}Qqm|V(GeFB~Wr zyO(R-ce0z*S@#V(A)mba7IMcFdfo7P-+zf@E{pV_B!V*xGWG;h!$yY8VBs|%$qn#Y_sLVHRuhVMBdsqa3!(YHPCns&sGS}z z^-ibOe}LWRJmIAYEKg$9mNvwhqj2U$mm@DPRov@L=B^Hm>`G5ej6+pb1Dcy#jbST2 z!v>RXIJDB|@gy^bWnSs|hi|@0-qmfWt*kJLh)=x2jQ@Mzil01g#R*rMF=>HocJYe~^NrHS~G zIlS5Y3_iv#LJy|tipzTJ&`CKMk)3eB)X^m@5Z=2vECOScovGNfeHW(Bnc-ar8%;#c z9*1~0;oHbHJNKvs;QNVEs0*SM=1m$a!gCjIx`yAhYDx1FXjYs?Ie z<%iIKCR#Nn1rGi#1D81Nt|N!P7`dz?_W=d#K6)REm!E(Gdv_UYIdQ8uVq!}#*w`Ce z;cXqAeI^#Z8BF@@lrJPlZ0PZEwxWBR5O9K<%ZiJp@0>hsD(Y)%VM|Fua%wUhu6@#D z#zK{B09BI&In%LoS1Y6?_);^yxXQnZpS5;Kv@S($) zyImH`4Rq~hWGNIV-99@hD)-kFfZ-4hoO6q(Dv>{O4Z`wotQdnCX&;Vh?J_3nVl&HVi6i} zs_xVglPeN6@K9AP`AqAb?q0Mww%7uL4Oh3bag)Z2$&L%#H*ZH~RwmLt26?TFPn-0Z z;$ua;+=WTgCSmM^aU!JQlHX-TKc&A}=lW-x!gT+0Qy5=%O7_c6;u^HK=DI5ph_zAi)@ z+#$R_YNyI-NqUBQ2b}D|<9v@+_rm0@Qs{^YT@_^Bh9!%R!{Wt9lLc%Q7Wol!v$qoI zbCacfy*#a$*0s^Zfae>jsfmWmyP>fa3GuGV0Yxt**2bl}$`Hl`dh5r}x{pKFz#c#Q4U?Qu~m<&wu{FdqTOVBXJ;Q> z@ZKGNpLOKeQdnf-PN4MjsI(3)2p6I3}wyExMOU?50(nQi4Tjt!uoTXc1^p0jc zsi<$T)5JMR^IjSrB(l(p```4cc&`)N*6N-|x?h)Ecp(NFeAh}pH(ag&tEGo~4F($bPrl$DfV)`D(U7iYzLR34a<+$Co0 zKAgR94ib~xY5b*t3W5*hg%MTWzvpw`C zF<$#3+Q|-l(--gKsfi>71nt*HPp&qeE-aW8a6&y)aCjt_nnlRWBd1%e)}K37cP+he zue&nT9YTmm#KoD!b+w6Zgx9;CR^n$G?G;wP2*%#wD-Mw|1KpG&eNp-$DaWW`I~Rjmi_} zxFzOul@9)y@uV*kVk6xov3V(KvH4Unkn0nR^>^T%jy6 zn^*K2afg`Xt3p}Qq5b7H$9%l_FIU6ttAqK=N|-9_!lkaZ=oWjswoQI!7A8%YB)%e+ zEbjQ&Xw=j;qP(JBl%#UKd6F#_W#u)(eIBE$zwusI*RZs!&1*O9^*~)k->-?vBPuq& z>ym{bZ`pO%!5TB*GP(hXT-K2HKt<^h*zHZo%F8FWdbyjF6g47a@B6q+XwLGL`p&5++OZAcgy>r^!0Lbk-BjH;ZzLl>a4mSzmYt|9(v;FtW0R0; z%S0ri!{NUFExnbLin1C-#QU}64@C>-uucMtI_Zyv7m%N~()hBY4yFT5;x#onh9k zs@(m8$s8FjFF_C<`w=RUi{!Mxzss{R3pWjzIAwx(TvJ&kcEy&gSsmiO^%%(1$nNty zU@+@--s}?R&Soxf$yr@Z4Hhn2+~Yk;OwYlQt#os;+bWNaiN>>ciWjMxMpze)UXRaa8c7QX#Op9SuQ#-vSTEGjd| z`zOLkbj_>u*ZgS-%w^4R7TVxADqA!%vFvDs>0mQ`8Euyw2bC*x;-WBl_6!<-CW}c^ zRaK)9fk`4V?;`hod1W0L7cGd7i$OGfZd`nfNRShIM#fJa#mZSE#(?V2B3H5Yc?X{O zZ5L`wygBcc8&_QO4GN#6V}K!KTK$ivGTE&MHhr-cQ)X&zzS5$D#(HOj zxQSUQ%_iuIlAU?%IrGgf{y5qWZ|TfUTEv9fk`AIMlF zNa`1n$XpNO{M1tzsj0pWO?9>6ap8&hutKT{1?HwxZB>MEdH&TsTf4(oRo+5+4nP$lRKkfV01L ziMVd;E$t$KIDyDKP0v)Xs%;P*(p3-meI~`d2 zoCDAP$>9#K(t}t3(Pbn|rWcIC@z-CE!Gg?M?*sPl-bn+nCZ)-4b^{R-A2+pn)DN>8 zDnyH%-R8~!^)Vz6(3VKL5+ip9q* zF%CgPT|G9f--uObozmkyB8S$GRzAndEopA6++wlftV_=I7LuWJ)R($)5%O?-fFt}a zXP16GXAE!u^b@g;uao1>JHN-a>AAU>u~gR-C#z}gOD`fE7|gi13!X&I-#T{2q=4IZ zc6Q*i<#e|LJ zS~DpW#ko5*war4pmG>%)_jW^`eC1UXbJZp>tl6;T~*l|SWOz7km=f|cPCh-_!8@A&4z2{u}b);mai?X-+dM)*wmEAH@lW0>b z>gtHhs~W^U*%GxfNKJ!Xx5}e5#lhMmS~C<+?D|Yk*rnfe%(;ADI>kNw;@>$*Pun(g z`~)n!^b()PiYuKODk@OEcMpoUZo#1~Tj=p#*z4*L3V2V(`g}$9BKN|9-Mf&M#mOlu zxdiLI?ha=JByO?JxtIR3;>srJ|82}M(m=6nv&Z06FriR$tAk^ic67A0i&|kLe%@Uf zZj`y!Ib&IIXzg8R%w@qG-33mgz`L)%jpI%{-m8tN@xJK5-X2a6vXG0ttE5H@Ogv#a zrgFoPR!!it>t`V~yJrQ0AaOvq zR*BTj{9M2PUGfO7fAuiBnCNr-ywjw~sB$j>CVj4a;UCVVZ?S4|^(d3*C&5W?yiHbU2hC3! ztNAx+`*>)VibFfJ$9#*7nW=5}*(**Q*zDAPC#^c|2j7QT_hdFzS7YB7pJVT*pJLnl z@1volR4bqCej0=~BOB9JuEf!oU5;^!7WKsrOYuKS$c8CiIJjpQ^2Ur4kDD4Byk8t@ zaTAZOV+KN1PIKyRBR^M@aI1S{t52Ce#n_ZPcQLFU-Ltq?@Mw0eTgbg_QndkX_JTQ@ zpPfe)5BB@vG5CN9_(gURHXQ!$IaW6M{YTpmrB?JaQ7 zU>213NLXJv>P&K`w0KyOVl}t2uggQ9 zH!FxX>XJk+ZF>itT#wC`Y8WCX4%J~0ISc#PGShtiAVv4RYv)welHH)m0mGuRHjy`82K6&wVq2R`~;yfPl zTa#_^B3!{@FzjyU1i0qr7O{VgOXkE%UyxnOy6=xo6rjQU|Zv@`> zm%}ika;8kh{4>tP*03~wA2eSXC$O1i$*y9 zAdbFJL)A&!tmS#QV&)=5#Kat>XR$N!vX_CqQo@Z+F7!Cft**qzK#j2qj}^P*)hLsQ zwX=0D$eh-ld&><-&&?JWT5VkuIVjxcpQTwd(rx0JuqDMA)j8~5Pf1OHHQFr5+0aa< zKO5e08o2=TPS6^`y!&VuYD(PK=Gb|2amO*o;Qq@m$Htdm79?&6)$q@!aXE&*J2}OM z^z;;3l95Og3$Lmt?g;q$>-fKuPsUdwFQoVDmXEq`zl}qdpSi$pm)e?YWaMaZtvU~_ zXQ!(catPsShv|h7iBimb1I5SN-PSmh6SpmOp;ad>t4B>~lyI$krD0*Tz)bEslT*8$ z*{$wsS$g>3A?(_|13&xiuY6`Ov)kMh9bBtd6Af_Y)I>P-tlT6TC{~<&0^WRKwa0$6 z!qE{6XD^C>M$8?Wu*^XF=01GkS(F_*h;wfE7N#s%B$9+WDKzup^H1Zw$Nx*N_WC}5 zCQl4Hi9EX^AVjEi%e2oNSJ3PI+1jX2x@fbMSeqaNOHMLb;(=B0f(9L9GZ7eQaW=KV zS>3EPCFvs$)EqV*rw5#z@K07nCp0E=#i_ZWHII==%WCIi;?(7!S<}_TYLL*ZcUOX( zi;PWL);omd?s{wz>xCsxf8&yEIPXU{;$PptO_ZQDkQX8)CBZoKY^C#}&=+uRxr4T0 za&B$uAj2aXO&u*L-Nz(tqH9pWo^_g#jU`IOw52B0l&X09VW&q(Q^glgJO#}I;VS)5 zFeWb>smVzcdnb>DErE7Z^FXjyAeP307+ScoOKEu}_8%-pc}0!*M2?$3^6i`8B%^B4 z1s5Pd>)Jy9L@txv3^bD~y@AL(IYoL}bkgFKtnrKCoo%vWD61W{EyJG#pQ_XGC zl*#0_a+5=+?sAXvAfZ@JUNK6XN0T+q`3o(^6lUr2quti{dmmxW{JF@?^{u(BB*vmI zFlQveN$x^dw)x6aR$|AdtvGa`NE#=9BMMDdTF_$jiWk= zYl(51iydaCi0vz)=?Z^}Q-4i&yPI?}=dh7c-lm|wvKo*6?01Ieu!Sav7P|?yZY7>h zr-R5e3if6#Y0uu$COn8ujdqHQYasx8y;IB~c>fD$(r2V8c<={Z`e(b2la>R(R(DEj z5+;tz7YcIr<|f$5i`&xXKz(D+Nhyv2(Y|#_8>T0TBj1p$kkP?%bE>6XV%P`b2jFWRzKW;M4 zW_R}$2gXet@AZ0Tr^_ODlY4Yjw-TyR!sXl>oV^$Pb2D->QK%oQDw=(NvG#KubHZ^x z4+RgTJizt^?25GHxn1mR`Csyl%VD8OmNAE-*}b``mxd~e+ae!`60|_z3G4JdU^SN(r(kybeRO87NKTss@xnCw* zEUc5VpkyR?NdgB#aYLEmZXP>(YEbWS>B7Jua3*#L(pL01x1ukatKFg{eX<)p#v;N^ zqTW18%Xa5&6dtSeayFB0sarX-UH2-Q^!B_BjV+>iiuX@f5EmP*sm9XM)Z9uT9!=!S zEQT-@*@X&D|E3x9PBh`7pO|rQi;B%3bQ9pBNkndT297;?KBi2}M_pqb%F4^p*lZW# zL;lc86V~F=Qf%G66V)}fm^@)Dj$gh+cnf%c9Q67_*IiGOi3Y!)A&EQ)*qa-Xoa#>E zXlv0DBN(cytYV1ZsjL=OIGuif7t4%#UceKkPV|1O-pbHyb`L&jNeO@&L8I#+f!*1z zSm)6zj}w{c{P_Jh-xDQhlc!Jd^G-!8zv&}Pwm7l4kW-M0<4-%m<5Owev$q7)Q5T{x zuFrE0E|DAiK-UVBG-sJJNxPPIy$!JIIlsdAEMw7=`W)V^*0N?cc0amsGM>`XS%t3io z1**xT)YtK@i^ACl4jn>CX&KT|lCXHuY~xs!@7j%b@4wIQd;M#zOV_#qds7p|f!(6| zT^=3AhT2VR>KFh`d{qr-(U{uZu{13{KE~^Hhit+M@^y|`QluXtkD$1 zUa(Y?WUZ^N!IvL@iWAN_+3#CfU)>bbp8=c(;+#}1o(PS&PdWQE@|uiuZ$ammUF`m9 z#D!~JKSkU$M~NVk3|E)H!Gb25b42ht?o)32_l{fUEn1WeTMF^*V(5-Xb zLf2y6ir!E~BXmuZogQ2Dq&L==(o56~5;tp>y@(7cnxi~_@_0;LriC)fE2^-J2$uz4 zxE!&*vBj&!Zmfp~tf|SzHBZOj&4-+L<=!sWUSr|>=}1b96P9#W7!$E^C~z{N&@s-)f4Dulx9OoO#iC0c%P{MsXJvPDHT}1}e6J?*LeD48n~Cs1BXlNq#pL077laKx z!A&D|*E($*kI8`Nc*M<#PF^k^9x161Mn_&=nuv+Fw6vqLssXKf%sk2?4}t5)J%=5B z`0jt5Sbd*XGtQHiX;a5hyxmT2^csX4JaIaFP4%?@X_{R%=~@PuICi%}tb`aVTj3q*_MwFSu{4iKGbVT(AKzPZNPkhm^y7}gz`#w=T7sNY5WM!-B{UQG+MKy^smN&OoQrKc zcf&&Q@Ei(1vHm)vL%&a19LB7VT`bSq+N9rqM5>$Kb>fA;Xa)>-ty_7_d>YT3Xzv)f zNmjGnj@r6qapw8%YOo@%!~z)DCKx$3v1PK)=s0;mec zj2q*12t;Cu-h;fuW1_)>Q(wFnLOWh>{iqDXFps6hT{?B#3CqP`PR#gSk+m$I+U=0&J4_z2?kI}Y z=1nf_^*t=J>+)u?WyT74kpNRdw6M&TSSt=UR~YwqTzotxESQBzMSPMCNm-hXzg=(Z zYbI+xfy?gb-tZKPiPp!_mPQrzRoVo%g61nv-PI+058V26!Q81hQd%OaDh3+W6mw5a zu?e-gKqI;&@*u#jVl9D79}qnlDXfV%efcPsQ1yuKIHSA8RMij?E>wr#&S^~KuCL)X zobd_W1S;s*M5Sm6GKxn_K+Xs?^+C$k+~zTO4YS_mJn?Wflu4wUaNgqi;+Q@E#4}iN z;!0%ZWCeV`DLEl*VN?+>FG%-ri2_%B>l&nHxf_(Q)UKt`+w0+-kf>N4{!{K3((=jx=tUN^tJZa%;;tpvRyT|0In@4~x zOJDJH3IFiyMZhSWJte63F}0-Vn&o^JN~%f_NoenE!@lDEMp@Rf^G-!1gFREZlg5jC ztFv3#rBI8d*P~;!@hLV|H$I5j?e&_#X=9z1p+0V6ChX*ya_W^6jxH_}>_U56r--w= z7M?7yQdng$vq#3D)ia4JOje4eu~}F>7Mg(t1JO;( zwF@pORnNgU6pNfMd0(BlxRl02ASBO684Wl2NYHh|xyP^QDGZ3rOV7IUKw$0o?z=Ob zVAYe{IKFwpX(x#p^-E7ak8>_Q56S5%0pH6~tERAve<-5esiG&)@#L$pa12iU+68bL z76@yxHyX`%x;Iy0Yeq|Yi(tzu!eHtaAD^^nZm{n}_M~xeUHFxCm678Oq1`x8dO+JJ zKqTc&SvDV$j)WAA2)k?cyXwF>ZXQh@!~~l3YGEw}_GXnx-0jP9c5;|QBWZ4`!pdu$ z{m!4M3e`Dn;c<`UURf5Fw`sAri}&!7K*8L?t=@BbQ*L>>g9V`FtSHw|%dZr7(0 zt{Y5O9^#}TQxKi!%=&C!xP^2g_Z)mV^Ss~nzdQ->FT zfvs_#Kc)2E?W{i#iEVl5;{1r`Jjpn2DULezBsf@a8j6wpCicZgVxqadeOR4~p@ayp zc!a*JG@+ffa%qrnrfX-$6eEeWr~u_a8o%_Q=%XGHpk4ZE+gFAd%B&NXQurttkq*vJ zV0eZ?oq}||?>3R#se2CFTU0#vCkJXvA#~E)S{-DOw+oW)Ye<#fqmh5#oA+=+U2Jp= z0*wm+noUcNcOfM;on~h&nW!B|TZ)HO#R*wq7~EWPsNzCu55m2!tEUN0jEce;6nmXE zWwPb!)^sLCI{>c)*WMJPBAR7 z>iTNbHPs;!P~TLK&$fS|?HOIp3q4c=BO1Dg(UU{jVrDD3do_(k=e{prRj~P8r$~rP zO-@8zT{97JXqpNdp?7HB%AlYI)%njaTdPTlkkF8nmWr0Ce(S^qIZp)(#^X zFf%V3(`V1Z>StcWf+Y(vZo;@;-_Kgt1MMT@(-I zi4k-f5gG*^^~2@}IL^ZXCeLI|I(UmtJ05*O&V(_DNz^8FEZMr_z)nO0)_nDWX1vhj zjDkGOJ?S_M2Xq+~KJLNCrGFk}^`5j^bPs3s5$*NFggDw(72WjW;zHBL5PP6LPnsZHr8#5ry|R8R~t>bZo2kL#L~p9gWaS&Pah=y@g;n5q0uW^UxP?KFO3N?)Pljw;4m4EJ7D(dwVO^?O3NhrDf*w z#a@k(A{q9^CcUcCWVp6F^hr0DlrcnX+u_#GaNUV<X6tlVK8rrGKm3BuLzS0p#eh>h2b@nI;6Dmx;;V2D7kU`=ivQidKRy zB&ViyE5qYY`1EkJojZ1IEYOwZ;V=+n9tNg!iO`MPf`I z6DUozWa!-MqRSagCin>1Qj;-l<_x^}zh`jX*De&ts@L~(O>1m41`DQ`7+4FljFzR@ z2MIayZc4c`G||vGU~yKa8l_l5KQgf?N{@sPejh7Li7nl{&QCy zXWYL#_wN*L?I8o*>mP3TNObgKScn@=y7p2G3(!HVI;3U(i!NyTxWyUgJkD6jh~ggP zBHO&J(~DfW*-96UqfFGX9_6&6LmiFLHMLDBtEi==PN>Ay)HI5viXNAh*P^1b9`y}& zLF~RLJD8Yx0*#xEO-+ck`ORFf_wUH#7HY`@7_S>vVBwRA*t2bmc$P#lbBjm3%hVMf zjoq$T5BGYYW++aN_IY$srs%Qi6dH`ZghVkMz_Mb)W&0yVe0JgO5~DogRgTI1M<9kW-ecX{(#>Xr`MBnvfIa-)?%ov^4f+v zy!+*Q#`DGJor;v4ObidGDA}VKVVc`qJBH0{*wD4^)LZ4c;F-%39c_V~2tJPP71soS z+n`o3X%mUJ(U`-T>i+Iro&ebCd#b7%P+Qj|;__a5M(^$F4D8WmA}=Ye>c2#*k{0>d zh=T)_;^GA;Ido7wV-hc%9f{z_wN<~Q>XDTvztHx_X+j~6L%`2*pjOon&zhUF;Va+JDa_5uGU}J z^_oXGz+!J9uZ1Qws_OlW#rh%A1m`dZdlDGtC=23g@ZGs}JI=h|?BL!{lOR)4Jca_C zplF?x!xy!9K8?aOx8HITrcM}dB)pCvQ-Gg-|0YbCIZb0M+Oy35^eq4+sl-dtbKmO7I$FAhDl$^URgN+Nk9Q&SRq@>-x+xrIx1>Als}wFrd3sWnXG=HS)1Ml$9cwTxWr`{)E} zWHWh&TQiwmx{4$8IJrtOOJ}r)d);4WGpDQi5u)_Nl^x3$%*3gaJw8zN&gRz7Wv?0D zd{H|CB%IO9d1LauUhgg2+ME(6diLr&=5rgKyok6z{j=({RY**B$AnxecKp{Q`oU{B z`sCwbjnzI^xYq|ed!2TcCl;+gO;E6wzg-JY_ylP1_Ax}<;CogF{va(W;o0W_VdOemsT4Gpr2tgT7 z1iEvRX$(AgxKwNt6Tr33cWx0ag}z=DjT2H5p;QlHY$igGo|P?b(4AX0V&?osm^gi= z5i{f%u9@6vU5TM}tYSE#qD7*Nrf=N}XR;46@F3MO1^Mn+CXqqGxUt55F<3apRc>Uc zwe?bys`{|V6|dgCCZwjjB|gQL(Sdtsv&ET`smW7vtlWJ&xIe_K-)z}L8u>I(%$qX< zYv1|M_#Gm_t*${Uks_o~EcdMQ&JgaYPv3c8kSfQ{I|k8{#FIFStLHd{Mv99LWASmz zFn!kaUf(O~?rHXKPL315jc@Y0%4+QVYy%E%-Hn>EN>m>yM^jCm7>Ha0fa}N^=a^jM zNf~KK$<9DhW-1D⪻O4x(-)CWpzQi29jLmg*q`!ojr}h zH_524sn@P~n!t3~A|(9g%A?@x)OGFBb*lAN_w4~12(W05=alT23r<5Q;B&g*w3S%5 z`d#t4Z+-SQrjMJB$zy|4i3=6g4K;Y;%_oiDlv0p`vv0W;!wFm7|J1l=*j3K=T~l+L zkc{RoXuit36x}-NqU%Yx*Xg{r>&k|Fzoio|Mw8LS7CXzjcAtoAig9M~x`hn1XqqG^ zbg+`5lVb92{AdxZ<&(5V&o#56XI^L(d2?N(%Xo5IC;cOH$#-gHCTEQv}eYe33+p- z3hQp>^r`s#@L{i}1Fo1WzjNLqEn9cSoLN}=_J`tQI1j->$HlB$+`QfSmt7>n31^;r z8n&<7fJU-fxpa>gXD<_raKSTEy`3Aq(78JK?9+k@cXI+@Ym998KQH>adQ_L03sN zoOR9O`0w7a8xy8Y7M=mlo;~68lkwbRPa8>ZUF>D)Lsz?SLWn2n=UX({@i8FtB$o{m zj`2GwjKGsxH4F`DeC`ij!)DLi0Xi;o`sr48f2e}9e{daktzAdgMuRx+554?v+4#LL%kQ!`CK={zMQ z#)_D^FCuTzHQ8AlhOO+f3T>R{yC)+pNtCQ{+f$3RcaJqE2D*v9TcwXhG0NS#BQ`b` z2M(2!YhO>E44^~7L>`!>dB)9dh7PH-Jb%eCc=3P#!G%}fAQB>GELeok-hW54hFLO| zGZRD1^ym1olZaST(NcxG*cs!U&FpC{$3%O-W~Ga3?D(1|@*YZDga`Ra`|Vu__=JM)-@SaI>0 z7(Y9(w}9nbyXu><=;)&`XW?A05~I0`7hv_%FQJ34PZs*&dRWnNb#N?R2KNy#Q>>Ve zy{VUc50L~(F-Q{)-W22&!b_dBzmE9ulM#F6Ji+ZV({i&AD$;VZaoV@9#4~r^Bc3#|~7x(t$zouKn2i9Wf<+4F?RtTz4y=9zk55yqG#gRlTH^z z&R|y~i;{F&Lw7ZH(FG@n9NOT}oydjqmi7Qv45^O?ij{I!rzca z`*i+g7a~2grXsxM=y{-=R5P85*l9QL=ppoSetetroVe$&Phzd?*%nxu5>cuVK#e zrDSm^=spEtt#^gVo4h$u-8>tK2?;pvMr#HocmGj=-e zs^@B-ejv~1swR;nuI;FXMmTBm)JfhfXBbOtJB(%_eOK89gn{HD7Nk2W~?rpJ00i$|9eE0=T zoSou)Fp)PmwQ9+0F;OCJ?JJ+SOUPSmkF7LDaE^-W`ij!6>!?2VLlDLYH)V-4YX(s- z_X~^9?B07=>^p-MGf%qV27j9u1+_N{#oZu@9Px=Z%wKve*1Y+uAo9YAlQCw(L=^AW zG9o#q&8|i@L{}rbg++!rokTNP)D9LG@EmYdce#USe8rrW07q35mM%XUuRimVVePWW zN|$gcdT6n;i(3CoCN&-)*}C$yaJ&XY#XTUpUg2__i*JCDa|H-=_X`jdOB)S2=@ty05+nl08tckW)~>m++B$YntQm95a&i$Ipcl0@yFlwOX6L0{6Bnm z4c=S*Hd=L8yeIL9=X7jxrcT40Q%^F0JzzYq0;{qkq7+ zFT4@C>A9hCxjvDvs;k2N&;J7z)#b)Dnm#rk-@5;|MvwGi0X^sB{r^6vC5n+H%}Y^H zt#~a>7hmF7IFqWXx=VUB8CGrT$Fc1;kNcpDu0yuQdn00gH#bY+SUfjc>F98X+$4^h zb90s$a`PwI;(SgBSXic{q=x=#VMI0+PQ3nlj9a+S@AtWq-2#KrfmcHWg z$mCg~Ws9d(X2ewjDwIXsA3w2F0Qz^huTi?pRSX_tC4gb2MmM!i<;x6~u`cJ>YE6==W zcooEJu6?HCS1@ZPmR@ox=AC&4Y#Es$_jP7j&uPn7h~?BD`~Y>u#n|xbYJB?SlPKG@ z+u$-m=z9+0{_ov^sf*|0vR{4&>ABf3CTW~yTj%?J=OnmU3+7^$-#*b_DDxJ5YOvU7x|$E5gobDnv_lCxJKIxf7En>d>dHxQxz^~#%t_lv))uAv5ZJ#rULU3LnNUvvVZ ztg%|xSq!o=ZSs)G33)7CB+etu_yr4b?k|6V060wCqux#rZbNUV zr~!5tK?3;sjaT8QV~@w#mtHAiC;#`;?-^D(pUC#Cba!jfeu6D#(F}w>kJX1dlgSOJ zCz(Xm)*BL#=U#q+=yA=kPNaA=&Gxz~8?fQE5Ag6k|I+f-Xn^H?;t7J#C%0=g>ZZC27ApvsxmY;|)+ zaa4Viv5(?7Ln|EXq=_oWdfD}At!)q_t+<9}`oDw7%jt?0)8sw6vRZgAV#yNy+5g=} z@o}5ij+d8~t117MX45+}>qoyewQ z`q7JU$xm<8CmwzIFcmc=6?pXazhduKTRc2UD&1d6T8N+@U=_ybTK7cFLT=FCy#ExE z^q%73hMhbUfB(jhP`quov5wC{QeqNLU3w~xnz4vn$9yh)pFP91OMg4MI`GkkkFe&e zHK=W@_4>Rqv!~+Q|NQ;%BXI`Zo4-BxIvm-#Pk8ona#K-OT8k(ma1JYNUHzuV#;Oo% z;rKP@{ghYKi98m6V2e6$X%fsOQQn0&^tgiF+t}3VBW$L+%o!uh<9dxxMRrz-P?0Mw ztD!N^Jz>ovA^YZ4NM~CHDPHGGQ2@?L5me{z4#Q4 zU3EIe5ThxMn~JYK`B1ZT_^i+%=nPd{pIz%*Gp!2`SlYDYHz&Dq*`@2UPNvPCj=~A! zG^-%pCTdPi-g@yFCOvUb^wZYE5{~$I zk$b>d{rq+8op4b6mou^XSR4B8!m`#913By2M#pIuxlOAM6^q}w^0bpMbDpLtpjqJx zK79KFJpRBVs4lN`lLcG<^nE9N=O$eH;DcCn?zu=zAK0v8uj4}hu{UMWx#wZls*_M# zT8hep2Vi(hXa~2gU565KyH8m>M_7~2db^(vdgRWwCE>`yVpNq^=(!kObdAM@=HBhT z&otIp*%H^g?wQFubiog=!-YTkCgN?0Ui%YVj9x(;c`TNkc7n*rKDc?OzLx%@YeXg2 zvD%NWk6iMoINZGt7N5Hci_cnxfdXfZ&p&wu99^9_uxW?kVc~X{9M}GM)5q9XO!rw^ zt2S{oS%k2N&?9JRLS=0w*6sKbZ+-qYo__ZkY}>mPt?gQT-$g9TFFO}k|M3@yPY%($ zI7Ha=&c}HFvFF8cNlK1G16|7;`#$5QtB^e=4+qz6^w?Sv-bJ>wxlY{P>`q!VCOvF0 z>!i&c%-W~4BKC(gb|liZS#E)&Ma7XL)o5vH(~SdqpG85;A_d8pn_;`agoHCFM!v{I zo<;Jw9-%E9?%Rc}_(t-Mif|Rj{K#fVoSA@?_g{#T_)oCC;aNJ5u}F>bIR-w)7Wq~5 z;9&%VL#0p;m4)+O9hTrh;P&rbPgeO#oO{{T;%waayW6mR{g>i(Vd0S#7>c`&!HH)a z&vgmDIBAe!%Q~vIk;u4BTrB5Zei2#ZE5+;9>0^Yu7W!U%^un8X^3Hq2`Re3)WnIL> z(-Pq%s+HgTCQkU~^+e_g#!PV_abVp#y#Cj}VCTEgaRGZNF^sLL9Sj9%`#=anJAW771xTzVl~>hI}JUP@eto)7Y|ZlUM!#4-yN`I}aEC z?zeQjlYvOMgJ{Qgt^El9`{9pJO@!`w-jj1Paot_Fq97w1&MN=8um|@Z5IG5|p77U| zOjdcg+{v5|L7owdkm99SWnvs|`13C?g%$riHd14VXi^I4x{rd|L7{;9gET2?NAGF= zDqg<-F}(Tjr;RNg~hmbpI90nc=_I|MePyOa^ zB241TOL_C|_)~usGZq{V{ z;MoVT^SzJp_Fw<$^Sy_OjNA3nGZ9-SB2K-*gsAZpMkKOseA0=A$LV^fVW;qQV)s~{ z1S)90*MzE<+YCE9<|q@=e`d;2aRVNfN%cfIZT{=boYGq+Dw>%ApIIkrD*!CcrW zetV?oFtj70ea0yloQY{Ory?aOiHIOdv(D*Uaj6NnTa6(%YsR<&+GaYI9K9H)Q{4UZ z6INjSn0(!L@9mzcwG1If8)d(ZXip_zq@nL zp>Pt@SS&j4Tyczfa^*rRO=LE&`2y($Imk>&@p)bFBr0WGJ`U{PkLnWLD(B`B@u6!e zFxY!y5oLK~)zC4%^0r$r^BC{aC)Gl6&W!0q;uc{>D*QYq2}*M%dOgnUxgoMD+O`YT zN3=v?U*-Klwncwfj`k6&p*>z69(?{%W?-%hlC zOuykE=saI6ylOu1AY0^x^xz%%jLEG3#w3`MPV%$s|`^qtTe*j0?}kNoSrc|_GEB^L(^)GluL%G8>;3fk?&L78tv~w8uT!YvH)It=b{9eZ4ZA=5 z5Rcz-3u=xWabFR1jLyH}VjO$IalS7TdgH;mO8oWa+qGN_XtDB8GuYW{B--sdwSn=X zTfc>s7oXMh%WYY-_!!tK$%N@>K`^MVsm1Rv{SKO{wXR-TK1mu7gjLR=uV_7)N}Fga z_~ok)50W+B6FeprZQX@0Uw#{hw(LR~g-P1F^&il$cEnPMfeCy3f|*!y_Q@!iF*)Q! z%OM9{60FH^$LUw1zN|`LrHbxm=l}3pOgeU{NPye)<{BK<^9#8AQfr(-gxTiK8A?3Y zgtS}CeHtFyHqy6sslt68^e)r(l|Oc%b)74cu6yyixl;Jt{Q9e}kXBIO<5y#T--(=N zpxCqv62RuKz7QGgSAXwTEIMYnxRLJp?Ju!w(|ThY?r6q|YW?L)YkiYfGmy6I43Qb{ zk_BCL&S^O9yfdK0MGJ{d*R9%4 zJ3iZhS+i##rp4h~2!cPE2-q?<6DHAIf%dDZ70!|xk@w&WJ2r2}gMYc-P{QMZBPlBz zU;E=9G5eI05iu5c5U4LL!9T9N62)7#=xel~$2pgtkCmsM;QN=*b@Z?M9>g{}wj%d{ zJQkgL*unq{xU{v2@P!&g?*?mqqam&`k1X8lC|0X<_X0*!j67v5CmwWrfi^7L%z;b< z12NHi`~|#l_d~{Wu3+d&=sm%c%i%1oZb6{gCm)L&?zt0@0xo;3E-phId5c;av`BbW{PBPM z4cj(;g`fTL9@uQjXsEBnUANwhhMFp4vrdYY_g9me6KO0S$GVMNL+p065}9+_)(NMt z!dVxe1BGIU*0GwFIcL(}_ubpE6lwadu;b;#KF zxReBn+5Q|;7IEAz&~2!9L}Mc7m^sC;O`_4#$-)w!Z>RgyB&K8(C%=mR1l4Im{5*~!Rny)%`XUb|64TOf%;lG(y66x}cd_S( zOW8W{CAq`0$rYGO)`WlPVz3rXnM@?Ybt7?xDIu0z^foBbQCbU8I&PNi6fNuD)YD24 zE`2_}{CYx+`0N8jUJv}?UZblL4+s;N9gQ0wd(2-PYgoV>6(uSRTALbCw0?tepg(*=%!pSBgMk2=x%}6}M zB;wpLvrLFR%7moLOh~<6k8KYk!~|jt?b|6Pn3GKuB2{SL%t-%{8Md>`;x~s&o&a_K-ga2)9wrf_CUN-aQf1bu?FKM!|qP8?A8{dEB6=Y4Eh~a`L zB7v*!yBBBt_(#S%u4{hySAWLNFE)D2qWcdfXERy)mds>Wh@ed|{#^FPJH%q5_;0>>@D&kDmTlf+CZzw^ghV38*o9>6&eamjY!?!VUqoa+e`v#voK%;5IZY;Rq)Eo< zOzQ6O$Y$}IfGD`zwdY0X14Mt^{62~?j9^S9;y(LpSL4m+pTe3qUJ>h#J?S*8I`<+W z=Hki}wbnKEXspm1)Nb6uts0$VHM)i?E`<_f7sZ0szW5eid*BJ}ec)W6OtQpZMMmLR z3^#Di@aaGN5l;WX4~y7MnhFK?!D=kLNUr!Nl-9*Hg5di6TaeC z!xm;D^RM6Ycg#8U6ysWBt@!`^{Xw*O#D!fb7)KVv(OOoyNaSTzLcJuAD*~K~R$l0- zNA3boa$~CN5M5a#tYMM8bHXy%Qap~Ql{_IyV|=^QJDO=C(27v<5#r+GF>(G3?6?=d%xO@_x}BqI2ZA0DY*HuzhLn>r=q5!MvS{AifU&5 zn%w2-eC-UMoE1+*oBj79=YL#xMW55qRdQP(!n1J)4=PrjeF2uNJQ2@7@*qC{=smIS z>`T9nQ_j2CD<;D+Z*xl@@(a2RTpUAGt!5*;(WxttRh3rY#lQXAxJ=_yQgFi~k0PyL z42J8)%Q)lKALG2+Za0o0yR!dz%db&!xbH61kU^8Em+pNO6$jlNq1cW7y=R}(>%&JD z%;aAF`aSm|d&(4}&bX|&1g}2*g3s+wKmRP_JaJPKbF)r(ie9=3&CTB3YF6|_LZfz{ zNPo$hC&0LF+0suL2Y;F5YEwBv27L!Nk#Rv-+&nn_TP!f1Vwg8xeL1eY z;VK-rYNaU8Vm$WSzoVs58#vk3d*PkGLE(Z082(Uj!VNc&W&Q(b(uP2DZ3F&EH*ZIK z-$NCl;Iq~5;&WPDh)RgV%}nAcDHy3>7x%ZHcmjzT8OFL#-v0>OHf}@r9N84IhFI&~ z1uIQhT?&Lo2S3%F-{FF1vk|^g63G&uICqAzLXA(OgY7$uTy3j^(%PrUpkEZuob2^n zadfLx;C*ju_S{uWTXhVk&6@#R>MN=dV@tqI58fp*^4%|M9wF<5;Z5R< zXp>KioG(EUPv|$1i%-c;3%URHNCK1jH8=kRQ)bPDTc+O>4;e<2KgInL5 ztewVYUGSn8bZfIYhTP?IrcK7eWk=!s%P&NFRysa@_ahwIbHK0?j=u5=9ChJE!`Ke* ziPL}hLoB=ea^rc$fnxGNJRFvIc`&G}sKP7v{}+ZvGEK0qxce`|Haop9NG~YB*+2cM zhiagLCm;T=kt5&<*3FOc5QX8!H4F#0jMUee+Pb;sJ!PNi@XkGcDU1X+vlWW106x7+ zJW$skLAa2TlZ9x#23~~2x)Hf(pX!nQ?4;j$>eUxRVrcN@gHK@Fn$Jb(?egFL7&#LP zjo0`bMeDsO)M4N2OF?F|-^pST|I@EzH{;_uJ2*EJ5^luA#^UOmZ^ithkHb^{xew1h z@_-n?F8KO&I9DXV>7pZ|^HQ_ceJcRE%SG1Jcs4dr(L@%)n=id)tV=1#$Jsym*@z-> z277=m{>_~jGk1=$Zp|~VV&~@@FyNqb_1XjfLj%Qd#Zy|2yXq<|IJ@^21tSGVf9-3S zeafi@8QaOLwC1f3dTht4cjsK{&faEieooXy0w|qOog@j}q67^1eB9!2vGtc|zncu>7^0QAr9+T%xhs5Ax+nUet`aRl2 z{`^~S#Qc+&d%ez82(049XxlP4ll_52fEc-#MZO9BML|}-%Bn^(;^PzXjazQTiD#aV z4_|);cis9uRF;*BIQqrc-h>#vo0v!nBCDKT?eN!ahs)MHGS^wc)bMDkis(CT*WG=b zcy+~J{yM15I0h3@@$tC&AOA$0?#gDD?Emh($N2pN0~JU17va-a+%9#VES*WQ`(dwy z)fdn;c==!N7Or*|-hAbC)KpdXaIr5sdNI$2WfPbF!kV@Q0t>f;XOj3d>J91K;||9d7rds_9B|Yf{D4Y0L9t$hGeDP|0F< zW>aIMn2ApQF8LU*^fnXK;%ue!uo&3ysPt?h8c zMT_ip@j{n2vU(+U{FbPUe>)omEg8S24;WoE}OUMwE-ul?Z3S5Q-0f$&2`@xFuPzIV4g zoUmw-5Uf#0!EyG571vyijB$m=^Dozaj+)A<9@|ZsF%>fxxWgc3yPa7Y4kAi+v8&OV z{-w#oB2Ugt!|`7`3z=g*YVlhtp|*3J-8~F*f*b4{VhVf?RQl}B{bhLL{>O3KwLie^ z-}wnDOUj_OcEC|ui>|WT9`E5^;_eTCn53d z8UEwrh5>H!wX(0^Bp9_&&QARyB{dyafA>eY`B!&|u3mrs)erIf!w=xnYrl<2(`Opn znYx^0nb-BKHSZ=0Q%~D)SFcY#_*gt=>vaB^XCia_=#YnG^|AAR^((^$?<6n9nx|g{ z!ae7vNz=QJz2KGLcFN5+3;*wE9mAs%60rR0YurLHT@HNq;b%QXVraSen#=X%F;&!u zvtnCULY!zMBsAAmy&MhNvHjMse~j~Qz7}3bmrrud9;mekgcYvVQ%JC8KYD{ouKUIv zMR@e?f8w?0UO`8DJKE@;*|uS;E;~ycUDIIb`Wx@-=6dJQ7iZqPdQ7wY>Cw+2t`N zzwvP+B<{%&n-L1w9cJsj(ZFcN)LC=MI=>e;-*%S>iT~sOZpSevorV+7xe%_F8(e>D z;qGRhq7x?X%aVzFJ-7Pobh{Rhzu^XqCX8RW2y;(8)o`(|dEyn+>B(r}LQQ!!wtn=b z@qFCEg_wEbi5RV54gW^6PA8vsI$}MeQ@VnFo|B`iYP*$>xYZ0c+RK}zbSZDj9-h~(0}o)9Vzx)jBbC?-*5AQ;!{6 zcNouELw(HbSr}Cylj`K}eixhGcth*D#Uu;Aj0vG&0S#P!@z*NENQcVW)Lx!vE16tcdpy1SaQz&ZO{)rF)u zqun*EPMSU$mY5iX1Kix^(LenI2lnhWto!kkC*X>2U5(T<@7xAwJ8IA|_mkwnSq) zSGKxH^3>&8h0N)cNpwSm+E$Z3$)WWd*s@`Z?hXfLEtrezfAH-dBreb`Yrd`7-g6ro z{X0{WFl*@oEI4*CB!(7z9X@c=FVNm-7r82?ECo6DnUQd+;>!9mwl$>y$yb_$y4!Fh z@m^}keG+;9OVB)^j>{d6-iwGpW_GSfj63)8Ymk(dMwX8SmtAxvuDZgz>rGWzxpCqY zx;hu0GkWToy+9)YB_+a01I4};_A^&VXvUCoFlEMJWCzI7$O zb=xhF7N~J;oBIiU)YRq2VWdOEmRnjxB4wAO7taPwq9&6!q;%_6@swla#fOhz0=cle z!?XE`h>O#EU0u!?VF?zt*8^i3 z6LJZfC&uPLk9PrztKRCF|EpRDP7^XVru+&hUw%k`La+;XEA06%9<1J%c|&&bX)9-Ha2 zIseFH)McwU@${3S#K#~sCRefX{f|++bFcmkIR5mLke1oIIFeI$_p@fVQ?GC5Jy~@2 ziIT)442QPw!C_bTL$eCo*`bDGA{({<%~EvE7U=Ge2#b52rogfsEsS6bCONg|fW(8% zm^rgCszJwQCRydK?DfjxGE^K4RexJSMNzSM#GjfwZ92KtM_zX`MjH`ob#*Q38yZDv zWM7auX)@v|?(E7KE~_FhTx_)0HbQcB+*rfHhGWxtV zPrYU&w=sbqbHehV-m2)yq~#vh4ePF7{l{NIBC=4jbDv)Lpo$*j=Jb*6_w^?PgKkE5 zcOpN8FhR*C;?WxrNQ92D6MDKVIewQe+LVrNxWr)?4zj3@G3uI{TGZCnqqD1j`jtGv%$v=kFPc0~MR6%CV=_2C!&n*4_r<19UR82dMF*S|u=@u!{$lezbk#=D~=#E1v`^!GFJrcZ!Ggn`ag zbx9dqKA@O6BR4MYLYDtTH?MN>fw9OLbd#$S3VMi{Nc0b5#!u<7E-5ox^ur$QNFvv5 zoK26z(#>9RxD=tFlHT83r+cmFI-as@*@(&a=%g5RO>G^jYwFP6(TR{in zQ;ZcR@*uJ=V*lnHM)F=kMh4V|Vc#}u#KErTFfhy`J~c=|LEKVbFL;%nF$Rvvc{h?1 zp=OOfP3nO_YF1ArDJHOR)!q(QFkv(|wIFk{HqqgsyZqpx5Zaqkytuv|M!c5(q!kok zxPvp%8_0cLQ(KSrZvDXf4Vt9qOr2&tr!U3)Qc(s(HQi=omwHPoC7 ziLk-x5&lsfBR`!wK(iDt?|FA3FG851j3Xa^luUdJ4Jz^q#(7Z_KaM6VM;WDq3=giH zU0q&LMV?waGA6j?X)6wuqW>bQ3ha%|?swDSjZGT9+6ZEzL$2%!y%yZ*3{RcCnZi0L zM9wpgUgjojl`W=baqP|6$rLZw%gM;Ak(J|ati;=A=4OgyG+4|q#fDaP#-CTb+Z|4s zNHO=I&VIB7=2Rwf1v@@nZ@ecqJ`NKn>eo|w4V2w9W`=9>BM}m~LdAuSy~9&GJy>wY zdVmgljjB!>3yDymkcGi@gpOaiq^N`necI3Jb{QVGb0_b9M3DT zMVA&x#DUhj#vtkh@8=LAwkR4J@~ z`$OZku@lF_8m*PAiM{9RVRsSD5W_10EYU}Bi`y}-b4wHX4^=qZMy??fNC?I=W1Zp4 zROTzX5Mcx>zNr~0P&~vIB>ILZiu+BSJr6rJd}XY&L`7pXffKZtygNI)C1=qMZjE*y z3l{cJ9jZIQib%b#yh_BrYw2%ugVz5&&K8e^lw?|L$jHlvEj>kiSXW1v*N2-e!>h9& z$H5!PtI*yNUMn&tItoeToiKYy21gUAGa7H?iEx{lOh!lVgW!XRz7 z;*=AFBrA6kGpDn+BecnAS9_=UevuW=33y`z=Z)~LnzNH&iqpbU4RsCJx6v(mJpZT# zKEA{Ol#rXfu91BAc~GK57q5}%J5na6=oJtOoDD$TeGa7kU}SoH18A)GNJ{s01lVN% zI>HQPBKi9HCg^fNqCZfOoj1mV$Z0m}=wG(+a0Bb8Gl94HQ4V8xIwl0EC|Uy4#t%Nh zR*Ii8f%|+P+&$A0l5LoB)SMm-K$KzP^>9h5wzRe)ToD&OmeEmG*ldYnGT9wslEVqD z4(-0~>^6BYCnt#4Cs-8RdCwojBrBD(*eTq`8SY9L!fqDYKkixJQlPUXC;IV@DOOpY;Sqgp5+@t3CeZRt;3AZ00bBQK>T$y7T*>%hj0p07iZ~bQ6f9)?l zn%)47FRA4Dalm%LNIMS-3SxsxbYu9si;6H1;M($uV}y%pw8nKqMSkIULvo7kkGAHK zomJbtS%?1(x$Mk6LG0@2#IG;75fw#;p>ujbo6q%{y}l6}-u}49>yEAvv%3cYtjNYL zbf+_X_ZClJl57cxi;MF+ndy06lpfE`ocxv;3#+|DBYYx1j-PY+B*L(}W~&7;39)Ex z)ZF@(xLBG|bh+i(;QAVJr{|`^l$v0?z?tsvKl!rpS@RdqM?zw6?tc2T%33nzDYTPC zlaln&tE@N};A^a6!&dz3+rNUd#oG|%v)DC4BOW$up1+qq?7qSmk*~o(Au|==_+@oH zAj!PXVAr~+(be6EO%;`%W7UX(ODeS4-YTr|Al`uvyL(c@?OiJl9u|+49$V5OBm!Y# zVhfH3awYH_0c|vyKpr9zBHYl>NW2w3PZuAX*qCS}CMI~f(LKTEh&?1VRn=Z(ZuY6@ zs5MV9C3LH>2-6V2uKncf41>tk{1liQ$t%&^uIZ@L`8FrUz?4Sr^eFEz$)0taP<_Z< zuDD>y0t5|m=_`lJp;p#G$tCMNSxcOg2oqR7x1R33;tKrtj=!QwF9}s*RoE`Ez;T2C zZa|U0Ubm`9xqRf6IQJsW+Pg*0L3Fw?ixB2Gx%h1UXM8?T-`u0?kVNlDN=}6>B?XPO zwc>emO$|E9jT#j@a)fs{L5s7j`zlgWSK_;NT<9^UreM~*StuA+h}?o)#FE9v)*v_e zXtCQ-PXk2RkuntRJBWR|_Og%K`?Jf+kUMP}A_<~5IJ?n367#}=C?aBiZgdwo2G606 z4)T1oHZ_R}k+`?%V8;waIV2JJyp_vPy62$QO^_4Wa?&(!jQB^<2On>erQj4+|Ko9E zGMrtIjp_4d_WkQQsGtrWS1eaufFN-mhh5n^mO! z*o=e|N47pmfJC>V?ul*;e*vnnC%hTpBoU66?>qpBzJbT1g7K5Ez4i<7ys4%dja3y$ zA5)0o4w0Zm#MIXsXN$#x#DsX1Zt)U2qRCA(X3Uw1<*Qa=?1XUvSX-W}>_swj7Fpm2H6(3I+} zy7B^~2H15k1rG+S z7IyZf=Nf&mdxPgt%M$~xLyn7&Lo4r->O{$o9f$-7OPJi~9i8Dza^&C69ts<|(Mp*bT zF((j-yDUd0TBqtXte=HPFAAE(eSs$jNvTPK$oVsi)_*mmxd?o$*b?sRWT!V+h+L9v zHbe&~rQ#B{Mqed=+K!=g=XQ7MKmE<0G(0rQKY95r(YxMt&75-fsbUfrR*=hGIaCJK zOa=>Q?`NjbtZ8(WjP?qSgR>{2tj5sb_ryLH`q8~V+#to8Kk#=Uf8EB~b~JT5V2d(g zR&q2frop}YGyPlSKDpV{myN>-t}#`n6nZsSkO+*H))s91c&*pEt?#~vuw@Mm6586^ zQB_@|3AzMH;!N7{aV$iVCX%oW_b=Ub8()3Z7?9)0t(lvj*Fy!*^KY-;Mb~6OVWIK7 zV(&h5wGGXLvyHyDs;VZeB+kdqW=lXudYWGnXUm&AqSe&Y`6h84l{dCwscj_^g| z47R8$CG+37pffF~`%n zf@d@({&Es)X_YpqIaop$Ti|QVJ<+7I)jBw28r`jHUQN3LJL=of?i`%&4-g+;($RtdjwI@_`7vo+#zJP}$mSxan%vPJvZ|DM39-~T=$6(SC9 zx5I94?UPg}3y~xwBm{K*mh9P$vfaD2V?od7pSB#<$+@DVRVebcGnX%c`n&ryTA~|x zH+e$lo_ZPv16hext@5=Nyos%rBfjeg#X{(RRGpip6%yc zmw3`>lcth-p$e4ZPI2FG*pR^(vVUVfWCDW?*~VZv!yQWTLJJfqQg=<7q>cM^Isf~9 z=Uhp0Z`^YpIL*Ds&$;J(&+Bh8X{}?_y3V|(_3yn$zd`?+L)l`XXyFZgLgHc%bk8{w zJu5RKE{XH+!fp=kPu^7$=ODnX%a%pH(!e(PpaU_KvGwaUq>VoneqK_>q~YYVPR5Xc z!!1g{VtcVtIgYheCcbbM$1rlA@q5mMy}w3S9fUifq+F?4-%S&Bc5W6D$qgj7qSw#y z;lSL7@d-wxnp)E%aXEH2`>?LQf5(AL^YmD=;|97hIwJBnF;F1WDP~MkYB6hwiRKnJ zye{PdN*|Mfxd%l|zhxUXVACf9Yx?aB9AV7_-q6_GWiz^-w8o@FyYPcst>(CjmWX-$lutiwK2pc@O@k9Y_M$UR2!F5Jw+}nM{1W{I;R~;+6M6J~1tSSW z>FKFRAx$sdz2xI59ps$dq6#kwQET6RGi*rDBF!mp(l|ghSPwPuv+~4m?uJahSw1^1 z>w5K#S0N>J2>SFnYMcGXrQ|Z(M8f-q9mF7|A}tHePDR6&+eCp3)-C7b^83xt4>y(B zNyNQjCz;O4b+Er$SRK%dG)aDL7aSJRQ0t!wAW+ly7t6O(>1VI@v?sxIT8bG-ruOem zvo8p5KbhH+jQJfEg6Y0S-Y=cdI)F_6a%leYxR8TVSkPh3?WmKEfgws;UH0&QhD6`w zkaou;&ZgS9>qUL$%d(S6aSV|#o6;51Y5xNG{65r@kDVv}yng9BaB- z{&2vSjKj}4QT-GY(@-Mx%F;4Cbn~5PZfFY6JM)KUp>Wc83=6Q8q>0S%>|5SZ0(m15 z<;Got+=UijRZq+5J#a>wt>fJLu8tA0*5d#*;RbC`wC&=3kT#2F;q?3ty-<=au=smEQ&7u&A(HOrF2k$S`G$quw)ZN^K zub+M@Tqq)c$|THOG#`D5+zADkJZ~m8t^8g*pPN2jhElSAf_FN;lUmXe!Pz_>E4IHu8diSEfCS`a=5m6P!Y()AqFjR4`thT<6l3! z4UJW`;j>tL_F^1!@-Y~$5ZA#0ay&J)>9@f5oYUwyc$0j+(CL-WT-Tl(%W!#O9!H`q zG@(K)2-0&HkQEI&pica3(j*7ySpHy)O8Whe6mqkjd)fJT?vZE2cgM;gbpHY}Zti_< zK40qgW}hmzNP@`uT`wThI$xWf?o&~s2{{%$N*sP6qK+d!dH=Y`=~xLT##`8-tGl!8 z`hoM4hcI=#mTMUUHhTh!rYk0wZ$A49O+*04EIuA)n^K;YpQ~4Y|2q*$Jka2J-!(OL zB3-GgS|wM|${@3ET3Sk6(g~Fz`cRyA`310X{RsNr{5p*dul4@j@$xg;>hYAYr-j}VcWbLcf>Dnd zWNPP}@+6}U{UyS5;2(dhqwP8y`3BBU9s)~^GbfR1F`9$lq&9yQ9DT}};;+x+#s40D zLUg4%{MaMI!`J?8+p*&D$1qR`=Ni{FklU_n0t6Q!;Xt-P&gX}p@*)oKgqm!^A6m7 z>CL$NvRhDBskEwPA?4%e-oV2*5s6pUsAbkAoN~^oIQ@b%p<#I9=#!4d)qnjFk}opC zTtw#WJ}3@j(Mw1-x1~V|+Z(-T^7fspt1C$Ep?{pwAzSum1C#PJYm6+JEhjf5e1?4npDFdExnd{y{nqnfA{@fH-&Zy9GF?hR!Y2Lpnh7qshe| zr)Y&BH8RmT-LxM$7(TWxTp3GJ`c&xkFbJ}i#4 z-}v*N@qbH}kkzt#radLCtf|jxr1L%F;y7H1E?zJj7vE_l-*BK$jw$22mtI7D>E3X< z-@IcEMIN~z!Viulg+D7=u%x!#WsRzJxgx!4716&k*pjq-u)k}`*>w| zH52()&%5kgk?o;j_@c&8f%gx12C1_pq+S~uYeFJ+&oL$0j5T#`xcrf^!$%)CH+nET z%}iuJFlAx$ZE=edb?6^wbVcnQFh6-Kq$NQv%!R~Vh57+|_w2+MAHIi;tG_`*T}=$_ zsLcZsvLnV>9$DO7s^}>sG;maSZC$H*TruyVi!Q>LafPB^IZsSJJ~7yNgfPA z-+1HxeK4A>@O#|Cr2OEuzYzihyBW+DGfXxM3?%TF=(EwJ{57b5Sr9VPx(1Vh_F7O|UOKURhBV4EdO@KCB?tSiTR-ANp7LnhkWXPP_5~5@6|>=iizghmsWPRw4*p z@pf>armT{=x~vZn2>7vTsgkWRaqdiP`urQb{m`>$u4@P%VN6aYuDRt}(e+Nl@I{Nh z39n^547aXr1-RZnOB~cTE7gqeYg$)ubJKIZq27ae>DB=#KuZ2`dtCqc3Uq?55ILLI z2cF3JmCwt9%=L=dche`3;UHpr^{Ge6&-{tdP$NeRtr5{Aq}H3ZJHOa-dismE77W_T znO(C>&|pa#Z42jZw<7qqYjyNp>hQcm!?3I_lHzP9zR6OnJ+!_*l421c_|^RE(0VP^ zHC?`oLGs--*R~Ii?24Q&cXJzY4J=g9ic9`>4+`eY!MItoU@&)7WW_5Y!vlf7(ZWS} zRqj$oZk2dixDs^OOqQ6wv1SPi5($HE{_Z#QTY1C3|Iy@c&dSRcK~bDXE_~y{eJCqr zE`l>K|uxg~&PJjYrCX zPq^g4U}6De7m;~=GkS}i+qU4z`|d(rO?4D;w;#S+CvdPbj-fR{c5SxjOW<|SW z&CN)rJMoz&PFE7^kcO$F?O3BTh}MXb&?p&tTE^S41}aL9(tu|StwY~=|9oD0qoN&( z=t*8KN6y+1BcO?^nMu7Ugu(;A>~HPsW`AQa%C8y>lDi?G1irAlK@93-whg-q)Dp6O zA~3!NE~3IgV(fMZh`)ibn}R=c$ywf(O`}}ToVRE91e3g}%y zWkvLVAU19EBmy_6_TJ`>Yxgc*Ouw5MM_h0oj{o`3k(@iW)q2g%4${IMKpzb{9FflP z1s!SOoXY0zW-HjvAd&mz%cq{e-qowaSCWyNg)^=^U;Kvrp3;*m%H8sh#O??|=xojp zlerYyS@fRKW6(K$^1_nvK0HySK94@>7#x4S`WEZ=eUBCY_#WOe`n3%* zavvk>T0ivWNi*v)o(Ow)bL%m%)Zs&cT@RzK|4i)M?JQn>b#x)2_LCU%X~rr@Cjc( z3lKi`;nQco_{;@$T=0;OU9>%=$<@#x+zmb_Eu;PLKE3pv1qv2kc>nGF*>aS%MiK(c zvj07Y@7`I8bN={8EV%H8aFXEJ)D%j?>;1F9??7UL4fYP|qdV!`*_0ma^OzDD>)&|? zEB^DJ$dwQ&Uw8X0&;y&5(NCXUI#Ik(?| zgU>w&eNVa?iT4&vR+6M|l~ZBpRa1-Z30Fdp2n9B(!UB_fGpBAMij4IjXmFe zkLGH{?bB4>fG2Lc8D+)AIQWVmVZgL-&arQ35Rjc`qVLafU5Xdz)+MvLvWG5!1~zVQoFD($#eQp^28-TC7?64&J=uPPm%Xs$t|xx%8ojP;kg1 z^cLKAy;aNBHsD(GjZH26R?)9|$96n()sNt+R}=z1${|M|ii@tloZL)?upeCb$91Z; zN_^&ddPPGQ^P_^`)Q)pXFniDPaVttn@#ph@Dy%Ql=FGqizq&!Vdp=vX0xkyLTJ zq5stJWMcuYnebJtMSSUV>HY82wBF@ALW9K~`csHO2Dkl_Ht*`vx|~w>>#Hw<+o9NH z_^wPiXaN#Z+xyM}o#a6aKX5Nf5AycG9=4-opLtJw-(j~vymJ!1_V&5ld?cMI-u&1> zA0d}St9b_UWm&DQ=2^MJld7N@EEW+t&M@2T;kW^D-b@H0&Oj%wUqr5ROo50$P~r%5 zQQr+}yaLAw@aIt60>?5KVl+_+kza3O3PPwU-HZFrItz7sOT!kQpDtMngVl!agERoT zZ(JWeUSSswoNFZ4Kwta9BWFNlxoIPw{mHfPG&Y9kjh&E>U;OD-L2E+%0W)8EM%aYa(mD`aDeHVq2PafAekZ{bKZ?qq`?{u#FUF zepmJpKkY5{Hf@8|Vg;{7!rt0vA1EtJuqGwJmXbnKGE5dLj3i)~Y&Jpi;xiGyDQcdL z*0-mn!9p5w(wI!7=H`m;I-S(+EHm;8aMP==;m^k$15Znfh`Rske^2A^tAB#-fcMI^ z=DALKM@>%H7aj=qU$Kg9AAgLcf4V(P;tcLW^^=>ghLQ8hSmV`m{DMw>2SbH&b>Z+r z8Jy;*7m@11^e(F=cA<**+{U!|%kKq=Gp5X(+KR*(>0{FHf4BWonA%@|{&jMBG>Rit z?W@4OfA||_FPM!J&pZi*6APhX=wj#Aoe1Rwd*~--5@!^*_(f2fb%1ia`yZTkc2c~B z%h5%2hsXyh4Xr(-yiBDqf64w1*W0pwO*`Tljf5Q!J-HWBH|KY@UT52NWqm2evR3QS zfWQH6Jk^%8-CFV1#@ctZ(7mwCb6s@bLo=ggaL8J>a54Kl{aXNJ&m4zc?2- zQV3kqM@XC@wfV#*bSbD-4u~di8Bvl}*Gb(;t~D<9BDSG{{LBl_inFGSgAYHLh<*x| zf3O@ME%{KbpCDoFw`;{TYtBrZcEOp*FB}UELkry8=H1ud34aeJMipuyw<;HJnUiXP z)iC_YoS*!n#1mpI;){M7-Pli;K&D8J7-94J5Q!Y2>*QiFTq8IR9=QEi*tS8D-Vd5_ z5XPitw9)`|Tx3KSf1nlSU8(CKlDxi78n}lmC zFTSy_{?cnMMORQ;U5h2JEWvkQd?TKd(0%6Lv1ob`jyd@_95C+y)!L$Au)y!^Iuf#; z`|q=GwnQwcu4zG3-qCvO;a_T8f&p1p!?4!QCncPOv-4thRjjAyw9EOEUDn9eG&DA^ zUxpz88VDxjiQc?YRqWy?-l$04gJ&LuX%l8(WML4(;JRufki0rikUtZCP|aWGb%LC#=2rv-5(N14yrMj95MJ8e9m z4go8f@{^MiAleD1;3) z2wjiX75+jW)Vwp9qu13mLXrE=6APUpiXGj4Y>PK-!@K`|QGB+iB;t$<&gk;CY*D!U zy329YiAQ0{%S*6%-KOv<@7%ltJ7^kPm@k&kJ7gX#Rtq!?ESwG(UVrX2eD&$d$g{3K zC#JpRq-h`pA*HqJj60Q;IsKTNWJ0E8IQHh?Zf9}L>MPIk~u0*DO8N3 zRrMXN>lRhS27&nc6@zdsJ+jAlWh1FatB7DYE~sPZBmgE>sXXCWmpeZ{S+OisH&)}_ zmG5EI##Lg|J*!u@IX?;0jyy^bIfDg7PY`+HTrH5ba9P$XK5;{+AqxLv z2=7z8j{!A+kV#vT!+GS2Wkm6l3zK^*^LodqCI9wgx85a+z%Wif_jDwa8=|{lzxWNm zz5!(=F|@Z4k1 z3fBpP$Mdn{@=;S&1CPrMy+cCED>~F()%IOrYaXzx*@q1Bo9m=O7!P}iqQsbGS^3R) z1KmJ(iJbl9_hHDG*VRFzXq@PkD_ZYG!4efU?DX_qg)I%k5b>PtQr83s)QZI+p=Zt)=N%FA}#z}Oqn!ZIsbs-3K2vsI-Kd1eHqyI5ejNk-$M>;V~sqh zn$JURXM;-hw@|Q~)aIl*$|+}!{-wV?Ok`dq)|h(0G#q~1;ph#i=F6R*?`y>EDx% z!I?iii~Qv8;)A!|7xNQ7q~|Umq3%lholLFYIZr_8uQ%Kb>|D*wqDzXm_-%9p-6HbA zuJRTa?3bH19`fehB)S|*C3LFf*d4>P*Ar3IVG|GoD0 z*HFHGeJgi|2w9`^oV(yaoO8}8NaWh&Ol%yTF1q$HN9&bsEIf^&M&t}0Os7u(Htqx(Tf{7jEuxXvH+Ad2XwVQ7$%$z&(6h$= zb*>NJTvsd7(?a0kBqcj5OynnB^#kl$yBXWnl&R2gBRYva`Y1kq^uI{W&BLry7bADp zY!u9!53}8l-a|%H#eVGi>MLwtu^hWseu;qBgIKZoW5?##U`J{@T0b z7k^&0B*?geNIWSe5q*u6)MT7+>hU!)5Cwku63L7!IQ6&cDbrenw*4&ef#kFe;*Uy^=1PkvbzHtL;i;GdYeLEV;%ENx;(9y(osGr7UW#Ei+Ps8-- zMKFo{aK9jMiLDHN#W&7DZekmQEKHYS#adF$<=pvf&1OiY`+;*$gk-ly6zrIhk!{TD zVS|5btoi73ym9{%;q^~F|8z{I^Xym9sT?qGmYC{l>IIp9MrQW?W#!_GS!fCP{P=ps zSNMvigv10gzmLP*gXdxT>=~kn4~C(iwm;$KRCJXBaS~3 zC!BF2l9OYbm@`N?oO$6KeDSYO5EA{^(i2ROkwBXG^i;FxTsGV=DdEJ9nxu5gtj_2* zkq=q(dI&7h&71_R-+_dr$iw0CxHJ;i(0!;WY{BYg1Zy2IlE#^6wxiLlbmMENsKD46 zt+OGLbF#yaT7xjvN|;C{+3W6~f$FmT`1sk^vE{2Zs38+$+lC(jj~DwlY!uU$4?hg= zGh~3|3VNdI9>tCFM1sP^sS|PNQHNsA+*!oOv^|lN;tyvMm&NBG ze`gXG>3orM5G7y2gtEp8@mw`lwy9%4gp@aBO89Gt074iuHU~fa z)%7Axj>()Wm3{lcayS}Vx9M#=Jn7WATvJ?*>H;WruuUk8jQ!ua6Y{a(h(j=gG{>Br ztgyx{qRYhyDM!dw6b*>+or!hJPRQfNLdvEAm;=yumOv)WUYa@~e9xpPqj}dFqeRx( z^u@PC;`a#>XXNDP;0IU!P^slU2>9~TFVU#}hLgQU9N;lypFV)?W)EuhO5KA{s9srd znV8;x{ask?HWW-K5NU1WCymE+GQ(ReBR8$h>G5FGhOOANo&=k3*P*385_lXEelqAe zS$M=kEIRgZ5mea~utlV{rY>wts{dgCj)gLeG-G&@I7EQktl0kX9+}k{JtguXYhDjQ zBCREL-htsE!tK?FTtn9(`lnYmk?+^pDlm*;HCn=cI+ijbcH#V$=)$OlFES1b) zFk;r>2hp?u=l}8=R1g6$sqb8~5!HM5qoSltt^eOXXD&LOJ`#-{`DC_Ok(!l`!s(MR ze(EF~xNt6#5)+lcHKBbg1$RVS(QqAf5`OhTMUxKdm0&ehtLA?s4occttOT;zE!@Ze z@Pv+cVKBgf zZ(Lza_-5(fgWMLR26V{r>oLz`LNl3o_Zofp&f-CnF4~15i;i8}h}d`%&`F|W+_>?D zD4I42V@R0F8=EWqz|t@?$8&&Mb5jdSc9)=RZ#lmG`a4vTrHQRW(RtqduaU;#$ud-l=o-qYg6_=MpXqcAD)q>dJM+pNy$5s?qQ z;xMt1keV8$k@sI|OAR9gDnrT+5B&QTEj-o`Yc)oKYZ@!sR~Agk%~jK?*z{g4iqFK) zb60$?IpYh&bnHcEif!EvH}=y&Syxem+VToG*$>|26ajW2zqdqwZG+heGnp!r(o&F^ zl8kIJ>E?|eD+2OlHj@Wb;^s865Sa?H<-Xx+H8v(~y{ty2NA829iU-0EzN;9LhkWJ- zlC>cz5z@Eo$xcu7cF1h{8)~AWQ?%2N>0Rw|7P->UO>TczKYHd3@`*p*T46_2L4&Q}z(o%ECN|Qs+41Z=*b533kQqxk0j5(g8%*#qjQCC%q{rf7g zd)qG5RM#kR15xXRNt|O1<{l`j<}Ez(P}mcC(mV)ov^Yh?y4WY}z3G(J)!p{C_(ilj z_YfaGkT5eTZnXMSJu#~@dQ%SPDGYHUx3G^~E%@Q(h}}`?(@Tibs5m@(n)osG?KkZCqWo!2=O3BY2rV*JdhGZMCjTf7IA zyLO}PAXHmfBPNcD2O?%@8=2-)GDtWhOA1%k%gxWDDHj&2Sv(tTrsoQDW}djipP}n1 zaja2$JYM){;y(5+rwdN{eYxXUT@8^n2^;lw^=PE2flTBcw;OGpB)TZEjQ>p{Q~AWn zlW@=x2cu|e5s`QAGcUMJuP5Y2lH_pXl<;+ci@|tN?+KtN$pot*zQt##AlaCYg8041 z-$W15VYZxvdUpQ&u!SZ_Y8+TqwEzuMi zq@4Bj?c~FhtSqG`Hw~CvCYYN*be+h%2RTfCZ74!ghF&?Og@^LKSaW8g=CrV&S{og5 zR1}v%-A)anBa4DegS$k&YK$XGgMm%(v<~|?=`#~|sQ0+6)=-y1f29a%%TknOU7cTB zUWLbgdk=~?Yzv=v&e#H6bL$`Q&P)HpcVDa!^Vwv(^wlNUy<<17xb6xhCii^`S~ME# zoABDRuY}L(AQzFR9G@WaeFm0=&|F=O<&QsxW3Rau29p`%=gt+=qKhvQx7Xd&gdJah zjlJvEqii#g{HD#QDJfCw1}Hy3h%VVQ&r_%^)Y@;>h`(~2a}d=H$vVT4;2aQX5U!5M z+8i{-#fI3TJf3PUju(Sd#`WHI1;?{O2xi6T8YdAW#xc0B_NDlD|PNzmY3 z8%yar^4p(Xoi~V8HEv{C^+b|J*bLH;bywuaCUHhFopX=O>WtnNsC^nkq$64^a8GLP zP0hYWepl+7>ye(E4hoF8#5+c0}n8@1>8T`y;6-`3LHuj%OXsoJ3 ze$hnqE5homgy?pmqUcJPyj4aGRbJEc5UmrXR}t08Ob+djL8K{7C;-S@&&18XaLJ&U z|m867Zv& zenmdzu~_=@bK#)5t?M@9?%&;o%dfuzlcr4SC*@1Rhf6*{L#-m9F-gzxbeyMbrh7Wm zYsNaW2k+iUfqd&xh4Y7oJM_Ul)=0;qBakW9~KmQ9CrvjHaEP}0&R zEK0v6-ooYR1$s;5L#DN9EU<~oKo6o4Gz8StS8GJBK>03WrN!R}z!BNa^BXJEV<=&FU(#t7=xL!5gx|ajg?D2Qq#?pb35w9 z({RoeSF4(&f>Y1G7zGn2wh=@Jc$clof{7^LT+3IDv{0{rZ?SCKb$T8G>4{k5m2qG;iv*tu#ImOt?% z>i6w~$!f*Cv(Cafx8IJ2vNF_H>=(}x|85BcAnjg4p_*N)HaAv3v0=}s6> zx*WFe`6q{c+R@mw5@t(&%r$3*9r zkn)-i$#3h?a!de@BV~9d$*p*rAL|CPsx>rn4Shcnj1nd%nUQE5d`m2sWQ~(M&OgY5 z=mmO38lI}gt&EmIqxSY^1%EA1_oznI<3N5@Rvbx=53Fkb!8k>Zm zsBhB%B{3sX%C)6#Fv2X;{N#k~rtGYjDgdvAdZaFz;Yw-F6oq zy6bjS?JEtF(R;5i#qMo8amh88B0aNjg!B5^Mm+z7T1k%1c@9UZ2Rj!Oys{q+ffh_| zmar+=iY79#KX~>zSaj(nIQ195gf31`dcNCRm#@IGhyQ~upM9p*1dv4P-PbR@gu^en z1QX`Z7ux--u=VKrU)?}{_MsX5&Fy8+yX1Vl`pnDXyZHS{FH8JDhlCI5UQG_7<;b8C z&EAHq`T1%lQeRi+#=RF3Ea+yoGD&9bJoFpf7sAarF987?O}gWvvjrelIkP zV$i@BAo32fDLv5hKILY;g$4x!DL+1;=df0koShw6fk+@BB{lrDN{zhjFDO23HJ>>g zQx-C%Lm_RoRH`Jj@n|zGlSjy;Zct6}L1kM}XI-ZR!U@y4q-?MDA{V4>P)+I4Q?yx~ zzSmaN;Q9Ohi>+U;L8x^-pY52OJY4(BKOi@MTnASt3lsZq@BJ5Eed@pX{KI#{M*8iW zw&9*X{tc&|d#cDy?wtWu!doxDiQ39)@tFhI4t95~^k+q|S+vki^U9do?8S~m6Pjyk z@ZLY}!^;0Xi=smh#r!kRggG%$2$A*s_hIXb&#>dmFVUpdAqZuok9B%cMt)un_IvdY zzr*#qk%M95(2*Z^h;6vW@v$2QVosx;*-zu#mAq=SgI5dvTW1AOjF7$GMY~yLO+gN zWhv242-3^xp=%}=T8e4#n7otR@%zzB^aYVWMbjTKB!k{$SW}Xu0+B1 zX3*yW)MhlJnTy15&+y8M)D_hDj>*2dM(v_3~dfArE4eDcb>B0@TH&x!D6 z&Bc{B-%6(2uC*gInasHG>Klmk3-RW2kHf2Whij^D#B-05mS46XXa3;K9_O5I_xx?*RWDn}(h^23y*G^<^!ZN!PO(Z;V0NnR)y(K27*B%LJ zi_A$O&3|&U2WGDa0XqIZs{zH|t;XZmT!SnA{qI&5o>-6t@&7>t)FswAk=Se%N2!-x zt%;n4uz-X@x_#@^(SP+ft8wHBM<~DL5J1KLN~~D+IX-*$6Vc|h)w@bx3g*nA>ug5l zuAPe42ucn1l$Z2K{6vTH2mK-eBYGpbAAI=TK_|K6pP`rNHIb`1<;&^gnHX}AM9peI ziTD&LXc|TrI1{VUiC|@uQgXBpz{7&YU?C!Rh(VtNmBt;|dY#1dh`G11sulwZN&P33 z$1Sw*pfF=|ThNeJuH>WZ5eke8Z6`=vkh0qO4647q6`89f&c{%Fz#AXAqJqiS_A z&|gj+D{#wLuO?sY*}hX0cF7;){_Fcn_u=iA-V$klazL$>5L!sj)x?7i!bvyZf~kie zF0OOW_upgXJ5S)d_g{y<6ha;ia`j?;>##s}kEaZ3$GQ%K+@7LqDMl~R7aBR^0SrkZ z=b)pA+0Nn7eB`4BTqB($(kq)0tZ(VlbQB&$lPz{sI~0O$tZH8rCc2S|OORPdF~@yz zMyx#t)c`j{g5E@|8y9?`zX6>HY!ibdYt%vu4{7qUs=2HE#Dj`yUQ%<)B~>U0k##s| zPW6fN{7M>#zyA0Oe7Uy8urrro}oVXD!5?G)MOI| zGaIdwAh)N{2j~+bSA*WzSw9;?3=z#phTG$YhLH~u1k~gbHPR7~`z5C|%|@Q2+P#7> zIpD3`@^SfLD>oN~3HbfOpV{vStG-d!%!C}&DgD7k09(lV9;)`H6Fzo9(A-yCg|D5j%S4jQapghOzWfog zesH1^7eMnfPCF6_bEcyFp_k#=TOqEA{jU3iO$goaG@Tu0BFF%daSaitMKU6tv~ymX z8PJQVJ*031IoG)G$&svqB$B+2Y6{|8lM8$8=CE*9S5_*fwqOw;$0MVV%=0YLHN%5^ z$tKRDEs-0@3L}#MlIlg7ky5 z?!G-`So_uY`11YbXi#&(qrv+z5D{kQz4j#NzZeJoTRcg8uGF=syhbJuOC zt*i*$34BWa)m>Y6;;LJ&L3*6~zIN4Gyz|NuLDqEFa7p} zS<1GSv00e#=bxhHt>viu;473il}9vaBE}qDk~s1{B6lw>Dbi(i`25)yAC2t0Z-rzq zpy`!&QTmtr5ol4W*@=CUP@oIC$;|G<(Y|!-G6iTNt&_~gPNj^WFp?+GZK=&_KR?FA`K=xkX3EB!MlDh<}}3k=-gvD^R(=3RyXs=x;QU z;QP_rA7aIaE8uTq<>2QgH7gsZ{^r+Mc>V<)Hp}5+ORrq`SJbZ#fRhA+272b2CHU1i z(*&}q=iB>|;<^v6IxOPI*%;cgj>G$0KFghhg^AqR*uFe6H;dp%Vnk>|ec8T#IX#jHZ(UVG`$OHqUD4*KwdL;J)J>pw~feA@muMt3hv1V~7=q zG20WuKV@S}BQ%UG$ZCttKt%)O`hm$x-~rugFo&NjcXRB>W@}QSAaX`a9X)#!(7)#; zoY}VA8%YyZSA{FgC4%lRT{~sU` ziQ|7CD{hJ(os68TEevdSgMsT+5Z9_Q$ENig`-RB;{s7jjT8-D9 zeN|)`M1!9_13fp3F1`e(|N2+3C3j5^tlYgDt4NsQJ$NPuQ1#oOhy#hnVAp`*_i=ve zkK-+VsxN}vLg;I|!;q`=7Tp1@(b1%68-p47prP-;+GC4H=@;Hd5$Rop*$_$TX{xGj zx167_6f!H?x`&# z><61sdf&51IdUGdFImKa<<$cIF;~1o$d>C|Qqc~Vf{#YFO zhg;#=S&HpXzl!FaWyqA0V3OhwtEQsyur8Vhxt1(P>PD{fnn^ueG*twI0 zrnf&q?Q5@K`iVzi+?@cAKybf*AhvCW^z*Aw`K!B8d*9=6_n#n{RU)V7l8GD%WHGRl zDcy}mGSzcbJ;Nx`Z%o2lp&Qt&HYeLhR*F&*-tr5_qOY)N-6p*HzgI-pw`d4k4_)^G zC!LIQ@3xG)$gq6uam{S=C8uBwW?PI@G;t8QQPIz5SC zkF`zvd49hi&D^!BsupG2c4Ob}5;RoS5?NQEsk%=1>g7;N(>U<^Vzh5ni@TV~r+dnI z7h(Rw!(mTM6qUikY3m})3W}BqDbo3DfCtifhaN$u^g{gm&%Z}~jdI`Fl>5Tt&$YTP z4sJWU*-m60nOnc&d-9L(M)t*vk$%ELB+i+Js#iZk)0gW|{pvET`Rrp%`{CKhUocOs z&s$n2vsdo)<8aPK2okc54HC{fmR*rqL3n4Q3=IDXT6~%s$;t_T{@|%sux`cI7*mjo z+==6mk(Y(!v{Z8aSVcc^qs0s(`I5QzHESyTtg_Z@PfZrjE*C&yE!oxLgrl(;Zqg_n zq(Rq{MqRhRivHFTNjDIQH->X?yMnMKK5AYlD2_F5?rUzONvBhY`G}KF!?BCch^XkY z6i!VG5q7KArGudj3BP#(ZoTV%y#Bw(v5Lr-%hHCfi;+R*^wV1GQ;*X7 zpM!l?5ppg&9bn}#;-+lv~v3o^GnE__3y?|bHi2{_|-zr*asi+fzdojbUdksE+vETHo?OEKjdZlSQg z&Vz}GMr2t#yYGFQ9?B_aS(cgc4)hfI7=2FUL#@3jmp8PfB%`@n@l~=`o@npiHi#Pf z2TV}Gnq~y5TQCUp&Xd)*9OBxfY#uX$jw|x5^?4xPj$1B_IPe(px zooENDk{^vsJ|b>z3c}T`f>Gq$HQl`Z^2oV`)|O$Bbtv!}(Woasqao1BjP9pn8ubRH z_8a|kIxPLQj>FJns z^xyCM17i+gV3O|;U@KS12(pu>S+ef(G-J_KvvY*y#r zfwgib@+6v93kRBlE)f8ySAR5XW(F1 zK3E~5$wLS|Ph4Sh@h!KI@N=Q)0@oWgz?o0J9db5KY4Fimx;WYgv}3W{pGJOh2InDa~^swO*Siz zxcmy7bmNVp(_3F4atwO+S|p6I=;=J-xr>zdp^D7x)$RaHBw%{mb%&Etm}o+wy>IF~ z3{=WlH2RCkhfFFOo2IOZ5e>YtxgPmhc^C?VjE1g278-b};fr9g98ReT&>_Q_)me4TsvAGn$N}2f|R$TEsZ1{0-d))+m#M zI#DIeL>h`&)+s4PnVHBsasd(dSfnQ;!uQelX#DJZRPJp?d9xey$pk#**ki>0(r)+x z9Pg#U`_gO3b$O9RzT{%N2^AJ2f@%s7mt5VsWix5Eb6_%?5z)NWGw$bz^j?AP%kuY^ zgzsK~ulqw@fGilrRmIr##2##W|6|NO>n!9Pc@Q!Vp9kaD-@^aFCrBu9qWs@4kv48a z;`|v%Ich$v<7u2BUvNB4{PU-uLFtB#@Y1v6sI4U;w<2^O`Fy{A;ROVUbPl`d;_x=Q zltkpe^iS+wcn%4*Z8TqzhM*IX>yj!q>T}YNSTq|}a^=)~yApL(`!ViUS1MiXqA+vj z%rKE}-LM4?`pxb3_<}_Rnf5jzeF9V^2g) z0`9@SD~P0z$>TrY2Y;+G1@w+2Ev0+%H3>B*$Y?o2=`hzC5{jF>u+cfQ3BIizsfmOH zC)w!@I+^_KdRX)wJ?kBoV=YD>rkq8iUx-{yMH>=YxkwdCQqn>A2Xc88lhdezaCjQn zR;s2Vb!XeC)TQXp0|43WLx3aFo!%iu;tV~RoGnJPAaVu|#3(9iwNA3A^RIvle`HUZ zB<5L?E4G&yyEv-_Q)gHv}_qJ{M)_Ao?L`SuDAj} zec?qhh%uS6_W#l$$Ku4ndcFmE~%&o~m6%T7baDTkrr@h6Z< z!b3`90D)#F^a*y+j&$m&Cy{A54Xgf3regA!9_vb=!P$&=5*=vKDOQ4ymb`(M=4M>{ zlN%M^<}k_p;Fy>V->nKiJ>Aj9L#PV2AfOKK&V7}rdE`wvmwt_u(+)@e!h=w7_(C|h z>=9*LIl{gElW)XiJ8&8bf6(5vL1@lBd^1T~3z+knAW+0ZtBsAAl z;Th6mXPtBcrX6_{(#J*u(9AQZApM3*(EP&NA`e|p766^y3Vo6t79wmzMhYgR+hC<< zierRA7hhnPvH#I0P(i{&&TKVA%h+(vc9S2%X@v29LV#_pYa z@Znn@2(tI8)z~6Wf-GtVOd}!j^k4lNW2a9?e;_d}9b*reiPClJA^9aV-Wx!6rV-w8 zGTgHR@MmzTc^SG!2?@(ckz1>j!8I1ka4ZON8TuHIu!G1v*+jyyo-6IiXz~j?@Vl zBZ|LB@Rn6##XtWIYkCS6o^t`2)Tg5GH$Q@}wgGh?e2L~Y+n~#hT_sK0Rtl8YB9*Kj zH@x(UnD^z2FXF!>tm#c=p?qBVpNBA}un_gTN|0i2lb24HkooJMAam{{rPXW~kvDg? z*!TX`>tH7rL)Eq&s3y0HQ*GUvn<$~wto*LaKll`f9dkI$784xJ4t&4rdwlr`xe|7l zv~%t7ceCA&na3ZGQ*ZqxvL<%Nzup7THC+6Ue~??^BGCqx9YMM(2}YXi-?pc;u*=B; zrH(=zu$z5-gI7elmlA<{g6%^=g?pB?bDrwdIt2Xwa1}Ww^{Xe|6mR!^o^lqAej{>K zE9bJUmtl}$Va-GRJbGH066F+)g>=HauxXFALL4vw$Rfe!g-^o`F=B4b0a1s}gmlo9 zi1yXsfc(a1kQ(~0`3(1K4wRBF+%Yr-E?tTp`s^fOnoLeiCL5zN-|c8$6vjekZN-Q| znnFvnsL3voCU3SWZKs+ltHkSVFvijn6{9*w!uz1MHgVwF-M8@5~ma*c-g7K zM9i?!e$Qx0z=t*`_Lvm&=~thAjHJ|boO$7(zt)|?Pu7iNtgDaOaWwHL z6wAW9lb$=@*1aO%-J~~T@5i6P^66I81RQh)0r8BQlI=KT_7v>h{Jq$kgWleM`vcV1 z)QE;EPBkaLtq+`|@DD!kJRE!NPmnitDh3Mqvkt)jEm=YW?Jd~;#Y)w+5IYS`CTBkn{`Ut@u=bY2%FkE<}49h5(Uslw?S9Y;m?= zRDenQuo;THxNbMFqYUz#NsuPyLM9@|5wl2L*+6fwURjslX0Kn7@cDf>U_3yYyi6uo zX;TSg(&#ZYA2@D4@Y-kn5|A7u0U@xjQ7I=nl)y!VtYp5-O@Yp)jsz^=nxbHLE) zNAMnze8>Utlvktr%}>Pf+2_8P%=T|fEhsfA`Q;zJ{-S7BGXK!SF?1o5|Mopp?kf{R zZE{eL!fq0|kF@cMV3WExAV-%hqP_Vuo7;^ve5R;**_?9Lu;M$^(_}5oMcT=S!FEWT z))PdU(t;`NW*f*=Gk)H@@ON_xjawWbR@*3q=+@xc;wA(uYY}jfphsGBfUIT#rwji2 zX0+@s!-mogaFeCTPnzQlL#{|nOAZ=QCASEFa#G~oE zU|+2g98;7>qVO1H-(`K&W1EjbT7#bmTy7qE-RVTYP*xIjV-i~jElFII%MuPUay!}+ zIg_}-Vi82n8?YapBboI^CHcqGqO><{TRgMiT{MCPf@da zBeHf^qAa1UUK??v6p;(&;PZb#(|K_$NdpT$tIWdj$o%n-aTHCV0MU2f{ukc)@f`>S zV>*uVsaL_xd?fe-9mERJy){&mQ2UAju6aQ?59wS0$hH*V*zCAO-mls?V<1|?+>Sve za(haI$m^Q=h=7JL!~F!Z!=U6K{LoD@i=*koz7L^N_&L#*6h^4X=PkT%>T z?wil!CXL*P_wTO*B|Lul?#C|ITyYw?uJoy%^6UM@v zGe)FOv3YpUA0G-oFJ>C>Pie8^g`^gER9C@M5B?pu+;&%o9jXQ%%5c5(mFLi+HnT~y z*fFia&@HcifP|_Q-{Q|TMDQ%sjnO5<-CpE;yIiPy>?LIU-&N=hBy()S z^p%vw--d`kD`y-`6Y`KnL zo1&OOZ#3fA>#oNkWJ2e_%g7ZDEku$YCCnVV2=9dE&<|g<$Bg7zdQpF!3odmoCH zo8(O{8bn4(%UW`wJZylTbiRa@I+RT(2SifGM`mq2i^x0%`du4m^gEFcg|e+SGEaqm z%UHLnGx>WU*bQH;62cA1NNSzO;_(W?Ru2nq`*~j3b#vi%l7dA92?^A7VWD88c2h zT%@M?$uwL3@T(aAyQ@SnADf45<|*kXMVK9iuV(g7>S*m*WXWkJp7+paPSuy;wB3wrM#yxcZ8c7&Rl@e59?*Mf0 z+P^)5#IsI2CL-?o zkG_VhxE$Yo{VACZd`Km?0Q<<>+7u3SkXs_EW=r18nK<*ezr}Du{+u~T8=HsvvT`Lr z?LRW~r9mVdr-LC+MxkWFR#GD92ZfQeZ+*EArgDe~cVlUkP(ZI+-nB;5UlD-yG)d?> zezs!xgK+p2YsX+~ffm>$3qr!^ar9CF9jA5J~033BkFay^;4MCjDdwZRs3o*i95 zpuQ31=U+;i{zlgI=RPrQqS+E;>N z67m-r*~SJ8;kK`B-$sT%jjVFyy3#iWk@jCb5{h+5zCeO$l1@AtY@V;#7Q|tR7Y(X5 z&KM9PA8f5WDJv`d+2wLz#DZUD?#y)Z0+P@z=r>HshwS!3`g|h|9R99t!>MdEfCQ_W z5Uh0oaz8}N^$@HV>o}M#Cn}h&E%@AJhorX09%|L+WIG z!9xQ!SM{nRb1=89l*8ts=B*Wi;OgH0QXz7_zUh-hL8Vqc zeEQvvbXibl^ohRM&GogS;K~VSoQuH*Yo71CL_YsY#X4doW;<*4p<&U9`-&S<5>WBf z5${bFbTi;$ttyxVIjGaeVJck)KuP2cN_7 z*t5bN74(u9+(}|xRULdZ`J0_0Qe6=YgQyJb7lH}HMQ)ZvvdnNjc0Y-PEDRcBQh+3K z%9T$L5%j|k66Tz;7^mHOE8e~DA9SC5kwrmelA?s_R@w0M>X~LIjv@E@{;=4LIEBM0WZxq+rlNmuiQ8OoCD^svTsd zFwOo($d1-&DG8=XEP>YZ6-3R zm)$6{8BuOEiu&r~NU=xA<+hNLAD6qid++2 zHwhWD+-7`l^@!o`vk%@8b=b|8eiRhfJ`5&tCionwo3+AeSKci$oSp$#0ENa zx5yC-D)kRNi>g1~hhPVSh`KiIU56y1?FJ|*w{9WSnQ2lgzj0cfG0rKtBkpBUyI^=i z!s4Ibf+0GMUgt z&UgnT9;9pE{ONM++qxC=&Nvlol>vCw+Kqnjpb;kQGyGu(m~%h>dmbiKa+>0#8fqfi+ZBP^6OCEJ&eyZfGIX zyt@&8HxXfgbRyXVz0W8D3UvmvI3LdWXDfl;YJq{C-zf=GV9OeVq{0FuWM{&bnnLRt zmE(uZs!`c8zJ?~WkUzBky?0Q#tpwlLN$b}u;c+ZVtuwY@8jaSv{riwfbB$SPg2;t1 zP}>AkW~$hsDR)e3B3CinW5!yGM`-wURTbE>ehp?Hv=D=Zl3hFT*7Hw=NqolSDOgzS zg}1T}We+@$?8{C^>e2JXy5_N&DE$3ZLNjk(v!&I3xLcT8+#w}vI!lTOVw_XXq@L1+ z*o0W{msOzp&VQo*$ybmIT)wIs9t>Hr9LNfh zhx(ISR3Z-ut3&K@(5a8?qf0g5hb$yaT(AJwJ^QRE+O(g>zWROpM16aPJuQt~2V;?% zn~TJZbi}&38HI)T>GLmO_jli7_1kZwbmK-i8yZDJu7wv2PTqK145UWR7!<9X%W1My z>1^OARtYU+Ubov4FmgcB;k?Pf#M}F=Qg7OGHL4Dv@(sZ?xq`;gZVezsE!pOl}8Z}l#Jt0g>0a0{_0p! z@h$)-X_2+NcA<<05~;og2@VoA$ju>A2g$mix7%P$P9#k_3vRMB?8#2Y_xnru=wXtx zkg440cA|_-v)-otU|qG;>_k(b7KvmX80T@rq@E&c=CQzL>nUC%wwM*t`|^_y293zs zl>W#)cfjxUitFS0^FKK293)#4Q1X|@iOg$6(H1}5yNq*>6_yucS`zYaz6dq%eu0|T zmxWEQwIWhoxl@UxjhiIp`dy^WI+zHf{N+6b6M791dd(gG#8yKc66YU?go)#kH?|12 zq!hSJ63NF6NNpf{N@*pU-~E)hSbc}OdFasjGgu=J?Sfqf{tjXV+&cBirh8==WJ^n5 zfjMB}!3U$Km@t2Vn7V)g)y5eEO600m{xk-mNDMblQHWedlcNz?=~);F5U(4VRxy8a zr|T|z_+ioClMi27>71ein&>=pNiZ4b^unN) zpHzrirf0z|G`6Oo8*@YHc0|@(Y$O)=r=H?9VY6AOgTH0{YPiU~U>#uX%|)8kWB1*K zhMH>eoip?oJ8WoqYAMowaTyA3y#mF5d6Y=J0o89WhnK7lSwA?5tQ<U<8c9=Y3VOm14S5FK|5zn#CpofNTVL-KU#z1T2jN35aL@tX# zQ-OrqhB_1#U_?NaS>=jrrp|xLu`_4j`!`+}1JYp^U4*9UYOE)sKJcWIh5u*Hsi)$p z>#xIg&pn6C2@_DYdlw&pe7i(0JIWx9&k;W5c4|Rh29T2~v~odeq=g6T9K9TZ`Vw4* zjf|qXsqur^_`K_!2v#?BS@_VAR%0@l;PH8s!gwt$qMBPYEK!~JoGurt*K8E^yX)Z+ z_lF17X@+cU@RuW%{N>~Hp_&I0nYYtnpE(i9iw;C`q7gfPcROqu`Dktl;PeOo4ijnL zQq(2xx#JP+CIM}k-HCdAAnXYg1!Vj>6g0QMCi2sDA^?s_Z%nolRqs~w;PoaG62g7d zWt7#F!YupA9NYf+8tW%ZS5Oa^E{FhWv|Bf*3s5jJ@|fBed=bxBUbqcRvMp>3%eRu|^cS$-ChPu&F6w=9~;ny!$4UEd3b9x88(@ z?vt6Wm;K2haQ;1a73)rrTW9dfeuP5G_`i_$%+H5WJQ=-zgE+RrNLsZ|4U}}#G1*6M zrt4^uIhigfo`<%O<9^Z52?ksnXAC%ztJU7PGun+9Fi7MJi4=utagU%}a-kZHjlbMU zQum5=oIsBgrXPlhFTY0S2_p(;&qZ}{G2XrRANc0wmq|k}#>QnI3qLw{xBA7q@1pFx z)yUsc58Z2@i(ScMQh7r?1#&B?9rv z>k)K#yM5jky+Y&+Ze`lGZbWi+cK9<7rNZa!CC!}&YC1RW7G+LIfxfx|y7VMuE?x{X z5x6-&3&xC;ufzTCGHTa!X9CDk^T zBwtrZtWmIFzKDFztPIdHGRaSyAR^TnJ`z0kmh3Jdmk^Jt};8)4ij$06g8IoPt~J+v(QF1#PMRInzSBlWOC zTO5QU;~Cs7JQP&tr6p{g>20ls$i9v0u_WOh5CV!?KR&>Pk2*Mp;P9aq+cLB<;MzE2 zFf?+;ZBVrG0qcxri;5m@adsB*IeZ{F^SFK^At0D&Xg(m z*~>2ppLkM61~z>B5f)v13HXKQwwhDs&IhUL;a#y$R#ae%WojdzqkmV`kdoe|1kyUk zrU>(YEQq2sRn5YBAbiZ|9(aATLDBH}vYk!s%l`_EoXz-j-((sw7ykQCu(b6#(m=WO z=3B|+o{aR94s8|9>~_2H;U^zs#flYhu}{CQQdH>MzhPbYxS?}_IWq3EHdjc5U*I5O zCvB`zc8IJS-e5l&RZT=1*|`OnKC=jQ%f1$xwM|EU;}cE_AG>n%Rs_`a!WuH?*T8{n zBKt8!=z6tRc_wN4TTRMw%S%fzFp#lp>t?+5!qZ`{EASg}xT}2-nset~?7s8AMCKQx z@b_1v@`d+N_udx>(sfn8@d+ANZ9v}j7rjQaj-b8@1Vj|cB)!GOj4qo zt>#waL;kE;;m^6#rnTCX>#fTt&4*l4DT1%03AwRJ9Lj!&3W;;{w>~Ec`a~<@sT+Y7 zGAnXUxVwva@UcM05h+(K%5zm;UPhLV){QbuWNPPbXP#z7cy!aC7>mfQsVSm_Yc%TX z>+$eoWI8S_jm~lfqDgsclsf;l@K`=5GCoThhQHH!c65CRK} zF!_>mU{Yfm%$aG(z4{y^961{s@4O54ps5w%^#xkwkdIncG;kmgXuQ!wd=XJQOlB`klsLl8ON(w4e9Xy_Dts~#8(ZJaS!8aZP?`;{kW zWrqhnw`b&3ck5JWA3FxP;v~@s1xe&n&FbFmmZp)(oTtt(1Zt)8o5Ut`Lr1}Ebe@5I zWd3jL`7*%_U|ojrJcLU0`sNK ziM199^W7F5E`)eXXYyl&5WRQ&Z`Ecnr-Fb8zdZz?1I zeHQtLU8oE;g$bQ~xH|$>q@5>|=9myZzZQ{#*U!=%-Ln@T{TCX^)xfaHI-J>ThrN?N z<6JDI__l|UdBKTDJ7FPgQzxMG?@xd+k7d-5+f75KD5mKF3=#&7$W^WUcKUc91_0?}^TMCq z-VtOfVw0_x%%|q~FTRwT0HpSFx?RiQRm>AZ6kWd|mwe%NbDWjPA6V~1pt1>4Z-frB z0fxL3k>f22z7SE1X?ozyWVc&!&vWL^)pKvqeCTYNf1&b6Yca@4-p>w(E+Mt`BPsS%r2e;fW@GRS|Pa`;@7f4>Gg zgAw^hEP~NuM(VK#i;8%SE7zlC^=46{zNhf0>0o?6Z7OklRCBwr4~J%>h-**;9VTwY z5}@=~*QF(5{w+5mX<}<(JxwhF!(_j2+cs$E5d1>i#+-&h!eDCTOy>6!nX|8aHu@O} zX^}!Ht`SymUE+SlxfvKt$UFCApdoU?NxRf%CW^GOm}Yc#C(r=y-`5~2v-Q~RNX)3q zNKo3DMjgjyiKHVr8{7NHIglzklAR;hJ@ov!6zR zM#cZ$A=CNSqNq&HrHher)Is2o$;l_3fR%r}52Y1lXp+n*Ad)w5e{>r5^T>yuMp|ic zppJ~`3gI*bog~C0KxWB->ra#Kxj%_KF);~6GY`OyjqAnt?M5Hwl0UgKjXVsx9}OhH za83EK*Ij^|E6;%G;3=qj{0TJguM)oLKtnSsiSTRQ`3%K%+mJVRHVhW!n)rFMPn#g7 zfa@eUca);(Yw{c3bCsE=(Oxpw>{aE_FG@_s-uaoIB%L<}mCtGJn_Ptngv zh$_?C$e=pc4^B5y`kgtX0M?s5VFUH4H{a3;iML1I zjG4IVu}4w1aUx784N>}H=xH>&d zx676p4w!fpsnGcZl>h&)y0IoUXWW46dLz9Ms5(W;$6B zgt)34Yv+BDdKQ8xvudy)sW2O3=g-B2BaeVNDG^Qo`7c^FY!d6Rd!cI88ti=jO?c`X zV2>s#*7@2%}2JRD{Y>iFMTwT@aQOd%){c0h#9t?~^3nzjYlN7h-c1lvD zDT>z-yNC>zX$=Qj>Li59e?kpIWWS|eowv>CMw3p_)VPlN(N|wB_QB7qi+tj)7NtMA ziA?%jB2s6F_XZO%_|U za6$f0dgftZ9Fhe+I2ykC^Jb!{(!Yj?TQs3oY>(dD)*p)D;U z6;OE|SR)rDVEZ8TjC+z>3UZKi@GOj*J`T3AIjzP#1C1AcvJh2$w;m;Le~6}?B|=Ea zIqFbk&zpkpo_-RcvM}XawrE5i8=P+T76utZK_h2eLDL%aW8j;OB+$@9>GC+?ayv&( znN}{*`3-5rM;w5GhFsT-z>A+@K){jnq=mDOI%Y5%2aox=&v~Qphxe*Qs?9`Ncq(+} zj$aXrQ6UdLQcIi;XdLVoIuozj{+0cc?3d;F%|W*swJc-1i8VFl+K#yNGEv|8i)Ww3 zj<3FktDzx$EY{`?G*FKjKOU10U4#QpH~~eA7Qxic{3+q!3ogL)V~)X#zx@qXzxk#h zjf#dk{QJ>|am&wcf{lcN`ju-@@z@*Te%*YG4AH7nCNghCIZb1w6vcc_E&%SnmP}^$ zYGX(o0mfwKV8B2Jyz<6h;xE6r9(7ff_@3*&)2&_P?jD)9a5cOAP5AhZyHGf1F6LhR zL*!n52GSQF2FL4fBKY+hn1T^$#Zy{=YMx$S1~ZXl^1=gzncYHG4JlN5mp*W*+=Lku z#e`E17uyC%(DUrCg?mpqq|!YIRF;z|+W|{8J*zHB6o_HxiU@p*dURW*7)H$teHZSf z&KOO=S4!qwLnO8Ai)Ws}d-va`*8OTdkPFj1`Ti@n zZ5PvLPdn+wO0>6|sz3X;j&!&GOiL`AF2%P_uE8#o80S(K(McoHqwr+(<@a)}> zs=Z2V2$QIN<|HK0WS=z&dP`KCfchLUx!Wf3l#etV0#5b}1r7$CZtPw8HSolf$UWs~ zWET{Q^0;gr;ethCHzd3YVkQAjXC`-#%?e|BvLI|2l>$HU)p%L_U%hKOEiO}HD#A2$Iv-F6r5|KqLjkeRr|=);RiEjY2ohU|b+ zM?T*9uvyK7e&+NRn0 zs_TV0o+pN-Fc0RuF-TfSCU_!wQ+B%g{I))qkhr0@S? zzrIbU)Z=fH*Cdb6IbTq5^r>>Edf))Zv)6#2SC{0Y} z7R4pL-a_712LIz9(MaCEL4%UbNM>{z0J(`rtV|xDvffjS^EDRB$e_T{JTZv@xqrKXfjRzwBHT z&6^3mP9JVr+Ei1A4J*IHHZuRN{p2eId_FNqw^UW*jX(VftCudt)lWQuw7h65jfB&G zbt`I0O7QLLuZ#7+vbr(NV}dzOb_#r(D2Lru(+-@C!bwvw z7#KI92)EpMFaCMwZ_(V?fF@lKuMn9Z=rLn~%S={;*xR)PJz=4Q1J0~bx!a9?C%j*M zhuzk(8SQYg&rpx27F5mX*Vrk_>xhRN!iKdDQT;8KWo=t>K9drvzJyH~9ezrrq#N&@*qm0>@u^jz~|7dlH12@(Qf} zcqQI@{3Q}59O3;Xk!E+z<4<71K?k+ks;;~Ye?9&LI8?!wi^d${YOj@Z`WiRaU|%xl zzH_CwB+^{JPmoY-i3m^0X=zAEP8HqYSmS4M;)w+hhMv2uiSNohHWTxDyuCq`xs}z< zapXqP>BS_4wo`9V$hyGWhq}!1@z~NJ?m=Y*zWVfo@J$xiACz!_TPe4qmqYdq1zZHD zIp`ES=O!Y#lHz{jJ6#f}6T}|rfF{9`m4=kL(~)@KR1t8=&6@^22@tj^1+b;2ir>^-Rf|0zEywn+zl6Eg zrKY>JegRe|$k?MAob0sSJ=?ZI)5!&%B*pVe3?U39(|QOr;`LA98`l$O@XPG>jNtmg zEV-A}LV9)?`OI^b%4|gJuy!-Q*XKvDybkjAa>!q9L9n!@UteQk-cGg(?N~C#DFqt{ zAW+$iV7&uUZ)6GfH)fHUI@R8Df4ZcY)C}IH}{^g~7`4374OX z6E8atot^|CBQFOhkk)?4X~*LA2cE#HB}$F_rphYZcka2khBWh;#~l~mDlKm;j=t(D zyz|$;itiiE9vnnOF2n`(g4}XI?uPy@G<~?MSBg z>#)WEyxv;0R8*lQ(1dhd0_s2b3LPR!;u9Y^&p*Ki%lJGI=*DJz+vEaRCX6LvKzZl= zEmh5Ugp6M8~2ZLBwrf&6qUg*ePXXa&B-6Q@ZR8^x|A-5G75YHU4u-hH>w^jt(*HHH8({ajl;C?e^-YLzkZ zdvK()-hlOqIy4z07KG3hD2QBB>*djCyROm)U?6Cs^Vn_wJMPn#xS8Y=uivYcyH12P=8N}z%S>)&mdWiiWbgw%VUittc6$8xpGil zKcghYfo&;^*}xN=ui3rjDj{FFJw z-dG7d>BkqqmS{)MLHDhq9{EJnKfdW2{QIs4;3j`+Gnv_+`RPybvsYe$!E6@ilQ(S| z5&2HBRlVdT5|3!g9MHCn2z-xKhEpd+Eg^4BQ8Esgnu`8;XhLskd+j~;{ODysECYJS z$3h3|E6*MK;f0UB4=*=#C2nt{nChB~#eBWqL?oXFyL}AI4Rqg29l}x;aJtDi?h&P6 zIrS~j?2I(viGhG{jku$Z*NV!+-(w}}@$H%uw9-nY)hI`;w}mw+F>Fo^ z2K;QNVhxpyZ6;Z##H>;8H&UN)%_>ypPKf+O>irelL${{ zduK5bMP#@Zdrtgg^%aurYPuQS=UBa)S)1dwn0}6GX7jEo3AzxG(@0sow^`NBWE^(IZGoPJJM%TrR&3<0ntVxCw>WySrE%WyxRv8Yc3ls><-X4Ro89r4Rua!n+Hf zmyzz_Kt?Q66D!8fHIZE;(+4sn%bhUBFpn)`F zCU9Lchrz}UW(zu0VZ+-?VS_dPoK)yjtbo-2q{AK1LPv2m#O`Ehu_vHKC2|*;NJCW3 zzTe7fkMf1I`-2uAjUL%=nZ(IN@8dX#D3^)f@5g<&{|yal`B=7q9B|T!p`)X0)8_EH zwZ;f}D@&EYyrRNn6pc@U#XQvI{=R|EKw7v+M;w|0i%bmc%{7XNp>qUbtR`aL<%U$| zLOm%d{!X;@5XG~Q=B9U(Q_adv%C8@~YFlawF8$ZPFzdMEdspswcthlj4`z$fu3*T& znW~AMtG?aTc9|tD3;Bz$z@FFs*`<9&4@51FCX94&X~#fWJ%Y|&wD0UK*!9jSWvqqA zF;B{5CE(JkTw=915Ps+cuEn0(ClTpg1^dXuu^08RQ?No&zp}*L&LWLPYU@2hgW_%N zDT$agJHGi+<~EdWpCEsUo@FJ+n71S=Ml<3s=~S`Qtuxw?J5bzWw+ zMN%JwPzs+gs_G)bOV0Rwp;fbwTlV>(vznnxO%OW>)bXI)D3*tEhefwLA|H`?(54PJ zqpr3VA20bJd~VZ^IvRO1W{B^#drR@goqr17s;n_qq^Fq0d1aITJ0sN+X#z6RA%fZT zYB1Yyz23-q>&DRgMw5O)I{8URP~7iEU{@2QQn#?ya0k8;n_dvOUux5KmahM@fBh2+ z&N>?!gh_qK<&4L|upn~P#Lks;Vw%{eUiBxez3WHt)Kzr2AG5`%=EQQ|ZU7#i2NqLz zTOST>$N?h9iUy_o7X}Bc(dp9@l=h!-{HdZodU?Hw#_g>zrL&u%&r4HExefx%YQ1$P z*t&iDVy~n6z4=N%duJv2nYn_Q6b^D@B$D~vx4k@U8V}UBz`w6nsXFJ2M7fLgIqt#b z2_LuZ9dtQecQCFj+!|^>n{wLRoYGhS=cH_|>{Rnk?OT?DE{k#Lx$+BRIv$v58 z*1oxm-0&svPLRsNAWhSgk?zVu!`=q$+2_E%8n;@vKuM{yr)P*;&{AEEjURrb5qZR< zUW{RYVdM1b$i!~2CZOozUt{Bg9S69xiBM0(;`b{9B{xnPNkq=M;r_C^NDuD8fXxVF zPW+TIS=2}8sA{D*bFWC8`-Nwcz>twRsFsyvwX+`Q;YSCLMZ=a9DGK8wQuei1ppl!I zDRPv*Ua=CzJNMwQV~;@o_<~j>&c$0=njM0G5)zaYwN^n)w7jgO6fZvh9Lo2Wg_liA z$bcy^0k7S02R?iJ3HaPfo-zMKb7rI=(Hb)Mj}j7RVbf?7{_qhGR$RDBqZ~w1ei9bt zC&EouoP8B8lvOz~=ZDwem}{@ah7Uf#GdKJUYu|eh4HXqg$HdUyZvlm#a1yn8=myN}1N-?*kHrGwK|o4>$UvSVd330cKgGfv4Hy zq?F0RS0CKpC{oLM4UvPMDss^W8_5Z3HDQT^-5N#n5+;dgBt??TrsTZ(UCGil#b_#j& zAOo3A-(&NCe~*T3YX&!Mbzm`MYpHjJVVM|8H~MDMI*z1|bJ{L5r)77Tl4h}xmZBD- zY#fe6E-U{8YE@JEAiQIuuuHN<t|JLn;NzuiVWaD`s!reRp!O(tnOu&)upCfDE$PTZv|FAcf`Q_RI7 ze?6y^Noq=2Z_bkQ!G*?eGhwKLe+RqOj@m{gLOfP3IoCE9>(buG;Rjh%B;#oGQDH`hqJ;-U3SwW62@)Lpin00O-@%-kft(}G z#MommfWbcEtT|jUX~@=6?+nA1$kleIoa1+2tmWg+xdDwk*1=P^ztwzWRFtY?nDrzV zmCs7+M9%di`lAO2ds^{JxQ9GF6%a@x9Uy>zwee zgN45UY0ruf*uU57sjortTaRJir>`ONkdu&q!i7ZcnHT}!n|IT2G^vL$ti@Hj@$4&) z>o1>m;rH|BWBKEc!Je9makFP5qi`IYjZGc)6M%XS>z6IV3qSw4Qo5C9Wlk86Q*ZqR z9QF0#16j-?DfNnkKfNACi&+tDMmmXe8mCY3g}07K?|*ok>QVOL3;6ohGqC%$f5F#W zk70~qmueOZBcXV5+?2Ff{&G`PP?pm*#EG0AG45DaR!7?SAe33EWXA9ZTW=IUxK2L`a>BtWWkDiw*1|EU;OBnt zyZ=MQ%B9FV>TKknd?|FsVfRe!!7xiTi-loNFj10#>T2yu9)ydDbcEC$bArvuK0f;`h|xS_c(XH`LwOOdwx)a1c8f#)7x84tw4vlly0HkxTP>WH02VJj240HY`)kVqrwIGol}2ZAbp{ z3FI#i<(FGU)VeZ!xjnr%1NRH)h4oiAi;iW|K)W&7tWAD!eQNtW?a+M-HoFk0Xd>T) zAAJEXt!gMphh#Pm8(tBEYN)FmnKmGpz-H9icJSk!Zu6^biWEU01Jf}UY*Wi&$E)J7;N=`0*{P?3t zNKeOq7GD}}jAFMLFmYTWhBJvvY%Lm1!EB_{1 zMBMPqv&f%0Gv;Y+{p@oxr(Z+It`U#4JtYO#{_h!#oi!6L{_<8-?cSx<)duDtkRejj zh9x9P)xt-I8C@x_>LX2@weaEbj?``V65rjn2KlF4j&WpeSA?x0b?za*_yZUr7-*I54|Lu$~Ab>y?951K~ZLv^REZm7p@}{x;`g4u8ER00g+PH(l>4hk;ay6gKk)) zm8oE1h6I>EDcuKW?9@7|!K{`)mEowX6GdMltxFY+Tu**OIb7m~>;4-=;F6mLy%lR# zU6b*vBxlB z!F-ggTaVXozfB==S~oGtgafCiV|e+-m7H)rxf^uDtWS84Aemvcllw~B13sTSY4KKmtPcAQi&5!*_( zV|&RqlvkCbyk;LhTJ@1wCwIyeT=&BBNFSRYu}!qPhWa5CW*6aV)c?G zqUEIQS0b3L);-uM8vB z*kjQ$2=&&5w!6Op!FneK3Ou0eEGFo4$&7C6Knv$+`Pvp$Bj^JV!|Br#m4LS40v2YP zJtBW!>f(LSk@{#e+0dk>G&<|r2fW!*BJD!k2Ai=d{gGE6#*Xq`m_g6wHBUZ4e)U)} z3qgGO{PTG6m%mg7efnLwTCaYR_&^NHc{6K@V3=C!y%07HnxHAh+zZwH5tnf?x)Nrk%-W7~=rxQEF_rzLY zO-{zmZ@htooGc6^WG`vEyQ>D2#6_fUMj{Lo$HXRaj+S?N;onsiPN(V<7|E1AZj9(t zF5cN;pk&CR08c#vduzK);vwWDsy)Z)em2*&PeC)=Bi0D7&l_I1vAGEkz4{P#mhZ&T zKl%}_f9|=MB+hM4mp}0&p1b*$Fo`E+WfO_Nim^oEO!DvCdk?;Q{Y_=pG!>0c!jwrY zKn(GlFUf+u4HnDjA#oDA0;GkHY!a76mVv=y4(IxpfAl;`mp+LB?D)hSa0^B-Myy88 zP=nu&fl@4HeB0&e`T0n{?qcAT&xEhKzrkr+f$|0nXj?!wX^%}4x!SRcW^i?;KxHFj z7A*Scw1oDbWK&YvhKWyBMCLasSp!OBe)o}SPYZ{U)t8mGTOJ+!=J6`QgHDedkG%dL zl-KUV8Nd4-P9$@A%=4o`|HFU(3vd7VFX4G9**UoJjn|PiagreMj~{v%@7;TEIOr}X z%Z}MIQZckiTvj@i8O=g#8x0t$g|zbsggLzA8sVS_!t^Xhp-^U zZWp~#1hkD7gtYLH-Qv6RR6)M{ozLBkguV;L304$h0z@ zTk&ioENSq1W=|f;g zRj)~$kzk5w+|_%E+bs{7%lSAB%?=n#%jXCaf$ja$2p8WNY4E@j+bek7AP^R}LR z;rcH0fDe!`yX(2X^;hs)C_;TLMgc~RD6Cd~BlR19jJd)g)0MwpZ9!il)R%j}I+n4C zGBYuLy>b!6VPxozC<@p;es$@XU@bgo_HM@@F=XHPti&>7~`#+@S=85l| z=Jxot*T6?6dS1g~HQ>mDvthRmy=ZS9uthZbC@QVW2$|7kQD1fBx(}q#Z`+MApkdn@ zn!ZEo)CK56gd)^OOy#!DFnVlS=sc2Lka;8diZ_>_H{gJ&Ao-mKG@vcn3Imb2s8=2f z-14xZ338*-@vYB>6QdrwoMh;ehEKIH+2a=hZL+Ix%it!N6QI)>5DW(3ZE=u!y#a|C z8R6xosGj7x)2HK>x0b+?V2`;kS93F7`qi)S%`2}UR1I$ItXZPgdRm@B;?*T3c<}rS z&{$C+mUA(gL&=<;oM^&O0}t-{P=~V7;R;uJCU||q0;XVOUU($mzXx<8$tZjO86xue z=%f3?B>wbBj!=(w}`&s?K`9mQE=b%dIt$vP2zK3536=EttXo7Xe6IE z-|436>Q+P^-IF{aJtHoObI7`>{}|-=tT~G+Y@)C^Nvu0;JO2@09Mli-_Gg*BXMqWVwjXEI+evDaiMvVP{H}o zeNN(;$uNx17&au%_rh0FqZD@u_RrvIB*IFJYCl@FYgen~CQDSXTVrF)eKb^5;{LPF z!j32spMT~V_~{ETg-N`&tP~HNdk*SLOT~BoJ?0;nj{Kb1g27;c=P zE!^V~C00i^iE~<+9!9gN*KQIH0IXa6Df$3Brk{gRh*3x63^j_8)6!y-IS)LiFC<%O z7Y9bJ%2Zw_BGaXTczIb0&QF6OKaMu6mKF8yt`arU`?M(xw>d4$5N7;g0k%kxi-Ye4 z9A5M%_&#UY(!gK zv15DdWn;!5^gAj|P9i8-zaIZ3(yl8jQ-be^|4zE`CY(-w^3Y&ezi%HNp>@hPZVYcX zYg!7XOz5Wds9&HypIp?%IEplIgnEVhMF8cXw^`1S*;# zHw<9$ohXd4r-eV)?rm*aw}2CD_<+;InvygU-G z!@+M)UULn0eEFsL&QC?rgd`j=Emf(&GiZ>-pe~Ak81$n`3l|j;eN5o|Z6sf}EPUX4 zQK7B>uCuYS0_c8wUEbh|(UL3P5k@_cGw4BhO3g99FXjqF<}#7_vlm_tgD(hs(1Zlp zgcM66O-aI>YBgGj^Nga{gYvw$ejtSoMT4#+DQ0RO0A;mJX3Rh}UWZdU@{*xXY!itb zdfwS8P)k~PRdb&Qa0&Bn$do=D0@_#$cX$x2Ah&{h@M>4*Bt>fXJ8Np;^Lk)3DgJHF zBNvs{=y&saJa~_M-|yddzaVjb7MR3;aL+wB^nysMM^{r5p1JX7*u0#Bft2T@XnZ1O zPags#t{Z(h;ffaS7rEghKaWm^o`f{1g9>eZg{G!%o7O|Q;!i_^M&u!MRxm~)^ZL`fJvkU?H;S6eV7kV6wt&Fp2pF zdRYuQgXm{%q|YXU5ysR+m~&EvzfsalqJf7LWbt1ojwm}x3*T2SNJ|Qzi`?2tAfac0 zZX}6_!ZI1dBcP47BkmU-tQ{OJJQ``%B=Ng?$W-Vjg03yui|nEzvCKe(&OSya0sdXy z{>xv(zm6?A6+eFbF-$w+i15C=E*BoUTB_xf7)?l?U*~0gXRW{L=*y7wD8e2 ze6TM(;Ppc(%{IbGoJ%dU7Oo!{A->7!MmO$hh{SJ)1_6!8qo5Xy;g2!NoGWp0$22B$ zCy{xmBA9smSW=e*aC)3#>JDT@S&w>*m4Sk#VIKII=&eafu-g-1HCY7d8(jeyiPQ}` zJ&clptnT!gzmqV)0tNjm{_1tgU!$b##~|^fY{$#YBvh~^fhRM!k0d{*F)t0W%}fJV zP?5xSh%|Z;l6fcxTWWm~l6p7VtgFn6T3wD@V`Mi`LP!jYM!Xv*yZjpjR zJT;gryj+g@CPl7>&MAp3HPtOj8`E9ieiJ5g{yjMz%j@???O#UvxI$b_B%Xi3f#Ksd zR#)M%AO9FTiNr&9eB4+Y4xTdxgGu6@)zBV^VE?zUngj-@LgS!9R`dQ%1NNAC{XVpK zqQ;7jp^r?@O*Hf$vdPNXnp@9Spt~|y<1y?^~f18euVJ3@%Sf2$Dbst895>Uf``Mkt3T1OmL z)ev|+ozoAQv~b~uQ09tb#JqNPL&%YVI1nW5ioWwt?F%ZVZGXT|^MhiUFX$H&&*RBQ z+L)gNHL*Du@X~xA+^l``d|r?C)#Q!@vQ_Tf89pXo=Zxcy!B*CEIZgWDrHyLkERsF4@q5}7waR#dP>=U0eGp&!$tSgX39-Lm) z!bcOtd%!7W0e%lgy6_?kfqlRW_ek8%*Nd8lCgc>F(8=?yk$49fJ@&C4fXJMK-)=&` zARMtK?CP@0HXb5)pUVk1k-5+9qR&M1KGOK;foIYWkQvHHLIHngK|lxtBmjucO6uej zU6x#8Up#pov_BRcXuZ%joX5;{paXudGH40S!`Dhf51pqR^|_rup$6SSCDo92JW?O5 zRv`$I6gIO*4CSh@A?|~WwEP0xv1(O2EvKob8c7)$QQHAETs!@|^H5V<9KL^3CM9F$ zloVl+7+8!>Gdd%vz6)Iy0EahZ@f)+SHqcoIe7J3U%HT02;fMcv3&}YJhO&Cyew$AJ*p7F z)&-9cG(OR4g?d0G+ZoViJs2D+ysO_y=j#d@SDn4=cYw=J*L6o@2?nwfOgi7omlG;~_W4^vNlhH6;}T z{hA852fI8*QB^jE(kt9I;=7cEAtBPpX23yir){q*iYGp%<5et=ZM zxEv!6N;+J$#${49M+^EEy)juwo74vqJw0b8f-w^(pk~)@A*}3Ky*e(D^Ru=7gAee; zwb#NY%C;&bK9dN1#^h8CELaOSDh*CX5%@QdLt6NVwkJivdH;iHZE=v$Ul%YDiNCIq zcppF`@-9Fnb53;Z(9FKb>eS`nC9MOG(Aw zHgAd=Jjqqy^W&vo{~9Zwc_#dP7!48*U66(BjDc%K%JpeRV@|lpV(_tRC!~dsbjV@% z5C&0LbCS!gMoPru+aK?Y#I?Y-Za^F5yNS-ooQuWWclOyR+pq!M+Ams@zSL%(l3Fe7 z;G#m9$!ry5ZzO*$`(;h!(>0jMcWblKcbZ4b*>`KA7ne(evH*~jl_h++2J(v;Nmww_ z`n)~A+(z1-{i3{#BUnTJb4e*h7r(fSCMd)NN1y+0-dxd4gYVHzufLATixvqjyk>7H z9>4l3>|LW&mgL{pYS!VXh1p0-G-E&@DSg66WiVT-!Y-o#>%n|qTbwRbOG!BQ zzSn3>N{+XhM&dnyHVXFuosl`?h5x%5>)(C_K5qa%Kj$dR!tAa@b@!jKIJ!JZTj2m` zn>il6KoSGGD7(o4T_&>-2-tdHG$~dD4j5zMz)J1{Gg%JAG8Q5%ia@~YiN*@5K*00# zMpIZ&5QB*b7}G03W@-}#y-^9c5h*aC&jy8Hlw5Y5F!@S4CAU2kMAoPGEnGHNF?ow> zalwG1x%rj9Z2tCflMHndfq_H{K93s#?m=vG4f{3!~rLqfZgAH zhuzN+S0-6x{7nb?Cg=rb_{1<8lz z`Dq<5nfyGo%;TZS%f(2DOah_2>5!&O#4`xBwqpqjk@>CHLkIJsg$$9W93pGIA>4>V zuh$9k7J)fj0LGvcqv7RxgE72cwj@L!hXsMo1}+gzABc3V3kHK?9z#Uf2bG9=9{l~H zs#ied*NX^zwNQ`PhNkwyQu})%$GC3B#BqtDpSWQFBE&^BdPp-HW#HeE&FJ!ID9$Dz zi>w3vAa|o<0eE*=1ty+;6&79jiw;+XM&dn&M&!MKO6Gq+2luh~?Z;63)}!dc-s0>= z%~X~l$UYE^B7Oeu4~oxjk3#-l5)72(%6d#n97iQA0=$o)EK0AkQo_08Jm1fjf}mQ7 zj{ecLA?eP}uxHmbdck+ZV$tKkX(=ci%Rz1Ze1BNzV{1o0wV)i*;L^!npDMJC9xZ$* z6!CGoJlI-Xia8hFgu^-~@tf({d;l7H1Z{-vC5X%~N4yrODk@ek#nvb81cqFNi3rKE z#lXuh0H30HGSRbuz@*P5rg;+Dsp=x&DI`<`#qyvsFQ5n=L0J(Tgg=sn24Sj(5E{bU ztAa_$-4H%2Nf9cfPR@Ct(W>~1q&O%xn3@ictgc%nfot8^0H&`>Ijx^x^0m{)}0RFX(u6 zr4{MZ(9mOOMBWD=BAQKqKA|aY;%`go4s86_FX67)hoO&n`Z&<>BhxNCuigGa(eDbb@1fKu4FYhFXmZASDcG8z)4ZTd}^$pAZTToPK=Af zq%X|VlK9Sb-NOp56p25Ge~$)G2$7UH0{tlK6VBk@n&TDZK5p$h)S)xzM2yK`{@#sE z4(uo`hdDJHXW#VFXVH7L0vdV+jmY~5GX`uQxkNFJtVX>1=vN z*FrqAO(XcQ%t|ek&TbeGd&9`VyQIE{eJga)k0=K$KVY`bM1=&c8Wlm<*OF z-A{s32@!ZjZN0Fnjhnj&XZ_`wj?&8*yJNW2&t`UD!0_c2s5f1Rc|9j({(AUF*g zI)Mmo(nB(gzMSw-dZ5VHA7#)P^)MJsAxG1I!b?I^S!E3>YU)LN3|j>bI{#W6bK{>n z+Kf+h4HOb@fQCMUM&$j3t~6UI`}jrdeBpkKs%RVyeF(K$muNpZ`hwXwijq6{jh4DD z3S<$pAu1gBwWK2-sWM%diq6a>z_!=t+nvOoOnyPobWs7=ce z?`LR4-p`}*p)SPsH|;3lf%_!sf27I@3V-+I|*vja>NG!8j%kG)bup=n~(2kJq+}| z#$C^nn1W-;AKrx`FHGWEWcmO>Bk}=x5eH3cpk@Bje zPz#4zk*^vOZ zR@K#ufVHaHhH%BfS2xNLsJV8cq5ux9HKc<_t34VbPi@aTl0qx z9yB5!WT<}gKhks~I{7`=)L!<{i_kEVpbX+d3m=7j!WoJd?iW4aN8gYXD(chAzTxy3 zH4~_r`KDf|`e2Abc`Q{AvnRA+&76>;Ipa!#z z!UiV{QC`*OAC-k&Lg=w6oha1n_lZEYrWPj}$nWj*_qoZ9OVm_IZ}G`Y2ix8vTj7B(@ z=Zp7ifpEhNI<>Uw=+(k~A}W2hdgKi*0UC78l5@e zfZCg zCX#L>-*$`31s9QaeUqbAGm^eJCSXfS!=xh?W8A#MFy+WoVK7_KO@vyHo})#j4_#

Hu5D;l)Be}dPlQx^j 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 IM6N<$g8l4)VgLXD literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/Contents.json b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/Contents.json new file mode 100644 index 0000000..165ea0b --- /dev/null +++ b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "uparrow.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "uparrow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "uparrow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fd7ccab0abb5532d8145f911b66ca1c87dc057eb GIT binary patch literal 434 zcmV;j0ZsmiP)Px$Y)M2xR5(wilfP@iKorMcTK|EJN|q8Vwt*taSP+L`NwJOwDu`33{5Aatf`gE; zQ^ZWMq}3|D5GaCwL6R<+x}`t3BNt8^YfBGqd!Nre-uE2`|2*6t{r~_zvs+mDlK{gX z8HMYx=-b&PI0S(AMx$}GUaw!{IDP{FR+x*51SJ4SHBCFUZ5ypts|QJvF0c>)a6Rpc zNVWwm{Fo%koagzoAP8RS^}3e98xmGPU{zI59LHHiQ8cYoDs5fYMa#0DeczwSvfSR5 zP(cn)CX=Ty45xx1Tmb-?#b7X~nx?rdl3+m*++n7VhnM#I{o~a3)O5kORnpttl&2=_2gSg1%H95gfRPl cPx&I!Q!9R9Hvtmd{QaQ543{ow-9$qAT}AnP4>04KeAWFVF-DMKKs7nkX6yi~0cF zo76O>RYc0B21rID#&_@mY7vwU82V?`P1A)+l*=@C!ks9hGlOYN6DOGscjlho_nq&a z0l_0*=#lHg6TpA%0EMTw(zx4-Q@akZ!mKC<0QGhV+5uq2xLhvxW_fuzn@*>50KfwP zF$-Z9fEK5gbH!pY=5#t20N`YNeB86UyDPT?VFo}eUM`n6`}+Fks?{pN81oq8!qn81 zH9X0BU-f&;wv;=VV#lq{`3E&cJ4~eMuw| zql=4+-~E0+zrDTvzFx1ts@Lm)F+Q1?nDFlG>=cbSaUTHdIhJL4Lli~Yb87q1`ue&% z8jXHy6rjgXxxBpm002>{SP+E#^z^hhl}eTLAnpQS%2BCQ+H^P^q4V=|=1m?3xA#8f&H18xsqZr<2q6^W-b`EvP}A;mx%ejKNAY-kG#n1MQr-%J z{-!#?ah&P|#yH;y=B-RH08M$NQu%1N+vi!&W3kw1Bog_d7p7|@H=H1Zu+wooIXUT- zB-lstT literal 0 HcmV?d00001 diff --git a/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow@3x.png b/WOKA/Assets/Assets.xcassets/Menu/SideMenu/SupportUpArrow.imageset/uparrow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0e326edb01ccbbcbf0e7a03752bb98db284d9d71 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^h9Jzr1|*B;ILZJi#^NA%Cx&(BWL^T<)t)YnAsNnZ zZ#>LBCco*_4(@1u`W#uM#k2P+KDLka2^8D+fyhinLhc6kqP88X3&e_= zW-u>cD{?u*8Nih(P|PyL;mVnLu1~CMBNNXuK9Z>nyc#?ENRW$}B$I4P+yMurm-_E! zuc}*ifA@Qrraj8)hFlkzJ?Ga;9pGfDbq=#Nt`4|5KksjMy85-W38l=9Z + +//! Project version number for DropDown. +FOUNDATION_EXPORT double DropDownVersionNumber; + +//! Project version string for DropDown. +FOUNDATION_EXPORT const unsigned char DropDownVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/WOKA/Helpers/DropDown/helpers/DPDConstants.swift b/WOKA/Helpers/DropDown/helpers/DPDConstants.swift new file mode 100644 index 0000000..52047be --- /dev/null +++ b/WOKA/Helpers/DropDown/helpers/DPDConstants.swift @@ -0,0 +1,61 @@ +// +// Constants.swift +// DropDown +// +// Created by Kevin Hirsch on 28/07/15. +// Copyright (c) 2015 Kevin Hirsch. All rights reserved. +// + +#if os(iOS) + +import UIKit + +internal struct DPDConstant { + + internal struct KeyPath { + + static let Frame = "frame" + + } + + internal struct ReusableIdentifier { + + static let DropDownCell = "DropDownCell" + + } + + internal struct UI { + + static let TextColor = UIColor.black + static let SelectedTextColor = UIColor.black + static let TextFont = UIFont.systemFont(ofSize: 15) + static let BackgroundColor = UIColor(white: 0.94, alpha: 1) + static let SelectionBackgroundColor = UIColor(white: 0.89, alpha: 1) + static let SeparatorColor = UIColor.clear + static let CornerRadius: CGFloat = 2 + static let RowHeight: CGFloat = 44 + static let HeightPadding: CGFloat = 20 + + struct Shadow { + + static let Color = UIColor.darkGray + static let Offset = CGSize.zero + static let Opacity: Float = 0.4 + static let Radius: CGFloat = 8 + + } + + } + + internal struct Animation { + + static let Duration = 0.15 + static let EntranceOptions: UIView.AnimationOptions = [.allowUserInteraction, .curveEaseOut] + static let ExitOptions: UIView.AnimationOptions = [.allowUserInteraction, .curveEaseIn] + static let DownScaleTransform = CGAffineTransform(scaleX: 0.9, y: 0.9) + + } + +} + +#endif diff --git a/WOKA/Helpers/DropDown/helpers/DPDKeyboardListener.swift b/WOKA/Helpers/DropDown/helpers/DPDKeyboardListener.swift new file mode 100644 index 0000000..d89c41c --- /dev/null +++ b/WOKA/Helpers/DropDown/helpers/DPDKeyboardListener.swift @@ -0,0 +1,72 @@ +// +// KeyboardListener.swift +// DropDown +// +// Created by Kevin Hirsch on 30/07/15. +// Copyright (c) 2015 Kevin Hirsch. All rights reserved. +// + +#if os(iOS) + +import UIKit + +internal final class KeyboardListener { + + static let sharedInstance = KeyboardListener() + + fileprivate(set) var isVisible = false + fileprivate(set) var keyboardFrame = CGRect.zero + fileprivate var isListening = false + + deinit { + stopListeningToKeyboard() + } + +} + +//MARK: - Notifications + +extension KeyboardListener { + + func startListeningToKeyboard() { + if isListening { + return + } + + isListening = true + + NotificationCenter.default.addObserver( + self, + selector: #selector(keyboardWillShow(_:)), + name: UIResponder.keyboardWillShowNotification, + object: nil) + NotificationCenter.default.addObserver( + self, + selector: #selector(keyboardWillHide(_:)), + name: UIResponder.keyboardWillHideNotification, + object: nil) + } + + func stopListeningToKeyboard() { + NotificationCenter.default.removeObserver(self) + } + + @objc + fileprivate func keyboardWillShow(_ notification: Notification) { + isVisible = true + keyboardFrame = keyboardFrame(fromNotification: notification) + } + + @objc + fileprivate func keyboardWillHide(_ notification: Notification) { + isVisible = false + keyboardFrame = keyboardFrame(fromNotification: notification) + } + + fileprivate func keyboardFrame(fromNotification notification: Notification) -> CGRect { + return ((notification as NSNotification).userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? CGRect.zero + } + +} + +#endif diff --git a/WOKA/Helpers/DropDown/helpers/DPDUIView+Extension.swift b/WOKA/Helpers/DropDown/helpers/DPDUIView+Extension.swift new file mode 100644 index 0000000..f29705d --- /dev/null +++ b/WOKA/Helpers/DropDown/helpers/DPDUIView+Extension.swift @@ -0,0 +1,61 @@ +// +// UIView+Constraints.swift +// DropDown +// +// Created by Kevin Hirsch on 28/07/15. +// Copyright (c) 2015 Kevin Hirsch. All rights reserved. +// + +#if os(iOS) + +import UIKit + +//MARK: - Constraints + +internal extension UIView { + + func addConstraints(format: String, options: NSLayoutConstraint.FormatOptions = [], metrics: [String: AnyObject]? = nil, views: [String: UIView]) { + addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: options, metrics: metrics, views: views)) + } + + func addUniversalConstraints(format: String, options: NSLayoutConstraint.FormatOptions = [], metrics: [String: AnyObject]? = nil, views: [String: UIView]) { + addConstraints(format: "H:\(format)", options: options, metrics: metrics, views: views) + addConstraints(format: "V:\(format)", options: options, metrics: metrics, views: views) + } + +} + + + +//MARK: - Bounds + +internal extension UIView { + + var windowFrame: CGRect? { + return superview?.convert(frame, to: nil) + } + +} + +internal extension UIWindow { + + static func visibleWindow() -> UIWindow? { + var currentWindow = UIApplication.shared.keyWindow + + if currentWindow == nil { + let frontToBackWindows = Array(UIApplication.shared.windows.reversed()) + + for window in frontToBackWindows { + if window.windowLevel == UIWindow.Level.normal { + currentWindow = window + break + } + } + } + + return currentWindow + } + +} + +#endif diff --git a/WOKA/Helpers/DropDown/resources/DropDownCell.xib b/WOKA/Helpers/DropDown/resources/DropDownCell.xib new file mode 100644 index 0000000..c9148cf --- /dev/null +++ b/WOKA/Helpers/DropDown/resources/DropDownCell.xib @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WOKA/Helpers/DropDown/src/DropDown+Appearance.swift b/WOKA/Helpers/DropDown/src/DropDown+Appearance.swift new file mode 100644 index 0000000..7ac057d --- /dev/null +++ b/WOKA/Helpers/DropDown/src/DropDown+Appearance.swift @@ -0,0 +1,35 @@ +// +// DropDown+Appearance.swift +// DropDown +// +// Created by Kevin Hirsch on 13/06/16. +// Copyright © 2016 Kevin Hirsch. All rights reserved. +// + +#if os(iOS) + +import UIKit + +extension DropDown { + + public class func setupDefaultAppearance() { + let appearance = DropDown.appearance() + + appearance.cellHeight = DPDConstant.UI.RowHeight + appearance.backgroundColor = DPDConstant.UI.BackgroundColor + appearance.selectionBackgroundColor = DPDConstant.UI.SelectionBackgroundColor + appearance.separatorColor = DPDConstant.UI.SeparatorColor + appearance.cornerRadius = DPDConstant.UI.CornerRadius + appearance.shadowColor = DPDConstant.UI.Shadow.Color + appearance.shadowOffset = DPDConstant.UI.Shadow.Offset + appearance.shadowOpacity = DPDConstant.UI.Shadow.Opacity + appearance.shadowRadius = DPDConstant.UI.Shadow.Radius + appearance.animationduration = DPDConstant.Animation.Duration + appearance.textColor = DPDConstant.UI.TextColor + appearance.selectedTextColor = DPDConstant.UI.SelectedTextColor + appearance.textFont = DPDConstant.UI.TextFont + } + +} + +#endif diff --git a/WOKA/Helpers/DropDown/src/DropDown.swift b/WOKA/Helpers/DropDown/src/DropDown.swift new file mode 100644 index 0000000..9139e63 --- /dev/null +++ b/WOKA/Helpers/DropDown/src/DropDown.swift @@ -0,0 +1,1209 @@ +// +// DropDown.swift +// DropDown +// +// Created by Kevin Hirsch on 28/07/15. +// Copyright (c) 2015 Kevin Hirsch. All rights reserved. +// + +#if os(iOS) + +import UIKit + +public typealias Index = Int +public typealias Closure = () -> Void +public typealias SelectionClosure = (Index, String) -> Void +public typealias MultiSelectionClosure = ([Index], [String]) -> Void +public typealias ConfigurationClosure = (Index, String) -> String +public typealias CellConfigurationClosure = (Index, String, DropDownCell) -> Void +private typealias ComputeLayoutTuple = (x: CGFloat, y: CGFloat, width: CGFloat, offscreenHeight: CGFloat) + +/// Can be `UIView` or `UIBarButtonItem`. +@objc +public protocol AnchorView: AnyObject { + + var plainView: UIView { get } + +} + +extension UIView: AnchorView { + + public var plainView: UIView { + return self + } + +} + +extension UIBarButtonItem: AnchorView { + + public var plainView: UIView { + return value(forKey: "view") as! UIView + } + +} + +/// A Material Design drop down in replacement for `UIPickerView`. +public final class DropDown: UIView { + + //TODO: handle iOS 7 landscape mode + + /// The dismiss mode for a drop down. + public enum DismissMode { + + /// A tap outside the drop down is required to dismiss. + case onTap + + /// No tap is required to dismiss, it will dimiss when interacting with anything else. + case automatic + + /// Not dismissable by the user. + case manual + + } + + /// The direction where the drop down will show from the `anchorView`. + public enum Direction { + + /// The drop down will show below the anchor view when possible, otherwise above if there is more place than below. + case any + + /// The drop down will show above the anchor view or will not be showed if not enough space. + case top + + /// The drop down will show below or will not be showed if not enough space. + case bottom + + } + + //MARK: - Properties + + /// The current visible drop down. There can be only one visible drop down at a time. + public static weak var VisibleDropDown: DropDown? + + //MARK: UI + fileprivate let dismissableView = UIView() + fileprivate let tableViewContainer = UIView() + fileprivate let tableView = UITableView() + fileprivate var templateCell: DropDownCell! + fileprivate lazy var arrowIndication: UIImageView = { + UIGraphicsBeginImageContextWithOptions(CGSize(width: 20, height: 10), false, 0) + let path = UIBezierPath() + path.move(to: CGPoint(x: 0, y: 10)) + path.addLine(to: CGPoint(x: 20, y: 10)) + path.addLine(to: CGPoint(x: 10, y: 0)) + path.addLine(to: CGPoint(x: 0, y: 10)) + UIColor.black.setFill() + path.fill() + let img = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + let tintImg = img?.withRenderingMode(.alwaysTemplate) + let imgv = UIImageView(image: tintImg) + imgv.frame = CGRect(x: 0, y: -10, width: 15, height: 10) + return imgv + }() + + + /// The view to which the drop down will displayed onto. + public weak var anchorView: AnchorView? { + didSet { setNeedsUpdateConstraints() } + } + + /** + The possible directions where the drop down will be showed. + + See `Direction` enum for more info. + */ + public var direction = Direction.any + + /** + The offset point relative to `anchorView` when the drop down is shown above the anchor view. + + By default, the drop down is showed onto the `anchorView` with the top + left corner for its origin, so an offset equal to (0, 0). + You can change here the default drop down origin. + */ + public var topOffset: CGPoint = .zero { + didSet { setNeedsUpdateConstraints() } + } + + /** + The offset point relative to `anchorView` when the drop down is shown below the anchor view. + + By default, the drop down is showed onto the `anchorView` with the top + left corner for its origin, so an offset equal to (0, 0). + You can change here the default drop down origin. + */ + public var bottomOffset: CGPoint = .zero { + didSet { setNeedsUpdateConstraints() } + } + + /** + The offset from the bottom of the window when the drop down is shown below the anchor view. + DropDown applies this offset only if keyboard is hidden. + */ + public var offsetFromWindowBottom = CGFloat(0) { + didSet { setNeedsUpdateConstraints() } + } + + /** + The width of the drop down. + + Defaults to `anchorView.bounds.width - offset.x`. + */ + public var width: CGFloat? { + didSet { setNeedsUpdateConstraints() } + } + + /** + arrowIndication.x + + arrowIndication will be add to tableViewContainer when configured + */ + public var arrowIndicationX: CGFloat? { + didSet { + if let arrowIndicationX = arrowIndicationX { + tableViewContainer.addSubview(arrowIndication) + arrowIndication.tintColor = tableViewBackgroundColor + arrowIndication.frame.origin.x = arrowIndicationX + } else { + arrowIndication.removeFromSuperview() + } + } + } + + //MARK: Constraints + fileprivate var heightConstraint: NSLayoutConstraint! + fileprivate var widthConstraint: NSLayoutConstraint! + fileprivate var xConstraint: NSLayoutConstraint! + fileprivate var yConstraint: NSLayoutConstraint! + + //MARK: Appearance + @objc public dynamic var cellHeight = DPDConstant.UI.RowHeight { + willSet { tableView.rowHeight = newValue } + didSet { reloadAllComponents() } + } + + @objc fileprivate dynamic var tableViewBackgroundColor = DPDConstant.UI.BackgroundColor { + willSet { + tableView.backgroundColor = newValue + if arrowIndicationX != nil { arrowIndication.tintColor = newValue } + } + } + + public override var backgroundColor: UIColor? { + get { return tableViewBackgroundColor } + set { tableViewBackgroundColor = newValue! } + } + + /** + The color of the dimmed background (behind the drop down, covering the entire screen). + */ + public var dimmedBackgroundColor = UIColor.clear { + willSet { super.backgroundColor = newValue } + } + + /** + The background color of the selected cell in the drop down. + + Changing the background color automatically reloads the drop down. + */ + @objc public dynamic var selectionBackgroundColor = DPDConstant.UI.SelectionBackgroundColor + + /** + The separator color between cells. + + Changing the separator color automatically reloads the drop down. + */ + @objc public dynamic var separatorColor = DPDConstant.UI.SeparatorColor { + willSet { tableView.separatorColor = newValue } + didSet { reloadAllComponents() } + } + + /** + The corner radius of DropDown. + + Changing the corner radius automatically reloads the drop down. + */ + @objc public dynamic var cornerRadius = DPDConstant.UI.CornerRadius { + willSet { + tableViewContainer.layer.cornerRadius = newValue + tableView.layer.cornerRadius = newValue + } + didSet { reloadAllComponents() } + } + + /** + Alias method for `cornerRadius` variable to avoid ambiguity. + */ + @objc public dynamic func setupCornerRadius(_ radius: CGFloat) { + tableViewContainer.layer.cornerRadius = radius + tableView.layer.cornerRadius = radius + reloadAllComponents() + } + + /** + The masked corners of DropDown. + + Changing the masked corners automatically reloads the drop down. + */ + @available(iOS 11.0, *) + @objc public dynamic func setupMaskedCorners(_ cornerMask: CACornerMask) { + tableViewContainer.layer.maskedCorners = cornerMask + tableView.layer.maskedCorners = cornerMask + reloadAllComponents() + } + + /** + The color of the shadow. + + Changing the shadow color automatically reloads the drop down. + */ + @objc public dynamic var shadowColor = DPDConstant.UI.Shadow.Color { + willSet { tableViewContainer.layer.shadowColor = newValue.cgColor } + didSet { reloadAllComponents() } + } + + /** + The offset of the shadow. + + Changing the shadow color automatically reloads the drop down. + */ + @objc public dynamic var shadowOffset = DPDConstant.UI.Shadow.Offset { + willSet { tableViewContainer.layer.shadowOffset = newValue } + didSet { reloadAllComponents() } + } + + /** + The opacity of the shadow. + + Changing the shadow opacity automatically reloads the drop down. + */ + @objc public dynamic var shadowOpacity = DPDConstant.UI.Shadow.Opacity { + willSet { tableViewContainer.layer.shadowOpacity = newValue } + didSet { reloadAllComponents() } + } + + /** + The radius of the shadow. + + Changing the shadow radius automatically reloads the drop down. + */ + @objc public dynamic var shadowRadius = DPDConstant.UI.Shadow.Radius { + willSet { tableViewContainer.layer.shadowRadius = newValue } + didSet { reloadAllComponents() } + } + + /** + The duration of the show/hide animation. + */ + @objc public dynamic var animationduration = DPDConstant.Animation.Duration + + /** + The option of the show animation. Global change. + */ + public static var animationEntranceOptions = DPDConstant.Animation.EntranceOptions + + /** + The option of the hide animation. Global change. + */ + public static var animationExitOptions = DPDConstant.Animation.ExitOptions + + /** + The option of the show animation. Only change the caller. To change all drop down's use the static var. + */ + public var animationEntranceOptions: UIView.AnimationOptions = DropDown.animationEntranceOptions + + /** + The option of the hide animation. Only change the caller. To change all drop down's use the static var. + */ + public var animationExitOptions: UIView.AnimationOptions = DropDown.animationExitOptions + + /** + The downScale transformation of the tableview when the DropDown is appearing + */ + public var downScaleTransform = DPDConstant.Animation.DownScaleTransform { + willSet { tableViewContainer.transform = newValue } + } + + /** + The color of the text for each cells of the drop down. + + Changing the text color automatically reloads the drop down. + */ + @objc public dynamic var textColor = DPDConstant.UI.TextColor { + didSet { reloadAllComponents() } + } + + /** + The color of the text for selected cells of the drop down. + + Changing the text color automatically reloads the drop down. + */ + @objc public dynamic var selectedTextColor = DPDConstant.UI.SelectedTextColor { + didSet { reloadAllComponents() } + } + + /** + The font of the text for each cells of the drop down. + + Changing the text font automatically reloads the drop down. + */ + @objc public dynamic var textFont = DPDConstant.UI.TextFont { + didSet { reloadAllComponents() } + } + + /** + The NIB to use for DropDownCells + + Changing the cell nib automatically reloads the drop down. + */ + public var cellNib = UINib(nibName: "DropDownCell", bundle: bundle) { + didSet { + tableView.register(cellNib, forCellReuseIdentifier: DPDConstant.ReusableIdentifier.DropDownCell) + templateCell = nil + reloadAllComponents() + } + } + + /// Correctly specify Bundle for Swift Packages + fileprivate static var bundle: Bundle { + #if SWIFT_PACKAGE + return Bundle.module + #else + return Bundle(for: DropDownCell.self) + #endif + } + + //MARK: Content + + /** + The data source for the drop down. + + Changing the data source automatically reloads the drop down. + */ + public var dataSource = [String]() { + didSet { + deselectRows(at: selectedRowIndices) + reloadAllComponents() + } + } + + /** + The localization keys for the data source for the drop down. + + Changing this value automatically reloads the drop down. + This has uses for setting accibility identifiers on the drop down cells (same ones as the localization keys). + */ + public var localizationKeysDataSource = [String]() { + didSet { + dataSource = localizationKeysDataSource.map { NSLocalizedString($0, comment: "") } + } + } + + /// The indicies that have been selected + fileprivate var selectedRowIndices = Set() + + /** + The format for the cells' text. + + By default, the cell's text takes the plain `dataSource` value. + Changing `cellConfiguration` automatically reloads the drop down. + */ + public var cellConfiguration: ConfigurationClosure? { + didSet { reloadAllComponents() } + } + + /** + A advanced formatter for the cells. Allows customization when custom cells are used + + Changing `customCellConfiguration` automatically reloads the drop down. + */ + public var customCellConfiguration: CellConfigurationClosure? { + didSet { reloadAllComponents() } + } + + /// The action to execute when the user selects a cell. + public var selectionAction: SelectionClosure? + + /** + The action to execute when the user selects multiple cells. + + Providing an action will turn on multiselection mode. + The single selection action will still be called if provided. + */ + public var multiSelectionAction: MultiSelectionClosure? + + /// The action to execute when the drop down will show. + public var willShowAction: Closure? + + /// The action to execute when the user cancels/hides the drop down. + public var cancelAction: Closure? + + /// The dismiss mode of the drop down. Default is `OnTap`. + public var dismissMode = DismissMode.onTap { + willSet { + if newValue == .onTap { + let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissableViewTapped)) + dismissableView.addGestureRecognizer(gestureRecognizer) + } else if let gestureRecognizer = dismissableView.gestureRecognizers?.first { + dismissableView.removeGestureRecognizer(gestureRecognizer) + } + } + } + + fileprivate var minHeight: CGFloat { + return tableView.rowHeight + } + + fileprivate var didSetupConstraints = false + + //MARK: - Init's + + deinit { + stopListeningToNotifications() + } + + /** + Creates a new instance of a drop down. + Don't forget to setup the `dataSource`, + the `anchorView` and the `selectionAction` + at least before calling `show()`. + */ + public convenience init() { + self.init(frame: .zero) + } + + /** + Creates a new instance of a drop down. + + - parameter anchorView: The view to which the drop down will displayed onto. + - parameter selectionAction: The action to execute when the user selects a cell. + - parameter dataSource: The data source for the drop down. + - parameter topOffset: The offset point relative to `anchorView` used when drop down is displayed on above the anchor view. + - parameter bottomOffset: The offset point relative to `anchorView` used when drop down is displayed on below the anchor view. + - parameter cellConfiguration: The format for the cells' text. + - parameter cancelAction: The action to execute when the user cancels/hides the drop down. + + - returns: A new instance of a drop down customized with the above parameters. + */ + public convenience init(anchorView: AnchorView, selectionAction: SelectionClosure? = nil, dataSource: [String] = [], topOffset: CGPoint? = nil, bottomOffset: CGPoint? = nil, cellConfiguration: ConfigurationClosure? = nil, cancelAction: Closure? = nil) { + self.init(frame: .zero) + + self.anchorView = anchorView + self.selectionAction = selectionAction + self.dataSource = dataSource + self.topOffset = topOffset ?? .zero + self.bottomOffset = bottomOffset ?? .zero + self.cellConfiguration = cellConfiguration + self.cancelAction = cancelAction + } + + override public init(frame: CGRect) { + super.init(frame: frame) + setup() + } + + public required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setup() + } + +} + +//MARK: - Setup + +private extension DropDown { + + func setup() { + tableView.register(cellNib, forCellReuseIdentifier: DPDConstant.ReusableIdentifier.DropDownCell) + + DispatchQueue.main.async { + //HACK: If not done in dispatch_async on main queue `setupUI` will have no effect + self.updateConstraintsIfNeeded() + self.setupUI() + } + + tableView.rowHeight = cellHeight + setHiddentState() + isHidden = true + + dismissMode = .onTap + + tableView.delegate = self + tableView.dataSource = self + + startListeningToKeyboard() + + accessibilityIdentifier = "drop_down" + } + + func setupUI() { + super.backgroundColor = dimmedBackgroundColor + + tableViewContainer.layer.masksToBounds = false + tableViewContainer.layer.cornerRadius = cornerRadius + tableViewContainer.layer.shadowColor = shadowColor.cgColor + tableViewContainer.layer.shadowOffset = shadowOffset + tableViewContainer.layer.shadowOpacity = shadowOpacity + tableViewContainer.layer.shadowRadius = shadowRadius + + tableView.backgroundColor = tableViewBackgroundColor + tableView.separatorColor = separatorColor + tableView.layer.cornerRadius = cornerRadius + tableView.layer.masksToBounds = true + } + +} + +//MARK: - UI + +extension DropDown { + + public override func updateConstraints() { + if !didSetupConstraints { + setupConstraints() + } + + didSetupConstraints = true + + let layout = computeLayout() + + if !layout.canBeDisplayed { + super.updateConstraints() + hide() + + return + } + + xConstraint.constant = layout.x + yConstraint.constant = layout.y + widthConstraint.constant = layout.width + heightConstraint.constant = layout.visibleHeight + + tableView.isScrollEnabled = layout.offscreenHeight > 0 + + DispatchQueue.main.async { [weak self] in + self?.tableView.flashScrollIndicators() + } + + super.updateConstraints() + } + + fileprivate func setupConstraints() { + translatesAutoresizingMaskIntoConstraints = false + + // Dismissable view + addSubview(dismissableView) + dismissableView.translatesAutoresizingMaskIntoConstraints = false + + addUniversalConstraints(format: "|[dismissableView]|", views: ["dismissableView": dismissableView]) + + + // Table view container + addSubview(tableViewContainer) + tableViewContainer.translatesAutoresizingMaskIntoConstraints = false + + xConstraint = NSLayoutConstraint( + item: tableViewContainer, + attribute: .leading, + relatedBy: .equal, + toItem: self, + attribute: .leading, + multiplier: 1, + constant: 0) + addConstraint(xConstraint) + + yConstraint = NSLayoutConstraint( + item: tableViewContainer, + attribute: .top, + relatedBy: .equal, + toItem: self, + attribute: .top, + multiplier: 1, + constant: 0) + addConstraint(yConstraint) + + widthConstraint = NSLayoutConstraint( + item: tableViewContainer, + attribute: .width, + relatedBy: .equal, + toItem: nil, + attribute: .notAnAttribute, + multiplier: 1, + constant: 0) + tableViewContainer.addConstraint(widthConstraint) + + heightConstraint = NSLayoutConstraint( + item: tableViewContainer, + attribute: .height, + relatedBy: .equal, + toItem: nil, + attribute: .notAnAttribute, + multiplier: 1, + constant: 0) + tableViewContainer.addConstraint(heightConstraint) + + // Table view + tableViewContainer.addSubview(tableView) + tableView.translatesAutoresizingMaskIntoConstraints = false + + tableViewContainer.addUniversalConstraints(format: "|[tableView]|", views: ["tableView": tableView]) + } + + public override func layoutSubviews() { + super.layoutSubviews() + + // When orientation changes, layoutSubviews is called + // We update the constraint to update the position + setNeedsUpdateConstraints() + + let shadowPath = UIBezierPath(roundedRect: tableViewContainer.bounds, cornerRadius: cornerRadius) + tableViewContainer.layer.shadowPath = shadowPath.cgPath + } + + fileprivate func computeLayout() -> (x: CGFloat, y: CGFloat, width: CGFloat, offscreenHeight: CGFloat, visibleHeight: CGFloat, canBeDisplayed: Bool, Direction: Direction) { + var layout: ComputeLayoutTuple = (0, 0, 0, 0) + var direction = self.direction + + guard let window = UIWindow.visibleWindow() else { return (0, 0, 0, 0, 0, false, direction) } + + barButtonItemCondition: if let anchorView = anchorView as? UIBarButtonItem { + let isRightBarButtonItem = anchorView.plainView.frame.minX > window.frame.midX + + guard isRightBarButtonItem else { break barButtonItemCondition } + + let width = self.width ?? fittingWidth() + let anchorViewWidth = anchorView.plainView.frame.width + let x = -(width - anchorViewWidth) + + bottomOffset = CGPoint(x: x, y: 0) + } + + if anchorView == nil { + layout = computeLayoutBottomDisplay(window: window) + direction = .any + } else { + switch direction { + case .any: + layout = computeLayoutBottomDisplay(window: window) + direction = .bottom + + if layout.offscreenHeight > 0 { + let topLayout = computeLayoutForTopDisplay(window: window) + + if topLayout.offscreenHeight < layout.offscreenHeight { + layout = topLayout + direction = .top + } + } + case .bottom: + layout = computeLayoutBottomDisplay(window: window) + direction = .bottom + case .top: + layout = computeLayoutForTopDisplay(window: window) + direction = .top + } + } + + constraintWidthToFittingSizeIfNecessary(layout: &layout) + constraintWidthToBoundsIfNecessary(layout: &layout, in: window) + + let visibleHeight = tableHeight - layout.offscreenHeight + let canBeDisplayed = visibleHeight >= minHeight + + return (layout.x, layout.y, layout.width, layout.offscreenHeight, visibleHeight, canBeDisplayed, direction) + } + + fileprivate func computeLayoutBottomDisplay(window: UIWindow) -> ComputeLayoutTuple { + var offscreenHeight: CGFloat = 0 + + let width = self.width ?? (anchorView?.plainView.bounds.width ?? fittingWidth()) - bottomOffset.x + + let anchorViewX = anchorView?.plainView.windowFrame?.minX ?? window.frame.midX - (width / 2) + let anchorViewY = anchorView?.plainView.windowFrame?.minY ?? window.frame.midY - (tableHeight / 2) + + let x = anchorViewX + bottomOffset.x + let y = anchorViewY + bottomOffset.y + + let maxY = y + tableHeight + let windowMaxY = window.bounds.maxY - DPDConstant.UI.HeightPadding - offsetFromWindowBottom + + let keyboardListener = KeyboardListener.sharedInstance + let keyboardMinY = keyboardListener.keyboardFrame.minY - DPDConstant.UI.HeightPadding + + if keyboardListener.isVisible && maxY > keyboardMinY { + offscreenHeight = abs(maxY - keyboardMinY) + } else if maxY > windowMaxY { + offscreenHeight = abs(maxY - windowMaxY) + } + + return (x, y, width, offscreenHeight) + } + + fileprivate func computeLayoutForTopDisplay(window: UIWindow) -> ComputeLayoutTuple { + var offscreenHeight: CGFloat = 0 + + let anchorViewX = anchorView?.plainView.windowFrame?.minX ?? 0 + let anchorViewMaxY = anchorView?.plainView.windowFrame?.maxY ?? 0 + + let x = anchorViewX + topOffset.x + var y = (anchorViewMaxY + topOffset.y) - tableHeight + + let windowY = window.bounds.minY + DPDConstant.UI.HeightPadding + + if y < windowY { + offscreenHeight = abs(y - windowY) + y = windowY + } + + let width = self.width ?? (anchorView?.plainView.bounds.width ?? fittingWidth()) - topOffset.x + + return (x, y, width, offscreenHeight) + } + + fileprivate func fittingWidth() -> CGFloat { + if templateCell == nil { + templateCell = (cellNib.instantiate(withOwner: nil, options: nil)[0] as! DropDownCell) + } + + var maxWidth: CGFloat = 0 + + for index in 0.. maxWidth { + maxWidth = width + } + } + + return maxWidth + } + + fileprivate func constraintWidthToBoundsIfNecessary(layout: inout ComputeLayoutTuple, in window: UIWindow) { + let windowMaxX = window.bounds.maxX + let maxX = layout.x + layout.width + + if maxX > windowMaxX { + let delta = maxX - windowMaxX + let newOrigin = layout.x - delta + + if newOrigin > 0 { + layout.x = newOrigin + } else { + layout.x = 0 + layout.width += newOrigin // newOrigin is negative, so this operation is a substraction + } + } + } + + fileprivate func constraintWidthToFittingSizeIfNecessary(layout: inout ComputeLayoutTuple) { + guard width == nil else { return } + + if layout.width < fittingWidth() { + layout.width = fittingWidth() + } + } + +} + +//MARK: - Actions + +extension DropDown { + + /** + An Objective-C alias for the show() method which converts the returned tuple into an NSDictionary. + + - returns: An NSDictionary with a value for the "canBeDisplayed" Bool, and possibly for the "offScreenHeight" Optional(CGFloat). + */ + @objc(show) + public func objc_show() -> NSDictionary { + let (canBeDisplayed, offScreenHeight) = show() + + var info = [AnyHashable: Any]() + info["canBeDisplayed"] = canBeDisplayed + if let offScreenHeight = offScreenHeight { + info["offScreenHeight"] = offScreenHeight + } + + return NSDictionary(dictionary: info) + } + + /** + Shows the drop down if enough height. + + - returns: Wether it succeed and how much height is needed to display all cells at once. + */ + @discardableResult + public func show(onTopOf window: UIWindow? = nil, beforeTransform transform: CGAffineTransform? = nil, anchorPoint: CGPoint? = nil) -> (canBeDisplayed: Bool, offscreenHeight: CGFloat?) { + if self == DropDown.VisibleDropDown && DropDown.VisibleDropDown?.isHidden == false { // added condition - DropDown.VisibleDropDown?.isHidden == false -> to resolve forever hiding dropdown issue when continuous taping on button - Kartik Patel - 2016-12-29 + return (true, 0) + } + + if let visibleDropDown = DropDown.VisibleDropDown { + visibleDropDown.cancel() + } + + willShowAction?() + + DropDown.VisibleDropDown = self + + setNeedsUpdateConstraints() + + let visibleWindow = window != nil ? window : UIWindow.visibleWindow() + visibleWindow?.addSubview(self) + visibleWindow?.bringSubviewToFront(self) + + self.translatesAutoresizingMaskIntoConstraints = false + visibleWindow?.addUniversalConstraints(format: "|[dropDown]|", views: ["dropDown": self]) + + let layout = computeLayout() + + if !layout.canBeDisplayed { + hide() + return (layout.canBeDisplayed, layout.offscreenHeight) + } + + isHidden = false + + if anchorPoint != nil { + tableViewContainer.layer.anchorPoint = anchorPoint! + } + + if transform != nil { + tableViewContainer.transform = transform! + } else { + tableViewContainer.transform = downScaleTransform + } + + layoutIfNeeded() + + UIView.animate( + withDuration: animationduration, + delay: 0, + options: animationEntranceOptions, + animations: { [weak self] in + self?.setShowedState() + }, + completion: nil) + + accessibilityViewIsModal = true + UIAccessibility.post(notification: .screenChanged, argument: self) + + //deselectRows(at: selectedRowIndices) + selectRows(at: selectedRowIndices) + + return (layout.canBeDisplayed, layout.offscreenHeight) + } + + public override func accessibilityPerformEscape() -> Bool { + switch dismissMode { + case .automatic, .onTap: + cancel() + return true + case .manual: + return false + } + } + + /// Hides the drop down. + public func hide() { + if self == DropDown.VisibleDropDown { + /* + If one drop down is showed and another one is not + but we call `hide()` on the hidden one: + we don't want it to set the `VisibleDropDown` to nil. + */ + DropDown.VisibleDropDown = nil + } + + if isHidden { + return + } + + UIView.animate( + withDuration: animationduration, + delay: 0, + options: animationExitOptions, + animations: { [weak self] in + self?.setHiddentState() + }, + completion: { [weak self] finished in + guard let `self` = self else { return } + + self.isHidden = true + self.removeFromSuperview() + UIAccessibility.post(notification: .screenChanged, argument: nil) + }) + } + + fileprivate func cancel() { + hide() + cancelAction?() + } + + fileprivate func setHiddentState() { + alpha = 0 + } + + fileprivate func setShowedState() { + alpha = 1 + tableViewContainer.transform = CGAffineTransform.identity + } + +} + +//MARK: - UITableView + +extension DropDown { + + /** + Reloads all the cells. + + It should not be necessary in most cases because each change to + `dataSource`, `textColor`, `textFont`, `selectionBackgroundColor` + and `cellConfiguration` implicitly calls `reloadAllComponents()`. + */ + public func reloadAllComponents() { + DispatchQueue.executeOnMainThread { + self.tableView.reloadData() + self.setNeedsUpdateConstraints() + } + } + + /// (Pre)selects a row at a certain index. + public func selectRow(at index: Index?, scrollPosition: UITableView.ScrollPosition = .none) { + if let index = index { + tableView.selectRow( + at: IndexPath(row: index, section: 0), animated: true, scrollPosition: scrollPosition + ) + selectedRowIndices.insert(index) + } else { + deselectRows(at: selectedRowIndices) + selectedRowIndices.removeAll() + } + } + + public func selectRows(at indices: Set?) { + indices?.forEach { + selectRow(at: $0) + } + + // if we are in multi selection mode then reload data so that all selections are shown + if multiSelectionAction != nil { + tableView.reloadData() + } + } + + public func deselectRow(at index: Index?) { + guard let index = index + , index >= 0 + else { return } + + // remove from indices + if let selectedRowIndex = selectedRowIndices.firstIndex(where: { $0 == index }) { + selectedRowIndices.remove(at: selectedRowIndex) + } + + tableView.deselectRow(at: IndexPath(row: index, section: 0), animated: true) + } + + // de-selects the rows at the indices provided + public func deselectRows(at indices: Set?) { + indices?.forEach { + deselectRow(at: $0) + } + } + + /// Returns the index of the selected row. + public var indexForSelectedRow: Index? { + return (tableView.indexPathForSelectedRow as NSIndexPath?)?.row + } + + /// Returns the selected item. + public var selectedItem: String? { + guard let row = (tableView.indexPathForSelectedRow as NSIndexPath?)?.row else { return nil } + + return dataSource[row] + } + + /// Returns the height needed to display all cells. + fileprivate var tableHeight: CGFloat { + return tableView.rowHeight * CGFloat(dataSource.count) + } + + //MARK: Objective-C methods for converting the Swift type Index + @objc public func selectRow(_ index: Int, scrollPosition: UITableView.ScrollPosition = .none) { + self.selectRow(at:Index(index), scrollPosition: scrollPosition) + } + + @objc public func clearSelection() { + self.selectRow(at:nil) + } + + @objc public func deselectRow(_ index: Int) { + tableView.deselectRow(at: IndexPath(row: Index(index), section: 0), animated: true) + } + + @objc public var indexPathForSelectedRow: NSIndexPath? { + return tableView.indexPathForSelectedRow as NSIndexPath? + } +} + +//MARK: - UITableViewDataSource - UITableViewDelegate + +extension DropDown: UITableViewDataSource, UITableViewDelegate { + + public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataSource.count + } + + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: DPDConstant.ReusableIdentifier.DropDownCell, for: indexPath) as! DropDownCell + let index = (indexPath as NSIndexPath).row + + configureCell(cell, at: index) + + return cell + } + + fileprivate func configureCell(_ cell: DropDownCell, at index: Int) { + if index >= 0 && index < localizationKeysDataSource.count { + cell.accessibilityIdentifier = localizationKeysDataSource[index] + } + + cell.optionLabel.textColor = textColor + cell.optionLabel.font = textFont + cell.selectedBackgroundColor = selectionBackgroundColor + cell.highlightTextColor = selectedTextColor + cell.normalTextColor = textColor + + if let cellConfiguration = cellConfiguration { + cell.optionLabel.text = cellConfiguration(index, dataSource[index]) + } else { + cell.optionLabel.text = dataSource[index] + } + + customCellConfiguration?(index, dataSource[index], cell) + } + + public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { + cell.isSelected = selectedRowIndices.first{ $0 == (indexPath as NSIndexPath).row } != nil + } + + public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let selectedRowIndex = (indexPath as NSIndexPath).row + + + // are we in multi-selection mode? + if let multiSelectionCallback = multiSelectionAction { + // if already selected then deselect + if selectedRowIndices.first(where: { $0 == selectedRowIndex}) != nil { + deselectRow(at: selectedRowIndex) + + let selectedRowIndicesArray = Array(selectedRowIndices) + let selectedRows = selectedRowIndicesArray.map { dataSource[$0] } + multiSelectionCallback(selectedRowIndicesArray, selectedRows) + return + } + else { + selectedRowIndices.insert(selectedRowIndex) + + let selectedRowIndicesArray = Array(selectedRowIndices) + let selectedRows = selectedRowIndicesArray.map { dataSource[$0] } + + selectionAction?(selectedRowIndex, dataSource[selectedRowIndex]) + multiSelectionCallback(selectedRowIndicesArray, selectedRows) + tableView.reloadData() + return + } + } + + // Perform single selection logic + selectedRowIndices.removeAll() + selectedRowIndices.insert(selectedRowIndex) + selectionAction?(selectedRowIndex, dataSource[selectedRowIndex]) + + if let _ = anchorView as? UIBarButtonItem { + // DropDown's from UIBarButtonItem are menus so we deselect the selected menu right after selection + deselectRow(at: selectedRowIndex) + } + + hide() + + } + +} + +//MARK: - Auto dismiss + +extension DropDown { + + public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + let view = super.hitTest(point, with: event) + + if dismissMode == .automatic && view === dismissableView { + cancel() + return nil + } else { + return view + } + } + + @objc + fileprivate func dismissableViewTapped() { + cancel() + } + +} + +//MARK: - Keyboard events + +extension DropDown { + + /** + Starts listening to keyboard events. + Allows the drop down to display correctly when keyboard is showed. + */ + @objc public static func startListeningToKeyboard() { + KeyboardListener.sharedInstance.startListeningToKeyboard() + } + + fileprivate func startListeningToKeyboard() { + KeyboardListener.sharedInstance.startListeningToKeyboard() + + NotificationCenter.default.addObserver( + self, + selector: #selector(keyboardUpdate), + name: UIResponder.keyboardWillShowNotification, + object: nil) + NotificationCenter.default.addObserver( + self, + selector: #selector(keyboardUpdate), + name: UIResponder.keyboardWillHideNotification, + object: nil) + } + + fileprivate func stopListeningToNotifications() { + NotificationCenter.default.removeObserver(self) + } + + @objc + fileprivate func keyboardUpdate() { + self.setNeedsUpdateConstraints() + } + +} + +private extension DispatchQueue { + static func executeOnMainThread(_ closure: @escaping Closure) { + if Thread.isMainThread { + closure() + } else { + main.async(execute: closure) + } + } +} + +#endif diff --git a/WOKA/Helpers/DropDown/src/DropDownCell.swift b/WOKA/Helpers/DropDown/src/DropDownCell.swift new file mode 100644 index 0000000..bf49947 --- /dev/null +++ b/WOKA/Helpers/DropDown/src/DropDownCell.swift @@ -0,0 +1,78 @@ +// +// DropDownCellTableViewCell.swift +// DropDown +// +// Created by Kevin Hirsch on 28/07/15. +// Copyright (c) 2015 Kevin Hirsch. All rights reserved. +// + +#if os(iOS) + +import UIKit + +open class DropDownCell: UITableViewCell { + + //UI + @IBOutlet open weak var optionLabel: UILabel! + + var selectedBackgroundColor: UIColor? + var highlightTextColor: UIColor? + var normalTextColor: UIColor? + +} + +//MARK: - UI + +extension DropDownCell { + + override open func awakeFromNib() { + super.awakeFromNib() + + backgroundColor = .clear + } + + override open var isSelected: Bool { + willSet { + setSelected(newValue, animated: false) + } + } + + override open var isHighlighted: Bool { + willSet { + setSelected(newValue, animated: false) + } + } + + override open func setHighlighted(_ highlighted: Bool, animated: Bool) { + setSelected(highlighted, animated: animated) + } + + override open func setSelected(_ selected: Bool, animated: Bool) { + let executeSelection: () -> Void = { [weak self] in + guard let `self` = self else { return } + + if let selectedBackgroundColor = self.selectedBackgroundColor { + if selected { + self.backgroundColor = selectedBackgroundColor + self.optionLabel.textColor = self.highlightTextColor + } else { + self.backgroundColor = .clear + self.optionLabel.textColor = self.normalTextColor + } + } + } + + if animated { + UIView.animate(withDuration: 0.3, animations: { + executeSelection() + }) + } else { + executeSelection() + } + + accessibilityTraits = selected ? .selected : .none + } + +} + +#endif diff --git a/WOKA/Helpers/NsNotificationExtension.swift b/WOKA/Helpers/NsNotificationExtension.swift new file mode 100644 index 0000000..cf1173e --- /dev/null +++ b/WOKA/Helpers/NsNotificationExtension.swift @@ -0,0 +1,13 @@ +// +// NsNotificationExtension.swift +// WOKA +// +// Created by Bilal on 04/06/2024. +// + +import Foundation + +extension Notification.Name { + static let languageDidChange = Notification.Name("languageDidChange") + static let linkPush = Notification.Name("linkPush") +} diff --git a/WOKA/Helpers/UIElements Helper/ApplyGradrient.swift b/WOKA/Helpers/UIElements Helper/ApplyGradrient.swift index a01207b..9541d58 100644 --- a/WOKA/Helpers/UIElements Helper/ApplyGradrient.swift +++ b/WOKA/Helpers/UIElements Helper/ApplyGradrient.swift @@ -48,4 +48,50 @@ extension UIView { // Insert the gradient layer as the bottom layer of the view's layer hierarchy layer.insertSublayer(gradientLayer, at: 0) } + + func applyMultiGradient(colors: [UIColor], startPoint: CGPoint, endPoint: CGPoint) { + // Check if the view already has a gradient layer + if let sublayers = layer.sublayers { + for sublayer in sublayers { + if let gradientLayer = sublayer as? CAGradientLayer { + // Update the existing gradient layer + gradientLayer.colors = colors.map { $0.cgColor } + gradientLayer.startPoint = startPoint + gradientLayer.endPoint = endPoint + gradientLayer.frame = bounds + return + } + } + } + + // Create a new CAGradientLayer instance + let gradientLayer = CAGradientLayer() + + // Set the frame of the gradient layer to match the bounds of the view + gradientLayer.frame = bounds + + // Ensure that there are at least two colors + guard colors.count >= 2 else { + fatalError("At least two colors are required for the gradient.") + } + + // Calculate the color stops + let colorStops = (0.. - + - - + @@ -355,6 +354,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WOKA/SideBarNav/View/FaqCell.swift b/WOKA/SideBarNav/View/FaqCell.swift index 91f1e32..1e4f152 100644 --- a/WOKA/SideBarNav/View/FaqCell.swift +++ b/WOKA/SideBarNav/View/FaqCell.swift @@ -11,6 +11,8 @@ class FaqCell: UITableViewCell { @IBOutlet weak var question: UILabel! @IBOutlet weak var answer: UILabel! + @IBOutlet weak var expandedimage: UIImageView! + @IBOutlet weak var lineSeperator: UIView! override func awakeFromNib() { super.awakeFromNib() @@ -23,4 +25,20 @@ class FaqCell: UITableViewCell { // Configure the view for the selected state } + func setData(data : FaqListDM.ResultData){ + self.question.text = data.englishQuestion + self.answer.text = data.englishAnswer + self.answer.isHidden = !data.isExpanded! + + if let isExpaned = data.isExpanded , isExpaned{ + self.answer.isHidden = false + self.expandedimage.image = UIImage(named: "CollapseFaq") + lineSeperator.isHidden = false + }else{ + self.answer.isHidden = true + self.expandedimage.image = UIImage(named: "ExpandFaq") + lineSeperator.isHidden = true + } + } + } diff --git a/WOKA/SideBarNav/View/FaqCell.xib b/WOKA/SideBarNav/View/FaqCell.xib index e3f0557..a2d5d66 100644 --- a/WOKA/SideBarNav/View/FaqCell.xib +++ b/WOKA/SideBarNav/View/FaqCell.xib @@ -25,28 +25,60 @@ - + - - + - + @@ -72,9 +104,14 @@ + + + + + diff --git a/WOKA/SideBarNav/ViewModel/FaqVM.swift b/WOKA/SideBarNav/ViewModel/FaqVM.swift new file mode 100644 index 0000000..04a2630 --- /dev/null +++ b/WOKA/SideBarNav/ViewModel/FaqVM.swift @@ -0,0 +1,64 @@ +// +// FaqVM.swift +// WOKA +// +// Created by Bilal on 04/06/2024. +// + +import UIKit +import Alamofire + +class FaqVM{ + + weak var vc : FaqVC! + var faqData = [FaqListDM.ResultData]() + var lastIndex : Int? + + func initView(){ + getFaqs() + } + + // MARK: - Get Faq's + + func getFaqs(){ + Utilities.startProgressHUD() + let headers : HTTPHeaders = ["Accept-Language" : AuthFunc.shareInstance.languageSelected == .english ? "English" : "Hindi", + "access-token": AuthFunc.shareInstance.getAccessToken()] + let params : Parameters = ["faq_category_key" : "watch"] + NetworkManager.shareInstance.apiRequest(url: APIEndPoints.SideBarNav.faq_listing, method: .post, parameters: params,headers : headers) {(result : Result, NetworkManager.APIError>) in + switch result{ + case .success(let data): + switch data.success{ + case 0: + Utilities.dismissProgressHUD() + self.handlError(msg: data.message ?? "Unrecognised error") + return + case 1: + Utilities.dismissProgressHUD() + guard let data = data.data?.result else{return} + self.faqData = data + self.vc.tableView.reloadData() + default: + break + } + case .failure(let error): + Utilities.dismissProgressHUD() + self.handlError(msg: error.localizedDescription) + } + } + } + + private func handlError(msg : String){ + let sb = UIStoryboard(name: K.StoryBoard.customAlerts, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.CustomAlerts.alertCustomVC) as! AlertCustomVC + vcPush.contentLabel = msg + vcPush.mainTitleText = "Error" + vcPush.yesBtnText = "Retry?" + vcPush.onDoneBlock = { isDone in + self.getFaqs() + } + vcPush.modalPresentationStyle = .overCurrentContext + vcPush.modalTransitionStyle = .crossDissolve + self.vc.present(vcPush, animated: true) + } +} diff --git a/WOKA/TabBar & SideMenu/Controller/SideMenuVC.swift b/WOKA/TabBar & SideMenu/Controller/SideMenuVC.swift index 5f43242..f8451e3 100644 --- a/WOKA/TabBar & SideMenu/Controller/SideMenuVC.swift +++ b/WOKA/TabBar & SideMenu/Controller/SideMenuVC.swift @@ -53,10 +53,14 @@ class SideMenuVC: UIViewController { switch sender{ case aboutBtn: self.sideMenuController?.hideMenu() - NotificationCenter.default.post(name: .pushView, object: nil, userInfo: nil) + NotificationCenter.default.post(name: .linkPush, object: nil, userInfo: ["type": LinkTypeEnum.about]) case faqBtn: self.sideMenuController?.hideMenu() - NotificationCenter.default.post(name: .pushView, object: nil, userInfo: nil) + NotificationCenter.default.post(name: .linkPush, object: nil, userInfo: ["type": LinkTypeEnum.faq]) + case wokaSupportBtn: + self.sideMenuController?.hideMenu() + NotificationCenter.default.post(name: .linkPush, object: nil, userInfo: ["type": LinkTypeEnum.support]) + default: break } diff --git a/WOKA/TabBar & SideMenu/Controller/TabBarVC.swift b/WOKA/TabBar & SideMenu/Controller/TabBarVC.swift index 1429bb1..8c9e837 100644 --- a/WOKA/TabBar & SideMenu/Controller/TabBarVC.swift +++ b/WOKA/TabBar & SideMenu/Controller/TabBarVC.swift @@ -22,23 +22,36 @@ class TabBarVC: UITabBarController { self.setupTabBarUI() self.addCustomTabBarView() NotificationCenter.default.addObserver(self, selector: #selector(languageDidChange), name: .languageDidChange, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(pushView), name: .pushView, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(linkPush), name: .linkPush, object: nil) + customizeTabBarItemIconSize() } deinit{ NotificationCenter.default.removeObserver(self, name: .languageDidChange, object: nil) - NotificationCenter.default.removeObserver(self, name: .pushView, object: nil) + NotificationCenter.default.removeObserver(self, name: .linkPush, object: nil) } - @objc func pushView(){ - Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { _ in - let sb = UIStoryboard(name: K.StoryBoard.sideBarNav, bundle: nil) - let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.SideBarNav.faqVC) as! FaqVC - self.navigationController?.pushViewController(vcPush, animated: true) -// let sb = UIStoryboard(name: K.StoryBoard.sideBarNav, bundle: nil) -// let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.SideBarNav.aboutUsVc) as! AboutUsVc -// self.navigationController?.pushViewController(vcPush, animated: true) + @objc func linkPush(_ notification: NSNotification){ + if let type = notification.userInfo?["type"] as? LinkTypeEnum { + Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { _ in + switch type{ + case .about: + let sb = UIStoryboard(name: K.StoryBoard.sideBarNav, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.SideBarNav.aboutUsVc) as! AboutUsVc + self.navigationController?.pushViewController(vcPush, animated: true) + case .faq: + let sb = UIStoryboard(name: K.StoryBoard.sideBarNav, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.SideBarNav.faqVC) as! FaqVC + self.navigationController?.pushViewController(vcPush, animated: true) + case .support: + let sb = UIStoryboard(name: K.StoryBoard.sideBarNav, bundle: nil) + let vcPush = sb.instantiateViewController(withIdentifier: K.StoryBoardID.SideBarNav.contactSupportVC) as! ContactSupportVC + self.navigationController?.pushViewController(vcPush, animated: true) + default: + break + } + } } } diff --git a/WOKA/TabBar & SideMenu/LinkTypeEnum.swift b/WOKA/TabBar & SideMenu/LinkTypeEnum.swift new file mode 100644 index 0000000..bdd65d2 --- /dev/null +++ b/WOKA/TabBar & SideMenu/LinkTypeEnum.swift @@ -0,0 +1,16 @@ +// +// LinkTypeEnum.swift +// WOKA +// +// Created by Bilal on 04/06/2024. +// + +import Foundation + +enum LinkTypeEnum { + case about + case faq + case support + case profile + case addChild +}