From 73ba7a209d241c0fc63cce52d06120e7abf0efff Mon Sep 17 00:00:00 2001 From: dhrn <14145706+dhrn@users.noreply.github.com> Date: Fri, 21 Feb 2020 16:19:08 +0530 Subject: [PATCH] [ADF-5079] Claim task E2E (#5490) * unified claim and requeue task * * highlight filter added * * removed unused method * * improved test * fixed conflicts --- e2e/actions/users.actions.ts | 8 +- e2e/models/APS/user.ts | 1 + .../adf/process-services/filters.page.ts | 6 +- .../adf/process-services/task-details.page.ts | 18 ++ e2e/process-services/task-assignee.e2e.ts | 233 ++++++++++++++---- e2e/resources/apps/Assignee.zip | Bin 0 -> 12513 bytes e2e/resources/apps/Test Assignee.zip | Bin 5886 -> 0 bytes e2e/util/resources.js | 15 +- 8 files changed, 221 insertions(+), 60 deletions(-) create mode 100644 e2e/resources/apps/Assignee.zip delete mode 100644 e2e/resources/apps/Test Assignee.zip diff --git a/e2e/actions/users.actions.ts b/e2e/actions/users.actions.ts index b53a257638..a62ac00757 100644 --- a/e2e/actions/users.actions.ts +++ b/e2e/actions/users.actions.ts @@ -29,17 +29,17 @@ export class UsersActions { const user = new User({ tenantId: newTenant.id }); - await alfrescoJsApi.activiti.adminUsersApi.createNewUser(user); + const { id } = await alfrescoJsApi.activiti.adminUsersApi.createNewUser(user); - return user; + return { ...user, id }; } async createApsUser(alfrescoJsApi, tenantId) { const user = new User({ tenantId }); - await alfrescoJsApi.activiti.adminUsersApi.createNewUser(user); + const { id } = await alfrescoJsApi.activiti.adminUsersApi.createNewUser(user); - return user; + return { ...user, id }; } async getApsUserByEmail(alfrescoJsApi, email) { diff --git a/e2e/models/APS/user.ts b/e2e/models/APS/user.ts index 1d0d322db2..7b43b3dbf9 100644 --- a/e2e/models/APS/user.ts +++ b/e2e/models/APS/user.ts @@ -32,6 +32,7 @@ export class User { type = 'enterprise'; tenantId = 1; company = null; + id = 0; constructor(details?: any) { Object.assign(this, details); diff --git a/e2e/pages/adf/process-services/filters.page.ts b/e2e/pages/adf/process-services/filters.page.ts index 9fc7807470..41bfadea7e 100644 --- a/e2e/pages/adf/process-services/filters.page.ts +++ b/e2e/pages/adf/process-services/filters.page.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { BrowserActions, DataTableComponentPage } from '@alfresco/adf-testing'; +import { BrowserActions, BrowserVisibility, DataTableComponentPage } from '@alfresco/adf-testing'; import { by, element, ElementFinder } from 'protractor'; export class FiltersPage { @@ -40,4 +40,8 @@ export class FiltersPage { return this.dataTable.getAllRowsColumnValues('Name'); } + async checkFilterIsHighlighted(filterName: string): Promise { + const highlightedFilter: ElementFinder = element(by.css(`mat-list-item.adf-active span[data-automation-id='${filterName}_filter']`)); + await BrowserVisibility.waitUntilElementIsVisible(highlightedFilter); + } } diff --git a/e2e/pages/adf/process-services/task-details.page.ts b/e2e/pages/adf/process-services/task-details.page.ts index 8a3cb05b05..55548aae10 100644 --- a/e2e/pages/adf/process-services/task-details.page.ts +++ b/e2e/pages/adf/process-services/task-details.page.ts @@ -64,6 +64,8 @@ export class TaskDetailsPage { emptyTaskDetails: ElementFinder = element(by.css('adf-task-details > div > div')); priority: ElementFinder = element(by.css('span[data-automation-id*="priority"] span')); editableAssignee = element(by.css('span[data-automation-id="card-textitem-value-assignee"][class*="clickable"]')); + claimElement = element(by.css('[data-automation-id="header-claim-button"]')); + releaseElement = element(by.css('[data-automation-id="header-unclaim-button"]')); async checkEditableAssigneeIsNotDisplayed(): Promise { await BrowserVisibility.waitUntilElementIsNotVisible(this.editableAssignee); @@ -417,4 +419,20 @@ export class TaskDetailsPage { return this.completeFormTask.isEnabled(); } + async checkClaimEnabled(): Promise { + await BrowserVisibility.waitUntilElementIsPresent(this.claimElement); + } + + async checkReleaseEnabled(): Promise { + await BrowserVisibility.waitUntilElementIsPresent(this.releaseElement); + } + + async claimTask(): Promise { + await BrowserActions.click(this.claimElement); + } + + async releaseTask(): Promise { + await BrowserActions.click(this.releaseElement); + } + } diff --git a/e2e/process-services/task-assignee.e2e.ts b/e2e/process-services/task-assignee.e2e.ts index d16bd80c47..7c90d82a2d 100644 --- a/e2e/process-services/task-assignee.e2e.ts +++ b/e2e/process-services/task-assignee.e2e.ts @@ -32,77 +32,210 @@ import { TasksPage } from '../pages/adf/process-services/tasks.page'; import CONSTANTS = require('../util/constants'); describe('Task Assignee', () => { - const loginPage = new LoginPage(); - const processListPage = new ProcessListPage(); const navigationBarPage = new NavigationBarPage(); const processServicesPage = new ProcessServicesPage(); - const startProcessPage = new StartProcessPage(); - const processFiltersPage = new ProcessFiltersPage(); - const processServiceTabBarPage = new ProcessServiceTabBarPage(); - const processDetailsPage = new ProcessDetailsPage(); const taskPage = new TasksPage(); + const apps = new AppsActions(); + const users = new UsersActions(); + const app = browser.params.resources.Files.TEST_ASSIGNEE; + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'BPM', + hostBpm: browser.params.testConfig.adf_aps.host + }); - let user: User; + describe('Candidate User Assignee', () => { + const processListPage = new ProcessListPage(); + const processFiltersPage = new ProcessFiltersPage(); + const startProcessPage = new StartProcessPage(); + const processServiceTabBarPage = new ProcessServiceTabBarPage(); + const processDetailsPage = new ProcessDetailsPage(); - beforeAll(async () => { - const apps = new AppsActions(); - const users = new UsersActions(); - this.alfrescoJsApi = new AlfrescoApi({ - provider: 'BPM', - hostBpm: browser.params.testConfig.adf_aps.host + let user: User; + + beforeAll(async () => { + await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword); + user = await users.createTenantAndUser(this.alfrescoJsApi); + + await this.alfrescoJsApi.login(user.email, user.password); + await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location, { renewIdmEntries: true }); + await loginPage.loginToProcessServicesUsingUserModel(user); }); - await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword); - user = await users.createTenantAndUser(this.alfrescoJsApi); + afterAll(async () => { + await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword); + await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(user.tenantId); + }); + + beforeEach(async () => { + await navigationBarPage.navigateToProcessServicesPage(); + await processServicesPage.checkApsContainer(); + }); + + it('[C260387] Should the running process be displayed when clicking on Running filter', async () => { + const name = 'sample-process-one'; + await processServicesPage.goToApp(app.title); + await processServiceTabBarPage.clickProcessButton(); + await processListPage.checkProcessListIsDisplayed(); + await processFiltersPage.clickCreateProcessButton(); + await processFiltersPage.clickNewProcessDropdown(); + await startProcessPage.startProcess({ name , processName: app.processNames[0] }); + await processFiltersPage.selectFromProcessList(name); + await processDetailsPage.clickOnActiveTask(); + + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.simple.one); + await taskPage.tasksListPage().selectRow(app.userTasks.simple.one); + await taskPage.taskDetails().clickCompleteFormTask(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.simple.one); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.simple.one); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.simple.one); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.taskDetails().clickCompleteFormTask(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.simple.two); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.simple.two); + }); - await this.alfrescoJsApi.login(user.email, user.password); - await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location, { renewIdmEntries: true }); - await loginPage.loginToProcessServicesUsingUserModel(user); }); - afterAll( async () => { - await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword); - await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(user.tenantId); - }); + describe('Candidate Group Assignee', () => { + let user: User; + let candidate1: User; + let candidate2: User; - beforeEach(async () => { - await navigationBarPage.navigateToProcessServicesPage(); - await processServicesPage.checkApsContainer(); - }); + beforeAll(async () => { + await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword); + user = await users.createTenantAndUser(this.alfrescoJsApi); + candidate1 = await users.createApsUser(this.alfrescoJsApi, user.tenantId); + candidate2 = await users.createApsUser(this.alfrescoJsApi, user.tenantId); + const adminGroup = await this.alfrescoJsApi.activiti.adminGroupsApi.createNewGroup( + { 'name': app.adminGroup, 'tenantId': user.tenantId } + ); + await this.alfrescoJsApi.activiti.adminGroupsApi.addGroupMember(adminGroup.id, user.id); + await this.alfrescoJsApi.activiti.adminGroupsApi.addGroupCapabilities(adminGroup.id, { capabilities: app.adminCapabilities }); - it('[C260387] Should the running process be displayed when clicking on Running filter', async () => { - await processServicesPage.goToApp(app.title); - await processServiceTabBarPage.clickProcessButton(); - await processListPage.checkProcessListIsDisplayed(); - await processFiltersPage.clickCreateProcessButton(); - await processFiltersPage.clickNewProcessDropdown(); + const candidateGroup = await this.alfrescoJsApi.activiti.adminGroupsApi.createNewGroup( + { 'name': app.candidateGroup, 'tenantId': user.tenantId, 'type': 1 } + ); + await this.alfrescoJsApi.activiti.adminGroupsApi.addGroupMember(candidateGroup.id, candidate1.id); + await this.alfrescoJsApi.activiti.adminGroupsApi.addGroupMember(candidateGroup.id, candidate2.id); + await this.alfrescoJsApi.activiti.adminGroupsApi.addGroupMember(candidateGroup.id, user.id); - await startProcessPage.startProcess({name: 'sample-process-one', processName: app.processName }); - await processFiltersPage.selectFromProcessList('sample-process-one'); - await processDetailsPage.clickOnActiveTask(); + await this.alfrescoJsApi.login(user.email, user.password); + const appModel = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location, { renewIdmEntries: true }); + await apps.startProcess(this.alfrescoJsApi, appModel, app.processNames[1]); + }); - await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.one); - await taskPage.tasksListPage().selectRow(app.userTasks.one); - await taskPage.taskDetails().clickCompleteFormTask(); - await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.one); + afterAll(async () => { + await this.alfrescoJsApi.login(browser.params.testConfig.adf.adminEmail, browser.params.testConfig.adf.adminPassword); + await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(user.tenantId); + }); - await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.one); + it('[C216430] Start Task - Claim and Requeue a task', async () => { + await loginPage.loginToProcessServicesUsingUserModel(candidate1); + await navigationBarPage.navigateToProcessServicesPage(); + await processServicesPage.checkApsContainer(); + await processServicesPage.goToApp('Task App'); + await taskPage.tasksListPage().checkTaskListIsLoaded(); - await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.one); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.tasksListPage().selectRow(app.userTasks.candidateTask); + await taskPage.taskDetails().checkClaimEnabled(); - await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); - await taskPage.taskDetails().clickCompleteFormTask(); - await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.two); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.INV_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.candidateTask); - await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.COMPLETED_TASKS); - await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.two); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.candidateTask); - await processServiceTabBarPage.clickProcessButton(); - await processListPage.checkProcessListIsDisplayed(); + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.tasksListPage().selectRow(app.userTasks.candidateTask); + await taskPage.taskDetails().claimTask(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.INV_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.taskDetails().checkReleaseEnabled(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.taskDetails().checkReleaseEnabled(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.candidateTask); + + await loginPage.loginToProcessServicesUsingUserModel(candidate2); + await navigationBarPage.navigateToProcessServicesPage(); + await processServicesPage.checkApsContainer(); + await processServicesPage.goToApp('Task App'); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.candidateTask); + + await loginPage.loginToProcessServicesUsingUserModel(candidate1); + await navigationBarPage.navigateToProcessServicesPage(); + await processServicesPage.checkApsContainer(); + await processServicesPage.goToApp('Task App'); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.tasksListPage().selectRow(app.userTasks.candidateTask); + await taskPage.taskDetails().releaseTask(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.INV_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.INV_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.candidateTask); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.MY_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsNotDisplayed(app.userTasks.candidateTask); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.taskDetails().checkClaimEnabled(); + + await loginPage.loginToProcessServicesUsingUserModel(candidate2); + await navigationBarPage.navigateToProcessServicesPage(); + await processServicesPage.checkApsContainer(); + await processServicesPage.goToApp('Task App'); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + + await taskPage.filtersPage().goToFilter(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.filtersPage().checkFilterIsHighlighted(CONSTANTS.TASK_FILTERS.QUE_TASKS); + await taskPage.tasksListPage().checkTaskListIsLoaded(); + await taskPage.tasksListPage().checkContentIsDisplayed(app.userTasks.candidateTask); + await taskPage.taskDetails().checkClaimEnabled(); + }); }); }); diff --git a/e2e/resources/apps/Assignee.zip b/e2e/resources/apps/Assignee.zip new file mode 100644 index 0000000000000000000000000000000000000000..4ef1736dc7549f14d309a8f98fc89a900e8d1c2c GIT binary patch literal 12513 zcmb7qW00il(rsJQnzn6Q)wXThHm9dKZJX1!-92sFwr%^)oG)(deNNnO$GKTi5pVsd zta`GtR_43bl9vJnLji(4mnd=0iXN;R@O z{*LQ9|^g)LS{`w z0gV)Mhmji7VO+S3LWmO@y7aKx*16f1q=rl#AKXai8(zj|(U$aqVZ0vNW%na=AO!kZ zZ4tL(iKgM4sr|UOEHR>&=0+E8Hr#XJoH=MvPW=zMkK}ijc3^oaNT|u2CVn7bARs#s zARzhwwRE_@OJ`_rV@qpeXKZ5aMDJu_V{dIj%gDmX%=xcUo~vuw<%yzvP@}Gk?ZPr> zlgY8_=a;UU&)3T>o3r}W@Ll{3s+UBVcw)RSz3)|5Wy)|ZVYW=CzeKGo=UL@KR#_Uyy6m30y&9@8 zZ>e$ZxEybnl^SIQdBNRHmKHSBXMmH&j2=`d6LPpp7uIfXYu!Djqmrx<|Ld2h@eX^3 zHl>fJ|3>X}-%?lSr9bFBR_^-{niri#>e9MxI?_7+%=#`u>MQgE@n~P@Zu(OA*O(A9 zPu>T=2lWxvkg$t> zC4@x?;X5^0cwMLH>~l)BAx5=${d}+z6yy@210JwYDc7JpRxob}B;ubSp=MT0&F$qS=^HyYi8B(tkFUeu3HM0mgyYN_#E?d6+t?dZMM!y zq^4cZ8k`796Wnk2hKqUWn7gs*^`KcZdOD0XrXe(HM(F=cr zP%OpYH-r1io=04k>iRr)qj@FC-!FGeIYdW2eL8#$Hj~H+l1G-YQ!SBYh*&Rc_v!oz zIGqrrK$-(!r$L^hlz4abAGKYV*T29Wo6uMPhd^Ap0O9NDAdN@cj$N<=;*W(f$u&d-Vzc~2G|txB4?VTdIG1@I)(>I;F~N3hO#jf z{pqj~f}2EI2cI*^$JWN#YRAUPNE@ep>l!4&+U_D9 zbpqHD=jtNEP*LOM)@^h^k&n$b8U&~h4_(AI0`WPQfUO=Bz;xGD3%tdt2+iX*)k-cN z-R(5DzR3KO@0|*m0C1Gyt@g_)toAu;spPWZoAn9pGP3>N#V#JfF8v?q3;Gx%t_A}F zqD1{C=)?IZ=(D#qvr+cqn6p6nXt_(r1UL>4ge++%Yd{2Pn}t!F##s%y91&s0wlNge z&*oFGtS~~HYKBNa2pObeu^1_|1Qra0AVFx9aADNJMQ_1GkJy5_&F6C&ay-=7J0uc;j9GzRzy@TkuOg&qv zS@)V28rrn6zf7?#vTF&8^pKvlAa$l?p(7q*`#Oh04(`pqVsT7tgluG#FlI!$f9^*o zPQpZvLq_MxpENXfI`VS>*F|(VFsj`bKh37f)+i-fyQ*k*{^sUJRjN+K+zkCtKds;9 z{ERM`{itt%hm(ZAP`z=rxvgSBDCIQ$z$FZ(aKWShX$FkF^{GA^8`?-LmxFzqs#N!BDM0hGn4ck1uCJ$;?JYRJ{K^jZ= z(!CEJ%W9gn>5lhDlS^)EXf>!jw+Hf`%a6Ak`cxsydcgCdSWwbtuV>d%blOF9ZA%xY zlptN@rKN?slK9Ao7M z*NX_(@|xa=GV6MoY`Hx7$+TFY4-itf2yB(gE`3OdZC2d{#%x{Wn51Lxo3*Se(Tr}# z!j~%v@e{5F2kCx3I@;&a+w=@a&Auic^Gi{m@9q{DNyUPP*HzZ$ZeV3%QuKi-X)*RX zXXg;0?Jkx_`$ZKuqy%BdKBr%vb?S1!{wj5H71x(ffGGZ5SOC0`nwU6GG2y8>cMMg< zs;h24Lh`FPPJNyv25#TEQg|{#fDs)QcUTx@o;}Jl#^(y}T}eUVNE<1sWyMD9E}ljrCs#BPLO8_hml$`H)1QwEj1UJO^e7!VS_v`k8|U0XWYpk`K=8h$;@`?yQesiIR4o>M5f zn-Fm4ZUq4^8ML?(|Z8X-5Zria=wC;Y+@;u<2A^FL3*7G!RN=oz!x_CT8jD;^0Rdh z(}&bdkA=~#U9PMz^em%!EG;c@mDh><@eWv`!*>TK7JJ0IC%ad@1o`n4p)d?1;QS=d zGIpvc;T;r}s%57vS-M5b%46uxG%L}M2t?gT15^rquX2@ci>vxCr`(p?s*d2q7*acn zuWj_Zn313;q#j>Mj9P_)?DA3^80d1*)sN7+A*jZpMKTyhZ#W~|J(`Fu@73| zVrIcIL*_vQ@^@SWF8z&LVG9#}0Ceb?(vrR0VMtR8DZlx^hG7ar)l$;p`KKI&>#wod z67}>*tcQyA}h##^5#;!Ob`#o#P=Ma2UwRnnY)6NDAhAmW^1q8$tV6UMe6a&T8 zlcAGbtk0y&Hnk`~Bp6Mc?B4JX^w!gxzufFtd=>nTRDuu~uDPQ1)~Z@bBM^2gow*|2c={|x zp(7ip(<(`zLaZs&1D%ekQCO}$$J1{5t|sxRR`2oSWv`z*NUvZRE+gd5ga%LTm<1cm zjjz=UArsHKnzNW-82zdEv^K0zVK9r%w1GM!>Yy34Bgjz(Q=Q;(E_pS~5u|*;Y@mNA ziP2h0O1{P$yU)6H&NtmS|7UKUoD4ETf5Yg5Hk3rInUQh7SLtfM57W(?xC=@LV^%vGz?+dwLHqoQTd^8&VI zEAxK)u70K&!p{TmcuBy6wGa|WBR=(P?pSXa#<)#Rih4ji=y4}{d@N+mePvDZ0 zi7__R2UjA=Fs*i9e==sZwEO+IhMZE{#zjG5d;39&1U#+sx&oSd8WtRRd^UEsn83E9 zh)9YU%@J;yD2*6UdZLpAkn4MNG82|lNs*COY0|-5jw2=xS|VfO9u{pBz!_|!SyjCf z2)eeo(hYilp}Dnh^A3Vr!maXL)((H&KVOXWw?OMtIl;c1ynio#SOnsp2ndAP=f|yc zNG|nJCbL1X!PhhGHry1u9rfodJ^OZejm*#eSVhj;k=IhHN=FFw=RIi!qkPVLzsOYB7%KWSM{lX_~-%Ec^ z&EgV7aTxM2-!QH>Jn_7U6hH<)#l~N8V*g)tDgl?Yn*Ut|so#Xl|2{xS{+l}ezVm2M z_u!b@?8KMq(1^$Qy8K8eHAELkxVi+f4S3KoX0Mg4HH9W5)xbLSP9&9LkzBCD%Be9+ zt|(u=Ol^I9Uib3ty-ud<3HMN)r5iygoXH+ zGtunpMBS1vMYhG}vLu_jR(PS?6xcyO7&ZoF;YR#v#uxDxp8M?qBgM?U^7EpK* zN*6CeZ@>mcO`SV8zRTGWwyYVbuA?utKdl(+vr(y1#SA!vV@kp=DMujHKv50JSX>(d zbcn6U)no>S*Ts!`Yp<&vU!ALYwmd3=SIJCN$xd`JpBI&hvgq%S85!nF7?S46hC6aw zMMwwLQ5^e0%JVICkJ)fBrRh?Z2f%ZODPow40izY(6z8FUjjIKf%o3zLW+^1Jo-68K z2sscH0bwc;(gpIu3HqGlfiZs$omCy`12fkL!=Byv)gTVWQexf3D6+%w5tqqM@cG1M zaISv6=4AyHw283Jp~|l>7Ji}Z(Jz~V#D8jSYt!*~e&S}GX!tzNfb335hPSOZ<#oT> zQWjROe|y%o^h$Q(0&^-Phm914#QLH&;PUt=NAnH^ZI$8R50z_$&i%fXM& z)K)*%7nPF}(EG@Kcv!SKfD~psg`~GhiH)E`gD8(X-#IgKxq2f6FtAJ77G{Qt&W`Sm z{{;UMIyo}=Nb{oVpshWI&lOLQk4lN|;jjAd3|H8K!J zdB8ri6YtXfI{G%Kd39Yxf0v|io8#n*(`GPLN^|oBWv!dG)OUS`cKPa+6T*p$i;i1W z%|115)4<*~p0J3km#EVlb)m?`BkJa#)5sXKC`kt|EIql*spHp7x*Kke+8$v#=eDD5 zkC$yGyi~W#Y>*}{F2|bf&JxSIn2f(~!hGBiY`X)4T)b-g0`v3p(H`(i(4yu7FDuOU zN19LIlCbWyM3;s|aKO}AAyuw#Z{7BnHc=IzS7kvr+szW6W;~i_U=&P;j(Inp7H^iQ zAG>)|)nxpr86WFlNK$iYbv?WrsvhH%!wtpDGt6KHA(a>z9 zLHq{S?RAaRbZ;0K)jYV4Lw8#LtAU{btwQmOGl@GzR)2zQhGSyQxA#{Yy~>%6N0a7N zB9osa6+{e1s*T_RijjrD3HKJ}l+YLn3}k&xr&?`V+}9tnO-C<*OV`%cQYcohB=&_(}w1;^N* zcZqwbodP1SvM9e%G|FY~L;4Zr1hl*(ul`P={qrWU zZL$<8ek4tk_1gKM9o?a6AYHxyf9>IlXh6e)C@uxQZwD1W!bJX;K?Zx4AM@_VdtG71 zBD-!myIpY_ktD6vndGz&=p@VGVJq_~BPo2gTc>E4Sy>|LVyIkKwQ4(e7CyvrY`%B)zRo;687Bk=F7M(Yh(*veX@f$M^jp&@1C^S8l0vAie zefcsD;bp0?&}$A*Mmt8)gpJoV9v*!RxTp_$ZBC#-GDUqO~Y+}a+tY!>n zIZ*CrL`1aGO3_z}tD?o%YC@>5d75TFkMZ6M4D*UggS^@5(TZTBDI? z$riT59ID3p(lXQrS3i54+9}gg&crq0Uk&h)l$`}|U!u_o&r&b$VdBL2Dbb(C@42KZ z>{)VYivbar(`;3iKjMWy1F#!B9>6b9>uMyz=o>bnLc2z>-ETm;qv+R8C=3%slKVPa z9egs$_O6>N;4sj-{qFz`c#JrZ_0T*@(Tp?5SDhW5S)c)d*{MB|pFd z`;ZGVaswJNdI;=sH2ZqEt#?daFD2~58oeH#Sz4P!$H(u)a%_d-J{P4!Ftxqm+S<}VF zmcSz!0}Ee4^Tr1~$VYrSC)AS7bfR}2wX-5}rz)Ex;Ja+E4h|O8%X1IlmazlHu3k-| zN=sziWYf@mCuRBYq)}nNn&J%sKAbS2nA^`M1I?+Hu9g!Q9~v6HouZ0R*@Ds9sZoeU z40h0^b&JsRbvmm1tjH~lZen5qb@-OL1@$K3c-5iNQtWJ1b#L{FWKGBh-BRy%mE(Q= ze7oLtdZ!`hCbNM*!7G0X?77#@45r2eZ1490N{3rH8To`%#lIj z)OZPQqwEaT<%0$K{ka1NW=`S5m(gP>LTX>}_PBndbM`H?$@(SJ4jKb;iWRUo<-E^#_@Yw zziTHaCn$$nYr>TCuyQ7oVhK|l&$dp_4j7zxS?!o!w9o~A zI(5`MEzIrlLan>h#Y`{#7-UcoiN-rSldc%x2Aa~_P`~5IlVzs^^Xu)bPqxT1=ovaZ zCCD~l60EbH1teeJ4-oFV2<|y-XAYdt9`C%uVtcq}pV!2bmfKk@J$>VKho4L;vrc-p z+2u%LT_6(x@+SIg@Wg2`zo6id_t?Hh7#7|@CJ3YdaVKkg>iLBv5*av-a@wH}JS{&M z$I-qQ0_Z-BfotqdJ!6NYFg0z&)1Ro5&d*PY>q;jVa?tUFKB>!>XR639 zo-?_M@{aW#WFBSHkm`_mtseQDQ%CtOo1}6j6a0c-&mgu&Cp8c;R(Y}V_Ny!m-D#ot z^$~m&`$;7S?t*U9_l@OUf{V==qA# zbY%2Um9EI6R>{^Zuh}Q_>c^tSNs+=TGEoJUZM=`l41C2qSz^$GDZd7hD{FBHbFM~d zN^D60*)^S!#bgA|0RqTcCXbY;bG z%lJ!{ja&5V6@8p~mGKuI5n_-^U*qKaBakqXuE{D^Z4=^pHqB&>L(ZNHTU~?c%R~+P zU+TrgA3=!$y{C~TP0wF;n{aF{0t!T!*&1Y_VS)(&aZHg?%teYZbn2Gh37z}0N9|S` z=@>>g?|rbH3g>)1a`-y+=BbgKPnu|fjd9mpVhHq2MMMOoFLjYo&R77FvXXJ3+UJwW z$#znb60xXx748ii9HT&s^NGqe3>KUlxLWG<13$)G3$0zRd748Uv!M(K4b3&|I`Dzk zq0$xQ_h(b$|8##6jBokUZ?Qpbxp&4r6xAV;&!%d0`^hgkztII-kQYabX$P}GY zU@ZFU$ESte$7(UA97QTzUrX1m5~`SRzF4LGy!?@}`hvKAjk=(fJHrBOc=PE%i3(m> zBa^a$#L*Q%m;r6)Zip?-+P7*_Dbn1qR~qEG$r7fED*G+NCDqFY1H-dgo2`@CaPnm< z!05fmMB~y&@q8l)2nf6Q`*qoE2AL@IG?GK|ck%Uymv$b`L*%(>;;G_e<~M31vSv*x zq}!wW`T0^FskpEuMhvmu&8&|wK28Asd^d|u<#+F!j{zrbqU_mdo`W;&0VJd0CmB1q zt8aRYzYP1jsbjadf_T|xg?Lzd2gCe$#-4hgabD9a3_D!924qHIP3&;&X3^(;l>zPG zzo-E-6(j1?Ek7`=bksJcSkf1vyvI;vZy0IwSrtTu!8+O)T}YF{bknTN-4Z#d12oYX zN7`VTzUalXx-f?=`j+EJ>g(dugdtYE+jIVke(qDCK>#sUqk)(E$ops#2?^{Q{aA)) zRH>(mjpP>Cq@*5Y+S=XE1gx3IXWxJy$KHhx!OSe1R`I~X3EiV;|9Z3~DCqr%o9 zd#C!=TrobPKV4U!zxRXQ2TM3WasBuk_Uyawr%Ob13dArFIQ@kv8>1yX8anzT`3)6y zllwRC+!POiK#ih4Pn~`WT0TU$Dfp6h zuFa>X31M$Je045B;@wv|O9>DMyP^9cJYUj_+I_i{`gYGJGnp+0Qt-;f%d0z-=W)r* z{w1CZF{8fB+E9*ANje>Vv*f#pE|U>6YVfjxtbY5v|~8Fl$_Cqb(r zZ%p5nOP$iry&^10cwpZv>|o7#EZ>1Q>_03ehfVAo4Kfgr=0EEF)c+0p_Lq!Pp}HxT z$B+2!v1-fx7+L3Av4wIUmr$Y4^(JHj!eOK3!rGwa970*NJ0e+>;+7@+5dK45Oo1W0+h5~SGf3AF$bSXM^hl+y_e z%f%pbV34i_szKp)c6D-zw4P-eCw@iLc~7CIyGI?M#kAOl5$m>|t)F_I->*OyjDQow z9GnY)8}Y?g0T@Ncs|h$q7Q?~ZW(?FnBwX??s|~(+MIy^~G-0!4v-2Oy$jeoti5u^X zqR=tIIpTEjuH;BF>(>VRP*`!}<-KB$3B>}N0bg0+fJ)UYy4vAlLJr(7`xVN}&|C{6 zMTR)Kt7l|Jb7J7sZMKSv{A^O~K_hkN9Gr|@+Sh=miVGp7%DC>Qmapt7DTq3ed5RAw z3k;{AR9%G&D6pa#W=8ndBL!DJM5#yec{$Sb;l9wkSfm+Nav-%nT&hF~BawIfSxXiUWtfvN4=|*c^$sC$av&kW zge|rU5sWLgOtyTrLH3e}D3$SHd%m&f3zSqjCxi^HhB3obt%BE7$YTZ4Pc)_1Hr_N~MP0^IxL-o`oN1+m#oLe{4+h~HnHgp2J*VI^wc z;kGh5vQFhl39lmkXbD}mxzdHrg4amNfNuKZ$P=DGk;GKV^ZZ?Tp4>J$wrO}Ki%&%Q z`5Qu85WY3O?yHsJY(kXWc{^=KAMF*BOh~hf$+(?H`%m3Xg(f>Gzp>9tkTX1B*G?cS z$TC?ouODl;NSdZD4r;r*=R=5m$;H=hoUdR0{GUYakI^1~+Xmxc{)x^00&YlOWD4X4ln zFar$F)Ig^6X>DG7HaR_H`f?Q*LAaUAqq*zUa_dy0l?6%^$Lya;rc#;wmVD5Htp*cG zl3{6Dln(OlTaDlwllJvGNv#JJ5_m5RpQbFc%_{Oi>8986*vw;v;yU@TT(Bn~zkZQ3ISv_jeh;l%_&8-obtoT(Q!BJf1o0AK%n#0ly1qG;3 z7_d&=&jwlmgX1MoP(H@g?c6}@Z{Vtb6M%_w>fhge^Zwnc?UQ)X*!J*|I6SCn=&N5d zL6=4)+aC62o5y)gYA@oyI(bB^&cf%v{b=#kv5lB9*9N!=eaWVua*8w{>{?l!x-d`J zx&m#Qi(TO3ZFca3RgoLH(R)hW*NEr{q{F(8-?y8YTESphyP-v2YXAfKihLCcZLDK6 zy>`AJIhRP!;pJasbc_%7JgV*S&LrTM0-dp13}K6dw~m?m`6B`XRK=Z*+wrt{t;#Gi zSCTyS-WOQi4Fsv1v0rH7TMxYt={Fvk(lLbc4mn-cVze@omkaLViGY)ANYr_=0IaFy z2v2>nycv+mt&G9>@ZB&Xt_FEjcs}jT9KRN!?P}Cr#=1#s_X(>OC5OYT>N+rgyU8xy%}XsK!XMI0l4=}@18~o%CLHlKvnJO; z=kRNGNPj$g_WX83L&IjSpypmI65HA0?h^|QhZ`oSjlFsQ7Vxqzv=wyajuA2PzbTQVsYF+#b zgv)7Eu6sX}EM?paI&OEl6zoA0F5RPAE>xRsv;w~$f8qwoMDar=% zy*Fsf2jf1%eI_f9CVRmdTte|T-Yxc(9!cQowx2E}miF$Hp{S|99<~}m$;P(ckhN}Q zQ0Q+7wx^DZI7V8um;`PB-?kV;@dE}dRAEIWY7-<|LwUN%V4}jt@1_#X?b3aY_;cnC ziZu2*Q%0ga&#y0K_LI51PMC7%6;79Zh2DvU?)7uNOa_xn$ey@nL-nU$C>_2vyx-Kl z-|*FM_GB+kd>VvDH(Qx-Y4bJEGYGzYR*JeVkB~{d;>WJ#FH~aR z|A2Sb3NZ(x&QaD%CyDHF!gDs-8Bekivj(G|JZU$1{+GEK*Rj^>?6=m|`Y*!5D3oTkl^m_gghJq6B35t5+GP`cXx+D2AAL-e30Po z8hpcUZN2<&_vP#As@qk!Pxbx!yXQOiD9NH@fB;xnSb$1P1tq|5f&Xi)X7bSvEd24K zg_(_s3A5!#n2k^9E2}ov$6sz`YAWr+f<&8j`9Sq{{?I7ge7Ju|SNV`WTF1{O%`kdI zmJ-uN&6;cG2(H2-EKWpM`4n`d{kaGbh{Rd;ksvPEn3oG4zs7AdA7UTfgNAxK>8ed{ z%fg4esvmWdqrYhE8W-X}$I2DlW?bhh$BgWNq~qk?@9#Z!syMYKgq@oD!3?o=IsiXX z?R>@V3ZS#j7At$+2jx}*Ll^8zcWcOJJ zoWh61ucT}hMj2fL!{vJ(NBW6ksWT~hg+NIb6N}{$8~wts<-6Vk0F?eUL1e#X{Po`2 zhRGUcZ1V0Si|SkJ_wP)YIN3Nj|2tK)8oICy9?%WTwv~KytZs6&Y^X+jk;ceuj&kLP z7U_C|cjH_;YU($alaSC%X-pJS`Y61s)A!@~!1-&3@?D4Cmlpjgg?R4Z#aH@8QM|6@ ztIPo|)5vm)BFA-}s)~kkRQB^la_v**ft$IRO)FstOkDaVw-BlRmwiYU+(cSjOPYK2 zi6!&*rknZ!dIM}d-RT9LaAvwT&M-V?e|tTKu|Bg3{t{Cz;)1D`kMk0c7=72Px0|D5TFG_NwSPINhS8XedT(rNMgxTx33)5dvJ5;n78Y7M zveM5`O?i1<&-8odtM)#z?Rb5?Q`Q!Hd@7V1vYq z9W`%0O4LdYthMd=KSod;3!F0eeqNzwnD`8x>p`y?ckw@Ij5S}$jyg_GoZT>UEYL_S zSNEN>s6(J7KcaS52G2wC(3RqIzz0d7W}b&4>->(P%!Nh83xQp2sb*v@p0>O5!}1$s zPWrO-SU4b4W+5M9G|+M|SNlCI5s)P`Kv_dBu2(SJuc_>chbwG@{w(ojO>Y0OPLj|D zMtEt!=wzlwI*l(5Bc7mT1tH(ohV&~gTB0IL^6smL6yC>74yM@wSn_2L$)6Lh1wF}f zt(`k`mX~eG!q=Lj;eHaM_C|ki(^avzlFNGE5INO8+`Qe(N|<0&&84-a^hLWP$d2y& z+ex@-N9AZgPB}!x>lJ9T4(pYd+2!U=wo2#t7`L~yOZg;h&UrS4`3BO!mS{>rBN^7l zF_dtxTnLKc$Oe5#tDz?h-|!xLv8@eX_bFZ+<2I98oknswYe&y2pxw1|1U zshpk;8xsnKrYFqJAC%jCNh4l!-1ce?;sl5%drr!WhOR0n*ZS-Jq`&B>cfleLafzOHvA@}}EZY~xZ^l>- zi)jWQvHwUpUeqbIJgh!FMhLEnUUfdU#@}dqH2fHs#f6MaH$)I}K`x>y#cNSYota2v zWY{=f|HZOly6tT;eepk&M?PKq*i>iD!w zNQa6{N5KKfQW8qa^h>>w^dZ);UzGe(6q~*8b05D2tO)MjWi~JTrKw2GzmCSew|SgT zw|VP+ggEcMI!kumy&m`kEB8vu%B)G}0RTe3>AXz@0Ki)F2>~J)_Um#CxPZsmMr_#w zPcmeiPNtj*)iRtC4idy45Znt_r>31Fs9p-kpnoX5H6*%dudU!q1_)9xq z{U*)<5bz59vq-k8^-gb0MZQJh!=2VqE(H|KqU2^ebAv~$^mr&A=+SmBGjwdMF)a%Nv)X?}G60?fX&L%%Va!xnF zU|Bgz2IYk;#BEQ>qAObLI$m2*u(?evo0C;=4%L6lJ4en;T)!^L6`5rMRgI*^>~2t; zvwi@ht4n)pC-vf8aijce3s7UF`867;3J^p_R|xv7>Nb@^A*D|vX3_m1Y92m9yd=CM zt;sIiTu>|f=<35GctuVf*j*IJj!Ai{>3r`+$1qm+TJzvZ!CLC|hxBAg|LPcE7C(>C68bd;7b^8g z_gmv=8YsAY!{2F`(Un$yHq*A2LaZFh|1e|@r-@S1(Ydfq8r)Ou?(4B+Y~X2|o^hEf z0^5V@UKDCMpMDyHjEowS@6c(=ud~hKWSWzpy}gaUHNsvA-2Vv_tVLohe^_}Cr`Q_q zL@itII&PZMmeDxT8o2+GSfP&OB$|F#j=nO!BC;=;v=pr-*zwJ?%F=|za6{sfn=}n; zH>#m6HD{6HXD%0j<(WwO3h&OP*-HuHeakUDTZp1l`~E&P99x=I&uDJyVji2$WD1=_ zNd|JcGS`=A!JRQ=ZeM6Uj{cQDeaE2$h@KTBOaEDz@pzMRrB`mR@P{MMz$UP;Tf}B9 zo+RD6FuNGYVp2K&ejekjDq4(6dqSH#_Igf{287@E+yz}jn&#|F3UGH~NuM*q7r&<} zP2nsJGZ%^c{;2iPqr!5CZ@@WZU|_&*0h{u}tJvX55+eb)f$7rr*EYr0pHa`ip4lf& zGH{_dVB`u`TV|9Wxz&AOgfw~LrK(#H!)Tya5TmUREy=0r@r^9UG!|8X4z5C$N>J@s6uo@_-s8<{7wS~;LSudNvs71h~n$Qs?t zhGguZSc#QNxhf?UAX#M;>y}UtZWsA_h#0GSI}zg&&AB49s`v0vX=k$da<8+3uhmfEHhXD``O>ZwP2vO`nhc zf&qR4UJvo!{TL4bm6G@dY=sdL>KrEt;PW^h?-75)304w}ZQZdU*>8aJa_c<}YMajZ zj+I;TZAnl}y}_w+mSIe8|GiZ*%9#)}*L0h~4%{E10_u6I``6}_dA}CCIHEK|qzif6 zX86>hM;}UdxlfK3phC)4?PG~ey`A0f-L;5d`{+E>eE{I@{&(?6^@kR5Co0)lnH{X( z^=nz(NyzKhO;pc{MirS24W7$DdsXwRcGRp*Ilr5$IW|iVd3T~&e0OgmM!RBQAJ#N}sbWW@046``==O_nDsxp~ZK6 zv-Yi4A$k#pGpYoLiUuF9f2O^BYM%*lrP%_4TSS zhzKI={f3Gq7jAxVMid}K1aZtcPhq-N=p>h}7%aoQ0)Uo1Qi6^cZK<{*H#Nl{*Njcw-SuxPPHeM-Bc`3?*Gvtsv&` zC`N30Hd;Rv5Ddh}kR@g!h@txNEac{=rOt)eEed>nYAvwH$2t}|6UHW~C$CY(s2VRP zbzuZ`{~;P*#20S)K#mIXhb$xJW93z^BcSVoKmtwmo9h*ZxRox^L6S7x)p@ca7~S^; zyK6O$u;%4D4QD#`sv~+{z2wilWj;dL8#377iANp?Rgq&K)V5G}m*Qsj)_ay_)4z;% zlx5p?gF!b5lB)C(0?AxEg}ZjVTPBG&_g#=-NTY$m{B%?8_^%*g^qpW6DtT5lV=eUF z$964YczGLrKU1N%j+gKGkz+4Xl7qDnKQDC<4vv8xdzI_IW}mE+?(?7Dm$khnZFdU&>fZTB>K*$#2v8zz3!Rzw=JB`qV$Eg-Hr*~%rmRW8!= zn^C()m_?7FRWK8^ehXhYFg=)1mBVDJvCuyH$&Zo-e3bfI;JEQvshBZVwjbo3xw#<@ zkR3S5L9Wk@>;I#GmFsLauk=ld36XV7NvSfNpV5Gec=N3rtjdL5R!S+e@!&?qph%_> zIBzQ~g6e(N!}e^VG&}>#0*c^GUW3dnn7gW~iHXnjrpZ3rC#=3qd%`5jveTa@n1CMC z^+wdB(1j&IlVvNRQA419rMmaZzkr~IpMHFbogWn(`LQW9c!P`s{=kJsO=($%zA;gy zDyg#MnDO$pYF^iopfG&|Ihm4EbP$D>Ba!B&# z@NmD=6efq|njUY6n@3vlUyxgvT+YwPG7uE1;=b0P#>{9p3Vbi-RDk4xa=$pa*$}v4 zT_nAopuEMrqs=9Pxld~t001t@pJ?+=S)0N>SpV;tTjJN4{qD#O{qH09j+#7dl=bm7 zL)RKOjId$3);dd^uqa=}^Rcfqdp9Ys{XWlI(a76@NrhUQ1&qZG>$!@xt@G}R(#ceD z{e?85cJZ52DgshIkWUR))wI9ds8m!`Lxcph7i0YU)5~CiWFN0^v4eA2T2lY~(*v?L z-@G&UsRVy0>CUTDBJ8I=I&q;hDjZe`nOh7Y`h7M zDv|QJ!$JdBLb^Osrq=&e3+;p8fd1p5D05hX>$*_d=xUDka#L(ih||u&p8QG-pYtYr z`k3<8l)LCPwdjdq8qVOC7t#uw_9V$OFgeG*s~LxAI^@*-Q=a#azKrn`I^un*5F#f<%?`(yXE`r~PmJ71O&@RPX` zQ4O=UTNHCKK5d#vbj351{79NYF#mRUrMyLvL}IkRyvY|I>V7BZsFC$O=WU3p|TcXytI|_EW{Ak-mw9G1YWuyUm9< zD(@2+m{V5QMm9$_Tu&WlJU*H)ujdWbPX@1(H5+K6Dqo~@SfBDnz$t@bdodC5_TUx4 zzH2y=O(w&3X9kby%GER33K!?z_?(ZuWCn)s9x^K!adXfTgkzlRq!NAmO_6c%uVY@j z;ao~a_lPg!9jOb^FywqO4ZttfLs1UAWf{2YR;`j=?9ws?6(E{rxi$@ueV1hcIC>wm(-t&Y0vSJX&-mMQLllgm@ZuvM}1+x?F5h1 z@78nzuZ*jvBK`VDJiLgcHN8qfT!^wPy*zPnbeM+0PH0R-4UgoZE*k~(vhT~9UT;zW z|Cx6Z&0`m5;OWH;@m;0m_4t}SM*{%VAKbCiJv0#DZ`1U5xA4w1{m=Nn7V1CW|J_r# z^A!J%=f7(EPY&Zhk$#t+cUAv)@c-H&|AzF-k@zRj?__+ZRR0bGoPP)UTetob@Ar-R vpC1