From 14abcdac7a95f034437f1b0f682e821c8174b8f3 Mon Sep 17 00:00:00 2001 From: Wik-T <812952667@qq.com> Date: Tue, 25 Apr 2023 14:20:23 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AF=B9=E6=8E=A5=E5=95=86=E6=88=B7=E8=BF=9B?= =?UTF-8?q?=E4=BB=B6=202.=E6=96=B0=E5=A2=9E=E5=95=86=E6=88=B7=E7=9A=84?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 26 +- Utils/Api.js | 72 +- Utils/js/qqmap-wx-jssdk.js | 1156 +++++++++++++++++ index.html | 16 + main.js | 35 +- manifest.json | 7 + node_modules/.package-lock.json | 25 +- node_modules/vue-jsonp/LICENSE | 21 + node_modules/vue-jsonp/README.md | 153 +++ node_modules/vue-jsonp/dist/index.d.ts | 73 ++ node_modules/vue-jsonp/dist/index.esm.js | 8 + node_modules/vue-jsonp/dist/index.js | 8 + node_modules/vue-jsonp/dist/utils/index.d.ts | 20 + node_modules/vue-jsonp/package.json | 50 + package-lock.json | 13 +- package.json | 3 +- pages.json | 60 + .../bindDividedMerchant.vue | 389 ++++++ pages/index/bindMerchants/bindMerchants.vue | 118 ++ .../ledgerReceiverList/ledgerReceiverList.vue | 62 + pages/index/map/map.vue | 220 ++++ .../merchant-incoming-parts.vue | 69 +- .../merchant-management.vue | 89 +- .../open-Divide_accounts.vue | 272 ++++ pages/welcome/welcome.vue | 44 +- static/img/businesslic13.png | Bin 0 -> 804772 bytes static/img/businesslic14.png | Bin 0 -> 32000 bytes static/img/businesslic15.png | Bin 0 -> 30298 bytes static/img/businesslic16.png | Bin 0 -> 31710 bytes static/img/location.png | Bin 0 -> 740 bytes uni.scss | 4 + unpackage/dist/build/h5/index.html | 2 +- 32 files changed, 2895 insertions(+), 120 deletions(-) create mode 100644 Utils/js/qqmap-wx-jssdk.js create mode 100644 index.html create mode 100644 node_modules/vue-jsonp/LICENSE create mode 100644 node_modules/vue-jsonp/README.md create mode 100644 node_modules/vue-jsonp/dist/index.d.ts create mode 100644 node_modules/vue-jsonp/dist/index.esm.js create mode 100644 node_modules/vue-jsonp/dist/index.js create mode 100644 node_modules/vue-jsonp/dist/utils/index.d.ts create mode 100644 node_modules/vue-jsonp/package.json create mode 100644 pages/index/bindDividedMerchant/bindDividedMerchant.vue create mode 100644 pages/index/bindMerchants/bindMerchants.vue create mode 100644 pages/index/ledgerReceiverList/ledgerReceiverList.vue create mode 100644 pages/index/map/map.vue create mode 100644 pages/index/open-Divide_accounts/open-Divide_accounts.vue create mode 100644 static/img/businesslic13.png create mode 100644 static/img/businesslic14.png create mode 100644 static/img/businesslic15.png create mode 100644 static/img/businesslic16.png create mode 100644 static/img/location.png diff --git a/App.vue b/App.vue index 40ac437..de77746 100644 --- a/App.vue +++ b/App.vue @@ -4,11 +4,11 @@ // url: 'http://192.168.3.4:9301/crest', // imgUrl: 'https://192.168.3.4:9301/filesystem/', //正式 - url: 'https://pay.dctpay.com/crest', - imgUrl: 'https://gratia-pay.obs.cn-southwest-2.myhuaweicloud.com', + // url: 'https://pay.dctpay.com/crest', + // imgUrl: 'https://gratia-pay.obs.cn-southwest-2.myhuaweicloud.com', //测试 - // url: 'https://gratia-pay.dctpay.com/crest', - // imgUrl: 'https://xuan-pay-private.obs.cn-southwest-2.myhuaweicloud.com', + url: 'https://gratia-pay.dctpay.com/crest', + imgUrl: 'https://gratia-pay-test.obs.cn-east-3.myhuaweicloud.com', userInfo: "", openId: '', h5code: '', @@ -24,13 +24,19 @@ //数据字典类型数据 Dictionaries: '', //开户支行名称 - depositaryBank: '', - //开户行号 - branchBankNo:'', - //清算行号 - clearNo:'', + depositaryBank: '', + //开户行号 + branchBankNo: '', + //清算行号 + clearNo: '', //开户行地区 - bankareaCode: '' + bankareaCode: '', + //接收方编号 + receiverNo: '', + //接收方名称 + receiverName: '', + //门店地址信息 + storeAddress: '' }, onLaunch: function() { let that = this; diff --git a/Utils/Api.js b/Utils/Api.js index ed0c8e7..12c1c3a 100644 --- a/Utils/Api.js +++ b/Utils/Api.js @@ -6,8 +6,8 @@ let base = app.globalData.url; // 登录接口 export const userLogin = params => { return POST('POST', `${base}/login/userLogin`, params).then(res => res.data); -} -//获取openid +} +//获取openid export const getAccessToken = params => { return POST('GET', `${base}/wechat/getAccessToken`, params).then(res => res.data); } @@ -58,19 +58,19 @@ export const configMerBasis = params => { //第三步商户结算信息 export const configMerSettlement = params => { return POST('POST', `${base}/mer/configMerSettlement`, params).then(res => res.data); -} -//获取银行卡bin信息 +} +//获取银行卡bin信息 export const getBankCardBin = params => { return POST('GET', `${base}/common/getBankCardBin`, params).then(res => res.data); -} -//获取银行支行列表 +} +//获取银行支行列表 export const getBankList = params => { return POST('GET', `${base}/common/getBankList`, params).then(res => res.data); -} -//银行开户许可证识别 +} +//银行开户许可证识别 export const recognizeBankAccount = params => { return POST('GET', `${base}/ocr/recognizeBankAccount`, params).then(res => res.data); -} +} //第四步商户门店信心 export const configMerStore = params => { return POST('POST', `${base}/mer/configMerStore`, params).then(res => res.data); @@ -82,12 +82,12 @@ export const getMerListBySalesman = params => { //业务员查询mcc export const getMccList = params => { return POST('GET', `${base}/common/getMccList`, params).then(res => res.data); -} -//查询所有数据字典 +} +//查询所有数据字典 export const getDictionaries = params => { return POST('GET', `${base}/common/getDictionaries`, params).then(res => res.data); -} -//查询数据字典 +} +//查询数据字典 export const getDictionaryByCodeType = params => { return POST('GET', `${base}/common/getDictionaryByCodeType`, params).then(res => res.data); } @@ -132,21 +132,21 @@ export const createDeviceOrder = params => { //查询设备价格 export const getDevicePrice = params => { return POST('GET', `${base}/device/getDevicePrice`, params).then(res => res.data); -} -//更换设备 +} +//更换设备 export const replace = params => { return POST('POST', `${base}/deviceOrder/replace`, params).then(res => res.data); -} -// 订单退款 +} +// 订单退款 export const orderRefund = params => { return POST('POST', `${base}/deviceOrder/orderRefund`, params).then(res => res.data); -} -//订单分配退款 +} +//订单分配退款 export const deviceRefund = params => { return POST('POST', `${base}/deviceOrder/deviceRefund`, params).then(res => res.data); -} +} // ---------------- - + // //门店添加设备 @@ -189,4 +189,34 @@ export const getSalesmanQrCodeList = params => { //门店查询二维码列表 export const getStoreQrCodeList = params => { return POST('GET', `${base}/payQrCode/getStoreQrCodeList`, params).then(res => res.data); +} + + +//商户分账功能申请 +export const merLedgerApply = params => { + return POST('POST', `${base}/merLedger/merLedgerApply`, params).then(res => res.data); +} +//查询商户分账功能 +export const getMerLedgerApply = params => { + return POST('GET', `${base}/merLedger/getMerLedgerApply`, params).then(res => res.data); +} +//商户分账绑定接受方申请 +export const merLedgerReceiverApply = params => { + return POST('POST', `${base}/merLedger/merLedgerReceiverApply`, params).then(res => res.data); +} +//查询分账接收方列表 +export const getLedgerReceiverListByMer = params => { + return POST('GET', `${base}/merLedger/getLedgerReceiverListByMer`, params).then(res => res.data); +} +//查询接收方列表 +export const getLedgerReceiverList = params => { + return POST('GET', `${base}/merLedger/getLedgerReceiverList`, params).then(res => res.data); +} +//分账解绑接收方申请 +export const merLedgerReceiverDelApply = params => { + return POST('POST', `${base}/merLedger/merLedgerReceiverDelApply`, params).then(res => res.data); +} +//查询接收方详情 +export const getLedgerReceiverById = params => { + return POST('GET', `${base}/merLedger/getLedgerReceiverById`, params).then(res => res.data); } diff --git a/Utils/js/qqmap-wx-jssdk.js b/Utils/js/qqmap-wx-jssdk.js new file mode 100644 index 0000000..ef81ad1 --- /dev/null +++ b/Utils/js/qqmap-wx-jssdk.js @@ -0,0 +1,1156 @@ +import Vue from 'vue' +//必须实例化 +var ve = new Vue(); +var vm = ''; +/** + * 这里是重写部分 + */ +var wx = { + request(obj) { + obj.data.output = 'jsonp' + ve.$jsonp(obj.url, obj.data) + .then(json => { + if (json.status == 0) { + obj.success(json) + } else { + obj.fail(json) + } + }) + .catch(err => { + obj.fail(err) + }) + } +} + +var ERROR_CONF = { + KEY_ERR: 311, + KEY_ERR_MSG: 'key格式错误', + PARAM_ERR: 310, + PARAM_ERR_MSG: '请求参数信息有误', + SYSTEM_ERR: 600, + SYSTEM_ERR_MSG: '系统错误', + WX_ERR_CODE: 1000, + WX_OK_CODE: 200 +}; +var BASE_URL = 'https://apis.map.qq.com/ws/'; +var URL_SEARCH = BASE_URL + 'place/v1/search'; +var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion'; +var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/'; +var URL_CITY_LIST = BASE_URL + 'district/v1/list'; +var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren'; +var URL_DISTANCE = BASE_URL + 'distance/v1/'; +var URL_DIRECTION = BASE_URL + 'direction/v1/'; +var MODE = { + driving: 'driving', + transit: 'transit' +}; +var EARTH_RADIUS = 6378136.49; +var Utils = { + /** + * md5加密方法 + * 版权所有©2011 Sebastian Tschan,https://blueimp.net + */ + safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); + }, + bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); + }, + md5cmn(q, a, b, x, s, t) { + return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b); + }, + md5ff(a, b, c, d, x, s, t) { + return this.md5cmn((b & c) | (~b & d), a, b, x, s, t); + }, + md5gg(a, b, c, d, x, s, t) { + return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t); + }, + md5hh(a, b, c, d, x, s, t) { + return this.md5cmn(b ^ c ^ d, a, b, x, s, t); + }, + md5ii(a, b, c, d, x, s, t) { + return this.md5cmn(c ^ (b | ~d), a, b, x, s, t); + }, + binlMD5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[((len + 64) >>> 9 << 4) + 14] = len; + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = this.md5ff(a, b, c, d, x[i], 7, -680876936); + d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = this.md5gg(b, c, d, a, x[i], 20, -373897302); + a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = this.md5hh(d, a, b, c, x[i], 11, -358537222); + c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = this.md5ii(a, b, c, d, x[i], 6, -198630844); + d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = this.safeAdd(a, olda); + b = this.safeAdd(b, oldb); + c = this.safeAdd(c, oldc); + d = this.safeAdd(d, oldd); + } + return [a, b, c, d]; + }, + binl2rstr(input) { + var i; + var output = ''; + var length32 = input.length * 32; + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff); + } + return output; + }, + rstr2binl(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32); + } + return output; + }, + rstrMD5(s) { + return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8)); + }, + rstrHMACMD5(key, data) { + var i; + var bkey = this.rstr2binl(key); + var ipad = []; + var opad = []; + var hash; + ipad[15] = opad[15] = undefined; + if (bkey.length > 16) { + bkey = this.binlMD5(bkey, key.length * 8); + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5c5c5c5c; + } + hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8); + return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128)); + }, + rstr2hex(input) { + var hexTab = '0123456789abcdef'; + var output = ''; + var x; + var i; + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i); + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f); + } + return output; + }, + str2rstrUTF8(input) { + return unescape(encodeURIComponent(input)); + }, + rawMD5(s) { + return this.rstrMD5(this.str2rstrUTF8(s)); + }, + hexMD5(s) { + return this.rstr2hex(this.rawMD5(s)); + }, + rawHMACMD5(k, d) { + return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d)); + }, + hexHMACMD5(k, d) { + return this.rstr2hex(this.rawHMACMD5(k, d)); + }, + + md5(string, key, raw) { + if (!key) { + if (!raw) { + return this.hexMD5(string); + } + return this.rawMD5(string); + } + if (!raw) { + return this.hexHMACMD5(key, string); + } + return this.rawHMACMD5(key, string); + }, + /** + * 得到md5加密后的sig参数 + * @param {Object} requestParam 接口参数 + * @param {String} sk签名字符串 + * @param {String} featrue 方法名 + * @return 返回加密后的sig参数 + */ + getSig(requestParam, sk, feature, mode) { + var sig = null; + var requestArr = []; + Object.keys(requestParam).sort().forEach(function(key) { + requestArr.push(key + '=' + requestParam[key]); + }); + if (feature == 'search') { + sig = '/ws/place/v1/search?' + requestArr.join('&') + sk; + } + if (feature == 'suggest') { + sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk; + } + if (feature == 'reverseGeocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'geocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'getCityList') { + sig = '/ws/district/v1/list?' + requestArr.join('&') + sk; + } + if (feature == 'getDistrictByCityId') { + sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk; + } + if (feature == 'calculateDistance') { + sig = '/ws/distance/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'direction') { + sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk; + } + sig = this.md5(sig); + return sig; + }, + /** + * 得到终点query字符串 + * @param {Array|String} 检索数据 + */ + location2query(data) { + if (typeof data == 'string') { + return data; + } + var query = ''; + for (var i = 0; i < data.length; i++) { + var d = data[i]; + if (!!query) { + query += ';'; + } + if (d.location) { + query = query + d.location.lat + ',' + d.location.lng; + } + if (d.latitude && d.longitude) { + query = query + d.latitude + ',' + d.longitude; + } + } + return query; + }, + + /** + * 计算角度 + */ + rad(d) { + return d * Math.PI / 180.0; + }, + /** + * 处理终点location数组 + * @return 返回终点数组 + */ + getEndLocation(location) { + var to = location.split(';'); + var endLocation = []; + for (var i = 0; i < to.length; i++) { + endLocation.push({ + lat: parseFloat(to[i].split(',')[0]), + lng: parseFloat(to[i].split(',')[1]) + }) + } + return endLocation; + }, + + /** + * 计算两点间直线距离 + * @param a 表示纬度差 + * @param b 表示经度差 + * @return 返回的是距离,单位m + */ + getDistance(latFrom, lngFrom, latTo, lngTo) { + var radLatFrom = this.rad(latFrom); + var radLatTo = this.rad(latTo); + var a = radLatFrom - radLatTo; + var b = this.rad(lngFrom) - this.rad(lngTo); + var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos( + radLatTo) * Math.pow(Math.sin(b / 2), 2))); + distance = distance * EARTH_RADIUS; + distance = Math.round(distance * 10000) / 10000; + return parseFloat(distance.toFixed(0)); + }, + /** + * 使用微信接口进行定位 + */ + getWXLocation(success, fail, complete) { + wx.getLocation({ + type: 'gcj02', + success: success, + fail: fail, + complete: complete + }); + }, + + /** + * 获取location参数 + */ + getLocationParam(location) { + if (typeof location == 'string') { + var locationArr = location.split(','); + if (locationArr.length === 2) { + location = { + latitude: location.split(',')[0], + longitude: location.split(',')[1] + }; + } else { + location = {}; + } + } + return location; + }, + + /** + * 回调函数默认处理 + */ + polyfillParam(param) { + param.success = param.success || function() {}; + param.fail = param.fail || function() {}; + param.complete = param.complete || function() {}; + }, + + /** + * 验证param对应的key值是否为空 + * + * @param {Object} param 接口参数 + * @param {String} key 对应参数的key + */ + checkParamKeyEmpty(param, key) { + if (!param[key]) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key + '参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return true; + } + return false; + }, + + /** + * 验证参数中是否存在检索词keyword + * + * @param {Object} param 接口参数 + */ + checkKeyword(param) { + return !this.checkParamKeyEmpty(param, 'keyword'); + }, + + /** + * 验证location值 + * + * @param {Object} param 接口参数 + */ + checkLocation(param) { + var location = this.getLocationParam(param.location); + if (!location || !location.latitude || !location.longitude) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return false; + } + return true; + }, + + /** + * 构造错误数据结构 + * @param {Number} errCode 错误码 + * @param {Number} errMsg 错误描述 + */ + buildErrorConfig(errCode, errMsg) { + return { + status: errCode, + message: errMsg + }; + }, + + /** + * + * 数据处理函数 + * 根据传入参数不同处理不同数据 + * @param {String} feature 功能名称 + * search 地点搜索 + * suggest关键词提示 + * reverseGeocoder逆地址解析 + * geocoder地址解析 + * getCityList获取城市列表:父集 + * getDistrictByCityId获取区县列表:子集 + * calculateDistance距离计算 + * @param {Object} param 接口参数 + * @param {Object} data 数据 + */ + handleData(param, data, feature) { + if (feature == 'search') { + var searchResult = data.data; + var searchSimplify = []; + for (var i = 0; i < searchResult.length; i++) { + searchSimplify.push({ + id: searchResult[i].id || null, + title: searchResult[i].title || null, + latitude: searchResult[i].location && searchResult[i].location.lat || null, + longitude: searchResult[i].location && searchResult[i].location.lng || null, + address: searchResult[i].address || null, + category: searchResult[i].category || null, + tel: searchResult[i].tel || null, + adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null, + city: searchResult[i].ad_info && searchResult[i].ad_info.city || null, + district: searchResult[i].ad_info && searchResult[i].ad_info.district || null, + province: searchResult[i].ad_info && searchResult[i].ad_info.province || null + }) + } + param.success(data, { + searchResult: searchResult, + searchSimplify: searchSimplify + }) + } else if (feature == 'suggest') { + var suggestResult = data.data; + var suggestSimplify = []; + for (var i = 0; i < suggestResult.length; i++) { + suggestSimplify.push({ + adcode: suggestResult[i].adcode || null, + address: suggestResult[i].address || null, + category: suggestResult[i].category || null, + city: suggestResult[i].city || null, + district: suggestResult[i].district || null, + id: suggestResult[i].id || null, + latitude: suggestResult[i].location && suggestResult[i].location.lat || null, + longitude: suggestResult[i].location && suggestResult[i].location.lng || null, + province: suggestResult[i].province || null, + title: suggestResult[i].title || null, + type: suggestResult[i].type || null + }) + } + param.success(data, { + suggestResult: suggestResult, + suggestSimplify: suggestSimplify + }) + } else if (feature == 'reverseGeocoder') { + var reverseGeocoderResult = data.result; + var reverseGeocoderSimplify = { + address: reverseGeocoderResult.address || null, + latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null, + longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null, + adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null, + city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || + null, + district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component + .district || null, + nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component + .nation || null, + province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component + .province || null, + street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component + .street || null, + street_number: reverseGeocoderResult.address_component && reverseGeocoderResult + .address_component.street_number || null, + recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult + .formatted_addresses.recommend || null, + rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses + .rough || null + }; + if (reverseGeocoderResult.pois) { //判断是否返回周边poi + var pois = reverseGeocoderResult.pois; + var poisSimplify = []; + for (var i = 0; i < pois.length; i++) { + poisSimplify.push({ + id: pois[i].id || null, + title: pois[i].title || null, + latitude: pois[i].location && pois[i].location.lat || null, + longitude: pois[i].location && pois[i].location.lng || null, + address: pois[i].address || null, + category: pois[i].category || null, + adcode: pois[i].ad_info && pois[i].ad_info.adcode || null, + city: pois[i].ad_info && pois[i].ad_info.city || null, + district: pois[i].ad_info && pois[i].ad_info.district || null, + province: pois[i].ad_info && pois[i].ad_info.province || null + }) + } + param.success(data, { + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify, + pois: pois, + poisSimplify: poisSimplify + }) + } else { + param.success(data, { + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify + }) + } + } else if (feature == 'geocoder') { + var geocoderResult = data.result; + var geocoderSimplify = { + title: geocoderResult.title || null, + latitude: geocoderResult.location && geocoderResult.location.lat || null, + longitude: geocoderResult.location && geocoderResult.location.lng || null, + adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null, + province: geocoderResult.address_components && geocoderResult.address_components.province || + null, + city: geocoderResult.address_components && geocoderResult.address_components.city || null, + district: geocoderResult.address_components && geocoderResult.address_components.district || + null, + street: geocoderResult.address_components && geocoderResult.address_components.street || null, + street_number: geocoderResult.address_components && geocoderResult.address_components + .street_number || null, + level: geocoderResult.level || null + }; + param.success(data, { + geocoderResult: geocoderResult, + geocoderSimplify: geocoderSimplify + }); + } else if (feature == 'getCityList') { + var provinceResult = data.result[0]; + var cityResult = data.result[1]; + var districtResult = data.result[2]; + param.success(data, { + provinceResult: provinceResult, + cityResult: cityResult, + districtResult: districtResult + }); + } else if (feature == 'getDistrictByCityId') { + var districtByCity = data.result[0]; + param.success(data, districtByCity); + } else if (feature == 'calculateDistance') { + var calculateDistanceResult = data.result.elements; + var distance = []; + for (var i = 0; i < calculateDistanceResult.length; i++) { + distance.push(calculateDistanceResult[i].distance); + } + param.success(data, { + calculateDistanceResult: calculateDistanceResult, + distance: distance + }); + } else if (feature == 'direction') { + var direction = data.result.routes; + param.success(data, direction); + } else { + param.success(data); + } + }, + + /** + * 构造微信请求参数,公共属性处理 + * + * @param {Object} param 接口参数 + * @param {Object} param 配置项 + * @param {String} feature 方法名 + */ + buildWxRequestConfig(param, options, feature) { + var that = this; + options.header = { + "content-type": "application/json" + }; + options.method = 'GET'; + options.success = function(res) { + var data = res; + if (data.status === 0) { + that.handleData(param, data, feature); + } else { + param.fail(data); + } + }; + options.fail = function(res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + options.complete = function(res) { + var statusCode = +res.statusCode; + switch (statusCode) { + case ERROR_CONF.WX_ERR_CODE: { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + break; + } + case ERROR_CONF.WX_OK_CODE: { + var data = res.data; + if (data.status === 0) { + param.complete(data); + } else { + param.complete(that.buildErrorConfig(data.status, data.message)); + } + break; + } + default: { + param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG)); + } + + } + }; + return options; + }, + + /** + * 处理用户参数是否传入坐标进行不同的处理 + */ + locationProcess(param, locationsuccess, locationfail, locationcomplete) { + var that = this; + locationfail = locationfail || function(res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + locationcomplete = locationcomplete || function(res) { + if (res.statusCode == ERROR_CONF.WX_ERR_CODE) { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + } + }; + if (!param.location) { + that.getWXLocation(locationsuccess, locationfail, locationcomplete); + } else if (that.checkLocation(param)) { + var location = Utils.getLocationParam(param.location); + locationsuccess(location); + } + } +}; + + +class QQMapWX { + + /** + * 构造函数 + * + * @param {Object} options 接口参数,key 为必选参数 + */ + constructor(options) { + if (!options.key) { + throw Error('key值不能为空'); + } + vm = options.vm + this.key = options.key; + }; + + /** + * POI周边检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * @see http://lbs.qq.com/webservice_v1/guide-search.html + */ + search(options) { + var that = this; + options = options || {}; + + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + orderby: options.orderby || '_distance', + page_size: options.page_size || 10, + page_index: options.page_index || 1, + output: 'json', + key: that.key + }; + + if (options.address_format) { + requestParam.address_format = options.address_format; + } + + if (options.filter) { + requestParam.filter = options.filter; + } + + var distance = options.distance || "1000"; + var auto_extend = options.auto_extend || 1; + var region = null; + var rectangle = null; + + //判断城市限定参数 + if (options.region) { + region = options.region; + } + + //矩形限定坐标(暂时只支持字符串格式) + if (options.rectangle) { + rectangle = options.rectangle; + } + + var locationsuccess = function(result) { + if (region && !rectangle) { + //城市限定参数拼接 + requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + + result.longitude + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else if (rectangle && !region) { + //矩形搜索 + requestParam.boundary = "rectangle(" + rectangle + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else { + requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + + "," + auto_extend + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SEARCH, + data: requestParam + }, 'search')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * sug模糊检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-suggestion.html + */ + getSuggestion(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + region: options.region || '全国', + region_fix: options.region_fix || 0, + policy: options.policy || 0, + page_size: options.page_size || 10, //控制显示条数 + page_index: options.page_index || 1, //控制页数 + get_subpois: options.get_subpois || 0, //返回子地点 + output: 'json', + key: that.key + }; + //长地址 + if (options.address_format) { + requestParam.address_format = options.address_format; + } + //过滤 + if (options.filter) { + requestParam.filter = options.filter; + } + //排序 + if (options.location) { + var locationsuccess = function(result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + }; + Utils.locationProcess(options, locationsuccess); + } else { + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + } + }; + + /** + * 逆地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-gcoder.html + */ + reverseGeocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + coord_type: options.coord_type || 5, + get_poi: options.get_poi || 0, + output: 'json', + key: that.key + }; + if (options.poi_options) { + requestParam.poi_options = options.poi_options + } + + var locationsuccess = function(result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + }, 'reverseGeocoder')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * 地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-geocoder.html + */ + geocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'address')) { + return; + } + + var requestParam = { + address: options.address, + output: 'json', + key: that.key + }; + + //城市限定 + if (options.region) { + requestParam.region = options.region; + } + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + }, 'geocoder')); + }; + + + /** + * 获取城市列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getCityList(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_CITY_LIST, + data: requestParam + }, 'getCityList')); + }; + + /** + * 获取对应城市ID的区县列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getDistrictByCityId(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'id')) { + return; + } + + var requestParam = { + id: options.id || '', + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_AREA_LIST, + data: requestParam + }, 'getDistrictByCityId')); + }; + + /** + * 用于单起点到多终点的路线距离(非直线距离)计算: + * 支持两种距离计算方式:步行和驾车。 + * 起点到终点最大限制直线距离10公里。 + * + * 新增直线距离计算。 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-distance.html + */ + calculateDistance(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + mode: options.mode || 'walking', + to: Utils.location2query(options.to), + output: 'json', + key: that.key + }; + + if (options.from) { + options.location = options.from; + } + + //计算直线距离 + if (requestParam.mode == 'straight') { + var locationsuccess = function(result) { + var locationTo = Utils.getEndLocation(requestParam.to); //处理终点坐标 + var data = { + message: "query ok", + result: { + elements: [] + }, + status: 0 + }; + for (var i = 0; i < locationTo.length; i++) { + data.result.elements.push({ //将坐标存入 + distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i] + .lat, locationTo[i].lng), + duration: 0, + from: { + lat: result.latitude, + lng: result.longitude + }, + to: { + lat: locationTo[i].lat, + lng: locationTo[i].lng + } + }); + } + var calculateResult = data.result.elements; + var distanceResult = []; + for (var i = 0; i < calculateResult.length; i++) { + distanceResult.push(calculateResult[i].distance); + } + return options.success(data, { + calculateResult: calculateResult, + distanceResult: distanceResult + }); + }; + + Utils.locationProcess(options, locationsuccess); + } else { + var locationsuccess = function(result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_DISTANCE, + data: requestParam + }, 'calculateDistance')); + }; + + Utils.locationProcess(options, locationsuccess); + } + }; + + /** + * 路线规划: + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * https://lbs.qq.com/webservice_v1/guide-road.html + */ + direction(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + output: 'json', + key: that.key + }; + + //to格式处理 + if (typeof options.to == 'string') { + requestParam.to = options.to; + } else { + requestParam.to = options.to.latitude + ',' + options.to.longitude; + } + //初始化局部请求域名 + var SET_URL_DIRECTION = null; + //设置默认mode属性 + options.mode = options.mode || MODE.driving; + + //设置请求域名 + SET_URL_DIRECTION = URL_DIRECTION + options.mode; + + if (options.from) { + options.location = options.from; + } + + if (options.mode == MODE.driving) { + if (options.from_poi) { + requestParam.from_poi = options.from_poi; + } + if (options.heading) { + requestParam.heading = options.heading; + } + if (options.speed) { + requestParam.speed = options.speed; + } + if (options.accuracy) { + requestParam.accuracy = options.accuracy; + } + if (options.road_type) { + requestParam.road_type = options.road_type; + } + if (options.to_poi) { + requestParam.to_poi = options.to_poi; + } + if (options.from_track) { + requestParam.from_track = options.from_track; + } + if (options.waypoints) { + requestParam.waypoints = options.waypoints; + } + if (options.policy) { + requestParam.policy = options.policy; + } + if (options.plate_number) { + requestParam.plate_number = options.plate_number; + } + } + + if (options.mode == MODE.transit) { + if (options.departure_time) { + requestParam.departure_time = options.departure_time; + } + if (options.policy) { + requestParam.policy = options.policy; + } + } + + var locationsuccess = function(result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction', options.mode); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: SET_URL_DIRECTION, + data: requestParam + }, 'direction')); + }; + + Utils.locationProcess(options, locationsuccess); + } +}; + +module.exports = QQMapWX; \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..d592e4d --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + +
+ + +9k{r1N$_S_VHQel>eJ$tvp$lu|E+czp4w@?`1c zSI_sFnwmGa8NV=-dO%(U2crv{+$U3d_n0(}=1)24=tz|$DbmWjnXlM?s(~O5AjtN4 z&W3axS4NC}0qL}F^?D*=UJxu^_6em48a``Dt%v~pG668yrx`Q%>+Q0fG<|-KD1%hh zxr#~$5(tEf!u{32#-+3VX;H=YNs2Q2d%nk?8~s%M<$N!M?N+__;dVox{Bk@}P|uQi z{xl3{o^i56TkNs(%^IujOmzJzZx6XoT23aJw}>~O<%{ejZfB!x@r{_7;|bcp74b|e z;wjB!HAyp>9T^WE%q0U!Px6E3!8e?sZj=y&leb&8u=nk=kUn8g!Nv&_R *F3UV9+_fQFq%5|r z;WpP-i^>&;gW(|2pYt7M<#(td(S~*&673BWA3yj_2ahxlsibS{0M+5- ?uwzm zQ~0}V%qI7z?&1^5*fUmd=TD*YQti)_Ox|pLiI`^?zK*V~P7{Oi3~&G0;{~B-Hf)>g zw12v6|0$QM$CRW04nOJiU=ctL`uXK)BTWH#BFD2-z`_!fpywSZUH;Q17+$(XMnhxh zRwcF@jN)5b#{c|;oCiWWtA;2w)8{Ed`A_mTslCU;dQ0vo9%ZU%26nLep-|&%?pEP; z{g5C}2-Fy_ltb^VKQGi?!m0StVnD?8BAsP6q`k0Q^btq((ZSApuq|=fFR@K;H&*X% zserUou4+t(8i1pC+V?QEaq4W=CADGqA3Mt0(QO)da2y)(QHRZv1hKgz>uuz9*&(3{ z_C857aW?39Z{eD~{W4ooIY^+)_dcz1Q#as5bcpd2B7hdNA}i0di603ovCBoiYYo)2 z9PmPtJb=A8c{@{{96b9@pTGLI#$4QTtgf#74x3_JnR>#`bdmy@Kgm>3%GMQ)gx$`b ziJYrE6u2>@lGt%~ k^Mh_z_We?{xUhSHg zlec?L?+PvYaLmm7Tli};Qvd+AY(4Zr*jnfW#*G27aTK! $s8PxtChz;Idzb5-{AV!#)H6 NlA*~_qQUV&BVHXpS^$EiBo$OXqyvOS-?ZAsDk45YWbpLFmURtR z{YlFgg8j)`?G(8u1;oF+-4Z^BM915^62j0aEN}oJ#>U_&o<4C1@le^JCehk*JP{53 znqH;?_W>mWx%LAlo9F{2?5r%X`bA ESa {uQUgW+!2|s|2 PYo4=t8V27n>vBT&nHn87@k3p2o@2waj;F#=tnDAZ~1ZT*O(}o?ydMU;UPp5Q? z!Gl4}!1PpHTWnBPlS?B|o@6epw?B7=*rQ>^l~kf{{>8F$Jcwg2rm(0Su#YYx{6s$F z8AjT*Jpl+>$NA9;#pL%E!r89q&v$RPD@E>gts)nJg78@zOfm b z9H>4(nHE)U4AP;pMq_7DP1>y7d^Vc|oQlt7{dxsY(ovtp5h0W@rr`KzLBJ1WHe~Ka zLpq09r?q_F>> 6{>7%nN1D9EI+sfmBF)`oKlOig{P}Y#^Y}^ zB+}(Gb#-J-t-4bLNKPPYiXua>6l>t@Ox9+!lXy`ZhQdEUK;8w7X12BNYf~5nV`M|w zJK~$15P{@rQ<~r4IVdWm2OuS!KnyNY^6esHM#}MTVOtv@uN1d*x(WM8a@LgJerLS_ zfAvS61 KI)tcu +>6FN=JS|CG z7~0Ll>6xh$94kNWzYHDw+vpTW_?pd7!Tqv22l@0;&YA)>D3h&cvSwHARLGu{Uu6@L zLIUX?O^Q;pn{yZLqu&v1O$ML~_zkCdhU~)4Bu&d~MVHY(y|eC_e|w)xQTDJ`^w1bO z=XHPh70M>WMk*z?AIV@D)5AiW5C$=ntMc78X67%oMe9@#fNanHsrKG~ wl)>(wwxU%*&h2jBNXe$dt>e~%rdevw(|0r`s zGwu!}gD4$&TApZTo%(cZ1Gph?Ddm|w13A&)t|{ r4E53tMjrpiUPX}jP$9y>1+^sowOkZYPU+P?lZ%p3Ktx=ME`gy7tw+wsw5 zyl?e$P2M2PKv-f{LHgc~Pwqt}gQV2$;L;LwWFK=6J3O@js~~Q`1+52}R({xi{KLo$ zNGQe8&sYiyVRD1XqG7z^GF4g6fEPOj!54i@^zB?+UB{}?4zC0FsWD}*(zRxOIjjoU zpi>0+`JaFIFeau@am@?@zSs&IzCJ2V@KPHvGPsMekUwAQ*c}eY|DV_*0_Z^CO`I%# zV-=z7F>U2M3`t2zK1Q6LjDCsAXntvHTAlR(D8qAuc#iO??SMcJWQ3zY3g~(~)R4?$ zs|k1x >EUvK8I~f86Nhxe0O~BA?}sX^TzNRk0*XB(kaVBsev}=>Dz8z zGl8ST+g)+;woh&Wb`|3+nT2^7`{MBsg}LS7*Q>&k^zvUNQ*d5q_LD(qMM5-|ozxj5 zVT(9iH7!3d b@U-(SHj24g0 @?ac!}H{HzW)?Ju8 zZ5r;F^!j# -Cj0QjMRAoXm$jZFr~%uaK+|gUhM=&(QtB zBX>)j{(-C1=%UZLIhrsEhRRTkAJ5LseNa;RgM_$~@%6|AfTxMow$VJxk_t3~1~?qI zp6Qyga3(54Z{z8Kr_5gAmC=?EKDi`=AxN7X3oHdq!;mV7u-!;uY|;LH$c+%l4;$m8 z^RMtX(3mQv5d(aB6%vWxGpI_RovtH>Rrk5Kg4c?AH&Z7c(>+d&%25Q79PuhZHZocg z^zC&I@30vf(`VVakN3v$xJI8_H~X$3nC^FYLaW^~733(b#lD+7gy=8&k0Dy11gwVH zG{qiqUAf0$TVR8|2vL}BgOY+a;qNTBWZLY+EEg64AOEQJeJ=tIDidle9>GG%{GVFt zr8CpkCAAV%W;N%Trs<2K?@b2nWXg$3(8o>ce}v)})rSo&88Cn%|Kr2pz)19{iY3p( zZadOPijRwU=3e|cMAqeqcI~;q3dVUI+dwpjp99DM2u82X0N-vYA7f9Gg ! *I|m@08jB-=1jjg29>DKm-)S7h)QPr*WWpP@N| =33bjRG~HG6l1g%uPLpb2a9PN zgZYLp*5qxIdL9f$h(9^f?mY$zS?-To?rH-^_#`CO*c4*!(^l_n`|q^ars=?ucx?kB zR0?XfZ64eGMnF(bZLmbb?ypttnic?Lql!lAL&N6V9~sFHU`)@TVFQCNd;f%DwlF zkrZYZQGyGQRc)640K%B$XQ-iUlwX1t|DsMN)JNf5#9n>*a(TyIrEyh2cYIGOCy9!B z$m81FP-wnxx(?u>#+z&GcZJPonOKjYo}MaB##p)wx}|q3ND0DIR3H~|x)Ank1;uF# zLBT<$@S*Np8}5aw`ubskTA+T9=0-ZzB!G8Nn94mI`^C9|$9DYCxr~5C3-;^o?>*tQ z=@y!WEZ~Eif;UGxE!D&qsIi(Y_9bJ$(^BxG+i9x3i+oh!Y>NT$nZv?fz~7Eo^Iu1t z2AU!RSm|YKFQDT=w2ID6--HJ)30&p@E6Q0kUAo+hG2ubeEpb_$N^Ek1E;}C2IR?D8 zp%fQNC6__aF*n=|L6+B =;q zW95wtfPg-{7awO|0PMxzMad{9;6!F9S+G|_Le}wqZe<{uO-|^iJ!6}G=G8)qjiiTg z$`(YLQk;~Q7SP2kKVvY0f3saOd`W*IOO+yGX}>PqUecYaY5tIVBYERI8ZwtpIk!K{ zst6yF!=Pj~glBMGC1c%5?GF_4n~)=SE%4g7YFYIUnq8W1-5z`xflo=7WmMC<&(E{* zW-V (E_Y$TTWVd2=m5I@+KkGxaTa1 z*@R050{|ow6hY>)y _U^19+c!$;43)qpOLj@bDEZkmRPpoE==l2u=9r5=oIDbA2+J&=~Ay+U^yW zth&SQZJb=5I0G?}pK&cfuibSZfYTM?#hG~%_Y6d`xoc9_5p`7+ybIY|&$6f{G?puP z*e+LnRuGIOR>06ULAmDd+dY(yZu?;dF1V&;yfE359prHBY?!@()XmUrU+cCUnM#r< z;f_hwY&nj&%8)YSF9x&W86VXFd8~xXK%_f(XSG!&2zKK^7;k7O*cDY&J1+zdBW7%9 z{*46`1pHgaGeRb%MA(vIe?$4=mqp>ayLn#RYH%442=E0kXu@gs6LbcR2i5Qfg=Aj^ ziZBdr1wy5;bHSF%>lcnc8##Tj%5FQ*Jo`zxAE%!mIibJ}x{I!=G6KQq2r)#Y6XBN8 zHXAJFEfl(_w>C9_eqAM}<^l|Ey(L7@w1m+uDit#%CF&P_Mi&Ot=3T 0=P zvhv1ksPwS#viczlcEvP}4}hBldB9Q4a90B|gzyPjFTnutX!7hhYjF3AY){(}Ilo;) zo!A4tfrpIxrMG?3JXwAeo?#k0YtZ`r+qXJirr{{O{;#|Fl!l^kAYwcA9F@!)9IY>H zml8~V=OoJg;?1=$LTV#zyRZR#6h&cPeWvw-E!v?^yoZ}1Nwd+x$?wCLvr?jPF3r|p z2o)a=&u=Ig^uDJ{z2IQ^Q)0=%Pf<#?Q4&kIhP?#O(3t49O#37ZD_`VZz^-qnbsVqC zR%r~{%i?sXg!RdhEuYq=;|7k3)VC)NLwW~K! +q zE!?3?w}KCx4m-ZMl-1|2epu!F11@CZ{sq?P0C9j06K>yd8Il!V8vP>(QBv!}$s2=H zj4_FsIzUWbyqwg8WT <*ku^s x@%akd}V4I$kK%B7Q_N2m$V z8hp|sJCe=Ra9aSZNs%CR)^$nvvwlJ{^SfZ*8_3AYzK6%2Zwk_xPRCRaAO8+1;rEZ% zA_s$Qu$QFd;C-1_#x+rIA#deEpP {JTui ddogA?`q|Y`tQmysK(Te8#Nv;uxUrfYd_JcVf0J5Iy+P|)@2W?l9f!v=nJw10+&};1Eg7o&n$DB>Nln9 zmw0vAWdfo4jvePV%xK)MM4W6p8VCAo^bDw@#S+bkVbV;9n|w3LD$#nXIq@U(y&Rvx zDsS7o7lA;}W|tyFG=7x%WEAI@$jc8t7`;Aqm3=C|lH|2fz~!X^i4Tz{24XK+u&e z>Nd)gQ>K*AY7mn_pXfCG4l0=v4sD@$O$#^pzAh88>E=Nx`m^n|T=2z#r7N%y%M0Z~ zHaLZpe#!TEV{{<&RTdxirlo^w?;X8t51?7kr|THK=(e!pF&uY4w@Uj0V|IMEieP{- z+4^ZxnZaF>g>VePGiLofEeGK&+5e@ppb#ElRR?nFY$zZF-3<|}lh#G1a6ndnC4Pee zw^~_>V{m-4bSb%4LX4xjmuw8M{>q)Zcv%WNiYHnl8V*)RH&sEj>Cd=XqvJqfz7Lv^ zidAQcwLW~d`hcd*q^&0)Phxs?b(DtfjfsQt9s9ke$0le&LcCEzimdWmwwQoU0KpZg zNcsd~b$BWOMxqm|=Y?ZfpjedaVaH#v$sMx}Jf0ZiKdzBp#+`uGmxHo_+0iU1&tE(A z&zK=eff~Kb+$u>B)JBzGKEVd4kv8MD5!B3Lg&3Bx4Z{iut{J_9Gzh!Sav 35IJ#KHI5&XP%RltSa I9>0B{?Vro-vyWGt5+53P7tmuFW zET=tFq9L*EaYq(3lR+M33-&}qOMnSHaI`*8Sw ^0CMMjKI9 zbu0+O_8ZNz%z2|@`h4Iya`cjR30hp%yp)(N6C)Ha*qg!(U|&dvBL$D#wTFd{5aUn) zUJjeu-qElD`2&o62T6>Fc;q^!wI?`Du4bZDpw$iLilhyjWeGykRa9ADWE|5pOHoH1 zhQl{ahpXX{E6Ir0));L|c+;xst_U(yOtWMaqvp+2LHRp;B&l3}CXI`d7@`&@jCC!Z zq_%o0iOx_^r5()J1I~8X6euzl Nm>ia-Q=t?}kV(Zu7bhhSSb;MsY) zLD)>k5|5q { zLcifBMk&!4T<-L0YA*ZgqNx_X%j9O9+MwtPLK#+@eK0;cE&9d1RV*8$oz^t1(kjT_ z_D7&We#Z2V4yKw_n?9;$YBd~?38ag$jtOE2mjZs$;EnGVWC(~sGkC#uK{o(d= 3%DW~CrwARYV_ zNCt4+zzmLl4r_X*R|5tc{q7Bh*s;||3x{OfFV$E;8$;3B&W1Uf3!;zSO0s}0;UOSJ z^fZBK4xz>$KB+^I+DBaHgvai{CGydiB*{5DnW=H-pq?zw$yZ%Z&?m~h4H<|v9j{yw zG-Sr`fba+?KqBK4(0sv_TWZ^g03H(ap1~d@aA0QC|Kp+_RkY9Ktr+i`!@ydK%DgBv zof1{T0m|;!D@76fs3b6fh?PJ?F%R48xqiM OY|P6tq-nN<-S&Ym5UgnMVwZhs zYPW>0`aooWaxGz|JJ=y*NV X@qt(%sQ%R#E$MU6S0GW zTm?1pUf#&RT@XINnbzU&JQZN}46g=w+#tkCMot2b0bM|@IEH>);V}DR0e>qa;&tF7 z?U*|;PG+wt$I#zT^Gq1bBy2Ur5V4mftBg4yDin~xc;9vOH}}ac6ZZX!9zyU~b7ck$ z`Jp*~tHdYml)AOC_k-bL;4^wBRGK6}o!0tV7&HahYEU=;Of(uQCM@584quHl67pWK z$z?&eWImiD5R7e~%Zh+JfEH;NwQRYQ*HP0DbIKi8+~DmEND{?nIvgvAmPN(}T+vNH z1!t(iqVSh+VDP=%mWhK86PSzNgs(_RQE{$8nC?ttVlA{t_#&Ab9Gg{a{t!b69Rk(i zq(#!N2vSBTA5We_;H{D==UekGXzny5ydA6b9oMbr!rP+<3FUD>BnMm<#|LM7(K)1I zsacB^^A%UlCl>VkmdJ+R_ECOoqD*>uM{*D{)3n}TeRaRN?u*d~DI#o@rT6Rg9;Fp@ zMW4~UbTfyFVZG$aZ6C<%p)9@{KKf*-l2oiaiCm{v$JO!Jm7|UiDqS5Ga97bxUj7mK zxH>WpT%fd*8AEf+gmu$@NpUYw41&RTKpBRKr^_ Abw$jP(ZB z`N9iFIf|NdCnvBMO90t=is#a_kpSzLrera12c;^Il!^F$>j54P)Fz8mzv<(B&+;i) z7L%kh6?Vm;{ia>6R-8PBH~N=1aS>{g72EAfs>CY;1yPC&DFM|L!Xk~T?LQ@#N~(S5 zRiqQ_MQGss{kHna3(n?p0*3r!N>7rOQazbGlF +B5 z1k hdI?}haE^skTvV7ZGo zY`&m2%7b5)Xyx{gE+lUGfwZvfF;`-)4&Yt# ! zFY+Q92eC0Cdo#B(W$Tn(iVuQaVU9Lr7521->ZXZl&AUGdVt7?q*{dT<46w3pe}@FD znQ#F_*W6S>$ec;Yr)<{1j`%91)RzcavwguNs{O%@2JUSABrqmQw< 5f9J>1%nRIj_fyYhnY;0?#{@1O5bJFjLJ zXj_o;YN4t4O00RD;zGg3Int1@-bkBGs0fnhCq)}6vyqvKQ<~=+WOfTDz9U!}8x;pW z( b%5AlAV4mv(UL53MTn|xTlNgpPnJ} V<>?z$OBt@9PN zH2hXWi>?%U;o%x1E&JwZii!}Zu3Jpa%qm;2n-e}C#4(I==ePCP`O(08xpP`0ai@nz z++f@97F2y$mN&I+SaZU}bRYRv#M{uwFVC;1-Y45}$8Hd}pvx7_MC&dD2bHJ~Fy;qC ztMS1I@^^P8!6O6_`eCnZ%ARDS-TqIb!1td<0dzNGOy7fh?lxAM;U2?%h7j7-c^2q) z5s(4ME8|36Hvh?A8c^nKFrV}&sd+>LC{n@_6V;Si_&w89l+mvxL DAFkA@MksY)+$nr#n>YlWC+BvDe)7TBn(e% zUu_FLW1ak_83e}4Zg 8dYy>fnf`kvln#&~&6R>-qN14t;O8V6i(@dZZlVnTFb^plF!uQK@fu1%jm{smppa{R zp_6S*R$YzFn&YPtjaQ^6wAlX^d~M82TQ40Tna 1C%r!x4naeVl(JNv;N4>5N*^gNo`80Tm zeE5vExF*>9crS$kW|(qmH)y!!rlsP%7!S{snK1mV%>kQpQ_T0DKYxmFp@Q>-W?}s_ zjGJLV2lmAn0D6v*)flmK#Ji)@37iS%B t-ZR#0Dr2+RWxLea+UwX|b263ff8E zk|4KBSApDfB?s(XLr3?h$~0b?Vr1~np9MM4DM{rZv@LL~xKvQHKc#~3E4df{;Vhj0 zB@d$>Nyh<@7QcNVb!bUB84602=PF;*>j8mmQ=+p~e&RC1nh=gu;~kb>is$+ymr^gu zXmfzYDKT6}eKLZ~q=aMaX%)`}#h%Y2c3235-GC=@5#ngGnQaa?`=lXW99Lk%E@5g3Thg22 tDv#1>y5ElQX yhE(dMCUfliR+qhyT*SQQr0fhme;@JK(B*&q|N2W6? zDTSF^;XowMS*%1W#mJ2bPH) 2`;{oN0b(THKFu%EvHDht;hJ=fc~G3v7CN;3e21|= zM$NBB*b!d-heS>jiUB6kIG>uTZT=(JlQhlEb53V7Z=pnNu5@HRAgX3mw;#H2WqvRm z5L^)H>$v$>w<>xd6WIKD!;e+5;u49+)-idBH@N1HDGA<&9WsNW#rTYC^9-er^$w@F z$0Dj8j;nuMPknYl?{7}VIO#t!OiB%G(al?& |+s+k~ ?ZYa^%*pYk>%i;NsJ`^lqgH *S@!7Dp9o%63uW6cq7 zVYi3t6r_0{Q4gyyH4nma8Q6mph3EIDM7__`gi$rad BzL5QQLPYn8zHP0%q)PShE#*3;0 =(|D;=r+hj7OY9Ms|(^RAm;tPQMJqsVaLx@eVC(OgKcME-q7vRUlh<@%$ z?|i(gBl;`!EXV|n@cSqcI4S{XpUWys5fBnu=n;!!T`C~Nw`W;jr-V((4u=8Hw#rmW zt9HC6d^#e}`8i3{bl44gAHn7&YMWqGyr2H4&v|ZM8*zKtZr{~W%1xhKb~r5f%mSVK z=jr|2mhya|KdGl$>^~4W9j&tD0V@-kVbPT0>7Khl9<#4Ni2NAz`JCne+(qp4EJL)E z+daS|6Nv#0SZs__u2XgaF^OlH8q(PY%#fET*-YiA_ dwAMD82>plKNGN5B7e2-0yy zWkdaGP1+;5?@!P~Ot+`n*Tm0J=b%4Qx)J154ug62g*Z;lu0xqCDSOH0E`+d=gdo?l zJ13bY0^`OHMV49!MJC&Pn1r_~61o=A@u-qs?0C62)tFV0dnCyoWkZvJJ%naFEbG|H z`1U{HkVXHp2tWVkM>>RJwGaO^8$q8efRLK|iy{;gz;LS)l}Z=*p~*!I%5a p65y+f-_oKCNcg;X{ZNqQMJK3} zFuR$uyl+V_&fwCe)b~!h(|08q*gr)tBU}B_Xq0<`iBw5eU?7r|KoLZa6AWXW>L-rH z0hMkX1PHg5ENvrZsmE334lY-k#;KQ1_& Y-Sc0F0!8MnsLe%m}YHg?RjVEq{`y?WRT zpPy??(v;VXpy^#Xf>--XFRltxv#qaPd$Y~ $*E{`53 g}Fpe?m1i2``x1*X1gKP_o$rL1}8#_ua?SWUT?JtDvbm( zrnP6$&a3r*)}GR-d7yUV>eU7%H5-ZK2&=TjAtxP~o@iN!T#JEA9}9dD1T_&(yZBTz z1Mq3q+r)Hs@Th0y$)pYO8)3aIcuu&ifV?aDizdu+fEIx6a@+NGE-95_D5qArOq1ko zEs3kpWVswv5afuW7@CC(6BcFv)Dl#ET^JevW?c7Rxc6O3o#b ;XUaHJci4`}nuSJaP!>_~651(`{%LU(1{Jc~_aNcRZtatRFo$HRi|Hk=8IB z@+Vl}ELH#0(*}W&SVc6eHNfvRfkSAPr8&llpLOQJErL#q(U(hA$tK7q$Q2NsR>1O? z^_liteny3 ;y z1*V5A-iE@Lk%j@Bt_ENMk# Hi2Aa;wFgPShky2CNe8gvT=N&w_s0*wtr 0@EbO#x1A8c~|G*S}*Um6#6GKhoKYWQ|5kw-HxVjZ{N zT*K?Mhq<2+KkL#Y#$G)l)W@DK3O`)_jzc{E#vu?em-RO*h_!I9-fBw!A?p$|^oEUk z;{6aCr4%nNhC70Hj1>t}(G5jJPL `KJalb_^*H~=vY=4)7 Be@%=D4ZAG;U0|68?PVMs#K?T=!5>yc6L(^4GG zO?+4EIC<&); 5wk{1$aZJp{4OXIdqc z=vQ5~#-fpGP(R8y O~-vpn9YDoE^*`b+^HKWTPu 9pn4^eSf|&o-x*+{8?*ct$EM;p7Wa5 zb=`WV)@iF``{y@0N1-A#LSmkaFX}RzH6QZ~Z{Bso==UeQpqQLaiEjHndcRy$ictF} z$0&KO_0(J8uE%G9hD5CVXGM~}@2!T60Jp36vjk+VxxY5CpEOOkds@Tvu ` z(meO?3p{v*b$?M#mAckC@K5&m*ME|S;QRS3Ef)8n>koKWEInq_A3Wht4Oi)ly=ndB zK3~&TBF_Ho^rV|W@am~~{^y@9@i*w>=Ibme{GE5^|G2phqjRaUL+BY$!J4EytCn$H zt2i=Pcbg=dz2huC*L^3ZO?mWAp0)LpwXv!mxr;~hKa0avLV2vpjE!Q@+fg51M(6=M z4%8~2@>lEoIo&?|-nwdS`W1TTEn}T}%A=c?-CrNvKX zop>7?S+nbV;Zw8#|E}Tx!&guLli{?JP2;x!r `$(U%8zmoHa%#z|q&- zhm-q8*8>wUa=@;|lT58hTJ7}^YY#dl8&XMgr_VTi``Yy@TZ>h?^Ur1LukJ3fKGvQO z_OHJ%eR}O)^hu1I>LNM*@>iPMwNV}=I%Pq_M*8pC{Xz6QvC+W2@pN$eyw4rp!|zpL ze=YKNJpa4& Wmwz ^hf`W?|**$y<7f&C|B_JANc$Ff1!Brzqk0`FY@2e{NLy-`_F>< z=Z*aTX{8=+BoaY(ri0zxSn&P{Yd3Z{gqZkJ0jy9OAk{HbD@<@#sJ7zRvq9Jx3-|Px zoJ#dK|BZ|Mb8UXLI=2G*Yr<&D(dXUE^Nk-kxY49pFXl2xa$cT04M8g?@-;FzwSidI ziR7O2Fr&~M!~6RQ`F1C!_b _`{;Jn{OX>%(HG9)&X+hDnM>2t z8RSbPkL_(el&q}cQ7F^>%s`z^>QIAU{0A(~#jyX^N88)ri4*z3rn}=r6>XNQj(*l= z;yo*Ev)Cl|6BKnr_iW%xyDfXAmIb$m{JU#)6=h}j&)$oR_WUv0Zq=iyX#%faNMsW^ zT%6zTb95P$J|i?sM@?@Gr@6vB^<&7=YZ=rHPeMmb`!V6(?7Q{Fd;JO}-w42~SE67; z&Vj!~qFG#_#NOA*c)Sepr=&>pa7Sd15p=1y!~1Y!xYfi00!gA1&zGY{>CasE3?~>h zOtb&U6aN%W*xnW=NJ-Dt|M)2n4Fo5%0~7$*tf^~NGUOlgX=kCh(2(*bmL5$LHv;WA z&GU5We8=SPgMYTjzr$<)%hRALP_arG^m>F5Ot?$Wiwa;%1i)H17$U|6rOY-pn;tFj zVFaEQzO4GbZSvCN_r2C{l7&-?vRG`ff%3{<`6og5Pd8^8dr<3+`ozd{Z5TFez?<&T z4Ub=x4r`B0a7}nQ8*3`&QxHsB>@kk^hoWR*X}bw1kzA1PEN~xI{p()wp&DS!%Yc0s zZRnvGiRw5pnb~X^j{alYwhOjZ%dxcu0vnbljV`cQr&S=&b_!596+vN~mQ5co%7Rs& zrL|AX6gB+&SIps&nuNR@&vgTXIS$Udq?XQFTlU+4rvs&>gxi4KXa^@ht(=oJ>hiL# zGWp}8 cfVWo2e}JYP4WogH8fAOp?je7_*+ zf9O8{?l%7OIWLT80$XZpm&wPynWze7#Ef-J>nyIw*Td5HLP(J&@QMO9`{x`}ottVb z@?22GxDtk^hq(epEgq;!DAG_D(?{%myq$FUkcWM@A-iqRmTkd|C>!!U!4IQ$0{ngU zus2eoaL1$)m?2YIiIS)3h!xX pcr4(p+Z*WVy)R1M@3HT+M; zWmpsQ(ny8;>_$D?CTYcx?ypvOHyMq($?Yu>*=U^HMh3TmBd~zL6J}_wlz7pPAno({ zsj<272)5b6X0%QtvL6hERdF~JfxJXiLce}x(h=0%{++ XZ&B)Y%D0eP6fBa?c4A_Q1&;Oh_m-#Iu|4Xi91-u_uC zR8a=~?szvaI#OJ%ifVvREfY;=8H$~kx!NZ~p8AA)O88 |juA`eRE)M|Z328BT zb<7yO%5vxlPe7$*?&rR;v9=M|)c7cB(U6&0!H;m7c4^#hbcID4&`qZY~$Vb pV*#P9?7q~Qs%BrL)xIGttq>rZ`}bP%om!nelX zO&}4S%9VDSR-@-LeOQ%0$4_|KspVqFILP=*W(+fb0#x?bs_W*7d~NxgY=f$UE @uBjtmDHCUIK`_LA+&~F$1|PLd)r y$JN4W@}SPD%{XJ7amd2W(j)qN?_-g9@h)D{M;Y!%;i0GLw31Fnlc|w zu4Rl&zPCp!lqp*r5M;*!SJMcqfqJ;LN!-RKu#?#vck|w8SoQ;D_FW!gSEhC1u2%O3 z4;TRq+A?sZf}N8;jdv%;rxlO%reZ0K3CD8j-?u&*( X_4STMKMFb#6TFzShX$XMPpA1()AXn3DA{>gY!ghn^3C&ksD{l5eo^ zo%UAl_uFNu6qA6cn2V=&wwR2-15;5wVemDVkWZM!%GHb^Bb~-l{vU#Ks*%*gN6)1* zYN6=< 4ZTX+sZ_%eegdaTBQ&(5l(D)2-f`1gfkTFb&??BA&t8-mtB2tt$ zVEv|QRU5idCj5Rbwi*8uCSE`2VPfol?$xw4j_S%TwB%6EdM95%PR{u2jlr-h;f9s0 z_dcb)$mcx*QuM9yE)&j%&`$5AuMBzfBaR*h-)J3w1W_B-t)aSaSNZrPwO}rrAASL1 z2A>u+bw5^tUM6iH-6TppFFN2)P!Kji3kh})mJY{i2)cqbkr|&3eMd$~*?6i60I?&h zc+xPAkG$6 3-vr_{m5Qe$os(9NWfBhJp6 zU}lCJJm5n%z1uKOOC5R%O1gPXWyN7$geI@_X7E~xR)PFMoYLL~F)AlHAr@WuF=kH2 zd%5hI`D^gpuSy4ID>k@_4{Wc$h|ge#Ga-vB2GgCN@w}R$bfGgn4OaGZeYkEwwvN z87?HC`n8V8k)9G8SZ)k^kj!>7p}4o(rBC~6LH-j>W7sGjJeVb@amsBc|FnIZmjkCc za=^O;U)TR6By$NM@gnzIkUR~JC@87Zi$nmh4GU>>0T~cr&(Q^T0_g0w0o=9#>ke4T z1wK}SQDS9|8(mju$$J!gaHJ0hZsk=ctkIJiA==I-Ecn2~~3U6x6` zHjg^^k~FRA(+VJ3m={lID$2yY)9gE8H8D0%2=sYvUh^#RUDaz9Bz|JWX^t=HkD#j0 zEqK#nM;Id>E^YF3Q(Ysgaa6jy(M#LgyRMtiZD^Zcu`o|DaZf4FR)){KEQ{h6F(emn z-`)F2{%88-?^9m;aO>ak2K_Sp&NTK )tsP>M!8g4P7AD0AHyrNS_Te3%m2|A?0gExB1JlZYGOjx2Z$PPL}-0$gj zK$Gs>HCh>?YxWff56ZCF m4d-aL3lNHaT{aDwyCo?Gx?P6{3H;2ZGXhY0K_}FTq?0+z}Dolj1i2y6H zIWP2FSNru9wKMV? )`8gTpTux{bt&$|K098`L!dwdT3r#<;deWsBo%ULNV4l2d4z=E(qiY!k zS^ Pn+(u~`q&IzlynCVgCiB{eK2exuC?e|TxfMZge=o&1CBP!SrLdc#7go%u zA~Y5jY@UR2iu( (D#oqyV{(R9Xhl88LFwg>H;t-aAT=Z^i+Dq6Cu~}Ayg=&N`CuF2%6{&y4 z&+Z%?Q@)R#jIq$VQ;(|7G_r=9X?Jao&GeluYn8H mejk!% z>lWlt-#%{^YGRBUZvAO)^D0kJyhwl2)A8J}Yz9lqxa%ADfab+VYH89xb9SR#5PQ3Y zfo{6Wyo8B+oa7%rK0bQH4* %jKQC8?tjmzXjF`pUaH*7Q}#i+W^0UJ8j+M*X9)46tH%;w`UZ=dOJ#2t1`9cH zA>Qv*4SiSVFXR8qS`TiQ5zVBVal5mSnCLzk#-gvZ&u0UWR$Q;tVRlsFFS{dwG~pb6 z=~}Zs sg_D>;Ze%LJUoIq?hnG WgZFe-{m)zw~0~`rLi-LG}>+f@{LiB_=Jkf zq@TwHQiO?TPND~&S(Z0|BjX;(&b!)UmY3~DMh@XC476yW_YVFsYO&g}wK+2s_4BV5 z4VTH77Nv$O&l8KD2)zo?X_r~s7+5a$yc)5GeJ*UqE~YBx+Br0S=Rw&@s$0!Ttc(hP|q`@+5iDSG v~}M) z!?%vwSHY7nl4+I)6p*=A!AY~2$T7J z#Gha=femn4;l143p`u+q4YoaITa&w8T8t04+8@){=1DM$-!w|XHl#W68D4{Vt(o}U z`NMmmR|Gk@dqHF${WSwknxFqD3`*fW?{8L7;!s>-INJAiQa}V^W0mZge(WIh8M54^ zyC$QT&HZmI=kJJjveJ6v9K-VQGb=;CbdaT5-Oz_ds*9tpIU+@a zDGt8X$6h&?C<*`b0bMk)kGe|Hx6>@q*v1L+^Q%ddJrd(nb9#3q@_qyh@938S(M&_3 z@iSqBB2dRb<#0&V2d95Q-Yh_gsr6A5L$j#T=~6ud&3YO9^{2`l+^HkI6aMSec7-(g z$I^csjx7J>Glok0t3l(S@CK92eiSrt6NHY`0@)hpaLD2T6ULbFU~hcVO64>~c?y7G zffZ^*M2;+!y+PBJF^~4rAwx6{Ky XMV*Cg)CFN_aplnD{uTWJZ}W&Q z!==~FOmj-N5PTY&RdfK>WJt>Z`_@XCR$@RloE*u{w_Tcmv*6!5EhsP895-R>2EmCB zKdrP>;Hb3og?MAh%&rv1t2GcozWsz$3dnGLMf4i*404;FXaLDy{b_Ihy2x<5C0BNr zhtAkH<2+@gJqKfVe4_LXh7)Fbzx@zig1dF}9PW~va+bV81fI{~T|i(8u+N+bcwShS zXWZB4B;v5~;5^KTH)jr&hH|fHls8kV%|*R`Vy;nJ{2>M8&>J?eP`QE!lXFzg5*Du; zedFIboMDyWyn#y?Dbnbx&Cj0oV_V9nMB>m87vm6BZuDPOqzre!ZH(}PXQ~evB}e3+ zV-EIuykPxde#%G?G^VIv|7}%7zhja+bHlHu81ID)F0vaW$Aw*%yb7@E>4AKstq_th z6BCc~WVfG*KGRy#StXyIzl7L#s?C1pS_pG90g&IqH|P22*zB|aY2*Ez`qDD? PxTHhY-fe3*JsU+FJMKYNI~p@nf^yCl;tifnT8|n z#_BzK0{U#Izk3x_ea&HPgQ1FN7$wet*KA@$NP?Gbfnl?yW f@*WocU(4f#lx zyu#nAbq?6>gpBwi$Ij2ik0B9lDj$~zIQuES7RTw(!*ARdRN4feKUa;t5v!rq4^bcf zD_{QME4d)H{O}{_a7I(Pa)+`K8~iv1$Sqr#DJ s6SU;88hCYQ4~wbS =?fZ>a}%T4imW~E7k-jdsE%18b@+~)jc z96xBozfI!Fc0wkqoi>Wx$Y2j;{6*`mR!B)p3-)a}gM%7}j*usM%e(I`rd&r7Q{r z;qJdOBB&q;+;mUr#!&|&0`;~lJPBXZzFKf*5Zm0VK$C_()(zs%<)|4u(w^JjF1?KC z)7dH7cKI47YN4y!$ro%E t4iVXlNg-r53x*O@ypts;44OcS= zl*-2CdvxLC_gcKny<1snx#B)2N3O85AXXXgcNnjeUp F#E|{J6Ncd1>CtxCVEvBjqhavTSzNSHV76MY;f7_!;x-d^V(9I-kf_(#Sa*?azhY zef@n7`OQFbx&BW3jAodyv#zpT^u %qFq zU*2d1bXICzO1DNs@dw{)EAw^X_&c|=gkxjFE;A2)HOEo&aLuKS8=r)7idC!noT tfox?pnxXf7xK7@X^;Gg~E mIv#~oL&pbTaLgR*P9Rrgv}%L&dRooq zx(R6hhmb_M5prA&Q1NJH9eIl(DbUBrzb~;{JJbN~lpQC&1@fpjK}3o;tgM1{c$g>t z>2S}*SD^gQd`v*&B@ctmqlTuIIU@Jb(r2Gb{|mHO9v3_bs!{~UTm!mUB;L*bps*ho zK(RQ}^k1Alr3 bIG&ATDwo!j@ps%``-(16d_eIWE_}i#JD!I* zyeS%1H#UP?&UHhtAGo);FMmJYsa3snX=Hr3Bq-}*UWROOkKOwO5ILuvDpOUJv;sbG zHrH-0O3!lFCiFVEOf4mGC#h_Z36tMsZkT7Cdf&cbVfwGhHKqGMph|~Yk&f1#(yEZu zF%tnu@z7don^0$up~Jj% PX6LwKdWh$2W@DMGa3p DzC~rNEOl(kkmfO^peZegYPz!$uh?1D!834i68BV5EU}=nRu|0Jseyg2iIV zld=m~Y;#`Pu?YZq1=dRWzPcK**nv;*=X<4g&0=7%R*0tE*Q3K@25Y@D$b!EiMLK#G z)mt{Ij?wX_+809l*3K >EryS!+N?y$w{j#H5&OzD64oosP$Wl zx=GqPoxPXUs$`Xjs8HeyZtG?V)m=`x2Lh3b@~WUUu9HJ+vf2)?4e<28M$OR<4Y9=q zjg}f$gbl|(_9upfhiekdl#UrRcI3b4q_>3Wzuo6U_dh28{_&;$BG_yGE?Uax73P|` zp@t=zBgD3{1 k=G&6f#iVgJz8+T zKd^bXzJJ-*^@8A|dPAga2tdBW1iBYB5#}fU-QjUVcDNeLa!7x3sY1Xa8~sF608DEx z_${m#78wqC8#f%4@B}^O{n9n?q`3&xBQ9otfZ12aaXPc%LEPsvqdm& Fc*YDvzbD~k^?z^ uesf%S(**1QYY6 KEO;yl)=p<&JCBMqjAAACQf{N~;f*M`Dpn$=viAjk?4do`tl~m%WLUyQe zIq2M4VDm&wuc#g83f9o_Seh%~#0Fh^r)a-dKT&$a*`>B*HTNx`ngxcc=PPfay-R&I zD@xtTdu=XAAwA?v+mmBop$nLtr %DfBwW*O!IbN!iB3H{ZXH;u;y EOJ8B%QRb6W|E*!(7l^7lrE zA`t_iN!Gdq+|kWpD$(nND6JviYkpaiC|(mFhdC<4&rA3#T@_4bLu^$>nFB#E^{i(( zX`UXlWl`vc%%Z!}8WEvGd7k`;{T68B!Fm9fjJN&~vN=x@`VL&5?ONDiWmv%+Ug~CZ zEZxC8tjyt5Y8Wtu0F6j411ZjIP@tioeRXMDhv1{-FJ4VsVNkyVuEx3E60Z6w; )u}hzv+Gz^G=^VueJ%uJXH&}K@x`~v4WDE1Wq}-D3Lx#hcXbN#)Iv4 zZ1zr(Ak($Ff@CkQVamRi4co+kNI6YI!_e@ZL5(m@aArh>>u7FRXdN~9vz1rlGA=~u zp{SBt7+zv6)gVwkcUFIP2kH{9YErr~(iZRIzsET?=M;EI5=2L9KwQ3Q+eJ-*)xE1+ zrW;DT$4mgxA`BYl=Vg(XD+3Xun8H(^B~&dorr=(p%o5Vt>s!iq`I3DT1g-amxfFX= zZ~N0eaUFC`$zy^;HqKb`rcsQ%0oesm=h@P{+zZk1!*P8J4wUtDL=bV`#sxLP8A(mQ zdctbqiu~6$h=iKyf$;vbm(!< ^_7a|$|nwm_`>2};oUF}umYb^5i^S088o&D zLC6b2>YU?U0{TP7zc(jUJsHhuH}$T@LRn4uSyJNvZv(FE5Gx5T>c3ImX9` z<7TBJ!e8-vli2jTcGKbVeOE>V0E^kJv- Zj zMmY#GC*I-8nLH8`&M8;X=8~gstdLt;%Gxn?ALdQGIa6GjJyCb;A 6 0XHUIZCmsbX;Q08;NolYF=d^hjTd9 t3hNY;@qj2b7L3-s$BOY8=m@bF!U{4g6_BU9SfYSd$ZsCa|T0bw?Y? z^3rP-Z$tz%IO>M8g;)J}ZWxI-d23&-D!9L%5OqmSNaifcN3CPTqVaA}m4L`K?Bkuv zYt6sInwBDT-f6urHIvHn!~j>!4D)3^`54CC#Vr382(|+kAw7V@AK1FX>x$913oEwd z+;+6|re)fksEEV2CHiPV9Qd}~hyf^jB!|CpC6AR!voQ}f^;AUU0R5B);_p)#C#oi# zU0^K#tgameipj{De8AZ4$~Cy0Hcaq!BRhH$$RoNT4z3G=A^-#Tlthj%<}t1f<|;tC z$DSu -N&MA>ic_Yc^uDGcS_4`1lRF$?dhm6(HD4G0UTMk2;bU zK9)kvoJm@dVdp8zTs;SpkSzLfH@UcBoUkFs!EJBA%bb}ZT{5tL541xULJR5-TL^~H zh|^%jT?F64hnk+01N~Q-~106#Mxk-hV`|9Fl;Ht_eMT6DP zY&t$J|7h|bJD9RWM=+6RYNkdG4A?;favMoc9)zmOVnO$isvGIO5cTh6i+;fC6DGM< zVi$$$%hb;Ym{b_s%bhDy<_ne{Lp;-`AgS;i0gF*}_ps0Ex?_D8t5|^DH9Lck0g~rk z+=0p^3*9cd&_*fZ?gF;g#B5eIU@4}+thctIPpRkIj2?g zE8as$u`o}BBlV6!$J%3?4r%|-J>aFzGHTCu!cDF$aZ7bPaTIfS?A8WlB9;DTq5;M1 zXLz5vluSa8l5Ix}jI&2rm*8*CK$Eq~7ss- *ZBO7)Iw$%5P!D$uk7iqV#e0g}{b;x>olCgJ*=jo%#`WJYQ zZpq@)_EZ_#6l2~*fk990c3oM6fPy1f1Xt2kU7l-mRy!udln@`6S+HN!-56j%6!GUs z- (Mv@;B_xPZuTQ z{Lxde?EKikQZ-FUELcF|x#1D?G{~#@tL8Uj8=<1d C{xb}G-*UyRRFS?4f<#3N{9B9k^Zwhs8s&xeoi_rtP_^vSq(szxnqF@_!6 zP^c7&xh70i`V!`IvQ;lEg>%5-^gxBlm3y=&3sX+SUvA+(8xJY852JXfT;}K{+gLeN zVj(c`)`A0>a>r)G3tQI+(oR(A*0?+zDt8I~SU}y_rUZrfbCtIKLwM#M3^x?n`!JZn zLeEb%mMOeEkvq^h3!`jEk}hPN4)YCZNSV3D7Lq}3^HkU9afP!#aTSUhSomp{H@ONw za O9o?aA=@56JX6qgnFC02W~D`s5WfRbss_9{P?3LN1k zydTim`b1ojo@JPJ6!D<(5*u8U)Ymz;j*Py?%K!$Y4E2AcOdPzObmk(ySdoxk+hYL< z3(5d*Fdkr+QEpMq1r&lQK8XusH3&h}1ZoWPbp4LI?Qg)rV-M0+N#roW(;X&xr%k#z z@A|2vZ2Fw6$&Gm)z9(F`MCtu{-Y0rx^^)s~n^75XO&a4leNCUD$^cd@pkwTn{0pD3 zTYn-BoeEkFG)JC4%cn%O0)h|*v=6MPyUq|}+u}dP80ekaQS 1hEVZ}pgol|1sG QVu^scWLc -9qYq2$C0c0|3S_M4K6hbF1_vYGjn+0Z80yQlJrm^3haSDQ^jr`G@7NS#r% zub X(by3bwoP z1+|U~)ZA6)Hrxze$y_rO?B p5Yq {vL zLDnnSW^~8L7-YBK=+?!IfKrws0zVQyJ}k_&c|F&e-*S!o?S&hGMN-pkgQ0dOpnY=a zxImn&nQ)gKx7>OW5lyi7hE1hFCb2@DAfR3_cKo7QD1}g0B`43(?yi?p^Bul8;&QU+ z$j=tQryrY)J`GMA4z&uYoFgW~WuEKsmE;hlnJPQ}tw8p7!I^Q3j)`BF{PK|5ew1-5 ztp)x~vSgIvwO}Td`|JEAxO9z{q^1j23a4As-HoWJGx637p)Jx)05=-^UaJjb0WTS6 z&gcCrx)i_QI`_fcp`g%fcW}Wrqc`5ad^fCvzwA;Ci*>w+n7s``w{3=p&FGZ!2LfzI z?F~Y*rJ81DXZt0pr0exgDk8L`H%#5%d)nP2P2X_Np?fu5v@_D_8SNiRTU4XMMIHhn zIm{zZ>Ss#@cl1c;OH2F1A86QGwKuU(tDeYaugBR3n=$FVGl`;(r^44-Z!9ED=zae( zy>|Y{?WoKP$UPC=@-#X57=>Pjm@WYL(kF{>XH$EXD@GB|Txtpe-;(+wHea=UGEN_U zX ^7k6hsm zuZnj632#>*I#0SgEJDxP>}!2yU10pEUujD>kTmYAv*OpTJ&AQT*!WfO$aWEZ(DQ-{ zw(;w3*Svhgh%r_sprSt!76idLj7GNz4du-<1TQ9Hz2B);h#R2pIgv_QwSqrF^|ah` z@Yi*t?>!_iE_tdCHzM%fau7>;lBV#Uckc2Yl1^@7)UH|-?7o|N2V>Fqy@K#l>SV^> z@#vit9nrk#5=>c*t=aKa_*qnur5C0RgpjI~CIw17 L#k!a0Jm`06av6*`75ogGwqn+TcGh3e-5*Zj;k8V<2jvfRbLI&UpZ2tW?jIE4tc z#o~(Wa6TEWC9z<8a+WSzRiu4_es-0Az#VS$*uY$ZdBf3>#R>LwpP0kc3@#ykJ=h}` zd;7hU3_3`JJYJbg6%wmEE_w@hG$V+}SCnWjaQ02dW!zJ~Ghf=CL5GtwE0OZfol zr&+OIVSPvJlhw`%N6e4k!#>8*eWSl~aB`D(&TAeoe{WdiR|7~%=ftMh@7*vGHreX8 zFRoImp<5$ouSdzq7O{EWSK?z6p&}1|rDhB!h+mvz6-S|261?Q!`Jt^u4*=pL`KWA( zHnmSHy?OR|<~@2^ofm>Hgwz|WmV6&ZnO~kzasB?dub>96WW1Df>(jreW~@fSnkFb@ zySIl@yf{HRHD% GJk+sNir4nr$N)X>m2BBvb6%c|_)xCZ_nskQJ>wNZ?I z!mi+;6zjQrluh}csK^}+0lBVe8W{J(e~Cs$Q@iO0fYsiDLk<_gv6Qn-7#U 3Z^uSVO$?O*zvJ3BO(W^sB0o40PV1*|7P4+twVK3m0v zG`XB%{%A_);2bb84xUqLI>%`;BIo9Jd!|V*rUVI85zZm78eM-EU<1>m^Kn=NH*>By z>a)se3keGiMXta!qAnYBW`zsEs0Mq#3RKhNcaSxO6kv+WZFcMv1(g&=JKCxwba)-f zva&N;A>&W2jpCNc6rX{0mn^$&R3jBOEAb7P2VH+4025$vHz@BReM-7USJJ^`MDkfK ziF%U_8abHw#7;DKe#OfZr)nn|kgR%JaidfS(oP>(O%sBA;4h;aZ%fEx)AJobAW&g$ zIhaPaVyl+a-;AvxZupk9m_WY}=U;}0;o1c;W%|f*Ux55jR@|yYo7B?QYS(@9uztwi zewyl`2^{l8Q!fj0%O9XAxJmDRF@tnpRj fsn)+O+%g+np1G2KT2}gc7#V6img3g_exPfzzYLuEwLSNI~-{_i}tzi?9A)mRq zCZkfvM&zF5Vc)+F=4+=K1z>DD-!M1){5R%8=c0~Vo^#}_<%7{D41xMP2lvs^{_2pM z;t7eK%86AaRE|5O{V%MwHHJlx#Z=ToH^a1=3sLJ&wR`(vKAFHO$~T{r6muDPRQ=i{ zNE6b0Q4Ir7yBN=DvlZBbS`pQoEhO()1g jMrDpl*Lpp@i- zpTcTYb2`Z7f%PZmuJ)w0R= W3{0#_c zSVLF akulJ P`pyoT7jTHi{U zqWuKlwm-Yt#>Fz2Qf7*6Fessx`z`$p?G|zd+nr@ztmlMd1hivkk}EfUxpT4TfLy*8 z_>y}f`QL1|f &m)*7nh>w-vyHkZ4xG^z%K-h*PLE-Jy$A*zQ z3&u;gZrwe!45|uSzDsmN#CZbumeG6Hgajmv$--%0@8uZ6q2eF3v7cWo_hRVibQG@) zl27F>UnKPo%HxRk0Bl@eqPf7>QFRtsQ)xxkyP(ELb NN{Q*x4B2VDSk&kVMpgFM1Ku;ySBIB+IL$)o_bT<;)h<_c*{sAtyj_O7o z)(HG{wJa KC z3=-p#3MU*7gaq(~L**VI&@@Qf3UjgDZsHk6O?f35Fl -8-BGb z+6QUd yAm&5evFYTRsaPGtGO4lIZ(Ng z8%&+%0+=Jm1i!_P*VbMX##`25>*I0z%S9Tm8}kmQ1d(#Z3k%*f(!B8IFU`Z8>60XA zz)B`Cq+M8Kqk62}A62h*xn#ecs2hj-&5MCQl+dAfKDxWL3=E-YAB;edCn0eg^({XY zf4uH_cq+bO@9I|V@X62R;FrJ8?|)4Ul3HKqc+iKFNQDA60D2)#?S6kOu1v+%=Xb`t zQi5@fxe6zXHj~_6$Rp=Br2c}ViIMYGGIPBt!+a+z47bUhF^ApRl}mlev=22=%SyIY zzK{3T{RwB+kxlDnT;4OBhiHp~{=@#}BW?eqMgf~?%E |T-i1V zV4Wl=Z8~^t6hd`b5RjQI&lcA}VCo=N!`qHX;GDk`@Z}51Qo@#29{njAT5&_=+lZ1f zRW4=Ltqb(vpQCebPrduJv>hC5fla}Adp&X0f7be04E09YSBk1+Eyc0j2vk!J$jC=q z0V5(E{rr^T4Gd7IbW(3`gsrU|V8zMP(-W1EksM8f9|s&vx?g^cSNrY=u9P6=g$ ced#1LHGv29uM*KYCJoWcrsgQJu47KOzGp&;0jBgD3}S!ru(Jv62~fyCCFuum zoMi!3?SyOGN4&Lv9YmK=S8 zsuscV8_e_ D?r3h2{s&FPN4AK6aujnNoD3ap~bpN&VIJI1d7p*O%siWuDsS@07 zBZR}YiR4)O^CL3|`}=nMBXbds&@n{fgjf0=j?2|qA)2mnUee1_n1xkhWF&(|pJLTX zVxG}obMt})X`n|!LNAnL-@6prk?Nr6rFE8QvBEWA(z7kkTaY^7uVPVH&{Ki`L)}|H zwH3X4qircr+}#S4Qrz9$io08JcZcHcR%mc{io3hJy9EyrT*900Ip;n1&fLG?&g6$o zCTmS*@16Cm^?Ynx$;7vA4v7xRGk)mhn0#M4+8!8z3N3vW*M$o6{s~J`EuV!uZtZWu zx>~Ch^ivWN5O^FN#+Y|DmTh?9x9IN9%_Xrx3J7i6D~NcO7j`B(Su83)bp~L5^7&H9 z(R^%<8t0Mr bZ?wK7SRAN) zFZfsqZc8 wTAW8H|f>9-4kW$%H5i~BrXJk2{Z0nJ$`iH ziAOkit56Dbo?iI%_zIU!#8wm>6 >^AK+$o;g0^d DnJ8V&z9*rRYJ$k+0ozgqB%O@(&Pg>6)f_fmCDPCp#lW)b2O}H zW_r(`-wr2KTsyxtWl%k* kah@eL{r;arY{c< z^WBv5X Oq^$p@QSI)VyHu2rtTa6dj>+N1k@r%!#b`0lk6479n zn`GFdsk``!aA+s%zh8g|N4fl&3~Ir{qKl%!v6 |Nl>MEm%=ek(rS(dv#R{r4HKGU#K>tprBaU+uPd>{U`S2KW#vQ|Gp%k;GU@X z_~rU(!3roht-fjXzHH5ZpUYot8*<<51~q Eito3IboBJL|KDF*Z(szS_(h`e zZj5tX5Jy+dH_!h$$4~No&(Qb3ZsZU(`v1MbLoa`N>MrKnGJ05{))Bw{$1n=H-;)eW ztI1EN8S3O|Z&Z6a5m5c{;h}L@Ujrtdi2**FEyfNOytw+OfX=3yD92rp8%Xxl@r(@} zt`$rJ()-XQBOe=EZec0eHE8w#<7ndqxq2~Y=UAv%3PVLvoEYi8VP|UY37t$&JUldG zU|<{p{#`yl?|8j+=pROnnJ#}hG+W(V9(w1lwDy{ K6EJ&QsVJvd?_hJ`{~mwXk6PcB z+j?RZiy}YPjC~AV!@4}mA)P%QNq`$NZ`}F(`SQ 8Pqs^OEzlJC(!bCwRZ68y54ZVA?dW$eX8ffhP6*fmg6i4 z!rcJ3Wo$B+$Q#+cX=tsL&5YPy2>CkoukT`|yOFc2r#6~CY?j#lT_>fj1=v`Oa#frJ zGP=3mTaL8)zfQT~w|GCs@mG@rK{8O^UrBRcomXx_rj6;(7P=3e#`Vi!Debd(aMp?t zS4E^%7npCm9Wed3Byb&i+*pRUc=<84Pp825T2GkcxQ79JnFs=J?!tUx8Mqa0ewNDW zJ^?E}a%H(Yc1Yxy13)NUu=m5jn(3#lnTjq!h~N}Yd@Iu?YsWt=gCmE`dLEYvA}kYR z5Q|6U(pEi&Mpkz+m<{Xn>_p{ZCZ#wF)TYQTi0Uh32-PN!DCNLO0=jAHrv$TFTbPCN z5+NT^ZsRSNB1<+v=QbcOTYM~PgUr8~Go>yUle_`#qz(! >< zuFs@M9j0uaFS|Z40VSO-53XNsO$WISeaVPtcUB6`vmP&l!KV$z#*$(vji=`X3txf5 zUZ-Uo7Js4nuUf$wUFAiyk{oI2v@`_@e#!novGZQSX9>j8>c8H*tKms}`( geLq@Zz zg_dRphH@)Q&G!)S@YvJLCb}=?mDJ=DC6^Fa0TjmC`EI#30$%|Z++IkqW(&qi_mB&% z+Sk#0`Rd0HKvQ@xe6_QJ3YN+$iaIlOUq0w(*lOr&|J%cqU1T}BeHROO%t76Pe}G?K z!}@FFwu&%QvZk)_r)J~Kto(#{F$OHr_tJmY+m#^}IO$_ciT?Ur62743ui9+CrJ+8a z`#nqO{4zbPahYF!%b^=AVdWIqdJ?eniqH|q#Chv-;rFWS0r^5Hb@^cSIj@y>x#YQ= zcag)@##Vm8w$fpX1z=}q3loq6V_1osWn I3NF^~wV>P#v0wNu46xlH41Gx NLc!-b^9wED z)qP)$3BDY*2cjJKy0!yf>I^kq^)gvGI<+lc?8p4Z|NM`Eefe!5>|=BPuIlt=>k)#0 zDKn#27^n&AKbqG1Q{U?9iPH8amF6fpb-l&>SstK^*M*C O6Ei7(D`(+&QV`te!fGqg&3T z NyMO(@uyxGo^ kFW;Mn`jDtB-!{q0sC5Mt} z>SLkTy@18|x0QH1&ljYCU8Yk*-=l3>hLY#5mj*kR_5RPe0R 3nO#+jshWf#P~(B3V^a_A}UTo9 >`1!uG510b(?CrkleMq~Lx>+0c z2r;XXpTd3gMfluKX0L067R|O#cxtctl;!Qln^RCf^-zt{+qHE61bL`?@x$}z265+D zfnA_=dhVbQ%;jV)>EaI(qNu(A`2mJ;%@4_(y3jN V(6r`WrJH%9R8qBF zm!E8j=3`zSIA#iCZ+aiOx3P}CvkT4?XSTWDU6HK=K$y{87@L!_8amHzI19IyR>>~` z+<`2*I)6O6 1lPK>E39LYB-as$1R?K+vJJm9x)|G?>7 zp1MEjH@c$Ptbz0b_;EZ3!@dBvsXPn|g5OS0iQM1CzJf7&xi*#ywgRF3%f~DhcY|@C zPY#>tfnctZRj38gbS0H| J@gd9GuPt$zclO=6x-bcA6 zHAi&aF5c0=v-^S1Y5yd5ZuB$k<}N}!NnVp(+GaWPSl)5Jpi|Fi-6~r3KpU!5U^6F4 zRX-HkE=L6#SoLyz!1itWSx<##1Gi8?#wbf{46;paw_@ieiM5TDivA>tdfK*{v3;A$ zK84%Uo>vy1hk{56RKmLT=Ivw{!D{oeVOxsQOC1OfJS4hMws6U^-?p2p1@}q`-%A6~ z(q(|b)K2d%-XOgWlQD0O<_x1NN_sv+UO09=PrY_DsbekQ*f3lG6NB#v!)+-ogNB8{ zM#;ppGRmaA(u}~z%k&Rj9W6v}IzA>?mAnBB8tG7q93eD-*y8pwl6?_*!g}aLbI0p` zoD4bV$UMu)#ajXCwRgqHXc(f2Te9fSCxtMDw?t`?thT^j_-|F%yl?*d48-iIM2cf& zy=v*+AogbXRuDY=me0#obv;Wn*&gVfyPf=|Pw3M1ILYXLD^Nk_58P-zTRUNEBgQVN zOheEVbZ~UtU>X^JP1mYRFV14hsJ f(<)iZq)mmY0=(TblT7kmPkcjI z9Tv*H65d7S-vzxJ)D7duurRT2Z>);=> ^!Hoy#VLT7?5K$GYYQu36rH;!|miFzkZ@wMnTCaK?0V6t-B1N?pxBIEu5V+fb z*3n;4G8QZy{+7$ymo*h>iY3Q`A1v7%J9$L1*|>lfS>2&nQ` K0YZvU0Bvx`f5*2{x^$5+v{ejuy6ejmk4w$)QB=WWXAaOuGc@H3)_is2E;(;K%q zSbFnAs6B-nW1|$90*Zw{!@&@o>W!b(Sagvk4hr&cRQ;2A*J19=J;9*Y $;9)P) z?taL!GNqqFEzhHuv$zM%UAJJSHpdHG2Q=v3@B~ouIndp%kdm~g6jr2mDzqPQY JGEzUaxPn>UPhJagh{wr%fH4H}dO<-ALu{5@B ;-(W0)0F4xUXih--97!jt{6xn{Oznf;sNft1Bc4~jN z?ew#=YV_Z85HEC1 jygZF*G>q@BN*Gr>79qoMl#GY@a-^Z>yEDN183_WNDj )BP#tb6{@Ldia`HB4-Uu^r-0Y_wz~^G% zn}NEsb>`f>N@{jy{y_>huyHo31-p`sTJdxTq8c^!V=-$=8R`HB3Wr7MX0qw3`Kg`W z4^=}drQZIu*~?}!jjk6f@6ITBOc-xV(yqAgJ&{L19atPN`g _syNzxL7A!pLwgT?Q1=ic0$hAls80Dm) ?pN906F4{>atCShpqSMkK%7o%a%_HpN*VCFW#2)UsA}J=^etQw?WoAg?v29$k0Y zQ{QoHDl3HB-;X_R4gK$h&X&8IRPm7b7B~b!ko4i$e!PAjc{C3`!)K(_^z164!@JWz zT1X$34eknCK5ag|u>6 -`SL4d-g!*Sl-FUo->sgzkZm4# d1)u}+xY%bwC!wCVxKofvm+6LzGK7HxW!l=` z*r4FzuDsh%cW|;G^NOMBr3-tdf6O)hG>Y~19?8e;$hycH3QSTs3J$+PohWUUCoeFe zxbDndhpm}m?EGP^60BiMDY{^{2^KaULD^%7I8|{G-!_3t>X`fD(`5pF%`sg%4za83 zaD2| +sVi^y8bAmYQcOunxkNPIxq{oP#rUqj2Jtv z;{Fza3wX0VS8NCS1KYnQ6}IR7T&|X+JJ=u~5hSSGS+SwDIbR%jt$a-;8543*5fQnT zZCPy!C19BP!}Qb2Ja>vf%mUyntG2aLaJ@jMETd+HUL zrxnT~8$6x27Z!~|{EE#w;hUhK`04Va;Vcjj)iu=gqBdy%MtzB=+G{&TCyElsckM~= zn7G8Pg0&VPfNnDx?^a4rE?xovJ*Tr)a2x{kAe3*CyTmm=*?+t}5 UhXFM?FN;iPi!N4B3EbB0w$xt!U@MCo*QWC5-I?q(t+E|3;yZB3 z0?8gFVhNVo+ i4$lBd1wJ4!?`YC4K?YuTxrE*6iW;DI;q z!rDw}+7jcPJeGs)rbp%l)O~!vpZ=lz$T~Bq%U_4;BAHNk{I{1c04-~k@lK<}dN_J_ z?1%My!t~RA`}zEwT5{AJTS~TeejA2hDVLLz*QbgKgH+fP*$8LI?;-9$k2&?C625?$ zYW?}f4u1XdDHV+{mzWq^eYziNA{sG4qQSQtWnc6?1XqSRAC1NId9)Qhs!M1%R-b U>gcIQr|e{$dF;{`GUWqp=O zI2H$WdLZ+{b)xaY*&)KsBNe03b~i6&5IBE9mHvH*d*b`dpzk=v^8%=!-m>wtx#(P0 z=t%o*ee(IJN-*&AV|1NyUI}a}SJF&{)42~ENdR8Bc68B+Q%o#sp5j_u+OrPD*P >!7>9jotnJPZr20D%`wyTNZFgVS(AMaeu9ICe{XAmg<#j^lW~S$pEjtR1QK zm|gX8PgxfY<9B2lA^Vc-%n~2mQ 6#`=-GVF4)2uoN}3^q0=im{di(EEHw(QW1~ z*77pDhk~F61$7K|eYy!v%TTnxOisEB5E%sv3}&l+ %&hobRX(L-KX!CrC&J`=k4U}Dsu{%fjWHsR z6|+$1;Fv4jqs16GJHdvjPj~)~=)PhwW*;+F5)ovPwQC@78`O>v^v1+c=K0}35*P(8 zo%Ptz<1(!-BOcVW|7teyxv^hpPBJtBUD=(d%)V1p$;Qx+B{yKflp!Gnm!iEEp 1bN^Y9?`$L;n5L`(yHVN5=};)iNRUK z6W7L*b|D%Tp`jL=v#sq*(@jWi85-Z-j^nSTx}SU=_nAlrS{uIOFJ!em_TgO*zdt=( z`vg1@RxeGMWZ%-p4}eHq4KLrb)&Gp9A#-RJbhUkq-BkUw+unU}chd75Z{c3~Q+b `|-Y=JDEacywKo_76@tmY+*AN ze_~Y3N`ZvXj4;n1R)C&f;-+U(PLrPBMH{A3 o&GSId)51Wvk%u>y&l({(-2O7Alp0Q``$8y4zk_tg#ph*Hb}JnV&l8Z6`+r7 zBp`-B)Ps48bE4-(eX3Hk6HC?+l&p!Bkf|9Hbz}0&tQZTvT-e+e+di8=upf`Y5v)Oh ziIo)bKCpYVXj!<7Vj^pb)$lMMc(=>h bkqD( zWUW5>wThZZMHs+D2cu2%uZ0vNuwvPsBFUoH{1+wo9(K-xr6p5Cwj&Q=lA+4d1|;m` z!?&h0s=>KX&=eQ^B^W=8t7mk)z@uYKzYc|;c~dhZcA(Ol9gV4{r*&v))clK;h@K;l zhA~H#kycVH=HBb!Krmh!F3WJev1B;;-#@*dI^mh<9?-B~E|5xe9BWSh)rtG}E0I0H zm`O*+7kfnXUYz41|E!2`Xo<{8AYF*1WcrS>N=4GwGcJH0uVV `GE7%!FZo2Flo-1Brt`K9hPFixv9!-^WZn&WLW4YTRH)r2>e=bbX7Ka_~Z zxMS{2wI(?NbgqU~@cxv5!bLYco9IK-3`!AYWkwSyk#+n#V@Mo+OK**pCFf|b tr(fnI~Mq7?{#M-1&U|{6L7c0;ZR#YhI%Dr}UqQH<)aYOoHxZOArBPG-iH05T# zmPzTWGwATbF?a3d0@nh3-nhk(jo#>kc(ZdSKnOHM6cs_X2`m-mB75=sGo40(iQu#^ zHY=-+=qGONyWhj7JsjSi?K=Ylfcr#_H8CcItc2Ts92ie_E;HAaU)!h^ee{T}MdeIk ztbg%xFL}B~RA1xOA_YzV6#eBpdGUL)G+44K#M%p%4nR3*88m1ey4V!8xTwBzp}@^u z#zv#!pH`g43K*jmsYyb4HCTE{PTamqm?e;qGs7r9)gjk)+8loaGY3tN^nOPv*0D}- zp(6CkVr}yvTGMTt;mOC8%(>^U2m uNazDWo=yJ$epz`MLaotQ+;<6y4BD5-J%k45ughxQ;tS|JSOT-EqTb z%&yx`vK_wdca|-G&=1DJZ{!>$=z~;62l$$K#Z4GVM+PxWH<;z&u~c;4Id%wkUd@ir zv7mhi!FMm;U2s6?bij4ZHCMocy6*)a)8256|8LdwYRVgT_WWvt{zXdA?wiN-&e)`y znrsAeBPPM=vA72aU2+)sudopoQw`1@GpPN%$BP~Rm@KHl0TYQZI$?k4q*k;>tLJ !{x}~F@MsgNrcgO9mk;ar&T_FyH z$Gs@}fACn&VlMlhn2sI%IH%Asi61$l^v=eVTf~o-@pSkDWEhmXl@+Yj=hwvFat08e zC8wC>DrYuY|F ZQtoM zn4Vp_B##~QMBlAvx3CLz-*a}S{0`LnB(A{8*%LV)>VeQi4e_x-`D>5zJT|7JG4mnP zR{M_~uz{eo3y+0QAhhgS85!j^x1f>Wj$={OsG%doLcW-S<> ~(;S l3@=tVq4;LJRrIzU|;v~=E1NZzJzgK z=NGbxi9O}@l2yl5|AXVzPx_lvof+9FDH|KULj6vB{H%dWQMCGbABU8?-sRl@yI#TB znBHCk_9@++1GDfB;>EU@!y*K02h)V CNPN2Okm{{O+*C#IX8sJ8dd3!!UiI4>*RWiW872OCYJTIt z%xC?NDym3dPjW)X4lrHI|EJJ){_cK93J7%>v}$pFBk_Gugdjo2L9eKg{_ZF0$L05D zp`8cFtq-?LJAUZJQ;XNBgzwA4dopx%*p1N#y7BF9o|ZE<;|3NYr;@FKXr`{vU@1mQ zUJf#x0U@2th?2AeiZ_K%d-hTk3{QkxFTWpURcHv?M*QOxjO|x*EP$gNup%=Y{AZiN z>JmcbU?fNC)}Y500*yM=cGS!||F*L}Etl`k$<>tqwuSHQNp#Q5e+=s;`k&A{Q}zFu zS$X5tYnkR;s*1)xuj~z!lleiQ6S8)RgpL1s_1h5{CyIF(AGw{Kh>ILwn|E6z->tEc zR#>DJ&%q5rjOOM*>Z2N90u(-G8<@e(&1B`;77>1vn;L(C_ks;j^Pz^{>-J2TMO>Wt zDqA PYwICOW1s|WCi~5-2l$X;g>FLDH?fL#H86dw|qtc6) z7ctI3 d_}50e(4ab*XzBTzxy!8J$hY>Qx_D2o(ZcxjALtR*rkrG#E~;M3n~q z9FU8x9n(d>8za|?r qo`e;8ng1 zKJzx&@UDwjYw<^yHxy~X08&`H`2?bk0WpAMMv0Q|8>@2^(M+o_sHZh|WQ$M33%8Aw zHx~0|750Z_Ol_j#PJmC|P7inv{MorUG%8^6vy*NP(&eE6cIpCoV+We|UN+;A{YRk% zi3gW2PYcJ|pCTb*UZqAZTpD@D6~Z?sTvzD ohNAKvbdHhkmldU=EKe1A0iCT`f%JfisWYUod3__jsI?RZK^fi;(ysu}g1CKyBW zRu9YxA@kEChpY9+#ZV#zVDlcMJ29e)JZY88sw({+0U3yG{w7XFlKaK}orQCQj(&eH z0}q8k;5bL6e@rg76mWIrae2W(dDKpu=<-CLe_Fy)2KKP^hx7ijqG?WkW+~yO9nS21 zX<{*L*u!X4gzkFvitsNua!nI oXrDwK%$F-d6T9DJt)er(;fy`dxtK`cT8j@izAyHui@ zK{%}pCE=OpiRQ;S)j6eE&LEk|@>&;#77JiuIBM{xdYH-5 !nIe|-3!E3X*&TGT${q_hjFn)Iu6acgR*k^IQ`u=Wl9p3%6?0KR`YAwm$ z$AzGJF1W*FylydMV#omvrrr_V{SY=9@hBzodPjCi>ancP%ru?L%ttWF;dcyZHp&`Z zE+#6^BRrrU+}pULf6iK~VGd3h%WG;XyAWUahdn^uXlfN4p<+3Bwe2hP{e*}gW=!$( zXB8UsaU&&bn4=;D 6^A zX&e^pO!0I;-ZUMLeG$vQ$6O_uq0PJY2YI|~EH&@FHg|_~L$(cjAL6O<6q=Cl#2GFD zo+R&Q-LE`dHwxG{YbAMg&%w04!vW}e4r)0+H$1I4sK-hi_T8O)xJ IMaAa}1hQBXG*j50CSZ21vA+s_+NAdFh zBpYk#go20d^VDYGCCkTQ={+oVS6VH_j~Y#u#0zJ7c~e8c)n1Wb5&igf9=|A(B0`pN z&+9(@G9TJ&{G0KEjzLt!p0jT561_F5C&P5u>FSPb|7H7;&v%yzLL6{C+#UV?wx_;P ziXXm(cjM;~bZRkaHV_pPVd?rU32ZZ4Z#f8ek{mjPc`!UgN!x^oC0P^Twa+-nj|h3r z2X(i?z1a%sxTrcFSt1g`r{_{pTYBhsbA9=hNsPP{Am;-9qpQ_hzO(RDI}{nmgHDg` z@ocUDlU7_PEgK{3#FS{4>@j^YhvvQHM$IX2I@0C_E45YNe-FU`c!JD)foF!p%iV8c zuLl?X+|V<({cy=w4mvbgexHo=UiUcTxbu_*P-s^pw6NYg3;n)J=gz{5rVQ^26nfI^ zj`$DVZh-0ab$S;V0KvP8e%~?NF?_9fj|AoLg*6*Mmpv-D+UzoZ>>i4)rbhGOF=>>j z=&{5U>OkAtk4{b=2^vcwX