From b1998e864df4ed6212ed5351873a621b1b4bcd77 Mon Sep 17 00:00:00 2001 From: Ulvetanna Date: Mon, 5 Nov 2018 10:36:38 +0000 Subject: [PATCH] Adding a reduced computational C++ Coalescence Function. Printing comments --- build/lib/CMS/core/cmslib.py | 37 +- build/lib/CMS/core/model.py | 284 ++-- build/lib/CMS/io/mseed.py | 140 +- build/lib/CMS/lib/cmslib.so | Bin 17168 -> 12992 bytes build/lib/CMS/signal/scan.py | 1173 +++++++++++++---- dist/CMS-0.2.18.11.1-py3.5.egg | Bin 0 -> 104683 bytes dist/CMS-0.2.18.11.2-py3.5.egg | Bin 0 -> 104521 bytes src/CMS.egg-info/PKG-INFO | 2 +- .../core/__pycache__/cmslib.cpython-35.pyc | Bin 4348 -> 3956 bytes src/CMS/core/cmslib.py | 37 +- src/CMS/lib/cmslib.so | Bin 17168 -> 12992 bytes src/CMS/lib/src/cmscan.c | 74 +- .../signal/__pycache__/scan.cpython-35.pyc | Bin 58869 -> 58764 bytes src/CMS/signal/scan.py | 62 +- 14 files changed, 1292 insertions(+), 517 deletions(-) create mode 100644 dist/CMS-0.2.18.11.1-py3.5.egg create mode 100644 dist/CMS-0.2.18.11.2-py3.5.egg diff --git a/build/lib/CMS/core/cmslib.py b/build/lib/CMS/core/cmslib.py index 6d107e5..203d202 100644 --- a/build/lib/CMS/core/cmslib.py +++ b/build/lib/CMS/core/cmslib.py @@ -91,12 +91,12 @@ def nlevinson(acc): -_cmslib.scan4d.argtypes = [c_dPt, c_i32Pt, c_dPt,c_int32, c_int32, c_int32, c_int32, c_int64, c_int64] -_cmslib.detect4d.argtypes = [c_dPt, c_dPt,c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] -_cmslib.detect4d_t.argtypes = [c_dPt, c_dPt, c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] +_cmslib.scan4d.argtypes = [c_dPt, c_i32Pt, c_dPt, c_int32, c_int32, c_int32, c_int32, c_int64, c_int64] +_cmslib.detect4d.argtypes = [c_dPt, c_dPt, c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] +# _cmslib.detect4d_t.argtypes = [c_dPt, c_dPt, c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] -def scan(sig, tt, fsmp, lsmp, map4d,threads): - nstn, nsamp = sig.shape +def scan(sig, tt, fsmp,lsmp, nsamp, map4d, threads): + nstn, ssmp = sig.shape if not tt.shape[-1] == nstn: raise ValueError('Mismatch between number of stations for data and LUT, {} - {}.'.format( nstn, tt.shape[-1])) @@ -104,24 +104,27 @@ def scan(sig, tt, fsmp, lsmp, map4d,threads): tcell = np.prod(ncell) if map4d.size < nsamp*tcell: raise ValueError('4D-Array is too small.') - _cmslib.scan4d(sig, tt, map4d, c_int32(fsmp), c_int32(lsmp), - c_int32(nsamp), c_int32(nstn), c_int64(tcell), c_int64(threads)) + if sig.size < nsamp + fsmp: + raise ValueError('Data array smaller than Coalescence array') -def detect(mmap, dsnr, dind, fsmp, lsmp, threads): + + _cmslib.scan4d(sig, tt, map4d, c_int32(fsmp), c_int32(lsmp),c_int32(nsamp), c_int32(nstn), c_int64(tcell), c_int64(threads)) + + +def detect(mmap, dsnr, dind, fsmp, lsmp,threads): nsamp = mmap.shape[-1] ncell = np.prod(mmap.shape[:-1]) if dsnr.size < nsamp or dind.size < nsamp: raise ValueError('Ouput array size too small, sample count = {}.'.format(nsamp)) - _cmslib.detect4d(mmap, dsnr, dind, c_int32(fsmp), c_int32(lsmp), - c_int32(nsamp), c_int64(ncell), c_int64(threads)) + _cmslib.detect4d(mmap, dsnr, dind, c_int32(fsmp),c_int32(lsmp),c_int32(nsamp), c_int64(ncell), c_int64(threads)) -def detect_t(mmap, dsnr, dind, fsmp, lsmp, threads): - nsamp = mmap.shape[0] - ncell = np.prod(mmap.shape[1:]) - if dsnr.size < nsamp or dind.size < nsamp: - raise ValueError('Ouput array size too small, sample count = {}.'.format(nsamp)) - _cmslib.detect4d_t(mmap, dsnr, dind, c_int32(fsmp), c_int32(lsmp), - c_int32(nsamp), c_int64(ncell), c_int64(threads)) +# def detect_t(mmap, dsnr, dind, fsmp, lsmp, threads): +# nsamp = mmap.shape[0] +# ncell = np.prod(mmap.shape[1:]) +# if dsnr.size < nsamp or dind.size < nsamp: +# raise ValueError('Ouput array size too small, sample count = {}.'.format(nsamp)) +# _cmslib.detect4d_t(mmap, dsnr, dind, c_int32(fsmp), c_int32(lsmp), +# c_int32(nsamp), c_int64(ncell), c_int64(threads)) diff --git a/build/lib/CMS/core/model.py b/build/lib/CMS/core/model.py index 19204e4..8ba5bc3 100644 --- a/build/lib/CMS/core/model.py +++ b/build/lib/CMS/core/model.py @@ -12,7 +12,7 @@ import numpy as np import pyproj -from scipy.interpolate import RectBivariateSpline, RegularGridInterpolator, griddata +from scipy.interpolate import RectBivariateSpline, RegularGridInterpolator, griddata, interp1d import matplotlib matplotlib.use('Agg') import matplotlib.pylab as plt @@ -83,14 +83,30 @@ def _proj_wgs84(): def _proj_nad27(): return pyproj.Proj("+proj=longlat +ellps=clrk66 +datum=NAD27 +no_defs") # "+init=EPSG:4267" +def _utm_zone(longitude): + return (int(1 + math.fmod((longitude + 180.0) / 6.0, 60))) def _proj_wgs84_utm(longitude): - zone = (int(1 + math.fmod((longitude + 180.0) / 6.0, 60))) + zone = _utm_zone(longitude) return pyproj.Proj("+proj=utm +zone={0:d} +datum=WGS84 +units=m +no_defs".format(zone)) +def _proj_wgs84_lambertcc(lon_Org,lat_Org,lat_1pl,lat_2pl): + return pyproj.Proj("+proj=lcc +lon_0={} +lat_0={} +lat_1={} +lat_2={} +datum=WGS84 +units=m +no_defs".format(float(lon_Org),float(lat_Org),float(lat_1pl),float(lat_2pl))) -def eikonal(x,y,z,V,S): - ''' +def _proj_wgs84_tm(lon_Org,lat_Org): + return pyproj.Proj("+proj=tmerc +lon_0={} +lat_0={} +datum=WGS84 +units=m +no_defs".format(float(lon_Org),float(lat_Org))) + + +# def _proj_nlloc_simple(latOrg,lonOrg,rotAngle): +# x = (long - longOrig) * 111.111 * cos(lat_radians) +# y = (lat - latOrig) * 111.111 +# lat = latOrig + y / 111.111 +# long = longOrig + x / (111.111 * cos(lat_radians)) +# x=(lon) + + +def eikonal(ix,iy,iz,dxi,dyi,dzi,V,S): + ''' Travel-Time formulation using a simple eikonal method. Requires the skifmm python package. @@ -102,41 +118,13 @@ def eikonal(x,y,z,V,S): S - Definition of the station location in grid Outputs: - t - Travel-time numpy array + t - Travel-time numpy array ''' - t=[] - - dx = float(x[1]-x[0]) - phi = -1*np.ones_like(V) - - if S.ndim==1: - S=np.array([S]); - ns=1 - ns, ndim = S.shape - else: - ns, ndim = S.shape - - for i in range(ns): - # get location of source - #print(i) - ix = np.abs(x-S[i,0]).argmin(); - if ndim>1: - iy = np.abs(y-S[i,1]).argmin(); - if ndim>2: - iz = np.abs(z-S[i,2]).argmin(); - - if ndim>2: - phi[iy,ix,iz]=1; - elif ndim>1: - phi[iy,ix]=1; - else: - phi[ix]=1; - - t_comp = skfmm.travel_time(phi, V, dx) - - t.append(t_comp) - + phi = -np.ones(ix.shape) + indx = np.argmin(abs((ix - S[:,0])) + abs((iy - S[:,1])) + abs((iz - S[:,2]))) + phi[np.unravel_index(indx,ix.shape)] = 1.0 + t = skfmm.travel_time(phi,V,dx=[dxi,dyi,dzi]) return t @@ -160,6 +148,8 @@ def __init__(self, center=np.array([10000.0, 10000.0, -5000.0]), cell_count=np.a self.grid_azimuth = azimuth self.grid_dip = dip self.sort_order = sort_order + self.UTM_zones_different = False + self.lcc_standard_parallels=(0.0,0.0) @property def grid_center(self): @@ -241,6 +231,15 @@ def set_proj(self, coord_proj=None, grid_proj=None): self._grid_proj = grid_proj self._update_coord() + def _nlloc_grid_proj(self): + if self.NLLoc_proj: + if self.NLLoc_proj == 'SIMPLE': + return "ERROR -- simple not yet supported" + elif self.NLLoc_proj == 'LAMBERT': + return _proj_wgs84_lambertcc(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1],self.NLLoc_MapOrg[4],self.NLLoc_MapOrg[5]) + elif self.NLLoc_proj == 'TRANS_MERC': + return _proj_wgs84_tm(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1]) + def get_grid_proj(self): if self._grid_proj is None: warnings.warn("Grid Projection has not been set: Assuming WGS84") @@ -274,6 +273,23 @@ def _update_coord(self): else: return False + def get_NLLOC_gridcenter(self,NLLOCorg_lon,NLLOCorg_lat): + self._longitude = NLLOCorg_lon + self._coord_proj = _proj_wgs84() + if self.NLLoc_proj is not 'NONE': + self._grid_proj = self._nlloc_grid_proj() + self.grid_origin_xy=self.lonlat2xy(NLLOCorg_lon,NLLOCorg_lat) + self._grid_center[0],self._grid_center[1]=(self.grid_origin_xy[0]+self.center[0],self.grid_origin_xy[1]+self.center[1]) + self._longitude,self._latitude=self.xy2lonlat(self._grid_center[0],self._grid_center[1]) + # if _utm_zone(self.longitude) != _utm_zone(NLLOCorg_lon): + # self.UTM_zones_different=True + # self._coord_proj = _proj_wgs84() + # self._grid_proj = _proj_wgs84_utm(self.longitude) + # self.grid_origin_xy=self.lonlat2xy(NLLOCorg_lon,NLLOCorg_lat) + # self._grid_center[0],self._grid_center[1]=(self.grid_origin_xy[0]+self.center[0],self.grid_origin_xy[1]+self.center[1]) + # self._longitude,self._latitude=self.xy2lonlat(self._grid_center[0],self._grid_center[1]) + self._update_grid_center() + def set_lonlat(self, longitude=None, latitude=None, coord_proj=None, grid_proj=None): if coord_proj: self._coord_proj = coord_proj @@ -285,9 +301,16 @@ def set_lonlat(self, longitude=None, latitude=None, coord_proj=None, grid_proj=N self._longitude = longitude self._update_grid_center() - def setproj_wgs84(self): + def setproj_wgs84(self,proj): self._coord_proj = _proj_wgs84() - self._grid_proj = _proj_wgs84_utm(self.longitude) + if proj == 'UTM': + self._grid_proj = _proj_wgs84_utm(self.longitude) + elif proj == 'LCC': + self._grid_proj = _proj_wgs84_lambertcc(self.longitude,self.latitude,self.lcc_standard_parallels[0],self.lcc_standard_parallels[1]) + elif proj == 'TM': + self._grid_proj = _proj_wgs84_tm(self.longitude,self.latitude) + else: + raise Exception('Projection type must be specified! CMS currently supports UTM, LCC (Lambert Conical Conformic) or TM (Transverse Mercator)') if not self._update_grid_center(): self._update_coord() @@ -333,10 +356,32 @@ def xyz2coord(self, loc): def loc2coord(self,loc): return self.xyz2coord(self.loc2xyz(loc)) + def coord2loc(self,loc): + return self.xyz2loc(self.coord2xyz(loc)) + def coord2xyz(self, loc): X, Y = self.lonlat2xy(loc[:,0], loc[:,1]) - return np.array([X, Y, loc[:,2]]).transpose() + Z = loc[:,2] + + Bounds = self.get_grid_xyz() + Xmin,Ymin,Zmin = np.min(Bounds,axis=0) + Xmax,Ymax,Zmax = np.max(Bounds,axis=0) + + if X < Xmin: + X = np.array([Xmin + self._cell_size[0]/2]) + if X > Xmax: + X = np.array([Xmax - self._cell_size[0]/2]) + if Y < Ymin: + Y = np.array([Ymin + self._cell_size[1]/2]) + if Y > Ymax: + Y = np.array([Ymax - self._cell_size[1]/2]) + if Z < Zmin: + Z = np.array([Zmin + self._cell_size[2]/2]) + if Z > Zmax: + Z = np.array([Zmax - self._cell_size[2]/2]) + + return np.array([X,Y,Z]).transpose() def coord2index(self,coord): return self.loc2index(self.coord2loc(coord)) @@ -414,11 +459,14 @@ def NLLOC_LoadFile(self,FileName): self.NLLoc_MapOrg = [trans[5],trans[3],trans[7],'Simple','0.0','0.0'] if trans[1] == 'LAMBERT': self.NLLoc_proj = 'LAMBERT' - print([trans[7],trans[5],trans[13],trans[3],trans[9],trans[11]]) self.NLLoc_MapOrg = [trans[7],trans[5],trans[13],trans[3],trans[9],trans[11]] + if trans[1] == 'TRANS_MERC': + self.NLLoc_proj = 'TRANS_MERC' + self.NLLoc_MapOrg = [trans[7],trans[5],trans[9],trans[3],'0.0','0.0'] - # Reading the buf file + + # Reading the buf file fid = open('{}.buf'.format(FileName),'rb') data = struct.unpack('{}f'.format(self.NLLoc_n[0]*self.NLLoc_n[1]*self.NLLoc_n[2]),fid.read(self.NLLoc_n[0]*self.NLLoc_n[1]*self.NLLoc_n[2]*4)) self.NLLoc_data = np.array(data).reshape(self.NLLoc_n[0],self.NLLoc_n[1],self.NLLoc_n[2]) @@ -426,11 +474,11 @@ def NLLOC_LoadFile(self,FileName): def NLLOC_ProjectGrid(self): ''' - Projecting the grid to the new coordinate system. This function also determines the 3D grid from the 2D - grids from NonLinLoc + Projecting the grid to the new coordinate system. This function also determines the 3D grid from the 2D + grids from NonLinLoc ''' - # Generating the correct NonLinLoc Formated Grid + # Generating the correct NonLinLoc Formatted Grid if (self.NLLoc_proj == 'NONE'): GRID_NLLOC = Grid3D(center=(self.NLLoc_org + self.NLLoc_siz*self.NLLoc_n), cell_count=self.NLLoc_n,cell_size=self.NLLoc_siz,azimuth=0.0, dip=0.0, sort_order='C') @@ -438,12 +486,16 @@ def NLLOC_ProjectGrid(self): GRID_NLLOC = Grid3D(center=(self.NLLoc_org + self.NLLoc_siz*self.NLLoc_n), cell_count=self.NLLoc_n,cell_size=self.NLLoc_siz,azimuth=self.NLLoc_MapOrg[2], dip=0.0, sort_order='C') GRID_NLLOC.set_lonlat(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1]) - if (self.NLLoc_proj == 'LAMBERT'): GRID_NLLOC = Grid3D(center=(self.NLLoc_org + self.NLLoc_siz*self.NLLoc_n), cell_count=self.NLLoc_n,cell_size=self.NLLoc_siz,azimuth=self.NLLoc_MapOrg[2], dip=0.0, sort_order='C') GRID_NLLOC.set_lonlat(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1]) GRID_NLLOC.set_proj(self.NLLoc_MapOrg[3]) + if (self.NLLoc_proj == 'TRANS_MERC'): + GRID_NLLOC = Grid3D(center=(self.NLLoc_org + self.NLLoc_siz*self.NLLoc_n), cell_count=self.NLLoc_n,cell_size=self.NLLoc_siz,azimuth=self.NLLoc_MapOrg[2], dip=0.0, sort_order='C') + GRID_NLLOC.set_lonlat(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1]) + GRID_NLLOC.set_proj(self.NLLoc_MapOrg[3]) + OrgX,OrgY,OrgZ = GRID_NLLOC.get_grid_xyz(cells='full') NewX,NewY,NewZ = self.get_grid_xyz(cells='full') @@ -454,7 +506,7 @@ def NLLOC_ProjectGrid(self): def NLLOC_RedefineGrid(self,Decimate): ''' - Redefining coordinate system to the file loaded + Redefining coordinate system to the file loaded ''' # Decimating the grid by the factor defined @@ -468,18 +520,21 @@ def NLLOC_RedefineGrid(self,Decimate): if (self.NLLoc_proj == 'NONE'): self.azimuth = 0.0 self.grid_center = self.center - + if (self.NLLoc_proj == 'SIMPLE'): self.azimuth = self.NLLoc_MapOrg[2] - self.set_lonlat(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1]) - self.grid_center = self.center - self.setproj_wgs84() + self.get_NLLOC_gridcenter(float(self.NLLoc_MapOrg[0]),float(self.NLLoc_MapOrg[1])) + self.grid_center[2] = self.center[2] if (self.NLLoc_proj == 'LAMBERT'): - self.azimuth = self.NLLoc_MapOrg[2] - self.set_lonlat(self.NLLoc_MapOrg[0],self.NLLoc_MapOrg[1]) - self.grid_center = self.center - self.setproj_wgs84() + self.azimuth = float(self.NLLoc_MapOrg[2]) + self.get_NLLOC_gridcenter(float(self.NLLoc_MapOrg[0]),float(self.NLLoc_MapOrg[1])) + self.grid_center[2] = self.center[2] + + if (self.NLLoc_proj == 'TRANS_MERC'): + self.azimuth = float(self.NLLoc_MapOrg[2]) + self.get_NLLOC_gridcenter(float(self.NLLoc_MapOrg[0]),float(self.NLLoc_MapOrg[1])) + self.grid_center[2] = self.center[2] self.NLLoc_data = self.decimate_array(self.NLLoc_data,np.array(Decimate))[:,:,::-1] @@ -501,10 +556,10 @@ class LUT(Grid3D,NonLinLoc): ''' # Additions to be made to the program: - # - Weighting of the stations with distance, allow the user to define their own tables - # or define a fixed weighting for the problem. + # - Weighting of the stations with distance, allow the user to define their own tables + # or define a fixed weighting for the problem. # - # - + # - # # @@ -518,7 +573,7 @@ def __init__(self, center=np.array([10000.0, 10000.0, -5000.0]), cell_count=np.a self.velocity_model = None self.station_data = None self._maps = dict() - self.data = None + self.data = None @property def maps(self): @@ -539,8 +594,8 @@ def _select_station(self, station_data): flag[i] = True def decimate(self, ds, inplace=False): - ''' - Function used to decimate the travel-time tables either supplied by NonLinLoc or through + ''' + Function used to decimate the travel-time tables either supplied by NonLinLoc or through the inbuilt functions: @@ -582,7 +637,7 @@ def decimate_array(self,DATA,ds): self.center = center ARRAY = np.ascontiguousarray(DATA[c1[0]::ds[0], c1[1]::ds[1], c1[2]::ds[2]]) - return ARRAY + return ARRAY def get_station_xyz(self, station=None): @@ -668,10 +723,10 @@ def set_station(self,loc,units): def compute_Homogeous(self,VP,VS): - ''' - Function used to compute Travel-time tables in a homogeous + ''' + Function used to compute Travel-time tables in a homogeous velocity model - + Input: VP - P-wave velocity (km/s, float) VS - S-wave velocity (km/s, float) @@ -692,9 +747,6 @@ def compute_Homogeous(self,VP,VS): self.maps = {'TIME_P': map_p1, 'TIME_S': map_s1} - - - def compute_1DVelocity(self,Z,VP,VS): ''' Function used to compute Travel-time tables in a 1D Velocity model @@ -710,65 +762,75 @@ def compute_1DVelocity(self,Z,VP,VS): # Interpolating the velocity model to each point in the 3D grid. Defined Smoothing parameter based by + + stn = self.get_station_xyz() coord = self.get_grid_xyz() ix, iy, iz = self.get_grid_xyz(cells='all') - ttp = np.zeros(ix.shape + (nstn,)) - tts = np.zeros(ix.shape + (nstn,)) + ttp = np.zeros(ix.shape + (stn.shape[0],)) + tts = np.zeros(ix.shape + (stn.shape[0],)) + + Z = np.insert(np.append(Z,-np.inf),0,np.inf) +# print(Z) + VP = np.insert(np.append(VP,VP[-1]),0,VP[0]) + VS = np.insert(np.append(VS,VS[-1]),0,VS[0]) - gvp = np.interp(iz, -Z, VP) - gvs = np.interp(iz, -Z, VS) + f = interp1d(Z,VP) + gvp = f(iz) + f = interp1d(Z,VS) + gvs = f(iz) for s in range(stn.shape[0]): - print("Generating 1D Travel-Time Table - {}".format(i)) + print("Generating 1D Travel-Time Table - {} of {}".format(s+1,stn.shape[0])) x = np.arange(min(coord[:,0]),max(coord[:,0]),self.cell_size[0]) - y = np.arange(min(coord[:,1]),max(coord[:,1]),self.cell_size[1]) - Z = np.arange(min(coord[:,2]),max(coord[:,2]),self.cell_size[2]) + y = -np.arange(min(coord[:,1]),max(coord[:,1]),self.cell_size[1]) + z = np.arange(min(coord[:,2]),max(coord[:,2]),self.cell_size[2]) - ttp[..., p] = eikonal(x,y,z,gvp,np.array([s]))[0] - tts[..., s] = eikonal(x,y,z,gvs,np.array([s]))[0] + #print(eikonal(x,y,z,gvp,np.array([s]))) - self.maps = {'TIME_P': ttp1, 'TIME_S': tts} + ttp[..., s] = eikonal(ix,iy,iz,self.cell_size[0],self.cell_size[1],self.cell_size[2],gvp,stn[s][np.newaxis,:]) + tts[..., s] = eikonal(ix,iy,iz,self.cell_size[0],self.cell_size[1],self.cell_size[2],gvs,stn[s][np.newaxis,:]) + self.maps = {'TIME_P': ttp, 'TIME_S': tts} - def compute_3DVelocity(self,INPUT_FILE): - ''' - Function used to compute Travel-time tables in a 1D Velocity model - defined using the input VP and VS arrays +# def compute_3DVelocity(self,INPUT_FILE): +# ''' +# Function used to compute Travel-time tables in a 1D Velocity model +# defined using the input VP and VS arrays - INPUTS: - INPUT_FILE - File containg comma seperated X,Y,Z,VP,VS +# INPUTS: +# INPUT_FILE - File containg comma seperated X,Y,Z,VP,VS - ''' - # Constructing the velocity model - # Interpolating the velocity model to each point in the 3D grid. Defined Smoothing parameter based by +# ''' +# # Constructing the velocity model +# # Interpolating the velocity model to each point in the 3D grid. Defined Smoothing parameter based by - VEL = pd.read_csv(INPUT_FILE,names=['X','Y','Z','VP','VS']) +# VEL = pd.read_csv(INPUT_FILE,names=['X','Y','Z','VP','VS']) - stn = self.get_station_xyz() - coord = self.get_grid_xyz() - ix, iy, iz = self.get_grid_xyz(cells='all') - ttp = np.zeros(ix.shape + (nstn,)) - tts = np.zeros(ix.shape + (nstn,)) +# stn = self.get_station_xyz() +# coord = self.get_grid_xyz() +# ix, iy, iz = self.get_grid_xyz(cells='all') +# ttp = np.zeros(ix.shape + (nstn,)) +# tts = np.zeros(ix.shape + (nstn,)) - gvp = scipy.interpolate.griddata(VEL[['X','Y','Z']], VEL['VP'], (ix,iy,iz), 'linear') - gvs = scipy.interpolate.griddata(VEL[['X','Y','Z']], VEL['VP'], (ix,iy,iz), 'linear') +# gvp = scipy.interpolate.griddata(VEL[['X','Y','Z']], VEL['VP'], (ix,iy,iz), 'linear') +# gvs = scipy.interpolate.griddata(VEL[['X','Y','Z']], VEL['VP'], (ix,iy,iz), 'linear') - for s in range(stn.shape[0]): - print("Generating 1D Travel-Time Table - {}".format(i)) +# for s in range(stn.shape[0]): +# print("Generating 1D Travel-Time Table - {}".format(i)) - x = np.arange(min(coord[:,0]),max(coord[:,0]),self.cell_size[0]) - y = np.arange(min(coord[:,1]),max(coord[:,1]),self.cell_size[1]) - Z = np.arange(min(coord[:,2]),max(coord[:,2]),self.cell_size[2]) +# x = np.arange(min(coord[:,0]),max(coord[:,0]),self.cell_size[0]) +# y = np.arange(min(coord[:,1]),max(coord[:,1]),self.cell_size[1]) +# Z = np.arange(min(coord[:,2]),max(coord[:,2]),self.cell_size[2]) - ttp[..., p] = eikonal(x,y,z,gvp,np.array([s]))[0] - tts[..., s] = eikonal(x,y,z,gvs,np.array([s]))[0] +# ttp[..., p] = eikonal(x,y,z,gvp,stn[s][np.newaxis,:])[0] +# tts[..., s] = eikonal(x,y,z,gvs,stn[s][np.newaxis,:])[0] - self.maps = {'TIME_P': ttp1, 'TIME_S': tts} +# self.maps = {'TIME_P': ttp1, 'TIME_S': tts} @@ -776,12 +838,12 @@ def compute_3DVelocity(self,INPUT_FILE): def compute_3DNLLoc(self,PATH,RedefineCoord=False,Decimate=[1,1,1]): ''' - Function to read in NonLinLoc Tables to be used for the Travel-Time - tables. + Function to read in NonLinLoc Tables to be used for the Travel-Time + tables. INPUTS: PATH - Full path to where the .buf and .hdr files can be found from - the NonLinLoc output files + the NonLinLoc output files @@ -790,13 +852,13 @@ def compute_3DNLLoc(self,PATH,RedefineCoord=False,Decimate=[1,1,1]): for st in range(nstn): name = self.station_data['Name'][st] print('Loading TTp and TTs for {}'.format(name)) - + # Reading in P-wave self.NLLOC_LoadFile('{}.P.{}.time'.format(PATH,name)) if (RedefineCoord == False): self.NLLOC_ProjectGrid() - else: + else: self.NLLOC_RedefineGrid(Decimate) if ('map_p1' not in locals()) and ('map_s1' not in locals()): @@ -821,7 +883,7 @@ def compute_3DNLLoc(self,PATH,RedefineCoord=False,Decimate=[1,1,1]): self.maps = {'TIME_P':map_p1, 'TIME_S':map_s1} - + def save(self,FILENAME): ''' @@ -843,7 +905,7 @@ def load(self,FILENAME): def plot_station(self): - ''' + ''' Function to plot a 2D representation of the station locations ''' @@ -925,4 +987,4 @@ def plot_station(self): # else: # plt.show() - + diff --git a/build/lib/CMS/io/mseed.py b/build/lib/CMS/io/mseed.py index 09b8b2b..e178c4d 100644 --- a/build/lib/CMS/io/mseed.py +++ b/build/lib/CMS/io/mseed.py @@ -4,6 +4,8 @@ # ---- Import Packages ----- import obspy from obspy import UTCDateTime +import CMS.core.model as cmod + from datetime import datetime from datetime import timedelta @@ -26,11 +28,7 @@ def _downsample(st,sr): class MSEED(): - def __init__(self,lut,HOST_PATH='/PATH/MSEED'): - - - self.lookup_table = lut - + def __init__(self,LUT,HOST_PATH='/PATH/MSEED'): self.startTime = None self.endTime = None self.sampling_rate = None @@ -41,7 +39,12 @@ def __init__(self,lut,HOST_PATH='/PATH/MSEED'): self.signal = None self.FilteredSignal = None self.StationAvaliability = None + + lut = cmod.LUT() + lut.load(LUT) self.StationInformation = lut.station_data + del lut + self.st = None def _stationAvaliability(self,st): @@ -53,17 +56,16 @@ def _stationAvaliability(self,st): # Since the traces are the same sample-rates then the stations can be selected based #on the start and end time - exSamples = (endT-stT).total_seconds()*self.sampling_rate + 1 - + exSamples = round((endT-stT).total_seconds()*self.sampling_rate + 1) - stationAva = np.zeros((len(self.lookup_table.station_data['Name']),1)) - signal = np.zeros((3,len(self.lookup_table.station_data['Name']),int(exSamples))) + stationAva = np.zeros((len(self.StationInformation['Name']),1)) + signal = np.zeros((3,len(self.StationInformation['Name']),int(exSamples))) - for i in range(0,len(self.lookup_table.station_data['Name'])): + for i in range(0,len(self.StationInformation['Name'])): - tmp_st = st.select(station=self.lookup_table.station_data['Name'][i]) + tmp_st = st.select(station=self.StationInformation['Name'][i]) if len(tmp_st) == 3: - if tmp_st[0].stats.npts == exSamples and tmp_st[1].stats.npts == exSamples and tmp_st[2].stats.npts == exSamples: + if tmp_st[0].stats.npts <= exSamples and tmp_st[1].stats.npts == exSamples and tmp_st[2].stats.npts == exSamples: # Defining the station as avaliable stationAva[i] = 1 @@ -82,9 +84,6 @@ def _stationAvaliability(self,st): # Trace not completly active during this period continue - - - return signal,stationAva @@ -98,7 +97,8 @@ def path_structure(self,TYPE='YEAR/JD/STATION'): if TYPE == 'YEAR/JD/STATION': self.Type = 'YEAR/JD/STATION' - + if TYPE == 'STATION.YEAR.JULIANDAY': + self.Type = 'STATION.YEAR.JULIANDAY' def _load_fromPath(self): @@ -113,15 +113,32 @@ def _load_fromPath(self): if self.Type == 'YEAR/JD/STATION': dy = 0 FILES = [] - while (self.endTime.timetuple().tm_yday) >= (self.startTime + timedelta(days=dy)).timetuple().tm_yday: + #print(float(self.endTime.year) + float('0.{}'.format(self.endTime.timetuple().tm_yday))) + #print(float(self.startTime.year) + float('0.{}'.format((self.startTime + timedelta(days=dy)).timetuple().tm_yday))) + while self.endTime.timetuple().tm_yday >= (self.startTime + timedelta(days=dy)).timetuple().tm_yday: # Determine current time ctime = self.startTime + timedelta(days=dy) + #print(ctime) + for st in self.StationInformation['Name'].tolist(): + FILES.extend(glob('{}/{}/{}/*{}*'.format(self.MSEED_path,ctime.year,str(ctime.timetuple().tm_yday).zfill(3),st))) + + dy += 1 - for st in self.lookup_table.station_data['Name'].tolist(): - FILES.extend(glob('{}/{}/{}/*{}*'.format(self.MSEED_path,ctime.year,ctime.timetuple().tm_yday,st))) + if self.Type == 'STATION.YEAR.JULIANDAY': + dy = 0 + FILES = [] + #print(float(self.endTime.year) + float('0.{}'.format(self.endTime.timetuple().tm_yday))) + #print(float(self.startTime.year) + float('0.{}'.format((self.startTime + timedelta(days=dy)).timetuple().tm_yday))) + while self.endTime >= (self.startTime + timedelta(days=dy)): + # Determine current time + ctime = self.startTime + timedelta(days=dy) + #print(ctime) + for st in self.StationInformation['Name'].tolist(): + FILES.extend(glob('{}/*{}.*.{}.{}'.format(self.MSEED_path,st,ctime.year,str(ctime.timetuple().tm_yday).zfill(3)))) dy += 1 + self.FILES = FILES @@ -134,52 +151,49 @@ def read_mseed(self,starttime,endtime,sampling_rate): self.startTime = datetime.strptime(starttime,'%Y-%m-%dT%H:%M:%S.%f') self.endTime = datetime.strptime(endtime,'%Y-%m-%dT%H:%M:%S.%f') - - self._load_fromPath() - - #print('Loading the MSEED') - - # Loading the required mseed data - c=0 - for f in self.FILES: - try: - if c==0: - st = obspy.read(f,starttime=UTCDateTime(self.startTime),endtime=UTCDateTime(self.endTime)) - c +=1 - else: - st += obspy.read(f,starttime=UTCDateTime(self.startTime),endtime=UTCDateTime(self.endTime)) - except: - continue - #print('Station File not MSEED - {}'.format(f)) - - # Removing all the stations with gaps - if len(st.get_gaps()) > 0: - stationRem = np.unique(np.array(st.get_gaps())[:,1]).tolist() - for sa in stationRem: - tr = st.select(station=sa) - for tra in tr: - - st.remove(tra) - - - # Combining the mseed and determining station avaliability - #print('Detrending and Merging MSEED') - #st.detrend() - st.merge() - - - - - # Downsample the mseed to the same level - #print('Downsampling MSEED') - st = _downsample(st,sampling_rate) self.sampling_rate = sampling_rate + self._load_fromPath() - # Checking the station Avaliability for each of the stations across this time period - #print('stationAvaliability MSEED') - signal,stA = self._stationAvaliability(st) - - + if len(self.FILES) > 0: + # Loading the required mseed data + c=0 + for f in self.FILES: + try: + if c==0: + self.st = obspy.read(f,starttime=UTCDateTime(self.startTime),endtime=UTCDateTime(self.endTime)) + c +=1 + else: + self.st += obspy.read(f,starttime=UTCDateTime(self.startTime),endtime=UTCDateTime(self.endTime)) + except: + continue + print('Station File not MSEED - {}'.format(f)) + + # Removing all the stations with gaps greater than 10.0 milliseconds + if len(self.st .get_gaps()) > 0 and np.max(np.array(self.st .get_gaps())[:,4]-np.array(self.st .get_gaps())[:,5] > 10.0) == True: + stationRem = np.unique(np.array(self.st .get_gaps())[:,1]).tolist() + for sa in stationRem: + tr = self.st .select(station=sa) + for tra in tr: + self.st .remove(tra) + + + # Combining the mseed and determining station avaliability + + self.st.merge(fill_value='interpolate') + self.st.detrend('demean') + self.st = _downsample(self.st,sampling_rate) + + signal,stA = self._stationAvaliability(self.st) + + else: + print('Data Does not exist for this time period - creating blank') + # Files don't exisit so creating zeros ones instead + exSamples = (endT-stT).total_seconds()*self.sampling_rate + 1 + stationAva = np.zeros((len(self.StationInformation['Name']),1)) + signal = np.zeros((3,len(self.StationInformation['Name']),int(exSamples))) + + +# self.st = None self.signal = signal self.FilteredSignal = np.empty((self.signal.shape)) self.FilteredSignal[:] = np.nan diff --git a/build/lib/CMS/lib/cmslib.so b/build/lib/CMS/lib/cmslib.so index d90daced17a5b442064b54192f8fbfb54097e167..266775d67f76015669dbec01da704b653ecb83d3 100755 GIT binary patch delta 4186 zcmZu!eNa@_6~Ff_i@PhZ>j%3=D z4m8`bSr=x|)26m#XKa&Bkr`Vp{$Xg+LZp@?{;^{}LOcCfqjq);>Vk<`Kib!G@4F9{ zC1>WnbIkxuM-ercG_W7UGN7Z)R#lU-ygm?S49VY2N^C$ z&vTbwt!jfAnqSpVtQl#QrH8kS(+u?Ez%LKKNL(ww^V__KHz|La8M|_{_fMt8KZAN{ zgV{u^#0%e&w7#2Y<|G;9loJa`zhpx~x`rRaFJ^I(e4sN@jrwfjBAv1<5S_Jf+)ehT z;I~lC{7AXF-7ZPzcXfO>+2dLOSgA)>khoRH6;Yv1G?3bGLfC&XN4Ni#&ajiLVK&SI zX|9LYv9KUb>WoLnNixZPF&hFV?_q&;H9 z=_%;Oj+)69f#q~}V^tIBK$#JTi6`NGqD@{Sk)&9z``~}K z=n!)*qRw$S2{$F#dy{Ys#XR|waI=nnm9zCp3N|`}T9a_Gnz>3%!fl2z@{S~&trmmS zz>Gx=nNPW3m!-7tH!hiI6=(5pFKNXRllL;ySVTjr7-2GHa+u3MXEF@=5;GMSAtc7n@?nasu)8{+aSOlHH1^)tDp;$;S~V8*`A4esU1q-#j4up!Gqzo=OsK(YY9NvIQZA0+LLRhQS6VB%#kw*V?6;OkNAh6MTJg-^&=2WZtp=K( zXQk~}?_h=+Y92!=s$f%56@Op8U_Oliy?veyzsqMY`5tzKV1vz-IoNKXh4d_sJ&TrI z_L41#hs@Tz(M+2&4eISx@VTrkc+p;1;8ugmbVzw4s6;}_iJ)>dq#O?_(U6i2zt3_l ztHJ zo0Q4kY&D>SsoJzX+gItAZxy6F_W=9KMI^rIi0e1RTPGE%jijXKX<@Ugv)BqzH_R}?wy#kXJ=-N?#=6<(*4^o z=4z6LZo?-oAMJp0_Za=f=)c|DD18Kc1@B8^akyXbq|^|H#|sN>m2utw>@C<<#>F%jALFzlH+`aMZ2yhl(X=7tnK<3&ke|J)Y17De-_x`N z^79Wg&5euXt^aD;dgQPDPt!WtK1IT-16CG$r0g58sd$z2>P^^JTr8c6!(n7k%)&_V zs=j<|{|Ym1%gR0^ZO%-W{*|!|56U8hF5>qO)PJx@e~IhM5u3peu-|WEKj!N{I$#Q< zna)sdMF_LYLA@8pvo+bSeb6+J7J#pnSZ%DW4XE3C2S!Q?%sa98XLz@y(A7bGr9xd^F@Jp-_ioe!-|+cLhtqTe<2>&WGh>|BFTjLPrZRl!^Evoo zh~~!aH4LRSHB^NsYD#Dh9H<$RJTmN}xy~-pxt9b#WC5q&C+(2oX}?#h^+Uk#hqM0r ze4{nJ5BlGPm-H~uS{M4Pt<5#16BW6O4s*#u_QEcdyl@0{HqwFIMI&6wAaTa~mSz{s zvk6yuzcKox22I31pA#m*XrE1F5x&K^V?MfzaVMEi78Wa3khqwR#dr=eQq;wGE-{jb z#dsbevYZU@vI(<7Bl%!}NF3RS-Iy-Ihie~IQ<`V1M8dUXB;DK({@8FC?oZA)5c3JV z9}d*H+eIJ5iX>k^CB@{84<5?~y^ICs%vkyceh3Q`Q{{*UF4g&@yBQ$W`zl|z>w3Ob zvG{lVSnW=hQzP-MiTnm!u5*>KEv?$2h)p(zYXxO)ptR>~v&)QZwg+9A7$_hY`mdIB&_D;0LH+ zJ8Q+()4Iu$*TI{Jf7a_@T-c|k;qNk>dGuW47E8CxM}`Hpz;_#5w4DFjz|rX1^;0|~ zShAk_gkak_8y8*bTV%ViPkmZEBkWTH^gL@N|J$P0!jpi7nUGhw_PEfdK0i*fewrsx zTgJv$_D^ny&k=DJ={^VviO5K~@J{3X(M#(K>1d+qn-cAW0~=}_#>r&x9dHIwG-Mjb9OpnyE1!|nM{|!nzlx(EbGCRVc&v;m%zw^gvZnM vwib&pTnDwA8l}J**te+#b6idqaoZH3R1a@&s`8##t!u8}%q9~~=py<*BR>C! delta 5211 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 0: + STATION_pick = STATION_pick.replace('-1.0',np.nan) + + + for jj in range(len(STATION_pick)): + if np.isnan(STATION_pick['PickError'].iloc[jj]): + continue + + if STATION_pick['Phase'].iloc[jj] == 'P': + ZTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=-STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + ZTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=+STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + ZTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])) + + # S_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=-STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + # S_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=+STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + # S_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])) + + yy = gaussian_func(self.StationPick['GAU_P'][ii]['xdata'],self.StationPick['GAU_P'][ii]['popt'][0],self.StationPick['GAU_P'][ii]['popt'][1],self.StationPick['GAU_P'][ii]['popt'][2]) + P_Onset.plot(self.StationPick['GAU_P'][ii]['xdata_dt'],yy) + P_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=-STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + P_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=+STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + P_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])) + + + + + else: + YTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=-STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + YTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=+STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + YTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])) + + XTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=-STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + XTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=+STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + XTrace_Seis.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])) + + yy = gaussian_func(self.StationPick['GAU_S'][ii]['xdata'],self.StationPick['GAU_S'][ii]['popt'][0],self.StationPick['GAU_S'][ii]['popt'][1],self.StationPick['GAU_S'][ii]['popt'][2]) + S_Onset.plot(self.StationPick['GAU_S'][ii]['xdata_dt'],yy) + + S_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=-STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + S_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])+timedelta(seconds=+STATION_pick['PickError'].iloc[jj]/2),linestyle='--') + S_Onset.axvline(pd.to_datetime(STATION_pick['PickTime'].iloc[jj])) + + ZTrace_Seis.axvline(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii]),color='red') + P_Onset.axvline(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii]),color='red') + YTrace_Seis.axvline(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_S',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii]),color='red') + XTrace_Seis.axvline(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_S',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii]),color='red') + S_Onset.axvline(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_S',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii]),color='red') + + + # Refining the window as around the pick time + MINT = pd.to_datetime(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=0.5*self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii])) + MAXT = pd.to_datetime(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=1.5*self.LUT.get_value_at('TIME_S',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][ii])) + + XTrace_Seis.set_xlim([MINT,MAXT]) + YTrace_Seis.set_xlim([MINT,MAXT]) + ZTrace_Seis.set_xlim([MINT,MAXT]) + P_Onset.set_xlim([MINT,MAXT]) + S_Onset.set_xlim([MINT,MAXT]) + + + fig.suptitle('Trace for Station {} - PPick = {}, SPick = {}'.format(self.LUT.station_data['Name'][ii],self.StationPick['GAU_P'][ii]['PickValue'],self.StationPick['GAU_S'][ii]['PickValue'])) + + + + if SaveFilename == None: + plt.show() + else: + plt.savefig('{}_CoalescenceTrace_{}.pdf'.format(SaveFilename,self.LUT.station_data['Name'][ii])) + plt.close("all") + + + ii+=1 + + def CoalescenceVideo(self,SaveFilename=None): STIn = np.where(self.times == self.EVENT['DT'].iloc[0])[0][0] ENIn = np.where(self.times == self.EVENT['DT'].iloc[-1])[0][0] @@ -515,9 +687,8 @@ def CoalescenceVideo(self,SaveFilename=None): writer = Writer(fps=4, metadata=dict(artist='Ulvetanna'), bitrate=1800) - FIG = self.CoalescenceImage(STIn) - ani = animation.FuncAnimation(FIG, self._CoalescenceVideo_update, frames=np.arange(STIn,ENIn,int(self.DATA.sampling_rate/20)),blit=False,repeat=False) + ani = animation.FuncAnimation(FIG, self._CoalescenceVideo_update, frames=np.linspace(STIn,ENIn-1,200),blit=False,repeat=False) if SaveFilename == None: plt.show() @@ -533,15 +704,11 @@ def CoalescenceMarginal(self,SaveFilename=None): ''' - # Gaussian fit about the time period - - fig = plt.figure(figsize=(15,15)) - fig.patch.set_facecolor('white') - Coa_XYSlice = plt.subplot2grid((3, 3), (0, 0), colspan=2,rowspan=2) - Coa_YZSlice = plt.subplot2grid((3, 3), (2, 0), colspan=2) - Coa_XZSlice = plt.subplot2grid((3, 3), (0, 2), rowspan=2) - Coa_Logo = plt.subplot2grid((3, 3), (2, 2)) - + TimeSliceIndex = np.where(self.times == self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])])[0][0] + TimeSlice = self.times[TimeSliceIndex] + index = np.where(self.EVENT['DT'] == TimeSlice)[0][0] + indexVal1 = self.LUT.coord2loc(np.array([[self.EVENT['X'].iloc[index],self.EVENT['Y'].iloc[index],self.EVENT['Z'].iloc[index]]])).astype(int)[0] + indexCoord = np.array([[self.EVENT['X'].iloc[index],self.EVENT['Y'].iloc[index],self.EVENT['Z'].iloc[index]]])[0,:] # Determining the maginal window value from the coalescence function mMAP = self.MAP @@ -554,87 +721,138 @@ def CoalescenceMarginal(self,SaveFilename=None): indexVal = np.where(mMAP == np.max(mMAP)) indexCoord = self.LUT.xyz2coord(self.LUT.loc2xyz(np.array([[indexVal[0][0],indexVal[1][0],indexVal[2][0]]]))) - # # Determining the location optimal location and error ellipse - # samples_weights = mMAP.flatten() - # lc = self.LUT.cell_count - # ly, lx, lz = np.meshgrid(np.arange(lc[1]), np.arange(lc[0]), np.arange(lc[2])) - # x_samples = lx.flatten()*self.LUT.cell_size[0] - # y_samples = ly.flatten()*self.LUT.cell_size[1] - # z_samples = lz.flatten()*self.LUT.cell_size[2] - # SumSW = np.sum(samples_weights) - # x_expect = np.sum(samples_weights*x_samples)/SumSW - # y_expect = np.sum(samples_weights*y_samples)/SumSW - # z_expect = np.sum(samples_weights*z_samples)/SumSW - # expect_vector = np.array([x_expect/self.LUT.cell_size[0], y_expect/self.LUT.cell_size[1], z_expect/self.LUT.cell_size[2]], dtype=float) - # cov_matrix = np.zeros((3,3)) - # cov_matrix[0,0] = np.sum(samples_weights*(x_samples-x_expect)*(x_samples-x_expect))/SumSW - # cov_matrix[1,1] = np.sum(samples_weights*(y_samples-y_expect)*(y_samples-y_expect))/SumSW - # cov_matrix[2,2] = np.sum(samples_weights*(z_samples-z_expect)*(z_samples-z_expect))/SumSW - # cov_matrix[0,1] = np.sum(samples_weights*(x_samples-x_expect)*(y_samples-y_expect))/SumSW - # cov_matrix[1,0] = cov_matrix[0,1] - # cov_matrix[0,2] = np.sum(samples_weights*(x_samples-x_expect)*(z_samples-z_expect))/SumSW - # cov_matrix[2,0] = cov_matrix[0,2] - # cov_matrix[1,2] = np.sum(samples_weights*(y_samples-y_expect)*(z_samples-z_expect))/SumSW - # cov_matrix[2,1] = cov_matrix[1,2] - # expect_vector = self.lookup_table.xyz2coord(self.LUT.loc2xyz(np.array([[expect_vector[0],expect_vector[1],expect_vector[2]]])))[0] - - - # lambda_, v = np.linalg.eig(cov_matrix) - # lambda_ = np.sqrt(lambda_) + + # Defining the plots to be represented + fig = plt.figure(figsize=(30,15)) + fig.patch.set_facecolor('white') + Coa_XYSlice = plt.subplot2grid((3, 5), (0, 0), colspan=2,rowspan=2) + Coa_YZSlice = plt.subplot2grid((3, 5), (2, 0), colspan=2) + Coa_XZSlice = plt.subplot2grid((3, 5), (0, 2), rowspan=2) + Coa_Trace = plt.subplot2grid((3, 5), (0, 3), colspan=2,rowspan=2) + Coa_Logo = plt.subplot2grid((3, 5), (2, 2)) + Coa_CoaVal = plt.subplot2grid((3, 5), (2, 3), colspan=2) + + + + # ---------------- Plotting the Traces ----------- + STIn = np.where(self.times == self.EVENT['DT'].iloc[0])[0][0] + ENIn = np.where(self.times == self.EVENT['DT'].iloc[-1])[0][0] + #print(STIn,ENIn) + + + + # --------------- Ordering by distance to event -------------- + if self.RangeOrder == True: + print(self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0]) + StaInd = np.argsort(self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0])[::-1] + print(StaInd) + else: + StaInd = np.argsort(self.DATA.StationInformation['Name'])[::-1] + + + for ii in range(self.DATA.signal.shape[1]): + if self.FilteredSignal == False: + Coa_Trace.plot(np.arange(self.DATA.startTime,self.DATA.endTime+timedelta(seconds=1/self.DATA.sampling_rate),timedelta(seconds=1/self.DATA.sampling_rate)),(self.DATA.signal[0,ii,:]/np.max(abs(self.DATA.signal[0,ii,:])))*self.TraceScaling+(StaInd[ii]+1),'r',linewidth=0.5) + Coa_Trace.plot(np.arange(self.DATA.startTime,self.DATA.endTime+timedelta(seconds=1/self.DATA.sampling_rate),timedelta(seconds=1/self.DATA.sampling_rate)),(self.DATA.signal[1,ii,:]/np.max(abs(self.DATA.signal[1,ii,:])))*self.TraceScaling+(StaInd[ii]+1),'b',linewidth=0.5) + Coa_Trace.plot(np.arange(self.DATA.startTime,self.DATA.endTime+timedelta(seconds=1/self.DATA.sampling_rate),timedelta(seconds=1/self.DATA.sampling_rate)),(self.DATA.signal[2,ii,:]/np.max(abs(self.DATA.signal[2,ii,:])))*self.TraceScaling+(StaInd[ii]+1),'g',linewidth=0.5) + else: + Coa_Trace.plot(np.arange(self.DATA.startTime,self.DATA.endTime+timedelta(seconds=1/self.DATA.sampling_rate),timedelta(seconds=1/self.DATA.sampling_rate)),(self.DATA.FilteredSignal[0,ii,:]/np.max(abs(self.DATA.FilteredSignal[0,ii,:])))*self.TraceScaling+(StaInd[ii]+1),'r',linewidth=0.5) + Coa_Trace.plot(np.arange(self.DATA.startTime,self.DATA.endTime+timedelta(seconds=1/self.DATA.sampling_rate),timedelta(seconds=1/self.DATA.sampling_rate)),(self.DATA.FilteredSignal[1,ii,:]/np.max(abs(self.DATA.FilteredSignal[1,ii,:])))*self.TraceScaling+(StaInd[ii]+1),'b',linewidth=0.5) + Coa_Trace.plot(np.arange(self.DATA.startTime,self.DATA.endTime+timedelta(seconds=1/self.DATA.sampling_rate),timedelta(seconds=1/self.DATA.sampling_rate)),(self.DATA.FilteredSignal[2,ii,:]/np.max(abs(self.DATA.FilteredSignal[2,ii,:])))*self.TraceScaling+(StaInd[ii]+1),'g',linewidth=0.5) + + # ---------------- Plotting the Station Travel Times ----------- + for i in range(self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0].shape[0]): + tp = self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_P',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][i]) + ts = self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])] + timedelta(seconds=self.LUT.get_value_at('TIME_S',np.array([indexVal[0][0],indexVal[1][0],indexVal[2][0]]))[0][i]) + + if i == 0: + TP = tp + TS = ts + else: + TP = np.append(TP,tp) + TS = np.append(TS,ts) + + + self.CoaArriavalTP = Coa_Trace.scatter(TP,(StaInd+1),40,'pink',marker='v') + self.CoaArriavalTS = Coa_Trace.scatter(TS,(StaInd+1),40,'purple',marker='v') + +# Coa_Trace.set_ylim([0,ii+2]) + Coa_Trace.set_xlim([self.DATA.startTime+timedelta(seconds=1.6),np.max(TS)]) + #Coa_Trace.get_xaxis().set_ticks([]) + Coa_Trace.yaxis.tick_right() + Coa_Trace.yaxis.set_ticks(StaInd+1) + Coa_Trace.yaxis.set_ticklabels(self.DATA.StationInformation['Name']) + self.CoaTraceVLINE = Coa_Trace.axvline(self.EVENT['DT'].iloc[np.argmax(self.EVENT['COA'])],0,1000,linestyle='--',linewidth=2,color='r') + + # ------------- Plotting the Coalescence Function ----------- + Coa_CoaVal.plot(self.EVENT['DT'],self.EVENT['COA']) + Coa_CoaVal.set_ylabel('Coalescence Value') + Coa_CoaVal.set_xlabel('Date-Time') + Coa_CoaVal.yaxis.tick_right() + Coa_CoaVal.yaxis.set_label_position("right") + Coa_CoaVal.set_xlim([self.EVENT['DT'].iloc[0],self.EVENT['DT'].iloc[-1]]) + Coa_CoaVal.format_xdate = mdates.DateFormatter('%Y-%m-%d') #FIX - Not working + for tick in Coa_CoaVal.get_xticklabels(): + tick.set_rotation(45) + self.CoaValVLINE = Coa_CoaVal.axvline(TimeSlice,0,1000,linestyle='--',linewidth=2,color='r') + + + + # ------------- Spatial Function ----------- # Plotting the marginal window gridX,gridY = np.mgrid[min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]):max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]):(max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]) - min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]))/self.LUT.cell_count[0], min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]):max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]):(max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]) - min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]))/self.LUT.cell_count[1]] - Coa_XYSlice.pcolormesh(gridX,gridY,mMAP[:,:,int(indexVal[2][0])],cmap=self.CMAP,linewidth=0) + rect = Rectangle((np.min(gridX), np.min(gridY)), np.max(gridX)-np.min(gridX),np.max(gridY)-np.min(gridY)) + pc = PatchCollection([rect], facecolor='k') + Coa_XYSlice.add_collection(pc) + Coa_XYSlice.pcolormesh(gridX,gridY,mMAP[:,:,int(indexVal[2][0])],cmap=self.CMAP,edgecolors='face') CS = Coa_XYSlice.contour(gridX,gridY,mMAP[:,:,int(indexVal[2][0])],levels=[0.65,0.75,0.95],colors=('g','m','k')) Coa_XYSlice.clabel(CS, inline=1, fontsize=10) Coa_XYSlice.set_xlim([min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]),max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0])]) Coa_XYSlice.set_ylim([min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]),max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1])]) - #Coa_XYSlice_ell = Ellipse(xy=(expect_vector[0], expect_vector[1]),width=lambda_[0]*2, height=lambda_[1]*2,angle=np.rad2deg(np.arccos(v[0, 0]))) - #Coa_XYSlice_ell.set_facecolor('none') - #Coa_XYSlice_ell.set_edgecolor('r') - #Coa_XYSlice.add_artist(Coa_XYSlice_ell) - #Coa_XYSlice.scatter(expect_vector[0], expect_vector[1], c="r", marker="x") - Coa_XYSlice.axvline(x=indexCoord[0][0],linestyle='--',linewidth=2,color='k') - Coa_XYSlice.axhline(y=indexCoord[0][1],linestyle='--',linewidth=2,color='k') - + Coa_XYSlice.axvline(x=indexCoord[0][0],linestyle='--',linewidth=2,color=self.LineStationColor) + Coa_XYSlice.axhline(y=indexCoord[0][1],linestyle='--',linewidth=2,color=self.LineStationColor) gridX,gridY = np.mgrid[min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]):max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]):(max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]) - min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]))/self.LUT.cell_count[0], min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]):max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]):(max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]) - min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]))/self.LUT.cell_count[2]] - Coa_YZSlice.pcolormesh(gridX,gridY,mMAP[:,int(indexVal[1][0]),:],cmap=self.CMAP,linewidth=0) + rect = Rectangle((np.min(gridX), np.min(gridY)), np.max(gridX)-np.min(gridX),np.max(gridY)-np.min(gridY)) + pc = PatchCollection([rect], facecolor='k') + Coa_YZSlice.add_collection(pc) + Coa_YZSlice.pcolormesh(gridX,gridY,mMAP[:,int(indexVal[1][0]),:],cmap=self.CMAP,edgecolors='face') CS = Coa_YZSlice.contour(gridX,gridY,mMAP[:,int(indexVal[1][0]),:], levels=[0.65,0.75,0.95],colors=('g','m','k')) Coa_YZSlice.clabel(CS, inline=1, fontsize=10) - #Coa_YZSlice_ell = Ellipse(xy=(expect_vector[1], expect_vector[2]),width=lambda_[1]*2, height=lambda_[2]*2,angle=np.rad2deg(np.arccos(v[1, 0]))) - #Coa_YZSlice_ell.set_facecolor('none') - #Coa_YZSlice_ell.set_edgecolor('r') - #Coa_YZSlice.add_artist(Coa_YZSlice_ell) - #Coa_YZSlice.scatter(expect_vector[1], expect_vector[2], c="r", marker="x") Coa_YZSlice.set_xlim([min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0]),max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,0])]) Coa_YZSlice.set_ylim([max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]),min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2])]) - Coa_YZSlice.axvline(x=indexCoord[0][0],linestyle='--',linewidth=2,color='k') - Coa_YZSlice.axhline(y=indexCoord[0][2],linestyle='--',linewidth=2,color='k') + Coa_YZSlice.axvline(x=indexCoord[0][0],linestyle='--',linewidth=2,color=self.LineStationColor) + Coa_YZSlice.axhline(y=indexCoord[0][2],linestyle='--',linewidth=2,color=self.LineStationColor) Coa_YZSlice.invert_yaxis() gridX,gridY = np.mgrid[min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]):max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]):(max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]) - min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]))/self.LUT.cell_count[2], min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]):max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]):(max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]) - min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]))/self.LUT.cell_count[1]] - Coa_XZSlice.pcolormesh(gridX,gridY,mMAP[int(indexVal[0][0]),:,:].transpose(),cmap=self.CMAP,linewidth=0) + rect = Rectangle((np.min(gridX), np.min(gridY)), np.max(gridX)-np.min(gridX),np.max(gridY)-np.min(gridY)) + pc = PatchCollection([rect], facecolor='k') + Coa_XZSlice.add_collection(pc) + Coa_XZSlice.pcolormesh(gridX,gridY,mMAP[int(indexVal[0][0]),:,:].transpose(),cmap=self.CMAP,edgecolors='face') CS = Coa_XZSlice.contour(gridX,gridY,mMAP[int(indexVal[0][0]),:,:].transpose(),levels =[0.65,0.75,0.95],colors=('g','m','k')) - #Coa_XZSlice.clabel(CS, inline=1, fontsize=10) - #Coa_XZSlice_ell = Ellipse(xy=(expect_vector[0], expect_vector[2]),width=lambda_[0]*2, height=lambda_[2]*2,angle=np.rad2deg(np.arccos(v[0, 0]))) - #Coa_XZSlice_ell.set_facecolor('none') - #Coa_XZSlice_ell.set_edgecolor('r') - #Coa_XZSlice.add_artist(Coa_XZSlice_ell) - #Coa_XZSlice.scatter(expect_vector[0], expect_vector[2], c="r", marker="x") Coa_XZSlice.set_xlim([max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2]),min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,2])]) Coa_XZSlice.set_ylim([min(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1]),max(self.LUT.xyz2coord(self.LUT.get_grid_xyz())[:,1])]) - Coa_XZSlice.axvline(x=indexCoord[0][2],linestyle='--',linewidth=2,color='k') - Coa_XZSlice.axhline(y=indexCoord[0][1],linestyle='--',linewidth=2,color='k') + Coa_XZSlice.axvline(x=indexCoord[0][2],linestyle='--',linewidth=2,color=self.LineStationColor) + Coa_XZSlice.axhline(y=indexCoord[0][1],linestyle='--',linewidth=2,color=self.LineStationColor) - - Coa_XYSlice.scatter(self.LUT.station_data['Longitude'],self.LUT.station_data['Latitude'],15,'k',marker='^') - Coa_YZSlice.scatter(self.LUT.station_data['Longitude'],self.LUT.station_data['Elevation'],15,'k',marker='^') - Coa_XZSlice.scatter(self.LUT.station_data['Elevation'],self.LUT.station_data['Latitude'],15,'k',marker='<') + # Plotting the station locations + Coa_XYSlice.scatter(self.LUT.station_data['Longitude'],self.LUT.station_data['Latitude'],15,marker='^',color=self.LineStationColor) + Coa_YZSlice.scatter(self.LUT.station_data['Longitude'],self.LUT.station_data['Elevation'],15,marker='^',color=self.LineStationColor) + Coa_XZSlice.scatter(self.LUT.station_data['Elevation'],self.LUT.station_data['Latitude'],15,marker='<',color=self.LineStationColor) for i,txt in enumerate(self.LUT.station_data['Name']): - Coa_XYSlice.annotate(txt,[self.LUT.station_data['Longitude'][i],self.LUT.station_data['Latitude'][i]]) - + Coa_XYSlice.annotate(txt,[self.LUT.station_data['Longitude'][i],self.LUT.station_data['Latitude'][i]],color=self.LineStationColor) + + # Plotting the XYFiles + if self.XYFiles != None: + XYFiles = pd.read_csv(self.XYFiles,names=['File','Color','Linewidth','Linestyle']) + c=0 + for ff in XYFiles['File']: + XYF = pd.read_csv(ff,names=['X','Y']) + Coa_XYSlice.plot(XYF['X'],XYF['Y'],linestyle=XYFiles['Linestyle'].iloc[c],linewidth=XYFiles['Linewidth'].iloc[c],color=XYFiles['Color'].iloc[c]) + c+=1 # Plotting the logo try: @@ -650,6 +868,7 @@ def CoalescenceMarginal(self,SaveFilename=None): else: plt.savefig('{}_EventLocationError.pdf'.format(SaveFilename),dpi=400) + plt.close('all') @@ -681,7 +900,7 @@ def __init__(self, param = None): self.time_step = 10 self.StartDateTime=None self.EndDateTime=None - self.Decimate=10 + self.Decimate=[1,1,1] if param: self.load(param) @@ -759,7 +978,10 @@ def load(self, file): class SeisScan: - def __init__(self, DATA, lut, reader=None, param=None, output_path=None, output_name=None): + def __init__(self, DATA, LUT, reader=None, param=None, output_path=None, output_name=None): + + lut = cmod.LUT() + lut.load(LUT) self.sample_rate = 1000.0 self.seis_reader = None self.lookup_table = lut @@ -771,13 +993,16 @@ def __init__(self, DATA, lut, reader=None, param=None, output_path=None, output_ self.keep_map = False - self.pre_pad = 0.0 - self.post_pad = 0.0 + ttmax = np.max(lut.fetch_map('TIME_S')) + self.pre_pad = None + self.post_pad = round(ttmax) self.time_step = 10.0 self.daten = None self.dsnr = None self.dloc = None + + self.PickThreshold = 1.0 self.bp_filter_p1 = param.bp_filter_p1 @@ -817,6 +1042,9 @@ def __init__(self, DATA, lut, reader=None, param=None, output_path=None, output_ self.MarginalWindow = 30 self.CoalescenceGrid = False self.CoalescenceVideo = False + self.CoalescencePicture = False + self.CoalescenceTrace = False + self.CutMSEED = False self.PickingType = 'Gaussian' self.LocationError = 0.95 @@ -827,6 +1055,7 @@ def __init__(self, DATA, lut, reader=None, param=None, output_path=None, output_ self.MAP = None self.EVENT = None + self.XYFiles = None def _pre_proc_p1(self, sig_z, srate): @@ -849,9 +1078,9 @@ def _compute_onset_p1(self, sig_z, srate): ltw = int(ltw * srate) + 1 # Changes the onset window to actual samples sig_z = self._pre_proc_p1(sig_z, srate) # Apply the pre-processing defintion self.filt_data['sigz'] = sig_z # defining the data to pass - sig_z = onset(sig_z, stw, ltw) # Determine the onset function using definition + sig_z_raw,sig_z = onset(sig_z, stw, ltw) # Determine the onset function using definition self.onset_data['sigz'] = sig_z # Define the onset function from the data - return sig_z + return sig_z_raw,sig_z def _compute_onset_s1(self, sig_e, sig_n, srate): stw, ltw = self.onset_win_s1 # Define the STW and LTW for the onset function @@ -860,13 +1089,14 @@ def _compute_onset_s1(self, sig_e, sig_n, srate): sig_e, sig_n = self._pre_proc_s1(sig_e, sig_n, srate) # Apply the pre-processing defintion self.filt_data['sige'] = sig_e # Defining filtered signal to pass self.filt_data['sign'] = sig_n # Defining filtered signal to pass - sig_e = onset(sig_e, stw, ltw) # Determine the onset function from the filtered signal - sig_n = onset(sig_n, stw, ltw) # Determine the onset function from the filtered signal + sig_e_raw,sig_e = onset(sig_e, stw, ltw) # Determine the onset function from the filtered signal + sig_n_raw,sig_n = onset(sig_n, stw, ltw) # Determine the onset function from the filtered signal self.onset_data['sige'] = sig_e # Define the onset function from the data self.onset_data['sign'] = sig_n # Define the onset function from the data - snr = np.sqrt(sig_e * sig_e + sig_n * sig_n) # Define the combined onset function from E & N + snr = np.sqrt(sig_e * sig_e + sig_n * sig_n) + snr_raw = np.sqrt(sig_e_raw * sig_e_raw + sig_n_raw * sig_n_raw) # Define the combined onset function from E & N self.onset_data['sigs'] = snr - return snr + return snr_raw,snr def _compute(self, cstart,cend, samples,station_avaliability): @@ -878,15 +1108,23 @@ def _compute(self, cstart,cend, samples,station_avaliability): sige = samples[0] sign = samples[1] sigz = samples[2] - - snr_p1 = self._compute_onset_p1(sigz, srate) - snr_s1 = self._compute_onset_s1(sige, sign, srate) + # Demeaning the data + #sige = sige - np.mean(sige,axis=1) + #sign = sign - np.mean(sign,axis=1) + #sigz = sigz - np.mean(sigz,axis=1) + + snr_p1_raw,snr_p1 = self._compute_onset_p1(sigz, srate) + snr_s1_raw,snr_s1 = self._compute_onset_s1(sige, sign, srate) self.DATA.SNR_P = snr_p1 self.DATA.SNR_S = snr_s1 + self.DATA.SNR_P_raw = snr_p1_raw + self.DATA.SNR_S_raw = snr_s1_raw + + #self._Gaussian_Coalescence() - snr = np.concatenate((snr_p1, snr_s1)) + snr = np.concatenate((self.DATA.SNR_P, self.DATA.SNR_S)) snr[np.isnan(snr)] = 0 @@ -896,8 +1134,8 @@ def _compute(self, cstart,cend, samples,station_avaliability): nchan, tsamp = snr.shape - pre_smp = int(self.pre_pad * srate) - pos_smp = int(self.post_pad * srate) + pre_smp = int(self.pre_pad * int(srate)) + pos_smp = int(self.post_pad * int(srate)) nsamp = tsamp - pre_smp - pos_smp daten = 0.0 - pre_smp / srate @@ -905,19 +1143,42 @@ def _compute(self, cstart,cend, samples,station_avaliability): if self._map is None: #print(' Allocating memory: {}'.format(ncell + (tsamp,))) - self._map = np.zeros(ncell + (tsamp,), dtype=np.float64) - - dind = np.zeros(tsamp, np.int64) - dsnr = np.zeros(tsamp, np.double) + self._map = np.zeros(ncell + (nsamp,), dtype=np.float64) + + dind = np.zeros(nsamp, np.int64) + dsnr = np.zeros(nsamp, np.double) + + # ilib.scan(snr, tt, 0, pre_smp + nsamp +pos_smp, self._map, self.NumberOfCores) + # ilib.detect(self._map, dsnr, dind, 0, pre_smp + nsamp +pos_smp, self.NumberOfCores) + # daten = np.arange((cstart+timedelta(seconds=self.pre_pad)), (cend + timedelta(seconds=-self.post_pad) + timedelta(seconds=1/srate)),timedelta(seconds=1/srate)) + # dsnr = np.exp((dsnr / nchan) - 1.0) + # #dsnr = classic_sta_lta(np.exp((dsnr / nchan) - 1.0),self.onset_win_p1[0]*self.sample_rate*0.5,self.onset_win_p1[1]*self.sample_rate*0.5) + # dsnr = dsnr[pre_smp:pre_smp + nsamp] + # dloc = self.lookup_table.index2xyz(dind[pre_smp:pre_smp + nsamp]) + # MAP = self._map[:,:,:,(pre_smp+1):pre_smp + nsamp] + + + print(snr.shape) + print(nsamp) + print(self.pre_pad) + print(self.post_pad) + ilib.scan(snr, tt, pre_smp, pos_smp, nsamp, self._map, self.NumberOfCores) + ilib.detect(self._map, dsnr, dind, 0,nsamp, self.NumberOfCores) + daten = np.arange((cstart+timedelta(seconds=self.pre_pad)), (cend + timedelta(seconds=-self.post_pad) + timedelta(seconds=1/srate)),timedelta(seconds=1/srate)) + dsnr = np.exp((dsnr / nchan) - 1.0) + #dsnr = classic_sta_lta(np.exp((dsnr / nchan) - 1.0),self.onset_win_p1[0]*self.sample_rate*0.5,self.onset_win_p1[1]*self.sample_rate*0.5) + dsnr = dsnr + dloc = self.lookup_table.index2xyz(dind) + MAP = self._map - ilib.scan(snr, tt, 0, pre_smp + nsamp +pos_smp, self._map, self.NumberOfCores) - ilib.detect(self._map, dsnr, dind, 0, pre_smp + nsamp +pos_smp, self.NumberOfCores) - daten = np.arange((cstart+timedelta(seconds=self.pre_pad)), (cend + timedelta(seconds=-self.post_pad) + timedelta(seconds=1/srate)),timedelta(seconds=1/srate)) - dsnr = np.exp((dsnr[pre_smp:pre_smp + nsamp] / nchan) - 1.0) - dloc = self.lookup_table.index2xyz(dind[pre_smp:pre_smp + nsamp]) + self._map = None - MAP = self._map[:,:,:,(pre_smp+1):pre_smp + nsamp] + print(daten) + print(daten.shape) + print(dsnr.shape) + print(dloc.shape) + print(MAP.shape) return daten, dsnr, dloc, MAP @@ -931,16 +1192,15 @@ def _continious_compute(self,starttime,endtime): # 2. Defining the pre- and post- padding # 3. + CoaV = 1.0 self.StartDateTime = datetime.strptime(starttime,'%Y-%m-%dT%H:%M:%S.%f') self.EndDateTime = datetime.strptime(endtime,'%Y-%m-%dT%H:%M:%S.%f') + # Deleting the scan if it exists alreadys + self.output.del_scan() - - if self.pre_pad == 0.0 and self.post_pad == 0.0: - self.pre_pad = sum(np.max(np.array([self.onset_win_p1,self.onset_win_s1]),0)) - - + # ------- Continious Seismic Detection ------ print('==============================================================================================================================') print(' Coalescence Microseismic Scanning : PATH:{} - NAME:{}'.format(self.output.path, self.output.name)) @@ -959,12 +1219,19 @@ def _continious_compute(self,starttime,endtime): #daten, dsnr, dloc = self._compute_s1(0.0, DATA.signal) daten, dsnr, dloc, map = self._compute(cstart,cend, self.DATA.signal,self.DATA.station_avaliability) - - - dcoord = self.lookup_table.xyz2coord(dloc) self.output.FileSampleRate = self.Output_SampleRate - self.output.write_scan(daten,dsnr,dcoord) + +# self.output.write_scan(daten[:-1],CoaVp[:-1],dcoord[:-1,:]) + + if i == 0: + CoaVp = dsnr + (CoaV-dsnr[0]) + self.output.write_scan(daten[:-1],CoaVp[:-1],dcoord[:-1,:]) + CoaV=CoaVp[-1] + else: + CoaVp = dsnr + (CoaV-dsnr[0]) + self.output.write_scan(daten[:-1],CoaVp[:-1],dcoord[:-1,:]) + CoaV=CoaVp[-1] i += 1 @@ -977,40 +1244,171 @@ def _continious_compute(self,starttime,endtime): def _Trigger_scn(self,CoaVal,starttime,endtime): - CoaVal = CoaVal[CoaVal['COA'] > self.DetectionThreshold] + + # Defining when exceeded threshold + CoaVal = CoaVal[CoaVal['COA'] > self.DetectionThreshold] CoaVal = CoaVal[(CoaVal['DT'] >= datetime.strptime(starttime,'%Y-%m-%dT%H:%M:%S.%f')) & (CoaVal['DT'] <= datetime.strptime(endtime,'%Y-%m-%dT%H:%M:%S.%f'))] - CoaVal = CoaVal.sort_values(['COA'],ascending=False).reset_index(drop=True) - CoaVal['EventID'] = 0 - c=1 - for i in range(len(CoaVal)): - if CoaVal['EventID'].iloc[i] == 0: - tmpDT_MIN = CoaVal['DT'].iloc[i] + timedelta(seconds=-self.MarginalWindow/2) - tmpDT_MAX = CoaVal['DT'].iloc[i] + timedelta(seconds=self.MarginalWindow/2) + CoaVal = CoaVal.reset_index(drop=True) + # ----------- Determining the initial triggered events, not inspecting overlaps ------ + c = 0 + e = 1 + while c < len(CoaVal): - tmpDATA = CoaVal[(CoaVal['DT'] >= tmpDT_MIN) & (CoaVal['DT'] <= tmpDT_MAX)] + # Determining the index when above the level and maximum value + d=c + while CoaVal['DT'].iloc[d] + timedelta(seconds=1/self.sample_rate) == CoaVal['DT'].iloc[d+1]: + d+=1 + if d+1 >= len(CoaVal)-1: + d=len(CoaVal)-1 + break - CoaVal['EventID'].iloc[tmpDATA.index] = c - c+=1 + + + indmin = c + indmax = d + indVal = np.argmax(CoaVal['COA'].iloc[np.arange(c,d+1)]) + + # Determining the times for min,max and max coalescence value + TimeMin = CoaVal['DT'].iloc[indmin] + TimeMax = CoaVal['DT'].iloc[indmax] + TimeVal = CoaVal['DT'].iloc[indVal] + + COA_V = CoaVal['COA'].iloc[indVal] + COA_X = CoaVal['X'].iloc[indVal] + COA_Y = CoaVal['Y'].iloc[indVal] + COA_Z = CoaVal['Z'].iloc[indVal] + + + + if (TimeVal-TimeMin) < timedelta(seconds=0.5*self.MarginalWindow): + TimeMin = CoaVal['DT'].iloc[indmin] + timedelta(seconds=-0.5*self.MarginalWindow) + if (TimeMax - TimeVal) < timedelta(seconds=0.5*self.MarginalWindow): + TimeMax = CoaVal['DT'].iloc[indmax] + timedelta(seconds=0.5*self.MarginalWindow) + + + # Appending these triggers to array + if 'IntEvents' not in vars(): + IntEvents = pd.DataFrame([[e,TimeVal,COA_V,COA_X,COA_Y,COA_Z,TimeMin,TimeMax]],columns=['EventNum','CoaTime','COA_V','COA_X','COA_Y','COA_Z','MinTime','MaxTime']) else: - continue + dat = pd.DataFrame([[e,TimeVal,COA_V,COA_X,COA_Y,COA_Z,TimeMin,TimeMax]],columns=['EventNum','CoaTime','COA_V','COA_X','COA_Y','COA_Z','MinTime','MaxTime']) + IntEvents = IntEvents.append(dat,ignore_index=True) + - EVENTS = pd.DataFrame(columns=['DT','COA','X','Y','Z']) - if max(CoaVal['EventID']) > 0: - for j in range(1,max(CoaVal['EventID'])+1): - tmpDATA = CoaVal[CoaVal['EventID'] == j].sort_values(['COA'],ascending=False).reset_index(drop=True) - EVENTS = EVENTS.append(tmpDATA.iloc[0]) - EVENTS.reset_index(drop=True) + c=d+1 + e+=1 + + + # ----------- Determining the initial triggered events, not inspecting overlaps ------ + EventNum = np.ones((len(IntEvents)),dtype=int) + d=1 + for ee in range(len(IntEvents)): + + if (ee+1 < len(IntEvents)) and ((IntEvents['MaxTime'].iloc[ee] - IntEvents['MinTime'].iloc[ee+1]).total_seconds() < 0): + EventNum[ee] = d + d+=1 + else: + EventNum[ee] = d + IntEvents['EventNum'] = EventNum + + + d=0 + for ee in range(1,np.max(IntEvents['EventNum'])+1): + tmp = IntEvents[IntEvents['EventNum'] == ee].reset_index(drop=True) + if d==0: + EVENTS = pd.DataFrame([[ee, tmp['CoaTime'].iloc[np.argmax(tmp['COA_V'])], np.max(tmp['COA_V']), tmp['COA_X'].iloc[np.argmax(tmp['COA_V'])], tmp['COA_X'].iloc[np.argmax(tmp['COA_V'])], tmp['COA_X'].iloc[np.argmax(tmp['COA_V'])],tmp['CoaTime'].iloc[np.argmax(tmp['COA_V'])] + timedelta(seconds=-self.MarginalWindow),tmp['CoaTime'].iloc[np.argmax(tmp['COA_V'])] + timedelta(seconds=self.MarginalWindow)]],columns=['EventNum','CoaTime','COA_V','COA_X','COA_Y','COA_Z','MinTime','MaxTime']) + d+=1 + else: + EVENTS = EVENTS.append(pd.DataFrame([[ee, tmp['CoaTime'].iloc[np.argmax(tmp['COA_V'])], np.max(tmp['COA_V']), tmp['COA_X'].iloc[np.argmax(tmp['COA_V'])], tmp['COA_X'].iloc[np.argmax(tmp['COA_V'])], tmp['COA_X'].iloc[np.argmax(tmp['COA_V'])],tmp['CoaTime'].iloc[np.argmax(tmp['COA_V'])] + timedelta(seconds=-self.MarginalWindow),tmp['CoaTime'].iloc[np.argmax(tmp['COA_V'])] + timedelta(seconds=self.MarginalWindow)]],columns=['EventNum','CoaTime','COA_V','COA_X','COA_Y','COA_Z','MinTime','MaxTime']),ignore_index=True) + + + + + + # Defining an event id based on maximum coalescence + EVID = np.chararray(len(EVENTS),17) for e in range(len(EVENTS)): - EVENTS['EventID'].iloc[e] = re.sub(r"\D", "",EVENTS['DT'].astype(str).iloc[e]) + EVID[e] = str(re.sub(r"\D", "",EVENTS['CoaTime'].astype(str).iloc[e])) + EVENTS['EventID'] = EVID + + + return EVENTS + def plot_scn(self,starttime,endtime,stations=None,savefile=None): + ''' + + + ''' + + # Defining the filename of the trace + fname = path.join(self.output.path,self.output.name + '.scn') + + + + if path.exists(fname): + + # Loading the .scn file + DATA = pd.read_csv(fname,names=['DT','COA','X','Y','Z']) + DATA['DT'] = pd.to_datetime(DATA['DT']) + + if stations == None: + # Plotting the .scn file + + fig = plt.figure(figsize=(30,15)) + fig.patch.set_facecolor('white') + plt.plot(DATA['DT'],DATA['COA'],color='blue') + plt.xlabel('Datetime') + plt.ylabel('Maximum Coalescence') + plt.axhline(self.DetectionThreshold,color='green') + + EVENTS = self._Trigger_scn(DATA,DATA['DT'].iloc[0].strftime('%Y-%m-%dT%H:%M:%S.%f'),DATA['DT'].iloc[-1].strftime('%Y-%m-%dT%H:%M:%S.%f')) + + for ee in range(len(EVENTS['MinTime'])): + plt.axvline(x=pd.to_datetime(EVENTS['MinTime'].iloc[ee]),linestyle='--',color='red') + plt.axvline(x=pd.to_datetime(EVENTS['MaxTime'].iloc[ee]),linestyle='--',color='red') + plt.axvline(x=pd.to_datetime(EVENTS['CoaTime'].iloc[ee]),color='red') + + plt.xlim([pd.to_datetime(starttime),pd.to_datetime(endtime)]) + + + else: + # Plotting the .scn file with the addition of station avaliability + fig = plt.figure(figsize=(30,15)) + fig.patch.set_facecolor('white') + plt.plot(DATA['DT'],DATA['COA'],color='blue') + plt.xlabel('Datetime') + plt.ylabel('Maximum Coalescence') + plt.axhline(self.DetectionThreshold,color='green') + + EVENTS = self._Trigger_scn(DATA,DATA['DT'].iloc[0].strftime('%Y-%m-%dT%H:%M:%S.%f'),DATA['DT'].iloc[-1].strftime('%Y-%m-%dT%H:%M:%S.%f')) + + for ee in range(len(EVENTS['MinTime'])): + plt.axvline(x=pd.to_datetime(EVENTS['MinTime'].iloc[ee]),linestyle='--',color='red') + plt.axvline(x=pd.to_datetime(EVENTS['MaxTime'].iloc[ee]),linestyle='--',color='red') + plt.axvline(x=pd.to_datetime(EVENTS['CoaTime'].iloc[ee]),color='red') + + plt.xlim([pd.to_datetime(starttime),pd.to_datetime(endtime)]) + + + + + + # Saving figure if defined + if savefile == None: + plt.show() + else: + plt.savefig(savefile) + + else: + print('Please run scn.Detect to generate a .scn file !') + @@ -1022,15 +1420,196 @@ def Detect(self,starttime,endtime): ''' # Conduct the continious compute on the decimated grid - lut = self.lookup_table - lut_decimate = lut.decimate([self.Decimate,self.Decimate,self.Decimate]) - self.lookup_table = lut_decimate - + self.lookup_table = self.lookup_table.decimate(self.Decimate) + + # Define pre-pad as a function of the onset windows + if self.pre_pad is None: + self.pre_pad = max(self.onset_win_p1[1],self.onset_win_s1[1]) + 3*max(self.onset_win_p1[0],self.onset_win_s1[0]) + # Dectect the possible events from the decimated grid self._continious_compute(starttime,endtime) - def _GaussianTrigger(self,SNR,PHASE,cstart,eventT): + def _Gaussian_Coalescence(self): + ''' + Function to fit a gaussian for the coalescence function. + ''' + + + SNR_P = self.DATA.SNR_P + SNR_S = self.DATA.SNR_S + X = np.arange(SNR_P.shape[1]) + + GAU_THRESHOLD = 1.4 + + #---- Selecting only the data above a predefined threshold ---- + # Setting values below threshold to nan + SNR_P[np.where(SNR_P < GAU_THRESHOLD)] = np.nan + SNR_S[np.where(SNR_S < GAU_THRESHOLD)] = np.nan + + + + + # Defining two blank arrays that gaussian periods should be defined for + SNR_P_GauNum = np.zeros(SNR_P.shape)*np.nan + SNR_S_GauNum = np.zeros(SNR_S.shape)*np.nan + + + # --- Determing the indexs to fit gaussians about --- + + for s in range(len(SNR_P)): + c=0 + e=1 + + ValInd = np.where(~np.isnan(SNR_P[s,:]))[0] + while c < len(ValInd): + + # Determining the index when above the level and maximum value + d=c + while ValInd[d]+1 == ValInd[d+1]: + d+=1 + if d+1 >= len(ValInd)-1: + d=len(ValInd)-1 + break + + + indmin = c + indmax = d + + SNR_P_GauNum[s,ValInd[c]:ValInd[d]] = e + + + c=d+1 + e+=1 + + self.DATA.SNR_P_GauNum = SNR_P_GauNum + + for s in range(len(SNR_S)): + c=0 + e=1 + ValInd = np.where(~np.isnan(SNR_S[s,:]))[0] + while c < len(ValInd): + + # Determining the index when above the level and maximum value + d=c + while ValInd[d]+1 == ValInd[d+1]: + d+=1 + if d+1 >= len(ValInd)-1: + d=len(ValInd)-1 + break + + + indmin = c + indmax = d + + SNR_S_GauNum[s,ValInd[c]:ValInd[d]] = e + + + c=d+1 + e+=1 + + + + self.DATA.SNR_S_GauNum = SNR_S_GauNum + + # --- Determing the indexs to fit gaussians about --- + + SNR_PGAU = np.zeros(SNR_P.shape) + for s in range(SNR_P.shape[0]): + if ~np.isnan(np.nanmax(SNR_P_GauNum[s,:])): + c=0 + for ee in range(1,int(round(np.nanmax(SNR_P_GauNum[s,:])))): + + + XSig = X[np.where((SNR_P_GauNum[s,:] == ee))[0]] + YSig = SNR_P[s,np.where((SNR_P_GauNum[s,:] == ee))[0]] + + #print(' LEN = {} and CUT_LEN = {}'.format(len(YSig),round(float(self.bp_filter_p1[0])*self.sample_rate)/10)) + + if len(YSig) > 8: + + #self.DATA.SNR_P = YSig + + try: + lowfreq=float(self.bp_filter_p1[0]) + p0 = [np.max(YSig), np.argmax(YSig) + np.min(XSig), 1./(lowfreq/4.)] + + # Fitting the gaussian to the function + + #print(XSig) + #print(YSig) + #print(p0) + popt, pcov = curve_fit(gaussian_func, XSig, YSig, p0) # Fit gaussian to data + tmp_PGau = gaussian_func(XSig.astype(float),float(popt[0]),float(popt[1]),float(popt[2])) + #print(tmp_PGau) + + if c == 0: + SNR_P_GAU = np.zeros(X.shape) + SNR_P_GAU[np.where((SNR_P_GauNum[s,:] == ee))[0]] = tmp_PGau + c+=1 + else: + SNR_P_GAU[np.where((SNR_P_GauNum[s,:] == ee))[0]] = tmp_PGau + except: + print('Error with {}'.format(ee)) + + else: + continue + + SNR_PGAU[s,:] = SNR_P_GAU + + self.DATA.SNR_P = SNR_PGAU + + + + # --- Determing the indexs to fit gaussians about --- + + SNR_SGAU = np.zeros(SNR_S.shape) + for s in range(SNR_S.shape[0]): + if ~np.isnan(np.nanmax(SNR_S_GauNum[s,:])): + c=0 + for ee in range(1,int(round(np.nanmax(SNR_S_GauNum[s,:])))): + + + XSig = X[np.where((SNR_S_GauNum[s,:] == ee))[0]] + YSig = SNR_S[s,np.where((SNR_S_GauNum[s,:] == ee))[0]] + + print(' LEN = {} and CUT_LEN = {}'.format(len(YSig),round(float(self.bp_filter_p1[0])*self.sample_rate)/10)) + + if len(YSig) > 8: + + #self.DATA.SNR_P = YSig + + try: + lowfreq=float(self.bp_filter_p1[0]) + p0 = [np.max(YSig), np.argmax(YSig) + np.min(XSig), 1./(lowfreq/4.)] + + # Fitting the gaussian to the function + + print(XSig) + print(YSig) + print(p0) + popt, pcov = curve_fit(gaussian_func, XSig, YSig, p0) # Fit gaussian to data + tmp_SGau = gaussian_func(XSig.astype(float),float(popt[0]),float(popt[1]),float(popt[2])) + print(tmp_SGau) + + if c == 0: + SNR_S_GAU = np.zeros(X.shape) + SNR_S_GAU[np.where((SNR_S_GauNum[s,:] == ee))[0]] = tmp_SGau + c+=1 + else: + SNR_S_GAU[np.where((SNR_S_GauNum[s,:] == ee))[0]] = tmp_SGau + except: + print('Error with {}'.format(ee)) + + else: + continue + + SNR_SGAU[s,:] = SNR_S_GAU + + self.DATA.SNR_S = SNR_PGAU + + + def _GaussianTrigger(self,SNR,PHASE,cstart,eventTP,eventTS,Name): ''' Function to fit gaussian to onset function, based on knowledge of approximate trigger index, lowest freq within signal and signal sampling rate. Will fit gaussian and return standard @@ -1038,26 +1617,130 @@ def _GaussianTrigger(self,SNR,PHASE,cstart,eventT): ''' + #print('Fitting Gaussian for {} - {} - {}'.format(PHASE,cstart,eventT)) + sampling_rate = self.sample_rate - trig_idx = int(((eventT-cstart).seconds + (eventT-cstart).microseconds/10.**6) *sampling_rate) + + # Determining the triggering X location based on the SNR value + trig_idx_P = int(((eventTP-cstart).seconds + (eventTP-cstart).microseconds/10.**6) *sampling_rate) + trig_idx_S = int(((eventTS-cstart).seconds + (eventTS-cstart).microseconds/10.**6) *sampling_rate) + + + + P_idxmin = int(trig_idx_P - (trig_idx_S-trig_idx_P)/2) + P_idxmax = int(trig_idx_P + (trig_idx_S-trig_idx_P)/2) + S_idxmin = int(trig_idx_S - (trig_idx_S-trig_idx_P)/2) + S_idxmax = int(trig_idx_S + (trig_idx_S-trig_idx_P)/2) + for ii in [P_idxmin,P_idxmax,S_idxmin,S_idxmax]: + if ii < 0: + ii = 0 + if ii > len(SNR): + ii = len(SNR) + + + #print(' Pmin = {} , Pmax = {}'.format(P_idxmin,P_idxmax)) + #print(' Smin = {} , Smax = {}'.format(S_idxmin,S_idxmax)) + + Pidx = np.argmax(SNR[P_idxmin:P_idxmax]) + P_idxmin + Sidx = np.argmax(SNR[S_idxmin:S_idxmax]) + S_idxmin + #print(Pidx,Sidx) + + if PHASE == 'P': lowfreq = self.bp_filter_p1[0] + trig_idx = Pidx if PHASE == 'S': lowfreq = self.bp_filter_s1[0] + trig_idx = Sidx data_half_range = int(1.25*sampling_rate/(lowfreq)) # half range number of indices to fit guassian over (for 1 wavelengths of lowest frequency component) x_data = np.arange(trig_idx-data_half_range, trig_idx+data_half_range,dtype=float)/sampling_rate # x data, in seconds + y_data = SNR[int(trig_idx-data_half_range):int(trig_idx+data_half_range)] # +/- one wavelength of lowest frequency around trigger p0 = [np.amax(SNR), float(trig_idx)/sampling_rate, 1./(lowfreq/4.)] # Initial guess (should work for any sampling rate and frequency) + + d = 0 + for jj in range(len(x_data)): + if d == 0: + XDATA = cstart + timedelta(seconds=x_data[jj]) + d+=1 + else: + XDATA = np.hstack((XDATA,(cstart + timedelta(seconds=x_data[jj])))) + + + + + + + + + + + try: popt, pcov = curve_fit(gaussian_func, x_data, y_data, p0) # Fit gaussian to data sigma = np.absolute(popt[2]) # Get standard deviation from gaussian fit + + # Mean is popt[1]. x_data[0] + popt[1] (In seconds) + mean = cstart + timedelta(seconds=float(popt[1])) + + maxSNR = popt[0] + + + # Determining if the pick is above + n, bins = np.histogram(SNR,bins=np.arange(0,np.max(SNR),7/5000)) + mids = 0.5*(bins[1:] + bins[:-1]) + ncum = np.cumsum(n)/np.sum(n) + #print(ncum) + + #print(np.where((mids-popt[0]) >= 0)[0]) + + if (len(np.where((mids-popt[0]) >= 0)[0]) == 0): + #print('Picked {} for {}'.format(PHASE,Name)) + GAU_FITS = {} + GAU_FITS['popt'] = popt + GAU_FITS['xdata'] = x_data + GAU_FITS['xdata_dt'] = XDATA + GAU_FITS['PickValue'] = 1.0 + + else: + if (np.min(ncum[np.where((mids-popt[0]) >= 0)[0]]) >= self.PickThreshold): + #print('Picked 2 {} for {} - {}'.format(PHASE,Name,np.min(ncum[np.where((mids-popt[0]) >= 0)[0]]))) + GAU_FITS = {} + GAU_FITS['popt'] = popt + GAU_FITS['xdata'] = x_data + GAU_FITS['xdata_dt'] = XDATA + GAU_FITS['PickValue'] = np.min(ncum[np.where((mids-popt[0]) >= 0)[0]]) + else: + #print('Didnt Pick {} for {} - {}'.format(PHASE,Name,np.min(ncum[np.where((mids-popt[0]) >= 0)[0]]))) + GAU_FITS = {} + GAU_FITS['popt'] = np.zeros((3)) + GAU_FITS['xdata'] = np.zeros(x_data.shape) + GAU_FITS['xdata_dt'] = np.zeros(XDATA.shape) + GAU_FITS['PickValue'] = np.min(ncum[np.where((mids-popt[0]) >= 0)[0]]) + sigma = -1 + mean = -1 + maxSNR = -1 + + + #print(mean) except: + GAU_FITS = {} + GAU_FITS['popt'] = np.zeros((3)) + GAU_FITS['xdata'] = np.zeros(x_data.shape) + GAU_FITS['xdata_dt'] = np.zeros(XDATA.shape) + GAU_FITS['PickValue'] = -1 + + sigma = -1 + mean = -1 + maxSNR = -1 + + return GAU_FITS,maxSNR,sigma,mean + - return sigma @@ -1070,39 +1753,52 @@ def _ArrivalTrigger(self,EVENT_MaxCoa,EventName): SNR_P = self.DATA.SNR_P SNR_S = self.DATA.SNR_S - ttp = self.lookup_table.value_at('TIME_P', np.array(self.lookup_table.coord2xyz(np.array([EVENT_MaxCoa[['X','Y','Z']].tolist()]))).astype(int))[0] - tts = self.lookup_table.value_at('TIME_S', np.array(self.lookup_table.coord2xyz(np.array([EVENT_MaxCoa[['X','Y','Z']].tolist()]))).astype(int))[0] + #print(EVENT_MaxCoa[['X','Y','Z']].iloc[0]) - print(ttp) + ttp = self.lookup_table.value_at('TIME_P', np.array(self.lookup_table.coord2xyz(np.array([EVENT_MaxCoa[['X','Y','Z']].values]))).astype(int))[0] + tts = self.lookup_table.value_at('TIME_S', np.array(self.lookup_table.coord2xyz(np.array([EVENT_MaxCoa[['X','Y','Z']].values]))).astype(int))[0] + # Determining the stations that can be picked on and the phasese - STATIONS=pd.DataFrame(columns=['Name','Phase','Pick','PickError']) + STATION_pickS=pd.DataFrame(columns=['Name','Phase','ModelledTime','PickTime','PickError']) + c=0 + d=0 for s in range(len(SNR_P)): - if np.nansum(SNR_P[s]) != 0: - stationEventPT = EVENT_MaxCoa['DT'] + timedelta(seconds=ttp[s]) + stationEventPT = EVENT_MaxCoa['DT'] + timedelta(seconds=ttp[s]) + stationEventST = EVENT_MaxCoa['DT'] + timedelta(seconds=tts[s]) - if self.PickingType == 'Gaussian': - Err = self._GaussianTrigger(SNR_P[s],'P',self.DATA.startTime,stationEventPT.to_pydatetime()) + if self.PickingType == 'Gaussian': + GauInfoP,maxSNR_P,Err,Mn = self._GaussianTrigger(SNR_P[s],'P',self.DATA.startTime,stationEventPT.to_pydatetime(),stationEventST.to_pydatetime(),self.lookup_table.station_data['Name'][s]) + if c==0: + GAUP = GauInfoP + c+=1 + else: + GAUP = np.hstack((GAUP,GauInfoP)) + + tmpSTATION_pick = pd.DataFrame([[self.lookup_table.station_data['Name'][s],'P',stationEventPT,Mn,Err,maxSNR_P]],columns=['Name','Phase','ModelledTime','PickTime','PickError','PickSNR']) + STATION_pickS = STATION_pickS.append(tmpSTATION_pick) - - tmpSTATION = pd.DataFrame([[self.lookup_table.station_data['Name'][s],'P',stationEventPT,Err]],columns=['Name','Phase','Pick','PickError']) - STATIONS = STATIONS.append(tmpSTATION) - if np.nansum(SNR_S[s]) != 0: - - stationEventST = EVENT_MaxCoa['DT'] + timedelta(seconds=tts[s]) + if self.PickingType == 'Gaussian': + GauInfoS,maxSNR_S,Err,Mn = self._GaussianTrigger(SNR_S[s],'S',self.DATA.startTime,stationEventPT.to_pydatetime(),stationEventST.to_pydatetime(),self.lookup_table.station_data['Name'][s]) - if self.PickingType == 'Gaussian': - Err = self._GaussianTrigger(SNR_P[s],'S',self.DATA.startTime,stationEventPT.to_pydatetime()) - tmpSTATION = pd.DataFrame([[self.lookup_table.station_data['Name'][s],'S',stationEventST,Err]],columns=['Name','Phase','Pick','PickError']) - STATIONS = STATIONS.append(tmpSTATION) + if d==0: + GAUS = GauInfoS + d+=1 + else: + GAUS = np.hstack((GAUS,GauInfoS)) + + tmpSTATION_pick = pd.DataFrame([[self.lookup_table.station_data['Name'][s],'S',stationEventST,Mn,Err,maxSNR_S]],columns=['Name','Phase','ModelledTime','PickTime','PickError','PickSNR']) + STATION_pickS = STATION_pickS.append(tmpSTATION_pick) - #print(STATIONS) + #print(STATION_pickS) # Saving the output from the triggered events - self.output.write_stationsfile(STATIONS,EventName) + STATION_pickS = STATION_pickS[['Name','Phase','ModelledTime','PickTime','PickError']] + self.output.write_stationsfile(STATION_pickS,EventName) + return STATION_pickS,GAUP,GAUS def _ErrorEllipse(self,COA3D): """ @@ -1165,7 +1861,7 @@ def _LocationError(self,Map4D): CoaMap = np.log(np.sum(np.exp(Map4D),axis=-1)) CoaMap = CoaMap/np.max(CoaMap) - CoaMap_Cutoff = np.percentile(CoaMap,95) + CoaMap_Cutoff = 0.8 CoaMap[CoaMap < CoaMap_Cutoff] = CoaMap_Cutoff CoaMap = CoaMap - CoaMap_Cutoff CoaMap = CoaMap/np.max(CoaMap) @@ -1189,80 +1885,77 @@ def _LocationError(self,Map4D): def Trigger(self,starttime,endtime): ''' - + ''' # Intial Detection of the events from .scn file CoaVal = self.output.read_scan() EVENTS = self._Trigger_scn(CoaVal,starttime,endtime) - # + + # Conduct the continious compute on the decimated grid + self.lookup_table = self.lookup_table.decimate(self.Decimate) + + # Define pre-pad as a function of the onset windows + if self.pre_pad is None: + self.pre_pad = max(self.onset_win_p1[1],self.onset_win_s1[1]) + 3*max(self.onset_win_p1[0],self.onset_win_s1[0]) + + # Triggered = pd.DataFrame(columns=['DT','COA','X','Y','Z','ErrX','ErrY','ErrZ']) for e in range(len(EVENTS)): - print('--Processing for Event {} of {} - {}'.format(e+1,len(EVENTS),EVENTS['EventID'].iloc[e])) + print('--Processing for Event {} of {} - {}'.format(e+1,len(EVENTS),(EVENTS['EventID'].iloc[e]).astype(str))) # Determining the Seismic event location - cstart = EVENTS['DT'].iloc[e].to_pydatetime() + timedelta(seconds = -self.MarginalWindow/2) + timedelta(seconds = -self.pre_pad) - cend = EVENTS['DT'].iloc[e].to_pydatetime() + timedelta(seconds = self.MarginalWindow/2) + timedelta(seconds = self.post_pad) + cstart = EVENTS['MinTime'].iloc[e] + timedelta(seconds=-self.pre_pad) + cend = EVENTS['MaxTime'].iloc[e] + timedelta(seconds=self.post_pad) self.DATA.read_mseed(cstart.strftime('%Y-%m-%dT%H:%M:%S.%f'),cend.strftime('%Y-%m-%dT%H:%M:%S.%f'),self.sample_rate) - self._map = None - daten, dsnr, dloc, MAP = self._compute(cstart,cend,self.DATA.signal,self.DATA.station_avaliability) + daten, dsnr, dloc, self.MAP = self._compute(cstart,cend,self.DATA.signal,self.DATA.station_avaliability) + dcoord = self.lookup_table.xyz2coord(np.array(dloc).astype(int)) EventCoaVal = pd.DataFrame(np.array((daten,dsnr,dcoord[:,0],dcoord[:,1],dcoord[:,2])).transpose(),columns=['DT','COA','X','Y','Z']) EventCoaVal['DT'] = pd.to_datetime(EventCoaVal['DT']) - - EVENT = EventCoaVal.sort_values(by=['COA'],ascending=False).iloc[0] - - pickle.dump(self.DATA,open("ONSET.p", "wb" )) - - self.MAP = MAP - self.EVENT = EVENT - self.cstart = cstart - self.cend = cend - + self.EVENT = EventCoaVal + self.EVENT_max = self.EVENT.iloc[EventCoaVal['COA'].astype('float').idxmax()] # Determining the hypocentral location from the maximum over the marginal window. - self._ArrivalTrigger(EVENT,EVENTS['EventID'].iloc[e]) + Picks,GAUP,GAUS = self._ArrivalTrigger(self.EVENT_max,(EVENTS['EventID'].iloc[e].astype(str))) + StationPick = {} + StationPick['Pick'] = Picks + StationPick['GAU_P'] = GAUP + StationPick['GAU_S'] = GAUS - # Determining earthquake location error - LOC,LOC_ERR = self._LocationError(MAP) - - EVENT['X_ErrE'] = LOC[0] - EVENT['Y_ErrE'] = LOC[1] - EVENT['Z_ErrE'] = LOC[2] + LOC,LOC_ERR = self._LocationError(self.MAP) - EVENT['ErrX'] = LOC_ERR[0] - EVENT['ErrY'] = LOC_ERR[1] - EVENT['ErrZ'] = LOC_ERR[2] + EV = pd.DataFrame([np.append(self.EVENT_max.as_matrix(),[LOC[0],LOC[1],LOC[2],LOC_ERR[0],LOC_ERR[1],LOC_ERR[2]])],columns=['DT','COA','X','Y','Z','X_ErrE','Y_ErrE','Z_ErrE','ErrX','ErrY','ErrZ']) + self.output.write_event(EV,str(EVENTS['EventID'].iloc[e].astype(str))) + if self.CutMSEED == True: + self.output.cut_mseed(self.DATA,str(EVENTS['EventID'].iloc[e].astype(str))) - - self.output.write_event(EVENT,EVENTS['EventID'].iloc[e]) # Outputting coalescence grids and triggered events - if self.CoalescenceGrid == True: + if self.CoalescenceTrace == True: + SeisPLT = SeisPlot(self.lookup_table,self.MAP,self.DATA,self.EVENT,StationPick) + SeisPLT.CoalescenceTrace(SaveFilename='{}_{}'.format(path.join(self.output.path, self.output.name),EVENTS['EventID'].iloc[e].astype(str))) - # CoaMap = {} - # CoaMap['MAP'] = MAP - # CoaMap['CoaDATA'] = tmpEvent + if self.CoalescenceGrid == True: self.output.write_coal4D(MAP,e,cstart,cend) if self.CoalescenceVideo == True: - self.MAP = MAP - self.EVENT = EventCoaVal - self.output.write_coalVideo(self.lookup_table,MAP,self.DATA,EventCoaVal,EVENTS['EventID'].iloc[e]) - - - - - - Triggered = Triggered.append(EVENT) + SeisPLT = SeisPlot(self.lookup_table,self.MAP,self.DATA,self.EVENT,StationPick) + SeisPLT.CoalescenceVideo(SaveFilename='{}_{}'.format(path.join(self.output.path, self.output.name),EVENTS['EventID'].iloc[e].astype(str))) + if self.CoalescencePicture == True: + SeisPLT = SeisPlot(self.lookup_table,self.MAP,self.DATA,self.EVENT,StationPick) + SeisPLT.CoalescenceMarginal(SaveFilename='{}_{}'.format(path.join(self.output.path, self.output.name),EVENTS['EventID'].iloc[e].astype(str))) - return Triggered + self.MAP = None + self.EVENT = None + self.cstart = None + self.cend = None diff --git a/dist/CMS-0.2.18.11.1-py3.5.egg b/dist/CMS-0.2.18.11.1-py3.5.egg new file mode 100644 index 0000000000000000000000000000000000000000..a85861020b21832e56c9fae7e895977bce6523ea GIT binary patch literal 104683 zcmYg$V{k59&}6I|n@?;zxk+wp+qP}nwr$(CZQHi@{kFDt_s3Kn{OYMWT|IMJP7)Lh z6$l6j3MgDgLwbX^?JEDj-RggV@Lvc@E7I%gn%kH=>FUzix${Kz!wfJW3f+E36rW;K z0l1+Bz>C!oFL|oQ4OBCuNzA{!H6sA0(^HEcMTqN>D|LZgN|)S=8wxD`yXUjivEM^t zu>6B$Z(_K3IA(AWb=-R3%8!2<3r@}P%-iwlO)=Rkvi{&IoDL3H(x?4JHNz{d@$)!y zmk8y{1*!RwA?#;Fgw9iIbB8SL7ol$q#dYX4%VD#b?B*|>E89;tUB{67zi1dz^rbP= z=V}VTfPi>VfPj$y4;n*T2V;6eYey?{gZ}_ct7+P9vZ4B{))HJmN>&!EgzJNiaO;V+ z>i4a{sx_weA)1A|G|3h5EnF|;|9XdFNG8!trWy=B>1od-@4n9<9p_O{)1e+P*{ND- zs?bA84ppoak|@%n#W$&$>qDFpj4cFEHZi!$Ds+@zMr zsCek^w$x1dUDPI1C?wPGY6%th3@-pN-3seirD4`ZJJO978y;*5#-CV6%}tD7)UOs z-r`+k?A(L1s~Lwv5$l46{K6=r;2nXq%!{KX+#)9heFt|iN+NFXt?brQcYMdZ=vEHhvxwyfW5!B%O*)vnN>%>dOG-@&dHdNoO}d zTzY}p6fU|^iKr!f1S$nEfK2Qud`aECrgnD7T}Sml4p#dyc^247$YC5 z-_#z<b#a+!5&BZ%|ujDHZWUw7BX_GYR z$DaJyt&tU+Hyh@4Exfk5O=Z{lE+dBmv62r%R-`8#j(?NCP|n0fkT15WqYQY(`7p-y zz+(Ng8Xz}HzgHrr;g#m_1LXX6bgnoo<$ewd83uv%#?sx=2QXQzQVX4S*88k%bR_(~ zdL5*^XX%JBzO+W+$}d4GLf%9{=LlnHu*&dQR8=r*uX(H(6r(W2Qw~p)gQ1w;-{9K) zvP?335HI?XOl*?8iDM2S#z7ahJsL{A6v>G|%GCXjb7m`xgL?WN_}-TH?<1J7v{oNC z7oI$+a)j{*xcy9&te%diOMR#9K^VC;197vi5MYPPZJ=36Ir6T!ibTvH>YDZNhrX_D zBW4%Z6_;Yj7k%=MlGE2WGe)Q4tX=apwkC^nd`QF7-Gx#|Cat6nY64PePzmSkvi%OC ze~r{ui_^0uH;S0k)Jo-YBIr!Cnea;CYRQm-ta)%jK7BO%Q-cLHH!tne^UPw@XAqx}y*bJm{3M-Tx4z1IK%A^!i2=45Vd{2!lP^O(DC ziX`lQQ~zC9L@}3V>61jxJ!aRL6wit#^C33w3RjH{7)uGl1mggr$oQ%2^{%Wya5^O5 z$8$N+I}!uysI0uasJO8FTxT=93Vr2m>}~CwZ8_h}G;4|a&fH959g$wK-wH(Megw&h za_2a?TEZWdANV%9h+SV_`y+rn&<#|!u zI-9q@3jL>`9%D}OB=k`4A8_B(vn1+4;Uz`Lf)DCHE??J=m#eSmbI(vb%QNd|(LtWS zb{bQ~_-}*e2B3FOh&>1zRhKO4*!2)ka6RpKZU=0+-(N4!pYye+wj!suJ74U6aHiJu zG2O<8hOTp*92YOKF&jWto=cZ5F-NI7rM?_zmGq&aGNqm*Jx`F3q8&4NmmS`!UG5`P zyn+0tc5Vc~xE!LQJYOQZ9yYgir9HS#*)hbuxGq^by{pN(5Ri~da~Cc#c~KD89oznn zc?`~6+NXMXc6OaStIkS_Hnp3)c23Pa9=UF z;tIBZE#aX{(@GyXgdWHq%?C?9Bu!T1^lVMS!O?q9`wu?j-57tst{Q=F88Lp4B)jiI z*g*gr((IX}W9tmMOr6`X?eKcrVx=ySidoCCc#Rfv;PF_+NcszM zYwLU+HosNxw8*zL&l?R?Oox4Fb z7i{IozuYH{N!j$KU)H#y_Ox==(pyAx0#-6y+Za4%MlHo0G z94aMl6cY`PnlnD_50dmQrup4;a9-5w;m>ym$RZxGrPZyd=&!%T0V&RE()<1dY-1+_j2#8`pk1u%JO zAhbKb4lg&pW?^Q)#fioV50ruW0n&O+5#Q9f>4+)#0ZPG?Kv2f!dcF7{1em3Wh_D)} zd?{xc;>m{Ge9xJ6L!N2?e^LRV-BC_L_tci zSX{4T&C85+pjg84EO(3!4pGi55=Pd7(^E^h;r%5YKj_xTq2Z0Y`+f!ZNJK*^)j&^% z*~bx=dr3RC1?;NP@XYGX$gt7nO!NjzkzuKZI8H#62|7mwdh}95-n1o}{LGkRqPk-W zDUtbbig5M_HVW6djlnVnYyI?U{r@#mh<{P<#qkmPn{Wo^>t782VEmUjjXb(tABY!! z4XqftIH*eMxkcek0>4}#AqN*UVSe{hr});hC%>=bH?VAR@He(k#Nk|IxiGzPbRUmM z55B8;G5x#;Qbx2 z^SHE#ECOCwQu6M8Ks^_Inqy0wumQC9YTtuLt}{iBF0gYxvFRgL$E@Emy^uDljQqty zl8;@`l&vS3Rbu@n}j$^}@*EIo_|OU@`G zyeK+Is>bhJTo@s%yoCkElHU?TUJvyO!aAbUql??Suf<$cHGiYEpJl9wUY$tcWJ>{z zGp%T>w@OSu4n5{9s2kl-)*H`#ZLPZ$A);9~(HxpA1};SsT>klyfchEEVwn>!+-rK0GI`rb8u(4>NxmtY^EZD@>aWO6!U*J<&(8&XLj$`1`th}1O-lIW- ze4c?G8}gi><54xy0Q!sl?)8=Hwqq;vl~d@pPG|3O6BU{{k$}m4=VEZLCuc>K6@r13 zRrMm8HP&$Ja2cU@SgA$t-0m(K@}|{25i)iJWoT{qFd!_Ny3AkADkeyhY2%tzdj2i= zYiVyMVIJ?PH%BXML}KWGdOY~BO_TQ61FtZH)%jCFGkxjK*)2)E>GTTpH1}pY0^$4S zhhN*IZJ^5KRuabSYVU{YV{ZkoH2?*N@j$M{*QmZ=UKxTbN&#HNiHcNKSMAzp*sLY^ zaHZ#P06`IUU4wVPcu0+r2I(s0@L(3D-v?%_h!?W275+yRScPKLAA{;T(>f(S+ifzI)&*zU@Qw9((0yVbVPAd$MWXJoH8L_%a-SE|Z;TcUQ{Auh zzVD3X zAL^%GlBZ7>WYe(Kme6CX{8Y-2^=(;wnA<|jte9ZU9`fB!h|9$j3u0UOBPxfHiixSN zGL3z#%K%BBRzgnQoHzKCgf@Ev$@+!4^h=KGIE3Mp>#w-#a~_O_IBwE0Kq(>NGDlsU zJib;-&PJrfSZRe$GQ-bI{vnWW94t%>$}S9Hlxf_+M4={}gno>x2uxtXpv!v^0OQ26 zFA+e0Uz6y&J|e%)8tEh%sTOR)SaM5luK6n5g`=j1tN5SHd(Hn{;)!yJ$JV1)Zs8Nm ztJoD>oA|@m0d>R&s{Y3BM~FJq3oIA@Cs>G`Uv9tEOh!IM>=Ou%u&n2xbtfC4V9>CiTLNx^P%|eV6 zQq2bo#es#GR1^iaBH91h4pIy$k=6D6^IXfD8@uy+eVyrQdh7E}EeGa!36SGG`UBUj z^kY0Dn6M&v2(dJjbpPg}W*)y0%;x`ZSV#F7-6HJmFae2|T)r)nNZ-aU4KcUSFjpmR zwwJ7y`N%845n<-#oXuwCj_?CB7|P&uCDuz_nrCQJx@kWzb$>4&v4Pe9XSP@9F zr6Qax8jL8At>^eqR(*jC)NR^sCmkx7={RoIFP7x_OkYF**gD6~nr3(d3YF-+R0^P> zT-Hfu`MhK?7=tCurowx`58!Ww2q22~mU?8w&yK`>2tZAnlB!}~IdV|>f=C)1qd=EH z?GUMM6(yd?3Q%JEqwJ7f6tl49RR5ixJ~xUm2Wk{{0zcZtZ`~a6PrR{%eBqT+27sw( z9Q+f_&{$KA(X3Ic+3(@SKGX~|3v()EC+IeLV0)ezNx!Fu&ZV$myr{X^)f-)D9ASer zbU&SNBY~n-6?z;wd|xP}^%8Js784hI|dYg?1mAnlk^|qFOl@8BigcEP>svxemP@ zbV@E9VQWZkZ}no*s7G1S7|)4;WpAR{HWvAiY zs`IiOeCV}R`w>)jS1cfAX54-g44yU*F9uZycWKe%zeF*9;c$P)ecbWnw51 z#ozuT&>*BiUE7UX4+GN%vnr%@$GjDo2n!T9aNR$j#Y*(%* z&1W1`Q_(|96M{H&#Fhbx0x?fwiig#dx+1{%#K=scf*TPeLwxBP2{$o9{>*6pG><`} zWB8?{ZWPcs`SKK4p+kxC_EweL@f3l#ay;f_`k*!iE+jlngG^m;}6fspc?UhJdCp|0D{$(jrYtXl88Lqp`BW$2j{_oxF&FoGdB;{A&PABaXr5u~{)pRBu zu!&M?$?H%um!rp%@>rGWH-5q?U6DkB5g}r2?RrgVaFL&ZToY?BzEvNtQ{t0i0>gt^ z_*So&AKFXCog1v^D6_|+&$OkaVA!KXbC6Rsh}Kx8u3w*pBbmy+GSi<;CaACTNN@-K zn>CWdc9v$4E_IhW;FM^@J3EE{6N`S;vPkh95O2kYK@Yn@d4Yw=cc<7m?Vlc^WGl)< zeMutn0q%+eNK641a$}YqoquM{STb3(7;G6Wd1GA&FW-RXxO=1cgwW+fM!}SUhvXSG zZ#bnMlDkQ^Xu!CT-PmMJuI%|u*wbiWqz2axtK7%pA`F{olltH5SZKfpyQhIf@I8KTSK%csvPTul-${6)S!FBt&pvAO z+nRDGY9TG-6X*p?JtynN6Stc4Z(z3UQ4=O$9`3|d_bbAuw7xHB)4k7z3aa~XlHz^ly4kLJ)~Aa? z@A{8`loyj$cy$R#f0F~;a*uX-g$`-qsQc1d8T{TlLYvgWH!A3T-d^MTCU~ty$VB)C zNllK6(~g5@g51LyjkN+X+#J;KK$c*KT+>IG3lOFhvn}mmGS|tDtCiPldczhrHgd-uVa*-oOCM z8RI6BJk8OywmpN&2$HaUB{)ke@awJtNS7pW5PNeYujD?!MY7=4`cAF(!hWwA-wT+N zW+MTy=OiXbMhT+2C*|>M#YLH98BPno=BI4XY0$=@OcRSmX_6{E;NzabwuITJM7SP0 z?NQPyLdRB6)i92Jw=~}~)1YZ0BK+6ee=aQ2vOW8>;O5n}zvHDbn>7puD4-~0!fPhE z6NI-6J5MPnNDP__jV28;2}FX6UfG1BRI-EuKkmkCI!sq6w095BTb^~gu}Jr}-RLaQjpw#y%Rmmy$h7XFJ4=WYP+E<)oLKNR-(Bqb zMJbd-wdalI6NVKglWPc$3`kTTe7Fmb{9Pvy-fZT>kMHR2S)`=dq?G|qsrjh|pO=v_ z<9Kw60;rM&H6?g)%g*B)s@~yb(`5h{t{1hBWS#s1M)ky8C8NGS57a=Yl8x-ON6!HQ zX=vKuUKtqRhi?_#30bOw5ij+$OcOzr@OZ>;SdcpGQdkz~!j^{h3R|_*ij~LbIO7WK zxan~d;3G?_lAM_!e*K|LfTOct94JA&kHon#3SZ@iranYon))PkrPv1#xtQHON??Qo zkn7cf>k;q-O?3#GHcESFK9SC$ylgH04vQa&`C7oW5QrwtyIya4T4YwMS74Jju7h~E z<8aI<@&do|7H6hsaWA^-S`CmTvZx$3$|}ntaVpB9<$4uqf3G~Uz<-)~vXsMHK{V}H zg;ViHO%N{#ES_P{b6_+Jnf|SLaZ9OAQp1d&B~(&r%4IB7NqXHJ$LeJ~sXs?_R}D?b zSrUV3V^t1QA-o&FGSnM1wo5u#z)>pGwOlT|KtKSWYriiSWbPE ziCIf>M-|vjYo66{wx+ZE$iQ0C2F>3>jP~W;hso1m?~9g1rO2HNXN>xXBQuP8W-fDp zDr3qWe=?=OT}I0I#Iw6BqOcW=_z6sWCTPfMJYJmIj^NJIR>fH>4=5Yyh->n++~@S!cvU?4+(55@)&Q~bDL ztb(NCgE3?E;lkW}ArSUg0!r3&zHZ$L(~galQn_^mSh^k?6nI7Eh7(nfOFiaM6BfdO zb0ee>802yZ0B07R!ihU3LfifwufjojaO&-@@uoDHjzN6_AQ`sQ6UuUS)iqPg*l&jnD%t2 z$J%61g^TntW1&&!O`Mcw9znfo%i*jvoth4B2~B^(jsrwnx(O)tF4E%W8PwD*)e6l| z(|SWtn%-C=uQt3x*xy*bNveQ*fq$0?n)^991wp#+XzJg^1J(PejjaT28U}{T*!a!W zYPiFnES-{TJn4u!PBnJl6tc5k@VaA?ro5TjU-J7_Crm9eZqz!#kLgvh;L-l!1O$e$ zIt>yG{nrkH-U)f+$HZK%mQupwL$In=44ycqrL&E7W0w$_fzjZ-iQk-zy%~!6jLbhn z6ULSs6F%BgskD$hG9K>)XN{pXs)gCyA?-VbYaH!wk;|kyq&W{K%z8eTv>^UdV7H29 z!cd$GKW1HmLa;VHvB0uyQ*Zn%P%zav?&P+TmA1L3Kol;Hx5#4ANznSR9Ilr`m^(PY zN@+jv6xpy*7RKzb$nh1Q-cuHQUnZ#R?;JiRBWqN}zbM3jLrqz;Y08D*wa5+O9wF~_ z7QU&PLwHL6C%)W+)?8WabSt5wD2098ZDK;&Bd&Z__3@W@=8G!2+rC3U*9_@KkOgA( zXj}G2k`*=&tv(M=uYulroBFTj?2eyKRfNmm{7E(-<2ju->@ZKzAjaHy`h@Dzg|%(L z=4Uh{XJ=gMs{T{PD8AAGsH;^55I1gX{8(t7Dnm#m$+kZQHF#qhX7z)C{JpIgRmTk} z7g+xmMqS+LT9+m;^&C%xsjAn+vlUmp&9R?Q+NYgas5mX{xATpE;a{wKr+SL*yOonK ztQg!c(!3kK$XcY&%ef&>sKH6+GMbAVFsN@k-Man)Ty~v9wtY79BSumNkYz0`$=Ahw zN~2kbniEEvo=fXHA2)wyoP13kdL9q$PMz8uTRI=WLPJnj%nMW*K&5V}#v83e+ow$) z3%R-&I74Ci_+=N1v2*!=M<(s{F6OGTA7;%#J!QFD+;|bZxeaWXeW(`dy$IE8)Zf8@y%Fd8*pd}RaWH3EkEn|OL4$!s0YKMamyKsF z36uCt$CJ;-NFUfaS}rV7lch7NGYTvECSK>DWUFI;f`3V=XD{-yV}l|i;XOh~`nvrg zeh0a6B}Kl6D)`k7KHIE#MkD?0EC@*zkLqA$mq^A;j7JkNk!uj{)$eGy|&%r zUfSsWh}}ckQk6Bh*8Lu@`mVIqzt-hxnd1GQo7DOj1SfkPp73Vh=hDWP+MekD7Hcax z$hyr6Dmwqf!NHOo;xo$2nJ^okwFP7Dto$3?RiYIh3q2XS>c})|6EezlNaY!1;kx6^ zkFdE|C--bBJALo?(%sKWDfz5D#Rm?boEf4Mp00Vt3icUwE@pgQ2H#J;ZX?IVs3$s} z6E>H(J@GCktB^y6dAi<_neQomz~T1=FC!k}cJI~3dm%_{M+9(?-d2e)W_1=HQji0U zv?kC9S!i;K4ZfXJvpfnBEf&MW#7vx{o88$Hc2IY^j1Jbg>h!SJ;1J|-`h}``-DA@H zqZh2F%`|KBc0i_#MY^GGFGQ3iI!MD83SNacbe+J?PA@HUD!>AKbHIPrMholjKM0M0 z?eqXtR7dHtp~xm%E9N$gCt-`cE42P&vuG4tqM8}YSQNA!=G-v>d^C3qCs=3`4V>O= zd2|G162qDj6sERANu?go-Ee%V3hie1fZF!j;70#|peS?WETCX{e%R#rHSM{H6ys43 zi!=zSELDf2V~>~Q3xNq_+Gue92{JrBvgvLKYRf4lI8?zT)W@>YWR*H6;aUOyhyYS5 zWvbjUg{uXcWQ*)fy|I z6WQidWVYi%bQLPsh{ellyOrU>3;{;pZ=1_yz|*l;b{p7qa54B*{*&SgxG{~9wc-5B zfyR&23v(RSu8J3F%B=omsql&JkqK40091Q z;KtC!(FeV)=xunn;@WS{qSc?TD9Q(fESXllD#&BIh^|wHs%{UTt{`-n2D0E>p~%v8 z=9>)95riC%*|tuD*|+{xTy)p~liQBWhw%UdCduqV4f>yw=Fy{F&wtrXn{KWzkzFUa zzf3X0Gk`thhlb-hus>=b++r2)Dhp=DnMM3}QwNzs`_zw8i>#iM`A>BhBO;>^<_>ag z>IX?mNfF3G<%<;Gaa%BzpbnerLi*c26+X4h9Ymj zNzy?}Ew8g^b#22=Ndo=4J~um=OZxUll31`s`&)IbOKQJooYy#h(EFX?Kl&DGh_OCC zsT3w1yE+pc|4wQCSRN{B#F*`lt>f~mx9;y z#EkNO?w5u#D}#JIHYh%`j83BiIcfsI5C9VdG-ebgs_c_%s#`F~?vNMOkZhb`r%SJQ zqi-}hB^Ktvf=wlkB7uOPZ;J7Ib|aqE)FcHcz*t3&qh=#y2}L3*YA$px9WQy>Q~RZv zGuHYWcuu*QJ%Fo*wcB9iFCd*OYG#x*VtS-fW$N7b@H{^j0Po>zbVW2Wv(Zrq-vlJp^d7Ez=P1n06^k(CVa8wgirmCn~z~|6n_wjELi*To12{X z)UY>&{F=7bG1NE{Hs$%$RN~b`Lz{uWy1{NdDG%|+imy9oTNRJuid|*})8u>=S*A*Z zMBSuVJFBCR@*i0N-sk^*WD|77lw=MhnppM@e;_bl;9xu5VaKoGuzs(|lh`})4JzyV z!Hu&&-c+&>QZT%+R>!2v+Z9Gy#Gb%hvR-D6{^H0~N%ttNf>~zE6%4l;SEg~wqmBQW zu#ge}y7CJgh+0Qr>=pV>T^1*YEN~q7`&`cm(%MTeCfmVsznnY)ohb zqB%ZK=$4(>!Vi}3cUM!w{TPoz`$?rxf6@s1EQ-1s2<_H2G1qBe=6$=O9|+*xvKBr# zU!b>Lepcm`^@}YS=7e9cnm)qmvS~)uYS0*$o{Glpz|kHd&(<>xTlQx zU{O(>>dXDGejJ=4apM}>Cj|kxwW4ZdoNVJgtCbO?=KhrQ$ATp=Q;yQtX`; zE9g8ciLROuFd|)A;a4YD>U{%gOzq1r<*RJ`E(vI0o=KKfv6}w)5r@#RM+VH=m(@>t zp(TCXJbJZTQO5U5FM6Sqs=1oI6aiIhNm%a<*iH{{Wb#-eFO1iQAyIb1{>UQgg zuoC4ti-e4b3fdp~;->gEnwyW)5iXWQ`mhNCCg@u{xOIn)?a;15d6{8=@1rUZ*M)hBZP;P#gZ`yQ6;_A9P424_mB|bdy|HQHVZK6QfTTmSn?i z=;?DF^X#qMHB-+FC{a*pb_iD=SA$mT?;!aiIZy^~JGO*kkBY352TPgYk+}9rzWA28 zcm<<^vS8)=7T69L)c^;^QJ!_vHZNA;=d&-*>vO5x>z<=suc1ez0>aD}(|!a_E?ruJ zWQe4&H-NX20$YJou{Cz(k zZu831gJ`%_Zle$|h~$rrdpmGBgoa6jhe~uYhGT30D$pPcr8q+9W}9-k@kA+}_4|yw z3~max&E4R$s;EZ9yZR)Le{=O*5)>w<%jd)bh$g_ z^Jn?`d}}0oc(}2+HI^^+U$V~{%@u>P5D;6i+H`p`3F5W1XBJ+D&q zA2|Gp_3ZAZ^BmWCec^ubsNK9?F$xP_Iy1~S^T37WmUHdX;|gQ?YH?-wv>EpRU#1C} ztoYzTdT~M=9M-y`w;kw$1v%3DVAORZQ2TDp9sar{h{U%^BGBU!GqQbyTN7xysHm-l z__E+CIkkt`O{lLSw*~ioLSHLt9jmUaDZn!$#jjFohkXpO;NeG$6Ngd_{~4WQF9jcJ zv=5WZT4w3zb=LqCG=in%{%HjI7+emyX8L+$j72x&|NQnr_!&gQR;8hOHAPYjsS(n0 z6gvCo7b=Wth76&Luxu&!#Cp~S?oW!~Jbo4lT(YRuLG@!3rsZnfi%>XgelVJSHWRs` z<8(WHLuA_$^7|V9I*v1rZqd5A0a)lKk-!R}<4#fY$5CU*g}$epu)<1dJ+CUApB?P2 zEx;Yo+q=*oL+noj)&S`70T10(tuFN4CR!<@C)1(_?4s4f!vfjaWftp^!eA2CPi|w$ z!N=i%8g7T#FZI1>jR-%hmC47JA_AN5Hou)@<1ni%Hesz zeEy54r@w(aItcOkO@P|KC^syqx)#uR;5WvwtKMpILU#*FsOXg~t_Lcn)RiN#T(o zA-9T9vwr6mW(V$}J1+{pj<7_|_?#F)qCH}8>);*QjFrFbj zjQ&17Z+(FoAZ1gh`T&QT-FL+03_nCBsr~^HW_+B{*>8@JIoCD*?7lvUwTRyUmvI6S zbxUXRhXZU`RFRinjYe^WBk@`&Nm5e``B?A!LuE0uM^EE8x#M?GxkHES;6b+6>ssCB zO2R)*%6pm69QrzTTXXBL9doxEYmvs5jmH%f>(XN*t^iHXD<7gNht(?L`RZN z;as;r$$A5G=XCLWxng;WBr!VqWBS<#YI4TD`kvB5=$s5N-lbj7C=j4_oxWHhDor;f z5JL0ZTRvOxi6?`erkCapvU*-W?$e`xmZ~A^(K7ijr+t(!v6@;exX*#uTe5TfwpP5O zAW_663pe1*7PiblSf@kZl>BE!*wEyNk4_(sc=~d%8kpjwq^%6 zteBbhkE>xhx7l3MsL4v%PgLn{bQZo&la^XuF&w0=m{fhK4ynyKwu7lvFBey3}Q z%Mx+Ncx$<5Oi0NX^HHa0r7`2F`T3P#E;yw5drkMP&K6+5?3Du1slE{ca&$lb7WZ>W zVG(oU&^lNH^-wX!*RHBvGwaatWdUH+yP|C)ca6~-MOfvbs z(Kn33REo0(7E=s-wNnt{40?TdV_&F8AQalplO{NiJrf=$@lx|DOKgJJ(E4X+AlEYE zn9>fWodywH?b?jEjzacJI{iYXhYbn)#V1UaDS>U=i-mcv1x<N)YE)SRP2AxIvWrSq zBXoPW7QPSRY^XcY`!7LNb80(m0Zh5cuMUIyD!e-}nX{`p{-ZO5c46vPA;B|?>c2|n zh4>7y;TghgimU_|&Y0+m<&`1PmX=S5;D|%07%y|2vM#5O=!nKc8hvlUP*p-98FZbb+!8Pk z9j^pUDd<)ZCvoCqZVUh)9G}{{)u@3-$y#>PU`R_2`)0K_G z`6Bg-*PXKDv!{squc4PNyD6e%H?C9%S$(e^fDPsGw#j}&=n96Tv%=oR7_rmAam5w! z^UvOjT4On!L;|oLgzzGW=H;)R3pg@REkzoXu2g;dNN%SQ z&pSlNy8e=}OCE>lm1UA5FFgjlQP*xx%n~LkhOemAk!^2hc1DUeFSLywI72j3yw*y5 zRRv!4AUqvOG>l4e&t~#8+Sei0lMYQRN6}<=PFD*mev<0fhd6o$P(}2;43HOgpdH0N ze&#$FPB}jcu`N~t$7`9zBN7Rjg}j{b3SGwZeO2|a$GO~lCne%)1i;<6N>1PC;(ud5 zj)D07A0!m4!Rm++M;DIFdnbNOv7SHPQz$fff4%05#TJivqyAnsBr2h1%*0cTC(>3_ zOc;PjY#A`Q}^15`_YkjYQOOpfw&uh4t?=4OBe zdNT}nbTatyt$aUsI_W^J!YQP zXL}Ex3u8H4%LCK70oytK>=E?S=DxinkGaoWP;%H<)>8F$j}m>pe>#21wy+;qP_^6z zl!h~xw;ELDqcW)7beUDPYqNLbpcQO*LYW+US|#ijA&6AdmVo@z-SxL#t3QEV4$Veb zf9uoeb)2*DbQ;QNp?6%Juk_Il)PvpFJXwDUPRkiX>ay9RW$p?~n#zso6@9XUbcM}G zUdAvk3t&@uTDdxZChCD3f6Kxxw%pW?_SOr={?7=n`6zmjR|q_m6}*5wbz%7`Tq6wB~jVVmmZo4kJ%!eug9H? zIfjpdU~iR}W7lcM8yI?R*|?eWsMA<@`v#^~VaD=O^fHv*zIv^4o*FIku}02p82?Sl zBy5Ena>7mzZ|;q53Rit^?aLL|!$!!_^0;#j*5%L_4#RY$bU-)mi7-?MUA((2hSXJk zbH2`kW<_FuV{s;uDh-s1pXY5b-O*8P)t)U7BH$wP)Rwhc!)-~NgG^N?;%$NCMi`Dq z+5qDa7wGO~Xv37koO@S5+|^tP>M-i#g*qLn8ome+`wgfz1>JdOQekihFZxY6ikIR2Gd5C zV$dF&J5gv6J6Krwih(a{&!&0G(Oe(D!3T6PDD3L6@80ml+#z7sG@pm;qQ z>D9)u4ZANzBj$)ddW#JWMd7|wA#M#)tgh;DEs*qT@ysDO-r2h$+?7J$f<04pju@2{%$4p6(fXnk~okq4sJBI&%JV z`T74o2czOblrI&e_iv9vvO9$Lz8yxSQC#S3`iL;k(On?wsZ4OEmndU|;{@6o)ruD-I8wE|W3%#RolIZF1HS#)1oP%R6$ z!OQVXi;RB#;O#PO5u1O>(N&7)lSW(rWDbhw>_ow$Sqy{zvCHY; z*W$F}If2>m);~x|)2{i+nq>_DAxw=K``(vdjN{kj2=f)uVR)~d~q8I2a zCO1BDYb;xk>PGJz1TOm}M+f$U)m^Ip0$uEN8FY#CpX7uT9x>Re&UfIdVrkVx7l(b( z>4+t-MU98_W+N;}$c_h=gTuiR$PHU%DEhP5@o!&q(*$b59&n)+9+0o6C1C7nCU~YU zFA9;RlRYqFV8PMFJL% zK+5#F8V3Prj~tynsF#ATZ>uN@u9q%uYV$d@c=rPSP*tjoS5$4rHoj9@c9_1S>`JK@ zHA}D7V|Z(IN~aURs8;ymiK`7?U z=Kt~-nf+gMye-U3sWmf&D z%&31?MaH^Uu2jwPq^e5}{~qFmm-Zy9IH( z3tQs;JCr7Gc&%At8&X&?v<_^E+lLKf?|9?axPtCz8=xwn1U%U(7~@)7i}~6VIJkSh zJ&3BLoG%vOQ!-%L1r}WqhykBRYCXs}5NXeA>g&189|!J167I{LARqDVCQ*7p=#y|x z<+=5=@Y3;({9)qCB9d_*Dl|B^ZA61UYDhUyEPl%AEu3HLd3?4ugIVag(upx)r0EfP zA)QaS8R68l6p%N!p}DI4=zyxQgR3x5%wM1TW8|z=7HuyogQMkq2VqglnR~DXOfsRW z`W>mQ^jot62d{Onj_W)*Wi5-ZP7kV{fPSH|Qw)XI5Z_5)En5Hf>>5M%ihKcM>bR60 zes|Ry+dn*_S5z#PNzpW2u`plm<~Y&Aw4f?wrI>1{nF{Ab%T7NGg|{pr_N1N;V3uud zpDK{!*2O2U*YpTtJPi7HQDHNS!GV9NV1A&B2YtPV-lUkv1}{l^8jNE(7*B%>EqT7u z&b?|J&iEQ2oashl{rKGE2h3|>;uKvx&n&ze9u%i&612g?RF%iQfVg79|L z@x2seRC1<;UhdagZJE}f^}GCNNT_+ zfbx`bPkr;~5?^B}RPH&Js@;O>o!A~SA+H*t^XJWQ2Bb=y-fesN|12i3Js2O-zOfZP3N7cF^X|{8f&MAuG6b>N#Q6I z9|ag4?vsE(3iJK!6%0oJRhz3s=&o29x>p9M1}kPG)wae5{HJE`rM7)FOhdE@7CoaN=TOeWoHG^W zHTaozPoFiUoJjd;|I8C|FVKHyk&24l-#=sT$^y~kLfS;19VK-2&f$d}nB|Iv-L#(E z;)tV1=I#5C&m`zT*swqe1SYGy2#=)22`yi|oRRPd0LD%VE@qlXs=p7sm5oxCsL8 z(*^GopC7Ps)N0;q+s*6JW#FGnMC+u3yz5nK#rBI-(BGuyHunx$R11EMI`clv*){f; z+773RMB$|lTk@bm7@wnPl5Nw>*FMR?Q%@_B0Qcur$2MqK(N%5PdL$Ged+85|6#42r z{c0=i-Cs!k)5%{h)tc2LOn=s9IkOrY9^&wh=IDK%>(-xzLxQa?gJ;WoU7FX84tG-C zu=dd!3l^?^BS)+RAGmZm7(;|zp6wpDLg*e}a6^Cc+7*lrZ~D$l$|U4Ij_?Ofu;~*X zXr*T|Ix-LeUo<|=nB4*MK9TJcg|f(MUYgZ<!lfd zkCdg>(RS#Vb&_EDN7DQjkB{;xs`~37kEgY!m^RGL_&McZJoh`3OTr;0jB;9KY=90i zl8O4Mrkv|xS5{vAA4U2c0n}1<#Go&+V5d`q&&8RwZ~LywaqOf!_eDCFhpBEpvVFRL z`!%ABxa1ZwKVVmd5lv2jE{yKSHCWrzg$2;!o#LN5oMTd;eJ3 zTF_Ws-ID)nw~>uHFue*2h&7Pm$WMW@yAuc=Yq&DOoGii^{B9bL!p$}uxBuJ0U0jc3 z`Dp2JJ`t0p&LOf!x$pySd3h(}J(%-T#AH&)v|#{{n=_aL;P32L?*Ob5@veU!r-+Yw{ii zW@_YM3e*U$jeaN4iNH#%EB>3ecVa=2}3$*hcZm zGFA%}yZqPo!j`SYC>?_QkZtY*gh><*A2i&x&WhKJxI*&b2k5`afd3dR_|k5-9Uy^# zT5y1X{%Lyt%Q*C3jvj~K_Ex6G&i~keE=~Q|MRue=0%zTU$^142G6RlX1Qx}~f(}GQ zzq!%Z`4t-P$+x!zQ6!o{GfBF=%<*{Y8rHga@^s@Q_tWp}zhh;Qz(yoIios-+7&Me% zzx|6NJ^|HJ3)VTmzOr168%hw+nRh5_N^Al8_?&hR# z6WC;PkQ*XqPCS!+^!i!t+`N}1>$$fYJNAhcKSa2_Whn% z6Pu-nD#202)_|@+hM;`yq;hX!C?lc#OJ&vedU2FFa&kykSV4UyGn87J4_9z^j6O9@ zaJBJyxj*N_ArE_Zx8Hy5`}Fv>RtVZ*y_6bFBZ8J#NnwmJF3@RYA|&i!^m+?6mHk&b zCm8f-Y+$5x%<^%Uge!V%$P!Jg#V|N}6dFd)n=9K~UxM9A(6NmQvUMy1c9l~!W^}0A z%*v94=0p`r$pYZ16G@vF>Q)h=Ua8tm(l$w3ZjsC~kakpFe-Q$Kxjn_!zUEc05tly9 zNs1I?hWx@|owq!>_hLfiN;E+(ghfg-qV@5$*H9}=5O;rIb6pUN2Z#Crn;|3qT_iTZ z5WGv0rTfxNj2;U1mxZEepO+Ld%*JX`I)$8-GzDE*&r!uO+Zas@XW|O@oq*|;lD;hI z5PqU~5B3fII}oc~*G5O^x8Q50{j&D$-Ad?~$BXI_Ijg0~X=B@-%X0>Gd?_ofvcwY# z>z_6_a$2?OaiD~7CTUNQ5q!x^I^}7x5>hA=FELv{8-|Dc>k!!MrnnoRy)4I#7`|rx z#|gh(f282|ko4lw#B>Bo)LOFL74#@Lxe8C&M45_5)ApR&3+Tta>p++-exKAN*ruUL0?JpOWl%uVPR$zWJSCVA2u>{R(tvc!4qYhGYv8gT-8qn$( zp}qda_PI88G;dkG^>qe}Ry&wl^7ldvQ{jZ3=9eeqxVNLf$MM4!gkARPrW1L>qc9&# z4N~;STNnvN%TOdCKDfLkBW1HD-b?;@2qe^!T?=!&?MyopyxW>M4V=G4uqb4L2i08Y z!kZ?c@}Q*-Q)fWjzpLF+YW8WkcXAf%FOz=njyQWGl~(_6C{-a4-DOY^A*@p=CdttS zVP@d{2YEQCvs%Y>L1nrRTL?En>he)|6-0}uS_2bM5@|BFI;-gWC+pqEOFsiNxfGO8 ztAadE2nQw$jW*xGEEbaI)!C$INBhezR&Qa-0KVsTYKmNk1T5Lm>AwZ3#%!XEJizB- z=AKz;8`s-CccqlYLKV+vT}2rS!`b5F(8Sm7;WQn_dquj>aE@Ms)+Jss88ePS#N=R% z!&C^`-lm1Rkl%5j_*jERC4BgB9p&qoIRokMxJl{#(Q_SSmgAWuB1NkZK#7Os%RWg# z8|U33dV6iy5(=eqM;rkW7>S)2vp%8-Ymw=*cQ6%+O14C*E8so;@{I*zwEn&Wy~Lgd z;{p z?q!pAA%CS&@{P!C-5Q$}*j&2up<-a(yIJmAaR7Nc$Q6vw7YM0JwqrbM)aW`Ac3^^9YHoltkQ^CX=&rM4+{zDLCQCmn9f|}Gi z&&u0O|C0vZJqj18ZqEsBD zhJ+CQ{y{hYq(z9{Wfl%nVlTiwcdUdk-GbZ97vzoxxlUQFz0zTq-O70z-Qya41D|kF zr`RKs@^3K;RAE2GkoX$4aaytbn(cyA_6Eu+%tWEk?i!a8_f74D6C1Hi;k8JVllj4j z<}q_F=NVo>#G#FwO2?H}12*(oE5SZhJ*Mm^)9#0Q-l{lKn#;FFdH%@0>RLHMok0nP_3 zLQ|;CQ^g5;SRJxegLUip6xEmpPqfu~wD_gAc%c;l#u~w zTKN38n~zqa8)IEZH21E+_)LV{%4fp^2vU#_wt)m2ihU0ucWl3>+`74yj@_Q^yMMnu zW5KBQHiHm!7S`RqV8_@o_1Dofekybg!6(_J?WsKtVhd94fGnf*S+MhSa$*o(8^3sn zkIWshn|cPp1)5hUpu;KC!Wh$R&o%?NFdO_&XoBhhN2MF2Q`=z|KkU-H-J&BEsBk3} z_=I1u|2v@nWik-Re};eUKcc|@C;|T~p#OcGe9I_p32-UuRsP#!H15V1255cU6_ zj{w2Nfk`HVg-iV9F%jD(DvqLMQgBvFbo?p@^ zx&J^c2r @IDXP!KJO(G5)VCIyZT-CRX66BxOC5q;JM1TcYl&tk9!%-U52H(XEei=w+&nZf5EA- zV5PcH&}vrbMkFgGacJ^Q;b5zc*NUek*Z++-F2=Jy)TFM-#WO5MK8~ry1wYoX$-IbA zbTx*gjV{-7tDl!kCNwX0OwKhZmP*bwDyB}}8ItZ$@#UbsGDCo)nc5D(mSv?J$f7$k zPfIkG%eilu#5R=kzxPUG9nZo~$~8uSGp0PcF-GY047h(`h1BB{d+VC?U%4vz1fBF( zpH$d3LvZd0z5iHsLU?o`^!0bfC2A#%$jj_fX-thE2qHP{DJp)Rj)&} z28^C@vRXJ?8JfnhS^P*ME5XClrD>d;APog`nux*s-_~^F9POLJ65k{(IQI+)D0vEk z!iq#)u$HD%VuNd}G=u6im}oN|fQwGeQ7HAFs(IG|z)&Sb^6}j4z5Yu;0d@v%X7()H zx}JrNjc>fi!R=woNlnel`E>q;+!W%mVe&Euf?XD;9{=|%v75`&YyrIwR+K%gXqaYumm@^3;c;B1|h_7))S1_lR&`-oYNF8&R)^&|gW1izFx$ z;=wly91n9oyrvl1p?2`yF~0cM0nEP6-^B8jVX(Y&E!bthmnvXPS+-63wYs3DAvyLR zjTmsqG@KwUl+eEfi~H@IT$4EvpzSyTgkO9bAWiS3OOeUmNLHG2KwgRy5el?Tr>4mN z@CB%`PPlz_?#2wcs=cFHvRLTq7LJH9D0ZeU{4~M=6H1B$?sPvgy1}_)!@&S-;WTFc z;g{R4PoZvs7~YP9QRBh*lZmd;hd1KU#9p+rbZH_;j8XC)ZLi7}KKaI${VQ?=cDFmP z{=9su1U&1R_j1gq>aC8`o%Yi2x2^YIie7N{@j zJq?>zG&n{zC7@Mi3a`jac9jsFWkFAm-=kS1`H>)?w{UFCa`(hI4EyX7MMZUeRV`>!_jWy%7gG`6cZs zRV3`okxkF8D*>0Mwqn%SjadJ~+HD2>jH>#B>Q_HjF9+UbQ+EdTQHvr{)605quO)%I zS90$P`Z-@ocpPA8Phd2~W+IHC9QiOoNC7dsu!kAXO$GonEx|7Q%t=T+f5s z#A&q|;TjHW{~r}nkV>(e7z5lALQtSoM1d!WNkk;76rKVn3F;Tu zhS<1@FjkqWMQtVz+R0s529L@(|864Xg2{MSU6YvRi!OyV^ib)p`POSsp{92$n{-5C zlc-e|YaQ>M4Pmp5SqFEmUSf;ZZ6wLg22C$WtSd}NW&r`eX4gS;3^u(;*)t|NYT8mZ z6#dJdiFY|XQf*BSKPU^#OEZV|Tim)w?5qZ{Pkuei^YJsmFv~kF+6pn6u|4cMT0QXe zEF7Q+4@+0lK$k7H91`H6_F3JCDv)YyZ`zr54?o9}duzcc5AAR5XPTDH_r4>ofu?xw zT~3TeEm<%8=XKQ%qmL%>j_Y;1E3-IZc z_QIJZTh%J|YHC|=op#>cYkG*EluvG-Erx`RnO7d%9II969a|tV2OCW#U-v?gp4Iyn zDDpN4KKtu&l-we@RPY}A#W|EfqE%M(t3~DrIy|>5{o~!?+hy$F&)6>Lz%T9#qok@`>>Iu z`HCBUGZfz37{*p7_c%T-UlXlo!ap;q z6)j7tFUktXEKyWH08}P`IKeL3P-v#bG;(OLjBhGhv8Vo<#XZudpM05@&^75Hm>iW) z0r}^J*<8SDf=G8caMB~}QTX6rMYPklyhqyfz@$geJySf16G8DOniGNXH1PO<4g!mL z&V7gK%>E0K6GB4^-Mk~d;k07$0rzm$NOH^t=pF5 zYmU+Mg7nA}oRb_i{)*)>Z>6)2d0GRJi_Wy>aaQ4{?=kO4)(JIYBHv6FCe;s;6aQou zY*J{rzR5Jn(aubk%w!wD1E^mj%_;akmdQMvYhuzPz6-pUZXb{up+3NN-W)>@mGJqf zUL5pvrqAheg7x|5#6L_YS8X0s0Zu@9YScSq2yA+WCE?8PBvmSJ0B#P_3@({jbyz7q zX}rkt#UCJk4mz&6PDPYhcm=}ZvB}278o&c>1|zALhF!b`$-+}RP;BJs__SUs_qn|C z{r#p~`4jM^P5P34<8{3GM`gj!7E?l2$`Ni*WK&zg0q((+UNpdg76Hn+c{DYiIKo@# zu#&+Fs193le%2MAY`*h#e}((jyHk~anF_OsS|L-qbXfyZDy1>fv~(Ha!54Nq{ML1a zR<^sfNl z3u2YeAba#Dq1qIfC6Fx~#3th8Js=?rV-(inUicd5yIrZXBdlgZUQSmU9b|@v8yb74 zz$>fJG`HZF`VbB(uNusF>P?Vx1{EGXu}j8O3$pi4(mt+MN&9rYKnc#i;Z3KQ2pD7L z2CBA779fo!YREn z!e_*paRyQ!PqpM@B{oVCstiLa2?ekr!e=-w4hx5ams_QSlg&U?^gjITm#9 z91-&|d@Udu`CbPyTI3n|L9{;anoN3>r+w$wBE$1(%tN3n1BE?*q&xloZhooF(F0Gs z0F*;I((@(lga5s$Pl3AC_tRK)bk^ZkvPG$ttaS9%8tC_;wPb8Z9CMSxfF7sMr%{T+wdG?;oo{QLHeJ1JF3zRM z2>A{Usl2f?0G3H`7B# z)R28-)`dXdgms^bWW@s&!h&9D0bd!BrPelwt-#)UF>UN7?ac- zv@3GV-wsn&NO`}Lp73eVUg*7e3ZO=&-?q8+KJhyFFxc_-NAWa&_h+R-&o3R|$*3kj zEen>yP4pQ!X$6HOgx24YlVdSNXo|> zk30!QfE=3e??PV-TlY6vxV_LaUSJn-DAcn0T9E;Is!SfL)6S93Tm9UgBDM^|&S_T( zuS~T5hLSvmoQ)HS9vNG-NICM;`U7AJ!Eqqb68X>_5bGBiU9*CEStl8nlzz8}v(SqX z7DSFw(l*dq-0zTd6#bB7J+Mzf8r~)yT*vszK{ae>y5yhEQrYy$XmBp;F%C(BRTzgQ zrupTt#2mH;{FHzy67vY1oU;r~-N4S*LUHFwL0w3ZABHY@&B**Fcgs5)u#5e&UdAF8 zU?&v|Pg!uE`Y2$VSUZ~(SETO7&ULFQ&FxjP-pD`;JL88k3(AxeW8|2WIBk9Ig?lwc zK9nD|vxRaw;%p^QVOjrl^m-I%FUqC<%(?S(TY+D3T9)6`{yC$Cd}Kv?1%d=E9>6^>dp497 z&C*!2!hP-lDx@mZ{hX3@eG{@V88VgoPuUF3JSJCdYNiZXicxgjzxgHvcMWVZ1*YPy z;Tq?2#*b8I5}kx5LhN^CgKidT20{qnaMU-b-~FebJz{V1PSdAOAU5KjZYaVhw($mF-=M zFWDYQLL=`(ek3f(X`K)0!PDYkUm`di?Es(Z0huuR#VPGNLHI84(%wl1m|OC?XFXv( zrfGSVxH20KpnHgD*+bVXFvomwQxH(R*A^9N6DH;n7I(=?=IpOumWkO?&s_86g4}xX0kCsbB6S`FPE0?WELCHEi6;?hiKS_VV$&tyTrXMzRvX)b#HhJ7U zaNY4`$6_5R;@m%o9HZK^rs49BC&4X56RV|4pr!*Kb8xVdcS=kSjUGdx4Cl@jj&zac zFR$?!Ok!g}8AzWP!Nt0Y=8aVJNj$Dnd4Nq~Gq1KCDwKYRzxjwrgm;hUEN}p@Ap0-x z{S3z|2AP^-dwnsKQN~1wYzg{P0)nitgr^0~wcNeBmJyUqqWl~aw7hgQ3~?`>@+jaM z*$h}{H{qMPz=)dkaU_fDS^Sr9U}H}GA$=|w-CP1eH-j1UcX`Ss`Nv3tz28#^RVp~T z5UGe3(u!|1I*vM|8RWw);j_S1iG%d_*P%}g*bsI3u;g7|jGPXYL^BR!4yW*TW}%QKPQ_{vHp#g8tkXG@IUTjm9w;xJC{vBjg)^NEZz*LTX}-6y4w|Kzvg@bo`6tAiU#3$5YB(+9 z?2;x*#I-{BwZGk>a-buBkX}|7j-ayo@TJ2(E&3iLI&&DhGNnAjST_8YGt8=J4BJ&% zd$LjCsP>CJkxzTkJ;?JLd&#}1^e)Pd4i{_QQYJx7JWj15wNbdTUhyGP6J@~QM%{|K zm#oiQ_Ws&Zg&l0KE3do;X-{)hAK|SjE>-%>T>CrGGc3nAQ1g=-4wzGkV_{_4&ZLMl<}l;T zI7G22{cp2pg|g`7Ahi0Vq|^&)h6U-&`(Hu$f_a;Prxgb&kwPtT!Z2y1R@wEmS+SaV z9hZTq6Qx@WUaGmxs+F$<#hQL|RDRssv#{s`i4Ql#n^596xczy8{$dcqBg!{Y@5Rx( zhT9*kKYqRitin;LRO-bwXoO<9$!5iSDHDd>IuMR7T`_OMZJ+O+#SB(PJYOH=*-5O`$u&08|{2IY&)8e$~x#g^{{8su7;Q`G|#KguTi8$de zP{QlR;JJd>GapWApFk9iUq5+9M1upo&LMZcIzl#asNFAcWVyoo{cGs2h2EGuzxWNW z#(OEr1w7vBC~hg0N6}fp0T01<>GAy*eL=ZspJ|WAXNxp|fsq2Y$6%bS{?r0t@@shL zB3+gvOOUS_x^*+;K+sR%)4P zOE$pY3aO;8H-D{Cdk}#xT?u>+PI0%i2KS17qn_}GZ+_U*vNm_R>!|qUK732#%5h**t2+2?Rfx46~MNm@OvqGiipP41YtuV=F+%e{>k7!^ z^H+Uwb|1q0s4!HHIIAqh^VCF)&O^&Xn6%&IV)`Ts=8J)c$ziT)HniO)`}*~Kh{p+t z$NRPqcZ{U}p355rxi{`5cL0C86Ozy@&9fEPbqIIk&Jq%fDprNiO%c+|K*Tp?p%)w@ zhRODu_SB80%Y1#aa(*-s(of$y-4$F}<4>!IzB7aHJ6dX}&o5#*O+ubjXMLWcAXB~6 z$$Ypv#=^;`0`M<~vABt4&=qUuy`;?yT}qKAEnSUIHrRunvQhGhv|(V|51)SP z6>bDjQG)eN(Yems+f3DP>5X;~^l1iRFEauA2W<&eJ3`W4$EjvR-8C0XDtU&}-Qz#p zej3`t;~I3X;NQFZivShA=;-T1!{2z0cpF<6b7E`N9{mz)m0bp{mNLAi?$NCQulqtS zHvQ+{rs5v@$V~gBqYwy{5?!|xxLvLkO4GA9ViU74Ox@NWde1c{lZ}&1=Toojh^&PU z9hT++6sB4YFq)dS`s+)_&y%yM3oh2i$vfmVQg3Zb}l|KvJ`N;=Mvi$p`5$?B+PxkC7#1@^9Ka7R5yHHBsOZ zNv+YwVL&$MhZfECwKoH?7S#pTCE0IxdP7UIW@Vr;Y#oMGwgp63y;g$`isAu~@Zqh9#1-Wr3u&6Uq^UcHI% zL*w0ua-F6)y^gq0z#^FSB-EuX(D&yXuO2Wv;zpLTO3#1(Fv~(}awnp)mz~=%vOVV6 z`MS=&>F?QhXOw-4dye!>l^`iSsQV{rM}h9gkI}CBH9IE`#!j>~blISEmaH3Bj)}!h|&LqBXWax zkkNA&wK~d`5eX`mAy|g@H-09^`=@JY7{J6%+EHL*q?y{KFg3+dMcL_(Pi&+zO~wYi zFdf<_RKT!)>D_zA!k#3}hgz^&WLcs$pZFQgkg_E;66f)rzm*Ra-P&u0}9z&^!v`j_Pj$060mi zY}Z0w;V_FpNvly?x^7o4mp#ixG+6&6BghtP3Bk)(CHlmadNw-N5KVb%VY~LARsF zArG%P7pcjBlPk=W-S`x9fgXoz(1M!pS4l+ZZJsHJAqlkwmP9jVcyJcwDOX- z*Nk}dkn`ptaJwy&GLtwZI|EBqsslPs7M_G;JtdpUMv*G3bhTe}W#9$c6Lh5zBh4z< z#Cu;Xqz$dEy_d-MgRV@1rcRp*G3CoXMRj7i-EzQjx7p$#-#EDEm^OPzxxYw8e(0WK zg98s5Za+)1d9n|2i_jldASWRwrp4^%d=5aYtdA%kTZyYSh(4^k8LQm;WqDCZKm2 zSm1AAwHT0YkJ#$mOKIJkY&fk`!#yE$f%kKlzQX?Otq#$gCnV#JYnM!FCISViikl3h zFrmi-V%lq9qQw=u%snSmD9{;h*fP?E2{W<%_6Yu+Dq~f0*N$z8Emdc^W@jgZ?LpcR zMeR~4Jbw9`*vPzSNliKhkA8fM&hGe>_mjEX5w>T$H<0@8HBJ@7S_&vPM*({3vrp$P zfKzYUHvwav**QIb0-$TAl#YZexTu4CF5UQW3?%W5+YvFVD}tSZS08ycjYtVL?R1_b z`5`_V@eFNJA#{lY*@oEqtL%0Zv_Wsc$AGmY+};o?WkpM0S7sYZXaiPn5%biz{Kv#5 z6V1_3D+HbUbU)18;{8%l99ibQ^;qVRGN-~n?lSZMy=Oh3%f_Xv={k`O20#AQlGB%3 z*}C~6xk837Nc;)PJ7X{Gmac@#w(r3=yTTeFqjkykt`t zqM+R|w#@D+zrBQ1B%6Y~qSR7D6jWEH%s#z7a5yfNdczXVBfUO%oOG_41gl<@qE3iN zN*Vx zCn(>Ixo^MeFCKpsn{J6~L_S;8Y9G&+?LxOzyUmsmAU0B6+HcTAbEPAf_bJ1J%&?w@ zrg{*RBSfrqd&4L<*B1l;+k8+)M9n#MiO!uPq5z!)xeX(14Syb6NXfdzD2I^kc0+HP zEOC^^w!i}1Nc)-Hd%s8s$=5`(;1JHGsxqu>*?l*^fp6hE7a_qXu}CQ32*~Z`B-`;9 z-xh`AuQXSZ^e7QsrWji;4T6}($Dx+$`z)LcTkKrONzXm_#EaPmOs)83+CRm56R!z8!E@J>nx* zL7t%60HfKKz9xT8qnYAn5;E#D zCj`s&qhA3vuobr=8!=pIGjcCGW*aMThxwLmj)_BMnF;gXQfy$FW$QfYrxc`kdS~mw zCbDuXhihYIp$D}R7ON|-vxbOR`!6P(e*_iiW*vM35plx2Wq;haC#*p|s~qe#m_nSl zKeWE}^fy%Ve~bF_fN8@m2%8{<{N9i62_54=YkB?tF$n{t-L>4|^2G{Gk3(^aJO zODS{vOxu}~Vduv-J7m0k|8^^%Xo$`=7ZQIrr|W!AJe;+a!pyu5>(0Uo z8mGVK47d7QW`-s&t|&`Wu_jalKGx;eqpWMeHC|HE!GrawbUU|ZA*k8ia7l zf50rd#l`t0VOrBORtd}u(q(f&ZD^R*`xCVnodEld7h&qDuVJ^++Zxvhmp=>4Q+j-Mh zx@0=UVHFlNj@<@qoJ#zHQl=%*F2S@A*}6@BlJA$;Fw{9@&+RojY&poKGGD^*=m~Uc zff}Np%n&p&jq2W$SE?}Pm%f=IvJ%KQv@A}Zj<}-toTUzy=c;UFI9550v9eHLQ4B;6 zrm>x|1cY(tkVW;D?Jj;s^z<|(B3?5V8KpGeA$aMUX(TcLQum*#Tk;`aP< zoh=g)We&D*xTY)~;d~g)ganw1@ykjaQ(XNcAqIBTeF*)1$sP}~Q(RKXTET~fI`)uO zsDWOK4?)g~cxDFIaxMwXhCXztFJ``5X7*M>YYhQ4c>#tN=QK@BlgKB0sMn3_qiy@tNW0G$v@iOr zLF#umU=WY;Hokb@;z;24P?2Ql4 z`R+b)LgtIEk?gO=l>vNL$ddPBOe3LG+qPESXOBm1z*!8757S$QbVMR^b9QHs z0AMARC@me-)4aCm45IXyF<%zUqMZwM`YU1$LHK%5RsV`Nf(xZ zdu(Ki*ZuJ9QZXK7V#3z*;J#j-)yKF}+1=Rs`<|CQE}O{2L6#Iwloh0UfN{ z!3syJzS4ey`kbUoPG?8@l7f-+5&5`S@hD7m#mwUeE0?ry{x)#7--7I>L!-oeqf|rv za(5L3Tt166dEnuc?B9N%_k7kb81F@_U(X=Q%tC36LVxi%^0FfDEoI8KygYHdlb^)oU~gH|QctWA|v~=ke{$ z?bbBeAv%&$??xuq?>Cgpla#zjKZtg6N6>C=90;F&MVLWw$IO0Q0H_&$AQIm-Zgva< z%*2TAccTwXFo`z8Ui6vXL;wm8fC!U(hA+ajPk8{H&bT6gf;s)*_Z2VC7(+qwm#QRz z0#0_n1@{ltA9pa3FPOJFNEn`xd*gqC%*i0MpO#@3V>Ls2!{*!jO+`4MqLav*huhfv zFx-zgx?QTMKa)ZL>}aQA#~v+f`{Aa|94XM@pwC+5hJIcHj{Ziy4m}p&CK;Z>fVXF} zuHRir1wWl#S$0!eJq&yk!i7i1QIZSgg56h0^IrPHIkCn8!!(Y_@Y}p1e^R7$&Vrsv z?;u@H^(fn?pl=*V&J*0FJKHCI)-hSt zGpUUZ?~}m>^Cj+>E+lUJK>jxx{2$D>Y7I@)@*mzC^sm$X-!R|*9~1uHq%Z2p(Gj=z zlM)*!60eycNR;3u(BKfAAW5)4u}0#YJ-G<7B$m)83xH;7Qff|KdW?=?ZenbbwraMj zmMM~hbxvMZe#Pw>ep!B+QFq;c|4B3dH<|qZl^*@?FYeNuvfms=C;Z)(t7S<~onXr2h;=k!%~OAX z^}AxUTxr8GYgwBkBGXwpDL+LgoF#P=t}Wcv7+4IQ4P1#R6oY!UK+s+c7L6)S1fi?x zg&^X&-`H!sXI6Q~D{F7W3Y~*%uwGnb`ZDvy_r~k__0jpt{^xx}J2%_pQh@G3K5z&A z75*C`a7Y7JJXn*)34K}ZP{-6(bsF}sZk$te(=RT@de`t{@Z%KCn*Mdw5{+6N6GEUZ zoCbq7zyr0JYMN@X2fjemkKq8?2asHb83(;PPxJ)SI_o9Sv`y~@w%M;!+rTw=PcOJ_ z0^?=6uIyxc^Y~peC%Z?JsXJl2YG-e|n#Z;tYd7I9?5~)#t>-F#>lJf`^`=7?|R>9mH{Do ze)n#}wXM8z@#1eJ0W{0eAwn!h5JQ}AFGuU$*5zRO3Fvr;GSU0wiGy38XpvmsXrdT~eSTk~Hg$MUum6b{{%Q7pBx?`h# zu%j&$=`(QTSY+lomb&dMse69|vZ%4EBN7^#(pU{>RaUFVuUQxO9hpj%4a6Xsz+GPq zn|fWxDqJHk`Nsr}lC*M3*KA2X53a>|4P|h1YX)-Xjx+{^Ru^WXy=S`LzlVNV{{cvW z&OirNcBzajsQ`gSH0EGmi)yu;XqT@lmR~q&041v-b5Y`HxE2xLIWpm3|HAI=cTB>x zWIBQlo*^Lv2bL0gB@?>O#6l4SAp!<_^;1w>g%&&};B`A|1Deq~ZiAYM+NxyojSQ{; zvQ*wxBiY>71?h0}9TL8mb$<=-?=*@`jO%*gb4A~JtMNAWtmc#fy$|el%WS1*ODbCXQ$^hM)G?rt9TrW%B^Vq%pWEY94^uXcj5Vt-WKiGLAu8R&YK_Q&J{W#2wEn zDF0k+t&viNsPPk8kLssF1x6Dol@>znSBdvuC$jJz)le4-_WSJ%!!t2iO*D^0M*J6e z8%fF*CJl*f2sa`Hi9(Ds+YAZsz#)PM7p|aS6&l$&<7(Q#eX=Xa)@d>$)t;(ozd7_b zV->g=J&Gw*!$^9Qs1uP(fF`9Sf~Xwxg<-}F>jkn|b_v(4N0KJ@l>eylq*lorNdtlT zGAi3YN|NP*I)jnNe&fn?6ClPF1Li9W;xk!Jp5 z{sLGeS`@YYC5AD0AqWvSRm%EiE|2wXuv71vA(7^gE^_LzG2u1h!UuLkzA@jqd3|PV zfhB$JQHOn6`tyvsF86IohM}MvIB2|Mu+UlK5SG#E#=X0pX+Kg%0k=Df?Yg%r>n(O? z;fET?^ecr<<%!gs`)bKtO_RZRf1Y}@C}(`fL=^kx1vSWtl?Aj?_5q7Q*{aQdLHhTmhVst!*Jr|nABiRz2hDCi{khywA*&{fp;#Bs)vZ&68$ z9#tp<2Up&`SF)PriRQ@w>=KL}#4)P@R5ACxVXwFzjy&>Fz5(M=>C{tG=H|IKoOBua zsFUuU26&jwdlEQ$Y$BUaGvPas&cf#ihkpkf8FgGKwGuFk z)-b6qHU0_qWl)vx?kem(4C92lo9^VaWlwhI11tCP8l$m74gl<*=_0ccGxY@#Bfw{P z0bXY|e%w7!uj;gmbrr6R4n8eCJaw~u{WYj!8z={c*A*yAgj4{iY^h2_0rM_p$J6~`SbqIdzTE;c`Sd}ay zQLI8U6Qf58h{#*)6v$khN~1c@NK#{+eH?XdV$KK2WEfa5Vm1uxYOP;j=n6u++>y!l zO|Fz@)UYDOs*7JpLSH2I!F!Ip1ET2EczpByB056UhPfXYh)$05K?qbR4&jLdZS{kD zcWnwjq+eOvrz9$*d*l&!xC)5RpBg4QqFnQ910$@zeAB%de~@#>?)xIZ!v!Na_dRSj zO>QJ^%`kmrD@-U5PxzsnxD-TrjHvkhPW|&@)Y}m(NHiMlURyfE%u*wXdFP|Sz@07c zk?7Px2ltHa)wkhYJ-OljbLidrl{)WYl*jN2lVt2KYYd%ZZlrv&A-@l^KV}$GGTD+I zB#rbsp4_&QSv7Jt=h^eHUdguM#39x=y*`IUnYbXDdVg*gK-ZNwH=9hQ+fR+1hbx?Q zshDDx2Y*^|_lq8$s07Etm7ax?=HeVV+AyhMNJStVY*|MoS1qb2imwtvNKhxYxMMm) zIEnFAO!Qt{HLRExw{-Sz8VpJ?|H4S^_vm z{y!3066!?Th0?w?8YnlQjWHG-mkrF}bsb}ETN2kPCKi_!L4Vma2A2a&=HFine33q9 zOIRCBSBx3`W@C6_ShRA%0pvm7zWg#3z14JGm^JnN_^C$^kL>9Q?TNT;S4V^dAaU7Q zDO%+U0)Lr`+e16y%MSA5wcZ+f1#RjWv1i)MqIrL^BgC0muQmWTegogJzlj!=fmQ^A z1Vm${0!2ml1Gb?`;)sBaS!~o=GeTg-Zw5dh9!lV?2-}z|#m*RGr9FCats<@{##u$z z%u+DaGll}!dDqq@t-c;dI_N94FA%>)4b3o)+|^(WM)yrWATanf_VLEN)XI3Z zZiKw}3^DWK;S^7Ixfi1l7wzI~pfY%GIChX8t9VC*QU~|Q1XJ37zA4ReR*X(;!p?=0 zx{c198lcI$eHb{WU0oeugAE5zFGnqQrwqO4QHx>}H37OITFRd1eZ)`&bbe4Ls7!Xd0B zSY-7gf6@g7ZlTi2tCq3pjM7rKBiYIKRK8J~W=yuwS2h=`q3s>q=+blLOD1820S(2% zI3w5ecWz(wQ;#oRI5G#?jK2YpAE=x?o`D}N<#86y9|vWq%Z{4r4PPxr`XtNOau&XM z<5Ta4pf@kKjDMOZq2wD8Ula&cKC+X2q%axc?bQ`Ia; z2`AVmwXnSMAZ!!*xJCQCJZ^l$LX#ClKE7{pwet{XeQi-w6^q3=Jp+O^#|D~63tomN zb7fjKKN8xn|Z>n940z&?_GO>$uR z_mqDk{bwLqwsWf|_AeY8D+U0l|F5Xb#mdf{@jpYdOJA#B_$wK!=k33K2?r2M1r$>^ zQ;Q5m1nEbF)1su zC9y6uwIu;QK#XfKZlFapcP#x&UxU==d-;y5)#9aUE zO1l*VA~A2zyodmyu!V*+-qr|08T!b=afr;W0fILd$On?t2*Po!elhcaOB7(dDsG?P z_={-@G=8!F(Wd#=Q~en^q&w$RF4 zX4vU*`Lvo%^|c~$;ca~UEPCZw0gE=w4>xbZ)^^DoMM`>wQ?6Ty#`zxkpCSZ3R-ug- z+tgqZ$W6x#$qBCm3!9EHd>z2?fv_DGCTt&LN4I?}Zh-)v6ou#b!d&ly#K?39%T=DZKOYG2x($Q+CW|nLxe=EDHljvgPO$*pHRT_g)gm}-=2tekZ z!%BI_4v3#FOz8E!dN=G;@_A}E0Kv(eUyE`{&ugU>zbfN@eBxN{oT+)1XtO2wy&1j^ zmH#GUNsOIV(0+cTN)Or9J2w>*&nlsuZ9+`eljM+s@x+^6*sf-qI;)T3`dJo_UI6n+ z{4!^$iJu5qyKXWk?@~VRuvFUvE<`v}HIr82t9zlF=F>>Ohp6dB z9cEOApzO2FforYc4Rm}Gs(@lS6Uq>-i@8RS))VSl+j!fly1O^O(r2YtgELv?-uSzB>Tke51rTlePJ9hSHf$-9N`_x4k(oPS1LT2y*YswY zHgVw@v2`%r+IxW#$TqV=`YYF>a_RR3+kY7%&IX$@~wT{IVSw_XH?~@Fr`8w!+jgE zthoicfG73?Z5bhn;V>L(O3Yv#r`b%{TD&gjxXjA^~Jl#+_}O ze8G@WWd2eH=9RJU{`!53MJ+J=GJ@@&I3F;>0sKkh8+Mz9?Vm9pFgb$bA3Dz#Gs7aN zXeE514m2!!&<57BeesrnjB#Nb=0A7>h5BEpXb_-#$6lCJ-n4=DF-$7B2`ku!g%8d# zSlA~iVPU5+Osa3F2XryDD!91nWj z;s>}G-55=rUg>z@doG+_iBxGYJ@RiR5gJKpq`l5Gh|E!Nw7f8cXIWW=2{$Ypw(}!Oq-2$UZPKh>*z2z zJlY?xl$d4IpoL^g1>vaa(P7+PL{O!xSQT^y*ZD2Vd|#zLc(|^i<10d^$zduxRkF0n zwy+lSMjN1~%mErYmQ=%-Mw?l}D=4ufQ!-v!Q6u_0U@5EsE6M_8oxUF8u-W<_Wn;TR zgU%e3T?{-^y9p+>9xXb^1?RD{gz-F6ox=shtX+q;B3kprfS2v})KrXlBU-d)-~yyt zs~){2rn)vHu3Eko?uo=?U}CC5>#6P9SHDFz{6U3x`iVQH@OmXfsTGCz(b!cio?ji{sOGo z;}x^6wm2)=6PF@txCuuvY=8^UIL5Gu17}3 zeo<@_!Ri-%7$6E)WP^WZDRpdxN;B1AH+w zY*L+zlNM4ZKP{qzI=gVOQ1flcx#veNXk{wBo#R}^U(l0dD>1{`P4F%(tRuS-*f{8; z*;ywYT5Jt#aoANi-h9c>O5*^%R}?Lm2PA~Zg5XaP22|_6Os9Z`t$@!hi_aKdu#R@# z#+S44r1tvX{XM3Tpo-yKgugO;2;nsZd(-PHMCEPrN6K;I`X#E>%2SCABY1AJu+q|8 zEr~73EW73NDYn)Z14WlD%)_4oBr=eK%_|XOL-7KREi0LS3pcphMdMy4wX3wS_W`Wh zKx2BXylcHF)3x=TV2&|bx@=a4rV{nW-ArrhCZKLlK3?w)#^cOXjd{6(zL@3XSgJ)q zWjI0;@Ulh~6pl)PBLgCV`aYD^3dKt-FG65M3jo(Y3;`KqTLE%a$=V-@`I10A8FpMN z<8X)#f?#=g{dskLEjRW|LOP4YK;aBsy%Yri`{=EVCF4nK$GdPEZs?Erp^bh9 zS7q07V?j0R5NqLlQ??GzQ{Ncw962|@fO6r&8Sak+{S+J^_r`|cgEzQCX%y-t$7eMB ztpFX&eYD=^9R32rJbBdc)9L5k+HHm{=2s>ujl9(rd}JLN7h22aAF+`V=>CL-WL9%7 zCH)#Bd_{fZ;B#P1M_Y-_Y^#2Ff*r@D+DLP?V)4?F%u+!7qe;8v@Ud=Y^!(tgs23>!U0;cY9|WQGmgl$bk?@t z`1WioXJChY5nlP9`TPl;X7M~Jv$UI_WzGuU6i8OXuxnV$1hQ{NhjKz=q17ybHdy1=Aj_t{O&1ui*m~hNnjCBB(6^J^U zg6>c^4H4!^x!|w$q7!K?^Y)r8)*ao9P(-KhYb`*oo;Btc z9yHPx!M`P2l(|__9O(7~ahNmgWCCAu;7TNz-0h5!bsMll0f=R=;1o1uflKreeyPG| zfv9PWhV3_hqwinS4BLHf|86d&Sp<@Dx72_8E>yPpwwa4+be4gWXA53DjoMwxo3ozE69A2}+YKw~On1;@3~$;e`vE?ZnB=aJ zy>E)_Z2btf76N0N>FoBP1>uBI$qOHy5wHw?puJ1OhO(YVy}arO|Fpe$dc7zQioXIp zmg#0e3ACrqIopZgvPkHgNo@S%a0`v^p<9d{Lc=9CBj#Oyo59r(jbG+iD{o!M(%3RD zia?RVi@PypfLggsnG_cWPie$Hv?q~%vdd*ZhhXagXMhJ;z~|&&^9ht75XLJ1)PuGcUKiGC5IbHe zIAK47-3}WKb38x7oT#pB1@o`XIyw4&nVM`v-LB^;X&l-(cw^m(-*X9AS>v6Ol z9Z8({x>KZ5gP~T=)bLBYl+-3<&JC)5S=Bl#T^{0<3>qTw3yZ~XQ$Z0(3}P6+d1Y}V zsa3@3zd5&M-|`607*Ge0<4UcACKQ%n4aOws>5gw7y%=1=1;r`*O-6j{s4@**lg}M( z=ye(mYZ#*K6@q(Q=$Jm69#`Z>+t#)Zop2vF$~(Ob$Q!x9Q$a+3k}l^Qvwud8lGcl3 z`4uiTnrHO$pE+FI?lV<^fi)5T_bYUhim_b+KZhQk`%k=IpsKAuCA#j>V%bO@8AtS& z_zqu2e|v%;D|l=JTWpVRZ{E$-2gY`OE!GZSy@ z9FC55h% zBcm2c_nAmIdLGYTxqCuVqAC3&Dbe)THS%vM>YPNs;d{KZSTi#H@rZdS=C|K9QkpJW zJb&<0cTjJ{QS%@A8{Mh~#mb%dOn&}2%oLi8SVNFn|4K|t=#OV5)HvsI#zCYfGo6GH|9X)A!=_%fI4h} zhGoU);}0RyZ14Cb^pGS}`6aCB|}IyGtP?eYh?L|I#IDi96Cy88t4kz1#;WbZQ=-PmVoTXv zNUPA;T&aTKRyuyA^W{x84&0YkW(&nQq>Y)ASXHuEWFR*Qnhw25Ze;?DTn)b0nN>qH zz?P4kgxbxJ&i+K)QeRMlb3R>S&bIA#S>%Ewz$(#dLyrg0FJ+W2!>M>t(^m)4KYXdD zBTMHD@)tSmX@^SClpW(yhpU02Vtg*1G^m&BC#uHD9#}KCfFA6eN=6L2jXe-YnQV+AgmnM3zrrB zo0jB5f*`${?q+w9Fk5$#( z5tP$Zqrj7LVI~Z2LRUEacv0>+2*NVZEj1(h@qfMmKKzWYmae7__?6{@;ury^0lTNI04Y+I)AM(|ZtPS_h!(Q&%g@%oun?sF1@0K=UqHE&08psLNB; z_gI^B!QeEs zcoXD4Er;PYQz37?rIgJm=kgW$GhAq1$9*)7Z8NgzvfY81m~ex2Cv1+Wpd5r<0+J-~afdaO6b%0{eV>Qm zbpS!<# z<18_N6h`z)KDp*q=T)RUsqZU$y@fK?voEwlr9)o*uc&;%(|xI4gKX2aN)O&Fxz5V+ z&{Jy(bv0nqFypxGUPdj`XC+Zrl?}hK2p}o{&apmHKEjb8D!sQ6!J#i3s-C2vw3AmjId?Efp|< zz>rzBZdmGe$*;3)+KHlQ*Mm_`E@OX$#K!!?tXl{3hVBtjyEwA&QcR+QG3p~KyeK$! zoO0qKstSz3o3iu5yyeQ+Pq=&HCYR!oR+rxvukV&X^ykniUA5@RvF|Xm;hiC9SKrvM zw=*RJ2|xEj_)Tt}-UvX1D^(zSY%SH!_BWaXzMq20gD8qfyK z)ks3Hr@`GpySeBlRK!SeVucnnb>6~c4SbeE_#!Wkbg{@1KDc}E9Yh#van&rI;{-}x zmb^(n_iYEHA`Dg+*Ru?u%>=c&kr`Gy4WJG8f`%KX5qT%qrJ2AXo+NZnLl3n!f;Dev z`{`zA)4W}=?SwlVE(QpElT8l-5twk0aHkoR+4DKdvTWpQf1x6lA1G_O#zEvns@ks* z9+^Z)-p)GK+7CnAGP{-&lmd!>=JvDUKK)Tkrx5nYo<8HuQK-G4M&z}M4&*Mcm}R-Hnd-LG!kZDg+0NJcedz`)qZ0V5rl?U3`UGE1tEP8dw|uWV^?r1iXh7_7 zQpCWYMBQK$n+b2367J`{K!w!@Hc$CZA2{};9T+z@7?LWpc#MCu&nO?0Dy$KaTDFh*jV*m!8%9RIo(`;+t zWH-qjH~R)DfDh@qvb%(HeWPWvWliZ|LH?6)OXrq-jw|+B{q9B>CCy43ojeKxw++rh zg^_ftMN!%yx@aB|KB#AaVmxjyH8n(U9q}3J%yu>XiL93NfXBohI_^ZnbL$Y%CMe6= zj@Re1UI_L#TznSdL9^qF`snVqZE`jDvyo)b2rWCh&=HQf-6L_^CTF}^zBRzU#t}lv z=B9lYwP@CS9g^^YP6JT0ca-eWUqTCHVm;P>-EmSf%wE)pTn{IEKDhe?lNp@tp~hfb z!Kl?MQYt$#-?vfX_OQggkTr564dK^V?Nq!YnRmsO$463u;$>k`=qUA{-Uj2Cn~Kl!Ga9I+hD z&p23=%-wvmoBEG4rg3LxG}1-D%%{?2J!Pf9dYJVA4|TE!;c$jq(?$)9aBKCJJ%ZKa zhp8lhZdvu#MP^Ithc^m$!rtJf$p$oHJ=35B6|LlRXgggSCv?F}YMiJ?^uV%Hi-S zW9I@lqnFsZy~jCYL7|V2$(!bkJsurHp{%I6r!n)zska0}#ASK!J$HdhhKyyoNMhD*lq&A%;3mpS}VONBufM;q$>nhf<1;z zpz5vn-Kb8A$;A5jcPd&d#}(sU>RqH!$ZPz`PK&9kBY*GmicCl45$ToVX9XJ5sp!!? z>Z^~RS*sHyCP;?qNBc2r!wlH>Iih9~0^5u|j^XUy#f#{uE|q=@_j^NFc20>AhrRgC zVVI=WWR&qFh#N>Nx&d&@aFqlT@3{zF(TvQ%o|8vhTfp;bb4f zE0|=f$GG6V94+8Ed;LKz^`vrN3ok;yQfI8O&Je$QBciC&R74nIt)DoK^3F2rxk)39 zdViM0(J9&aG(m62_?}s*^ZkYAIz-2kZ;LGHCftowKSQ2EkBau`xGNZIoo7s+OFLfk z=Ar0^uhilFo9^oeR}S=tlp0S3zMA!?Uud7Gp#HCmWS_y9^Z)>cRG};HRxZELm$N74 zFCwJ9dtc<8juUH0`kPKqJ;Mz093b?cWc4}hdj?w~7k-_=_d=TBLEc}1ZNc|MtnRK@qmX!^&yJAz+6-JnkVEjIfFASF(SBKWw!3!I@&h}!tHKxDt);xhBOHag?V z{J0OgrrGPbkI_e5phP-sus{#&bPk~L5~MY(JV%zYTlSF;^!W`;mvh&zCZk#Ue3Gqp z3o(zo^^ISAt@a}kJmhA5b?Mhmn+@2%?)WGzb6n)$8Cb`+O@kS2JT?8h_flQx3f za2!YX8w$Gnf!cyyM1qn;rqe+{rkCT~iRrn?(vHfED%_rtg0>h*yxMuZHs*!rf$9c7 zRW4f+cfgo)?i_MT)P%{rbhogqm*}6klZZ1|(ZT&I?R$yyV(IYDb!hX`2qyBRyvP_R4`i!rlRpcg4I`iSKcBVx)OJ!0ub$>6V86h4yZ%5n<>=@8L38c z<$0GpXiankkT;ARv1t94nQ`}b&b8YFN#xfLg75?V*m*kGka)TRde2A4ja1`Hcd-^b zt3Vu#jXFnCgN%t*p?$ul7?}!k%rXy3&PQFm5|aYUv1F(0;Gj(w$IJ{2cPpdKZn9&o zOI^(mK(@+LdPiG4(=QvipGdH%tcdalF?4Mpdw6sv6O!xt_x9Y*bB84I`kIY*s~+DI z10h2hab}Pqbfz^M}EzAqzN79ym*PG*szCa z9Y)7dbJ*tAJ3h!?a4&yCJ1bBYG&Ak{XgF@t!7lc~Vo=uxq0<_HPazPO7jw06Fs-I( zoLvyj#)}4SBX;aB7!iWjyKbH9C6J(4O+^ren)@K!{Vz_8sU0Di=^N^aP;Xoz*4o!im;4<@< zOTb|yrAKU@RZ2!07~ZWsSLu0t>(;4VpNmYK2`=f6#@KuI%RWzN8%^=bdTOT?Y;MlB z2qwJ%$p-y zh|?pr8CSvPPS6CGK+5@JsPplaQrQ=5@7Y1RG$6&QN-LZdwN zQ`N86z;Gj|E^xYwb(X2E^GGP3>qw{tq_?49y=XL~Qle5ax=aku!ocv60}u_j&ZEqm z`-xw#4!K%`t*kq~UYc_Hh(b33n86#@@IM%^+j*apdX4(;|$@5~dz3r@G2 z-NSsz>q%Z-yPKVbJ!7MS(5$EY0dk!CPu!g5hJ$+~O>6Oqb=_jOhR=0(eT?pT)Gxgm zmH5oJuts;F=Qg3}Cm+fFoBLi;#KykYED<~}vX4c@LaOQ}$2oj%)ZCBTWr%j$+|-?D zESei=zK-m^$9m;zvPoMGZ7f|Brk`DJ<4Zh`GIQ)zzcja)X*EieXnb$ZF>^GdU|83% z5*Pc>wNb~+4A;vi?q3f;OB zKg)8+ylpP+BPn@Vo;LASxc7(9CU0q<0%w9?^dbUtL!glfI}|JW2#?5sQx+VrJsZ;K zC3lNm7*rU1g}|;0y=aYPOwdfB9Utg!@}i0NF2f7|BlfxuCx$7Y@d9Gj zhF$dd!oOXN@f16Uq;~aM&F!qzV@l73=ewcrP~~x0yyep<@>i;Q{_T- zGOmN*Ue8a-Q7AjNgu=RHhFxW=4>6<7xK;Jdq58G<%ZN{zTxvdkhHJ|7TMjP@u`V1J zYJP4ir`T(ixsY0F4GP$y^jo2F;c)tZ*Eacf)lO{qY8{wArPKO7KGNOVH0om8)1*5Y zf<=t#v?WbCYkeo|?#>nXIj&Lq^RmNP9f9>tlW4m%14&ZCzlzfwO(K8h^G|8Nn~hjJlu~p1QVzlKGUdf-Lt6Pm?|GW1KS*K zGbPLX0qztn6F#(_4p)!8Wq)oUZWDN2V+00MB8$`a97qGxMi}P6as<$O|1J268)7iL zfotx~&d0;cd3i3^w(kmBVv2qg$aoLZk9#sq6vWe;wrfHRFIzz|*~ z%KEVY2=|?Eaci|XBUJQ-cIp3cs00%2z+r4#q2%m2;!IZ!?l^jBjqS?PXRGYp?{ z4hK&qfE~wWB4sS2z2tx)kK3?@XHs3?A8KfNd2mjndyY*wZ4vf*NB=?}6>4?1f~9pX z&?DfH5J~3Vi{HxSOL%R!X?DiYT9vr;NiujeOF?s%4-fHJ6xQ=kGyZ~;`LrT~b29mi z-;g)GGGmM%CbrCj6zMqK^2%=~5p=J(yv=k#iA02iXLYxDv6)E-MTLofcI7nAiSzw| z(DtFRN$~xUH)ftV8oes7l)s6GDrCd_fSMgv}RI#;`fyQff2^@%w~Ug zc&uWfHAepWwTIH3d}QRtKX-dQh0sRR7u-!BzwUvmwwCVP$&;N*YYNXYvb>YuqJm7A z%KKWeEb&|eMBU%Upt z>=Hc^acZdZGaNGyOI~F%gNq{Za2Lx8R1U89j#h5(o^S7vZtgI;KE%2{$hz?Bm-=4h zyL_4>;S+u(q#MVM)gIuDq9&R#@XUJW`wOnY^+F|~wC(#FI*_kPYVuunFI=p{^oos1 z?&-3(6A8xm_rA!J^Ci94sWm_e4l@l1g{&L~ZlknaU8~oZej(nbwtjha>FMvRvi>R- zhK8wsF7oJ4Lti?`G`7@*?15YFD*!hoGWf+&8JH!3z}^B$h-QI5Fk!3$z898hBXgon z@^EsSRY6*T{uWCZjVLm6sKt&W3)~~}=iBxF{@;quQqXrnp?_{{9!LNH?f+GXYij3g zYi07kN^yT{OgV2XqwItuffkpmG?@E}M}bng;Zt&|Z{WwVC3|ElugkH;=HLtqy@vG)3WE2ISh@_AN9yV>5KDlO170*b*@x86wu>eB!?XECJ?GElc`+J{$ z4m%q<`qiJ03%%dRgH?dyu7{SuW}G@54Z@xW(H&5l8kYX zsroCJdRY@S)etLB6W*7?(9B*4plG?)#Cb4Lo8||EF$PS(KUF-zM4_f3wnQMN9c37j zu3RH_!oQ1ZyBE2J*6J{?IIz`-yAX@G3f`9?90-jZ`w(EEE0Gs>bwl2#SUv3guqx~g zq?)l!ohLWoSlYLY-m8y#+9%9b`1k`bp#LKO8EBPi%tGE(;hg|X%t6wuOd}4F8hV&vS#nRQ0%srDN=m#SghZHMsJ+CKdMC)wXWQ7sBhu zM;^Sah&b@Z1O*!~%c;}h0vBqp zeLnLSE}Q-(`*wG48jHY$5{+S24%@qex}Ts)RfPZSH`CQbcC^vKS5vHh!x=IOS7SgV zi+sZQwVTW;wDTv`u-LQW()j{Weu zz971?XLR=o6rIhBkD^@fy`5G0^pyt?X)ds$r;3UCmVXA?5lFvk@av}X3M=u44Ljry z(U17<3JiH|UGxNPLDJ%%A-n}=agiQENlDM)^_*BNciP0g+DML%sp#6MC%QIEkY=_f}5@n}TpCoI0@GPYm4yh-?w z4LKuN4q>1G)*s1`4IO>!H{pflp%4QfFO@~2ectzkHhkmP_r(V4qaJG8=j zG=z}1;XYaY49Bv1(U{qec0@;bNQ{vD6~#n>`^}M!;^&m^WI-o-@4YA`RtAZ`x^MgA zG1CJYaWRnBQ)X3yW6QXo9JtF2CE$Nt~NCe%|K9TW0VLE-Fj!8?{hd=dcSMdpy;_sM6{cOdIb@82=5gCpy0J z+@f9+lN+<{eJZqian?D}hJXqPo~(*uNt8}Ni{w$0_GPk%$~ba&eDCzHRpPxomMJY8 z6e*?ojq`~PVz+4hg3F^m7KHaWZ3(II?onMp%c;a86Bxid3rVg%Oe|JOix+ykg=72UH7M zJVdBCi~;E@fycIcJEXVM@H~9b>Zet1#5-ho>PMwHIHn;$jv)3_>TpNm3X6%nq&7Y} z*k{I6&`nEjLz#O$x;P4N6QYTZ3#BW*jIf`yXfSb5*tnS+M%_mXD5*0lOBqpkusF2s zBy1UKtHr%g5F=M^$7D0My;%+}j6le4=m~9RX=d2xO7&9wOd&~H70@(Pfxgr+E4^{| zR@J8Kor9-OZ;8%@W4E%;_Cj(o8C35B=Bk4;=F@%V5~{p|fty7~i^I=hk;5z)Offh6lXBMFABE zvNs|zqHqc^V<5Gd9;9+$8)zYHqgyrg^FR?PzE!SFmeg-4&XOTZx-pBCI_-hqq|HY9 zoS9#dg@QfpCg%rrn(&l5j;)7LQ>;!Ch*^g;p037+s^MFI+u7q{V^g9WDOPi)SIrs! zXh@v@6Vz`r|HDKlGy8YhYqq{e*jUk9g<`iNhd!HG9{FK*+Q@7d{Wf4n_Pk16fAK_8 zw#Zf)!eUm>`v~vhz0X!bnS#*9DlNW~cV{~_{U%R}mN+~Rk0>4`39CA>`=nnWRXlpV z3U9fp!2EdP`kxc8meH4=_%m!G0u2C25&{7K-ah}23t{EJWan&dZuZZZ?h;4eVT1F= z^9ut!NLa;&&aJZ>d;w6TumW#~Ie8_91rA9z$Eh4SFV&%-@z8r6mtrq7wu1BvY7sy%Md_3@}R)4G=kjPRu?~F9}Da@W{+)NXFfTFOBn((NBrSLXgi`L2E zqfT*VT4B2i5YsI8H(r6I@)5mSN3EI5HrWlhh|$*po0YHjSnRQknbHs6hB57ccaDRj_p8hkd|+WLjschKP=rlc!iVK1n(BLxPFw~0?iwR%5n z2wyrIq|=w1+OzT`z_CJe%qEi#^ATQW>_G<>0MLGz&!#okMhg4`!i<{k-2do9NSn&^ z=CCvK=HQnzeY|q8mPO7z=>PLrY4!+1IFY16dC%;f{IC*zGSrlGBk*pJN7Ea8`WIVm zxq<6#v)r@Z>6+M4l6^fY*3IM5M)a8~AhyGqXctj5*M?G?^Rn-Kw=`d?Zv2)i)7fjp zxrPY04U^f>Moa8FQbf#naVz3J$%2Gl(x591G^UohR*DFTx|0oxspt~tL3wp^>9*!# zozI0{>T;(~2Tki`*|HC7)FH+q7K;Zf3_9F~gHqxueVdswVmk%+igD(O;@V{qhTjgk zc2#)B(bN0*vPs%rc&c|bBVM*SDty9!L0 zs`5pVQWhhOa{8rukFqVu2C`MzAKg{%r%km!KhwM7K*(NYwOoP(a?_@W8dpTXxfPU#Na3e?Nygy^ z(!hAY1xBCYR1_54L8fBv)3hSkuTikBn!STlM?Eq5ebZ-IkCzY2K|LO+D8aJY*u$Vn z25e+StHSB56I?55%4|NtriPRygf?Qd#LmgbDdEvMok~p#Blh4h!}6Y{2|46GAA}I{ zWvX9HnS5ph)$|EF14GX(4f^Ef^Q#_iFK4Q?iAove2xoP0AA=zd$^?zi8ShGz!}V#c zMrpgIJF!d4T@=Z*ePuBFjW{_+zgmsRL#%&dNq~-4jYn5~)iQ+6(^b*B)!HXURVM2H znSkL-XG!|fxVtA=1C#l)UqEluq4m^>_pc&f^*_YSEJRv4qX~=R+EM>Vaka%c4u`!iG2v( z61){(NHuiia7nQ_$cW3-Hh&qc?*bY-uGIz^LW~-RI)&^&gWI3h4_t{D1t0Vht*QIA zyDduNH@PQ@C?HW;V>(yl;;sc+eDolSQ_PXt@c!!AHGy8)th@0skDKQ_|To4Re%d9BPjFDOPg$)GyE%$HSA;LRwL*` z5>jx3BGVeKZn*0efz;E=>Eh%E;d2S+8NpM&kXxVO!M4NCi zKsM=LBDhhOh4R@MTE|fi%iV%t@rt7FkLa3Ysi)l;i<(s2 z%gN#_wT4ARI}W4YUnLMYj|iAIa>)22x1E*S&CQ=ZToP$uF0cnz?DLFW#|NFco<%YE z;wI=Wl{*UUZL4pyKoFlhdfoZ7=}z(2)>FZJim=3U&g9rNSM-cGBygI)@xG`tqlZN@ zB-AU`%`9o<#370t$BmZtWHQ`6P+>vihEJxd)Pf&(fgPOxmc8W@VZ`+DrDue;LtfK0 zFWqj9{K`x>U}-m|bGS6-BRyLLQG!B`&L{s6jHjDYHaAA^0BUp9xmw1 zE_xiXvY7^RqIHeYnRcJ;#j_RNGl8{R(&sUo6-o$X#TZv{#me53wc>>B8i_YE^=XR% zw{4wnB#&9OL2;fWdVfG^CRcO0pDMchx?_AaQfXwR+*a#8?A%+cRfc2V--O__i9?_s zGfAMsQ4`fe1Ny$t-xEYS)H9wDleq*r=KNzg-6{K!|p^E$;7p-t>on! z_$+s7Aatc5&I;H8;A3E^A5T&4CSY9sCxHP$k?-LDtTz5(djDNu{HLex zw;0ubR2wFS|FFCNS2NvzPe%S{@_*KV|NkQp{yD9%w z4yL~AvwsEopA+(bg;f53fb{=eW^7Imt{&>&WX2%qTU(63q56FX`FH%oH2L4){;$9B ze+5%1IyhXY_+ z_^B||S&uL`e7!vTe;l%NDVL!heLcR! zUg?tly)xNL3^c&tW20O zc)5WCH$n@~B(sb00ij7A?S3r3Cb|AW$Enf>ghr4u(gc5?ESm;tvpkv|u*dvmOEYPX?n6>Yu;!Q0{=ylSd!= z6{aCJW&##GF{t9eBkr`H)~?scbfqa!D^I2C{t4T*0pA7_ESTX6V=WF}0ykONw zKcx^eb09G2Rx=9=+X@QY6SPP?3qcTAyRN(tkWXw4+^N29Jy_)U(x%eN|x zC*hH%@%V&#BFQWdax7>56*y0IHBT(Hnv*(wM*qZIK!~cxTbJ2{*n}2V54}lisS&n& zMvE=|b&##T5NNJ=;(XxiJj}jUx|&70*>Np3T15$9_(da#BDZ~Prl^dIRI(dEbR7o% z4=kS+P!gvCGFN&qB^T%t{)q@?Q6d>J#r9vuW^_hIs?~)V0uqw=Ut!*QP(H0Sg)?Si z5oTis0-`^RZ#@;EVbSppX8!Ehgsm1ny>Z47xg@0y+=>7XC`Vt**Fn$I2}!t6x2`Em zJ@-&O&W-8OUHr*82JiFLpcA)4>cQWoO1&4jiqc1zj4Bth@Ih{*>INM{Cqs&l1D^4pLHJXE2 z*C4X&&PR6IfxwhU&QYbAiM7Q_z&IkS=*-ml$3gj#j1ey#N9LRfJ(K|;v?8rubM|5t>L!psx4Oa21({NBq{v&e zfQ+=_Gr=w0Pq?E%H;?(AuBueEarxNuWpbXzOAaSTHsKju8NLL+rkY2~ucU6nrmFF> zr-g0G!4^5}OyPWDV{j)eah6ihQ$GiK#S@JNTFIOc^?n!QaMN#Q80}`mWwjWC0Sg!^ z5ecGm8{Kzmu2rFAQ3P(Mr0GJG+y}1#uK*g-EH)H}?<_-ZC!-_hYG9C;pS8^-%ahSpeaih$*b9{%Q9Ml6Oi(-Q)m$o7a0SQArWz`ue$7z<3Kh2C~z zol1+MA(8*oK{I40m%?aBAE)1RltAo$`NV@|!2@zfF*t)WJaK0|oCpxXIq12-0~K-- z#hK&Hogf@lRZPjU3E1F(4y0y=2LvAT(7AiSWD20v*$vOQw-fIXToaJS_zOo|UR?|3 zVc8qHP` zrj3RXhI@wDjzTNXh8GTM<81jHGgBCuHH@rfZf$W`#}-UiyI-tLPjV6GfN;Us?d@a5@9EdDjYYa-2-Mq zk$^;*sN;W0E6Z2Jn}>5ivV6XiMzfEmD{7v42au-pP-2l%+Z5q;CrGq1Qv?l?)$8Z% zT<^G_c&#TH>m|&QpXj6jA%3Wvd`;AUjmIn6UrDo`li9FamxSh~kMuew#KsWGC%~i3 z;c8Ii{W<}Pe}*xNFadxLUhh0_j3Lc?{+I^W3w(Mi^xWiA#{t#?zUrLeC5CH|j;*0{ zt)XkH`rTqr$J^SpP)Tn~eXr6Y7r(_t_9-#Sld1zH+p5FF3?+I?GsJqgYH@+&xR2y$ zC%ro|Vc-0W=BX*_(qK5^i=GN3f^`+lXR|QgUOACv@Vp6;gB*>7IwH9W6sN2ud5OC$ z-;7Ap6u=3+U^U<#Sc1GyR=TXWi{-fuCU7xE7t7gdvhIThJJx_!9fG5XSlufz*qSnD z;RhQ@K+HT2dQjhzr8ih3>9^?$QMc=Gc|Nr2w{vli^~DE6FKu#EiQ@;>;-KLksmYlN z9a9_2?{=N3;e!K9I`_^>dpZLB6}W+X_PC>FC$f%E+CixfpVgZoYk!caSEGvd(i1t< zr81G$Y}{`7yYcJC*|65%Yn)OAF$Y)Z+MOBA-DSr~cRhzn)LGJIxD|cE`yR6NZQN`? zrk7&oe7y^{-KpuTtk$fZAf52EIbSjRE(Aa1bf6>l*0kjjljsF*a3qKh7Wy#{o?OMi zp~Y>J7QR0o)Xuo+y5nqfNB;U#onG@rcK3b-`}^EVh<((D1>W|P#~rS}tx$uQhc&ge za>+!EoazMYs(!^aBqd<0x!fI} zNmArg-1`Mg#CHStA0*4Hn6WnE%CHl~F5~jpSkP3mH=xm=Q@y5QbZPK2+UgF{mE(5f z@U)Rq&))nlE-o)tb3W%6kGH;Mg0Fn9x~_b;pWL2&wJTTcet-?u;NF)&wIsYWUYI;z zx>7^$u;sU1cYyE;SllT*T6+ZJ6Pr-3kb=UK{%PU(sydb^?&3jv?cDLf!eF}+uaA16Pbo7aCmgX_I z|4GfQiGgah|M5=WXH2eK!S}gLroT{9wQJ)uF$woCw}S1^d~d`S&W|3sUx)9om9T}u6f(+{tO%!M|xJU!|%Qd zOg}0E{#jdQ>SSmVADzM-^K)v>1xG&{E|)gXHhz|W@-NOvw&{HjO~FMjb7%Ap^U;%b zRCi}wvpAL?bRWGyTS%B^@~k{v-o+44uW4IZ)h0b;U`|XPElJzZHnNBl2@vU3rSq7c zerQb@8PdJ$LR-1k`bRg{biNwF1@l!rPK;MAki7MTqs1i`@s**AYE_OvFNVOy=P!B* z|AXcMi;?fE^Dng}1M_RA*5H0Kzjr0u@?Rv|X6NT3*47awWCc#HY!U%~@c3fc^Y$!o z-17whBl?GAyuhGM%NX~pVEOagr`&UUh>dUa?ivA0DZ;Y7M^KI2Y&*k-<6-N+TQ`4Q zu@SExJ%I7%?c@vm;(}A~qhC{OaMn(KkJ~2_Z}ZX@tD*)4# zZiJQ=`VL-R${&j2X_UD)y>lA>tVr<}*bwLHep^_p zoj1<)FAonKasmXuJfLQA$5!ig#-$r|>TOkt zJ3&q?&@((0+KJ_hX->E7)*mEc;S~1TTK6P~d&6#6SNR52r{W8^<)%_@NaAgzHM+!z zT4>E5u)cz(3@G{lu`|Yyc}RS`YmJu8Jtet7`F`e{l3(n%Mla@a$*j4jt|%JoTRn9C z#+2&P)~bc?^2BWY&DxM~+l`u`>tVu}=57kjTC*cSy=9@R89fs)u@WH`>U!W_M&Q*_ zN%VezsPyTb#_vThu9Tp}Qm2YsEm5-#iw>ymG3$pZV;HwjTJAbv7YO0%p$=|l+2v** zg+-UzrAy6AM(PU;0^^6Q{tFKx^gJVyON>d;h~_$#>jgqtw#DEFjN=azDKms1!OjEOi7v#9P`rrAo6W5WRPb7ztW4O}*z)_@HJo+%6GylL_tBpvD8quD(0W%3Bh8 z!SQ5n-DQazR+~BN1|x}ke{VF7Nq04y7Tzq0byWW=Ro9Y{%|-NqS&+?V{AsoI5+I6%ldc}(wT0KKBM6UFFdAbr<@2!WaZJW z+L=sTv_;k+KVUF@8XY8`(~3esOHRO+5jZr`s=tW;QmG&r=3K`({G_8yMWXYk3T~_2 z1t-G1vvD61I(7t%^7b!so7vy7>X%2(Y-{ktfnVHjWJA7Mj@f~lX8_H!u`D|7Fp2`? z2L>^X^OLIJZDll)rA-nOH94`$IVeXr{oobjO}a%%5sDIEzx0yNKs!UDDUGGYU33! zr=S9r-93;5z;K7Ti8)M>vY7H(rvjB<`>4#BvXv^iexD-DnuVovjLP5|kgt`7n}>&g z3=T4TILSuc_3frob`)Z>4@Tjb48t?*+YGig47U0iZKT6BeA=oJtjif;sWI#5XK^5Q zvBKXBDg*rvDJqhYpuc$kt1KB_Y;TN=a4Wsz09~M?Wagmph<+fA#%O)T4>O3d(wkrF zj5f#+#N>ie%zjooPY$i|0WGDHK+aW0G+rWd!^jv|=NqJJ) zUFLh^M)`nlu&e2adfUp|-MgYUmex@y_>0%`VDp&Nsy1})w8_RE`$^YfM=E)hP3Sud zH-furDG9_!NezOaH5~i7c>=;DjQ2QZEo7n?n+z??>r{w_+dtvdx~2+%(ea-1B4!3S z5`m0prBcI@0_&(Z26TPdbBaPre}tN2HT3J8w*E+t84Z|-kqO20w8Dq3ECXe51(QxT z5B(GEzUb?Uzo|~eeND0B~z2YO)al$y?(iLfF9zuah~y>FpLYN>kJG&u0`gQ5pVP2wJYZ2)sMJOGFvf!2 zaS&=C9jwbLZxC+KLwn6K7~AyO2-EPhzI0#SooW)E4JCI7PT2Cs2N|8ixv|1)8!9#k zNd)A2@8J3){i|rlqmk z_L4c$(pWOV={nbW*=2acV(BAVO|B2pX@23m_b8uITng`s1gtSV0&RuqI`BnV4AgkJ zr3KCU;#bKve+c`JkmN;w>0I2^8<2s12fO<{IAA<+tP)cgjhqIOTr+_`aT_a`B&HfKxn-o zr5xPZDGMD*^tJ1{2V{vrveUEYK)p3H3b4&1n$KT$u|1oJGTtPEOw2aLi7T=LdyAlt zH$r~xc+L0*_k3)-$zfl*zk^$j>(jDegiB%G9Sk3I5>flnBmWzJKBl38y@Y~2DYYRH zPJGxK?DZ+|%D;U6Xr!F)4ftz{qHJN>^|iC$)_s>Vkn`^Ny;=WZ9qZU1{O~#^=8I%8 z$MBf{CRF7#Tc)RL_#@IjcGLPVP_wp{rp_O^7Bahl2gjr%(2`2o9siSEP_u)p~S zY2ne;S|par_V0$L)puS0Ai?gK=MKL|&8Tk9r5(t_nkAp z(MdeL@ZK7SThe-f8HbHaY62HWYIz3XP53tsTZ$cR)iY1FGa=WDyEpGv!Eh{oZsBk= zes0BZDt>OsR3bjVc(y*TUo|#`mrpmgyqC|RyHZ4MsFm!^o#FeYW^y~yLBv(&lJ(dxaZwO^b#V4QEsTuio^0|!YdGgr>rHg4xgyu2$)@m{!)GfERvZjx?64ghDb#9RQ zk~>N(3w!R3Q`pze7=Ef6N@fb;WS07p!U1QQ#}@$Jh=Orw$sY=D?)9}8;K*W8DSMZq zA|VLWzsXDpSn4e-uXw*p^Wm2}1PJK7XYa3#FwmNSZ?rH7mzTOM(k5$h1iCJ~sdWoz zFRO=t3l7S@Z{b*^X7c*cS3j3+wRFriHNezzyLFf<8rdj4;0r9am2=F;WQez@E{(?8 zZFj3zCZ18ZEQZw=lOHvlMlT@as|6LJBbus#aAtSzg`_a1tAJTbz%7c&nYRay6kSV9 zl-6YS2MaV-OR5u?D18jVB-g7eoLD8g3@PT})lko+YW`jv7L{lWgXIJnSqsb&1_I!r zvfXj}d(RwM+`4lixHdO>^(^g)7A>Abvyg;7r4evY!MV-kkaWigz)r?D6A6EBnHK@j ztDCz^gidj@H&umYcy@u^h1b%>{j;-jX4AXYX7StS7ZNR$G`b*3fNlSVe8BO(rM0Di z1}$DV45&K^B<(Pp1}nMtz}HFtI;$Mxi(7nEb+Z1j3&s)IwZuj>UkQ|#N8Ij;4^2=75*9mri6zE1_9bQk=NmtNu1NzaCCwC|!)_n_R9?q;e z`_|zLZzyDZ+voeO)oa+6^F4zR=C(yo?v1^%?Pq6ieu{rM^p|2%_3vQ}eszw&)0^*1 zQ~tfZ)4BW{=gc$faMxI%{Qh#g3fjUU3dLXD<~v6(ETKKGFJD zZ8CEC?Mb@{zx)|KIQgeL67}N<{E>1BcjcGw=GkiYkNo!EeemTlhmWSCQD`hXNGG0g zKZkp34o~0~{1Lu7zF&^3Xumv<_41Nz!0|l~%K**i=(lZ1ICZOD=g(W(cif+IQB_?+ z)>QA$&cn;Y)sI|%hNsQnF#WdGLztdw0%`Z3{FD2i;QFKYzv%yY!uIbxhwp>7|J5`9 z#|hhi_VxcO(cvG5a>|?8uNL2_fbaMZH?RLa3^YU_^j1^!R^|Yv~xP_BhO8icsw`t~N>MvHz6QQpOS-I2}fyE+;!kz6;y0PjsoJ z(_UN%KJr8}?L85Vyv%y#8RhAnHfyN+@>lRpz`c*x!Vw^$&Nq$=GTQS$WJp-c)dNF^5$ITe}m(SiWC1*8{Y1gt>iV*q$Ub>HVr z?3Z0lk=9MJivQF?RCrdEO$Wa5F(ZmzWiVW!`;kaXq7mEp{48}#X;3K^r3VxA&ua>+ z7oP?#=tn?@YUdn8XpWmy$YjQTSUX`oEJP)-pxS+@0V|sfVo?XzGL<`GtO-l{%OxJo zJsuK}LJl+_I3X)*Z zwF&%4huy~)?QW>d_t<@Svciu?OnI+5^DZptK^CS&u(7n%+0Mc0lV7jgt;wqKFsniyFgQ8P9Ane=9x_k44S9?FNOEeE4gXLDwYri zp-4{OD@%TSQPIuYN|WZg8A=AFpu-XFPYt-YkE+tjOLUXk^HXy+W9(BlmK!s?mqYBC zi{oEje#5d#-K$@u9^9AXL$oNnt}m+KLk9WWeF4h)HR^P^n~XxS__2NXU%Q6 z4$XNa=|%o>XPxVzx1c7t=}6?iyOQCO!G(~ou=(Hyvk~&hs9Q1j|KZhe46pS*iqMU~ z^vfYOW6M#Mu`jm$kt$2~{udZvz`7s%s8-I|O}rz+z%C-btrgwtAneFlBX1RE$a&4~ zYo48;4x0=op6D;9&niVhVqVB6dGXZD=5ws(>EL*-{K|XT*YJ#;{25L!vJ`?e`=qTq*IU7rV-IAGJjwgS8ZFX^f2HCVBUji@TR-CKL|7~5@2MI_}%ITc# zByvpywN8T;J#xqhm=>SkZ)KX~na8bpcfT`-zP{5XW?*dOnwa|d;IUAg(L4L+QKU8n zZI;W8MT)tz`4{D}Ts_Ze$_Astb}vo5V*j58%Ot`OXdXsfp$AfT-G;;Hd7p)zRhS0HIPxoOt# zV8RCuT8h-STVJ{fka-g5PyF8gdm*a2K;I%0ZS?r{)sEI<57*YqJvQiY@W`S@(n1vl zw8MLofUqON9M`hf7 z6w@RtJk+V4r<31?M0P6egr?ofNy~(q2d>6cvH9epU`Ktm zRD#Ko`t4zv(WE#}vS#VLc92YC!DZ>Sr~}^^F|4lQaVA-j6T_ncg>K2Xxpht<( zqb~^THTboZT)WRZg;({ak?OU6m@{o&xqj^qym4f|pb_Py(~bSypk8%XQBWo1APS3^ zAXH`|#T7-^?3E|~JQ$q5wM;_PV~H5^+;;EhTL`kGN!{@^Z=Jv3l_j6XqK5R>z10_3 z^z`fqgUEKC!OLa^vxMNc-MdZe$`#8ioIepWVo96>g-Rk=zZJJPfjnGWF-3by7U>%4 zI}^`p%1aC2Ic66S=YVwUop4A`0<>siI~E93C&vu;Mli9H@(C|QT(hW1rBqGQin<8&@c<@QPGUka;uOF0pKyEhg&)_ zL@Kk16+gD~)NpN%DFeyC;0kS|q{9eA@P!I6JlZMRcYoZz=-XC)c8B=lbMfG=KL=wr zk{Gw4J%?16U0lm1<0(Kqfuac8+uN-7L8F+hUUI#5MgpcW!se*Qf}^zT)F8JZ?Bi34 zqfJfyVVFLG0$CC6%Szp@DqaL>G=y0fJ!1ERj5&AMHm_^m@H|*tbnp7xc}_;)jhGT} zd#_T&{Yx)hxrMw&&M z{ZF-S4eW=RSk;2(*ZlfTVgtn;#r#boK`t&YG?&-~2grK@bR>_Qbc^$(q+5>Q`cEfy zrQ<%F(h==qlHto5%`7$WXEaL%rIxfJnANEE^erVwZwl{U z6-y|SF#rb$+eBI!J$wsZNd7yAJ{7x!;CToeAmb$$Y+1gJ`a9x?VyWnSfRLJ*k}*+W zMmd=x`u@F97Bh4(T%NK3Tz~zsRd}pSj9?4IJg-kOsMzv+VrUVz7@81LgMv`rFW@Z; zARd@ij>1&!5YKRd?ni70YA-5t{GV5BfX_R#cF7{rlA62Ls9}}`!S z!Hdg`qdczK#gy4q4imzOZp|~?TQ;*~)H-@>d#?nj%E?n>^|;E$OkD9LpS!9_DfX_K z+L>!N_C4vQ;H5A9y7Dga2L)sx)>^0 zrr~yb1+-SWQ}N}Hu0MC5FWf0)6b|k2Qp#XS#6a4Ab~${Kr!z>qLi9qC+Yi|)iaEC= zP6NxrFC~#{$`d48p32WI<&v+85M478ROdP1Ce$AoY0haBl}*dG%?I&K-d!(IF&}TK zqdj&#T|G^unGpjmvmWDJ2A+`Tyxv-x7cm?&ezWQG*`i!4aWq1*0P1^VGx!Y4x>NJ2 zW}?9%ndm;xQaH-+6T+mdg(%aTwE{T(qRjOWv?@5aRVf}3VGN4b4G@mS!uMxL1TJCO zii?5GacE?OOQj`ld*6`!$`!`4k4C+%RPAz-Cx z2B^b4GzDnV4e$vK3=+juNHXl2Ct5KuMP(>MFct})y^en|R7Mt);|_3$!PDfvjo-!G zz6*K!an{3emRB909mX)xrxoq9ilaKWl1UpDPWIojREY#u*jO*#i)h$5_X3`q!h4ZfH54noMG_+4A5a^f zPR$=C-5(}iw|_@ADa1SE11}TP3+l)@<~Wwl6{g0|t+ls$KKP2iIx5W;Z6eBtsCP*i zn>81WkNz_KTp?7O!BznVXe$n?$KSCJGvdZh?XyhUXCsYFxg^k*!~?3q%!kzltla!X zLbffZ`OjVmygntT`N8i$u|8jZ`O95TTefGtnLi(aesTuzBmejb_v_m{Uc##EwG^QG z$(bXDWj$TkWz0WTA3HJB3OAi7k^Y-WU60lH;i*{JX)$=L1DtLT4vr$_bah~wUZJ4Y zqHd!Us928p2xelW44(0a_$g(U4%d&ABBF{6wMi)T#_BcJf>sVcVO{v#gi056wG`Ht z@PZEg*(nVSpv)ms*WSUh48z-}Zd*IMJ`dDG3__Z*Ly13Bv^YF4L8j3-S?AfEeot;u z)+qst4>LEy6!KHQ^a^GX2fRzIc>sazxIkfXu^P-J zjG@QOd49>0uj4wtyo8!5MOPX%6o$|m`vic=m(ep;G@NLlYyPG5CHnrsHkdoixO_dT zN-Rm0t#=pVIyl@s33+mWHhE%)mNZ4VDc8pwaGoEG-}7$@ng=pa=})hsKd5MGD_sIX zQIjbK$O+4VXe%|s7Zs$8rBgheX`$I%=Qx-UoQiLn2?s3Rok4bX0ixI=0mq#|Po(-{ zuD$Aw23WG7%^gKp*Y|LX_W4Q?tTmwBBUlIAIw#4$7TmQD2TlF7bDh{66%Bh*Y{U%= zYa@V^!c!k7(PJvo|Cn$iODmU3G@5WjNaK`Y-kWg4NS~Eadem1d6=X^_Ql7yNe9VM; zBH*q<@F;4Clq$~1z$ONjl|(7LDfp27;VN0bNMOqmGsUD3ZE-4-mYU6@3#tHQq10bB zn4)Y*9;jdSBJo;kF)KP@!;)*o%h8JNSZFf^gpj)3{0CS*Z1q za88U;5!&i*sq0*wJ3RdbkVUM8kl9 zKbv(oS#KDZhktjMxonSU&8zY2SJ?=#6(Q@&e8YZG60xbM`=cS*=m|EV#!TAmBFwEZ z4%F;iOmIM>5vOkSfeUL&7jDR41p_CiU1cK}G-()aS2FMytDS&xA%|NqVK~KP%Q~9` z;70K}Im0Pn-MRRcmQ*GMDz0t|*J@aXXW3Rzbcz(XfWNLgZ(g;HZ?xH1$lDiMs&ebM zK~Qo!?|`FF+bSP|A%AZr>qH5+fm+*~HUn zaE;h9A9BH~4M9YdA!18dnew6S{{C^KdFe}b7Y~f}uhuh#y!6@6GEpVBT}x5`G)%nA%BxCpv-*_4qFnjCz*#(Ti6(4KWX;?V1Dqx)rN-PhSy zJllP`n!L{tJVV4XklcPbx(yU~>#L!zwHKHxa1l%Wz^E6!?x1)@YBwX)xb#b9i#V7h zS;;GIam2hN+e?jH`>@$~RsGJihl-TkDzp7{&@v9UTve{7d|B228tt&%9N7kWg6>UR z*qFxRM3tJbE#SYEY;t`DnmQpzidX=&lNkun61@f{ur9LKThaJ~-$uy}`xma`Ar2n6 zZVqbezy)sZ0c=Cc#+4nE5HRZqQ{U3yTph0}N}54xvVFiURcB%uhDEjY=$SRLK<*m)$m{aTQF-Ho`eW$Pf;t@Oz>x|6bI?bH< z9c_}_e87iYZ3jQ!L6Z8JgYLOs3cZWc+&p-$;#CyFo_K*Q<{ZhR(gJFmz$$sCb15w# z46UJcymLBWw$?xqma93gbwr_810Q!oT`KamW(hliGJ`5t8Rcr^^a$``V!8cHlc7nF z%Y|^x&m(sZgv!4-C#T{>$7e|41nXG#`#M*W&8&GJ(v@?ox8ipUqinA?m_8n&@bFA; z%+-imt<#=aT|SHN2Jj_*S8k8Z<)3ao8F=t{P12#3wahTj^|S2Uj&$qwe64kn$0_V1QR zweiEY4Q^Awa2HDa*4;P-8rhgf0^K~a821;#@vD2e^Ov3L<#yfFM={q^vax>qzDHhr zP&+KL&~a{RH8EYcgM;vo4!)nfP-liv0JN@|uE_P3&8}JJA;wF6L01UgXBc}3Uw2z>5f3tpYH~kjHIf?Y74t}bLzDE=6!i{8GTW!QeGtSZz<*ZHplaDWC z=zEd+RP(dCHUaxd$sMUKP?meX7ZP{KS-d-WBSg4eJ~wk{bhr}#KEOsDr4QQg@Fvqq2~D0(n#`KN*rbEa(6pitSbmrPSYvBZ3# zf9a|T64HC{k(lE7?pyRR%zL_5xFfL>(@Z}!(V02(U+$4V@iC`*1V9WH8GlI0&S$8j z=+2cVDrJji?;uw!Qp4pD<5W+U6Hvc>;i!C>lwLa^hEH_^7*z=cF(XZ!HtqR5*^akc z=1OgG(K;yFO$1!))4jk#{u;-~@xm=EMjxRv1g`0xkKdiI?0Gt->vr695_Lt{Nws|8 zUH&-f%hh>EpF_Vz7)F+mUgMwlKXJamP98ZOz5QTTEf_mDf{TDbvCD=9{He_+<`EE5nc2A zk@UE5xKt&_W9FQhZc|}1p5^zEkObY{Rg~>^x2~t;T#V*wWzvW_FJ+ZrI~VA`@Cd#R z9of^H15rM_+*Tu4B{Z)X>6DL?*x7x3JG)#@FGL#oQ^hti4<8I2+h-R0!-NNHVH}@) z+-MW;rP4lAQT>g?rW7EnP~q#5sQ132HqDb^t{z`MY8wEv1YnYfSsAYw;K{P{+#vOh zbv-Gw>Gf7aX$ApIQ#*);vcW8PM=4rYO}8QrgVw~uYPr9|fv8cpiC2)$wF6siBCIxZ zmglExw20fP^^MvNP>v=7G{+VU1r}NIbrJs@~ zgLNsI1gcAhUpT_@)zdv65E^vr&AK0!N_f2@C7${MgTx&$?jk>hp-JwE8pDLiIVe*3 zClMB<9M5HsI+1kooyH zXlTzSU)Ie1>@sh$#NA3W3d#G}wl-h)sx-7O{WZxb0H0z_()I)I^snP7Y!yMZeWDv{wM?3+E57UGrREZ@*L zz{8!^7bEHJXNNM(CYI^lht_7vC-7#I2-=vL-K^`%X5bEB2JU#oJ36!ZfkT$H*J>My;C0S;++;?AX>Ppe4IGCu(W128a@RXGa!Y05(;TH@bOHt|!AC0&H7 z;1RAKBnwtuOpWupWs$#)ZEDQ=?(n8HyjpT!yeyP*ee;X7WYiw+G*0X3J2&w|W*{w^ zya`=IGdH&az2@jS%4zlp9{sQhn0-0V<1+PZLMU`f+hg;t`T2DnEZJGdHl1>kR0W+c3|*lz;d`GUWPv??(e1Hx=J#};@9m%q z67wiWP%HO==Gu;^S=-pNW>{g&x#GjOv~1**Wt+7>Fw7aWrjN*F5nR2DrA`-lP!J{E znHy&7EV^7AMt8q{g*lQk;`@2wz775N|KaPLf-?>NZ5`WoCdtHhCbn(cwr$&XGO=yj zw(T!YCfTXI|8;hqi*qjCzI*Sws{7Y#t!Fj*CMjgmyQP2v>($?3Q(yCeFEuWYo)D0uZZp4{V<~^>E2+k|AM$L=WKkjhtY?MqKrz%@Q@J7-h)$sAe=e2_b}F~ z86;Y)y~B;TmGT`%TBL;9=lg%wqkjztn1*OyP$aUGu!HL+WFCxHQ>FkB=K>m8ZCL%( z$sF3qeyOgHdbsn0WD9P}Z3ggPUEAOg8-@Xus7zCHuDiRy6Q6+JbnEy) zz67*|@!xmJ-~r8?0V40TZq6l)ois!7F2tQ&dRa&!Hvxl6Y2!cVsnmV+9blXrY%tnf$_#3KU zT6;`Vk1`Thbf9`OWdg&Bf14+z&GnLc(6Qb4ligo{L0+O3C?_b3)E5H(iLAg|$C(7& z8jwsF^R%6%5lm~Y1Z}q~fVf_Ja_942I(>T0>pk<%whcx7WbiDv={2i%$UR&6m-JA>G+&}HDqkXOF;u(f%N|tft^!)D zzC$|qL2Y)wVBIDmH)j5+Kosch%35%o%b0caMv5qHPZbGm=?$Z7it8y`@Oo_9-)%VF zY;cNJxm>(|14MhU<7_b=I@bb42=3RYOC4VQNdvTU#fv>%?eX9v5K)`fr zXb5Q)&c$U1wH`-yITns{DYghJD#Lj8%Y;f~paF0}h*w-?~G z{XN9@{e+Kbpbn>Be-e76bA#ph1A0%DR5FMp0d1e86n`%1O39iAH)gtPyU4PLUJ$b@{9~ z&$25hV+vaH5^sONqq`BE6xi03+g7W`rPdycMs-4y_o@`MuwQOgW9Xe!W57>`w@QvR z(LdKj4l>Zwe|Hbzza6x|W6(==HWj-0rKwtb$`_f8=6EoiBe`)zYRZ%1%#wP1IU^(L zK6~oIlW@5%K_>;%qHzaC7%FhM=hCJJpF5<7If;fjiW}wWPfXT1*Hzykg`ggchh*nj zr*pzig?p{$U_(3&$p!=SD=0sl?M`z1FaQPGOPiWCG_Ef>KPI`uHb`5YJqz=#1KEvO zFrawUyR6Mvno0Qj>VX^#U|H`D)yo8}GZD(-j8o16YEZCAO7GKu&zhm{-It)-Obj!9 zv}s3A-f>4vAuWN)1AUCBBjhMol;zQnFmLQI>h1-E?aN{gHGaE&ei$x+X;S2KvCYBB z!Nk@cCL3M5xB)e7T7gk-^aWRtYo}5@91Y|~n>miX5~QX5!CKP@%o5Ra_L9+Gyy7g$ zVIG^m&CGwThlC~LCSlZ@8P&%$OKKZ}!lL)=)`gF*)mBN*|Jr@Sb2V;ZzSJ>_FPMa* zu5&>PIZs6hp}spTjJD^J+@+xFbMe%+8Y<}&$dL&p+T5fmK_qa1{Nn1 z4a3(w!z-rhoMf`T=}<4Ohq2Gopyu#R@hY`?dyR_~@b84( zVGW!g1HAlPI|57}7@RCdWFu8C?B(JW4gZ>hlUJOno^lRDo6LrI2?Va}tuV4ZKj6*L zZDKr$&@B(|nisl5P8xJW(gM^Kyb9S(X;UJqB3?ALp|`x`ZL9jQ`^8Hvv~N?Z4o4v+ zZp3{98Wbq|oGB=TG7^8$KUz*X2gHAR$basYfuisbZ2Q(>_?dhgJ=17A29-rvkhbPLoR5DR?~%aW%4CgpensBlo| zK84MP7L5Mtah&aja6PE}(A?w3{F;nL)+I5x12cp^g{(L0a(L9Wz)T@?Vcd0^a2coe zSaoT&I4FM-wuZl|)Cl5-dQmjTs?@xN?iI{TE`?-zx}yw=rco3wCK%iv`}+~!>jQWy z*dW2iD*)+vlFtnZkO~SC22mx@Kgz5nAYi3gFOdp#S1v~H-J2Xd!!ZrKnnyi@p_ZAv z_MN$WW|NNfLnsqc|6*t%g1mtSp~mv28Yw+LldE&$`_@2fV>0Uq1R)8`QIzxCsxy&s z*>I9gq(kz1?s9uB7Jqd)4;-lN%M|=!-rC5$k5g#Enib0KnIG?`YNt6RLbULwh8y$O zP?n`b*1V}_ul=Kagk0w>S*TY_z9vH|MZke(Jy9YEhxeY0;%+e&7BKtQXG5pBy?c++ znK`47T;VsbN$QRo&MXis9_En2wMivl0E`~aelVcFZ#k_x77lf5$TxReT2Pkb?y)nM zwOxPw*C6c;lB)7k#V~7OP$tXz_HUXvQkf+060f4qBFKgvNUWltBvi25B+9?QnnWEX zxN2E(@a@7nDJ25k#Rs5`JglfuBpd7Z7UvaTPX7Y7@k30q`!aK?k17PBwQ28~)E$PJ z4O?z0x($P$I`*+%^AP>a;Q@-P3Yvb#hP#bMZqJR)<4^91-RbAXYz+Q)(GC`lCWPw2 zvq7$IF|!PWV)ZA!qx)oF4R@OnI89K5NBHQ!^O79M+5HHuG#0T}%7oN-RP5Z_dv8(>Zkh4hGwM4_qrcAUMxEjS6wB#Y_%{?*z46hWLo9Quc6+#~C72^{){3 z;X$k=n%|1T!O>ti-VfFwj??fV#64Jkf%Kfw>Mke72V7})auKG6IsSWK_ICB+wmCMZ zy@Spj{D5G58Rxx}iw~rlZ;ooy2=PyIE@O%D&!OsR^^5sw3_pr?It$v@*-C-vc3i4I(BQ!df%Qr>lrnp;u|PK)YmJR&I1&bymJS z?GN!Yc|%-hCn&UU*16y*KkIA>ZN&KU;Gs@@z}Bc^Us31uHq$2IqEQY%^Rp2tZ5Vqr zh#Z<2<3+LH;ca+%WreX*fNGe;Nj^U;E2dbcko?Arq^Y=|E39iFv!Z>YL#gjUVC6+8 zWoaMK5B;8Lch1MizctJLaehbK!erDDO-Dc8Sde;x1U%&CYGtWcqMQMKCNygoF6Xbo zrZTuxjOZUgFRp+(xVLl#BBA$Ey8ImwVX3;3UOAoKlo8{U0AB7W^m}Z|H8A+gb;b>^ z$pEN^i8uoR$V?!b8vBQ4uuQV-&=duuq9SQYZHc#{qHA<|27qFT7Scp@L~5|s=HUvM zrp0M!K$}VmI!@&6wWPmPbxjWLISJuIV!+a|KJ%e5 zArzj)0zay$>zr7IOo7!*)rFB1l0iou9b(6=VuRH{5lDk|N&}!iHM<-?)N!i%c>Cj( zn8T0c($oq1wM(gZ8 zrhF|`#1>W?Me()9YdaU@C3{(;S|wTEdc_eMf2*3ghO?s3PU^3>?FuO{flk9AhZnS# z8wf39+=+&7XJu%g*)X4zc18THN9r-%&3aJi8``mk!m)$~!EVOE2^8Ejk5oh5=Z93t zk_C-2>8!NJ8P0t2FVg&EXH@%4+8^~)s{#_lA_w@tEL@n$Z_V+ORhC_lKwJQx_Ss%ReGp3kB~3(cbk2sDXg zIO0I)?t2LQJ8-H`#87|Amj|~42NPSFMcecqqqx5l`U#_BuRU4X{83S2+ajxA-swD> zN1l9NzdKZ!5-azj(W!`%JNZtvXV~VUF}B$1x7<2M;MEHa{rvA zBW~-SQv#-A4Y&9wE>XgTNIPflcgEv7ozLetyNd>O0I4K1Y%NeVJq0OungxiO8JbCW zYB#*j&4RQO(yWRqlvy@y9!qv(T_ZblVTO}tb&WU~4yFncpHHN8ldBzPy%4b>D%1C@ z$FA9Bws2&TX4aFYhiu8#i*#1MVjL*6880ru5AJTay7^V3OvNqu&RWmzR=)I}ieS!L zeq2;R7Rc&1QJQ+<<5tTQ>9Ml*tRH2d8BLA<3L@@gyoBvKMw@}#PdX{zZ4u+#CP-gF`@iI8wx zU19wMQvafeR8Fe_(QL$jMd7M5?-O7;{#3Y1P-HSIm$vwOs0&rQ$ywwIudA@?7)6qg8+ptsZn(%TR^WCu5 zx&Uk-1!hhrerxQa1nXPsqDkmDL)?B)aKb>ge5`EZ`1`_-!8jq1T!=MKDp8)Jy@mn4 zH>@_qWICaye|tb;B92$NV3O)GzloFah9BCLF zsiGm52mU0Lr~TPcsxx_|-hf}%2^h4Y4s{e4VoMLhQbB_E=^D2&P5wXTbx zQYCZ|4h_Q@bl1&&0{E_^p^$;w#W=K9{3Ct$Z{{}Y-@i!PY4bQJ30 z{bU5V2a!4-!F^UxMvjc^!z;X#AEZ%mTVyZUj0W&xT{bfle^qElzv&2 z1_Mz^GoM1oiSLocq{`QG95BjtUJuNWa=%>s$F4zPZ35|l5S!XY2QV2^HJ`GD?ld=qaF+dcolU2AeRAgf? z7duaNiv>-F7QW6`fOYUA0EP*IjY@oQ>sJm|&Kf@@Yw0O2 z&p{|tJ06Dw^;4pzJJMs*d<+-o@OX?Dod(wIK% zL7`Liv00_DTv89{;F+S)I^vThW=P2K&M=Io+XpA53J zI}-gEJ7RUld8w$D*s^75Nm7yC2|FJ}IWJ~ra}B6NW;3VK0HDGk)IKXmRP* zGRCM75k^2$m)=av+k!2_@}#JWeZQ+HCx^Kds2gVUxzu%qH{2V;dL4ln_pGZT+QGP= z^0;5hEis!ctf9A3$!6&9+x8&-{R;p|1=+0mYP0RDo`mJ{Z^e@Z%mG^oB}GNChTq@J z0s7j$zkW=p>Y^jwyx4XSPb@cWJ}%4rT!5A*{=Do_ZTmy&?Tu&D$A#@~a7XSiiEx(? zg0IKRi9ZWlk7|+HHH>69og~g`0x@bKgS^EYyYMq&4n!p$dzu7xgVJyXvN{|cA-cuA zPel-PbAe&`k}r9*3yZ5~)uIHz0%Ujs`{*s8)l+Joy_(^a8+7*F@5M%@Me3R(Z=xP~N*IqAxLRX0J!0+(g^EQ;GCSwhmi{vR^IA_+FN{?>sR! zx4$?Wv`Id!i9G5==eb6L79p0txFrr+CT9R=@L^8Mh-g}dQUn_=@!UJp`%{g}f$1}` zLR*hvm?>8j#aiUfVoUSiyhVR)h_YoMo!QxyyKtfS$BSNx@}EuYU_-R2%=k$Ub8F&u5-}rZd^RbiZr$=ayS7g0 zJAZN~W0G982NMpYHVkL>M|YTvKT}(sY3ai%Ft-+_{k&Fxu62MJ2>CktMX!l3I?Kx21&twMW&2rb;swR*T#pJ%3r~H2LVz>Dt`DxmI^{dt>(@8KYYo?P4cDV@0EyjQSX|d~AMVyiAFlUGAFet? zvnf7v{O1P=VQr|8*bd)n70x2b?JPb(HQ0 z`L#Kx9d6;0Ug;wnr*Wd@^_RDF-6hcN*WrO^oBGi@d}n)v9lGhWe{Gz0{&gY9T)+rP z%jjRIe_@00erV)9czBE*GxQFLXU0TT;Q^`xaSVAE!_q~S9B8og#JD>-b$!?6lr`mg z^*$1e8T80Hr!CiVt$wHEUGA;BsH>w7_Ih4*5|23rk9zH6 ze!-)D_riI{9+u5wfqoD@)e-E1w?g=S-jGoPqpe=;WfRAW?3&8lw`1G)sv)-$S;A-e zj#swP2>BTmFSk<3GJ=sRKeiibB)}YN7IlEJN~htC=dp0!y)3zuwK*tC?`c3 zY##%zUg)^BH1lt|$$vL9Zl0|vCpBRw_@??wROBUf66Fa7OX1`StTEc5((?yzD5D|{ zw_L0HDqx1L3c48SBG}5Q3Y_gF_&^#se@`WBhge~ksjAASTLil4FW;u54Iow0f#0;% z_TqAI4TFACa@4hv0N-P4mv&W?wN= z#eSz(V_4pqe~h#VWo2^HOsdmO4WQWjUKW7rx^64>SDZrgZyfgr=0dTalZMpf97W)FU$6j0k$u@I6W@o+mCF z&y>ALwv7q*NhC_**N9D5I(W1aR!hdPwfeZ-6Oi;lke7&VcWHG-@4uaN&Z}QM){{Kk zO?}(>kI27Jhg9+pDTSnXI>E85UYKzm z`QTS>m8Z(qcv3O$*o#X0X%}|Pvsku5V_F?RFR&j)x1!Nmm!@+;=4l}BS!nTT9;0lr z&fOjLs`x8^LYu>x71L(RbA~B{Q6d2vkp0~)zkG-4*6J1mA<9#Y8G&qGrfrb5p^yYr z8m1kVw@h)Hm+?2xW^5Lh$Tod~km2!c_o@cwH$2!Cif8@32d+p8CkBWyH*|AH)eH(f z=FBf&Un#oQX9e?e)U@}RKF+Vd#xLFM3Py3D_NV2}!UUM5bgz&Cz@6T1OU{+C9bqJ{6g`uvTR3wpqm~T>zyl|VDk~uB!cZI{vPS%AdZ(ao^ z@u1Z*3PONh%R9N$VVIzeagTJl%d>%AazvDVZqckmEt9-;ECV7h6w9y)^mAy-yG)m~ zV&#Setoub=p%zS=g1q5jh4w4j0%PpagC|)uOA>x6w(!bVfmR?*#XWOo8jNbVM@D(; zCiyCE0F3``yhj(I+&AZoE{~5R95Yj$Amd_bY>)SmXIH7UX1NpRgt$ee{fZ?ft;VsXt zI!rilbofDu@&nFE+T;r0I3ZTy3gCKJ3eeWuQ}T}$4_^U;*3SMB+q5)@AL#}GSBGg5 z3wO3cX^uqlJS(JxruY7tx~Rk1mFv-*zm!aV(MA3|q7jlwbWyk$KmK#`qDM$Bu(z_3 z;;n@Jo5YYogZk(r%LL;YYZjxgnKnwpt>YY2kd#jA?$J3$#&0qMT3$JtG$#CahOGWl zAO>F!ijR!Hj#m$_j{6L~X1LeL;6bpDJs!zBVYtwrwr6~%%COj5jDxYPyHh|Om4G`h+;y}E7&?6gRRcpkcz&$wpR5tJ zJ944TOk@dB?dVk?k;=$9HNr^DT?clNw557^E}Q0@$+sWgo^mIwBPOJef?w4WOUijJt}(3`Pg^F$?=7uA^7 zu7vI0E;%nxT%^>G75O2D40Xfz(A>_mnSCQSJBzU_^&cKTHhPX6F2&&DeFeOqmXKp7 z8479YZ5d9YoE5RcEemWaU=MSI$oU>erl9$}N14eIQ=i92%>YTtX6Q}1Va`jogxXpo z<*9}8vMfb|FGB-eEqvn=a@pIK;^IJR!CPaYT;uhHe@u(TahO^}%Nzk+&*iT&|6uMe zF6-)CO7u2Hu-8f&86X+u-M6a5iRTo>j*`Y zq4YiVJ-5ZaSva)12vooCjco}fK+b2Uw%&uVYZrE#b;osm$3^0pzvx*|&e)2<%H1=d zIIQbE_$KN~!i*I+FgywR)MdE%+?iUZ*&!#vTG+QSn0^Z4&IcPeB;q3Bx*usG=t_!8 z5~8EfzO9CqIW7Fm1%9)&Ck4$8}WRy{sdN&@#5A%8G7s0m6-_ zVwRR;G0(_bzO!Z;?SZ5xf;ep)Nw{ESYT6~|pscWHy%Z8R&# zkaGvU%YV)+UljQ23EZRT`cutG<@qa%|>-*eI59og}%fN^IqpF zz?FsGq_oOL5ux3&bPQ{=ZYa`(9u>4PM^me`F`^XJUI_729yXbj23!uXkIWpkD?;(7 z4M@ScH7F0S8S8oxr^gNUoPXcf;~9$b=1hpiA0$=vsH?h1^4U`Io9LNYOT+kG&+1q@ z0^cLu(`}<2EpmgWO$`~EMSU{g*i$=lf@6*`EIJ_;7jY90m)rad>JXM!7Sn`q^M zHYw&<#albzYgM;*ce(+B;0oLFRltnRF-~sx>rsdTUQFWiqOmq7;a33poKdf5uty=g z=CaNnb{S&Wt01>G65=&zNwSwsM$iahJR;$sL@hNLm83y<-_`{M2RCNRp`^(E5blQnYdS68I&J;z$mj9qUWx={(~gUdfh#cx^8{(--QbDfQ!+Q zY*!OAz~|FxYyhFg22_o>-QR@&Z(a$;e|RPTVR`(2kR=*=Hw0ozKtROD|6648fByPk zYRP{m_W$qJjq7e`eJu%30`;ezK?(monZPAriDJ#G)HOxI3n`vNQL)xiQprX6D3nq! zeJI3Y{s5rIJBkEzdvE&<0ae(|$Rr8qkc6+to$(uSlmdW2;$UXu;PnGfav=4H&0TXhk(>D+{Wl#nx*} zhYD4pm|20+u=lN?(4^^GNu)|muq1rwGrTZV7O!m}O~Q}c2djjxZ$M4P)HN%l;-=Iq zsA3yg9n!GhtXc$Ku#7t@b$~mhMp^k~9xrV0O*<}b@C~ZE)o;<^Z%sRPHv1t?UX%Jo zt1wyH5Kdkvg$!$$@M&@NIYNF8m}%IirkJi@;59<7vAv)oG%Sm$-^9;2K)5<7^aoWy)x3SD@25Wn6=~4YVP(kZe=R9t|R;QvZ#AC5BTe1InKtt_Q2Oy}H zBZ$oK*RW*HJUQwuRBH@$;ckF^Rj2jHJz>JJotS&<-g zJnd?QxSxtU>~e}ErCF}72BoGYaoCWZ`e$yxv9C4K`%-DKL08($cN7bbC!Q zlG|vkntIx(W}11~O6-WyL+pDyk(1Xj@?8w8!1Fn|h64JJ0cyfsV6eLDt?bU0MQxAK|`Ww2hhc3qxkPr~LJYm+uqJ++>kbzY5=C!ZZ(& z)~EuSP$;8SFr%MtlYLwhagQd0Y2@`BL;j{3>`!x%4aF(^={KoA2_a>tRJ+ZV4!~dX zDX;CFBm>PBldZIU|$u7-d)sUhIpXX^OkjYdz}Peq+e=NDNoBz4u7sPl!^8o zLuPJ2%7}SlC8sK)Heno|ST>ohT2ehJBChTt#(T*PN0Keq>{2O@*-AATi!&MX zPw=K&_0WI3H-8 zl2tCCvMMR5Oi{>$(yN1olipH=QI|klw%&_xg<;p|8z@#X%XJ5tXLO&YnA7CEK08M3 z+_}js?3QfkVXV{W*={^RZE0^0g$H42l{yE^EJLh9Bwyr50gw21eNJO`|S3p>D#uzqOW-PGE}nEp5rxpjMuIdXfwnP|u5*a-1G- zYn87VWU~E1px$P0lXX;;5Jy{K;2#yI}> zO}G3exstBDr-Rv!6B9^U@9`Y(lyu*^AjaV$EnR*3aKHuu+zS%_mi|08_YZ;gLZu^? z1-5jgz>p%_vg`=BqXoDp1(zKSTXl$NJttw|hR2F!wRVb&c5skNS>?9?2#44E#raKt z%v&XfmMw{7_1f@ZA^!BeKCX9LZ1?yaJT^QVSaY$B*bKJ_k+LPY7FapmiDto$P6}}Q z{Sr({+00kWv$E9viLso>?_|9cd;6?UuG_7$%AA}CA4LLC@auC?ezAx@?Iv#)jKt{D z0a=IEF27zSh_S?(+~lvd@Y`psnd$B#f03A1gkokfMsH~rDJN2_djR7jStLg`S8T_( zk&%*bqw@g3zPi`T?Kp`ZV9}1)x_+0F38dB@1^mrPVktZjSK_$UuWT8*(TVRSq!VAD zA>(z{mUg9Atk__=oSzLOyEB7X9%%J(CiaeSW_F5Q&suz@$u z{#HB$YE~uNf17-}=XlC!S_Gpy`l6t&)+nlykEB^sy~r%1`vAndb_Tqqo1}Mcr;+ys zpE8U?AirnYb22+5ZMIZxO5ypNF?{S6Su4ZazgFSoW8mxtLX%laj6eZvl`vdRL#K3q3Xqt(?mead6E z2X>!pdKXbhqkpB9JEcHb1#QSOHsOalprLfnA#V~m*LP(?DxlBNWU#j~1sWnZ+A%9_ zAc?Jy1on-h3#=)tF@0nbnaS`^iFIOXs}D?EE4yk{?}y-K!M8S%xi&lpo{yxv{uT5( z-i5vSOUb(t!pfTNcQ(q2wUYBFHu8^i-163lb{tqgGO~I34+)mZv*s;T>{s& z+^_VwvoCncLa9Wpz&VhFaSmA_JTbHcPmp{C^k0rjqLonfZjmy~NH+2G#NIv^c%l;I z??LebRy6<0gR>qA zxf_H%6Pc+L;d!i;f^yglIz)I1a@eYX??4a^HBdJf3JVr2*7kV5i_UO(@upEMfwNki zLU(eAY@|#a=PsrT^R8+8f_aTYZv?t!M2SY;qAqP0zeWHo?i)7+)!)nBiW#XEP`xEz z6}e4=W0Dz(53*3Z)2l(Fj7}dY>vj)s{fE64;RrY9SLnxU_s&(TR8|$8G^=FmlP570 zlzFACA=B-F$a+Afe*-bsfl4bA>DNOnzM>~-R8^tsB<%YpB={yMM51wp=5q{BI1g_m zI+t#d3{hDb95Vg(lc>t#%@^V|R}YZAf#SLv6x~5~9SVza9jF?aYlN>p)(m!dR@aQLyI}P>+ykWI{=<&Wi2}~tyKy=?$ z!ru_fk;s9<`=Sby)9rfeU^#o;K18WP_h~?cv&mgm!P?sgx+eIFNaI1TC87rT9-v+h zKtchd6;;*?B)m{MIqq5ddx6#{<6saJ{~?&nnRwaro8TWC7H&2PZI=*^Lv+K|7TC-dW#*jp*{K3S*%R@*%d}$I?jJGLL+0=>)zY9+O$?}PwoidwgQWu zf--)3t;v{I1`97Sid^9VkC2`n3lI4b)(BAsZiYKUzV}JXp$B<-$yK?1LLNvx*LO>> z|GTP=(J)3BbzhhwL0WiN?zh8l#w09pQWWIC>%Gd40mOXf+d(x*LajxWJ)N*62Z{Pc zco$oc^ezrOpyfdQ0G^<>k$e2 z%*J-&Q7tS;k9K2!FgBT6_N<(t2EIvq(!SnSZ9a5K5+ zYVH8)D4f5UzY451fEb@eh>FldFh!&JH!XjA^AUC$Q!roYLoi>>&n}FG`W)H*ZHgi5 z!CsNA;|A$aobpnBz+K5b$Pu`qunaU5Z5d0+gbOQA&BE+38fta`8*lNwctU{P|t13Br6YzgtHV~qXdessPs z^Q5JNDFz0H`T0+jN4|yyBim}N>g(BTsJHc7k^>Ou z`E!k_LGk(Jc3oSD&q?jjj~;N;1qQuj90ktMz;g*#9#s%kXb5vAU9ITkC?QYnfxet? zMdR>AyRMPQcTc=(r>|t^ey`Sl+7n%Qp{;Bzq9=txfc#xsK;n|nz&#COO4Moa1?|OdhiJP+e|!IafSIa z*kuZfQKSR;u$yn%K&GXEjE_vbkU0)bU0J_tX46C$il%FZ_ENWvmr zoi9DWmvrPKMZ7(r1Me)2b50{qSl?blKU^(BSHcb6>4A4n$T}a_JHC&!5C_C}p$ZiT z%KJVQtFRhvbImN!i>hA~`U8&A)naWc5y}>C3Qhk^q7t2)W{7BWU9tfqbKwi;%uamR zs7?eKD96zDy@%iNWE#jgGp1P)NIc3@T2_)ShKFwE@c_^BdmxOU_)a(f1C957F9eZS ze7~Fjh0>cz-u-FEXOhq_KKB;(k>K(3HR#b>FaIU~bd<38^aF%Pe|GmRxW36DqmtDy zpsu0pvDEzBMrk`4@&?EBb%i0|dI8;_sriPiaLW8+nKjSvmffg_qu8Ecr4VTo1%}GsS)8OZRMto)jtfA;eEn(bSTx)>%(ux=X%i72YRd)vMU*}i{Z?)=mCj2lVRO@s?u87iQJ;h7`>IYCHp z%L;LI%R=GH0YUx5p!|TPVzFHVvt>f=(wp~^U#;C~rm214*i9~*EDCRfRU%D3K$B9t zyp+e0OC(b}^p#W~uv5HykQ+~_0izi_m*g{+-U-PWOpijEF2P>O)dWV*crr;~lYB(+ zz$(WQM{dvXjOB%jsMb%Eri95a+Iiu0zHIRyWvx@~qHJ#^Nnt&`2P;##&1Hr!_r&nuc~ME*!{X zLSEV)B}^1jar4l8xs;lB5X!{f=&lW&{Q)@x`cC$`@hkdKYC^$x_e00pm%2b zVbC728VSMagP>|_O77Cf`UMZ=6b|K>KNtcKwjm#bzD;T}`@uf9kH);DH~bInf;@G7qHQ}D?felwr1v)@ zgNo>yA?hh!VsuzAcTVt2c+GmY`0*(4M^Sl+B_L~M;hqJ`Io5I_0a#50@R#&BEF!=5)4zpJyh10{2 z!$bu(65zMI1DKq2RTEa%l?!Z(-BK8)^HDTuYBP*&94CB@w;w8M^=iw=S%quGIJS<$0M7t&>sBhmcPoq%g5i#;EGZjv*n%!_M0y867bke4{WGJi?tX(c? zVK=6FUFeYT-lo`exB2&cEU1Pj`?lx+mK}Gdbs$Y0`FQ?n5>wk8sw#XYRgvpQITV5K z7B5ow*K7nJ#y=)4F_vGLmUNN%;0~lk5p~84h_>%1*cWTj?bx~($V5hvB$qKhL%3L$ z*f%O$xMOUP;YNJ7;QFowLusFZM-Wbah|! zMOStA+iN|`Uxi8RFMMLUpq!j6Z1E>C;vVjwzcg*Vkv7)sIk`U*KZ6oG!tVD5m5P8& zOG|^)L+5NNRz*V$?k0Di_Fafm$i1)cjZ1KN&7}qc5v4>S_eSb$PXQT29KA$x&B6M|y#pQ* zU84vb84jJ-f6jIdDBA-t|8rUt5kJPElQBBqx+bOjy_-=ymgzCQPKC!xr^r6UNLWVN zy$-;5=LL?f?gu;X{u$SKs*F@z1Z+ zRn$EPxaB{b&WZcSAOf~UqPl&1?>Jv@LBHvksd-L=aVA$0U2qQp!{ylYyVk|K?s7E~U_nf{HI&6YP>-RqOyDF~A#3#2ncz zQdEet8FE-uB^E|2jyh6KnNa*#>^Yf!zpZc8bqDCc~7mq6NCP4Y9rTd4g6Tm1i> zT_D)*Hgr8F#)3meab74yJ@+t+uPBTlGvkiG2XaOadtUf)U#xd}`N`rBb_WSyjYwUJ zkYG{&khk4U?|6-WX1)$*eve~e`@53>PC5_g9dd6nw+*zC@r?=M8IL8pj%ZbvzeV|VZLdK}LYg6Gr3pedlsgMB7JVF$#~_)SoKE({_s6__ zp25r|cbj*fuaDf+b>AQ|k-Y}Iy;unH{12e=bsaiAzqP_^VxMaqtz| z!{LB31W%ASGD`M>(9krg#CioCEBMQcX*1b?8%JUa!;@4tSTMP#*yKBZ82N-!BTm1z zMX@GgSko)`#?7vgt-&F$3KeH3LQh{yOI}G?PyaScZrn%_NLP|~IY8khWveZf(n2ewJ}JV{?0t_njZ3-qZrnUI~)hPa*x z7ak4nPt=#+5A&EB`OhQxtqDJAJ-T_h&9| z`j2L760TB0)7_;V5epbXNeIDVtN{|v3qk>M6{LqDEjl1oJn9ej7$2;bP{AagFMd^)$Wom2!nSOUU{kNa^< z*3l4lTU{is4(OFfwgxp(IaBBE!xklVp7Bo2V?hlCSnQ#s^lX2e%Nggep1t zfqe-r)}o*t%~3Y}0+GC8SotGSoTAfV;8R%w2GRqFZicfsduKD>E?dX&C}can0r$%G zUnI&L#)rre2X~sBCA*paPT5v^z0*CfB@@j7W!3$eITT1d3+kCUlr@(NXX+VC@ka0x zo!EPT#UXgzR#o#vUZ258QXqz`kDeDX)36@*r`A^l7O9WF*`n2-g3i z_y`&k_cA5M=y)QFXY%swu_#7a7=IQPQKGi+M|Fhi(y+vK>?zORO)w7$HXbsxd%@Wb z!ILK1Ixo_KrNkUXqg=Wt1sGPb2M9)c{6V?R!cOsu-8v7#IyM}O$Xlrf7-5|@f>kUB zso2>wfOd07f+*;6a9A;i5>H^6xzruGA0WU2&NAzas)n@8va*8tystpiJWSc2Ewu zkYxILR#9<_pf)u|^dmnhWP5M!?zB1^fvhR#h{s69!p>C(KWecK2NGS!5jn6ts~pt_ zR4amY4op`EFO9fx^J05htU0@bGb=Na>OBd6*qs#xtY=!Y$T!>`aLrP$AZ>Cr4J_bE*N*qy|cUh24|0rc_#uI7N54WRf zR2yT$YKdmO!LgPpr~}Dzbc<2IB6fU_5jQ|^wuz4-rLk=7p+^%D)z7U3>#V|kPsgk( z!w#CqZctWxW6+_4qg)yb-4jZUmw|Sc$J6ev0fx(OSS^nz$@__bHSBp z<{ytJF|Wjb$8N%4O|xVl6dHK4emAEkas7VA)2(D#&<#navh|`xQpIOzKhcl(qO_% zLm2rVTF)`GXb4>8y@Nq=j@(0|QMXX1oHrWtTKAkQx=i+$N@m+Wa% zqJa>Tazv|ayXbCK6LP%o)#P>D6q%x`@K7d)X*2aba<*SKuTrBr9lwMEz7pbQLu{$Z zw&pNY;QYl)oMmvC!vGCDX)9<)lSU965kM-Ny|I;dNpPidPeM~TY61xE8Cd5azaMK( z@{?7X;^?wyLKbWy4WUrIKehO1|I(Q3q%snN+=wDy}Wm<00*; z$ym_vLV7FLnSw3Yy*n|_ik-~^m8rppdtK-KT^3DtaDeCP;qaYol1yoNkHR^@Z~oq? zK|!J#3g0u0Fh&%u2?>m%`Jupkwx+uphii^6hhfAuQ>5DayFEv)~D+L z-_@DWu-|B}B`ST@S9Zm}`FuE>rUeOvGqEoqM?nvz)OW2F)OYb6tx)lDbsa7p0L9YR zqNPYp?xY*BLqr_89+BK-4GJx%!iHFAz2}{i2Mm($<=^NU z6x0^z3+XHaavjOXUk&l^B*vFYjv!-u5lI(o7|Yl6&hcg=f*L(xk#`&T(HNWE-FnZs zNfLl(&+%^yN&)pk!Fns?mg{;seh3Z4ONa?ecXfm!-C2YE;9P?-wQ?LB84HLw=W9!SkSy`iwMr`7*0{t;}4iQ3Ch1wW}=W+UZk>bBQ(@R>rCUU z2UZH4;*TjOYQJNEH4RIdnNpK9xx#$|+#1}IrCI9qPw^r&Y^CjI^XCcBhJ4lXFI^diC00 z&$PbDwKi$EX=5Fn^huXd1}-aRcB$F8XpNJ`Oi$u_OTa1_^;e1m-22C* ztZzuMPZrXB3QsX{cE=wej=K@5a7jaBOdq^opHl$U$8EmWdYNyZ??S9(A~&x|_>_u5 z=J)P`pKh8#ja^y#{(&XhS-zmh%R3*^oZU#!9$Qo2aL4++w>uwDncs+0c745&e^|Y% zZJt&+CS>Ngk+RL~zkY#swkAdp`5ThrsUV5~C{K6Iw`$vv+He<*`c39F^4NHua z4594z7%DRgr+Ey^qhl?6E32 zoy6|G;BJ$j?|pRJe_>4d2Hl&>GvCH`qZK-4c~M@+S6knO>Liy1y&7QKK{^vJOnyZUq$ z{UQzjC8K#WJ%#KBX#Ay3uTq1N*{5}%^6QB^(Ch+In63q91qP%GQ&N|hOM*m*M|l`a zaQAXp;x`-q$SlpKCKC@uhGYLbo9fCN@=B4$NT#MMeqE9pJM65KGBvL2QC_;_s#%P4 zXT0>#+pSlH56-ic83P2cOEaI=s^Cp)Xy~{9vO}G3`Lew?vYkLq2Wi!W^7EP+@zBCF z?fJ1ePXI}ls)lFSgB^hNeU8^hW_Vz+NXN%dFE`>;=H!#Z4H)<0XQptRJeN%Zgvk3Y zH|)<{fk+4Q=giLurD&}d`d)le9&>uYn8l!VK1uBR`o1XqE^ogRl}Ftq5qZ4kJe>c* zb*@yV@Q1&gCiPYExB^F}g=4@vpCiY>a^IAXDd%l!ITlg`5jCG`{XW1aztKgqaPY5c zq(=|ao`ew7+*FRM9am9E?u)fuB>@d}UAdRzB%bB46xt*nnzO09jW+`mb&OWsg{=pT ztgK~RqR%x6)6slY`sJYD{vl+VCe}Da)2`5CoNl_mlj=IM=yY-f$}c)DO>yBmC6nYM zJAs6gbHg9(g3&)&Ok$41h^cYd?6#1iu?-%l(z_)+8M60j=)Q3#_1PL>p>=w2-+pPk zhq|d!U0R-(G?BToK86*ttq~Kk-fgE47Z{8jWUzf?3sU+VY`Kn!X7l+-_nU#Gy~Mv? zrGy8p5}E5p-A&jhITOd3g|xrvrrT5}mw`oAVAW}n9C;CV<0(bjC2e&8r8NiVwRECS zUc!8^qy0!?EX>^m_|d{*PlTbtgTI_aOc-0C9kSeYuxKZPkxyPg37FClUPe|9s@eEEf}~cu5V9w?C2)2o&xgBEHnd5G~y%Sney{l5y+l1;?JfC=xIY zRt%+nXNE@P6u&qS2rzDoXX`!)r!eO5xz09J+b#|E?#}%a0m%E#G~7%DD2J97yB{gB zV`+6zOFA(D`CLgnPy28@U>MCzrZe>>5a+<9ieNT()uex?*MyYMw0Ex1j*i4FfT<4+%!pFahC#}61iBp8dL{FGaNb4DOpZ2 zPWDV~`!Rd9-Hj0C-OJ|k>)-4e59CyxeuRG)uQFM0eaxQ|Qf-v>>FOA|r3Tcb6ar|3 zD2iX)1aflii+sruT&2EJL4B8Fy{s5({ojLKc-<}|O9V*D&}m$@_RjLU_SJuuDi`Nc5V?h^&wi(oKqfP`JlG*?-8GgN}elS7}^!6aUUX0Zzx{kr?h4h z?q;*foH5AYCtRAkbwhF?H6cy>rsKkbq8E(!L`h|C37ol@uW8sY5ds+7IzDq|u7?@& z7s8DpU~OrVK*Wj@8tX~t0Y3%fPstzPeN_PO{Y1+7^*6(RXvkKM1Z-#vwg@5J_h*Z$DZb}4^U=EPK68L- zAGv11Zn|TW2enzTLdsp#33RRaDb4cF;J6(kbx9bXKCf5UJM^Y;`7_u0Vm3fdu}Yu8 ztHoV{imgw`hp{bncjQf``R^z$s@8Vx?phkWmQYorHbdiQGwru$$d7mMFYq=q(?@lu zH75m6!r5$*HP#xwSj%anH#bKO&zO__(E!FhhfA(TaaA!)bQCNQn=*0yxnB&cDW)B5iy7gS1m}lP0`#{YhBP zrqj}M)}zXQawB=N9N3?_*pesZEJz(g+_ ze3XA@*SSlt7@XC|X99`>O@A6aPKNo4?*7QA(W+VR1o%84JTOY zbE-C9%um-5yq@*`H|-0k$G-$&@_?Z~d8^CE*w0oy$e1$HH_;FNvM)xa6RE&Z&R3Tt zf2^7VEg!acH0YmYT@E>t@ISwoy z8%Z2?1ed^w13}Y9tJa1wBWG8UJXb z*gSA_ALx8|*OP&vx)_UnR^%;9*ZjQV= z@4NW9of(t`E7#Y5o;U5gG_=vjI}=kfOg>i1u7=MNU(Qj` zo@gn!m)Q^MM7Jbhogpm>5;~;?R6-}?TfhUST50Vr(}dIK8l8o^NM>1Q+>)3VN#YU( z=90Jx0RK5agq1QnC0bUBR+?hA!O=)bQI2v@(n-$LApC<`W*-|a$|!t;wiQt*fBh@f zNBKJSthwi!v)TvviHGtT%@h68{*CXnYR(>9f-AOmOKhI+CfbO}aK{xA$|t0nwAlP6 zft1Z@8$g_#;NwT|?4rmAi*&4^+s(JQj$;Kp)tx``$&Q5HB_0ocxbgUUPi7*dV z5%*Q}<=oiJLE5p5zNmbKa2+Dhp$zob58{%9H6jw}=sBX`(yY7TQd4dKpDcEtAd|GN zcs=|w?!puGNYeuBsBd3?Kyvx2TEt&65pKsYemoUBf%v;4=2O(d(k?Q$?=b=;YYMkq zpiBj*oh~9xmy#J+r}rYRk#dy-``=$e&M(*?ro~N^BtyApKgAbwlz1url)s?vLCaBh z!U`G6uAx5uSYyXIMT6)Lh_fq{rBRKD8DSHXV|CT~6=KX*48R2M!pVPz9@QDbHWX8( z(nc?*wRdf}41?GxFe=I8C&@8ZK{0s!7}Bd06MB?h%d9N91FXP46o{{Y&=@EL$!3hn zbi<5<$ST1Vwepu(lx$ryv{hJbd zr3l=u&`=8y!LT2E)3QMhrp6`NMPd&HV%r#A;Z#NN8cKDH%&A}b4ClW2)r|Uqu{`pK z?{yqLMR||x7)y+fa^nF$sHGa0P(%we4FAR%_fP61u(`uMd{Ufz+Ic38^1)fcVXzE2 zNmEnS9YC5+QL=PHI-aD}%lDOtMXP>GWxc#)2PfE;@@?B%6|Ot*D&>Wq?235@m(92p zn(FI`(13m4et7jjwF~lqVBQN{hU&u4n`p60r;jZcBu2{MUrg8J(R9ecLzh%L75CnDc zY#8~uHJhNFKgnVC2Uf^6A=?NHrv!ez^(lDpAcc^ev_%a^hg7Y{RL{V2v8~rGXFe{(js3v* zC9wtQG-!mmhf^OYETL>h^H@1i#CUzV&}QBcZ*H6ma%mH5yO@h=TCh?#g)41?Wxo6! zmiNZ(d3+HXu!;=bK(zYvUGdetj$#m+!R2_~`qT*ZsgC+xBg#7}HGK88?x-QHTK%-5 znp0?L2@hvutvV?Z=PxJAxSS2cO-N_=`cpTRh0n#{^tr$+b7L_>flHYVMtiNLvYIpz zZ%(V@+u8VZ0%+mje99E8{{4riN+4O*XPT;sKB`2OQi1;*Ni}hVi&bBe`BgeUDtoLq z{R`8}BIDP%;y?nPQ67p7Av`Ohb#mE1@Q8 zpqFoSz9?p(a~nD|Xsm19tR%j0Z9CweC4fPNf@XFF&z>Jn)L=Ipnr7x;zljkl9Xyj* zfxNRd9)35_g98m`66>>i`Tf1bPd;Woj~)TRfU>Hk2if5(u?NEd4U^lH9(y>dUvF@I;tY-Pn4*z@Gwzg?FdOF(Mp1!rB~0NFf1MruO0+K zQ0#;L=2Cy6HX@*55cA2tQ(e`@q4CW7W%H}SN6brfvVU=}&p}%|MxumgfIvF%kS0g( zj+KxJtB846sAp$uscc9kHgbE-%lDt1N$9<;po93?zcE*I^=@TUirdHd*N?)aQ6QCl zEK1sHo^6Jk4PWvyOjwu^nAQ;$5WtepoWxcSIlZ zCmb?eAZR_CK)#q=|1+fbGk_``Ai1FCE<*7_5jml#Y(3)V}7{=%*#A44&i90Gont?_~m|&pZ>UTiQlWwryYT z+*i=E_m+-@I-<>g=5lm*`tj=+{`MAYwwDl%#=?X6=65)Tm z^MOh*Yqh8(lKs+){Q$I`WKg+_1`@+ugs@rS&~4Fj-l4`)p|WQJ&DfXhfTG_YiR5lm z&I){YIJA0qEr>}_c+(NH+kN6lzBQP%tuR_l9wP3daPFeO`)5U`?(<9{v71o)T8_(q z;A&Bj;#3EOBR0G?$T|3iHA_C*iHrv_!E(b;&`VmB!>uXB552=x-1B z96|xF(wav`vJw`Z<0U{j617S>v`DxMJ$E3#G5VV(MVhd0zFqU30pVW~D!;uD3TzfY zTFWP~X)QM@WTDWmfI-RyJM_cvAYCe4uMen`{f8oj0B3I!@xq|s0hg3&Xz-0$bF z=+-e2e5m^2-=ioF|U@kB`A;k_CBJVlfyMCQo-Uh`<3df z`AhIh*`UWam_<9OG{!T8WsbE>=FqLf%=J;J@x$kIGDKacxt(w&Ro>3Hasrc#rRIly zcXi`B8vK4Vm>DqVpZLq>SHK}Pw8u}#tomCdGeK8aDj)B>CH_bWOsZBAFXN&XB}e{| zg*5#$+E4n-oKq)gf?x(y>rJY`rOh67`uc6Dv<9y^$y5a_U^yT9P~?!UN3(q|C&n3( z0G9vc0tstR!(!_@@4sh3&1c3xcj{}45UlUdNsdG3>joLo#I8FP+JP~YM2)FS(Q)}k zY6t83$N=x}lw+Mp=u$3N%dk}JZ5r5+1cWnQ!BNaC12Gf=x}HvdW#_*ZZ4t;q{N zR|8U$Ph>I&n!{~urSrTKW*DjDMRldODRp1aX(wka#MQM_4qGQx*^LCxi|b=H(uk+5 z6|aDGtI18t9#7E%pzwXgoh!-mii!aH@OTh$y0nF59hE7ie@QileAXW*F0v`s6|~7? z&HIp$4wBn$vRUc##GHj#{D$cp2P_W=Eto7@)1nYz7Azw?`49(5Jb_-YtyDLtE7;DH z>k*|Ak8|aMnv3YP`wSLxNWp_ESpufgu0C-Le}yf*?!pC|v5{98hWcH{1(*qQwb`Rx zuadb6nzfIjvTb1nbeadEi+BX6xH&4@DMs6lun1+|N_U4I=$DEinXt9n^mmZTQBSW3 zoa62#LN4Z_y9Hy{jiLJpJW8&c0NL*scmn;sDJ+j#Cy;hUU`^@aW)zo*0w^7ARuacj z>@s0nF&>*6na5YPZNJp2ws7-gBrvHzj6lCRHN@9jXpzy8sryV#)nwY*N|dRwrTUHI zmh!bfe{RfH=kY;$-e$+y zlQ2I(cOKavhX(9dkLd%Z+48_=^vqG{c7J$=8US1W71Rz-)knYhPdc2ebp2Y+jsVI( zfhsxFT)Iz>&sF*k^8Mi)0a@ET1V{ez^@q6RmwrIwkjgbgH#(e*y@xL)PmVdGiw^4> zL_BehfqwxC^GKeGTi_CBGUki$dKA;|qIfnyt-Zo-#T2oDA@{{gK{k zXOg>91y@$9n{7NHCkYRMnO=MPGHPKDcXx%fl4yNc7>}qh5ffRAv2<6KYuqvl)-9S+ zO@bc`AVhLiGyfzEUF-)k6iOk7*a*JpyCIS_or7P? zj3yv6%Mri}?euu4K5e4k<#k(mFD?0ElGu-@H2Y2D{|lo_tyB=>fQalhr{~oIh*y#x zi62%vt-0KAn3VZPq{S`%aI0RqZ6D{cU@CHev;xb@)k*PR<_{VvEpqA1H8zVQ6G$U`%ATbdWnby;gP{UOkKf~r3(hO$`B#z zltfgJ5Q>)s44pxASc^O8eSmwAfJL+hCDGw9*+0)lct$tb-he|?hSyLO_PjXh2B;0M z9kp9zp;F6B#BlW1b-L%;MWv7I!=eeX#QrueA@VC)Kzx(mNg@UYc}}?U*95sJL-S+C zjFNF;t}y?C3P^qwUB*Kr3u*ffdgm=fjxipQl5tLlhF0B; zAiH__51LIs;SU=Rvt+|H*Tf&j?H{?4o%c@GfS+eAV|NVU<)XjQ?7&~bRe*9bVWNGK zg2;wMpD-!VY#x71usw0AtGtR1DJdjA4@iUwoZAEC(BFBp`=AWt>}sNZZ|4AgDQ)t- zn-O{4eg#Ss(+DyeG=YOUBhkX}qAEcn6%NOD$qwKhT-pa>sF#`tcvt{!7960%vT^Ri zpO%w4&74ck`%S=CxXYp(A_+8c!zrDnU4(P}04`KExjRC_5Z-=Cl4iJm(itU)0OpYl z>wLw_YL^)E8MZOCaRPIU7R(3=~%+-anp{3D2=6OdFVs&b2%N-Bfm^Dh%~VN*DV zDaCW4G56F;Rqw9M(WqN7+z$REc2Xy4BW6fO^|}HdYi^YHYN@7Cjl53yA;`;3nW%fE zzX%nE*8uMeJ|8a6vP^`e2IND@1{3Jt%_vQfuF`q4pOC5YtxR>h3Am&(z%_nv2TrGk z8R}J1cBgi&c6EOTT4po2$2R44;^5sVIwlGh=TGMrWe+Lh5hW30syK2*+(S#K{L5Nd z$}ogOil4G0w|-_VahkO1v{{Q_mCBCG1h;?bz#xaO=!Y0L8L-&)C4F5qyp&y~qLnat z+uK#_nma-Q5>bD7tub`{@;tL)o-A}@*gWEsNEB8p`W^+e8Jvr#z5=DP|1{{>bRdeV zeGQoJtl7nfK^#M5BKL4jVoFB}cAf0Qm#k;!d_Khbs=grCWO@C@DaLVkl2E}o+oM=2 z3`*$;C)29*u3BEIBSX7V5A&e$Lm(TQBpq5|nB5#)w@Dw5{9(&(ne?amV9+)R&(;QV zi034RNk>QDsvbMQMx0XOr zU}LOJhcyf_o^l!ek>n?k5vk`d5moYp$qo^JIBcSdzZy8EsV+)wW)gh<0Z)4FEZ2(B ziR)IOpgF}8d?rPMwKXz6+|GVlb8l73uNbU;V{-DgIm+5PPcF4`UB<^i!M8)LOr$bzUS5rfDf_(As8y8=DnrGkiHn=0HH%MA+ecRHyw1ueqvHg z9JWgC0xG8ry|1CyoNPfo*aR5~`4m`kDqv!eO3*)SlDl^NRI*Q9o|ffka!gl7ats={ za1&dx_8X0eLKX^7#Axym7z4#GoW;3Y0&Q+7=fBpcEA1AiS>1-xRXz7~{JVf)cN01;um4fexs|O#`mRg{JjV+gcXLS4_?aDHRCp?6YmFB$m$CRrOhM&{ch!FV&mnWjc+)FV} zc8VW?0tSQ};-3A)MMM6T3WntcqPL?9sb3X$=ov99R&o$lAQo#sKRG~tAO;L7G=eDm zg8!}~PGxN5Xl~&QE|Mh1_C@>TKbz#C5x`9(DtcRNe=Z<-ovr;a7qyg=l9f6IoG=nR zFcp9L=LnG_i#uXkK#|@47GG|NFI40%h42BOyEfj0_TDSqRI1RcM4V%0x<~wNhm@ER z6w}cDk$3==r6`5>sHA99)69PUi}&DynlGOCIazdft#TcH@vUv$t?OPA{Dl`Z0`YUS z;SLYqz$1!#ml} zT?TV;L@>WwfwBk%t;qaD+a0nxuote1(*%#5d08rdH`)cg=rKHGr0t>OtoTEBcfqgP zn8G5INqv;DX~aFWOLU7V_x-+nJJxvWA!?B1wzDzs)yvdq|7PfDH~I)ZBR_SrKVuRr z9WOK^zvt*fSn#e`yY5c=anyP%js<#b`d8{r$)msg3-n_OF6HLAJapIL=1ri#SHLUs z(;M_BZ^BF-eT!`wZ7@lGI#VoF7+y0ou5$h6o{(AHV(7mmRQ@t$lJX%R7vknhlP#};Q(=kSVe^@dtVGn}M;sSN# z0`-x#)K|nxd|l~4Si*&$C9>A9jf~z;I!#Lb>;(WRTy48&fnGA~1TYdCRl@}yi%TF` z7$~O0^fdIzXrVE$s(i~A`b8r&SCPh5MvpHf(X;J0xfA1G!bt0_u zeTo358SJ1DtWok~{*phK9N?jssU%`;#C9O%q@V1|@);F;e@U#scEAlAD)&Z=Vj>fc zeuqLM+Pl#c23+4z3y2Z%Dd&;;IPNTWw;ygCJ1=eO#z`In1#*(1&c?(>`!)Gq5AOr* z7*(Mu!*K9O9DHbua1mc{R`C?tYUbCD0za(9JzXp|mo?S}MSYqHoA@S*uzVpcz^nbt z-}x7mu}AOU=HYu@G2o%9hcRN zxn<{ber&Oh?(O$xDZ?~1Y|o1oy;hc|Ls$)YV8DFZiyx+WwoYaVzS>{= zfO!m=5RE|;r4$};$1ag~5y2)X=aV>%me;&eymSw6ZgIsYtwSq4q53nsU19Zw5g6W4 zn|^N?g1#}2dlf$usCIk$TpBU_Z}h20OyHgnql%vD%5;pi;=lf-FQ%sJDbS=Q*(AIZ zn;UY=4%{!uqq7XJ}8A_=5sQ(qG6?Dz=31 zJ!eW5vqSE|G84#a?FkmfTXkMS-ZBch)lbucO;0API;cZyAMb(fpbb?@2ydXGX73KF zYjZ!yC1mMSsk~j_6NA=pXQrO}CGwY?nP!W=Wn38hy6|CV!3HMto~a~<@YI?d4F*?Z z0k#O(Z{6@=+sjcII+Zgs1Ef(ITn}B6IQ$-ZAh8e-17m>vkBWGZuQo5QodlRUc!;im zzlLCtK_LJE*uKry)IIM+Yc%{-O}cmJxHmw)b9`_?tMq#g zZ>eJ0DNz+gJJH77SjmXk3?=?o#ccNMpZW(>FGfQNL-ei?vv~W^lT>V0+nFrvFR0mj z5)2*3H}&y*79Oj+Ca1LT?vo@rXi9^Vu`cVu6bZG)N>SDde!%09*${h5CBhjHRCP&^k3b`HJ-K03?}CZU|r^xwc)yyFsuvURq%ze8XMj8f>62DPAc6t`IFxk{)^93-avJ90$h0yi131K!u-4x}kFQK=ax(AJEHlVN&q+RKFzY=8VGlh@ zoq}VRL8%a+2lRvv4aC(+e<0n$?#5ux#Tmm@`?GDN79Aj)u83MvCrJ&6cl$oDUa(&5 zos9W{{WrvuHQ7K`sC^*B>L0u_a_pAgUg#&P~Xpyz)gInj>~54pV_mDs>hcufVt zq69BM1_tQ`NrU}KG!ka*C`3>tv4uWZ@|GDfq(Uve47!VLH z)c=(tYGmhV!uX#{9#o&SCDX*@Z~nUE%yM2kb#CL4{h0t7#RdyIp+Dk`n~uX4ISK|& z7J-^~LCcfWG=8ORvL{*>C)qp@faS-r1L_76bOb7Bs9YfwCgxJ9QTzKS)2ZS@s*QE7 zva~Sfn(z6WXPfJIY3#%6k;(UaeR|mrim;FKcEooIj#JxDaGE>=|CJDN+Eg`f&?4 zaxY@_60t_^uRt*v+dfuAUTdv@ogeal0=50ADn)7$rtS6NDGqI5)HGT(sILWU;d*t| zw&-cDh3s>Zq#Jb_>Rf~*FE}11ETiYx64N%%Mfn&Z3~2i~TV`q{M2ywia~|^5v=44H zU(R0mDPg`NNFh1V?1y&vKsm99yWz^jcMM)R0(edq{L|5@aorz{5GlbZaWhF^xOry< zzYwO_z@Ft2xYHMe_dN=24U2F*m*sxW=JA>vP8?;Wvh}8cR+w>rUMNilscMC@QCd2i z=aXb0o~587p6ZCjYrb?Il0vKaoidSo4`qNn4HIb(4&c!;r8DBNNRGm!q^# zML?Ig3oa`OHTsSvPO+c*wrvtuWLmL?R0P^SA4v0k`v5c#fb$mH8z zJhQKZwqfiHv{RqliU8}FHRYB(%0LJ~fxcAW>#}Vxo z@6F{<$c;bXPDB5W^^1xf5_u~Gi(xx4uZ=LCF{8B02V@}LKfF?mIAriZJlz2Dhx8vF3c|65CZYZJJ9kNabP>Knn2zGBc;)#JPwt z&fhWshSX0|OY-o^)6($YIHh9uROSG9n5|=z;Scl7^B$KnJl1AMf>795jZ139ui9y- zgT0)r+z>}5_^i^9^)_IoQatF|dzgw;gzVL%rx=o7r{96(O%SxOTsJz$jBpz%uH`yc z13yZq=!vgUVV(gf5024cqdn82s}Ogf;Wcr@9E|<3B>01LgeJ|=f5v)i(E;#`PuP;b`B)5X#jk6^=l>LTZr--EIG>w6pGC=ou2St*_ zRXuFcS~GicGmVI0V0E}i`&q}_jkT9*4< z9f4U_Jn3X1w6T~xP$AqUrbAmz>5(Qa?-;8F6}X`p4)D@6;DzkB3j{3txjyJt#?$eb zJ4JUU&!cQg$Y}IBxT5YJXU4nSpGIxWO^S={cJ-pj-?JC!aZ-o)E>`w%aCOkhZ)AGx zHJ1U*sQFlWK|?tIPi5yG4^{rg@#C5@MWINgi-e(ZX=w;aQEoH2CJkXGxeYOdD95!> z@sn$4h^Qsm{cUKIQj%*C5x)p!N83iy{vu_+hi2xSS=rZqy}qwAUa#|cpXd8L&w1wg zoS&*yX5m=*@%7Q!XK#!UJ<20<1Z~$`BU1!mgO=Fx zQ$pni)490`dN`A2@(bV1Ve6%?vTQO|49c5pUVf1fd%-{_vrm>GdoDjOx1hdw@A=Hc z%)XCt;~Ub&)x6KX?i8G+NY=;)uas$^;SL5KTQsWf<+|U`tGBf+8-IDSp{eb^W~TcU zbEdVjowIzTlDA*zvLDx%inPxQmGKV@$a%wPTp_8ZTm_4VYZ#^CHqB(;w>(m8+47QH zsAd$SY_mnvrsfIGc8_)Z8*gEpB#EY@DSUs^@qM?=B9rLNA<~w&991e_uN#pwOm@6u z&-j4b_Go33&t!PJe(WlVgt~`)3T2jWs>0Lirf9O&aZ_?6B~ne0OTneP6QO4=DG5KS zP}*2rwlbBH>Q*+Kc%*nSSv2d~klE_(FFhOI%VvdDL;NW!TiSjA$2N6xGkD@@wT8O; zepqQLN{LkVn)WfFH0qMc`-}$-9~sT6Y15$(O>Vsum+f*7o8C|wgx8$>F}mWn&i@2O zJ1f5Vyy54LvfD-yAF31mrGFDj^!jwKaG9a#*lSw~vrqXpIp^Gg$2J2WO?6c%O+lZd z4tI#kwXbfVNd7?W4lgh6dbVzysU{vVpm&_F^|0hwb^VRUUL4jZT0^`HtLK~PZ@=LgyfGH)cp!4?r1|~W1~@v$XQF1pfpAY=R(DJm zyHtFE%5*0m1O*E~5a_eGOC_7ltvSZ}9=%r$SN$0;GLaSB66+F0YRPi3=#>}BE_Jtb zU2#2)dfH!f=1XzMi0gzJzp#07SlFu+y9-ZTYexw2wfF4R@a}c1*V_73UrVSMY8rPV zem>ahU->Tkez%wL-Pi|7+Jbm3b&>MzT4dRY+%M~{$k6=aFTOn5Gw4))>iX!ji}iu( zqwO0WETKo$Gj@voGQ`NZ>(g~3G+{46qFZ>8c24TcEfIa|zL@-(Hb^$u9QQw)vHHgJ zCVbTO-PS>*Iz7BL(W`=dGr5rSS`Pf7d-OsVb1N))8c1&h{AnCmZon{VkANqS3U_zRyhZJtWKu_QU-%hug-A$M?J zFG8iA#`$KZ7GkuU+NTH4O{I&MCSJ(yD632vdJtv3V_SyCpEVRGZN*w$g;d`>>cuBI zG+bb9$6_0)u%}Hwm^x1F*8h-sJng(=XNjC-j}gK9K)d3J((TJ-D@|%f86L#RU;DLH z;`aA3{g?T^+1%W#73=Pk|JAcfFUDl^#k73-KB1Bm`(8PDrCuu3(wuNp5L17qIAUaf5j~sZ~|jDzt9$5bEj(r?c%<9{2@iNDxfq1qGa2mEr5> z>`e=zc_T&x$}rk)M0tAn@sZs?VFo6~ZhzXbKo5V~?B%5z4VOi%#|gECkJjcX8<&tj z^>|v52y}&zh6%^zg75IM4ryneE9Yw2?s~a;k&x^7kZh_t1Duw9L%TGaV z;p3MSK`V_^%60F)-PK1tXt~EUXEfotR$;TC4`Fmd<=~Js&JqPh!q@ zY%vpV{U%2CLj*UU0N}x`SUqxaV%czV{6+|xybeL)Y%w^pV5ZRA#b@;l4<8zjx|r-_ zp{ws8{<|Cmjh&gR7Hj|$KA?zF`}k6U-~WDby^OIwzeNyKu^NJa{hYyq{r95ee*V6m zG&jaP07L<5^6Wqy${s9Of{X%u$A3uF>&2ECGVu_!fdN5EY&keGVG}HYyDy$w4R(i# z4hw=UeJ;7%17M=TRKZ}khG7ijVmU@GOg=1WE@!b6f~M9(5U`swnDD^&$ZY>D3@++_ zf5-?B8wwx@1dlVA@bUQXm^_;m3sbM~f7UkuAr1zat;}H}{)KLShx#p77v^pw6x~t< z1&R*l77RD8dXDSt{I7glYD%$aDyefd1Wy=D)?x2NCOmm(4(j1c@Cl&NsQ-|QAU>SI zgx%{oVyeqOr7=H}!*Av|UynfhMlN}ww^ zHyq5(80`dCi}oe5goR@x1b!~W9iSq?#Kt`H5yul~Bxh+0bA<_&6>fle5=;d!*@Fr1 zZJ3ukyX1wLjLM?!;Uy4c1xo%FHV_<{@aX)^x$rLxEmWwJ(F6tUt_HR&vf$O7bB2Oq z%&y4+zUbnC)MUgAb~v$RF^t8PbDW0F2PCG}FLI`i0!S2?*cwrW0sN~Q1hI@}M~PPf z-!}3f%dm-hcx2A9Z?E;4eF%p&3<8EFWuAVw(*Tr2Cq9gx3E%z$qn~{h5LVCY8RXlY zJy@^`CFUzix${Kz!wfJW3f+E36rW;K z0l1+Bz>C!oFL|oQ4OBCuNzA{!H6sA0(^HEcMTqN>D|LZgN|)S=8wxD`yXUjivEM^t zu>6B$Z(_K3IA(AWb=-R3%8!2<3r@}P%-iwlO)=Rkvi{&IoDL3H(x?4JHNz{d@$)!y zmk8y{1*!RwA?#;Fgw9iIbB8SL7ol$q#dYX4%VD#b?B*|>E89;tUB{67zi1dz^rbP= z=V}VTfPi>VfPj$y4;n*T2V;6eYey?{gZ}_ct7+P9vZ4B{))HJmN>&!EgzJNiaO;V+ z>i4a{sx_weA)1A|G|3h5EnF|;|9XdFNG8!trWy=B>1od-@4n9<9p_O{)1e+P*{ND- zs?bA84ppoak|@%n#W$&$>qDFpj4cFEHZi!$Ds+@zMr zsCek^w$x1dUDPI1C?wPGY6%th3@-pN-3seirD4`ZJJO978y;*5#-CV6%}tD7)UOs z-r`+k?A(L1s~Lwv5$l46{K6=r;2nXq%!{KX+#)9heFt|iN+NFXt?brQcYMdZ=vEHhvxwyfW5!B%O*)vnN>%>dOG-@&dHdNoO}d zTzY}p6fU|^iKr!f1S$nEfK2Qud`aECrgnD7T}Sml4p#dyc^247$YC5 z-_#z<b#a+!5&BZ%|ujDHZWUw7BX_GYR z$DaJyt&tU+Hyh@4Exfk5O=Z{lE+dBmv62r%R-`8#j(?NCP|n0fkT15WqYQY(`7p-y zz+(Ng8Xz}HzgHrr;g#m_1LXX6bgnoo<$ewd83uv%#?sx=2QXQzQVX4S*88k%bR_(~ zdL5*^XX%JBzO+W+$}d4GLf%9{=LlnHu*&dQR8=r*uX(H(6r(W2Qw~p)gQ1w;-{9K) zvP?335HI?XOl*?8iDM2S#z7ahJsL{A6v>G|%GCXjb7m`xgL?WN_}-TH?<1J7v{oNC z7oI$+a)j{*xcy9&te%diOMR#9K^VC;197vi5MYPPZJ=36Ir6T!ibTvH>YDZNhrX_D zBW4%Z6_;Yj7k%=MlGE2WGe)Q4tX=apwkC^nd`QF7-Gx#|Cat6nY64PePzmSkvi%OC ze~r{ui_^0uH;S0k)Jo-YBIr!Cnea;CYRQm-ta)%jK7BO%Q-cLHH!tne^UPw@XAqx}y*bJm{3M-Tx4z1IK%A^!i2=45Vd{2!lP^O(DC ziX`lQQ~zC9L@}3V>61jxJ!aRL6wit#^C33w3RjH{7)uGl1mggr$oQ%2^{%Wya5^O5 z$8$N+I}!uysI0uasJO8FTxT=93Vr2m>}~CwZ8_h}G;4|a&fH959g$wK-wH(Megw&h za_2a?TEZWdANV%9h+SV_`y+rn&<#|!u zI-9q@3jL>`9%D}OB=k`4A8_B(vn1+4;Uz`Lf)DCHE??J=m#eSmbI(vb%QNd|(LtWS zb{bQ~_-}*e2B3FOh&>1zRhKO4*!2)ka6RpKZU=0+-(N4!pYye+wj!suJ74U6aHiJu zG2O<8hOTp*92YOKF&jWto=cZ5F-NI7rM?_zmGq&aGNqm*Jx`F3q8&4NmmS`!UG5`P zyn+0tc5Vc~xE!LQJYOQZ9yYgir9HS#*)hbuxGq^by{pN(5Ri~da~Cc#c~KD89oznn zc?`~6+NXMXc6OaStIkS_Hnp3)c23Pa9=UF z;tIBZE#aX{(@GyXgdWHq%?C?9Bu!T1^lVMS!O?q9`wu?j-57tst{Q=F88Lp4B)jiI z*g*gr((IX}W9tmMOr6`X?eKcrVx=ySidoCCc#Rfv;PF_+NcszM zYwLU+HosNxw8*zL&l?R?Oox4Fb z7i{IozuYH{N!j$KU)H#y_Ox==(pyAx0#-6y+Za4%MlHo0G z94aMl6cY`PnlnD_50dmQrup4;a9-5w;m>ym$RZxGrPZyd=&!%T0V&RE()<1dY-1+_j2#8`pk1u%JO zAhbKb4lg&pW?^Q)#fioV50ruW0n&O+5#Q9f>4+)#0ZPG?Kv2f!dcF7{1em3Wh_D)} zd?{xc;>m{Ge9xJ6L!N2?e^LRV-BC_L_tci zSX{4T&C85+pjg84EO(3!4pGi55=Pd7(^E^h;r%5YKj_xTq2Z0Y`+f!ZNJK*^)j&^% z*~bx=dr3RC1?;NP@XYGX$gt7nO!NjzkzuKZI8H#62|7mwdh}95-n1o}{LGkRqPk-W zDUtbbig5M_HVW6djlnVnYyI?U{r@#mh<{P<#qkmPn{Wo^>t782VEmUjjXb(tABY!! z4XqftIH*eMxkcek0>4}#AqN*UVSe{hr});hC%>=bH?VAR@He(k#Nk|IxiGzPbRUmM z55B8;G5x#;Qbx2 z^SHE#ECOCwQu6M8Ks^_Inqy0wumQC9YTtuLt}{iBF0gYxvFRgL$E@Emy^uDljQqty zl8;@`l&vS3Rbu@n}j$^}@*EIo_|OU@`G zyeK+Is>bhJTo@s%yoCkElHU?TUJvyO!aAbUql??Suf<$cHGiYEpJl9wUY$tcWJ>{z zGp%T>w@OSu4n5{9s2kl-)*H`#ZLPZ$A);9~(HxpA1};SsT>klyfchEEVwn>!+-rK0GI`rb8u(4>NxmtY^EZD@>aWO6!U*J<&(8&XLj$`1`th}1O-lIW- ze4c?G8}gi><54xy0Q!sl?)8=Hwqq;vl~d@pPG|3O6BU{{k$}m4=VEZLCuc>K6@r13 zRrMm8HP&$Ja2cU@SgA$t-0m(K@}|{25i)iJWoT{qFd!_Ny3AkADkeyhY2%tzdj2i= zYiVyMVIJ?PH%BXML}KWGdOY~BO_TQ61FtZH)%jCFGkxjK*)2)E>GTTpH1}pY0^$4S zhhN*IZJ^5KRuabSYVU{YV{ZkoH2?*N@j$M{*QmZ=UKxTbN&#HNiHcNKSMAzp*sLY^ zaHZ#P06`IUU4wVPcu0+r2I(s0@L(3D-v?%_h!?W275+yRScPKLAA{;T(>f(S+ifzI)&*zU@Qw9((0yVbVPAd$MWXJoH8L_%a-SE|Z;TcUQ{Auh zzVD3X zAL^%GlBZ7>WYe(Kme6CX{8Y-2^=(;wnA<|jte9ZU9`fB!h|9$j3u0UOBPxfHiixSN zGL3z#%K%BBRzgnQoHzKCgf@Ev$@+!4^h=KGIE3Mp>#w-#a~_O_IBwE0Kq(>NGDlsU zJib;-&PJrfSZRe$GQ-bI{vnWW94t%>$}S9Hlxf_+M4={}gno>x2uxtXpv!v^0OQ26 zFA+e0Uz6y&J|e%)8tEh%sTOR)SaM5luK6n5g`=j1tN5SHd(Hn{;)!yJ$JV1)Zs8Nm ztJoD>oA|@m0d>R&s{Y3BM~FJq3oIA@Cs>G`Uv9tEOh!IM>=Ou%u&n2xbtfC4V9>CiTLNx^P%|eV6 zQq2bo#es#GR1^iaBH91h4pIy$k=6D6^IXfD8@uy+eVyrQdh7E}EeGa!36SGG`UBUj z^kY0Dn6M&v2(dJjbpPg}W*)y0%;x`ZSV#F7-6HJmFae2|T)r)nNZ-aU4KcUSFjpmR zwwJ7y`N%845n<-#oXuwCj_?CB7|P&uCDuz_nrCQJx@kWzb$>4&v4Pe9XSP@9F zr6Qax8jL8At>^eqR(*jC)NR^sCmkx7={RoIFP7x_OkYF**gD6~nr3(d3YF-+R0^P> zT-Hfu`MhK?7=tCurowx`58!Ww2q22~mU?8w&yK`>2tZAnlB!}~IdV|>f=C)1qd=EH z?GUMM6(yd?3Q%JEqwJ7f6tl49RR5ixJ~xUm2Wk{{0zcZtZ`~a6PrR{%eBqT+27sw( z9Q+f_&{$KA(X3Ic+3(@SKGX~|3v()EC+IeLV0)ezNx!Fu&ZV$myr{X^)f-)D9ASer zbU&SNBY~n-6?z;wd|xP}^%8Js784hI|dYg?1mAnlk^|qFOl@8BigcEP>svxemP@ zbV@E9VQWZkZ}no*s7G1S7|)4;WpAR{HWvAiY zs`IiOeCV}R`w>)jS1cfAX54-g44yU*F9uZycWKe%zeF*9;c$P)ecbWnw51 z#ozuT&>*BiUE7UX4+GN%vnr%@$GjDo2n!T9aNR$j#Y*(%* z&1W1`Q_(|96M{H&#Fhbx0x?fwiig#dx+1{%#K=scf*TPeLwxBP2{$o9{>*6pG><`} zWB8?{ZWPcs`SKK4p+kxC_EweL@f3l#ay;f_`k*!iE+jlngG^m;}6fspc?UhJdCp|0D{$(jrYtXl88Lqp`BW$2j{_oxF&FoGdB;{A&PABaXr5u~{)pRBu zu!&M?$?H%um!rp%@>rGWH-5q?U6DkB5g}r2?RrgVaFL&ZToY?BzEvNtQ{t0i0>gt^ z_*So&AKFXCog1v^D6_|+&$OkaVA!KXbC6Rsh}Kx8u3w*pBbmy+GSi<;CaACTNN@-K zn>CWdc9v$4E_IhW;FM^@J3EE{6N`S;vPkh95O2kYK@Yn@d4Yw=cc<7m?Vlc^WGl)< zeMutn0q%+eNK641a$}YqoquM{STb3(7;G6Wd1GA&FW-RXxO=1cgwW+fM!}SUhvXSG zZ#bnMlDkQ^Xu!CT-PmMJuI%|u*wbiWqz2axtK7%pA`F{olltH5SZKfpyQhIf@I8KTSK%csvPTul-${6)S!FBt&pvAO z+nRDGY9TG-6X*p?JtynN6Stc4Z(z3UQ4=O$9`3|d_bbAuw7xHB)4k7z3aa~XlHz^ly4kLJ)~Aa? z@A{8`loyj$cy$R#f0F~;a*uX-g$`-qsQc1d8T{TlLYvgWH!A3T-d^MTCU~ty$VB)C zNllK6(~g5@g51LyjkN+X+#J;KK$c*KT+>IG3lOFhvn}mmGS|tDtCiPldczhrHgd-uVa*-oOCM z8RI6BJk8OywmpN&2$HaUB{)ke@awJtNS7pW5PNeYujD?!MY7=4`cAF(!hWwA-wT+N zW+MTy=OiXbMhT+2C*|>M#YLH98BPno=BI4XY0$=@OcRSmX_6{E;NzabwuITJM7SP0 z?NQPyLdRB6)i92Jw=~}~)1YZ0BK+6ee=aQ2vOW8>;O5n}zvHDbn>7puD4-~0!fPhE z6NI-6J5MPnNDP__jV28;2}FX6UfG1BRI-EuKkmkCI!sq6w095BTb^~gu}Jr}-RLaQjpw#y%Rmmy$h7XFJ4=WYP+E<)oLKNR-(Bqb zMJbd-wdalI6NVKglWPc$3`kTTe7Fmb{9Pvy-fZT>kMHR2S)`=dq?G|qsrjh|pO=v_ z<9Kw60;rM&H6?g)%g*B)s@~yb(`5h{t{1hBWS#s1M)ky8C8NGS57a=Yl8x-ON6!HQ zX=vKuUKtqRhi?_#30bOw5ij+$OcOzr@OZ>;SdcpGQdkz~!j^{h3R|_*ij~LbIO7WK zxan~d;3G?_lAM_!e*K|LfTOct94JA&kHon#3SZ@iranYon))PkrPv1#xtQHON??Qo zkn7cf>k;q-O?3#GHcESFK9SC$ylgH04vQa&`C7oW5QrwtyIya4T4YwMS74Jju7h~E z<8aI<@&do|7H6hsaWA^-S`CmTvZx$3$|}ntaVpB9<$4uqf3G~Uz<-)~vXsMHK{V}H zg;ViHO%N{#ES_P{b6_+Jnf|SLaZ9OAQp1d&B~(&r%4IB7NqXHJ$LeJ~sXs?_R}D?b zSrUV3V^t1QA-o&FGSnM1wo5u#z)>pGwOlT|KtKSWYriiSWbPE ziCIf>M-|vjYo66{wx+ZE$iQ0C2F>3>jP~W;hso1m?~9g1rO2HNXN>xXBQuP8W-fDp zDr3qWe=?=OT}I0I#Iw6BqOcW=_z6sWCTPfMJYJmIj^NJIR>fH>4=5Yyh->n++~@S!cvU?4+(55@)&Q~bDL ztb(NCgE3?E;lkW}ArSUg0!r3&zHZ$L(~galQn_^mSh^k?6nI7Eh7(nfOFiaM6BfdO zb0ee>802yZ0B07R!ihU3LfifwufjojaO&-@@uoDHjzN6_AQ`sQ6UuUS)iqPg*l&jnD%t2 z$J%61g^TntW1&&!O`Mcw9znfo%i*jvoth4B2~B^(jsrwnx(O)tF4E%W8PwD*)e6l| z(|SWtn%-C=uQt3x*xy*bNveQ*fq$0?n)^991wp#+XzJg^1J(PejjaT28U}{T*!a!W zYPiFnES-{TJn4u!PBnJl6tc5k@VaA?ro5TjU-J7_Crm9eZqz!#kLgvh;L-l!1O$e$ zIt>yG{nrkH-U)f+$HZK%mQupwL$In=44ycqrL&E7W0w$_fzjZ-iQk-zy%~!6jLbhn z6ULSs6F%BgskD$hG9K>)XN{pXs)gCyA?-VbYaH!wk;|kyq&W{K%z8eTv>^UdV7H29 z!cd$GKW1HmLa;VHvB0uyQ*Zn%P%zav?&P+TmA1L3Kol;Hx5#4ANznSR9Ilr`m^(PY zN@+jv6xpy*7RKzb$nh1Q-cuHQUnZ#R?;JiRBWqN}zbM3jLrqz;Y08D*wa5+O9wF~_ z7QU&PLwHL6C%)W+)?8WabSt5wD2098ZDK;&Bd&Z__3@W@=8G!2+rC3U*9_@KkOgA( zXj}G2k`*=&tv(M=uYulroBFTj?2eyKRfNmm{7E(-<2ju->@ZKzAjaHy`h@Dzg|%(L z=4Uh{XJ=gMs{T{PD8AAGsH;^55I1gX{8(t7Dnm#m$+kZQHF#qhX7z)C{JpIgRmTk} z7g+xmMqS+LT9+m;^&C%xsjAn+vlUmp&9R?Q+NYgas5mX{xATpE;a{wKr+SL*yOonK ztQg!c(!3kK$XcY&%ef&>sKH6+GMbAVFsN@k-Man)Ty~v9wtY79BSumNkYz0`$=Ahw zN~2kbniEEvo=fXHA2)wyoP13kdL9q$PMz8uTRI=WLPJnj%nMW*K&5V}#v83e+ow$) z3%R-&I74Ci_+=N1v2*!=M<(s{F6OGTA7;%#J!QFD+;|bZxeaWXeW(`dy$IE8)Zf8@y%Fd8*pd}RaWH3EkEn|OL4$!s0YKMamyKsF z36uCt$CJ;-NFUfaS}rV7lch7NGYTvECSK>DWUFI;f`3V=XD{-yV}l|i;XOh~`nvrg zeh0a6B}Kl6D)`k7KHIE#MkD?0EC@*zkLqA$mq^A;j7JkNk!uj{)$eGy|&%r zUfSsWh}}ckQk6Bh*8Lu@`mVIqzt-hxnd1GQo7DOj1SfkPp73Vh=hDWP+MekD7Hcax z$hyr6Dmwqf!NHOo;xo$2nJ^okwFP7Dto$3?RiYIh3q2XS>c})|6EezlNaY!1;kx6^ zkFdE|C--bBJALo?(%sKWDfz5D#Rm?boEf4Mp00Vt3icUwE@pgQ2H#J;ZX?IVs3$s} z6E>H(J@GCktB^y6dAi<_neQomz~T1=FC!k}cJI~3dm%_{M+9(?-d2e)W_1=HQji0U zv?kC9S!i;K4ZfXJvpfnBEf&MW#7vx{o88$Hc2IY^j1Jbg>h!SJ;1J|-`h}``-DA@H zqZh2F%`|KBc0i_#MY^GGFGQ3iI!MD83SNacbe+J?PA@HUD!>AKbHIPrMholjKM0M0 z?eqXtR7dHtp~xm%E9N$gCt-`cE42P&vuG4tqM8}YSQNA!=G-v>d^C3qCs=3`4V>O= zd2|G162qDj6sERANu?go-Ee%V3hie1fZF!j;70#|peS?WETCX{e%R#rHSM{H6ys43 zi!=zSELDf2V~>~Q3xNq_+Gue92{JrBvgvLKYRf4lI8?zT)W@>YWR*H6;aUOyhyYS5 zWvbjUg{uXcWQ*)fy|I z6WQidWVYi%bQLPsh{ellyOrU>3;{;pZ=1_yz|*l;b{p7qa54B*{*&SgxG{~9wc-5B zfyR&23v(RSu8J3F%B=omsql&JkqK40091Q z;KtC!(FeV)=xunn;@WS{qSc?TD9Q(fESXllD#&BIh^|wHs%{UTt{`-n2D0E>p~%v8 z=9>)95riC%*|tuD*|+{xTy)p~liQBWhw%UdCduqV4f>yw=Fy{F&wtrXn{KWzkzFUa zzf3X0Gk`thhlb-hus>=b++r2)Dhp=DnMM3}QwNzs`_zw8i>#iM`A>BhBO;>^<_>ag z>IX?mNfF3G<%<;Gaa%BzpbnerLi*c26+X4h9Ymj zNzy?}Ew8g^b#22=Ndo=4J~um=OZxUll31`s`&)IbOKQJooYy#h(EFX?Kl&DGh_OCC zsT3w1yE+pc|4wQCSRN{B#F*`lt>f~mx9;y z#EkNO?w5u#D}#JIHYh%`j83BiIcfsI5C9VdG-ebgs_c_%s#`F~?vNMOkZhb`r%SJQ zqi-}hB^Ktvf=wlkB7uOPZ;J7Ib|aqE)FcHcz*t3&qh=#y2}L3*YA$px9WQy>Q~RZv zGuHYWcuu*QJ%Fo*wcB9iFCd*OYG#x*VtS-fW$N7b@H{^j0Po>zbVW2Wv(Zrq-vlJp^d7Ez=P1n06^k(CVa8wgirmCn~z~|6n_wjELi*To12{X z)UY>&{F=7bG1NE{Hs$%$RN~b`Lz{uWy1{NdDG%|+imy9oTNRJuid|*})8u>=S*A*Z zMBSuVJFBCR@*i0N-sk^*WD|77lw=MhnppM@e;_bl;9xu5VaKoGuzs(|lh`})4JzyV z!Hu&&-c+&>QZT%+R>!2v+Z9Gy#Gb%hvR-D6{^H0~N%ttNf>~zE6%4l;SEg~wqmBQW zu#ge}y7CJgh+0Qr>=pV>T^1*YEN~q7`&`cm(%MTeCfmVsznnY)ohb zqB%ZK=$4(>!Vi}3cUM!w{TPoz`$?rxf6@s1EQ-1s2<_H2G1qBe=6$=O9|+*xvKBr# zU!b>Lepcm`^@}YS=7e9cnm)qmvS~)uYS0*$o{Glpz|kHd&(<>xTlQx zU{O(>>dXDGejJ=4apM}>Cj|kxwW4ZdoNVJgtCbO?=KhrQ$ATp=Q;yQtX`; zE9g8ciLROuFd|)A;a4YD>U{%gOzq1r<*RJ`E(vI0o=KKfv6}w)5r@#RM+VH=m(@>t zp(TCXJbJZTQO5U5FM6Sqs=1oI6aiIhNm%a<*iH{{Wb#-eFO1iQAyIb1{>UQgg zuoC4ti-e4b3fdp~;->gEnwyW)5iXWQ`mhNCCg@u{xOIn)?a;15d6{8=@1rUZ*M)hBZP;P#gZ`yQ6;_A9P424_mB|bdy|HQHVZK6QfTTmSn?i z=;?DF^X#qMHB-+FC{a*pb_iD=SA$mT?;!aiIZy^~JGO*kkBY352TPgYk+}9rzWA28 zcm<<^vS8)=7T69L)c^;^QJ!_vHZNA;=d&-*>vO5x>z<=suc1ez0>aD}(|!a_E?ruJ zWQe4&H-NX20$YJou{Cz(k zZu831gJ`%_Zle$|h~$rrdpmGBgoa6jhe~uYhGT30D$pPcr8q+9W}9-k@kA+}_4|yw z3~max&E4R$s;EZ9yZR)Le{=O*5)>w<%jd)bh$g_ z^Jn?`d}}0oc(}2+HI^^+U$V~{%@u>P5D;6i+H`p`3F5W1XBJ+D&q zA2|Gp_3ZAZ^BmWCec^ubsNK9?F$xP_Iy1~S^T37WmUHdX;|gQ?YH?-wv>EpRU#1C} ztoYzTdT~M=9M-y`w;kw$1v%3DVAORZQ2TDp9sar{h{U%^BGBU!GqQbyTN7xysHm-l z__E+CIkkt`O{lLSw*~ioLSHLt9jmUaDZn!$#jjFohkXpO;NeG$6Ngd_{~4WQF9jcJ zv=5WZT4w3zb=LqCG=in%{%HjI7+emyX8L+$j72x&|NQnr_!&gQR;8hOHAPYjsS(n0 z6gvCo7b=Wth76&Luxu&!#Cp~S?oW!~Jbo4lT(YRuLG@!3rsZnfi%>XgelVJSHWRs` z<8(WHLuA_$^7|V9I*v1rZqd5A0a)lKk-!R}<4#fY$5CU*g}$epu)<1dJ+CUApB?P2 zEx;Yo+q=*oL+noj)&S`70T10(tuFN4CR!<@C)1(_?4s4f!vfjaWftp^!eA2CPi|w$ z!N=i%8g7T#FZI1>jR-%hmC47JA_AN5Hou)@<1ni%Hesz zeEy54r@w(aItcOkO@P|KC^syqx)#uR;5WvwtKMpILU#*FsOXg~t_Lcn)RiN#T(o zA-9T9vwr6mW(V$}J1+{pj<7_|_?#F)qCH}8>);*QjFrFbj zjQ&17Z+(FoAZ1gh`T&QT-FL+03_nCBsr~^HW_+B{*>8@JIoCD*?7lvUwTRyUmvI6S zbxUXRhXZU`RFRinjYe^WBk@`&Nm5e``B?A!LuE0uM^EE8x#M?GxkHES;6b+6>ssCB zO2R)*%6pm69QrzTTXXBL9doxEYmvs5jmH%f>(XN*t^iHXD<7gNht(?L`RZN z;as;r$$A5G=XCLWxng;WBr!VqWBS<#YI4TD`kvB5=$s5N-lbj7C=j4_oxWHhDor;f z5JL0ZTRvOxi6?`erkCapvU*-W?$e`xmZ~A^(K7ijr+t(!v6@;exX*#uTe5TfwpP5O zAW_663pe1*7PiblSf@kZl>BE!*wEyNk4_(sc=~d%8kpjwq^%6 zteBbhkE>xhx7l3MsL4v%PgLn{bQZo&la^XuF&w0=m{fhK4ynyKwu7lvFBey3}Q z%Mx+Ncx$<5Oi0NX^HHa0r7`2F`T3P#E;yw5drkMP&K6+5?3Du1slE{ca&$lb7WZ>W zVG(oU&^lNH^-wX!*RHBvGwaatWdUH+yP|C)ca6~-MOfvbs z(Kn33REo0(7E=s-wNnt{40?TdV_&F8AQalplO{NiJrf=$@lx|DOKgJJ(E4X+AlEYE zn9>fWodywH?b?jEjzacJI{iYXhYbn)#V1UaDS>U=i-mcv1x<N)YE)SRP2AxIvWrSq zBXoPW7QPSRY^XcY`!7LNb80(m0Zh5cuMUIyD!e-}nX{`p{-ZO5c46vPA;B|?>c2|n zh4>7y;TghgimU_|&Y0+m<&`1PmX=S5;D|%07%y|2vM#5O=!nKc8hvlUP*p-98FZbb+!8Pk z9j^pUDd<)ZCvoCqZVUh)9G}{{)u@3-$y#>PU`R_2`)0K_G z`6Bg-*PXKDv!{squc4PNyD6e%H?C9%S$(e^fDPsGw#j}&=n96Tv%=oR7_rmAam5w! z^UvOjT4On!L;|oLgzzGW=H;)R3pg@REkzoXu2g;dNN%SQ z&pSlNy8e=}OCE>lm1UA5FFgjlQP*xx%n~LkhOemAk!^2hc1DUeFSLywI72j3yw*y5 zRRv!4AUqvOG>l4e&t~#8+Sei0lMYQRN6}<=PFD*mev<0fhd6o$P(}2;43HOgpdH0N ze&#$FPB}jcu`N~t$7`9zBN7Rjg}j{b3SGwZeO2|a$GO~lCne%)1i;<6N>1PC;(ud5 zj)D07A0!m4!Rm++M;DIFdnbNOv7SHPQz$fff4%05#TJivqyAnsBr2h1%*0cTC(>3_ zOc;PjY#A`Q}^15`_YkjYQOOpfw&uh4t?=4OBe zdNT}nbTatyt$aUsI_W^J!YQP zXL}Ex3u8H4%LCK70oytK>=E?S=DxinkGaoWP;%H<)>8F$j}m>pe>#21wy+;qP_^6z zl!h~xw;ELDqcW)7beUDPYqNLbpcQO*LYW+US|#ijA&6AdmVo@z-SxL#t3QEV4$Veb zf9uoeb)2*DbQ;QNp?6%Juk_Il)PvpFJXwDUPRkiX>ay9RW$p?~n#zso6@9XUbcM}G zUdAvk3t&@uTDdxZChCD3f6Kxxw%pW?_SOr={?7=n`6zmjR|q_m6}*5wbz%7`Tq6wB~jVVmmZo4kJ%!eug9H? zIfjpdU~iR}W7lcM8yI?R*|?eWsMA<@`v#^~VaD=O^fHv*zIv^4o*FIku}02p82?Sl zBy5Ena>7mzZ|;q53Rit^?aLL|!$!!_^0;#j*5%L_4#RY$bU-)mi7-?MUA((2hSXJk zbH2`kW<_FuV{s;uDh-s1pXY5b-O*8P)t)U7BH$wP)Rwhc!)-~NgG^N?;%$NCMi`Dq z+5qDa7wGO~Xv37koO@S5+|^tP>M-i#g*qLn8ome+`wgfz1>JdOQekihFZxY6ikIR2Gd5C zV$dF&J5gv6J6Krwih(a{&!&0G(Oe(D!3T6PDD3L6@80ml+#z7sG@pm;qQ z>D9)u4ZANzBj$)ddW#JWMd7|wA#M#)tgh;DEs*qT@ysDO-r2h$+?7J$f<04pju@2{%$4p6(fXnk~okq4sJBI&%JV z`T74o2czOblrI&e_iv9vvO9$Lz8yxSQC#S3`iL;k(On?wsZ4OEmndU|;{@6o)ruD-I8wE|W3%#RolIZF1HS#)1oP%R6$ z!OQVXi;RB#;O#PO5u1O>(N&7)lSW(rWDbhw>_ow$Sqy{zvCHY; z*W$F}If2>m);~x|)2{i+nq>_DAxw=K``(vdjN{kj2=f)uVR)~d~q8I2a zCO1BDYb;xk>PGJz1TOm}M+f$U)m^Ip0$uEN8FY#CpX7uT9x>Re&UfIdVrkVx7l(b( z>4+t-MU98_W+N;}$c_h=gTuiR$PHU%DEhP5@o!&q(*$b59&n)+9+0o6C1C7nCU~YU zFA9;RlRYqFV8PMFJL% zK+5#F8V3Prj~tynsF#ATZ>uN@u9q%uYV$d@c=rPSP*tjoS5$4rHoj9@c9_1S>`JK@ zHA}D7V|Z(IN~aURs8;ymiK`7?U z=Kt~-nf+gMye-U3sWmf&D z%&31?MaH^Uu2jwPq^e5}{~qFmm-Zy9IH( z3tQs;JCr7Gc&%At8&X&?v<_^E+lLKf?|9?axPtCz8=xwn1U%U(7~@)7i}~6VIJkSh zJ&3BLoG%vOQ!-%L1r}WqhykBRYCXs}5NXeA>g&189|!J167I{LARqDVCQ*7p=#y|x z<+=5=@Y3;({9)qCB9d_*Dl|B^ZA61UYDhUyEPl%AEu3HLd3?4ugIVag(upx)r0EfP zA)QaS8R68l6p%N!p}DI4=zyxQgR3x5%wM1TW8|z=7HuyogQMkq2VqglnR~DXOfsRW z`W>mQ^jot62d{Onj_W)*Wi5-ZP7kV{fPSH|Qw)XI5Z_5)En5Hf>>5M%ihKcM>bR60 zes|Ry+dn*_S5z#PNzpW2u`plm<~Y&Aw4f?wrI>1{nF{Ab%T7NGg|{pr_N1N;V3uud zpDK{!*2O2U*YpTtJPi7HQDHNS!GV9NV1A&B2YtPV-lUkv1}{l^8jNE(7*B%>EqT7u z&b?|J&iEQ2oashl{rKGE2h3|>;uKvx&n&ze9u%i&612g?RF%iQfVg79|L z@x2seRC1<;UhdagZJE}f^}GCNNT_+ zfbx`bPkr;~5?^B}RPH&Js@;O>o!A~SA+H*t^XJWQ2Bb=y-fesN|12i3Js2O-zOfZP3N7cF^X|{8f&MAuG6b>N#Q6I z9|ag4?vsE(3iJK!6%0oJRhz3s=&o29x>p9M1}kPG)wae5{HJE`rM7)FOhdE@7CoaN=TOeWoHG^W zHTaozPoFiUoJjd;|I8C|FVKHyk&24l-#=sT$^y~kLfS;19VK-2&f$d}nB|Iv-L#(E z;)tV1=I#5C&m`zT*swqe1SYGy2#=)22`yi|oRRPd0LD%VE@qlXs=p7sm5oxCsL8 z(*^GopC7Ps)N0;q+s*6JW#FGnMC+u3yz5nK#rBI-(BGuyHunx$R11EMI`clv*){f; z+773RMB$|lTk@bm7@wnPl5Nw>*FMR?Q%@_B0Qcur$2MqK(N%5PdL$Ged+85|6#42r z{c0=i-Cs!k)5%{h)tc2LOn=s9IkOrY9^&wh=IDK%>(-xzLxQa?gJ;WoU7FX84tG-C zu=dd!3l^?^BS)+RAGmZm7(;|zp6wpDLg*e}a6^Cc+7*lrZ~D$l$|U4Ij_?Ofu;~*X zXr*T|Ix-LeUo<|=nB4*MK9TJcg|f(MUYgZ<!lfd zkCdg>(RS#Vb&_EDN7DQjkB{;xs`~37kEgY!m^RGL_&McZJoh`3OTr;0jB;9KY=90i zl8O4Mrkv|xS5{vAA4U2c0n}1<#Go&+V5d`q&&8RwZ~LywaqOf!_eDCFhpBEpvVFRL z`!%ABxa1ZwKVVmd5lv2jE{yKSHCWrzg$2;!o#LN5oMTd;eJ3 zTF_Ws-ID)nw~>uHFue*2h&7Pm$WMW@yAuc=Yq&DOoGii^{B9bL!p$}uxBuJ0U0jc3 z`Dp2JJ`t0p&LOf!x$pySd3h(}J(%-T#AH&)v|#{{n=_aL;P32L?*Ob5@veU!r-+Yw{ii zW@_YM3e*U$jeaN4iNH#%EB>3ecVa=2}3$*hcZm zGFA%}yZqPo!j`SYC>?_QkZtY*gh><*A2i&x&WhKJxI*&b2k5`afd3dR_|k5-9Uy^# zT5y1X{%Lyt%Q*C3jvj~K_Ex6G&i~keE=~Q|MRue=0%zTU$^142G6RlX1Qx}~f(}GQ zzq!%Z`4t-P$+x!zQ6!o{GfBF=%<*{Y8rHga@^s@Q_tWp}zhh;Qz(yoIios-+7&Me% zzx|6NJ^|HJ3)VTmzOr168%hw+nRh5_N^Al8_?&hR# z6WC;PkQ*XqPCS!+^!i!t+`N}1>$$fYJNAhcKSa2_Whn% z6Pu-nD#202)_|@+hM;`yq;hX!C?lc#OJ&vedU2FFa&kykSV4UyGn87J4_9z^j6O9@ zaJBJyxj*N_ArE_Zx8Hy5`}Fv>RtVZ*y_6bFBZ8J#NnwmJF3@RYA|&i!^m+?6mHk&b zCm8f-Y+$5x%<^%Uge!V%$P!Jg#V|N}6dFd)n=9K~UxM9A(6NmQvUMy1c9l~!W^}0A z%*v94=0p`r$pYZ16G@vF>Q)h=Ua8tm(l$w3ZjsC~kakpFe-Q$Kxjn_!zUEc05tly9 zNs1I?hWx@|owq!>_hLfiN;E+(ghfg-qV@5$*H9}=5O;rIb6pUN2Z#Crn;|3qT_iTZ z5WGv0rTfxNj2;U1mxZEepO+Ld%*JX`I)$8-GzDE*&r!uO+Zas@XW|O@oq*|;lD;hI z5PqU~5B3fII}oc~*G5O^x8Q50{j&D$-Ad?~$BXI_Ijg0~X=B@-%X0>Gd?_ofvcwY# z>z_6_a$2?OaiD~7CTUNQ5q!x^I^}7x5>hA=FELv{8-|Dc>k!!MrnnoRy)4I#7`|rx z#|gh(f282|ko4lw#B>Bo)LOFL74#@Lxe8C&M45_5)ApR&3+Tta>p++-exKAN*ruUL0?JpOWl%uVPR$zWJSCVA2u>{R(tvc!4qYhGYv8gT-8qn$( zp}qda_PI88G;dkG^>qe}Ry&wl^7ldvQ{jZ3=9eeqxVNLf$MM4!gkARPrW1L>qc9&# z4N~;STNnvN%TOdCKDfLkBW1HD-b?;@2qe^!T?=!&?MyopyxW>M4V=G4uqb4L2i08Y z!kZ?c@}Q*-Q)fWjzpLF+YW8WkcXAf%FOz=njyQWGl~(_6C{-a4-DOY^A*@p=CdttS zVP@d{2YEQCvs%Y>L1nrRTL?En>he)|6-0}uS_2bM5@|BFI;-gWC+pqEOFsiNxfGO8 ztAadE2nQw$jW*xGEEbaI)!C$INBhezR&Qa-0KVsTYKmNk1T5Lm>AwZ3#%!XEJizB- z=AKz;8`s-CccqlYLKV+vT}2rS!`b5F(8Sm7;WQn_dquj>aE@Ms)+Jss88ePS#N=R% z!&C^`-lm1Rkl%5j_*jERC4BgB9p&qoIRokMxJl{#(Q_SSmgAWuB1NkZK#7Os%RWg# z8|U33dV6iy5(=eqM;rkW7>S)2vp%8-Ymw=*cQ6%+O14C*E8so;@{I*zwEn&Wy~Lgd z;{p z?q!pAA%CS&@{P!C-5Q$}*j&2up<-a(yIJmAaR7Nc$Q6vw7YM0JwqrbM)aW`Ac3^^9YHoltkQ^CX=&rM4+{zDLCQCmn9f|}Gi z&&u0O|C0vZJqj18ZqEsBD zhJ+CQ{y{hYq(z9{Wfl%nVlTiwcdUdk-GbZ97vzoxxlUQFz0zTq-O70z-Qya41D|kF zr`RKs@^3K;RAE2GkoX$4aaytbn(cyA_6Eu+%tWEk?i!a8_f74D6C1Hi;k8JVllj4j z<}q_F=NVo>#G#FwO2?H}12*(oE5SZhJ*Mm^)9#0Q-l{lKn#;FFdH%@0>RLHMok0nP_3 zLQ|;CQ^g5;SRJxegLUip6xEmpPqfu~wD_gAc%c;l#u~w zTKN38n~zqa8)IEZH21E+_)LV{%4fp^2vU#_wt)m2ihU0ucWl3>+`74yj@_Q^yMMnu zW5KBQHiHm!7S`RqV8_@o_1Dofekybg!6(_J?WsKtVhd94fGnf*S+MhSa$*o(8^3sn zkIWshn|cPp1)5hUpu;KC!Wh$R&o%?NFdO_&XoBhhN2MF2Q`=z|KkU-H-J&BEsBk3} z_=I1u|2v@nWik-Re};eUKcc|@C;|T~p#OcGe9x>=}^>j{w2Nfk`HVg-iV9F%jD(DvqLMQgBvFbo?p@^ zx&J^c2r @IDXP!KJO(G5)VCIyZT-CRX66BxOC5q;JM1TcYl&tk9!%-U52H(XEei=w+&nZf5EA- zV5PcH&}vrbMkFgGacJ^Q;b5zc*NUek*Z++-F2=Jy)TFM-#WO5MK8~ry1wYoX$-IbA zbTx*gjV{-7tDl!kCNwX0OwKhZmP*bwDyB}}8ItZ$@#UbsGDCo)nc5D(mSv?J$f7$k zPfIkG%eilu#5R=kzxPUG9nZo~$~8uSGp0PcF-GY047h(`h1BB{d+VC?U%4vz1fBF( zpH$d3LvZd0z5iHsLU?o`^!0bfC2A#%$jj_fX-thE2qHP{DJp)Rj)&} z28^C@vRXJ?8JfnhS^P*ME5XClrD>d;APog`nux*s-_~^F9POLJ65k{(IQI+)D0vEk z!iq#)u$HD%VuNd}G=u6im}oN|fQwGeQ7HAFs(IG|z)&Sb^6}j4z5Yu;0d@v%X7()H zx}JrNjc>fi!R=woNlnel`E>q;+!W%mVe&Euf?XD;9{=|%v75`&YyrIwR+K%gXqaYumm@^3;c;B1|h_7))S1_lR&`-oYNF8&R)^&|gW1izFx$ z;=wly91n9oyrvl1p?2`yF~0cM0nEP6-^B8jVX(Y&E!bthmnvXPS+-63wYs3DAvyLR zjTmsqG@KwUl+eEfi~H@IT$4EvpzSyTgkO9bAWiS3OOeUmNLHG2KwgRy5el?Tr>4mN z@CB%`PPlz_?#2wcs=cFHvRLTq7LJH9D0ZeU{4~M=6H1B$?sPvgy1}_)!@&S-;WTFc z;g{R4PoZvs7~YP9QRBh*lZmd;hd1KU#9p+rbZH_;j8XC)ZLi7}KKaI${VQ?=cDFmP z{=9su1U&1R_j1gq>aC8`o%Yi2x2^YIie7N{@j zJq?>zG&n{zC7@Mi3a`jac9jsFWkFAm-=kS1`H>)?w{UFCa`(hI4EyX7MMZUeRV`>!_jWy%7gG`6cZs zRV3`okxkF8D*>0Mwqn%SjadJ~+HD2>jH>#B>Q_HjF9+UbQ+EdTQHvr{)605quO)%I zS90$P`Z-@ocpPA8Phd2~W+IHC9QiOoNC7dsu!kAXO$GonEx|7Q%t=T+f5s z#A&q|;TjHW{~r}nkV>(e7z5lALQtSoM1d!WNkk;76rKVn3F;Tu zhS<1@FjkqWMQtVz+R0s529L@(|864Xg2{MSU6YvRi!OyV^ib)p`POSsp{92$n{-5C zlc-e|YaQ>M4Pmp5SqFEmUSf;ZZ6wLg22C$WtSd}NW&r`eX4gS;3^u(;*)t|NYT8mZ z6#dJdiFY|XQf*BSKPU^#OEZV|Tim)w?5qZ{Pkuei^YJsmFv~kF+6pn6u|4cMT0QXe zEF7Q+4@+0lK$k7H91`H6_F3JCDv)YyZ`zr54?o9}duzcc5AAR5XPTDH_r4>ofu?xw zT~3TeEm<%8=XKQ%qmL%>j_Y;1E3-IZc z_QIJZTh%J|YHC|=op#>cYkG*EluvG-Erx`RnO7d%9II969a|tV2OCW#U-v?gp4Iyn zDDpN4KKtu&l-we@RPY}A#W|EfqE%M(t3~DrIy|>5{o~!?+hy$F&)6>Lz%T9#qok@`>>Iu z`HCBUGZfz37{*p7_c%T-UlXlo!ap;q z6)j7tFUktXEKyWH08}P`IKeL3P-v#bG;(OLjBhGhv8Vo<#XZudpM05@&^75Hm>iW) z0r}^J*<8SDf=G8caMB~}QTX6rMYPklyhqyfz@$geJySf16G8DOniGNXH1PO<4g!mL z&V7gK%>E0K6GB4^-Mk~d;k07$0rzm$NOH^t=pF5 zYmU+Mg7nA}oRb_i{)*)>Z>6)2d0GRJi_Wy>aaQ4{?=kO4)(JIYBHv6FCe;s;6aQou zY*J{rzR5Jn(aubk%w!wD1E^mj%_;akmdQMvYhuzPz6-pUZXb{up+3NN-W)>@mGJqf zUL5pvrqAheg7x|5#6L_YS8X0s0Zu@9YScSq2yA+WCE?8PBvmSJ0B#P_3@({jbyz7q zX}rkt#UCJk4mz&6PDPYhcm=}ZvB}278o&c>1|zALhF!b`$-+}RP;BJs__SUs_qn|C z{r#p~`4jM^P5P34<8{3GM`gj!7E?l2$`Ni*WK&zg0q((+UNpdg76Hn+c{DYiIKo@# zu#&+Fs193le%2MAY`*h#e}((jyHk~anF_OsS|L-qbXfyZDy1>fv~(Ha!54Nq{ML1a zR<^sfNl z3u2YeAba#Dq1qIfC6Fx~#3th8Js=?rV-(inUicd5yIrZXBdlgZUQSmU9b|@v8yb74 zz$>fJG`HZF`VbB(uNusF>P?Vx1{EGXu}j8O3$pi4(mt+MN&9rYKnc#i;Z3KQ2pD7L z2CBA779fo!YREn z!e_*paRyQ!PqpM@B{oVCstiLa2?ekr!e=-w4hx5ams_QSlg&U?^gjITm#9 z91-&|d@Udu`CbPyTI3n|L9{;anoN3>r+w$wBE$1(%tN3n1BE?*q&xloZhooF(F0Gs z0F*;I((@(lga5s$Pl3AC_tRK)bk^ZkvPG$ttaS9%8tC_;wPb8Z9CMSxfF7sMr%{T+wdG?;oo{QLHeJ1JF3zRM z2>A{Usl2f?0G3H`7B# z)R28-)`dXdgms^bWW@s&!h&9D0bd!BrPelwt-#)UF>UN7?ac- zv@3GV-wsn&NO`}Lp73eVUg*7e3ZO=&-?q8+KJhyFFxc_-NAWa&_h+R-&o3R|$*3kj zEen>yP4pQ!X$6HOgx24YlVdSNXo|> zk30!QfE=3e??PV-TlY6vxV_LaUSJn-DAcn0T9E;Is!SfL)6S93Tm9UgBDM^|&S_T( zuS~T5hLSvmoQ)HS9vNG-NICM;`U7AJ!Eqqb68X>_5bGBiU9*CEStl8nlzz8}v(SqX z7DSFw(l*dq-0zTd6#bB7J+Mzf8r~)yT*vszK{ae>y5yhEQrYy$XmBp;F%C(BRTzgQ zrupTt#2mH;{FHzy67vY1oU;r~-N4S*LUHFwL0w3ZABHY@&B**Fcgs5)u#5e&UdAF8 zU?&v|Pg!uE`Y2$VSUZ~(SETO7&ULFQ&FxjP-pD`;JL88k3(AxeW8|2WIBk9Ig?lwc zK9nD|vxRaw;%p^QVOjrl^m-I%FUqC<%(?S(TY+D3T9)6`{yC$Cd}Kv?1%d=E9>6^>dp497 z&C*!2!hP-lDx@mZ{hX3@eG{@V88VgoPuUF3JSJCdYNiZXicxgjzxgHvcMWVZ1*YPy z;Tq?2#*b8I5}kx5LhN^CgKidT20{qnaMU-b-~FebJz{V1PSdAOAU5KjZYaVhw($mF-=M zFWDYQLL=`(ek3f(X`K)0!PDYkUm`di?Es(Z0huuR#VPGNLHI84(%wl1m|OC?XFXv( zrfGSVxH20KpnHgD*+bVXFvomwQxH(R*A^9N6DH;n7I(=?=IpOumWkO?&s_86g4}xX0kCsbB6S`FPE0?WELCHEi6;?hiKS_VV$&tyTrXMzRvX)b#HhJ7U zaNY4`$6_5R;@m%o9HZK^rs49BC&4X56RV|4pr!*Kb8xVdcS=kSjUGdx4Cl@jj&zac zFR$?!Ok!g}8AzWP!Nt0Y=8aVJNj$Dnd4Nq~Gq1KCDwKYRzxjwrgm;hUEN}p@Ap0-x z{S3z|2AP^-dwnsKQN~1wYzg{P0)nitgr^0~wcNeBmJyUqqWl~aw7hgQ3~?`>@+jaM z*$h}{H{qMPz=)dkaU_fDS^Sr9U}H}GA$=|w-CP1eH-j1UcX`Ss`Nv3tz28#^RVp~T z5UGe3(u!|1I*vM|8RWw);j_S1iG%d_*P%}g*bsI3u;g7|jGPXYL^BR!4yW*TW}%QKPQ_{vHp#g8tkXG@IUTjm9w;xJC{vBjg)^NEZz*LTX}-6y4w|Kzvg@bo`6tAiU#3$5YB(+9 z?2;x*#I-{BwZGk>a-buBkX}|7j-ayo@TJ2(E&3iLI&&DhGNnAjST_8YGt8=J4BJ&% zd$LjCsP>CJkxzTkJ;?JLd&#}1^e)Pd4i{_QQYJx7JWj15wNbdTUhyGP6J@~QM%{|K zm#oiQ_Ws&Zg&l0KE3do;X-{)hAK|SjE>-%>T>CrGGc3nAQ1g=-4wzGkV_{_4&ZLMl<}l;T zI7G22{cp2pg|g`7Ahi0Vq|^&)h6U-&`(Hu$f_a;Prxgb&kwPtT!Z2y1R@wEmS+SaV z9hZTq6Qx@WUaGmxs+F$<#hQL|RDRssv#{s`i4Ql#n^596xczy8{$dcqBg!{Y@5Rx( zhT9*kKYqRitin;LRO-bwXoO<9$!5iSDHDd>IuMR7T`_OMZJ+O+#SB(PJYOH=*-5O`$u&08|{2IY&)8e$~x#g^{{8su7;Q`G|#KguTi8$de zP{QlR;JJd>GapWApFk9iUq5+9M1upo&LMZcIzl#asNFAcWVyoo{cGs2h2EGuzxWNW z#(OEr1w7vBC~hg0N6}fp0T01<>GAy*eL=ZspJ|WAXNxp|fsq2Y$6%bS{?r0t@@shL zB3+gvOOUS_x^*+;K+sR%)4P zOE$pY3aO;8H-D{Cdk}#xT?u>+PI0%i2KS17qn_}GZ+_U*vNm_R>!|qUK732#%5h**t2+2?Rfx46~MNm@OvqGiipP41YtuV=F+%e{>k7!^ z^H+Uwb|1q0s4!HHIIAqh^VCF)&O^&Xn6%&IV)`Ts=8J)c$ziT)HniO)`}*~Kh{p+t z$NRPqcZ{U}p355rxi{`5cL0C86Ozy@&9fEPbqIIk&Jq%fDprNiO%c+|K*Tp?p%)w@ zhRODu_SB80%Y1#aa(*-s(of$y-4$F}<4>!IzB7aHJ6dX}&o5#*O+ubjXMLWcAXB~6 z$$Ypv#=^;`0`M<~vABt4&=qUuy`;?yT}qKAEnSUIHrRunvQhGhv|(V|51)SP z6>bDjQG)eN(Yems+f3DP>5X;~^l1iRFEauA2W<&eJ3`W4$EjvR-8C0XDtU&}-Qz#p zej3`t;~I3X;NQFZivShA=;-T1!{2z0cpF<6b7E`N9{mz)m0bp{mNLAi?$NCQulqtS zHvQ+{rs5v@$V~gBqYwy{5?!|xxLvLkO4GA9ViU74Ox@NWde1c{lZ}&1=Toojh^&PU z9hT++6sB4YFq)dS`s+)_&y%yM3oh2i$vfmVQg3Zb}l|KvJ`N;=Mvi$p`5$?B+PxkC7#1@^9Ka7R5yHHBsOZ zNv+YwVL&$MhZfECwKoH?7S#pTCE0IxdP7UIW@Vr;Y#oMGwgp63y;g$`isAu~@Zqh9#1-Wr3u&6Uq^UcHI% zL*w0ua-F6)y^gq0z#^FSB-EuX(D&yXuO2Wv;zpLTO3#1(Fv~(}awnp)mz~=%vOVV6 z`MS=&>F?QhXOw-4dye!>l^`iSsQV{rM}h9gkI}CBH9IE`#!j>~blISEmaH3Bj)}!h|&LqBXWax zkkNA&wK~d`5eX`mAy|g@H-09^`=@JY7{J6%+EHL*q?y{KFg3+dMcL_(Pi&+zO~wYi zFdf<_RKT!)>D_zA!k#3}hgz^&WLcs$pZFQgkg_E;66f)rzm*Ra-P&u0}9z&^!v`j_Pj$060mi zY}Z0w;V_FpNvly?x^7o4mp#ixG+6&6BghtP3Bk)(CHlmadNw-N5KVb%VY~LARsF zArG%P7pcjBlPk=W-S`x9fgXoz(1M!pS4l+ZZJsHJAqlkwmP9jVcyJcwDOX- z*Nk}dkn`ptaJwy&GLtwZI|EBqsslPs7M_G;JtdpUMv*G3bhTe}W#9$c6Lh5zBh4z< z#Cu;Xqz$dEy_d-MgRV@1rcRp*G3CoXMRj7i-EzQjx7p$#-#EDEm^OPzxxYw8e(0WK zg98s5Za+)1d9n|2i_jldASWRwrp4^%d=5aYtdA%kTZyYSh(4^k8LQm;WqDCZKm2 zSm1AAwHT0YkJ#$mOKIJkY&fk`!#yE$f%kKlzQX?Otq#$gCnV#JYnM!FCISViikl3h zFrmi-V%lq9qQw=u%snSmD9{;h*fP?E2{W<%_6Yu+Dq~f0*N$z8Emdc^W@jgZ?LpcR zMeR~4Jbw9`*vPzSNliKhkA8fM&hGe>_mjEX5w>T$H<0@8HBJ@7S_&vPM*({3vrp$P zfKzYUHvwav**QIb0-$TAl#YZexTu4CF5UQW3?%W5+YvFVD}tSZS08ycjYtVL?R1_b z`5`_V@eFNJA#{lY*@oEqtL%0Zv_Wsc$AGmY+};o?WkpM0S7sYZXaiPn5%biz{Kv#5 z6V1_3D+HbUbU)18;{8%l99ibQ^;qVRGN-~n?lSZMy=Oh3%f_Xv={k`O20#AQlGB%3 z*}C~6xk837Nc;)PJ7X{Gmac@#w(r3=yTTeFqjkykt`t zqM+R|w#@D+zrBQ1B%6Y~qSR7D6jWEH%s#z7a5yfNdczXVBfUO%oOG_41gl<@qE3iN zN*Vx zCn(>Ixo^MeFCKpsn{J6~L_S;8Y9G&+?LxOzyUmsmAU0B6+HcTAbEPAf_bJ1J%&?w@ zrg{*RBSfrqd&4L<*B1l;+k8+)M9n#MiO!uPq5z!)xeX(14Syb6NXfdzD2I^kc0+HP zEOC^^w!i}1Nc)-Hd%s8s$=5`(;1JHGsxqu>*?l*^fp6hE7a_qXu}CQ32*~Z`B-`;9 z-xh`AuQXSZ^e7QsrWji;4T6}($Dx+$`z)LcTkKrONzXm_#EaPmOs)83+CRm56R!z8!E@J>nx* zL7t%60HfKKz9xT8qnYAn5;E#D zCj`s&qhA3vuobr=8!=pIGjcCGW*aMThxwLmj)_BMnF;gXQfy$FW$QfYrxc`kdS~mw zCbDuXhihYIp$D}R7ON|-vxbOR`!6P(e*_iiW*vM35plx2Wq;haC#*p|s~qe#m_nSl zKeWE}^fy%Ve~bF_fN8@m2%8{<{N9i62_54=YkB?tF$n{t-L>4|^2G{Gk3(^aJO zODS{vOxu}~Vduv-J7m0k|8^^%Xo$`=7ZQIrr|W!AJe;+a!pyu5>(0Uo z8mGVK47d7QW`-s&t|&`Wu_jalKGx;eqpWMeHC|HE!GrawbUU|ZA*k8ia7l zf50rd#l`t0VOrBORtd}u(q(f&ZD^R*`xCVnodEld7h&qDuVJ^++Zxvhmp=>4Q+j-Mh zx@0=UVHFlNj@<@qoJ#zHQl=%*F2S@A*}6@BlJA$;Fw{9@&+RojY&poKGGD^*=m~Uc zff}Np%n&p&jq2W$SE?}Pm%f=IvJ%KQv@A}Zj<}-toTUzy=c;UFI9550v9eHLQ4B;6 zrm>x|1cY(tkVW;D?Jj;s^z<|(B3?5V8KpGeA$aMUX(TcLQum*#Tk;`aP< zoh=g)We&D*xTY)~;d~g)ganw1@ykjaQ(XNcAqIBTeF*)1$sP}~Q(RKXTET~fI`)uO zsDWOK4?)g~cxDFIaxMwXhCXztFJ``5X7*M>YYhQ4c>#tN=QK@BlgKB0sMn3_qiy@tNW0G$v@iOr zLF#umU=WY;Hokb@;z;24P?2Ql4 z`R+b)LgtIEk?gO=l>vNL$ddPBOe3LG+qPESXOBm1z*!8757S$QbVMR^b9QHs z0AMARC@me-)4aCm45IXyF<%zUqMZwM`YU1$LHK%5RsV`Nf(xZ zdu(Ki*ZuJ9QZXK7V#3z*;J#j-)yKF}+1=Rs`<|CQE}O{2L6#Iwloh0UfN{ z!3syJzS4ey`kbUoPG?8@l7f-+5&5`S@hD7m#mwUeE0?ry{x)#7--7I>L!-oeqf|rv za(5L3Tt166dEnuc?B9N%_k7kb81F@_U(X=Q%tC36LVxi%^0FfDEoI8KygYHdlb^)oU~gH|QctWA|v~=ke{$ z?bbBeAv%&$??xuq?>Cgpla#zjKZtg6N6>C=90;F&MVLWw$IO0Q0H_&$AQIm-Zgva< z%*2TAccTwXFo`z8Ui6vXL;wm8fC!U(hA+ajPk8{H&bT6gf;s)*_Z2VC7(+qwm#QRz z0#0_n1@{ltA9pa3FPOJFNEn`xd*gqC%*i0MpO#@3V>Ls2!{*!jO+`4MqLav*huhfv zFx-zgx?QTMKa)ZL>}aQA#~v+f`{Aa|94XM@pwC+5hJIcHj{Ziy4m}p&CK;Z>fVXF} zuHRir1wWl#S$0!eJq&yk!i7i1QIZSgg56h0^IrPHIkCn8!!(Y_@Y}p1e^R7$&Vrsv z?;u@H^(fn?pl=*V&J*0FJKHCI)-hSt zGpUUZ?~}m>^Cj+>E+lUJK>jxx{2$D>Y7I@)@*mzC^sm$X-!R|*9~1uHq%Z2p(Gj=z zlM)*!60eycNR;3u(BKfAAW5)4u}0#YJ-G<7B$m)83xH;7Qff|KdW?=?ZenbbwraMj zmMM~hbxvMZe#Pw>ep!B+QFq;c|4B3dH<|qZl^*@?FYeNuvfms=C;Z)(t7S<~onXr2h;=k!%~OAX z^}AxUTxr8GYgwBkBGXwpDL+LgoF#P=t}Wcv7+4IQ4P1#R6oY!UK+s+c7L6)S1fi?x zg&^X&-`H!sXI6Q~D{F7W3Y~*%uwGnb`ZDvy_r~k__0jpt{^xx}J2%_pQh@G3K5z&A z75*C`a7Y7JJXn*)34K}ZP{-6(bsF}sZk$te(=RT@de`t{@Z%KCn*Mdw5{+6N6GEUZ zoCbq7zyr0JYMN@X2fjemkKq8?2asHb83(;PPxJ)SI_o9Sv`y~@w%M;!+rTw=PcOJ_ z0^?=6uIyxc^Y~peC%Z?JsXJl2YG-e|n#Z;tYd7I9?5~)#t>-F#>lJf`^`=7?|R>9mH{Do ze)n#}wXM8z@#1eJ0W{0eAwn!h5JQ}AFGuU$*5zRO3Fvr;GSU0wiGy38XpvmsXrdT~eSTk~Hg$MUum6b{{%Q7pBx?`h# zu%j&$=`(QTSY+lomb&dMse69|vZ%4EBN7^#(pU{>RaUFVuUQxO9hpj%4a6Xsz+GPq zn|fWxDqJHk`Nsr}lC*M3*KA2X53a>|4P|h1YX)-Xjx+{^Ru^WXy=S`LzlVNV{{cvW z&OirNcBzajsQ`gSH0EGmi)yu;XqT@lmR~q&041v-b5Y`HxE2xLIWpm3|HAI=cTB>x zWIBQlo*^Lv2bL0gB@?>O#6l4SAp!<_^;1w>g%&&};B`A|1Deq~ZiAYM+NxyojSQ{; zvQ*wxBiY>71?h0}9TL8mb$<=-?=*@`jO%*gb4A~JtMNAWtmc#fy$|el%WS1*ODbCXQ$^hM)G?rt9TrW%B^Vq%pWEY94^uXcj5Vt-WKiGLAu8R&YK_Q&J{W#2wEn zDF0k+t&viNsPPk8kLssF1x6Dol@>znSBdvuC$jJz)le4-_WSJ%!!t2iO*D^0M*J6e z8%fF*CJl*f2sa`Hi9(Ds+YAZsz#)PM7p|aS6&l$&<7(Q#eX=Xa)@d>$)t;(ozd7_b zV->g=J&Gw*!$^9Qs1uP(fF`9Sf~Xwxg<-}F>jkn|b_v(4N0KJ@l>eylq*lorNdtlT zGAi3YN|NP*I)jnNe&fn?6ClPF1Li9W;xk!Jp5 z{sLGeS`@YYC5AD0AqWvSRm%EiE|2wXuv71vA(7^gE^_LzG2u1h!UuLkzA@jqd3|PV zfhB$JQHOn6`tyvsF86IohM}MvIB2|Mu+UlK5SG#E#=X0pX+Kg%0k=Df?Yg%r>n(O? z;fET?^ecr<<%!gs`)bKtO_RZRf1Y}@C}(`fL=^kx1vSWtl?Aj?_5q7Q*{aQdLHhTmhVst!*Jr|nABiRz2hDCi{khywA*&{fp;#Bs)vZ&68$ z9#tp<2Up&`SF)PriRQ@w>=KL}#4)P@R5ACxVXwFzjy&>Fz5(M=>C{tG=H|IKoOBua zsFUuU26&jwdlEQ$Y$BUaGvPas&cf#ihkpkf8FgGKwGuFk z)-b6qHU0_qWl)vx?kem(4C92lo9^VaWlwhI11tCP8l$m74gl<*=_0ccGxY@#Bfw{P z0bXY|e%w7!uj;gmbrr6R4n8eCJaw~u{WYj!8z={c*A*yAgj4{iY^h2_0rM_p$J6~`SbqIdzTE;c`Sd}ay zQLI8U6Qf58h{#*)6v$khN~1c@NK#{+eH?XdV$KK2WEfa5Vm1uxYOP;j=n6u++>y!l zO|Fz@)UYDOs*7JpLSH2I!F!Ip1ET2EczpByB056UhPfXYh)$05K?qbR4&jLdZS{kD zcWnwjq+eOvrz9$*d*l&!xC)5RpBg4QqFnQ910$@zeAB%de~@#>?)xIZ!v!Na_dRSj zO>QJ^%`kmrD@-U5PxzsnxD-TrjHvkhPW|&@)Y}m(NHiMlURyfE%u*wXdFP|Sz@07c zk?7Px2ltHa)wkhYJ-OljbLidrl{)WYl*jN2lVt2KYYd%ZZlrv&A-@l^KV}$GGTD+I zB#rbsp4_&QSv7Jt=h^eHUdguM#39x=y*`IUnYbXDdVg*gK-ZNwH=9hQ+fR+1hbx?Q zshDDx2Y*^|_lq8$s07Etm7ax?=HeVV+AyhMNJStVY*|MoS1qb2imwtvNKhxYxMMm) zIEnFAO!Qt{HLRExw{-Sz8VpJ?|H4S^_vm z{y!3066!?Th0?w?8YnlQjWHG-mkrF}bsb}ETN2kPCKi_!L4Vma2A2a&=HFine33q9 zOIRCBSBx3`W@C6_ShRA%0pvm7zWg#3z14JGm^JnN_^C$^kL>9Q?TNT;S4V^dAaU7Q zDO%+U0)Lr`+e16y%MSA5wcZ+f1#RjWv1i)MqIrL^BgC0muQmWTegogJzlj!=fmQ^A z1Vm${0!2ml1Gb?`;)sBaS!~o=GeTg-Zw5dh9!lV?2-}z|#m*RGr9FCats<@{##u$z z%u+DaGll}!dDqq@t-c;dI_N94FA%>)4b3o)+|^(WM)yrWATanf_VLEN)XI3Z zZiKw}3^DWK;S^7Ixfi1l7wzI~pfY%GIChX8t9VC*QU~|Q1XJ37zA4ReR*X(;!p?=0 zx{c198lcI$eHb{WU0oeugAE5zFGnqQrwqO4QHx>}H37OITFRd1eZ)`&bbe4Ls7!Xd0B zSY-7gf6@g7ZlTi2tCq3pjM7rKBiYIKRK8J~W=yuwS2h=`q3s>q=+blLOD1820S(2% zI3w5ecWz(wQ;#oRI5G#?jK2YpAE=x?o`D}N<#86y9|vWq%Z{4r4PPxr`XtNOau&XM z<5Ta4pf@kKjDMOZq2wD8Ula&cKC+X2q%axc?bQ`Ia; z2`AVmwXnSMAZ!!*xJCQCJZ^l$LX#ClKE7{pwet{XeQi-w6^q3=Jp+O^#|D~63tomN zb7fjKKN8xn|Z>n940z&?_GO>$uR z_mqDk{bwLqwsWf|_AeY8D+U0l|F5Xb#mdf{@jpYdOJA#B_$wK!=k33K2?r2M1r$>^ zQ;Q5m1nEbF)1su zC9y6uwIu;QK#XfKZlFapcP#x&UxU==d-;y5)#9aUE zO1l*VA~A2zyodmyu!V*+-qr|08T!b=afr;W0fILd$On?t2*Po!elhcaOB7(dDsG?P z_={-@G=8!F(Wd#=Q~en^q&w$RF4 zX4vU*`Lvo%^|c~$;ca~UEPCZw0gE=w4>xbZ)^^DoMM`>wQ?6Ty#`zxkpCSZ3R-ug- z+tgqZ$W6x#$qBCm3!9EHd>z2?fv_DGCTt&LN4I?}Zh-)v6ou#b!d&ly#K?39%T=DZKOYG2x($Q+CW|nLxe=EDHljvgPO$*pHRT_g)gm}-=2tekZ z!%BI_4v3#FOz8E!dN=G;@_A}E0Kv(eUyE`{&ugU>zbfN@eBxN{oT+)1XtO2wy&1j^ zmH#GUNsOIV(0+cTN)Or9J2w>*&nlsuZ9+`eljM+s@x+^6*sf-qI;)T3`dJo_UI6n+ z{4!^$iJu5qyKXWk?@~VRuvFUvE<`v}HIr82t9zlF=F>>Ohp6dB z9cEOApzO2FforYc4Rm}Gs(@lS6Uq>-i@8RS))VSl+j!fly1O^O(r2YtgELv?-uSzB>Tke51rTlePJ9hSHf$-9N`_x4k(oPS1LT2y*YswY zHgVw@v2`%r+IxW#$TqV=`YYF>a_RR3+kY7%&IX$@~wT{IVSw_XH?~@Fr`8w!+jgE zthoicfG73?Z5bhn;V>L(O3Yv#r`b%{TD&gjxXjA^~Jl#+_}O ze8G@WWd2eH=9RJU{`!53MJ+J=GJ@@&I3F;>0sKkh8+Mz9?Vm9pFgb$bA3Dz#Gs7aN zXeE514m2!!&<57BeesrnjB#Nb=0A7>h5BEpXb_-#$6lCJ-n4=DF-$7B2`ku!g%8d# zSlA~iVPU5+Osa3F2XryDD!91nWj z;s>}G-55=rUg>z@doG+_iBxGYJ@RiR5gJKpq`l5Gh|E!Nw7f8cXIWW=2{$Ypw(}!Oq-2$UZPKh>*z2z zJlY?xl$d4IpoL^g1>vaa(P7+PL{O!xSQT^y*ZD2Vd|#zLc(|^i<10d^$zduxRkF0n zwy+lSMjN1~%mErYmQ=%-Mw?l}D=4ufQ!-v!Q6u_0U@5EsE6M_8oxUF8u-W<_Wn;TR zgU%e3T?{-^y9p+>9xXb^1?RD{gz-F6ox=shtX+q;B3kprfS2v})KrXlBU-d)-~yyt zs~){2rn)vHu3Eko?uo=?U}CC5>#6P9SHDFz{6U3x`iVQH@OmXfsTGCz(b!cio?ji{sOGo z;}x^6wm2)=6PF@txCuuvY=8^UIL5Gu17}3 zeo<@_!Ri-%7$6E)WP^WZDRpdxN;B1AH+w zY*L+zlNM4ZKP{qzI=gVOQ1flcx#veNXk{wBo#R}^U(l0dD>1{`P4F%(tRuS-*f{8; z*;ywYT5Jt#aoANi-h9c>O5*^%R}?Lm2PA~Zg5XaP22|_6Os9Z`t$@!hi_aKdu#R@# z#+S44r1tvX{XM3Tpo-yKgugO;2;nsZd(-PHMCEPrN6K;I`X#E>%2SCABY1AJu+q|8 zEr~73EW73NDYn)Z14WlD%)_4oBr=eK%_|XOL-7KREi0LS3pcphMdMy4wX3wS_W`Wh zKx2BXylcHF)3x=TV2&|bx@=a4rV{nW-ArrhCZKLlK3?w)#^cOXjd{6(zL@3XSgJ)q zWjI0;@Ulh~6pl)PBLgCV`aYD^3dKt-FG65M3jo(Y3;`KqTLE%a$=V-@`I10A8FpMN z<8X)#f?#=g{dskLEjRW|LOP4YK;aBsy%Yri`{=EVCF4nK$GdPEZs?Erp^bh9 zS7q07V?j0R5NqLlQ??GzQ{Ncw962|@fO6r&8Sak+{S+J^_r`|cgEzQCX%y-t$7eMB ztpFX&eYD=^9R32rJbBdc)9L5k+HHm{=2s>ujl9(rd}JLN7h22aAF+`V=>CL-WL9%7 zCH)#Bd_{fZ;B#P1M_Y-_Y^#2Ff*r@D+DLP?V)4?F%u+!7qe;8v@Ud=Y^!(tgs23>!U0;cY9|WQGmgl$bk?@t z`1WioXJChY5nlP9`TPl;X7M~Jv$UI_WzGuU6i8OXuxnV$1hQ{NhjKz=q17ybHdy1=Aj_t{O&1ui*m~hNnjCBB(6^J^U zg6>c^4H4!^x!|w$q7!K?^Y)r8)*ao9P(-KhYb`*oo;Btc z9yHPx!M`P2l(|__9O(7~ahNmgWCCAu;7TNz-0h5!bsMll0f=R=;1o1uflKreeyPG| zfv9PWhV3_hqwinS4BLHf|86d&Sp<@Dx72_8E>yPpwwa4+be4gWXA53DjoMwxo3ozE69A2}+YKw~On1;@3~$;e`vE?ZnB=aJ zy>E)_Z2btf76N0N>FoBP1>uBI$qOHy5wHw?puJ1OhO(YVy}arO|Fpe$dc7zQioXIp zmg#0e3ACrqIopZgvPkHgNo@S%a0`v^p<9d{Lc=9CBj#Oyo59r(jbG+iD{o!M(%3RD zia?RVi@PypfLggsnG_cWPie$Hv?q~%vdd*ZhhXagXMhJ;z~|&&^9ht75XLJ1)PuGcUKiGC5IbHe zIAK47-3}WKb38x7oT#pB1@o`XIyw4&nVM`v-LB^;X&l-(cw^m(-*X9AS>v6Ol z9Z8({x>KZ5gP~T=)bLBYl+-3<&JC)5S=Bl#T^{0<3>qTw3yZ~XQ$Z0(3}P6+d1Y}V zsa3@3zd5&M-|`607*Ge0<4UcACKQ%n4aOws>5gw7y%=1=1;r`*O-6j{s4@**lg}M( z=ye(mYZ#*K6@q(Q=$Jm69#`Z>+t#)Zop2vF$~(Ob$Q!x9Q$a+3k}l^Qvwud8lGcl3 z`4uiTnrHO$pE+FI?lV<^fi)5T_bYUhim_b+KZhQk`%k=IpsKAuCA#j>V%bO@8AtS& z_zqu2e|v%;D|l=JTWpVRZ{E$-2gY`OE!GZSy@ z9FC55h% zBcm2c_nAmIdLGYTxqCuVqAC3&Dbe)THS%vM>YPNs;d{KZSTi#H@rZdS=C|K9QkpJW zJb&<0cTjJ{QS%@A8{Mh~#mb%dOn&}2%oLi8SVNFn|4K|t=#OV5)HvsI#zCYfGo6GH|9X)A!=_%fI4h} zhGoU);}0RyZ14Cb^pGS}`6aCB|}IyGtP?eYh?L|I#IDi96Cy88t4kz1#;WbZQ=-PmVoTXv zNUPA;T&aTKRyuyA^W{x84&0YkW(&nQq>Y)ASXHuEWFR*Qnhw25Ze;?DTn)b0nN>qH zz?P4kgxbxJ&i+K)QeRMlb3R>S&bIA#S>%Ewz$(#dLyrg0FJ+W2!>M>t(^m)4KYXdD zBTMHD@)tSmX@^SClpW(yhpU02Vtg*1G^m&BC#uHD9#}KCfFA6eN=6L2jXe-YnQV+AgmnM3zrrB zo0jB5f*`${?q+w9Fk5$#( z5tP$Zqrj7LVI~Z2LRUEacv0>+2*NVZEj1(h@qfMmKKzWYmae7__?6{@;ury^0lTNI04Y+I)AM(|ZtPS_h!(Q&%g@%oun?sF1@0K=UqHE&08psLNB; z_gI^B!QeEs zcoXD4Er;PYQz37?rIgJm=kgW$GhAq1$9*)7Z8NgzvfY81m~ex2Cv1+Wpd5r<0+J-~afdaO6b%0{eV>Qm zbpS!<# z<18_N6h`z)KDp*q=T)RUsqZU$y@fK?voEwlr9)o*uc&;%(|xI4gKX2aN)O&Fxz5V+ z&{Jy(bv0nqFypxGUPdj`XC+Zrl?}hK2p}o{&apmHKEjb8D!sQ6!J#i3s-C2vw3AmjId?Efp|< zz>rzBZdmGe$*;3)+KHlQ*Mm_`E@OX$#K!!?tXl{3hVBtjyEwA&QcR+QG3p~KyeK$! zoO0qKstSz3o3iu5yyeQ+Pq=&HCYR!oR+rxvukV&X^ykniUA5@RvF|Xm;hiC9SKrvM zw=*RJ2|xEj_)Tt}-UvX1D^(zSY%SH!_BWaXzMq20gD8qfyK z)ks3Hr@`GpySeBlRK!SeVucnnb>6~c4SbeE_#!Wkbg{@1KDc}E9Yh#van&rI;{-}x zmb^(n_iYEHA`Dg+*Ru?u%>=c&kr`Gy4WJG8f`%KX5qT%qrJ2AXo+NZnLl3n!f;Dev z`{`zA)4W}=?SwlVE(QpElT8l-5twk0aHkoR+4DKdvTWpQf1x6lA1G_O#zEvns@ks* z9+^Z)-p)GK+7CnAGP{-&lmd!>=JvDUKK)Tkrx5nYo<8HuQK-G4M&z}M4&*Mcm}R-Hnd-LG!kZDg+0NJcedz`)qZ0V5rl?U3`UGE1tEP8dw|uWV^?r1iXh7_7 zQpCWYMBQK$n+b2367J`{K!w!@Hc$CZA2{};9T+z@7?LWpc#MCu&nO?0Dy$KaTDFh*jV*m!8%9RIo(`;+t zWH-qjH~R)DfDh@qvb%(HeWPWvWliZ|LH?6)OXrq-jw|+B{q9B>CCy43ojeKxw++rh zg^_ftMN!%yx@aB|KB#AaVmxjyH8n(U9q}3J%yu>XiL93NfXBohI_^ZnbL$Y%CMe6= zj@Re1UI_L#TznSdL9^qF`snVqZE`jDvyo)b2rWCh&=HQf-6L_^CTF}^zBRzU#t}lv z=B9lYwP@CS9g^^YP6JT0ca-eWUqTCHVm;P>-EmSf%wE)pTn{IEKDhe?lNp@tp~hfb z!Kl?MQYt$#-?vfX_OQggkTr564dK^V?Nq!YnRmsO$463u;$>k`=qUA{-Uj2Cn~Kl!Ga9I+hD z&p23=%-wvmoBEG4rg3LxG}1-D%%{?2J!Pf9dYJVA4|TE!;c$jq(?$)9aBKCJJ%ZKa zhp8lhZdvu#MP^Ithc^m$!rtJf$p$oHJ=35B6|LlRXgggSCv?F}YMiJ?^uV%Hi-S zW9I@lqnFsZy~jCYL7|V2$(!bkJsurHp{%I6r!n)zska0}#ASK!J$HdhhKyyoNMhD*lq&A%;3mpS}VONBufM;q$>nhf<1;z zpz5vn-Kb8A$;A5jcPd&d#}(sU>RqH!$ZPz`PK&9kBY*GmicCl45$ToVX9XJ5sp!!? z>Z^~RS*sHyCP;?qNBc2r!wlH>Iih9~0^5u|j^XUy#f#{uE|q=@_j^NFc20>AhrRgC zVVI=WWR&qFh#N>Nx&d&@aFqlT@3{zF(TvQ%o|8vhTfp;bb4f zE0|=f$GG6V94+8Ed;LKz^`vrN3ok;yQfI8O&Je$QBciC&R74nIt)DoK^3F2rxk)39 zdViM0(J9&aG(m62_?}s*^ZkYAIz-2kZ;LGHCftowKSQ2EkBau`xGNZIoo7s+OFLfk z=Ar0^uhilFo9^oeR}S=tlp0S3zMA!?Uud7Gp#HCmWS_y9^Z)>cRG};HRxZELm$N74 zFCwJ9dtc<8juUH0`kPKqJ;Mz093b?cWc4}hdj?w~7k-_=_d=TBLEc}1ZNc|MtnRK@qmX!^&yJAz+6-JnkVEjIfFASF(SBKWw!3!I@&h}!tHKxDt);xhBOHag?V z{J0OgrrGPbkI_e5phP-sus{#&bPk~L5~MY(JV%zYTlSF;^!W`;mvh&zCZk#Ue3Gqp z3o(zo^^ISAt@a}kJmhA5b?Mhmn+@2%?)WGzb6n)$8Cb`+O@kS2JT?8h_flQx3f za2!YX8w$Gnf!cyyM1qn;rqe+{rkCT~iRrn?(vHfED%_rtg0>h*yxMuZHs*!rf$9c7 zRW4f+cfgo)?i_MT)P%{rbhogqm*}6klZZ1|(ZT&I?R$yyV(IYDb!hX`2qyBRyvP_R4`i!rlRpcg4I`iSKcBVx)OJ!0ub$>6V86h4yZ%5n<>=@8L38c z<$0GpXiankkT;ARv1t94nQ`}b&b8YFN#xfLg75?V*m*kGka)TRde2A4ja1`Hcd-^b zt3Vu#jXFnCgN%t*p?$ul7?}!k%rXy3&PQFm5|aYUv1F(0;Gj(w$IJ{2cPpdKZn9&o zOI^(mK(@+LdPiG4(=QvipGdH%tcdalF?4Mpdw6sv6O!xt_x9Y*bB84I`kIY*s~+DI z10h2hab}Pqbfz^M}EzAqzN79ym*PG*szCa z9Y)7dbJ*tAJ3h!?a4&yCJ1bBYG&Ak{XgF@t!7lc~Vo=uxq0<_HPazPO7jw06Fs-I( zoLvyj#)}4SBX;aB7!iWjyKbH9C6J(4O+^ren)@K!{Vz_8sU0Di=^N^aP;Xoz*4o!im;4<@< zOTb|yrAKU@RZ2!07~ZWsSLu0t>(;4VpNmYK2`=f6#@KuI%RWzN8%^=bdTOT?Y;MlB z2qwJ%$p-y zh|?pr8CSvPPS6CGK+5@JsPplaQrQ=5@7Y1RG$6&QN-LZdwN zQ`N86z;Gj|E^xYwb(X2E^GGP3>qw{tq_?49y=XL~Qle5ax=aku!ocv60}u_j&ZEqm z`-xw#4!K%`t*kq~UYc_Hh(b33n86#@@IM%^+j*apdX4(;|$@5~dz3r@G2 z-NSsz>q%Z-yPKVbJ!7MS(5$EY0dk!CPu!g5hJ$+~O>6Oqb=_jOhR=0(eT?pT)Gxgm zmH5oJuts;F=Qg3}Cm+fFoBLi;#KykYED<~}vX4c@LaOQ}$2oj%)ZCBTWr%j$+|-?D zESei=zK-m^$9m;zvPoMGZ7f|Brk`DJ<4Zh`GIQ)zzcja)X*EieXnb$ZF>^GdU|83% z5*Pc>wNb~+4A;vi?q3f;OB zKg)8+ylpP+BPn@Vo;LASxc7(9CU0q<0%w9?^dbUtL!glfI}|JW2#?5sQx+VrJsZ;K zC3lNm7*rU1g}|;0y=aYPOwdfB9Utg!@}i0NF2f7|BlfxuCx$7Y@d9Gj zhF$dd!oOXN@f16Uq;~aM&F!qzV@l73=ewcrP~~x0yyep<@>i;Q{_T- zGOmN*Ue8a-Q7AjNgu=RHhFxW=4>6<7xK;Jdq58G<%ZN{zTxvdkhHJ|7TMjP@u`V1J zYJP4ir`T(ixsY0F4GP$y^jo2F;c)tZ*Eacf)lO{qY8{wArPKO7KGNOVH0om8)1*5Y zf<=t#v?WbCYkeo|?#>nXIj&Lq^RmNP9f9>tlW4m%14&ZCzlzfwO(K8h^G|8Nn~hjJlu~p1QVzlKGUdf-Lt6Pm?|GW1KS*K zGbPLX0qztn6F#(_4p)!8Wq)oUZWDN2V+00MB8$`a97qGxMi}P6as<$O|1J268)7iL zfotx~&d0;cd3i3^w(kmBVv2qg$aoLZk9#sq6vWe;wrfHRFIzz|*~ z%KEVY2=|?Eaci|XBUJQ-cIp3cs00%2z+r4#q2%m2;!IZ!?l^jBjqS?PXRGYp?{ z4hK&qfE~wWB4sS2z2tx)kK3?@XHs3?A8KfNd2mjndyY*wZ4vf*NB=?}6>4?1f~9pX z&?DfH5J~3Vi{HxSOL%R!X?DiYT9vr;NiujeOF?s%4-fHJ6xQ=kGyZ~;`LrT~b29mi z-;g)GGGmM%CbrCj6zMqK^2%=~5p=J(yv=k#iA02iXLYxDv6)E-MTLofcI7nAiSzw| z(DtFRN$~xUH)ftV8oes7l)s6GDrCd_fSMgv}RI#;`fyQff2^@%w~Ug zc&uWfHAepWwTIH3d}QRtKX-dQh0sRR7u-!BzwUvmwwCVP$&;N*YYNXYvb>YuqJm7A z%KKWeEb&|eMBU%Upt z>=Hc^acZdZGaNGyOI~F%gNq{Za2Lx8R1U89j#h5(o^S7vZtgI;KE%2{$hz?Bm-=4h zyL_4>;S+u(q#MVM)gIuDq9&R#@XUJW`wOnY^+F|~wC(#FI*_kPYVuunFI=p{^oos1 z?&-3(6A8xm_rA!J^Ci94sWm_e4l@l1g{&L~ZlknaU8~oZej(nbwtjha>FMvRvi>R- zhK8wsF7oJ4Lti?`G`7@*?15YFD*!hoGWf+&8JH!3z}^B$h-QI5Fk!3$z898hBXgon z@^EsSRY6*T{uWCZjVLm6sKt&W3)~~}=iBxF{@;quQqXrnp?_{{9!LNH?f+GXYij3g zYi07kN^yT{OgV2XqwItuffkpmG?@E}M}bng;Zt&|Z{WwVC3|ElugkH;=HLtqy@vG)3WE2ISh@_AN9yV>5KDlO170*b*@x86wu>eB!?XECJ?GElc`+J{$ z4m%q<`qiJ03%%dRgH?dyu7{SuW}G@54Z@xW(H&5l8kYX zsroCJdRY@S)etLB6W*7?(9B*4plG?)#Cb4Lo8||EF$PS(KUF-zM4_f3wnQMN9c37j zu3RH_!oQ1ZyBE2J*6J{?IIz`-yAX@G3f`9?90-jZ`w(EEE0Gs>bwl2#SUv3guqx~g zq?)l!ohLWoSlYLY-m8y#+9%9b`1k`bp#LKO8EBPi%tGE(;hg|X%t6wuOd}4F8hV&vS#nRQ0%srDN=m#SghZHMsJ+CKdMC)wXWQ7sBhu zM;^Sah&b@Z1O*!~%c;}h0vBqp zeLnLSE}Q-(`*wG48jHY$5{+S24%@qex}Ts)RfPZSH`CQbcC^vKS5vHh!x=IOS7SgV zi+sZQwVTW;wDTv`u-LQW()j{Weu zz971?XLR=o6rIhBkD^@fy`5G0^pyt?X)ds$r;3UCmVXA?5lFvk@av}X3M=u44Ljry z(U17<3JiH|UGxNPLDJ%%A-n}=agiQENlDM)^_*BNciP0g+DML%sp#6MC%QIEkY=_f}5@n}TpCoI0@GPYm4yh-?w z4LKuN4q>1G)*s1`4IO>!H{pflp%4QfFO@~2ectzkHhkmP_r(V4qaJG8=j zG=z}1;XYaY49Bv1(U{qec0@;bNQ{vD6~#n>`^}M!;^&m^WI-o-@4YA`RtAZ`x^MgA zG1CJYaWRnBQ)X3yW6QXo9JtF2CE$Nt~NCe%|K9TW0VLE-Fj!8?{hd=dcSMdpy;_sM6{cOdIb@82=5gCpy0J z+@f9+lN+<{eJZqian?D}hJXqPo~(*uNt8}Ni{w$0_GPk%$~ba&eDCzHRpPxomMJY8 z6e*?ojq`~PVz+4hg3F^m7KHaWZ3(II?onMp%c;a86Bxid3rVg%Oe|JOix+ykg=72UH7M zJVdBCi~;E@fycIcJEXVM@H~9b>Zet1#5-ho>PMwHIHn;$jv)3_>TpNm3X6%nq&7Y} z*k{I6&`nEjLz#O$x;P4N6QYTZ3#BW*jIf`yXfSb5*tnS+M%_mXD5*0lOBqpkusF2s zBy1UKtHr%g5F=M^$7D0My;%+}j6le4=m~9RX=d2xO7&9wOd&~H70@(Pfxgr+E4^{| zR@J8Kor9-OZ;8%@W4E%;_Cj(o8C35B=Bk4;=F@%V5~{p|fty7~i^I=hk;5z)Offh6lXBMFABE zvNs|zqHqc^V<5Gd9;9+$8)zYHqgyrg^FR?PzE!SFmeg-4&XOTZx-pBCI_-hqq|HY9 zoS9#dg@QfpCg%rrn(&l5j;)7LQ>;!Ch*^g;p037+s^MFI+u7q{V^g9WDOPi)SIrs! zXh@v@6Vz`r|HDKlGy8YhYqq{e*jUk9g<`iNhd!HG9{FK*+Q@7d{Wf4n_Pk16fAK_8 zw#Zf)!eUm>`v~vhz0X!bnS#*9DlNW~cV{~_{U%R}mN+~Rk0>4`39CA>`=nnWRXlpV z3U9fp!2EdP`kxc8meH4=_%m!G0u2C25&{7K-ah}23t{EJWan&dZuZZZ?h;4eVT1F= z^9ut!NLa;&&aJZ>d;w6TumW#~Ie8_91rA9z$Eh4SFV&%-@z8r6mtrq7wu1BvY7sy%Md_3@}R)4G=kjPRu?~F9}Da@W{+)NXFfTFOBn((NBrSLXgi`L2E zqfT*VT4B2i5YsI8H(r6I@)5mSN3EI5HrWlhh|$*po0YHjSnRQknbHs6hB57ccaDRj_p8hkd|+WLjschKP=rlc!iVK1n(BLxPFw~0?iwR%5n z2wyrIq|=w1+OzT`z_CJe%qEi#^ATQW>_G<>0MLGz&!#okMhg4`!i<{k-2do9NSn&^ z=CCvK=HQnzeY|q8mPO7z=>PLrY4!+1IFY16dC%;f{IC*zGSrlGBk*pJN7Ea8`WIVm zxq<6#v)r@Z>6+M4l6^fY*3IM5M)a8~AhyGqXctj5*M?G?^Rn-Kw=`d?Zv2)i)7fjp zxrPY04U^f>Moa8FQbf#naVz3J$%2Gl(x591G^UohR*DFTx|0oxspt~tL3wp^>9*!# zozI0{>T;(~2Tki`*|HC7)FH+q7K;Zf3_9F~gHqxueVdswVmk%+igD(O;@V{qhTjgk zc2#)B(bN0*vPs%rc&c|bBVM*SDty9!L0 zs`5pVQWhhOa{8rukFqVu2C`MzAKg{%r%km!KhwM7K*(NYwOoP(a?_@W8dpTXxfPU#Na3HjzP9Y%a&-_+Eu%3+qSjK zwr$(CZSJyd+qP|+UFW^N_ndp;z3v+w{Ug_}{8o%LSHz6W9Qlob>6X_KQ9?~Er}ZOI zYLMKT^Ga$MHR~umhj>?`D}X7D|1L2jXQcoxmz!ur9q$NAj4*BkR-ln6Y5NPIf6VU^ zwO4N{5(4HhLoVleS`Nf_1f;Wi@9@k{TSR8x=tau)_0w!Xo9j;`e`!t3QQ!m}2BMsK z!F1*+mN^Ak77u@8eex1qD*Zo^CZhdkL(U22Pd>aNjF z%+hivX%ba$Db#)gX7;gfi#|!P1r53w@JQuYRONRKUC2CjC6#lHO+sWvg3jbP6i*sc z;Y&M%vK!!~jT)_4mE3g@6 zBVZp$K-9|`>vGIz?i{lW?Q6~$Dl3#JJE#{ zJv%nXWXr?!*bEJm*MYiDfYFm04WL2z$T5gB@OEUF{b?QlmGBYJ0e9i*+8?{y!c<R22a)JnDepfJujc7pcMWfY5#O482(UULD+rDeebI8fA#Z_Pd&n|S{NJ3z za>uT1gdgBhI1}97VBstCZo_9uUr_zL`j1`WLi%nOhLRPyM@9Z-Z59Yr@t6I?6F$ZK z8>IJC zq2p7HLFx2W^7+rh2h8i+rcX+5XXbQq@@5ScN9daH?ZFgzzF^eyKxV9Gk`BB&^Sk`X z8G-b$(y?5?jmsIi>3H6BAw95ilQo&bD|VYRJaNhqKIabhpXP0NDC|h@W)cq$agT8} zPFy*)jU>TzreZ#w2y^k5T~NK{k*q8+<;7ZH1?9bCZT^BAHhOyP9;RxSQFF>ovtA>) zHrDc6+KuiQDvAC~%MyYYBh{w%%sT?%>LQcMiPpY^sbj%{Iwh|Bt>zDc*VWI0Y{(QD zQs{d#cut;Z!!d_JIYJ-oZ4~X=H=nYvG*ub;4qf6bxQI%28ClviEEuH*U2?=)p*F)~w5ERjU=j zWn86Olq-(X=U0-!(NyNGgyOPp7Z-(45>X+&)v^yg_ugWjZr6JdACx+N1ki0P4sbML zsC1-D+xzu5-GNU|-yfDinT`TZ(0?XVNB`nXnrEG}Bc>9aE)tU(D^m*iEjs6AU+B{5 zsJK}ik{n(udNUwNHA!!ZAt_o)b0>t{9bxR5rg*R5xQlei1^+UMpr)mTq-+C+>0TL# zx&+8U7DHeTC;DpV#U>{5+2|<>Y`6+;;+z#7?^)W}>hI9yD`+W6)`c{dSNAa5k*b^@ zcVO0ht@>;kW+%6a&4d_iG&IH28PfeYl#|Z{U_fBR2k1YmjenTl{}dSi>8bl8M)e=n zhN0d+?C$^7O!wcD5&xO|pEcnB`U$vyKH*?w;`VRf{|^2D`QOQRO;0S#h*Qn}7u~KoHJG}8J%oRN1f}gKG5G=K{}cZ)nEI*D z{uShZ9?1U@Qknk-(*JLnu{mv+I*5Oh83UtjX*T$Q>irWWKk*OK#3^4)PejPOvjeum7|{uOdk24ea64R{C_Lp|B5q9Rmu@l6gx-l@=T*{ zeBk$57mTlp{l70n&IZBKn?*IIBcOMf{8rr)Wi{ zIp)B0f_1j)>n#kZK5|$Fv30a35M|N`H>=DB5KAuCOsJAbt8t}kD5hrlY|Df9xpe=p zibE%KrhA%&pfc2(?s3muKEds~{-`FFJav?8&XO%cGB92Ofh&I5I++o`!9@(2s)V@U zORp#@XQl;p!y&6IN0>U9QTA9cEB;>K{MjtGIyl71bb8C*lLzwk;)C(i(vqWkUWQR(kJLD~RhZ7ON{e(lvv7 zFb}G3DUF>pk&%qrc>08h(V=^PI7*`umKbVLAYEN0JGT*dK<9mK*F?7OHxFT#BZRPp z-UBQGSgluBt7z*hD-Sv0)5o=2HlolR&O19>4BJb2EWxNli-_Lb-r9y__$xpA$OIS} z{Q-funwXeaR*+zxA%)_Ya05Zwv}6PTJY%Y19y&D=t8=@BHtH$@_&_H#qhQS@^vqs& z|D0bMt(uy|FFLt4EX?vM*uiYo4kM>4GdWTyGnmC>D@QiOOHsBq#FOUpaR}dVq4OK^ zeWcJ4;SrFrjLDY>@ZiX(5B{kaSvFU&1N`U*6|v4V@QXm!7O+A6i|9Q4YrS@B?YwrS z#p8Q((Ks{7Z*O?9J)0KI#9E=La$f4D0TqlAm%Z!Q(zT29NxyRwc9ZS?>b+9+S#Y>< zEH1tdUp&*51l@sm1;$N9*$rK}`m`2@-X|d^AXv%uz0-JHWLzD+o7S+UL?6Q?z1fQP zCeTVp060f9Vc!339%^4bP1!Wf_@sscxx6@F=v6h4G^cHJrm&QQNW2S9cpVCM5}HRH zAdy`bks~dLj01QH=Tr!-FoBqWbo+q535A}Xe05<4myj^dH`GHL!n38iV8&P^+;~)% zPxzO?otqpaGz#|N%;b(`=xV|9J9{j?V`57Goe*HZLez~+E#y44fS4mi%bLQUmu~W> zxlwKE%gO8$&|WW9YEf%=p5aprnJ)p6ntPxjwc_y88VEDszF7|Lvq}LQZRua5TjX^) zgTi_Qk`+L&rNQpoJQ(z#gyHttI#Lsiu${#0(>WwZv)%gH3Uv8YqEu3mBiU%R^+L-o zJj7@1a16O5Y?W#m=v&OV^utne4h$WWwhB+g^w?>bk{1jpsrsn0$nxY25e6UJiFjqz z>{`yDGr4@sDUsX*bdjg#k~%sO<9w+^Vnd-VXA);H2M0|vpF9DL%2VsqW-nJEZvA<4s_LB`5y`ZN3q6GMiHXX; z;+@mH1>5trav2|}D@&9bmQUPXC*~>Lr7^Rm;$J`&V2g38tGLv?i)%M5D;uu5n^~r8 ztq?=cWiQ4z26j>tX36;7bh05=+>j|DVE|t`?!vp#wrBAb@pj zqj*itwa6AP3c>6YH(m;pcw*OM=R<-U$An<=oTp3gq_<~Z_YZK>)sF)0+8qg|f*v`y zluw!6Kt45R?y%8&m;GaNr7btDuo z%q`Sv1X5u(tYAO`bIbFDkyPKfet0coYm3byCV#xcm_=Ega(ZwhtVN{-_NE2(HYJy% zf(w(n{Cd%(p!|d3hcBS*BH|BLB3AEK57}ESasG28VfnyDXB>2Tw}tlx0B(Wej!;n-b^25$*+Z^g*v2AU&y>+xHECgT%3Yb>KwEq%nLadJY<4b= zu`frTRdkDm6)wO)4LT04-WQf2ZI!Pur#Tp-L?w747ixms4Gz`o)Mo`tfzT7cOH_>^ z;~ha|c@5Cd>i4>h6gT`5jD+i^Mn8&^DJ+wLjy#M}r50}h3t^ZA!g|vPCw|*KZKn`G zzU0CJ@z>EMAe4awE1rr_DtY+k4%l@GDd~@x5!^_izLAt<+!Ryq-2!A9mbc#uA0kkQ z+6P9S|8I3Zs<_j1I;zHjiDhbhGsL>NDKj@`@G;^?WKSAW9|C4V5CDW3 zDB^r26lBWdOv2c}nZ7=VqF6`LB7RNdpIn>vXbrZgyNw z-PaQhwBzSUPBoJO;6GIizsKvo$KvE{t|gc+h%H$yibHbJhI{PdW1{h8;$e~IuvAHN zeNO@6UZC{D4FiA&ZgyTaMiJ)SeocdF`#(PyxNY*NU;?TGUU$rJ6Ts9<#8gu|Ra3WC z{%y9Q=5A?RsGzl?cu;JXj@#lO{t_GEO3{RnYSCn1gb==?9Av&J1%% zOTah=d|20t11{>=kLD`9wCf$0s>Y^&-Lp~jv98C?^@ z>wJ@;>WK+WH21+wbv6w7?Z1I|{AuZLF+-40pMV z`8r1o>ocP_DfL-vermyK6P_a0T`*qoX@5J6t!cAk2H{Jrpa>vMbd(b=Z0Yj;Bh$M^ zbsQgTh@CN`b-UT7_Pq7yTJ5IGtgiiX){nWBV4KKKQ|#?$*Ly4V z9)H?;rsrhjv}pgFpPyCRbbH=>-}-dF-b`!VPCjqqAPNhmjQODNRW6HdENAO7sgwq4 zX&=>m@!?eaV+JjDWwCi_EEbyaCECS)BVp^g=iChW#D?}&(m!#$<5{0+lROWdx>E)* zvWWMyh&y$w+!CLv#}o2s69nwa+mhH=S(A~PxAV?$Gl`$`WpCG#Fr6|^V{Hu&7<3$4 z9GLqJvFe-?BX&C+vX!Pr`S>}nFerf{?BC7Z)|7tprQdhKhU(4Dt(%V{ubA2WRxh(K zM0BA6(mlv#LeY8m>7)5ENPSmbtkZI5_*~8N4({{Vxm?Aw6xXrHd|MnfPTT!{ACrCE z-DNv`SnYGf>*Hj#+ltybK~;5zUFV$17F9)UC7eNRmk$Lu`Xuv4(P-y>nyakXe*&Ig9~xWwlqY8XnyCS z2x2NTB7hAM93Z84a$yRMV|fYT)W*C_3k%~boNj&JOnrtdTDRTy1OZo4+i{I zgA1~O3Pm3PSVqX#v}m<0U$AxBI$zJuw** zNrVEBFU}#Gli$S$A2H0Cu^oyO+h?i9&jvcZj7;pF(8a$Ipss zaDmQ>H_VEucLC3e*Uw7P%iOmKx0j`iYf*4rv?gj#20Ql>9<^Qkp3i-;gBT*|%R@sh zLd$LO&lzw__I6b+XvWr>R(y+XCA49Dz+rkun`wnK?<{c!7E`vlzQb5+p?=9TUT zYn;!6ad!US#MuL5;kMikPex6s0IwW)zd@=-yjbQd}b_)f0!(f!FOi(2$!0(Kf}l9fq}*WVkOftc4fk@vlF7k`8f z=PeEuEDm=|Y&6}CoHP??g}sXN?^=GVM3WbUaS6wRvmaIPJr5E6?LNpUeUNh#0xTpU z9X51l($qpqng)(b(;Ye`xVe{}V8c9}Ka~Xx)K?lJ=Op>vCeLpv06e!BStAWfhd{K+_6?rJXnWhl>gPJdwt($e^msf8) z)S7W>bePR-J6yRT4$aC^(oMs{$z1@hq5+O+_#hG`w_ZMe3DNo;W?dyQ#ltEz)06GM z6zX35EPxkf5qF@Cw%=f#Q=W-H%}UXy=Q>rl2TodiPqw zRXR#f7fzBBHa3q3yP};S1D}fwJf?O-Y*hISf!RnsSPuL_Br8vt%lX zmQlkd?g=BVgs%gUcodrfWW)~o`1dy!S!u-FSD*@J<&y3(hJ>_Fs`T?%%HJ{Wlq@gN z9&Q!X$erBIg1H5iTu2Sa*X1&oa~@9L2%TAi{_rErxen4Ei-4WR{nah|{u{>hhxaIDgLvm{e>(VTT(U#W2XakRmxEe7E_p1QCCYChhaFo;bi&Y z?A&PV!f0-3?DH}E(;&>gzu$z&5>Cj3tUSuXDV^cYW0N5TRI8r*NJ$Pxlqr9g8r2*M zmE|U7Crk~@?wV&bmJ`LYK}wkZ{X&h?D(*6ltIld?@iNiTy?VB0XV7d3e7`^H(KW z;?G~&EicP6UWWC8sce8HvOHx^rXxj>U5LDku|F)~8W@Ln;`?;>ZdObbI*4qnk{%OO zbb9$cZVcJK{#MB2T+{SrS(?*QK|O@VSpgZ{L{mzkCVhqb7>Uv1RredKB`(GpVk7d( z>IPt?RDHcdjK}M)a=Rtav{QJkD!r$^|F*?#^C4Rc9rq|fe5qnQy2!|HpMt#LmF~J!aId3R6;5sZ4R~ z_KLQb#X{aA)B`Ri5RLPPdhYoypbGq}omxKUQsl97Ca4%8Ig+aoi!5ogM`GzH5X0il z=60~cdNf;-x(3{pt4hMPy;R**daZlE0$1cqUjBT;E$QJZ5YYi;fhlx1G<0CLE98vW z1|=M_jysFVr>cr%>N=}kop5U+8 z<5+^Nh_rQl!sc|I06CY&ZjME-J;j8zSov722|qnjbTg{nSr5pq251<0DuYxy7Q@tq z8N$?>@XLh$kk%cQ9cx`%4?Iq>)n2tiKO8cgu; zM}MolR&npeRaRFdm8Ax9?j1K0SEzVNx0yQ7n9-DnAPX^AQy_unwfP4ubmL<&WdU2P zY{d9(9~Bu05g`G-X5`w+>>`sP+uzT~xYpIg`X1P>D!j}S{Gj>Ke9~N8B;BMJ{(ee2 zzFitb{!tuZpeszUbRoda&8JxOf?iqit}}n_K{g-MB~qAAjD=?=pZZLDW->rj3UPP_ zjamLCo3ICz?~uNtz3X5b5$tp1p?CCC(A1dL!L z>gGM$j~Fis-sSe=2>WKG7X!9jX5hhB*OXqPN!a!7$m_sawS z?=giSmkRn0^ck6sEVm{9?Cfbe2mkT{o>WcD{*sNF8m7Y0z+evHws zpIY4MpU5M3j)#+Lfo~Y9j0E^9>O_@fdsUSqnNysnQe3 z3Jm0c1lJ--vo;Wo<8&y~V5XGV@`*BQA}Tgksblg8Fi+M6s)%?)RIC?Yq6zUrfm;cz za&N_}QQFj6&ao+XCohSFG@&sdc0h~3fqPDkB#yEZ-$6HQPX>xGyUra%)U6GyukQPR z*ke$S>Jl9DHUd#GuLqqav@SGq%eYyG>O#Tw=FA#0sdT5af!WE?k|{<4aG5Nee?he8 zyf`)jSndQ*0GfE$;)t?I*N;_)1<(WtyMySNkIj++*Z_~gs|T3wWi%qc*fh}{+=9Ic zv5mbvqy?7<#1eHzJdKr5SLSL)81B0kdb#WaW!N1ff!5MMO}?_7`WDfHU+r+5Pj6SA zTmBYPfbK5PC3>^&bk94d7oGHHcT<8x3x5LNd8VR*O6QF59;U6$mK2O$FKM0{o>U=Hp`=e_S}V9mNBb^D5=M zUb%kB_P`6w)1kNLBeQ%A^Wf6&@NvHC>><7adrIOr1x#NJ{ePO~muVo?tFr_R9p})-rAL!}pbO8D`Cq3L?8_MKaPO2 z-9j;}j6Cn}%>CQRLH#wOq|5Wlp7fXF$+)7nD=R+e!zmh18t}s!&%5dz z-XhY!y5MKtEj@5{_Xnu5<~yVd7mX#4Br*ko_cv^Wt1v z`e?>wK~LxV{u=I`Bdx?xr&%z)tuN2Euyu7_NYP1jQo7Ol9T>Lk55pskd5e}+Ut2PQ zEC|Qqr&ZSbhm|?r#wxP>XPjVRY5gak1|1fR>zApZQ4sg9%0jtMEv>J9^BTepr&Ok& z<|@D(Z*I#QO%;Y(-Q9rTFERsOZb{;8iR$Lu#x6Oj)TQb*kXOaU;0$57mg9mufw`9N zhU&AvZe4#B_-)fw#nV`srw(;8m>gr+J70-{)vXIi&0ewdve)9)CA06QbB;_B@>J2n z6^LR$vk0A4dApBH;Lxs-)=p=g;*);P6$w4{1tP%=_6g8uP zAp#=h0b#DZ{!6`Y9^YLWFpU8%Q4_Y4)$L!m7ZD9jpj|T5eVc;kRoD~=umAgJpdR>0xMJqJ+i;dyq=~w#N zKrts-Zw}#x!5-||T*a#MQWX)IHmN!Xt3WIq4EG!`AA7B(;W5-N!aOv&u3bne%$+I_ z9!rQH1U9HQ(h(nU&=0?!E=bl0x>0RuYg2SI0R?fBJfhKusO~i$uXjE)Ts638AxsZ+ zEc<;z4b4k$5s$-tmm0RtzGH)QxO^bkbn{%)cABX^_Sl8_3}DgmSD!pK`e^UW0NYVl zr)jIap}R+PKpF~1)!ujqUxU5}?&Ex|p*x+vx*Kke%iyP(zr~@uUAGWxR_->;8@IQS zo~#uIREo4WvbWa0hsLx)4HbJ^? z`U#U?2OahYpq6OH>AQWqYj4ioIKZQFdcKQ(K#DT8O*$%j+Yz%%-$Z;k*}!?9e?7Ad zCu!XH`v}5$1EQiIv1oT%pm}~H9kC8o-Es^a(;mE|bzPU^t-hLvR#j#D_`u zq5E|Sjy2R8iwi-=ZpcPGr@|3enQvSpTs_mq^|jwVvR?664{_?4e1sHv2C@DeNunU3 z!4EcoGVC`i^*m{K@eMtUFHsh6{!b(2w$|Yd`FRx1!E++he32Gw{85l$sW;`*yCy4- zQ;f1f$>8??{2_?jl2`oKnN}QAH6^n#v zLHK=g8$;_vr-AeP;7}mi*azU6VkcxX7%?8#PMMDieiNFK@4i-pluiUPseq~*NgvZ! zhbA6yh(>Xa1^XqFhC@*{5dCesV?=Odi#I9oD>_OPtC6T)SRfUmv@JHkH{D=rA4!K# zCy@Gxg1xXw(8V3LGyKtXPt!DaYN?k9s7Ji5fZ^9ccY)HJ#-+iOlhPI`^; ziVG(Kir4Mj1bm{#=;euW(No}g>N+}I;l(B(dr+GB5af3y4wc8jg2e4h_13)gnx(Nl=@+C?5(>v12#70xEjH0 zjZn6g=&#~rfx*u}o|+MT@v?7p7bFckVn+`fYIdKMuckUD1HB^o!lDiW$<=m1>M{66 zVwAp$E`W+Bl->KrlowZ6c>BK6sJ3p5lupKPdyGY+3iJM1SyFL@Vpwx=X2N2CamK=Q zYmEJRgfVk@;_L1`BqiUq`c34@c{Mgjg|zGRssuWyo5$Jfr=U}vW-`XR{xjOqIz;K5 zOpZJ~&d4v?#c;{r#>Q(%i8*c>)6|C3xm@gnX5GPu#KE1P&=hKSJ*GyNnzPjwoWE?z z7hIn;vE(>1;S#46I^fK_&_-$g9q+6umiOUAj71C+OtQk_i50|x$0ey^&e%7}t!fum z<8d6W6^`beO<>HDtt4qvWc4dWiu&UKFhG}iKjulfjJ=CsN0N?JNOW60s>fE)j=fsO zJXDYUhSkd?D_#XU2}U%*M_PyZ4=JHZ0gw3Qa}$f_iL#rm-G#y%_f>EG3r5mc7_ETU z?XlDcsp=& z0Q`UKFIY|^)>MDjs#2ju4C(_?;qZE|OcTCvIXCU@cVyGnbvQ=%j}G4uP@Eh-6^PP% zWYHW)XpmB6I^LQln>d(!lbuM{ah)aKa@n&j$dJB+>!D}$P{zsiP1c(w;srx;(PJt2 zD%D49KPh^G{Wf|D{cCaz8ase=PnP+{52@quO$1LG2PAm7E~cm#{z3qoV4XIMiYiBw zODeAV`_@o1aTiUZ2xgEd869NjwT`M_!zErVvnK#5mD>02C81EaZlXH>mWl><(UmC; zRopXLGJIE~2q`GWP^$b{_;Eoi@R0auz~ZT#fXLdY+ip1ubG@>+kdLPHIdxb@ZcmJ?T}ma9D$$S}}| z!Um!OMOoyd2SdNmW4vyV+R$TE6kj?}gbH||QQSIGOHN+oS<5uG>SS^g@N4LpqS=X7 zh!i|TJ&tVtI*4fHDAw<`x*#U&KI69l#uw?V(^<4l~$U%phi9yjFX6shv3@xdrp5BKk}TbHEUZxa)VKHiqCwYb!>` z&q+d^!@cLCnT@%req1N4e4=dN&OPI{X^8>NY8ZC;d{s%&Lp|XPtVFy6d6a`RB@raF zzqjCj6-kA&lacQJ0^V!+5v+jaCL)&m^IJ~zyg3;LZHY{iLFh;?6a7ifnB8ovfCDbT zbxIqnWO$HBauYpnbmzJL#sp0goQ}>3QeR$^9su|IcYxmUPT{`G)AnWWw!(`G*f)=( zD`(vW2&2B(m?hN(xQf)`S{5-^KKv;JY3SbGW}PQ8>1@@K(~ScHAf-MATOB$KnOTP_ zi6veyk9;guO3E+2v|%Lh@-Q!EiZ&(DLU8>-wA!d)>tDo-IYU;to%4DZL88KYH$Q%F zl6>z3WC3>%iiMoM+G#@9d3RVr_o$eH@r1zxrw+Xm8Slo~tBA0AHAMub8T+$NF4inQ2nVVkD#ao5AL}J(GY%mgf^f3Nb{G1rX|G z1#*1>w@d-JpjO!mQZ$0y!uYzLFu*9>$xU!*u2}-U?v2~T3yF%W?^_~=m=+X{fsB-W zz1&H?fl-1Mm+42ioHUBavMO!I1rwZ`W;nMjXNf5^wORJwaDOW#O^w!JDHt$t#1((- zDkUb{IH_r5tliplyQDcf^3(c9T`HfH{ZX`+1CpmgRxRr|NW8~j5DJ)*vvqZynSFt| zbg0%sRYW%mv);?6GS`}lD+70;*?qZmA(fOpvcXO+g(egMYNP42{US-DlW+p-0VlB; zw2~8XXik_0l!9GKBvF&WO)@)^nO({uSrx*+p~tPtwZ)3BJJeU3Q!Ol=mTH|3U_R_o=P<)09a-|!M^f8CCPrfGczfqJE8yCVb5cUbgIBq4bBWu*&Cg~ zph>3_QCwEg1W>+Nm zaE^fM7@8%wIOEiQLqBmJ)K@Shssuf+)OpGNj+=Vz17uPGQnh*)6GjML-A304er|)Y z*%HZ}c*@)v%Pysz%AOGz(R)}C)l>C$`OGR`pz0od>~#F=Bte9!u7@O4(Q0+O3BuLF z<$TBR{5kl^GWH!du^Nd+_aGx$96#R()p-V5fR?_!Domqrb-*FY^=Mag#!MPRD`AYN zorMyYnX)NB1?sWUPmQ{tN1%TIKe}9;Zr3EioQ@$fT>*@~Q1JY1?3=D4qKE{mpG^do zGUt8lKKkxMz|EVz4u-v~^5py|nt?X8aGzQ9w?hlDgkHf!-yKt>kbk+Q#o~jIhSdbs z!ZwGQqPEHF@Kn{j+dH)6FOF0ght???6^YY)Dvoxx9Fd9a?b));)kW_w>qPrD5%m4} zY3f7EEcq#(=0tc(iP65>kV%PB)`=QIYP%xh8JtMD$0rd%VIKz^8!+!C^p_B&9Yh{B zKgFh}ow+sOboSj`dAP-ofqPnhh5}F7MYY*`m|4gb4a(ZACA+LG*m*VV`PEH2uM&f| z9XE=c0j|Qc3-8H7)R`E}N&Qk|OGauQVG?dohpiOwuifbo8<~%MuG@kKp;=`lbL~Y! ze6L>+8*cVZpN3tZhVFL>fB_nE11fR%tV8rzF;n|Y6E;~0!&8p&RK;-tRUjrq zDtzY7K0?9UX4Aaquek1C;?umK4`1kCuf9IgH`8WqneQeq$G~6ge!PgkXkdJQEZfD* zOW#TYl)l)rMbIs#3px#WN9$t72U}pK6U5T~GN@=X8$3Q2DcCOtjkbeQ@4>*3CZDbL zPt(fg*O=CBlmHY-6C6X050}Ey{}MeT%hcrfm0XBlo~}Frq0&&b#+={6<}IiNn-gE* zsG^+A+#HtQt}{EOiVBc1NaWNrP@1lH_uOS=ZQbko`v?_}a`Z@SlAH>Y3o6hk3N!N} ztHb-*InpB8Z}D+vNgoK8emmWOa9CKbsL~obN|ot@(uX;%J3s|rHN8)Zk}PgjnSanOT3_QiUBZTqrdwXP2L2Kk^dx~S<%FaZMZNWD7FJs!Kg-Gl-g1&l zJ8`Nmv}lE$HlK+gM!&>K8y5b2bX94f;~|19rk=d*j!-r)xc0Qs<#rwNqk^0Y}qPDBZX60rtDPB00~QnUv{PAG}_n_qDhY8^~-pcY!M?gQsHL%Qi(saxzvH> z0hvg3*Y!q78{&s5*F6Z_X6lS`_88D4>T!}bFp0Q=DsIL!g+Am5c`*a8@WpTsolp&% zxNZgNpYaz2NaZ2jpI=zb`qXpK>?F?FE-Pf=n00OY^wI76cFh21-a5%G>_Y-w`vAH<+_ZiDJ@D|*vzP_cyfaZA2EA#dHg^2`4!Y)sG#3QE|c&an0 zvx`u72AB}DbJ0P54f^a_QHPGq$(>li1Lbt=?A8?xAdp0%Se;3L-^|v01_f-+L3m-L z6V2-^Vga{uH%aOCe(MfJZ&XB*$q=!%TUh2pl3dGH{K8X2fcd<&UAgm0tvn-51_B;l zkbf$+{^|xMrE&M$3AC>A!0GY!R4|VhbLuL$&i%|e%T#4J36GTWHVAd3I4#8AbBm*L zk)TW%P6Vq(mU$5K-z;&%BlX~$LrWEotoHX$B1}qNvpTt;EPPweWpmSJzesYN>I*fN>2HNP=^EXKU4yVy~};IMrODt-ypY^#T6A>~R6cE>yl9rof_I zDqX}xBg{-%agHV6Cfr_X;Mj-G!mjLdpgNKx<5ZmOtA&)bz2m5KGUCa!2%yvm-OZM& zm%;7Y#Db1)C`wSQ4&4Ggs9=%q)m76BK9)ldKt7!T6E4=SX8`FWe!CNnJN&DkWV?Uq zG!|^@isfvpybhS}?Bd5Vs9;dhP6h_G4mb59$j#CIrYNr#s4UeB*j#xol1`GU^&60raUm&|>zn%x|iInnsWc z?&%ydQ!qUXNKKFIcBrj2V7TQfwi``h$W{NR-4Ms}JoQ<;4uFinidA~)YH4j;?C2Oy zZ=)ngLc}rw%!`YNokM}LZ}y3)SmCi5A{hQ!rv2WIl_X;e?#DERoT{z39lc1an+=A~ z$4G2!qgxYY{1yx32|KzXBy1;P(EAcVCWTKg-|GlwMQlAj0<-r(5BrOh2=`_}PbkHm zlpw33%86^RKfKf=_*p>!7v`jZ5$V5IxF&c-UUMCctVNcJ1C%5AvG-e}Ypv_!N4+x! z9DaoB>a*eoYlw3(f#TfkxSW`)SB!DXq=x7SpQPq!o`sSXD|^%d+?S4@#EL3$mXU}wO*xW`9 z7#l4}iUhA#*StPX49XQM-zbQp-ik@$RTMxCZ4%@Wp5_9SFGlAxX@g|UY*3d}D?*8j zT*`Fq0D*=;r;ZUQbv>tMvUz1_WU|umXTYH3<;+ezz^3I)@qriPv8IT61)m0^E9Aer zG6@!!*wbzwXOHA1W6g9wuZ2;R5vE6*?C1+*mJ!R6$_>odZ9*xOQn(EfEqc9bX%Qid zZt_v@)EmkF8gu#^57M7EchS!%%`fBiG0s{ydF#f83LVU5xv}BBhW{PK<4(APHm8Y3 zZL9IOIYN2tsC9$WC}5})DQ@e2j1-x8)HR-Z9#Mqz8}8)IrOe^m+UaV$cIvZ;<2lJd zr)}Rgw=J*@8d2aRC#8yjy35v9@K-wz4L8KO9z+0g=S*kB`pRbKtivGvl@7lX821a5 z4Vae?13W5lE0^J;40-s0bmjH7_>#zE!^T!z@>iDWsYSy|)(u6Fz~KfA#Wv~Kn|ajz ztp3SKwr6Li1jVs3b#b>fdrX&E!TXE|r%T!W)aF@-!!XA+)1upOe$)!aBA*j^bzT&c zR^X@Q^HyUV-jT$N2nDq!=H_4KPtL}_!kDKKZWKY!A^hydk#a3q)295bC_XUla(~Lz+nIw0MEUjL%JiH4RT3562T!&;gEgEbW9iwv* zEt=AVyHhp3J@9aT)-^Fnm>1tHrd!jr_jF-ZE09S^LD^L*CE<4a;ojBOU!vPBI$Mb+ z;h}SfnNL+L$m864jZ(Eq$k|0FDWRG@C-5o`mT1-dyZ})Hq02O~`ivP;kplvyzONZZ z0Yzf-1wJLKh6o5BLB}F;7rXCKCr}@0?qPNW_6#$9koZ5FPY0aClX1~!+PDC8rseAdnf)5O$rMY1i7Nd@T)A_GyU5wpdtn9hjrD?U_cHnnL zTK{SO#=iP>+MA>Km^O!U2RDQ$Cb7ml?{n&KiIIZekRp(0HEtB*9KaWnfVq}bfJ=~z zFo@KL+EBYr<<+4nDeUuX()vpm-vsl8++M6I=&mIP8+$RC&PzsBDYq3jl4qMGXtTel zrmX%mkYMJbb+ACy5(%j^F!>PPcp~qq%5uhMd6xP`%FU{lAxw1NoD+rYOuHg7Yao*;1-r_=q`a+TjE%oy`Rh5WG<)n7F z`OB#4m(Rqfg`=fPX)a@jj5Nz~%dt%F&-g^hw$8#V=lgYSd50ooCv(FFwD~{g@m6#G zJ_}Ev>yQ!MJ=tJoL(8qz{FMUpauN1Wlz7@vk* zAPZwSBxCxU*sm2f8FDJ`gq9@%QnKY0n-$=!XYeB3m%bj7M0U2@I%1WanR~6A22}56s@A=M00I` z=9_S~emUyIAaEt`>>labi`Ir*&Nt^O7l#ioT!bd9N7$u5VJDy<5TD zKkgn3Uy1(q2s6Czf_9eqSz_cWH;vF>{L*fMVGx;iGUv`M$fzfvCp(ou_ZgZQq?a1( zp6(!1-_Xy+nc5pI?&58YG{hp3;n9oSYR1F&ZkYhwkdf7-<;0@v62J)9{)ByeZu!Og zPQkvg?JM}H3|Gk`ce7i5Ff#>)wPtoG`~He1?BZ#+Q7Z4>d_6oYSa!&fMessF@jDc1 z(Wu1;0*~%lgPBex#@iqC+*QJb!{aSH>D7`TjH>=&^a+Lj@vU>b%Ib%G9cj{xuIKv$~D zO^Y$ccohmMx4&oJnw!t_KKq2<@kcxXdcQ0g9?d#m&3MG9c}#Ss$?jzfdHCwLpi3#4 zmQI)F?cs&bfEzYCW8HNOq-wTQkt#TsQhlQgq99w$Dru97HM_bIDbMgN z$uhXDwxb7^2M4o_E_bd^yixL(?t<Dm(IPP zAM!kGwSc0Zq;YGcKari<;MHmxy4Uo|4cJ#ad6t&-?K7=1_xp#~1J`umIZT79meEzH zBM$Q;B|36KtsI1xi$bX%*00fqlZU;&E?u@E59+-WKBKP zaFm~MSNi4e;VZTGte-e^FiEQt!Jz;|_F(x89H2ploOL8k;?*eVrAT=xrqtSSXdU8r zP*y7G#G5QVLk+kTa_xqiBm`S$dw)I;KI`^S^?!ds5K50j_pcg}xY1us7~cy!=21y& zLhB}vXHkduN_4!}!kq5?55CSRNRy~dx7B5{%eHMBUAAr8Mwe~dwr$(Czp_0Y=S-YG z&c)0{#=gqPh`h;s_w($vk}P;Aw;AXU3vir$C2RJ4GD2`?-DVDv)wIFC{2o22BK5kz z1*;;Kh^80P1)!iFEtCztGkEVN!Fc$D7oDm4&BzgSF`Qp(Q#QoeRfdw>k1&F@Wx;Ym!cG3*Rxe#@7>vc6jcbqnwV${*kQbpbiMJ6AZ zivhj@b~%7R8i?!06yABXQdoo*;b1UY+$Pv@>NAyyvWA?W@cx2)H+5+L%WXq2&>JZV z!9%cRj=s@&lN(F}%%bO>q&Giy{P%+&ElH6Z@0l!2pP)<-5sxJh7iLSs| z$C?D(7?BFJyZ(ysHFa6sS>(6!bGaBWvbTw#%n`e;Q_DzPG;R9{;Mh+_>oCf@?Hq!# ziz56iwF9nH>GbI}ulLM7+cp&Qlfkjvrq`_6A@^(*SkglY)qIIWt9%K!MN{pbFTGc( z0|c~K{RDUJgV^kT!?;aCY|MPAfamM&%35%o%b0caMu;kHPZbJp=?x=qO6VzD@Of<8 z-)=ZwZ*YlKxm>(|2hKn21o9r6%-+x(JRY8k6|yVPJ%EWREy$`&fKh!Jv@>f`>4VQQGGi@*gweO#`Pvb>d)ye5H$jP8dP3>z;1a_Qcnma1 z@N;e`_-A>(u`Bu#T3z%>ucW28m9okrq44B|^`3oGNRY-GxJ9_~D2vQG@uJj2JhEi- z@t95x4I!+;xVh~h*JH^p$HK5K#TQ}3WEjr~OsGT$dJvEIHR`O>?c~*w1D17RL%Oeb zdmp^Ee}?#fo^TNi)M2%=u$)hDVRO&dFF6d1`h53-GK8a<&MJ|*VL)AbB#Y^cR$8f_P+Re*s@d`DfDYUgFABQQ zig)DGoZPDEV74VH{W>H2@zi~Wt6^S>m$m41&Z1YK<9Y-ccWn({T~P-0hO+eJ9%|df z3~k$4g|u-P6%Up@-I%V_qJjSnXyBlyvaa8)kyHS*59n=QImy;1u?Vk*HT+GGDRQE| zE}s?WS#||wbRla#qU{ejR5!wteA}8b+iLaLl-gsl$WAEoUX}b7_RGy`G`*8*G`Q)o zR>`p@`sbR6K?ZvIpY9>tw}TcqG#A=NgHaB~ zgR^q2)3{)!!n{_qF~OgPWdHsWP*A=<+nwb2N8S@`FKKGl(73wf`k3Si-5_ms_AJP= z4rDiCL4)K~@3J;yX(s0Hs|Rv0fMLBoR4)~>&VVnCHBLSYs6oagF1br1nKeV*yDLVu znHXmJXw#0GyyXd>LR9L2W#%~cikF(oiLs^;m?^5~>?NbW z2;eHtW*(cr$;f-HhkzmDA!gK@8P!KOOKcm0#Gv==)`g3z)mBN%``&%SaW!sXzSJ>_ z%b$d$u5PlV9o&exZRal zq>ikx!V(F3E)qFbS6#MHzGFLNqb`MwX`sCRZr2fUUIB{d(g&JTNR*rvW>UriWjPjo zzh0T|3>swD`bIn1Ry@I@x}uv5|J>sCXnfh#3h5TgZi8ZkhtwJolspjk(7;b9%?gfQ z1C5o5g640Y;S*PNPBdBHbf}lmL)+(VP;>a9c$Hecxx&T>{-$EJ=5qrPKIjS~hksm^ zcZHG;tBkjbzDC07fsfI>(c%i5So*&~ibiNT>Ol0GC1xpx(TV79nK!9}Skum*+6VZH zEbhoE3d18aN@Wp_Y_5NSldt{jVET{mO{%GELCYpziBWPIk_-@e){%d`BJwZ^t7Qi& z;HG;mE(xI4ZUT>Z(G%e-7j9^A$^-# zbyy0?u_NvqP#{2A=S)Gtlo7a#{!wzuL6Bd;qc|qX)nI1zcr$%{8f*5JZ27om-T|3` zu^;@t2awA=)fADgNda)h$&%9}O$9~nsJ%ny4*X$cIOQ3Ys1_*Mz!v(Vmc>o|P0De2 zkYONDeF~fREolAK<5=4bVS12xAvwp5c{S;ctV`ms2WIen3Yl-#WpF5Kff>T)BG~IR zVKPqbG3wH4v5@}6Yz^hA)bJ9AdXY58s?>Z1?iI{TE(K(Ix}yw=rjZmbCTKh!`}^TP z>jO9{n81IHS01G2i9a{~09Q~DGl(gHa4NGF1A~@izC>`) zLo74+>^pP#%_be|hma?vzM^TtgS>$TA;)s38Yw+Lld7}h`qn^dqciI8gdp(Dk(G1Z zsxy$V*|3sKq=WN%ZgYAr774nX2M*NsW%4EO_VilS&W`(nQ=EwV~+G$P+5iI3PZSHm;=CszyIV|!2F#ZGZ0HoV zckfX;Gp84jE0FM+r0l3+%>uFFpbr^bnN&UufYQU-4+ix2EvHt;z@lso`Q~g(3(0ca zK6d7?w(E}*4ANdBswzKK46_ylWw5MolhDMH$|QOhdlh~bLNx3^U=%_oy!>^WME(k_ zNzhS(t(KJl+b*b+Qo_?+ya(FI#fTh5w6T6~abEG|^3P`*KSU?HD>bM3sDdY4oA$0r z*W6Qov4{aE<5S~Mv8Q$I z8FvO=e)a{uIXml5XVdvR7;Nv|bFb(CV?FOQD#WrDF*z8%cQ{}r00rKcR4XW;7+}j3pX{)_TK}wx2u=1 z&9*u19dzyxc=(GeO35JAZi!AAD5POfBbisba9l1*FLgZ} zTH9eF&rcK1O;%?Zw$*gJCIzzyoos>hA<2G}%|`0Y@GZ*qQxN@nx>u1JLbp6$j9uu} z*&*X;nORi1|3T$#Y$ZG|B&j6Zz>sLQXMZRc7cxt2xirZersuFA9K`_05;i zvD?#n6`(NVJyH~GqYQ!M;XMZBn9b^l1Lz$vZV2^{l$xDsg7{#P!8bNg3rdhYAN{I} zw4Deck*P1+sshbY-Mu%*?kAe7IR`_r$R^H!V*miv$l{?88*DU!tV;O8X zT)|kDJ0=M2^yGxR2*9A1wq`X}oyA=KRU7%ke4J5*v1XD-R}rH^uhMMs`;v88xzTym zS^4s`KiJRY4Pl)fufV=p=YqHFtg|Jg5$)T9mpb7dQ=^W3MV-srOq-aSMmg-v&qlPQ zVeHW$VrXKF57~m3ui@pD71~Y#vSAV{>HM&?h+>&S@&_k^rs9IGpst0?iuR2TxxNRU zl@FDarF}p@5vjpi zn|r`7nii*_0c|QNs94dr*W&&X)ipWT=S29AKLeJIEoYG_hIFKC5=&QVB7NeJw0;W5 z^cnY!@gZ<57Pyg3UFSqHWD2ZisxFMA5DYr%sNg$p6&tJuia;8yQyLHIQ?tu)Lmj88 zk2n9i5_7l_+?qN;1iLhAi|!mrscZuX2%Sj>FIBurDqWb%8q>T308J@O`jI0S4KN># zc+NVL6BS&907(3J%KIGIK7oMLHFOLmjjk+cVA|L~WD^$Q{UYB9-FgX8m5{136GUGt zub8CNnXoWX0DSuk9S*m#k%tYLz5?>lH^R+^uTn8m@{0JE?MS+ZEDZcsdP- z99~dbZossRu_qe7os}VdX2bkW+7)p(9x2Ck*XuzcZ@-T<6psIB;O(X#oIt`p^GY?; zeSSy(eoMFu;5s>C3IiuKT(EdwLwJIRsykb6<{}d?5dzYR{k?|i+KSs5N z>n#tqx})==Fgi(eN|sQf2DxaI=7|A>$SU%5=&*}u=53Vkh8xA`VvJViBsMelJfAZu zbDaLPj6ND##7I_H!^6e`7G_VY5DuWK{?&z40gMo(D&6jZI|qzt^C{guhVa4%N={oo z5uIq4aX#EdYPG+7;XHz_u;ADg``zO5i~1*$|$gJy;*rp3VrW~ zpOA}Vm2Xx6kfv}rAn-2i$#kvSufIA5kxysXfs}1f*su6Y;_B$Mw*UI z#4SV|SAX?hh@&ppP!`01FA~*l1vU4?CDc|bFyLnIO_&Lca#-+x3Zv|2K8Ni%$6A3n zP9G{gZsXxWD+zgBa?luYG4r$V)Li2xRq10S_l>KD=Fg0si*(b7GN)HCze|MMNHHjt zwS8A#HPqSl$_G|vV4Q_ev2`Fpgt&kC#|C`{@-k7~VGdGXvYN-ZOPLM?ZiaE3kM3@= zlr!16ylO{SlOkZWd3Xi!0)LL>YLnJ!s$Wl3#U_N*+(|UM$=$ym0JpkHzv>#JWh`3WXd=jIAL{74 z`(h}Q=U^jqzbmWG+lT-R#(LGG)K2weIy=Q=iNV$K@+MoqUC4u$oxTU>@4WpWxRm_|1e@` zZrZJKPksTIe>d&NET1+Lg0iNP{xtTGI`=Pi=_YiX!S1{$IRA#XeyMij0s6vj zEXJboRlpC2qA4$~9L&|JaV6&BUXh8**Hu1frK1%Z${u11Mi=F$+J{;L>5lTL{EJ@) z%)10Aw;K3656G`9UI*J=M|aa^Mg@UOf0A|l-BeZT?3fj6^!m3I)qo@e+i8n=nHOQZ z4&TO23>)Q&Bm-AJ-tgk74iJ5=aYs`2`A{dw)Vr&0DJfVk1()`80rLpfv!)Q&Z#1yj znVx~{=xck7w=4}lDC#fX;$E}Im!MhfnbR%(U#2M!zk|vVS6U}IgI%F0729_SMLs{0 z{BrMZ5N_edI7spe$p?+=Gvyez?n-M5kjZwB8{0U4T^t6n=Jw;ngH!VzWpG60aANwy zFSm={>3^5SYcfPye9=ThuMYnbSDg*wME@tgfy+tuD225uTPrNYjV4<(fPL;TQ4JYSbJImn7MooN6&Z%2jtZ#^we7@U zKTtSJLJmhf2z90KtpF8gdRs^D|Ej{^)!v#fqp}!p1GXhF1`3YKfE6tqE(r=SsS)Eo z2a$S-_9ii;=+wLNg-nsuK`yk4Ow`}73JBr?NWvn3cK%`2T=9(oHd>-mVr))30a{`KJ!q(|=*`2^qj0~ww` zx{IgxC)d-Q-$>vS?oLg^TyoKs*(bs#XC)0A)$`7-+^`qFFTeOnq-?hvU* zk_Sz-J}&oea5(L{HXRbbf^I&InuWk8n@(Av7b{p?^1K0zIrVm>^uw+}er*E&fZ&1! z!&gxw5;&~Qm_VTJ_z%xMeI(S`VbfS8AyR7zaRn1LOl_oA@p5-^;LEdsQx&x4R!;>y z>(~>0f~sScTYl3kfn$V=`trD0EQ=9p>RQ%iDq4B_GIpfo*8mZ!^j5I*5O+-jAN$6jzL%!CAj8Pxbv8wlt8jU6OMqn2&d(DR7JB|0bXi7y1$A7+0~Li?!WCh&$my>Y+*_=n zzWDfuXt;zYL@nViql5H^gK}P}*%VP7y_E_MgTR2!2N43n69nZLx8~c;j;}g0#*6pr zCjqDfrV%GwK+!1pA9)4I~@0SyQHs&7X5;eeyc!ab#-f9v)V{xLQ^*ocv8_F-JiaC}H zakM6-p(+GTBx)QCn>+QYzu+y!1{JG*6bPY=uHLnalBM=QLsRHyZ-Fh|GK@U6%%?n1 zi?P-!L8G-Pv>kcwNx>jR^a0Ng5+g?ccqy0u10=lj0OgPcVYy374ugj3utRY@)KgX~O;j@$3;$?) zLzgbqJf8qc9F=Sq0ydZftydjxLA6%D)rwWr+XN{O#5h$Ci}Du^>Lzt&(OJZFWTcVI4a zh$t+D)j@+2$*g-1r#B3T-$(ZQ*|!|I(VdVj?TDQKD>4P{AIEP41*U|JcSh?2F{hY~E2El`u_ZGUng4RIZ zbznJA*#_z*zsXN3;GLA3vSEzzmvX(=r39eO2leFU3d?wA>s-ekploEid<;0wWsRy^ zd15az=cin5;z*R)0Wbyke_US#iT5Id(5AP29gWra(h^_obT1oG<~UgG zaPI|{x`^0qnfuT=^G>I+Py6W60knh{H3diYv~HwLtKpM1smX~r41l{&QUv=(h)_Gq zR8Uk;fXO4=3WiTmXH-xBU`$WH*}p4Wd^eBno$cQneYCm#`Z2iGaRcbMoqYj|@9ZJq zdsGInx4i_gzg7jX*TGs&bD0vny@R`9gxhA3#lVvAv%*i=x`R_HbSNHAp5BkBl=mp_XHItWe6gogVJ>c|s-m^s#?6iY!A-Akm2-W0lDI7Xx7=2X1hOC&3CN2>gpt|fm51QM0ymo29imSJJ*T0zYD zE04G9C@@r~MYO6Yt=~r=yMeIU>7N`w8r|_7Ft#!zG~{6)#c+3)Opv%(gg@JIO$0{) z(V!WR;#WoXnh(ah$jhSp8?g1jCa$NMN@%BiY-is*+EP#JAWU;l^_3{gN*W}}6AzXl z{j;!PwZo}z8)eKfb4gm_fXc!`y%4iCm9i_N|8dwx(6Su-9F)LKm6*6st zJoQ!{($fdvD;PlT+iUvpx!H%n@jr;vbWwwBMeit>Ecw}CUR;-z6M^hNk9oX$uJ*FQ zP|>TTAuU|VLZJVIXO;fd4m7|Uh|*CgQ)ql=0W)`>js?@9DJ-zp?s@ghKE_{9?mw^Q zi&%`KwNN@dx3C0%_a~H+98yU)k8aJ9ZXj$xP`q3Upb^TB1PIrh7IFMk#|ebL4tm!tTYdv>}L>h%QeV zEoQ%uZbp|iLC>`mFL(2RPQi0x0kW`4fl;N96i-(ehLvkGmKLav-78G$GFQ~VsbhFT z>$-g^vPN;N;^xX;ELT6Qs@?K5xq2@e+C4ilnINsA?s+zgHaKj%L+~Z$v*l5&}r4{%~Ej;%h8;KJqy+X9K)UvGcc z#YK{XMd_Nld17k^L>}_ySMKf<+#7R)`M7J_227q8H@^~BZ+3)YSrG>^bLS9(OjEkx ziGX2F?sq3|jg+%b_1niPEI8!dR6CtpY9C|7BxjYg_@=`0z&y64U z1pi3o*}*c1_N$Q2)kVX%prg8^-Yy#P0NK#1D>1kR)$JjWS52#s%RSGxs6^d(%uGq2 zR1A6`VdkV7AW^#QfsuPr=oeX&xzMMbposH`^0>>h248VNmU(N}Xh5nEzjvuT zMO`kIW#;MQ(vtU>E^Ecf4GUTej07MSO`Ai!VWEW#s5pRO?^8jhS~N)#|IsGokf%qe zLYRts1`oI+2BMiI9V+Aa~isS z287ZXua5W3I0(ExN}pJ?za2t%jFs*LWHK zi7W_twOI1_aK&sH!_){Y?i@s4X@7m69u9qvIcn`lztMrCV0RT4Oky9-=n8lY)|qI( zOFzewTV~q0)E)jOMGBuO+{Z&su}6NyP)GYKZevvh++EtCc=r9-Q+}1eTW^dF%m+v+ zU1b$x149@A+$%@6=-NHGkQP?rgs3(QdIX{=xGs^cACc!+&Rs^dj&(G;BQun1ozs(% z-u5RuzOM(gh<_{p*TZ7;4;1w0kqfG53EP{ILpmyX{oIMcZPOStPjOf*i-Ke2$iOD9 z?%0RvT7yuq`d)X;LFA<3pq23C(ZW#4T)6C(C^&Dn(o~vy9K$_Rk`#qiFv|BeEJ;UH zQ`p1!kY%zO`7fetcT32Ts|<-G&8{3PN$!eB!OmYan$v#zDB-gM)(j!5MW1rxCAvP(_nHBM zl#Q^5a^w7$EJ?Ms2C7RNr4>2qMqj2zsv5-RRfLMSE%~M4)S|bBB8A4=n}E1h^P>p0 zh?Y4Vs-Az*zJCaBFS}(;J~d`1E#ylTz03(E>EoBL7F5E|W~&NRN-8ZW;Fa5kbj)<) zTRBM!^VxK37~Fq-nwXLvngY7j@_i6?)i94 z(;abdX+{Y@>8OOH&Q$uH{*&Ks*CHBTTl&jz@QrB+F;Lcbr>4ONw`UiAmwn%DW8Y2e zNTBpdNWsXK*3#WOxHzKwHRK^0AZE&d7aW-iap5ssa^*&A(CnO>U?~#N9LhKgcI%6V z7k+t_02n}>{0opI6NBztbL_08U`dbWG~@~A!sM0H0@(iJ1^^nU0yNC zbK}{n>M!gOddz0!X>)GD_XMw46-t9XeZcw^+?_Nn*mjgZQv?WQ=>sN=WFPeHbs}BIf=quC?KSg z(}T#L?*C?u-4!DR(gLPt-5Hce(uw!DiPvR=d@6Vv?DY&oe{&|nh&*_x9Rs!-(ACY*U4YWmlW}H`VAxub-~~n@;3qSQg1FQmf+& z43X;46qU_&cOZyu!7Tq)ucW1@YLLzT=;12DOlZWa z@Fh+V3pk!ZLlbb7t8v!6VR;9sVMzet*tRLEezq8sNGpP0@(dN}zuvwp&p2qnWdNx# zJ4VLCx$m}x;w|u36@Gb-kY%$hDy4ijhZ`b7BQc&45M2dgG5x5iM3=^C7Ft_I%?icM zh;!?r+a$Wm5Z}JQmG!*yA6;0Aw>2{WoiEXU4h+UWiD<1f5Jz`Z@Ng?m(_jNuezKa! zwW%Q1Z*ZSNLy4lrmL%H55R?%;VjbM?2{8g5!fF}>1Ew=StZl#)WRGg*iTEPqRL$Mi z?`2iDe|56K1nUIT3Z6@c%{o$|Kzt`m3Nb?UeOh0gk%;R9k8CpuD+nVjS~AL z>_J4p9}@nsCq35Hvd&WgIvO0!o4Je#k5EhlVHo6uhDSiKe?u75SY2&g8X%ucu(B@y zU@PcLf;urP_2@lMG1J{2S;nn~S6M-cy4})7#}SF$&5OtL{GU8QPfYYu*wj1DR0OZ?J9c(_0 zhW04L*x;(ctN922e}%rGeqIbgg@p%vZWtt_PeJEq=SIz+e%%d8SA zMXqj{WRiT{GU8Z?N#=+Taf)}U!lH$1>^_JI$6%STg=^}5(AwqivAD5yl8X5H1;%9T zn+sMcmrUJfk*#3X@!>|U!CTa`T>WR#vs_~`W=igSKQB$M_{U4br|?m1y=6-Ewb7eT zLmfxuwOJ*E`nSK{t6&QM*aXD-1WhA~b?66F=-R{}ji34{=cp>4!JD|tEuvzPuV3T)kGEkggI7|Z9HUp%`XT5W zi`RIL{xb>iz&4}$cUu@TE`z9o((k9Junf~@SkY-7tKza#d1>40{8mOe zw3D_}_p6KaM$uO9<_1l){xaInn#a-GRXVlpgRFB6*>-cU{VeM58qfSn*?Q14=W>4fCE(w=%MO3^a{Kcr^_i~4`!j0P&C%0^nX`EGIDQxP_xJZkW^~7RR>~<>!xu);iuG*0Eyu+v zk=O-F5zPY&V%5&SlS|Qp@s4MTUbUE1J_-)lOEzB^XXZ*!M|9cOTE<1NwP#deMIzX2 zLb-wrT0BxZ$wrh|bfT`-*>jFIk$@Y@oQTd4?|x{5XfbITg}Yrh^=Dd@UV=LaWgo>% zH23k!p3u{=FVy_kD9DC@!Ufmga2mwF2G@+={pG^GK+ofS!@1E8C8D0C01$QzbQ=v} zTz?T0Gb3LYhxgU-Cq2b&X7PsT{T55_ZmtrY80nYVRJ5tNEs(A>iaRjA;)qQh*O{@g zD`l0%)Tj+3R4k=(G^*)mMMX7DG&rtxkO;HntDP&=QT(umRer6Ng%1;F1uAu2Vis$$ zz!WnFdbc(*I3L84FM&`)47K9FK-u1W3ST8vLoQT5X{Cz=8n1+^Ap zs_U*<&4yK|qhS$0o*c$Wq5hxjxQQ?BHZnYk+RQMg|w$;fG zE7OM4DZ_<@S#9B!(#_}dK;6aQVMa5N z*UoqWdd|;R3{LQK&_^_hD8i|gv;*|u^o0qnj4VXZkvn;!emXutdD1hiLH%fgP)$#0 zBOxnxHKqoNMBNE7mRyr6+m75(z5kga4P@ea1xjEW0en34p8lbp6-qAXt;oYN2 zX)>RvQSUnu?a^Mu+cHo0QFTj1uDj^O=tJ4o`Wch{`W{>33 zfjgX$qV5xFK;CRIY>N#9R0O6>4ZZ_cITF4EH9v|%HBbO4ng{J@me2WkVFeSsj@?+< z=xXqMye`$)ZYqMP-P%BJnpsc04#wye>_&Is4QV3`$J?mddnr21r8_`Udg7JOTB_(I z_*Bj5RO0lj?@=^&#z7Z(hHV3*)HghQnTKraM8D2$?(RF``YiphpR}7OG(M&OFNO$> ziPDv^HbJUtUZ|tfh|pq&U6Q2}VMVrC^%6C!#wZwvx=Y79K8b&0X>HCm-d0+#W&JT* z!BPY!9{QDe4A|!0pbJ1I#CA-gjhTHLk5;|X#euGHBg;6ciYFp*cSahjw6`#v< zZELA!20OVY6;b|Y#owUKqg~%qKAm%bG$8RFgTh>n9hggUYTRa0E)uC+A9@SNj5>Ue zd|aPkcC7vX!gwK}J)Sv)bbn z%Ik}%kwd8SD^!DbJCO8MRuK}ac*cPTgjO@D>rDaR%U&VDl<_YA(6GTP z-f_A_Bi0vX(=mj6ih}-+Y-L7`LPPcC)ERLhsp!5n9{$W}yO=efdFD&CJDtu%I9ype zq-&D4bPO|YVG7G;4?c7Nc;G};D0zu#=yhc?v&TE`|uAdn(-=@Ywd;t$a0tN36q z3ZwgD3nc_2LUzaj=YXRiaslNprs6*)gIP^9v_r`@Ezl&`6L$Ml?u0>_eWv!rKxJPb z2cszhlv6g0S2S~@M(cV5lLyC-ZrOrYC-s zuocyW+K8Y+;T$ohz%_Fe@xkj4c$L0B0|rKdnT92k-jAaZW1AU5~Dae3DhMle6qtF3?>W(t@_qOT#^c8WykAt8y(=(ev*WGn?Jfcb2 z8OJc~sfh?sE|&*KDJi^-zp`5nsA3fBgl)jYL?jBz{(i$2N!7ArJ-Fpa=t?yty~5=_39!fL$)z5c~&^~##!lP2|SLrOK8f->*4H9CfU zAZc&(GzlQGdKhVCLj8Jh=2z52jjAdXo%ns<_;}xVg^1tWA$c6b6VAgM3C<;3#6wh8 z28T=}et)Vm`SODJ%+&*A0npq>gJL^Ku4|#ut^+kgP^*ZIJLCc*EF(6F&ALUZt~V>$ zn;u36jQGFWsbV@3W|}RnfGc3{6VH^TQ_xmv!0HAw3LDvD zW@_-Vn`>u!K0g7)r)EwMjZ$moFpqw^In$t=U=6G7LyvduiJ&T>17dfw8vceD_k<1< z-WOHqTy9re1Iu0O_Q6UuI!^rh)9sJp+xkkxF(Y|>$%Vq)hD`~-y>41RxVrFSD<yoq8W`s*h@cR$pt?`X{kAi z$lu}5YeK7Mn9*z(g{DVcaY>uoSS>Iw(Frg>Kdpxwrr;{npE&v&z>O z=auMm^uJfAiZ?kghI^QO)%W#PSS0cGGt3O9?@xC4Ai04)bLH6Q=aWtEc)2Iu?CK0A zbshUEH@fYR8`_gjmBmY?A6=mZr{RJo!!8U@l-GlV?EmTcl zE>NUaVF%nl;5wCh8BO3#=ghE4%9>11+pQ8SwXD^vxgHU-&%9?h9M!@A z_b9gZ|D}g1a+HF-xpGvMhhpJ8>|EX}07gu{?KanNU8R4l(fCI%OWA|rJLum{()EQR z9wTQ*h3FMk+W^aDq@zy@7v3S73PkzH#DEeBN%9sTlunHw5EeIdFW5jSw36EoHv;cV z)Ndx*?2v$%j++qAkvCDL{R1O!OY1RG47(p&&a)p|X^n0*2;A$y9-JPmv=fbGwz~Zb z$Ksf`f@79y7BMEzRhbotkvPLBVoD5T33^(3>tWv*%Pf6U)$Y+h3~iEt_yZOKz&N#& z>~JDmm;9$CLC`+5<_9$3BZX)0dJH}t7{bj&)5bL{ecq>8-0RtLR(KuXC;S|vVv)iXXhW6X{RErc_Gh2I`z-6<+JR3dDu7@&DL!I`q>t2 zpruFiS@87^GWYiK!*t^*jyTOg;rhS7*?NVUjkZK&t5VHmr*>J6cL`Pb-gVMuj>dG>`k0OUttozCEY7Mdv zf!kGW0WKH0LqBT3Q5Ol+(vhSnLj&(6Y*}P~WPu^{nRK_N+xPIrU-tkgKrcvun9z4vHp zl~ix``wh2jZxF6#g8a?>)Gr1f6p7S**Y~HI$IAfcB|sDL$z-iw%B2^uI>}wap$?sX3zJrnuGt7bTX6Jp*wW?ZOR+|!u+Ii1;L#x21En1 zX@GBLQ?jEDr2iXx`3={NCo_K0K8v!KNXZLH=W3M*v<@vP0TXa6&EqD`?rAe^ObOKM z)fUw;BS-SUn-&ahONAf>z;PB5;F+cSzmY0v}6UVW{_I2=^r& z`AC*%59pA7l#+2?A;-kfM#DHjEl^|98O-W{cqEW=4nja|6HyN8lgn@s0tuksK^AVx zHqHEywwEJagEYt$9HxWI+(hn=4oC-v{Rc`o_#4b&%&kSaBBZpT2l541;SSqE0i2gO zHNAx*G1Fz?FI_*ciUowJ5E~9PUR*yql&+g4e53Qa_w{=R#yNIi^rrVV;DfRY{R}Ty z4ivg}yW8x|=w(N^;?*s7mB!?B5ncA*Nj0Q>VrDzwC zvctA4@EYLSZL-H`ivNg$VCfy7kk0fdEavj}gF}mR1fY>Y_D9uShybKwB5~{n zfNdx*T0F8op)|!ua?{R-sRP>g)pTKTQF=J#BR1P+)_lr&bmOM+v4E`PeDCwuH!nk) zD(=+ck94G9ckK-XewpnJ+IxT{viW$PH54)dC{KS2dH;-#M?mw?4%MYSQC#SA+r6ZT zKnh+Vif@EWL|+1_*-E7KhHu)*kO8uCR$&)kp4s3Zs*}ABF6_tm7=3bgeh6y$xxy)5 z&@Nb_u8x#}LLvy5XnxUX{%HU)D3?3J9Kv^MyCpc@e;zH+tAeuavfPIIlF`2gp~Grc zmNq+E5x!92fzQn%Kj%}O(YWO9w+y=l@`w|VL(cLFba`4kRQ2&gy%PQ}&I$pLHb*QS zFmj>KURO#qaO_$Tc1s`Qes)dWtewJq4FSWP>sB5Dvwru?&4xlMnYfVZ8ayksD~$Jb zy|RGYBkslqyp|kyQGXu#>=|X>#@=N7Fb3{+jci5!dL?w}c?Ys!gsZ=TRe3|UGU>2n zTuNppN+~w&e+P^aEuhV{w#uAL#dM^uPoS0%{oC|RoI*3cS)AgVNugDgOdojM$T7{t zH>;)uGM?#i2(^h6PW^Na=^@U+h(_Gq5mrHAdBi)&+K&~@j=hPM5?gNy!zd0b-9*xe zaG!`>W0a=*j>z{CQ`Z0L6h~{NYg7%a_D)-$mC*cFX-O!&&?{Ej(3SL!ZhoF)byN-MFogv~wk5>J*mSg~cU5*R!>gBZoy~lHZp?v`L;HOex2BsD* zd(-3}>w&7*Ca^IE7VBEId5a|m?@5T%uvZvR%K5tuXHr+VFf&et9-oxYd#s#h*D+Ip zR{NgKS^Qxods!0B)?u+xQXUJVU}Nj~H3hv>y_QyO3$7C&N{^;<|AqNehR&@XpZ{}tF~p> zteBzY+@qvNy%$pqNFr_hyqQB4F4uJfkQ4Zd+>7CdE)sxqH%U!3SHL{A9m9z)S;1NM z>p}wuNewHeb4^RJvDq4m@zev9t?3n=Q?Ok|lMB!WFNltWWF)1>+yvE*djBNL&OK-ZHt{d_k&v~$YSIJM%J+B%9jtO9h>(x%u~(xPH+{O zUip3_rh)+pyt5bkVffyotz5t*&>}e@8YaTg2d_Klyn{%t{aI%XmMQYIsL;t}us~ERuax;m!LxR%d;^Wn2ap&27Rf@VPp(`RD(@i_W9$(VZq~HjN>C%)g*m+$ zc>Bfi9SZQHhO+g1l1 zTff-0ZL4G39ouHdc5dDqy!-xla0fN28l1JNR-Luackj>cOi>T-<@L)OY5ud`rr!Hc z+s<<#$6Lza9nJ{-c&LfNkSJj(osgmdj!`DD+GNek@h+#JmU$Si6t{NZ5f_XOl=Cj2 z&lNqKSP0Y9;2ixn z3)OXW$r!50N&l;TFXO6|*4sEa;dms`!l2i2n^o+fQ%o#SMG;dYYVzopp1~*8)>zq# z@R#yeCi^(#D=AstGt|x`qR#yX^Sv?YY#SGqF^R7o@7OptOcUlE)nt5;maSU7ito_4X_4Fa?I3}E z>{Oa__X%X$WASZKVcAz$x8M#v>EI6D8MgLWsYX`t+aix6n z{QxduWFUp&W&i4eN5yy2nx0AysV!+1wFt9D);xK=qUIl+{F_`L0Z0|weL`It0jXBe zNt_8Ohe&X}FdOi@Kps)*Ghru8Gb>u;zu7$+Ci|LKx-x zB`&i#OO^&bnY=ufM|;s6Pa!9s0+8f@(8mpBfq`K5l^y0;hjeUKpzB*#-vA+Vf#`3= z%oR=f+SL~pY&#_^VCjqeO=7?-+5TYk+B&PDw{Ni8FI^+|!~p#z6k+VK25P zFyL(<6BY47Lc##uM)Qw3G!@<(?_?IghBSIHUM5GwF!YQjjBZv+elfK`Y|x&y!qoiF z_?BRt3#F7x#jKf{^m0F`rgC5#FNSv3IF&@)Q)n?~IKI17_ap^;`jlUmjkH>-+G=Ed z2UfMAbi0)b11#!_zwyD~xHpv6XzVzsQ>NYSfmc~#fAG4zTD;kLJ>!^BWFRy?UcOPH zN6ejxvz(@do;O9`WI%Fwfhh|a6xW=f&IBY0pLk*H9?-c4=2{?GdJpBS!aIp~Xv~{N z#pyBM)7Ro+TVCc9i0hIInbyL~yXwO1=VB9Pc~xmqe8ilKT{L1}ZUp>IO2xEIi4VcfYQIak}Ce`xJ%r^!>5d;{n5DK0L_ zy>|SvjO80AkfYECK3NZCqTq>w*DT+g>wNc}5T$Xp>9w#vAzPfUYquuBo5(-s+S8!p zxw^vVi6ZA?{EG}v$oJ{4ARmkE{vK9F>~v2^ZwrGv{?lT}sUkzlEm}nOdyFF-3EfyB zJ_w}M#Mtw4QLr3k@dxJ-*l>fqeO zavkfEL{H12qb|f#Mf@9E$}IX)uMW0mht_9@w_wl&i@AkC14(T*V!&Ok(fEUcQGDW< zg=5iNVl&~O({F^0;`ey`2-U=)k6g$`GQ;F7I$^UsASuvgqX==^+^MnBs6PJT@}1bt!|^%X8h*-jb&?7-HyJ}`X#JM zi+tLAU`M7_xr}?%j$G0Db_CV{178NVIgkP0+S7z)RJYqRIPSn?TRT|*ltr4?h75NI z8ZeeJ@M~3UO44ZpwcBa$FKv5Zcd{ZxN(8^@uVL1fmb>K=SXj*v?>Dcw^GBm+F^>VG zYTzw(^O2W9KrrIHFaf6D^PT2^F;+JVq^HjJP*2ps=uvIT{ym7>-@iB1b~vaX)h}z9 zzCnUwJwe7Wxbx@@hgs}B=~aZXA2_6XpXrRc(zz@I$JCAA?2t=K7SAr}7z*yIB+!+h z(i@Q7nz)^!aSuXSOe$?6m8sZP1y!~+Vzj5>^g24_o5rOqO=#+Hgji-!$a#`GtgF&A zf(0==88#@@XsWcca6eM}uPw`DzT5ncDMN#+C1nor(-e?Gkh zINWJ_BFcZ}&HK4w!&%KvbG8aDR}4eBS%&)F6R@(N98T`on<-1@!;#IAUAxnghm`OQ z8yYgT_gEUzFfv1B?BVxh92u6)D%RBz*u?J1n)S5;z=Rm(EF8kJ%1+$Rds#Py)zj8v zi+p~2C0*1oR~pViN`3CwJ(tU#0`|o(!mLwyoJ_*+iV9Y#LW<*xf77) zl@s@B%JQg7^Uih#k%JPB3-eOeTtUkOp|<;&eY8u}=IFlduW;Mi7=*F$ zUN>1nehR$4dF^*m%m6{@j12m1{rE(x9C|g4!6qvx-}5OeTFB$}DSN_yg77I3V6ZPO zrSB<}$7{)V4zKd=ufT?D9~sR;n=G`RMgLxVdYIbUi+FXeH5+4X2U5tXoOMti^>9^K zMh7^D93iq;f^E`{pXwxfeUgzuZL~nogGIb@tQt%L^u;|;{sqEQ_4Hm!k!#&YD z<{L&p*KDR;rSYt4=km&LIVrftOK^zQ@bGc zc?%JHSm7`Zd?()hzfSX?{<1tHWr)U}rH7%%HQ6`qC#W>ki!tG7O;c;gu98MxWH68xxQEZOgQmpX~xKjR?F(X=o`mFlTAm4k@OEG`B`E%r5 z<<{q!Rr(FYhnRA_=RJeWC!i-j$!zCSF0n`GnOl1K-}3%(mfj^_-lRY{{G=N0GTsh> zx5b1M$CopGD?3Go%*Fwt!T$D4%@DNZ@AbQs#5E7=Y_LyCq9XV$C5f&Q>2frX7=`n6 zI3uJa<9}b=Xs)Tv(RN&AB=OzC*;IUY_pIPX+{^M zHyj;C7Z{N9Sx+9CjN@c^*WsEg71))%UY!;NhuqRTN|Czmru?*aOiW$ zv+FT9j2Fr}NlkqmO2;zC-5U~HIMfUJX^Q3UD!>1C)FuQ9qFSpv?B~x+x{2%-d>bOM z--*>KIt0o! z5Fp_+6>=5nONOrKTLu#_jVnUaMqJFp0oDwd+CJK7h}C2$DEMp%Q5$W!Fx<1 zbxMk>Y8zsJ>>0Xdk>L}&W&+Y%{Fo3?)YP5#knjvFbWTcWbiM%kfWLK2?Q_aD#D@_0U?0 zOX3mpOv5NOv958sI$MUsA!rRV{gc?dw@^Kik>y>bPJl&T+5wHDw9kD8wYGc;8TE_w zuYnP5-9Ora$-g}$!%Pu#mA&yH)VShz5mu;BLyF;oNk2r*9YIKN0!tr)!|)b zaLE?KApb@%e%@-)D2q-XfuTGr!`ZfR zrpMSkaoO>PFX-ML`gH0NM7wbX2@EJBz00ajoyIW8IQVpSQ__6}1Ol zPqidqgnKZhDH^n)*jI&l`WyVj&tEjuRvPQbJw3Jj716<5E6fHSdTdiSbObXmAyd>3 zY;@&?LL2ksJK&zu;R`ie@RyDn#DwCsVc)CY-UoU1%z&{aNSJ9K^Ip7pGPofW!o@qU zG8a?urI0eEpizLdL0?1M1g5}%Hx0@3@A28Ybvq5Js1 z%mo;qgZn3=aBX?anC*i({yGnIdF+I&Du86g+q9_`nTG=%avqS96KjCnkO7jXxzy(? zmEi9Sl)A;@UlYHmV#hu1xkhJzedjNf(l~gRN|N|~P2U{L2?oG_cSp6|!=D!02j5$9 z?SO?ve~Z2Z7t3dB?tQp!W%$Ir4e|(trfdr-j12O90`6!N%NDZEgk}EO4-qzAZsFdh zVSHr#+0Dz6^`LHI*Q8mlMa$X$eV@km#1mw30WLz@p}h(P)PpXiPsA-rEX>;(%IH6^ z5f|5I$rWFuYOqtz^()J1@STl)^$l^gBz-1#%>l0=MWYpJPDYgq#~mX-Q)d1f$CZ^i%n_dE5G=Lgyx8jZ_K^1zp%_q^YdzGq=s_*HyCv%TQa0*2>5 zm3A#>flBK1cI1;PY`HehA)7+ZJmcR7$2!6SkNR4?7;x-j;kh=9P;U|Q>%<8dD;o66 zAil_gAYKV>UxD6})SO_$7T!gdQo<2She_7kM!Xt{mfQLHth80QRp7#oi?ZnMld{&o zRf38iy%E8g^X!&v86j}$h{pc1H^>>`5~v}rl}Kk-t@#ppwde(wYp;znqeQ0AG_v`< zXNc_}HP!?Fj!vL<=92^y9?$o@ce7lDs&Zfc5MQ^x#Z%ONow581ERg5g1zDc0Tbtk= zs^YOKt;t)D-5gvbO`Nw30{k8GGYpIlB~DVbe(4U7`xpz`rbhLAdVz<}gE!lkyz11X zfHC*WcV(Vnom8I>5X#lQI(N5nYtt!(p{q3*`W=#f@A_aXMc;$&buYv43tiFLk-YGL z^v#$JB$TVPVDIxqib$Xk79R@jZ3aH2{g7bD_1ICroDDN~_7)nSF#}E-KX36?C7!zE zK$XWgcpuW`!#{SV6kiRXGdkJ%D2y*yesBc;5+6%Ae~bG2K>2o%$G{*Y?(_v2pK-WK zBI7$dEHba~g&ALvVn;%tZ8wBLU%>mS&_aJp2Ng0*wye&8?^AeYfERWeM~r=nHO=XD zc0gP>(>r0a9kyK-b9z?P!IReg_(86dOot@#yBdyfb)b zCFqp!R0eoU+#IMq!?zJyAcHXy%9CZ7`yzKE!Q;z;DASMluh!%)Qhb{vf z4RwZ90H21*-f*bw`qX&jF%J?~bee}fRo1kEa!Om(H6ty`ksXark!hn)$u*2R5WoxYr2c$Fy=)jm}R^ zxRoO#$^55J&*FXK7nDxCx-!HI+_==Llp>iT*&y1Ea2n`+u83+s(P`o2#y9k*?*NHR zj+8|FZmJ5jk{ORQEiFq98Yo(Zf=KU;WJ;6Z2QxVhte;*QOSJ75D#RpZaM=u>E)n~_w>)wyjX8?UoQ;rrO^oFeU7Z}_xc(%{$9;-}51s!>vsuAv~v zrDHhoE6I&ZqTH+@9my72g8u9xitVv9!C>F%A|f}a$F$K&dG-3nBE3oM71D2TB`65A zatV3GPOuAyl+L0d*aOam0nEqQhgSrj1En^*1{zUkkqKLQ_-8wqH`jWQ^u_`?-{0Y5&Zm3dikmtws%m*j7Y&-5SIZg^w zumbY3h=L0&D@}l%>Mr2bsb@gjS4nnz(-X!qUGhh_BSebv&vEkbPt_-JS&wpK_o+^I zz|>~y*guAzwcy5(d6nYbGDX@?Bpm^_#vW~&{pdq)+))rIB#F~gbwNft`H3n-kTyaY?UrraXqGINgwvb0?xgV$yX&BgH4W z^DI%9k%ZSW3=R$Z)SO9Ki}S*Q?Rv$wCR|@kEpB|HvaUll8!H88E+ks7$t{P8A%WXM z3y#hIYr*t_elRI%ksC6s40=C@*Dsx>I<(X>94<#eP2sBD^{9Z9If6<;pRO+y_t(FJ zUdsSyLjM5jzI_)&5kBacz4+%G{f@pHMpH`uBJtKo@xjb$E;k{X4d|Tci_*Lc+wL5Q z^T%ZchWFb&h3s8BnW81d_}%Lra@pzw!v@+$Ro%Lm9p`1pDa>KB(777u0VSXY`&ftc z_oKO~G&tGtqWPx9><=nEgH<%JwDPQ;!0|Jk$9N>fy-3W2Q^6TuDw@SPWI?0v=M_vaF~aj$$}mh)&_* ze5YP(jD5SB&kRdzvqzOFF_p#tl@|CX zEy_w0lNO^OMI%c-*XUHFqO3qMEaj|VZXEGJC3k=Y6K$HYiSuL9Dctx<_w8_(d(_?i z7h9EQ_6;HCcVK4r-4%A0mVIl?g7r=7t_} znn$cZ*k-7t>~}7;*I+1Cv`h8Mah24jg0I3%V%CqI7fE>EWypx($D8CgUHLHGMEy+<H`( zYo5#Hx7O(t+5BN2p=ceAKp+I~dpLXo8^TiKm#BD4iYzNuKo=DI=yNRLB$ld%<}KV7 z*&rs>58Ty6x{GO&E|Hl-&L|k8K31q0iH{yZt1zL;GfQp;9b{pWrwjmQDQ1>Ibd0Hj z8Q2tua1|}C!uYvzn{1w2?cf_JQR(61;O5Vbm%I4!Y3a7mcuc z7D-Jm*b?kMc;NI8YW19`BCKy52y21DV5Zsa@H#J>cNb8xEqqA+u_JP$+a}R|vdgQu z$cY^i&kKni>c1kJe9kUxmTFBz$#^O%B0wAm>{9m+ujpO3^hX_#zCbH54%h0kuK#y z;NT8ox=)r`^62Ca;wzyrs^6AZ|zhuvCRbEIjZ86Qmn3X`OhQ;^NXx0nu?-R-}Wh0DnZR!GYc# zq=xZi|IsV{$>;kjzyJ^`?2xOTK3f^jn3Z~|B4!C%fHdxF9S+=NNsWSHRx3}_`!aE~ zkl8M}Hp(zOtsD3&-J=7?e6#I2`k(YFVv(MimB~2T0io2nSY~y(U2D}SD`*%~)?ZX; zB8HvN-P~l*n8T}JYp@;oCewnfZv#qRya*KJFU5*w7pca)zWy8(NC!h3zd0!v*HRrU zL=UHiCU$v+-Z4=os9K7Tmqtm~NtFVI4O+urA_5K8Vyoccym_?Q)VW+mVkC_dGfC~M zwwZK-lR{`sSdvgTr1@~M>D8v?U-w%k?R4s6 zj0DDWdsT{x27T;BqN*W$m)-Ss+o!!!CZYE&?3*GRT#c1%oqlEVkV5r(@`4lej742` z&)eO-8IIN7Ly7ai3g0)u(ypb2-?7@7<`8l9re(eh6iayFR)+(5WoPM3=&%B z>*6=X25_T;J?S#A^RntZ&4c+#$X~;t#z-&`S+dh$Z?qF^t~7v+*k1<1lksQC{oN|G z(+zqpZc4ZAT-yzTU|`+srCsd`FU%+ zS0n+ge-dP*A&Eas55I4X-Q)uoJy=lLbZT0L8_{gR;R6s+q43jmW_vtV0?ts+bs3m! z$H+3cHb+w;x{x5Yk<;l-L6`xKWc%5p_dz-QvL*$ zF(Nmi@M37KzYYRbA~R!Q!^qc|#2`t1#D4ueg8QW-* zCDKdGPP7V0IAW4t$k)}Wh^dx?^7*yUW=*;bGdMZ6XP_Jn^5H}Bfq`xK$de-uM@1;a zl_cH$v@`1TG>h6`X9M9`X_q_McS!3)sjHzI2zdHd*P7sj5QyA|`MSP4&8n)}C?9!393;+&b&mx$u} z8@o`UCHVzQ-Rf-#m|1(KCxNqt+JL-yELyJA)F-wAle#|kDNOBT;T7?Ev_c)J=q8?p zoJjVbROjJ0z;M<*uSs{!SiXz=5cy8P7}%><)q<}+YjK2YTU?>>d!4zfJ9cF4tuCv{ ze8f^3$-Y0eIt;qSQ<^cw(XWC}GP?A~l^f4Z+Ody5t~LmV;&wO*LTu}W8g><*{v^96 z?lJ0!4iNbmpSskJ?|_{(IaS=|9_3a;1}wLb=_&NxF5v+Zgc;omjuRgMgB5esaUig` zRR&^2_OF{8KcP3+m2Ae5QA3e1Z?VJfu@adWAd4QnABj3GhBIh0%*i0#%QO;+oquYo~D`!|KzC462mtViOsCnS2iE_j4!(8O* zRwm#*&mkvgW!qg_wdmO<0*UHz=Qn>L5t$s@Nr4_MP+$@bZb-}lUjD4!XF`1A0kUn3kpqr);jxQ^%M5(Z8t^L-UnI6 zC}X5JXs&eKv|FEG)E?h0w_9UQKN(Q#xzbEdA}!J_`3}yv>Meu$TZn`Uk-#AI$JNR%-1Mqwm6XG}l6&CA-m(3c&9Scyw6^~UK-Oq=^a=Y@*+ zRMx$+Qtz-Poi3$GqmgTD!%9SYQ1gchn|_!cX|e<+OWs=VDR5p`G6FurNYXjdvg^Ug z8k_m0KOd}pH@yr74&S~nYG=8PYwq`vm053mErKxiu^<$E|6V;Y%g!n z3cB0D5GB891RWugpUiA|XTK3YPnN&edjEWWAB=oH3a-L95d)ed5Gf+&n!oVTh?KE# zO1M@Bo}v$>#KBG0R^)~@=z>ex5!<^?*eVmG%1|Td9+sj=t45cn&LPBp;MmwG!BfZ$ zlp<0r9v7pk{zpzRNJ|Xq(X%UYMw4VEEQY{WXobFL(}>Vzud6A)+gGV9a$B*kc2Tu9upM?&&uw>k7@u~0znyw zlV!{$6R5`Bd3!ih`tz$Yg*}30svHKVaF*lU}=`xKnPaTl1HlhcqHJomEn zrFo(Esy=pQMfLO1HSfu*9k?%%;!nC(_e6P2i43%(~ZP=~VLrNj0*?w1F1LMwL8mz0ix6*4(l z7Yc=a-XV_G60Tlp%d{lQLWXMlq|^`S6!TNIB3k;&yUjhCEaiMx)iwDmIV6h~D)(_X zTiFd|{`V2WAaLUa1Di?7%5t){At|7ul;}%q1{w=1n;41)0uDc*&Qe(oO?26#jhmK0 zu44P1QiUmOB)oZ8LS}h8Cu}c>O&IKJ3lfkaHtbz|WstjxHy}f?D`@~22ZTOQE6I6# zcQlQX#$)h=hb~U0sPT`dS<=Sw^L@>Pws@p09?m7oF>lL+&!hE2^gy8F*QCdZT?V^X z=db0{v(%d)SJ_Q1y>INfcH=F2>Sgxco8);(c+OIb1`ZyN{?+AA5O<*%DfjFAplm@l zvoyOeZm&%WSmdi+UY}Oc#BGb67ixr_0#&{)QcJ_Ka}j_4ezO!=aKNQMteN zEUd2yEmo%9%4c|u-O-P}>2dGbVc%R0Wu%q;@V&VG==qn9Mfq$rS=A@>mrueKv_c_K zO~w1gNiFmjks(7Z?%Wnd8*+Egmo@RLA2JGVQa37qA1!_NfkobqVNLI}&HMqHL|9;u zLz3C3Qk41`;?jkV`sTGI06tz)X8Bz(hYZDP&sK?b%d0x5ObSq(L6Wd{u@&h}`+n@^ zOyhmK3BvCqg26Z4<<^`}D%I?2S1PL`_9r}?S1gc_ku>&DwkO6tegz5pHc_SNuw)-1 zT~C@?zffdPrvakf#DwHBJ|0RsOsYbs@H8A%yafpbYTlaEjH=Lw8L}mXOGxjunrvF( z6^$UW{q3&m#EH@Hr*`XAoa_T-Vh`R5WS20A9j!;BS_JPfkLWdT;8i-2sw^`KFT8w4 zcf~p7sLNHf&7glM`w^@@Ovu1d7KtGfq^*5($}BCzMtf9!~quPYZEqeX|!1z=(@+Y(hY`m zslzRL9B%gx`*X{h_GjiP?YvOxNH04d!QC%NQro#XX=)KE0o1aOGiWH|tJ9Uj5+-Wl z5J34j5SsLRb2!n!B!o$`Vp6td7iTUR@7dfhF}Hq7?*nLoVGhCKF#*qpCY!x8n^`q_ zl~Lf3m#ha6`r)Q)D*7?^SK)+?FIF36=JU3RJNk%9F(Z&Vh?fYpLu>mO|L=(bK zs5D46uee`O-q^J@0M}y*a>>s_VG(?n&L9QUcRqq~2$T4_KX9fydC7hhHibU!aC{-` zF|tI|It<2cAiypNG*EoVDv$`pqX|8tL%3#F4nb&|<(AoAR)My)dk9GUtmmkgb+odx zr%H37lMwZ;G8tzWynomTWD)#FsWsF_X(c6SqYhn738Zm2A!i{&8;G#{xxRwDKe zS2Jn7gUIj#^=w14eF1rRP|jNXSUR0SOkIHfwxc$~NiL%@?YdsGuo1IHaGf~*^PTXF zuU7Zz$sUis6^G~&Na3J!o-|?tXV7dQ^|hfudaspf8ILaD2W<>`BA^)YY|sekZg?&h zcrxhC4lB>5OKC(rk_s}1G@3)wfP9wfpZgTY(rBk_*h|78kz?5u@Np#bZd|3>AmQ-t z)aca>S)*aHh_tp=@JUjOXsqo@9-Dt$NKiPV4j`I@PskBU6thzMtqs*Z_&bA$B{@xu zop=;9cMss!pi<+e0b8%Iw&gIiQVWHK-`R-O2`E!pj3)hDL%yBLRJBXC-d)=&@cJ=I zqZR+H+FP)@tqCgIhFFk`T%EVwb{3;PRC^=LE5>aRP)lK~IMn8(Z64VWGD}g61*`qU z2$ynD=z9gqUeIf3`q|b5nEg5~U(aSfPBlaPzSqa!Q;joIIo-v?3m6QX)MY%zv$zU} z*H^r3FL_D!zQC0k#p8{|+O>zUI>|daT{`8RJ?HkPB)U8HQoC1cWCm*(2dg2sZbM{o zt72l*ttz9&gh*Dl_cMvW61d!z&JD5xug1e_y8t}yv1XZf$bW*|A0wX*$Fgy?w^@c)kDadxs8AuTwhSIg0tBP%9tw1mKWrTI$B|7UE8at?*vg~b^rquJ`V+tKvo;)h^m--<~ zZG0hqoY1S{?@J{0q%{QaKXARA+M&b~or!7~Ma4B#)GHl$Dy`Na2zmoZV`Ec6@e)pu z$@CzFG7#|OMJXoO!h)-b3+S4QQiZhCn+h`LRUAAaJUjXJ>vAB<=1RpL_JPtF1X#5A z%3iayE^V#k-;9l@6w*6rmQupxff&)hb#B6pYthsU(A2>2V@BELn7~L>5`;x7S-n_V z&*UAlzt0>GkC?_?9$YenoJgdlrNp7)P%>Ka&uq@pa4JhuZO+Cztvxom0zr3Ep8lsJz2ImtUJ=UN2)gyi2t<~TEpiMpR|pNJ%^yxO*Txpoc7OAn5Q}G za!j^F%A_ExCTTskXy_zoT)K2pR{}Ttyz}g62)geY5uV0$4iP@0jYOtmjQX5=UE!*+ z=+K5K)L&#XKL0H60eqcC<5~%<@P;{5uolWB|lUS)S95cOxa47SL>tzBgTHe6%T%OY;)w7P%^)3UkP8O3-fU;N(v{u&CT$ww}6ubh#PPaG~Bl&iz801froT! zJ1OfVCgC#;B|*t`Qvo^z-7LwLShmI%sAU`^-E{AQMl_kQU852;J2WHXyL6h$gb*>m z1`!!zGMTyA);kzI$RKnbHyVy=)7n(=LEK9UnNBqL1lL#3CHWBEfeKLlahZ7p!-|Aq zn}mA?pNK9)p=V6BUc#x|Gwi6reQzuM``3%(~f_mdC-8#&OJzwSFn4+(?`S?&(eHJ zZI>-4c^FYKc0+D7P|yg4V)lU$vQ_U8=->s}?=Eo9O}n3z`ZN1+CZ zXc*&Z5HD8@yL2iNQzzzPmMtP}e7H`gg!a*Wo4qw+Ot*px&BgyC!{gZt5=v&KR~QQ_ zMgkWF8w#Q{nLA?2R63s)Woj)PE>Cw-W0NXCeP_!uHs)~Uv} zT@m&ztud*Uv!-9x+JF)>mO$(yIKCpU0)pn*K}^VD^2|t7+bRPxamh(kOFh^wgk2{u z(La~O?p7{BYZf!@`V+@y?KL7gu2@z+^hxA(Q^=Vq)q^@uBrYsq?B!3et1!22KzxaR z7!65og@I-ceU8-L*olxN9Q;S%BIt~-n2v7sK+LqClNjJ)ZLcUJ^Urv~Rl=To9wlT) zHcUN()>%vtaWaCNj`EtRgCr=7j{bEt-cRh1Wz9+V_|v@7H?W2O7wV#Bkyi$PU{H(Y zq8MDKQtT-u6oXL|gPwNyGs#@R>eX6(peYpA{ElAGdTNV3YmC{v}x|3ooL)PymMKkR~D3O2Ay^bzjnB z#A9T0=J{4KhB78-6IskUnvf-Lw%XHqe)Uk&GgHuRuOu`rhHYjx3!YI{Q+vc3;Vn6u z#?G#IW1kk=o7~jcOuy0=Bs3J=WZp^P6E8b2?7m9iK6>Pz`-kv5|MVMfkNf4}Zc|7=t2<{_7B`T>x~Y$(yq~vO+io1)kE)tHKz(wbv6iWXMBi8MFF@)ls_tZ?uAS`=mvJyaEJ5*1qg|M>&*RojWP8&x z`94Tk%2MD^^danlj7R0CX4`}KO%!p~rC8(t#0>%AU$YyGuX94b8#EFaHMmx0B@zcn zP=A^AB68H_G&&gNtJdmbA(tdvaT<4>LNiC>F5N*gslb=hP=E&@#Doc(N_-&PIqo6g z&WoAh)CRC^dXyX?ny-3zG36+XNc6ZLHeNJd?2p}jL;g3l(>%;XUbu58)cS|k8TxZE z{7-7M-?_uBtCN?kZ7R`prK(pA(D^)Vy&b(dvZ}^DJY1WAS?3hx6<6G!;FlSvt`+ibTyQe6*`mflKuIH!3odAQQ(7jkbbsxOHN;D`4h3TR zbM69r00kcd3z?`^35ScjRcqB79cMdNUC4B>&R3Tg$6oV4fAj8epDa&&03I3rzBgu8 z?14T|W#S^PNdZaU`A|28LWq5+;@Ux^_h*RaM*XbWr7!{T0ieR*xzOjh`Q`|LIGQJIJc#}9waY|W`RqaBP<8{X@O(Bpfx8%r zu0gs1l+~j3a5D~uu;fR!P#Rk8T2$9U^)UVV8ryW#*TN2YDY8v^jSX(XQWu;Le}Bi! zvn6M2{S)J705hf;(1NQcj4?%{R_glH+puu+xJ0( zberobuHim)JMMhD%3_t{SkP2;b#?GPhx?F ziGaV^RMP9dGie!X340z=kqT&%R^g;#*%1m94(V{HiuNHDWnre@aYShj)8BS263UFL zHsH#Mb`OOfY`#7pPg#)mz80((Zk&XEtDAC#b{Eea8=%;BaEdHp^+HrF_$L0c@6M^> z^14V=A*2|=1#9bn>g&}|IfoMCT`%r^btkdKdL{bvIhFDg4tX+AzvKL)<3>c^ia}!8 zPA%&r&1Nkq>L9=NLy#45^N43ZhwF6?>(<7ud7lwdP#lgRDnF=Tz8TetNUtBUQ{L-O` zv758?c& zi|P%N2H}=D*88SU0TC%hULy(-%4W?$T3OZPo5MrX^Z~$^e>F}O@ucMM5?B|x9cn>; z*U#E;y>pB2DVw*kYi zu1rb5QA=`$CiQjp9YodwMgz@#qj$mpvzg{zsdqJmQ9eyabd3!4ERFQw6caw)HzT$N zb_X0$7f-~=Fc?RSH%v=r@RJP*T&3=n*#Ae?b4wDz8rE0l9;Q^2vg-%`eaIQr-5dj0 zSYpY0W|}|_%vL^!^6(iD@GC}N+iT_CL}gV3S;!Z9Qo;#EcrU`f&MB&~v8x|zvxH!= z$a&+fZi!M>h~;QjjxKPe3I04!Gpy1vtBIPQZ=<7E9Hd3+?WcG44CFZ>bE~l5wsGcK zjC9m&)hp1))Rl;2!+q)@<5S$7zrW@ehn6A5{2r7l8Bh%tcAdjPd)TXm;@#JA18B5RVc#*+eB0v#s zF`J#6>!PB_d!=_2m-Cb~Sf0d!Pr&43XJTHF|6Ci1-cUN_Y$d$8lsZ%;(j%@%Q%m8M zA*<*VrvVYPsU0B=&^G1+AG8mWUh#K-(63IQ<+XH<=}uih+LDyh>UVTU-aE-oaJxT? z-khJ35Z~+RM^e1!C^F!p3iVs6?&IX{qE+0?_S$c)khY-WXXytH<@)uTn`LG(d1Fw80O&LGU9tH;Nxl@~_gC zJvo2~z2a0Y9c7^Ah&q5Tq-UjI%E4W?2b4MiODABXbJ2? zAFY?n0|R^f7umcjufiJNHB`7%~g>cZ~>r)ZWQ9EE#WZ?fegMtE*nYq!rsIpRSU%HoJSrJ3E!+ z9YqOCqxM7>ykxd4RyH-bj3}|p9dqQqonqIMf+|RDeUvg&$25a&x)$56-Inv%=$`R1 zOh!(b46n10ssA>1%T;3XQO2!!bo&bni_Uv0_3 zhQ=p4T+++StlWkPSd({PLW`_Vz82$Gda`yjA^oJj%*`tORTW&-9BNJgcQ7-kVi83) z|I7eUV{KnZ%ZO%vA`g;0W~AHs>hR?Hu7UdHa!r(7Q>NGZQ-|_wtMj$ekGv=76??@` zT}}@=q@uO;aA^W-2zDO?4$p^zI&3TVopRx@AAyef?W~)i4=V@_Zd8PurlSO)5!4~ z&11}4#<`OTjZRnklr+186DLeP4A@ zjh)uw#@p^$=vC-*$zH5r^7!NUqsyRB`brXll)-VMlauil(k3#&o$TS}xY6B&8OLOG z5EYV5mG<@9#!9sNDjzblTNU}(*XC$v&Fjof-}BVJOWj`8+e<2M3c1v?edCJug&*I_ z_692lTKC>BQ`()CrtT?0%`2f(<9p7%8)IBPLgd*mf9^pYJ~mKMo8sXM6D%JZmXST1 z#${O~7uiVpi2nxc(~5l%U(_#=z$U(sEVUbzzjL%P`bOhvzgyc_5o$-5S(hMY#YDTc zzl6lC+7ETzSa>DLxqg2$l3G9?y*BDesMFT88P>!XSspyy3*8bB6!#SbfjUbxRSI!t z&S~y-j7O$&yibM;NAu%c4)~>zTl4)~9%)OnD}zb?i_fdVo1{#ViU!hh6MQpPzw zG4V);x9j?Yi^{L*ZTR3;caE(R%G_2rcE;q%VM6QKs1IfAwwANSZ`t*?L(`h}7q2vv zGPJ65`kmkNPdX(PR=k^OuHA4b){-8{?XmBUebqK_<#_CiK1b;)Z`0)zP7GUNN%b3z z`(a=6VM#CWJM4>{tx}ZNW_trKDDVGM-}>pPWP7Wmn#qvcIlEilo~{mlrrObHoK5eu zTE3cEJ4$7Dw*5B69il3m-bk}sBYkRN(gH=^VwK&U-@lMt#mq9&R?J;|f|-3UE+xIs zGNo{fTPl_EYa`L$ueZVCqr2Y+ZfcIAl#z|rvLM#d$?qg~o=qt>(O+YmZT)0LhRsW# z#9tzxJ}pgZC|IVVxMk$FZ%fZqO#EZt%&P%zpH#PA8mV+|r06`lNpt?R;A<+>8J zUtNo~klPkKYhORHkK_@&_a_ zg?c(^rwdlCf>krZnZ^mU2;*qKAQ-1YcO~WhMfr=t*=SeCsr;C<7#NJ_KRsMD*gJGI zJKrI<8_T#QG>q@UjE-{dbv`YU0eUIW(RUIEFIHxFgijb81BanT1Ii%QZdCcxU`Nmf zpdf;dvpWio+(V0kr-xT*aZuQ|LQcAqHFUkmVADCu$A=+qWCBAczIoK^YpJ(}nx47o z4-5*eJl6MVEYP=kIIJUU>p!K%EiBz$ds!!SsN^olE)tU9Cj(%Zg%IknhxXO4i@>*T z&=o-!G(Lj<<>=y05bnhy;;~}WTt64}6SvP7gUQ-1nem-K%t6{ei_sksA%GqYJZOT~ zqk~&>2eUF(LD2Yl2vQP=!I6(}q-O@7)-!2zSWI0(@piGX^Hh4J1wq5tsiNM9faM-JkICx~{&Gqb_(F|o^nVk;jgZ=eB8D(FTytVtry zFcDU0JF?3W5SvRO2rQnkagf-IIZU38 ziutLhBtO~NgC&jwk!>JkqW*<0%|ZPftMhX$3FTLeL4sm{u8ZRy;LUJ-eEybiE4NZz zTF*83JAh{lPT%0KL=G}uGXtfC6X?+}9QYTp2-Zi~I7o1lP#oy@S7D4MKtbap*&?Yh zKEAw;(DMbCfr3B`jvS;>q>qM!_fu^9X|RyB=J>S8M>Ouu7z&cHASXwMW0MD(lTkAS%ZX2m z@1Bd~LZ{*50bNt~#|0C+0VD-MG$fxC@1h%$Vj-v12#{3f62 z$8dPV0)Sx=EAIKPu?Ke-ssv8YLCoLG81`8|{q`TcUfeV2-CfZ5NS=|z^sQ3(CLtPw z#`N)-CE&&1KO|sqkT!9K$Un2ZjR?DHsME!ttBSZT`^0P$afORGcR-zKZ3J9Cl9VnXs+}+!oi7MtI|dPfmVqG%_7CE6Y_W)znu5kh!ZR`Q*$PiA z3XKgc3a#G+jgM4fQP?UJi$L8hUW5t|9Ap58z?Y=r6!8*NK;a{XhcI)(6{O+}@nTfO bfUyj0X-XkVqlGV|4L&>*t{mTwzWyYh7^k!s^UjMMEmliLWuBp;>;T_lM*KRF0l*+N)rht2xEj1LLY#N zUf@2lwq+QpP&fl%V+awb{O1GcCt)OH35;02oy!ScSuF4=G5HfQ)fAw()OAw)gPhc^ zoIN*mZI?0k(hdf$?|aM+Pu-#2Id^?8=y}7Q_bct7nNDU4+a-}mR`3^ z!2xD4k17_$j*%vbkxgU`KGmyHTiZfqN7z`MW2U^SP%rd)VJMhDo5yurK?|3$f~+YB ZXEW+#ny575Oq1Va*RaL!vn^THazC&CPptp| delta 451 zcmYk0Jxc>Y5Qg8m#5?b9kHjSAh-fr=27@0FjUaxby^Yu?7{RrP5#@4)MQqeY+v)rf zg5)PySqXwDww7WcSX#InL0onpo@I95nXmkJA@DuVxqEuteoFyw__u83E9x``W4FPJ z!7oOCc@)(l$RuPJE`Y5u$P{F{?cLbeyc_&s?ZP$Adh+}Pu*0Ya9Q0;<<`BoNXaGT;jG4@#xjdUkyd#+v1CzT H2v68QA;DF5 diff --git a/src/CMS/core/cmslib.py b/src/CMS/core/cmslib.py index 6d107e5..203d202 100755 --- a/src/CMS/core/cmslib.py +++ b/src/CMS/core/cmslib.py @@ -91,12 +91,12 @@ def nlevinson(acc): -_cmslib.scan4d.argtypes = [c_dPt, c_i32Pt, c_dPt,c_int32, c_int32, c_int32, c_int32, c_int64, c_int64] -_cmslib.detect4d.argtypes = [c_dPt, c_dPt,c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] -_cmslib.detect4d_t.argtypes = [c_dPt, c_dPt, c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] +_cmslib.scan4d.argtypes = [c_dPt, c_i32Pt, c_dPt, c_int32, c_int32, c_int32, c_int32, c_int64, c_int64] +_cmslib.detect4d.argtypes = [c_dPt, c_dPt, c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] +# _cmslib.detect4d_t.argtypes = [c_dPt, c_dPt, c_i64Pt,c_int32, c_int32, c_int32, c_int64, c_int64] -def scan(sig, tt, fsmp, lsmp, map4d,threads): - nstn, nsamp = sig.shape +def scan(sig, tt, fsmp,lsmp, nsamp, map4d, threads): + nstn, ssmp = sig.shape if not tt.shape[-1] == nstn: raise ValueError('Mismatch between number of stations for data and LUT, {} - {}.'.format( nstn, tt.shape[-1])) @@ -104,24 +104,27 @@ def scan(sig, tt, fsmp, lsmp, map4d,threads): tcell = np.prod(ncell) if map4d.size < nsamp*tcell: raise ValueError('4D-Array is too small.') - _cmslib.scan4d(sig, tt, map4d, c_int32(fsmp), c_int32(lsmp), - c_int32(nsamp), c_int32(nstn), c_int64(tcell), c_int64(threads)) + if sig.size < nsamp + fsmp: + raise ValueError('Data array smaller than Coalescence array') -def detect(mmap, dsnr, dind, fsmp, lsmp, threads): + + _cmslib.scan4d(sig, tt, map4d, c_int32(fsmp), c_int32(lsmp),c_int32(nsamp), c_int32(nstn), c_int64(tcell), c_int64(threads)) + + +def detect(mmap, dsnr, dind, fsmp, lsmp,threads): nsamp = mmap.shape[-1] ncell = np.prod(mmap.shape[:-1]) if dsnr.size < nsamp or dind.size < nsamp: raise ValueError('Ouput array size too small, sample count = {}.'.format(nsamp)) - _cmslib.detect4d(mmap, dsnr, dind, c_int32(fsmp), c_int32(lsmp), - c_int32(nsamp), c_int64(ncell), c_int64(threads)) + _cmslib.detect4d(mmap, dsnr, dind, c_int32(fsmp),c_int32(lsmp),c_int32(nsamp), c_int64(ncell), c_int64(threads)) -def detect_t(mmap, dsnr, dind, fsmp, lsmp, threads): - nsamp = mmap.shape[0] - ncell = np.prod(mmap.shape[1:]) - if dsnr.size < nsamp or dind.size < nsamp: - raise ValueError('Ouput array size too small, sample count = {}.'.format(nsamp)) - _cmslib.detect4d_t(mmap, dsnr, dind, c_int32(fsmp), c_int32(lsmp), - c_int32(nsamp), c_int64(ncell), c_int64(threads)) +# def detect_t(mmap, dsnr, dind, fsmp, lsmp, threads): +# nsamp = mmap.shape[0] +# ncell = np.prod(mmap.shape[1:]) +# if dsnr.size < nsamp or dind.size < nsamp: +# raise ValueError('Ouput array size too small, sample count = {}.'.format(nsamp)) +# _cmslib.detect4d_t(mmap, dsnr, dind, c_int32(fsmp), c_int32(lsmp), +# c_int32(nsamp), c_int64(ncell), c_int64(threads)) diff --git a/src/CMS/lib/cmslib.so b/src/CMS/lib/cmslib.so index 0a33ee69cacb9c24f0e55b682a324a93fff2d541..266775d67f76015669dbec01da704b653ecb83d3 100755 GIT binary patch delta 4168 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 Ir!Oo210er!j{pDw diff --git a/src/CMS/lib/src/cmscan.c b/src/CMS/lib/src/cmscan.c index 84279a5..94f3188 100755 --- a/src/CMS/lib/src/cmscan.c +++ b/src/CMS/lib/src/cmscan.c @@ -39,28 +39,24 @@ EXPORT void scan4d(double *sigPt, int32_t *indPt, double *mapPt, int32_t fsmp, i omp_set_num_threads(threads); - /* stack data.... */ - to = MAX(0,MIN(fsmp,nsamp - 1)); - lsmp = MAX(to,MIN(lsmp,nsamp)); - #pragma omp parallel for private(cell,tm,st,stnPt,stkPt,ttpPt,ttp,tend) /* shared(mapPt) */ for (cell=0; cell mv) - { - mv = cv; - ix = cell; - } - } - snrPt[tm] = mv; - indPt[tm] = ix; - } -} +// EXPORT void detect4d_t(double *mapPt, double *snrPt, int64_t *indPt, int32_t fsmp, int32_t lsmp, int32_t nsamp, int64_t ncell, int64_t threads) +// { +// double *rPt, mv, cv; +// int32_t tm; +// int64_t cell, ix; + +// /* stack data.... */ + +// omp_set_num_threads(threads); + +// #pragma omp parallel for private(cell,tm,mv,ix,cv,rPt) shared(mapPt) +// for (tm=fsmp; tm mv) +// { +// mv = cv; +// ix = cell; +// } +// } +// snrPt[tm] = mv; +// indPt[tm] = ix; +// } +// } diff --git a/src/CMS/signal/__pycache__/scan.cpython-35.pyc b/src/CMS/signal/__pycache__/scan.cpython-35.pyc index f312a602ec541789da608a833a1111d9e22991d2..ef20015d50cf94175c14d54f593f8dd0f0f09152 100644 GIT binary patch delta 527 zcmZ8eO=uHQ5dP+EvuUN8WR!A3xvQcCY z^&lcVkfqTciXIj9SrI&x>PdU>q_qA-Y!R;>TD*90HnbNXGs8DOZ{~Y%HkP#8OPXn$ zrm;R6U#}vgE;;9?OD9sB|L`sHK|Nf^SK8CUwK_ zWCS0mbTw@jfe!L^z-dK5jMAv|Y~|DNQ*cBio0qse&PCk47e2uk@N#exa2Uss2|$MZ ze}YQadc zO}?oQgmF-1P!V1-ASF^ ztDhe}>q5lU;-_9gCHZ6d1dYkTl~ANP|SbQcuyq#}`!7!XC&#Dn-fED8heAsG;)gNGpp zMFeS(uxpl}APQczMFbBX6d?rk5@a>(9+HDcy#xd=)=YvQY^sW`*H!giH+_4_SYI;Y zc03-LGFQ$npChcPzH;i>V0|vS1;8l#^pK&Ob1kBzI?yPjlW+;n06c-2Ot4QwCRM$W zxlt347GxT>OtAw_3VzJPGeK?^&h{W@Gz*!*|Mi=dOi+L%xJA^q1}%N?K(-WrLH&sO z*hWo_AY&oqek1BzBXznI5cMNh3uC||%rGq*Yuu1IE0FOq))<3R_BH)`==bC{HP-;P zS)mrjti2YP(f%{$at}|+`vpAgB45xBn7B6&KAWgS)I_tIm^#G|dWD_W_d}II)oQ-h z7w$)i#+5U_uUAy5YD|(XETbg$3$5qZLv&X^dAK`FA9VZaxJi3-QQsrFreD5z5TTp; z%$u)aI;ck$kD2sV-}(5(6hBSvd@2gsrEay4&{ehEeq}umxiPqL$R6;e*v8Jc^up(g zNVwY|dm%X{;29vjxZ)B$R>PfP8d9ZhMLp`Aq@(IbX9vCK{JI!1Rk^!Uzw4eb%;Wq` WrZ1`NYSj=4Lmggi)2J@2)x|GiR+zH@ diff --git a/src/CMS/signal/scan.py b/src/CMS/signal/scan.py index cd63e3f..a3b0e05 100755 --- a/src/CMS/signal/scan.py +++ b/src/CMS/signal/scan.py @@ -1143,26 +1143,42 @@ def _compute(self, cstart,cend, samples,station_avaliability): if self._map is None: #print(' Allocating memory: {}'.format(ncell + (tsamp,))) - self._map = np.zeros(ncell + (tsamp,), dtype=np.float64) - - dind = np.zeros(tsamp, np.int64) - dsnr = np.zeros(tsamp, np.double) - - ilib.scan(snr, tt, 0, pre_smp + nsamp +pos_smp, self._map, self.NumberOfCores) - ilib.detect(self._map, dsnr, dind, 0, pre_smp + nsamp +pos_smp, self.NumberOfCores) - - + self._map = np.zeros(ncell + (nsamp,), dtype=np.float64) + + dind = np.zeros(nsamp, np.int64) + dsnr = np.zeros(nsamp, np.double) + + # ilib.scan(snr, tt, 0, pre_smp + nsamp +pos_smp, self._map, self.NumberOfCores) + # ilib.detect(self._map, dsnr, dind, 0, pre_smp + nsamp +pos_smp, self.NumberOfCores) + # daten = np.arange((cstart+timedelta(seconds=self.pre_pad)), (cend + timedelta(seconds=-self.post_pad) + timedelta(seconds=1/srate)),timedelta(seconds=1/srate)) + # dsnr = np.exp((dsnr / nchan) - 1.0) + # #dsnr = classic_sta_lta(np.exp((dsnr / nchan) - 1.0),self.onset_win_p1[0]*self.sample_rate*0.5,self.onset_win_p1[1]*self.sample_rate*0.5) + # dsnr = dsnr[pre_smp:pre_smp + nsamp] + # dloc = self.lookup_table.index2xyz(dind[pre_smp:pre_smp + nsamp]) + # MAP = self._map[:,:,:,(pre_smp+1):pre_smp + nsamp] + + + print(snr.shape) + print(nsamp) + print(self.pre_pad) + print(self.post_pad) + ilib.scan(snr, tt, pre_smp, pos_smp, nsamp, self._map, self.NumberOfCores) + ilib.detect(self._map, dsnr, dind, 0,nsamp, self.NumberOfCores) daten = np.arange((cstart+timedelta(seconds=self.pre_pad)), (cend + timedelta(seconds=-self.post_pad) + timedelta(seconds=1/srate)),timedelta(seconds=1/srate)) dsnr = np.exp((dsnr / nchan) - 1.0) #dsnr = classic_sta_lta(np.exp((dsnr / nchan) - 1.0),self.onset_win_p1[0]*self.sample_rate*0.5,self.onset_win_p1[1]*self.sample_rate*0.5) - dsnr = dsnr[pre_smp:pre_smp + nsamp] - - - dloc = self.lookup_table.index2xyz(dind[pre_smp:pre_smp + nsamp]) + dsnr = dsnr + dloc = self.lookup_table.index2xyz(dind) + MAP = self._map - MAP = self._map[:,:,:,(pre_smp+1):pre_smp + nsamp] self._map = None + + print(daten) + print(daten.shape) + print(dsnr.shape) + print(dloc.shape) + print(MAP.shape) return daten, dsnr, dloc, MAP @@ -1891,8 +1907,8 @@ def Trigger(self,starttime,endtime): print('--Processing for Event {} of {} - {}'.format(e+1,len(EVENTS),(EVENTS['EventID'].iloc[e]).astype(str))) # Determining the Seismic event location - cstart = EVENTS['MinTime'].iloc[e] + timedelta(seconds = -2*(self.pre_pad+self.MarginalWindow)) - cend = EVENTS['MaxTime'].iloc[e] + timedelta(seconds = 2*(self.post_pad+self.MarginalWindow)) + cstart = EVENTS['MinTime'].iloc[e] + timedelta(seconds=-self.pre_pad) + cend = EVENTS['MaxTime'].iloc[e] + timedelta(seconds=self.post_pad) self.DATA.read_mseed(cstart.strftime('%Y-%m-%dT%H:%M:%S.%f'),cend.strftime('%Y-%m-%dT%H:%M:%S.%f'),self.sample_rate) daten, dsnr, dloc, self.MAP = self._compute(cstart,cend,self.DATA.signal,self.DATA.station_avaliability) @@ -1900,20 +1916,8 @@ def Trigger(self,starttime,endtime): dcoord = self.lookup_table.xyz2coord(np.array(dloc).astype(int)) EventCoaVal = pd.DataFrame(np.array((daten,dsnr,dcoord[:,0],dcoord[:,1],dcoord[:,2])).transpose(),columns=['DT','COA','X','Y','Z']) EventCoaVal['DT'] = pd.to_datetime(EventCoaVal['DT']) - - - # ----- Clipping the Coalescence and Values to the mariginal window size ---- - indMAX = EventCoaVal['COA'].astype('float').idxmax() - indVal_min = int(indMAX - self.MarginalWindow*float(self.sample_rate)) - indVal_max = round(indMAX + self.MarginalWindow*float(self.sample_rate)) - EventCoaVal = EventCoaVal[['DT','COA','X','Y','Z']].iloc[indVal_min:indVal_max].reset_index(drop=True) - - #print(indVal_min,indMAX,indVal_max) - - - self.MAP = self.MAP[:,:,:,indVal_min:indVal_max] self.EVENT = EventCoaVal - self.EVENT_max = self.EVENT.iloc[indMAX-indVal_min] + self.EVENT_max = self.EVENT.iloc[EventCoaVal['COA'].astype('float').idxmax()] # Determining the hypocentral location from the maximum over the marginal window. Picks,GAUP,GAUS = self._ArrivalTrigger(self.EVENT_max,(EVENTS['EventID'].iloc[e].astype(str)))